VolksForth/sources/cpm/ASS8080.FB.src

307 lines
20 KiB
Plaintext
Raw Normal View History

2020-06-20 16:59:14 +00:00
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