- 注册时间
- 2004-9-4
- 最后登录
- 1970-1-1
|
【分享】NC1020的数据修复技术
-----------------------------------------------------------
前一段时间我刚做出了NC1020的修复程序.
在本篇文章里,我将详细向大家介绍一下这个程序的来历,有可能的话,我会公布程序的VB源代码.希望大家共同进步.
1. 原理
话要说到一年半之前.
那是我第一次拆我的文曲星.不怕大家笑话,为了擦掉屏幕外罩里面的灰尘,我把我的NC1020前盖上的外皮(铝的)给拆断了.是从中间裂开了缝.一不做二不休,既然前盖都坏了,就不客气看看它后面长什么样子了.
后盖相对来说拆起来要容易得多.拆开以后我发现,有一个按钮.当时我心里一阵惊喜.莫非,这是清除密码的?我赶紧找来一块橡胶按钮,按了下去.然后松手,死机了.天哪,清密码好像不应该是这样吧? RESET一看,密码好好的还在.我知道了,这钮不是清密码的.可这是干什么的呢?一按就死机,GGV是不是有病啊?
直到今年(2005年)过年的时候.这个寒假里比较郁闷,有一天我突发奇想,这个按钮是不是在RESET的时候会有别的用处呢?那时我的NC1020在我改内核时不小心删了数据刚送修回来没多久,我想GGV肯定不会就这么舍掉丢失数据的主板吧!我想既然那个按钮在平时按下时会死机,那按住不放了再RESET会不会有另外的现象呢?
想到这点,我立刻把NC1020拆了.拿出工具来,一试,果然不出我所料,屏幕上显示出了从来没有见过的字样:
"waiting dowload..."(download被GGV写错了,替GGV脸红).
我的心里顿时非常地高兴.我立刻想到,肯定能找到这段程序在哪!找到了好好研究研究,必然能找到DOWNLOAD的数据到底是什么用的!后来和朋友一起去上网,顺便就发了个帖子,"NC1020换过主板的兄弟们可能吃过大亏!"(地址 http://www.emsky.net/bbs/dispbbs ... ;ID=2486&page=1 ) 我当时说,等我学会了串口通讯,一定要把这个NC1020的修复程序给做出来.
后来,我用NC-TOOLS查找"waiting dowload...",结果找到了,在80:4066.哦,原来是80页的程序!老早就看着80页的程序有问题了!您看啊,别的页码开头的都是60 EA XX 4X或者 XX 5X,可它的呢?它的是60 EA 19 C0 ! 有没有搞错嘛,只有C000~DFFF段的数据才有资格用这种头部嘛! 您再看 6000~7FFF那段,什么嘛,好像它就是E000似的,竟是些低级操作!荒唐!
再想想,既然它能被运行,证明它就是正确的呀,因为再搜,没有搜到相同的字串呀.于是我做了个假设,假定在按住那个按钮的状态(以下简称"修复状态",相对来说,不按的状态简称"正常状态")下,80页的4000~7FFF被系统认定为C000~FFFF,这样的话可就合理了.于是又做了些实验,我认定,我做的假设是没有错误的.由此看来,我可以放心大胆地去反汇编那段修复程序喽!
经过反汇编程序的分析和反复地测试,我发现了,在修复状态下,系统的闪存各块映射为下面的地址:
修复状态地址 <===========> 正常状态地址
00:C000~FFFF <===========> 80:4000~7FFF 这是系统启动的引导代码.修复程序也在这里面.
80:4000~7FFF <===========> 00:C000~FFFF \
80:8000~BFFF <===========> 00:8000~BFFF |
81:4000~BFFF <===========> 01:4000~BFFF |
82:4000~BFFF <===========> 02:4000~BFFF |
83:4000~BFFF <===========> 03:4000~BFFF |
84:4000~BFFF <===========> 04:4000~BFFF |
85:4000~BFFF <===========> 05:4000~BFFF | 这些就是我们平时所说的
86:4000~BFFF <===========> 06:4000~BFFF | 那512K的NOR FLASH闪存.
87:4000~BFFF <===========> 07:4000~BFFF | 看来,系统是可以随便改的.
88:4000~BFFF <===========> 08:4000~BFFF |
89:4000~BFFF <===========> 09:4000~BFFF |
8A:4000~BFFF <===========> 0A:4000~BFFF |
8B:4000~BFFF <===========> 0B:4000~BFFF |
8C:4000~BFFF <===========> 0C:4000~BFFF |
8D:4000~BFFF <===========> 0D:4000~BFFF |
8E:4000~BFFF <===========> 0E:4000~BFFF |
8F:4000~BFFF <===========> 0F:4000~BFFF /
有了这些地址映射,我们对NC1020的修复工作还只能是看见脚底看不见脸.我们还没有看修复程序的工作过程.
我把反汇编结果给大家列出来,这里只是列出一些关键地方的句子,其它的详细内容,有兴趣的可以自己去看下.
FFFC: F4 FF RESET向量
FFF4:
JMP $E07B
E07B:
SEI
CLD
LDA #$07
STA $07
STA $05BC
LDA #$00
STA $0A
STA $0E
STA $00
LDX #$F8
TXS
JMP ($C002)
C002: 19 C0
C019:
LDA #$60
STA $05
LDA #$90
STA $01
STA $05BA
LDA #$00
STA $0A
STA $04
STA $05BD
STA $18
STA $05BF
STA $15
STA $0477
STA $0476
STA $0901
JSR $C10B
LDA #$05
STA $0532
JSR $C07A
JSR $D153 以上代码初始化基本I/O(包括LCD).
LDX #$C8
C04D:
STA $02BF,X
DEX
BNE $C04D 这点是清屏.注意,这时不能使用中断了.因为地址都不一样了
LDX #$14
C057:
LDA $C065,X C066: waiting dowload...
STA $030F,X
DEX
BNE $C057 这是发送要显示的数据到显存
JSR $CFE5 调用刷新屏幕子程序.
JSR $CFE2 这就是最关键的地方了.这里是修复数据的主要实现部分.接下来我们转向这里来看,因为这个子程序没有返回,最后只有死循环,所以在这条指令后面没有指令了.
CFE2:
JMP $D300
D300:
LDA $3D
AND #$FC
...
...
...
D332:
LDA $3D
AND #$FC
ORA #$00
STA $3D 以上这些代码是打开串口.方式: 115200,n,8,1
D33A:
LDA $3B
AND #$01
BNE $D378 如果有数据收到,就转到D378
BEQ $D33A 如果没有数据,则一个劲地扫描.这个情况下,由于没有看门狗,系统不会五秒自动关机.
D342:
此处的程序是显示" check your line please"的代码,就不写了,后面如果出现校验错误,会调用这里,然后死循环.
D378:
这里是收到数据的处理程序
LDA $3A 读取收到的数据内容
CMP #$05 看是否等于 05
BNE $D33A 如果不是则返回扫描.也就是说,05是握手信号.
JSR $D4BF 这个D4BF是一个发送数据 06 的功能.也就是说,文曲星收到05后会发出06,作为握手回答.
LDX #$00
STX $86
D385:
JSR $D4C4 D4C4的功能是接收一个字节.
STA $89,X
EOR $86
STA $86
INX
CPX #$07
BCC $D385 看来是要接收七个字节
LDA $86
BEQ $D39A 查看86的值是否为0.如果是则转向D39A
JMP $D3F0 D3F0处会先发送一个字节15表示校验错误,然后调用上面所说的D342显示"check your line please".
从上面我们可以看到,文曲星收到05会响应06,然后接收七个字节,放在89~8F里,然后校验这七个字节,方法是全部异或,得0为对,否则为错.这七个字节还有别的用处,后面会说到.
看来D39A处就是要处理数据的程序了.
D39A:
LDA $8A
STA $40
LDA $8B
.....
.....
.....
后面的我就不写了,太多了.把前面的也总起来说,是响应以下的过程:
A.接收一个字节 05 ,其它无效。收到05后发送06.
B.接收一个信息块,7字节,结构如下:
偏移00: 00表示未修复完成,80表示修复结束.
01: 页码.按照上面所说的页码映射规则.
02,03: 地址.这是马上要收到的一批数据要写入闪存的哪个地址.这批数据一般是 0x100 字节,这由下面两个字节决定
04,05: 要收到的字节数.一般是0x100(十进制的256)
06: 校验.前6字节挨个异或的结果.接收到的校验若不正确会显示"check your line,please."并发送0x15,然后死循环.
C.根据信息块的内容决定下一步的工作.若是修复结束的信息,则显示"download ok!"然后死循环.否则继续执行D.
D.根据信息块中偏移04和05两个字节规定的长度,接收这么多个字节数据.
E.接收一个校验字节.其值要求是D中接收到的所有字节的累计异或结果.
接收到的校验若不正确会显示"check your line,please."并发送0x15,然后死循环.
F.把收到的这一批数据写入信息块所指定页码的指定位置处.
G.转到A再来.
据此,我们完全可以做出一个向文曲星写数据的程序了.
以上就是NC1020修复的理论基础.
2. 实施之一 ------ 数据.
对文曲星修复,不能缺少的是什么?当然是数据.
说实在话,要是我的文曲星不被我再一次因疏忽而删掉BIOS,这个修复程序现在还没有出生.无奈了,文曲星开不了机,因为丢了数据,只好想办法求救了.当时网友们都不在线,谁可以帮我??这种情况下,我想起了SIM_NC1020.我马上找到它,找出一个数据支持文件,从里面提取出了我丢失了的数据.当时我还不知道上面的理论到底是不是正确,没办法只好试一下了.我立刻写了个小程序来计算校验,然后256个字节为一块,一块一块地用串口调试工具写入了NC1020.每次看到屏幕上显示"download ok!"我都很激动.唉,写完这8K数据的时候,我都快累坏了,一只手握着文曲星不敢动弹,另一只手拿着鼠标移来移去,一会算校验,一会点串口调试工具的发送按钮.后来终于把最后一块写入的时候,我立即RESET文曲星,发现,它果然如我的理论所说,被修复了!!!!只是有一点,SIM_NC1020的BIOS里没有实际机器的显示屏初始化部分的代码,每次开机都是乱屏,只好把修复状态下的初始化代码写成程序,每次开机之后要先运行它才可以正常显示.晕!
修复好的时候我的心情真是......我无法形容.我立即想做一个修复程序.但当时正好科技协会有事要开会,只好把这事情放了一放.
中国人开会的本事的确了得.在科协等了好久,老师没有去,我等不及了,没再等下去,回到宿舍开始策划修复程序的各项工作.正好看到徐大哥上线了,我就把这事跟他说了一下,他非常支持,而且还把他的BIOS数据也发送给了我.我趁着那股热乎劲,就把那数据做成了"标准修复文件",说到这里我不免要说一下这一步的主题了-----"标准修复文件"的结构.
标准修复文件的大小不一定.这要看它所包含的块的数量.它包含整数个数据块.
每一块是264字节:
前7字节是本块的信息,也就是上面介绍的握手之后的7个字节.这7个字节的功能就是告诉文曲星下一步该做什么,数据放哪儿.
后面的257个字节就是内容部分了.有256个实际数据,1个字节校验.
标准修复文件就是由一块一块的数据块组成的.它的结构非常简单吧?
3.实现之二 ---------- VB程序中各种操作的实现.
这个,要有一些VB编程基础的才能看得懂代码.其实VB很简单的.我不多介绍,只说几点:
纯数据文件,就是在文件中每一小块都不包含7字节块信息和最后一字节校验.只要用户指定这段数据应该放在文曲星的哪个位置上,由程序自己来计算并生成各块的块信息和校验字节.
标准修复文件,是包含了各种信息的文件,程序只要完成握手部分,就直接发送一块一块的数据就可以了.
程序什么时候发送"完成"代码(80 00 00 00 00 00 80)? 就是在文件读取结束的时候.
点击下面的链接下载VB源代码.
[此贴子已经被作者于2005-5-1 18:36:08编辑过]
|
|