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                                                                 
