Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

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 volkerpforth: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 <name> .......................... RET, END-CODE LABEL <name> .......................... RET, END-CODE
  
-definiert werdan. Ein Beispiel zur Anwendung folgt am Schluß.+definiert werden. Ein Beispiel zur Anwendung folgt am Schluß.
 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 strang nach umgekehrt polnischer Notation. Die Reihenfolge ist also <Quelle Ziel Operand>.+  * die Notation der Parameter erfolgt streng nach umgekehrt polnischer Notation. Die Reihenfolge ist also <Quelle Ziel Operand>.
      
 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< (Minus)+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 Abschluß einer Coderoutine +Der Assembler unterstützt des weiteren den Abschluß einer Coderoutine 
-mit den Macros NEXT, HPUSH, und DPUSH. diese compilieren einen Sprung+mit den Macros NEXT, HPUSH, und DPUSH. Diese compilieren einen Sprung
 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   | D OR, |
 | 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:
 <code> <code>
 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               \ der 8-Bit Puffer
  
-LABEL WAIT \ realisiert Verzögerung +LABEL WAIT REVEAL               \ realisiert Verzögerung 
-  ZK # HL LD, \ indem HL bis auf 0 +  ZK # HL LD,                   \ indem HL bis auf 0 
-   \ 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                  \ macht die Arbeit
   BEGIN, PORT # IN, P0 A BIT, 0= NOT UNTIL,   BEGIN, PORT # IN, P0 A BIT, 0= NOT UNTIL,
-  \ warte bis P0 High wird +                                \ warte bis P0 High wird 
-  WAIT #) CALL, \ rufe Verzögerung auf +  WAIT #) CALL,                 \ rufe Verzögerung auf 
-  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,               \ lade A mit dem Inhalt von 
-  RLA, \ Puffer und schiebe Cy ein +  RLA,                          \ Puffer und schiebe Cy ein 
-  A PUFFER #) LD, \ lege den Wert wieder zurück +  A PUFFER #) LD,               \ lege den Wert wieder zurück 
-  NEXT END-CODE \ weiter mit FORTH+  NEXT END-CODE                 \ weiter mit FORTH
 </code> </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, dass hinter LABEL noch REVEAL fehlte, sonst ist das Label gar nicht sichtbar. (Oder aber in LABEL muss das HIDE weggepatcht werden). 
 + 
 +Folgender Code wird durch den Assembler erzeugt. Man beachte die Umsetzung der Schleifenkonstrukte. 
 + 
 +<code> 
 +
 +4685  4673                                      VARIABLE PUFFER 
 +4687  86 
 +4688  'PUFFER'+#80 
 +468E  0497                              DOVAR 
 +4690  0000 
 +
 +4692  3897                                      LABEL WAIT 
 +4693  84 
 +4695  'WAIT'+#80 
 +4699  0497                              DOVAR 
 +469B  21 45 00         LD      HL,0045H         ZK # HL LD, 
 +469E                M1                          BEGIN,  
 +469E  7C               LD      A,H                H A LD, 
 +469F  B5               OR      L                  L OR, 
 +46A0  CA A7 46         JP      Z,46A7H          0= NOT WHILE, 
 +46A3  2B               DEC     HL                 HL DEC, 
 +46A4  C3 9E 46         JP      469EH            REPEAT, 
 +46A7  C9            M2 RET                      RET, 
 +
 +46A8  3A8A                                      CODE ABTASTUNG 
 +46AA  89 
 +46AB  'ABTASTUNG'+#80 
 +46B4  $+2                               CODE 
 +46B6                M3                          BEGIN,  
 +46B6  DB 23            IN      A,(23H)            PORT # IN, 
 +46B8  CB 47            BIT     0,               P0 A BIT, 
 +46BA  CA B6 46         JP      Z,46B6H          0= NOT UNTIL, 
 +46BD  CD 9B 46         CALL    469BH            WAIT #) CALL, 
 +46C0  DB 23            IN      A,(23H)          PORT # IN, 
 +46C2  CB 4F            BIT     1,             P1 A BIT, 
 +46C4  C2 CB 46         JP      NZ,46CBH         0= IF, 
 +46C7  B7               OR      A                  A OR, 
 +46C8  C3 CC 46         JP      46CCH            ELSE, 
 +46CB  37            M4 SCF                        SCF, 
 +46CC                M5                          THEN,  
 +46CC  3A 90 46         LD      A,(4690H)        PUFFER #) A LD, 
 +46CF  17               RLA                      RLA, 
 +46D0  32 90 46         LD      (4690H),       A PUFFER #) LD, 
 +46D3  C3 22 04         JP      0422H            NEXT 
 +                                                END-CODE 
 +</code> 
 + 
 +===== Strukturoperatoren ===== 
 + 
 +Die Strukturoperatoren sind forth-gewohnt zu verwenden: 
 + 
 +flag 0=, CY, PE oder 0< 
 + 
 +IF...ELSE...THEN 
 + 
 +<code> 
 +flag [NOT] IF,         ; JP /flag M1 
 +...                             ; ... 
 +[ELSE,                        ; JP M2 
 +...                             ; M1: ... 
 +THEN,                           ; M2: 
 +</code> 
 + 
 + 
 +BEGIN ...flag UNTIL 
 + 
 +<code> 
 +BEGIN,                          ; M1: 
 +...                             ; ... 
 +flag [NOT] UNTIL,               ; JP /flag M1 
 +</code> 
 + 
 +BEGIN...AGAIN 
 + 
 +<code> 
 +BEGIN,                          ; M1: 
 +...                             ; ... 
 +AGAIN,                          ; JP M1 
 +</code> 
 + 
 +BEGIN...flag  WHILE...REPEAT 
 + 
 +<code> 
 +BEGIN,                          ; M1: 
 +...                             ; ... 
 +flag [NOT] WHILE,               ; JP /flag M2 
 +...                             ; ... 
 +REPEAT,                         ; JP M1 
 +                                ; M2: 
 +</code>                                 
  
-Thomas Beierlein+===== Literatur =====
  
 +Der Assembler ist auch in "Vack, Gert Ulrich: Programmieren mit Forth. VEB Verlag Technik Berlin, 1990" Seite 263-271 beschrieben.
  
  • forth/fgforth/assembler.1295339969.txt.gz
  • Zuletzt geändert: 2011/01/18 07:39
  • (Externe Bearbeitung)