30 Kasım 2014 Pazar

c64çe Nothing else matters!

Yeni sid çalışmamdır. Her türlü eleştiriye açığım. 3 kanal ses olunca bu kadar oluyor...

http://csdb.dk/release/index.php?id=135025

8 Kasım 2014 Cumartesi

CBM Prg Studio 3.2.0 (Better support for Turkish language)

CBM Prg Studio'nun 3.2.0 sürümü Türkçe dil desteğini alacak şekilde düzeltildi. Örneğin SEI komutunu küçük harf olarak yazdığınızda sei olmalı ama bu op kodu tanımıyordu. seı olarak yazılırsa derleme başarılıydı. Neyse ki sorun uzun mail trafiği sayesinde çözüldü. Artık i-ı kargaşası bitti.

Programın Option menüsünden çıkan pencereden General sekmesine gelip "Use Current Culture"  yazılı checkboxa ait çentiği kaldırın, boş bırakın. Bu sayede Türkçe desteği için sıkıntı çekmeyeceksiniz.

14 Eylül 2014 Pazar

My First One File Demo at CSDb


C64 üzerinde yaptığım demolardan birini CSDb'de yayınladım. Kaynak kodlarını inceleyerek blogta öğrendiklerinizin bir kısmını bulabilirsiniz.

http://csdb.dk/release/index.php?id=132995 adresinden ilgili demonun d64 image dosyasını indirerek çalıştırabilirsiniz.


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


  

2 Eylül 2014 Salı

Simple SID Player in C64 via 6502 Assembler

Simple SID Player in C64 via 6502 Assembler

Intro ve demolarda çalan sid müziklerini assembler kodları kullanarak nasıl ses çıkaracağınızı anlatacağım. Bu iş için çok fazla sayıda besteleyici tabir edilen programlar mevcut. Ben SID-Wizard'ı tercih ettim.

Sourceforge.net sitesinde yayınlanıyor. http://sourceforge.net/projects/sid-wizard/ buradan içeriği indirebilirsiniz. İndirdiğiniz zip dosyasının içeriği olan application klasörü altındaki dosyalar; emulator veya C64 üzerinde direkt kullanabileceğimiz image, prg dosyaları ayrıca linux ve windows tabanlı 2 adet çevrim yapan uygulama mevcut. Burada bu uygulamarın hepsinden bahsetmeyeceğim.


Aslında amacım şudur. Şöyle ki: Internet üzerinde xm ve midi uzantılı dosya bulmak çok kolay. Ve biz bunları SWMConvert.exe (Windows içinde istersen Linux'ta) ile SID-Wizard uygulamasının kullandığı swm uzantılı dosyalara dönüştüreceğiz. Daha sonra ister C64 yada emulatorlerinde SID-Wizard-1.7-disk.d64 imaj dosyası içeriğindeki SID Maker 1.7 programı ile bu tune (swm dosyasını)'nu assemblerda kullanabilecek hale dönüştüreceğiz. 




Genellikle bu maker default olarak $1000-$2000 arası kaydı C64'ün kullanabileceği formata dönüştürüyor. Bu adres aralığını değiştirebilirsiniz tabiiki. Ama genelde çoğu intro ve demolarda music içerikleri $1000'den başlar. Burada bilmeniz gereken bazı püf noktalar olacaktır. Zorlanmamak için ben PC üzerinde DirMaster 3.0 kullanıyorum. Bu şekilde herşey daha kolay.


SID Maker kullanımı sonrası PRG uzantılı çalıştırılabilir bir dosyanız oluşur yani muziği rahatlıkla dinlersiniz. 


Peki bu içeriği nasıl kullanacağız? Bu program çalışırken emulatordeki monitor programına girip d 1000 yazın 1000 ve 1003'deki jmp ile başlayan komutlar görürseniz bunlar bizim için parametre olarak kullanacağımız adresler yani sid muzik başlangıcıdır.


Önce BASIC kullanarak basit bir player yapalım. Satırları yaz ve RUN komutunu ver.

999 REM ** SIMPLE SID PLAYER **
2014 POKE 780,0
2015 SYS4096
2016 FORZ=0TO9:NEXT
2017 SYS4099
2018 GOTO2016
READY.
RUN

POKE 780,0 ile akumulatorü sıfır yapıyoruz. (LDA#$00) Sonra SYS4096 ile $1000 adresine dallanıp ilk hazırlık yapılıyor. Sonraki for/next kısa bir bekleme zaman döngüsü sonra ilk ses çıkaran rutin SYS4099 yani $1003 adresine dallan ve 2016. satır ile sonsuz döngüye gir. 

BASIC her zamanki gibi sıkıcı ve yavaş. Bunu assembler ile kodlamak en güzeli.

SID-Maker'ı kullanırken sadece c64-prg uzantılı (yani EXE-prg kullanmayıp) olarak dönüştürmesini isterseniz, dirmaster'da music içeriğinizin hangi adresten başlayıp hangi adreste sonlandığını görebilirsiniz.


Oluşturulan PRG dosyanızın (D64 image dosyası içinde ise export ederek windowsa taşıyınız) uzantısını PRG'den BIN'e değiştirin. Çünkü bunu CBM Prg Studio içine onaltılık kod olarak transfer edeceğiz.

CBM Prg Studio'yu çalıştırın. Yeni bir assembler projesi oluşturun. main.asm harici projeye ek bir sid.asm dosyası daha ekleyin. sid.asm dosyası açık ve sekme aktif iken FILE > IMPORT > BINARY FILE menusune tıklayıp .bin uzantılı dosyamızı seçin. Karşınıza aşağıdaki gibi bir pencere gelecektir.


Burada 2 bytes skip etmeniz uygun olur. OK dedikten sonra bir Preview penceresi içinde tüm dosyanın içeriği onaltılık byte halinde gösterilir. Tümünü seçip kopyalayın ve sid.asm içine yapıştırın. En başınada *=$1000 yazın. Aşağıdakine benzer bir görüntü olmalı.


Şimdi main.asm dökümanına geri dönelim. Asıl kodlama burada....
main.asm dosya içeriği aşağıdaki gibi olsun. Derleyin ve çalıştırın. ( CBM Prg Studio için emulator ayarlarını yaptıysanız CTRL-F5 ile doğrudan sonucu görebilirsiniz) Gerçek bir C64'te herşey daha orjinal oluyor haberiniz olsun.

; 10 SYS3840

*=$801

        BYTE    $0B, $08, $0A, $00, $9E, $33, $38, $34, $30, $00, $00, $00

; sid player
; Coded by emarti
; 02.09.2014

incasm "sid.asm"

*=$0F00

basla   LDA #$00        ; Bu her zaman gerekmeyebilir ama sid wizard ile 
                        ; hazırlanmış sid ise mutlaka olmalı
        JSR $1000       ; $1000'e dallan sid için hazırlık yap

sonsuz  JSR $1003       ; notaları çal
        JSR bekle       ; bekle bir müddet (aslında çok kısa)
        
        LDA $DC01
        CMP #$EF        ; space veya fire tuşuna basana kadar bekle
        BNE sonsuz
        
        JMP $FCE2       ; Hard Reset

                        ; bekleme döngüsü oluşturalım
bekle   LDY #$00        
X       LDA $D012       ; raster satırını oku ve 255 olana kadar x'e dallan
        BNE X
        INY
        CPY #$08        ; y $08 olana kadar x'e dallanır
        BNE X
        RTS                

bekle labeli ile başlayan bir alt rutin var programda raster satırını baz alıyor. Burada y değişkenin karşılaştıran komutta CPY için farklı değerler girerek oynatma hızında değişiklik yapılabilir. SPACE tuşuna basarsanız programı resetleyerek sonlandırmış olacaksınız.

Artık yaptığınız intro veya demolarda music sorun yaratmaz umarım.





1 Eylül 2014 Pazartesi

C64'te CHARSET Kullanımı (Using Charset)

CHARSET Kullanımı

Karakter setlerinin kullanımını CBM Prg Studio IDE'sini kullanarak rahatça nasıl kullanabileceğimizi göstereceğim. http://kofler.dot.at/c64/font_02.html adresinden ancipital adlı charseti indirdim. ZIP dosya içeriğindeki 64c uzantılı dosyayı kullanacağız.

Şimdi IDE'mizi açalım ve yeni bir assembler projesi oluşturalım. Character Set klasörüne sağ tıklayıp yeni bir dosya ekleyelim.



Bu projede ancipital.cst olarak charset dosyası oluşturdum. Çift tıklayın, yeni bir arayüz ile asıl karakter dosyamızı import edeceğimiz pencere gelsin.



Import ederken dikkat edilecek bazı durumlar var. Şöyle ki:
Birkaç deneme yapmanız gerekebilir byte kayması sorunu olabiliyor. Birkaç baytı skip etmeniz gerekebilir. Bunu import sonrası karakterlerin şeklinin düzgün olup olmadığından anlayabilirsiniz. Benim denemelerimde hep 2 byte skip ettim.


Karakterler fena görünmüyor



Şimdi de programımızda kullanmak üzere export etmeliyiz. Bu editor içinden Character Set > Export > Listing menüsüne giriniz. O an aktif olan hangi asm dosyanız ise dökümanın içine BYTE içerikli onaltılık kodların sıralandığını göreceksiniz. Editörü kapatalım ve asm dosya içeriğine geri gelelim.
Bu kadar byte içeriğini nasıl kullanacağız?

Karakter setimizin default bankta ve $3000 adresinden itibaren yerleşiminin olmasını sağlamak için byte içeriğinin başına *=$3000 yazmalısınız.


Sonra asm içeriğinin başına şu kodları yazalım. (Başlangıç adresi $0900 olan)

*=$0900
        
        LDA $D018
        ORA #$0C
        STA $D018
        RTS

$D018'in bir işlevi de karakter setinin bulunduğu adresleri tutar. Şöyle ki:
1. bitten 3. bite kadar 3 bit kodlamasını bizim programımızda 110 olarak yaptık dolayısı ile 0000 1100 yani $0C kullandık.
  • 0, 0: $0000-$07FF, 0-2047.
  • 1, 1: $0800-$0FFF, 2048-4095.
  • %010, 2: $1000-$17FF, 4096-6143.
  • %011, 3: $1800-$1FFF, 6144-8191.
  • %100, 4: $2000-$27FF, 8192-10239.
  • %101, 5: $2800-$2FFF, 10240-12287.
  • %110, 6: $3000-$37FF, 12288-14335.
  • %111, 7: $3800-$3FFF, 14336-16383.
Projeyi build edip çalıştırın. SYS 256*9 komutu ile program çalıştığında karakter setinin değiştiğini göreceksiniz.



30 Ağustos 2014 Cumartesi

Load and Display Koala PIC format in C64 Assembler


Koala PIC Format

Koala Painter Values:
Bitmap = $2000-$3f3f
Video = $3f40-$4327
Color = $4328-$470f
Background = $4710



; koala pic viewer for C64
; (c) 2014 Aug 30
; Coded by emarti, Murat Özdemir

*=$0900        

VIDEO      = $3F40
COLOR      = $4328
BACKGROUND = $4710

        JSR $E544       ; CLEAR SCREEN

        LDA #$00
        STA $D020       ; BORDERCOLOUR

        LDA BACKGROUND        
        STA $D021       ; BACKGROUNDCOLOUR

        LDA #$3B        ; bitmap mode on
        STA $D011

        LDA #$18        
        STA $D018       ; set bitmap address($2000) and screen($0400) 
        STA $D016       ; multi color on

        LDA #$03        ; set vic bank
        STA $DD00
        
        LDA #$40        ; set video ram
        STA $FB
        LDA #$3F
        STA $FC
        LDA #$04
        STA $FE
        LDA #$08
        STA VALBYTE
        JSR SET
        
        LDA #$28        ; set color ram
        STA $FB
        LDA #$43
        STA $FC
        LDA #$D8
        STA $FE
        LDA #$DC
        STA VALBYTE
        JSR SET

XXX     JMP XXX

; function move bytes
VALBYTE  BYTE $00

SET     LDY #$00
L1      LDA ($FB),Y
        STA ($FD),Y
        INY
        BNE L1
        INC $FC
        INC $FE
        LDX $FE
        CPX VALBYTE
        BNE L1
        RTS


Ne Mutlu Türküm Diyene!

27 Ağustos 2014 Çarşamba

Basic LIST'den Başlangıç Adresini Saklamanın Yolu

LIST komutu ile başlangıç adresi gizleme

Aslında makina dilini bilenler için etkin bir yöntem olmasada görsel olarak etkileyebiliyor. BASIC içinde bildiğiniz üzere LIST komutu ile programın dökümü elde edilir ki assembler ile kodlanmış bir program ise BASIC ile aktif hale getirilmek istenmişse genelde şu şekilde liste elde edilir.

READY.
LIST <return>

2014 SYS 2064: REM EMARTI.BLOGSPOT.COM

Peki bu komutu kullandıktan sonra sadece şu şekilde görünmesi hoşunuza gitmez miydi?

READY.
LIST <return>

2014 EMARTI.BLOGSPOT.COM

Ve bu RUN komutu verip çalıştırdığınız zaman hiçbir farklılık ile karşılaşmayacağınız bir durum olacak. SYS ile nereye dallanmak istiyorsa oraya gidecek ve makina dili programınızı çalıştıracak.

Kritik nokta ASCII kodlarından $14 (DEL).

Basic'te program yazıp saklamaya başladığınızda, başlangıcı bilindiği üzere $0801'dir (C64'te). 

Aşağıdaki örneği derleyin ve çalıştırın, LIST komutu verin. Sonra Monitor programınıza girip M 0801 0840 komutunu verip baytları inceleyin.

; 2014 SYS2080:REM 64738
; 2014 SYS 64738

*=$801

        BYTE    $1B, $08, $DE, $07, $9E, $32, $30, $38
        BYTE    $30, $3a, $8f, $14, $14, $14, $14, $14
        BYTE    $14, $14, $14, $20, $36, $34, $37, $33
        BYTE    $38, $00, $00, $00

*=$0820
        NOP     ; No Operation
        RTS     ; Basic'e dön
 
Programın başlangıç adresi aslen $0820=2080'tür. Basic'ten SYS 2080 ile çağrılır. Programın dökümünde ise SYS 64738 listelenmektedir. Normalde SYS 64738 yazıp returne basarsanız makina reset atar. Ama böyle görünmesine rağmen RUN ile SYS 2080'e dallanıp program çalışmaktadır. 


$0801 - $0802'deki  1b 08 baytları $081b 'ye kadar BASIC satırını okuyacağını belirtir.
$0803 - $0804'deki de 07 baytları BASIC satır numarasını verir. Bu örnekte $07de=2014.
$0805 9E BASIC komut karşılığı SYS'dir.
$0806 32 30 38 30 sıralı baytları ASCII kodlamasıyla SYS'den sonra 2080 yazar
$080A 3a ise : karşılığıdır.
$080B 8f Basic'te REM
$080C'den itibaren başlayan $14'ler ise DEL tuşuna basar işlev görür. Sonrası baytlar 64738 yazar.
8 tane $14 baytı DEL tuşuna 8 kere basılmıştır anlamına gelir SYS sonrasına kadar herşeyi siler görünür. Daha doğrusu BASIC'ten böyle görünür.



26 Ağustos 2014 Salı

C64 Rutinlere Devam

C64 Rutinlere Devam

Daha önceki blog girişlerinde ekranı silmek için BASIC'teki

PRINT CHR$(147)

komutu karşılığı

LDA #$93
JSR $FFD2
RTS

kullanmıştık. Ama daha kolay bir rutin var $E544. Örneği inceleyin.

; 10 SYS2176

*=$801

        BYTE    $0B, $08, $0A, $00, $9E, $32, $31, $37, $36, $00, $00, $00



*=$0880

        
basla   JSR $E544       ; ekranı sil
        
        LDX #$00        ; ekrana mesaj adresindeki texti yaz
dongu   LDA MESAJ,X
        STA $0428,X
        INX
        CPX #$27
        BNE dongu


bekle   LDA $DC01
        CMP #$EF        ; space veya fire tuşuna basana kadar bekle
        BNE bekle
        
        RTS             ; BASIC'e dön

mesaj   TEXT    'space tusuna basarak programi sonlandir'

Daha önce GETIN kernal rutinini klavye tamponundan karakter (ASCII) yakalamak için kullanmış ve akumulatore aktarıp işlem yapmıştık. Burada $DC01'deki değere göre space veya ateş tuşuna basılana kadar bekliyor.

$DC01 aslında PORTB yani joystick#1'e ait bitleri okuyabildiğimiz adres. Şöyle ki:
Örneğimizde CMP#$EF ile akumulatorü karşılaştırdık. 
$EF yi ikilik düzende yazarsak %11101111, burada sağdan saymak ve sıfırdan başlamak üzere 4. bitin 0 olduğunu görürüz. Yani burası FIRE (Ateş) yada SPACE tuşuna basıldığının bit karşılığıdır. Peki diğer bitler ne işe yarar?

0. bit YUKARI (UP)
1. bit AŞAGI (DOWN),
2. bit SAĞ (RIGHT)
3. bit SOL (LEFT)
4. bit ATEŞ, BOŞLUK TUŞU (FIRE, SPACE)

Burada dikkat ettiyseniz aktif olan bit 0 oluyor.

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