当前位置: 首页 > 工具软件 > JBit > 使用案例 >

JBit 与 6502 汇编

陶成济
2023-12-01
1、JBit 是一个 J2ME 平台上的 MIDlet 程序,用来在手机上编辑和调试 6502 程序,甚至可以在桌面上开发 6502 汇编程序并传输到 MIDP 的手机设备上(6502 是七八十年代使用非常普遍的一种CPU)。
[color=red][b]文曲星使用 6502。[/b][/color]


2、6502 汇编资料
a) [url]http://nesdev.parodius.com/6502_cn.txt[/url]

b) 6502编程大奥秘.chm (网络上有,自已搜索一下吧。)


3、学习笔记

LDA 指令

LDA ($addr,X) A1 先变址X后间址 *11
LDA $addr A5 零页寻址
LDA #$data A9 立即寻址
LDA $addr16 AD 绝对寻址
LDA ($addr),Y B1 后变址Y间址
LDA $addr,X B5 零页X变址
LDA $addr16,Y B9 绝对Y变址
LDA $addr16,X BD 绝对X变址


LDA LDA Load accumulator with memory LDA

Operation: M -> A N Z C I D V
/ / _ _ _ _
(Ref: 2.1.1)
+----------------+-----------------------+---------+---------+----------+
| Addressing Mode| Assembly Language Form| OP CODE |No. Bytes|No. Cycles|
+----------------+-----------------------+---------+---------+----------+
| (Indirect,X) | LDA (Oper,X) | A1 | 2 | 6 |
| Zero Page | LDA Oper | A5 | 2 | 3 |
| Immediate | LDA #Oper | A9 | 2 | 2 |
| Absolute | LDA Oper | AD | 3 | 4 |
| (Indirect),Y | LDA (Oper),Y | B1 | 2 | 5* |
| Zero Page,X | LDA Oper,X | B5 | 2 | 4 |
| Absolute,Y | LDA Oper,Y | B9 | 3 | 4* |
| Absolute,X | LDA Oper,X | BD | 3 | 4* |
+----------------+-----------------------+---------+---------+----------+
* Add 1 if page boundary is crossed.


11.先变址X后间接寻址

两字节指令

指令格式:

操作码 第一字节
零页基地址 第二字节

这种寻址方式是先以X作为变址寄存器和零页基地址IND相加 IND+X,不过这个变址计算得到的只是一个间接地址,还必须

经过两次间接寻址才得到有效地址

第一次对 IND + X 间址得到有效地址低 8 位

第二次对 IND + X + 1 间址得到有效地址高 8 位

然后把两次的结果合起来,就得到有效地址.

 

我们看一个例子:

指令 LDA ($F0,X) 的寻址过程如下:

这里设 (X) = 02,(F2) = 30,(F3) = 40

那么先得到间接地址 = F0 + (X) = F0 + 02 = F2

第一次对地址F0 + (X) = F2间址得到有效地址低8位 = 30

第二次对地址F0 + (X) + 1 = F3间址得到有效地址高8位 = 40

那么有效地址就是地址4030了,该指令功能就是将地址4030的内容送寄存器A,大家可以在NCTOOLS中试一下


12.后变址Y间接寻址

两字节指令

指令格式:

操作码 第一字节
零页间接地址 第二字节

这种寻址方式是对IND部分所指出的零页地址先做一次间接寻址,得到一个低8位地址

再对IND + 1 作一次间接寻址,得到一个高8位地址

最后把这高,低两部分地址合起来作为16的基地址,和寄存器Y进行变址计算得到操作数的有效地址,注意的是这里IND是零页地址

看一个例子:

例如指令 LDA ($F0),Y

我们看看寻址过程:

设 (F0)=20,(F1)=30,(Y)=03

先对地址F0间址得到低8位地址 20

再对地址F0+1间址得到高8位地址30

把两次结果合起来得到16位的基地址 3020

然后再把地址3020和寄存器Y进行变址,得到有效地址3020+(Y)=3020+03=3023

所以该指令的功能是将地址3023的内容送寄存器A


---------------------------------
9) 预索引间接 (Pre-indexed indirect)
这种模式是将一个零页面地址加上 X 寄存器中的内容,然后给出保存操作数地址的字节的地址. 间接模式在汇编语言
中是由圆括号标记.
例如: LDA ($3E, X)
$A1 $3E
假定: - byte value
X.reg $05
$0043 $15
$0044 $24
$2415 $6E

这条指令将被如下执行:
(i) $3E + $05 = $0043
(ii) 获取 $0043, $0044 两字节中保存的地址 = $2415
(iii) 读取 $2415 中的内容 - 也就是,$6E - 进入累加器

10) 传递索引间接 (Post-indexed indirect)
在这种模式中,一个零页面地址的内容 (包括其后面的字节) 给出一个间接地址,该地址中的内容将与 Y 寄存器中的
值相加生成出操作数的真实地址. 同样,在汇编语言中,这个指令由圆括号标记.
例如: LDA ($4C), Y
注意,圆括号只括起来了指令中的第二个字节,因为它是做间接操作的一部分.
假定: - byte value
$004C $00
$004D $21
Y.reg $05
$2105 $6D
这条指令将被如下执行:
(i) 读取字节 $4C, $4D 中的内容 = $2100
(ii) 与 Y 寄存器中的内容相加 = $2105
(iii) 读取字节 $2105 中的内容 - 也就是,$6D 到累加器.
注意,这种模式中,仅使用了 Y 寄存器.
 类似资料: