我现在开始学习6502汇编语言,但是在处理需要处理超过8位数字的循环时遇到了问题。
具体来说,我想要循环一些内存位置。用伪代码表示,我的目标是这样的:
// Address is a pointer to memory
int* address = 0x44AD;
for(x = 0; x < 21; x++){
// Move pointer forward 40 bytes
address += 0x28;
// Set memory location to 0x01
&address = 0x01;
}
从地址$44AD
开始,我想要将$01
写入RAM,然后跳转到前面$28
,再将$01
写入那里,然后再向前跳转$28
,直到完成20次为止(最后要写的地址是$47A5
)。
我的当前方法是循环展开,这很繁琐(即使我猜测汇编语言可以使它更简单):
ldy #$01
// Start from $44AD for the first row,
// then increase by $28 (40 dec) for the next 20
sty $44AD
sty $44D5
sty $44FD
[...snipped..]
sty $477D
sty $47A5
我知道绝对寻址(使用累加器而不是Y寄存器-sta $44AD, x
),但这只会给我一个0到255之间的数字。我真正需要的是像这样的东西:
lda #$01
ldx #$14 // 20 Dec
loop: sta $44AD, x * $28
dex
bne loop
基本上,从最高地址开始,然后向下循环。问题是 $14 * $28 = $320 或 800 十进制,这比我实际可以存储在8位X寄存器中的更多。
有没有一种优雅的方法来解决这个问题?
c64
,因此您应避免使用零页地址$00
和$01
,因为它们由 6510 CPU 用于 I/O 端口和 ROM/RAM 配置。如果您希望通过SYS
命令从 BASIC 安全地运行代码,则最好使用$FB
到$FE
范围。 - Lars Haugseth