version 1.1, 2000/07/11 20:28:50
|
version 1.3, 2000/07/13 19:41:07
|
Line 21
|
Line 21
|
\ 16: EAX EBX MOV \ mov bx,ax |
\ 16: EAX EBX MOV \ mov bx,ax |
|
|
|
|
ONLY FORTH ALSO DEFINITIONS |
\ additional words for Gforth port |
|
|
VOCABULARY ASSEMBLER ASSEMBLER ALSO DEFINITIONS HEX |
: w, ( x -- ) |
|
here ! 2 allot ; |
|
|
|
base @ get-current ALSO ASSEMBLER DEFINITIONS HEX |
|
|
\ --------------------------------------------------------------------- |
\ --------------------------------------------------------------------- |
\ Defer memory-access words for the metacompiler |
\ Defer memory-access words for the metacompiler |
Line 128 VARIABLE SIZE 1 SIZE !
|
Line 130 VARIABLE SIZE 1 SIZE !
|
: CPU ( op -- ) CREATE C, DOES> C@ C, ; |
: CPU ( op -- ) CREATE C, DOES> C@ C, ; |
|
|
66 CPU 16: \ 16-bit opcode prefix (cannot use with immedate ops) |
66 CPU 16: \ 16-bit opcode prefix (cannot use with immedate ops) |
C3 CPU RET |
C3 CPU RET, |
F2 CPU REP F2 CPU REPNZ F3 CPU REPZ |
F2 CPU REP, F2 CPU REPNZ, F3 CPU REPZ, |
FC CPU CLD FD CPU STD 99 CPU CDQ |
FC CPU CLD, FD CPU STD, 99 CPU CDQ, |
|
|
|
|
: SHORT ( op opex regop -- ) |
: SHORT ( op opex regop -- ) |
Line 138 FC CPU CLD FD CPU STD 99 CPU CDQ
|
Line 140 FC CPU CLD FD CPU STD 99 CPU CDQ
|
DOES> ( reg | offset [reg] -- ) OVER R32? |
DOES> ( reg | offset [reg] -- ) OVER R32? |
IF C@ OP, ELSE 1+ COUNT SWAP C@ WR/SM, THEN ; |
IF C@ OP, ELSE 1+ COUNT SWAP C@ WR/SM, THEN ; |
|
|
FF 6 50 SHORT PUSH 8F 0 58 SHORT POP |
FF 6 50 SHORT PUSH, 8F 0 58 SHORT POP, |
FE 0 40 SHORT INC FE 1 48 SHORT DEC |
FE 0 40 SHORT INC, FE 1 48 SHORT DEC, |
|
|
|
|
: UNARY ( opex -- ) |
: UNARY ( opex -- ) |
CREATE C, DOES> ( reg | offset [reg] ) C@ F6 WR/SM, ; |
CREATE C, DOES> ( reg | offset [reg] ) C@ F6 WR/SM, ; |
|
|
2 UNARY INV ( INV = Intel's NOT ) |
2 UNARY NOT, |
3 UNARY NEG 4 UNARY MUL |
3 UNARY NEG, 4 UNARY MUL, |
5 UNARY IMUL 6 UNARY DIV 7 UNARY IDIV |
5 UNARY IMUL, 6 UNARY DIV, 7 UNARY IDIV, |
|
|
|
|
\ The following forms are accepted for binary operands. |
\ The following forms are accepted for binary operands. |
Line 169 FE 0 40 SHORT INC FE 1 48 SHORT DEC
|
Line 171 FE 0 40 SHORT INC FE 1 48 SHORT DEC
|
OVER SIZE, R/M, |
OVER SIZE, R/M, |
THEN ; |
THEN ; |
|
|
: MOV ( operands... -- ) |
: MOV, ( operands... -- ) |
OVER # = |
OVER # = |
IF DUP SIZE? IF B8 OP, DROP , ELSE B0 OP, DROP C, THEN |
IF DUP SIZE? IF B8 OP, DROP , ELSE B0 OP, DROP C, THEN |
ELSE DUP INDEX? IF ROT 88 ELSE 8A THEN OVER SIZE, R/M, |
ELSE DUP INDEX? IF ROT 88 ELSE 8A THEN OVER SIZE, R/M, |
THEN ; |
THEN ; |
|
|
: LEA ( reg/mem reg -- ) 8D C, MEM, ; |
: LEA, ( reg/mem reg -- ) 8D C, MEM, ; |
|
|
: XCHG ( mr1 reg -- ) |
: XCHG, ( mr1 reg -- ) |
OVER REG? OVER EAX = AND |
OVER REG? OVER EAX = AND |
IF DROP REG 90 OP, |
IF DROP REG 90 OP, |
ELSE 86 OVER SIZE, R/M, THEN ; |
ELSE 86 OVER SIZE, R/M, THEN ; |
Line 203 FE 0 40 SHORT INC FE 1 48 SHORT DEC
|
Line 205 FE 0 40 SHORT INC FE 1 48 SHORT DEC
|
THEN |
THEN |
THEN ; |
THEN ; |
|
|
0 SHIFT ROL 1 SHIFT ROR 2 SHIFT RCL 3 SHIFT RCR |
0 SHIFT ROL, 1 SHIFT ROR, 2 SHIFT RCL, 3 SHIFT RCR, |
4 SHIFT SHL 5 SHIFT SHR 7 SHIFT SAR |
4 SHIFT SHL, 5 SHIFT SHR, 7 SHIFT SAR, |
|
|
\ String instructions. Precede with BYTE for byte version |
\ String instructions. Precede with BYTE for byte version |
: STR ( op -- ) |
: STR ( op -- ) |
CREATE C, DOES> C@ SIZE @ OP, 1 SIZE ! ; |
CREATE C, DOES> C@ SIZE @ OP, 1 SIZE ! ; |
|
|
A4 STR MOVS A6 STR CMPS |
A4 STR MOVS, A6 STR CMPS, |
AA STR STOS AC STR LODS AE STR SCAS |
AA STR STOS, AC STR LODS, AE STR SCAS, |
|
|
|
|
\ --------------------------------------------------------------------- |
\ --------------------------------------------------------------------- |
Line 225 AA STR STOS AC STR LODS AE STR SCAS
|
Line 227 AA STR STOS AC STR LODS AE STR SCAS
|
|
|
: REL ( op -- ) CREATE C, DOES> C@ C, REL8, ; |
: REL ( op -- ) CREATE C, DOES> C@ C, REL8, ; |
|
|
70 REL JO 71 REL JNO 72 REL JB 73 REL JAE |
70 REL JO, 71 REL JNO, 72 REL JB, 73 REL JAE, |
74 REL JE 75 REL JNE 76 REL JBE 77 REL JA |
74 REL JE, 75 REL JNE, 76 REL JBE, 77 REL JA, |
78 REL JS 79 REL JNS 7A REL JPE 7B REL JNP |
78 REL JS, 79 REL JNS, 7A REL JPE, 7B REL JNP, |
7C REL JL 7D REL JGE 7E REL JLE 7F REL JG |
7C REL JL, 7D REL JGE, 7E REL JLE, 7F REL JG, |
E3 REL JECXZ |
E3 REL JECXZ, |
|
|
: JMP ( addr | r/m -- ) |
: JMP, ( addr | r/m -- ) |
DUP 0< ( reg/index ) IF FF C, 4 R/M, |
DUP 0< ( reg/index ) IF FF C, 4 R/M, |
ELSE DUP HERE 2 + - SHORT? IF EB C, REL8, |
ELSE DUP HERE 2 + - SHORT? IF EB C, REL8, |
ELSE E9 C, REL32, THEN THEN ; |
ELSE E9 C, REL32, THEN THEN ; |
|
|
: CALL ( addr | r/m -- ) |
: CALL, ( addr | r/m -- ) |
DUP 0< ( reg/index ) IF FF C, 2 R/M, ELSE E8 C, REL32, THEN ; |
DUP 0< ( reg/index ) IF FF C, 2 R/M, ELSE E8 C, REL32, THEN ; |
|
|
|
|
Line 288 MAX-LABELS ARRAY LABEL-LINK ( linked
|
Line 290 MAX-LABELS ARRAY LABEL-LINK ( linked
|
|
|
: NOT 1 XOR ; ( reverse logic of conditional ) |
: NOT 1 XOR ; ( reverse logic of conditional ) |
|
|
: IF C, HERE 0 C, ; |
: IF, C, HERE 0 C, ; |
: THEN HERE OVER OFFSET SWAP TC! ; |
: THEN, HERE OVER OFFSET SWAP TC! ; |
: ELSE EB IF SWAP THEN ; |
: ELSE, EB IF, SWAP THEN, ; |
: BEGIN HERE ; |
: BEGIN, HERE ; |
: UNTIL C, REL8, ; |
: UNTIL, C, REL8, ; |
: LOOP E2 UNTIL ; |
: LOOP, E2 UNTIL, ; |
: AGAIN EB UNTIL ; |
: AGAIN, EB UNTIL, ; |
: WHILE IF SWAP ; |
: WHILE, IF, SWAP ; |
: REPEAT AGAIN THEN ; |
: REPEAT, AGAIN, THEN, ; |
|
|
0 BINARY ADD 1 BINARY OR 2 BINARY ADC 3 BINARY SBB |
0 BINARY ADD, 1 BINARY OR, 2 BINARY ADC, 3 BINARY SBB, |
4 BINARY AND 5 BINARY SUB 6 BINARY XOR 7 BINARY CMP |
4 BINARY AND, 5 BINARY SUB, 6 BINARY XOR, 7 BINARY CMP, |
|
|
: RET# ( n -- ) C2 C, W, ; |
: RET#, ( n -- ) C2 C, W, ; |
: PUSH# ( n -- ) 68 C, , ; |
: PUSH#, ( n -- ) 68 C, , ; |
|
|
: NEXT ( -- ) |
previous set-current decimal base ! |
LODS 0 [EAX] [EDI] ECX MOV EDI ECX ADD ECX JMP ; |
|
|
|
: XCALL ( n -- ) |
|
EDX EBX MOV |
|
6 CELLS [EDI] EAX MOV |
|
( n ) CELLS [EAX] CALL |
|
EBX EDX MOV ; |
|
|
|
VARIABLE AVOC |
|
: ASM-INIT CONTEXT @ AVOC ! ASSEMBLER CLEAR-LABELS !CSP ; |
|
|
|
: END-CODE ?CSP CHECK-LABELS AVOC @ CONTEXT ! REVEAL ; |
|
: C; END-CODE ; |
|
|
|
FORTH DEFINITIONS |
|
|
|
: LABEL CREATE HIDE ASM-INIT ; |
|
: CODE LABEL HERE DUP CELL - ! ; |
|
|
|
: ;CODE ( -- ) |
|
?COMP ?CSP COMPILE (;CODE) [COMPILE] [ ASM-INIT ; IMMEDIATE |
|
|
|
|
|
ONLY FORTH ALSO DEFINITIONS DECIMAL |
|