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: Raster Split Sorunu  (Okunma Sayısı 8250 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.758


Commodore Forever


Üyelik Bilgileri WWW
« : 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.





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.


* simtro_screenshot1.png (2.11 KB, 384x272 - Görüntüleme: 1326 kez.)

* simtro_screenshot2.png (2.47 KB, 384x272 - Görüntüleme: 1276 kez.)
* simtro_petscii.prg (7 KB - Yükleme: 373 kez.)
* acme-macros.txt (3.53 KB - Yükleme: 383 kez.)
* simtro_petscii.txt (3.04 KB - Yükleme: 362 kez.)

* charset.prg (1 KB, 102x102 - Görüntüleme: 797 kez.)
* logo.prg (0.47 KB - Yükleme: 342 kez.)

* music.prg (3.75 KB, 76x72 - Görüntüleme: 911 kez.)
« Son Düzenleme: Ekim 15, 2019, 03:26:44 ÖÖ Gönderen: Simon (Özay Turay) » Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
ercanersoy
Deneyimli
*****
Mesaj Sayısı: 1.032


Üyelik Bilgileri WWW
« Yanıtla #1 : 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.
Logged
ercanersoy
Deneyimli
*****
Mesaj Sayısı: 1.032


Üyelik Bilgileri WWW
« Yanıtla #2 : 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.
Logged
Metallic
Uzman
*****
Mesaj Sayısı: 1.081



Üyelik Bilgileri
« Yanıtla #3 : 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.
Logged
Exu
Üye
****
Mesaj Sayısı: 444



Üyelik Bilgileri
« Yanıtla #4 : 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.

       


* shocked-face-with-exploding-head_1f92f.png (11.12 KB, 160x160 - Görüntüleme: 696 kez.)
« Son Düzenleme: Ekim 15, 2019, 09:20:56 ÖÖ Gönderen: Exu » Logged

Bir kadının tepesini attıracak kadar çok RETRO EŞYA barındırabiliyorsan ve hala evliysen, O zaman kralsın...
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.758


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #5 : 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. Masum

; 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.
Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.758


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #6 : 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
« Son Düzenleme: Ekim 16, 2019, 11:22:58 ÖÖ Gönderen: Simon (Özay Turay) » Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.758


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #7 : 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.

Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
Metallic
Uzman
*****
Mesaj Sayısı: 1.081



Üyelik Bilgileri
« Yanıtla #8 : 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 =)


Logged
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.758


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #9 : 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. Karizmatik

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
  }
}
Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
Metallic
Uzman
*****
Mesaj Sayısı: 1.081



Üyelik Bilgileri
« Yanıtla #10 : 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.
Logged
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.794


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #11 : 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.
Logged

Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.758


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #12 : 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.
Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.794


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #13 : Ekim 19, 2019, 11:18:21 ÖÖ »

Ben de elimdeki makroları gözden geçirmeye başlayayım o zaman.
Logged

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