Kapitel 3: Komprimierter Zeichensatz



Dieses Thema habe ich schon in meiner letzten Anleitung angesprochen, doch da habe ich nicht erklärt, wie man die Länge der Zeichen ändert. Zu diesem Thema komme ich hier.

Ein paar Begriffsdefinitionen müssen hier sein, damit ihr mich versteht...


STE (single tile encoding):

Wenn zwei Zeichen grafisch so kombiniert werden, dass sie wie eins angesteuert werden, spricht man von STE.

DTE (dual-tile encoding):

Man spricht von DTE, wenn ein Byte für 2 Zeichen steht. DTEs werden nicht grafisch definiert, jedoch werden häfig STE und DTE als das gleiche angesehen.

MTE (multiple-tile encoding):

MTEs sind Zeichenfolgen, die über ein Byte angesteuert werden. MTEs haben normalerweise eine konstante Länge. Manchmal werden MTEs auch über mehrere Bytes angesteuert.

Substring encoding:

Von Substring encoding spricht man, wenn man mit einem oder mehreren Bytes verschiedene Zeichenfolgen ansteuert. Diese Zeichenfolgen benutzen die selbe Routine, wie der eigentliche Text. Sie sind außerdem daran zu erkennen, dass sie unterschiedlich lang sind und ihre eigene Pointertabelle haben.


Diese Bezeichnungen sind KEINE offiziellen Standards, da es solche nicht gibt. Im Prinzip sind STEs eine Unterklasse von DTEs, die wiederrum von MTEs, und die wiederrum vom Substring encoding. Die Grenzen zwischen ihnen, insbesonderen von MTE und substring encoding sind fließend, dass heißt, dass es keine klaren Grenzen gibt. Alle vier nennt man zwar Kompressionen, aber sie sind keine "echten", da sie keinem mathematischen Algorithmus (wie es zum Beispiel .zip-Datei tun) folgen. Ich werde euch hier aber keine Algorithmen vorstellen, da ich mich selber nahezu gar nicht damit auskenne.

Wie finde ich den Zeichensatz?


Als erstes erstellt ihr einen Table-File (das solltet ihr schon können, wenn nicht, lest meine erste Anleitung!). Damit öffnet ihr das Rom, und sucht einen Textblock, in dem die Wörter nicht ganz zusammen passen. Zum Beispiel:
°you°You°need°take°world°since°

Danach sucht ihr in einem normalen Textblock (in dem Silben/Wörter fehlen) die Hexadezimale Zahl(en) für ein Wort. Mit diesem Wert könnt ihr die anderen ermitteln: Ihr zählt bei den vorherigen abwärts (Hex) und bei den nachfolgenden aufwärts (Hex).
Bei unserem Beispiel:
8 Bit: 88=take 16 Bit: 05 02=take
85=you
86=You
87=need
88=take
89=world
8A=since
04 FF=you
05 00=You
05 01=need
05 02=take
05 03=world
05 04=since
So erstellt ihr euren Zeichensatz für euren Editor. Danach Berechnet ihr die Pointer. Das ist jetzt bei jedem Rom anders: Manchmal gibt es ein abschließendes Zeichen nach einem Wort, manchmal dient der letzte Buchstabe dazu, manchmal der folgende Pointer, und bei konstanten Längen gibt es immer ein Zeichen, mit dem aufgefüllt wird und manchmal gibt es auch ein Ende Zeichen. Ihr berechnet dann für jedes Wort den Pointer und sucht die Pointer-Tabelle. (ist natürlich nur bei Substring encoding interessant)
Danach übersetzt ihr die Wörter, berechnet die Pointer für die neuen Positionen und tragt sie in der Liste ein.
Achtung:Auch hier müsst ihr auf die unterschiedlichen Pointer achten! Ihr könnt den Text nicht unbegrenzt ausdehnen: Es müssen dahinter leere Bytes sein (Das sind jede Menge gleiche aufeinanderfolgende Zeichen, meistens FF oder 00), und der freie Platz muss in der Reichweite der Pointer sein. Das heisst, dass hinter dem Textblock noch so viel Platz sein kann, wenn die Pointer nicht hindeuten können habt ihr Pech gehabt. (ist meistens daran zu erkennen, ob der folgende Platz noch in der gleichen Textbank liegt).

Einschränkung der Pointer:


Da fällt mir ein, ich muss ja noch die Einschränkung der Pointer beschreiben: da sie für Text meistens nur 2 oder 4 stellig sind können sie häfig nur innerhalb einer Textbank agieren und wenn sie darüber hinaus funktionieren sollen, wird ein ASM-Hack nötig.

Tipp: Ihr könnt natürlich diesen Zeichensatz für eure Übersetzung optimieren, so dass ihr mehr Platz zur Verfügung habt.

Zurück

Vor