Marco's Homepage











online: 1
Rekord: 57

Last update:
2005/04/20

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

CFX Hacking

Fixe Daten im Adressbereich 0000..7FFF


Die Daten sind im RAM des Casio CFX wie folgt strukturiert:

Adressbereich 0000..03FF (Stack und Initialisierungsdaten):

ZX933
AdresseInhaltErklärung
0000..02BFStack?wahrscheinlich 704B Stack der Casio CFX CPU
02C0..02D0 17B InitialisierungsdatenS.u.
02D1..03FF Stack? wahrscheinlich 303B Hilfsstack des Casio Basic Interpreters

GY359
AdresseInhaltErklärung
0000..0310Stack?wahrscheinlich 785B Stack der Casio CFX CPU
0311..0321 17B InitialisierungsdatenS.u.
0322..03FF Stack? wahrscheinlich 222B Hilfsstack des Casio Basic Interpreters

ZX933 / GY359 Initialisierungsdaten
AdresseInhaltErklärung
02C0/0311 Master Kontrast Master Kontrast, der im Menü nicht einstellbar ist. Nur Bits 0..5 verwendet, Bits 6 und 7 werden ausgeblendet → Wertebereich 00..3F (= 64 Abstufungen) mit 00 = hellste und 3F = dunkelste Einstellung. Standardeinstellung ist 2F und lässt sich im Kontrastmenü des GTR nicht verändern, nur durch Manipulation des RAM Images
02C1/0312 Kontrast Kontrast (im Menü einstellbar). Wertebereich 01..10 (= 16 Abstufungen) mit 01 = dunkelste und 10 = hellste Einstellung. Der Kontrast wird für Werte über 10 nicht mehr heller, es folgt aber auch kein Wrap - Around wie beim Master Kontrast. Standardeinstellung ist 07.
02C2/0313 Orange Kontrast Farbeinstellungen für Orange, Blau und Grün, im Kontrastmenü einstellbar im Wertebereich 01..40 (= 64 Abstufungen) mit 01 = hellste und 40 = dunkelste Einstellung. Der Kontrast wird für Werte über 40 nicht mehr dunkler, es folgt aber auch kein Wrap - Around wie beim Master Kontrast. Standardeinstellungen sind: Orange = 21, Blau = 34 und Grün = 40.
02C3/0314 Blau Kontrast
02C4/0315 Grün Kontrast
02C5..02D0/
0316..0312
Kennung:
55,AA,5A,A5,01,23,
45,67,89,AB,CD,EF
Dient zur Markierung als gültiges Speicherimage, ansonsten erfüllen diese Daten aber keinen Zweck. Manche Rechner führen einen Reset durch, wenn die Daten verändert werden, auf manchen Rechnern bewirkt dies aber gar nichts und der Rechner funktioniert trotzdem einwandfrei. Es ist möglich, dass diese Rechner die Daten nach der Übertragung eines Backups selbst wieder herstellen (das habe ich noch nicht überprüft).


Adressbereich 0400..063F/0647 (Grow - Up - Pointertabelle):

Die Grow - Up - und die Grow - Down - Pointertabelle sind die wichtigsten fixen Daten im RAM, denn die gesamte Speicherverwaltung des Casio CFX ist dynamisch und basiert auf diesen Pointertabellen. Grafikspeicher, Matrizen, Variablen, Programme usw., sogar die Programmliste, haben im RAM des Rechners keine feste Adresse, sondern ihnen wird eine Adresse jeweils durch eine Pointertabelle zugewiesen.

Die Pointertabellen vergeben dabei Adressen im noch freien Teil des RAMs, der sowohl für ZX933 als auch für GY359 Systeme an 0832 beginnt und an 7FFE (bzw. FFFE für 64KB RAM) endet, und damit 30669 Bytes beträgt (warum das System nach einem Reset allerdings 8 Bytes mehr, nämlich 30677 Bytes als frei anzeigt, ist unklar; diese 8 Bytes lassen sich von Programmen jedoch nicht mehr belegen, sie sind also nicht wirklich "frei", sondern lediglich im RUN Menü).

Grow - up - und Grow - Down - Tabelle werden deshalb unterschieden, weil die Grow - up - Tabelle den freien Speicher blockweise von unten nach oben vergibt (d.h., beginnend an Adresse 0832), die Grow - Down - Tabelle von oben nach unten (also beginnend an 7FFE). Ist zwischen den Grow - up und den Grow - Down Speicherblöcken kein Speicher mehr frei, ist der RAM voll. S.a. Memory Management des Casio CFX

Mein Casio CFX 9850G, August 1998 - Juli 2003, verstorben an Schaltkreisversagen, nachdem
Batteriesäure die Hauptplatine verätzt hat

Die Grow - Up Pointertabelle ist eine lineare Liste von 16 Bit (2B) Pointern und unterscheidet sich bei den Systemen ZX933 und GY359: während die Tabelle beim ZX933 bis zur Adresse 063F reicht und 288 Einträge fasst, reicht die GY359 Tabelle bis 0647 und ist damit 4 Einträge länger.

Da es meinen alten Casio CFX 9850G während der Versuche leider entschärft hat, kann ich die Grow - Up - Pointertabelle des ZX933 nicht angeben, aber sie ist in großen Teilen wahrscheinlich sowieso deckungsgleich mit der des GY359, nur dass eben sechs Einträge an irgend einer Stelle fehlen.

Bei den Pointertabellen ist die Besonderheit zu beachten, dass Pointer auf nicht existierende Puffer nicht nil sind, sondern dass sie gleich dem folgenden Eintrag in der Tabelle sind (weil sich die Puffergröße aus der Differenz eines Pointers und dem folgenden Pointer ergibt, und Puffergröße 0 bedeutet, dass kein Speicher reserviert ist; siehe Kapitel Speicherverwaltung des Casio CFX, wo das Memorymanagement des Rechners mit Pointertabellen ausführlich beschrieben ist).

GY359
Adresse16 Bit Pointer zuErklärung
0400 RAM Header Der RAM Header gehört zwar eigentlich zu den fixen Daten, da er sich niemals an einer anderen Adresse als 0800 befindet, der erste Eintrag der Pointertabelle zeigt jedoch trotzdem auf diesen.
0404 Grafikpuffer Zeigt auf den 4KB Grafikpuffer, der im PICT Format gespeichert ist und die aktuellen Bilddaten des Grafikmodus enthält.
040E Picture 1 Diese Einträge zeigen auf die Pictures 1..6, die jeweils im PICT Format gespeichert sind.
0410 Picture 2
0412 Picture 3
0414 Picture 4
0416 Picture 5
0418 Picture 6
041A Programmliste Zeigt auf die Programmliste, die die Header der Casio Basic Programme speichert (siehe Das Format der Programmliste).
041E Var A Die Einträge zeigen auf die Variablen, die im FP Format gespeichert sind.
0420 Var B
0422 Var C
0424 Var D
0426 Var E
0428 Var F
042A Var G
042C Var H
042E Var I
0430 Var J
0432 Var K
0434 Var L
0436 Var M
0438 Var N
043A Var O
043C Var P
043E Var Q
0440 Var R
0442 Var S
0444 Var T
0446 Var U
0448 Var V
044A Var W
044C Var X
044E Var Y
0450 Var Z
0458 List 1 Diese Einträge zeigen auf die Listen 1..6. Siehe Kapitel Das Format von Listen und Matrizen.
045A List 2
045C List 3
045E List 4
0460 List 5
0462 List 6
05A2 Mat A Diese Einträge zeigen auf die Matrizen A..Z und ANS. Siehe Kapitel Das Format von Listen und Matrizen.

Matrizen verfügen im Gegensatz zu Listen außerdem über einen Header, siehe Adressbereich 06F0/06FC..7FF (Zusatzdaten)
05A4 Mat B
05A6 Mat C
05A8 Mat D
05AA Mat E
05AC Mat F
05AE Mat G
05B0 Mat H
05B2 Mat I
05B4 Mat J
05B6 Mat K
05B8 Mat L
05BA Mat M
05BC Mat N
05BE Mat O
05C0 Mat P
05C2 Mat Q
05C4 Mat R
05C6 Mat S
05C8 Mat T
05CA Mat U
05CC Mat V
05CE Mat W
05D0 Mat X
05D2 Mat Y
05D4 Mat Z
05D6 Mat ANS

Adressbereich 0640..06EF / 0648..06FB (Grow - Down - Pointertabelle)

Die Grow - Down - Pointertabelle adressiert Daten, die allesamt im Programmformat gespeichert sind. Das betrifft allerdings nicht die Casio Basic Programme (denn diese sind zwar ebenfalls im Programmformat gespeichert, werden aber durch die Programmliste adressiert), sondern z.B. die Funktionsvariablen, Y1..20, Rekursionsformeln, die Funktionsspeicher f1..f6 usw.

Hier gelten wieder einige Unterschiede zwischen ZX933 - und GY359 - Systemen: Während ZX933 Tabelleneinträge auf das letzte zum Programm gehörige Byte im RAM Zeigen, zeigen GY359 Tabelleneinträge um 1 Byte höher, also auf das erste nicht mehr zum Programm gehörige im Speicher.

Außerdem beinhaltet die ZX933 Tabelle 44 Einträge, während die GY359 Tabelle einen Eintrag mehr (45 Eitnräge) enthält. Die Tabelleneinträge sind 4B lang haben sowohl für ZX933 als auch für GY359 folgendes Format:

ZX933 / GY359 Grow - Down - Pointertabelleneintrag
Bytes #Inhalt
0,116 Bit Grow - Down - Pointer
2,3Standardmäßig 0 gesetzt, verändert sich aber beim Löschen und Zuweisen von Grow - down - Speicher. Wahrscheinlich intern zum Speichermanagement als Hilfsvariable verwendet.

GY359
Adresse16 Bit Pointer zuErklärung
0648 Letztes Byte im RAM Für 32KB Systeme 7FFF, für 64KB FFFF.
064C Y1 Data Diese Einträge zeigen auf die Funktionen Y1..Y20 aus dem Grafikmenü, die im Programmformat gespeichert sind.
0650 Y2 Data
0654 Y3 Data
0658 Y4 Data
065C Y5 Data
0660 Y6 Data
0664 Y7 Data
0668 Y8 Data
066C Y9 Data
0670 Y10 Data
0674 Y11 Data
0678 Y12 Data
067C Y13 Data
0680 Y14 Data
0684 Y15 Data
0688 Y16 Data
068C Y17 Data
0690 Y18 Data
0694 Y19 Data
0698 Y20 Data
06B4 f1 Data Diese Einträge zeigen auf die Funktionsspeicher f1..f6, die im Programmformat gespeichert sind.
06B8 f2 Data
06BC f3 Data
06C0 f4 Data
06C4 f5 Data
06C8 f6 Data

Adressbereich 06F0/06FC..07FF (Zusatzdaten)

Hier werden einige Zusatzdaten mit fixen Adressen, z.B. Matrizenheader, gespeichert.

GY359
AdresseInhaltErklärung
06FC..06FF unbekannt 4 noch nicht untersuchte Bytes
0700 Dim Mat A Header der Matrizen A..Z. Obwohl das Format von Matrizen dem von Listen sehr ähnlich ist (eine Matrix ist eine Liste jeweils gleich großer Listen), benötigen Matrizen im Gegensatz zu regulären Listen einen Header, der die Matrixdimensionen (Breite, Höhe) angibt, da diese allein aus der Größe der Matrix nicht berechenbar sind (eine 1KB Matrix könnte so z.B. 1x100, 2x50, 4x25, 5x20 usw. sein).

Matrizenheader sind immer 16 Bit, wobei das erste Byte die Breite und das zweite die Höhe der Matrix angibt. Die Header beinhalten ausschließlich die Dimensionen einer Matrix, nicht deren Adresse (die Matrixadressen finden sich in der Grow - Up - Pointertabelle).
0702 Dim Mat B
0704 Dim Mat C
0706 Dim Mat D
0708 Dim Mat E
070A Dim Mat F
070C Dim Mat G
070E Dim Mat H
0710 Dim Mat I
0712 Dim Mat J
0714 Dim Mat K
0716 Dim Mat L
0718 Dim Mat M
071A Dim Mat N
071C Dim Mat O
071E Dim Mat P
0720 Dim Mat Q
0722 Dim Mat R
0724 Dim Mat S
0726 Dim Mat T
0728 Dim Mat U
072A Dim Mat V
072C Dim Mat W
072E Dim Mat X
0730 Dim Mat Y
0732 Dim Mat Z
0734 Dim Mat ANS
0736..07FF unbekannt 202 noch nicht untersuchte Bytes

Adressbereich 0800..0831 (RAM Header)

Der 50B RAM Header (der sich NICHT am Anfang des RAMs, sondern an Adresse 2K befindet) gibt die Gültigkeit des RAM Images für das jeweilige System an und hat folgendes Format:

ZX933 / GY359
AdresseInhaltErklärung
0800..080F "MEM",00,"BU",
Size,"Backup"
Kennung des RAM Images; signalisiert das auf dem GTR ein gültiges RAM Image vorhanden ist.

Size ist ein umgekehrter 32 Bit Wert (d.h., das niederwertigste Byte ist an der höchsten Adresse gespeichert und umgekehrt), der die Kapazität des Images angibt. Diese ist nicht gleich der RAM Größe (32KB = 32768B), sondern liegt zwei Bytes darüber (32KB+2 = 32770). Warum das so ist ist unbekannt, jedenfalls ist es der selbe Wert, den Backupdateien hinter der Deklaration Capacity angeben (siehe Die optimale Art den Casio CFX zu hacken, wo ein Ausschnitt einer Backup - Datei abgebildet ist).
0810..0820 FF,FF,FF,FF,FF,FF,FF,FF,
FF,FF,type,FF,FF
Signalisiert die Systemversion des GTR, für die das Image ausgelegt ist (type = "ZX933" für ZX933 und "GY359" für GY359)
0821..082E 00,10,00,00,00,00,
FF,FF,FF,FF,FF,FF,FF,FF
Bedeutung unbekannt, aber diese Daten stimmen genau mit den hinter der Option - Deklaration in der Backupdatei angegebenen überein (s.a. Die optimale Art den Casio CFX zu hacken, wo ein Ausschnitt einer Backup - Datei abgebildet ist).

Die Veränderung dieser Daten erzielte bei mir zwar keinen Effekt, es ist jedoch möglich, dass bestimmte Option - Werte undokumentierte oder versteckte Sondereinstellungen oder Funktionen des Taschenrechners bewirken. Außerdem verändern sich einige der Werte während der Laufzeit unter bestimmten Voraussetzungen.
082F..0831 FF,0F,00 3 noch nicht untersuchte Bytes.

Adressbereich 0832..7FFE/FFFE (freier Speicher)

Dies ist der freie Teil des RAMs (30669B für 32KB Systeme bzw. 63437B für 64KB), in dem ALLE dynamischen Daten (einschließlich der Casio Basic Programmliste) gespeichert sind.

Die dynamischen Daten werden durch die Pointertabellen adressiert, und wie die bei den Pointertabellen selbst kann auch hier eine Unterteilung in Grow - Up - und Grow - Down - Teil getroffen werden: die Grow - Up Tabelle vergibt Speicherblöcke, die sich vom Anfang des freien Speichers her (Adresse 832) nach oben hin aufbauen, die Gesamtheit dieser Blöcke ist dann der Grow - Up - Speicher. Die Grow - Down - Tabelle Speicherblöcke, die sich vom Ende her (7FFE/FFFE) nach unten hin aufbauen (Grow - Down - Speicher).

Siehe dazu Kapitel Grow - Up - und Grow - Down - Pointertabelle, wo alle in diesem Speicherbereich verwalteten Daten und Datentypen aufgelistet sind, sowie Kapitel Die Speicherverwaltung des Casio CFX, das die Verwaltung des freien Speichers ausführlich beschreibt.

Adresse 7FFF/FFFF (letztes Byte im RAM)

Das letzte Byte im RAM (für 32KB Systeme an Adresse 7FFF, für 64KB an FFFF) wird nicht mehr als freier Speicher verwendet, sondern als eine Art Markierung des RAM Endes.

Für ZX933 Systeme lautet es immer AA (10101010b), für GY359 55 (01010101b). Auffällig ist, dass diese Markierung in beiden Fällen ein Muster von abwechselnden Bits 0 und 1 ist, wie es z.B. auch bei diversen PC Programmen verwendet wird, um die Funktionsfähigkeit des RAM zu überprüfen (dieser wird komplett mit 55/AA beschrieben und wieder ausgelesen).

Diese Markierung wird wahrscheinlich dazu verwendet, die Gültigkeit des RAM Images zu überprüfen: der erste Eintrag der Grow - Down - Pointertabelle zeigt normalerweise auf das letzte Byte des RAM, aber lautet dieses nicht 55 oder AA, zeigt der Eintrag nicht auf das RAM Ende, sondern an eine andere Stelle oder ggf. schon außerhalb des RAMs (ein Byte, das aus einer nicht existierenden Speicherzelle ausgelesen wird, wäre wahrscheinlich 00000000b oder 11111111b, aber kein Muster sich abwechselnder Bits), und das Image ist dann fehlerhaft.

"White Spots" in den Pointertabellen

Ich habe erst 67 von insgesamt 292 Einträgen der Grow - Up - bzw. 27 von 45 Einträgen der Grow - Down - Tabelle erkundet. Die bereits bekannten Einträge sind zwar auch die wichtigsten, aber dennoch sind noch 225 Einträge der Grow - Up und 18 Einträge der Grow - Down Tabelle unbekannt.

Bei den noch unbekannten Einträgen der Grow - Up - Tabelle handelt es sich um:

  • Weitere Variablen, wie r, θ, Factor, F Start, PlyResult usw.
  • möglicherweise auch Einträge, die nicht verwendet werden und reserviert sind,

und bei den unbekannten Einträgen der Grow - Down - Tabelle kann es sich z.B. um

  • Alle Daten, für die das Programmformat günstiger ist, z.B. Rekrusionsformeln (an+1= usw.)
  • evtl. nicht benutzte, reservierte Einträge

handeln.

Es ist ziemlich aufwendig herauszufinden, welcher Pointertabelleneintrag auf welche Daten zeigt: für jeden Versuchsdurchgang muss der GTR resettet und es müssen einige wenige Daten (z.B. bestimmte Variablen, deren Index in der Pointertabelle noch unbekannt ist) verändert werden. Anschließend wird ein Backup zum PC überspielt - und das entsprechende RAM Image im Hexeditor analysiert. Hier muss dann die Adresse lokalisiert, an der sich der entsprechende Datensatz befindet, und der Pointertabelleneintrag gesucht werden, an dem sich die entsprechenden Adresse befindet. Tauchen dabei außerdem neue, unbekannte Datenstrukturen auf, die in der Memory Map noch nicht beschrieben wurden, muss deren Aufbau zusätzlich noch untersucht werden.

Die bereits gewonnen Informationen - fixe Daten im RAM, die wichtigsten Pointertabelleneinträge und die meisten Datenstrukturen (wie das FP - und das PICT - Format) sind bekannt - reichen aus, um die interne Arbeitsweise des Casio CFX zu verstehen. Einige Fragen sind jedoch noch offen, z.B. was die noch unbekannten Pointertabelleneinträge angeht oder die Unterschiede, die für alle nicht - ZX933 / GY359 - Systeme gelten (da gibt es z.B. noch ZX944 u.v.m.).

Ich habe allerdings nicht vor, das Analysieren von RAM Images noch weiter zu betreiben. Wer das aber möchte kann das gerne tun, natürlich nur unter der Voraussetzung, dass er mich per Mail dann mal über seine Ergebnisse informiert .

Folgende Einträge der Grow - Up - Tabelle sind noch unbekannt:

    Adresseunbekannte Einträge
    04021
    0406..040D4
    041C1
    0452..04573
    0464..05A1159
    05E2..064751

und folgende der Grow - Down - Tabelle:

    Adresseunbekannte Einträge
    069C..06B46
    06CC..06FB12

Copyright (C) 2004 by Marco Kaufmann