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:
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.