online: 1
Rekord: 57

Last update:
2005/04/20

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

CFX Hacking

Das Programmformat

Im Programmformat sind generell alle Daten, die Terme oder Anweisungen darstellen, die also Programme oder programmähnlich sind, gespeichert. Dazu gehören nämlich nicht nur die Programme der Programmliste, sondern z.B. auch:
  • Die Funktionsvariablen Y1..Y20 aus dem Grafikmenü
  • Rekursionsformeln wie an+1= ...
  • Die Funktionsspeicher f1..f6
  • Der Speicher des RUN - Menü

Programme im Grafikmenü

Das kann man auch ganz einfach beweisen, sogar ohne Manipulation des RAM Images (sondern nur unter Verwendung des Rechners), denn: Wenn Programme der Programmliste, Funktionen des Grafikmenüs, Rekursionsformeln usw. im selben Format gespeichert werden, müsste es dann nicht z.B. auch möglich sein, Anweisungen wie Locate 1,1,A oder Getkey in einer Funktionsvariablen wie Y1 zu speichern?

Ist es auch: Gehe ins RUN - Menü und führe folgende Anweisung aus: "Getkey"→Y1, wobei du für Y nicht den regulären Buchstaben Y verwendest, sondern [VARS]→[GRPH]→[Y]. Gehe jetzt ins Graph - Menü, und: Y1 lautet Getkey!

Setze jetzt im ViewWindow Ymin = 0 und Ymax = 80, so dass alle möglichen Rückgabewerte von Getkey (0..79) im Bildschirmbereich liegen (die x- Werte sind dabei egal), lasse die Funktion Zeichnen, und drücke dabei nach belieben Tasten. Wann du welche Taste gedrückt hast, ist jetzt anhand des Funktionsgraphen deutlich sichtbar!


Funktion 'Getkey'


Man kann auf diese Weise sogar ganze Programme in Y1..20 speichern, wobei das Zeichnen des entsprechenden Graphen dann natürlich zu einem Syntaxfehler führt, weil der GTR einen Termausdruck anstatt eine Folge von Anweisungen erwartet (Anweisungen liefern keine Rückgabewerte). Aber es ist dadurch zumindest bewiesen: Die Funktionen Y1..20 werden intern im selben Format gespeichert wie reguläre Casio Basic Programme!

Eigenschaften des Formats

Die Eigenschaften des Formats sind folgende:
  • Alle Daten, die im Programmformat gespeichert sind, werden entweder durch die Programmliste oder durch die Grow - Down - Pointertabelle adressiert, aber niemals durch die Grow - Up - Tabelle (siehe Fixe Daten im Adressbereich 0000..7FFF)
  • Das Programmformat selbst ist Grow - Down, d.h., Programme werden von oben nach unten gespeichert und das erste zu verarbeitende Programmbyte ist gleichzeitig das letzte zum Programm gehörige im Speicher
  • Aus diesem Grund werden Programmdaten auch im Grow - Down - Teil des noch freien Speichers angelegt, und Einträge der Grow - Down - Pointertabelle zeigen nicht auf den Anfang des Datenpuffers im Speicher (wie das bei der Grow - Up - Tabelle der Fall ist), sondern auf das erste zu verarbeitende, also das letzte im Speicher
  • Programmdaten sind auch die einzigen Daten überhaupt, die im Grow - Down - Teil des noch freien Speichers liegen bzw. die durch die Grow - Down - Pointertabelle adressiert werden; alle anderen Daten befinden sich im Grow - Up - Teil und werden durch die Grow - Up - Tabelle adressiert.
  • Obwohl es auch Programmanweisungen gibt, die durch 2 anstatt 1 Bytes codiert werden (z.B. Locate), wird der Programmcode immer byteweise eingelesen und verarbeitet. 16 Bit Werte zur Codierung von 2B Befehlen erscheinen daher "verkehrt herum" (z.B. wird der Befehl Locate nicht durch F7,10, sondern 10,7F codiert; s.a. Zeichen und Befehlscodes des Casio Basic Interpreters)
  • Programmdaten verfügen nicht immer über einen Header, nur die Casio Basic Programme aus der Programmliste tun dies. Für alle anderen Programmdaten (Y1..20 usw.) wäre ein Header nur relevant, um die Länge der Daten in Bytes bestimmen zu können, aber diese folgt zum einen bereits aus der Pointertabelle, und zum anderen wird das Programmende durch ein Byte FF signalisiert

Struktur von Programmdaten im Speicher

Ein n Byte langes Programm ist im Speicher so aufgebaut: , wobei Byte #0 das Programmbyte mit der höchsten Adresse im Speicher (also das erste zu verarbeitende Programmbyte, auf das die Grow - Down - Pointertabelle bzw. die Programmliste zeigt) ist, und Byte #n-1 das mit der niedrigsten.

Beispiel:

folgendes Programm:
    "Zahl"?→A←
    ClrText←
    "Hello, world!"←
    A=0⇒"Schoener Tag heute"

sähe im RAM z.B. so aus:
    AdresseInhalt
    niedrigste
    ..
    höchste
    FF,
    22,"etueh gaT reneohcS",22,13,"0",3D,"A",
    0D,22,AB,"dlrow ,olleH",22,
    0D,18,F7,
    0D,"A",0E,3F,22,"lhaZ",22

Copyright (C) 2004 by Marco Kaufmann