mirror of
https://github.com/forth-ev/VolksForth.git
synced 2024-11-29 05:49:26 +00:00
74 lines
2.8 KiB
Org Mode
74 lines
2.8 KiB
Org Mode
#+Title: Der volksForth-8080-Assembler
|
|
|
|
Die CP/M-Version von volksFORTH ist mit einem Assembler für den Intel
|
|
8080 ausgestattet. Dieser Assembler kann aber auch unter den anderen
|
|
Versionen geladen werden und so als Cross-Assembler arbeiten. Diese
|
|
Beschreibung enthält kein vollständiges Glossar, da die Mnemonics des
|
|
Assemblers den meisten Programmierern vertraut sein dürften. Sie dient
|
|
als Ergänzung der Beschreibung des 6502-Assemblers im
|
|
UltraForth83-Handbuch Seite 175ff.
|
|
|
|
Eine genaue Darstellung der Funktionsweise findet sich in dem Artikel
|
|
von John J. Cassady in den FORTH-Dimensions (Jahrgang III/6 Seite
|
|
180f), an dessen Implementation sich die volksFORTH-Version anlehnt.
|
|
|
|
Der 8080-Assembler erlaubt strukturierte Programmierung. Er
|
|
verwendet die gleichen Strukturelemente, wie der 6502-Assembler. Vor
|
|
den Kontrollstrukturen sind folgende Condition Codes zulässig:
|
|
|
|
#+begin_example
|
|
c0= c0<> cs 0= 0<> pe 0< 0>=
|
|
#+end_example
|
|
|
|
Sie entsprechen den Flags im Processor Status Word des 8080. Neben den
|
|
Kontrollstrukturen gibt es auch noch absoluten Sprünge (jc, jm, jmp,
|
|
jnc, jnz, jp, jpe, jpo, jz).
|
|
|
|
Beispiele für die Verwendung des 8080-Assemblers:
|
|
|
|
| volksFORTH | Intel |
|
|
|------------+------------|
|
|
| A xra | xra A |
|
|
| A L mov | mov L,A |
|
|
| 0 H mvi | mvi H,0 |
|
|
| H pop | pop H |
|
|
| vector lxi | lxi vektor |
|
|
| D dad | dad D |
|
|
| ... | ... |
|
|
|
|
|
|
Die Belegung der Forth-Register sieht folgendermaßen aus:
|
|
|
|
| IP | im BC-Registerpaar |
|
|
| W | im DE-Registerpaar |
|
|
| SP | im SP |
|
|
| UP | im Speicher |
|
|
| RP | im Speicher |
|
|
|
|
Die beiden 8-Bit-Hälften von IP und W können auch getrennt
|
|
angesprochen werden durch (IP und IP', bzw. W und W').
|
|
|
|
Zum Ansprechen der 8080-Register dürfen die FORTH-Namen sowie die
|
|
Intel Namen benutzt werden.
|
|
|
|
Zusätzlich enthält das System noch mehrere Macros:
|
|
|
|
* =R rpop= : Hole das 16-Bit-Register R (R<>H) vom Returnstack.
|
|
* =R rpush= : Bringe das 16-Bit-Register R (R<>H) zum Returnstack.
|
|
* =R1 R2 mvx= : Kopiere 16-Bit-Register R1 nach R2.
|
|
* =Next= : Springe zum Address-Interpreter.
|
|
* =;c:= : Schalte den Assembler ab und den Forth-Compiler an.
|
|
|
|
Vordefinierte Labels sind:
|
|
|
|
* =Hpush= : Adresse der Routine, die das H-Register auf den Stack
|
|
bringt und dann zu Next springt.
|
|
* =Dpush= : Adresse der Routine, die das D- und H-Register auf den
|
|
Stack bringt und dann zu Next springt.
|
|
* =>Next= : Adresse des Address-Interpreters.
|
|
* =UP= : Adresse der Speicherzelle für den User-Pointer
|
|
* =RP= : Adresse der Speicherzelle für den Returnstackpointer
|
|
* =IPsave= : Adresse einer Hilfszelle um den IP zwischenzuspeichern
|
|
|
|
Neue Labels können mit =>LABEL= und =LABEL= erzeugt werden, wie im 6502-Assembler.
|