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.