Şimdi bir yarım saat vakit buldum. Az daha optimize ettim plot rutinini, son halini paylaşmış olayım, ekte 15. ve 16. versiyonlar. 16 en son şu an için. Asıl başarısız olan denememi paylaşmak istedim.
Plot için bitleri OR'luyoruz ama aslında opcode olarak SET mevcut. C64'de bir karşılığı yok, o yüzden çok kafa yormamıştım bu opcode'a. Baktım, hangi biti set edeceğinde parametre almıyor, kendisi bir çok farklı opcode varyasyonu olarak mevcut. İhtiyacım olan "SET n, (hl)" kullanımı.
SET 0, hl => $c6
SET 1, hl => $ce
SET 2, hl => $d6
SET 3, hl => $de
SET 4, hl => $e6
SET 5, hl => $ee
SET 6, hl => $f6
SET 7, hl => $fe
değerlerine denk geliyor. Yani hangi biti set edeceğimizi okuduğumuz şu orBit tablosunu
db %10000000, %01000000, %00100000, %00010000, %00001000, %00000100, %00000010, %00000001
bitler yerine SET opcode karışıklarına çevirsek
db $fe, $f6, $ee, $e6, $de, $d6, $ce, $c6
sonra da;
ld a, (hl)
or c
ld (hl), a
olan bölgeyi
setBit:
set 0, (hl)
ile değiştirip, OR değerini okuyan kısmı da;
; get or bit pattern for given x in character position
inc h ; orBit is right after sinX
ld c, (hl)
yerine
inc h
ld a, (hl)
ld (setBit+1), a
ile değiştirsek teorik olarak çalışması lazım. Pratikte de çalıştı zaten. Plot başına 10 tstate fazladan harcadı ama. Başarısız da olsa en azından denemiş oldum. Hala da aklımın köşesinde var.
ld (setBit+1), (hl)
gibi kullanımlar olsa belki de kar edebilirdik. hele ki SET bir sürü opcode alternatifi olacağına register parametresi alsaymış OR kullanmam tamamen cahilliğim olurmuş. Hep sabit bir biti set edecek olsak kazanç sağlıyor OR'a göre. Ama dinamik olduğu durumda şimdilik hala OR doğru tercih gibi duruyor.