Aslında beklediğim cevap değil ama ilk beklediğim cevaba yakın. Bu soruyu kodların ne derece optimize edebileceğini göstermek için sormuştum. şimdi senin rutini kısalta kısalta kuşa çeviricez
Öncelikle çıkış noktanı değiştirerek başlıyorum. Sen tek rutine de inse hala $d001'e bağlı olarak kod yazmaya kararlısın. Halbuki $d001'e bağlı olarak bu rutine doğru yerlerde dallanıyor. şimdi bırakalım programı ve Türkçe cümle kuralım.
$d001 $90'a gelince SPRRENK'e dallan
$d001 $00'a gelince SPRRENK'e dallan
SPRRENK:
Eğer sprite rengi kırmızıysa beyaz yap, beyaz ise kırmızı.
Aha! ışte bu son cümle işi değiştirdi. Bu durumda $d001'e hiç bakmayacağız ve işi doğrudan $d027 ile bitireceğiz.
SPRRENK:
LDX$D027
CPX#$F1
BEQ KIRMIZIYAP
LDX$D027
CPX#$F2
BEQ BEYAZYAP
JMP IRQSON
KIRMIZIYAP:
LDX#$02
STX$D027
JMP IRQSON
BEYAZYAP:
LDX#$01
STX$D027
JMP IRQSON
IRQSON:
RTS
Eee, ne değişti ki? şimdi gereksiz satırları atalım (başlarına noktalıvirgül koyacağım)
SPRRENK:
LDX$D027
CPX#$F1
BEQ KIRMIZIYAP
;LDX$D027
CPX#$F2
BEQ BEYAZYAP
JMP IRQSON
KIRMIZIYAP:
LDX#$02
STX$D027
JMP IRQSON
BEYAZYAP:
LDX#$01
STX$D027
;JMP IRQSON
IRQSON:
RTS
Eh hemen hemen bu kadar diyebiliriz.
Bu 1.sorumun cevabıydı. Gelelim 2. yönteme. cmp, cpx, cpy, beq, bne, bcc, bcs, bpl, bmi v.s. yok. Peki ne var? Olayı bit bazlı düşünmek var.
Beyaz = 1 = %00000001
Kırmızı = 2 = %00000010
Öyle bir bit işlemi bulalım ki beyazsa kırmızı kırmızıysa beyaz yapsın. Ben öyle bir bit işlemi biliyorum. EOR (ya da PC'deki yaygın ismiyle XOR). Bu nasıl bir işlemdir?
Bit 1 EOR Bit 2 Tablosu şu şekildedir.
Bit 1 Bit 2 EOR
----- ----- -----
0 0 0
0 1 1
1 0 1
1 1 0
Yani olaya şöyle bakabiliriz Bit 1 bizim orjinal bitimiz olsun. Hem sıfır hem de bir olma durumunda (1. ve 3. satırlar) 0 ile EORlandığında değeri aynen kalıyor, değişmiyor. Yani 0 ile EORlamak bit değerini aynen korumak demek. Peki 2. ve 4. satırlarda ne oluyor. 1 ile EORlandığında değer tersine dönüşüyor. Yani 0 EOR 1 dediğimizde 0'ı 1 yapmış oluyoruz 1 EOR 1 dediğimizde 1'i 0 yapmış oluyoruz. Kısaca yazmak gerekirse;
0 ile EORlamak değeri değiştirmez:
0 EOR 0 = 0
1 EOR 0 = 1
1 ile EORlamak değeri tersine çevirir:
0 EOR 1 = 1
1 EOR 1 = 0
Öyleyse biz nasıl bir değerle EORlamalayız ki beyaz ise kırmızı, kırmızı ise beyaz olsun? Önce cevabını vereyim. Cevap 3. Peki bunu nasıl elde ettim? Önce sağlamasını yapalım.
Beyaz EOR 3 = Kırmızı
%00000001 <- Beyaz (1)
%00000011 <- EOR (3)
-----------
%00000010 <- Kırmızı (2)
Kırmızı EOR 3 = Beyaz
%00000010 <- Kırmızı (2)
%00000011 <- EOR (3)
-----------
%00000001 <- Beyaz (1)
şimdi iş eğlenceli olmaya başladı işte di mi?
Peki 3'ü nerden bulduk. ışlemin değişme özelliğini kullandık. Yani;
a eor b = c
ise
a eor c = b'dir.
Biz
Beyaz EOR x = Kırmızı
dediğimize göre
Beyaz EOR Kırmızı = x
yani EORlayacağımız değerdir.
%00000001 <- Beyaz (1)
%00000010 <- Kırmızı (2)
-----------
%00000011 <- x = 3
ışte böyle. şimdi gelelim rutinimizin son haline
SPRRENK:
lda $d027
eor #3
sta $d027
rts
ışte if...then...else programcılığının sona erdiği nokta. Bit tabanlı hesaplama gücü.
Edit: Bir noktayı atlamışım. Sprite renklerine siz $01, $02 gibi değerler de verseniz okurken üst 4 biti set olarak okursunuz yani $f1, $f2 gibi. Bunun için cpx'leri değiştirdim. Aslında yapılması gereken şey;
lda $d027
and #%00001111
cmp #$01
gibi bir işlem. Yani yalnızca alt 4 biti karşılaştırmamız lazım.