home *** CD-ROM | disk | FTP | other *** search
- ( 8086 Assembler for PC/FORTH 10/31/83 ) ;S Copyright (c) 1982, 1983 Ray Duncan Laboratory Microsystems 4147 Beethoven Street Los Angeles, CA 90066 this file created 29 Jan 1982 modified for PC/FORTH 2.0 10/25/83 ( parameter field display for assembler debugging ) HEX : DIS BASE @ >R ' BEGIN DUP 1+ @ OVER 3 + + NEXT-LINK = 0= WHILE DUP CR HEX 0 <# # # # # #> TYPE 3 SPACES DUP C@ DUP 0 <# # # #> TYPE 3 SPACES 2 BASE ! 0 <# # # # # # # # # #> TYPE 1+ REPEAT HEX 0 <# # # # # #> CR TYPE 3 SPACES ." JMP NEXT" CR R> BASE ! ; ( System messages ) empty stack dictionary full has incorrect address mode is redefined is undefined disk address out of range stack overflow disk error BASE must be DECIMAL missing decimal point PC/FORTH 2.0 Laboratory Microsystems( System messages ) compilation only, use in definition execution only conditionals not paired definition not finished in protected dictionary use only when loading off current editing screen declare vocabulary illegal dimension in array definition negative array index array index too large ( 8086 Assembler messages ) 16 bit register not allowed 8 bit register not allowed address out of range immediate data value not allowed missing source register missing destination register illegal operation illegal operand instruction not implemented illegal destination register illegal source register illegal condition code register mismatch destination address missing ( 8086 Assembler ) FORTH DEFINITIONS : OVERLAY ; CR CR .( Wait ... loading assembler ) CR CR ASSEMBLER DEFINITIONS HEX VARIABLE <#> 0 <#> ! VARIABLE <TD> 0 <TD> ! VARIABLE <TS> 0 <TS> ! VARIABLE <RD> 0 <RD> ! VARIABLE <RS> 0 <RS> ! VARIABLE <W> 0 <W> ! VARIABLE <WD> 0 <WD> ! VARIABLE <OD> 0 <OD> ! VARIABLE <OS> 0 <OS> ! VARIABLE <D> 0 <D> ! VARIABLE <SP> 0 <SP> ! --> ( 8086 Assembler 10/31/83 ) 10 CONSTANT FRMAX# ( max allowed forward references ) VARIABLE FRTABLE FRMAX# 4 * ALLOT 10 CONSTANT LBLMAX# ( max allowed local labels ) VARIABLE LTABLE LBLMAX# 2* ALLOT --> ( 8086 Assembler 03/11/82 ) : FRCHK ( check if any unresolved forward references ) FRMAX# 0 DO I 4 * FRTABLE + @ ABORT" unresolved forward reference" LOOP ; : FRCLR ( initialize forward reference tables ) FRTABLE FRMAX# 4 * ERASE LTABLE LBLMAX# 2* ERASE ; --> ( 8086 Assembler 10/31/83 ) : FRRES ( resolve forward references fr# --- fr# ) FRMAX# 0 DO I 4 * FRTABLE + DUP @ 2 PICK = ( *** ) IF DUP 2+ @ DUP C@ DUP 0E9 = SWAP 0E8 = OR IF DUP 3 + HERE SWAP - SWAP 1+ ! ( 16 bit ) ELSE DUP 2+ HERE SWAP - DUP ABS 07F > 23 ?ERROR SWAP 1+ C! ( 8 bit offset ) THEN 0 SWAP ! ( remove from table ) ELSE DROP THEN LOOP ; --> ( 8086 Assembler 03/11/82 ) : FRADD ( add forward reference to table ) ( fr# --- fr# ) FRMAX# 1+ 0 DO FRMAX# I = ABORT" too many forward references" I 4 * FRTABLE + DUP @ 0= IF 2DUP ! HERE SWAP 2+ ! LEAVE ELSE DROP THEN LOOP ; --> ( 8086 Assembler 03/11/82 ) : !LTABLE ( establish local label address value ) ( fr# --- ) FRRES HERE SWAP DUP + LTABLE + ! ; : @LTABLE ( fetch value of local label, if undefined ) ( add current location to forward ref. table ) ( fr# --- addr ) DUP DUP + LTABLE + @ SWAP OVER 0= IF FRADD 2DROP HERE ELSE DROP THEN ; --> ( 8086 Assembler 10/31/83 ) DECIMAL ( local label definitions local label references ) : 1$: 1 !LTABLE ; : 1$ 1 @LTABLE ; : 2$: 2 !LTABLE ; : 2$ 2 @LTABLE ; : 3$: 3 !LTABLE ; : 3$ 3 @LTABLE ; : 4$: 4 !LTABLE ; : 4$ 4 @LTABLE ; : 5$: 5 !LTABLE ; : 5$ 5 @LTABLE ; : 6$: 6 !LTABLE ; : 6$ 6 @LTABLE ; : 7$: 7 !LTABLE ; : 7$ 7 @LTABLE ; : 8$: 8 !LTABLE ; : 8$ 8 @LTABLE ; : 9$: 9 !LTABLE ; : 9$ 9 @LTABLE ; : 10$: 10 !LTABLE ; : 10$ 10 @LTABLE ; HEX --> ( 8086 Assembler 12/28/83 ) : !<SP> SP@ <SP> ! ; : ?<SP> <SP> @ SP@ - 2- 2/ ; : ERROR ." ? " MESSAGE S0 @ SP! SHOW-ERROR ; : ?ERROR SWAP IF ERROR ELSE DROP THEN ; : OP-ERROR 28 ERROR ; 0 CONSTANT DIRECT 1 CONSTANT IMMED 2 CONSTANT REG8 3 CONSTANT REG16 4 CONSTANT INDEXED 5 CONSTANT SEGREG --> ( 8086 Assembler 12/08/83 ) : DREG CREATE C, C, C, DOES> DUP C@ DUP 0FF = IF DROP ELSE ABS DUP <W> ! <WD> ! THEN 1+ DUP C@ <TD> ! 1+ C@ <RD> ! <#> @ 24 ?ERROR <TD> @ 4 = IF ?<SP> 0> IF <OD> ! THEN THEN ; : SREG CREATE C, C, C, DOES> DUP C@ DUP 0FF = IF DROP ELSE ABS <W> ! THEN 1+ DUP C@ <TS> ! 1+ C@ <RS> ! <TS> @ 4 = IF ?<SP> 0> IF <OS> ! THEN THEN ; --> ( 8086 Assembler ) 0 2 0 SREG AL 0 2 0 DREG AL, 0 3 1 SREG AX 0 3 1 DREG AX, 1 2 0 SREG CL 1 2 0 DREG CL, 1 3 1 SREG CX 1 3 1 DREG CX, 2 2 0 SREG DL 2 2 0 DREG DL, 2 3 1 SREG DX 2 3 1 DREG DX, 3 2 0 SREG BL 3 2 0 DREG BL, 3 3 1 SREG BX 3 3 1 DREG BX, 4 2 0 SREG AH 4 2 0 DREG AH, 4 3 1 SREG SP 4 3 1 DREG SP, 5 2 0 SREG CH 5 2 0 DREG CH, 5 3 1 SREG BP 5 3 1 DREG BP, 6 2 0 SREG DH 6 2 0 DREG DH, 6 3 1 SREG SI 6 3 1 DREG SI, 7 2 0 SREG BH 7 2 0 DREG BH, 7 3 1 SREG DI 7 3 1 DREG DI, 0 5 -1 SREG ES 0 5 -1 DREG ES, 1 5 -1 SREG CS 1 5 -1 DREG CS, 2 5 -1 SREG SS 2 5 -1 DREG SS, 3 5 -1 SREG DS 3 5 -1 DREG DS, --> ( 8086 Assembler ) 0 4 -1 SREG [BX+SI] 0 4 -1 DREG [BX+SI], 1 4 -1 SREG [BX+DI] 1 4 -1 DREG [BX+DI], 2 4 -1 SREG [BP+SI] 2 4 -1 DREG [BP+SI], 3 4 -1 SREG [BP+DI] 3 4 -1 DREG [BP+DI], 4 4 -1 SREG [SI] 4 4 -1 DREG [SI], 5 4 -1 SREG [DI] 5 4 -1 DREG [DI], 6 4 -1 SREG [BP] 6 4 -1 DREG [BP], 7 4 -1 SREG [BX] 7 4 -1 DREG [BX], --> ( 8086 Assembler 12/08/83 ) : ?W <W> @ ; : ?TD <TD> @ ; : ?TS <TS> @ ; : ?RD <RD> @ ; : ?RS <RS> @ ; : ?OD <OD> @ ; : ?OS <OS> @ ; : +D <D> @ 2* + ; : +W <W> @ + ; : +RD <RD> @ + ; : +RS <RS> @ + ; : MOD1 3F AND 040 OR ; : MOD2 3F AND 080 OR ; : MOD3 3F AND 0C0 OR ; : W/B, ?W IF , ELSE C, THEN ; : RESET 0 <#> ! 0 <W> ! 0 <OS> ! 0 <RD> ! 0 <TD> ! 0 <TS> ! 0 <OD> ! 0 <D> ! 0 <WD> ! 0 <RS> ! !<SP> ; : DSET ?TS INDEXED = ABS <D> ! ; : Dt 1 <D> ! ; : ?RD8*+RS ?RD 8 * +RS ; : ?RS8*+RD ?RS 8 * +RD ; --> ( 8086 Assembler ) : OFFSET8, HERE 1+ - DUP ABS 07F > 23 ?ERROR C, ; : OFFSET16, HERE 2+ - , ; : DISP, <D> @ IF ?OS ELSE ?OD THEN DUP IF DUP ABS 07F > IF SWAP MOD2 C, , ELSE SWAP MOD1 C, C, THEN ELSE DROP DUP 7 AND 6 = IF MOD1 C, 0 C, ELSE C, THEN THEN ; : 1MI CREATE C, DOES> C@ C, RESET ; : 2MI CREATE C, DOES> C@ C, OFFSET8, RESET ; : 3MI CREATE C, DOES> C@ +W C, RESET ; --> ( 8086 Assembler ) : 4MI CREATE C, C, DOES> ?TS CASE REG16 OF 1+ C@ +RS C, ENDOF SEGREG OF C@ ?RS 8 * + C, ENDOF OP-ERROR ENDCASE RESET ; : 5MI CREATE C, C, DOES> ?TS CASE DIRECT OF 1+ C@ C, OFFSET16, ENDOF REG16 OF 0FF C, C@ MOD3 +RS C, ENDOF INDEXED OF DSET 0FF C, C@ +RS DISP, ENDOF OP-ERROR ENDCASE RESET ; --> ( 8086 Assembler 02/16/84 ) : 6MI CREATE C, C, DOES> DUP C@ 2 AND IF ?TD ?TS ELSE ?TS ?TD THEN REG16 = ABS <W> ! REG16 = IF 1+ C@ +W C, ELSE C@ +W C, C, THEN RESET ; : 7MI CREATE C, C, C, DOES> ?TS IMMED = IF 1+ DUP 1+ C@ +W C, ?TD CASE REG8 OF C@ MOD3 +RD C, C, ENDOF REG16 OF C@ MOD3 +RD C, , ENDOF INDEXED OF DSET C@ +RD DISP, ?W IF , ELSE C, THEN ENDOF OP-ERROR ENDCASE ELSE DSET C@ +D +W C, ?TD CASE --> ( 8086 Assembler ) REG8 OF ?TS CASE REG8 OF ?RS 8 * +RD MOD3 C, ENDOF INDEXED OF ?RD 8 * +RS DISP, ENDOF OP-ERROR ENDCASE ENDOF REG16 OF ?TS CASE REG16 OF ?RS 8 * +RD MOD3 C, ENDOF INDEXED OF ?RD 8 * +RS DISP, ENDOF OP-ERROR ENDCASE ENDOF INDEXED OF ?TS CASE REG8 OF ?RS 8 * +RD DISP, ENDOF REG16 OF ?RS 8 * +RD DISP, ENDOF OP-ERROR ENDCASE ENDOF OP-ERROR ENDCASE THEN RESET ; --> ( 8086 Assembler ) : 8MI CREATE C, C, DOES> DUP 1+ C@ +W C, ?TS CASE REG8 OF C@ +RS MOD3 C, ENDOF REG16 OF C@ +RS MOD3 C, ENDOF INDEXED OF DSET C@ +RS DISP, ENDOF OP-ERROR ENDCASE RESET ; : 9MI CREATE C, C, DOES> DUP 1+ C@ <WD> @ + ?TS 1 > IF 2+ THEN C, ?TD CASE REG8 OF C@ MOD3 +RD C, ENDOF REG16 OF C@ MOD3 +RD C, ENDOF INDEXED OF DSET C@ +RD DISP, ENDOF OP-ERROR ENDCASE ?TS 2 < IF DROP THEN RESET ; : 10MI CREATE C, C, DOES> DUP C@ SWAP 1+ C@ C, C, RESET ; --> ( 8086 Assembler 08/30/82 ) : 11MI CREATE C, C, DOES> ?TS CASE DIRECT OF DEPTH 1 < 1 ?ERROR 0FE +W C, 1+ C@ 6 + C, , ENDOF REG8 OF 0FE C, 1+ C@ MOD3 +RS C, ENDOF REG16 OF C@ +RS C, ENDOF INDEXED OF DSET 0FE +W C, 1+ C@ +RS DISP, ENDOF OP-ERROR ENDCASE RESET ; : 12MI CREATE DOES> DROP DSET ?TD CASE DIRECT OF ?TS CASE REG8 OF ?RS IF 088 C, ?RS 8 * 6 + C, , ELSE 0A2 +W C, , THEN ENDOF REG16 OF ?RS IF 089 C, ?RS 8 * 6 + C, , ELSE 0A2 +W C, , THEN ENDOF --> ( 8086 Assembler ) SEGREG OF 08C C, ?RS 8 * 6 + C, , ENDOF OP-ERROR ENDCASE ENDOF REG8 OF ?TS CASE DIRECT OF ?RD IF 08A C, ?RD 8 * 6 + C, , ELSE 0A0 +W C, , THEN ENDOF IMMED OF 0B0 +RD C, C, ENDOF REG8 OF Dt 88 +D C, ?RD 8 * +RS MOD3 C, ENDOF REG16 OF 2D ERROR ENDOF INDEXED OF 88 +D +W C, ?RD 8 * +RS DISP, ENDOF OP-ERROR ENDCASE ENDOF REG16 OF ?TS CASE DIRECT OF ?RD IF 08B C, ?RD 8 * 6 + C, , ELSE 0A0 +W C, , THEN ENDOF --> ( 8086 Assembler ) IMMED OF 0B8 +RD C, , ENDOF REG16 OF Dt 088 +W +D C, ?RD 8 * +RS MOD3 C, ENDOF INDEXED OF 088 +D +W C, ?RD 8 * +RS DISP, ENDOF SEGREG OF 08C C, ?RS 8 * +RD MOD3 C, ENDOF OP-ERROR ENDCASE ENDOF INDEXED OF ?TS CASE IMMED OF 0C6 +W C, ?RD DISP, ?W IF , ELSE C, THEN ENDOF REG8 OF 088 +D +W C, ?RS 8 * +RD DISP, ENDOF REG16 OF 088 +D +W C, ?RS 8 * +RD DISP, ENDOF SEGREG OF 08C C, ?RS 8 * +RD DISP, ENDOF OP-ERROR ENDCASE ENDOF --> ( 8086 Assembler ) SEGREG OF ?TS CASE DIRECT OF 08E C, ?RD 8 * 6 + C, , ENDOF REG16 OF 08E C, ?RD 8 * +RS MOD3 C, ENDOF INDEXED OF 08E C, ?RD 8 * +RS DISP, ENDOF OP-ERROR ENDCASE ENDOF OP-ERROR ENDCASE RESET ; --> ( 8086 Assembler ) : 13MI CREATE DOES> DROP DSET ?TD CASE DIRECT OF ?TS REG16 = IF 90 +RS C, ELSE 28 ERROR THEN ENDOF REG8 OF 86 +W C, ?TS CASE REG8 OF ?RD 8 * +RS MOD3 C, ENDOF INDEXED OF ?RD 8 * +RS DISP, ENDOF OP-ERROR ENDCASE ENDOF REG16 OF 86 +W C, ?TS CASE REG16 OF ?RD 8 * +RS MOD3 C, ENDOF INDEXED OF ?RD 8 * +RS DISP, ENDOF OP-ERROR ENDCASE ENDOF OP-ERROR ENDCASE RESET ; --> ( 8086 Assembler 08/20/82 ) : 14MI CREATE DOES> DROP ?TS CASE DIRECT OF 28 ERROR ENDOF IMMED OF 0F6 +W C, ?TD CASE REG8 OF ?RD MOD3 C, ?W IF , ELSE C, THEN ENDOF REG16 OF ?RD MOD3 C, ?W IF , ELSE C, THEN ENDOF INDEXED OF ?RD DISP, ?W IF , ELSE C, THEN ENDOF OP-ERROR ENDCASE ENDOF SEGREG OF 28 ERROR ENDOF ?TD REG8 < ?TD REG16 > OR 28 ?ERROR 84 +W C, ?RD 8 * +RS ?TS INDEXED < IF MOD3 C, ELSE DISP, THEN ENDCASE RESET ; : 15MI CREATE DOES> DROP 0CD C, C, RESET ; : 16MI CREATE DOES> DROP ?RS 8 * 26 + C, RESET ; --> ( 8086 Assembler 10/31/83 ) : 17MI CREATE C, C, DOES> ?TS CASE DIRECT OF 1+ C@ C, , , ENDOF REG16 OF 0FF C, C@ MOD3 +RS C, ENDOF INDEXED OF DSET 0FF C, C@ +RS DISP, ENDOF OP-ERROR ENDCASE RESET ; --> ( 8086 Assembler 10/31/83 ) 37 1MI AAA 80 38 38 7MI CMP 15MI INT D5 0A 10MI AAD A6 3MI CMPS CE 1MI INTO D4 0A 10MI AAM 99 1MI CWD CF 1MI IRET 3F 1MI AAS 27 1MI DAA 77 2MI JA 80 10 10 7MI ADC 2F 1MI DAS 73 2MI JAE 80 00 00 7MI ADD 08 48 11MI DEC 72 2MI JB 80 20 20 7MI AND F6 30 8MI DIV 76 2MI JBE E8 10 5MI CALL ( ESC ) E3 2MI JCXZ 9A 18 17MI CALLF 98 1MI CBW F4 1MI HLT 74 2MI JE F8 1MI CLC F6 38 8MI IDIV 7F 2MI JG FC 1MI CLD F6 28 8MI IMUL 7D 2MI JGE FA 1MI CLI EC E4 6MI IN 7C 2MI JL F5 1MI CMC 00 40 11MI INC 7E 2MI JLE --> ( 8086 Assembler 10/31/83 ) E9 20 5MI JMP 75 2MI JNZ E2 2MI LOOP 7A 28 17MI JMPF 76 2MI JNA 70 2MI JO E1 2MI LOOPE 72 2MI JNAE 7A 2MI JP E0 2MI LOOPNE 73 2MI JNB 7A 2MI JPE E0 2MI LOOPNZ 77 2MI JNBE 7B 2MI JPO E1 2MI LOOPZ 75 2MI JNE 78 2MI JS 12MI MOV 7E 2MI JNG 74 2MI JZ A4 3MI MOVS 7C 2MI JNGE 9F 1MI LAHF F6 20 8MI MUL 7D 2MI JNL ( LDS ) F6 18 8MI NEG 7F 2MI JNLE 8A 8A 8A 7MI LEA 90 1MI NOP 71 2MI JNO ( LES ) F6 10 8MI NOT 7B 2MI JNP F0 1MI LOCK 80 08 08 7MI OR 79 2MI JNS AC 3MI LODS EE E6 6MI OUT --> ( 8086 Assembler 10/31/83 ) 58 07 4MI POP D0 08 9MI ROR 80 28 28 7MI SUB 9D 1MI POPF 9E 1MI SAHF 14MI TEST 50 06 4MI PUSH D0 38 9MI SAR 9B 1MI WAIT 9C 1MI PUSHF 80 18 18 7MI SBB 13MI XCHG D0 10 9MI RCL AE 3MI SCAS D7 1MI XLAT D0 18 9MI RCR 16MI SEG 80 30 30 7MI XOR F3 1MI REP D0 20 9MI SAL 72 2MI JC F3 1MI REPE D0 20 9MI SHL 73 2MI JNC F2 1MI REPNE D0 28 9MI SHR F2 1MI REPNZ F9 1MI STC F3 1MI REPZ FD 1MI STD C3 1MI RET FB 1MI STI CB 1MI RETF D0 00 9MI ROL AA 3MI STOS --> ( 8086 Assembler 01/04/84 ) : CS: CS SEG ; : DS: DS SEG ; : ES: ES SEG ; : SS: SS SEG ; : IF 074 C, 0 C, HERE RESET ; : ELSE 0EB C, 0 C, DUP HERE SWAP - DUP ABS 07F > 23 ?ERROR SWAP 1- C! HERE RESET ; : ENDIF DUP HERE SWAP - DUP ABS 07F > 23 ?ERROR SWAP 1- C! RESET ; : BEGIN HERE RESET ; : UNTIL 074 C, HERE 1+ - DUP ABS 07F > 23 ?ERROR C, RESET ; : BYTE 0 <W> ! 0 <WD> ! ; : WORD 1 DUP <W> ! <WD> ! ; : # 1 DUP <#> ! <TS> ! ; : , DEPTH 1 < 2E ?ERROR 0 <TD> ! ; --> ( 8086 Assembler 11/14/83 ) ( macro to assemble in-line NEXT so code-def is relocatable) : NEXT, WORD LODS BX, AX MOV [BX] JMP ; : END-CODE RESET FRCHK ?EXEC ?CSP UNSMUDGE [COMPILE] FORTH ; IMMEDIATE FORTH DEFINITIONS : ;CODE ?CSP UNSMUDGE COMPILE (;CODE) [COMPILE] [ ASSEMBLER FRCLR RESET FORTH [COMPILE] ASSEMBLER ; IMMEDIATE : CODE ?EXEC !CSP BUILD SMUDGE ASSEMBLER FRCLR RESET FORTH [COMPILE] ASSEMBLER ; IMMEDIATE DECIMAL CR CR .( 8086 Assembler loaded.) CR SP@ DP @ - U. .( bytes left in dictionary.) CR CR ;S ( 32 bit square root 12/08/83 ) FORTH DEFINITIONS DECIMAL CODE 2SQRT DI, BP MOV BP, SP MOV DX, [BP] MOV AX, 2 [BP] MOV BX, # 200 MOV BX DIV AX, # 2 ADD 1$: BX, AX MOV AX, 2 [BP] MOV DX, [BP] MOV BX DIV AX, BX ADD AX, 1 SHR AX, BX CMP 2$ JZ BX, AX SUB BX, # 1 CMP 2$ JZ BX, # -1 CMP 1$ JNZ 2$: SP, # 4 ADD BP, DI MOV AX PUSH NEXT, END-CODE ( BEEP words 03/04/83 ) FORTH DEFINITIONS HEX CODE beep ( divisor time --- ) BX POP AL, # B6 MOV # 43 , AL OUT AX POP # 42 , AL OUT AL, AH MOV # 42 , AL OUT AL, # 61 IN AH, AL MOV AL, # 03 OR # 61 , AL OUT 1$: CX, # 0A48 MOV 2$: 2$ LOOP BX DEC 1$ JNZ AL, AH MOV # 61 , AL OUT NEXT, END-CODE DECIMAL : BEEP ( freq centiseconds --- ) >R >R 1331 1000 R> */ R> beep ;