Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
Sayfa: [1]   Aşağı git
Yazdır
Gönderen Konu: Digimax yazılım  (Okunma Sayısı 6637 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« : Nisan 27, 2017, 01:12:05 ÖÖ »

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)

Kod:
	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.

Kod:
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



* IMG_1042.JPG (749.74 KB, 2016x1512 - Görüntüleme: 2024 kez.)
* DigiMaxTestFixed.zip (62.4 KB - Yükleme: 259 kez.)
« Son Düzenleme: Nisan 27, 2017, 01:29:00 ÖÖ Gönderen: i_r_on » Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #1 : Nisan 27, 2017, 01:23:11 ÖÖ »

Ohhh eline saglik... bir de senkron video stream edince tam olacak...
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #2 : Nisan 27, 2017, 01:25:59 ÖÖ »

Bu arada son dakika bug'ı buldum ilk post'taki içeriği edit'liyorum. Lan diyorum en az 3 saniye olmalıydı bu ne çabuk loop ediyor, interrupt'ı acknowledge etmeyince beklemeden sürekli interrupt'a giriyormuş

Play rutinine şunu eklemem gerekti. Ses hakikaten güzel çıkıyor

Kod:
	LDX CIA_1_BASE + CIA_INT_MASK	; Acknowledge interrupt

@delimawi : C64 camiasının eline vermemek lazım hemen öyle senkron video falan Macaristanda partiye gidersek orada release ederiz onu da :p
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #3 : Nisan 27, 2017, 01:36:05 ÖÖ »

Herseyi hazirlayip niyetlenip Hollanda X'2016 ya son anda gidemedim bak bunu kacirmam. Gidelim diyorsan ben gelirim. Benim projeleri de release ederiz gavurlara...
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #4 : Nisan 27, 2017, 01:48:20 ÖÖ »

Herseyi hazirlayip niyetlenip Hollanda X'2016 ya son anda gidemedim bak bunu kacirmam. Gidelim diyorsan ben gelirim. Benim projeleri de release ederiz gavurlara...

Süper, partiye ikinci kişiyi bulduk Yalan olmasın ben epey niyetliyim, kesin gidelim. Dünya gözüyle bir parti görelim.

Yalnız bizim projelerden de üretip götürelim, satış yapıp masrafları çıkarırız. Bir dolu c64'cü olur, alıcı bulur herhalde bizim mallar
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
Levent (Lvnt)
Uzman
*****
Mesaj Sayısı: 2.372



Üyelik Bilgileri
« Yanıtla #5 : Nisan 27, 2017, 08:37:49 ÖÖ »

Elinize sağlık. Vanessa ablanın sayfa da iyiymiş bu arada
Logged

Use the brute force, Luke
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #6 : Nisan 28, 2017, 01:44:09 ÖÖ »

IRQHack64 versiyonunda ses kalitesini ve frekansı tam tutturamadık ama en azından breadboard üstünde digimax'ımız ilk denemede çalıştı

Müziği C64 çalıyor evet, gerçi bir nevi Arduino C64'e paslıyor, C64'te digimax'a

<a href="http://www.youtube.com/v/a5NJUxaeuGg&rel=0" target="_blank">http://www.youtube.com/v/a5NJUxaeuGg&rel=0</a>
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #7 : Mayıs 02, 2017, 00:51:09 ÖÖ »

<a href="http://www.youtube.com/v/GlqwcDLTOfs&rel=0" target="_blank">http://www.youtube.com/v/GlqwcDLTOfs&rel=0</a>

Bu arada çalma sistemini değiştirip bir deneme daha yaptım. Bu sefer frekansta kaymanın önüne geçtim. Önceki versiyonda zamanlamanın kontrolü tamamen arduino tarafındaydı, bunda c64'ün ürettiği cia irq interrupt'ı ile arduino sample'ları tedarik ediyor. Video oynatma çalışmasında farkettiğim bir detayı tekrar farketme imkanım oldu Sdfat kütüphanesi ile dosya erişimi üzerine bir kaç test yaptım. Dosyadan ilk byte'ı okumak 9000 mikrosaniyeye kadar ulaşabiliyor. Aynı şekilde 512 byte'ı ve sırasıyla sektör başlarındaki tüm okumalar böyle. Arduino tarafındaki interrupt rutininden sd kart erişimini çıkartıp ana program döngüsüne koydum, interrupt rutini birinci buffer'dan gönderim yaparken ana program döngüsünde ikinci buffer'ı doldurmaya çalışıyorum. Tabii burada sdfat kütüphanesi interrupt ile kesildiğinde (veya kesilemediğinde) nasıl bir cevap veriyor biraz muamma.

Yani özetle, sd kartla da bu iş ek bellek / buffering çözümü olmadan hakkıyla olmuyor. Benim durumumda ideal çözüm datayı hem C64'de hem de arduino tarafında buffer'lamak. Arduino'ya 9000 mikrosaniyelik sektör okumaları için nefes aldırmak gerekiyor. Bunun için de düz hesap C64'de 128 sample'lık bir buffer tutup her 91 mikrosaniyede 1 yerine 2 sample göndermek lazım. Birincisi o an çalınacak sample, ikincisi 128 pozisyon ilerideki sample. Birini çalacak, birini buffer'layacak. 128 sample'ın çalması bittiğinde arduino'yu interrupt etmeyecek yahut arduino oralı olmayacak ve sıradaki 128 byte'lık buffer'ı dolduracak.

Yapılabilir mi? Yapılır ancak ben üşendim, Atmega328'den (Sdfat 600 küsür byte hali hazırda kullanıyorken) 256 byte koparmak kısmı da sıkıntılı. Tüm bellekten çalmamak için lokal olarak tanımlamak, interrupt rutininde pointer'la erişmek lazım. Ancak tam o anda 256 byte boş yer yoksa sıkıntı. (200 byte da yetiyor bu arada ama 2'nin üslerine malum takığız) Atmega328 üstündeki toplam ram 2K bu arada

Bu işin donanımsal bir alternatifi de arduino c64 arasındaki veri iletişim kısmına 1K/2K bir fifo bellek koymak. Bu şekilde arduino'nun toplam veri okuma kapasitesini c64'e yansıtmak mümkün.
« Son Düzenleme: Mayıs 02, 2017, 00:52:51 ÖÖ Gönderen: i_r_on » Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
Sayfa: [1]   Yukarı git
Yazdır
Gitmek istediğiniz yer: