Hallo.
Folgendes: Ich arbeite gerade an einem Reverse-Engineering projekt, um die alten Textadventures von Magnetic Scrolls auf moderner Hardware spielen zu koennen.
Die Homepage findet ihr hier: http://www.dettus.net/dMagnetic
Mittlerweile bin ich in der Lage, aus einem .DSK-Image auf das CPM-Filesystem zuzugreifen und von dort saemtliche Dateien zu extrahieren. Soweit so gut.
Wie ihr an meinem Profilbild erkennen koennt bin ich sogar schon so weit dass ich die Bilder anzeigen kann.
Mein Problem ist jetzt folgendes:
Um fuer alle Plattformen verfuegbar zu sein, wurden solche Spiele damals nicht direkt fuer C64/Amiga/PC/Cray etc geschrieben. Stattdessen gab es eine viruelle Maschine, und Bytecode, der dann interpretiert wurde. So aehnlich ist es ja auch mit Java heutzutage.
Ich bin jetzt auf der Suche nach dem Bytecode. Der ist auf irgendeine Art und Weise verschluesselt/gepackt worden.
Meine Z80-Kentnisse reichen aus, um ein wenig disassemblierten Code zu lesen. Allerdings weiss ich nicht, wie ich rausfinde, wo eine Datei geoeffnet wird und Daten von der Diskette gelesen werden.
Kann mir da jemand einen Tipp geben?
Thomas
Moin Thomas,
was mir so auf Anhieb einfallen würde, wäre GAC.
https://www.cpc-power.com/index.php?page=detail&num=4943
Allerdings bin ich auch absolut kein "Adventure" Spieler...
GAC gab es aber, meines Wissens, auf diversen Systemen.
Auch nicht schlecht.
Aber ich will kein Adventure schreiben, ich moechte es nur ausfuehren.
Da fehlt mir noch ein wenig Systemverstaendnis fuer die CPC-Kisten, um einige Zusammenhaenge zu begreifen.
Also, ich bin gerade einen Schritt weitergekommen.
Anscheinend gibt es den Syscalls an Adresse BC77, der eine Datei oeffnet. Der Dateiname liegt dann an (HL).
Leider, wenn ich in WinAPE einen Breakpoint darauf setze, wird dieser nicht bei jedem Diskettenzugriff getroffen.
Gibt es noch eine andere Moeglichkeit, auf dem CPC Daten von der Diskette zu lesen?
Okay... was ich bis jetzt gefunden habe ist das hier:
https://www.cpcwiki.eu/index.php/Programming:Reading_a_sector_from_a_disc
Ich habe schon gemerkt, dass bei dem Spiel, welches ich reverse engineere, anscheinend die Lesezugriffe am BIOS vorbei getaegigt werden.
Ansonsten haette ein Breakpoint auf die entsprechende Funktion getriggert.
Anscheinend ist es wohl so, dass beim Amstrad einige RST Vektoren ueberschrieben werden koennen?
Das geht wohl so:
1. Man laedt die "Nummer"(keine Ahnung wie die Nomenklatur genau ist... sorry) in den speicher. Und legt die Adresse auf diese "Nummer" in das Register HL.
2. Man fuehrt einen CALL BCD4 aus
3. Man erhaelt eine Adresse im Register HL zurueck.
4. Man speichert die drei bytes ab diesem Register an einer anderen Stelle im Speicher, sagen wir 1337.
5. Man fuehrt anschliessend irgendwann spaeter ein RST 3 1337 aus.
Das ruft dann direkt den entsprechenden Interrupt zum Sektorenlesen aus.
Soweit so gut....
NUR: Wo sind diese "Nummern" dokumentiert?
Im Disassembler habe ich folgendes gesehen:
l0040h:
ld a,040h ;0040 3e 40 > @
ld (la127h+1),a ;0042 32 28 a1 2 ( .
xor a ;0045 af .
ld (l0df7h),a ;0046 32 f7 0d 2 . .
l0049h:
ld (l0538h),a ;0049 32 38 05 2 8 .
ld hl,l0e04h ;004c 21 04 0e ! . .
ld (l0534h),hl ;004f 22 34 05 " 4 .
call sub_bb4eh ;0052 cd 4e bb . N .
xor a ;0055 af .
call 0bd5bh ;0056 cd 5b bd . [ .
ld a,0c3h ;0059 3e c3 > .
ld (l0030h),a ;005b 32 30 00 2 0 .
ld hl,l093ah ;005e 21 3a 09 ! : .
ld (l0030h+1),hl ;0061 22 31 00 " 1 .
l0064h:
jr l008eh ;0064 18 28 . (
ld hl,l0df8h ;0066 21 f8 0d ! . .
call sub_bcd4h ;0069 cd d4 bc . . .
ld (l0e06h),hl ;006c 22 06 0e " . .
ld hl,l0e08h ;006f 21 08 0e ! . .
ld (hl),c ;0072 71 q
ld c,0c1h ;0073 0e c1 . .
ld b,07fh ;0075 06 7f . ^?
di ;0077 f3 .
out (c),c ;0078 ed 49 . I
ld de,lfe00h ;007a 11 00 fe . . .
ld hl,l1130h ;007d 21 30 11 ! 0 .
was machen diese beiden anderen obskuren funktionen bb4e und bd5b?
Weiterhin: In dem Beispiel oben habe ich einen rst 3 gesehen, in meinem Disassemblierten code taucht aber nirgendwo ein RST 3 auf. Was hat es damit auf sich?
Die System Calls sind im Systembuch beschrieben, hier ist irgendwo ein Thread in dem man sich sehr viel Dokum zum CPC als PDF herunterladen kann.
Um Dateien von DSKs zu extrahieren eignet sich z.B. CPCDiskXP oder die Tools des JavaCPC Emulator.
Hallo.
Vielen lieben dank.
Mittlerweile habe ich es hingekriegt und meine Erkenntnisse hier dokumentiert:
https://www.dettus.net/dMagnetic/dMagnetic_datastructures.pdf (https://www.dettus.net/dMagnetic/dMagnetic_datastructures.pdf)
Ich bin sogar in der Lage, selbst Dateien von den DSK images zu extrahieren. Die Dokumentationen, die ich hier im Wiki gefunden habe waren da sehr hilfreich. Vielen vielen Dank dafuer!
:jubelaola: