IMD 1.17: 5/01/2010 7:44:14 8086/88 fig-FORTH cp/m ver 1.0 2/82 model and source    FORTH A86 FORTH A86 !FORTH A86"#$%&'()*+,-./01FORTH A8623456789:;<=>?@A-------- ; ; All publications of the Forth Interest Group ; are public domain. They may be further ; distributed by the inc** *** ; *** Contains interface for *** ; *** CP/M-86 (version 1.0) *** ; *** *** ; *** FORTH A86)BCDEFGFORTH H86}HIJKLMNOPQRSTUVWFORTH CMDXYZ[\]^_`abcdefgFORTH CMDhlusion of this credit ; notice: ; ; This publication has been made available by the ; ; FORTH INTEREST GROUP ;  *** ; *** Implementation by *** ; *** Thomas Newman *** ; *** 27444 Berenda Wa P. O. BOX 1105 ; SAN CARLOS, CA 94070 ; ; ; ----------------------------------------------- ; ; Acknowledgements: y *** ; *** Hayward, Ca. 94544 *** ; *** *** ; *************************************** ; ; ; ;  TITLE 'Fig Forth 8086/88 Ver 1.0' PAGEWIDTH 75 PAGESIZE 66 ; *************************************** ; ***  ; John Cassady ; Kim Harris ; George Flammer ; Robt. D. Villwock EJECT ;-------------------------------------------NOTE: This version only supports one ; memory segment of the 8086 (64k bytes). ; ; ; --------------------------------------- *** ; *** FIG-FORTH for the 8086/88 *** ; *** *** ; *** Version 1.0 *** ; *** 2/18/81 *** ; * ---- ; ; RELEASE & VERSION NUMBERS ; FIGREL EQU 1 ; FIG RELEASE # FIGREV EQU 0 ; FIG REVISION # USRVER EQU 0 ; USER VERSIOE 32. ; DW 5H,0B326H ; "8086" UP DW INITR0 ; USER AREA POINTER RPP DW INITR0 ; RETURN STACK POINTER EJECT ;-------W BSIN ; BKSPACE CHARACTER DW INITR0 ; INIT (UP) ; <<<<<< FOLLOWING USED BY "COLD" WORD >>>>>>> ; ; MUST BE IN SAME ORD ; ; COMMENT CONVENTIONS: ; ------------------- ; ; = MEANS "IS EQUAL TO" ; <- MEANS ASSIGNMENT ; ; NAME = ADDRESS OF  ; DISK BUFFER +4 BYTES NBUF EQU NSCR*1024/KBBUF ; NO. OF BUFFERS BUF1 EQU EM-CO*NBUF ; FIRST DISK BUF INITR0 EQU BUF1-US ;  ; ; AX GENERAL REGISTER. ; JUMP TO 'APUSH' WILL PUSH ; CONTENTS ONTO THE PARAMETER ; STACK BEFORE EXECUTING 'NEXT'. ;N # ; ; ASCII CHARACTERS USED ; ABL EQU 20H ; SPACE ACR EQU 0DH ; CARRIAGE RETURN ADOT EQU 02EH ; PERIOD BELL EQU 07H ; (---------------------------------------- ; ; FORTH REGISTERS ; ; FORTH 8086 FORTH PRESERVATION RULES ; ----- ---- ---------ER AS USER VARIABLES ; DW INITS0 ; INIT (S0) DW INITR0 ; INIT (R0) DW INITS0 ; INIT (TIB) DW 32 ; INIT (WIDTH) DW 0 NAME ; (NAME) = CONTENTS AT NAME ; ((NAME)) = INDIRECT CONTENTS ; ; CFA = ADDRESS OF CODE FIELD ; LFA = ADDRESS OF LINK F(R0) INITS0 EQU INITR0-RTS ; (S0) EJECT ;----------------------------------------------- ; CSEG ORG 100H ORIG DB ; BX GENERAL PURPOSE REGISTER. ; ; CX GENERAL PURPOSE REGISTER. ; ; DI GENERAL PURPOSE REGISTER. ; ; CS SEGMENT REGIST^G) BSIN EQU 5FH ; INPUT DELETE CHAR BSOUT EQU 08H ; OUTPUT BACKSPACE (^H) DLE EQU 10H ; (^P) LF EQU 0AH ; LINE FEED FF EQU--------------- ; ; IP SI INTERPRETER POINTER. ; MUST BE PRESERVED ; ACROSS FORTH WORDS. ; ; W DX WORKING REGISTER. ; ; INIT (WARNING) DW INITDP ; INIT (FENCE) DW INITDP ; INIT (DP) DW FORTH+6 ; INIT (VOC-LINK) ; ; <<<<<< END DATA USEIELD ; NFA = ADDR OF NAME FIELD ; PFA = ADDR OF PARAMETER FIELD ; ; S1 = PARAMETER STACK: 1ST WORD ; S2 = PARAMETER STACK: 90H ; 'NOP' INSTRUCTION JMP CLD ; VECTOR TO COLD START NOP JMP WRM ; VECTOR TO WARM START ; DB FIGREL ; FIG RELEASE # ER. MUST BE ; PRESERVED ACROSS FORTH WORDS. ; ; DS " " " ; ; SS " " " ; ; ES TEMPORARY SEGMENT REGISTER ; ONLY US 0CH ; FORM FEED (^L) ; MEMORY ALLOCATION ; EM EQU 4000H ; END OF MEMORY + 1 NSCR EQU 1 ; NO. 1024 BYTE SCREENS KBBUF JUMP TO 'DPUSH' WILL ; PUSH CONTENTS ONTO THE ; PARAMETER STACK BEFORE ; EXECUTING 'APUSH'. ; ; SP SP PARAMETER STACK D BY "COLD" WORD >>>>> ; THE FOLLOWING IS THE CPU'S NAME (PRINTED DURING ; "COLD" START). ; ; THE NAME IS 32 BITS IN BAS 2ND WORD ; R1 = RETURN STACK: 1ST WORD ; R2 = RETURN STACK: 2ND WORD ; ; (ABOVE STACK POSITIONS VALID BEFORE ; AND AFT DB FIGREV ; FIG REVISION # DB USRVER ; USER VERSION # DB 0EH ; VERSION ATTRIBUTES DW TASK-7 ; TOP WORD IN FORTH VOC DED BY A FEW WORDS. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EJECT ;-----------------------------------------------  EQU 128 ; DATA BYTES PER DISK BUF US EQU 40H ; USER VARIABLES SPACE RTS EQU 0A0H ; RETURN STK & TERM BUFF. ; CO EQU KBBUF+4POINTER. ; MUST BE PRESERVED ; ACROSS FORTH WORDS. ; ; RP BP RETURN STACK. ; MUST BE PRESERVED ; ACROSS FORTH WORDS.  ER EXECUTION OF ANY WORD, NOT ; DURING.) ; ; LSB = LEAST SIGNIFICANT BIT ; MSB = MOST SIGNIFICANT BIT ; LB = LOW BYTE ; HADDRESS ; TNEXT1: POP AX ; RESTORE REG POPF ; ADD YOUR BREAKPOINT CALL HERE ; BREAK: JMPS TNEXT3 ; CONTINUE WITH PROGRADR EJECT ; *************** ; * 'TNEXT' * ; *************** ; ; THIS IS 'NEXT' WITH DEBUG SUPPORT... ; TNEXT: PUSHAL JMP APUSH ; TO TOP OF STACK ; *************** ; * EXECUTE * ; *************** ; DB 87H DB 'EXECUT' DB 'E' WANT TO STEP THROUGH. ; ; ; THE CONTENTS OF THE TWO VARIABLES 'BIPS' AND ; 'BIPE' ARE INTERPRETED AS FOLLOWS: ; ; BIP BIPRDS. ; NEXT: LODS AX ; AX<- (IP) MOV BX,AX ; ; ----------------------------------------- ; NEXT1: MOV DX,BX ; (W) <- (IPB = HIGH BYTE ; LW = LOW WORD ; HW = HIGH WORD EJECT ; ;----------------------------------------------- ; DEBUG SUPPORT M ; NO BREAKPOINT PAUSE, RESTORE REGISTERS ; TNEXT2: POP AX POPF TNEXT3: LODS AX ; AX <- (IP) MOV BX,AX JMPS NEXT1F ; SAVE REGS PUSH AX MOV AX,BIP ; BREAKPOINT START ADDR OR AX,AX ; ZERO? JZ TNEXT2 ; NO BREAKPOINT CMP AX,-1 JZ TN+80H DW LIT-6 EXEC DW $+2 POP BX ; GET CFA JMP NEXT1 ; EXECUTE NEXT ; ************** ; * BRANCH * ; **********E DEBUG-CONDITION ; ------------------------------- ; ; 0 X OFF ; -1 X TRACE ALL 'NEXT' CALLS. ; ADDR1 0 TRACE 'ADDR1' ONLY) INC DX ; (W) <- (W)+1 JMP WORD PTR [BX] ; TO 'CFA' EJECT ; ********************************************* ; ****** ; ; THIS ROUTINE WILL ALLOW YOU TO STEP THRU FORTH ; PROGRAMS EVERY TIME 'NEXT' IS EXECUTED. ; ; IN ORDER TO USE THE STEP FE EJECT ; ************* ; * * ; * NEXT * ; * * ; * DPUSH * ; * * ; * APUSH * EXT1 ; STEP ALL POINTS CMP AX,SI ; IN BREAKPOINT RANGE? JZ TNEXT1 ; STEP THIS LOCATION JA TNEXT2 ; NO MOV AX,BIPE ; BREA**** ; DB 86H ; BRANCH DB 'BRANC' DB 'H'+80H DW EXEC-0AH BRAN DW $+2 ; (IP) <- (IP) + ((IP)) BRAN1: ADD SI,[SI] JMP. ; ADDR1 ADDR2 TRACE 'ADDR1' TO 'ADDR1'. ; ; NOTE: THE ABOVE ADDRESSES CAN'T POINT ; TO A 'CODE FIELD ADDRESS'. ; 'X' =DICTIONARY WORDS START HERE ****** ; ********************************************* ; ; ; *********** ; * LIT * ; ***ATURE, YOU MUST DO ; THE FOLLOWING: ; ; 1. PATCH THE INSTRUCTION IN 'NEXT' ; WITH A JUMP TO 'TNEXT'. ; ; 2. PATCH YOUR  ; * * ; ************* ; ; DPUSH: PUSH DX APUSH: PUSH AX ; ; ----------------------------------------- ; ; PAKPOINT END ADDR OR AX,AX ; ZERO? JZ TNEXT2 ; ONLY ONE LOCATION CMP AX,SI ; IN RANGE STILL? JB TNEXT2 ; NO ; PAUSE ON  NEXT ; JUMP TO OFFSET ; *************** ; * 0BRANCH * ; *************** ; DB 87H DB '0BRANC' DB 'H'+80H DW  DON'T CARE VALUE. ; ; -------------------------------- ; ; BIP DW 0 ; BREAKPOINT START ADDR BIPE DW 0 ; BREAKPOINT END AD******** ; DP0 DB 83H DB 'LI' DB 'T'+80H DW 0 ; START OF DICTIONARY LIT DW$+2 ; (S1) <- ((IP)) LODS AX ; AX <- LITERBREAKPOINT ROUTINE AT ; 'BREAK' (USING 'DDT86' IN CP/M). ; ; 3. SET VARIABLES, 'BIP' & 'BIPE' TO THE ; ADDRESSES YOURTCH THE NEXT 3 LOCATIONS ; (USING A DEBUG MONITOR; I.E. DDT86) ; WITH 'JMP TNEXT' FOR TRACING THROUGH ; HIGH-LEVEL FORTH WO BRAN-9 ZBRAN DW $+2 POP AX ; GET STACK VALUE OR AX,AX ; ZERO? JZ BRAN1 ; YES, BRANCH INC SI ; NO, CONTINUE... INC SI NUMBER ERROR ; DIGI2: SUB AX,AX ; FALSE FLAG JMP APUSH ; BYE EJECT ; ************** ; * (FIND) * ; ************USH ; TO PARAMETER STACK ; ************* ; * DIGIT * ; ************* ; DB 85H DB 'DIGI' DB 'T'+80H DW IDO-4  OF DICT. (0)? JNZ PFIN1 ; NO, LOOK SOME MORE MOV AX,0 ; FALSE FLAG JMP APUSH ; DONE (NO MATCH FOUND) EJECT ; *******87H DB '(+LOOP' DB ')'+80H DW XLOOP-9 XPLOO DW $+2 POP BX ; GET LOOP VALUE JMP XLOO1 ;************ ;* (DO)  JNB PFIN2 ; MATCH SO FAR, LOOP ; FOUND END OF NAME (BIT-8 SET); A MATCH ADD BX,5 ; BX = PFA PUSH BX ; (S3) <- PFA MOV JMP NEXT ; ************** ; * (LOOP) * ; ************** ; DB 86H DB '(LOOP' DB ')'+80H DW ZBRAN-0AH XLOOP** ; DB 86H DB '(FIND' DB ')'+80H DW DIGIT-8 PFIND DW $+2 MOV AX,DS MOV ES,AX ; ES = DS POP BX ; NFA POP CX ;  DIGIT DW $+2 POP DX ; NUMBER BASE POP AX ; ASCII DIGIT SUB AL,'0' JB DIGI2 ; NUMBER ERROR CMP AL,9 JBE DIGI1 ; NUMB******** ; * ENCLOSE * ; *************** ; DB 87H DB 'ENCLOS' DB 'E'+80H DW PFIND-9 ENCL DW $+2 POP AX ; S1 - * ;************ ; DB 84H DB '(DO' DB ')'+80H DW XPLOO-0AH XDO DW $+2 POP DX ; INITIAL INDEX VALUE POP AX ; LIMIT  AX,1 ; TRUE VALUE SUB DH,DH ; CLEAR HIGH LENGTH JMP DPUSH ; NO NAME FIELD MATCH, TRY ANOTHER ; ; GET NEXT LINK FIELD A DW $+2 MOV BX,1 ; INCREMENT XLOO1: ADD [BP],BX ; INDEX=INDEX+INCR MOV AX,[BP] ; GET NEW INDEX SUB AX,2[BP]; COMPARE WITHSTRING ADDR ; ; SEARCH LOOP PFIN1: MOV DI,CX ; GET ADDR MOV AL,[BX] ; GET WORD LENGTH MOV DL,AL ; SAVE LENGTH XOR AL,[DER = 0 THRU 9 SUB AL,7 CMP AL,10 ; NUMBER 'A' THRU 'Z' ? JB DIGI2 ; NO ; DIGI1: CMP AL,DL ; COMPARE NUMBER TO BASE JAETERMINATOR CHAR. POP BX ; S2 - TEXT ADDR PUSH BX ; ADDR BACK TO STACK MOV AH,0 ; ZERO MOV DX,-1 ; CHAR OFFSET COUNTER VALUE XCHG BP,SP ; GET RETURN STACK PUSH AX PUSH DX XCHG BP,SP ; GET PARAMETER STACK JMP NEXT EJECT ; ********* DDR (LFA) ; (ZERO = FIRST WORD OF DICTIONARY) ; PFIN5: INC BX ; NEXT ADDR JB PFIN6 ; END OF NAME MOV AL,[BX] ; GET NEXT C LIMIT XOR AX,BX ; TEST SIGN (BIT-16) JS BRAN1 ; KEEP LOOPING... ; END OF 'DO' LOOP. ADD BP,4 ; ADJ. RETURN STK INC SI] AND AL,3FH ; CHECK LENGTHS JNZ PFIN5 ; LENGTHS DIFFER ; ; LENGTH MATCH, CHECK EACH CHARACTER IN NAME PFIN2: INC BX I DIGI2 ; NUMBER ERROR SUB DX,DX ; ZERO MOV DL,AL ; NEW BINARY NUMBER MOV AL,1 ; TRUE FLAG JMP DPUSH ; ADD TO STACK ; DEC BX ; ADDR -1 ; SCAN TO FIRST NON-TERMINATOR CHAR ; ENCL1: INC BX ; ADDR +1 INC DX ; COUNT +1 CMP AL,[BX] JZ ENCL1; * I * ; ********* ; DB 81H DB 'I'+80H DW XDO-7 IDO DW $+2 ; (S1) <- (R1) MOV AX,[BP] ; GET INDEX VALUE JMP APHAR ADD AL,AL ; SET/RESET CARRY JMP PFIN5 ; LOOP UNTIL FOUND ; PFIN6: MOV BX,[BX] ; GET LINK FIELD ADDR OR BX,BX ; STARTI INC SI ; BYPASS BRANCH OFFSET JMP NEXT ; CONTINUE... ; *************** ; * (+LOOP) * ; *************** ; DB NC DI ; NEXT CHAR OF NAME MOV AL,[BX] XOR AL,[DI] ; COMPARE NAMES ADD AL,AL ; THIS WILL TEST BIT-8 JNZ PFIN5 ; NO MATCH   ; WAIT FOR NON-TERMINATOR PUSH DX ; OFFSET TO 1ST TEXT CHR CMP AH,[BX] ; NULL CHAR? JNZ ENCL2 ; NO ; FOUND NULL BEFORE ; ********** ; * U/ * ; ********** ; DB 82H DB 'U' DB '/'+80H DW USTAR-5 USLAS DW $+2 POP BX ; DIVISOR POP ** ; * CMOVE * ; ************* ; DB 85H DB 'CMOV' DB 'E'+80H DW CR-5 CMOVE DW $+2 CLD ; INC DIRECTION MOV B+80H DW SPAT-6 SPSTO DW $+2 MOV BX,UP ; USER VAR BASE ADDR MOV SP,6[BX]; RESET PARAM. STACK PT. JMP NEXT ; *******; DB 84H DB 'EMI' DB 'T'+80H DW ENCL-0AH EMIT DW DOCOL DW PEMIT DW ONE,OUTT DW PSTOR,SEMIS ; *********** ; 'O' DB 'R'+80H DW ANDD-6 ORR DW $+2 ; (S1) <- (S1) OR (S2) POP AX POP BX OR AX,BX JMP APUSH ; *********** ; * FIRST NON-TERMINATOR CHAR. MOV AX,DX ; COPY COUNTER INC DX ; +1 JMP DPUSH ; FOUND FIRST TEXT CHAR, COUNT THE CHARACTERDX ; MSW OF DIVIDEND POP AX ; LSW OF DIVIDEND CMP DX,BX ; DIVIDE BY ZERO? JNB DZERO ; ZERO DIVIDE, NO WAY DIV BX ; 16 BIX,SI ; SAVE IP POP CX ; COUNT POP DI ; DEST. POP SI ; SOURCE MOV AX,DS MOV ES,AX ; ES <- DS REP MOVS AL,AL ; THATS T**** ; * RP@ * ; *********** ; DB 83H DB 'RP' DB '@'+80H DW SPSTO-6 RPAT DW $+2 ; (S1) <- (RP) MOV AX,BP ; RET* KEY * ; *********** ; DB 83H DB 'KE' DB 'Y'+80H DW EMIT-7 KEY DW $+2 JMP PKEY ; ***************** ; *  XOR * ; *********** ; DB 83H DB 'XO' DB 'R'+80H DW ORR-5 XORR DW $+2 ; (S1) <- (S1) XOR (S2) POP AX POP BX S ; ENCL2: INC BX ; ADDR+1 INC DX ; COUNT +1 CMP AL,[BX] ; TERMINATOR CHAR? JZ ENCL4 ; YES CMP AH,[BX] ; NULL CHAR JT DIVIDE JMP DPUSH ; STORE QUOT/REM ; DIVIDE BY ZERO ERROR (SHOW MAX NUMBERS) ; DZERO: MOV AX,-1 MOV DX,AX JMP DPUSH HE MOVE MOV SI,BX ; GET BACK IP JMP NEXT ; ********** ; * U* * ; ********** ; DB 82H DB 'U' DB '*'+80H DURN STACK ADDR JMP APUSH ; *********** ; * RP| * ; *********** ; DB 83H DB 'RP' DB '!'+80H DW RPAT-6 RPST ?TERMINAL * ; ***************** ; DB 89H DB '?TERMINA' DB 'L'+80H DW KEY-6 QTERM DW $+2 JMP PQTER ; ******* XOR AX,BX JMP APUSH EJECT ; *********** ; * SP@ * ; *********** ; DB 83H DB 'SP' DB '@'+80H DW XORR-6 SPNZ ENCL2 ; NO, LOOP AGAIN ; FOUND NULL AT END OF TEXT ; ENCL3: MOV AX,DX ; COUNTERS ARE EQUAL JMP DPUSH ; FOUND TERINA; STORE QUOT/REM ; *********** ; * AND * ; *********** ; DB 83H DB 'AN' DB 'D'+80H DW USLAS-5 ANDD DW $+2 ;W CMOVE-8 USTAR DW $+2 POP AX POP BX MUL BX ; UNSIGNED XCHG AX,DX ; AX NOW = MSW JMP DPUSH ; STORE DOUBLE WORD O DW $+2 MOV BX,UP ; (AX) <- USR VAR. BASE MOV BP,8[BX]; RESET RETURN STK PT. JMP NEXT EJECT ; ********** ; * ;S *** ; * CR * ; ********** ; DB 82H DB 'C' DB 'R'+80H DW QTERM-0CH CR DW $+2 JMP PCR EJECT ; ***********AT DW $+2 ; (S1) <- (SP) MOV AX,SP JMP APUSH ; *********** ; * SP| * ; *********** ; DB 83H DB 'SP' DB '!'TOR CHARACTER ; ENCL4: MOV AX,DX INC AX ; COUNT +1 JMP DPUSH EJECT ; ************ ; * EMIT * ; ************  (S1) <- (S1) AND (S2) POP AX POP BX AND AX,BX JMP APUSH ; ********** ; * OR * ; ********** ; DB 82H DB   * ; ********** ; ; END OF SCREEN OR RUN-TIME COLON WORD ; DB 82H DB ';' DB 'S'+80H DW RPSTO-6 SEMIS DW $+2 MOV S DB '+'+80H DW PLUS-4 DPLUS DW $+2 POP AX ; YHW POP DX ; YLW POP BX ; XHW POP CX ; XLW ADD DX,CX ; SLW ADC AX,B1: JMP APUSH ; ********** ; * 0< * ; ********** ; DB 82H DB '0' DB '<'+80H DW ZEQU-5 ZLESS DW $+2 POP AX  ************ ; DB 84H DB '2DU' DB 'P'+80H DW DUP-6 TDUP DW $+2 POP AX POP DX PUSH DX PUSH AX JMP DPUSH MP NEXT ; ********** ; * R> * ; ********** ; DB 82H DB 'R' DB '>'+80H DW TOR-5 FROMR DW $+2 ; (S1) <- (R1) INU-9 OVER DW $+2 POP DX POP AX PUSH AX JMP DPUSH ; ************ ; * DROP * ; ************ ; DB 84H DB I,[BP] ; (IP) <- (R1) INC BP INC BP ; ADJUST STACK JMP NEXT ; ************* ; * LEAVE * ; ************* ; DBX ; SHW JMP DPUSH ; ************* ; * MINUS * ; ************* ; DB 85H DB 'MINU' DB 'S'+80H DW DPLUS-5 MI OR AX,AX ; SET FLAGS MOV AX,1 ; TRUE JS ZLESS1 DEC AX ; FLASE ZLESS1: JMP APUSH ; ********* ; * + * ; ****** ; ********** ; * +| * ; ********** ; DB 82H DB '+' DB '!'+80H DW TDUP-7 PSTOR DW $+2 ; ((S1)) <- ((S1)) + (S2)  MOV AX,[BP] ; GET RETURN STACK VALUE INC BP ; DELETE FROM STACK INC BP JMP APUSH ; ********* ; * R * ; ******'DRO' DB 'P'+80H DW OVER-7 DROP DW $+2 POP AX JMP NEXT ; ************ ; * SWAP * ; ************ ; DB 84H  85H DB 'LEAV' DB 'E'+80H DW SEMIS-5 LEAVE DW $+2 ; LIMIT <- INDEX MOV AX,[BP] ; GET INDEX MOV 2[BP],AX; STORE IT AT NUS DW $+2 POP AX NEG AX JMP APUSH ; ************** ; * DMINUS * ; ************** ; DB 86H DB 'DMINU' DB*** ; DB 81H DB '+'+80H DW ZLESS-5 PLUS DW $+2 ;(S1) <- (S1) + (S2) POP AX POP BX ADD AX,BX JMP APUSH EJECT  POP BX ; ADDRESS POP AX ; INCREMENT ADD [BX],AX JMP NEXT ; ************** ; * TOGGLE * ; ************** ; *** ; DB 81H DB 'R'+80H DW FROMR-5 RR DW IDO+2 EJECT ; ********** ; * 0= * ; ********** ; DB 82H DB '0'  DB 'SWA' DB 'P'+80H DW DROP-7 SWAP DW $+2 POP DX POP AX JMP DPUSH ; *********** ; * DUP * ; *********** LIMIT JMP NEXT EJECT ; ********** ; * >R * ; ********** ; DB 82H DB '>' DB 'R'+80H DW LEAVE-8 TOR DW $+2  'S'+80H DW MINUS-8 DMINU DW $+2 POP BX POP CX SUB AX,AX ; ZERO MOV DX,AX SUB DX,CX ; MAKE 2'S COMPLEMENT SBB AX, ; ********** ; * D+ * ; ********** ; ; XLW XHW YLW YHW --> SLW SHW ; S4 S3 S2 S1 S2 S1 ; DB 82H DB 'D'DB 86H DB 'TOGGL' DB 'E'+80H DW PSTOR-5 TOGGL DW $+2 POP AX ; BIT PATTERN POP BX ; ADDR XOR [BX],AL JMP NEXT  DB '='+80H DW RR-4 ZEQU DW $+2 POP AX OR AX,AX ; DO TEST MOV AX,1 ; TRUE JZ ZEQU1 ; ITS ZERO DEC AX ; FALSE ZEQU ; DB 83H DB 'DU' DB 'P'+80H DW SWAP-7 DUP DW $+2 POP AX PUSH AX JMP APUSH ; ************ ; * 2DUP * ;; (R1) <- (S1) POP BX ; GET STACK PARAMETER DEC BP DEC BP ; MOVE RETURN STACK DOWN MOV [BP],BX ; ADD TO RETURN STACK JBX ; HIGH WORD JMP DPUSH EJECT ; ************ ; * OVER * ; ************ ; DB 84H DB 'OVE' DB 'R'+80H DW DM  ; ********* ; * @ * ; ********* ; DB 81H DB '@'+80H DW TOGGL-9 AT DW $+2 ; (S1) <- ((S1)) POP BX MOV AX,[BX] ********* ; * CONSTANT * ; **************** ; DB 88H DB 'CONSTAN' DB 'T'+80H DW NOOP-7 CON DW DOCOL DW CREAT  DW SCSP DW CURR DW AT DW CONT DW STORE DW CREAT DW RBRAC DW PSCOD DOCOL: INC DX ; W=W+1 DEC BP DEC BP ; (R BL * ; ********** ; DB 82H DB 'B' DB 'L'+80H DW THREE-4 BLS DW DOCON DW 20H ; *********** ; * C/L *  NEXT ; ********** ; * C| * ; ********** ; DB 82H DB 'C' DB '!'+80H DW STORE-4 CSTOR DW $+2 ; ((S1))LB <- (V DI,UP ; USER VARIABLE ADDR LEA AX,[BX+DI] ; ADDR OF VARIABLE JMP APUSH EJECT ; ********* ; * 0 * ; *********  JMP APUSH ; ********** ; * C@ * ; ********** ; DB 82H DB 'C' DB '@'+80H DW AT-4 CAT DW $+2 ; (S1) <- ((S1 DW SMUDG DW COMMA DW PSCOD DOCON: INC DX ; PFA MOV BX,DX MOV AX,[BX] ; GET DATA JMP APUSH ; **************** ; *P) <- (RP)-2 MOV [BP],SI ; R1 <- (RP) MOV SI,DX ; (IP) <- (W) JMP NEXT ; ********* ; * ; * ; ********* ; DB  ; *********** ; DB 83H ; CHARACTERS/LINE DB 'C/' DB 'L'+80H DW BLS-5 CSLL DW DOCON DW 64 ; ************* ; * S2)LB POP BX ; ADDR POP AX ; DATA MOV [BX],AL JMP NEXT ; ********** ; * 2| * ; ********** ; DB 82H DB '2 ; DB 81H DB '0'+80H DW USER-7 ZERO DW DOCON DW 0 ; ********* ; * 1 * ; ********* ; DB 81H DB '1'+80H ))LB POP BX MOV AL,[BX] SUB AH,AH JMP APUSH ; ********** ; * 2@ * ; ********** ; DB 82H DB '2' DB '@'+ VARIABLE * ; **************** ; DB 88H DB 'VARIABL' DB 'E'+80H DW CON-0BH VAR DW DOCOL DW CON DW PSCOD DOVA0C1H DB ';'+80H DW COLON-4 SEMI DW DOCOL DW QCSP DW COMP DW SEMIS DW SMUDG DW LBRAC DW SEMIS ; *********** FIRST * ; ************* ; DB 85H DB 'FIRS' DB 'T'+80H DW CSLL-6 FIRST DW DOCON DW BUF1 ; ************* ; ' DB '!'+80H DW CSTOR-5 TSTOR DW $+2 POP BX ; ADDR POP AX ; DATA (HW) MOV [BX],AX POP AX ; DATA (LW) MOV 2[BX],AX DW ZERO-4 ONE DW DOCON DW 1 ; ********* ; * 2 * ; ********* ; DB 81H DB '2'+80H DW ONE-4 TWO DW DOCON D80H DW CAT-5 TAT DW $+2 POP BX ; ADDR MOV AX,[BX] ; MSW MOV DX,2[BX]; LSW JMP DPUSH ; ********* ; * | * ; R: INC DX ; (DE) <- PFA PUSH DX ; (S1) <- PFA JMP NEXT ; ************ ; * USER * ; ************ ; DB 84H DB 'U* ; * NOOP * ; ************ ; DB 84H DB 'NOO' DB 'P'+80H DW SEMI-4 NOOP DW DOCOL DW SEMIS EJECT ; ******** LIMIT * ; ************* ; DB 85H DB 'LIMI' DB 'T'+80H DW FIRST-8 LIMIT DW DOCON DW EM ; ************* ; JMP NEXT EJECT ; ********* ; * : * ; ********* ; DB 0C1H DB ':'+80H DW TSTOR-5 COLON DW DOCOL DW QEXECW 2 ; ********* ; * 3 * ; ********* ; DB 81H DB '3'+80H DW TWO-4 THREE DW DOCON DW 3 ; ********** ; ********** ; DB 81H DB '!'+80H DW TAT-5 STORE DW $+2 ; ((S1)) <- (S2) POP BX ; ADDR POP AX ; DATA MOV [BX],AX JMPSE' DB 'R'+80H DW VAR-0BH USER DW DOCOL DW CON DW PSCOD DOUSE: INC DX ; PFA MOV BX,DX MOV BL,[BX] SUB BH,BH MO   * B/BUF * ; ************* ; DB 85H ; BYTES/BUFFER DB 'B/BU' DB 'F'+80H DW LIMIT-8 BBUF DW DOCON DW KBBUF ***** ; DB 82H DB 'I' DB 'N'+80H DW BLK-6 INN DW DOUSE DW 18H ; *********** ; * OUT * ; *********** ; ; ************* ; DB 85H DB 'FENC' DB 'E'+80H DW WARN-0AH FENCE DW DOUSE DW 10H ; ********** ; * DP * ; *3H DB 'FL' DB 'D'+80H DW DPL-6 FLD DW DOUSE DW 2AH ; *********** ; * CSP * ; *********** ; DB 83H DB 'C * ; ********** ; DB 82H DB 'R' DB '0'+80H DW SZERO-5 RZERO DW DOUSE DW 8 ; *********** ; * TIB * ; **** ; DB 87H DB 'CURREN' DB 'T'+80H DW CONT-0AH CURR DW DOUSE DW 22H ; ************* ; * STATE * ; ********; ************* ; * B/SCR * ; ************* ; DB 85H ; BUFFERS/SCREEN DB 'B/SC' DB 'R'+80H DW BBUF-8 BSCR DW DOCDB 83H DB 'OU' DB 'T'+80H DW INN-5 OUTT DW DOUSE DW 1AH ; *********** ; * SCR * ; *********** ; DB 83H ********* ; DB 82H DB 'D' DB 'P'+80H DW FENCE-8 DP DW DOUSE DW 12H ; **************** ; * VOC-LINK * ; **S' DB 'P'+80H DW FLD-6 CSPP DW DOUSE DW 2CH ; ********** ; * R# * ; ********** ; DB 82H DB 'R' DB '#'+8******** ; DB 83H DB 'TI' DB 'B'+80H DW RZERO-5 TIB DW DOUSE DW 0AH ; ************* ; * WIDTH * ; ************ ; DB 85H DB 'STAT' DB 'E'+80H DW CURR-0AH STATE DW DOUSE DW 24H ; ************ ; * BASE * ; *******ON DW 400H/KBBUF ; *************** ; * +ORIGIN * ; *************** ; DB 87H DB '+ORIGI' DB 'N'+80H DW BSCRDB 'SC' DB 'R'+80H DW OUTT-6 SCR DW DOUSE DW 1CH ; ************** ; * OFFSET * ; ************** ; DB 86H ************** ; DB 88H DB 'VOC-LIN' DB 'K'+80H DW DP-5 VOCL DW DOUSE DW 14H ; *********** ; * BLK * ; **0H DW CSPP-6 RNUM DW DOUSE DW 2EH ; *********** ; * HLD * ; *********** ; DB 83H DB 'HL' DB 'D'+80H DW ****** ; DB 85H DB 'WIDT' DB 'H'+80H DW TIB-6 WIDTH DW DOUSE DW 0CH ; *************** ; * WARNING * ; ******** ; DB 84H DB 'BAS' DB 'E'+80H DW STATE-8 BASE DW DOUSE DW 26H ; *********** ; * DPL * ; *********** -8 PORIG DW DOCOL DW LIT DW ORIG DW PLUS DW SEMIS EJECT ; ========== USER VARIABLES ========== ; ; ********** DB 'OFFSE' DB 'T'+80H DW SCR-6 OFSET DW DOUSE DW 1EH ; *************** ; * CONTEXT * ; *************** ; DB********* ; DB 83H DB 'BL' DB 'K'+80H DW VOCL-0BH BLK DW DOUSE DW 16H EJECT ; ********** ; * IN * ; *****RNUM-5 HLD DW DOUSE DW 30H ; ========== END OF USER VARIABLES ========== EJECT ; ********** ; * 1+ * ; ****************** ; DB 87H DB 'WARNIN' DB 'G'+80H DW WIDTH-8 WARN DW DOUSE DW 0EH ; ************* ; * FENCE *  ; DB 83H DB 'DP' DB 'L'+80H DW BASE-7 DPL DW DOUSE DW 28H ; *********** ; * FLD * ; *********** ; DB 8 ; * S0 * ; ********** ; DB 82H DB 'S' DB '0'+80H DW PORIG-0AH SZERO DW DOUSE DW 6 ; ********** ; * R0  87H DB 'CONTEX' DB 'T'+80H DW OFSET-9 CONT DW DOUSE DW 20H ; *************** ; * CURRENT * ; **************  **** ; DB 82H DB '1' DB '+'+80H DW HLD-6 ONEP DW DOCOL DW ONE DW PLUS DW SEMIS ; ********** ; * 2+ * ROP,ZLESS DW ZEQU DW BRAN DW OFFSET ULES2-$ ULES1 DW SUBB,ZLESS ; ELSE ULES2 DW SEMIS ; ENDIF EJECT ; ********* ;< * ; ********* ; DB 81H DB '<'+80H ; X < Y DW EQUAL-4 ; S2 S1 LESS DW $+2 POP DX ; S1 POP AX ; S2 MOV BX,ATES DW DOCOL DW CURR DW AT DW AT DW SEMIS ; *********** ; * LFA * ; *********** ; DB 83H DB 'LF' DB 'E DW TWO DW ALLOT DW SEMIS ; ********** ; * C, * ; ********** ; DB 82H DB 'C' DB ','+80H DW COMMA-4 CP'+80H DW SPACE-8 DDUP DW DOCOL DW DUP DW ZBRAN ; IF DW OFFSET DDUP1-$ DW DUP ; ENDIF DDUP1 DW SEMIS ; *******; ********** ; DB 82H DB '2' DB '+'+80H DW ONEP-5 TWOP DW DOCOL DW TWO DW PLUS DW SEMIS ; ************ ; * * > * ; ********* ; DB 81H DB '>'+80H DW ULESS-5 GREAT DW DOCOL DW SWAP DW LESS DW SEMIS ; *********** DX XOR BX,AX ; TEST FOR EQUAL SIGNS JS LES1 ; SIGNS NOT THE SAME SUB AX,DX LES1: OR AX,AX ; TEST SIGN BIT MOV AX,0 ; ASA'+80H DW LATES-9 LFA DW DOCOL DW LIT,4 DW SUBB DW SEMIS EJECT ; *********** ; * CFA * ; *********** ; DBCOMM DW DOCOL DW HERE DW CSTOR DW ONE DW ALLOT DW SEMIS ; ********* ; * - * ; ********* ; DB 81H DB '-********* ; * TRAVERSE * ; **************** ; DB 88H DB 'TRAVERS' DB 'E'+80H DW DDUP-7 TRAV DW DOCOL DW SWAP  HERE * ; ************ ; DB 84H DB 'HER' DB 'E'+80H DW TWOP-5 HERE DW DOCOL DW DP DW AT DW SEMIS ; *** ; * ROT * ; *********** ; DB 83H DB 'RO' DB 'T'+80H DW GREAT-4 ROT DW $+2 POP DX ; S1 POP BX ; S2 POP AX ;SUME FALSE CONDITION JNS LES2 ; NOT LESS THEN INC AX ; TRUE (1) LES2: JMP APUSH ; ********** ; * U< * ; ******** 83H DB 'CF' DB 'A'+80H DW LFA-6 CFA DW DOCOL DW TWO DW SUBB DW SEMIS ; *********** ; * NFA * ; ********'+80H DW CCOMM-5 SUBB DW $+2 POP DX ; S1 POP AX ; S1 SUB AX,DX ; AX = S1 - S1 JMP APUSH EJECT ; ********* ; * TRAV1 DW OVER ; BEGIN DW PLUS DW LIT,7FH DW OVER DW CAT DW LESS DW ZBRAN ; UNTIL DW OFFSET TRAV1-$ DW SWAP DW ********** ; * ALLOT * ; ************* ; DB 85H DB 'ALLO' DB 'T'+80H DW HERE-7 ALLOT DW DOCOL DW DP DW PSTOR S3 PUSH BX JMP DPUSH ; ************* ; * SPACE * ; ************* ; DB 85H DB 'SPAC' DB 'E'+80H DW ROT-6** ; DB 82H DB 'U' DB '<'+80H DW LESS-4 ULESS DW DOCOL,TDUP DW XORR,ZLESS DW ZBRAN DW OFFSET ULES1-$ ; IF DW D*** ; DB 83H DB 'NF' DB 'A'+80H DW CFA-6 NFA DW DOCOL DW LIT,5 DW SUBB DW LIT,-1 DW TRAV DW SEMIS ; *** = * ; ********* ; DB 81H DB '='+80H DW SUBB-4 EQUAL DW DOCOL DW SUBB DW ZEQU DW SEMIS ; ********* ; * DROP DW SEMIS ; ************** ; * LATEST * ; ************** ; DB 86H DB 'LATES' DB 'T'+80H DW TRAV-0BH L DW SEMIS ; ********* ; * , * ; ********* ; DB 81H DB ','+80H DW ALLOT-8 COMMA DW DOCOL DW HERE DW STOR SPACE DW DOCOL DW BLS DW EMIT DW SEMIS ; ************ ; * -DUP * ; ************ ; DB 84H DB '-DU' DB '  ******** ; * PFA * ; *********** ; DB 83H DB 'PF' DB 'A'+80H DW NFA-6 PFA DW DOCOL DW ONE DW TRAV DW LIT,5OR DW AT DW COMMA DW SEMIS ; ********* ; * [ * ; ********* ; DB 0C1H DB '['+80H DW COMP-0AH LBRAC DW DO ; DB 84H DB '?CS' DB 'P'+80H DW QPAIR-9 QCSP DW DOCOL DW SPAT DW CSPP DW AT DW SUBB DW LIT,14H DW QERR D COMP DW PSCOD DW LBRAC SEMI1 DW NOOP ; ( ASSEMBLER ) DW SEMIS ; *************** ; * * ; ************* ; DB 85H DB 'DOES' DB '>'+80H DW BUILD-0AH DOES DW DOCOL DW FROMR DW LATES DW PFA  DW LIT,12H DW QERR DW SEMIS ; ************** ; * ?PAIRS * ; ************** ; DB 86H DB '?PAIR' DB 'S'+8 DB '(;CODE' DB ')'+80H DW DECA-0AH PSCOD DW DOCOL DW FROMR DW LATES DW PFA DW CFA DW STORE DW SEMIS ; ***DB '?ERRO' DB 'R'+80H DW SCSP-7 QERR DW DOCOL DW SWAP DW ZBRAN ; IF DW OFFSET QERR1-$ DW ERROR DW BRAN ; ELSE DB 86H DB 'SMUDG' DB 'E'+80H DW RBRAC-4 SMUDG DW DOCOL DW LATES DW LIT,20H DW TOGGL DW SEMIS ; *********** ;*********** ; DB 87H DB 'COMPIL' DB 'E'+80H DW QLOAD-0BH COMP DW DOCOL DW QCOMP DW FROMR DW DUP DW TWOP DW TDW STORE DW PSCOD DODOE: XCHG BP,SP ; GET RETURN STACK PUSH SI ; (RP) <- (IP) XCHG BP,SP INC DX ; PFA MOV BX,DX MOV0H DW QEXEC-8 QPAIR DW DOCOL DW SUBB DW LIT,13H DW QERR DW SEMIS ; ************ ; * ?CSP * ; ************ ********** ; * ;CODE * ; ************* ; DB 0C5H DB ';COD' DB 'E'+80H DW PSCOD-0AH SEMIC DW DOCOL DW QCSP DWW OFFSET QERR2-$ QERR1 DW DROP ; ENDIF QERR2 DW SEMIS ; ************* ; * ?COMP * ; ************* ; DB 85H DB  * HEX * ; *********** ; DB 83H DB 'HE' DB 'X'+80H DW SMUDG-9 HEX DW DOCOL DW LIT,16 DW BASE DW STORE DW   SI,[BX] ; NEW CFA INC DX INC DX PUSH DX ; PFA JMP NEXT ; ************* ; * COUNT * ; ************* ; DB 'EXPEC' DB 'T'+80H DW DOTQ-5 EXPEC DW DOCOL DW OVER DW PLUS DW OVER DW XDO ; DO EXPE1 DW KEY DW DUP DW LIT,0ENT DW DUP DW ONEP DW FROMR DW PLUS DW TOR DW TYPES DW SEMIS ; ********** ; * ." * ; ********** ; DB  DW OFFSET NULL1-$ DW ONE DW BLK DW PSTOR DW ZERO DW INN DW STORE DW BLK DW AT DW BSCR DW ONE DW SUBB D*************** ; DB 89H DB '-TRAILIN' DB 'G'+80H DW TYPES-7 DTRAI DW DOCOL DW DUP DW ZERO DW XDO ; DO DTRA1 DWDW IDO DW CSTOR DW ZERO DW IDO DW ONEP DW STORE ; ENDIF EXPE3 DW EMIT DW XLOOP ; LOOP DW OFFSET EXPE1-$ DW DROP 85H DB 'COUN' DB 'T'+80H DW DOES-8 COUNT DW DOCOL DW DUP DW ONEP DW SWAP DW CAT DW SEMIS ; ************ H DW PORIG DW AT DW EQUAL DW ZBRAN ; IF DW OFFSET EXPE2-$ DW DROP DW DUP DW IDO DW EQUAL DW DUP DW FROMR 0C2H DB '.' DB '"'+80H DW PDOTQ-7 DOTQ DW DOCOL DW LIT,22H DW STATE DW AT DW ZBRAN ; IF DW OFFSET DOTQ1-$ DW W ANDD DW ZEQU DW ZBRAN ; IF DW OFFSET NULL2-$ DW QEXEC DW FROMR DW DROP ; ENDIF NULL2 DW BRAN ; ELSE DW OFFSET N OVER DW OVER DW PLUS DW ONE DW SUBB DW CAT DW BLS DW SUBB DW ZBRAN ; IF DW OFFSET DTRA2-$ DW LEAVE DW BRA DW SEMIS ; ************* ; * QUERY * ; ************* ; DB 85H DB 'QUER' DB 'Y'+80H DW EXPEC-9 QUERY DW D; * TYPE * ; ************ ; DB 84H DB 'TYP' DB 'E'+80H DW COUNT-8 TYPES DW DOCOL DW DDUP DW ZBRAN ; IF DW O DW TWO DW SUBB DW PLUS DW TOR DW ZBRAN ; IF DW OFFSET EXPE6-$ DW LIT DW BELL DW BRAN ; ELSE DW OFFSET EXPE7-$COMP DW PDOTQ DW WORDS DW HERE DW CAT DW ONEP DW ALLOT DW BRAN ; ELSE DW OFFSET DOTQ2-$ DOTQ1 DW WORDS DW HERULL3-$ NULL1 DW FROMR DW DROP ; ENDIF NULL3 DW SEMIS ; ************ ; * FILL * ; ************ ; DB 84H DB 'FN ; ELSE DW OFFSET DTRA3-$ DTRA2 DW ONE DW SUBB ; ENDIF DTRA3 DW XLOOP ; LOOP DW OFFSET DTRA1-$ DW SEMIS EJECT ; OCOL DW TIB DW AT DW LIT,50H DW EXPEC DW ZERO DW INN DW STORE DW SEMIS EJECT ; **************** ; * 0 (NFFSET TYPE1-$ DW OVER DW PLUS DW SWAP DW XDO ; DO TYPE2 DW IDO DW CAT DW EMIT DW XLOOP ; LOOP DW OFFSET TYPE2-$ EXPE6 DW LIT DW BSOUT ; ENDIF EXPE7 DW BRAN ; ELSE DW OFFSET EXPE3-$ EXPE2 DW DUP DW LIT,0DH DW EQUAL DW ZBRAN ; IE DW COUNT DW TYPES ; ENDIF DOTQ2 DW SEMIS EJECT ; ************** ; * EXPECT * ; ************** ; DB 86H DBIL' DB 'L'+80H DW NULL-4 FILL DW $+2 POP AX ; FILL CHAR POP CX ; FILL COUNT POP DI ; BEGIN ADR MOV BX,DS MOV ES,B************ ; * (.") * ; ************ ; DB 84H DB '(."' DB ')'+80H DW DTRAI-0CH PDOTQ DW DOCOL DW RR DW COUULL) * ; **************** ; DB 0C1H ; A BINARY ZERO DB 80H DW QUERY-8 NULL DW DOCOL DW BLK DW AT DW ZBRAN ; IF  DW BRAN ; ELSE DW OFFSET TYPE3-$ TYPE1 DW DROP ; ENDIF TYPE3 DW SEMIS ; ***************** ; * -TRAILING * ; **F DW OFFSET EXPE4-$ DW LEAVE DW DROP DW BLS DW ZERO DW BRAN ; ELSE DW OFFSET EXPE5-$ EXPE4 DW DUP ; ENDIF EXPE5  X ; ES <- DS CLD ; INC DIRECTION REP STOS AL ; STORE BYTE JMP NEXT ; ************* ; * ERASE * ; ***********ENDIF PNUM3 DW FROMR DW BRAN ; REPEAT DW OFFSET PNUM1-$ PNUM2 DW FROMR DW SEMIS EJECT ; ************** ; * NUMBE DW PLUS DW HERE DW ONEP DW FROMR DW CMOVE DW SEMIS EJECT ; **************** ; * (NUMBER) * ; ************* ; * ERROR * ; ************* ; DB 85H DB 'ERRO' DB 'R'+80H DW PABOR-0AH ERROR DW DOCOL DW WARN DW AT DW Z' DB 'D'+80H DW HOLD-7 PAD DW DOCOL DW HERE DW LIT,44H DW PLUS DW SEMIS ; ************ ; * WORD * ; ****INU ; ENDIF NUMB3 DW SEMIS EJECT ; ************* ; * -FIND * ; ************* ; DB 85H DB '-FIN' DB 'D'+80H ** ; DB 85H DB 'ERAS' DB 'E'+80H DW FILL-7 ERASEE DW DOCOL DW ZERO DW FILL DW SEMIS ; ************** ; * R * ; ************** ; DB 86H DB 'NUMBE' DB 'R'+80H DW PNUMB-0BH NUMB DW DOCOL DW ZERO DW ZERO DW ROT DW DU**** ; DB 88H DB '(NUMBER' DB ')'+80H DW WORDS-7 PNUMB DW DOCOL PNUM1 DW ONEP ; BEGIN DW DUP DW TOR DW CAT DWLESS DW ZBRAN ; IF DW OFFSET ERRO1-$ DW PABOR ; ENDIF ERRO1 DW HERE DW COUNT DW TYPES DW PDOTQ DB 2 DB '? ' D******** ; DB 84H DB 'WOR' DB 'D'+80H DW PAD-6 WORDS DW DOCOL DW BLK DW AT DW ZBRAN ; IF DW OFFSET WORD1-$ DDW NUMB-9 DFIND DW DOCOL DW BLS DW WORDS DW HERE DW CONT DW AT DW AT DW PFIND DW DUP DW ZEQU DW ZBRAN ; IF  BLANKS * ; ************** ; DB 86H DB 'BLANK' DB 'S'+80H DW ERASEE-8 BLANK DW DOCOL DW BLS DW FILL DW SEMIS P DW ONEP DW CAT DW LIT,2DH DW EQUAL DW DUP DW TOR DW PLUS DW LIT,-1 NUMB1 DW DPL ; BEGIN DW STORE DW PNUMB BASE DW AT DW DIGIT DW ZBRAN ; WHILE DW OFFSET PNUM2-$ DW SWAP DW BASE DW AT DW USTAR DW DROP DW ROT DW BW MESS DW SPSTO ; CHANGE FROM FIG MODEL ; DW INN,AT,BLK,AT DW BLK,AT DW DDUP DW ZBRAN ; IF DW OFFSET ERRO2-$ DW IW BLK DW AT DW BLOCK DW BRAN ; ELSE DW OFFSET WORD2-$ WORD1 DW TIB DW AT ; ENDIF WORD2 DW INN DW AT DW PLUS DW DW OFFSET DFIN1-$ DW DROP DW HERE DW LATES DW PFIND ; ENDIF DFIN1 DW SEMIS ; *************** ; * (ABORT) *  ; ************ ; * HOLD * ; ************ ; DB 84H DB 'HOL' DB 'D'+80H DW BLANK-9 HOLD DW DOCOL DW LIT,-1  DW DUP DW CAT DW BLS DW SUBB DW ZBRAN ; WHILE DW OFFSET NUMB2-$ DW DUP DW CAT DW LIT,2EH DW SUBB DW ZERO ASE DW AT DW USTAR DW DPLUS DW DPL DW AT DW ONEP DW ZBRAN ; IF DW OFFSET PNUM3-$ DW ONE DW DPL DW PSTOR ; NN,AT DW SWAP ; ENDIF ERRO2 DW QUIT ; *********** ; * ID. * ; *********** ; DB 83H DB 'ID' DB '.'+80H DW SWAP DW ENCL DW HERE DW LIT,22H DW BLANK DW INN DW PSTOR DW OVER DW SUBB DW TOR DW RR DW HERE DW CSTOR  ; *************** ; DB 87H DB '(ABORT' DB ')'+80H DW DFIND-8 PABOR DW DOCOL DW ABORT DW SEMIS ; ************ DW HLD DW PSTOR DW HLD DW AT DW CSTOR DW SEMIS ; *********** ; * PAD * ; *********** ; DB 83H DB 'PA DW QERR DW ZERO DW BRAN ; REPEAT DW OFFSET NUMB1-$ NUMB2 DW DROP DW FROMR DW ZBRAN ; IF DW OFFSET NUMB3-$ DW DM  ERROR-8 IDDOT DW DOCOL DW PAD DW LIT,20H DW LIT,5FH DW FILL DW DUP DW PFA DW LFA DW OVER DW SUBB DW PAD HERE DW LIT,80H DW PLUS DW ULESS DW LIT,7 DW QERR DW SEMIS EJECT ; ***************** ; * INTERPRET * ; OMP DW LIT DW COMMA ; ENDIF LITE1 DW SEMIS EJECT ; **************** ; * DLITERAL * ; **************** ; DB 0CCL DW AT DW COMMA DW VOCL DW STORE DW DOES DOVOC DW TWOP DW CONT DW STORE DW SEMIS EJECT ; *************  DW LATES DW COMMA DW CURR DW AT DW STORE DW HERE DW TWOP DW COMMA DW SEMIS EJECT ; ***************** ; *ITER ; ENDIF INTE7 DW QSTAC ; ENDIF INTE5 DW BRAN ; AGAIN DW OFFSET INTE1-$ EJECT ; ***************** ; * IMMEDIATE DW SWAP DW CMOVE DW PAD DW COUNT DW LIT,1FH DW ANDD DW TYPES DW SPACE DW SEMIS EJECT ; ************** ; * ***************** ; DB 89H DB 'INTERPRE' DB 'T'+80H DW QSTAC-9 INTER DW DOCOL INTE1 DW DFIND ; BEGIN DW ZBRAN ; IF 8H DB 'DLITERA' DB 'L'+80H DW LITER-0AH DLITE DW DOCOL DW STATE DW AT DW ZBRAN ; IF DW OFFSET DLIT1-$ DW SWAP ; * FORTH * ; ************* ; ; THE 'TASK-7' IS A COLD START VALUE ; ONLY. ITS CHANGED EACH TIME A ; DEFINITION IS APP [COMPILE] * ; ***************** ; DB 0C9H DB '[COMPILE' DB ']'+80H DW CREAT-9 BCOMP DW DOCOL DW DFIND DW ZEQ * ; ***************** ; DB 89H DB 'IMMEDIAT' DB 'E'+80H DW INTER-0CH IMMED DW DOCOL DW LATES DW LIT,40H DW TO CREATE * ; ************** ; DB 86H DB 'CREAT' DB 'E'+80H DW IDDOT-6 CREAT DW DOCOL DW DFIND DW ZBRAN ; IF D DW OFFSET INTE2-$ DW STATE DW AT DW LESS DW ZBRAN ; IF DW OFFSET INTE3-$ DW CFA DW COMMA DW BRAN ; ELSE DW O DW LITER DW LITER ; ENDIF DLIT1 DW SEMIS ; ************** ; * ?STACK * ; ************** ; DB 86H DB '?STAC' ENED TO THE 'FORTH' ; VOCABULARY. ; DB 0C5H DB 'FORT' DB 'H'+80H DW VOCAB-0DH FORTH DW DODOE DW DOVOC DW 0A081H U DW ZERO DW QERR DW DROP DW CFA DW COMMA DW SEMIS ; *************** ; * LITERAL * ; *************** ; GGL DW SEMIS ; ****************** ; * VOCABULARY * ; ****************** ; DB 8AH DB 'VOCABULAR' DB 'Y'+80H W OFFSET CREA1-$ DW DROP DW NFA DW IDDOT DW LIT,4 DW MESS DW SPACE ; ENDIF CREA1 DW HERE DW DUP DW CAT DW WIDFFSET INTE4-$ INTE3 DW CFA DW EXEC ; ENDIF INTE4 DW QSTAC DW BRAN ; ELSE DW OFFSET INTE5-$ INTE2 DW HERE DW NUMB DW DB 'K'+80H DW DLITE-0BH QSTAC DW DOCOL DW SPAT DW SZERO DW AT DW SWAP DW ULESS DW ONE DW QERR DW SPAT DW  DW TASK-7 ; COLD START VALUE ONLY DW 0 ; END OF VOCABULARY LIST ; ******************* ; * DEFINITIONS * ; ****** DB 0C7H DB 'LITERA' DB 'L'+80H DW BCOMP-0CH LITER DW DOCOL DW STATE DW AT DW ZBRAN ; IF DW OFFSET LITE1-$ DW C DW IMMED-0CH VOCAB DW DOCOL DW BUILD DW LIT DW 0A081H DW COMMA DW CURR DW AT DW CFA DW COMMA DW HERE DW VOTH DW AT DW MIN DW ONEP DW ALLOT DW DUP DW LIT,0A0H DW TOGGL DW HERE DW ONE DW SUBB DW LIT,80H DW TOGGL  DPL DW AT DW ONEP DW ZBRAN ; IF DW OFFSET INTE6-$ DW DLITE DW BRAN ; ELSE DW OFFSET INTE7-$ INTE6 DW DROP DW L ************* ; DB 8BH DB 'DEFINITION' DB 'S'+80H DW FORTH-8 DEFIN DW DOCOL DW CONT DW AT DW CURR DW STORE DW LIT,0 DW LIT,EPRINT DW STORE DW LIT DW ORIG+12H DW LIT,UP DW AT DW LIT,6 DW PLUS DW LIT,10H DW CMOVE DW  ; COLD START VECTOR COMES HERE ; CLD: MOV SI,OFFSET CLD1 ; (IP) <- MOV AX,CS MOV DS,AX ; SET DATA SEG MOV SP,WORDDB 83H DB 'MI' DB 'N'+80H DW DABS-7 MIN DW DOCOL,TDUP DW GREAT DW ZBRAN ; IF DW OFFSET MIN1-$ DW SWAP ; ENDIF MI ************* ; * ABORT * ; ************* ; DB 85H DB 'ABOR' DB 'T'+80H DW QUIT-7 ABORT DW DOCOL DW SPSTO D******** ; * D+- * ; *********** ; DB 83H DB 'D+' DB '-'+80H DW PM-5 DPM DW DOCOL DW ZLESS DW ZBRAN ; IF DW SEMIS ; ********* ; * ( * ; ********* ; DB 0C1H DB '('+80H DW DEFIN-0EH PAREN DW DOCOL DW LIT,')' DW WOLIT,ORIG+0CH DW AT DW LIT,FORTH+6 DW STORE DW ABORT EJECT ; ************ ; * S->D * ; ************ ; DB  PTR ORIG+12H ; PARAM. STK MOV SS,AX ; SET STACK SEG MOV ES,AX ; SET EXTRA SEG CLD ; DIR = INC MOV BP, RPP ; RETURNN1 DW DROP DW SEMIS ; *********** ; * MAX * ; *********** ; DB 83H DB 'MA' DB 'X'+80H DW MIN-6 MAX DW DOCW DECA DW QSTAC DW CR DW DOTCPU DW PDOTQ DB 0DH DB 'Fig-Forth ' DB FIGREL+30H,ADOT,FIGREV+30H DW FORTH DW DEFIW OFFSET DPM1-$ DW DMINU ; ENDIF DPM1 DW SEMIS ; *********** ; * ABS * ; *********** ; DB 83H DB 'AB' DB 'SRDS DW SEMIS EJECT ; ************ ; * QUIT * ; ************ ; DB 84H DB 'QUI' DB 'T'+80H DW PAREN-4 QUI84H DB 'S->' DB 'D'+80H DW COLD-7 STOD DW $+2 POP DX ; S1 SUB AX,AX ; AX = 0 OR DX,DX ; SET FLAGS JNS STOD1 ; STACK JMP NEXT ; CLD1 DW COLD ; ************ ; * COLD * ; ************ ; DB 84H DB 'COL' DB 'D'+80H DW OL,TDUP DW LESS DW ZBRAN ; IF DW OFFSET MAX1-$ DW SWAP ; ENDIF MAX1 DW DROP DW SEMIS EJECT ; ********** ; * MN DW QUIT EJECT ; WARM START VECTOR COMES HERE ; WRM: MOV SI,OFFSET WRM1 JMP NEXT ; WRM1 DW WARM ; *********'+80H DW DPM-6 ABS DW DOCOL DW DUP DW PM DW SEMIS ; ************ ; * DABS * ; ************ ; DB 84H DB T DW DOCOL DW ZERO DW BLK DW STORE DW LBRAC QUIT1 DW RPSTO ; BEGIN DW CR DW QUERY DW INTER DW STATE DW AT D POSITIVE NUMBER DEC AX ; NEGITIVE NUMBER STOD1: JMP DPUSH ; ********** ; * +- * ; ********** ; DB 82H DB '+WARM-7 COLD DW DOCOL DW MTBUF DW ZERO,DENSTY DW STORE DW FIRST DW USE,STORE DW FIRST DW PREV,STORE DW DRZER D* * ; ********** ; DB 82H DB 'M' DB '*'+80H DW MAX-6 MSTAR DW DOCOL,TDUP DW XORR DW TOR DW ABS DW SWAP DW*** ; * WARM * ; ************ ; DB 84H ; WARM DB 'WAR' DB 'M'+80H DW ABORT-8 WARM DW DOCOL DW MTBUF DW ABORT'DAB' DB 'S'+80H DW ABS-6 DABS DW DOCOL DW DUP DW DPM DW SEMIS ; *********** ; * MIN * ; *********** ; W ZEQU DW ZBRAN ; IF DW OFFSET QUIT2-$ DW PDOTQ DB 2 DB 'OK' ; ENDIF QUIT2 DW BRAN ; AGAIN DW OFFSET QUIT1-$ ;' DB '-'+80H DW STOD-7 PM DW DOCOL DW ZLESS DW ZBRAN ; IF DW OFFSET PM1-$ DW MINUS ; ENDIF PM1 DW SEMIS ; ***  ABS DW USTAR DW FROMR DW DPM DW SEMIS ; ********** ; * M/ * ; ********** ; DB 82H DB 'M' DB '/'+80H US DW LIT,64 DW SEMIS ; ************* ; * .LINE * ; ************* ; DB 85H DB '.LIN' DB 'E'+80H DW PLINE8 SSLA DW DOCOL DW SSMOD DW SWAP DW DROP DW SEMIS ; ************* ; * M/MOD * ; ************* ; DB 85H YTE OUTPUT JMP NEXT ; ********** ; * P@ * ; ********** ; ; FETCH WORD FROM PORT. ; DB 82H DB 'P' DB '@'+80******* ; DB 81H DB '/'+80H DW SLMOD-7 SLASH DW DOCOL DW SLMOD DW SWAP DW DROP DW SEMIS ; *********** ; * ---------------------------------------- ; ; 8086/88 PORT FETCH AND STORE ; ; *********** ; * PC@ * ; ***********  DW MSTAR-5 MSLAS DW DOCOL DW OVER DW TOR DW TOR DW DABS DW RR DW ABS DW USLAS DW FROMR DW RR DW XORR DW -9 DLINE DW DOCOL DW PLINE DW DTRAI DW TYPES DW SEMIS ; *************** ; * MESSAGE * ; *************** ;DB 'M/MO' DB 'D'+80H DW SSLA-5 MSMOD DW DOCOL DW TOR DW ZERO DW RR DW USLAS DW FROMR DW SWAP DW TOR DW USLAH DW PTCSTO-6 PTAT DW $+2 POP DX ; PORT ADDR IN AX,DX ; WORD INPUT JMP APUSH ; *********** ; * PC| * ; ***** MOD * ; *********** ; DB 83H DB 'MO' DB 'D'+80H DW SLASH-4 MODD DW DOCOL DW SLMOD DW DROP DW SEMIS ; * ; ; FETCH CHARACTER (BYTE) FROM PORT. ; DB 83H DB 'PC' DB '@'+80H DW MESS-0AH PTCAT DW $+2 POP DX ; PORT ADDR INPM DW SWAP DW FROMR DW PM DW SWAP DW SEMIS ; ********* ; * * * ; ********* ; DB 81H DB '*'+80H DW MS DB 87H DB 'MESSAG' DB 'E'+80H DW DLINE-8 MESS DW DOCOL DW WARN DW AT DW ZBRAN ; IF DW OFFSET MESS1-$ DW DDUPS DW FROMR DW SEMIS EJECT ; ************** ; * (LINE) * ; ************** ; DB 86H DB '(LINE' DB ')'+80H ****** ; ; STORE WORD AT PORT. ; DB 82H DB 'P' DB '!'+80H DW PTAT-5 PTSTO DW $+2 POP DX ; PORT ADDR POP AX ; DAT************ ; * */MOD * ; ************* ; DB 85H DB '*/MO' DB 'D'+80H DW MODD-6 SSMOD DW DOCOL DW TOR DW MS AL,DX ; BYTE INPUT SUB AH,AH ; ZERO AH JMP APUSH ; *********** ; * PC| * ; *********** ; ; STORE CHARACTER (BYLAS-5 STAR DW DOCOL DW MSTAR DW DROP DW SEMIS ; ************ ; * /MOD * ; ************ ; DB 84H DB '/MO'  DW ZBRAN ; IF DW OFFSET MESS2-$ DW LIT,4 DW OFSET DW AT DW BSCR DW SLASH DW SUBB DW DLINE DW SPACE ; ENDIF DW MSMOD-8 PLINE DW DOCOL DW TOR DW LIT,64 DW BBUF DW SSMOD DW FROMR DW BSCR DW STAR DW PLUS DW BLOCK DW PLA OUT DX,AX ; WORD OUTPUT JMP NEXT EJECT ;----------------------------------------------- ; ; DISK INTERFACE WORDS ;TAR DW FROMR DW MSLAS DW SEMIS ; ********** ; * */ * ; ********** ; DB 82H DB '*' DB '/'+80H DW SSMOD-TE) AT PORT. ; DB 83H DB 'PC' DB '!'+80H DW PTCAT-6 PTCSTO DW $+2 POP DX ; PORT ADDR POP AX ; DATA OUT DX,AL ; B DB 'D'+80H DW STAR-4 SLMOD DW DOCOL DW TOR DW STOD DW FROMR DW MSLAS DW SEMIS ; ********* ; * / * ; ** MESS2 DW BRAN ; ELSE DW OFFSET MESS3-$ MESS1 DW PDOTQ DB 6 DB 'MSG # ' DW DOT ; ENDIF MESS3 DW SEMIS EJECT ;--  ; ; DOUBLE DENSITY 8" FLOPPY CAPACITIES ; SPT2 EQU 52 ; SECTORS PER TRACK TRKS2 EQU 77 ; NUMBER OF TRACKS SPDRV2 EQU SPT2BUF-8 DENSTY DW DOVAR DW 0 ; ****************** ; * DISK-ERROR * ; ****************** ; ; DISK ERROR STATUS ; '+80H DW USE-6 PREV DW DOVAR DW BUF1 ; *************** ; * SEC/BLK * ; *************** ; ; NUMBER OF SECTORS P OFFSET DRON1-$ DW LIT,SPDRV2 DW BRAN DW OFFSET DRON2-$ DRON1 DW LIT,SPDRV1 DRON2 DW OFSET,STORE DW SEMIS EJECT ;OR NUMBER ; DB 83H DB 'SE' DB 'C'+80H DW DRIVE-8 SEC DW DOVAR DW 0 EJECT ; ************* ; * TRACK * ; ** STORE,SEMIS ; ********************* ; * EMPTY-BUFFERS * ; ********************* ; DB 8DH DB 'EMPTY-BUFFER' DB*TRKS2 ; SECTORS/DRIVE ; ; SINGLE DENSITY 8" FLOPPY CAPACITIES ; SPT1 EQU 26 ; SECTORS/TRACK TRKS1 EQU 77 ; # TRACKS SPDRV DB 8AH DB 'DISK-ERRO' DB 'R'+80H DW DENSTY-10 DSKERR DW DOVAR,0 EJECT ; ************ ; * +BUF * ; *********ER BLOCK ; DB 87H DB 'SEC/BL' DB 'K'+80H DW PREV-7 SPBLK DW DOCON DW KBBUF/BPS EJECT ; ************* ; * #BU ************** ; * BUFFER * ; ************** ; ; NOTE: THIS WORD WON'T WORK IF ONLY ; USING SINGLE BUFFER. ; DB 8*********** ; ; CURRENT TRACK NUMBER ; DB 85H DB 'TRAC' DB 'K'+80H DW SEC-6 TRACK DW DOVAR,0 ; *********** ; * 'S'+80H DW UPDAT-9 MTBUF DW DOCOL,FIRST DW LIMIT,OVER DW SUBB,ERASEE DW SEMIS EJECT ; *********** ; * DR0 * 1 EQU SPT1*TRKS1 ; SECTORS/DRIVE ; BPS EQU 128 ; BYTES PER SECTOR MXDRV EQU 2 ; MAX # DRIVES ; ; ; FORTH VARIABLES AND CON*** ; DB 84H DB '+BU' DB 'F'+80H DW DSKERR-13 PBUF DW DOCOL DW LIT,CO DW PLUS,DUP DW LIMIT,EQUAL DW ZBRAN DWFF * ; ************* ; ; NUMBER OF BUFFERS ; DB 85H DB '#BUF' DB 'F'+80H DW SPBLK-10 NOBUF DW DOCON,NBUF ; *6H DB 'BUFFE' DB 'R'+80H DW DRONE-6 BUFFE DW DOCOL,USE DW AT,DUP DW TOR BUFF1 DW PBUF DW ZBRAN DW OFFSET BUFF1-$ USE * ; *********** ; ; ADDRESS OF NEXT BUFFER TO USE ; DB 83H DB 'US' DB 'E'+80H DW TRACK-8 USE DW DOVAR DW ; *********** ; DB 83H DB 'DR' DB '0'+80H DW MTBUF-16 DRZER DW DOCOL,ZERO DW OFSET,STORE DW SEMIS ; ********STANTS ; USED IN THE DISK INTERFACE. ; ; ************* ; * DRIVE * ; ************* ; ; CURRENT DRIVE NUMBER ; DB OFFSET PBUF1-$ DW DROP,FIRST PBUF1 DW DUP,PREV DW AT,SUBB DW SEMIS ; ************** ; * UPDATE * ; ************************ ; * DENSITY * ; *************** ; ; 0 = SINGLE, 1 = DOUBLE ; DB 87H DB 'DENSIT' DB 'Y'+80H DW NO DW USE,STORE DW RR,AT DW ZLESS DW ZBRAN DW OFFSET BUFF2-$ DW RR,TWOP DW RR,AT DW LIT,7FFFH DW ANDD,ZERO DW  BUF1 ; ************ ; * PREV * ; ************ ; ; ADDRESS OF PREVIOUSLY USED BUFFER ; DB 84H DB 'PRE' DB 'V*** ; * DR1 * ; *********** ; DB 83H DB 'DR' DB '1'+80H DW DRZER-6 DRONE DW DOCOL DW DENSTY,AT DW ZBRAN DW 85H DB 'DRIV' DB 'E'+80H DW PTSTO-5 DRIVE DW DOVAR,0 ; *********** ; * SEC * ; *********** ; ; CURRENT SECT**** ; DB 86H DB 'UPDAT' DB 'E'+80H DW PBUF-7 UPDAT DW DOCOL,PREV DW AT,AT DW LIT,8000H DW ORR DW PREV,AT DW RSLW BUFF2 DW RR,STORE DW RR,PREV DW STORE,FROMR DW TWOP,SEMIS EJECT ; ************* ; * BLOCK * ; ***********SCAL2 DW LIT,SPT2 DW SLMOD,TRACK DW STORE,ONEP DW SEC,STORE DW SEMIS ; SINGLE DENSITY ; TSCALS DW LIT,SPDRV1 DW SP NEXT EJECT ; *************** ; * T&SCALC * ; *************** ; ; (CALCULATES DRIVE#, TRACK#, & SECTOR# ) ; STACKW ZBRAN DW OFFSET RSLW2-$ DW SECRD DW BRAN DW OFFSET RSLW3-$ RSLW2 DW SECWT RSLW3 DW ONEP DW LIT,80H DW USE,PSTOR ; SETS: DMA OFFSET, DMA SEGMENT ; TRACK AND SECTOR. ; DB 86H DB 'SET-I' DB 'O'+80H DW BLOCK-8 SETIO DW $+2 MOV CX***** ; * SEC-WRITE * ; ***************** ; ; WRITE A SECTOR ; DB 89H DB 'SEC-WRIT' DB 'E'+80H DW SECRD-11 SEC** ; DB 85H DB 'BLOC' DB 'K'+80H DW BUFFE-9 BLOCK DW DOCOL,OFSET DW AT,PLUS DW TOR,PREV DW AT,DUP DW AT,RR DLMOD DW LIT,MXDRV,MIN DW DUP,DRIVE DW AT,EQUAL DW ZBRAN DW OFFSET TSCAL3-$ DW DROP DW BRAN DW OFFSET TSCAL4-$ T: SECTOR-DISPLACEMENT = BLK# * SEC/BLK ; OUTPUT: VARIABLES DRIVE, TRACK, & SEC ; DB 87H DB 'T&SCAL' DB 'C'+80H DW SET DW XLOOP DW OFFSET RSLW1-$ DW DROP,DROP DW FROMR,USE DW STORE,SEMIS EJECT ; ************* ; * FLUSH * ; ***,USE+2 ; DMA OFFSET CALL SDMAO ; SET IT MOV CX,CS ; GET SEGMENT CALL SDMAS ; SET IT MOV CX,SEC+2 ; SECTOR # CALL SSWT DW $+2 CALL PSEC ; PUT (WRITE) SECTOR MOV AH,0 MOV DSKERR+2,AX ; SAVE ERROR STATUS JMP NEXT EJECT ; *********** W SUBB DW DUP,PLUS DW ZBRAN DW OFFSET BLOC1-$ BLOC2 DW PBUF,ZEQU DW ZBRAN DW OFFSET BLOC3-$ DW DROP,RR DW BUFFE,DSCAL3 DW DRIVE,STORE DW SETDRV TSCAL4 DW LIT,SPT1 DW SLMOD,TRACK DW STORE,ONEP DW SEC,STORE DW SEMIS EJECT ; *DRV-12 TSCALC DW DOCOL,DENSTY DW AT DW ZBRAN DW OFFSET TSCALS-$ DW LIT,SPDRV2 DW SLMOD DW LIT,MXDRV,MIN DW DUP,DR********** ; DB 85H DB 'FLUS' DB 'H'+80H DW RSLW-6 FLUSH DW DOCOL DW NOBUF,ONEP DW ZERO,XDO FLUS1 DW ZERO,BUFFE EC ; SET IT MOV CX,TRACK+2 ; TRACK # CALL STRK ; SET IT JMP NEXT ; ***************** ; * SET-DRIVE * ; ****** ; * R/W * ; *********** ; ; DISK READ/WRITE ROUTINE ; DB 83H DB 'R/' DB 'W'+80H DW SECWT-12 RSLW DW DOCOL DWUP DW RR,ONE DW RSLW DW TWO,SUBB BLOC3 DW DUP,AT DW RR,SUBB DW DUP,PLUS DW ZEQU DW ZBRAN DW OFFSET BLOC2-$ DW*************** ; * SEC-READ * ; **************** ; ; READ A SECTOR ; DB 88H DB 'SEC-REA' DB 'D'+80H DW TSCALC-IVE DW AT,EQUAL DW ZBRAN DW OFFSET TSCAL1-$ DW DROP DW BRAN DW OFFSET TSCAL2-$ TSCAL1 DW DRIVE,STORE DW SETDRV T DW DROP DW XLOOP DW OFFSET FLUS1-$ DW SEMIS ; ************ ; * LOAD * ; ************ ; DB 84H DB 'LOA' *********** ; DB 89H DB 'SET-DRIV' DB 'E'+80H DW SETIO-9 SETDRV DW $+2 MOV CX,DRIVE+2 CALL SDSK ; SELECT DISK JM USE,AT DW TOR DW SWAP,SPBLK DW STAR,ROT DW USE,STORE DW SPBLK,ZERO DW XDO RSLW1 DW OVER,OVER DW TSCALC,SETIO D DUP,PREV DW STORE BLOC1 DW FROMR,DROP DW TWOP,SEMIS EJECT ; ************** ; * SET-IO * ; ************** ; 10 SECRD DW $+2 CALL GSEC ; GET (READ) SECTOR MOV AH,0 MOV DSKERR+2,AX ; SAVE ERROR STATUS JMP NEXT ; ************ DB 'D'+80H DW FLUSH-8 LOAD DW DOCOL,BLK DW AT,TOR DW INN,AT DW TOR,ZERO DW INN,STORE DW BSCR,STAR DW BLK,STORE ; NTER * ; ******************************* ; ; CALLED FROM 'CR' ; PCR: MOV AL,ACR CALL POUT ; CHAR OUTPUT MOV AL,LF CONSOLE INPUT CMP AL,DLE ; PRINTER TOGGLE? JNE PKEY1 ; NO XOR EPRINT,1 ; TOGGLE ECHO JMP PKEY ; GET ANOTHER KEY ; PKEY; ENTRY TO CP/M-86 BDOS IS THROUGH SOFTWARE ; INTERRUPT #224. ; ; ENTRY: REG CL = FUNCTION CODE. ; " DX = PARAMETER(S).  ; (TRUE = CHAR READY, FALSE = NO CHAR) ; ; CALLED FROM "?TERMINAL". ; ; USE 'KEY' TO GET KEY VALUE. ; PQTER: CALL CSTAT ;;;; ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ALL LOW LEVEL CONSOLE AND DISK I/O START ; HERE. ; ; THE BLK <- SCR * B/SCR DW INTER ; INTERPRET FROM OTHER SCREEN DW FROMR,INN DW STORE DW FROMR,BLK DW STORE DW SEMIS ECALL POUT JMP NEXT ; ******************************************* ; * * ; * TRUE CONSOLE/PRINTER OUTPUT ROUT1: MOV AH,0 ; MAKE 16-BITS JMP APUSH ; SAVE KEY VALUE ; **************************************** ; * CONSOLE/PRINTER; ; EXIT: REGS. AX, BX AND ES CONTAIN ; RETURNED PARAMETERS. ; ; REGS. SI, BP, FLAGS ARE SAVED. ; ALL SEGMENT REG TEST FOR KEY OR AL,AL ; ANY KEY JZ PQTER1 ; NO MOV AL,1 ; TRUE = CHAR FOUND PQTER1: MOV AH,0 ; MAKE 16-BITS JMP APUSH FOLLOWING I/O ROUTINES ARE SUPPORTED: ; ; CONSOLE INPUT (CSTAT). ; CONSOLE OUTPUT (CHO). ; LIST OUTPUT (LO). ; ; SELECT DIJECT ; *********** ; * --> * ; *********** ; DB 0C3H DB '--' DB '>'+80H DW LOAD-7 ARROW DW DOCOL DW QLOAD INE * ; * * ; ******************************************* ; POUT: CALL CHO ; CONSOLE OUT TEST EPRINT,1 ; PRINT CHARACTER OUTPUT * ; **************************************** ; ; CALLED FROM "EMIT". ; PEMIT DW $+2 ; (EMIT) ORPHAN ISTERS SAVED ; EXCEPT ES. ; BDOSFUNC: PUSHF ; SAVE FLAGS PUSH SI ; SAVE "IP" PUSH BP ; AND "RPP" INT 224 ; SOFTWARE; SAVE STATUS ; ***************************** ; * CONSOLE INPUT ROUTINE * ; ***************************** ; ; WAISK (SDSK). ; SET TRACK (STRK). ; SET SECTOR (SSEC). ; SET DMA OFFSET (SDMAO). ; SET DMA SEGMENT (SDMAS). ; GET SECTOR (GSEC DW ZERO DW INN DW STORE DW BSCR DW BLK DW AT DW OVER DW MODD DW SUBB DW BLK DW PSTOR DW SEMIS EJECT ER ECHO? JZ POUT1 ; OFF CALL LO ; LIST OUTPUT POUT1: RET ; PRINTER ECHO FLAG ; ; VALUE: 0 = OFF, 1 = ON ; EPRIPOP AX ; GET CHAR CALL POUT ; CHAR OUTPUT JMP NEXT EJECT ; ******************************* ; * CRLF TO CONSOLE/PRI INTERRUPT POP BP POP SI POPF RET EJECT ; **************************** ; * EXIT BACK TO CP/M-86 * ; *********TS FOR A KEYBOARD CHARACTER. ; ; CONTROL-P KEY WILL TOGGLE PRINTER ; ECHO FLAG. ; ; CALLED FROM "KEY". ; PKEY: CALL CI ; ). ; PUT SECTOR (PSEC). ; ; ; ; ************************** ; * BDOS FUNCTION CALL * ; ************************** ; ; ************************************** ; * QUERY KEYBOARD FOR KEY PRESSED * ; ************************************** ; NT DB 0,0 EJECT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; ;;; CP/M-86 INTERFACE ROUTINES ;;;  ******************* ; EXIT: MOV DL,0 ; STANDARD ABORT MOV CL,0 ; RESET FUNCTION # JMP BDOSFUNC ; ********************[BX],AL ; FUNC # MOV 1[BX],CX ; PARM. 1 MOV 3[BX],DX ; PARM. 2 MOV DX,BX ; PARM. POINTER MOV CL,50 ; DIRECT CALL JMSAVE CHAR MOV DL,AL MOV CL,5 ; BDOS FUNCTION # CALL BDOSFUNC POP AX RET EJECT ; ********************************* WITH STATUS IN REG AL ; GSEC: MOV AL,13 ; BIOS FUNC. # JMP DCBIOS ; ************************** ; * PUT (WRITE) SECT: MOV AL,3 ; 'CONIN' FUNC CALL DCBIOS ; CALL BIOS RET EJECT ; ********************** ; * CONSOLE OUTPUT * ; *****TOR * ; ****************** ; SSEC: MOV AL,11 ; BIOS FUNC. # JMP DCBIOS ; ********************** ; * SET DMA OFFSE******* ; * GET KEYBOARD STATUS * ; *************************** ; ; RETURNS KEYBOARD STATUS ; ; *** USES DIRECT CALL TP BDOSFUNC ; ...DO-IT... ; THE FOLLOWING IS A SCRATCH AREA FOR ; STORING THE FUNCTION # AND PARAMETERS ; DURING A DIRECT  ; * * ; * DIRECT BIOS CALL FUNCTION * ; * * ; ********************************* ; ; ALLOWS DIRECT CALLS (THOR * ; ************************** ; ; EXITS WITH STATUS IN REG AL ; PSEC: MOV AL,14 ; BIOS FUNC. # JMP DCBIOS ;;;;***************** ; ; OUTPUTS CHARACTER IN REG AL ; TO CONSOLE. ; ; EXIT: REG AL = CHARACTER ; CHO: PUSH AX ; SAVE CHAR T * ; ********************** ; ; ENTER DMA OFFSET IN REG CX ; SDMAO: MOV AL,12 ; BIOS FUNC. # JMP DCBIOS ; *******O "BIOS" *** ; (THROUGH THE "BDOS") ; ; EXIT: REG AX = 0 IF NO KEY PRESSED ; REG AX = NON-ZERO IF KEY PRESSED ; CSTAT:BIOS CALL. ; BIOSPAR RB 5 ; ******************* ; * SELECT DISK * ; ******************* ; ; ENTER DISK NUMBER IN ROUGH 'BDOS') ; TO THE 'BIOS' PROGRAM. ; ; ENTER: REG AL = BIOS FUNCTION NO. ; " CX = PARAMETER 1 ; " DX = PARAMETER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; END OF CP/M-86 I/O INTERFACE ; ; ; ;;;;;;;;;;;;;;;;; MOV DL,AL MOV CL,6 ; BDOS FUNCTION # CALL BDOSFUNC POP AX RET ; ******************* ; * LIST OUTPUT * ; ******************** ; * SET DMA SEGMENT * ; *********************** ; ; ENTER DMA SEGMENT IN REG CX ; SDMAS: MOV AL,17 ;  MOV AL,2 ; 'CONST' FUNCTION CALL DCBIOS ; DIRECT BIOS CALL RET ; ********************* ; * CONSOLE INPUT * ; ***REG CL. ; SDSK: MOV AL,9 ; BIOS FUNCTION NO. JMP DCBIOS ; ***************** ; * SET TRACK * ; ***************** 2 ; ; NOTE: THE ABOVE PARAMETERS ARE OPTIONAL ; DEPENDING UPON THE FUNCTION CALLED. ; DCBIOS: MOV BX,OFFSET BIOSPAR MOV ;;;;;;;;;;;;;;;;;;;;;;; EJECT ; ********* ; * ' * ; ********* ; DB 0C1H DB 0A7H DW ARROW-6 TICK DW DOCOL DW*************** ; ; OUTPUTS CHARACTER IN REG AL ; TO LIST DEVICE (PRINTER). ; ; EXIT: REG AL = CHARACTER ; LO: PUSH AX ; BIOS FUNC. # JMP DCBIOS ; ************************* ; * GET (READ) SECTOR * ; ************************* ; ; EXITS****************** ; ; WAITS FOR KEY FROM KEYBOARD ; ; *** USES DIRECT CALL TO "BIOS" *** ; (THROUGH THE "BDOS") ; CI; ; ENTER TRACK NUMBER IN REG CL. ; STRK: MOV AL,10 ; BIOS FUNC # JMP DCBIOS EJECT ; ****************** ; * SET SEC  DFIND DW ZEQU DW ZERO DW QERR DW DROP DW LITER DW SEMIS ; ************** ; * FORGET * ; ************** ; * UNTIL * ; ************* ; DB 0C5H DB 'UNTI' DB 'L'+80H DW PLOOP-8 UNTIL DW DOCOL DW ONE DW QPAIR DW C********* ; DB 0C2H DB 'D' DB 'O'+80H DW THEN-7 DO DW DOCOL DW COMP DW XDO DW HERE DW THREE DW SEMIS ; ; * WHILE * ; ************* ; DB 0C5H DB 'WHIL' DB 'E'+80H DW ELSEE-7 WHILE DW DOCOL DW IFF DW TWOP DW SEMI***** ; DB 0C5H DB 'BEGI' DB 'N'+80H DW BACK-7 BEGIN DW DOCOL DW QCOMP DW HERE DW ONE DW SEMIS ; ********N DW FROMR DW FROMR DW TWO DW SUBB DW ENDIFF DW SEMIS ; ********** ; * IF * ; ********** ; DB 0C2H D ; DB 86H DB 'FORGE' DB 'T'+80H DW TICK-4 FORG DW DOCOL DW CURR DW AT DW CONT DW AT DW SUBB DW LIT,18H DOMP DW ZBRAN DW BACK DW SEMIS ; *********** ; * END * ; *********** ; DB 0C3H DB 'EN' DB 'D'+80H DW UN************ ; * LOOP * ; ************ ; DB 0C4H DB 'LOO' DB 'P'+80H DW DO-5 LOOPC DW DOCOL DW THREE DW QPAIS EJECT ; ************** ; * SPACES * ; ************** ; DB 86H DB 'SPACE' DB 'S'+80H DW WHILE-8 SPACS DW D***** ; * ENDIF * ; ************* ; DB 0C5H DB 'ENDI' DB 'F'+80H DW BEGIN-8 ENDIFF DW DOCOL DW QCOMP DW TWO B 'I' DB 'F'+80H DW REPEA-9 IFF DW DOCOL DW COMP DW ZBRAN DW HERE DW ZERO DW COMMA DW TWO DW SEMIS EJECT W QERR DW TICK DW DUP DW FENCE DW AT DW LESS DW LIT,15H DW QERR DW DUP DW NFA DW DP DW STORE DW LFA DWTIL-8 ENDD DW DOCOL DW UNTIL DW SEMIS EJECT ; ************* ; * AGAIN * ; ************* ; DB 0C5H DB 'AGAI'R DW COMP DW XLOOP DW BACK DW SEMIS EJECT ; ************* ; * +LOOP * ; ************* ; DB 0C5H DB '+LOOOCOL DW ZERO DW MAX DW DDUP DW ZBRAN ; IF DW OFFSET SPAX1-$ DW ZERO DW XDO ; DO SPAX2 DW SPACE DW XLOOP ; LOOP  DW QPAIR DW HERE DW OVER DW SUBB DW SWAP DW STORE DW SEMIS EJECT ; ************ ; * THEN * ; ********** ; ************ ; * ELSE * ; ************ ; DB 0C4H DB 'ELS' DB 'E'+80H DW IFF-5 ELSEE DW DOCOL DW TWO DW QP AT DW CONT DW AT DW STORE DW SEMIS EJECT ; ************ ; * BACK * ; ************ ; DB 84H DB 'BAC' D DB 'N'+80H DW ENDD-6 AGAIN DW DOCOL DW ONE DW QPAIR DW COMP DW BRAN DW BACK DW SEMIS ; ************** ; ' DB 'P'+80H DW LOOPC-7 PLOOP DW DOCOL DW THREE DW QPAIR DW COMP DW XPLOO DW BACK DW SEMIS ; *************ENDIF DW OFFSET SPAX2-$ SPAX1 DW SEMIS ; ********** ; * <# * ; ********** ; DB 82H DB '<' DB '#'+80H DW S** ; DB 0C4H DB 'THE' DB 'N'+80H DW ENDIFF-8 THEN DW DOCOL DW ENDIFF DW SEMIS ; ********** ; * DO * ; *AIR DW COMP DW BRAN DW HERE DW ZERO DW COMMA DW SWAP DW TWO DW ENDIFF DW TWO DW SEMIS ; ************* B 'K'+80H DW FORG-9 BACK DW DOCOL DW HERE DW SUBB DW COMMA DW SEMIS ; ************* ; * BEGIN * ; ********* REPEAT * ; ************** ; DB 0C6H DB 'REPEA' DB 'T'+80H DW AGAIN-8 REPEA DW DOCOL DW TOR DW TOR DW AGAI PACS-9 BDIGS DW DOCOL DW PAD DW HLD DW STORE DW SEMIS ; ********** ; * #> * ; ********** ; DB 82H DB '# ; ********* ; * ? * ; ********* ; DB 81H DB '?'+80H DW DOT-4 QUES DW DOCOL DW AT DW DOT DW SEMIS ; EDIGS DW FROMR DW OVER DW SUBB DW SPACS DW TYPES DW SEMIS ; ********** ; * .R * ; ********** ; DB 82H1 DW CR,IDO DW LIT,3 DW DOTR,SPACE DW IDO,SCR DW AT,DLINE DW QTERM ; ?TERMINAL DW ZBRAN DW OFFSET LIST2-$ ; IF W ZBRAN ; IF DW OFFSET DIG1-$ DW LIT,7 DW PLUS ; ENDIF DIG1 DW LIT,30H DW PLUS DW HOLD DW SEMIS ; ********** W LFA DW AT DW DUP DW ZEQU DW QTERM DW ORR DW ZBRAN ; UNTIL DW OFFSET VLIS1-$ DW DROP DW SEMIS ; ********' DB '>'+80H DW BDIGS-5 EDIGS DW DOCOL DW DROP DW DROP DW HLD DW AT DW PAD DW OVER DW SUBB DW SEMIS EJECT ********** ; * U. * ; ********** ; DB 82H DB 'U' DB '.'+80H DW QUES-4 UDOT DW DOCOL DW ZERO DW DDOT DW SE DB '.' DB 'R'+80H DW DDOTR-6 DOTR DW DOCOL DW TOR DW STOD DW FROMR DW DDOTR DW SEMIS EJECT ; ********** DW LEAVE ; LEAVE LIST2 DW XLOOP DW OFFSET LIST1-$ ; ENDIF DW CR,SEMIS ; ************* ; * INDEX * ; ***********; * #S * ; ********** ; DB 82H DB '#' DB 'S'+80H DW DIG-4 DIGS DW DOCOL DIGS1 DW DIG ; BEGIN DW OVER DW OVER*** ; * BYE * ; *********** ; ; EXIT TO CP/M OR YOUR MONITOR ; DB 83H ; BYE DB 'BY' DB 'E'+80H DW VLIST-8 BYE  ; ************ ; * SIGN * ; ************ ; DB 84H DB 'SIG' DB 'N'+80H DW EDIGS-5 SIGN DW DOCOL DW ROT DWMIS EJECT ; ************* ; * VLIST * ; ************* ; DB 85H DB 'VLIS' DB 'T'+80H DW UDOT-5 VLIST DW DOCO; * D. * ; ********** ; DB 82H DB 'D' DB '.'+80H DW DOTR-5 DDOT DW DOCOL DW ZERO DW DDOTR DW SPACE DW SEM** ; DB 85H DB 'INDE' DB 'X'+80H DW LISTC-7 INDEX DW DOCOL DW LIT,FF DW EMIT,CR DW ONEP,SWAP DW XDO INDE1 DW  DW ORR DW ZEQU DW ZBRAN ; UNTIL DW OFFSET DIGS1-$ DW SEMIS ; *********** ; * D.R * ; *********** ; DB 8DW $+2 JMP EXIT ; BACK TO SYSTEM EJECT ; ************ ; * LIST * ; ************ ; DB 84H DB 'LIS' DB 'T'+80H ZLESS DW ZBRAN ; IF DW OFFSET SIGN1-$ DW LIT,2DH DW HOLD ; ENDIF SIGN1 DW SEMIS ; ********* ; * # * ; *****L DW LIT,80H DW OUTT DW STORE DW CONT DW AT DW AT VLIS1 DW OUTT ; BEGIN DW AT DW CSLL DW GREAT DW ZBRAN ; IIS ; ********* ; * . * ; ********* ; DB 81H DB '.'+80H DW DDOT-5 DOT DW DOCOL DW STOD DW DDOT DW SEMIS CR,IDO DW LIT,3 DW DOTR,SPACE DW ZERO,IDO DW DLINE,QTERM DW ZBRAN DW OFFSET INDE2-$ DW LEAVE INDE2 DW XLOOP DW 3H DB 'D.' DB 'R'+80H DW DIGS-5 DDOTR DW DOCOL DW TOR DW SWAP DW OVER DW DABS DW BDIGS DW DIGS DW SIGN DW DW BYE-6 LISTC DW DOCOL,DECA DW CR,DUP DW SCR,STORE DW PDOTQ DB 6,'SCR # ' DW DOT DW LIT,10H DW ZERO,XDO LIST**** ; DB 81H DB '#'+80H DW SIGN-7 DIG DW DOCOL DW BASE DW AT DW MSMOD DW ROT DW LIT,9 DW OVER DW LESS DF DW OFFSET VLIS2-$ DW CR DW ZERO DW OUTT DW STORE ; ENDIF VLIS2 DW DUP DW IDDOT DW SPACE DW SPACE DW PFA D OFFSET INDE1-$ DW SEMIS EJECT ; ************* ; * TRIAD * ; ************* ; DB 85H DB 'TRIA' DB 'D'+80H DWODS AL ; GET NEXT BYTE CMP AL,[BX] ; MATCH? JZ MAT2 ; YES, GET MORE EJECT ; NO MATCH YET. POP SI POP CX POP BX ;  MOV DI,SI ; SAVE IP POP CX ; STRING COUNT POP BX ; STRING ADDR POP DX ; BYTES LEFT TO SEARCH POP SI ; CURSOR ADDR PUSOUNT OF ; MEMORY NEEDED IN THIS PROGRAM. ; ORG EM-1 ; LAST MEMORY ADDR-1 DB 0 ; LAST LOCATION END E DW LIT,22H DW PORIG,TAT DW DDOT DW BASE,STORE DW SEMIS EJECT ; ***************************************** ; * "TASK" * ; * * ; ******************************** ; ; DB 84H ; TASK DB 'TAS' DB 'K'+80H INDEX-8 TRIAD DW DOCOL DW LIT,FF DW EMIT DW LIT,3 DW SLASH DW LIT,3 DW STAR DW LIT,3 DW OVER,PLUS DW SWAP,XDRESTORE POINTERS MAT3: DEC DX ; BYTE LEFT COUNT -1 JNZ MAT1 ; START OVER JMP MAT4 ; EXIT...NO MATCH MATCHOK: NOMATCH: H SI ; SAVE COPY ; MAT1: LODS AL ; GET FIRST BYTE CMP AL,[BX] ; MATCH? JNZ MAT3 ; NO PUSH BX ; SAVE STRING ADDR PUSH C * ; * CODE LEVEL "MATCH" DEFINITION * ; * * ; ***************************************** ; ; STACK PARA DW MATCH-8 TASK DW DOCOL DW SEMIS ; INITDP EQU $ ; SHOW END OF DICT. ; THE REMAINNING MEMORY (UP TO 'EM') IS ; UO TRIA1 DW CR,IDO DW LISTC DW QTERM ; ?TERMINAL DW ZBRAN DW OFFSET TRIA2-$ ; IF DW LEAVE ; LEAVE TRIA2 DW XLOOP ; POP CX ; ADJUST STACK POP CX ; FOR EXIT... POP CX ; EXIT HERE: DX = TRUE/FALSE FLAG (0=NO MATCH) ; MAT4: MOV AX,SI ; X ; & STRING COUNT PUSH SI ; & CURSOR ADDR ; TRY TO MATCH REMAINNING CHARACTERS IN STRING ; MAT2: DEC CX ; STR COUNMETERS: ; ; ( cursor:addr byte:left str:addr str:len ; --- flag new:cursor:offset) ; ; This version of MATCH will SED FOR: ; ; 1. EXTENSION DICTIONARY ; 2. PARAMETER STACK ; 3. TERMINAL INPUT BUFFER ; 4. RETURN STACK ; 5. USER VARIABLE  ENDIF DW OFFSET TRIA1-$ DW CR DW LIT,15 DW MESS,CR DW SEMIS ; ************ ; * .CPU * ; ************ ; ;NEW CURSOR ADDR POP SI ; GET STARTING ADDR SUB AX,SI ; COMPUTE CURSOR OFFSET MOV SI,DI ; GET BACK IP JMP DPUSH ; BYE...BT -1 JZ MATCHOK ; EXIT...MATCH FOUND DEC DX ; BYTES LEFT -1 JZ NOMATCH ; EXIT...NO MATCH INC BX ; NEXT STR CHAR ADDR Lhandle string lengths ; up to 65335 bytes in length. ; DB 85H ; MATCH DB 'MATC' DB 'H'+80H DW DOTCPU-7 MATCH DW $+2 AREA ; 6. DISK BUFFERS ; ; ; THE FOLLOWING ZERO BYTE IS NEEDED ; IN CP/M-86 TO TELL THE 'GENCMD' ; ROUTINE THE MAXIMUM AM PRINT CPU TYPE (8086) ; DB 84H DB '.CP' DB 'U'+80H DW TRIAD-8 DOTCPU DW DOCOL DW BASE,AT DW LIT,36 DW BASE,STORYE EJECT ; ******************************** ; * * ; * LAST DICTIONARY WORD * ; * * ; *  893F73 :1B02CB815445524D494E41CCBE02D702E975128243D2C902E102E99712854313 :1B02E6814D4F56C5DA02EE02FC8BDE595F5E8CD88EC0F3A48BF3962FF8544494749D4ED0103025A582C3072173C0976062C68 :1B020E81073C0A720D3AC273092BD28AD0B001E93AFF2BC0E936FF86284649A0 :1B02298149681045B580107E9BEFC86544F47474CC59004A904585B3007E9ACFC8163 :1B04B181C09E04B6045B8B07E99FFC8243C0B004C3045B8A072AE4E990FC8231 00000009C502EA12A010BC0AC :1B013681741B3DFFFF74123BC6740E77102EA12C010BC074083BC67204589D24 :1B015181EB02589DAD8BD8EB055250AD852BEB703CE038B46004545E985FD81D2C74F :1B03D98103F3018230BDD603E303580BC0B80100740148E96CFD8230BCDC032B :1B03F481F603580BC0B801E95DFE82559C :1B030181AAE4020603585BF7E392E94CFE8255AFFF0215035B5A583BD3730543 :1B031C81F7F3E939FEB8FFFF8BD0E931FE83414EC40E03E44A9F90130028CD88EC05B598BF98A078AD03205243F751843474C :1B0244818A07320502C0750E73F483C30553B801002AF6E900FF4372078A07FE :1B0 :1B04CC8132C0BC04D2045B8B078B5702E97FFC81A1CB04E1045B588907E97461 :1B04E781FC8243A1DB04EF045B588807E966FC8232A1E804FD045B58890BD88BD342FF27834C49D400006C015F :1B016C81ADE9EBFF87455845435554C564017C015BE9DFFF864252414E43C8A5 :1B01878170018B010334E9CCFF800780148E959FD81ABEF030804585B03C3E94CFDC3 :1B040F818244AB02041604585A5B5903D113C3E939FD854D494E55D30F042BC2 :1B042A810458F7D83103585B23C3E92352 :1B033781FE824FD229033F03585B0BC3E915FE83584FD238034E03585B33C36D :1B035281E906FE835350C046035D038BC4E9F9FD25F8102C0E9F6FF8B1F0BDB75CCB80000E9EBFE87454E434C4F53C52502D1 :1B027A817C02585B53B400BAFFFF4B43423A0774FA523A2775068BC242E9C40F758DB :1B050281894702E954FCC1BAF6042005BD087808B606B404A806DF04860D4299 :1B051D81099509424D4D8976008BF2E931FCC1BB08052005E70817304252414E43C880019C01580BC074EA462A :1B01A28146E9B6FF86284C4F4F50A99001B101BB0100015E008B46002B4602AA :1B01BD8133C378CA83C50E92AFD86444D494E55D321043C045B592BC08BD02BD11BAF :1B044581C3E911FD844F5645D2310452045A5850E902FD8444524FD0490461C5 :1B04608104835350A155036A032E8B1E02 :1B036D8126018B6706E9E7FD835250C062037D038BC5E9D9FD835250A17503F1 :1B0388818A032E8B1E26018B6F08E9C7FD :1B029581FE43423A0774093A2775F68BC2E9B5FE8BC240E9AFFE84454D49D481 :1B02B081700220057215A505830695049A03834B45D9AB02C602E99412E099A035775 :1B0538810934099A03844E4F4FD02B0520059A0388434F4E5354414ED43D055E :1B0553812005860D57093F079509428BDA8B07E9F6FB88544646E993FF87282B4C4F4F50A9A601D5015BE9DBC2 :1B01D881FF8428444FA9C901E2015A5887EC505287ECE96FFF81C9D901F3014E :1B01F3818B4600E58E9F7FC84535741D058046E045A58E9E7FC834455D065047B0469 :1B047B815850E9DBFC84324455D073048904585A5250E9CAFC822BA1800497EE :1B04:0400000300000100F8 :1B01008190E9920E90E9790E0100000E001A5F00A03B003BA03B003B20000076 :1B011B81000B1A0B1AFF0E050026B3A03BA03B0823BD382039C038B76004545E9B8BF :1B03A381FD854C454156C59503AE038B4600894602E9A5FD823ED2A403BE03DF :1B03BE815B4D4D895E00E995FD82 641524941424CC5AF :1B056E8148052005530595094252E9E1FB84555345D265052005530595094226 :1B0589818BDA8A1F2AFF2E8B3E26018D01E9C2FB87F005004C10479079A01F0FF6C00 :1B081181045F049A03864C41544553D4EF072005B606B404B4049A03834C467B :1B082C81C1160820056A01040060070437 :1B0739819A0381AC2B0720052307DF04AD0533079A038243AC3B07200523076B :1B075481ED04A50533079A0381AD4B0762075A582BC2E9F2F981BDC031F086308DF9D :1B09DC8104950987EC5687EC428BDA8B37424252E96DF785434F554ED4CB09B3 :1B09F7812005790407076C04C1049A0384545950C5E68805140083424CCB5B06880516008249CE6A0688051814 :1B067C8100834F55D4740688051A00835343D27D0688051C00864F46465345B6 :1B069781D488120057006B404E1036A0116008B089A0387434F4D50494CC5F908203E :1B091F8105A508CC0379041407BC03B4043F079A03C1DB140920059D05C20681 :1B07B055D05000081B1996F :1B05A481055D05010081B2A1055D05020081B3A9055D0503008242CCB1055D2C :1B05BF8105200083432FCCB9055D05400089A03834346C129082005AD0560079A03E0 :1B084781834E46C1390820056A01050060076A01FFFFFA079A03835046C147D8 :1B086281082005A505FA076A5C07200575 :1B076F816007E1039A0381BC69077B075A588BDA33D878022BC20BC0B80000CB :1B078A81790140E9CBF98255BC7507200587044C03F4039AF092005E3079A011800E2 :1B0A1281500406046C04E001F101C104B202AF01F8FF890104005F049A038970 :1B0A2D812D545241494C494EC7030A200579070688051E0087434F4E544558D491068805200087435552524543 :1B06B2814ED49E06880522008553544154C5AC068805240084424153C5BA066F :1B06C1B093A81DF049A0381DD300920056A01C000C206DF049A0386534D554447C5A7 :1B0955813E0920051F086A012000A7049A03834845D84E0920056A011000C546495253D4C2055D05E03B854CB8 :1B05DA81494D49D4CC055D05004085422F4255C6D8055D05800085422F5343C1 :1B05F581D2E4055D050800872B4F501050006049A0384214353D05D0820055B03EB2D :1B087D8106DF049A03863F4552524FD2710820056C049A0108001A0D89010424 :1B089881005F049A03010C005F04F40366 :1B07A581E103890106006007F4039A0381BE900720056C0479079A0383524F9D :1B07C081D4B107C5075A5B5853E98EF9855350414349D05E001500450040604A50598 :1B0A48816007C104BE0560079A010800AC0389010600A5056007AF01E0FF9AA0 :1B0A63810384282E22A92C0A2005DA0D8188052600834450CCC6068805280083464CC4D10688052A00834353FA :1B06E881D0DB0688052C008252A3E50688052E0083484CC4EF068805300082E0 DF4 :1B09708106DF049A0387444543494D41CC630920056A010A00CD06DF049A0316 :1B098B8187283B434F4445A975092005CC031F0863083F08DF049A02494749CEF00520056A01000106049A031E :1B0610818253B0FC05880506008252B0100688050800835449C2190688050A6E :1B062B81008557494454C82853F434F4DD082082005C206B404E1036A0111008B082F :1B08B3819A03853F455845C39D082005C206B4046A0112008B089A03863F5097 :1B08CE814149C5BD072005BE05B2029A0A :1B07DB8103842D4455D0CC07200579049A01040079049A0388545241564552DB :1B07F68153C5DC0720056C04500406046A013F70979040707CC030604BC030A0A9A46 :1B0A7E8103C22EA2640A20056A012200C206B4049A0114001E096B0AEC0B2342 :1B0A998107C10407073307890:1B07038131ABF8062005A50506049A038232AB02072005AD0506049A03844858 :1B071E814552C50F0720055706B4049A0385414C4C4FD41C0720055706953C53B4314 :1B09A6814F44C58B092005E7081E099509340944059A03873C4255494C44D3C7 :1B09C181A30920059D0553059A0385444F4553BEB9092005C20688050C00875741524E494EC72C0688050E0003 :1B0646818546454E43C53806880510008244D046068805120088564F432D4C6D :1B066181494ECB52052D3B508200560076A0113008B089A03843F4353D0CB082005C7 :1B08E9815B03EB06B40460076A0114008B089A03883F4C4F4144494EC7E00829 :1B0904 10A00EC0B2307F7090A0A9A038645585045434C :1B0AB481D47F0A2005500406045004E001C40279046A010E000606B4046D079D :1B0ACF819A012A005F008007906B4046C04320F834944AE120D2005D90B6A01200018 :1B0D57816A015F008A0B790463082F0850046007D90B6C04EC02D90BF7096A37 :1B0D72819504CC038901C6FFCC039A0300 :1B0C7F81864E554D4245D2320C20059D059D05C30779040707C1046A012D00B1 :1B0C9A816D077904BC0306046A01FFFFE2005A806B404B606DF049A03C1A8030F2000 :1B0F2281056A012900EC0B9A0384515549D41D0F20059D057006DF04340988AE :1B0F3D8103DF02330B6206C :1B0BA7819A0386424C414E4BD3990B2005BE058A0B9A0384484F4CC4A90B2097 :1B0BC281056A01FFFFFE069504FE06B404ED049A03835041C4BA0B203076A01800030 :1B0E4A81060495076A0107008B089A0389494E544552505245D4290E2005E0C2 :1B0E65810C9A011E00C206B40479079A010A003F083F047904F1016D077904CC03AD0560070604BC039A010AAD :1B0AEA81006A010700890106006A0108008901280079046A010D006D079A0145 :1B0B05810E00A011F002F030A0AD4079A03864352454154C5490D2005E00C9A01103B :1B0D8D81005F044D084F0D6A0104007F11D40723077904C1043406B404581016 :1BD706DF043D0C7904C104BE0560079A8C :1B0CB5810116007904C1046A012E0060079D058B089D058901DCFF5F04CC03DC :1B0CD0819A0104003A049A0385EC206B404E1039A0107006B0A024F4B8901E7FF857A :1B0F588141424F52D42B0F200568037F09320EDF02A7196B0A0D4669672D46C7 :1B0F73816F7274605230756 :1B0BDD816A01440006049A0384574F52C4D30B20057006B4049A010C00700698 :1B0BF881B4043F13890106002806B4047906B40406046C047A7890106003F087A01A8 :1B0E8081320E89011C002307880CD706B40407079A010800170E890106005FD8 :1B0E9B8104FA0D320E8901C2FF89494D4D45444C035F04BE059D05890104007904F101ED049D05F1010707DF60 :1B0B208104B202AF019CFF5F049A038551554552D9AE0A20052806B4046A016D :1B0B3B80DA8810707330779046A01A000A7042307A50560076A018000A7041F083FFD :1B0DC38107B606B404DF04230714073F079A03C95B434F4D50494C45DD7D0D72D46494EC47F0C2005BE05EC0B2307A806B4C5 :1B0CEB8104B4042E027904E1039A010A005F0423071F082E029A0387284142C8 :1B0D06814F5254A9D80C820312E30F90E110F320FBE870FE9D5F1900F84574152CD31 :1B0F8E81570F2005AE125F0FBEAF0F8CC88ED82E8B2612018ED08EC0FC2E8B85 :1B0FA98120223076A0122FD :1B0C138100B20B7906950450046007BC03DA032307ED04060423070707CC03ED :1B0C2E81EC029A0388284E554D424552A9E50B20050794154C5560E20051F086A0172 :1B0EB6814000A7049A038A564F434142554C4152D9A40E2005C3096A0181A0E7 :1B0ED1813F07B606B4043F083F072307615000B70A9D057906DF049A03C1802B0B20057006B4049A012A00A538 :1B0B568105700695049D057906DF047006B404F805A50560072F03E1039A01FE :1A :1B0DDE812005E00CE1039D058B085F043F083F079A03C74C4954455241CCD29C :1B0DF9810D2005C206B4049A0108001E096A013F079A03C8444C4954420055F0F9A03854552524FD2020D20054206B404F4E8 :1B0D2181039A0104000C0D2307F7090A0A6B0A023F207F1168037006B404E35B :1B0D3C81079A01E2801E9ADF1B80F84434F4CC4890F2005AE129D054312DF04D405B1 :1B0FC4811012DF04D4051B12DF04C2126A0100006A019715DF046A0112016A82 :1B0077904BC03C104CD0686 :1B0C4981B40401029A012C006C04CD06B40404035F04C307CD06B404040314B8 :1B0C648104D706B40407079A010800A505D706606B4043F076606DF04D3091407A8BC :1B0EEC8106DF049A03C5464F5254C8BC0EDF09E90E81A0001A00008B444546DE :1B0F0781494E4954494F4ED3F10B0B71810800BD08CC035F0489010600CC035F049A038446494CCC470B8C0B76 :1B0B8C8158595F8CDB8EC3FCF3AAE9C3F58545524153C5830B20059D058A0B55241C7 :1B0E1481CCF00D2005C206B4049A0108006C04FA0DFA0D9A03863F5354414326 :1B0E2F81CB0C0E20055B031506B4046C049507A5058B085B032 FDF81012601B4046A01060006046A011000EC026A010C01B4046A01FF0E0A :1B0FFA81DF045F0F84532D3EC4B10F07105A2BC00BD2790148E948F1822BADCD550A7 :1B128281444154C5581220051B12B404B4046A0100803D031B12B404DF049A79 :1B129D81038D454D5054592D425546464552D37F122005D405E0062189A03835043C07511BA115AEC2AE4E99AEF835043A144 :1B11C581B211C9115A58EEE98DEF8250C0C111D6115AEDE980EF8250A1CF11AF :1B11E081E2D81D3100612DF040707FA11DF049A03885345432D524541C4DB136814F6 :1B146881E88E01B4002EA35612E9E8EC895345432D57524954C55B148214E83E 102005D3106C045F049A03DB :1B10ED81834D4FC4DF102005D3105F049A03852A2F4D4FC4ED102005BC0383EB :1B11088110CC039E109A03822AAFFB10209040604E1039A01D6FF79041B12DF04CCC8 :1B139081035F0414079A03865345542D49CF3713A2132E8B0E1212E845028C47 :1B13AB81C9E845022E8B0EF :1B101581FE0F2005F4039A01040029049A0383442BAD12102005F4039A010431 :1B103081003A049A03834142D323102005790417109A0384444142D335550046007AD :1B12B881A10B9A03834452B09E1220059D059A06DF049A03834452B1BC122039 :1B12D381054312B4049A010A006A01A40F890106006A01D115A58EFE974EF8544524956C5DB1176050000835345C3E8117660 :1B11FB810500008554524143CBF41176050000835553C5FE117605E03B8450F0 :1B12:1B1483817901B4002EA35612E9CEEC83522FD7741420051012B404BC036C0432 :1B149E812912C410C3071012DF0429129D05E00150045004E513A0139A010503116C045F049A03854D2F4D4F75 :1B112381C40F112005BC039D05DA031303CC036C04BC031303CC039A038628A5 :1B113E814C494E45A91E112005BCC11E833022E8B0E0812E82602E99AED89534554E7 :1B13C6812D44524956C59713D0132E8B0EF211E80802E981ED875426534341EC :1B13E1814CC3C2132102054 :1B104B8105790429109A03834D49CE431020058704B5079A0104006C045F0499 :1B1066819A03834D41D852102005870479079A0104006C045F042079A06DF049A03B6 :1B12EE81864255464645D2CC1220051012B4047904BC035F129A01FCFF101262 :1B130981DF04DA03B404F4039A011400DA031407D16815245D60A127605E03B875345432F424CCB14125D050100852342556B :1B12318146C61F125D0508008744454E534954D92D12760500008A4449534BE4 0820 :1B14B98100661489010400801407076A01800010129504AF01E0FF5F045F04F2 :1B14D481CC031012DF049A0385464C5553C88E142005351207079D036A014000EC050311CC03F805C4100604D7 :1B1159813F1306046A0140009A03852E4C494EC53C1120054511380A0A0A9A43 :1B11748103874D455353410054312B4049A0138006A01A40FD3106A01020058107938 :1B13FC8104F011B4046D079A0108005F0489010800F011DF04CE136A01340028 :1B141781D319A03824DAA4E :1B1081816810200587044C03BC033B106C043B100403CC0329109A03824DAF6D :1B109C817E1020055004BC03BC034A10DA033B101303CCA03B4046A01FF7F2F039DE5 :1B132481059414DA03DF04DA031B12DF04CC0314079A0385424C4F43CBEE12DC :1B133F8120059A06B4040604BC031B12B40 :1B124C812D4552524FD2391276050000842B4255C6471220056A018400060486 :1B1267817904E0056D079A0106005F04D40579041B12B40460079A0386505E0019D48 :1B14EF8105F7125F04AF01F8FF9A03844C4F41C4DC1420057006B404BC03790D :1B150A8106B404BC039D057906DF04F805C4107006DF046247C5631120054206B4049A011E00E3079A011400E5 :1B118F816A0104009A06B404F805E31060076B11D40789010D006B0A064D539D :1B11AA814720232000612DF040707FA11DF049A036A01D207D3106A0102005810794D :1B14328104F011B4046D079A0108005F0489010800F011DF04CE136A011A000B :1B14403DA034C0317106C0D :1B10B78104CC0317106C049A0381AA9910200583105F049A03842F4D4FC4C037 :1B10D281102005BC030510CC039E109A0381AFCC47904B404DA036007790406049A4D :1B135A810134005F12E1039A0114005F04DA03F7127904DA03A5059414AD0517 :1B13758160077904B404DA0360077 0ECC037906DF04F9 :1B152581CC037006DF049A03C32D2DBEFA14200504099D057906DF04F80570D9 :1B15408106B4045004F3106007700695049A03E8574534947CEA972 :1B17C681172005C307F4039A0108006A012D00C10B9A0381A3C0172005CD06F3 :1B17E181B4042611C3076A010900500479079A01080069A015D169A03C3454EC4DE162005E6169A03C541474149CEF416201A :1B17098105A505D4081E0989015D169A03C65245504541D400172005BC03BC3A :1B :1B19918101F0FFDF026A010F007F11DF029A03842E4350D55A192005CD06B428 :1B19AC81046A012400CD06DF046A0122000606D0045418CD06DF049A03B606B404A806B40460076A0118008BDB :1B16318108071679044E06B40479076A0115008B0879044D085706DF042F0893 :1B164C81B404A806B404DF049A103D5023D039A01D4FF5F049A03834259C58318D56B :1B18D48118E9CAFC844C4953D4CD1820057F09DF0279048D06DF046B0A06533D :1B18EF814352202000AC07402B001B400E91A :1B155B81FEEBE84F003C1075092E8036971501E9F0FFB400E9E9EB741558E867 :1B1576811000E9E1EBB00DE80800B00AE803A01070006046A0130B1 :1B17FC81000604C10B9A038223D3D9172005DD17500450043D03E1039A01F402 :1B181781FF9A0383442ED203182005BC036C045172481030817CC03CC03AD05600781169A03C249C6161720051E099A012314 :1B173F81079D053F07AD059A03C4454C53C533172005AD05D4081E098901239854D58 :1B19C781415443C8A019CF198BFE595B5A5E56AC3A0775125351564974124A71 :1B19E281740F43AC3A0774F45E595B4A75E6E903005959598BC60384424143CB17162005230760073F079A0389 :1B166781C542454749CE56162005A5082307A5059A03C5454E4449C667162046 :1B16828105A508AD05D432062186A0110009D05E001DF02F1016A0103004318D40776 :1B190A81F1018D06B4046B11D5029A010400AC03AF01E2FFDF029A0385494E38 :1B192581400E9D4EBE82A002EF60697150131 :1B1591817403E82900C300009C5655CDE05D5E9DC3B200B100E9F0FFB002E88F :1B15AC811B00C3B003E81500C3508A0044A109F170818C717AE173C :1B183281CC035004600782170A0A9A03822ED21A182005BC030510CC03201892 :1B184D819A038244AE3E1820059D052012 :1B175A81079D053F076C04AD058116AD059A03C55748494CC54817200538176B :1B17758114079A03865350414345D3691720059D056E10E3079A010C05E2BC68BF77E :0E19FD81E95AE784544153CBC51920059A035A :013FFF810040 :00000001FF 016B11D5029A010400AC03AF01E4FF9A0385E8 :1B1082307500460076C04DF049A03C4544845CE79162095 :1B169D810581169A03C244CF951620051E09E0012307B5059A03C44C4F4FD0CC :1B16B881A21620445D8D81820056A010C00B202DF0207076C04E001DF02F1016A0107 :1B19408103004318D4079D05F1016B11D5029A010400AC03AF01E4FF9A0385E8 :1B1D0B106E8DCFF58C3508AD0B105E8D2FFFA :1415C78158C3BBDB158807894F018957038BD3B132E9BEFF97 :1B15E081B009E9E4FFB00AE9DFFFB00BE9DAFF8D4079A0381AE4F18200505105418E5 :1B1868819A0381BF5E182005B40462189A038255AE6A1820059D0554189A03C6 :1B18838185564C4953D4761820009D0563 :1B179081E001D407AF01FCFF9A03823CA379172005D90BFE06DF049A03822396 :1B17AB81BE9A1720055F045F04FE06B404D90B500460079A03805B505D4081E09AF015D169A03C52B4C4F4FD0B3162005B5EF :1B16D38105D4081E09D3015D169A03C5554E5449CCC8162005A505D4081E090E :1B16EE8195B8154524941C4221920056A010C00B2026A010300E3106A010300C410CE :1B1976816A010300500406046C04E001DF02F101DF18D5029A010400AC03AF1AB00CE9D5FFB011E9D0FFB00D3D :1B15FB81E9CBFFB00EE9C6FFC1A72D152005E00CE1039D058B085F04FA0D9A5D :1B1616810386464F524745D40316200556A0180008306DF04A806B404B4048306B4CD :1B189E8104C805B5079A010A00DF029D058306DF0479044F0DD407D407630893 :1B18B9812F08B4047904E XGT x B BMMv1  W 4 NOO+ CONSTAN=  W ? BڋVARIABLH S BRUSEUX[LU[ZX;s91AN1X[##O)?X[ XO8NX[3SPF]SPUj.&gRPb}j (;CODEu c?;CODŋ  4 D&{]]]]Ḇ] C/̹]@FIRS];LIMI]@B/BU]B/SC]+ORRPu.&o;ӂvEELEAVŕFF>Ҥ[MM^RFEE0X tHl0X xHTYP Pl_-TRAILIN yPP```(.",  y BRANCp40BRANCȀX tFF(LOOP^F+F3xʃFF(+LOOP[(DOZXPRoFbDIGIjPyl_LATES LF j`CF) `NF9 j`jPFG j!CS] [IGI jSRTI WIDT" WARNIN,FENC8DFVOC-LINRBL[IjOUYX[LDXZ[Y9MINU+X*DMINU!<[Y++OVE1RZXPDROIaXSWAXnZXDUe{XP.d j" k #3 # EXPEC PPyjm*_ymy` jj(yj ZX,0r< v,< r :s +Ҋа:+6(FIND0؎[Y2$?uCG2usS*Cr u̸ENCLOS%|X[S?ERROq l _?COMЂ j?EXEÝ j?PAIRӵ `j?CS [`j?LOADItSC}OFFSEԇCONTEXԑ CURRENԞ"STATŬ$BASź&DP(FL*CS,R.HL2DUsXZRP+[XTOGGLŐX[0[C[*2[W[XtC[Xf2[Xm_y_QUERٮ (jP y+ p*pyp`/__KCB:tR:'uBCB:t :'u@EMIp rKE٫?TERMINA̾uCCMOVY_^؎]N pjCOMPIL y? 0 jSMUDG> j HEN jDECIMAc 01 2 HER WALLO W+ #3C; #3KbZX+\ `i{ZX3 FILG XY_ێERASŃ  BLANKә  HOLĩ jPAĺ #jDWOR p p?RACvUSv;PRE v;SEC/BL]#BUF]DENSIT-vDISK-ERRO9v+BUG jym_y`->ıZ+ yHH+ )D+ :AB# yDAB5 y)MIC l_MAR yl_M #P`lTHEy Dϕ  #LOOТ  ]+LOOг  ]UNTI  ]EN  j?DLITERA l ?STAC  [l[#jjINTERPRE)  y ???zy.VR/t l))PPfj__FLUSȎ 5_LOA(ylz#j" yP`##(NUMBER y,l_UPDATX j=EMPTY-BUFFER P` DR DR C jjBUFFE yh L;l;)M~ PJ;Lll _/MO  l_MO _*/MOAGAI  ]REPEA `I  #?ELS3  #?lWHILH 8SPACE2# _ 2IMMEDIATV j@VOCABULAR٤  j???#f?f FORTȼ  pyypbyp--  ypP`pW tO<u .6tX NUMBE2 yj-myj= y`yj.`_:-FIN  #.y _#._j/BLOC y`y4__y`y`y * l_M/MO l(LINE j@?j@.LIN< E8 MESSAGc i n   O T^ bUj TWARW _Ȏ.&Ў..(COLĉ Cjjjj&jjj j_S-  _ FORGE `jyNyjyMW/BAC #`?BEGIV #ENDIgEATI  _MO j#y4X3yj#`j?#?[COMPILE}  _??LITERA m_j4jjXym_jSEC-REAh.VSEC-WRIT[ VLISv j yO c/y=_BYŃLIS  yk SCR # bjjCkINDE j ljCkTRIA" j jjjPlj.CPZ j$j"TMATCȠY[Z^V:uSQVItJtC:t^Y[JuYYY^+ƋZTAS   ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L