Gönderen Konu: C64 Turbo Load Simülasyonu  (Okunma sayısı 6305 defa)

C64 Turbo Load Simülasyonu

« : 02.05.2009 00:24:43 »
Hızlı düğmeleri aç

ozayturay

İleti: 25

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
Nightlord'un VIC tutorial'ını okumaya başladıktan sonra 2003 senesinde yaptığım ilk intronun kaynak kodlarından da bazı kısımlar alarak kasetten yükleme yaparken çıkan renkli çubukları simüle ettim raster barlar ile. Bakalım kaçınızı eski günlere götürebileceğim?

Kod: [Seç]
!to "colorbars.prg", cbm

*=$0801

!word nextline            ;start basic listing
!word 2009            ;2009
!byte $9e            ;sys
!text "2061"            ;2061
!byte 0
nextline:
!word 0                ;end basic listing

start:
lda #$00            ;choose black color
sta $d020            ;set border color
;sta $d021            ;set background color
;lda #$01            ;chose white color
;jsr $e536            ;set character color & clear screen

jsr prepare_irq            ;prepare irq

end:
jmp end                ;endless loop

prepare_irq:
sei                ;disable interrupts
lda #$7f
sta $dc0d            ;disable cia interrupts
lda $d01a
ora #$01
sta $d01a            ;activate raster irq
lda $d011
and #$7f
sta $d011            ;irq raster line < 256
lda #$00
sta $d012            ;irq raster line = 0
lda #<irq_routine
sta $0314
lda #>irq_routine
sta $0315            ;set irq routine address
lda #$01
sta $d019
cli                ;enable interrupts
rts

irq_routine:
inc $d019            ;irq ok, prepare for the next one
lda #$00            
jsr wait_raster            ;wait for raster line
jsr draw_colorbar        ;draw color bar
lda $dc01            ;read keypress
cmp #$ef            ;if not space
bne continue            ;continue, else
sei                ;disable interrupt
jsr $ff81
jsr $ff84
lda #$31
sta $0314            ;restore lo byte
lda #$ea
sta $0315            ;restore hi byte
cli                ;enable interrupts
jmp $a474            ;exit program
continue:
jmp $ea31            ;give the control to the cpu

wait_raster:
cmp $d012            ;compare $d012 with register a
bne wait_raster            ;wait for raster line
rts

wait_timer:
dey                ;decrement register y
bne wait_timer            ;until it reaches zero
rts

draw_colorbar:
ldx #$00            ;reset counter
loop:
ldy #$21            ;delay timer = 33
jsr wait_timer            ;wait timer to finish
stx $d020            ;change border color
;stx $d021            ;change background color
inx                ;increment counter
bne loop            ;loop
rts
Ustalardan yorumları bekliyorum. :)

Not: Ekran görüntüsü koyamadım. Dosya upload sistemi yazma izinlerindeki bir hatadan ötürü çalışmıyor sanırım.

C64 Turbo Load Simülasyonu

« Yanıtla #1 : 02.05.2009 01:20:08 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Öncelikle her ne kadar tutoriallardan faydalanmış olsan da 6510 ASM'den interrupt rutini içeren bir kod yazmış olman bile büyük başarı, tebrik ederim. Elbette ki bir o kadar da Nightlord tebriği hakediyor.
 
Kodunu incelediğimde vardığım ilk sonuç daha önceden programlama tecrüben olduğu. Bunun hem iyi hem de kötü sonuçları olmuş. ıyi sonuç şu ki programı alt rutinelere bölerek yazmışsın. Daha derli toplu bir görüntüde olmuş böylece. Kötü sonucu ise şu ki bu efekt düzensiz zamanlamaları oldukça hoş görüyor, hatta efektin temeli bundan oluştuğu için problem yaşamamışsın. Ancak daha düzgün zamanlama gerektiren efektlerde bu şekilde alt rutin kullanarak sorun yaşayabilirsin. Özellikle interrupt içersinde her "jsr rts" kullandığın yerde 12 cycle kaybedersin. "wait_raster", "wait_timer" gibi alt rutinleri makrolara çevirmeni tavsiye ediyorum. yani;
 
wait_raster:
cmp $d012
bne wait_raster
rts
 
yerine
 
!macro wait_raster {
cmp $d012
bne wait_raster
}
 
şeklinde kullanıp;
 
jsr wait_raster
 
yerine
 
+wait_raster
 
şeklinde çağırmanı öneririm. Bu her defasında o kod parçasını copy & paste ile yerine koymanla aynı işi yapar. Dolayısıyla çok uzun kod parçalarının defalarca çağırılması söz konusu olursa hafıza kullanımını göz önüne alarak makro yerine yine alt rutin tercih edilebilir. ama bu verdiğim örneklerde makro net bir biçimde tercih edilmelidir.
 
jsr prepare_irq
end:
jmp end
 
bu tür kullanımlar da senin önceden gelen bir programcılık alışkanlığın olduğunu hissettirdi bana. kullanım tamamen doğru. ancak genellikle programcılıkta assembler'a kadar inmişsek bu tür kullanımlardan kaçınabiliriz. yani bir derleyici böyle bir kod üretebilir. biz yazıyorsak ihtiyaç duymayabiliriz. yani jsr jmp satırlarını kullanmadan doğrudan;
 
sei
...
...
cli
end:
jmp end
 
kullanabiliriz.
 
Dediğim gibi senin kodunda hiçbir "yanlış" yok. Bu söylediklerimin hepsini daha önce başka bir programlama dili tecbrüben olduğunu hissettiğim ve assemblerda bazı farklı yöntemlere alışman için söylüyorum. turbo'nun grafik çizimiyle ilgili "gereksiz taramalardan kaçının" tavsiyesi gibi ben de "gereksiz cycle harcayan herşeyden kaçının" diyorum :)
 
Joker'den sonra son zamanlarda gördüğüm ikinci Commodore 64 programlamaya ilgili kişi olduğunu belirteyim. Umarım senin de ilk intronu kısa sürede görmek nasip olur. Hatta Joker'le güçleri birleştirip birlikte birşeyler yapmanız da hiç fena olmaz, bende size bir fikir.
« Son Düzenleme: 02.05.2009 01:23:40 Gönderen: skate »

C64 Turbo Load Simülasyonu

« Yanıtla #2 : 02.05.2009 18:17:07 »
Hızlı düğmeleri aç

vigo


  • Ziyaretçi
bi de stranger/analog

C64 Turbo Load Simülasyonu

« Yanıtla #3 : 10.05.2009 01:05:02 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
Selamlar ozayturay,
 
Tutorialleri takip edip program yazmaya girisen birilerini gormek her zaman cok guzel bir olay benim icin. Gayet guzel olmus ellerine saglik :)
 
Koduna bakarken bazi cok onemli olmayan stil problemleri gordum (indentasyon olmamasi, yorumlarin yerleri vb.) Bunun ardindan kendi web sitemdeki vic kitabina baktigimda ayni problemin orada da oldugunu gordum. Bir sekilde txt dosyalarini pdf'e cevirirken indentasyonlari kaybetmisim. Dolayisiyla o tutoriallerden calisan birinin, senin yukarida paste ettigin kodda gordugum stil problemlerini yasamasi cok dogal. Bu yuzden onumuzdeki gunlerde C64 kodlama stili ile ilgili bazi onerilerimi yazacagim. Bir ara da tabi vic ve 6510 kitaplarini duzeltmek lazim.
 
Skate: sanirim ozayturay'in interrupt initleri ve delay rutinlerini alt rutin yapip jsr yapmasi yine vic kitabindaki benim anlatis formumu takip etmesinden kaynaklaniyor :)
 
Skate'in belirttigi gibi belli bir noktadan sonra cok daha cycle optimized kod yazmak c64 coder'larinda otomatik refleks haline donusuyor. Ben tutoriallerde genelde daha rahat anlasilacagini / okunacagini dusundugum durumlarda ozellikle boyle moduler kod orneklerini tercih ediyorum. Hiz yonunden en optimum cozumler olmuyorlar cogu zaman.
 
Bu stil problemleri disinda kodunda hicbir mantik hatasi veya farkli implement etmeni tavsiye edecegim nokta goremedim. Gayet temiz is :) Ellerine saglik tekrar

C64 Turbo Load Simülasyonu

« Yanıtla #4 : 10.05.2009 04:09:53 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
@Nightlord: Senin tutoriallarını okuyalı epey bir zaman oldu, örneklerini hatırlamıyordum. Ancak bu konuda haklısın. Senin öğretmedeki sabrına ben sahip değilim sanırım. Mesela senin "64K yani 64000 byte" gibi bir şey yazdığını hatırlıyorum. Bence adım adım öğretme ile ilgili çok güzel bir yaklaşım. Ben bu şekilde yazamıyorum genelde.
 
@ozanturay: Bu durumda "şimdilik" istediğin kadar alt rutin kullanabilirsin. :D