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.