You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
fig-FORTH <strong>8086</strong>/<strong>8088</strong><br />
ASSEMBLY SOURCE LISTING<br />
r<br />
io- R i<br />
~TEREST;<br />
G R O U P<br />
RELEASE 1.0<br />
WITH COMPILER SECURITY<br />
AND<br />
VARIABLE LENGTH WORDS<br />
MARCH 1981<br />
This public domain publication is provided through the courtesy<br />
of the FORTH <strong>Interest</strong> <strong>Group</strong>, PO Box 8231, San Jose, CA 95155.<br />
Further distribution must contain this notice.
ASY86 VER 1.0 SOURCE: PORTR.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 1<br />
TITLE 'Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0'<br />
PAGEXIDTH 75<br />
PAGESIZE 66<br />
*+* FIG-FORTH for the <strong>8086</strong>/88 +**<br />
*** ***<br />
*rt* Version 1.0 rt*t<br />
*t* 2/15/81 trt*<br />
*** ***<br />
+*+ Contains interface for ++*<br />
trt+ CP/M-86 (version 1.0) ***<br />
***, ***<br />
*** ***<br />
*** . Implementation by **t<br />
t+* Thomas Kewman ***<br />
**t 27444 Berenda Way ***<br />
*** Hayward, Ca. 94544 +**<br />
* * * ***<br />
.......................................<br />
NOTE: This version only supports one<br />
memory segment of the 8036 (64k bytes).<br />
All publications of the <strong>Forth</strong> <strong>Interest</strong> <strong>Group</strong><br />
are public domain. They may be further<br />
distributed by the inclusion of this credit<br />
notice:<br />
Tnis publication has been made available by the<br />
- -- -- -- - - - - - -<br />
INTEREST<br />
I<br />
P.O. Box 8231<br />
San Jose, CA 95155<br />
. ...............................................<br />
I<br />
,<br />
; Acknowledgements:<br />
I John Cassady<br />
I<br />
t<br />
Kim Harris<br />
George Flammer<br />
I Robt. D. Villwock
ASY86 VER 1.9 SOURCE: FORTH.A86 Fig <strong>Forth</strong> 8080/88 Ver 1.8<br />
EJECT<br />
................................................<br />
I<br />
8<br />
I<br />
I<br />
FIGREL<br />
FIGREV<br />
USRVER<br />
I<br />
I<br />
t<br />
ABL<br />
ACR<br />
ADOT<br />
BELL<br />
BSIN<br />
BSOUT<br />
DLE<br />
LF<br />
FF<br />
I<br />
I<br />
EM<br />
NSCR<br />
KBSUF<br />
us<br />
RTS<br />
CO<br />
NBUF<br />
BUF 1<br />
INITR0<br />
INITSa<br />
RELEASE & VERSION NUMSERS<br />
EQU<br />
EQU<br />
EiZU<br />
ASCII CHARACTERS USED<br />
; FIG RELEASE #<br />
; FIG R EVISIJN #?<br />
; USER VERSIOK #<br />
; SPACE<br />
; CARRIAGE RETURN<br />
; P ERI9C<br />
; (-GI<br />
; INPUT DELETE CHAR<br />
; OUTPUT BACKSPACE (-H)<br />
: (--Dl<br />
; LINE FEED<br />
; FORM FEED (-L)<br />
4B0BH ; END OF MEMORY + 1<br />
1 ; NO. 1324 BYTE SCREENS<br />
128 ; DATA BYTES PER DISK 3LF<br />
4QH ; USER VARIABLES SPACE<br />
0AdH ; RETUgN STK & T5-XM aLF?.<br />
KBBCFt4 ; DISK 3UFFER +4 YYTSS<br />
NSCR*lZ24/KSBUF ; N3. OF 3LFFEXS<br />
EM-CO*NBUF ; F IZST DISK BUF<br />
BUF 1-LS ; (33)<br />
INITR3-ilTS ; (SO)
ASM86 VER 1.0 SOURCE: FORTH,A86<br />
EJECT<br />
ORIG DB<br />
JMP<br />
NOP<br />
JMP<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.B PAGE<br />
908<br />
CLD<br />
WRM<br />
; 'NOP' INSTRUCTION<br />
; VECTOR TO COLD START<br />
: VECTOR TO WARM START<br />
FIGREL ; F IG RELEASE #<br />
FIGREV ; F IG REVISION #<br />
USRVER ; USER VERSION #<br />
OEH ; VERSION ATTRIBUTES<br />
TASK-7 ; TOP WORD IN FORTE VOC<br />
BSIN ; BKSPACE CHARACTER<br />
INITR0 ; I NIT (UP)<br />
; >><br />
I<br />
; MUST BE IN SAME ORDER AS USER VARIABLES<br />
I<br />
DW INITS0 ; I NIT (S0)<br />
DW INITRB ; I NIT (RO)<br />
DW INITS0 ; I NIT (TIB)<br />
DW 3 2 ; I NIT (WIDTH)<br />
DW 0 ; I NIT (NARNING)<br />
DW INITDP ; I NIT (FENCE)<br />
DW INITDP ; I NIT (DP)<br />
DW FORTH+6 ; I NIT (VOC-LINK)<br />
I<br />
; <br />
; THE FOLLOWING IS THE CPU'S NAME (PRINTED DURING<br />
; "COLD" START).<br />
I<br />
; THE NAME IS 32 BITS IN BASE 32.<br />
I<br />
DW 5H, 0B326H ; " <strong>8086</strong>"<br />
INITR0 ; USER AREA POINTER<br />
INITR0 ; RETURN STACK POINTER
SY86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 4<br />
EJECT<br />
.-----------------------------------------------<br />
I<br />
; FORTH REGISTERS<br />
I<br />
; FORTH <strong>8086</strong> FORTH PRESERVATION RULES<br />
. ----- ---- ........................<br />
I<br />
; I P INTERPRETER POINTER.<br />
I YUST BE PRESERVED<br />
I ACROSS FORTH WORDS.<br />
I<br />
W WORKING REGISTER.<br />
I JUMP TO 'DPUSH' WILL<br />
I PUSH CONTENTS ONTO TEE<br />
r PAMMETER STACK BEFORE<br />
I EXECUTING 'APUSH'.<br />
I<br />
; SF PARAMETER STACK POINTER.<br />
I MUST BE PRESERVED<br />
I ACROSS FORTH WORDS.<br />
I<br />
; RP RETURN STACK.<br />
1 MUST BE PRESERVED<br />
I ACROSS FORTE WORDS.<br />
I<br />
I GENERAL REGISTER.<br />
8 JUMP TO 'APUSH' WILL PUSH<br />
I CONTENTS ONTO TYE PAMMETER<br />
I STACK BEFORE EXECUTING 'NEXT' .<br />
I<br />
r GENERAL ?URPOSE REGISTER.<br />
I<br />
I GENERAL PURPOSE REGISTER.<br />
I<br />
I GENERAL PURPOSE REGISTER.<br />
I<br />
r SEGMENT REGISTER. MUST BE<br />
I PRESERVED ACROSS FORTH WORDS.<br />
I<br />
I DS<br />
I<br />
I SS<br />
I8 I1 IS<br />
I1 I I,<br />
I<br />
t ES TEMPORARY SEGMENT REGISTER<br />
I ONLY USED BY A FEW WORDS.<br />
I ..........................-.-...............<br />
1 1 1 1 1 1 1 1 1 1 1 / 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 l ) 1 1 1 1
ASM86 VER 1.0 SOURCE: FORTH.A86<br />
EJECT<br />
I<br />
; COMMENT CONVENTIONS:<br />
I - = MEANS<br />
;
SM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>j88 Ver 1.0 PAGE 6<br />
EJECT<br />
i ;""-'---"---'-'-------------------"'--------<br />
I DEBUG SUPPORT<br />
I<br />
; THIS ROUTINE WILL ALLOW Y3U TO STEP THRU FORTH<br />
; PROGRAYS EVERY TIME 'NEXT' IS EXECUTED.<br />
I<br />
; I N ORDER TO USE THE STEP FEATURE, YOU MUST DO<br />
; THE FOLLOWING:<br />
I<br />
1 1. PATCH THE INSTRUCTIOX IN 'NEXT'<br />
t WITH A JUMP TO 'TNEXT'.<br />
I<br />
I 2. PATCH YOUR BREAKPOINT ROUTINE AT<br />
P 'BREAK' (USING 'DDT86' IN CP/M).<br />
I<br />
I 3. SET VARIABLES, 'BIP' & 'BIPE' TO THE<br />
I ADDRESSES YOU2 WAST TO STEP THROUGH.<br />
I<br />
I<br />
; THE CONTENTS OF THE TWO VARIAaLES 'BIPS' AND<br />
; ' BIPE' ARE INTERPRZTEC AS FOLLOwS:<br />
I<br />
; BIP BIPE DEBUG-CONDITION<br />
. ...............................<br />
I<br />
0 X 3FF<br />
; -1 X TXACE ALL 'NEXT' CALLS.<br />
; ADDRl 0 TRACE 'ADDR1' CNLY.<br />
; ADDRl ADDR2 TRACS 'ACD2.1' TO 'ACCP.1'.<br />
I<br />
; NOTE: THE ABOVE ADDRESSES CAN'T POiNT<br />
1 TO A 'CODE FIELD A3DRESS ' .<br />
1 'X' = DON'T CARE VAL3E.<br />
I - ................................<br />
; BREAKPOINT START ADDR<br />
; BREAKPOINT END ADDR
ASM86 VER 1.0 SOURCE: FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
**it***********<br />
. * 'TNEXT ' *<br />
. ***************<br />
t<br />
; THIS IS 'NEXT' WITH DEBUG SUPPORT ...<br />
I<br />
TNEXT: PUSHF<br />
PUSH<br />
MOV<br />
OR<br />
JZ<br />
CMP<br />
JZ<br />
CMP<br />
JZ<br />
JA<br />
MOV<br />
OR<br />
JZ<br />
CMP<br />
JB<br />
; PAUSE ON ADDRESS<br />
I<br />
TNEXTl: POP<br />
POPF<br />
AX<br />
AX,BIP<br />
AX, AX<br />
TNEXT2<br />
AXl-1<br />
TNEXTl<br />
AX,SI<br />
TNEXTl<br />
TNEXT 2<br />
AX,BIPE<br />
AX,AX<br />
TNEXT2<br />
AX,SI<br />
TNEXT2<br />
; SAVE REGS<br />
PAGE<br />
; BREAKPOINT START ADDR<br />
; ZERO?<br />
; NO BREAKPOINT<br />
; STEP ALL POINTS<br />
; I K BREAKPOINT RANGE?<br />
; STEP THIS LOCATION<br />
; NO<br />
; BREAKPOINT END ADDR<br />
; ZERO?<br />
; ONLY ONE LOCATION<br />
; I N RANGE STILL?<br />
; NO<br />
; RESTORE REG<br />
; ADD YOUR BREAKPOINT CALL HERE<br />
I<br />
BREAK: JMPS TNEXT3 ; CONTINUE WITH PROGRAM<br />
; NO BREAKPOINT PAUSE, RESTORE REGISTERS<br />
I<br />
TNEXT2: POP AX<br />
POPF<br />
TNEXT3: LODS AX<br />
MOV BX,AX<br />
JMPS NEXT1<br />
; AX
SOURCE: FORTB.A86 Fig <strong>Forth</strong> 8586/88 Ver 1.53<br />
EJECT<br />
. * *<br />
I<br />
; * NEXT *<br />
. * *<br />
; * DPUSH * . * *<br />
; * APUSH *<br />
; *<br />
*<br />
. *************<br />
I<br />
;<br />
DPUSH: PUSH<br />
APUSH: PUSH<br />
I<br />
; PATCH THE NEXT 3 LOCATIONS<br />
; (USING A DEBUG MONITOR; I.E. DDT86)<br />
; WITH 'JMP TNEXT' FOR TiiACING THXOUGH<br />
; HIGH-LEVEL FORTH WORDS.<br />
I<br />
NEXT: LODS AX ; AX
ASM86 VER 1.0 SOURCE : FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE<br />
EJECT<br />
. .............................................<br />
; ****** DICTIONARY WORDS START HERE ******<br />
. .............................................<br />
; * LIT *<br />
. ***********<br />
I<br />
I<br />
DP0 DB 83H<br />
DB 'LI'<br />
DB 'T1+80H<br />
LIT<br />
DW<br />
DW$+2<br />
LODS<br />
0<br />
AX<br />
; START OF DICTIONARY<br />
; ( sl)
ASM86 VER 1.d SOURCE: PORTB,A86<br />
I NC<br />
INC<br />
JMP<br />
. **********ti**<br />
; * (LOOP) *<br />
. **************<br />
DB<br />
DB<br />
DB<br />
DW<br />
XLOOP CW<br />
MOV<br />
XL001: ADD<br />
MOV<br />
SUB<br />
XOR<br />
JS<br />
Fig <strong>Forth</strong> 8a86/88 Vet 1.0<br />
SI<br />
SI<br />
NEXT<br />
; NO, CONTINUE...<br />
86H<br />
' (LOOP '<br />
') '+80E<br />
ZBRAN-0AH<br />
$+2<br />
BX,l ; INCREMENT<br />
[BPI , BX ; INDEX=INDEX+INCR<br />
AX, [SP] ; GET NEW INGEX<br />
AX,2[a?] ; COM?ARE WITH LIYIT<br />
AX,BX ; TEST SIGN (BIT-16)<br />
BRAN1 ; KEEP LOOPIXG...<br />
; END OF 'DO' LOOP.<br />
ADD BP,4 ; ADJ. RETURN STK<br />
INC SI<br />
INC SI ; BYPASS SMNCH OFFSET<br />
JMP NEXT ; CONTINUE.. .<br />
DB<br />
DB<br />
D B<br />
DW<br />
XPLOO DW<br />
POP<br />
JMP<br />
#<br />
XDO<br />
DB<br />
DB<br />
D B<br />
DW<br />
DW<br />
POP<br />
POP<br />
XCHG<br />
PUSH<br />
PUS3<br />
XCHG<br />
JMP<br />
87H<br />
(+LOOPf<br />
') '+80H<br />
XLOOP-9<br />
S+2<br />
BX ; GET LOOP VALUE<br />
XLOOl<br />
84H<br />
' (DO'<br />
I ) '+80H<br />
XPLOO-BAH<br />
$+2<br />
DX ; I NITIAL INDEX VALUE<br />
AX ; LIMIT VALUE<br />
BP,SP ; GET RETURN STACK<br />
AX<br />
DX<br />
BP,SP ; GET PARAMETER STACK<br />
NEXT
ASM86 VER 1.0 SOURCE: FORTH.A86<br />
EJECT<br />
3 *********<br />
; * I *<br />
. *********<br />
I<br />
DB<br />
DB<br />
DW<br />
DW<br />
MOV<br />
JMP<br />
. *************<br />
; * DIGIT *<br />
; *************<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
DIGIT DW<br />
POP<br />
POP<br />
SUB<br />
JB<br />
CMP<br />
JBE<br />
SUB<br />
CMP<br />
JB<br />
I<br />
DIGI1: CMP<br />
JAE<br />
SUB<br />
MOV<br />
MOV<br />
JMP<br />
; NUMBER ERROR<br />
;<br />
DIGIZ: SUB<br />
JMP<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 11<br />
8 1 H<br />
'If+80H<br />
XDO-7<br />
$+2 ; ( Sl)
ASP486 VER 1.0 SOURCE: FORTH. A86 Fig <strong>Forth</strong> 3836/83 Ver 1.8 PAGE 12<br />
EJECT<br />
- **************<br />
; * (FIND) *<br />
. **************<br />
DB<br />
D B<br />
DB<br />
DW<br />
PFIND DM<br />
MOV<br />
MOV<br />
POP<br />
POP<br />
86H<br />
' ( FISD'<br />
') '+80H<br />
DIGIT-8<br />
$+2<br />
AX,CS<br />
ES, AX<br />
BX<br />
CX<br />
; ES = DS<br />
; NFA<br />
; STRING ADDR<br />
I<br />
; SEARCH LOOP<br />
PFIN1: MOV D1,CX ; GET ACDR<br />
YOV AL, [BX] ; GET WO2D LENGTH<br />
MOV CL,AL ; SAVE LZNGTB<br />
xo R AL, [DII<br />
AND AL,3FH ; CHECK LEIiGTSS<br />
JNZ PFIN5 ; LENCTBS DIFFE2<br />
I<br />
; LENGTH MATCH, CHECK EACH CSAXACTER IN L
ASM86 VER 1.0 SOURCE : FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 13<br />
EJECT<br />
. ***************<br />
; * ENCLOSE *<br />
. ***************<br />
I<br />
I<br />
DB<br />
DB<br />
DS<br />
DW<br />
ENCL D W<br />
POP<br />
POP<br />
PUSH<br />
MOV<br />
MGV<br />
DEC<br />
87H<br />
' ENCLOS '<br />
'E1+80H<br />
PFIND-9<br />
$+2<br />
AX ; S1 - TERMINATOR CHAR.<br />
BX ; S2 - TEXT ADDR<br />
BX ; ADDR BACK TO STACK<br />
AH, 0 ; ZERO<br />
DX,-1 ; CHAR OFFSET COUNTER<br />
BX ; ADDR -1<br />
; SCAN TO FIRST NON-TERMINATOR CHAR<br />
I<br />
ENCL1: INC<br />
INC<br />
CMP<br />
J Z<br />
PUSH<br />
CMP<br />
JNZ<br />
BX ; ADDR +1<br />
DX ; COUNT +1<br />
AL, [BXI<br />
ENCLl ; WAIT FOR NON-TERMINATOR<br />
DX ; OFFSET TO 1ST TEXT CHR<br />
AH, [BX] ; NULL CHAR?<br />
ENCL2 ; NO<br />
; FOUND NULL BEFORE FIRST NON-TERMINATOR CHAR.<br />
MOV AX,DX ; COPY COUNTER<br />
INC DX ; +1<br />
JMP DPUSH<br />
; FOUND FIRST TEXT CHAR, COUNT THE CHARACTERS<br />
I<br />
ENCL2: INC BX ; ADDR+l<br />
INC DX ; COUNT +1<br />
CMP AL, [BX] ; TERMINATOR CHAR?<br />
JZ ENCL4 ; YES<br />
CMP AH, [BX] ; NULL CHAR<br />
JN Z ENCL2 ; NO, LOOP AGAIN<br />
; FOUND NULL AT END OF TEXT<br />
I<br />
ENCL3: MOV AX,DX ; COUNTERS ARE EQUAL<br />
JMP DPUSH<br />
; FOUND TERINATOR CHARACTER<br />
t<br />
ENCL4: MGV AX,DX<br />
INC AX ; COUNT +1<br />
JMP DPUSH
ASY96 VER 1.a SOLXCE: FORT3.A85 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.3<br />
EJECT<br />
. ************<br />
; * EXIT *<br />
. ************<br />
EMIT<br />
; * KEY *<br />
. ***********<br />
,<br />
I<br />
KEY<br />
D B<br />
DB<br />
DB<br />
DW<br />
DW<br />
JMP<br />
843<br />
'EM1 '<br />
'T1+80H<br />
ENCL-OAii<br />
DOCOL<br />
PEMIT<br />
ONE, OCTT<br />
PSTCR, SEMIS<br />
83H<br />
'KE '<br />
'Y '+3aH<br />
EXIT-7<br />
$ +2<br />
PKEY<br />
I<br />
a2c9 as DB 8 9fi<br />
02CA 3F 54 45 52 4D 49 D !3 '?TLIIMIbiA1<br />
3E 4i<br />
0202 CZ DB 'L1+80H<br />
02D3 B E 02 Dd KEY-6<br />
02D5 D7 02 DW $+2<br />
02D7 E9 75 12 JMP PQTSR<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
JMP
ASM86 VER 1.0 SOURCE: FORTH,A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. *************<br />
; * . CMOVE *<br />
. *************<br />
I<br />
I<br />
CMGVE<br />
USTAR<br />
I<br />
USLAS<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
CLD<br />
MOV<br />
POP<br />
POP<br />
POP<br />
MOV<br />
MOV<br />
REP<br />
MOV<br />
JMP<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
MLJL<br />
XC HG<br />
JMP<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
POP<br />
CMP<br />
JNB<br />
D IV<br />
JMP<br />
PAGE 15<br />
853<br />
'CMOV '<br />
'E1+80H<br />
CR-5<br />
$+2<br />
BX,SI<br />
; INC DIRECTION<br />
; SAVE IP<br />
CX<br />
DI<br />
; COUNT<br />
; DEST.<br />
SI ; SOURCE<br />
AX,DS<br />
ES,AX ; ES
.ASM36 VER 1.8 SOURCE: FORTH.A86<br />
0329 83<br />
032A 41 4E<br />
032C C4<br />
032D 0E 03<br />
032P 31 03<br />
0331 58<br />
0332 SB<br />
0333 23 C3<br />
0335 E9 23 'FE<br />
,<br />
DZERO: MOV<br />
MOV<br />
JMP<br />
I<br />
DB<br />
€a<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
AND<br />
JMP<br />
D B<br />
Di3<br />
DB<br />
DW<br />
Dw<br />
POP<br />
POP<br />
GI?<br />
JMP<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
XO R<br />
JMP<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.g<br />
AX,-1<br />
DX , AX<br />
DPUSH ; STORE QUOT/REM<br />
PAGE 15<br />
8 3H<br />
'AN '<br />
'0'+80H<br />
USLAS-5<br />
$+2 ; (Sl)
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
I<br />
SPAT<br />
I<br />
RPAT<br />
I<br />
EJECT<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
MOV<br />
JMP<br />
DB<br />
DB<br />
DB<br />
DW<br />
DK<br />
MOV<br />
MOV<br />
JMP<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
MOV<br />
JMP<br />
DB<br />
DB<br />
DB<br />
DW<br />
RPSTO DW<br />
MOV<br />
MOV<br />
JMP<br />
8 3 H<br />
'SP'<br />
'@'+80H<br />
XORR-6<br />
$+2 ; (Sl)
ASY85 VER 1.0 SOURCE: FORTH.A8S Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.8<br />
EJECT<br />
. **********<br />
**********<br />
. * ;S *<br />
I .<br />
I<br />
I<br />
; END OF SCREEN<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
SEMIS DW<br />
MOV<br />
I NC<br />
I NC<br />
JM?<br />
. *************<br />
I<br />
; * LEAVE *<br />
. *************<br />
I<br />
LEAVE<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
YOV<br />
MOV<br />
JMP<br />
OR Rub-TIYE COLON WORD<br />
8 2H<br />
1.1<br />
IS '+8i3H<br />
RPSTO-6<br />
$+2<br />
SI, [BPI ; (I?)
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 15<br />
I<br />
TOR<br />
I<br />
EJECT<br />
DB<br />
DB<br />
DB<br />
Db?<br />
DW<br />
POP<br />
DEC<br />
DEC<br />
MOV<br />
JMP<br />
DB<br />
DB<br />
LIB<br />
DW<br />
FROMR DW<br />
MOV<br />
INC<br />
INC<br />
JMP<br />
8 2H<br />
I > '<br />
I R 1 + 8 0 H<br />
LEAVE-8<br />
$+2 ; (Rl) '+80H<br />
TOR-5<br />
$+2 ; (Sl)
ASY86 VER 1.0 SOURCE: Fig <strong>Forth</strong> 8J86/88 Ver 1.a<br />
I<br />
EJECT<br />
DS<br />
DB<br />
DB<br />
DW<br />
ZEQU DW<br />
POP<br />
OR<br />
MOV<br />
JZ<br />
DEC<br />
ZEQU1: JMP<br />
DB<br />
Da<br />
D a<br />
DW<br />
ZLESS DW<br />
POP<br />
OR<br />
MOV<br />
JS<br />
DEC<br />
ZLESS1: JMP<br />
. *********<br />
I<br />
. * + *<br />
. *********<br />
I<br />
I<br />
PLUS<br />
DB<br />
DB<br />
DM<br />
DW<br />
POP<br />
POP<br />
ADD<br />
JMP<br />
82H<br />
'a'<br />
'='+80H<br />
RR- 4<br />
$+2<br />
AX<br />
AX,AX ; D3 TEST<br />
AX,1 ; TRUE<br />
ZEQUl ; ITS ZERO<br />
AX ; FALSE<br />
APUSH<br />
82H<br />
'0'<br />
'
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
I<br />
; XLW XHW YLW YHW --> SLW SHW<br />
; S 4 53 S2 S1 S2 s1<br />
D S<br />
DB<br />
DB<br />
DW<br />
DPLUS DW<br />
POP<br />
POP<br />
POP<br />
POP<br />
ADD<br />
ADC<br />
JMP<br />
. *************<br />
I<br />
; * MINUS *<br />
. *************<br />
I<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
MINUS DW<br />
POP<br />
N EG<br />
JMP<br />
. **************<br />
; * DMINUS *<br />
. **************<br />
I<br />
8 2H<br />
'0 '<br />
'+'+80H<br />
PLUS-4<br />
$+2<br />
AX ; YHW<br />
DX ; YLW<br />
BX ; XHW<br />
CX ; XLW<br />
DX,CX ; SLW<br />
AXIBX ; SHW<br />
DPUSH<br />
85H<br />
'MINU'<br />
'S'+80H<br />
DPLUS-5<br />
$+2<br />
AX<br />
AX<br />
APUSH<br />
DB 86H<br />
DB 'DMINU'<br />
DB 'S '+80H<br />
DW MINUS-8<br />
DMINU DW $+2<br />
PG P BX<br />
POP CX<br />
SUB AX, AX<br />
MOV DX, AX<br />
SUB DX, CX<br />
SBB AXIBX<br />
JMP DPUSH<br />
; ZERO<br />
; MAKE 2's COMPLEMENT<br />
; HIGH WORD<br />
PAGE 2
FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. ************<br />
; * OVER *<br />
. ************<br />
I<br />
OVER<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
PUSH<br />
JMP<br />
. ************<br />
; * DROP *<br />
. ************<br />
DROP<br />
DB<br />
D B<br />
D B<br />
DW<br />
DW<br />
PCP<br />
JXP<br />
; * SWAP *<br />
. ************<br />
I<br />
SWAP<br />
DUP<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
JMP<br />
DB<br />
D B<br />
D B<br />
DW<br />
DW<br />
POP<br />
PUSH<br />
JM P<br />
843<br />
'OVE '<br />
'Rr+8CH<br />
DMINU-9<br />
$+2<br />
DX<br />
AX<br />
AX<br />
DPLJSH<br />
84H<br />
'DRO'<br />
'P'+80H<br />
OVER-7<br />
$+2<br />
AX<br />
NEXT<br />
84H<br />
'SWA'<br />
'Pt+80H<br />
DRO2-7<br />
$+2<br />
DX<br />
AX<br />
DPUSH<br />
83H<br />
'DU'<br />
'P1+80H<br />
SWAP-7<br />
$+2<br />
AX<br />
AX<br />
APUSH
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 23<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
PUSH<br />
PUSH<br />
JMP<br />
DB<br />
DB<br />
DB<br />
DW<br />
PSTOR DW<br />
POP<br />
POP<br />
ADD<br />
JMP<br />
. **************<br />
; * TOGGLE *<br />
. * ***********A*<br />
D B<br />
DB<br />
D B<br />
DW<br />
TOGGL DK<br />
POP<br />
POP<br />
XOR<br />
JMP<br />
DB<br />
DB<br />
DW<br />
D vJ<br />
POP<br />
MOV<br />
JMP<br />
84H<br />
' 2DL"<br />
'Pf+80H<br />
DUP-6<br />
$+2<br />
AX<br />
DX<br />
DX<br />
AX<br />
DPUSH<br />
82H<br />
'+I<br />
' ! '+80H<br />
TDUP-7<br />
$+2 ; ((Sl) 1
ASM86 VER 1.0 SOURCE: FORTH.AB6<br />
CAT<br />
I<br />
TAT<br />
#<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
MOV<br />
SUB<br />
JMP<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
MOV<br />
MOV<br />
JM?<br />
DB<br />
DB<br />
Di4<br />
STORE DW<br />
POP<br />
POP<br />
MOV<br />
JMP<br />
DB<br />
DB<br />
n DB<br />
DW<br />
CSTOR DW<br />
POP<br />
POP<br />
MGV<br />
JMP<br />
Fig <strong>Forth</strong> 8@86/88 Ver 1.0<br />
32H<br />
'C '<br />
'@'+8@H<br />
AT-4<br />
$+2<br />
BX<br />
AL, [SXI<br />
AH, AH<br />
APL'SH<br />
8 2H<br />
'2'<br />
'@'+80H<br />
CAT-5<br />
$+2<br />
BX ; ADDR<br />
AX, [BX] ; MSW<br />
DX,2[3X]; LSW<br />
DPUSH<br />
81E<br />
' ! '+80H<br />
TAT-5<br />
$+2 ; ((Sl)
ASM86VER 1.0 SOURCE: FORTH.A86<br />
I<br />
DB<br />
DB<br />
t DB<br />
DW<br />
TSTOR DW<br />
POP<br />
POP<br />
MOV<br />
POP<br />
MOV<br />
JMP<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
8 2H<br />
'2'<br />
'! '+8aH<br />
CSTOR-5<br />
$+2<br />
BX ; ADOR<br />
AX ; DATA (HW)<br />
IBXI ,AX<br />
AX ; DATA (LW)<br />
2 [BX] ,AX<br />
NEXT<br />
PAGE 2
ASM66 VEX 1.0 SOURCE: FORTH.A86 Fig Fortn 8i286/88 Ver 1.0<br />
I<br />
EJECT<br />
DB<br />
D B<br />
DW<br />
COLON DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DOCOL: INC<br />
DEC<br />
DEC<br />
MOV<br />
MO'J<br />
JMP<br />
SEMI<br />
. ************<br />
; * NOOP *<br />
. ************<br />
NOOP<br />
0C 1H<br />
' : '+80H<br />
TSTOR-5<br />
DOCOL<br />
QEXEC<br />
SCSP<br />
CURR<br />
AT<br />
COlVT<br />
STORE<br />
CREAT<br />
RBRAC<br />
PSCOD<br />
DX<br />
BP<br />
BP<br />
[i3?] , S I<br />
S1,DX<br />
NEXT<br />
0C 1H<br />
' ; '+80H<br />
COLON-4<br />
DOCOL<br />
QC SP<br />
COMT<br />
SEMIS<br />
SMUDG<br />
LB RAC<br />
SEMIS<br />
Slil<br />
'NOO'<br />
'P1+80H<br />
SEMI-4<br />
DOCOL<br />
SEMIS<br />
; (RP)
ASM86 VER 1.0 SOURCE: FORTH.A86<br />
84<br />
55 53 45<br />
D 2<br />
65 05<br />
20 05<br />
53 05<br />
95 09<br />
42<br />
8B DA<br />
8A 1F<br />
2A FF.<br />
2E 8B 3E.26 01<br />
8D 01<br />
E9 C 2 FB<br />
EJECT<br />
. ****************<br />
; * CONSTANT *<br />
. ****************<br />
I<br />
CON<br />
DB<br />
DW<br />
DW<br />
DW<br />
Did<br />
DW<br />
DW<br />
DOCON: INC<br />
MOV<br />
MOV<br />
JMP<br />
. ****************<br />
; * VARIABLE *<br />
- ****************<br />
DB<br />
DW<br />
VAR DW<br />
DW<br />
DW<br />
DOVAR: I NC<br />
PUSH<br />
JMP<br />
- ************<br />
; * USER *<br />
. ************<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
USER DW<br />
DW<br />
DW<br />
DOUSE: INC<br />
MOV<br />
MOV<br />
SUB<br />
MOV<br />
LEA<br />
JMP<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
88H<br />
'CONSTAN '<br />
'T1+80H<br />
NOOP-7<br />
DOCOL<br />
CREAT<br />
SMUDG<br />
COMMA<br />
PSCOD<br />
DX ; PFA<br />
BXIDX<br />
AX, [BX] ; GET DATA<br />
APUSH<br />
88H<br />
'VARIABL '<br />
'E1+80H<br />
CON-0BH<br />
DOCOL<br />
CON<br />
PSCOD<br />
DX<br />
DX<br />
NEXT<br />
; (DE)
ZERO<br />
TWO<br />
DB<br />
DB<br />
DW<br />
THREE DW<br />
DW<br />
BLS<br />
EJECT<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.3<br />
81H<br />
'0 '+80H<br />
USER-7<br />
DOCON<br />
0<br />
81H<br />
'l1+80H<br />
ZERO-4<br />
DOCON<br />
1<br />
82H<br />
'a<br />
'L1+80H<br />
THREE-4<br />
DOCON<br />
20H<br />
PAGE 23
ASM86 VER 1.0 SOURCE: FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 29<br />
DB<br />
DB<br />
DB<br />
DW<br />
CSLL DW<br />
DW<br />
. *************<br />
; * FIRST *<br />
; *************<br />
DB<br />
DB<br />
DB<br />
DW<br />
FIRST DW<br />
DW<br />
. *************<br />
; * LIMIT *<br />
. *************<br />
DB<br />
DB<br />
DB<br />
DW<br />
LIMIT DW<br />
DW<br />
DB<br />
DB<br />
DB<br />
DW<br />
BBUF DW<br />
DW<br />
DB<br />
DB<br />
DB<br />
DW<br />
BSCR DW<br />
DW<br />
83H<br />
',/I<br />
'L8+80H<br />
BLS-5<br />
DOCON<br />
64<br />
85H<br />
'FIRS '<br />
'T1+80H<br />
CSLL-6<br />
DOCON<br />
BUF 1<br />
85H<br />
'LIMI '<br />
'T8+80H<br />
FIRST-8<br />
DOCON<br />
EM<br />
85H ; BYTES/BUFFER<br />
'B/BU '<br />
'F1+80H<br />
LIMIT-8<br />
DOCON<br />
KBBUF<br />
858 : BUFFERS/SCREEN<br />
'B/SC '<br />
'R '+80H<br />
BBUF-8<br />
DOCON<br />
400H/KBBUF
ASY86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver f .O<br />
I<br />
DB<br />
DB<br />
D B<br />
DW<br />
PORIG DW<br />
DW<br />
DW<br />
DW<br />
Dtu'<br />
87H<br />
'+ORIGI '<br />
IN '+80H<br />
BSCR-8<br />
DOCOL<br />
LIT<br />
ORIG<br />
PLUS<br />
SZMIS<br />
PAGE 12
ASM86 VER 1.0 SOURCE: FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. ---------- USER VARIAaLES ==========<br />
SZERO<br />
RZERO<br />
. ***********<br />
I<br />
; * TIB *<br />
. ***********<br />
*************<br />
; * WIDTH *<br />
. *************<br />
I<br />
WIDTH<br />
8 2H<br />
'S '<br />
'0 '+80H<br />
PGRIG-0AH<br />
DOUSE<br />
6<br />
8 2H<br />
'R'<br />
'0'+8aH<br />
SZERO-5<br />
DOUSE<br />
8<br />
8 3 H<br />
'TI '<br />
'B '+80H<br />
RZERO-5<br />
DOUSE<br />
0AH<br />
DB 8 5H<br />
D B 'WIDT'<br />
DB 'H '+80H<br />
DW TIB-6<br />
DW DOUSE<br />
DW 0CH<br />
. ***************<br />
; * WARNING *<br />
. ***************<br />
I<br />
0638 87 D B 87H<br />
0639 57 4 1 52 4E 49 4E DB 'WARNIN '<br />
PAGE 31
SOURCE: FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
. *************<br />
; * FENCE: *<br />
. *************<br />
F ENC E<br />
; * VOC-LINK *<br />
. kt********%*****<br />
. ******ti***<br />
; * BLK<br />
. ***********<br />
BLK<br />
'G8+80H<br />
WIDTH-8<br />
DOOSE<br />
0EH<br />
85H<br />
'FENC '<br />
'EV+8QH<br />
WARN-OAH<br />
DOUSE<br />
10H<br />
88H<br />
'VOC-LIN '<br />
'Kt+80H<br />
DP-5<br />
DOUSE<br />
14H<br />
83H<br />
'3L '<br />
'~'+80H<br />
VOCL-0BH<br />
DOUSE<br />
16H
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
INN<br />
EJECT<br />
. ***********<br />
; * OUT *<br />
. ***********<br />
OUTT<br />
. ***********<br />
; * SCR *<br />
. ***********<br />
SCR<br />
. ********ti****<br />
; * OFFSET *<br />
. **************<br />
DB<br />
DB<br />
DB<br />
DW<br />
OFSET DW<br />
DW<br />
8 2H<br />
'I'<br />
'N '+862<br />
BLK-6<br />
DOUSE<br />
18H<br />
8 3H<br />
'OU '<br />
'Tt+80H<br />
INN-5<br />
DOUSE<br />
1AB<br />
83H<br />
'SC '<br />
'R1+80H<br />
OUTT-6<br />
DOUSE<br />
1CH<br />
86H<br />
'OFFSE '<br />
'T1+80H<br />
SCR-6<br />
DOUSE<br />
1EH<br />
. ***************<br />
; * CONTEXT *<br />
. ***************<br />
*<br />
069E 87 DB 87H<br />
069F 43 4F 4E 54 45 58 DB 'CONTEX '<br />
06A5 D4 DB 'T'+80H<br />
06A6 91 06 DW OFSET-9<br />
PAGE 33
ASY86 VER 1.a SOURCE: FORTH.P.86<br />
CONT<br />
. ***************<br />
; * CURRENT *<br />
. ***************<br />
I<br />
CURR<br />
. *************<br />
; * STATE *<br />
. it***********<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
STATE DW<br />
DW<br />
. ************<br />
; * BASE *<br />
. ************<br />
BASE<br />
- ***********<br />
; * DPL *<br />
. ***********<br />
,<br />
DPL<br />
***********<br />
; * FLD *<br />
. ***********<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
87H<br />
'CURREN '<br />
'T'+808<br />
CONT-0AH<br />
DOUSE<br />
2 2H<br />
85H<br />
'STAT'<br />
'E1+8i3H<br />
C'JRR-@AH<br />
DOUSE<br />
24H<br />
845<br />
la;is<br />
'E8+80H<br />
STATE-8<br />
DOUSE<br />
26H<br />
83H<br />
'DP'<br />
'Lt+80,4<br />
BASE-7<br />
DOUSE<br />
28H<br />
83H<br />
'FL'<br />
PAGE 2;
ASH86 VER 1.0 SOURCE: FORTH.A86<br />
FLD<br />
. ***********<br />
; * CSP *<br />
. ***********<br />
CSPP<br />
RNUM<br />
- ***********<br />
; * HLD *<br />
. ***********<br />
I<br />
HLD<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
'D1+80H<br />
DPL-6<br />
DOUSE<br />
2A H<br />
83H<br />
'CS '<br />
'P1+80H<br />
FLD-6<br />
DOUSE<br />
2CH<br />
8 2H<br />
'R'<br />
'#'+80H<br />
CSPP-6<br />
DOUSE<br />
2EH<br />
f?3H<br />
'HL'<br />
'D1+80H<br />
RNUM-5<br />
DOUSE<br />
3GH<br />
PAGE 35
ONEP<br />
TWOP<br />
HERE<br />
EJECT<br />
. *************<br />
; * ALLOT *<br />
. *************<br />
I<br />
DB<br />
DB<br />
DS<br />
DW<br />
ALLOT DW<br />
DW<br />
DW<br />
DL4<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
8 2H<br />
'1'<br />
'+'+80H<br />
HLD-6<br />
DOCOL<br />
ONE<br />
PLUS<br />
SEMIS<br />
82H<br />
'2'<br />
'+'+80H<br />
ONE?-5<br />
DOCOL<br />
TdO<br />
PLUS<br />
SEMIS<br />
83H<br />
'HER'<br />
'E1+83i-1<br />
TWOP-5<br />
DOCOL<br />
DP<br />
AT<br />
SEMIS<br />
85H<br />
'ALLO'<br />
'Tt+80H<br />
HERE-7<br />
DOCOL<br />
DP<br />
PSTGR<br />
SEMIS<br />
PAGE 36
ASM86 VER 1.0 SOURCE: FORTH.A86<br />
COMMA<br />
SUBB<br />
D B<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
SUB<br />
JMP<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
81H<br />
', '+80H<br />
ALLOT-8<br />
DOCOL<br />
HERE<br />
STORE<br />
TWO<br />
ALLOT<br />
SEMIS<br />
8 2H<br />
'C '<br />
', '+80H<br />
COMMA-4<br />
DOCOL<br />
HERE<br />
CSTOR<br />
ONE<br />
ALLOT<br />
SEMIS<br />
81H<br />
'-'+80H<br />
CCOMM-5<br />
$+2<br />
DX ; S1<br />
AX ; S1<br />
AX,DX ; AX = S1 - S1<br />
APUSH<br />
PAGE 37
EJECT<br />
DB<br />
D B<br />
DW<br />
EQUAL DCV'<br />
DW<br />
DW<br />
DW<br />
D B<br />
D B<br />
DW<br />
LESS DW<br />
PO?<br />
POP<br />
MOV<br />
XOR<br />
JS<br />
SUB<br />
LES 1 : OR<br />
MCV<br />
JNS<br />
I NC<br />
LES2: JM?<br />
. **********<br />
I<br />
; * U<<br />
. **********<br />
I<br />
I<br />
DB<br />
DB<br />
DB<br />
DK<br />
ULESS DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
ULESl DW<br />
ULES2 DW<br />
Fig <strong>Forth</strong> 9086/88 Ver 1.a<br />
81H<br />
'='+80H<br />
SUBB-4<br />
DOCOL<br />
SUBB<br />
ZEQU<br />
SENIS<br />
81H<br />
'
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
DB<br />
DB<br />
DW<br />
GREAT DW<br />
DW<br />
DW<br />
DW<br />
EJECT<br />
. ***********<br />
I<br />
; * RGT *<br />
. ***********<br />
ROT<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
POP<br />
PUSH<br />
JMP<br />
. *************<br />
; * SPACE *<br />
. *************<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
SPACE DW<br />
DW<br />
DW<br />
DW<br />
DDUP<br />
81H<br />
'> '+80H<br />
ULESS-5<br />
DOCOL<br />
SWAP<br />
LESS<br />
SEMIS<br />
83H<br />
'RO '<br />
'Tt+80H<br />
GREAT-4<br />
$+2<br />
DX ; S1<br />
BX ; S2<br />
AX ; S3<br />
BX<br />
DPUSH<br />
85H<br />
'SPAC '<br />
'E1+80H<br />
ROT-6<br />
DOCOL<br />
BLS<br />
EM IT<br />
SEMIS<br />
84H<br />
'-DU'<br />
'P8+80H<br />
SPACE-8<br />
DOCOL<br />
DGP<br />
ZBRAN ; I F<br />
OFFSET DDUP1-$<br />
DUP ; ENDIF<br />
PAGE 35
35396 VEX 1.0 SOURCE: FORTH.AB6 Fig <strong>Forth</strong> 3586/88 Ver 1.0 PAGE 43<br />
SEMIS<br />
; * TRAVERSE *<br />
. *********if*****<br />
D B<br />
DW<br />
TRAV DW<br />
DW<br />
TRAVl DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
. **************<br />
; LATEST *<br />
. ***ti*********<br />
DB<br />
DB<br />
DB<br />
DX<br />
LATES DL4<br />
DW<br />
DW<br />
DK<br />
DW<br />
88H<br />
'TRAVERS '<br />
'ES+80H<br />
DDUP-7<br />
DCCOL<br />
SWAP<br />
OVER ; BEGIN<br />
PLUS<br />
LIT, 7FH<br />
OVER<br />
CAT<br />
LESS<br />
ZBRAN ; UNTIL<br />
OFFSET TRAV1-$<br />
SWAP<br />
DROP<br />
SENIS<br />
869<br />
' LATES '<br />
'T'+38H<br />
TRAV- 03ii<br />
DOCOL<br />
CUR2<br />
AT<br />
AT<br />
SEYIS<br />
83H<br />
'LF '<br />
'A1+80H<br />
LATES-9<br />
DOCOL<br />
LIT, 4<br />
SiJBB<br />
SEMIS
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. ***********<br />
; * CFA *<br />
. ***********<br />
CFA<br />
. ***********<br />
; * NFA *<br />
. ***********<br />
NFA<br />
. ***********<br />
; * PFA *<br />
. ***********<br />
PFA<br />
83H<br />
'CF '<br />
'A1+80H<br />
LFA-6<br />
DOCOL<br />
TWO<br />
SUBB<br />
SEMIS<br />
8 3 H<br />
'NF '<br />
'Ag+80H<br />
CFA-6<br />
DOCOL<br />
LITI 5<br />
SUBB<br />
LITI -1<br />
TRAV<br />
SEMIS<br />
8 3H<br />
'PF '<br />
'A1+80H<br />
NFA-6<br />
DOCOL<br />
ONE<br />
TRAV<br />
LIT, 5<br />
PLUS<br />
SEMIS.<br />
PAGE 41
hSXd6 VE8 1.9 SCURCE: FGRTH.A86 Fig <strong>Forth</strong> 80i36/38 Ver 1.3<br />
SCSP<br />
EJECT<br />
84H<br />
'!CS'<br />
'P1+80E<br />
PFA-6<br />
EOCOL<br />
SPAT<br />
CSPP<br />
STOZE<br />
SEMIS<br />
863<br />
'?ERRS1<br />
'Rt+38H<br />
scsc-7<br />
DOCOL<br />
SWIi<br />
ZBRAN ; I F<br />
OFFSET 2EXR1-$<br />
ERRZR<br />
BRAS ; ELSE<br />
DFFSET QE?.R2-$<br />
32C ; ENCiF<br />
SEYIS<br />
85H<br />
' ?COM '<br />
'P1+80H<br />
QERR-9<br />
DOCOL<br />
STATE<br />
AT<br />
ZEQU<br />
LIT, 11H<br />
QEXR<br />
SEYIS<br />
PAGS 32
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
QEXEC<br />
EJECT<br />
. **************<br />
; * ?PAIRS *<br />
. **************<br />
I<br />
QPAIR<br />
85H<br />
'?EXE1<br />
'C '+80H<br />
QCOMP-8<br />
DOCOL<br />
STATE<br />
AT<br />
LIT, 12H<br />
QERR<br />
SEMIS<br />
DB 86H<br />
D B '?PAIR1<br />
DB 'S1+80H<br />
DW QEXEC-8<br />
DW DOCOL<br />
DW SUBB<br />
DW LIT, 1 3H<br />
DW QE iiR<br />
DW SEMIS<br />
84H<br />
'?CS1<br />
'P1+80H<br />
QPAIR-9<br />
DOCOL<br />
SPAT<br />
CSPP<br />
AT<br />
SUBB<br />
LIT, 14H<br />
QERR<br />
SEMIS<br />
PAGE 43
SOURCE: FORTH.A86<br />
DB<br />
DW<br />
QLOAD DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
'G1+9i3H<br />
QCSP-7<br />
DOCOL<br />
BLK<br />
AT<br />
ZEQU<br />
LIT, 16H<br />
QERR<br />
SEMIS<br />
PAGE 13
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. ***************<br />
; * COMPILE *<br />
. ***************<br />
I<br />
0914 87 DB 87H<br />
0915 43 4F 4D 50 49 4C DB 'COMPIL'<br />
091B C5 DB 'E1+80H<br />
091C F9 08 DW QLOAD-0BH<br />
091E 20 05 COMP DW DOCOL<br />
0920 A5 08 DW QCOMP<br />
0922 CC 03 DW FROMR<br />
0924 79 04 DW DUP<br />
0926 14 07 DW TWOP<br />
0928 BC 03 DW TOR<br />
092A B4 04 DW AT<br />
092C 3F 07 DW COMMA<br />
092E 9A 03 DW SEMIS<br />
LB RAC<br />
RBRAC<br />
0C 1H<br />
' ['+80H<br />
COMP-0AH<br />
DOCOL<br />
ZERO<br />
STATE<br />
STORE<br />
SEMIS<br />
8 1 H<br />
'1 '+80H<br />
LBRAC-4<br />
DOCOL<br />
LIT, 0C0H<br />
STATE,STORE<br />
SEMIS<br />
PAGE 45
A3M86 VEX 1.0 Fig <strong>Forth</strong> 8a86/83 Ver 1.2 PAGE 46<br />
EJECT<br />
. **************<br />
; * SMUDGE *<br />
. **************<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
SMUDG DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
HEX<br />
. * *******x******<br />
I<br />
; * DECIYAL *<br />
. ***************<br />
I<br />
DB<br />
D B<br />
DB<br />
DW<br />
DECA DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
8 6H<br />
' SMUCG '<br />
'E8+8tIH<br />
RB RAC - 4<br />
DOCOL<br />
LATES<br />
LIT, 20H<br />
TOGGL<br />
SEYIS<br />
83H<br />
'HE '<br />
'X'+iidH<br />
SMUDG-9<br />
DOCOL<br />
LIT, 16<br />
3ASE<br />
STGRZ<br />
SEYIS<br />
87H<br />
'DECIY.1A '<br />
'L1+80H<br />
XEX-6<br />
DOCOL<br />
LIT, 10<br />
BASE<br />
STORE<br />
SEMIS
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
PSCOD<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
SEMIC DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
SEMI1 DW<br />
DW<br />
I<br />
87 DB<br />
3C 42 55 49 4C 44 DB<br />
D3 DB<br />
A3 09 DW<br />
20 05 BUILD DW<br />
9D 05 DW<br />
53 05 DW<br />
9A 03 DW<br />
EJECT<br />
87H<br />
' (;CODE1<br />
') '+80H<br />
DECA-OAH<br />
DOCOL<br />
FROM R<br />
LATES<br />
PF A<br />
CFA<br />
STORE<br />
SEMIS<br />
0C 5H<br />
' ;COD1<br />
'E1+80H<br />
PSCOD-0AH<br />
DOCOL<br />
QCSP<br />
COM P<br />
PSCOD<br />
LB RAC<br />
NOOP ; ( ASSEMBLER )<br />
SEMIS<br />
87H<br />
'
SOURCE:<br />
DOES Dk<br />
DW<br />
DW<br />
Dw<br />
DW<br />
DW<br />
DODOE: XCHG<br />
PUSH<br />
XCHG<br />
INC<br />
MOV<br />
MOV<br />
INC<br />
INC<br />
PUSH<br />
JMP<br />
. *************<br />
; * COUNT *<br />
; *************<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
COUNT 'Jbi<br />
Dji<br />
DW<br />
DW<br />
ski<br />
DW<br />
. ************<br />
I<br />
; * TYPE *<br />
. ************<br />
D 9<br />
DB<br />
D B<br />
DW<br />
TYPES DW<br />
DX<br />
DW<br />
DW<br />
DW<br />
DW<br />
Dw<br />
DW<br />
TYPE2 DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
D w<br />
DW<br />
Fig <strong>Forth</strong> <strong>8086</strong>/98 Ver 1.a PAGE 4E<br />
DOCOL<br />
FROMR<br />
LATES<br />
PFA<br />
STORE<br />
DSCOD<br />
BP,SP ; GET RETURN STACK<br />
S I ; (RP)
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
DB<br />
DW<br />
DTRAI DW<br />
DW<br />
DW<br />
DW<br />
DTRAl DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DTRA2 DW<br />
DW<br />
DTRA3 DW<br />
DW<br />
DW<br />
DROP<br />
SEMIS<br />
; ENDIF<br />
'G8+80H<br />
TYPES-7<br />
DOCOL<br />
DUP<br />
ZERO<br />
XD 0<br />
OVER<br />
OVER<br />
PLUS<br />
ONE<br />
SUBB<br />
CAT<br />
BLS<br />
SUBB<br />
ZBRAN ; IF<br />
OFFSET DTRA2-$<br />
LEAVE<br />
B RAN ; ELSE<br />
OFFSET DTRA3-$<br />
ONE<br />
SUBB ; ENDIF<br />
XLOOP ; LOOP<br />
OFFSET DTRA1-$<br />
SEMIS<br />
PAGE 49
.43?86 VER 1.a S3LiXCE: FORTH.A86 Zig <strong>Forth</strong> 8886./98 Ver 1.0<br />
I<br />
Da<br />
DB<br />
DB<br />
DW<br />
PDOTQ DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DiJ<br />
DW<br />
DW<br />
DW<br />
3W<br />
EJECT<br />
84H<br />
(*I"<br />
') '+8aH<br />
DTRAI-6CH<br />
DOCOL<br />
RR<br />
COUNT<br />
DUP<br />
ONE?<br />
F ROY R<br />
PLUS<br />
TOR<br />
TYPES<br />
SEYIS<br />
ac 23<br />
I I<br />
fltl+8$:+<br />
PDCTQ-7<br />
3OCOL<br />
LIT', 223<br />
STAT&<br />
AT<br />
ZSRAN ; I F<br />
aFFSET DOTa1-S<br />
COY?<br />
PDOTQ<br />
WORDS<br />
HE4E<br />
CAT<br />
ONE?<br />
ALLOT<br />
BRAN ; ELSE<br />
OFFSET DOTQ2-$<br />
WORDS<br />
HERE<br />
COUNT<br />
TYPES<br />
SEEIS<br />
PAGE f:
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
- **************<br />
; * EXPECT *<br />
. **************<br />
I<br />
DS<br />
DB<br />
86H<br />
'EXPEC '<br />
DB 'T8+80H<br />
DW DOTQ-5<br />
EXPEC DW<br />
DW<br />
DW<br />
DOCOL<br />
OVE R<br />
PLUS<br />
DW OVER<br />
DW XDO<br />
EXPEl DW KEY<br />
DW<br />
DW<br />
DUP<br />
LIT, 0EH<br />
DW PORIG<br />
DW AT<br />
DW EQUAL<br />
DW ZBRAN ; IF DW OFFSET EXPE2-$<br />
DW DROP<br />
DW DUP<br />
DW ID0<br />
DW EQUAL<br />
DW DUP<br />
DW FROMR<br />
DW TWO<br />
DW SUB B<br />
DW PLUS<br />
DW<br />
DW<br />
TOR<br />
ZBRAN ; IF DW OFFSET EXPE6-$<br />
DW LIT<br />
DW BELL<br />
DW BRAN ; ELSE<br />
DW OFFSET EXPE7-$<br />
EXPE6 DW LIT<br />
DW BSOUT ; ENDIF<br />
EXPE7 DW BRAN ; ELSE<br />
DW OFFSET EXPE3-$<br />
EXPE2 DW DUP<br />
DW LIT, 0DH<br />
DW<br />
DW<br />
EQUAL<br />
ZBRAN ; IF<br />
DW OFFSET EXPE4-$<br />
DW LEAVE<br />
DW DROP<br />
DW BLS<br />
DW ZERO<br />
BRAN ; ELSE<br />
OFFSET EXPES-$<br />
DUP<br />
ID0<br />
CSTOR<br />
ZERO<br />
; ENDIF<br />
PAGE 5:
. L5M86 - VER 1.0 SOGRCE: FOR'TH.A.86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
I DO<br />
ONE?<br />
STORE ; EXDIT<br />
EM1 T<br />
XLOOP ; LOOP<br />
9FFSET EXPE1-$<br />
DROP<br />
SEiilIS<br />
85H<br />
'QCER'<br />
'Y '+BaH<br />
EXPEC-9<br />
, DOCOL<br />
TI5<br />
AT<br />
LIT, 5 BH<br />
EXPEC<br />
ZERO<br />
IS?j<br />
STORE<br />
SEMIS
ASM86 VER 1.n SOURCE: FORTH.A86 Fig <strong>Forth</strong> 8886/88 Ver 1.0<br />
EJECT<br />
. ****************<br />
; * 0 (NULL) *<br />
. ****************<br />
NULL<br />
. *******it***<br />
; * FILL *<br />
. ************<br />
I<br />
FILL<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
POP<br />
MOV<br />
MOV<br />
CLD<br />
REP<br />
JMP<br />
0C 1H ; A BINARY ZERO<br />
80H<br />
QUERY-8<br />
DOCOL<br />
BLK<br />
AT<br />
ZBRAN ; I F<br />
OFFSET NULL1-$<br />
ONE<br />
BLK<br />
PSTOR<br />
ZERO<br />
INN<br />
STORE<br />
BLK<br />
AT<br />
BSCR<br />
ONE<br />
SUBB<br />
ANDD<br />
ZEQU<br />
ZBRAN ; I F<br />
OFFSET NULL2-$<br />
QEXEC<br />
FROM R<br />
DRDP ; ENDIF<br />
BRAN ; ELSE<br />
OFFSET NULL3-$<br />
FROMR<br />
DROP ; ENDIF<br />
SEMIS<br />
84H<br />
'FIL'<br />
'L1+80H<br />
NULL-4<br />
$+2<br />
AX ; FILL CHAR<br />
CX ; FILL COUNT<br />
DI ; BEGIN ADR<br />
BX, DS<br />
ES,BX ; ES
:\5!-!35 :jE2 1.0 SOURCE: FCRTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.d<br />
. *************<br />
; * ERASE *<br />
. *************<br />
;<br />
D B<br />
DB<br />
DB<br />
DW<br />
ERASEE Dw<br />
DW<br />
DW<br />
3%<br />
. **************<br />
; * BLANKS *<br />
. **************<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
BLANK DW<br />
DW<br />
DW<br />
DW<br />
. ************<br />
; * HOLD *<br />
. ************<br />
I<br />
I<br />
DB<br />
DB<br />
DS<br />
DW<br />
HOLD DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
; * PAD *<br />
. ***********<br />
I<br />
PAD<br />
85H<br />
'ERAS'<br />
'E1+88H<br />
FILL-7<br />
DOCOL<br />
ZERO<br />
FILL<br />
SENIS<br />
8 5tI<br />
'BLANK '<br />
'S '+8OH<br />
ERASEE-8<br />
DGCOL<br />
BLS<br />
FILL<br />
SEXIS<br />
DGCOL<br />
LIT, -1<br />
HLD<br />
PSTOR<br />
HLD<br />
AT<br />
CSTOR<br />
SEMIS<br />
8 3H<br />
'PA'<br />
'Dt+80H<br />
HOLD-7<br />
DOCOL<br />
HERE<br />
LIT, 44H
ASM86 VER 1.0 SOURCE : FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 5<br />
. ************<br />
; * WORD *<br />
; ************<br />
*<br />
DB<br />
DB<br />
DB<br />
DW<br />
WORDS DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
WORD1 DW<br />
DW<br />
WORD2 DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
PLUS<br />
SEMIS<br />
84H<br />
'WOR'<br />
'D1+80H -<br />
PAD-6<br />
DOCOL<br />
BLK<br />
AT<br />
ZBRAN ; IF<br />
OFFSET WORD1-$<br />
BLK<br />
AT<br />
BLOCK<br />
BRAN ; ELSE<br />
OFFSET WORD2-$<br />
TIB<br />
AT ; ENDIF<br />
INN<br />
AT<br />
PLUS<br />
SWAP<br />
ENCL<br />
HERE<br />
LIT, 22H<br />
BLANK<br />
INN<br />
PS TOR<br />
OVER<br />
SUBB<br />
TOR<br />
RR<br />
HERE<br />
CSTOR<br />
PLUS<br />
HERE<br />
ONEP<br />
FROMR<br />
CMOVE<br />
SEMIS
.43?136 VER 1.0 SOURCE: FCRTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
0C32 88<br />
JC33 28 4E 55 4D 42 45<br />
52<br />
0C3A A9<br />
gC3B E5 0B<br />
0C3D 20 05<br />
0C3F 07 a7<br />
0C11 79 04<br />
0C43 BC 03<br />
0C45 C1 04<br />
0C47 CD 06<br />
0C49 B4 04<br />
OC~B 01 a2<br />
0C4D 9A 01<br />
0C4F 2C 00<br />
OC51 5C 04<br />
dC53 CD 06<br />
OC55 34 a4<br />
3C57 ad 03<br />
aC59 5F 04<br />
i3CS9 C3 07<br />
0C5D CD 06<br />
0C5F B4 04<br />
acfx 04 03<br />
dC63 14 84<br />
0C55 D7 05 0C67 34 i34<br />
OC69 87 07<br />
dC63 9A 01<br />
OC6D 08 00<br />
aC6F AS 05<br />
0C71 D7 06<br />
dC73 95 04<br />
3C75 CC 03<br />
0~77 89 a1<br />
0C79 C6 FF<br />
aC7B CC 03<br />
bC7D 9A 03<br />
EJECT<br />
. **********if****<br />
; * (NUMBER) *<br />
. ****************<br />
I<br />
DB<br />
DW<br />
PNUMB DW<br />
PNLJlYl DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
CW<br />
D'w'<br />
DW<br />
DW<br />
DW<br />
Dw<br />
DEj<br />
DW<br />
DW<br />
PNUM3 DW<br />
DW<br />
DW<br />
?NUN2 DW<br />
DW<br />
88H<br />
' (NUMBER'<br />
' ) '+8flH<br />
WORDS-7<br />
DOCOL'<br />
ONEP ; BEGIN<br />
DUP<br />
T3R<br />
CAT<br />
BASE<br />
AT<br />
DIGIT<br />
ZBRAN ; WHILE<br />
OFFSET PNGM2-$<br />
SWAP<br />
BASE<br />
AT<br />
USTAR<br />
DROP<br />
ROT<br />
BASE<br />
AT<br />
iTSTAR<br />
DPLCS<br />
DPL<br />
AT<br />
GNEP<br />
ZBRAN ; IF<br />
OFFSET PNUX3-S<br />
ONE<br />
GPL<br />
PSTOX ; ZNCIF<br />
FROMR<br />
B RAN ; REPEAT<br />
OFFSET PNYM1-$<br />
FROMR<br />
SEMIS<br />
PAGE 56
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. *********ti***<br />
; * NUMBER *<br />
. **************<br />
NUMB<br />
86H<br />
'NUMBE '<br />
'R1+80H<br />
PNUMB-0BH<br />
DOCOL<br />
ZERO<br />
ZERO<br />
ROT<br />
DUP<br />
ONEP<br />
CAT<br />
LIT, 2DH<br />
EQUAL<br />
DUP<br />
TOR<br />
PLUS<br />
LIT, -1<br />
DPL ; BEGIN<br />
STORE<br />
PNUMB<br />
DUP<br />
CAT<br />
BLS<br />
SUB B<br />
ZBRAN ; WHILE<br />
OFFSET NUMB2-$<br />
DUP<br />
CAT<br />
LIT, 2EH<br />
SUBB<br />
ZERO<br />
QE RR<br />
ZERO<br />
BRAN ; REPEAT<br />
OFFSET NUMB1-$<br />
DROP<br />
FROMR<br />
ZBRAN ; I F<br />
OFFSET NUMB3-$<br />
DMINU ; ENDIF<br />
SEMIS<br />
PAGE 57
ASZ86 VER 1.a SOURCE: FGRTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
DFIND DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
Diu'<br />
DW<br />
DK<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DFINl DW<br />
EJECT<br />
. ***************<br />
; * (ABORT) *<br />
. ***************<br />
DB<br />
DB<br />
DB<br />
DW<br />
PABOR DW<br />
DW<br />
DW<br />
. *************<br />
; * ERROR *<br />
. *************<br />
I<br />
DB<br />
DB<br />
DB<br />
Dh'<br />
ERROR DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
ERR01 DW<br />
85H<br />
'-FINs<br />
'D4+8OH<br />
NUMB-9<br />
DOCOL<br />
BLS<br />
WOZDS<br />
HERE<br />
COIU'T<br />
AT<br />
AT<br />
PFIND<br />
DUE)<br />
ZEQU<br />
ZBRAN ; I F<br />
OFFSET DFINI-$<br />
DROP<br />
HEXE<br />
LATES<br />
PFIND ; ENDIP<br />
SEMIS<br />
87H<br />
' (ABORT'<br />
') '+8gH<br />
DFIND-8<br />
DOC3L<br />
ABORT<br />
SEMIS<br />
8 5H<br />
'ERR0 '<br />
'R1+80H<br />
PABOR-0AH<br />
DOCOL<br />
WARN<br />
AT<br />
ZLESS<br />
ZBRAN ; IF<br />
OFFSET ERRO1-$<br />
PABOR ; ENDIF<br />
HERE<br />
PAGE 53
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
DW COUNT<br />
DW TYPES<br />
D W PDOTQ<br />
DB 2<br />
DB l? 1<br />
DW MESS<br />
DW SPSTG<br />
CHANGE FROM FIG MODEL<br />
DW INN, AT, BLK, AT<br />
DW ELK, AT<br />
DW DDUP<br />
DW ZBRAN ; IF<br />
DW OFFSET ERR02-$<br />
DW INN, AT<br />
DW SWAP<br />
ERR02 DW QUIT<br />
; * ID. *<br />
. ***********<br />
DB<br />
DB<br />
DB<br />
DW<br />
IDDOT DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
83H<br />
'ID'<br />
' . '+80H<br />
ERROR-8<br />
DOCOL<br />
PAD<br />
LIT, 20H<br />
LIT, 5FH<br />
FILL<br />
DUP<br />
PFA<br />
LF A<br />
OVER<br />
SUBB<br />
PAD<br />
SWAP<br />
CMOVE<br />
PAD<br />
COUNT<br />
LIT, 1FH<br />
ANDD<br />
TYPES<br />
SPACE<br />
SEMIS<br />
PAGE 59
SOURCE: FORTH. A86 Fig <strong>Forth</strong> 9086/88 Ver 1.0<br />
EJECT<br />
. **************<br />
; * CREATE *<br />
. **************<br />
CREAT<br />
86H<br />
'CREAT'<br />
'EV+80H<br />
I DDOT-6<br />
DOCOL<br />
DFIND<br />
ZBRAN ; I F<br />
OFFSET CREA1-$<br />
DROP<br />
NFA<br />
IDCOT<br />
LIT, 4<br />
MESS<br />
SPACE ; ENDIP<br />
HEXE<br />
DUP<br />
CAT<br />
WIDTIl<br />
AT<br />
MIN<br />
ONEP<br />
ALLOT<br />
DUP<br />
LIT, 0A3H<br />
TOGGL<br />
HERE<br />
ONE<br />
SU3 3<br />
LIT, 80H<br />
TOGGL<br />
LATES<br />
COK??.A<br />
CURR<br />
AT<br />
STORE<br />
HERE<br />
m o p<br />
COMMA<br />
SEMIS
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. *****************<br />
; * [COMPILE] *<br />
. *****************<br />
BCOMP<br />
. ***************<br />
; * LITERAL *<br />
. ***************<br />
0C 9H<br />
' [COMPILE '<br />
'1 '+80H<br />
CREAT-9<br />
DOCOL<br />
DFIND<br />
ZEQU<br />
ZERO<br />
QERR<br />
DROP<br />
CF A<br />
COMYA<br />
SEMIS<br />
I<br />
0DF0 C7 DB 0C7H<br />
0DF1 4C 49 54 45 52 41 DB 'LITERA'<br />
0DF7 CC DB 'L8+80H<br />
0DF8 D2 OD DW BCOMP-0CH<br />
0DFA 20 05 LITER DW DOCOL<br />
ODFC C2 06 DW STATE<br />
0DFE B4 04 DW AT<br />
BE00 9A 01 DW ZBRAN ; I F<br />
0E02 08 00 DW OFFSET LITE1-$<br />
0E04 1E 09 DW COM P<br />
0E06 6A 01 DW LIT<br />
BE08 3F 07 DW COMMA ; ENDIF<br />
0E0A 9A 03 DW SEMIS<br />
PAGE 61
AS236 VEZ 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/98 Ver 1.8<br />
EJECT<br />
DB<br />
DW<br />
DLITE DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DLITl DW<br />
0C8H<br />
'DLITERA'<br />
'L1+80H<br />
LITER-0AH<br />
DOCOL<br />
STATE<br />
AT<br />
ZBRAX ; IF<br />
OFFSET DLIT1-$<br />
SWA?<br />
LIT52<br />
LITER<br />
SEMIS<br />
863<br />
'?STAC'<br />
'R1+83H<br />
ELITE-0SH<br />
DOCOL<br />
SPAT<br />
SZE3.O<br />
AT<br />
S;V' A?<br />
ULESS<br />
OXE<br />
QE Rii<br />
SPAT<br />
HERE<br />
LIT, 80H<br />
PLUS<br />
ULESS<br />
LIT, 7<br />
QE RR<br />
SEMIS<br />
A G E 62
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. *****************<br />
; * INTERPRET *<br />
. *****************<br />
I<br />
89 DB 89H<br />
49 4E 54 45 52 50<br />
52 45<br />
DB 'IIU'TERPRE'<br />
D4 DB 'T1+80H<br />
29 0E DW QSTAC-9<br />
20 05<br />
E0 0C<br />
9A 01<br />
INTER<br />
INTEl<br />
DW<br />
DW<br />
DW<br />
DOCOL<br />
DFIND<br />
ZERAN<br />
; BEGIN<br />
; IF 1E 00 DW OFFSET INTEZ-$<br />
C2 06 DW STATE<br />
B4 04 DW AT<br />
79 07<br />
9A 01<br />
DW<br />
DW<br />
LESS<br />
ZBRAN ; IF<br />
0A 00 DW OFFSET INTE3-$<br />
3F 08 DW CFA<br />
3F 07 DW COMMA<br />
89 01 DW BRAN ; ELSE<br />
06 00<br />
3F 08 INTE 3<br />
DW<br />
DW<br />
OFFSET INTE4-$<br />
CFA<br />
7A 01 DW EXEC ; ENDIF<br />
32 0E INTE 4 DW QSTAC<br />
89 01 DW BRAN ; ELSE<br />
1C 00 DW OFFSET INTE5-$<br />
23 07 DW HERE<br />
88 0C DW NUMB<br />
D7 06 DW DPL<br />
B4 04 DW AT<br />
07 07<br />
9A 01<br />
DW<br />
DW<br />
ONEP<br />
ZBRAN ; IF<br />
08 00<br />
17 0E<br />
89 01<br />
06 00<br />
DW<br />
DW<br />
DW<br />
DW<br />
OFFSET INTE6-$<br />
DLITE<br />
BRAN ; ELSE<br />
OFFSET INTE7-$<br />
5F 04 DW DROP<br />
FA 0D<br />
32 BE<br />
DW<br />
DW<br />
LITER<br />
QSTAC<br />
; ENDIF<br />
; ENDIF<br />
89 01<br />
C2 FF<br />
DW<br />
DW<br />
BRAN ; AGAIN<br />
OFFSET INTE1-$<br />
PAGE 63
A5:436 YE2 1.3 SOURCE: FClRTH.A86<br />
05C6<br />
0Z27<br />
3EC9<br />
axs<br />
35f D<br />
k3SCr'<br />
gEz.1<br />
3 E 2 3<br />
acz5<br />
OED7<br />
a 5 ~ 9<br />
aEDB<br />
aEDG<br />
af EF<br />
aEE?<br />
0EE3<br />
0EE5<br />
0EE7<br />
QEE9<br />
3EEB<br />
BEED<br />
dEZF<br />
EJECT<br />
- *****************<br />
; * IMMEDIATE *<br />
. *****************<br />
DB<br />
DW<br />
IMMED DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
. ******************<br />
8<br />
; * VOCABULARY *<br />
. ******************<br />
DB<br />
DW<br />
VOCAB DW<br />
DW<br />
DW<br />
DW<br />
Dbi<br />
DW<br />
DW<br />
DW<br />
3W<br />
DW<br />
DW<br />
DW<br />
DL4<br />
DW<br />
DW<br />
DW<br />
DCVOC D'd<br />
DW<br />
CW<br />
DW<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 62<br />
898<br />
'IMMEGIAT'<br />
'E1+80~<br />
INTER-OCH<br />
DOCOL<br />
LATES<br />
LIT, 4BH<br />
TOGGL<br />
SEMiS<br />
'Y '+80H<br />
IMMED-OCH<br />
DOCOL<br />
BLILD<br />
LIT<br />
3A381H<br />
CSM?iA<br />
CCSR<br />
AT<br />
C F A.<br />
COMMA<br />
HERE<br />
VOCL<br />
AT<br />
COMMA<br />
VOCL<br />
STORE<br />
DOES<br />
?"do P<br />
CCNT<br />
STORE<br />
SEMIS
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
0EF1 C5<br />
0EF2 46 4F 52 54<br />
0EF6 C8<br />
0EF7 BC 0E<br />
0EF9 DF 09<br />
0EFE E9 0E<br />
QEFD 81 A0<br />
0EFF 00 1A<br />
OF01 00 00<br />
EJECT<br />
. *************<br />
; * FORTH *<br />
. *************<br />
I<br />
I<br />
; THE 'TASK-7' IS A COLD START VALUE<br />
; ONLY. ITS CHANGED EACH TIME A<br />
; DEFINITION IS APPENED TO THE<br />
; VOCABULARY.<br />
'FORTH'<br />
I<br />
FORTH<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
0C 5H<br />
' FORT '<br />
'Ht+80H<br />
VOCAB-0DH<br />
DODOE<br />
DOVOC<br />
0A081H<br />
TASK-7 ;<br />
0 I<br />
. *******************<br />
; * DEFINITIONS *<br />
. *******************<br />
OF03 8B<br />
0Fg4 44 45 46 49 4E 49<br />
54 49 4F 4E<br />
I<br />
DB<br />
D B<br />
8B H<br />
'DEFINITION '<br />
0E0E D3 DB 'S1+8@H<br />
0FQF El 0E DW FORTH-8<br />
OF11 20 05 DEFIN DW DOCOL<br />
OF13 A8 06 DW CONT<br />
OF15 B4 04 DW AT<br />
OF17 B6 06 DW CURR<br />
OF19 DF 04 DW STORE<br />
0FlB 9A 03 DW SEMIS<br />
I<br />
PAREN<br />
DB 0C 1H<br />
DB ' ('+80H<br />
DW DEFIN-0EH<br />
DW DOCOL<br />
DW LIT, ' ) '<br />
DW WORDS<br />
DW SEMIS<br />
PAGE 65<br />
COLD START VALUE ONLY<br />
END OF VOCABULARY LIST
~ 5 Y 8 6 VEX 1. i3 SOURCE: PoRTx-A~~ Fig <strong>Forth</strong> 8386/88 Ver 1.0<br />
EJECT<br />
; * QUIT *<br />
. ************<br />
QUIT<br />
. *************<br />
; * ABORT "<br />
. *************<br />
I<br />
Dl3<br />
DB<br />
T) B<br />
DW<br />
ABORT DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DB<br />
DB<br />
84H<br />
'QUI '<br />
'T1+S3il<br />
PAREN-4<br />
DOCOL<br />
ZERO<br />
BLK<br />
STORE<br />
5B .w. C<br />
RPSTO ; BEGIS<br />
CR<br />
QLTERY<br />
INTER<br />
STATE<br />
AT<br />
ZEQU<br />
ZBRAN ; IF<br />
OFFSET QUITZ-$<br />
PDOTQ<br />
2<br />
'JK ' ; EXDIF<br />
BTiAN ; AGAIN<br />
DFFSET QUIT1-$<br />
859<br />
'ABGR'<br />
'T1+80%<br />
QUIT-7<br />
DOCGL<br />
SPSTO<br />
DECA<br />
QS TAC<br />
CR<br />
DOTCPU<br />
PDOTQ<br />
OD H<br />
'Fig-<strong>Forth</strong> '<br />
FIG2EL+30Hl ADD?', FIGRE7J+3aH<br />
FORTH<br />
DEFIN<br />
QUIT<br />
PAGE 66
ASM86 VER 1.0 SOURCE: FORTH.A86<br />
EJECT<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
; WARM START VECTOR COMES HERE<br />
I<br />
WRM : MOV S1,OFFSET WRMl<br />
JMP NEXT<br />
~ R M I DW WARM<br />
; ************<br />
; * WARM *<br />
; ************<br />
WARM<br />
848 ; WARM<br />
'WAR'<br />
'M1+80H<br />
ABORT-8<br />
DOCOL<br />
MTBUF<br />
ABORT<br />
; COLD START VECTOR COMES HERE<br />
PAGE 6<br />
I<br />
CLD: MO V S1,OFFSET CLDl ; ( IP)
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver l.Q<br />
LIT<br />
ORIG+12H<br />
LIT, UP<br />
AT<br />
LIT, 6<br />
PLUS<br />
LIT, 10H<br />
CMOVE<br />
LIT, ORIG+QCH<br />
AT<br />
LIT, FORTH+6<br />
STORE<br />
ABORT<br />
PAGE 62
ASM86 VER 1.0<br />
BEFE<br />
OFF@<br />
1002<br />
1003<br />
1005<br />
1007<br />
1008<br />
l0BA<br />
100C<br />
l00E<br />
l00F<br />
SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 69<br />
EJECT<br />
DB<br />
DB<br />
DB<br />
DW<br />
STOD D W<br />
POP<br />
SUB<br />
OR<br />
JNS<br />
DEC<br />
STOD1: JMP<br />
DPM<br />
; * ABS *<br />
. ***********<br />
84H<br />
IS-> '<br />
'D1+80H<br />
COLD-7<br />
$+2<br />
DX<br />
AX, AX<br />
DX , DX<br />
STODl<br />
AX<br />
DPUSH<br />
8 2H<br />
'+ '<br />
'-'+80H<br />
STOD-7<br />
DOCOL<br />
ZLESS<br />
ZBRAN ; IF<br />
OFFSET PM1-$<br />
MINUS ; ENDIF<br />
SEMIS<br />
83H<br />
'D+ '<br />
'-'+808<br />
PM-5<br />
DOCOL<br />
ZLESS<br />
ZBRAN ; IF<br />
OFFSET DPM1-$<br />
DMINU ; ENDIF<br />
SEMIS<br />
83H<br />
'AB '<br />
'S1+80H<br />
; S1<br />
;AX=0<br />
; SET FLAGS<br />
; POSITIVE NUMBER<br />
; NEGITIVE NUMBER
2 . 6 3 1 SOURCE: FORTH.AB6<br />
ABS<br />
; * DABS *<br />
. ************<br />
t<br />
. ***********<br />
; * MIN *<br />
. ***********<br />
. ***********<br />
; * MAX *<br />
. ***********<br />
I<br />
MAX<br />
Fig <strong>Forth</strong> <strong>8086</strong>/38 Ver 1.a<br />
DPY-6<br />
DOCOL<br />
GUP<br />
?!'I<br />
SEMIS<br />
84H<br />
'DAB '<br />
'S1+80H<br />
ABS-6<br />
DOCOL<br />
DUP<br />
DPY<br />
SEFIIS<br />
833<br />
'YI '<br />
'N '+ad3<br />
DABS-7<br />
DOCOL,TGUP<br />
GZZAT<br />
ZSRAN ; IF<br />
3FFSET MIN1-$<br />
Sij A? ; ENDIF<br />
CRS?<br />
SEHIS<br />
83H<br />
'MA'<br />
'X '+80H<br />
MIN-6<br />
DOCOL,TDL'P<br />
LESS<br />
ZBRAN ; IF<br />
DFFSET MAX1-$<br />
SSAP ; ENCIF<br />
DROP<br />
SEYIS<br />
PAGE 7.2
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
MSTAR<br />
MSLAS<br />
STAR<br />
EJECT<br />
82H<br />
'M'<br />
'*'+80H<br />
MAX-6<br />
DOCOL, TDUP<br />
XO RR<br />
TOR<br />
ABS<br />
SWAP<br />
AB S<br />
USTAR<br />
FROM R<br />
D PM<br />
SEMIS<br />
8 2H<br />
'M '<br />
'/'+80H<br />
MSTAR-5<br />
DOCOL<br />
OVER<br />
TOR<br />
TOR<br />
DABS<br />
RR<br />
ABS<br />
US LAS<br />
FROMR<br />
RR<br />
XORR<br />
PM<br />
SWAP<br />
FROM R<br />
PM<br />
SWAP<br />
SEMIS<br />
81H<br />
'*'+80H<br />
MSLAS-5<br />
DOCOL<br />
MSTAR<br />
PAGE 71
A386 VER 1.0 SOURCE: FOXTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
DB<br />
DB<br />
DB<br />
DW<br />
SLMOD DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DB<br />
DB<br />
DW<br />
SLASH DW<br />
DW<br />
DW<br />
DW<br />
Dii<br />
. ***********<br />
; * MOD<br />
. ***********<br />
MODD<br />
*************<br />
; * *,/MOD *<br />
- *************<br />
1<br />
OROP<br />
SEMIS<br />
84H<br />
'/MO '<br />
'Dt+8aH<br />
STAR-4<br />
DOCOL<br />
TOR<br />
STOD<br />
FROMR<br />
MSLAS<br />
SEMIS<br />
81H<br />
'/'+80H<br />
SLMOD-7<br />
9OCOL<br />
SLMOD<br />
SWAP<br />
DROP<br />
SEMIS<br />
83H<br />
'MO '<br />
'D'+8BH<br />
SLASH-4<br />
DOCOL<br />
SLMOD<br />
DROP<br />
SEXIS<br />
DB 8513<br />
DB ' */MO '<br />
DB 'D4+80H<br />
DW MODD-6<br />
SSMOD DW DOCOL<br />
DW TOR<br />
PAGE 72
ASM86 VER 1.0 SOURCE: FORTH.A86<br />
SSLA<br />
DB<br />
DB<br />
DB<br />
DW<br />
MSMOD DW<br />
DW<br />
CW<br />
DEj<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
MSTAR<br />
FROMR<br />
MSLAS<br />
SEMIS<br />
8 2H<br />
I t 1<br />
',11+80H<br />
SSMOD-8<br />
DOCOL<br />
SSMOD<br />
SWAP<br />
DROP<br />
SEMIS<br />
85H<br />
'M/MO '<br />
'D1+80H<br />
SSLA-5<br />
DOCOL<br />
TOR<br />
ZERO<br />
RR<br />
USLAS<br />
FROMR<br />
SWAP<br />
TOR<br />
USLAS<br />
FROMR<br />
SEMIS<br />
PAGE 73
SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
- **************<br />
; * (LINE) *<br />
. ********ti****<br />
I<br />
DB<br />
D a<br />
D a<br />
DW<br />
PLINE DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DX<br />
DK<br />
DW<br />
DW<br />
DW<br />
DW<br />
DM<br />
DLINE<br />
; ***************<br />
; * MESSAGE<br />
. ***************<br />
MESS<br />
86H<br />
' (LINE'<br />
') '+8aH<br />
MSMOD-8<br />
DOCOL<br />
TOR<br />
LIT, 64<br />
BBUF<br />
SSMOD<br />
FROMR<br />
BSCR<br />
STAT!<br />
PLUS<br />
BLOCK<br />
PLLiS<br />
LIT, 64<br />
SEMIS<br />
85H<br />
' . LIN '<br />
'E"t8gi-l<br />
PLI?JZ-9<br />
GCCOL<br />
PLI:iE<br />
DT.SA2<br />
TYPES<br />
SEMIS<br />
87H<br />
'MESSAG '<br />
'E'+88H<br />
DLINE-8<br />
DCCOL<br />
XARN<br />
AT<br />
ZBRAN ; IF'<br />
OFFSET MESS1-$<br />
DDUP<br />
ZBRAN ; IF<br />
OFFSET MESS2-$<br />
LIT, 4<br />
PACE 73
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/58 Ver 1.0<br />
OFSET<br />
AT<br />
BSCR<br />
SLASH<br />
SUBB<br />
DLINE<br />
SPACE ; ENDIF<br />
BRAN ; ELSE<br />
OFFSET MESS3-$<br />
PDOTQ<br />
6<br />
'MSG # '<br />
DOT ; ENDIF<br />
SEMIS<br />
PAGE 75
C4<br />
r: a;@&<br />
0 0 > hl<br />
p: P1mN<br />
Irr ......<br />
- n:<br />
W x 4<br />
E-c m m<br />
-<br />
E-4 w 0<br />
3 00 I x z z<br />
m - + rn a 4 m<br />
XU- rncJ - .s<br />
m a ( w u + ~ c l z ~ 4<br />
n; a- - xmad:rl4<br />
W<br />
E-1<br />
* * *<br />
* *<br />
* * 3 m m ~ ~ 3 0 2 * 3 * ~<br />
* * 3 (4<br />
* w * u aaaaafi~rn-<br />
* U*<br />
*I&* x<br />
* * u<br />
* * h<br />
* * W<br />
*** C4<br />
N m rn woo rl: m (J b1<br />
mmmmmrnmmm<br />
4 4 ri ?i 4 r+ -I 7-4 ?I<br />
F l r l d 8 + 4 4 d d r - i<br />
C * C<br />
C C<br />
C *<br />
C -.C<br />
C U C<br />
C<br />
C<br />
PC*<br />
*<br />
C *<br />
C *<br />
* * *<br />
GI 3: W<br />
E 4 I<br />
> w f3 4<br />
m - - +4 4h<br />
XU- UN -X<br />
m&-.E-r + XXXW<br />
d a- - &ma
ASM86 VER 1.0 SOURCE: FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
I<br />
; STORE WORD AT PORT.<br />
PTSTO<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
POP<br />
POP<br />
OUT<br />
JMP<br />
8 2H<br />
IP<br />
' ! ' i80H<br />
PTAT-5<br />
$+2<br />
DX ; PORT ADDR<br />
AX ; DATA<br />
DX,AX ; WORD OUTPUT<br />
NEXT<br />
PAGE 77
ASH86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 78<br />
EJECT<br />
.-----------------------------------------------<br />
I<br />
t<br />
; DISK INTERFACE WORDS<br />
I<br />
; DOUBLE DENSITY 8" FLOPPY CAPACITIES<br />
#<br />
SPT2 EQU 52 ; SECTORS PER TRACK<br />
TRKS 2 EQU 77 ; NUMBER OF TiLICKS<br />
SPDRV2 EQLl SPT2*TRKS 2 ; SECTC?.S/DRIVE<br />
I<br />
; SINGLE DENSITY 8" FLOPPY CAPACITIZS<br />
I<br />
SPTl EQU 26 ; SECTCRS/TRACK<br />
TRKSl EQU 77 ; # TRACKS<br />
SPDRVl EQU SPTl *TRKS 1 ; SECTORS/DRIVG<br />
I<br />
BPS EQU 126 ; BYTES PER SECTOR<br />
MXDRV EQU 2 ; MAX 4 DRIVES<br />
I<br />
I<br />
; FORTH VARIABLES AND CONSTANTS<br />
; USED IN THE DISK INTERFACE.<br />
I<br />
. *************<br />
; * DRIVE *<br />
. *************<br />
8<br />
; CURRENT DRIVE NUKBER<br />
I<br />
D B 85H<br />
DB 'DRIV'<br />
D B 'Et+8BH<br />
DW PTSTO-5<br />
DRIVE DW DOVAR, 0<br />
. ***********<br />
; * SEC *<br />
. ***********<br />
I<br />
; CURRENT SECTOR NUMBER<br />
SEC<br />
83ti<br />
'SE'<br />
'C '+80H<br />
DRIVE-8<br />
DOVAR<br />
0
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
; *************<br />
; * TRACK *<br />
. *************<br />
t<br />
; CURRENT TRACK NUMBER<br />
I<br />
DB 85H<br />
DB 'TRAC '<br />
DB 'Kg+80H<br />
DW SEC-6<br />
TRACK DW DOVAR, 0<br />
. ***********<br />
; * USE *<br />
. ***********<br />
I<br />
; ADDRESS OF NEXT BUFFER TO USE<br />
I<br />
USE<br />
; ************<br />
; * PREV *<br />
. ************<br />
DB 838<br />
DB 'US '<br />
DB 'Et+80H<br />
DW TRACK- 8<br />
DW DOVAR<br />
D W BUF 1<br />
I<br />
; ADDRESS OF PREVIOUSLY USED BUFFER<br />
I<br />
DB 84H<br />
DB 'PRE'<br />
DB 'V1+80H<br />
DW USE-6<br />
PREV DW DOVAR<br />
DW BUF 1<br />
I<br />
; NUMBER OF SECTORS PER BLOCK<br />
i<br />
121F 87 DB 87H<br />
1220 53 45 43 2F 42 4C DB 'SEC/BL '<br />
1226 CB DB 'K8+80H<br />
1227 14 12 DW PREV-7<br />
1229 5D 05 SPBLK DW DOCON<br />
122B 01 00 DW KBBUF/BPS<br />
PAGE 79
-4SM86 VER 1.B SOURCE: FORTd.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.8<br />
EJECT<br />
I<br />
; NUMBER OF BUFFERS<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
NOBUF DW<br />
; * DENSITY *<br />
. ***************<br />
I<br />
; 0 = SINGLE, 1 = DOUBLE<br />
I<br />
1239 87 D E 87H<br />
123A 44 45 4E 53 49 54 DB 'DENS IT '<br />
124a D9 DB 'Y1+8aH<br />
1241 2D 12 DW NGBUF-8<br />
1243 76 05 DESSTY DW DG'JA2<br />
1245 00 00 Dw 0<br />
I<br />
; DISK ERROR STATUS<br />
I<br />
1247 8A DB 8A3<br />
1248 44 49 53 43 2D 45 D B 'DISK-EXRO'<br />
52 52 4F<br />
DSKERR DW DOVAR, 0<br />
PAGE Pil
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
PBUF<br />
PBUF 1<br />
EJECT<br />
. **************<br />
; * UPDATE *<br />
. **************<br />
UPDAT<br />
84H<br />
'+BU '<br />
'F1+80a<br />
DSKERR-13<br />
DOCOL<br />
LIT, CO<br />
PLUS, DUP<br />
LIMIT, EQUAL<br />
ZBRAN<br />
OFFSET PBUF1-$<br />
DROP, FIRST<br />
DUP PREV<br />
AT, SUBB<br />
SEMIS<br />
86H<br />
'UPDAT '<br />
'E1+80H<br />
PBUF-7<br />
DOCOL, PREV<br />
AT, AT<br />
LIT, 8000H<br />
ORR<br />
PREV, AT<br />
STORE, SEMIS<br />
* .....................<br />
; * EMPTY-BUFFERS *<br />
. .....................<br />
MTBUF<br />
8DH<br />
'EMPTY-BUFFER'<br />
'S '+80H<br />
UPDAT-9<br />
DOCOL, FIRST<br />
LIMIT,OVER<br />
SUBB, ERASEE<br />
SEMIS<br />
PAGE 81
ASX86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. ***********<br />
; * DRB *<br />
. ***********<br />
I<br />
D B<br />
DB<br />
DB<br />
DW<br />
DRZER DW<br />
DW<br />
DW<br />
I<br />
3B<br />
DB<br />
DB<br />
DW<br />
DRONE DW<br />
3K<br />
DW<br />
DW<br />
DW<br />
DW<br />
DK<br />
DRONl DEi<br />
DRON2 DW<br />
Di4<br />
83H<br />
'DR '<br />
'0'+80fI<br />
MTBUF-16<br />
DOCOL, ZERO<br />
OFSET,STORE<br />
SEMIS<br />
83H<br />
'DR'<br />
'1 '+888<br />
DRZER-6<br />
30COL<br />
DENSTY ,AT<br />
Z B RAN<br />
OFFSET DRGN1-$<br />
LIT,SPDRV2<br />
EWN<br />
OFFSET DRONZ-$<br />
LIT, SPi3ilV1<br />
OFSET, STGRE<br />
SZYIS<br />
PAGE 82
ASM86 VER 1.0 SOURCE: FORTH.A86<br />
EJECT<br />
. **************<br />
; * BUFFER *<br />
. **************<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
I<br />
; NOTE: THIS WORD WON'T WORK IF ONLY<br />
; USING SINGLE BUFFER.<br />
;<br />
DB<br />
DB<br />
86H<br />
'BUFFE'<br />
DB 'Rf+80H<br />
DW DRONE-6<br />
BUFFE DW DOCOL, USE<br />
DW AT, DUP<br />
DW TOR<br />
BUFF1 Dw PBUF<br />
DW ZBRAN<br />
DW OFFSET BUFF1-$<br />
DW<br />
DW<br />
DW<br />
DW<br />
USE, STORE<br />
RR , AT<br />
ZLESS<br />
Z B RAN<br />
DW OFFSET BUFF2-$<br />
DW RR, TWOP<br />
DW RR, AT<br />
DW LIT, 7FFFH<br />
DW ANDD, ZERO<br />
DW<br />
DW<br />
RSLW<br />
RR, STORE<br />
DW RR, PREV<br />
DW STORE, FROMR<br />
DW TWOPISEMIS<br />
PAGE 83
ASPI86 VER 1.0 SOURCE: FORTH.AE6<br />
EJECT<br />
. *************<br />
; * BLOCK *<br />
. *************<br />
;<br />
DB<br />
DB<br />
DB<br />
DW<br />
BLOCK DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
BLOC2 DW<br />
D W<br />
DW<br />
DW<br />
DW<br />
DW<br />
D W<br />
DW<br />
BLOC3 DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
BLOC1 DW<br />
DW<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
85H<br />
'BLOC '<br />
'Kt+80H<br />
BUFFE-9<br />
DOCOL,OFSET<br />
AT, PLUS<br />
TOR, PREV<br />
AT, DUP<br />
AT, RR<br />
SUED<br />
DUP, PLUS<br />
ZBRAN<br />
OFFSET BLOC1-$<br />
TBUF , ZEQU<br />
ZBRAN<br />
OFFSET BLOC3-$<br />
DROP, RR<br />
BUFFZ, DL'P<br />
RR,ONE<br />
RS LW<br />
Two, SUBB<br />
DU?, AT<br />
RR, SUBB<br />
DUP, PLUS<br />
ZEQU<br />
ZBRAN<br />
OFFSET BLOC2-$<br />
DUP, PREV<br />
STORE<br />
FROMR, DROP<br />
TWOPISEMIS<br />
PAGE 84
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
I<br />
; SETS: DMA OFFSET, DMA SEGMEhT<br />
i TRACK AND SECTOR.<br />
I<br />
DB 86H<br />
DB 'SET-I '<br />
DB '01+80H<br />
DW BLOCK-8<br />
DW $+2<br />
MOV CX, USE+2<br />
CALL SDMAO<br />
MOV CX,CS<br />
CALL SDMAS<br />
MOV CX,SEC+2<br />
CALL SSEC<br />
MOV CX,TRACK+2<br />
CALL STRK<br />
JMP NEXT<br />
; * SET-DRIVE *<br />
. *****************<br />
DB<br />
DW<br />
SETDRV DW<br />
MOV<br />
CALL<br />
JMP<br />
89H<br />
'SET-DRIV '<br />
'E1+80H<br />
SETIO-9<br />
$+2<br />
CX,DRIVE+2<br />
SDSK ; SELECT DISK<br />
NEXT<br />
; DMA OFFSET<br />
; SET IT<br />
; GET SEGMENT<br />
; SET IT<br />
; SECToR #<br />
; SET IT<br />
; TRACK #<br />
; SET IT<br />
PAGE 85
AS'486 'JER 1.0 SOURCE: FORTII.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 86<br />
EJECT<br />
I<br />
; (CALCULATES DRIVE#, TRACK*, & SECTORB )<br />
; STACK: SECTOR-DISPLACEMENT = BLKP * SEC/BLK<br />
; OUTPUT: VARIABLES DRIVE, TRACK, & SEC<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
TSCALC DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
D'rS<br />
DX<br />
DW<br />
DW<br />
DW<br />
DW<br />
DK<br />
TSCALl DW<br />
Dd<br />
TSCAL2 DW<br />
DW<br />
DW<br />
Dd<br />
DW<br />
SINGLE DENSITY<br />
87H<br />
'T&SCAL '<br />
'C '+80H<br />
SETDRV-12<br />
DOCOL, DEXSTY<br />
AT<br />
ZBRAN<br />
OFFSET TSCALS-$<br />
LIT, SPDR'J2<br />
SLY00<br />
LIT,MX2RVtYIN<br />
DL'?, DRIVE<br />
AT, EQL'AL<br />
ZBMN<br />
OFFSET TSCAL1-$<br />
DROP<br />
SRAN<br />
OFFSET TSCAL2-$<br />
DXIVE,STOi7E<br />
SETCRV<br />
LIT,S?T2<br />
SLMOD, TXACK<br />
~rn- LJRE OKZP<br />
SEZ, STSRE<br />
SEMIS<br />
LIT,SPDRVl<br />
SLMGD<br />
LIT,!dXDRV,XIN<br />
DUP, DRIVE<br />
AT, EQUAL<br />
Z BRAN<br />
OFFSET TSCAL3-$<br />
DROP<br />
B i?AN<br />
OFFSET TSCAL4-S<br />
DRIV5,STORE<br />
SETGRV<br />
LIT, STT1<br />
SLMOD, TRACK<br />
STORE, ONEP<br />
SEC, STORE<br />
SEMIS
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
; ****************<br />
; * SEC-READ *<br />
; ****************<br />
READ A SECTOR<br />
SECRD<br />
DB<br />
DW<br />
DW<br />
CAL<br />
MOV<br />
MOV<br />
JMP<br />
; * SEC-WRITE *<br />
. *****************<br />
I<br />
; WRITE A SECTOR<br />
SECWT<br />
DB<br />
DW<br />
DW<br />
CALL<br />
MOV<br />
MOV<br />
JMP<br />
88H<br />
'SEC-REA '<br />
PAGE 87<br />
'D '+80H<br />
TSCALC-10<br />
$+2<br />
GS EC ; GET (READ) SECTOR<br />
AH, 0<br />
DSKERR+2,AX ; SAVE ERROR STATUS<br />
NEXT<br />
89H<br />
'SEC-WRIT'<br />
'E '+80H<br />
SECRD-11<br />
$+2<br />
PS EC ; PUT (WRITE) SECTOR<br />
AH, 0<br />
DSKERR+2,AX ; SAVE ERROR STATUS<br />
NEXT
ASY86 VER 1.3 SOURCE: FORTH.A86<br />
EJECT<br />
. ***********<br />
f<br />
; DISK READ/hRITE ROUTINE<br />
I<br />
Fig <strong>Forth</strong> <strong>8086</strong>/!38 Ver 1.0<br />
D B 8 3H<br />
DB 'R/'<br />
DB 'W1+80H<br />
DW SECWT-12<br />
DW DOCOL<br />
DW USE,AT<br />
DW TOR<br />
DW SWAP,SPBLK<br />
DW STAR, ROT<br />
Dw USE, STORE<br />
DW SPBLK, ZERO<br />
DW XDO<br />
RSLWl CW OV52, OVER<br />
DW TSCALC, SETIO<br />
DW ZBRAN<br />
DW OFFSET RSLX2-$<br />
DW SECRD<br />
DW BRAN<br />
DW OFFSET RSLW3-$<br />
RSLN2 DW SECijT<br />
RSLW3 DM ONE?<br />
DW LIT, 81JH<br />
DW JSE, PSTOR<br />
DW XLOOP<br />
DW OFFSET RSLbi1-$<br />
DM DRG?, DROP<br />
DW FROYR, USE<br />
DW STCRE, SEMIS
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. *************<br />
; * FLUSH *<br />
. *************<br />
I<br />
DB<br />
D B<br />
DB<br />
DW<br />
FLUSH DW<br />
DW<br />
DW<br />
FLUS1 DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
; ************<br />
; * LOAD *<br />
. ************<br />
LOAD<br />
SCREEN<br />
DB<br />
DB<br />
DB<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
85H<br />
'FLUS '<br />
'H1+80H<br />
RSLW-6<br />
DOCOL<br />
NOBUF , ONEP<br />
ZERO, XDO<br />
ZERO, BUFFE<br />
DROP<br />
XLOOP<br />
OFFSET FLUS1-$<br />
SEMIS<br />
84H<br />
'LOA'<br />
'D8+80H<br />
FLUSH-8<br />
DOCOL, BLK<br />
AT, TOR<br />
INN, AT<br />
TOR, ZERO<br />
INN, STORE<br />
BSCR, STAR<br />
BLK, STORE<br />
INTER<br />
FROMR, INN<br />
STORE<br />
FROMR, BLK<br />
STORE<br />
SEMIS<br />
PAGE 89<br />
; BLK
ASX86 VEX 1.0 SOURCE: FORTF.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
ARROW<br />
EJECT<br />
0C 3H<br />
'--I<br />
' > '+80H<br />
LOAD-7<br />
DOCOL<br />
QLOAD<br />
ZERO<br />
INN<br />
STORE<br />
BSCR<br />
BLK<br />
AT<br />
OVER<br />
??ODD<br />
SUBB<br />
BLK<br />
PSTOR<br />
SEMIS<br />
PAGE 9s
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
; ......................................<br />
; * QUERY KEYBOARD FOR KEY PRESSED *<br />
; ......................................<br />
I<br />
; (TRUE = CHAR READY, FALSE = NO CHAR)<br />
I<br />
; CALLED FROM "?TERMINALw.<br />
I<br />
; USE 'KEY' TO GET KEY VALUE.<br />
I<br />
PQTER: CALL CSTAT ; TEST FOR KEY<br />
OR ALIAL ; ANY KEY<br />
JZ PQTERl ; NO<br />
MOV AL,1 ; TRUE = CHAR FOUND<br />
PQTER1: MOV AH, 0 ; MAKE 16-BITS<br />
JMP APUSH ; SAVE STATUS<br />
. .............................<br />
; * CONSOLE INPUT ROUTINE *<br />
. .............................<br />
i<br />
; WAITS FOR A KEYBOARD CHARACTER.<br />
I<br />
; CONTROL-P KEY WILL TOGGLE PRINTER<br />
; ECHO FLAG.<br />
I<br />
; CALLED FROM "KEY".<br />
I<br />
155D E8 4F 00 PKEY: CALL CI ; CONSOLE INPUT<br />
1560 3C 10 CMP AL,DLE ; PRINTER TOGGLE?<br />
1562 75 09 JNE PKEYl ; NO<br />
1564 2E 80 36 97 15 01 XOR EPRINT,l ; TOGGLE ECHO<br />
156A E9 F0 FF JMP PKEY ; GET ANaTHER KEY<br />
156D B4 00 KEY^: MOV AH, 0 ; MAKE 16-BITS<br />
156F E9 E9 EB JMP APUSH : SAVE KEY VALUE<br />
; * CONSOLE/PRINTER CHARACTER OUTPUT *<br />
; ........................................<br />
;<br />
; CALLED FROM "EMIT".<br />
;<br />
PEMIT DW $+2<br />
POP .AX<br />
CALL POUT<br />
JMP NEXT<br />
; (EMIT) ORPHAN<br />
; GET CHAR<br />
; CHAR OUTPUT<br />
PAGE 91
ASM86 VER 1.0 SOURCE: FORTH.A86<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 92<br />
EJECT<br />
. ...............................<br />
; * CRLF T3 CONSOLE/?RINTEX<br />
; ...............................<br />
*<br />
I<br />
; CALLED FROM 'CR'<br />
MGV<br />
CALL<br />
MCV<br />
CALL<br />
JMP<br />
AL,ACR<br />
PG iJT<br />
AL , LF<br />
POUT<br />
NEXT<br />
; CHAR OUTPUT<br />
. * *<br />
; * TRUE CONSOLE/?RINTEX OUTPUT ROUTINE *<br />
. * *<br />
. ...........................................<br />
1<br />
PCL'T: CALL CHO<br />
TEST EPRIST, 1<br />
JZ PC)UTl<br />
CALL LO<br />
POUT1: RET<br />
; PRINTER ECHO FLAG<br />
I<br />
; VALGE: O = OFF, 1 = 3N<br />
I<br />
EPRINT DB 0, @<br />
; CONSCLEOOUT<br />
; PRINTER ECHO?<br />
; OFF<br />
; L IST OUTPUT
ASM86 VER 1.0 SOURCE: FORTH. A86 Fig <strong>Forth</strong> 8886/88 Ver 1.0 PAGE 93<br />
EJECT<br />
.......................................... ...<br />
a * .<br />
1 1 1<br />
1 1 1 . . . CP/M-86 INTERFACE ROUTINES ... 1 1 1<br />
I l l<br />
...<br />
1 1 1 ;;;<br />
..........................................<br />
I<br />
; ALL LOW LEVEL CONSOLE AND DISK 1/0 START<br />
; HERE.<br />
I<br />
; THE<br />
0<br />
I<br />
I<br />
I<br />
;<br />
I<br />
I<br />
1<br />
I<br />
1<br />
I<br />
I<br />
I<br />
FOLLOWING 1/0 ROUTINES ARE SUPPORTED:<br />
CONSOLE INPUT (CSTAT) .<br />
CONSOLE OUTPUT (CEO) .<br />
LIST OUTPUT (LO).<br />
SELECT DISK (SDSK).<br />
SET TRACK (STRK) .<br />
SET SECTOR (SSEC).<br />
SET DMA OFFSET (SDMAO).<br />
SET DMA SEGMENT (SDMAS) .<br />
GET SECTOR (GSEC) .<br />
PUT SECTOR (PSEC) .<br />
; * BDOS FUNCTION CALL *<br />
. ..........................<br />
I<br />
; ENTRY TO CP/M-86 BDOS IS THROUGH SOFTWARE<br />
; INTERRUPT #224.<br />
I<br />
; ENTRY:<br />
I<br />
1<br />
; EXIT:<br />
I<br />
I<br />
BDOSFUNC :<br />
PUSHF<br />
PUSH<br />
PUSH<br />
INT<br />
POP<br />
POP<br />
POPF<br />
RET<br />
REG CL = FUNCTION CODE.<br />
" DX = PARAMETER (S) .<br />
REGS. AX, BX AND ES CONTAIN<br />
RETURNED PARAMETERS.<br />
REGS. SI, BP, FLAGS ARE SAVED.<br />
ALL SEGMENT REGISTERS SAVED<br />
EXCEPT ES.<br />
; SAVL FLAGS<br />
; SAVE "IP"<br />
; AND "RPP"<br />
; SOFT'rJARE INTERRUPT
ASH86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> 8286/38 Ver 1.0<br />
EJECT<br />
. ............................<br />
I<br />
; * EXIT BACK TO C?/X-85 *<br />
. ............................<br />
I<br />
EXIT: MOV DL, 4 ; STAriDARD ABORT<br />
M3V CL,a ; RESET FUNCTION #<br />
JMP BDOSFUNC<br />
. **kt***********************<br />
; * GET KEYBOARD STATSS *<br />
. ...........................<br />
I<br />
; RETURNS KEYBOARD STATLIS<br />
I<br />
; *** USES CI3ECT CALL TO "3IOS" ***<br />
8 (THROUGH THE " BDOS" )<br />
I<br />
; EXIT: REG AX = 0 IF NO KEY PRESSZD<br />
1 RZG AX = NON-ZEXO IF KEY PRESSED<br />
I<br />
CSTAT: MOV AL, 2 ; 'CONST' FUNCTION<br />
CALL DCBIOS ; DIRECT 510s CALL<br />
RET<br />
; * CONSOLE INPYT *<br />
. .....................<br />
I<br />
; KAITS FOR KEY FROY KEYBGARD<br />
I<br />
; *** USES DIRECT CALL TO "9IOS" ***<br />
I (THROUGH THE "EDOS" )<br />
I<br />
CI: MOV<br />
CALL<br />
RET<br />
AL, 3 ; 'CONIN' FUIGC<br />
DCBIOS ; CALL SIOS<br />
PAGE 94
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
; * CONSOLE OUTPUT *<br />
. ......................<br />
I<br />
; OUTPUTS CHARACTER IN REG AL<br />
; TO CONSOLE.<br />
I<br />
; EXIT: REG AL = CHARACTER<br />
I<br />
CHO: PUSH AX ; SAVE CHAR<br />
MOV DL, AL<br />
MOV CL,6 ; BDOS FUNCTION #<br />
CALL BDOSFUNC<br />
POP AX<br />
RET<br />
. *******************<br />
; * LIST OUTPUT *<br />
. *******************<br />
I<br />
; OUTPUTS CHARACTER IN REG AL<br />
; TO LIST DEVICE (PRINTER).<br />
f<br />
; EXIT: REG AL = CHARACTER<br />
I<br />
LO: PUSH AX ; SAVE<br />
MOV DL, AL<br />
MOV CL, 5 ; BDOS<br />
CALL BDOSFUNC<br />
POP AX<br />
RET<br />
CHAR<br />
FUNCTION #<br />
PAGE 95
ASY86 VER 1.0 SOURCE: FORT9.A86 Fig <strong>Forth</strong> 8066/83 Ver 1.0<br />
. *<br />
EJECT<br />
* * * * * * * * * * * * * * * * * * * * * * * r * * * * * * * * * * *<br />
. *<br />
. *<br />
I . .................................<br />
; * DIRECT BIOS CALL FUNCTION *<br />
I<br />
I<br />
; ALLOWS DIRECT CALLS (THROUGR 'BDOS' )<br />
; TO THE 'BIOS' PROGRAM.<br />
I<br />
; ENTER: REG AL = BIDS FUNCTION NO.<br />
; " CX = PARA?lETGR 1<br />
; " DX = PAilAXETGR 2<br />
I<br />
; NOTE: THE ABOVE PAMXETERS ARE OPTIONAL<br />
I DEPEKDING UPON THE FUNCTION CALLED.<br />
I<br />
GCBIGS: MOV BX,OFFSET 313SIA.X<br />
MOTJ [BX] ,AL ; FSSC #<br />
PAGE 96<br />
MOV 1 [EX] ,CX ; PA?A. 1<br />
MOV 3 [BX] ,DX ; PAXSI. 2<br />
MOV DX,BX ; P.4X.Y. POINTER<br />
YOV CL, 50 ; 313ECT CALL<br />
JMP BDOSFUNC ; ... GO-IT...<br />
; THE FOLLDWING IS A SCRATCH AZEA FOR<br />
; STORING THE FUNCTION # AND 2AilAXETERS<br />
; DURING A DIRECT 913s CALL.<br />
. *******************<br />
I<br />
; * SELECT DISK *<br />
. *******************<br />
I<br />
I<br />
; ENTER DISK NUMBER I N 3EG CL.<br />
I<br />
SDSK: MOV. AL19 ; BIOS FUNCTION NO.<br />
JMP DCBIOS<br />
; * SETTRACK *<br />
. *****************<br />
8<br />
; ENTER TRACK NUMBER IN 3EG CL.<br />
I<br />
STRK: MOV<br />
JMP<br />
AL,lB ; 319s FUNC #<br />
DCBIOS
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
; ******************<br />
; * SET SECTOR *<br />
. ******************<br />
I<br />
SSEC: MOV<br />
JMP<br />
. ......................<br />
; * SET DMA OFFSET *<br />
. ......................<br />
AL,11 ; BIOS FUNC. I<br />
DCBIOS<br />
I<br />
; ENTER DMA OFFSET IN REG CX<br />
I<br />
SDMAO: MOV AL,12 ; BIOS FUNC. #<br />
JMP DCBIOS<br />
. .......................<br />
; * SET DMA SEGMENT *<br />
. .......................<br />
I<br />
; ENTER DMA SEGMENT IN REG CX<br />
I<br />
SDMAS: MOV AL,17 ; BIOS FUNC. C<br />
JMP DCBIOS<br />
; .........................<br />
; * GET (READ) SECTOR *<br />
. .........................<br />
I<br />
; EXITS WITH STATUS IN REG AL<br />
I<br />
GSEC: MOV AL,13 ; BIOS FUNC. #<br />
JMP DCBIOS<br />
; ..........................<br />
; * PUT (WRITE) SECTOR *<br />
; ..........................<br />
;<br />
; EXITS WITH STATUS IN REG AL<br />
I<br />
PSEC: MOV AL,14 ; BIOS FUNC. #<br />
JMP DCBIOS<br />
........................................<br />
I I<br />
I END OF CP/M-86 1/0 INTFRFACE 8<br />
PAGE 97
ASM86 VER i . O SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
TICK<br />
EJECT<br />
. *************r<br />
; * FORGET *<br />
. **************<br />
FORG<br />
0C 1H<br />
0A7H<br />
ARROW-6<br />
DOCOL<br />
DF IND<br />
ZEQU<br />
ZERO<br />
QE RR<br />
DROP<br />
LITER<br />
SEMIS<br />
86H<br />
' FORGE '<br />
'T1+9aH<br />
TICK-4<br />
DOCOL<br />
CL??.R<br />
AT<br />
COXT<br />
.4 T<br />
SL'38<br />
LIT, 1SH<br />
QEiiR<br />
TICK<br />
DUP<br />
FENCE<br />
AT<br />
LESS<br />
LIT, 15H<br />
QE RR<br />
DUP<br />
NFA<br />
DP<br />
STORE<br />
LF A<br />
AT<br />
CONT<br />
AT<br />
STORE<br />
SEMIS<br />
PAGE 99
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
; * BACK *<br />
; ************<br />
BACK<br />
; * BEGIN *<br />
f *************<br />
. *************<br />
BEGIN<br />
; * ENDIF * . *************<br />
84H<br />
'BAC '<br />
'Kf+80H<br />
FORG-9<br />
DOCOL<br />
HERE<br />
SUBB<br />
COMMA<br />
SEMIS<br />
0C 5H<br />
'BEG1 '<br />
'Nt+80H<br />
BACK-7<br />
DOCOL<br />
QCOMP<br />
HERE<br />
ONE<br />
SEMIS<br />
0C 58<br />
'END1 '<br />
'F1+80H<br />
BEGIN-8<br />
DOCOL<br />
QC OM P<br />
TWO<br />
QPA I R<br />
HERE<br />
OVER<br />
SUBB<br />
SWAP<br />
STORE<br />
SEMIS<br />
PAGE 99
EJECT<br />
; * THEN *<br />
. ************<br />
THEN<br />
. ************<br />
; * LOOP *<br />
. ************<br />
DS<br />
DB<br />
DB<br />
DW<br />
LOOPC DLi<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
Fig <strong>Forth</strong> <strong>8086</strong>/68 Ver 1.0<br />
OC 4H<br />
'THE'<br />
'N1+86Y<br />
ENDIFF-8<br />
DOCOL<br />
ENDIFF<br />
SEMIS<br />
0C 2H<br />
'9'<br />
'i)'+80H<br />
THE?i-7<br />
DCCOL<br />
COMP<br />
XDO<br />
HERE<br />
THREE<br />
SEMIS<br />
0C 4H<br />
' LOO '<br />
'Pt+8C!H<br />
DO-5<br />
DOCOL<br />
THREE<br />
QPAIR<br />
COM P<br />
XLOOP<br />
BACK<br />
SEMIS
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
PLOOP<br />
EJECT<br />
; *************<br />
; * UNTIL *<br />
. *************<br />
UNTIL<br />
; * END * . ***********<br />
ENDD<br />
0C 5H<br />
'+LOO1<br />
'P '+80H<br />
LOOPC-7<br />
DOCOL<br />
THREE<br />
QPAIR<br />
COMP<br />
XPLOO<br />
BACK<br />
SEMIS<br />
0C 5H<br />
'UNTI '<br />
'L1+80H<br />
PLOOP-8<br />
DOCOL<br />
ONE<br />
QPAIR<br />
COMP<br />
Z B RAN<br />
BACK<br />
SEMIS<br />
0C 3H<br />
'EN'<br />
'D1+80H<br />
UNTIL-8<br />
DOCOL<br />
UNTIL<br />
SENIS<br />
PAGE 101
SOURCE: FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
; *************<br />
; * AGAIN *<br />
. ****ti*******<br />
AGAIN<br />
. **************<br />
I<br />
; * REPEAT *<br />
. **************<br />
REPEA<br />
IFF<br />
0C5A<br />
'AGAI '<br />
'N '+80i-l<br />
ENDD-6<br />
DOCOL<br />
ONE<br />
QPAIR<br />
COMP<br />
BRAN<br />
BACK<br />
SEMIS<br />
aC 6H<br />
'REPEA'<br />
'T1+60H<br />
AGAIN-8<br />
DOCOL<br />
TOR<br />
TGR<br />
AGAIN<br />
FRGMX<br />
FRZMR<br />
TL. 0<br />
sma<br />
ENDIFF<br />
SEMIS<br />
0C 2H<br />
'I'<br />
'F8+80E<br />
RETEA-9<br />
DOCOL<br />
COM?<br />
Z BRAN<br />
HERE<br />
ZERO<br />
COMMA<br />
Ti0<br />
SEMIS<br />
PAGE 182
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
; ************<br />
; * ELSE *<br />
; ************<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
ELSEE DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
. *************<br />
; * WHILE *<br />
. *************<br />
DS<br />
DB<br />
DB<br />
DW<br />
WHILE DW<br />
DW<br />
DW<br />
DW<br />
0C 4H<br />
'ELS '<br />
'E8+80H<br />
IFF-5<br />
DOCOL<br />
Td 0<br />
QPAIR<br />
COMP<br />
BRAN<br />
HERE<br />
ZERO<br />
COMMA<br />
SWAP<br />
TWO<br />
ENDIFF<br />
TWO<br />
SEMIS<br />
0C 5H<br />
'WHIL'<br />
'E1+80H<br />
ELSEE-7<br />
DOCOL<br />
IFF<br />
mop<br />
SEMIS<br />
PAGE 1C1Z
SOURCE: FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. **************<br />
; * SPACES *<br />
. **************<br />
SPACS<br />
BDIGS<br />
ECIGS<br />
86H<br />
'SPACE '<br />
'Sr+80H<br />
WHILE-8<br />
DOCOL<br />
ZERO<br />
MAX<br />
DDUP<br />
ZBRAN ; IF<br />
OFFSET SPAXI-$<br />
ZERO<br />
XD 0 ; DO<br />
SPACE<br />
XLOGP ; LOOP ENCIF<br />
OFFSET SPAX2-$<br />
SEMIS<br />
8 2H<br />
'
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
. ************<br />
; * SIGN *<br />
. ************<br />
I<br />
I<br />
DB<br />
DB<br />
DB<br />
DW<br />
SIGN DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
Di4<br />
DW<br />
SIGN1 DW<br />
DIG<br />
;<br />
DB<br />
DB<br />
DB<br />
DW<br />
DIGS DW<br />
DIGS1 DW<br />
DW<br />
DW<br />
DW<br />
84H<br />
'SIG'<br />
'N1+80H<br />
EDIGS-5<br />
DOCOL<br />
ROT<br />
ZLESS<br />
ZBRAN ; I F<br />
OFFSET SIGN1-$<br />
LIT, 2DH<br />
HOLD ; ENDIF<br />
SEMIS<br />
81H<br />
'#'+80H<br />
SIGN-7<br />
DOCOL<br />
BASE<br />
AT<br />
MSMOD<br />
ROT<br />
LIT, 9<br />
OVER<br />
LESS<br />
ZBRAN ; I F<br />
OFFSET DIG1-$<br />
LIT, 7<br />
PLUS ; EYLIF<br />
LIT, 30H<br />
PLUS<br />
HOLD<br />
SEMIS<br />
8 2H<br />
'#I<br />
'S '+80H<br />
DIG-4<br />
DOCOL<br />
DIG<br />
OVER<br />
OVER<br />
ORR<br />
; BEGIN<br />
PAGE 185
ASYE6 :JE? 1.8 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
DDOTR<br />
DOTR<br />
ZEQU<br />
ZBMN ; UNTIL<br />
OFFSET DIGS1-$<br />
SEMIS<br />
83H<br />
'D. '<br />
'R1+809<br />
DIGS-5<br />
DOCOL<br />
TOR<br />
SWAP<br />
OVER<br />
DASS<br />
BDIGS<br />
DIGS<br />
SIGN<br />
EDIGS<br />
FROMR<br />
SVE R<br />
SL'SB<br />
SPACS<br />
TYPES<br />
SEYIS<br />
DDOTR-6<br />
DOCOL<br />
TOR<br />
STOD<br />
FROM R<br />
DDOTR<br />
SEMIS<br />
PAGE 1ZF
ASM86 VER 1.0 SOURCE: FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
DDOT<br />
DGT<br />
QUES<br />
UDOT<br />
EJECT<br />
8 2H<br />
'D '<br />
' . '+80H<br />
DOTR-5<br />
DOCOL<br />
ZERO<br />
DDOTR<br />
SPACE<br />
SEMIS<br />
8 1 H<br />
I. '+80H<br />
DDOT-5<br />
DOCOL<br />
STOD<br />
DDOT<br />
SEMIS<br />
81H<br />
'?'+80H<br />
DOT-4<br />
DOCOL<br />
AT<br />
DOT<br />
SEMIS<br />
8 2H<br />
'U'<br />
' . '+80H<br />
QUES-4<br />
DOCOL<br />
ZERO<br />
DDOT<br />
SEMIS<br />
PAGE 107
AS286 VER 1.0 SOURCE: FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 1Q9<br />
EJECT<br />
***it********<br />
; * VLIST *<br />
. *************<br />
I<br />
DB<br />
DB<br />
85H<br />
'VLIS '<br />
VLIST<br />
DB<br />
DW<br />
DW<br />
'T1+80H<br />
UDOT-5<br />
DOCOL<br />
VLISl<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
LIT, 80H<br />
OUTT<br />
STORE<br />
CONT<br />
AT<br />
AT<br />
OUTT ; BEGIN<br />
AT<br />
CSLL<br />
GREAT<br />
ZBRAN ; IF<br />
OFFSET VLIS2-$<br />
CR<br />
ZERO<br />
DW OUTT<br />
DW STORE<br />
VLIS2 DW DLJP<br />
DW IDDOT<br />
DW SPACE<br />
Did SPACE<br />
DW PFA<br />
Dbi LF A<br />
DK AT<br />
DW DUP<br />
DW ZEQU<br />
Did QTERM<br />
D W ORR<br />
; * BYE *<br />
. ***********<br />
; ENDIF<br />
DW ZBRAN ; UNTIL<br />
DW OFFSET VLISI-$<br />
DW DROP<br />
DW SEMIS<br />
I<br />
; EXIT TO CP/M OR YOUR MONITOR<br />
,<br />
DB 8 3H ; 9YE<br />
D B 'BY'<br />
DB 'E1+80H<br />
BYE<br />
DW VLIST-8<br />
DW $+2<br />
JMP EXIT<br />
; BACK TO SYSTEM
ASM86 VER 1.0 SOURCE: FORTH. A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 109<br />
EJECT<br />
; * LIST *<br />
. ************<br />
DB<br />
DB<br />
DB<br />
DW<br />
LISTC DW<br />
DW<br />
DW<br />
DW<br />
DB<br />
. *************<br />
; * INDEX *<br />
. *************<br />
I<br />
D B<br />
DB<br />
DB<br />
DW<br />
INDEX DW<br />
Did<br />
DW<br />
DW<br />
DW<br />
INDEl DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
INDE2 DW<br />
DW<br />
DW<br />
84H<br />
'LIS'<br />
'T1+80H<br />
BYE-6<br />
DOCOL, DECA<br />
CR, DUP<br />
SCR, STORE<br />
PDOTQ<br />
6,'SCR # '<br />
DOT<br />
LIT, 10H<br />
ZERO, XDO<br />
CR, ID0<br />
LIT, 3<br />
DOTR, SPACE<br />
IDO, SCR<br />
AT, DLINE<br />
QTERM<br />
ZBRAN<br />
OFFSET LIST2-$<br />
LEAVE<br />
XLOOP<br />
OFFSET LIST1-$<br />
CR, SEMIS<br />
85H<br />
' INDE '<br />
'X1+80H<br />
LISTC-7<br />
DOCOL<br />
LIT, FF<br />
EMIT, CR<br />
ONEP, SWAP<br />
XDO<br />
CR, ID0<br />
LIT, 3<br />
DOTR, SPACE<br />
ZERO, ID0<br />
DLINE I QTERM<br />
ZBRAN<br />
OFFSET INDE2-$<br />
LEAVE<br />
XLOOP<br />
OFFSET INDE1-$<br />
SEMIS<br />
; IF<br />
; LEAVE<br />
; ENDIF
ASM86 VEX 1.0 SOURCE: FORTH.A86<br />
EJECT<br />
. *************<br />
I<br />
; * TRIAD *<br />
. *************<br />
1<br />
DB<br />
DB<br />
DB<br />
DW<br />
TRIAD DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
D W<br />
TRIA1 DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
DW<br />
TRIA2 DW<br />
DW<br />
DW<br />
Dw<br />
DTv'<br />
DW<br />
I<br />
; PRINT CPU TYPE (<strong>8086</strong>)<br />
I<br />
Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
DB 84ii<br />
DB '.CP1<br />
DB 'U1+8BH<br />
DW TRIAD-8<br />
DOTCPL' DW DOCOL<br />
DW BASE,AT<br />
DW LIT, 36<br />
DW BASE, STORE<br />
DW LIT, 22H<br />
DW PORIG,TAT<br />
DW DDOT<br />
DW SASE,STORE<br />
DW SEMIS<br />
85H<br />
' TRIA '<br />
'D8+80H<br />
INDEX-8<br />
DOCOL<br />
LIT, FF<br />
EM I T<br />
LIT, 3<br />
SLASH<br />
LIT, 3<br />
STAR<br />
LIT, 3<br />
OVER, PLUS<br />
SWAP , XDO<br />
CR, ID0<br />
LISTC<br />
QTERM ; ?TERMINAL<br />
ZBRAN<br />
CFFSET TRIA2-$ ; I F<br />
LEAVE ; LEAVE<br />
XLOOP ; ENDIF<br />
OFFSET TRIA1-$<br />
CR<br />
LIT,15<br />
MESS, CR<br />
SEMIS<br />
PAGE 110
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0 PAGE 111<br />
EJECT<br />
. .........................................<br />
. * *<br />
. * CODE LEVEL "MATCH" DEFINITION *<br />
. * *<br />
. .........................................<br />
,<br />
; STACK PARAMETERS:<br />
I<br />
I --- flag new:cursor:offset)<br />
; ( cursor:addr byte:left str:addr str:len<br />
I<br />
; T his version of MATCH will handle string length<br />
S<br />
; up to 65335 bytes in length.<br />
I<br />
MATCH<br />
DB 85H ; MATCH<br />
DB ' MATC<br />
DB 'Ht+80H<br />
DW DOTCPU-7<br />
DW $+2<br />
MOV D1,SI ; SAVE IP<br />
POP CX ; STRING COUNT<br />
POP BX ; STRING ADDR<br />
POP DX ; BYTES LEFT TO SEARCH<br />
POP SI ; CURSOR ADDR<br />
PUSH S I ; SAVE COPY<br />
LODS<br />
CMP<br />
JNZ<br />
PUSH<br />
PUSH<br />
PUSH<br />
AL ; GET FIRST BYTE<br />
AL, [BX] ; MATCB?<br />
MAT3 ; NO<br />
BX ; SAVE STRING ADDR<br />
CX ; & STRING COUNT<br />
SI ; & CURSOR ADDR<br />
; TRY TO MATCH REMAINNING CHARACTERS IN STRING<br />
DEC<br />
J Z<br />
DEC<br />
J Z<br />
I NC<br />
LODS<br />
CMP<br />
J Z<br />
CX I<br />
MATCHOK ;<br />
DX I<br />
NOMATCH ;<br />
BX I<br />
AL a<br />
ALr [BXI ;<br />
MAT2 I<br />
STR COUNT -1<br />
EXIT ... MATCH FOUND<br />
BYTES LEFT -1<br />
EXIT. . .NO MATCH<br />
NEXT STR CHAR ADDR<br />
GET NEXT BYTE<br />
MATCH?<br />
YES, GET MORE
.ASu:?6 VEX l.d SOURCE: FORTH.Aa6 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.Q<br />
EJECT<br />
; NO MATCH YET.<br />
POP S I<br />
POP CX<br />
POP BX<br />
DEC DX<br />
JNZ MAT1<br />
JMP MAT 4<br />
MATC HOK :<br />
NOMATCH:<br />
POP<br />
POP<br />
POP<br />
; RESTORE PGINTERS<br />
; BYTE LEFT COUNT -1<br />
; START OVER<br />
; EXIT.. .NO MATCH<br />
; ADJUST STACK<br />
; FOR EXIT.. .<br />
; EXIT HERE: DX = TRUE/FALSE FLAG (0-NO XATCH)<br />
I<br />
MAT4: MOV AXIS1 ; NEk CUaSOR ADDR<br />
POP S I ; GET STARTING ADDR<br />
SUB AXIS1 ; COMPUTE CURSaR OFFSET<br />
MOV SIIDI ; GET BACK IP<br />
JMP DPUSH ; BYS...BYE<br />
PAGE 112
ASM86 VER 1.0 SOURCE: FORTH.A86 Fig <strong>Forth</strong> <strong>8086</strong>/88 Ver 1.0<br />
EJECT<br />
- ................................<br />
- * *<br />
. LAST DICTIONARY WORD 2;<br />
. * *<br />
. * "TASK" *<br />
. * *<br />
. ................................<br />
DB<br />
DB<br />
DB<br />
DW<br />
TASK DW<br />
DW<br />
I<br />
INITDP EQU<br />
84H<br />
'TAS '<br />
'K8+80H<br />
MATCH-8<br />
DOCOL<br />
SEMIS<br />
; TASK<br />
; SHOW END OF DICT.<br />
; THE REMAINNING MEMORY (UP TO 'EM') IS<br />
; USED FOR:<br />
I<br />
I 1. EXTENSION DICTIOKARY<br />
I 2. PARAMETER STACK<br />
I 3. TERMINAL INPUT BUFFER<br />
r 4. RETURN STACK<br />
I 5. USER VARIABLE AREA<br />
1 6. DISK BUFFERS<br />
I<br />
I<br />
; THE FOLLOWING ZERO BYTE IS NEEDED<br />
; I N CP/M-86 TO TELL THE 'GENCMD'<br />
; ROUTINE THE MAXIMUM AMOUNT OF<br />
; MEMORY NEEDED IN THIS PROGRAM.<br />
ORG<br />
DB<br />
END<br />
END OF ASSEMBLY. NUMBER OF ERRORS: 0<br />
EM-1 ; LAST MEMORY ADDR-I<br />
0 ; LAST LOCATION<br />
PAGE 113
Page 1 ---------- <strong>8086</strong> Fig-<strong>Forth</strong> Symbols ----------<br />
059D ZERO<br />
109E MSLAS<br />
06C2 STATE<br />
0EF9 FORTH<br />
13A0 SET10<br />
1480 SECWT<br />
05D4 FIRST<br />
0714 TWOP<br />
034C XORR<br />
0683 OUTT<br />
097F DECA<br />
l5DB BIOSPAR<br />
01AF XLOOP<br />
135D BLOC2<br />
082F LFA<br />
17DD DIG<br />
0BD9 PAD<br />
0B3 3 QUERY<br />
1243 DENSTY<br />
13CE SETDRV<br />
llE0 PTSTO<br />
01F1 ID0<br />
llC7 PTCSTO<br />
05EC BBUF<br />
0553 CON<br />
05BE 3LS<br />
027.4 ENCL<br />
1990 TRIA2<br />
03DA RR<br />
0E80 INTE4<br />
017A EXEC<br />
0CE0 DFIND<br />
0E9A INTE6<br />
0BC1 HOLD<br />
068D SCR<br />
016A LIT<br />
0AA4 DOTQl<br />
179F BDIGS<br />
OD47 ERR02<br />
0899 QERRl<br />
1449 TSCAL4<br />
07D4 SPACE<br />
1681 ENDIFF<br />
0B79 NULL2<br />
1798 SPAXl<br />
07FE TRAVl<br />
1792 SPAX2<br />
OD86 CREAT<br />
0 0 0 0 VARIABLES<br />
0634 WIDTH<br />
1126 MSMOD<br />
06F4 RNUM<br />
OF32 QUIT<br />
03E1 ZEQU<br />
1083 MSTAR<br />
0A6B PDOTQ<br />
083F CFA<br />
04ED CSTOR<br />
0795 ULESS<br />
1021 PM1<br />
03F4 ZLESS<br />
01D3 XPLOO<br />
1597 EPRINT<br />
1377 BLOC3<br />
02DF CR<br />
1064 MINl<br />
103B ABS<br />
0388 RPSTO<br />
180A DIGS1<br />
012A BIP<br />
04FB TSTOR<br />
07ED DDUPl<br />
0628 TIB<br />
06D7 DPL<br />
064E FENCE<br />
05.45 ONE<br />
0189 BRAN<br />
0723 HERE<br />
1058 MIX<br />
0679 INN<br />
0EA0 INTE5<br />
OF11 DEFIN<br />
0E9E INTEJ<br />
OAF3 EXPEG<br />
02C4 KEY<br />
OAF7 EXPE7<br />
05F8 BSCR<br />
llAl MESS2<br />
09D3 DOES<br />
14EE FLUS1<br />
089B QERR2<br />
17AE EDIGS<br />
0C00 WORD1<br />
18FE LIST1<br />
0B81 NULL3<br />
191A LIST2<br />
169C THEN<br />
08A5 QCOMP<br />
039A SEMIS<br />
0C3D PNUM3<br />
0164 DP0<br />
17F9 DIG1<br />
12C2 DRZER<br />
1494 RSLW<br />
0DlA ERROR<br />
1254 DSKERR<br />
0D9C CREAl<br />
0304 USTAR<br />
138F BLOC1<br />
061E RZERO<br />
188B VLIST<br />
16A7 DO<br />
0434 AT<br />
1327 BUFF2<br />
032F ANDD<br />
0495 PSTOR<br />
0368 SPSTO<br />
06CD BASE<br />
0A40 DTRAl<br />
gA5E DTRA3<br />
09B5 SEMI1<br />
1501 LOAD<br />
0E64 INTEl<br />
0E86 INTE2<br />
0AC1 EXPEl<br />
0934 LBRAC<br />
10F3 MODD<br />
0969 HEX<br />
12E8 DRON2<br />
106E MAX<br />
OF87 WRMl<br />
0BB2 BLANK<br />
0479 DUP<br />
OD28 ERR01<br />
07AB ULESl<br />
1443 TSCAL3<br />
0EC9 VOCAB<br />
1607 TICK<br />
0B7D NULL1<br />
03AC LEAVE<br />
1210 USE<br />
19CD MATCH<br />
0C04 WORD2<br />
02B2 EMIT<br />
189B VLISl<br />
0957 SMtlDG<br />
0606 PORIG<br />
0E62 INTER<br />
0406 PLUS<br />
03CC FROMR<br />
0313 USLAS<br />
02D5 QTERM<br />
1425 TSCALS<br />
1533 ARROW<br />
16E6 UNTIL<br />
0BEC WORDS<br />
165D BACK<br />
OD00 DFINl<br />
1954 INDE2<br />
0657 DP<br />
084D NFA<br />
1738 IFF<br />
0863 PFA<br />
04C1 CAT<br />
0670 BLK<br />
llFA SEC<br />
0A5A DTRA2<br />
BE27 DLITl<br />
0E0A LITEl<br />
1708 AGAIN<br />
1029 DPY<br />
0FB8 COLD<br />
0CA6 NUMB1<br />
0AFB EXPi2<br />
12E4 DRZPZ1<br />
0B21 EXPE3<br />
166F BEGIN<br />
0B15 EXPE5<br />
1808 DIGS<br />
12F7 BUFFE<br />
04D0 TAT<br />
llA5 MESS1<br />
0942 RBRAC<br />
01E0 XDO<br />
1lB0 MESS3<br />
1854 DDOT<br />
@EBB IMMED<br />
073F COMMA<br />
125F PBUF<br />
052F SEMI<br />
1620 FORG<br />
0750 CCOMM<br />
09C3 BUILD<br />
LITER<br />
OFSET<br />
FLUSH<br />
CLDl<br />
SSMOD<br />
DPLUS<br />
COUNT<br />
PLOOP<br />
MINUS<br />
STORE<br />
DOTCPU<br />
INDEl<br />
DPMl<br />
SZERO<br />
BUFF1<br />
TYPES<br />
FLD<br />
MAX1<br />
HLD<br />
DABS<br />
ENDD<br />
PM<br />
PBUFl<br />
BI PE<br />
BYE<br />
TRIAl<br />
SIGN1<br />
INTE3<br />
NUMB2<br />
UP<br />
NUMB3<br />
EXPE 4<br />
FILL<br />
DOT<br />
TSCALl<br />
VAR<br />
TSCAL2<br />
DOTQ2<br />
ULES 2<br />
BLOCK<br />
SUBB<br />
DLINE<br />
DDUP<br />
REPEA<br />
CSLL<br />
ELSEE<br />
COMP<br />
VLIS2
Jl32 OFtIG<br />
J,f 33 'SL'."ll<br />
J-37 ONE?<br />
2-ZJ GREAT<br />
a666 VCICL<br />
8C4F IDCOT<br />
37C3 ROT<br />
1206 TLACK<br />
0779 LESS<br />
0642 WARN<br />
117F MESS<br />
0995 PSCOD<br />
02EC CMOVE<br />
lir'3 DRIVE<br />
d46C SXAP<br />
---------- 5086 Fig-<strong>Forth</strong> Symbols<br />
0201 DIGIT<br />
0DDE BCOM?<br />
0c7a PNUM?<br />
0A28 TY?El<br />
06A8 CONT<br />
0F3C QUIT1<br />
0A2A TYPE3<br />
06EB CSPP<br />
08E7 QCSP<br />
076D EQUAL<br />
12D2 DRONE<br />
llD4 PTAT<br />
0SAD Ti0<br />
1235 NOBUF<br />
05BC COLON<br />
0450 OVER<br />
llB8 PTCAT<br />
a487 TDUP<br />
1 6 a ~ LOOPC<br />
0582 USER<br />
14C2 RSLW3<br />
a ~ 3 2 QSTAC<br />
033A DMIKU<br />
1213 PREV<br />
1962 QUES<br />
laDF LISTC<br />
............... 0080 NUMBERS<br />
0588 DOGS5<br />
3321 DZERO<br />
i5S3 POVT<br />
a213 DIGII<br />
1936 MAT1<br />
d2AO ENCL3<br />
19F6 MAT4<br />
d25A EFIN5<br />
156D PKEYl<br />
B15F NEXT1<br />
15EF SDMAG<br />
155D PKEY<br />
015C NEXT<br />
0FA4 SPDRV2<br />
0020 ABL<br />
001a DLE<br />
002E ADOT<br />
0088 NBUF<br />
e04D TRKS2<br />
0155 APUSR<br />
15E5 STRK<br />
lA03 INITDP<br />
0220 DIG12<br />
018B BRAN1<br />
0785 LESl<br />
15B5 CHO<br />
15F9 GSEC<br />
09DF DODOE<br />
a520 DOCOL<br />
15E0 SDSK<br />
1596 POUT1<br />
15A9 CSTAT<br />
022E ?FIND<br />
1466 SECRD<br />
0C88 NTJYB<br />
0C75 PNUM3<br />
0A1A TYPE2<br />
1962 TRIAD<br />
0AB7 EXPEC<br />
08BD QEXEC<br />
OF90 WARM<br />
0A84 DOTQ<br />
192A INDEX<br />
14AE RSLWl<br />
088B QERR<br />
13E5 TSCALC<br />
0B42 NULL<br />
0544 NOOP<br />
1229 SPBLK<br />
04A7 TOGGL<br />
1820 DDOTR<br />
05E0 LIMIT<br />
0904 QLOAD<br />
17C7 SIGN<br />
0E17 DLITE<br />
1114 SSLA<br />
0A38 DTRAI<br />
03BC TOR<br />
0BA1 ERAS55<br />
OF21 PAiiEN<br />
035B SPAT<br />
0Z5F ABORT<br />
081F LATES<br />
1771 WHILE<br />
1095 ST3D<br />
14CQ RSLK2<br />
DEE9 DOVOC<br />
0626 CC'R~<br />
1878 UEOT<br />
07FA TRAV<br />
1288 L'PXT<br />
10D3 SL:.!.i3D<br />
0000 FIGREV 003C F'F<br />
0002 MXDRV 000A LF<br />
OOOD ACR 0007 BELL<br />
0040 US 001.4 SPTl<br />
005F BSIY 0543 TRKSl<br />
3300 I!JITSB 0031 r'I13iiEL<br />
03FF ZLESSl<br />
a153 TNEXT2<br />
19F3 NOMATCH<br />
a12E TNEXT<br />
0296 ENCL2<br />
19ED MAT3<br />
15BF LO<br />
0264 PFIN6<br />
l00F STODl<br />
a134 XLOOl<br />
03EC ZEQUl<br />
15A2 EXIT<br />
TNEXTl<br />
TNEXT3<br />
PCf ziz<br />
E?IC L 1<br />
BCGSFS'LU'C<br />
ENCL4<br />
?FIN1<br />
BXEAK<br />
PS EC<br />
DOCON<br />
WRM<br />
DOVAX<br />
09AB SZYIC<br />
0i28 iiP1<br />
033D OR2<br />
1Aa7 TASK<br />
0D0C PAEGR<br />
045F DROP<br />
OF53 QUIT2<br />
037B RPAT<br />
0535 THREE<br />
1145 PLINE<br />
a878 SCSP<br />
1333 DOTR<br />
lac4 STAR<br />
1782 SPACS<br />
laE3 SLASH<br />
0733 ALLGT<br />
019A ZBRAN<br />
O8C4 GPAIR<br />
12AE XTBUF<br />
1572 PEMIT<br />
BSGUT<br />
4003 E!4<br />
eG80 BPS<br />
0034 SPT2<br />
3D8l NSCR<br />
2013 x ~ s<br />
015A 3PESH<br />
19F3 MATCBOK<br />
15AF' CI<br />
dF96 CLD<br />
19DE MAT2<br />
d78D LES2<br />
a242 PFIN2<br />
1573 PCR<br />
15EA SSEC<br />
15C9 DCBIOS<br />
15F4 SDNAS<br />
1558 PQTEiil
Fig-<strong>Forth</strong> <strong>8086</strong>/88 Version 1.0 Notes Page 1<br />
Fig-<strong>Forth</strong> for the <strong>8086</strong>/88<br />
Version 1.0<br />
Thomas Newman<br />
This document will briefly describe <strong>Forth</strong>-86 and how it differs<br />
from the Fig model. It is assumed that the reader is familiar<br />
with the <strong>8086</strong>/88 CPU and Fig <strong>Forth</strong>'s installation manual.<br />
This version of <strong>8086</strong> <strong>Forth</strong> was derived from 8080 Fig <strong>Forth</strong><br />
(version 1.1). The extra registers and extended addressing modes<br />
of the <strong>8086</strong> were used to optimize the code portion of <strong>Forth</strong>-86<br />
(refer to the source listing for <strong>8086</strong> register usage).<br />
IMPLEMENTATION<br />
--------------<br />
<strong>Forth</strong> was implemented and tested on an <strong>8088</strong> CPU running Digital<br />
Research's CP/M-86 (version 1.0).<br />
All console, printer and disk drivers call tneir res?ected<br />
routines in the "BIOS" through the "BDOS" function #50. These<br />
calls are all located in a common program area and can be easily<br />
modified to call your own 1/0 routines (if your're not using<br />
CP/M) .<br />
The following are notes about loading and executing <strong>Forth</strong>:<br />
o The source program was assembled using CP/M's ASM86. The<br />
mnemonics should be compatible with Intel's assembler<br />
(except for the far CALLS and JMPs which are not used in<br />
this version of forth).<br />
o The forth program can be loaded into any free portion of<br />
memory that is large enough to hold the forth kernel,<br />
dictionary and buffers (from "ORIG" thru "EM").<br />
o The program is executed at the offset address 10B hex with<br />
the Code Segment (CS) equal to the base address (this is the<br />
way CP/M executes "CND" type files).<br />
o The "COLD" entry routine in forth will set all other segment<br />
registers to the value of the CS register. This version of<br />
forth assumes all data, code and stack offset addresses are
- -<br />
in the current code segment. This limits forth's asaresain;<br />
range to 64k bytes (this snould be c5an2ed in f;:t-ir?<br />
versions).<br />
FORTH'S YEM04Y YAP<br />
------------------<br />
Uses the standari Fig-<strong>Forth</strong> memory ma? described In &hr- C .I =<br />
inscallation manual.<br />
MODIFIED FORTH WORDS<br />
....................<br />
Saxe as tne flg model except retdrns a -1 for ootn t-3 ~~ati??'<br />
and renalnder (u2 and u3) when tnl a~vlszr is ztr3 (23:).<br />
3 rdn-cine portion of thrs word "!L25FIu was xod:f;?d ta<br />
conforin to <strong>Forth</strong>-79 standarcis wn?n dealing wltn an "ird5ex" tazt<br />
T'<br />
1s less than zero (nqatlve). n 1 1 3~22 k~nen t:e<br />
"iildsx" 1s less than tne "ilaltl' (tne flq ma551 will st=? wnen<br />
less than or equal to).<br />
ENCLOSE ( addri c --- a2irl n l n2 23 !<br />
Yo2ified to ret2rn 16-bi: offset valxes fcr nl, ?r,~ ~ j . TX L<br />
Fig model only returns 5-bit offsets wnizh cozld I:-i: the r2rLcjl<br />
of wor3 searches in blocks larger than 256 Syzss.<br />
ADCED FORTH WORDS<br />
-----------------<br />
-1 - -<br />
These are words that are not found In tne Fig-?art2 model<br />
of these words are In ad80 <strong>Forth</strong> 1.1).<br />
- .. ,<br />
(some<br />
Leaves a true flag if "ul" is less tnan "32"; ather.+ils~ leaves a<br />
false flag. (Thls is an unsigned cornparlsan,.<br />
I?? ( portt --- n 1<br />
Fetches (inputs) a 16-bit value "n" from che i/O port.
Fig-<strong>Forth</strong> <strong>8086</strong>/88 Version 1.0 Notes<br />
P! ( n port# --- 1<br />
Stores (outputs) a 16-bit number "n" at the 1/0 port.<br />
PC @ ( port# --- C 1<br />
Fetches (inputs) an 8-bit value "c" from tne 1/0 port.<br />
PC! ( c port# --- .I<br />
Stores (outputs) an 8-bit number "c" at the 1/0 port.<br />
DRIVE ( --- addr )<br />
A variable that contains the current disk drive number.<br />
SEC ( --- addr )<br />
A variable that contains the current sector number.<br />
TRACK ( --- adds )<br />
A variable that contains the current track number.<br />
Page 3<br />
A constant that returns the number of disk buffers in the currznt<br />
For tn system.<br />
DENSITY<br />
( --- addr )<br />
A variable that contains the current disk density. Zero = single<br />
density (26 sectors/track). Non-zero = double density (52<br />
sectors/track). Sector size is 128 bytes in both densities.<br />
In CP/M the "BIOS" program must be modified<br />
to handle double density formats.<br />
DISK-ERROR ( --- addr )<br />
A variable that contains disk error status (non-zero indicates a<br />
disk error). The disk status is saved after each sector<br />
read/write but error trappi~g has not been im~lemented (the error<br />
status could be tested in "R/WH).
? -Fortn 8386/3S Version 1.8 Notes<br />
Sets up the disk controller with Sector number, Track number and<br />
DMA address.<br />
SET-DRIVE ( --- 1<br />
Sends the disk controller the new disk drive number.<br />
Calculates: Drive, Track and Sector values from 3 sector<br />
displacement number "n" . The results are stored in the<br />
appropriate variables.<br />
The basic sector read routine (assumes SET-I9 and SET-DRIVE have<br />
been executed). Called from "R/wW.<br />
The basic sector write routine (assazes SET-IC! and SET-DEIVS have<br />
been execut2d). Called fron "i?/Wn.<br />
Exits <strong>Forth</strong> and returns to CP/M.<br />
(Change Sack to your CP/X boo= d l s ~ Sefars tyslnq ck1s word. )<br />
Prints the type of CPU (<strong>8086</strong>) on the console. This routine is<br />
called from "CCLD". The CPU type is coded as 32-bits in base 36<br />
and is located at "ORIGIN" + 22 hex.<br />
MATCH ( cursor:addr bytes:left str:lsngth<br />
--- flag new:cursor:offset )<br />
This word is used by the Fig-<strong>Forth</strong> editor for finding and<br />
deleting text within <strong>Forth</strong> source blocks. The word has been<br />
included to ease the implementation of the <strong>Forth</strong> model editor.