Dün ve bugün resmen içim daraldı arkadaş,
Vanessa ablamızın sayfasındaki DigiMax projesini yapayım dedim. Geçen TL7226 DAC elime ulaştı hadi dedim girişeyim.
Sayfa şurada :
http://daconcepts.com/vanessa/hobbies/projects.html
Elimde Userport konnektörüne uyan bir hazır pcb olmadığı için aşağıdaki gibi bir adaptör yaptım. (Aslında Jamma finger board vardı elimde fazla ama kıyamadım kesmeye)

Sonra donanımı dizmeye ara verdim, yaptıktan sonra test edecek bir şeyler lazım çünkü. Çalışıp çalışmadığını anlamam lazım.
Nette aradım taradım ancak REU kullanmadan yahut bu user port'tan bağlanan Digimax'ı kullanan bir şey bulamadım.
Emülatörde freezer kartuş ile kırılmış küçük bir 8-bit sample çalan bir şey bile olur diyecekken koda tekrar dönüp yaptığım bir kaç hatayı farkettim. (Aslında bu konuyu soru olsun diye açıyordum, şu an editliyorum.)
Birinci hatam 6526 timer'ları ile son zamanlarda biraz fazla zaman geçirmekten olacak ki user port üstündeki /PA3 ve PA2 sinyallerini kafamda hep A timer'ının low byte'ının ilgili bitleri gibi kurgulamışım. Halbuki A portunun ilgili pin'leriymiş. Düşünüyorum da donanım gözüyle bakınca hakikaten timer'lar ile nasıl ilişkilendirmişim hayret. (Kaç defa da 6526'nın pin dizilimine bakmışken hele)
Yine çalışmadı, bu sefer temiz kod yazacağım diye kullandığım sabitlerden bir ikisini yanlış tanımladığımı farkettim. Bu hatayı da düzeltince nihayet çalıştı

Program içindeki bir kaç saniyelik ses kaydı Asereje parçasının başından. Bir şey çalsın yeter dediğim için özenmedim. (Kemal Sunal'dan Eşşoğlu Eşşek olsaydı süper olurdu

)
Prg içinde 171. byte'tan itibaren isterseniz başka bir sesle değiştirebilirsiniz. Ses 11Khz mono 8 bit wav header'ı çıkarılmış olmalı.
VICE'ta denemek için,
Settings -> Cartridge I/O Settings -> Digimax Settings kısmından
Enable Digimax işaretlenecek, DigiMax base ise Userport olarak seçilecek. (Elinde userport'a takılan digimax yahut herhangi bir dac olan varsa deneyebilirse çok sevinirim)
LDA #89 ;985000/11000 = 89
STA CIA_1_BASE + TIMER_A_LO
Şu kısımda aritmetiği değiştirirseniz 44khz yahut 22khz de çaldırabilirsiniz. Tabii çaldırabileceğiniz sesin boyutu azalır ve interrupt handler'ı optimize etmeniz gerekir. Ben şimdilik sadece donanım çalışıyor mu çalışmıyor mu diye kullanmak için bodoslama yazdım. Sırada donanımı çalıştırma ve IRQHack64 ile kardeş ilan etme kısmı var, 44Khz 8 bit sınırsız wav bile çaldırırız belki

Ekte kaynak kodlar ve PRG dosyası mevcut.
ROM_IRQ_HANDLER = $FFFE
;-- Complex Interface Adapter -------------------
CIA_1_BASE = $DC00
CIA_2_BASE = $DD00
TIMER_A_LO = $04
TIMER_A_HI = $05
DATA_A = 0
DATA_B = 1
DDR_A = 2
DDR_B = 3
;-- CIA Registers
CIA_INT_MASK = $0D
CIA_TIMER_A_CTRL = $0E
CIA_TIMER_B_CTRL = $0F
;-- CIA Enums
CRA_TOD_IN_50HZ = 128
CRA_SP_MODE_OUTPUT = 64
CRA_IN_MODE_CNT = 32
CRA_FORCE_LOAD = 16
CRA_RUN_MODE_ONE_SHOT = 8
CRA_OUT_MODE_TOGGLE = 4
CRA_PB6_ON = 2
CRA_START = 1
;-- Video Interface Chip ------------------------
VIC_CONTROL_1 = $D011
VIC_INT_CONTROL = $D01A
VIC_INT_ACK = $D019
VIC_BORDER_COLOR = $D020
;-- VIC Enums
VIC_DEN = 16
;--
PROCESSOR_PORT = $01
PP_CONFIG_ALL_RAM = $34 ; RAM visible in $A000-$BFFF, $E000-$FFFF, $D000-$DFFF
PP_CONFIG_RAM_ON_ROM = $35 ; RAM visible in $A000-$BFFF, $E000-$FFFF
PP_CONFIG_RAM_ON_BASIC = $36 ; RAM visible in $A000-$BFFF
PP_CONFIG_DEFAULT = $37 ; $A000-$BFFF, $E000-$FFFF is ROM, default config.
*=$080E
;-----------------------------------------
SEI
JSR IRQ_DisableDisplay
JSR IRQ_DisableInterrupts
LDA #PP_CONFIG_RAM_ON_ROM
STA PROCESSOR_PORT ;Map out kernal rom, well be using pure interrupts.
LDA CIA_2_BASE + DDR_A
ORA #$0C
STA CIA_2_BASE + DDR_A ;Set PA2/PA3 as output
LDA CIA_2_BASE + DATA_A
ORA #$08 ;PA3 = 1, PA2 = 0 (Select first dac output)
STA CIA_2_BASE + DATA_A
LDA #$FF
STA CIA_2_BASE + DDR_B ;Set PB0..PB7 as output
LDA #<PlayRoutine
STA ROM_IRQ_HANDLER
LDA #>PlayRoutine
STA ROM_IRQ_HANDLER+1
LDA #$00
STA CIA_1_BASE + TIMER_A_HI
LDA #89 ;985000/11000 = 89
STA CIA_1_BASE + TIMER_A_LO
LDA #$81 ; Enable Timer A interrupts
STA CIA_1_BASE + CIA_INT_MASK
LDX #(CRA_FORCE_LOAD + CRA_START) ;Continous
STX CIA_1_BASE + CIA_TIMER_A_CTRL
CLI
LOOP
JMP LOOP
RTS
PlayRoutine
SEI
INC VIC_BORDER_COLOR ;is interrupt handler alive?
SPOS
LDA SAMPLE
STA CIA_2_BASE + DATA_B
INC SPOS+1
BNE +
INC SPOS+2
LDA SPOS+2
CMP #>END_OF_SAMPLE
BNE +
LDA #<SAMPLE
STA SPOS+1
LDA #>SAMPLE
STA SPOS+2
+
LDX CIA_1_BASE + CIA_INT_MASK ; Acknowledge interrupt
CLI
RTI
;-----------------------------------------
; Registers In : None
; Registers Used : A
;-----------------------------------------
IRQ_DisableVICInterrupts
ASL VIC_INT_ACK
LDA #$00
STA VIC_INT_CONTROL
RTS
;-----------------------------------------
; Registers In : None
; Registers Used : A
;-----------------------------------------
IRQ_DisableCIAInterrupts
LDA #$7f ; $7f = %01111111
STA CIA_1_BASE + CIA_INT_MASK ; Turn off CIA 1 interrupts
STA CIA_2_BASE + CIA_INT_MASK ; Turn off CIA 2 interrupts
LDA CIA_1_BASE + CIA_INT_MASK ; cancel all CIA-IRQs in queue/unprocessed
LDA CIA_2_BASE + CIA_INT_MASK ; cancel all CIA-IRQs in queue/unprocessed
RTS
;-----------------------------------------
; Registers In : None
; Registers Used : A
;-----------------------------------------
IRQ_DisableInterrupts
JSR IRQ_DisableVICInterrupts
JSR IRQ_DisableCIAInterrupts
RTS
;-----------------------------------------
; Registers In : None
; Registers Used : A
;-----------------------------------------
IRQ_DisableDisplay
LDA VIC_CONTROL_1
AND #$EF
STA VIC_CONTROL_1
RTS
;-----------------------------------------
; Registers In : None
; Registers Used : A
;-----------------------------------------
IRQ_EnableDisplay
LDA VIC_CONTROL_1
ORA #VIC_DEN
STA VIC_CONTROL_1
RTS
SAMPLE
.binary "Test11Khz8Bit.wav"
END_OF_SAMPLE