Diff for /gforth/arch/386/asm.fs between versions 1.1 and 1.3

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  

Removed from v.1.1  
changed lines
  Added in v.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>