[轉貼]NC2K&NC3K常用系統調用

6502 組合語言,是哈電族裡使用的程式語言,也是目前設計 Bin 的唯一方法,有興趣的就進來吧
回覆文章
頭像
希洛
一級會員
一級會員
文章: 319
註冊時間: 2003-08-15 5:01 PM
來自: 遠太天邊、近在眼前的世界
聯繫:

[轉貼]NC2K&NC3K常用系統調用

文章 希洛 »

** Nc2k系統常用中斷資料 **(初學6502必看)

最近被一些糾紛弄的暈頭轉向,學習6502也耽誤了不少,今天特把一分適合處學者的東西發上來,原文見:http://211.89.1.34:81/web/Article_Show.asp?ArticleID=10

** Nc2k系統常用中斷資料 for NC2000**
By 小 魚
**************************
如有什麼問題,可以到小魚的網站(我的網站高考後正式開張,但現在仍可訪問)"www.31safe.com"的論壇的編程區發帖子或者到留言板留言,當然,也可以發信給我,我的郵箱和QQ在我網站的"成員簡介"中有。
**************************

*******注初學者:在本文中,中斷符號為"int",而在wqxhex中,中斷符號為"brk",實際上,兩者意義一樣,僅符號不同。*******

?聲明:以下內容具有一定的危險性,請慎用,且只適用於Nc2000,如有人應用時對文曲星造成損壞的,作者概不負責!

現在Sun已經出了能寫asm(彙編碼)的wqxhex了,大家可以下載之後再在自己的機器上試試了。我也十分高興,終於告別寫機器碼的歷史了。
看了這些內容,相信大家一定可以為wqxhex加上一些新功能了,如保存自己寫的文件、寫出文曲星的bin文件或bas+mcode文件了。

§中斷調用資料.
$$1.等待按鍵(int $c00a)
相當於basic中的inkey$,或lava中的getchar,將用戶的按鍵值送至累加計存器a中.
$$2.刷新LCD中斷(int $c719)
將緩衝區的資料顯示在螢幕上。而在nc2000中,緩衝區從$02c0開始,再就是刷新方式,對int $c719,小字時,$0392為$01,$0393為$00,大字時$0392為$00,改了這部分後,退出時記得改回來喔。
如:
int $c72a //清除顯示緩衝區資料
int $c737 //清屏
ldx $34
loop:
lda $20ff,x
sta $02bf,x
dex
bne loop
lda $0392
pha
lda $0393
pha //原來$0392,$0393的內容進棧保護
lda #$01
sta $0392
lda #$00
sta $0393
int $c719
int $c00a //調用按鍵中斷,防止畫面一閃而過
pla
sta $0393
pla
sta $0392 //彈出原來的值並恢復
rts
文字內容
$2100
cfa3cdfb7771786e 希望wqxn
6574bacdtttbtytm et和wqxs
6b79bea18fecbacd ky儘快和
bac3a3acc8c3cec4 好,讓文
c7fad0c7cac0bde7 曲星世界
b0fcbcd3c3c0c0f6 更加美麗
2120202020202020 !
2020202020202020
202020427920d0a1 By 小
d3e3200000000000 魚

程式執行後會顯示

希望wqxnet和wqxsky儘快和好
,讓文曲星世界更加美麗
By 小魚

$$3.系統功能表中斷(int $cb03)
使用該中斷可弄出和系統中的功能表一樣的功能表.
使用方法:調用使x寄存器中放參數表的低八位地址,y寄存器放參數表高八位地址.如:
ldx #$00
ldy #$30
int $cb03
rts
在這裏,參數表在$3000.
參數表定義:
1.功能表屬性("$01"表示單排功能表,"$02"表示雙排功能表,"$09"表示單排,且可通過數位鍵啟動功能表內容)
2.功能表選項數目
3.第一行功能表的入口地址低八位
4.第一行功能表的入口地址高八位
5.第一行功能表幫助入口低八位元
6.第一行功能表幫助入口高八位元
7.第二.......
8.第二.......
9.第二.......
10.第二.......
......
一直到最後一行的參數
緊接著參數表的是功能表名稱,多行功能表中,每項之間用"$ff"間隔。

$$4.系統通用視窗調用(int $ca12)
使用該中斷可做出彈出資訊框,或者是選擇對話方塊。
入口參數:x寄存器放參數表地址的低八位,y寄存器放參數表位址的高八位元,累加器a中的資料為視窗屬性。($00表示彈出資訊框,$01為帶感歎號的選擇筐,$02為帶問號的選擇筐.)
參數表定義:
1.$80
2.視窗文字所在地址的低八位;
3.視窗文字所在地址的高八位;
4.窗口位置x座標值
5.窗口位置y座標值
6.視窗文字的位元組數
7.窗口寬度($02:一行;$04:兩行;$06:三行)
8.後面結束符"$02"所在地址低八位
9.後面結束符"$02"所在地址高八位
10.結束符"$02"

$$5.資料登錄調用(相當於c中的scanf)(int $cb07)
使用該中斷可用來輸入資料,進行人機交互。
入口參數:x寄存器為參數表的址的低八位,y寄存器為參數地址的高八位。
如果想在輸入時顯示游標,請在中斷調用前加入以下代碼:
lda $03b3
and #$3f
sta $03b3
lda #$15
sta $0448
至於你如果想改變游標類型,就自己試著改改以上的代碼吧。
參數表定義:
1.游標位置;($00-$63)
2.允許輸入的最大位元組數;
3.$20
4.幫助內容起使地址的低八位;
5.幫助內容起使地址的高八位;

$$6.檢查文件夾是否存在並進入該文件夾.(int $050d)
檢查結果對Carry位有影響,大家可自己試試,如果文件夾存在,則進入該文件夾。

$$7.新建文件夾(int $050b)
該中斷可在文曲星任意處新建文件夾,文件夾名從$08be開使,以$ff結束,文件夾名最大為十位元組。

$$8.打開文件中斷(可新建)int $0515
該中斷可在星星上任何地方新建文件或打開任意文件,檔案名從$08be開始,$08fa處表示打開方式,$70寫文件(沒有則新建),$40唯讀,如果不存在,則影響Carry位。而$08fa和$08fc是新建文件的屬性,大家試一試吧,我沒時間寫清楚了!(下面有示例)

$$9.關閉文件(int$0517)
文件打開後一定要記得關閉,否則會出問題的,關閉只須用此中斷。

$$10.寫文件(int $0515)
該中斷可將記憶體中的內容寫入指定文件,但使用之前一定要以寫的方式打開一個文件,寫完後記得關閉。
參數:
$dd:要寫入資料的位址高八位元;
$de:要寫入資料的位址低八位元;
$$08f7:寫入資料長度的低八位元;
如:
lda #$70
sta $08fa
lda #$cf
sta $08fb
lda #$ff
sta $08fc
int $0515 //新建一個文件,檔案名設已寫好
lda #$00
sta $dd
lda #$20
sta $de
lda #$38
sta $08f7
lda #$0a
sta #$08f8
int $0518 //寫文件
int $0517 //關閉文件
rts

$$11.讀出指定文件(int $0516)
我們已經能寫文件了,可是,我們寫的文件怎樣才能打開呢?或者我們要修改某個文件,可是又找不到該文件所在的快閃記憶體頁碼,怎麼辦?這就要用這個打開文件的中斷了。
參數:1.位址$dd放入你想放文件內容的記憶體位址低八位元,
2.位址$de放入你想放文件內容的記憶體位址高八位元,
3.$08f7放入欲打開部分長度的低八位元,
4.$08f8放長度的高八位。
同樣,檔案名是在$08be開始的地方,特別要注意的是,在讀文件時要確保文件已打開,而且是以可讀的方式打開的,即打開屬性為$80(下面有舉例).且結束時要關上文件。

綜合舉例:大家是不是都用過lee的lava解析器吧,現在已有很多的LAVA遊戲了,可是我們並不想別人玩這些遊戲,怎麼辦?那就讓我們自己動手,給我們的lava加上密碼保護。
首先,我們要找到關於密碼驗證的方法,通過分析記憶體,我們可以發現驗證程式在nor flash的第$06頁,其程式入口實際上為$067ca5,即"int $0604"通過反編譯確定了使用方法。下面就開始吧。
運行sun的wqxhex,為了方便,我們儘量少寫代碼,因為代碼少,就隨便找一個地方,我是寫的$1000,為了安全,先把lava複製到/BAK/LAVA.bin,寫入以下代碼。
首先進目錄:
int $0523 //退出已進文件夾
int $050d //進入想進的文件夾
rts
然後在$08BE處寫入目錄名"BAK"的十六進位碼.並以$00結束"$42,$41,$4b,$00"。檢查無誤後,G1000運行程式,運行完畢後,就進入BAK了,但是沒有任何資訊顯示。不過沒關係,我們繼續。
然後我們要將文件打開,並讀入到以$4000開始的記憶體。現在又在$1000處寫代碼(當然,你可以選擇其他地方)。

lda #$80
sta $08fa
int $0515 //以屬性$80打開文件
lda #$00 //文件讀入記憶體位址的低八位元
sta $dd
lda #$40 //文件讀入記憶體位址的高八位元
sta $de
lda #$00 //欲寫入的文件長度低八位
sta $08f7
lda #$80 //欲寫入的文件長度的高八位,這裏我將文件長設的很大,是為能讀入整個文件,當然你可以到資源管理器中查看其大小,再讀入整個文件,但一定要讀入整個文件
sta $08f8
int $0516 //讀入文件
int $0517 //關閉文件
rts
寫完後,確保無誤,再到$08be寫入"LAVA.bin"的十六進位碼"$4c,$41,$56,$41,$2e,$62,$69,$6e,$00",然後,我們G$1000,當程式運行成功後,我們到地址$4000,就可以看到整個文件的內容了,到這裏,文件成功讀入。
接著,該是修改程式的時候了,看了一下,程式是把主體複製到$8000後在運行的,其主程序與複製程式之間有一段空白區,我們就可以將程式寫到這裏,通過查看文件頭得之,程式入口為$4010,下面開使加代碼,我選的是$4040,
代碼如下:
$4040:lda #$00
sta $0487 //將密碼開關置於關
lda #$00
int $0604 //調用密碼驗證中斷
bcc $404f //如果密碼錯誤,則跳到$404f
jmp $4010 //如果密碼正確,則進入主程序
$404f:int $0310 //退出程式
rts
代碼寫完了,可是還有一個問題,程式的入口還是$4010,而不能運行我們加上的代碼,所以,我們還有一個任務:改文件頭中的入口地址,下面,我們來看一看nc2000的文件頭,如下:
AE EE EA 00 20 00 20 4C
10 40 D0 07 30 03 FF FF
其中那個“10 40"代表文件的入口地址為$4010,為了讓它能先運行我們的程式,我們將其改成"40 40",即:
AE EE EA 00 20 00 20 4C
40 40 D0 07 30 03 FF FF
到這裏為止,我們就改好了這個程式了,注意:在整個過程中千萬別退出或運行這個程式,否則,在次進來時,一切須從頭開使!
最後,我要做的,就是將程式保存,同樣,我們在$1000處寫程式,如下:
lda #$70
sta $08fa
lda #$cf
sta $08fb
lda #$ff
sta $08fc
int $0515 //新建一文件
lda #$00 //資料起始位址低八位元
sta $dd
lda #$40 //資料起使位址高八位
sta $de
lda #$9f //文件長度低八位,通過資源管理器發現我的lava大小轉為十六進位為3d9f,據體視你的機器上的大小而定。
sta $08f7
lda #$3d //文件長度高八位
sta $08f8
int $0518 //將資料寫入文件
int $0517 //關閉文件
rts
然後,將檔案名寫入$08be開始的地址,記的檔案名最後要加$00.再G$1000,程式運行完後,退出,你就會發現在"BAK"文件夾中有了你修改的程式了。唉,終於完成了。
最末,將其複製到"應用程式",再傳給別人,或者先上傳至電腦,在下載,或者直接複蓋原文件,你就可以感受加密版的lava和動手帶來的喜悅了。
相信有一定基礎的朋有看了這些,一定能自己動手修改程式了吧,如給wqxhex加入載入應用程式,保存自己寫的程式等等功能了吧。

$$12.退出文件夾(int $0523)
退出已進入目錄,返回上級目錄。

$$13.退出中斷(int #0310)
退出所運行的文件,返回上級功能表。

$$14.清除顯示緩衝區資料 (int $c72a,其實前面已用到了)

$$15.清屏中斷(int $c737,相當於gcbasic中的cls,前面實例中也用到了)
最後,我還要談談一個大家都不解的問題,在文曲星中運行迴圈時,超過五秒就會自動關機,這給我們編程造成了極大的不便,其實解決的方法有兩個,其一為,在迴圈運行之前,先設置禁止中斷(即SEI),迴圈結束後恢復(即CLI)。這種方法OICO也說過了,好處是適用所有機型,操作簡單,但是這種方法是通過設置禁止中斷而實現的,故在運行時無法回應中斷(如鍵盤輸入等),還有一種方法是將$00送至指定地址,以防關機,所以各種機型的方法各不相同,但可以回應如鍵盤輸入等中斷,在nc2000下超過五秒的迴圈在每次迴圈時必須加入以下代碼:
lda #$00
sta $03f6
sta $b9

在nc1020下,每次循還須加入的代碼為:
lda #$00
sta $046e
sta $04ae


NC2K的防關機:

LDA #$00

STA $0430

STA $0426


就寫到這裏吧,這都是最常用的中斷了,願這些資料對大家有用,希望大家的彙編水平越來越高。^O^
歡迎大家轉載,轉載時請注明作者小魚及小魚的網站"www.31safe.com",及發帖網站"www.wqxnet.com",謝謝大家的合作。
----小魚
完成於2004.02.15
頭像
sppmg
一級會員
一級會員
文章: 260
註冊時間: 2004-01-10 12:41 PM
來自: 地球ㄉ台灣ㄉ台北
聯繫:

文章 sppmg »

參數更正

brk 0515
檔名→08AC
其他參數08E8.08E9.08EA

BRK 0518
08E5.08E6

BRK 0516
檔名→08AC
其他參數08E5.08E6

BRK 050B
推測檔名也是從08AC


也就是除DD.DE外的位址均減$12(只限上面這些BRK)

還有nc2000防關機用
lda #$00
sta $03f6
sta $b9
(這是系統中用的)
好久沒完6502了
也沒時間......
目前除了拼課業就是玩Linux(還說沒時間......)
Mowd
系統管理員
系統管理員
文章: 1828
註冊時間: 2003-07-16 6:31 PM
來自: 台灣台北
聯繫:

文章 Mowd »

為了整合文章,特將此貼上
此文 By希洛

NC3000檔案調用
※關閉文件:0517
※OPEN FILE:0515
08B1:文件名(以00結尾)
08ED:開檔模式
※LOAD FILE:0516
08B1:文件名(以00結尾)
B7:存放目標低8位址
B8:存放目標高8位址
08EA:讀取長度低8位
08EB:讀取長度高8位
※NEW DIR:050B
08B1:DIR NAME(END BY FF)
※ENTER DIR:050D
08B1:DIR NAME(END BY FF)
※WRITE FILE:0518
B7:寫入資料低8位址
B8:寫入資料高8位址
08EA:讀取長度低8位
08EB:讀取長度高8位
※退出文件,回到目錄:0310
※退出DIR:0523
測試沒有成功過,是參考我轉載的NC2K找的。
Mowd 與你的交流天地
歡迎您的到來
頭像
sppmg
一級會員
一級會員
文章: 260
註冊時間: 2004-01-10 12:41 PM
來自: 地球ㄉ台灣ㄉ台北
聯繫:

文章 sppmg »

更正
$$3.系統功能表中斷在台版NC2000為$CB02


增加

$$4.系統通用視窗調用(int $ca12)
累加器a中的資料
$03為有選項的選擇筐(誰幫我翻譯一下啊)
↓↓↓
就像功能設定中的"輸入反查"中的選擇畫面

而出參為A累加器
好久沒完6502了
也沒時間......
目前除了拼課業就是玩Linux(還說沒時間......)
gbwind
一級會員
一級會員
文章: 254
註冊時間: 2003-08-02 8:57 PM
來自: 亞爾-魯特大陸

文章 gbwind »

有沒有關於3000的輸入中斷資料?
伊瑟拉之劍 RM 版
伊瑟拉之劍 天神之兵
策劃中...
回覆文章