早期存档资料(4)-Nc2k系统常用中断资料

** Nc2k系统常用中断资料 **
By 小 鱼

*******注初学者:在本文中,中断符号为"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


就写到这里吧,这都是最常用的中断了,愿这些资料对大家有用,希望大家的汇编水平越来越高。^O^
欢迎大家转载,转载时请注明作者小鱼及小鱼的网站"www.31safe.com",及发帖网站"www.wqxnet.com",谢谢大家的合作。
----小鱼
完成于2004.02.15

文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 文曲星  nc2000  中断 
评论: 0 | 引用: 0 | 查看次数: 381
发表评论
用户名:
密 码: 游客发言不需要密码.
验证码: 验证码
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 500 字 | HTML代码允许 关闭 | 评论可修改 关闭