|
Konu Başlığı: Raster Split Sorunu Gönderen: Simon (Özay Turay) üzerinde Ekim 15, 2019, 03:17:59 ÖÖ Bir süredir vakit buldukça C64 programlama ile uğraşıyorum ve bu sefer acele etmeden daha sistemli gidiyorum. Yeni öğrendiklerimi iyice kavradıktan sonra kolayca tekrar kullanabilmek için (ACME çapraz derleyicisi için) makro haline getiriyorum. Bir yandan da mini bir intro hazırlıyorum.
Bu mini intro'da karşılaştığım raster split ile ilgili olduğunu düşündüğüm garip bir durumu çözemedim. Görünürde güzel çalışıyor (ekran görüntüsü 1) ama klavyeden bir tuşa basarsam ikinci raster bar sapıtarak (ekran görüntüsü 2) aşağıya kayıyor ve zamanlamaları bozuluyor haliyle. Muhtemelen cycle yetmediğinden raster kaçırıyorum veya interrupt rutinini hazırlarken bir şeyi atlıyorum. (https://www.commodore.gen.tr/forum/index.php?action=dlattach;topic=17545.0;attach=33156;image) (https://www.commodore.gen.tr/forum/index.php?action=dlattach;topic=17545.0;attach=33158;image) Sorunun ne olabileceğiyle ilgili yorum yapmak isteyenler için derlenmiş prg dosyasının yanında makrolarımı, kaynak kodunu ve data dosyalarını ekliyorum. Not: İş yerinden zip dosyası yükleyemediğim için asm uzantılı dosyalar txt uzantısıyla, logo.bin dosyası da logo.prg olarak eklenmiştir. ;) Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: ercanersoy üzerinde Ekim 15, 2019, 07:50:33 ÖÖ Bu demoyu çalıştıracak donanımınm yok ve bir emulatörde denemedim. Güzel bir çalışmaya benziyor. Tebrikler.
Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: ercanersoy üzerinde Ekim 15, 2019, 07:56:35 ÖÖ Kaynak kodlarına baktım. Bir olasılık da hesaplamalarda yanlış bir değer veya işlem olabilir.
Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: Metallic üzerinde Ekim 15, 2019, 08:51:57 ÖÖ Simon
SPACE tuşuna basınca scroll text ve ikinci raster bar IRQ'lerine geç kalınıyor. Sebebi bir önceki IRQ'den $EA31 ile çıkıyor olman, $EA81 ile çıkarsan sorun düzeliyor. İkisi arasındaki farkı anlamak için VICE'ın monitöründe $EA31'den itibaren disassembly yap ve $EA81'e gelince ne oluyor diye bak. $EA31 ve diğer kernal rutinlerinin açıklamaları için Mapping The C64'e bakabilirsin. IRQ rutinlerinin dışındaki ana döngüde introdan çıkmak için SPACE tuşu kontrolunu $DC01 yazmacı ile yaparsın, bu şekilde IRQ rutinlerinin tamamını $EA81 ile sonlandırabilirsin. Ama ana döngüde $FFE4 kernal rutinini çağırarak başka tuşları da kontrol edeceksen, her frame içinde sadece bir IRQ handler'ı $EA31 ile sonlandırman yeterli olur. Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: Exu üzerinde Ekim 15, 2019, 09:16:35 ÖÖ Simon SPACE tuşuna basınca scroll text ve ikinci raster bar IRQ'lerine geç kalınıyor. Sebebi bir önceki IRQ'den $EA31 ile çıkıyor olman, $EA81 ile çıkarsan sorun düzeliyor. İkisi arasındaki farkı anlamak için VICE'ın monitöründe $EA31'den itibaren disassembly yap ve $EA81'e gelince ne oluyor diye bak. $EA31 ve diğer kernal rutinlerinin açıklamaları için Mapping The C64'e bakabilirsin. IRQ rutinlerinin dışındaki ana döngüde introdan çıkmak için SPACE tuşu kontrolunu $DC01 yazmacı ile yaparsın, bu şekilde IRQ rutinlerinin tamamını $EA81 ile sonlandırabilirsin. Ama ana döngüde $FFE4 kernal rutinini çağırarak başka tuşları da kontrol edeceksen, her frame içinde sadece bir IRQ handler'ı $EA31 ile sonlandırman yeterli olur. Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: Simon (Özay Turay) üzerinde Ekim 15, 2019, 10:02:23 ÖÖ Simon SPACE tuşuna basınca scroll text ve ikinci raster bar IRQ'lerine geç kalınıyor. Sebebi bir önceki IRQ'den $EA31 ile çıkıyor olman, $EA81 ile çıkarsan sorun düzeliyor. İkisi arasındaki farkı anlamak için VICE'ın monitöründe $EA31'den itibaren disassembly yap ve $EA81'e gelince ne oluyor diye bak. $EA31 ve diğer kernal rutinlerinin açıklamaları için Mapping The C64'e bakabilirsin. Böyle basit birşey olduğunu biliyordum. Baya bir cycle harcanıyormuş arada. ::) ; normal IRQ interrupt EA31 20 EA FF JSR $FFEA ; do clock EA34 A5 CC LDA $CC ; flash cursor EA36 D0 29 BNE $EA61 EA38 C6 CD DEC $CD EA3A D0 25 BNE $EA61 EA3C A9 14 LDA #$14 EA3E 85 CD STA $CD EA40 A4 D3 LDY $D3 EA42 46 CF LSR $CF EA44 AE 87 02 LDX $0287 EA47 B1 D1 LDA ($D1),Y EA49 B0 11 BCS $EA5C EA4B E6 CF INC $CF EA4D 85 CE STA $CE EA4F 20 24 EA JSR $EA24 EA52 B1 F3 LDA ($F3),Y EA54 8D 87 02 STA $0287 EA57 AE 86 02 LDX $0286 EA5A A5 CE LDA $CE EA5C 49 80 EOR #$80 EA5E 20 1C EA JSR $EA1C ; display cursor EA61 A5 01 LDA $01 ; checl cassette sense EA63 29 10 AND #$10 EA65 F0 0A BEQ $EA71 EA67 A0 00 LDY #$00 EA69 84 C0 STY $C0 EA6B A5 01 LDA $01 EA6D 09 20 ORA #$20 EA6F D0 08 BNE $EA79 EA71 A5 C0 LDA $C0 EA73 D0 06 BNE $EA7B EA75 A5 01 LDA $01 EA77 29 1F AND #$1F EA79 85 01 STA $01 EA7B 20 87 EA JSR $EA87 ; scan keyboard EA7E AD 0D DC LDA $DC0D EA81 68 PLA EA82 A8 TAY EA83 68 PLA EA84 AA TAX EA85 68 PLA EA86 40 RTI IRQ rutinlerinin dışındaki ana döngüde introdan çıkmak için SPACE tuşu kontrolunu $DC01 yazmacı ile yaparsın, bu şekilde IRQ rutinlerinin tamamını $EA81 ile sonlandırabilirsin. Ama ana döngüde $FFE4 kernal rutinini çağırarak başka tuşları da kontrol edeceksen, her frame içinde sadece bir IRQ handler'ı $EA31 ile sonlandırman yeterli olur. Aslında başta $EA81 kullanmıştım ama sonra ne hikmetse $EA31'e geçmişim. Ondan sonra da kopyala yapıştır ile her yer $EA31 olmuş. İpuçları için teşekkürler. :) Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: Simon (Özay Turay) üzerinde Ekim 15, 2019, 10:11:33 ÖÖ Peki BASIC ve KERNAL'ı kapatırsak şöyle mi oluyor?
- $0314/$0315 yerine $FFFE/$FFFF kullanıyoruz - interrupt rutininin başına: pha txa pha tya pha - interrupt rutininin sonuna: pla tay pla tax pla rti Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: Simon (Özay Turay) üzerinde Ekim 17, 2019, 20:30:08 ÖS Peki BASIC ve KERNAL'ı kapatırsak şöyle mi oluyor? Kendi sorumu yanıtlamam gerekirse evet. İnterrupt rutinini kurmadan hemen önce: lda #$35 sta $01 ile BASIC ve KERNAL erişimini kapatıp $A000-$BFFF ve #E000-$FFFF arasını RAM olarak kullanabiliyoruz. KERNAL kapalı olduğu için RESTORE tuşunun programımızı çaktırmaması için $FFFA/$FFFB vektörlerini sadece rti komutu içeren bir adrese yönlendirmeyi unutmuyoruz. ;) (https://www.c64-wiki.com/images/thumb/5/51/Memory_Map.png/800px-Memory_Map.png) Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: Metallic üzerinde Ekim 18, 2019, 00:05:54 ÖÖ İkinci soruyu farketmemişim, sorry. Gerçi sorunun içinde cevabı varmış =) Kernal kapalıyken RESTORE tuşuna basılmasını dikkate aldığına göre sağlam geliyorsun demektir, hadi hayırlısı. Kernal açık olduğundaki duruma da dikkat etmek lazım o zaman. Sadece RESTORE tuşuna basınca bir şey olmaz, ama RUNSTOP+RESTORE yapılırsa programdan çıkılarak BASIC'e warmstart yapılır. Ona da bir çözüm bulmak lazım =)
Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: Simon (Özay Turay) üzerinde Ekim 18, 2019, 00:24:09 ÖÖ Eyvallah abi. Bu sefer sistematik gitmeye çalışıyorum dediğim gibi. Her öğrendiğimi tekrar kullanılabilir makrolar haline getiriyorum. 8)
Bu arada RunStop+Restore ve Shift+Commodore basic zamanlarından kalma poke adreslerini kullanarak ilk yazdığım makrolardandı. ;) !macro RunStopRestore .enable { !if (.enable) { lda #$ed sta $0328 } else { lda #$ea sta $0328 } } !macro ShiftCommodore .enable { !if (.enable) { lda #$00 sta $0291 } else { lda #$80 sta $0291 } } Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: Metallic üzerinde Ekim 18, 2019, 13:10:36 ÖS Vayy RUNSTOP+RESTORE için bile macro var, iyiymiş. Yalnız olaya $0328-$0329 vektörü üzerinden müdahale edildiğinde arada bir sürü gereksiz kod çalışıyor. İşin başında Kernal açıkken $FFFA-$FFFB'deki NMI vektörü üzerinden devreye giren Kernal'daki $FE43 rutini var. O da $0318-$0319 vektörü üzerinden $FE47'ye atlıyor. Yani $0318-$0319 vektörünü bir RTI komutuna yönlendirirsen (mesela $FE47 handler'ının sonunda $FEC1'deki RTI) daha hızlı bir müdahale olur. Ya da $0318-$0319 vektörünü, senin intronun ana döngüsündeki SPACE tuşuna basıldıktan sonra devreye giren, SEI ile başlayan I/O init koduna yönlendirirsen, RESTORE tuşuna basılınca sanki SPACE tuşuna basılmış gibi introdan çıkılarak oyun çalışır.
Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: wizofwor üzerinde Ekim 18, 2019, 14:12:49 ÖS Madem öyle, herkes eteğindeki taşları döksün de imece usulü bir kütüphanesi oluşturalım.
Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: Simon (Özay Turay) üzerinde Ekim 18, 2019, 19:01:08 ÖS Biraz düzene sokar sokmaz github hesabımdan paylaşacağım. Bugün 1x1 ve 1x2 smooth scroll makrolarını da hallettim. Simtro yakında geliyor. ;)
Konu Başlığı: Ynt: Raster Split Sorunu Gönderen: wizofwor üzerinde Ekim 19, 2019, 11:18:21 ÖÖ Ben de elimdeki makroları gözden geçirmeye başlayayım o zaman.
|