online: 2
Rekord: 57

Last update:
2005/04/20

Home
Übergeordnete Seite
Search:
Suche starten
In English, please!

CFX Hacking

Das Format der Programmliste

Die Programmliste enthält keine ProgrammTEXTE, sondern nur die ProgrammHEADER, die jeweils Programmname, Programmmodus, Passwort und Pointer, an dem sich der eigentliche Programmtext befindet, angeben (s.a. Das Format von Programmen).

Die Programmliste selbst verfügt dabei über keinen Header, der deren Größe und Anzahl der Einträge beschreibt, sondern die Größe der Programmliste in Bytes folgt indirekt aus der Pointertabelle im RAM, die ihrerseits auf die Programmliste verweist (siehe Fixe Daten im Adressbereich 0000..7FFF). Denn da die Datenstrukturen, auf die die Pointer der Pointertabelle zeigen, im RAM direkt hintereinander liegen, ist die Größe der Liste gleich der Differenz des Pointers, der auf die Programmliste zeigt (Adresse 041A im RAM) und des darauffolgenden (041C → Die Größe der Programmliste beträgt word(ptr(041C)^) - word(ptr(041A)^) Bytes).

Ein Eintrag der Programmliste ist genau 16 Bytes lang, die Anzahl der Listeneinträge beträgt damit Listengröße shr 4 und ein Header für die Programmliste wird daher nicht benötigt. Listeneinträge in der Programmliste können dabei nicht nur Programme, sondern auch Passwörter sein, denn der Casio CFX belegt für diese einen Extraeintrag (für Programme mit Passwort werden also 2 16B Einträge als ein 32B Header verwendet)!

Die Programmliste hat folgenden Aufbau:

    LISTEPROGRAMMEINTRAGPASSWORTEINTRAG
    Bytes #Inhalt
    00..0FEintrag #0
    10..1FEintrag #1
    20..2FEintrag #2
    30..3F...
    Bytes #Inhalt
    0..7NAME
    8..BDUMMY
    CBASE
    D,EPTR
    FPWD
    Bytes #INHALT
    0..7NAME
    8..EDUMMY
    FEE

Zur Erklärung:

  • Eintrag kann ein Programmeintrag oder ein Passworteintrag, und der erste Eintrag #0 muss immer ein Programmeintrag sein.
  • NAME ist eine Zeichenkette, die den Programmnamen bzw. das Passwort angibt. Durch Manipulation der Backupdatei sind hier auch auf dem Rechner selbst nicht verfügbare Sonderzeichen möglich (z.B. @, $, &, a..z, ...). Auf diese Weise können z.B. auch Programme erzeugt werden, die sich mit dem Taschenrechner im Programmeditor überhaupt nicht öffnen lassen (weil das Passwort nicht eingegeben werden kann). Für NAME sind 8 Bytes reserviert (d.h., maximale Länge = 8 Zeichen), und nicht belegte Bytes (für NAME < 8 Zeichen) werden mit FF aufgefüllt.
  • Das DUMMY Feld ist reserviert, wird in beiden Fällen mit Zerobytes (0) aufgefüllt und hat keine Funktion - es wird vom Casio CFX einfach ignoriert und auch das Laden dieser Felder mit anderen Werten bleibt ohne Wirkung. Jedoch sollte ihnen aus Aufwärtskompatibilitätsgründen nie ein anderer Wert außer 0 zugewiesen werden, da diese Felder bei Weiterentwicklungen des GTR möglicherweise noch Funktionen zugewiesen bekommen.
  • BASE gibt an, ob ein Programm vom Typ BASE (BASE = 01) oder RUN (BASE = 0) ist. Hier wird nur Bit #0 als Flag verwendet, d.h., alle ungeraden Werte geben ein BASE - und alle geraden ein RUN - Programm an. Aus Gründen der Aufwärtskompatibilität sollten jedoch alle anderen Bits immer 0 gesetzt und für BASE nur die Werte 00 und 01 verwendet werden.
  • Das Feld PTR gibt die 16Bit Adresse im RAM an, an der das Programm beginnt. Da Programme auf dem Casio CFX aber im Grow - Down - Format gespeichert sind (dazu siehe Das Format von Programmen) ist das NICHT das erste, sondern das LETZTE zum Programm gehörige im RAM (zeigt also PTR auf X, befindet sich das zweite Programmbyte an Adresse X-1 usw.). Es gibt keinen Zeiger auf das erste Byte eines Programm im RAM, da Programmdateien aber durch ein Byte FF beendet werden (wie die Zeichenketten in der Programmliste), lässt sich das erste Byte finden, indem man vom letzten ausgeht und abwärts nach FF sucht.
  • Das PWD Feld gibt an, ob das Programm über ein Passwort verfügt (10) oder nicht (00). Wenn ein Passwort verlangt ist, folgt dem Programmeintrag ein Passworteintrag anstatt ein weiterer Programmeintrag. Anmerkung: für PWD wird nur Bit #4 als Flag berücksichtigt, d.h., auch z.B. die Werte 9C, D3 und B7 würden ein Passwort bzw. 80, CF oder 01 kein Passwort angeben. Aus Aufwärtskompatibilitätsgründen sollten jedoch wieder die anderen Bits immer 0 gesetzt, also für PWD nur die Werte 00 und 10 verwendet werden
  • EE ist das abschließende Byte eines Passworteintrages (und ist nicht der Name des Feldes, sondern ein hexadezimaler Wert)
Ich habe auch versucht, einem Programm mehr als ein Passwort zuzuweisen, indem ich das Letzte Byte eines Passworteintrages anstatt auf EE auf 01 festgelegt und einen zweiten Passworteintrag dahinter gesetzt habe. Dieses wurde aber vom Rechner komplett ignoriert: der Programmeditor hat trotzdem nur das erste Passwort abgefragt, und das zweite wurde auch nicht als Programm angezeigt.

Die Programmliste arbeitet damit nach folgendem Algorithmus:

  • Der erste Programmeintrag der Liste ist immer ein Programmeintrag
  • Verfügt ein Programm über ein Passwort, folgt dem Programmeintrag ein Passworteintrag, ansonsten der nächste Programmeintrag
  • Ist das letzte Byte eines Passworteintrages oder eines Eintrages, der ignoriert wird, EE, folgt dem Passworteintrag / dem ignorierten Eintrag ein weiterer Programmeintrag, ansonsten (letztes Byte != EE) ein Eintrag, der ignoriert wird

Beispiel:

Wir wollen per Hand eine Programmliste mit folgendem Inhalt erstellen:
  • 1. Programm: Hello (RUN, kein Passwort) an Adresse 7FFE im RAM
  • 2. Programm: CVTBDH (BASE mit Passwort 12345) an Adresse 7F39 im RAM
  • 3. Programm: BinToHex (BASE ohne Passwort) an Adresse 7F0C im RAM
  • 4. Programm: Look@Me! (RUN mit Passwort @%&HeHe!, dass man im Rechner nicht eingeben kann) an Adresse 7ED7
  • 5. Programm: RACE (RUN ohne Password) an Adresse 7B62


  • Bytes #Inhalt
    00..0F"Hello",   FF,FF,FF,00,00,00,00,00,FE,7F,00
    01..1F"CVTBDH",     FF,FF,00,00,00,00,01,39,7F,10
    02..2F"12345",   FF,FF,FF,00,00,00,00,00,00,00,EE
    03..3F"BinToHex",         00,00,00,00,01,0C,7F,00
    04..4F"Look@Me!",         00,00,00,00,00,D7,7E,10
    05..5F"@%&HeHe!",         00,00,00,00,00,00,00,EE
    06..6F"RACE", FF,FF,FF,FF,00,00,00,00,00,62,7B,00

Copyright (C) 2004 by Marco Kaufmann