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 ...
İ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