screen = $0400
dedikten sonra bunu screen = screen + 40 şeklinde değiştiremezsin ne yazık ki. Bunun için şunu yapman lazım.
screen = $0400
..
..
..
putscr sta screen,x
..
..
..
lda putscr+1
clc
adc #40
sta putscr+1
lda putscr+2
adc #0
sta putscr+2
..
..
..
Burda putscr adresi hafızada şu şekilde duruyor
sta $0400,x
Bu da hex codelar ile
9d 00 04
şeklinde yazılır.
9d -> sta $####,x
00 -> $0400'ün low byte'ı
04 -> $0400'ün high byte'ı
Bu durumda bizim arttırmamız gereken yer $0400'ün low byte'ı yani putscr+1
Peki ya $f0'dan sonra ne olacak? $f0 + $28 = $18 yani $0418 olur. Ancak toplamada carry flag denen bir "elde" bayrağı vardır ki adc'den önceki "clc" komutunun amacı bu bayrağı temizlemek. Çünkü o temizlenmezse toplamanın sonucu bir fazla çıkar. Örnek olarak
lda #0
adc #40
dediğimizde sonuç 40 ya da 41'dir. Tamamen carry flag'e bağlı. Ancak
lda #0
clc
adc #40
kesinlikle 40'dır. Çünkü carry flag'i temizliyoruz. Takip eden
lda putscr+2
adc #0
sta putscr+2
kısmında ise eğer bir önceki toplamada sonuç 255'i geçmediyse putscr+2 yani başlangıçta $04 olan değer değişmez. Ancak eğer sınır aşıldıysa yani $f0+$28 işleminden sonra sonuç $05 olacaktır. Bu sayede satır numaraları
$0400
$0428
$0450
$0478
$04a0
$04c8
$04f0
$0518
$0540
..
..
..
$07c0
şeklinde devam eder.
Son bir dipnot. Varsayılan ekran adresi $0400-$07e8 arasındadır. Dolayısıyla ekranı
ldx #0
lda #$20
clrscrloop:
sta $0400,x
sta $0500,x
sta $0600,x
sta $0700,x
inx
bne clrscrloop
rts
yerine
ldx #0
lda #$20
clrscrloop:
sta $0400,x
sta $0500,x
sta $0600,x
sta $06e8,x
inx
bne clrscrloop
rts
şeklinde silersen $07e8-$07ff arasını doldurmamış olursun. Bu aralıkta spriteların hafıza konumları gibi bazı önemli bilgiler mevcuttur. Bunun için yukarda düzelttiğim gibi kullanmanı tavsiye ederim.