Aşağıdaki mesajımda eski board'larda /KERNAL sinyalinin pürüzsüz olmaması sebebiyle sıkıntılı olduğunu yazmıştım.
http://www.commodore.gen.tr/forum/index.php?topic=14781.msg198098#msg198098Bir süredir bu sorunla uğraşıyorum. C64 tarafında yazılım yollu temiz bir /KERNAL seçim sinyali elde etme çabalarım malesef sonuç vermedi.
Ölçme biçme değerlendirme sonucu gözüken şuydu : Eski PLA'larda VIC bus'ı bırakırken PHI2 high'e geçtiği noktada bir şekilde /KERNAL combinatorial logic'ini de etkileyecek bir sinyali geç değiştiriyor. Öyle ki, ekran kapalı bile olsa bu hatalı yapılan /KERNAL sinyal seçimlerini logic analyzer'da görüntülediğinizde 25 adet badline'ı (bu anlarda ~41 mikro saniye kernal'in yanlış seçimi yapılmıyor) ve video blanking anlarını /KERNAL sinyali üzerinde görebiliyorsunuz.
/CHAROM ve /KERNAL hattını ve bunların input'larını logic analyzer'da daha derinlemesine inceleyince muhtemelen yazılım yollu bir çözüm de mümkün olabilir ancak dün farklı bir şey deneyince olaya donanım + yazılım yollu bir çözüm bulabildim.
Bir deneyelim bakalım diyerek kernal'e erişim yaptığım kodun başına ve sonuna romu açma ve kapama kodu eklemiştim. Hepi topu 40 küsür kernal okuması yaparken bahsettiğim bu rastgele kernal seçimine denk gelmeyebilirim demiştim. Tabii bu da işe yaramadı, arada bazı okumaların öncesinde 41ns'lik bu hatalı /KERNAL seçimlerini izledim yine.
Konuyu şurada gündeme getirdikten sonra gelen cevaplardan sonra bir başka şey denemeye karar verdim ve bu nihayet işe yaradı.
http://cbm-hackers.2304266.n4.nabble.com/Weird-KERNAL-line-on-old-boards-td4666871.htmlKısa kesiyorum,
41ns'lik hatalı /KERNAL seçimlerini 500ns'lik bilfiil benim gerçekleştirdiğim seçimlerden ayırmak için hali hazırda kernal rom'un üstünde bulunan diğer sinyallerden de faydalanabilir miyim diye baktım. Daha önce bunu kernal'de okunacak adresin bir kaç bit'ini spesifik yaparak denemiştim ancak başarılı olamamıştım (Kernal seçildiyse ve adres bit'leri şöyle şöyle ise bunu geçerli kabul et gibi )
Aklıma Rom'u açıp / kernal erişimi yapıp / tekrar rom'u kapattığım kısımda cpu'nun gördüğü adres hatlarını özel yapma fikri geldi. Tabii bunu kernal'de erişilen adresin de uygun olarak seçilmesi tamamlıyor.
Hali hazırda soketi piyasada olduğu için SID çipi üstündeki en yüksek adres hattı olan A4'ü kullanmayı denedim.
Buna göre /KERNAL hattını 500ns high / low / high durumuna sokacak aşağıdaki kod bloğum çalışırken yapılan erişimin haricinde cpu'ya hep A4=1 olan adresler sürdürecek. /KERNAL seçimini sağlayacak erişim ise A4=0 olan bir adrese yapılacaktı.
*=$0910 ;A4 is high
Modulate
LDY #$35
LDA #$37
STA $01
LDA $F000
STY $01
RTS
Soru : Üstteki koda baktığınızda ve yine yazdıklarımı dikkate aldığınızda tutarsız gibi gözüken bir kısım var. Bu nedir? Aslında niye tutarsız değil?
Böylelikle rom'un açılıp da kernal'e benim yaptığım erişim olan bir cycle'ın dışında cpu adres bus üzerinde A4 hattını hep 1 olarak sürecek, LDA $F000 komutunda yaptığı tek read esnasında ise A4'ü 0 yapacak.
Tam test kodu aşağıdaki gibi,
Donanım + yazılım yollu çözüm demiştim, işin donanım tarafında da Attiny85'e giden sinyal artık /KERNAL yerine (/KERNAL OR A4) olmuş oldu. Devrede 1 adet iki gate OR kapısına ihtiyaç var artık.
Test devresini bozmadan full yazılım yollu başka denemeler daha yapacağım. Badline'larda hatalı /KERNAL sinyali üretilmiyor olması bir işaret. FLI / FLD / Linecrunch ve benzeri efektlerde badline'lara müdahale edilebiliyor, bunlar denenebilir veya soruna tam olarak hangi sinyalin yol açtığı bulunarak bunun üstünden bir yazılım geliştirilebilir.
CHROUT = $FFD2
MODULATION_ADDRESS = $F000 ; A4 is low
;-- Complex Interface Adapter --
CIA_1_BASE = $DC00
CIA_2_BASE = $DD00
;-- CIA Registers --
CIA_INT_MASK = $0D
CIA_TIMER_A_CTRL = $0E
CIA_TIMER_B_CTRL = $0F
;-- Video Interface Controller --
VIC_CONTROL_1 = $D011
VIC_INT_CONTROL = $D01A
VIC_INT_ACK = $D019
VIC_BORDER_COLOR = $D020
VIC_SCREEN_COLOR = $D021
;-- Processor --
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
CLD
JSR TurnOffInterrupts
JSR SwitchRamOnRom
JSR DisableDisplay
LOOP
LDX #$FF
-
DEX
BNE -
JSR Modulate
JMP LOOP
TurnOffInterrupts
ASL VIC_INT_ACK
LDA #$00
STA VIC_INT_CONTROL
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
DisableDisplay
LDA VIC_CONTROL_1
AND #$EF
STA VIC_CONTROL_1
RTS
SwitchRamOnRom
LDA #PP_CONFIG_RAM_ON_ROM
STA PROCESSOR_PORT
RTS
*=$0910 ;A4 is high
Modulate
LDY #PP_CONFIG_RAM_ON_ROM
LDA #PP_CONFIG_DEFAULT
STA PROCESSOR_PORT
LDA MODULATION_ADDRESS
STY PROCESSOR_PORT
RTS