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)
commodore.gen.trGenel KategoriProjeDoberman (DMA Tabanlı Kartuş Projesi)
Sayfa: 1 ... 8 9 [10] 11 12 ... 15   Aşağı git
Yazdır
Gönderen Konu: Doberman (DMA Tabanlı Kartuş Projesi)  (Okunma Sayısı 151962 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
ibo1973
Uzman
*****
Mesaj Sayısı: 2.499


Üyelik Bilgileri
« Yanıtla #135 : Ekim 14, 2015, 15:29:00 ÖS »

2- doberman formatına uygun olarak köpek kafasını koymuşşun ama oda bence pek hoş olmamış

Merhaba, tabiki zevkler tartışılmaz. Ben genel olarak hayvanları severim, gerçi özellikle köpeklere karşı bir düşkünlüğüm yok ama merak ettim, neden köpeğin hoş olmamış  olduğunu düşündünüz?

Sadece aklıma birşey takıldı... Misal, kendi oyunumuzu bir slota yükledik...Menüyü nasıl editleyeceğiz?

Oyun isimleri loader'da gömülü değil. Flash içerisinden otomatik okuyup oluşturuyor menüyü. Simon'un dediği gibi PC tarafındaki loader programı flash'a oyun atarken, oyunun başına 128 byte'lık bir header bilgisi ekliyor. Oyun adı, başlangıç adresi, çalıştırma tipi, memory konfigürasyonu vb. Loader bunu flashtan okuyup hem menüyü hazırlıyor hem de seçim yapılınca nasıl çalıştıracağına karar veriyor. (Basic RUN yada SYS ... gibi.)


yanlış anlamazssın umarım amacım yapıcı eleştiri başka bir şey değil kartuşun çalışma sistemi gayet hoş ancak doberman menusu gerek müzik gerek köpek kafası gerek renklendirmesi olsun sanki korku filimlerinden çıkmış gibi geldi bana bence daha sevimli bir resim + müzik konulsa daha hoş olurdu diye düşünüyorum ama sonuçta zevk meselesi tabiki.
Logged
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #136 : Ekim 24, 2015, 19:57:42 ÖS »

Merhabalar,

Bu aralar işlerin yoğunluğundan fazla zaman ayıramıyorum projeye. Hafta içi bir kaç oyunun başındaki intro vb kısımları ayıklayıp hazırlamıştım. Bugün onları yükleyerek bir test yaptım. Yükleme hızı oldukça tatminkar. Ekte videoda görebilirsiniz.

Bunun haricinde çok parçalı oyunların en azından bazılarını destekleyebilmek için biraz kafa yordum. EasyFlash ta olduğu gibi, oyunlar patchlenerek Doberman64 ile çalışacak hale getirilebiliyor. Bu teoriyi test etmek için birkaç oyunu patchledim. Gene videoda bir tanesinin testi de mevcut.

Bu çok parçalı oyunların desteklenmesi işi şu şekilde oluyor. Normalde Doberman içerisinde 64K lık 64 adet slot var. Zaten başlangıçta sadece tek parça PRG ler için düşündüğümden böyle bir yapı öngörmüştüm. Çok parçalı oyunlar doğal olarak 64K dan daha büyük oluyor toplamda. Öncelikle parçaları birleştirerek 64K dan büyük olmayan bloklar elde ediyorum. Daha sonra bunları ardışık olarak Doberman64 içerisindeki slotlara upload ediyorum.

Videoda test edilen The Last Ninja III örneğinden gidecek olursak,

Intro 51KB
End Screen 28KB
High Scores 10KB
Death 9KB
Ve herbiri yaklaşık 56KB olan 5 ayrı bölüm mevcut.

End Screen, High Scores ve Death toplam 1 slot
Intro 1 slot,
Her bir level 1 slot olmak üzere oyun toplamda 7 slotluk yer kaplıyor Doberman64 hafızasında.

Daha sonra oyunun kodu incelenerek, bu parçaların nerede nasıl yüklendiğini buluyoruz. Bu kısım biraz zaman alıyor. Oyunun kendi içindeki yükleme mantığını anladıktan sonra, kendi loaderımızı yazarak, oyun kodu yükleme yapacağı zaman bu rutine dallanmayı sağlıyoruz.

Kendi loader rutinimiz ise şu işi yapıyor. Yüklenecek olan parçanın hangi slotta olduğunu, başlangıç adresini ve yükleme yapılacak uzunluğu C64 hafızasında Doberman'ın da bildiği bir yere yazıyor. Tabiki Doberman da zaten bu hafıza bölgesini periyodik olarak DMA yaparak test etmekte. Tesadüfi bir DMA request yaratmamak için, bu hafıza bölgesinin başında 'DMA' harflerinden oluşan bir magic sequence de mevcut.

Daha sonra rutin bir bekleme dögüsüne girerek, Doberman'ın DMA ile istenilen datayı hafızaya yazmasını bekliyor. Herhangi bir IO işlemi yapması gerekmediğinden bu loader rutini çok kısacık. Ve oyunun kendi loader rutininden daha kısa olduğu için bu rutini yerleştirecek yer bulmak da kolay oluyor.

Bu oyun için yazdığım loader rutin aşağıda.
Burada oyun orjinalinde $BB,$BC pointerının gösterdiği yere, "L0", "L1", "INTRO", "DEATH" vb text stringler koyarak kendi loader'ına dallanıyordu. Ben bu loader'e dallanmasını sağladım...

Kod:
*=$0338

SEI

LDA #$0
STA ADDR_DMAS
STA ADDR_BANK ; BANK NO
STA ADDR_ROML ; ROM ADDR L03
STA ADDR_ROMH ; ROM ADDR H
STA ADDR_RAML ; RAM ADDR L
STA ADDR_LENL
STA ADDR_LENH

LDA #04
STA ADDR_MAGIC0

LDA #13
STA ADDR_MAGIC1

LDA #01
STA ADDR_MAGIC2

LDA #$08
STA ADDR_RAMH ; RAM ADDR H

LDY #$00 ; $BB-$BC nin gösterdiği pointer hangisi (I,L,E,D,H)
LDA ($BB),Y

CMP #$49 ; Load Intro
BNE CheckEnd
LDA #$01 ; Bank $01
STA ADDR_BANK
LDA #204 ; LenghtH
STA ADDR_LENH
JMP StartDMA

CheckEnd
CMP #$45 ; Load End 
BNE CheckDeath
LDA #50 ; ROM ADDR H
STA ADDR_ROMH
LDA #112 ; Lenght H
STA ADDR_LENH
JMP StartDMA

CheckDeath
CMP #$44 ; Death 
BNE CheckHigh
LDA #16 ; ROM ADDR H
STA ADDR_ROMH
LDA #34 ; Lenght H
STA ADDR_LENH
JMP StartDMA

CheckHigh
CMP #$48 ; High Scores 
BNE LoadLevel
LDA #162 ; ROM ADDR H
STA ADDR_ROMH
LDA #37 ; Lenght H
STA ADDR_LENH
JMP StartDMA

LoadLevel
LDY #$01 ; $BB-$BC nin gösterdiği pointer +1 (0,1,2,3,4)
LDA ($BB),Y
SEC
SBC #46 ; $30-2 ASCII to integer ...
STA ADDR_BANK ; Slot No
LDA #221 ; Lenght H
STA ADDR_LENH

StartDMA
LDA $D011
ORA #16
STA $D011

LDA #$34
STA $01

LDA #$11
STA ADDR_DMAS

WaitDMA
LDA ADDR_DMAS
CMP #$12
BNE WaitDMA
   

Burada StartDMA label'ından sonra göreceğiniz enteresan bir durum var.
$D011'in 4.bitini set etmek zorunda kaldım. Zira denemelerim sırasında rutin bir türlü çalışmadı. En sonunda farkettim ki, oyun loader rutine geçmeden önce ekranı kapatıyormuş. Böyle oluncada bad line oluşmuyor ve Doberman DMA başlatamıyor. Videoda göreceğiniz yüklemeler esnasında ekrana çıkan garip şekillerin sebebi benim ekranı DMA oluşsun diye zorla açmamdan kaynaklı. Buna daha güzel bir çözüm üreteceğim şimdilik sadece test edip emin olmak için bu şekilde yaptım.

Ayrıca videoda görebileceğiniz gibi Doberman yükleme yaparken LED'i yakıyor. Buradan ne zaman yükleme yapıldığını ve yükleme hızını görebilirsiniz. Ayrıca LED'in kısa çakmalar şeklindeki yanmaları ise, Doberman'ın C64 tarafında DMA request var mı yok mu test etmek çin yaptığı kısa DMA lar...

Bu haftalık bu kadar,
Herkese selamlar.




Logged

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



Üyelik Bilgileri WWW
« Yanıtla #137 : Ekim 24, 2015, 23:26:12 ÖS »

Güzelmiş, ancak yama yama nereye kadar. Hakikaten 1541 emülasyonu lazım.

$0338'e kodu ne zaman atıyorsun? Oyunun yüklemesi basic'ten de aşağıda adreslerden mi?
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 #138 : Ekim 24, 2015, 23:37:55 ÖS »

Orjinal oyunda da loader rutini $338 de aslında. Yani orjinal derken tabiki cracklenmiş halinde. Ama loader rutini buraya sığmamış anladığım kadarı ile, 338 deki orjinal loader, önce 0400'e gerçek loader'ı upload ediyor, sonra 0400 de çalışıyor gerçekte yükleme yaparken... Ben sadece 338 deki loader'ın yerine kendi loader'ımı patchledim ve ana programın içine gömdüm. Yani 338 e o programı sonradan load etmiyorum hep orada ilk yüklendikten itibaren.
 
Ama haklısın 1541 emulasyonu projesine geçmek gerekiyor artık. Bir de şu freeze işini bir deneyeceğim NMI ile sonra o projeye devam.

EDIT: Bu arada görmemişim, oyunun yüklemesi normal BASIC bölgesi ama çalışınca RAM de herbir yere saldırıyor. Kahkaha 338'e de loaderini koyuyor. Tabi ben patchleyince ana programı benim loader'i koymuş oldu oraya...


Eğer merak edersen aşağıda orjinal loader rutini ve benim aldığım notlar var.

Kod:


>C:0540  49 4c 45 44 48 (INTRO LEVEL E? DEATH HISCRE)
>C:0548  16 25 59 7d 8c

.C:0400  A0 00       LDY #$00 ; $BB-$BC nin gösterdiği pointer hangisi (I,L,E,D,H) ise X=0,1,2,3,4
.C:0402  B1 BB       LDA ($BB),Y ; $0416 $0425 $0459 $047D $048C ye JSR
.C:0404  A2 FF       LDX #$FF
.C:0406  E8          INX
.C:0407  DD 40 05    CMP $0540,X
.C:040a  D0 FA       BNE $0406
.C:040c  BD 48 05    LDA $0548,X
.C:040f  8D 13 04    STA $0413
.C:0412  20 16 04    JSR $0416
.C:0415  60          RTS

.C:0416  A9 01       LDA #$01 ; I - Load Intro
.C:0418  20 9B 04    JSR $049B ; Bank $01,$02,$03 $8000 > $0800 $C0 Blok ... (NOT: $01=#$33 Yapıyor!!!)
.C:041b  A9 0B       LDA #$0B ; Bank $04, $8000 $C800 $0B Blok ...
.C:041d  A2 80       LDX #$80
.C:041f  A0 C8       LDY #$C8
.C:0421  20 00 05    JSR $0500
.C:0424  60          RTS

.C:0425  A0 01       LDY #$01 ; L - LEVEL 
.C:0427  B1 BB       LDA ($BB),Y ; $BB-$BC den sonraki karaktere göre (0,1,2,3,4..)
.C:0429  38          SEC
.C:042a  E9 30       SBC #$30
.C:042c  AA          TAX

>C:0550  72 53 1e 0e 1a
>C:0558  3e b9 56 fa 98
>C:0560  6e 6f 6d 6e 6e
>C:0568  05 09 0d 11 15

.C:042d  BD 50 05    LDA $0550,X
.C:0430  8D 54 04    STA $0454
.C:0433  BD 58 05    LDA $0558,X
.C:0436  8D 56 04    STA $0456
.C:0439  BD 60 05    LDA $0560,X
.C:043c  8D 57 04    STA $0457
.C:043f  BD 68 05    LDA $0568,X
.C:0442  20 9B 04    JSR $049B ; Start Bank $05 $09 $0D $11 $15, $8000 > $0800 $C0 Blok ... (NOT: $01=#$33 Yapıyor!!!)
.C:0445  A9 1D       LDA #$1D ; Sonraki Bank, $8000 $C800 $1D Blok ...
.C:0447  A2 80       LDX #$80 ;
.C:0449  A0 C8       LDY #$C8 ;
.C:044b  20 00 05    JSR $0500
.C:044e  AD FF 03    LDA $03FF ; if $03FF=0 RTS ...
.C:0451  F0 05       BEQ $0458
.C:0453  A9 00       LDA #$00 ; LDA   $72   $53   $1e   $0e   $1a   (Bu sanırım Trainer...)
.C:0455  8D 00 00    STA $0000 ; STA $6e3e $6fb9 $6d56 $6efa $6e98
.C:0458  60          RTS

.C:0459  A9 19       LDA #$19 ; E
.C:045b  8D 00 DE    STA $DE00 ; Bank $19, $8000 $0800 $40 Blok ...
.C:045e  8D 20 05    STA $0520
.C:0461  A9 40       LDA #$40
.C:0463  A2 80       LDX #$80
.C:0465  A0 08       LDY #$08
.C:0467  20 00 05    JSR $0500
.C:046a  EE 20 05    INC $0520
.C:046d  AD 20 05    LDA $0520
.C:0470  8D 00 DE    STA $DE00 ; Bank $1A, $8000 $4800 $30 Blok ...
.C:0473  A9 30       LDA #$30
.C:0475  A2 80       LDX #$80
.C:0477  A0 48       LDY #$48
.C:0479  20 00 05    JSR $0500
.C:047c  60          RTS

.C:047d  A9 1B       LDA #$1B ; D - DEATH
.C:047f  8D 00 DE    STA $DE00 ; Bank $1B, $8000 $0800 $22 Blok ...
.C:0482  A9 22       LDA #$22
.C:0484  A2 80       LDX #$80
.C:0486  A0 08       LDY #$08
.C:0488  20 00 05    JSR $0500
.C:048b  60          RTS

.C:048c  A9 1C       LDA #$1C ; H
.C:048e  8D 00 DE    STA $DE00 ; Bank $1C, $8000 $0800 $25 Blok ...
.C:0491  A9 25       LDA #$25
.C:0493  A2 80       LDX #$80
.C:0495  A0 08       LDY #$08
.C:0497  20 00 05    JSR $0500
.C:049a  60          RTS


.C:049b  8D 00 DE    STA $DE00 ; $8000 $0800 $40 Blok ...
.C:049e  8D 20 05    STA $0520
.C:04a1  A9 40       LDA #$40
.C:04a3  A2 80       LDX #$80
.C:04a5  A0 08       LDY #$08
.C:04a7  20 00 05    JSR $0500

.C:04aa  EE 20 05    INC $0520 ; Bank+1 $8000 $4800 $40 Blok ...
.C:04ad  AD 20 05    LDA $0520
.C:04b0  8D 00 DE    STA $DE00
.C:04b3  A9 40       LDA #$40
.C:04b5  A2 80       LDX #$80
.C:04b7  A0 48       LDY #$48
.C:04b9  20 00 05    JSR $0500

.C:04bc  EE 20 05    INC $0520 ; Bank+1 $8000 $8800 $40 Blok ...
.C:04bf  AD 20 05    LDA $0520
.C:04c2  8D 00 DE    STA $DE00
.C:04c5  A9 40       LDA #$40
.C:04c7  A2 80       LDX #$80
.C:04c9  A0 88       LDY #$88
.C:04cb  20 00 05    JSR $0500

.C:04ce  EE 20 05    INC $0520
.C:04d1  AD 20 05    LDA $0520
.C:04d4  8D 00 DE    STA $DE00

.C:04d7  A9 33       LDA #$33
.C:04d9  85 01       STA $01
.C:04db  60          RTS

.C:0500  8D 0A 05    STA $050A ; Kartuşta $XX00'dan RAM $YY00'a A Blok (256Byte) kopyala...
.C:0503  8E 0F 05    STX $050F
.C:0506  8C 12 05    STY $0512
.C:0509  A0 40       LDY #$40 ; Y=A
.C:050b  A2 00       LDX #$00
.C:050d  BD 00 80    LDA $8000,X ;
.C:0510  9D 00 08    STA $0800,X
.C:0513  E8          INX
.C:0514  D0 F7       BNE $050D
.C:0516  EE 0F 05    INC $050F
.C:0519  EE 12 05    INC $0512
.C:051c  88          DEY
.C:051d  D0 EC       BNE $050B
.C:051f  60          RTS
« Son Düzenleme: Ekim 24, 2015, 23:46:37 ÖS Gönderen: delimawi » Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #139 : Ekim 31, 2015, 19:26:37 ÖS »

Merhaba,

Bugün defreeze kısmı için de biraz kod yazdım. İlk testler gayet olumlu.

Freeze/Defreeze şimdilik şu şekilde çalışıyor:

Freeze edilmek istendiğinde, doberman DMA yaparak hafızada bir yere ufak bir freeze kodu atıyor. Daha sonra oyun yada programın interrupt vektörlerini okuyor, bunu bir yere kaydedip, bu vektörleri kendi freeze kodunun adresi ile değiştirip, DMA yı kapatıp beklemeye başlıyor. Oyuna ait ilk IRQ gerçekleştiğinde, oyunun kendi interrupt rutini yerine dobermanın içeriye sokmuş olduğu trojan freeze kodu çalışıyor. Bu rutin de, Dobermanın rahat rahat DMA yaparak istediği bilgileri okuması için kapıları sonuna kadar açıyor diyebiliriz. Çok detaya girmeyeceğim, aşağıda freeze ve defreeze kodlarını ekliyorum. Merak eden olursa cevaplamaya çalışırım.

Sonuç olarak yaklaşık 1sn gibi bir sürede, C64'ün tüm RAM'i (Freeze anında ROM lar açık olsa bile), ColorRAM'i ve I/O bölgesi registerlerinin okunabilen büyük bir kısmı flash'a yazılıyor. Ve oyun çalışmaya devam ediyor...

De-Freeze daha da basit. Önce Doberman temiz bir reset atıyor c64'e. Defreeze rutinini yüklüyor. Benzer şekilde DMA yaparak flash'tan okuduğu RAM, ColorRAM ve I/O registerlerini geri yüklüyor. Freeze anında not etmiş olduğu oyunun orjinal interrupt rutinine dallanıyor ve program kaldığı yerden açlışmaya devam ediyor. Kahkaha

FREEZE
Kod:
DMAS .byte $20		; DMA Status $20-C64 Not Ready, $21-C64 Ready, $22-Doberman DMA Done
AREG .byte 0 ; A Reg
XREG .byte 0 ; X Reg
YREG .byte 0 ; Y Reg
STKP .byte 0 ; SP
MEM0 .byte 0 ; Mem Config $00
MEM1 .byte 0 ; Mem Config $01
D012 .byte 0 ; Raster Line

STA AREG ; Store A
LDA $D012 ; Store D012 Raster Line
STA D012
STX XREG ; Store X
STY YREG ; Store Y
TSX
STX STKP ; Store SP
LDA $00
STA MEM0 ; MEM CFG $00
LDA $01
STA MEM1 ; MEM CFG $01
LDA #$34 ; Disable ROMS, All RAM ...
STA $01
LDA #$21 ; C64 Ready, Wait Doberman ...
STA DMAS

WaitDMA:
LDA DMAS
CMP #$22
BNE WaitDMA

LDA #$35 ; Enable I/O ...
STA $01

LDA #$23 ; C64 Ready, Wait Doberman ...
STA DMAS

WaitDMA2:
LDA DMAS
CMP #$24
BNE WaitDMA2

; DE-FREEZE ----------------------------------------

LDA #$0F ; Restore SID Volume ...
STA $D418

LDA MEM0 ; Restore Mem Cfg ...
STA $00
LDA MEM1
STA $01
; LDX STKP ; Restore Stack Pointer ... Bunu ellemedim
; TXS
LDA AREG
LDX XREG
; LDY YREG ; Bunu da ellemedim ...
JMP $FFFF ; JMP to Original IRQ ...



DEFREEZE
Kod:

DMAS .byte $20 ; DMA Status $20-C64 Not Ready, $21-C64 Ready, $22-Doberman DMA Done
AREG .byte 0 ; A Reg
XREG .byte 0 ; X Reg
YREG .byte 0 ; Y Reg
STKP .byte 0 ; SP
MEM0 .byte 0 ; Mem Config $00
MEM1 .byte 0 ; Mem Config $01
D012 .byte 0 ; Raster Line

SEI

;LDA $DD0E
;LDA $DD0F

LDA #$7C
STA $DD0D
LDA #$00
STA $DD0E
STA $DD0F

;LDA $DC0E
;LDA $DC0F

LDA #$00
STA $DC0E
STA $DC0F


; LDY #$7f
; STY $DC0D   ; Turn off CIAs Timer interrupts
; STY $DD0D   ; Turn off CIAs Timer interrupts
LDA $DC0D   ; cancel all CIA-IRQs in queue/unprocessed
LDA $DD0D   ; cancel all CIA-IRQs in queue/unprocessed
   
LDA #$34 ; Disable ROMS, All RAM ...
STA $01
LDA #$21 ; C64 Ready, Wait Doberman ...
STA DMAS

WaitDMA:
LDA DMAS
CMP #$22
BNE WaitDMA

LDA #$35 ; Enable I/O ...
STA $01

LDA #$23 ; C64 Ready, Wait Doberman ...
STA DMAS

WaitDMA2:
LDA DMAS
CMP #$24
BNE WaitDMA2

; DE-FREEZE ----------------------------------------

LDA #$0F ; Restore SID Volume ...
STA $D418

LDA MEM0 ; Restore Mem Cfg ...
STA $00
LDA MEM1
STA $01

LDX STKP ; Restore Stack Pointer ...
TXS

LDA AREG
LDX XREG
LDY YREG
JMP $FFFF ; JMP to Original IRQ ...


Bu arada bu freeze işlemine ait kodun, PIC tarafı da aşağıdaki şekilde:
Kod:

unsigned char KernalIRQ[19]=
{
0x48, // PHA
0x8A, // TXA
0x48, // PHA
0x98, // TYA
0x48, // PHA
0xBA, // TSX
0xBD,0x04,0x01, // LDA $0104,X
0x29,0x10, // AND #$10
0xF0,0x03, // BEQ $FF58
0x6C,0x16,0x03, // JMP ($0316)
0x6C,0x14,0x03 // JMP ($0314)
};

#define FREEZE_CODE_LEN 93
const rom unsigned char FreezeCode[FREEZE_CODE_LEN]=
{
    0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x40, 0x03, 0xAD, 0x12, 0xD0,
    0x8D, 0x46, 0x03, 0x8E, 0x41, 0x03, 0x8C, 0x42, 0x03, 0xBA, 0x8E, 0x43, 0x03, 0xA5, 0x00, 0x8D,
    0x44, 0x03, 0xA5, 0x01, 0x8D, 0x45, 0x03, 0xA9, 0x34, 0x85, 0x01, 0xA9, 0x21, 0x8D, 0x3F, 0x03,
    0xAD, 0x3F, 0x03, 0xC9, 0x22, 0xD0, 0xF9, 0xA9, 0x35, 0x85, 0x01, 0xA9, 0x23, 0x8D, 0x3F, 0x03,
    0xAD, 0x3F, 0x03, 0xC9, 0x24, 0xD0, 0xF9, 0xA9, 0x0F, 0x8D, 0x18, 0xD4, 0xAD, 0x44, 0x03, 0x85,
    0x00, 0xAD, 0x45, 0x03, 0x85, 0x01, 0xAD, 0x40, 0x03, 0xAE, 0x41, 0x03, 0x4C, 0xFF, 0xFF
};


void c64_FreezeInit(void)
{
unsigned char i,res,d,addrl,addrh,cnt;
unsigned int addr,add2,len;
unsigned char irqBackup[3];

FlashSectorErase(62); // Sector 62 RAM ...
FlashSectorErase(63); // Sector 63 I/O ...

c64_start_dma();

frzIrqVectorL=c64_peek(0xFFFE);
frzIrqVectorH=c64_peek(0xFFFF);

// Check KERNAL...
frzKernal=0;

if ((frzIrqVectorL==0x48) && (frzIrqVectorH==0xFF))
{
// KERNAL might be ON, Lets check ...
frzKernal=1;
addr=0xFF48;

for (i=0;(i<19)&&(frzKernal==1);i++)
{
if (c64_peek(addr++)!=KernalIRQ[i]) frzKernal=0;
}
}

if (frzKernal==1)
{
// KERNAL is on, IrqAddr=($0314)
frzIrqAddrL=c64_peek(0x0314);
frzIrqAddrH=c64_peek(0x0315);
}
else
{
// KERNAL is OFF ...
frzIrqAddrH=frzIrqVectorH;
frzIrqAddrL=frzIrqVectorL;
}

// Change Vectors to FREEZER_ADDR+8 ...
addr=FREEZER_ADDR;
addr+=8;
if (frzKernal==1)
{
c64_poke(0x0314,addr&255);
c64_poke(0x0315,addr>>8);
}
else
{
c64_poke(0xFFFE,addr&255);
c64_poke(0xFFFF,addr>>8);
}

// Upload Freeze Code ...
addr=FREEZER_ADDR;
for (i=0;i<FREEZE_CODE_LEN;i++)
{
c64_poke(addr++,FreezeCode[i]);
}
c64_stop_dma();

// NOW Wait IRQ From C64 ...

WAIT:
Delay10KTCYx(1);
res=c64_peek(FREEZER_ADDR);
if (res!=0x21) goto WAIT;

// IRQ Happened ...
// Read Registers ...
c64_start_dma();

// Restore Vectors &  ... (Bunu RAM kopyasını alamadan önce yapıyorum ki, RAM kopyasında yerli yerinde olsunlar, bidaha uğraşmayalım.)
if (frzKernal==1)
{
c64_poke(0x0314,frzIrqAddrL);
c64_poke(0x0315,frzIrqAddrH);
}
else
{
c64_poke(0xFFFE,frzIrqAddrL);
c64_poke(0xFFFF,frzIrqAddrH);
}

frzA=c64_peek(FREEZER_ADDR+1);
frzX=c64_peek(FREEZER_ADDR+2);
frzY=c64_peek(FREEZER_ADDR+3);
frzSP=c64_peek(FREEZER_ADDR+4);
frz00=c64_peek(FREEZER_ADDR+5);
frz01=c64_peek(FREEZER_ADDR+6);

// ---------------------------------------------------------
// Read RAM Here
// ---------------------------------------------------------
addr=0;
for (len=0;len<512;len++)
{
for (cnt=0;cnt<128;cnt++)
{
buf[cnt]=c64_peek(addr+cnt);
}
FlashWriteBlock(62,addr>>8,addr&255,&buf[0],128);
addr+=128;
}

// Now we need to Read I/O Space ...
c64_poke(FREEZER_ADDR,0x22);
c64_stop_dma();

WAIT2:
Delay10KTCYx(1);
res=c64_peek(FREEZER_ADDR);
if (res!=0x23) goto WAIT2;

c64_start_dma();

// ---------------------------------------------------------
// Read I/O & Color RAM Here !!!
// ---------------------------------------------------------
addr=0xD000;
len=4096;

while (len!=0)
{
cnt=0;
while ((cnt<64) && (len!=0))
{
buf[cnt]=c64_peek(addr+cnt);
cnt++;
len--;
}
FlashWriteBlock(63,addr>>8,addr&255,&buf[0],cnt);
addr+=cnt;
}


// ---------------------------------------------------------
// Also store Registers ...
// ---------------------------------------------------------
FlashWriteByte(63,0,0,frzA);
FlashWriteByte(63,0,1,frzX);
FlashWriteByte(63,0,2,frzY);
FlashWriteByte(63,0,3,frz00);
FlashWriteByte(63,0,4,frz01);
FlashWriteByte(63,0,5,frzSP);
FlashWriteByte(63,0,6,frzIrqAddrL);
FlashWriteByte(63,0,7,frzIrqAddrH);

// Update Freezer Jump Address ...
c64_poke(FREEZER_ADDR+FREEZE_CODE_LEN-2,frzIrqAddrL);
c64_poke(FREEZER_ADDR+FREEZE_CODE_LEN-1,frzIrqAddrH);

c64_poke(FREEZER_ADDR,0x24); // DONE Signal / Unfreeze ...
c64_stop_dma();
}


Aşağıda da hızlı bir video.

NOT: Henüz freeze/defreeze için bir buton yok Doberman'da. Bu sebeple komutları PC den veriyorum. Sanıyorum Doberman'ın bir butonu daha olacak. Freeze ve Menu...

Videoda Commando oynuyor iken 24. saniyeler civarında oyunu freeze ediyorum. Videoda 1 sn lik donma ile anlaşılabiliyor. Daha sonra yandıkça bir kaç kere defreeze edip kaldığım yerden devam ediyorum. Defreeze işlemi de yaklaşık 1 sn içinde tamamlanıyor.

Freeze'in kesin flash'ta tutulduğunu göstermek için 57. saniyede bilgisayarı tamamen kapatıp, açıkldıktan sonra tekrar defreeze ediyorum ve aynı kaldığımız yerden devam ediyoruz.

Daha sonra Doberman ile hızlıca bir başka oyun yükleyip, onu da bir miktar ilerleyince freeze edip aynı işlemleri tekrarlıyorum. Bu arada oyun oynama konusunda gerçekten yeteneksizim, kusura bakmayın...



Bu arada bugün yurtdışından bir paket geldi. içinden bir miktar bu kutulardan çıktı. Aslında şeffaf ama flash'lı çekince böyle çıktı...



Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.757


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #140 : Ekim 31, 2015, 20:00:11 ÖS »

Süper olmuş. LW3D'nin en çok istediği özellik 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
Cengiz Demir
Uzman
*****
Mesaj Sayısı: 3.830



Üyelik Bilgileri
« Yanıtla #141 : Ekim 31, 2015, 20:07:54 ÖS »

Ooo çok iyi ilerliyor proje.. 

-------------------------------------

Bütün projecilere sesleniyorum.. 

30 sene önce nerelerdeydiniz ?   Kahkaha
Logged

ibo1973
Uzman
*****
Mesaj Sayısı: 2.499


Üyelik Bilgileri
« Yanıtla #142 : Ekim 31, 2015, 20:08:50 ÖS »

süper olmuş eline sağlık
Logged
LW3D
Yönetici
*****
Mesaj Sayısı: 11.418


Günü Kurtaran Avam Hiooargggh :)


Üyelik Bilgileri WWW
« Yanıtla #143 : Ekim 31, 2015, 20:17:18 ÖS »

Harika... Bir kartuştan başka ne istenir ki ? Süper kullanışlı bir özellik olmuş. Tebrik ederim...
Logged

LW3D
Yönetici
*****
Mesaj Sayısı: 11.418


Günü Kurtaran Avam Hiooargggh :)


Üyelik Bilgileri WWW
« Yanıtla #144 : Ekim 31, 2015, 20:19:47 ÖS »

Unutmadan freeze, defreeze özelliğini neden çok önemsedim? Ben de oyun konusunda çok kabiliyetsizim Bu sayede ilerlemek mümkün olabilir
Logged

Metallic
Uzman
*****
Mesaj Sayısı: 1.081



Üyelik Bilgileri
« Yanıtla #145 : Ekim 31, 2015, 20:24:51 ÖS »

Nefis olmuş, tebrikler. Freeze/defreeze çok hızlı, sanki emulator'da snapshot yapılıyor gibi. Artık oyunları gerçek makinede oynarken freeze yaparak rahatça bitirebiliriz. icomp kutu da gelmiş, üzerine doberman resimli bir etiket iyi gider. icomp kutu protovision'dan mı yoksa daha ucuz bir kaynak bulabildin mi?
Logged
Enson
Üye
****
Mesaj Sayısı: 259



Üyelik Bilgileri
« Yanıtla #146 : Ekim 31, 2015, 21:16:26 ÖS »

ghosts'n goblins değil mi o, bu oyunun 2. bölümüne bir kere geçebilmiştik yirmi seneden fazla oldu sanırım, yani oyun konusunda yalnız değilsin, fakat bu özellik sayesinde artık kaldığımız yerden devam edeceğiz, eline sağlık.
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #147 : Ekim 31, 2015, 21:23:42 ÖS »

Şık olmuş yeni özellik. Bence ekran belleğinde kod çalıştırmadan önce ekranı kapasan daha şık bir görüntü olur.
Logged

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

twitter | blog
Cengiz Demir
Uzman
*****
Mesaj Sayısı: 3.830



Üyelik Bilgileri
« Yanıtla #148 : Ekim 31, 2015, 21:39:16 ÖS »

Şık olmuş yeni özellik. Bence ekran belleğinde kod çalıştırmadan önce ekranı kapasan daha şık bir görüntü olur.

Görüntüyü dondurarak veya siyah ekran yaparak, kanal geçişi yapan uydu cihazları;
Aynı hızda kanal geçişi yapsa bile; görüntüyü dondurarak geçiş yapanlar, daha hızlı geçiş yapıyormuş gibi geliyor bana. Kahkaha
 
Logged

joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #149 : Ekim 31, 2015, 22:38:05 ÖS »

sadece yok artık diyorum. Sadece Doberman için söylemiyorum, forumdaki diğer projelerin hepsi Commodore camiasında ses getirecek tarz da projeler. Hepinize ne kadar teşekkür etsem azdır.

Bu tarz projeleri yapanlar bizden birileri olunca inanılmaz gurur duyuyorum
Logged
Sayfa: 1 ... 8 9 [10] 11 12 ... 15   Yukarı git
Yazdır
Gitmek istediğiniz yer: