Hallo Bugjam, ich habe nun auch den Trackloader-Emulations-Code für die EasyFlash Version fertig. Die Savefunktion ist auch hier noch offline.
Wenn du Lust und Zeit hast, kannst du das Game ja mal Testen. Die EasyFlash Routine hatte ich heute für das Game und für "The Pawn" komplet neu gecodet.
Im Moment arbeite ich noch an der EasyFlash Routine von "The Pawn" weil die noch "etwas" schwieriger zu coden ist.
Im Codefenster habe ich dir mal die fast fertige Routine für "The Pawn" gepostet. Einzig das IRQ-Handling beim Laden aus dem EasyFlash macht mir noch Kopfzerbrechen.
Ich habe zwar schon eine Idee, aber das muss ich erstmal gründlich testen.
Code Alles anzeigen; ---- $fc = zu lesender track in hex ; ---- $fd = zu lesender sektor in hex ; ---- das erste d64 muss ab bank $01 im easyflash rom liegen ; ---- das zweite d64 muss ab bank $0c im easyflash rom liegen ; ---- die routine rechnet den track und sektor wert der disketten in eine easyflash rom-adresse um ; ---- erstes d64 von $004000-$02ab00 ; ---- zweites d64 von $034000-$05ab00 ; ---- easyflash rom-lader für the pawn von $1899-$1a89 ; ---- freier platz im c64-ram $1899-$1aa4 !to "pawn2easyflash.prg",cbm !cpu 6502 *= $1899 ; ---- $1899 256 bytes aus easyflash-rom laden. wird von $17c3,$17ce,$1fe4,$2479 angesprungen ---- sty writb+2 ; ---- high byte offset c64 ram festlegen ldy $01 ; ---- wert von $01 laden sty romram+1 ; ---- wert von $01 für wiederherstellung puffern ldy #$37 ; ---- $01 für easyflash vorbereiten sty $01 ; ---- und festlegen jsr a1899 ; ---- zum decodierer der t&s datas und der zu aktivierenden diskseite ; ---- ram to easyflash rom konverter routine ---- lda loop1+2 ; ---- bankbyte in den akku laden beq efhiby ; ---- wenn banknummer $00 ist, das highbyte bearbeiten x4efb lda #$04 ; ---- eine 64kb ram bank sind vier 16kb easyflash bänke clc ; ---- carry flag löschen adc efbank ; ---- zum easyflash bank puffer hinzuaddieren. offset ist $01 für disk1 oder $13 für disk2 sta efbank ; ---- und summe im easyflash bankpuffer schreiben dec loop1+2 ; ---- 64kb bank um einen verringern bne x4efb ; ---- schon alle bänke in easyflash bänke umgerechnet? efhiby lda loop1+1 ; ---- lade high byte ram-offset sec ; ---- carry flag setzen sbc #$40 ; ---- und #$40 vom highbyte ram puffer subtrahieren. #$40 pages zu 256bytes (16kb) sind eine easyflash bank bcc efaddr ; ---- highbyte ram-offset kleine als #$40 pages? inc efbank ; ---- wenn nicht easyflash bankpuffer um einen erhöhen sta loop1+1 ; ---- ram highbyte-offset minus #$40 zurückschreiben jmp efhiby ; ---- die nächsten #$40 pages vom highbyte ram-offset subtrahieren efaddr lda loop1+1 ; ---- die übrigen ram-highbytes in den akku laden clc ; ---- carry flag löschen adc #$80 ; ---- für das easyflash rom-offset zu den übrigen ram-highbytes #$80 hinzuaddieren. sta efhigh ; ---- die summe zurückschreiben. easyflash rom-offset ist immer $8000 plus hoffset plus bank ; ---- easyflash rom-laderoutine ---- lda efhigh ; ---- rom leseadresse laden sta readb+2 ; ---- und festlegen sei ; ---- im moment keinen interrupt. mal sehen, ob das game damit klar kommt ldx #$87 ; ---- x-reg = aktivate ldy efbank ; ---- y-reg = bank #$01 oder bank $13 minimum stx $de02 ; ---- aktivate easyflash sty $de00 ; ---- angeforderte easyflash bank aktivieren ldx #$00 ; ---- x-index offset festlegen readb lda $8000,x ; ---- 256 bytes aus easyflash laden inc $01 ; ---- $01 = #$38 für das schreiben unter dem i/o writb sta $0000,x ; ---- in das c64 ram schreiben $0000 ist kein realer wert. irgendwas musste ich ja dahinschreiben dec $01 ; ---- $01 = #$37 um aus dem easyflash zu lesen inx ; ---- x-index für nächstes byte um einen erhöhen bne readb ; ---- schon 256 bytes aus dem easyflash gelesen? end01 lda #$04 ; ---- wert um das easyflash zu deaktivieren laden. sta $de02 ; ---- und easyflash deaktivieren. romram ldy #$34 ; ---- wert von $01 laden sty $01 ; ---- und zustand vor dem laden wiederherstellen rts ; ---- fertig ; ---- einzelbyte leseroutine von $0f07 direkt angesprungen $01 ist immer #$37 ---- lda efhigh ; ---- rom leseadresse laden sta reade+2 ; ---- und festlegen sei ; ---- im moment keinen interrupt. mal sehen, ob das game damit klar kommt ldx #$87 ; ---- x-reg = aktivate ldy efbank ; ---- y-reg = bank #$01 oder bank $13 minimum stx $de02 ; ---- aktivate easyflash sty $de00 ; ---- angeforderte easyflash bank aktivieren index ldx #$00 ; ---- x-index offset reade lda $8000,x ; ---- lädt byte für byte aus dem easyflash-rom inc index+1 ; ---- index für das nächste byte um einen erhöhen end01 ldx #$04 ; ---- wert um das easyflash zu deaktivieren laden. stx $de02 ; ---- und easyflash deaktivieren. return rts ; ---- fertig ; ---- t&s ram adressen decoder und einzelbyte leseroutine. wird von $0f1d direkt angesprungen ---- ldy #$37 sty $01 ldy #$3f sty $dd02 ; ---- datenrichtung Port A. kann wohl gelöscht werden, weil kein irq-loader mehr vorhanden ist jsr a1899 ; ---- decoder für diskseite track und sektor usw. rts ; ---- und schüss a1899 cpx #$01 ; ---- daten byteweise aus dem easyflash laden bne b18ab ; ---- bis $18b7 dient alles der zuweisung der t&s datas an den floppy treiber cmp #$3a ; ---- ist der wert von t&s data2 niedriger #$3a bcs b18a5 ldx #$23 ; ---- den wert von t&s data1 auf #$23 festlegen bne totrs b18a5 sec sbc #$3a ; ---- vom data2 auf #$3a subtrahieren jmp totrs b18ab cpx #$02 ; ---- ist der wert von t&s data1 #$02 bne totrs cmp #$bf bcc totrs and #$1f ldx #$03 ; ---- den wert von t&s data1 auf #$03 festlegen totrs stx trsdat1 ; ---- wert puffern. bei the pawn stx $1a54 sta trsdat2 ; ---- wert puffern. bei the pawn sta $1a53 jsr dcryts ; ---- zur seitenabfrage und t&s decoder ldx $fc ; ---- zu lesender track in als x-register nutzen loop2 dex ; ---- x-index track nummer um einen verringern beq sektor ; ---- wenn track $00 ist, dann nur sektoren hinzuaddieren lda track,x ; ---- anzahl der sektoren für aktuelle tracknummer in den akku laden clc ; ---- carry flasg löschen adc loop1+1 ; ---- und zum 64k ram offset hinzuaddieren sta loop1+1 ; ---- und 64k ram offset wert zurück schreiben bcc loop2 ; ---- ist ein übertrag vorhanden? inc loop1+2 ; ---- bei einem übertrag, das bankbyte um eine erhöhn jmp loop2 ; ---- nächsten track bearbeiten sektor lda $fd ; ---- nun die restlichen sektoren in den akku laden clc ; ---- carry flasg löschen adc loop1+1 ; ---- und dem 64k ram-offset hinzuaddieren sta loop1+1 ; ---- und 64k ram offset wert zurück schreiben bcc ramrd ; ---- ist ein übertrag vorhanden? inc loop1+2 ; ---- bei einem übertrag, das bankbyte um eine erhöhn ramrd ldx #$02 ; ---- x-index offset festlegen tranz lda loop1,x ; ---- offset daten der easyflash leseadresse sta getbyt,x ; ---- auch in die einzlbytes leseroutine einfügen dex ; ---- index um eine verringern bpl tranz ; ---- weiter wenn x-index positiv ist lda #$00 ; ---- offset für x-index laden sta index+1 ; ---- index für einzelbyte leseroutine zurücksetzen rts ; ---- und weg ; ---- t&s decoder ---- dcryts lda trsdat2 ; ---- hier kommt der erste t&s wert rein b037c ldx trsdat1 ; ---- hier kommt der zweite t&s wert rein s037f ldy f0580,x ; ---- die dokumentierung das decoders spare ich mir sty a04ea ; ---- hier steht die angefordete diskseite clc adc f0500,x ldy f0540,x beq b037c b038e cmp f0486,y bcc s033e sec sbc f0486,y iny bne b038e s033e sty $fc ; ---- angeforderte track nummer sta $fd ; ---- angeforderte sektor nummer ; ---- decoder für die angeforderte diskseite ---- lda a04ea ; ---- entweder ein wert für das angeforderte d64 oder eine #$00 beq b03bb ; ---- bei #$00 gibt es keine änderung der diskseite cmp #$01 ; ---- wurde diskseite 1 angefordert? bne b03b1 ; ---- wenn nicht, hier weiter lda #$01 ; ---- diskseite 2 wurde angefordert easyflash-rom offset ist bank $01 sta b03bb+1 ; ---- neue diskseite disk1 festlegen jmp b03bb ; ---- weiter mit neue diskseite festlegen b03b1 lda #$13 ; ---- diskseite 2 wurde angefordert easyflash-rom offset ist bank $13 sta b03bb+1 ; ---- neue diskseite disk2 festlegen b03bb lda #$01 ; ---- offset für d64-image im easyflash festlehen sta efbank ; ---- easyflash-rom auf start bank offset zurücksetzen lda #$00 ; ---- startwert um die puffer zurückzusetzen laden sta efhigh ; ---- start offset wiederherstellen sta loop1+1 ; ---- start offset wiederherstellen sta loop1+2 ; ---- start offset wiederherstellen rts ; ---- auf wiedersehen efbank !byte $00 ; ---- easyflash bank byte puffer efhigh !byte $00 ; ---- easyflash high byte puffer eflowb !byte $00 ; ---- easyflash low byte puffer falls nötig loop1 !byte $00,$00,$00 ; ---- puffer für t&s to ram umrechner low byte,high byte,bank byte getbyt !byte $00,$00,$00 ; ---- lädt byte für byte aus dem easyflash-rom a04ea !byte $00 ; ---- puffer für t&s decodierung trsdat1 !byte $00 ; ---- puffer für t&s data 1 trsdat2 !byte $00 ; ---- puffer für t&s data 2 f0486 !byte $15,$15,$15,$15,$15,$15,$15,$15,$15 ; ---- t&s decoder nummer $01-$08 !byte $15,$15,$15,$15,$15,$15,$15,$15,$15 ; ---- t&s decoder nummer $09-$11 !byte $00,$13,$13,$13,$13,$13,$13,$12,$12 ; ---- t&s decoder nummer $21-$1a !byte $12,$12,$12,$12,$11,$11,$11,$11,$11 ; ---- t&s decoder nummer $1b-$23 f0500 !byte $00,$03,$0b,$02,$0d,$0e,$0b,$03,$0c ; ---- t&s decryptor tabelle 1 !byte $07,$02,$0c,$07,$04,$03,$10,$0e,$0e ; ---- t&s decryptor tabelle 1 !byte $06,$00,$0c,$01,$0e,$0a,$04,$11,$06 ; ---- t&s decryptor tabelle 1 !byte $01,$09,$09,$09,$05,$07,$00,$00,$0b ; ---- t&s decryptor tabelle 1 f0540 !byte $01,$01,$08,$11,$11,$15,$16,$17,$17 ; ---- t&s decryptor tabelle 2 !byte $18,$19,$19,$1a,$1b,$1c,$1c,$15,$16 ; ---- t&s decryptor tabelle 2 !byte $17,$18,$18,$19,$19,$1a,$1b,$1b,$1c ; ---- t&s decryptor tabelle 2 !byte $1d,$1d,$1e,$1f,$20,$21,$22,$23,$1d ; ---- t&s decryptor tabelle 2 f0580 !byte $00,$00,$00,$00,$00,$01,$01,$01,$01 ; ---- wert für diskseiten 1 und 2 !byte $01,$01,$01,$01,$01,$01,$01,$02,$02 ; ---- wert für diskseiten 1 und 2 !byte $02,$02,$02,$02,$02,$02,$02,$02,$02 ; ---- wert für diskseiten 1 und 2 !byte $02,$02,$02,$02,$02,$02,$02,$02,$01 ; ---- wert für diskseiten 1 und 2 track !byte $00,$15,$15,$15,$15,$15,$15,$15,$15 ; ---- ram/rom konverter track $01-$08 !byte $15,$15,$15,$15,$15,$15,$15,$15,$15 ; ---- ram/rom konverter track $09-$11 !byte $13,$13,$13,$13,$13,$13,$13,$12,$12 ; ---- ram/rom konverter track $21-$1a !byte $12,$12,$12,$12,$11,$11,$11,$11,$11 ; ---- ram/rom konverter track $1b-$23
Krass das mit der VM, ich habe mich schon gewundert warum das Spiel generell so langsam ist, die Ladezeiten, trotz crt und vor allem die Spielgeschwindigkeit sind schon dicht an der Schmerzgrenze des zumutbaren. Ich habe es trotzdem mal gestern getestet, bin rumgeflogen, auf Planeten gelandet, habe ressourcen abgebaut und konnte bisher keine Fehler finden. Werde es aber noch weiter testen.
Grüße,
A.