home *** CD-ROM | disk | FTP | other *** search
-
-
-
-
-
- A80 V1.3b - (c) copyright 1993 by André Grüning
-
- Anleitung
-
- Inhaltsverzeichnis
-
- 1. Allgemeines
- 2. Starten von A80
- 3. Die Assemblersprache des A80
- 4. Ausdrücke
- 5. Pseudo-Befehle
- 6. Fehlermeldungen
- 7. Verschiedenes
- 8. Erweiterter Befehlssatz des Z80 (nur registrierte Version)
-
-
- 1. Allgemeines
-
- A80 ist ein Z80-Crossassembler für MS-DOS. Er dient dazu, auf einem
- IBM-kompatiblen PC Programme für einen Computer mit Z80-CPU zu
- erstellen.
- A80 benötigt DOS ab 3.0 und ca. 100 KB freien Sprecher. Damit die
- Bildschirmausgaben korrekt formatiert erscheinen, sollte ANSI.SYS
- installiert sein. Das Programm läuft aber auch ohne.
-
- Erklärung der verwendeten Symbole:
-
- [...] bedeutet in dieser Anleitung: Das Eingeklammerte ist
- optional.
- a|b bedeutet, daß man entweder a oder b angeben muß, nicht
- aber beide.
- sym repräsentiert ein Symbol
- exp repräsentiert einen mathematischen Ausdruck
- string repräsentiert einen String (Zeichenkette)
-
-
- 2. Aufruf von A80
-
- A80 wird wie folgt aufgerufen:
-
- A80 [quelle.ext [ziel.ext [symbol.ext [fehler.ext]]]]
-
- quelle.ext enthält dabei den Quellcode, ziel.ext dient zur Aufnahme
- des Maschinencodes. In symbol.ext werden die definierten Symbole mit
- ihrem Wert geschrieben, in fehler.ext die Fehlermeldungen und die
- Zeilen mit undefinierten Symbolen.
- Werden ziel.ext, symbol.ext und fehler.ext nicht angegeben, so werden
- sie dennoch erzeugt und erhalten den Namen der Quelldatei mit den
- Extensionen .Z80, .S80, .E80. Wird auch quelle.ext nicht angegeben,
- erfragt A80 interaktiv die Namen der Dateien. Allerdings muß nur die
- Quelledatei angegeben werden. Will man die anderen Dateien nicht
- extra eingeben, so drückt man CR bei der entsprechenden
- Eingabeaufforderung. Die Datei erhält dann den Dateinamen der
- Quelldatei mit der Extension wie oben angegeben.
-
-
- 3. Die Assemblersprache von A80
-
- A80 unterscheidet nicht zwischen Groß- und Kleinschreibung. Achten
- Sie darauf, daß im Assemblerquellcode die ASCII-Zeichen mit den Codes
-
-
-
-
- 0, 1, 2, 3 und 255 nicht vorkommen dürfen. Diese verwendet der
- Assembler intern. A80 unterstützt den gesamten Befehlssatz des Z80.
- Die symbolische Schreibweise der Befehle folgt der allgemein
- üblichen, nämlich der von Zilog. Es darf jeweils nur ein Befehl pro
- Zeile stehen. Vor dem Befehl kann in der selben Zeile ein Label
- definiert werden. Hinter dem Befehl kann ein Kommentar, eingeleitet
- mit ; geschrieben werden:
-
- label: xor a,a ; Kommentar
-
- Dabei ist darauf zu achten, daß
- 1. zwischen Label und Befehl und zwischen Befehl und erstem Operand
- als Trennzeichen mindestens ein Leerzeichen oder Tabstop steht
- (Komma beliebig),
- 2. zwischen zwei Operanden als Trennzeichen mindestens ein Komma
- steht (Leerzeichen, Tabstops beliebig) und
- 3. zwischen einem Label und dem folgenden ":" kein Leerzeichen und
- kein Tabstop stehen darf.
- Abweichend von der Zilogdefinition kann statt (ix ± 0) (ix)
- geschrieben werden, entsprechend für (iy ± 0) (iy).
- Jedem Befehl, der eine Konstante (ob als Zahl oder Adresse)
- erfordert, kann diese als mathematischer Ausdruck, wie in Abschnitt 4
- beschrieben, mitgeteilt werden. Es wird kein Unterschied zwischen
- Byte- und Wordkonstanten oder Symbolen, die Adressen repräsentieren,
- gemacht.
- Bei relativen Sprungbefehlen wird der Operand als direkte Angabe der
- Sprungweite, des Displacements, aufgefaßt, wenn das erste Zeichen des
- Operanden ein "+" oder "-" ist, sonst als Angabe des Sprungzieles.
-
-
- 4. Ausdrücke
-
- a) Strings
- Strings sind ASCII-Zeichenfolgen, eingeschlossen entweder in
- Anführungsstriche oder Hochkommata, z.B:
-
- "text.."
- 'abcd..'
-
- In Anführungsstriche eingeschlossene Strings dürfen keine
- Anführungsstriche enthalten, entsprechendes gilt für in Hochkommata
- eingeschlossene.
-
- b) Zahlen
- Werden Zahlen nicht besonders spezifiziert, so werden sie als
- Dezimal-Zahlen interpretiert. Sollen sie nicht als Dezimal-Zahlen
- aufgefaßt werden, ist ihnen ein Buchstabe wie folgt anzufügen:
-
- Buchstabe Zahlensystem Beispiel
- b dual 01101101b
- t Vierer-System 332t
- o, q oktal 177q, 356o
- d dezimal 10d (d ist optional)
- h sedezimal 77h, 0CFH, 0afh
-
- Achten Sie darauf, daß sedezimalen Zahlen eine "0" vorangestellt
- werden muß, wenn sie mit einem Buchstaben A..F beginnen, also 0CFH,
- 0afh (CFH und afh würden als undefinierte Symbole bewertet).
- Als Zahlen werden auch Strings mit max. zwei Zeichen bewertet. Sie
- erhalten Werte wie folgt:
-
-
-
-
-
- "" oder '' : 0
- "a" oder 'a' : ASCII-Code des Zeichen, hier also 61h.
- "ab" oder 'ab': ASCII 1.Zeichen * 256 + ASCII 2., also 6162h
-
- c) Operatoren
- Zahlen können mit Operatoren zu Ausdrücken verbunden werden. Statt
- einer einzelnen Zahl kann immer auch ein Ausdruck stehen.
- Es gibt in A80 folgende Operatoren:
-
- (...), [...], {...}: Klammern
- - : Monadisches Minus wie bei -123
- ^ : Potenzierung
- BIT, LOW, HIGH : Funktionen, s.u.
- *, /, MOD, SHL, SHR: Multiplikation, Division,
- Divisionsrest, arith. Schieben nach links und
- rechts
- +, - : Addition, Subtraktion
- NOT : Funktion, s.u.
- AND : verknüpft seine beiden Operanden bitweise UND.
- OR, XOR : verknüpfen ihre beiden Operanden bitweise ODER
- bzw. exklusiv-ODER.
-
- Die Reihenfolge der Operatoren von oben nach unten gibt ihre
- Priorität an. Sie nimmt von oben nach unten ab. D. h in dem Ausdruck
- NOT a + b wird zunächst die Summe von a und b gebildet und diese
- anschließend komplementiert. Will man erreichen, daß erst a
- komplementiert und zu dem Ergebnis davon b addiert wird, müssen
- Klammern gesetzt werden: (NOT a) + b.
-
- NOT exp
- bildet das Einer-Komplement des Ausdruckes exp, d.h. exp wird
- bitweise negiert.
-
- HIGH exp
- liefert exp DIV 256. Dient dazu, das höherwertige Byte eines Words zu
- isolieren.
-
- LOW exp
- liefert exp MOD 256. Dient dazu, das niederwertige Byte eines Words
- zu isolieren.
-
- BIT exp
- liefert 1 SHL exp. Dient dazu, explizit einzelne Bits zu setzen.
-
- Beispiele:
-
- ld hl, 21 + 45
- ld b , 3 * 5 + 6 * high (65534)
- ld a , 34 and (34 * 4)
-
- d) Symbole und Labels
- Symbole repräsentieren eine Zahl. Sie dürfen nicht mit folgenden
- Zeichen beginnen: '0', '1',..., '9', ':'. Anführungsstriche " und das
- Hochkomma ' dürfen überhaupt nicht in Symbolen enthalten sein.
- Gültige Symbole sind z.B:
-
- Hallo
- D2
- D_X1Y
-
-
-
-
-
- Ungültig sind z.B:
-
- 2D
- AB"Bs
- D'D123
-
- Symbole können immer an Stelle einer Zahl oder eines Ausdrucks
- gebraucht werden, z.B.:
-
- ld hl, 1 + hallo
- ld (x1), a
- ld b, var1 and {var2 * 36}
-
- Symbolen werden mit dem Pseudo-Befehl EQU oder optional = Werte
- zugewiesen (s. Abschnitt 5), z.B
-
- hallo equ 34
- x1 equ 100 + 34 * (23 xor 45)
- var1 equ bit 1 or bit 5
- var2 = bit 2 + bit 15
- var3 equ var1 * var2 - 34
-
- Die Befehle
-
- hallo equ 10h
- ld a, hallo
-
- bedeuten also das gleiche wie
-
- ld a, 10h
-
- Symbole können auch (s.o.) durch andere Symbole definiert werden.
- Wenn nicht anders angegeben, brauchen Symbole zum Zeitpunkt der
- Verwendung nicht definiert zu sein. Sie müssen dann später im
- Quelltext definiert werden. Der Assembler erkennt undefinierte
- Symbole und setzt ihren Wert später, nachdem sie definiert worden
- sind, ein. Z.B:
-
- ld hl, (daten)
- ...
- ...
- ...
- daten equ 7fffh
-
- Auch die Schachtelung undefinierter Symbole ist möglich, z.B:
-
- ld a, var1
- var1 equ var2 + var3
- var2 equ var4 * var5
- var3 equ var5 * (var4 + 2)
-
- var4 equ var5 + 1
- var5 equ 2
-
- wird übersetzt als
-
- ld a, 16
-
-
-
-
-
-
- Es gibt zwei reservierte Symbole mit spezieller Bedeutung:
-
- $ liefert den aktuellen Wert des Program Counter (PC-Register).
- $$ liefert die Position, die der Befehl absolut in der
- Assemblerdatei hat. (s. auch ORG)
-
- Ein Label ist eine besondere Art Symbol. Ein Label wird wie folgt
- definiert:
-
- symbol:
-
- wobei symbol für ein beliebiges bisher undefiniertes Symbol steht.
- Dieses Symbol erhält den Wert zugewiesen, den der Program Counter an
- dieser Stelle hat. Es dient daher hauptsächlich zur Definition von
- Symbolen, die Adressen und Sprungziele repräsentieren. Z.B.:
-
- jp nz, schleife1
- ...
- ...
- ...
- schleife: ld a, b
- or c
- ...
-
- Die Definition eines Labels
-
- label:
-
- ist quasi eine abkürzende Schreibweise für
-
- label equ $
-
-
- 5. Pseudo-Befehle
-
- EQU oder optional: =
- Syntax: sym EQU exp
-
- Dem Symbol sym wird der Wert des Ausdrucks exp zugewiesen. exp darf
- zum Zeitpunkt der Assemblierung undefiniert sein.
-
- DEFB oder optional: DB, DEFM, DC
- Syntax: DEFB [string1|exp1 [, string2|exp2 [, string3|exp3 [,...
-
- Wird DEFB ohne Operanden aufgerufen, so reserviert es ein Byte
- Speicherplatz. Wird es mit Operanden aufgerufen, so reserviert es,
- wenn der Operand ein mathematischer Ausdruck ist, ein Byte pro
- Operand, das mit dem Wert des Operanden initialisiert wird, und, wenn
- es sich um einen String handelt, pro Zeichen ein Byte, das mit dem
- ASCII-Code des Zeichen initialisiert wird.
-
- DEFW oder optional: DW
- Syntax: DEFW [exp1 [, exp2 [, exp3 [, ...
-
- Ohne Operanden aufgerufen, reserviert DEFW ein Word (also zwei Byte)
- Speicherplatz. Mit Operanden reserviert DEFW pro Operand ein Word.
- Dieses wird mit dem Wert des jeweiligen Operanden initialisiert.
-
-
-
-
-
-
-
- DEFS oder optional: DS
- Syntax: DEFS exp1 [, exp2]
-
- Reserviert exp1 Bytes, die mit exp2 initialisiert werden, wenn exp2
- gegeben ist. exp1 und exp2 müssen bei Assemblierung des Befehls
- definiert sein, d.h. es dürfen keine undefinierten Symbole mit DEFS
- verwendet werden. Bei DEFS wird nicht geprüft, ob exp2 < 256 und >= -
- 256 ist, sondern es wird mit exp2 MOD 256 initialisiert.
-
- CSEG
- Syntax: CSEG
-
- Nachfolgender Code wird gespeichert. Normale Option (Gegensatz siehe
- DSEG). CSEG ist die Anfangseinstellung von A80, muß also am
- Programmbeginn nicht explizit gesetzt werden.
-
- DSEG
- Syntax: DSEG
-
- Nachfolgender Code wird nicht gespeichert, sondern nur assembliert.
- Normalerweise wird DSEG nur bei Datenbereichen, die nicht vom
- Assembler initialisiert werden sollen, verwendet (z.B. Bereiche, die
- später in einem RAM zu liegen kommen), d.h: Der PC wird weiter
- entsprechend der Länge der Daten hochgezählt, aber das
- Assemblierungsergebnis in diesem Abschnitt nicht in der
- Maschinensprache-Datei abgespeichert. Abschaltung durch CSEG.
-
- ORG
- Syntax: ORG exp1 [, exp2]
-
- Der folgende Code wird in der Maschinencodedatei ab der Stelle exp1
- gespeichert, aber so, als ob er an der Stelle exp2 stünde, wenn exp2
- gegeben ist. $$ korrespondiert dabei mit exp1, $ mit exp2. exp1 und
- exp2 müssen zum Zeitpunkt der Assemblierung bekannt sein, d.h sie
- dürfen keine undefinierten Symbole enthalten.
-
- org 0, 8100h
-
- bedeutet z.B., daß der nachfolgende Code ab der Stelle 0 in der
- Maschinencode-Datei abgelegt wird, aber so assembliert wird, daß er
- auf dem Z80-Rechner auf Adresse 8100h gelegt werden muß, um lauffähig
- zu sein.
-
- INCLUDE
- Syntax: INCLUDE include.ext
-
- Der Inhalt der Assemblerquelldatei include.ext wird assembliert, so
- als ob er direkt in der eigentlichen Quelldatei quelle.ext stünde.
- INCLUDE kann 254mal geschachtelt werden.
-
-
- 6. Fehlermeldungen
-
- Fehlermeldungen werden normalerweise gefolgt von der Zeilennummer der
- Zeile, in der der Fehler auftrat, ausgegeben. Folgende Fehler werden
- gemeldet:
-
- "Unbekannter Befehl oder falsche Operanden-Anzahl"
- spricht für sich.
-
-
-
-
-
- "Unbekannter Operand"
- Der Operand ist unbekannt, er kann auch nicht als undefiniertes
- Symbol bewertet werden.
-
- "Illegale Operanden-Kombination"
- Ein Operand oder beide in der verwendeten Kombination können mit dem
- Befehl nicht verwendet werden.
-
- "Keine Zahl, falsche Ziffern oder Zahl zu groß "
- Die Zahl ist größer als 65535 oder kleiner als -65536. Oder es
- tauchen unerlaubte Charaktere in der Zahl auf. Oft ist dann das "h"
- zur Kennzeichnung einer sedezimalen Zahl vergessen worden.
-
- "Displacement zu groß (> 129 oder < - 126)"
- Die Distanz bei einem relativen Sprung ist zu groß.
-
- "Code und Daten sind größer als 64k"
- Der Adressraum des Z80 ist 64k groß, mehr Code und Daten können nicht
- gespeichert werden.
-
- "Symbol doppelt definiert"
- Es wurde versucht ein Symbol zweimal mit jeweils einem anderen Wert
- zu definieren. Mit demselben Wert kann ein Symbol mehrmals definiert
- werden.
-
- "Klammer nicht geschlossen"
- spricht für sich.
-
- "Kein gültiger Ausdruck"
- Der mathematische Term ist nicht korrekt.
-
- "Kein korrektes Symbol"
- Das erste Zeichen des Symbols ist unzulässig.
-
- "Zahl darf nicht undefiniert sein"
- Diesem Befehl darf kein Ausdruck übergeben werden, der zur Zeit der
- Assemblierung dieses Befehls noch undefinierte Symbole enthält.
-
- "Verschachtelungstiefe bei INCLUDE zu groß"
- spricht für sich.
-
- "Zuviele Symbole und Labels definiert"
- spricht für sich.
-
- "Undefinierte Symbole"
- Nicht alle im Quellcode verwendeten Symbole sind definiert worden. Es
- folgt ein Liste mit den Zeilen, in denen die undefinierten Symbole
- vorkommen. Kann auch dadurch auftreten, daß bei bedingten
- Sprungbefehlen das Komma zwischen Bedingung und Sprungziel vergessen
- wurde, also z.B jp nz ziel statt jp nz, ziel.
-
- "Zahl muß < 256 und >= -256 sein"
- Es wurde versucht, einem Befehl, der ein Byte als Operanden
- erfordert, ein Wert > 256 oder < -256 zu übergeben.
-
- "Offset zu groß"
- Der Offset muß im Wertebereich [-256..255] liegen.
-
-
-
-
-
-
-
- 7. Verschiedenes
-
- Der Autor arbeitet daran, dieses Produkt ständig zu verbessern. Wenn
- Sie, auch als unregistrierter Benutzer, eine Frage, einen Wunsch oder
- eine Anregung haben, schreiben Sie mir. Wer einen mir unbekannten
- Fehler als Erster entdeckt und mir eine Beschreibung des Fehlers
- (Computersystem, Kontext des fehlerhaften Befehls, evtl. komplette
- Assemblerquelle etc.), zusendet, erhält von mir das nächste Update
- kostenlos und wird kostenlos registriert.
- Meine Anschrift ist:
-
- André Grüning
- Alte Heerstr. 50a
- D-3250 Hameln 1
-
- Bitte legen Sie Rückporto bei oder geben Sie Ihre Telefonnummer an.
-
-
- 8. Erweiterter Befehlssatz (nur registrierte Version)
-
- Die folgenden Befehle können nur mit der registrierten Version von
- A80 assembliert werden.
- Zilog, der Hersteller des Z80-Prozessors, hat nicht alle
- Maschinenbefehle veröffentlicht, so daß zahlreiche "geheime" Op-Codes
- bestehen. Da gibt es weitere Schiebebefehle und das Aufspalten der
- Indexregister IX und IY in je zwei 8-Bit-Hälften, so daß IX und IY
- nun fast gleichberechtigt neben HL stehen.
- Ich gebe keine Garantie, daß alle erweiterten Maschinenbefehle auf
- jedem Z80-Prozessor funktionieren. Also ausprobieren!
- Siehe auch Artikel "422 neue Z80-Befehle" in der Zeitschrift mc 1/82,
- Seite 27.
-
- .Z80
- Syntax: .Z80
-
- aktiviert den offiziellen Z80-Befehlssatz, so daß die erweiterten
- Operationen zu Fehlern führen. Dies ist die Anfangseinstellung von
- A80.
-
- .EXT
- Syntax: .EXT
-
- aktiviert den erweiterten Z80-Befehlssatz, so daß die im folgenden
- aufgeführten erweiterten Operationen verwendet werden können.
-
- Beschreibung des erweiterten Befehlssatzes:
-
- a) Aufspalten der Indexregister in 8-Bit-Hälften:
- Die Hälften von IX und IY werden wie folgt angesprochen:
-
- HX: höherwertiges Byte IX
- LX: niederwertiges Byte IX
- HY: höherwertiges Byte IY
- LY: niederwertiges Byte IY
-
- Es existieren folgende Befehle bzgl. IX (für IY dieselben, bloß
- Prefix 0DDH ausgetauscht gegen 0FDH:
-
-
-
-
-
-
-
- Mnemonic: Op-Code: Mnemonic: Op-Code:
-
- LD HX, exp DD 26 exp LD HX, B DD 60
- LD LX, exp DD 2E exp LD HX, C DD 61
- LD B, HX DD 44 LD HX, D DD 62
- LD B, LX DD 45 LD HX, E DD 63
- LD C, HX DD 4C LD HX, LX DD 65
- LD C, LX DD 4D LD HX, A DD 67
- LD D, HX DD 54 LD LX, B DD 68
- LD D, LX DD 55 LD LX, C DD 69
- LD E, HX DD 5C LD LX, D DD 6A
- LD E, LX DD 5D LD LX, E DD 6B
- LD A, HX DD 7C LD LX, HX DD 6C
- LD A, LX DD 7D LD LX, A DD 6F
-
- INC HX DD 24 SBC A, HX DD 9C
- INC LX DD 2C SBC A, LX DD 9D
- DEC HX DD 25 AND HX DD A4
- DEC LX DD 2D AND LX DD A5
- ADD A, HX DD 84 XOR HX DD AC
- ADD A, LX DD 85 XOR LX DD AD
- ADC A, HX DD 8C OR HX DD B4
- ADC A, LX DD 8D OR LX DD B5
- SUB HX DD 94 CP HX DD BC
- SUB LX DD 95 CP LX DD BD
-
- b) Verschiebeoperation SLIA reg8
- Der Befehl SLIA schiebt den Inhalt des betroffenen Registers nach
- links wie der SLA-Befehl und füllt zusätzlich von links mit 1 auf.
- Das höchstwertige Bit wandert dabei ins Carry-Flag:
- 00001000 SLIA => 00010001 SLIA => 00100011
-
- Mnemonic: Op-Code: Mnemonic: Op-Code:
- SLIA B CB 30 SLIA H CB 34
- SLIA C CB 31 SLIA L CB 35
- SLIA D CB 32 SLIA (HL) CB 36
- SLIA E CB 33 SLIA A CB 37
-
- SLIA (IX+ofs) DD CB ofs 36
- SLIA (IY+ofs) FD CB ofs 36
-
-
- c) Lade-Verschiebe- bzw. Lade-Bit-Operationen
- Diese Operationen sind Kombinationen aus Lade- und Verschiebe- bzw.
- Bitoperationen. Die Verschiebe- bzw. Bitoperation bezieht sich dabei
- immer auf (IX+ofs) oder (IY+ofs). Das Ergebnis dieser Operation wird
- dabei direkt in (IX+ofs) oder (IY+ofs) gespeichert, zusätzlich aber
- auch in ein anderes Register übertragen.
- Beispiele sind für IX gegeben. Durch Austausch des Prefixes 0DDH
- gegen 0FDH erhält man die entsprechenden IY-Befehle.
-
- Es gibt folgende Befehle:
- LRLC wie RLC + LD LSRA wie SRA + LD
- LRRC wie RRC + LD LSLIA wie SLIA + LD
- LRL wie RL + LD LSRL wie SRL + LD
- LRR wie RR + LD LRES wie RES + LD
- LSLA wie SLA + LD LSET wie SET + LD
-
-
-
-
-
-
-
- Lade-Verschiebe-Operationen:
- Mnemonic: LBef reg8, (IX+ofs) Op-Code: DD CB ofs xx
- z.B. : LRLL D, (IX+10) Op-Code: DD CB 0A 12
-
-
- xx LBef LRLC LRRC LRLL LRR LSLA LSRA LSLIA LSRL
- reg8
- B 00 08 10 18 20 28 30 38
- C 01 09 11 19 21 29 31 39
- D 02 0A 12 1A 22 2A 32 3A
- E 03 0B 13 1B 23 2B 33 3B
- H 04 0C 14 1C 24 2C 34 3C
- L 05 0D 15 1D 25 2D 35 3D
- A 07 0F 17 1F 27 2F 37 3F
-
-
- Lade-Res-Operationen:
- Mnemonic: LRES reg8, bit, (IX+ofs) Op-Code: DD CB ofs xx
- z.B. : LRES H, 4, (IX+05) Op-Code: DD CB 05 A4
-
- xx bit 0 1 2 3 4 5 6 7
- reg8
- B 80 88 90 98 A0 A8 B0 B8
- C 81 89 91 99 A1 A9 B1 B9
- D 82 8A 92 9A A2 AA B2 BA
- E 83 8B 93 9B A3 AB B3 BB
- H 84 8C 94 9C A4 AC B4 BC
- L 85 8D 95 9D A5 AD B5 BD
- A 87 8F 97 9F A7 AF B7 BF
-
-
- Lade-Set-Operationen:
- Mnemonic: LSET reg8, bit, (IX+ofs) Op-Code: DD CB ofs xx
- z.B. : LSET L, 2, (IX+07) Op-Code: DD CB 07 D5
-
- xx bit 0 1 2 3 4 5 6 7
- reg8
- B C0 C8 D0 D8 E0 E8 F0 F8
- C C1 C9 D1 D9 E1 E9 F1 F9
- D C2 CA D2 DA E2 EA F2 FA
- E C3 CB D3 DB E3 EB F3 FB
- H C4 CC D4 DC E4 EC F4 FC
- L C5 CD D5 DD E5 ED F5 FD
- A C7 CF D7 DF E7 EF F7 FF
-
-
-
-
-
-
-
-
-