Reassembler zu Hypra-Ass
Passend zum Assembler Hypra-Ass stellen wir Ihnen jetzt auch einen professionellen Reassembler vor, der aus einem Maschinenprogramm Quelltext erzeugt.
Der Reassembler (siehe Listing) ist vollständig in Maschinensprache geschrieben. Er belegt den Speicherplatz von $C000 bis $CB00, kann aber mit dem SMON in jeden anderen Bereich verschoben werden. Neben dem eigentlichen Reassembler stehen noch einige Basic-Befehle zur Verfügung, mit denen zum Beispiel Einsprungpunkte im Quelltext durch ein Label markiert werden können. Es läßt sich auch vorherbestimmen, ob der Reassembler selbständig nach Tabellen suchen soll oder nicht. Weiterhin läßt sich der Aufbau des Quelltextes in einigen Punkten mitbestimmen. Alle dazu nötigen Informationen werden dem Reassembler in einem kleinen Basic-Informationsprogramm mitgeteilt. Es stehen dafür drei neue Basic-Befehle zu Verfügung:
- ←P adresse: Mit diesem Befehl lassen sich Einsprungpunkte im Quelltext durch ein Label markieren. So sind Adressen, die mit SYS angesprungen werden, im Quelltext leichter auffindbar.
- ←T adresse, adresse: Mit diesem Befehl teilen Sie dem Reassembler die Lage von Tabellen mit. Die erste Adresse zeigt auf das erste und die zweite Adresse auf das letzte Byte der Tabelle. Tabellen werden vom Reassembler nicht reassembliert, sondern erscheinen im Quelltext in Form eines Hex-Dumps (siehe Bild 1; Zeile 190 und Bild 2 Zeile 230 bis 310).
- ←E (byte): Der »E«-Befehl startet den Reassembler und steht am Ende des Informationsprogramms. Es wird nun aus einem Maschinenprogramm ein Quelltext erzeugt, der im Basic-Speicher abgelegt und anschließend wie ein normales Basic-Programm gespeichert oder editiert und mit Hypra-Ass assembliert werden kann.
10 -.li 1,4,7 20 -;******************************* 30 -;* Ausgabe eines Textes auf * 40 -;* dem Bildschirm * 50 -;******************************* 60 -.ba $8000 ;Startadresse = $8000 70 -; 80 -.eq ausgabe = $ffd2 ;Dies ist ein externes Label 90 -; 100 -anfang ldy #0 ;Schleifenzaehler auf 0 setzen 110 -loop lda text,y ;Zeichen holen 120 - cmp #"#" ;mit Endekennzeichen vergleichen 130 - beq ende 140 - jsr ausgabe ;Zeichen ausgeben 150 - iny ;Schleifenzaehler + 1 160 - bne loop 170 -ende rts ;Ende und zurueck ins BASIC 180 -; 190 -text .tx "Dies ist ein Beispieltext#"
100- .eq elffd2=$ffd2 110-; 120- .ba $8000 130-; 140-l8000 ldy #$00 ; "." 150-l8002 lda tl8010,y 160- cmp #$23 ; "#" 170- beq l800f 180- jsr elffd2 190- iny 200- bne l8002 210-l800f rts 220-; 230-tl8010.by $c4,$49,$45,$53,$20,$49,$53,$54;"Dies ist" 240-; 250- .by $20,$45,$49,$4e,$20,$c2,$45,$49;" ein Bei" 260-; 270- .by $53,$50,$49,$45,$4c,$54,$45,$58;"spieltex" 280-; 290- .by $54 ; "t" 300-; 310-tl8029.by $23 ; "#"
Der Aufbau des Quelltextes läßt sich geringfügig beeinflussen, indem hinter den »E«-Befehl eine Zahl zwischen 0 und 255 eingegeben wird. Bei dieser Zahl handelt es sich um ein sogenanntes Informations-Byte. Die einzelnen Bits dieses Informations-Bytes haben folgende Bedeutung:
Informations-Byte: | o | o | o | o | o | o | o | o |
Bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Wertigkeit: | 128 | 064 | 032 | 016 | 008 | 004 | 002 | 001 |
Um zum Beispiel Bit 1 und Bit 6 auf 1 zu setzen, sind die Wertigkeiten der einzelnen Bits zu addieren. In diesem Fall 2 + 64 = 66
- Bit 0 gesetzt: Alle Zeropage-Adressen (Adressen von $00 bis $FF) werden durch ein Label mit nur drei Buchstaben (normal fünf) markiert.
- Bit 1 gesetzt: Nach den Befehlen RT8, RTI, BRK und JMP wird eine Kommentarzeile in den Quelltext eingefügt (Zeile 220 in Bild 2). Dadurch wird der Quelltext übersichtlicher.
- Bit 2 gesetzt: Bei allen Befehlen mit unmittelbarer Adressierung (zum Beispiel LDA #$41) wird der Operand zusätzlich im ASCII-Formatausgegeben (LDY #$00 ;""." — Zeile 140 und 160 in Bild 2), vorausgesetzt, er liegt zwischen 32 und 96 oder zwischen 160 und 224. Für den Fall, daß er außerhalb dieses Zahlenbereichs liegt, wird nur ein Punkt ausgegeben.
- Bit 3 gesetzt: Zwischen je zwei Tabellenzeilen wird eine Kommentarzeile eingefügt (Zeile 240, 260, 280, 300 in Bild 2). Dieses erhöht die Übersichtlichkeit.
- Bit 4 gesetzt: Der ASCII-Ausdruck wird bei Tabellen unterdrückt.
- Bit 5 gesetzt: Ist dieses Bit gesetzt, werden externe Label und Tabellenlabel speziell gekennzeichnet (Zeile 100 und 230 in Bild 2). Tabellen wird ein »T« vorangestellt (zum Beispiel TLC000) und externen Label (Label die außerhalb des zu reassemblierenden Bereichs liegen) ein »E« (zum Beispiel ELC000).
- Bit 6 gesetzt: Ist das Bit 6 gesetzt, sucht der Reassembler selbständig nach Tabellen. Es wird kein Quelltext, sondern ein Basic-Informationsprogramm generiert, das die Start- und Endadressen aller gefundenen Tabellen enthält. Dieses kann mit LIST oder — wenn Hypra-Ass geladen wurde — mit /E geLISTet und geändert werden.
- Bit 7 gesetzt: Der Reassembler reassembliert die Speicherinhalte, die sich unter dem ROM im RAM befinden. Dadurch ist es möglich, Programme zu reassemblieren, die sich unter dem Basic-Interpreteroder Betriebssystem befinden.
Aus den drei neuen Basic-Befehlen setzt sich jedes Informationsprogramm zusammen. Es wird mit folgender Befehls-Sequenz im Direktmodus gestartet:
SYS 49152, anfadr, endadr+1:RUN
- anfadr = Anfangsadresse des Maschinenprogramms, das reassembliert werden soll.
- endadr = Endadresse des Maschinenprogramms, das reassembliert werden soll.
Um zum Beispiel den Reassembler durch sich selbst reassemblieren zu lassen, gehen Sie wie folgt vor:
- Reassembler laden mit LOAD"REASS",8,1
- NEW <RETURN> eingeben
- Folgendes Basic-Informationsprogramm eingeben:
20←P $C000 ;Kennzeichnet die Adresse $C000 durch ein Label 30←T $C813,$CAFF ;Definiert eine Tabelle im Bereich von $C813 bis $CAFF 40←E 15 ;Startet den Reassembler und setzt die Bits 0 bis 3
- SYS49152,$C000,$CB00:RUN <RETURN> im Direktmodus eingeben.
Die SYS-Zeile, mit der das Informationsprogramm gestartet wird, teilt dem Reassembler mit, daß das zu reassemblierende Maschinenprogramm im Bereich von $C000 bis $CAFF ($CB00 - 1) liegt. In Zeile 20 trifft der Reassembler auf den »P«-Befehl, der dazu auffordert, die Adresse $C000 durch ein Label zu markieren. Der »T«-Befehl in Zeile 30 definiert eine Tabelle im Bereich $C813 bis $CAFF und der »E«-Befehl in Zeile 40 startet schließlich den Reassembler.
In weniger als 8 Sekunden wird nun ein etwa 17 KByte langer Quelltext erzeugt, der mit LIST oder — wenn Hypra-Ass geladen und gestartet wurde — mit dem /E-Befehl geLISTet und mit RUN assembliert werden kann.
Wie Sie sicherlich schon bemerkt haben, verarbeitet der Reassembler nicht nur Dezimal-, sondern auch Hexadezimalzahlen. Eine Hexadezimalzahl beginnt mit einem Dollar-Zeichen ($), dem genau vier Hex-Ziffern folgen müssen. Beispiel: $0073, $C000, $FFFF
Besonderheiten
- Der Reassembler arbeitet ausgezeichnet mit Hypra-Ass zusammen. Dabei ist es jedoch übersichtlicher, das Informationsprogramm ohne Leerzeichen einzugeben, weil Hypra-Ass nach dem ersten Leerzeichen einen Tabulator einfügt. Das Aussehen des Quelltextes würde dadurch verunstaltet. Gestartet wird das Informationsprogramm wie gewohnt mit RUN. (Vergessen Sie nicht den Minusstrich vor jeder Zeile, wenn Hypra-Ass geladen ist.)
- Aus programmtechnischen Gründen kann es vorkommen, daß der Reassembler im ersten Pass ein Maschinenprogramm anders reassembliert als im zweiten. Dadurch können in Pass 2 Sprungadressen im Maschinenprogramm auftauchen, die in Pass 1 nicht gefunden wurden und deshalb auch im Quelltext nicht durch ein Label markiert werden. Der Reassembler ersetzt in diesem Fall die Sprungadresse nicht durch ein Label, sondern stellt sie als Hex-Zahl im Quelltext dar. An die entsprechende Zeile werden 3 Fragezeichen angehängt.
- 3-Byte-Befehle, die bei der Assemblierung als 2-Byte-Befehle interpretiert werden (BIT $A9 $00 = .BY $2C LDA #$00), werden nicht reassembliert. Statt dessen werden die 3 Byte mit vorangestelltem .BY-Pseudoopcode in den Quelltext eingefügt Der reassemblierte Befehl wird aber als Kommentar an die entsprechende Zeile angefügt.
- Es ist möglich, ein Programm so zu reassemblieren, als ob es in einem anderen Bereich läge. Dazu ist an den SYS-Befehl eine weitere Adresse anzuhängen:
SYS 49152, anfadr, endadr, get
anfadr und endadr geben die Anfangs- und Endadresse des Bereichs an, in dem das Maschinenprogramm liegen soll, get gibt die Anfangsadresse des Bereichs an, in dem das Programm tatsächlich liegt.
So kann man zum Beispiel die Kopie der CHRGET-Routine ab $E3A2 reassemblieren, als ob sie im Bereich von $0073 bis $008A liegen würde. Dazu ist im Direktmodus folgende Zeile einzugeben:
SYS 49152, $0073, $008A, $E3A2:←E
Da keine Tabellen in diesem Bereich liegen, kann auf ein Informationsprogramm verzichtet werden.
- Es ist möglich, während der Reassemblierung den erzeugten Quelltext auf Diskette zu schreiben. Dadurch bleibt der Basic-Speicher für andere Programme frei. Dazu ist vor dem SYS-Befehl, mit dem die Start- und Endadresse übergeben wird, ein Programmfile zu öffnen. Mit dem Befehl CMD wird die Ausgabe auf das entsprechende Gerät umgeleitet. Das könnte wie folgt aussehen:
OPEN 1,8,1,"NAME,P,W":CMD 1:SYS 49152,$C000, $CB00:←E 64
Mit dem OPEN-Befehl wird ein Programmfile mit dem Namen »Name« zum Schreiben geöffnet Der CMD-Befehl leitet die Ausgabe auf das Gerät mit der Gerätenummer 8 um (Disketten-Laufwerk). Der SYS-Befehl startet schließlich den Reassembler, dem durch den »E«-Befehl noch mitgeteilt wird, daß kein Quelltext, sondern ein Informationsprogramm erstellt werden soll. Das Informationsprogramm wird unter dem Namen »Name« auf Diskette gespeichert.
Vorsicht! Dieser Programmteil ist nicht gegen Fehlbedienung abgesichert. So führt eine nicht eingelegte Diskette zum Absturz des Systems. In einem solchen Fall ist ein RESET auszulösen. Hypra-Ass kann anschließend mit SYS 2168 neu gestartet werden. Außerdem sollte nach jedem Speichern die RUN/STOP-RESTORE-Taste gedrückt werden.
Fehlermeldungen
- SYNTAX ERROR: Ein Basic-Befehl wurde falsch eingegeben oder eine Hex-Zahl besteht aus weniger als 4 Hex-Ziffern.
- OUT 0F MEMORY: Es steht zu wenig Speicherplatz für den Quelltext zur Verfügung oder im Maschinenprogramm kommen mehr als 2700 verschiedene Label vor.
- ILLEGAL QUANTITY: Vor einer Hex-Zahl fehlt das Dollar-Zeichen ($) oder das Tabellenende liegt vor dem Tabellenanfang oder die Tabellen überschneiden sich oder die angegebene Adresse liegt nicht im Maschinenprogramm.
- TYPE MISMATCH: In einer Hex-Zahl stehen falsche Hex-Ziffern.
Die Adresse, die schon als Einsprungpunkt markiert wurde, darf nicht als Tabellenanfang oder -ende angegeben werden. Im Informationsprogramm darf keine Adresse doppelt vorkommen.
Verschieben des Reassemblers
Der Reassembler benutzt in der Zeropage verschiedene Speicherzellen als Kurzzeitspeicher. Der Langzeitspeicher dagegen liegt unter dem Betriebssystem ($E000 bis $FFFF). Dort befindet sich auch ab Adresse $E028 die Label-Tabelle. In den Langzeitspeicher sollte nicht hineingePOKEt werden.
Der Reassembler kann mit SMON ohne Schwierigkeiten im Speicher verschoben werden. Um den Reassembler nach $9000 zu verschieben, sind folgende SMON-Befehle einzugeben:
W C000 CB00 9000
V C000 CB00 9000 9000 9813
Beispiel zu den Basic-Erweiterungen
Laden Sie Hypra-Ass, starten Sie ihn und laden anschließend den Reassembler. Geben Sie NEW und danach im Direktmodus
SYS 49152,$1000,$1FD7:←E 64 <RETURN>
ein. Der Reassembler bekommt durch den SYS-Befehl die Start- und Endadresse des Maschinenprogramms mitgeteilt. Der »E«-Befehl setzt Bit 6 des Informations-Bytes und startet den Reassembler. Das gesetzte Bit 6 bewirkt, daß kein Quelltext, sondern ein Informationsprogramm erstellt wird. LISTen Sie das Programm mit /E. Sie sehen eine Reihe von »T«-Befehlen und zum Schluß einen »E«-Befehl. Schreiben Sie hinter diesen Befehl die Zahl 32, drücken die RETURN-Taste und geben folgende Zeile im Direktmodus ein:
OPEN 1,8,1,"REASS DEMO,P,W":CMD 1:SYS 49152,$1000,$1FD7:GOTO 100 <RETURN>
Mit dem OPEN-Befehl wird ein Programmfile mit dem Namen »REASS DEMO« zum Schreiben geöffnet. Der nachfolgende CMD-Befehl leitet die Ausgabe des Quelltextes auf dieses File um. Durch den SYS-Befehl wird dem Reassembler die Start- und Endadresse des Maschinenprogramms mitgeteilt. Der GOTO-Befehl startet schließlich das Informationsprogramm (der RUN-Befehl darf dazu nicht benutzt werden, da er das geöffnete File schließen würde). Die »T«-Befehle im Informationsprogramm werden ausgeführt, bis der »E«-Befehl Bit 5 setzt und den Reassembler startet. Das gesetzte fünfte Bit bewirkt, daß externe Label und Tabellenlabel speziell gekennzeichnet werden.
Das so auf Diskette erzeugte Programmfile kann mit LOAD ’’REASS DEMO",8 geladen, geLISTet, editiert und assembliert werden.
(Martin Wehner/ah)PROGRAMM : REASS C000 CB00 ----------------------------------- C000 : 20 4E C1 20 53 E4 AD 05 D9 C008 : C8 8D 02 03 AD 06 C8 8D C1 C010 : 03 03 AD FF C7 8D 0A 03 17 C018 : AD 00 C8 8D 0B 03 20 53 99 C020 : C7 8D 09 E0 8C 08 E0 8D B4 C028 : 01 E0 8C 00 E0 8D 03 E0 05 C030 : 8C 02 E0 48 98 48 20 53 F1 C038 : C7 8D 05 E0 8C 04 E0 20 D0 C040 : 79 00 F0 09 20 53 C7 8D ED C048 : 01 E0 8C 00 E0 68 85 14 6C C050 : 68 85 15 A9 FF A2 02 9D 4E C058 : 28 E0 CA 10 FA AD 02 C8 5C C060 : 8D 08 03 AD 03 C8 8D 09 27 C068 : 03 20 D1 C0 20 D7 C0 4C 64 C070 : 1E C1 A9 00 85 0D 20 73 01 C078 : 00 B0 03 4C F3 BC 20 13 E6 C080 : B1 90 03 4C 28 AF C9 24 33 C088 : F0 03 4C 9A AE 20 A0 C0 50 C090 : 85 62 20 A0 C0 85 63 A2 6D C098 : 90 38 20 49 BC 4C 73 00 72 C0A0 : 20 BF C0 20 B5 C0 0A 0A 72 C0A8 : 0A 0A 85 14 20 BF C0 20 DE C0B0 : B5 C0 05 14 60 C9 3A 90 E8 C0B8 : 02 69 08 29 0F 38 60 20 0B C0C0 : 73 00 90 12 C9 41 90 04 8B C0C8 : C9 47 90 0A A2 16 6C 00 27 C0D0 : 03 78 A9 35 85 01 60 A0 43 C0D8 : 00 20 DF C0 90 DF C8 A5 6F C0E0 : 14 D9 02 E0 C8 A5 15 F9 7F C0E8 : 02 E0 60 20 73 00 20 56 DB C0F0 : C7 A2 80 20 36 C1 20 53 C5 C0F8 : C7 20 D1 C0 20 3C C5 B0 B8 C100 : 1D 20 09 C1 A2 00 4C 36 70 C108 : C1 20 57 C6 A0 00 B1 59 0B C110 : F0 14 10 F5 C8 A5 14 D1 7B C118 : 59 C8 A5 15 F1 59 B0 06 9A C120 : A9 37 85 01 58 60 A2 0F 18 C128 : 20 20 C1 6C 00 03 20 73 D6 C130 : 00 20 56 C7 A2 02 20 69 5C C138 : C0 20 D1 C0 20 27 C5 20 27 C140 : CD C5 D0 E4 A1 59 30 D8 18 C148 : 20 20 C1 4C EA A7 A0 0B F7 C150 : 20 D1 C0 B9 00 03 48 B9 6D C158 : 10 E0 99 00 03 68 99 10 39 C160 : E0 88 10 EF 4C 20 C1 20 93 C168 : 4E C1 6C 02 03 20 CD C1 DE C170 : 20 BC C1 B0 F8 A0 00 8C 22 C178 : AF 02 2C A8 02 30 03 20 36 C180 : 20 C1 B1 5D AA 20 D1 C0 0D C188 : E6 5D D0 02 E6 5E E6 5F 4D C190 : D0 02 E6 60 A5 5F 85 14 BB C198 : 29 3F D0 11 20 20 C1 A5 0C C1A0 : 9A C9 08 B0 05 A9 C0 20 18 C1A8 : D2 FF 20 D1 C0 A5 60 85 82 C1B0 : 15 20 D7 C0 90 06 A9 80 C4 C1B8 : 8D AF 02 60 A0 01 A5 5F 11 C1C0 : D1 FD C8 A5 60 F1 FD 90 25 C1C8 : 03 EE AF 02 60 18 A5 FD C8 C1D0 : 69 03 85 FD 90 02 E6 FE 8F C1D8 : 60 20 70 C1 8E A9 02 BD 56 C1E0 : FF C8 85 5C BD FF C9 8D 4E C1E8 : B0 02 F0 17 B0 4F 30 4D 99 C1F0 : 29 0F 4A B0 1E 4A B0 0C 59 C1F8 : 20 70 C1 8E AA 02 A2 00 D8 C200 : 8E AB 02 60 20 70 C1 8E 9A C208 : AA 02 B0 32 20 70 C1 8E CF C210 : AB 02 60 20 70 C1 8A 30 78 C218 : 0E 18 65 5F 8D AA 02 A5 F9 C220 : 60 69 00 8D AB 02 60 49 C5 C228 : FF 85 5B E6 5B 38 A5 5F 6A C230 : E5 5B 8D AA 02 A5 60 E9 1E C238 : 00 8D AB 02 60 18 A9 81 9A C240 : 69 00 8D B0 02 A9 02 85 A3 C248 : 5C 60 20 73 00 F0 04 C9 76 C250 : 5F F0 03 4C E7 A7 20 73 95 C258 : 00 C9 50 D0 03 4C 2E C1 3A C260 : C9 54 D0 03 4C EB C0 C9 A3 C268 : 45 F0 05 A2 0B 6C 00 03 D5 C270 : A2 00 8E AE 02 20 73 00 7B C278 : F0 03 20 9E B7 8E A8 02 5C C280 : 20 D1 C0 20 3E C7 20 27 AE C288 : C5 20 BC C1 B0 1F 20 D9 FD C290 : C1 AD B0 02 30 10 29 0F DB C298 : F0 0C C9 08 F0 08 A2 01 DE C2A0 : 20 BF C5 20 CA C5 AD AF 06 C2A8 : 02 F0 E3 30 17 A0 00 B1 FB C2B0 : FD 10 DB 20 70 C1 90 FB FF C2B8 : A0 00 B1 FD D0 F5 20 70 A2 C2C0 : C1 4C A6 C2 20 F5 C7 20 BA C2C8 : 3E C7 20 D1 C7 A5 2B 85 8D C2D0 : FB A5 2C 85 FC 20 75 C7 90 C2D8 : A0 00 B1 FD C9 FF F0 35 6F C2E0 : 20 2F C7 20 D7 C0 90 27 A2 C2E8 : 20 1F C6 20 78 C7 A2 00 9E C2F0 : 20 A4 C6 AD A8 02 29 20 49 C2F8 : F0 05 A9 45 20 34 C6 20 7D C300 : B6 C6 A9 3D 20 34 C6 A9 3D C308 : 24 20 B8 C6 20 70 C7 20 28 C310 : CD C1 4C D8 C2 20 3E C7 A2 C318 : 20 6D C7 20 1F C6 20 78 7E C320 : C7 A2 01 20 A4 C6 A5 5F 53 C328 : 8D AA 02 A5 60 8D AB 02 65 C330 : A9 24 20 B8 C6 20 70 C7 C9 C338 : 20 6D C7 A0 00 B1 FD 30 FB C340 : 10 20 2F C7 A0 00 20 DF 6F C348 : C0 B0 06 20 CD C1 4C 3B 78 C350 : C3 20 BC C1 90 03 4C 91 00 C358 : C4 20 1F C6 20 D9 C1 AD 00 C360 : AE 02 D0 3A AD B0 02 C9 87 C368 : 81 D0 33 AD AF 02 D0 2E 7E C370 : A8 A9 80 91 57 C8 8C AE 8A C378 : 02 AD 08 E0 91 57 C8 AD C1 C380 : 09 E0 91 57 20 6F C6 B1 45 C388 : FD 8D 09 E0 91 57 88 B1 04 C390 : FD 8D 08 E0 91 57 88 A9 BB C398 : 00 91 57 20 62 C5 20 78 00 C3A0 : C7 AD B0 02 30 1C 29 0F 51 C3A8 : F0 69 C9 06 D0 12 AD AB 2C C3B0 : 02 D0 0F A2 02 20 A4 C6 74 C3B8 : A9 83 4C 70 C4 4C 53 C4 C9 C3C0 : B0 FB 20 A2 C6 AD B0 02 6B C3C8 : 30 F0 29 10 F0 05 A9 28 EB C3D0 : 20 34 C6 20 BF C5 20 75 56 C3D8 : C5 20 B8 C6 AD B0 02 29 6F C3E0 : 70 F0 33 C9 10 D0 08 A9 C9 C3E8 : 29 20 34 C6 4C 16 C4 C9 23 C3F0 : 40 90 11 F0 05 A9 29 20 5D C3F8 : 34 C6 A9 2C A2 59 20 30 55 C400 : C6 4C 16 C4 A9 2C A2 58 42 C408 : 20 30 C6 AD B0 02 29 10 87 C410 : 4C E1 C3 20 A2 C6 A5 5C F1 C418 : C9 37 D0 06 20 75 C7 20 7F C420 : A2 C6 AD AF 02 30 2A 20 11 C428 : 70 C7 A5 5C C9 38 90 19 44 C430 : AD AE 02 D0 0A A5 5F 8D 35 C438 : 08 E0 A5 60 8D 09 E0 AD 26 C440 : A8 02 29 02 F0 03 20 6D F6 C448 : C7 AD AF 02 D0 43 4C 59 1D C450 : C3 30 58 20 A2 C6 A9 23 93 C458 : 20 34 C6 AD AA 02 8D A9 3E C460 : 02 A2 71 AD A8 02 29 04 0D C468 : F0 02 A2 81 8A 8D B0 02 0E C470 : 29 03 85 5B AA BD A8 02 27 C478 : 9D 1F E0 CA D0 F7 20 EC 5D C480 : C6 AD B0 02 C9 70 B0 8E 89 C488 : 20 75 C7 20 A2 C6 4C D3 92 C490 : C3 20 2F C7 20 1F C6 20 7E C498 : 63 C6 A0 00 8C AE 02 B1 30 C4A0 : FD F0 70 30 2E 20 B6 C6 84 C4A8 : 4C 5C C3 A2 00 A9 FF 81 B8 C4B0 : 57 AD AE 02 F0 03 20 4A 06 C4B8 : C5 20 7D C7 20 33 C6 20 DD C4C0 : 30 C6 20 20 C1 A5 B8 20 CC C4C8 : C3 FF 20 60 A6 20 33 A5 22 C4D0 : 4C 86 E3 20 E6 C7 20 3D 04 C4D8 : C2 AD A8 02 29 10 F0 05 BC C4E0 : A9 71 8D B0 02 A0 00 84 E9 C4E8 : 5B 20 70 C1 A4 5B 8A 99 2A C4F0 : 20 E0 E6 5B B0 0A C0 07 12 C4F8 : D0 EF 20 16 C6 4C D6 C4 3E C500 : A0 00 B1 FD F0 04 09 E0 E1 C508 : 91 FD 20 E6 C6 20 5C C7 EB C510 : 4C 16 C4 20 E6 C7 20 70 AA C518 : C1 8E A9 02 20 3D C2 4C 5B C520 : 9E C3 20 3C C5 90 10 AD AC C528 : 08 C8 85 59 AD 09 C8 85 72 C530 : 5A 4C 37 C5 20 57 C6 20 4F C538 : 3C C5 90 F8 A0 02 B1 59 2E C540 : C5 15 D0 05 88 B1 59 C5 6C C548 : 14 60 38 A5 57 E9 03 85 2B C550 : 57 B0 02 C6 58 A0 01 AD 43 C558 : 04 E0 91 57 C8 AD 05 E0 EB C560 : 91 57 38 A0 01 B1 57 E9 8E C568 : 01 91 57 C8 B1 57 E9 00 9E C570 : 91 57 4C 6F C6 20 22 C5 2F C578 : D0 08 A0 00 B1 59 C9 FF 81 C580 : 90 07 A9 37 85 5C A9 24 0F C588 : 60 AD A8 02 29 20 F0 1C B9 C590 : 20 D7 C0 90 1A A9 45 20 22 C598 : 34 C6 4C AC C5 20 57 C6 20 C5A0 : B1 59 F0 13 C9 FF F0 04 05 C5A8 : C9 80 D0 F1 A9 4C 60 A0 E3 C5B0 : 00 B1 59 C9 80 D0 E9 A9 A2 C5B8 : 54 20 34 C6 4C AC C5 AD 9F C5C0 : AA 02 85 14 AD AB 02 85 9A C5C8 : 15 60 20 22 C5 F0 44 86 5C C5D0 : 61 A5 59 85 5B A5 5A 85 62 C5D8 : 5C A0 02 B1 5B B6 61 99 5F C5E0 : 61 00 8A 91 5B 88 10 F3 38 C5E8 : 18 A5 5B 69 03 85 5B 90 C2 C5F0 : 02 E6 5C E0 FF D0 E2 A0 EC C5F8 : 01 A5 14 91 59 C8 A5 15 A0 C600 : 91 59 A5 5C CD 0C C8 90 B4 C608 : 07 A5 5B CD 0B C8 B0 7D 27 C610 : A2 00 60 A2 0E 60 20 E6 51 C618 : C6 20 5C C7 20 70 C7 18 D3 C620 : AD AC 02 69 0A 8D AC 02 95 C628 : 90 03 EE AD 02 AE AD 02 FB C630 : 20 34 C6 8A 2C A8 02 70 5E C638 : 66 A4 9A C0 08 B0 53 A4 4C C640 : FB 84 2D A4 FC 84 2E C8 9B C648 : C4 38 A0 00 91 FB B0 3D 87 C650 : E6 FB D0 02 E6 FC 60 18 B0 C658 : A5 59 69 03 85 59 90 02 CE C660 : E6 5A 60 A0 02 B1 FD 91 68 C668 : 57 88 10 F9 4A B0 F3 2C 99 C670 : A8 02 50 0B 18 A5 57 69 6E C678 : 03 85 57 90 02 E6 58 A5 2A C680 : 58 CD 12 C8 90 DC A5 57 92 C688 : CD 11 C8 90 D5 A2 10 4C 6D C690 : 28 C1 48 A8 20 20 C1 98 FB C698 : 20 D2 FF 20 D1 C0 68 A0 2B C6A0 : 00 60 A6 5C BD 4B C8 20 9F C6A8 : 34 C6 BD 87 C8 20 34 C6 8B C6B0 : BD C3 C8 4C 34 C6 A9 4C C3 C6B8 : 20 34 C6 AD A8 02 29 01 9B C6C0 : F0 05 AD AB 02 F0 06 AD 2F C6C8 : AB 02 20 D0 C6 AD AA 02 1F C6D0 : 48 4A 4A 4A 4A 20 DB C6 BC C6D8 : 68 29 0F C9 0A 90 02 69 D2 C6E0 : 06 69 30 4C 34 C6 20 78 1B C6E8 : C7 20 A2 C6 A2 00 F0 05 39 C6F0 : A9 2C 20 34 C6 A9 24 20 C8 C6F8 : 34 C6 BD 20 E0 20 D0 C6 E3 C700 : E8 E4 5B 90 EB AD B0 02 36 C708 : 10 33 20 75 C7 20 2B C7 22 C710 : A2 00 BD 20 E0 A8 29 7F 1D C718 : C9 20 90 04 C9 60 90 02 7C C720 : A0 2E 98 20 34 C6 E8 E4 E8 C728 : 5B 90 E7 A9 22 D0 4B A0 11 C730 : 00 20 34 C7 C8 B1 FD 99 8C C738 : 13 00 99 A9 02 60 AD 08 D1 C740 : C8 85 FD AD 09 C8 85 FE EB C748 : A2 04 BD FF DF 95 5C CA 0D C750 : D0 F8 60 20 FD AE 20 8A A3 C758 : AD 4C F7 B7 AD A8 02 29 9B C760 : 08 F0 DA 20 70 C7 20 1F 9F C768 : C6 A9 3B D0 0D 20 66 C7 E7 C770 : A9 00 20 34 C6 20 69 C7 4B C778 : A9 20 4C 34 C6 2C A8 02 3F C780 : 8E A8 02 50 60 20 D1 C7 CB C788 : 20 F5 C7 20 75 C7 20 1F ED C790 : C6 A9 5F 20 34 C6 B1 57 F6 C798 : C9 FF F0 30 C9 80 F0 0C 1F C7A0 : A9 50 20 B5 C7 98 20 34 5A C7A8 : C6 4C 8B C7 A9 54 20 B5 99 C7B0 : C7 A9 2C D0 ED 20 34 C6 AF C7B8 : C8 B1 57 8D AA 02 C8 B1 22 C7C0 : 57 8D AB 02 A9 24 20 B8 B7 C7C8 : C6 4C 74 C6 A9 45 20 34 58 C7D0 : C6 A9 5A 8D AC 02 A2 00 18 C7D8 : 8E AD 02 AD 0E C8 85 57 5F C7E0 : AD 0F C8 85 58 60 AD A8 88 C7E8 : 02 29 20 F0 05 A9 54 20 D4 C7F0 : 34 C6 4C B6 C6 A5 9A C9 09 C7F8 : 08 90 EA 4C 34 C6 2C 72 9C C800 : C0 2C 4A C2 2C 67 C1 2C 1F C808 : 28 E0 2C F0 F7 2C 00 F8 9C C810 : 2C F0 FF 2E 2E 2E 20 48 DF C818 : 59 50 52 41 2D 52 45 2C 29 C820 : 20 50 55 42 4C 49 53 48 F3 C828 : 45 44 20 42 59 20 36 34 B8 C830 : 27 45 52 2C 20 28 43 29 B7 C838 : 20 31 39 38 35 20 42 59 56 C840 : 20 4D 2E 20 57 45 48 4E F4 C848 : 45 52 20 2E 2E 2E 41 41 60 C850 : 41 42 42 42 52 42 42 43 52 C858 : 43 53 43 43 45 49 49 50 E2 C860 : 4C 44 42 44 43 4E 43 44 24 C868 : 4C 53 54 42 54 4F 53 42 4D C870 : 49 50 4A 4C 4C 50 50 53 2D C878 : 42 43 53 52 53 53 54 54 45 C880 : 54 54 3F 42 4A 52 52 45 22 C888 : 42 42 44 4E 53 43 43 45 AD C890 : 4F 50 56 4C 4C 45 4D 50 EB C898 : 4F 4E 4E 4C 44 45 56 45 7E C8A0 : 4C 4F 50 45 44 42 59 4D A7 C8A8 : 41 52 54 49 4E 4C 53 44 6E C8B0 : 53 48 48 45 4E 4C 45 4F DD C8B8 : 54 54 41 53 58 58 3F 52 DB C8C0 : 4D 54 54 51 41 59 43 44 EB C8C8 : 4C 43 53 51 52 4C 53 43 10 C8D0 : 49 43 50 58 52 43 59 50 1F C8D8 : 41 43 43 58 44 50 59 59 76 C8E0 : 58 43 41 49 58 41 59 54 F1 C8E8 : 58 41 52 59 52 41 50 44 9A C8F0 : 45 56 49 4C 41 58 59 58 29 C8F8 : 41 53 3F 4B 50 49 53 38 29 C900 : 22 02 02 02 22 05 02 2B 8D C908 : 22 05 02 02 22 05 02 0A D4 C910 : 22 02 02 02 22 05 02 0C 5F C918 : 22 02 02 02 22 05 02 27 9D C920 : 04 02 02 24 04 30 02 14 1C C928 : 04 30 02 24 04 30 02 20 54 C930 : 04 02 02 02 04 30 02 0E DC C938 : 04 02 02 02 04 30 02 3A 3C C940 : 11 02 02 02 11 29 02 2A CA C948 : 11 29 02 39 11 29 02 17 26 C950 : 11 02 02 02 11 29 02 0D A0 C958 : 11 02 02 02 11 29 02 3B 04 C960 : 03 02 02 02 03 09 02 26 F2 C968 : 03 09 02 39 03 09 02 0B 2E C970 : 03 02 02 02 03 09 02 2F 14 C978 : 03 02 02 02 03 09 02 02 C2 C980 : 31 02 02 23 31 32 02 1C 7C C988 : 02 35 02 23 31 32 02 06 C3 C990 : 31 02 02 23 31 32 02 1F 92 C998 : 31 36 02 02 31 02 02 28 21 C9A0 : 15 1D 02 28 15 1D 02 33 72 C9A8 : 15 21 02 28 15 1D 02 07 24 C9B0 : 15 02 02 28 15 1D 02 2E EB C9B8 : 15 34 02 28 15 1D 02 1B E5 C9C0 : 0F 02 02 1B 0F 16 02 13 84 C9C8 : 0F 18 02 1B 0F 16 02 2D CB C9D0 : 0F 02 02 02 0F 16 02 19 7D C9D8 : 0F 02 02 02 0F 16 02 10 73 C9E0 : 1E 02 02 10 1E 12 02 25 47 C9E8 : 1E 1A 02 10 1E 12 02 08 21 C9F0 : 1E 02 02 02 1E 12 02 2C A3 C9F8 : 1E 02 02 02 1E 12 02 00 53 CA00 : 34 80 80 80 04 04 80 00 07 CA08 : 08 00 80 80 06 06 80 01 D5 CA10 : 54 80 80 80 24 24 80 00 3A CA18 : 42 80 80 80 26 26 80 02 64 CA20 : 34 80 80 04 04 04 80 00 97 CA28 : 08 00 80 06 06 06 80 01 A6 CA30 : 54 80 80 80 24 24 80 00 5A CA38 : 42 80 80 80 26 26 80 00 80 CA40 : 34 80 80 80 04 04 80 00 47 CA48 : 08 00 80 02 06 06 80 01 45 CA50 : 54 80 80 80 24 24 80 00 7A CA58 : 42 80 80 80 26 26 80 00 A0 CA60 : 34 80 80 80 04 04 80 00 67 CA68 : 08 00 80 12 06 06 80 01 67 CA70 : 54 80 80 80 24 24 80 00 9A CA78 : 42 80 80 80 26 26 80 80 C1 CA80 : 34 80 80 04 04 04 80 00 F7 CA88 : 80 00 80 06 06 06 80 01 7E CA90 : 54 80 80 24 24 44 80 00 2F CA98 : 42 00 80 80 26 80 80 08 83 CAA0 : 34 08 80 04 04 04 80 00 DB CAA8 : 08 00 80 06 06 06 80 01 26 CAB0 : 54 80 80 24 24 44 80 00 4F CAB8 : 42 00 80 26 26 46 80 08 86 CAC0 : 34 80 80 04 04 04 80 00 37 CAC8 : 08 00 80 06 06 06 80 01 46 CAD0 : 54 80 80 80 24 24 80 00 FA CAD8 : 42 80 80 80 26 26 80 08 30 CAE0 : 34 80 80 04 04 04 80 00 57 CAE8 : 08 00 80 06 06 06 80 01 66 CAF0 : 54 80 80 80 24 24 80 00 1A CAF8 : 42 80 80 80 26 26 80 00 40