Сборка PET CBM C64 MOS6510 Распечатать букву на экране с рассчитанным адресом экрана?

Я новичок в программировании на ассемблере для C64 и у меня вопрос по поводу процедуры сохранения и загрузки областей памяти. Меня беспокоит следующее:

lda #$01
sta $0400

Помещает букву A в верхний левый угол экрана

ldx #$00
lda #$01
sta $0400, x

с этим я могу использовать регистр x в качестве счетчика и сравнить, как часто я буду использовать цикл.

Но теперь у меня есть 16-битный расчет (начальный адрес экрана плюс xxx) и сохранение результата в адресе памяти, например, 4000 и 4001 долларов. Как я могу использовать это значение в качестве нового адреса экрана, чтобы распечатать букву a в расчетной области экрана?


person DiscMix    schedule 20.09.2020    source источник
comment
Используйте режим адресации (indirect),Y. Например, sta ($10),y (где $10 — это адрес, по которому вы сохранили базовый адрес).   -  person Michael    schedule 20.09.2020
comment
Спасибо за быструю обратную связь, но что такое y? Когда значение равно $18 по адресу памяти $4000, а значение равно $05 по адресу памяти $4001 (18 05 › $0518 › Dez: 1304 = адрес экрана), как его использовать: ldx #$00 //для цикла lda #$01 //для буквы a штат ($4000),г ??   -  person DiscMix    schedule 20.09.2020
comment
Y — это регистр Y. И 16-битный адрес должен храниться в памяти нулевой страницы (т.е. где-то в диапазоне $00-$FF).   -  person Michael    schedule 20.09.2020
comment
Я знаю, что y - это регистр y ;) но какое значение должно быть y, когда я должен использовать (косвенный) y?   -  person DiscMix    schedule 20.09.2020
comment
Независимо от того, что вам нужно, чтобы получить эффективный адрес, который вы хотите. Я не совсем понимаю, о чем вы спрашиваете.   -  person Michael    schedule 20.09.2020


Ответы (1)


ОК, теперь я понимаю значение (косвенного), Y Теперь мое решение выглядит так:

.var lines = $28       //40 characters
.var currentPos = $fd  //save screen address

calcLine:  
ldx #$05               //counter 5 backward
ldy #$00               //Sets carry to 0
lda #lines             //A=40 
asl                    //A=80 

calc:
clc 
adc #lines             //A=120 (or $78 in hex) 
bcc next               //If carry, then increase
iny

next:
dex
cpx #$00
bne calc
sta currentPos     //If carry, then increase 
sty currentPos+1   //Save value if carry

//add screen start address ($0400)
clc
lda currentPos+1
adc #$04
sta currentPos+1

lda #$42    //the sign

sta (currentPos),y 
person DiscMix    schedule 20.09.2020