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