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
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.
...irgendwie scheint das Programm nicht vollständig zu sein, es bricht mit DATA exhausted in 1390 ab.
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?).
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.
Wenn Du das Programm startest wird der Maschinencode ab &8000 im Speicher abgelegt und da kannst Du es einsehen.
Viel Erfolg,
Mr. AMS
Am besten mit MAXAM mal reinschauen :-)
Maxam gibt's auch auf Diskette, falls keine ROM Box zur Hand ist.
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!