IRQ interrupt & raster?
Teknik ayrıntısı aslında kısaca şöyle anlatılabilir. C64'ü açtığınızda 'READY.' altında cursor yanıp söner zavallım. Zavallı yanıp söne dursun, arkaplanda her bilgisayar gibi sizin farkında olmadığınız bir sürü iş yapıla durur :). Saman altından su yürütülür. Siz de saman altından su yürütmek istediğiniz de bir anlık bir kesinti yaratıp bu anda şu programı çalıştır sonra hemen çık, nerede kaldıysan oradan devam et demelisiniz. Bunu yaparken zamanlama bazen çok önemlidir.
Nasıl yani? Evet, herşeyde olduğu gibi burada da zamanlama çok önemli olabiliyor.
Benim bildiğim en küçük zamanlama birimi cycle.
Cycle Nedir?
Benim bildiğim tanım şu şekilde (ilk öğrendiğimde kandırmadılar ise), CRT monitör yada eski TVlerde bir elektron tüm ekranı gezer, bizim anlamamız için pixel pixel yol alır. Göz bunu farketmez. Hatta anlamak için bu tip monitör yada TV'lere yandan bak falan derlerdi. Titreşim olurdu az çok yinede anlamazdık. Bizim bu elektron 8 piksel yol aldığında 1 cycle zaman geçer teoride, hala teoride sanırım.
Elektronun C64 yazılabilir ekranında en sol üst köşesindeki pikselden, en sağ üst köşesindeki piksele kadar kaç cycle geçer hesap edelim. 40 kolon var 1 satırda. Her karakter 8x8 matrixten oluşmuş, yani her karakter 8 piksel genişliğinde. 40x8=320 piksel. Bunu da 8'e bölersek 40 cycle eder. 20 adet NOP komutu ardarda çalıştığında geçen süre kadar. Aslında bu hesapların şimdi çok bir önemi yok.
Aşağıdaki program $D012 deki raster $00 olana kadar programın kalanını çalıştırmaz. Olduğunda ise en üst satıra birşeyler yazar ve bunu hep sabit tutar. Diyelim ki program dökümünüzü LIST ettiniz, listeniz aşağı aka dursun hala üst satır sabit kalır. $D019 kullanımı ve basic'e dön ($EA31) açıklamalarına kullanımına dikkat ediniz.
; 10 SYS49152
*=$801
BYTE $0B, $08, $0A, $00, $9E, $34, $39, $31, $35, $32, $00, $00, $00
*=$C000
jsr $e544 ; ekranı sil
lda #$0d ; cursora satır atlatır
jsr $ffd2
sei
lda #$7f ; CIA kontrol registerlerini ayarla
sta $dc0d
lda #$00
sta $dc0e
lda #$01
sta $d01a ; IRQ çalış (önleme)
ldx #$00 ; rasteri $00'a ayarla
stx $d012
lda #$<kes ; IRQ interrupt vektörünü ayarla
sta $0314
lda #$>kes
sta $0315
cli
rts
kes lda #$00 ; raster 0 olana kadar bekle
X cmp $d012
bne X
ldx #$00 ; üst satır yazdır
l1 lda toptxt,x
clc
adc #$80
sta $0400,x
inx
cpx #$28
bne l1
lsr $d019 ; VIC kesinti bayrağı registeri
jmp $ea31 ; basic'e dön
toptxt BYTE $20,$03,$36,$34,$20,$15,$13,$05,$12,$20,$20,$20,$20,$20
BYTE $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$30,$39,$2F,$31
BYTE $31,$2F,$31,$34,$20,$20,$30,$39,$3A,$32,$35,$20
Hiç yorum yok:
Yorum Gönder