Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
forth:fgforth:assembler [2011/01/18 08:39] – Page moved from fgforth:assembler to forth:fgforth:assembler volkerp | forth:fgforth:assembler [2013/05/01 13:26] (aktuell) – volkerp | ||
---|---|---|---|
Zeile 3: | Zeile 3: | ||
Thomas Beierlein: | Thomas Beierlein: | ||
- | Da ich in letzter Zeit eine Reihe von Fragen zur Benutzung des Z80- | + | Da ich in letzter Zeit eine Reihe von Fragen zur Benutzung des Z80-Assemblers |
- | Assemblers in FORTH83 erhalten habe, möchte ich hier einige Hinweise | + | in FORTH83 erhalten habe, möchte ich hier einige Hinweise |
zu seiner Benutzung geben. Da ich z.Z. unter chronischem Zeitmangel | zu seiner Benutzung geben. Da ich z.Z. unter chronischem Zeitmangel | ||
stehe, wird es nur eine recht kurze Barstellung. Zur Sache: | stehe, wird es nur eine recht kurze Barstellung. Zur Sache: | ||
Zeile 23: | Zeile 23: | ||
LABEL < | LABEL < | ||
- | definiert | + | definiert |
Bei der Benutzung von Code-Definitionen ist zu beachten, daß die | Bei der Benutzung von Code-Definitionen ist zu beachten, daß die | ||
Register BC und IY vom System verwendet werden. Sie sind also bei | Register BC und IY vom System verwendet werden. Sie sind also bei | ||
Zeile 33: | Zeile 33: | ||
folgende Syntaxregeln zu beachten: | folgende Syntaxregeln zu beachten: | ||
* alle Mnemoniks haben ein , (Komma) am Namensende, | * alle Mnemoniks haben ein , (Komma) am Namensende, | ||
- | * die Notation der Parameter erfolgt | + | * die Notation der Parameter erfolgt |
| | ||
Folgende Regeln gelten für die Kennzeichnung der Parameter: | Folgende Regeln gelten für die Kennzeichnung der Parameter: | ||
Zeile 52: | Zeile 52: | ||
Die folgenden Entscheidungsbedingungen gibt es dabei: | Die folgenden Entscheidungsbedingungen gibt es dabei: | ||
- | 0= (Zero)\\ | + | 0= (Zero)\\ |
- | CY (Carry)\\ | + | CY (Carry)\\ |
- | PE (Parity)\\ | + | PE (Parity)\\ |
- | 0< | + | 0< (Minus) |
Ein NOT nach der Bedingung negiert seine Bedeutung (0= NOT IF, | Ein NOT nach der Bedingung negiert seine Bedeutung (0= NOT IF, | ||
entspricht so z.B. JPNZ). | entspricht so z.B. JPNZ). | ||
- | Der Assembler unterstützt des weiterenden | + | Der Assembler unterstützt des weiteren den Abschluß einer Coderoutine |
- | mit den Macros NEXT, HPUSH, und DPUSH. | + | mit den Macros NEXT, HPUSH, und DPUSH. |
zur Nextroutine bzw. legen vorher noch das Register DE oder DE und HL | zur Nextroutine bzw. legen vorher noch das Register DE oder DE und HL | ||
auf den Stack. | auf den Stack. | ||
Zeile 78: | Zeile 78: | ||
| LD A,(IX) | 0 IX A LD, | | | LD A,(IX) | 0 IX A LD, | | ||
| SBC HL,DE | DE HL SBC, | | | SBC HL,DE | DE HL SBC, | | ||
- | | OR D | D OR, | | + | | OR D |
| AND 0E7H | HEX 0E7 # AND, | | | AND 0E7H | HEX 0E7 # AND, | | ||
| IN 23 | 23 # IN, | | | IN 23 | 23 # IN, | | ||
Zeile 84: | Zeile 84: | ||
| JRNZ #-5 | -5 # JRNZ, | | | JRNZ #-5 | -5 # JRNZ, | | ||
| RES 0,(IY+4) | 0 4 IY # RES, | | | RES 0,(IY+4) | 0 4 IY # RES, | | ||
+ | |||
Hier waren nun hoffentlich alle Varianten dabei. | Hier waren nun hoffentlich alle Varianten dabei. | ||
Zeile 100: | Zeile 101: | ||
< | < | ||
HEX | HEX | ||
- | 23 CONSTANT PORT \ die Portadresse | + | 23 CONSTANT PORT \ die Portadresse |
- | 0 CONSTANT P0 \ die Bitnummer der Steuer- | + | 0 CONSTANT P0 \ die Bitnummer der Steuer- |
- | 1 CONSTANT P1 \ leitungen im Port | + | 1 CONSTANT P1 \ leitungen im Port |
- | 45 CONSTANT ZK \ Zeitkonstante der Verzög. | + | 45 CONSTANT ZK \ Zeitkonstante der Verzög. |
- | VARIABLE PUFFER \ der 8-Bit Puffer | + | VARIABLE PUFFER |
- | LABEL WAIT \ realisiert Verzögerung | + | LABEL WAIT REVEAL |
- | ZK # HL LD, \ indem HL bis auf 0 | + | ZK # HL LD, |
- | \ heruntergezählt wird | + | \ heruntergezählt wird |
BEGIN, H A LD, L OR, 0= NOT WHILE, HL DEC, REPEAT, | BEGIN, H A LD, L OR, 0= NOT WHILE, HL DEC, REPEAT, | ||
- | RET, | + | RET, |
- | CODE ABTASTUNG \ macht die Arbeit | + | CODE ABTASTUNG |
BEGIN, PORT # IN, P0 A BIT, 0= NOT UNTIL, | BEGIN, PORT # IN, P0 A BIT, 0= NOT UNTIL, | ||
- | \ warte bis P0 High wird | + | |
- | WAIT #) CALL, \ rufe Verzögerung auf | + | WAIT #) CALL, |
- | PORT # IN, P1 A BIT, \ teste P1 und wandle in | + | PORT # IN, P1 A BIT, \ teste P1 und wandle in |
- | 0= IF, A OR, ELSE, SCF, THEN, \ Carry-Flag um | + | 0= IF, A OR, ELSE, SCF, THEN, \ Carry-Flag um |
- | PUFFER #) A LD, \ lade A mit dem Inhalt von | + | PUFFER #) A LD, |
- | RLA, \ Puffer und schiebe Cy ein | + | RLA, \ Puffer und schiebe Cy ein |
- | A PUFFER #) LD, \ lege den Wert wieder zurück | + | A PUFFER #) LD, |
- | NEXT END-CODE \ weiter mit FORTH | + | NEXT END-CODE |
</ | </ | ||
- | So, viel Spaß und nicht verzagen, wenn nicht gleich klappt. | + | So, viel Spaß und nicht verzagen, wenn es nicht gleich klappt. |
+ | |||
+ | Thomas Beierlein, 1990 | ||
+ | |||
+ | ===== Beispiel ===== | ||
+ | |||
+ | |||
+ | Ich habe obiges Beispiel getestet. Dabei ist mir aufgefallen, | ||
+ | |||
+ | Folgender Code wird durch den Assembler erzeugt. Man beachte die Umsetzung der Schleifenkonstrukte. | ||
+ | |||
+ | < | ||
+ | ; | ||
+ | 4685 4673 VARIABLE PUFFER | ||
+ | 4687 86 | ||
+ | 4688 ' | ||
+ | 468E 0497 DOVAR | ||
+ | 4690 0000 | ||
+ | ; | ||
+ | 4692 3897 LABEL WAIT | ||
+ | 4693 84 | ||
+ | 4695 ' | ||
+ | 4699 0497 DOVAR | ||
+ | 469B 21 45 00 | ||
+ | 469E M1 BEGIN, | ||
+ | 469E 7C | ||
+ | 469F B5 | ||
+ | 46A0 CA A7 46 | ||
+ | 46A3 2B | ||
+ | 46A4 C3 9E 46 | ||
+ | 46A7 C9 M2 RET RET, | ||
+ | ; | ||
+ | 46A8 3A8A CODE ABTASTUNG | ||
+ | 46AA 89 | ||
+ | 46AB ' | ||
+ | 46B4 $+2 | ||
+ | 46B6 M3 BEGIN, | ||
+ | 46B6 DB 23 IN A, | ||
+ | 46B8 CB 47 BIT | ||
+ | 46BA CA B6 46 | ||
+ | 46BD CD 9B 46 | ||
+ | 46C0 DB 23 IN A, | ||
+ | 46C2 CB 4F BIT | ||
+ | 46C4 C2 CB 46 | ||
+ | 46C7 B7 | ||
+ | 46C8 C3 CC 46 | ||
+ | 46CB 37 M4 SCF SCF, | ||
+ | 46CC M5 THEN, | ||
+ | 46CC 3A 90 46 | ||
+ | 46CF 17 | ||
+ | 46D0 32 90 46 | ||
+ | 46D3 C3 22 04 | ||
+ | END-CODE | ||
+ | </ | ||
+ | |||
+ | ===== Strukturoperatoren ===== | ||
+ | |||
+ | Die Strukturoperatoren sind forth-gewohnt zu verwenden: | ||
+ | |||
+ | flag 0=, CY, PE oder 0< | ||
+ | |||
+ | IF...ELSE...THEN | ||
+ | |||
+ | < | ||
+ | flag [NOT] IF, ; JP /flag M1 | ||
+ | ... ; ... | ||
+ | [ELSE, | ||
+ | ... ; M1: ... | ||
+ | THEN, ; M2: | ||
+ | </ | ||
+ | |||
+ | |||
+ | BEGIN ...flag UNTIL | ||
+ | |||
+ | < | ||
+ | BEGIN, | ||
+ | ... ; ... | ||
+ | flag [NOT] UNTIL, | ||
+ | </ | ||
+ | |||
+ | BEGIN...AGAIN | ||
+ | |||
+ | < | ||
+ | BEGIN, | ||
+ | ... ; ... | ||
+ | AGAIN, | ||
+ | </ | ||
+ | |||
+ | BEGIN...flag | ||
+ | |||
+ | < | ||
+ | BEGIN, | ||
+ | ... ; ... | ||
+ | flag [NOT] WHILE, | ||
+ | ... ; ... | ||
+ | REPEAT, | ||
+ | ; M2: | ||
+ | </ | ||
- | Thomas Beierlein | + | ===== Literatur ===== |
+ | Der Assembler ist auch in "Vack, Gert Ulrich: Programmieren mit Forth. VEB Verlag Technik Berlin, 1990" Seite 263-271 beschrieben. | ||