11 Eylül 2014 Perşembe

IRQ interrupt raster? ....

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: