Screen 0 not modified 0 \ VolksForth 8080 Assembler UH 09Mar86 1 2 Ideen lieferten: 3 John Cassady 4 Mike Perry 5 Klaus Schleisiek 6 Bernd Pennemann 7 Dietrich Weineck 8 9 10 11 12 13 14 15 Screen 1 not modified 0 \ VolksForth 8080 Assembler Load Screen UH 03Jun86 1 Onlyforth Assembler also definitions hex 2 3 1 6 +THRU cr .( VolksForth 8080-Assembler geladen. ) cr 4 5 OnlyForth 6 7 8 9 10 11 12 13 14 15 Screen 2 not modified 0 \ Vektorisierte Erzeugung UH 03Jun86 1 Variable >codes 2 3 | Create nrc ] c, , c@ here allot ! c! [ 4 5 : nonrelocate ( -- ) nrc >codes ! ; nonrelocate 6 7 | : >exec ( n -- n+2 ) 8 Create dup c, 2+ does> c@ >codes @ + perform ; 9 10 0 | >exec >c, | >exec >, | >exec >c@ | >exec >here 11 | >exec >allot | >exec >! | >exec >c! 12 drop 13 14 15 Screen 3 not modified 0 \ Register und Definierende Worte UH 09Mar86 1 2 7 Constant A 3 0 Constant B 1 Constant C 2 Constant D 3 Constant E 4 0 Constant I 1 Constant I' 2 Constant W 3 Constant W' 5 0 Constant IP 1 Constant IP' 4 Constant H 5 Constant L 6 6 Constant M 6 Constant PSW 6 Constant SP 6 Constant S 7 8 | : 1MI Create >c, does> C@ >c, ; 9 | : 2MI Create >c, does> C@ + >c, ; 10 | : 3MI Create >c, does> C@ swap 8 * + >c, ; 11 | : 4MI Create >c, does> C@ >c, >c, ; 12 | : 5MI Create >c, does> C@ >c, >, ; 13 14 15 Screen 4 not modified 0 \ Mnemonics UH 09Mar86 1 00 1MI nop 76 1MI hlt F3 1MI di FB 1MI ei 07 1MI rlc 2 0F 1MI rrc 17 1MI ral 1F 1MI rar E9 1MI pchl EB 1MI xchg 3 C9 1MI ret C0 1MI rnz C8 1MI rz D0 1MI rnc D8 1MI rc 4 2F 1MI cma 37 1MI stc 3F 1MI cmc F9 1MI sphl E3 1MI xthl 5 E0 1MI rpo E8 1MI rpe F8 1MI rm 27 1MI daa 6 80 2MI add 88 2MI adc 90 2MI sub 98 2MI sbb A0 2MI ana 7 A8 2MI xra B0 2MI ora B8 2MI cmp 02 3MI stax 04 3MI inr 8 03 3MI inx 09 3MI dad 0B 3MI dcx C1 3MI pop C5 3MI push 9 C7 3MI rst 05 3MI dcr 0A 3MI ldax D3 4MI out DB 4MI in 10 C6 4MI adi CE 4MI aci D6 4MI sui DE 4MI sbi E6 4MI ani 11 EE 4MI xri F6 4MI ori FE 4MI cpi 22 5MI shld CD 5MI call 12 2A 5MI lhld 32 5MI sta 3A 5MI lda C3 5MI jmp 13 C2 5MI jnz CA 5MI jz D2 5MI jnc DA 5MI jc E2 5MI jpo 14 EA 5MI jpe F2 5MI jp FA 5MI jm 15 Screen 5 not modified 0 \ Spezial Mnemonics und Spruenge UH 09Mar86 1 DA Constant C0= D2 Constant C0<> D2 Constant CS 2 C2 Constant 0= CA Constant 0<> E2 Constant PE 3 F2 Constant 0< FA Constant 0>= : not 8 [ FORTH ] xor ; 4 5 : mov 8 * 40 + + >c, ; 6 : mvi 8 * 6 + >c, >c, ; : lxi 8 * 1+ >c, >, ; 7 8 : [[ ( -- addr ) >here ; \ BEGIN 9 : ?] ( addr opcode -- ) >c, >, ; \ UNTIL 10 : ?[ ( opcode -- addr ) >c, >here 0 >, ; \ IF 11 : ?[[ ( addr -- addr' addr ) ?[ swap ; \ WHILE 12 : ]? ( addr -- ) >here swap >! ; \ THEN 13 : ][ ( addr -- addr' ) >here 1+ 0 jmp swap ]? ; \ ELSE 14 : ]] ( addr -- ) jmp ; \ AGAIN 15 : ]]? ( addr addr' -- ) jmp ]? ; \ REPEAT Screen 6 not modified 0 \ Macros UH 14May86 1 : end-code context 2- @ context ! ; 2 3 : ;c: 0 recover call end-code ] ; 4 5 : Next >next jmp ; 6 7 : rpush ( reg -- ) RP lhld H dcx DUP M mov ( high ) 8 H dcx 1+ M mov ( low ) RP shld ; 9 10 : rpop ( reg -- ) RP lhld M over 1+ mov ( low ) H inx 11 M swap mov ( high ) H inx RP shld ; 12 \ rpush und rpop gehen nicht mit HL 13 14 : mvx ( src dest -- ) 15 2dup mov ( high ) 1+ swap 1+ swap mov ( low ) ; Screen 7 not modified 0 \ Definierende Worte UH 06Aug86 1 Forth definitions 2 : Code ( -- ) Create here dup 2- ! Assembler ; 3 4 : ;Code ( -- ) 0 ?pairs 5 compile [ ' does> >body 2+ @ , ] 6 reveal [compile] [ Assembler ; immediate 7 8 : >label ( adr -- ) 9 here | Create swap , 4 hallot >here 4 - heap 4 cmove 10 heap last @ (name> ! dp ! 11 does> ( -- adr ) @ State @ IF [compile] Literal THEN ; 12 13 : Label [ Assembler ] >here >label Assembler ; 14 15 Screen 8 not modified 0 UH 14May86 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Screen 9 not modified 0 % VolksForth 8080 Assembler Shadow-Screens UH 09Mar86 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Screen 10 not modified 0 % VolksForth 8080 Assembler UH 03Jun86 1 2 Der 8080 Assembler wurde von John Cassady, in den Forth 3 Dimensions veroeffentlicht und von Mike Perry im F83 4 implementiert. Er unterstuetzt den gesamten 8080 Befehlsvorrat 5 und auch Befehle zur strukturierten Assemblerprogrammierung. 6 Um ein Wort in Assembler zu definieren wird das definierende 7 Wort Code benutzt, es kann, muss aber nicht mit end-code beendet 8 werden. Wie der Assembler arbeitet ist ein interessantes 9 Beispiel fuer die Maechtigkeit von Create does>. 10 Am Anfang werden die Befehle in Klassen eingeteilt und fuer 11 jede Klasse ein definierndes Wort definiert. Wenn der Mnemonic 12 des Befehls spaeter interpretiert wird, kompiliert er den 13 entsprechenden Opcode. 14 15 Screen 11 not modified 0 % Vektorisierte Erzeugung UH 09Mar86 1 Zeigt Auf die Tabelle mit den aktuellen Erzeugungs-Operatoren. 2 3 Tabelle mit Erzeugungs-Operatoren fuer In-Line Assembler 4 5 Schaltet Assembler in den In-Line Modus. 6 7 Definierendes Wort fuer Erzeugungs-Operator-Namen. 8 9 10 Die Erzeugungs-Operator-Namen, sie fuehren den entsprechenden 11 aktuellen Erzeugungsoperator aus. 12 13 Mit diesen Erweiterungen kann der Assembler auch fuer den 14 Target-Compiler benutzt werden. 15 Screen 12 not modified 0 % Register und Definierende Worte UH 09Mar86 1 2 Die 8080 Register werden definiert. Es sind einfach Konstanten 3 die Information fuer die Mnemonics hinterlassen. 4 Einige Register der Forth-Maschine: 5 IP ist BC, W ist DE 6 7 8 Definierende Worte fuer die Mnemonics. 9 Fast alle 8080 Befehle fallen in diese 5 Klassen. 10 11 12 13 14 15 Screen 13 not modified 0 % Mnemonics UH 09Mar86 1 Die 8080 Mnemonics werden definiert. 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Screen 14 not modified 0 % Spezial Mnemonics und Spruenge UH 09Mar86 1 Vergleiche des 8080 2 3 not folgt einem Vergleich, wenn er invertiert werden soll. 4 5 die Mnemonics, die sich nicht in die Klassen MI1 bis MI5 6 einteilen lassen. 7 8 Die strukturierten Assembler-Anweisungen. 9 Die 'Fleischerhaken' werden benutzt, damit keine Verwechselungen 10 zu den strukturierten Anweisungen in Forth entstehen. 11 Es findet keine Absicherung der Kontrollstrukturen statt, sodass 12 sie auch beliebig missbraucht, werden koennen. 13 Das ist manchmal aus Geschwindigkeitsgruenden leider notwendig. 14 15 Screen 15 not modified 0 % Macros UH 17May86 1 end-code beendet eine Code-Definition 2 3 ;c: Erlaubt das Einbinden von High-Level Forth in Code-Worten. 4 5 Next Assembliert einen Sprung zum Adress-Interpretierer. 6 7 rpush Das angegebene Register wird auf den Return-Stack gelegt. 8 9 10 rpop Das angegebene Register wird vom Return-Stack genommen. 11 12 rpush und rpop benutzen das HL Register. 13 14 mvx Ein 16-Bit-Move wie 'mov' fuer 8-Bit Register 15 Bewegt Registerpaare HL BC DE Screen 16 not modified 0 % Definierende Worte UH 17May86 1 Code leitet eine Code-Definition ein. 2 3 ;code ist das Low-Level-Aequivalent von does> 4 5 6 >label erzeugt ein Label auf dem Heap, mit dem angegebenen Wert 7 8 9 10 11 Label erzeugt ein Label auf dem Heap, mit dem Wert von here 12 13 14 15 Screen 17 not modified 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15