- 注册时间
- 2004-9-3
- 最后登录
- 1970-1-1
|
发表于 2006-12-30 18:37:40
|
显示全部楼层
贴一个全的
(1) INT $0xyy型中断的响应
调用第x页码中 ($4000 + 2*yy) 所指向的程序
比如 INT $0302
在 03 页码中,4000开始的数据为 60 EA 40 40 6F 40.......
4000+2*01=4004, ($4004)=$6F,($4003)=$40
所以 INT $0302 就是调用03页码的 $406F处的子程序.
i(2) INT $1xyy ~ INT $3xyy
此类中断,会先从 $05C4 中读出一个值,作为页码的 "基准0页",然后转移到偏移x页中执行 ($4000 + 2*yy) 所指向的程序.
此类中断一般用于应用程序中,系统在运行一个应用程序时(一般是大于8K的程序),会先将该程序的起始页码值置入 $045C,然后在程序中通过调用 INT $3xyy 来实现调用不同页码中的子程序.
例如英雄坛说,假定我的英雄坛说在第05页~08页码分布,在某处用到了INT $3008 (这个是我修改的英雄坛,尚未发表,所以大家的可能不会有 INT $3008 这个调用,这里只是为了说明问题).下面讲一下INT $3008的响应过程:
A.在系统运行英雄坛说时,会自动将其所在的第一页码值(即05)放入$05C4中.
B.如上面所说,INT $3008 就是执行"偏移0页"的某段程序,"偏移0页"这里就是相对于($05C4)页相对于即05页的偏移0页,(还是第05页),然后 $4000 + 2*$08=$4010,在英雄坛说的初页$4010处我写入了数据 A0 62,那么这个INT $3008就会调用第05页的 $62A0 处的程序.
(3) INT $4xyy ~ INT $7xyy
实际上根本就不存在此类中断,但如果你强行调用,系统也是会响应的。由于中断服务程序中有BUG,此类中断一般只会引起死机。强行调用时系统的响应过程如下:
A.先从 $05C4 中读出一个值,作为页码的 "基准0页",将页码翻至偏移x页处.即 ($05C4) + x → ($00)
B.调用 ($C000 + 2*yy) 处所指向的程序.这就是BUG所在.应该是调用 ( $4000 + 2*yy )处所指向的程序才对,与第 (2)种中断归为一类才对。
由于无此类中断,这里就不举例了。
(4) INT $8xyy ~ INT $Bxyy
此类中断在徐哥的6502编程大奥秘中已经作了说明,这里再简单说一下:
A. INT $XXYY中的XX为页码。翻到XX页。即 XX → ($00)
B. 调用 ($4000 + 2*yy) 处所指向的程序
(5) INT $Cxyy ~ INT $FEyy
此类中断,均等同于 INT $Cxyy
响应过程如下:
A. 将($0A)中置入x,即 x → ($0A)
B. 调用 ($C000 + 2*yy) 处所指向的程序
(6) INT $FFxx
此类中断是系统的内置音乐播放程序。音乐在后台播放。响应过程如下:
A. 检测电池电量,若低电,则返回主程序
B. 检测游戏音乐开关,若关,则返回主程序
C. 检测 xx 的值,若大于或等于 #$7D 则返回主程序
D. 从第 84 页 $B300 + 2*xx 中找出值,置入 ($AA), $B301 + 2*xx 中找出值,置入 ($AB). 即 84页: ($B300 + 2*xx ) → ($AA) , ($B301 + 2*xx ) → ($AB)
E. 分别将 01 和 80 置入 ($04B5) 和 ($04B6)
F. JMP $E452 |
|