Schneider / Amstrad CPC Forum

Amstrad / Schneider CPC => Programmierung => Topic started by: Thor on 01. May 2018, 11:27:38

Title: DATA Block disassemblieren
Post by: Thor on 01. May 2018, 11:27:38
Hallo,
um Maschinencode in einem Basic Programm zu verwenden, kann der Inhalt als Hexacode direkt in den RAM gepoket werden. Das Verfahren wird im Buch "Das Maschinensprachebuch zum CPC" von Dullin/Strassenburg erläutert.

Anscheinend kann man das auch anders machen. In einer englischen Zeitschrift wird ein Programm zum Anzeigen von Fraktalen vorgestellt. Dort ist der DATA Block nicht als kommagetrennter Hexacode, sondern als reiner Buchstaben-Spaghetticode angegeben.

Wie kann ich den assemblierten Code wieder aus dem RAM auslesen? JavaCPC hat unter 'Hilfe' den 'Debugger'. Aber ich bin mir nicht sicher, wie ich den gepoketen Code dort herauslesen kann.

Sorry für die blöde Frage, bin noch recht neu in der Materie

Title: Re: DATA Block disassemblieren
Post by: HAL6128 on 01. May 2018, 23:32:44
Jedes Zeichen entspricht einen einfachen ASCII-Code, der als Nummer / Zahl in den RAM gepokt wird. Einfach mal eintippen, in den RAM laden und mit Maxam, WinApe oder natürlich den Debugger im JavaCPC (die entsprechende Speicherstelle) zu disassemblieren. Bei der Größe sollte es kein allzu großes Problem sein, das Programm zu lesen.
Title: Re: DATA Block disassemblieren
Post by: HAL6128 on 01. May 2018, 23:41:42
...irgendwie scheint das Programm nicht vollständig zu sein, es bricht mit DATA exhausted in 1390 ab.
Title: Re: DATA Block disassemblieren
Post by: Thor on 02. May 2018, 06:05:55
Hallo, habe das komplette Programm angehängt. Die erste Version war schon auf das Entscheidende reduziert. Aber das volle Programm sollte auf jeden Fall laufen.

Im RAM sind die Assemblerbefehle in Hexazahlen codiert. So wird zum Beispiel aus:
LD A,10
LD (&B289),A
RET
==> DATA &3E,10,&32,&89,&C9

Im Gegensatz dazu hat eine DATA Zeile in dem anderen Programm den Aufbau:
==> DATA BvX>C;CI]JvH>u=>CSCI[C[\=EKBq

Wie wird dieser ASCII Code nun in Hexacode umgewandelt? Ein ASCII Zeichen hat 8 Bit. Die ersten 32 Zeichen sind Steuerzeichen und lassen sich nicht als Buchstabe wiedergeben. Der Bereich 127 bis 255 sind Symbole, die in dem Data Block nicht auftauchen. Sind also 96 oder 16x3 Kombinationsmöglichkeiten. Man kann also 3 mal jeweils eine Hexazahl (1,2,3,4,5,6,7,8,9,10,A,B,C,D,E,F) in einem Buchstaben verschlüsseln. Dabei ist mir noch nicht klar, wie die 0 (Null) verschlüsselt wird und warum in dem ganzen Block keine einzige Zahl vorkommt (Zufall?).
Title: Re: DATA Block disassemblieren
Post by: HAL6128 on 02. May 2018, 09:38:09
Da hat sich der Autor ein Verschlüsselungsverfahren ausgedacht. Er liest die komplette Zeile als String ein, unterteilt diese in jeweils Dreier-Blöcke und rechnet die einzelnen Buchstaben nach einem festen Algorithmus für LSB und MSB um. Zumindest scheint das so auf den ersten Blick so.
Title: Re: DATA Block disassemblieren
Post by: almasys on 02. May 2018, 18:50:05
Wenn Du das Programm startest wird der Maschinencode ab &8000 im Speicher abgelegt und da kannst Du es einsehen.

Viel Erfolg,
Mr. AMS
Title: Re: DATA Block disassemblieren
Post by: TFM on 03. May 2018, 17:44:10
Am besten mit MAXAM mal reinschauen :-)

Maxam gibt's auch auf Diskette, falls keine ROM Box zur Hand ist.
Title: Re: DATA Block disassemblieren
Post by: Thor on 03. May 2018, 21:22:48
Quote from: HAL6128 on 02. May 2018, 09:38:09
Da hat sich der Autor ein Verschlüsselungsverfahren ausgedacht. Er liest die komplette Zeile als String ein, unterteilt diese in jeweils Dreier-Blöcke

Die Mnemonics werden üblicherweise in 2 Nibble bzw. 2 Hexazahlen p0 und p1 umgewandelt und dann gepoket. Deren Binärdarstellung wird hier in 3 Teile c(1), c(2) und c(3) aufgeteilt und als entsprechendes ASCII-Zeichen interpretiert.

            p0                          p1
  _ _ _ _/ \_ _ _ _     _ _ _ _ /\ _ _ _
/                         \  /                        \
1 1 1 1       1 1 1 1   1 1    1 1 1 1  1 1
  c(1)        \_____  ____/         c(3)
                          \/
                         c(2)

Wobei c(1) ASCII 59-74 (16 Zeichen) und c(2) und c(3) ASCII 59-122 (63 Zeichen) entsprechen.

Dadurch werden p0 und p1 mit insgesamt 4 Stellen (+ einem Komma zur Trennung) in nur 3 Buchstaben (ohne ein notwendiges Trennungszeichen)  umgewandelt. Das ist dann wohl eine Art primitiver Komprimierung von Maschinencode!