内容目录
背景
寻址模式主要为了读取操作数方式,为了读取正确的值,然后进行争取操作
寻址模式
- 索引寻址
- 其他寻址
索引的模式
Zero page indexed X
val = PEEK((arg + X) % 256)
arg :pc 读取值
X:寄存器
arg + x : 得到index
peek : 读取 arg+x偏移的值
Zero page indexed Y
val = PEEK((arg + Y) % 256)
arg:pc读取值
X:寄存器
arg + y : 得到 index
peek:读取 arg + y 偏移的值
Absolute indexed X
val = PEEK(arg + X)
arg:地址
X:X寄存器
PEEK:读取 arg+X 地址
Absolute indexed Y
val = PEEK(arg + Y)
arg:地址
Y:Y寄存器
PEEK:读取 arg+Y 地址
Indexed indirect
val = PEEK(PEEK((arg + X) % 256) + PEEK((arg + X + 1) % 256) * 256)
这个是arg是单字节,这个是Zero Page 处理,按照这个公式写代码就可以了
本质区别
索引是通过偏移(主要是x,y),多一个偏移,不是单纯的oprand(操作数),二其他寻址基本是操作数
cpu 指令
CPU 指令通常由 操作码(Opcode) 和 操作数(operand)
多加一个cpu 周期原因
| 周期 | 总线上在干什么 | ALU 在干什么 |
|---|---|---|
| T1 | 取 opcode | 译码 |
| T2 | 取 base_lo | 闲置(没有可算的东西) |
| T3 | 取 base_hi | 算 base_lo + X |
| T4 | 把地址放上去读数据 | 检查进位 |
| T5 | 重读一次(仅当有进位) | 闲置 |
T4 如果检测进位了,代表是溢出,那么就必须重新计算一下地址,这个硬件为了实现读取16位地址逻辑,这个周期用来正确计算地址,如果没有溢出就不用重新计算
T4还没有计算进位地址,如果进位就需要T5重新读取,这个时候计算进位
一些命令会增加一个周期,我之前写Nes 模拟器是 没有处理,貌似也不是特别影响
缩写
d,x
d,y
a,x
a,y
(d,x)
(d),y
这里的d:direct page 等于 zero page
a:Absolute