22.10.2013 Views

8086-8088 V10 - Forth Interest Group

8086-8088 V10 - Forth Interest Group

8086-8088 V10 - Forth Interest Group

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!