Autor Thema: Reverse-Engineering Problem: Wie laedt man beim Z80 Assembler Dateien?  (Gelesen 145 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline dettus

  • Schreibgeschützter
  • *
  • Beiträge: 13
  • Liked: 3
  • Karma: +2/-0
    • dettus.net
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
Computer science is not about using a computer. It is about unleashing its power.

Online Devilmarkus

  • Administrator
  • CPC 464+
  • *****
  • Beiträge: 1101
  • Liked: 357
  • Karma: +38/-0
Re: Reverse-Engineering Problem: Wie laedt man beim Z80 Assembler Dateien?
« Antwort #1 am: 24. Oktober 2020, 11:07:17 »
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.
http://cpcwiki.de
Dein Deutsches CPCWiki!

Offline dettus

  • Schreibgeschützter
  • *
  • Beiträge: 13
  • Liked: 3
  • Karma: +2/-0
    • dettus.net
Re: Reverse-Engineering Problem: Wie laedt man beim Z80 Assembler Dateien?
« Antwort #2 am: 24. Oktober 2020, 11:36:32 »
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.

Computer science is not about using a computer. It is about unleashing its power.

Offline dettus

  • Schreibgeschützter
  • *
  • Beiträge: 13
  • Liked: 3
  • Karma: +2/-0
    • dettus.net
Re: Reverse-Engineering Problem: Wie laedt man beim Z80 Assembler Dateien?
« Antwort #3 am: 24. Oktober 2020, 11:48:03 »
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?
 
Computer science is not about using a computer. It is about unleashing its power.

Offline dettus

  • Schreibgeschützter
  • *
  • Beiträge: 13
  • Liked: 3
  • Karma: +2/-0
    • dettus.net
Re: Reverse-Engineering Problem: Wie laedt man beim Z80 Assembler Dateien?
« Antwort #4 am: 24. Oktober 2020, 22:05:36 »
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?
Computer science is not about using a computer. It is about unleashing its power.

Offline TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 3219
  • Liked: 758
  • Karma: +39/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: Reverse-Engineering Problem: Wie laedt man beim Z80 Assembler Dateien?
« Antwort #5 am: 25. Oktober 2020, 18:19:33 »
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.
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 24.11.2020)
http://futureos.cpcwiki.de/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 28.08.2019)

Offline dettus

  • Schreibgeschützter
  • *
  • Beiträge: 13
  • Liked: 3
  • Karma: +2/-0
    • dettus.net
Re: Reverse-Engineering Problem: Wie laedt man beim Z80 Assembler Dateien?
« Antwort #6 am: 31. Oktober 2020, 15:13:30 »
Hallo.

Vielen lieben dank.
Mittlerweile habe ich es hingekriegt und meine Erkenntnisse hier dokumentiert:

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!
Computer science is not about using a computer. It is about unleashing its power.

Offline TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 3219
  • Liked: 758
  • Karma: +39/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: Reverse-Engineering Problem: Wie laedt man beim Z80 Assembler Dateien?
« Antwort #7 am: 03. November 2020, 15:21:51 »
 :jubelaola:
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 24.11.2020)
http://futureos.cpcwiki.de/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 28.08.2019)