25 Ağustos 2014 Pazartesi

Load Windows on C64 :)

C64'te 8 bit ile DOS ekranı hem de Windows klasöründe

Başlığa bakarak bunun mümkün olmadığını düşünüyor olabilirsiniz. Derleyin ve görün demekten başka bir delil sunamıyorum.

Bu sefer ekran belleği ve renk ramını kullanmayı, zamanlama döngüsünün nasıl oluşturulacağı hakkında bilgi edinecek ayrıca disketteki başka bir programı assembler ile nasıl hafızaya yükleyebileceğinizi öğreneceksiniz.

Şöyle düşünün: Disketteki LOAD"*",8 komutu ile ilk programı yükleyip çalıştırıyorsunuz. Diyelim ki bu bizim boot edici prg olsun. Bunun içinden de dos'u yükleyip windows klasörüne ulaşalım :) İnanılmaz değil mi?

Hadi kodlamaya...

CBM Prg Studio programı ile yeni bir assembler projesi oluşturun boot.asm dosyası içeriği ve açıklamaları aşağıdadır.

; 10 SYS2176:REM emarti.blogspot.com

*=$801

        BYTE    $22, $08, $0A, $00, $9E, $32, $31, $37, $36, $3a, $8f, $20, $45, $4D, $41, $52, $54, $49, $2E, $42, $4C, $4F, $47, $53, $50, $4F, $54, $2E, $43, $4F, $4D, $00, $00, $00



*=$0880

; kernal rutinler
SETLFS = $FFBA  ; mantıksal, birincil ve ikincil adresleri yerleştir
SETNAM = $FFBD  ; dosya ismi ver
LOAD   = $FFD5  ; cihazdan RAM'a yüklemek
GETIN  = $FFE4  ; klavye tamponundan karakter al
CHROUT = $FFD2  ; kanaldan karakter çıkışı
        

        LDA #$93        ; ekranı sil
        JSR CHROUT
        
        LDA #$0E        ; küçük harf moduna geç
        JSR CHROUT

        LDY #$00        ; ekrana mesaj adresindeki texti yazar
LOOP    LDA mesaj,Y
        STA $0429,Y
        LDA mesaj2,Y
        STA $0451,Y
        INY
        CPY #$19
        BNE LOOP

BEKLE   JSR GETIN       ; bu rutin klavye kuyruğundan bir karakter alır
        CMP #$4C        ; bu değer ASCII olarak a'ya yüklenir.
        BNE BEKLE       ; 'L' tuşuna basılana kadar bekle 

; Load"WINCMD",8 komutunun icrası

        LDA #$01        ; file#1
        LDX #$08        ; sürücü 08 (disket)
        LDY #$0F        ; ikincil adres
        JSR SETLFS

        LDA #$06               ; dosya adının uzunluğu
        LDX #<PROGRAMADI       ; dosya adının bulunduğu adresin
        LDY #>PROGRAMADI       ; x ve y registerlerine kaydı
        JSR SETNAM

        LDA #$00        ; a yükleme işlemi için mutlaka 0 olmalıdır
        LDX #$00        ; programın başlangıç adresininin x ve y registerine
        LDY #$C0        ; alt üst bayt olarak atanması ($C000)
        JSR LOAD

        JMP $C000       ; yüklenen programı çalıştır.
        RTS

PROGRAMADI TEXT         'WINCMD'
mesaj      TEXT         'Windows Komut istemi icin'
mesaj2     TEXT         'L tusuna basiniz         '

boot.prg programımız hazır. Şimdi de wincmd.prg programını oluşturmalıyız ki boot programı ile yüklenecek ve çalıştırılacak. Bu iki programın mutlaka aynı disket içine kaydedilmesi gerekmektedir. Dikkat edin ki boot $0801'den itibaren hafızaya yüklenir, wincmd programının başlangıç adresi ise $C000'dır.

Yeni bir assembler projesi oluşturun. wincmd adındaki projenin wincmd.asm dosya içeriği aşağıdaki gibidir. Derleyin ve aynı diskete kaydedin (ya da d64 image dosyasına).

wincmd.prg kaynak kodları:

; XP içinden dos açılış ekranını andıran program
; Linux daha iyi olurdu ama :)


*=$C000

basla   LDA #$00        ; çerçeve ve arkaplan rengi siyah yapalım
        STA $D021
        STA $D020
        
        LDA #$93        ; ekranı sil
        JSR $FFD2

        LDA #$01        ; cursor rengi beyaz olsun
        STA $0286

        LDA $D018       ; küçük harf moduna geç
        ORA #$02
        STA $D018
        
        LDX #$00        ; ekrana M1, M2 ve M3 adreslerinde kayıtlı texti yaz
dongu1  LDA M1,X        ; aslında burada FFD2 veya AB1E rutinleri kullanılabilir
        STA $0400,X     ; Ekran Belleğinin kullanımını göstermek için
        INX             ; böyle kodlamak istedim. 
        CPX #$25        ; Ekran belleği varsayılan olarak $0400'dan başlar ve
        BNE dongu1      ; 1000 baytlık (40x25 karakter) boyutundadır.

        LDX #$00
dongu2  LDA M2,X
        STA $0428,X
        INX
        CPX #$1D
        BNE dongu2

        LDX #$00
dongu3  LDA M3,X
        STA $0478,X
        INX
        CPX #$0B
        BNE dongu3

        LDX #$00
dongu4  LDA #$01
        STA $D800,X     ; Renk RAM'ını kullanarak karakterlerin rengini
        INX             ; beyaz yapalım. (Akumulatorun değeri $01)
        BNE dongu4      ; Renk RAM'ı $D800-$DBE7 arasında 1000 baytlıktır

        LDX #$00
dongu5  LDA CURSOR,X    ; X 0 ve 1 arası değerden başka değer almamalı
        STA $0483       ; cursor yanan sönen değeri basılır
        INX             ; x = x + 1
        TXA             ; a = x
        AND #$01        ; a = a AND 1
        TAX             ; x = a
        JSR BEKLE       ; bekleme döngüsü
        JMP dongu5 

BEKLE   LDY #$00        
X       LDA $D012       ; raster satırını oku ve 255 olana kadar x'e dallan
        BNE X
        INY
        CPY #$80        ; y $80 olana kadar x'e dallanır
        BNE X
        RTS        
        
; 1. satır içeriği
M1      BYTE    $4D,$09,$03,$12,$0F,$13,$0F,$06
        BYTE    $14,$20,$57,$09,$0E,$04,$0F,$17 
        BYTE    $13,$20,$58,$50,$20,$1B,$42,$15 
        BYTE    $09,$0C,$04,$20,$35,$2E,$31,$2E
        BYTE    $32,$36,$30,$30,$1D
        
; 2. satır içeriği
M2      BYTE    $28,$43,$29,$20,$31,$39,$38,$35
        BYTE    $2D,$32,$30,$30,$31,$20,$4D,$09
        BYTE    $03,$12,$0F,$13,$0F,$06,$14,$20
        BYTE    $43,$0F,$12,$10,$2E

; 4. satır içeriği       
M3      BYTE    $43,$3A,$2F,$57,$49,$4E,$44,$4F
        BYTE    $57,$53,$3E

CURSOR  BYTE    $64, $60

Aslında wincmd programını kodlarken ekran belleği ve renk ramını kullanmayı gördünüz. En önemlisi belkide raster line kullanarak ($D012) bekleme döngüsü hazırladık ve bunu cursorun yanıp sönmesi için kullandık.

Bu arada telif hakkına saygı gösterip C: sonrası / (slash) koydum. Küçük harf modunda ters slash yoktu. Bill Gates ne me lazım yamuk yaparsa diye bir önlem ...

Bu arada d64 image dosyası oluşturup kolayca dosya eklemek, silmek vb.işlemler için DirMaster 3.0 kullanıyorum. http://style64.org/release/dirmaster-v3.0.0-style adresinden ilgili Wİndows sürümünü indirebilirsiniz. 



İki programın da aynı diskette olması önemli. emartiblogspot.d64 imajlı disketi buradan download edebilirsiniz. 

Aşağıdaki görüntüler gösteriyor ki C64'e herşey yüklenebilir.

Disket içeriği

boot.prg

wincmd.prg


Hiç yorum yok: