mirror of
https://github.com/forth-ev/VolksForth.git
synced 2024-12-24 18:32:02 +00:00
307 lines
20 KiB
Plaintext
307 lines
20 KiB
Plaintext
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
|