易码技术论坛

 找回密码
 加入易码
搜索
12
返回列表 发新帖
楼主: SAILOR-HB

[源码] [推荐] NC1020修复的原理,拿出来大家分享了 (附VB源代码, 要研究VB串口通讯的朋友

[复制链接]
 楼主| 发表于 2005-4-24 02:54:00 | 显示全部楼层 |阅读模式
【分享】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编辑过]

发表于 2018-12-7 10:42:46 | 显示全部楼层
为什么看不见一楼呀
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-19 15:06 , Processed in 0.014784 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表