这几天整理各种资料,居然从一份镜像中翻到了四年前写的这篇文章。这篇最早完成的分析笔记我早已经认为丢掉了,很是可惜了一阵子,现在失而复得的心情自然难以言表。兴奋之下,决定放到坛子上挨臭鸡蛋。不过由于这已经是四年前的笔记了,不免年久失修。而且以前搞的东西现在基本上完全忘掉了,想修订也力不从心了。所以这篇文章仅供纪念用。

感谢
====================
感谢xuhonghai发现并修改了这篇文章中的多处技术错误,没有你的指点和NCTOOLS,我是很难完成这篇文章的。
感谢sun、曾半仙和众多无私帮助过我的朋友,同时还要感谢sun延续了数个平台数个版本的神奇工具WQXHEX和曾半仙天马行空的思想。
感谢lee和他开发的更加神奇的PCTools,相信很多搞WQX的朋友都是从这个工具开始接触WQX开发的。其中的反编译功能和行编译器(记得是另一位大虾在PCTools的基础上二次开发的,不过记不得这位大虾的名字了,在此一并感谢)使我受益匪浅。

序言
====================
文曲星NC1020是金远见公司于2001年开发一款电子词典。以6502芯片为核心,配置16K RAM作为主存,512K FLASHROM作为辅存。除正常的电子词典功能外,可以执行二进制可执行文档(bin),解释执行BASIC程序(bas),浏览文本格式电子书(txt)。由于金远见公司没有公开其文件系统的结构,造成了开发的不便。经过一段时间的分析,基本上把大概的构架分析出来了。

正文
====================
1.簇
NC1020中的文件是保存在FLASH ROM里,以4k为一个文件读写单位,即一簇的大小为4k. 

2.标记定位表 
在nc中,标记一簇是否被占用和占用的文件的具体定位的信息是存在闪存中的一个表中,我把这个表称为标记定位表.目前还不清楚系统是怎样查找的这个表的,也许是用穷举搜索,或是有一个标志字节,就和cc800的类似.但我认为前一种的可能性更大,即利用标记定位表的标志字穷举搜索.标记定位表是占用的任一非系统占用簇.在它所占用的簇的开头的$00$0f偏移处是它的标志字,即WQXFlashSX......就是了.遍历所有的簇并判断$00$0f偏移是否为WQXFlashSX......即可找到此表的位置. 
标记定位表从偏移$10处即是正式的内容.从偏移$10开始每4个字节为一项.在NC1020中总共有128项.分别标记闪存的0040000FBFFF512K的内容. 
从第一项开始往后,分别以这样的顺序标记了每一簇闪存004000,005000,006000......0F8000,0F9000,0FA000,0FB000.即项数8为此项标记的闪存页码数,n=(项数 Mod 8)为其所标记页的第n簇. 
再说一下每一项的具体含义 
FF5FFF01--是标志系统占用 
FF5FFF03--是标志本标记定位表所占用 
XX5E0006--目录表占用 
XX5E0004--文件表占用 
XX5EYYC2--一般文件占用 
FFFFFFFF--空占用 
NN1ENNNN--空占用(N为任意值) 
XX5EYY18--重要事项占用 
XX5EYY0C--记事占用 
XX5EYY10--笔记便笺占用 
XX5EYY0A--行程占用 
XX5EYY08--名片占用 
以上,XX表示的是一个定位符,和目录表或文件表中的定位符相对应,表示某一目录项或文件项在闪存中的位置.若文件表或目录表的定位符与那一标记定位表中的项的定位符一致,就表示此目录或文件就在此标记项所标记的簇中.具体定位符在目录表或文件表中的偏移,下文会提到. 
YY表示文件块的顺序.因为文件在保存中并非一定不是线性的,而是以每簇为一块,成块保存的.这时就需要一个值标记,这一簇是这一定位符所标记文件的第几块.YY就是这个作用.从00开始按顺序排列. 

3.目录表和文件表 
每一目录表和文件表都和标记定位表一样,要占用一簇. 
从$20偏移开始是正式内容.每1F字节为一项. 
偏移$00--C0表示这是一个正常目录表,C8表示这是一个正常文件表,00表示此项以被删除, 
偏移$01--FF表示这一项处于正常状态,F7表示此目录或文件不可删除,FB表示此目录或文件不可视 
偏移$02-$31--是目录或文件名,结束用20表示,必须填充满. 
偏移$32-$34--是此目录或文件的建立日期 
偏移$35-$37--FFFFFF(作用未知) 
偏移$38-$3C--标记定位符 
$38-$3A--是文件长度,需和实际文件的文件头中的文件长度相一致 
$3B--就是上文所说的定位符了,它和哪一项标记定位表项的定位符一致,那么此目录表所标志的目录或此文件表所标志的文件就在那一项标记定位表象所标记的簇中储存.根据此值和标记定位表,我们可以找到任一文件的地址 
$3C--00(作用未知) 
$3D-$3F--FFFFFF(作用未知) 

4.文件结构
NC1020系统中默认支持若干种文件格式,其中比较重要的有bin(可执行文档),BAS(GVBASIC的源代码文件),txt(文本文档)。

(1).bin文件 
nc1020的bin文件在pc端是被加密的.在下载到nc1020的过程中,首先被解密,然后再传输到NC1020. (加解密算法参见sun的程例)
nc1020的bin的执行方法有两种,一是当文件小于等于8k时的方法,二是当文件大于8k时的方法.现在分类的来说. 
当bin文件小于等于8k时,bin文件被装入ram的$2000开始的地址,到$3fff为止,总共是8k长度.然后从$2007开始执行.但如果文件大于8k,就没办法装入ram了,所以就只能在flashrom里执行.开始地址是$4007.但是这样的话就出了一点问题了.bin在下载到nc里的时候,不一定是线性的,即使是线性的,也不一定每一个bin都能占据到$4000开始的地方.对于小于等于8kbin来说,这还没有什么,反正都是要装入$2000开始执行的,也没有绝对寻址错误的问题.但大于8k的bin就不行了,可以说按这种情况,这样的bin就没有办法绝对寻址,因为bin被保存到哪一簇是未知的.但是还记得当一个大于8k的bin在第一次被执行的时候的情况么有一个装入中...的进度条出现.这个的作用就是解决绝对寻址错误的问题.在这时,系统要把这个bin按顺序转移到一个$4000开头的地方,也就是说每一个大于8k的bin都是从$4000开始的.所以nc也只能装入12个大于8k的bin(有4页是系统占用).这样的话,每次从$4007开始执行,就没有绝对寻址的错误了. 
再说一下bin的文件结构. 
偏移00-02 
如果是=8k,就是AAA55A 
如果是8K,就是AEEEEA 
偏移03-05就是上文所说的所说的那个文件长度了.必须和文件表中对应项的文件长度相一致. 
偏移0620(作用不明) 
偏移07-09从这里开始.一般都是一个JMP转跳. 
偏移0A-0F是BIN文件的版本号,一般必须是以下内容 
70031003FFFF 
或者 
70033103FFFF 
以后的就是正式内容了,上面的0F字节便是文件头. 

(2).BAS文件 
和PC1000的BAS文件结构一样,装入RAM的$2000后调用GVBASIC进行解释执行,所以也不能超过8K. 

(3).TXT文件 
偏移00-05000000000001(作用不明) 
偏移06-0900180000(作用不明) 
偏移0A-0C文件长度 
偏移0D-0E0000(作用不明) 
偏移0F-17重复06-0E的内容 
以后就是正文部分.




monkeycz
于2005年04月30日修订