私は今 6502 アセンブリから始めていますが、8 ビットより大きい数値を処理する必要があるループに頭を悩ませています。
具体的には、いくつかのメモリ ロケーションをループしたいと考えています。疑似 C コードでは、これを行いたい:
// 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;
}
したがって、RAM$44AD
に書き込みたいアドレスから始めて、前方にジャンプし、そこに書き込み、それを20回実行するまで再び前方にジャンプします(最後に書き込むアドレスは です)。$01
$28
$01
$28
$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 dec であり、これは 8 ビット X レジスタに実際に格納できる量を超えていることです。
これを行うエレガントな方法はありますか?