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
30 Kasım 2014 Pazar
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.
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.
27 Eylül 2014 Cumartesi
Try SID File on C64 (SID Dosyaları ile uğraşmak)
My SID Archives and prg players
10. yıl marşı
http://csdb.dk/release/?id=133245
Ceddin Deden
http://csdb.dk/release/?id=133246
Eski Ordu Marşı
http://csdb.dk/release/?id=133247
Mehter Marşı
http://csdb.dk/release/?id=133248
Hücum Marşı
http://csdb.dk/release/?id=133249
Yelkenler Biçilecek
http://csdb.dk/release/?id=133250
Tümüne Ulaşmak için
http://csdb.dk/scener/?id=26786
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.
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.
Ş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.
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
Kaydol:
Kayıtlar (Atom)