Я начинаю с сборки 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;
}
Итак, начиная с адреса $44AD
, я хочу записать $01
в оперативную память, затем перейти вперед $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 dec, что больше, чем я могу хранить в 8-битном регистре X.
Есть ли элегантный способ сделать это?