home *** CD-ROM | disk | FTP | other *** search
- \ PASM.SEQ PREFIX & POSTFIX assembler by Robert L. Smith & Tom Zimmer
-
- comment:
-
- An assembler for the 8086/8088, with both Prefix and Postfix syntax.
-
- PASM defaults to Prefix notation, but can be switched to F83 style
- Postfix notation with the word POSTFIX. To revert back to Prefix notation,
- use PREFIX.
-
- See the file ASSEM.TXT for a further description of the syntax.
-
- comment;
-
- 2VARIABLE APRIOR 4 ALLOT
-
- ' DROP APRIOR ! ' DROP APRIOR 4 + !
-
- : <A;!> ( A1 A2 --- ) \ Set up assembly instruction
- APRIOR 4 + 2! ; \ completion function
-
- : <A;> ( --- )
- APRIOR 2@ EXECUTE \ perform assembly completion
- APRIOR 4 + 2@ APRIOR 2! \ SET UP FOR NEXT PREVIOUS
- ['] DROP APRIOR 4 + ! ; \ Make it not care if it is redone.
-
- : <RUN-A;> ( --- ) \ make sure we complete instruction
- <RUN> <A;> ; \ at the end of each line.
-
- DEFER A;! ' <A;!> IS A;!
- DEFER A; ' <A;> IS A;
- DEFER RUN-A; ' <RUN-A;> IS RUN-A;
-
- VARIABLE POSTVAR \ is this post fix notation?
-
- : PREFIX ( --- )
- ['] <A;!> IS A;!
- ['] <A;> IS A;
- ['] <RUN-A;> IS RUN-A; POSTVAR OFF ;
-
- : POSTFIX ( --- )
- ['] EXECUTE IS A;!
- ['] NOOP IS A;
- ['] <RUN> IS RUN-A; POSTVAR ON ;
-
- PREFIX \ Default is PREFIX assembler.
-
- : >PRE R> POSTVAR @ >R >R PREFIX ; \ Save and set PREFIX
-
- : PRE> R> R> IF POSTFIX THEN >R ; \ Restore previous FIX
-
- \ The ASSEMBLER follows:
- ONLY FORTH ALSO ASSEMBLER DEFINITIONS ALSO
-
-
- DEFER C, FORTH ' C, ASSEMBLER IS C,
- DEFER , FORTH ' , ASSEMBLER IS ,
- DEFER HERE FORTH ' HERE ASSEMBLER IS HERE
-
- DEFER ?>MARK
- DEFER ?>RESOLVE
- DEFER ?<MARK
- DEFER ?<RESOLVE
-
- HEX
-
- 20 CONSTANT MAX_LABELS
-
- CREATE SHORTLABELS MAX_LABELS 4 * ALLOT
-
- : SXBYTE ( n1 -- n2 ) DUP 80 AND IF FF00 OR THEN ;
-
- : CLEAR_LABELS ( -- ) SHORTLABELS MAX_LABELS 4 * 0 FILL ;
-
- : CHECKLABEL ( n -- m ) \ Or abort
- DUP MAX_LABELS 1- U> ABORT" Bad Label "
- 2* 2* SHORTLABELS + ;
-
- : $ ( n1 -- n2 )
- CHECKLABEL DUP @
- IF @ ELSE 2+ DUP @ SWAP HERE 2+ SWAP !
- DUP 0= IF HERE 2+ + THEN
- THEN ;
-
- \ Labels for the Assembler.
-
- : $RESOLVE ( linkaddr -- )
- @ DUP 0= IF DROP EXIT THEN 0
- BEGIN
- + DUP 1- C@ OVER HERE OVER - SWAP 1- C!
- SXBYTE DUP 0=
- UNTIL
- 2DROP ;
-
- : $:F ( N1 --- )
- CHECKLABEL DUP 2+ $RESOLVE 0 OVER 2+ !
- HERE SWAP ! ;
-
- : $: ( n -- )
- ['] $:F A;! A; ;
-
- \ End of Local Label definitions
-
-
- FORTH DEFINITIONS
-
- : DOASSEM ( --- )
- 0 ['] DROP A;!
- ['] RUN-A; IS RUN
- ALSO ASSEMBLER ;
-
- ' DOASSEM IS SETASSEM
-
- : LABEL ( NAME --- ) \ Really just a constant addr
- SETASSEM CREATE ;
-
- : CODE ( NAME --- )
- LABEL -3 DP +! HIDE ;
-
- ASSEMBLER DEFINITIONS
-
- : END-CODE ['] <RUN> IS RUN
- PREVIOUS A; REVEAL ;
-
- ' END-CODE ALIAS C;
-
- \ 8088 Assembler, based on Ray Duncan's Dr. Dobb's article.
-
- : ERROR3 ( --- )
- ['] DROP APRIOR 4 + ! \ Make it not care if it is redone.
- TRUE ABORT" Illegal Operand " ;
-
- VARIABLE <#> VARIABLE <TD> VARIABLE <TS> VARIABLE <RD> VARIABLE <RS>
- VARIABLE <W> VARIABLE <WD> VARIABLE <OD> VARIABLE <OS> VARIABLE <D>
- VARIABLE <SP> VARIABLE <FR> VARIABLE <AO> VARIABLE <ND> VARIABLE <DST>
- VARIABLE <SST> VARIABLE <WS>
-
- : D>S ( --- ) \ Move destination to source.
- <TD> @ <TS> !
- <RD> @ <RS> !
- <OD> @ <OS> ! ;
-
- : ?D>S ( --- ) \ Move Dest to Src if postfix
- <TS> @ 0= \ If no source specified
- POSTVAR @ 0<> AND \ and we are in postfix mode
- IF D>S \ Move destination to source
- THEN ;
-
- : ?D><S ( --- ) \ If no destinatiion specified
- <DST> @ \ yet, then swap source and dest.
- IF <TD> <TS> 2DUP @ SWAP @ ROT ! SWAP !
- <RD> <RS> 2DUP @ SWAP @ ROT ! SWAP !
- <OD> <OS> 2DUP @ SWAP @ ROT ! SWAP !
- THEN <DST> OFF ;
-
- : ?<SP> <SP> @ SP@ - 2- 2/ ;
-
- : <SREG> ( A1 --- )
- POSTVAR @
- IF <DST> OFF \ Only reset dest if postfix
- THEN <SST> ON
- DUP C@ DUP 0FF = IF DROP ELSE DUP <W> ! <WS> ! THEN
- 1+ DUP C@ <TS> !
- 1+ C@ <RS> ! <TS> @ 4 = IF ?<SP> 0 > IF <OS> ! THEN THEN ;
-
- : <DREG> ( A1 --- )
- <DST> ON
- DUP C@ DUP 0FF = IF DROP ELSE DUP <W> ! <WD> ! THEN
- 1+ DUP C@ <TD> ! 1+ C@ <RD> ! <#> @
- ABORT" Immediate Data not allowed "
- <TD> @ 4 = IF ?<SP> 0 > IF <OD> ! THEN THEN ;
-
- \ Destination Register processing.
-
- : DREG CREATE C, C, C, DOES> POSTVAR @
- IF <SREG>
- ELSE <DREG>
- THEN ;
-
- \ Source Register processing.
-
- : SREG CREATE C, C, C, DOES> POSTVAR @
- IF <SST> @ IF <DREG> ELSE <SREG> THEN
- ELSE <SREG>
- THEN ;
-
- \ Source Register Definitions
-
- \ Reg Type W Name Reg Type W Name
- 0 2 0 SREG AL 0 3 1 SREG AX
- 1 2 0 SREG CL 1 3 1 SREG CX
- 2 2 0 SREG DL 2 3 1 SREG DX
- 3 2 0 SREG BL 3 3 1 SREG BX
- 4 2 0 SREG AH 4 3 1 SREG SP
- 5 2 0 SREG CH 5 3 1 SREG BP
- ' BP ALIAS RP
- 6 2 0 SREG DH 6 3 1 SREG SI
- 6 3 1 SREG IP
- 7 2 0 SREG BH 7 3 1 SREG DI
-
- 0 4 -1 SREG [BX+SI] 0 4 -1 SREG [SI+BX]
- 0 4 -1 SREG [BX+IP] 0 4 -1 SREG [IP+BX]
- 1 4 -1 SREG [BX+DI] 1 4 -1 SREG [DI+BX]
- 2 4 -1 SREG [BP+SI] 2 4 -1 SREG [SI+BP]
- ' [BP+SI] ALIAS [BP+IP] ' [SI+BP] ALIAS [IP+BP]
- ' [BP+SI] ALIAS [RP+IP] ' [SI+BP] ALIAS [IP+RP]
- 3 4 -1 SREG [BP+DI] 3 4 -1 SREG [DI+BP]
- ' [BP+DI] ALIAS [RP+DI] ' [DI+BP] ALIAS [DI+RP]
- 4 4 -1 SREG [SI] 5 4 -1 SREG [DI]
- 4 4 -1 SREG [IP] 7 4 -1 SREG [BX]
- 6 4 -1 SREG [BP]
- ' [BP] ALIAS [RP]
-
- 0 5 -1 SREG ES 1 5 -1 SREG CS
- 2 5 -1 SREG SS 3 5 -1 SREG DS
-
- \ Destination Register Definitions
-
- 0 5 -1 DREG ES, 1 5 -1 DREG CS,
- 2 5 -1 DREG SS, 3 5 -1 DREG DS,
-
- 0 2 0 DREG AL, 0 3 1 DREG AX,
- 1 2 0 DREG CL, 1 3 1 DREG CX,
- 2 2 0 DREG DL, 2 3 1 DREG DX,
- 3 2 0 DREG BL, 3 3 1 DREG BX,
- 4 2 0 DREG AH, 4 3 1 DREG SP,
- 5 2 0 DREG CH, 5 3 1 DREG BP,
- ' BP, ALIAS RP,
- 6 2 0 DREG DH, 6 3 1 DREG SI,
- ' SI, ALIAS IP,
- 7 2 0 DREG BH, 7 3 1 DREG DI,
-
- 0 4 -1 DREG [BX+SI], 0 4 -1 DREG [SI+BX],
- 0 4 -1 DREG [BX+IP], 0 4 -1 DREG [IP+BX],
- 1 4 -1 DREG [BX+DI], 1 4 -1 DREG [DI+BX],
- 2 4 -1 DREG [BP+SI], 2 4 -1 DREG [SI+BP],
- 2 4 -1 DREG [BP+IP], 2 4 -1 DREG [IP+BP],
- 3 4 -1 DREG [BP+DI], 3 4 -1 DREG [DI+BP],
- 4 4 -1 DREG [SI], 5 4 -1 DREG [DI],
- ' [SI], ALIAS [IP],
- 6 4 -1 DREG [BP], 7 4 -1 DREG [BX],
- ' [BP], ALIAS [RP],
-
- \ Miscellaneous Operators
- : TS@ <TS> @ ;
- : TD@ <TD> @ ;
- : RD@ <RD> @ ;
- : RS@ <RS> @ ;
- : +D <D> @ 2* + ;
- : +W <W> @ + ;
- : +RD <RD> @ + ;
- : +RS <RS> @ + ;
- : MOD1 3F AND 40 OR ;
- : MOD2 3F AND 80 OR ;
- : MOD3 3F AND C0 OR ;
- : RS0 <RS> @ 8 * ;
- : RSD RS0 +RD ;
- : MD, RS0 6 + C, ;
- : MS, RD@ 8 * 6 + C, ;
- : RDS RD@ 8 * +RS ;
- : CXD, C@ MOD3 +RD C, ;
- : CXS, C@ MOD3 +RS C, ;
-
- \ Equates to Addressing Modes
-
- 0 CONSTANT DIRECT 1 CONSTANT IMMED 2 CONSTANT REG8
- 3 CONSTANT REG16 4 CONSTANT INDEXED 5 CONSTANT SEGREG
-
- \ Initialize all variables and flags
-
- : RESET 0 <#> ! 0 <W> ! 0 <OS> ! 0 <RD> !
- 0 <TD> ! 0 <TS> ! 0 <OD> ! 0 <SP> !
- 0 <D> ! 0 <WD> ! 0 <RS> ! 0 <FR> ! 0 <ND> !
- 0 <DST> ! 0 <SST> ! 0 <WS> ! ;
-
- : REG? REG8 OVER = SWAP REG16 = OR ;
-
- : DREG? TD@ REG? ;
-
- : ADREG? DREG? RD@ ( 3 AND ) 0= AND ;
-
- : ASREG? TS@ REG? RS@ ( 3 AND ) 0= AND ;
-
- : SUBREG C@ 38 AND ;
-
- : +S, <AO> @
- IF OVER 80 + 100 U< IF 2 OR C, C, ELSE C, , THEN
- ELSE C, , THEN ;
-
- \ Init. Direction Pointer
-
- : DSET TS@ DUP INDEXED = SWAP DIRECT = OR NEGATE <D> ! ;
-
- : DT 1 <D> ! ; \ Set Direction Flag True.
-
- : OFFSET8, HERE 1+ - DUP ABS OVER 0< + 7F >
- ABORT" Address out of range " C, ;
-
- : OFFSET16, HERE 2+ - , ;
-
- \ Calculate and store displacement for MEM/REG Instructions.
-
- : DISP, <D> @ IF <OS> ELSE <OD> THEN @ DUP
- IF DUP ABS 7F > IF SWAP MOD2 C, , ELSE SWAP MOD1 C, C, THEN
- ELSE DROP DUP 7 AND 6 = IF MOD1 C, 0 THEN C, THEN ;
-
- \ Calculate the M/R 2nd operator byte
-
- : M/RS, 38 AND TS@
- CASE DIRECT OF 6 + C, , ENDOF
- REG8 OF C0 + +RS C, ENDOF
- REG16 OF C0 + +RS C, ENDOF
- INDEXED OF <OS> @ 0= RS@ 6 <> AND
- IF +RS C,
- ELSE <OS> @ 80 + 100 U<
- IF 40 + +RS C, <OS> @ C,
- ELSE 80 + +RS C, <OS> @ ,
- THEN
- THEN ENDOF
- ERROR3 ENDCASE
- ;
-
- : M/RD, ( ? --- ) D>S M/RS, ;
-
- : 8/16, <W> @ IF , ELSE C, THEN ;
-
- \ Words to build the instructions:
-
- : 1MIF ( A1 --- )
- C@ C, RESET ; \ Single Byte Inst.
-
- : 1MI CREATE C, DOES> ['] 1MIF A;! A; ;
-
- : 1AMIF ( A1 --- ) \ AX LODS or AX STOS
- C@ +W C, RESET ; \ Single Byte Inst.
-
- : 1AMI CREATE C, DOES> ['] 1AMIF A;! A; ;
-
- : 2MIF ( A1 --- )
- C@ C, OFFSET8, RESET ; \ Cond Jumps, Loops
-
- : 2MI CREATE C, DOES> ['] 2MIF A;! A; ;
-
- : 3MI CREATE C, DOES> C@ C, ; \ Segment Over-ride
-
- : 4MIF ( A1 --- )
- ?D>S TS@ \ Reg. Push and Pop
- CASE
- SEGREG OF C@ RS@ 8 * + C, ENDOF \ SEGMENT
- REG16 OF 1+ C@ +RS C, ENDOF \ REGISTER
- REG8 OF ERROR3 ENDOF \ 8 BIT ILLEGAL
- DROP 2+ C@ DUP C,
- 30 AND M/RS,
- ENDCASE \ MEMORY
- RESET ;
-
- : 4MI CREATE C, C, C, DOES> ['] 4MIF A;! A; ;
-
- : 5MIF ( A1 --- )
- ?D>S TS@ \ Iseg. Jump, Call
- CASE DIRECT OF <ND> @
- IF 0FF C, C@ <FR> @
- IF 8 + THEN M/RS,
- ELSE <FR> @
- IF 2+ C@ C, , ,
- ELSE OVER HERE 3 + - 80 + 100 U<
- OVER C@ 20 = AND
- <WD> @ 0= AND
- IF DROP 0EB C, OFFSET8,
- ELSE 1+ C@ C, OFFSET16,
- THEN
- THEN
- THEN ENDOF
- REG16 OF 0FF C, CXS, ENDOF
- INDEXED OF DSET 0FF C, C@ <FR> @
- IF 8 + THEN +RS DISP, ENDOF
- ERROR3 ENDCASE
- RESET ;
-
- : 5MI CREATE C, C, C, DOES> ['] 5MIF A;! A; ;
-
- : 6MIF ( A1 --- ) \ IN and OUT
- DUP C@ 2 AND
- IF TD@
- ELSE TS@ THEN
- IMMED = IF C@ +W C, C,
- ELSE 1+ C@ +W C, THEN RESET ;
-
-
- : 6MI CREATE C, C, DOES> ['] 6MIF A;! A; ;
-
- \ ADC, ADD, AND, etc.
-
- : 7MIF ( A1 --- )
- DUP 1+ C@ 1 AND <AO> !
- TS@ IMMED =
- IF ADREG?
- IF 2+ C@ +W C, TD@ REG8 = IF C, ELSE , THEN
- ELSE DUP 1+ C@ FE AND +W ROT >R \ Save IMMEDiate data
- <AO> @
- IF R@ 80 + 100 U<
- IF 2 OR C, C@ M/RD, R@ C,
- ELSE C, C@ M/RD, R@ ,
- THEN
- ELSE C, C@ M/RD, R@ 8/16,
- THEN R> DROP \ Clean Return stack
- THEN
- ELSE C@ TS@ REG?
- IF +W C, RS@ 8 * M/RD,
- ELSE 84 OVER - IF 2 OR THEN +W C, TD@ REG?
- IF RD@ 8 * M/RS, ELSE ERROR3 THEN
- THEN
- THEN RESET ;
-
- : 7MI CREATE C, C, C, DOES> ['] 7MIF A;! A; ;
-
- : 8MIF ( A1 --- )
- ?D>S
- DUP 1+ C@ +W C, C@ M/RS, RESET ;
-
- : 8MI CREATE C, C, DOES> ['] 8MIF A;! A; ;
-
- : 9MIF ( A1 --- )
- <DST> @ 0=
- IF 1 <DST> ! ?D><S
- 1 <TS> ! 1 <SST> ! \ : # 1 <TS> ! 1 <SST> ! ;
- 1 SWAP <W> @ <WD> !
- ELSE POSTVAR @ \ If postfix, reverse
- IF ?D><S \ the operands
- <WS> @ <WD> ! \ Correct word mode
- THEN
- THEN
- DUP 1+ C@ <WD> @ +
- TS@ 1 > IF 2+ C, ELSE C, NIP THEN C@ M/RD, RESET ;
-
- : 9MI CREATE C, C, DOES> ['] 9MIF A;! A; ;
-
- : 10MIF ( A1 --- )
- DUP 1+ C@ C, C@ C, RESET ;
-
- : 10MI CREATE C, C, DOES> ['] 10MIF A;! A; ;
-
- : 11MIF ( A1 --- )
- ?D>S TS@ REG? <W> @ 0<> AND
- IF C@ +RS C, ELSE 1+ C@ FE +W C, M/RS, THEN RESET ;
-
- : 11MI CREATE C, C, DOES> ['] 11MIF A;! A; ;
-
- : 12MIF ( A1 --- )
- DROP \ MOV Instruction
- TD@ SEGREG = IF 8E C, RD@ 8 * M/RS, ELSE
- TS@ SEGREG = IF 8C C, RS@ 8 * M/RD, ELSE
- TS@ IMMED = TD@ REG? AND
- IF 16 +W 8 * +RD C, 8/16, ELSE
- TS@ 0= TD@ 0= OR ADREG? ASREG? OR AND
- IF A0 +W TS@ IF 2+ THEN C, , ( 8/16, ) ELSE
- TS@ IMMED = IF C6 +W C, >R 0 M/RD, R> 8/16, ELSE
- 88 +W TD@ REG?
- IF 2+ C, RD@ 8 * M/RS, ELSE
- TS@ REG? IF C, RS@ 8 * M/RD, ELSE ERROR3 THEN THEN THEN THEN
- THEN THEN THEN
- RESET ;
-
- : 12MI CREATE DOES> ['] 12MIF A;! A; ;
-
- : 13MIF ( A1 --- )
- DROP TS@ REG? TD@ REG? AND \ Both are registers
- RS@ 0= RD@ 0= OR AND \ Either register is AX
- <W> @ 1 = AND \ And it is AX not AL.
- IF RS@ 0=
- IF RD@
- ELSE RS@
- THEN 90 + C,
- ELSE 86 +W \ XCHG Instruction
- TS@ REG? 0=
- IF TD@ REG? 0=
- IF ERROR3
- ELSE C,
- RD@ 8 * M/RS,
- THEN
- ELSE C, RS@ 8 * M/RD,
- THEN
- THEN RESET ;
-
- : 13MI CREATE DOES> ['] 13MIF A;! A; ;
-
- : 14MIF ( A1 --- )
- C@ C, TD@ REG?
- IF RD@ 8 * M/RS, ELSE ERROR3 THEN RESET ;
-
- : 14MI CREATE C, DOES> ['] 14MIF A;! A; ;
-
- : 15MIF ( A1 --- )
- DROP DUP 3 =
- IF DROP CC C, ELSE CD C, C, THEN RESET ;
-
- : 15MI CREATE DOES> ['] 15MIF A;! A; ;
-
- \ Now let's create the actual instructions.
-
- 37 1MI AAA FC 1MI CLD
- D5 0A 10MI AAD FA 1MI CLI
- D4 0A 10MI AAM F5 1MI CMC
- 3F 1MI AAS 3C 81 38 7MI CMP
- 14 81 10 7MI ADC A6 1MI CMPSB
- 04 81 00 7MI ADD A7 1MI CMPSW
- 24 80 20 7MI AND 99 1MI CWD
- 9A E8 10 5MI CALL 27 1MI DAA
- 98 1MI CBW 2F 1MI DAS
- F8 1MI CLC 08 48 11MI DEC
-
- F6 30 8MI DIV 73 2MI JAE
- F4 1MI HLT 72 2MI JB
- F6 38 8MI IDIV 76 2MI JBE
- F6 28 8MI IMUL 76 2MI JC
- EC E4 6MI IN E3 2MI JCXZ
- 00 40 11MI INC 74 2MI JE
- 15MI INT 7F 2MI JG
- CE 1MI INTO 7D 2MI JGE
- CF 1MI IRET 7C 2MI JL
- 77 2MI JA 7E 2MI JLE
-
- EA E9 20 5MI JMP 7F 2MI JNLE
- 76 2MI JNA 71 2MI JNO
- 72 2MI JNAE 7B 2MI JNP
- 73 2MI JNB 79 2MI JNS
- 77 2MI JNBE 75 2MI JNZ
- 73 2MI JNC 70 2MI JO
- 75 2MI JNE 7A 2MI JP
- 7E 2MI JNG 7A 2MI JPE
- 7C 2MI JNGE 7B 2MI JPO
- 7D 2MI JNL 78 2MI JS
-
- 74 2MI JZ E0 2MI LOOPNE
- 9F 1MI LAHF E0 2MI LOOPNZ
- C5 14MI LDS E1 2MI LOOPZ
- 8D 14MI LEA 12MI MOV
- C4 14MI LES A4 1MI MOVSB
- F0 1MI LOCK A5 1MI MOVSW A5 1MI MOVS
- AC 1MI LODSB F6 20 8MI MUL AC 1AMI LODS
- AD 1MI LODSW F6 18 8MI NEG
- E2 2MI LOOP 90 1MI NOP
- E1 2MI LOOPE F6 10 8MI NOT
-
- 0C 80 08 7MI OR F2 1MI REPNE
- EE 08 6MI OUT F2 1MI REPNZ
- 8F 58 07 4MI POP F3 1MI REPZ
- 9D 1MI POPF C3 1MI RET
- FF 50 06 4MI PUSH D0 00 9MI ROL
- 9C 1MI PUSHF D0 08 9MI ROR
- D0 10 9MI RCL 9E 1MI SAHF
- D0 18 9MI RCR D0 38 9MI SAR
- F3 1MI REP 1C 81 18 7MI SBB
- F3 1MI REPE AE 1MI SCASB
-
- AF 1MI SCASW AB 1MI STOSW AA 1AMI STOS
- D0 20 9MI SAL 2C 81 28 7MI SUB
- D0 20 9MI SHL A4 F6 84 7MI TEST
- D0 28 9MI SHR 9B 1MI WAIT
- F9 1MI STC 13MI XCHG
- FD 1MI STD D7 1MI XLAT
- FB 1MI STI 34 80 30 7MI XOR
- AA 1MI STOSB \ ESC
-
- \ Segment over-ride commands:
- 26 3MI ES:
- 2E 3MI CS:
- 36 3MI SS:
- 3E 3MI DS:
-
- : FAR 1 <FR> ! ;
-
- : BYTE 0 <W> ! 0 <WD> ! ;
-
- : WORD 1 <W> ! 1 <WD> ! ;
-
- : # 1 <TS> ! -1 <SST> ! ;
-
- : #) ( ?D><S ) -1 <SST> ! \ Swap source and dest if no dest spec'ed.
- 1 <W> ! ; \ Default to word mode
-
- : [] 0 <W> ! 1 <ND> ! ;
-
- : 3* DUP 2* + ;
-
- \ MACROS for NEXT, 1PUSH, and 2PUSH.
-
- VARIABLE INLN \ Flag to determine if we are compiling IN_LINE next.
-
- : INLINEON INLN ON ;
- : INLINEOFF INLN OFF ; INLINEOFF \ Default to NO INLINE NEXT.
-
- : NEXT ( -- )
- >PRE INLN @
- IF LODSW ES: JMP AX A;
- ELSE JMP >NEXT A;
- THEN PRE> ;
-
- : 1PUSH ( -- )
- >PRE INLN @
- IF PUSH AX LODSW ES: JMP AX A;
- ELSE JMP >NEXT 1- A;
- THEN PRE> ;
-
- : 2PUSH ( -- )
- >PRE INLN @
- IF PUSH DX PUSH AX LODSW ES: JMP AX A;
- ELSE JMP >NEXT 2- A;
- THEN PRE> ;
-
- : A?>MARK ( -- f addr ) TRUE HERE 0 C, ;
- : A?>RESOLVE ( f addr -- ) HERE OVER 1+ - SWAP C! ?CONDITION ;
- : A?<MARK ( -- f addr ) TRUE HERE ;
- : A?<RESOLVE ( f addr -- ) HERE 1+ - C, ?CONDITION ;
- ' A?>MARK ASSEMBLER IS ?>MARK
- ' A?>RESOLVE ASSEMBLER IS ?>RESOLVE
- ' A?<MARK ASSEMBLER IS ?<MARK
- ' A?<RESOLVE ASSEMBLER IS ?<RESOLVE
-
- HEX
-
- 75 CONSTANT 0= 74 CONSTANT 0<> 79 CONSTANT 0<
- 78 CONSTANT 0>= 7D CONSTANT < 7C CONSTANT >=
- 7F CONSTANT <= 7E CONSTANT > 73 CONSTANT U<
- 72 CONSTANT U>= 77 CONSTANT U<= 76 CONSTANT U>
- 71 CONSTANT OV E3 CONSTANT CX<>0
-
- DECIMAL
-
- HEX
-
- : IF C, ?>MARK ;
- : THEN ?>RESOLVE ;
- : ELSE 0EB IF 2SWAP THEN ;
- : BEGIN ?<MARK ;
- : UNTIL C, ?<RESOLVE ;
- : AGAIN 0EB UNTIL ;
- : WHILE IF ;
- : REPEAT 2SWAP AGAIN THEN ;
- \ : DO MOV # CX HERE ;
-
-
- ONLY FORTH DEFINITIONS ALSO
-
- DECIMAL
-