易码技术论坛

 找回密码
 加入易码
搜索
查看: 2071|回复: 12

[源码] 求Nc1020(汗~)的文件操作中断

[复制链接]
发表于 2009-2-1 16:40:55 | 显示全部楼层 |阅读模式
想用汇编优化一下Imagemill.BAS文件操作的速度,可不知道我的星星(PC1000c)文件操作的中断(至今只知道返回根目录的中断),看到很多用了读文件中断的BAS软件(像氢氧根的作图软件~~),在自己WQX上试了下(好像是INT$0516),结果跑出一个界面很简陋的万年历 。我的星星根本没配电脑数据线(现在想买也无处可找了 ),所以没有XXtools什么的BIN软件,只有内置的破烂DEBUG ,所以在多达FF页的ROM(或者是闪存?)里找文件操作中断无异于大海捞针(就别叫我自己动手,丰衣足食了)。因为我的PC1000C资料和NC1020最像,所以谁要是有NC1020文件操作中断资料,贡献给小弟(当然如果有PC1000c的就更好啦 ),谢谢!!!!!!!!!
发表于 2009-2-1 20:57:06 | 显示全部楼层
曾经看过Pc1000的bin,文件中断可能是07XX吧。这个完全没把握,LZ试试看吧。
发表于 2009-2-9 02:59:01 | 显示全部楼层
抱歉,我這裡只有NC1020n的中斷地址,至於是否和NC1020通用就無法得知了,下面的只寫出了匯編碼,機器碼你可以用内置的簡陋Debug製成一個對應表,再慢慢翻譯過去。
====================
先説明
Carry bit = 1或0是指標誌寄存器P的第7位(從左到右共有編號0-7的8個二進制開關,Carry位是最右邊的那個開關),讀取Carry位是否為0時只能使用兩條指令:BCC(Branch on Carry Clear讀取為#$00時跳轉指定步長到指定位置,這是一條相對尋址命令,機器碼為$90),BCS(Branch on Carry Set讀取為#$01時跳轉指定步長到指定位置,這是一條相對尋址命令,機器碼為$B0)。
相對尋址指令的跳轉步長緊跟在BCC或BCS指令的後面作爲跳轉參數,該參數為1 Byte帶符號整數,#$00--#$7F表示由此処正跳轉,#$80--#$FF表示由此処負跳轉,跳轉範圍始終是腳下半徑為#$80的圓。比如$1000:#$B0 #$55就是本應繼續$1002然後再加#$55的位置,這就是跳到了$1057。如果是$1000:#$B0 #C4那就是本應繼續$1002,在$1002処向後跳轉#$00 - #$C4 = #$3C步長,也就是跳到了$1002 - $3C = $0FC6
====================
簡單來講:
(1)進入根目錄 INT $932D
(2)查看目錄是否存在,存在則進入 INT $9308
       參數:在$121C--$122C放入長度為$10的目錄名稱,不足補#$20
       返回:Carry bit = 0表示存在該目錄
(3)讀取文件 INT $9304
       參數:$120D和$120E讀出來放到哪裏的地址(高低地址順序)
                $120F和$1210需要讀取的數據長度
(4)創建文件或目錄 INT $9301
       參數:$121C--$122C放入長度為$10的目錄名稱,不足補#$20
                $1219 要創建什麽:目錄為#$02,文件為#$61
                $121A 要創建什麽:目錄為#$F0,文件為#$F8($1219和$121A都要寫)
                $121B 屬性:隱藏#$FB,只讀#$F7,正常#$FF或#$DF
                $122F--$1231全部固定為#$FF
       返回:Carry bit = 0表示創建失敗
(5)打開文件 INT $9302
       參數:$1214 讀/寫模式開關:#$00讀取,#$01寫入
       返回:Carry bit = 1表示文件不存在
(6)寫入文件 INT $9305
       參數:$120D和$120E把數據寫到哪裏的地址(高低地址順序)
                $120F和$1210需要寫入的數據長度
(7)追加數據 INT $9303
       參數:$120F和$1210需要寫入的數據長度
                $1211和$1212追加開始地址
(8)關閉文件 INT $9307 (讀完或寫完文件都需要關閉文件,實際上是關閉存儲晶片電路的動作)
====================
使い方:
ps:在進行跨頁中斷操作前,最好先進行保護現場的動作,所謂保護現場,就是把重要的$00,$0A,$0D這三個地址的當前數值壓入堆棧,使用PHA命令推入堆棧即可(該命令的機器碼為#$48),調用完中斷后再把這三個地址的原始值使用PLA命令從堆棧中讀出(彈出堆棧的機器碼為#$68),恢復到各自調用前的值。否則可能會出現火星黑洞外星人等不可預知的狀況。
--------------------------------------
以上,如果你還不大明白具體的程序應該怎樣寫,我會在下面貼上範例匯編代碼的。希望這樣的解答能夠有點點幫到你シ☆

[ 本帖最后由 fly_jack 于 2009-2-15 21:28 编辑 ]
 楼主| 发表于 2009-2-15 12:10:31 | 显示全部楼层
研究了一周,终于把pc1Kc主要的几个文件操作中断搞清楚了,都在$02页,中断偏移大都是LS讲的中断偏移+1(返回根目录除外,是INT $022a)。
现在我可以进入“我的图片”目录查看BMP文件了^_^。只是BMP图像直接读到显存是上下左右都颠倒的,不知道怎么处理 ,还有那开始的62字节是啥东东?
还有,我想在GVB下制作SKI、EBK、TXT文件,所以我需要知道这几种文件的格式(such as,a BMP file=head 62 bytes+image 1600 bytes),哪位知道的请告诉我,谢谢。

[ 本帖最后由 Amlo 于 2009-2-15 12:16 编辑 ]
发表于 2009-2-15 17:55:03 | 显示全部楼层
你的pc1000c还健在阿
 楼主| 发表于 2009-2-15 19:28:45 | 显示全部楼层
对啊,以前还以为PC1000C是个没用的黑白屏电子词典,所以扔在一边,所以键盘连字都没磨掉,后来!……%¥#……%#!!&(%**&¥&知道了“GVBASIC”是编程用的,所以*%(*&¥#*¥(……)*,才发了这张贴...

[ 本帖最后由 Amlo 于 2009-2-15 19:30 编辑 ]
发表于 2009-2-15 23:04:38 | 显示全部楼层
我忘記文曲星的熒幕坐標軸和Windows畫圖程式的坐標軸方向好像不同
並且我對Windows畫圖程式的格式研究不很深。並且我的Nc1020n早已坏掉,無法實機測試,大陸的產品質量真的是無法恭維~
但是Windows BMP黑白點陣圖像是由下至上存儲的,所以在STA到顯示記憶體時也需要從最後一排向上裝入,但是由於『讀取文件』中斷讀出的數據都是順序存放的,所以不可以直接讀到顯示記憶體中,需要先放入一段RAM中,然後倒序放入Grapic RAM中。

如果左右依然顛倒,請先將各排水平20字節左右順序顛倒,並使用如下代碼將各字節中的bits位置左右鏡像
===($xxyy裝入要鏡像的值,$mmnn為轉換出的鏡像地址)===
$2000   A2  08         LDX #$08        --1 Byte長為8 bits,X寄存器循環8次
$2002   0E  yy  xx     ASL $xxyy       --源數左移1 bit,最高位進位至Carry bit,右邊補0
$2005   6E  nn mm   ROR $mmnn     --目的數右循環移位1 bit,將上面移至Carry的bit移到這裡來
$2008   CA              DEX                --X寄存器-1
$2009   D0  F7         BNE $2002      --X寄存器未減至0時跳轉至$2002処循環,否則執行下方代碼

具體的Test我機器坏掉沒有辦法做,如何將圖片正確翻轉你再多多嘗試,這裡提到的只是算法。全部寫出來我會爆炸的。
關於BMP文件頭格式,引用一下百度知道
http://zhidao.baidu.com/question/14409598.html

SKI,EBK,TXT不是很清楚,這些文件格式了解得不深,後面了解的話我會再來的,抱歉~
 楼主| 发表于 2009-2-22 21:04:42 | 显示全部楼层
感动啊...非常感谢楼上这么热心地帮助我!谢谢!
 楼主| 发表于 2009-3-2 08:54:56 | 显示全部楼层
读取BMP图像成功了,还从 轻松文本.bas 里找到了TXT文件头
PS. 不好意思,我看错了,BMP只有上下颠倒,没有左右颠(也就是说不用镜像了
发表于 2009-3-2 16:13:49 | 显示全部楼层
呵呵,祝賀你喔。
還有還有,TXT文件頭是什麽呢?我用UltraEdit察看時並沒有發現文件頭(迷惑中3_3),而是直接從#$00処就開始了文本内容,這是怎麽回事?請教一下你在『輕鬆文本.bas』中找到的文件頭是什麽?謝謝。
发表于 2009-3-2 18:48:09 | 显示全部楼层
只有WQX上的文本文件才有文件头……
 楼主| 发表于 2009-3-7 20:43:24 | 显示全部楼层
让我找找...

1 GOTO 5:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5 DATA 0,13,5,96,0,11,5,96,0,14,5,96,0,15,5,96,0,28,5,0,27,5,96:REM汇编程序
7 REM以下是TXT HEAD
10 DATA 0,0,0,0,0,1,0,24,0,0,11,11,0,49,0,0,24,0,0,11,11,0,49,0

12 REM内置BASIC不能POKE,故用以下方法判断环境
15 X=INT(RND(3)*245+5)
20 POKE 16000,X
30 IF PEEK(16000)<>X THEN PRINT "System error.Please run with nc3k-GVBASIC+":END
40 POKE 16000,0
60 CLEAR:PRINT "Initializing..."
62 RD=2189:WHILE PEEK(RD)<>0
64 F$=F$+CHR$(PEEK(RD)):RD=RD+1
66 WEND
70 PRINT "Poke Memory..."
80 FOR RD=1 TO 23
90 READ M%
100 POKE 8199+RD,M%
110 NEXT RD
125 PRINT "加载文件头..."
130 FOR RD=1 TO 24
140 READ M%
150 HEAD$=HEAD$+CHR$(M%)
160 NEXT RD
165 PRINT "检测目录..."
170 C$="/文本文件":GOSUB 5000:CALL 8204
180 DIM IPASS$(6)
190 DAT$="":DAT2$="":XOR$="":BIN$=""
195 CLS:NORMAL:GRAPH
200 LOCATE 1,7:PRINT "轻松文本"
210 LOCATE 2,9:PRINT "V1.0"
215 LOCATE 3,7:PRINT "NC3000版"
220 LOCATE 5,2:PRINT "(C) GeorgeSoftware";
...
 楼主| 发表于 2009-3-7 20:49:00 | 显示全部楼层
最近霉运亨通,星星先被中断格式化,后来版本信息又丢了,以至于我一按热键就出现“产品信息有误,请接洽代理商”,唉...
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-3-28 19:42 , Processed in 0.009433 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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