Onuncu versiyonumuzda artık elle tutulur bir şeye ulaşmış durumdayız. Hala eksikleri varsa da güzel olan ekranda bir titreme olmadan noktalar dolaşıyor. Ama kaç tane nokta dolaşıyor? Saymakla uğraşmasam da net cevabım şudur "256'dan az". Aslında 256 nokta çiziyoruz ve bunu bir frame'e sığacak zamanda çizdirebiliyoruz, frame taşması yaşanmıyor. Ancak ZX Spectrum 48k'da da çalışmasını hedeflediğimiz için double buffer kullanma şansımız yok. Yani bizim o anda ekrana çizmek istediğimiz bir noktanın Y koordinatı o anda ışın taramasının bulunduğu Y koordinatından küçükse o nokta sonraki frame'de görünür olacak şekilde ekrana henüz çizilemiyor ama biz sonrasında da tüm noktaları temizleyerek o noktanın asla çizilememesini sağlamış oluyoruz. Bu sorunla daha sonra mücadele edeceğiz.
ld b, 0
mainLoop:
phaseX:
ld hl, sinX
ld a, l
add a, b
ld l, a
ld l, (hl)
ld h, 0
; put pixel
;ld hl, (plotX)
ld de, orBit
add hl, de
ld c, (hl)
ld a, l
and %11111000
rrca
rrca
rrca
ld e, a
;ld d, 0 ; orBit high byte is subtracted from lines table high bytes to get rid of this line
ld a, (counter)
add a, 2
ld (counter), a
jr NZ, skipHiIcrement
ld hl, plotYlookup+2
inc (hl)
skipHiIcrement:
ld hl, plotYlookup+1
ld (hl), a
plotYlookup:
ld hl, (sinY)
add hl, de
ld a, (hl)
or c
ld (hl), a
; end of put pixel
; push pixel memory address to stack
push hl
djnz mainLoop
Buradaki en önemli değişimlerden biri artık b registerını ve "djnz" opcode'unu kullanıyor olmamız. djnz b register'ını bir azaltıp, sıfıra gelmediği sürece döngüye devam etmeyi sağlayan, sıfıra gelince döngüyü sonlandırıp devam etmesine yarayan, x86 ASM'deki "cx register'ı ve loop opcode'u" ikilisinin bir benzeri. Önceki versiyonlarda djnz'yi bilsem de tüm registerları rahatça kullanabilmek adına kullanmamıştım. Bu aşamada artık b'yi boşa çıkarıp bu iş için kullanma vaktimiz gelmiş durumda.
Henüz tablolarımız tamam değil. Bu nedenle bu versiyonda eklenen bazı kısımlara çok değinmiyorum, zaten yanlış yöntemler. Önümüzdeki versiyonlarda bu kısımları toparlayacağız.