易码技术论坛

 找回密码
 加入易码
搜索
查看: 5544|回复: 58

求助,关于6502中断!

[复制链接]
发表于 2007-12-4 08:23:39 | 显示全部楼层 |阅读模式
最进在学汇编,可是发现一个问题!
汇编中断是怎么寻址的?那为高手告诉我一下啊!
比如 int$COOA  int$0512等等类型的
教程上没有说过INT$COOA(C开头)的中断是怎么寻址的
发表于 2007-12-4 11:26:56 | 显示全部楼层
INT $0yxx是$00=y,然后在$4000起偏移xx*2字节后取出2字节作为地址跳转到该地址执行中断例程。
INT $cyxx是$0a=y,然后在$c000起偏移xx*2字节后取出2字节作为地址跳转到该地址执行中断例程。
没记错的话应该是这样。
 楼主| 发表于 2007-12-4 12:43:24 | 显示全部楼层
为什么要$0A=Y????有什么用,
还有,应该还有$C000+xx*2+1在取一个数据吧,一个高位,一个低位???
发表于 2007-12-4 13:37:00 | 显示全部楼层
$0a是用来切换$C000~$DFFF内存页的。
是$C000+xx*2吧。

[ 本帖最后由 yan 于 2007-12-6 22:14 编辑 ]
 楼主| 发表于 2007-12-5 08:15:46 | 显示全部楼层
原帖由 yan 于 2007-12-4 13:37 发表
$0a是用来切换$C000~$CFFF内存页的。
是$C000+xx*2吧。

那只有C000+XX*2的话,不是只能取到一个0-FF的数,怎么做地址啊
发表于 2007-12-5 14:20:17 | 显示全部楼层
确实是要高低位的,比如:
INT $C001: 首先置$0A为00h(或10h,20h,30h……只要后四位是0即可),然后取$C000+$01*2=$C002的值作为跳转地址的低字节,取$C000+$01*2+1=$C003的值作为跳转地址的高字节,在Tc808上,用ASMFUN可以看到低字节为51h,高字节为C0h,然后你就得到了INT $C001的跳转地址:$C051。直接跳到$C051去看看,那里开始就是INT $C001的代码。

察看时不要改变$0A的值,这样会改变$C000~$DFFF的值,代码也就变了。

INT $C00A: 首先置$0A为00h(或10h,20h,30h……只要后四位是0即可),然后取$C000+$0A*2=$C014的值作为跳转地址的低字节,取$C000+$0A*2+1=$C015的值作为跳转地址的高字节,在Tc808上,用ASMFUN可以看到低字节为31h,高字节为DEh,然后你就得到了INT $C00A的跳转地址:$DE31。直接跳到$DE31去看看,那里开始就是INT $C00A的代码。

INT $C729: 首先置$0A为07h(或17h,27h,37h……),然后取$C000+$29*2=$C052的值作为跳转地址的低字节,取$C000+$0A*2+1=$C053的值作为跳转地址的高字节,在Tc808上,用ASMFUN可以看到低字节为1Dh,高字节为D7h,然后你就得到了INT $C729的跳转地址:$D71D。直接跳到$D71D去看看,那里开始就是INT $C729的代码。

这里之所以要先置$0A为07h,就是要使得文曲星按照不同的页面编号(比如这个7),到不同的内存页面去执行由索引(比如29)所指定的程序段。

[ 本帖最后由 dragon_ 于 2007-12-5 14:24 编辑 ]
 楼主| 发表于 2007-12-6 08:15:08 | 显示全部楼层
然后取$C000+$01*2=$C002的值作为跳转地址的低字节,取$C000+$01*2+1=$C003的值作为跳转地址的高字节

$C000+$01*2=$C002 那个C002是怎么来的啊,为什么要让$C000+$01*2等于他啊
 楼主| 发表于 2007-12-7 15:40:10 | 显示全部楼层
首先置$0A为00h

怎么置啊,   LDA #$00
                  STA $0A
                  RTS
      是吗?但这样没有用啊!$0A根本不能改变

[ 本帖最后由 TYCY 于 2007-12-7 15:41 编辑 ]
发表于 2007-12-10 01:40:34 | 显示全部楼层

回复 7# 的帖子

楼主貌似完全没理解……汗
就是要去取内存中地址$C002的值作为跳转地址的低字节。取$C000+$01*2+1=$C003的值作为跳转地址的高字节。
至于那个$C002是怎么来的,就是因为$C000+$01*2=$C002!
并不是要让$C000+$01*2等于他!因为$C000+$01*2本来就等于$C002!
其他类似。
发表于 2007-12-10 01:46:18 | 显示全部楼层

回复 8# 的帖子

你是怎么看出来根本不能改变的?其实,当你看到没有改变的时候,0a的值已经被你用的程序改回去了。这时候眼见不一定为实的。
直接这样:
LDX #$00
STX $0A
LDA $C000
STA $80
INC $0A
LDA $C000
STA $81
RTS
然后看看$80和$81一样不一样?
 楼主| 发表于 2007-12-10 08:24:50 | 显示全部楼层
那么如果我要在取INT$C00A  
那么是不是这样:
2000: LDA#$00
           STA$0A
           RTS
然后 G 2000
然后 V C014,取C014和C015的值,(比如C014是10,C015是20)那么,最终地址就是2010了,然后我们在  U 2010 就是汇编结果了吗?
发表于 2007-12-11 21:58:01 | 显示全部楼层
对,就是这样。
一般来说,对于INT $CXXX,你取到的最终地址都会大于$C000,因为程序代码一般都与索引在同一个内存页面。
 楼主| 发表于 2007-12-12 08:18:28 | 显示全部楼层
那么我怎么知道是在哪一页的代码啊???
都在00页,不回吧???
发表于 2007-12-12 17:29:56 | 显示全部楼层
是INT $C0yy的话,就在00页。是INT $C1yy的话,就在01页。是INT $C2yy的话,就在02页……
你可以认为$0A的值就是Norflash的页面。$0A就是用来切换页面的,在INT $C005 与 INT $C705执行时,$0A的值分别为00与07,这就是为什么要切换$0A的值的原因。
发表于 2007-12-12 20:35:06 | 显示全部楼层
纯路过,帖个很久以前的巨老的帖子给你看下吧
http://www.emsky.net/bbs/viewthr ... amp;extra=page%3D24
NC1020中断响应详解 和现在的机型不知道有多少不同 不过芯片一样的话应该都是一样的吧
 楼主| 发表于 2007-12-13 12:54:57 | 显示全部楼层
谢LS啊,看先!
 楼主| 发表于 2007-12-17 08:24:32 | 显示全部楼层
那我置0A的值行吗?反正看CXYY,就知道是在X页!
而且我觉得置0A的值为多少,C000(和其以后)的值都没变
我是这样做的:
LDA#$01
STA$0A
RTS
然后V C000
在按G 2000,结果C000那的值都没变,不知道是不是我那里弄错了



还有我想问一下,CMP跳转后不会在回来了,是吗?除非在CMP
而其他跳转则可以用RTS返回

还有就是你们常说的跟踪,是不是 跟着代码抄,跳转到那里就抄那里??
发表于 2007-12-17 12:22:14 | 显示全部楼层
说过了,别用debug里的命令看。
直接这样:
LDX #$00
STX $0A
LDA $C000
STA $80
INC $0A
LDA $C000
STA $81
RTS
然后看看$80和$81一样不一样?

哪里有cmp跳转?是jmp吧?跳转后不回来了。

跟踪就是执行到哪里就抄到哪里。

[ 本帖最后由 dragon_ 于 2007-12-17 12:25 编辑 ]
 楼主| 发表于 2007-12-17 13:05:27 | 显示全部楼层
我在一些源码中看见这样的
..
..
NAND=0x3000
..
..
LDA #<NAND
LDA#>NAND


这是什么意思啊,那个>  <有什么用
还有就是那里有NC2600C的系统中断表啊(要全的)
比如进入目录,成功 C=0 OR C=1  要有这些的
发表于 2007-12-18 12:30:59 | 显示全部楼层
<  表示取16位地址的低字节。
>  表示取16位地址的高字节。

自己在网上搜吧。
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-4-27 05:13 , Processed in 0.011607 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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