File:  [gforth] / gforth / arch / r8c / asm.fs
Revision 1.9: download - view: text, annotated - select for diffs
Sat Mar 4 20:11:14 2006 UTC (18 years, 1 month ago) by pazsan
Branches: MAIN
CVS tags: HEAD
Improved assembler
Improved prims, with data flash access (only for user now)

    1: \ FORTH Assembler for R8C                    hfs 23:54 25.12.05
    2: \
    3: \ Autor:          Heinz Schnitter (hfs)
    4: \
    5: \ Information:
    6: \
    7: \ - R8C.ASM is a table driven assembler.
    8: \ - R8C.ASM supports OPCodes of Renesas R8C Microcomputer in
    9: \   postfix notation.
   10: 
   11: \ only forth definitions
   12: 
   13: require asm/basic.fs
   14: 
   15:  also ASSEMBLER definitions
   16: 
   17: require asm/target.fs
   18: 
   19: \ for tests only                hfs 07:47 04/24/92
   20: 
   21: \ : TC, base @ >r hex 0 <# # # #>       type r> base ! ;
   22: \ : T,  base @ >r hex 0 <# # # # # #>   type r> base ! ;
   23: : ta, base @ >r hex 0 <# # # # # # #> type r> base ! ;
   24: 
   25: 
   26:  HERE                   ( Begin )
   27: 
   28: \ VARIABLEs and RESET                        hfs 10:03 04/23/92
   29: 
   30:       VARIABLE SSP                 \ save of SP
   31:       VARIABLE <,>                 \ two addrs
   32:       VARIABLE <M>                 \ mode searched for in table
   33:       VARIABLE <OPC>               \ OPCode
   34:       VARIABLE <.B>
   35:       VARIABLE <S-OPND>
   36:       VARIABLE <D-OPND>
   37: 
   38:  : ssave SP@ SSP ! ;
   39: 
   40:  : RESET       ( clears all variables )
   41:    0 <M>   C!    $0FF <M>   1+ C!
   42:    0 <OPC> C!    $0FF <OPC> 1+ C!
   43:    <S-OPND> OFF  <D-OPND> OFF
   44:    <,> OFF       <.B> OFF  ssave ;
   45: 
   46:  : opnd?  ( -- N ) SSP @ SP@ - 1 cells - 1 cells / ;
   47:  : ,? <,> @ ;
   48:  : S-OPND? <S-OPND> @ ;
   49:  : D-OPND? <D-OPND> @ ;
   50: 
   51:  : WITHIN >R OVER > SWAP R> <= 0= OR 0= ;
   52: 
   53:  : 4B?  ( n -- n f ) ( within -8 .. 7 ? )
   54:    DUP -$8   $7   WITHIN ;
   55:  : >4B?  ( n -- n f ) 4B? 0= ;
   56: 
   57:  : 8B?  ( n -- n f ) ( within -128 .. 127 ? )
   58:    DUP -$80   $7F   WITHIN ;
   59:  : >8B?  ( n -- n f ) 8B? 0= ;
   60: 
   61:    $0ff   CONSTANT abs8
   62:  : abs8?  ( n -- n f ) DUP abs8 u< ;
   63:  : >abs8? ( n -- n f ) abs8? 0= ;
   64: 
   65:  : >opc <M> 1+ C@ <OPC> 1+ C! ;
   66: 
   67:  : M: CREATE  C, C,
   68:        DOES> ,?
   69:        IF    dup C@          <M>    c@ $F0 AND OR <M>    c!
   70:               1+ C@          <M> 1+ c@ $F0 AND OR <M> 1+ c!
   71:        ELSE  dup C@ 4 lshift <M>    c@ $0F AND OR <M>    c!
   72:               1+ C@ 4 lshift <M> 1+ c@ $0F AND OR <M> 1+ c!
   73:        THEN ;
   74: 
   75: \ address-modes hfs
   76: 
   77:  %0000 0 M: R0    ' R0 alias R0L  ' R0 alias R2R0  ' R0  alias C
   78:  %0001 0 M: R1    ' R1 alias R0H  ' R1 alias R3R1  ' R1  alias D
   79:  %0010 0 M: R2    ' R2 alias R1L                   ' R2  alias Z
   80:  %0011 0 M: R3    ' R3 alias R1H                   ' R3  alias S
   81:  %0100 0 M: A0                    ' A0 alias A1A0  ' A0  alias B
   82:  %0101 0 M: A1                                     ' A1  alias O
   83:  %0110 0 M: [A0]                                  ' [A0] alias I
   84:  %0111 0 M: [A1]                                  ' [A1] alias U
   85:  %1010 0 M: [SB]
   86:  %1011 0 M: [FB]
   87:  %1111 0 M: abs:16
   88:  %0000 1 M: #
   89:  %0001 1 M: INTBL
   90:  %0010 1 M: INTBH
   91:  %0011 1 M: FLG
   92:  %0100 1 M: ISP
   93:  %0101 1 M: SP
   94:  %0110 1 M: SB
   95:  %0111 1 M: FB
   96:  
   97: \ %0000 2 M: [SP]
   98: 
   99: \ two cells are used for each adress mode in the table:
  100: \
  101: \ cell 1 contains the src and dst MODE# searched for.
  102: \
  103: \ Cell 2 contains the xt of the action word for this address mode.
  104: \
  105: \ |     #src#dst|src  dst|                     |
  106: \ |.....76543210 76543210 .....7654321076543210|
  107: \ |          MODE        |            xt       |
  108: 
  109:  : TABLE:        ( -- addr ) \ generate new table
  110:    CREATE HERE DUP 1 cells + , RESET ;
  111: 
  112:  : ;TABLE        ( addr -- ) \ change endpoint
  113:    HERE SWAP ! ;
  114: 
  115:  : TAB,          ( xt opcode -- )
  116:    <M> @ , , RESET ;
  117: 
  118:  : SEARCH.MODE.2 ( addr -- xt )
  119:    TRUE SWAP
  120:    DUP     C@ <OPC>     C!    ( opc from GROUP2: )
  121:    DUP 1+  C@ <OPC> 1+  C!    ( opc from GROUP2: )
  122:    2 + @ DUP @                ( tableaddr )
  123:    SWAP 1 cells +             ( end+2 begin )
  124:    ?DO [ forth ] I [ assembler ] @ <M> @ =
  125:        IF [ forth ] I [ assembler ] 1 cells + @ swap 0= LEAVE THEN
  126:    2 cells +LOOP ABORT" Addressmode failed" ;
  127: 
  128:  : SEARCH.MODE.4 ( addr -- xt )
  129:    TRUE SWAP
  130:    DUP     C@ <OPC>     C!    ( opc from GROUP4: )
  131:    DUP 1+  C@ <OPC> 1+  C!    ( opc from GROUP4: )
  132:    DUP 2 + C@ <OPC> 2 + C!    ( opc from GROUP4: )
  133:    DUP 3 + C@ <OPC> 3 + C!    ( opc from GROUP4: )
  134:    4 + @ DUP @                ( tableaddr )
  135:    SWAP 1 cells +             ( end+2 begin )
  136:    ?DO [ forth ] I [ assembler ] @ <M> @ =
  137:        IF [ forth ] I [ assembler ] 1 cells + @ swap 0= LEAVE THEN
  138:    2 cells +LOOP ABORT" Addressmode failed" ;
  139: 
  140: \ GROUPS                                     hfs 07:18 04/24/92
  141: 
  142:  : GROUP2:   CREATE C, C,  ,        ( xt opc opc  -- )
  143:              DOES> SEARCH.MODE.2 EXECUTE RESET ;
  144: 
  145:  : GROUP4:   CREATE C, C,  C, C,  , ( xt opc opc  opc opc  -- )
  146:              DOES> SEARCH.MODE.4 EXECUTE RESET ;
  147: 
  148: \ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  149:  : , opnd? <s-opnd> ! ssave <,> ON ;
  150: \ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  151: 
  152:  : OPC, <OPC> C@ X C, <OPC> 1+ C@ X C, ;
  153: 
  154:  : [An],     <M> 1+ C@ $F0 AND
  155:              CASE
  156:                 %01100000 of s-opnd?  \ [A0]
  157:                              IF abs8? IF %10000000 ELSE %11000000 THEN
  158:                              <M> 1+ C@ $0F AND OR <M> 1+ C! THEN
  159:                           endof
  160:                 %01110000 of s-opnd?  \ [A1]
  161:                              IF abs8? IF %10010000 ELSE %11010000 THEN
  162:                              <M> 1+ C@ $0F AND OR <M> 1+ C! THEN
  163:                           endof
  164:              ENDCASE ;
  165: 
  166:  : ,[An]     <M> 1+ C@ $0F AND
  167:              CASE
  168:                 %0110 of d-opnd?  \ [A0]
  169:                          IF abs8? IF %1000 ELSE %1100 THEN
  170:                          <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
  171:                       endof
  172:                 %0111 of d-opnd?  \ [A1]
  173:                          IF abs8? IF %1001 ELSE %1101 THEN
  174:                          <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
  175:                       endof
  176:              ENDCASE ;
  177: 
  178:  : [SB],     s-opnd?
  179:              IF >abs8? IF %11100000 <M> 1+ C@ $0F AND OR <M> 1+ C! THEN
  180:              ELSE ." displacement expected" ABORT THEN ;
  181: 
  182:  : ,[SB]     d-opnd?
  183:              IF >abs8? IF %1110 <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
  184:              ELSE ." displacement expected" ABORT THEN ;
  185: 
  186:  : [FB],     s-opnd? 0= ABORT" displacement expected" ;
  187: 
  188:  : ,[FB]     d-opnd? 0= ABORT" displacement expected" ;
  189: 
  190:  : abs:16,   s-opnd? 0= ABORT" absolute Adr expected" ;
  191: 
  192:  : ,abs:16   d-opnd? 0= ABORT" absolute Adr expected" ;
  193: 
  194:  : #,        s-opnd? 0= ABORT" operand expected"
  195:              <OPC> 2 + c@ %00000001 and 0= IF <.b> on THEN
  196:              <OPC> 2 + c@ <OPC> c!
  197:              <OPC> 3 + c@ <M> 1+ c@ $0F and or <M> 1+ c! ;
  198: 
  199:  : q#,       s-opnd? 0= ABORT" operand expected"
  200:              s-opnd? d-opnd? and IF swap THEN
  201:              >4B? ABORT" immediate > 4 Bit"
  202:              4 lshift <M> 1+ c@ $0F and or <M> 1+ c! ;
  203: 
  204:  : ctrl,     <M> 1+ C@ %10000000 OR <M> 1+ C! ;
  205: 
  206:  : ,ctrl     <M> 1+ C@ $0F and 4 lshift
  207:              <M> 1+ C@ $F0 and 4 rshift OR %10000000 or <M> 1+ C! ;
  208: \ ----------------------------------------------------------------------------------------------
  209: \ ----------------------------------------------------------------------------------------------
  210:  : GROUP.1B: CREATE C,                 ( opc  -- )
  211:              DOES> c@ X C,
  212:              RESET ;
  213:  %00000100 GROUP.1B: nop
  214: \ ----------------------------------------------------------------------------------------------
  215:  : GROUP.1B.l8: CREATE C,              ( opc  -- )
  216:              DOES> c@ X C,
  217:              opnd? 0= ABORT" label expected"
  218:              >8B?  ABORT" label > 8 Bit" X C,
  219:              RESET ;
  220:  %01101000 GROUP.1B.l8: JGEU ' JGEU alias JC
  221:  %01101001 GROUP.1B.l8: JGTU
  222:  %01101010 GROUP.1B.l8: JEQ  ' JEQ  alias JZ
  223:  %01101011 GROUP.1B.l8: JN
  224:  %01101100 GROUP.1B.l8: JLTU ' JLTU alias JNC
  225:  %01101101 GROUP.1B.l8: JLEU
  226:  %01101110 GROUP.1B.l8: JNE  ' JNE  alias JNZ
  227:  %01101111 GROUP.1B.l8: JPZ
  228:  %11111110 GROUP.1B.l8: JMP.B
  229: \ ----------------------------------------------------------------------------------------------
  230:  : GROUP.1B.l16: CREATE C,              ( opc  -- )
  231:              DOES> c@ X C,
  232:              opnd? 0= ABORT" label expected"
  233:              X ,
  234:              RESET ;
  235:  %11110100 GROUP.1B.l16: JMP.W
  236: \ ----------------------------------------------------------------------------------------------
  237:  : GROUP.2B: CREATE C, C,           ( opc opc  -- )
  238:              DOES>  dup c@ X C, 1+ c@ X C,
  239:              RESET ;
  240:  %11101001 %01111100 GROUP.2B: smovb.b
  241:  %11101000 %01111100 GROUP.2B: smovf.b
  242:  %11101010 %01111100 GROUP.2B: sstr.b
  243: 
  244:  %11101001 %01111101 GROUP.2B: smovb.w
  245:  %11101000 %01111101 GROUP.2B: smovf.w
  246:  %11101010 %01111101 GROUP.2B: sstr.w
  247: \ ----------------------------------------------------------------------------------------------
  248:  : GROUP.2B.l8: CREATE C, C,         ( opc opc  -- )
  249:              DOES>  dup c@ X C, 1+ c@ X C,
  250:              opnd? 0= ABORT" label expected"
  251:              >8B?  ABORT" label > 8 Bit" X C,
  252:              RESET ;
  253:  %11001000 %01111101 GROUP.2B.l8: JLE
  254:  %11001001 %01111101 GROUP.2B.l8: JO
  255:  %11001010 %01111101 GROUP.2B.l8: JGE
  256:  %11001100 %01111101 GROUP.2B.l8: JGT
  257:  %11001101 %01111101 GROUP.2B.l8: JNO
  258:  %11001110 %01111101 GROUP.2B.l8: JLT
  259: \ ----------------------------------------------------------------------------------------------
  260:  : GROUP.2B.F: CREATE C, C,           ( opc opc  -- )
  261:              DOES>   dup c@ X C, 1+ c@ <M> 1+ C@ or X C,
  262:              RESET ;
  263:  %00000101 %11101011 GROUP.2B.F: FCLR
  264:  %00000100 %11101011 GROUP.2B.F: FSET
  265: \ ----------------------------------------------------------------------------------------------
  266:  : ctrl,R    opnd? <d-opnd> !
  267:              ctrl,
  268:              >opc OPC, ;
  269: 
  270:  : ctrl,[An] opnd? <d-opnd> !
  271:              ctrl, ,[An]
  272:              >opc OPC,
  273:              d-opnd?
  274:              IF abs8? IF X C, ELSE X , THEN THEN ;
  275: 
  276:  : ctrl,[SB] opnd? <d-opnd> !
  277:              ctrl, ,[SB]
  278:              >opc OPC,
  279:              abs8? IF X C, ELSE X , THEN ;
  280: 
  281:  : ctrl,[FB] opnd? <d-opnd> !
  282:              ctrl, ,[FB]
  283:              >opc OPC,
  284:              >8B? ABORT" displacement > 8 Bit"
  285:              X C, ;
  286: 
  287:  : ctrl,abs:16 opnd? <d-opnd> !
  288:              ctrl, ,abs:16
  289:              >opc OPC,
  290:              X , ;
  291: 
  292:  Table: st-control-reg
  293:         INTBL , R0     ' ctrl,R TAB,        INTBL , R1     ' ctrl,R TAB,
  294:         INTBL , R2     ' ctrl,R TAB,        INTBL , R3     ' ctrl,R TAB,
  295:         INTBL , A0     ' ctrl,R TAB,        INTBL , A1     ' ctrl,R TAB,
  296:         INTBL , [A0]   ' ctrl,[An] TAB,     INTBL , [A1]   ' ctrl,[An] TAB,
  297:         INTBL , [SB]   ' ctrl,[SB] TAB,     INTBL , [FB]   ' ctrl,[FB] TAB,
  298:         INTBL , abs:16 ' ctrl,abs:16 TAB,
  299:         INTBH , R0     ' ctrl,R TAB,        INTBH , R1     ' ctrl,R TAB,
  300:         INTBH , R2     ' ctrl,R TAB,        INTBH , R3     ' ctrl,R TAB,
  301:         INTBH , A0     ' ctrl,R TAB,        INTBH , A1     ' ctrl,R TAB,
  302:         INTBH , [A0]   ' ctrl,[An] TAB,     INTBH , [A1]   ' ctrl,[An] TAB,
  303:         INTBH , [SB]   ' ctrl,[SB] TAB,     INTBH , [FB]   ' ctrl,[FB] TAB,
  304:         INTBL , abs:16 ' ctrl,abs:16 TAB,
  305:         FLG   , R0     ' ctrl,R TAB,        FLG   , R1     ' ctrl,R TAB,
  306:         FLG   , R2     ' ctrl,R TAB,        FLG   , R3     ' ctrl,R TAB,
  307:         FLG   , A0     ' ctrl,R TAB,        FLG   , A1     ' ctrl,R TAB,
  308:         FLG   , [A0]   ' ctrl,[An] TAB,     FLG   , [A1]   ' ctrl,[An] TAB,
  309:         FLG   , [SB]   ' ctrl,[SB] TAB,     FLG   , [FB]   ' ctrl,[FB] TAB,
  310:         FLG   , abs:16 ' ctrl,abs:16 TAB,
  311:         ISP   , R0     ' ctrl,R TAB,        ISP   , R1     ' ctrl,R TAB,
  312:         ISP   , R2     ' ctrl,R TAB,        ISP   , R3     ' ctrl,R TAB,
  313:         ISP   , A0     ' ctrl,R TAB,        ISP   , A1     ' ctrl,R TAB,
  314:         ISP   , [A0]   ' ctrl,[An] TAB,     ISP   , [A1]   ' ctrl,[An] TAB,
  315:         ISP   , [SB]   ' ctrl,[SB] TAB,     ISP   , [FB]   ' ctrl,[FB] TAB,
  316:         ISP   , abs:16 ' ctrl,abs:16 TAB,
  317:         SP    , R0     ' ctrl,R TAB,        SP    , R1     ' ctrl,R TAB,
  318:         SP    , R2     ' ctrl,R TAB,        SP    , R3     ' ctrl,R TAB,
  319:         SP    , A0     ' ctrl,R TAB,        SP    , A1     ' ctrl,R TAB,
  320:         SP    , [A0]   ' ctrl,[An] TAB,     SP    , [A1]   ' ctrl,[An] TAB,
  321:         SP    , [SB]   ' ctrl,[SB] TAB,     SP    , [FB]   ' ctrl,[FB] TAB,
  322:         SP    , abs:16 ' ctrl,abs:16 TAB,
  323:         SB    , R0     ' ctrl,R TAB,        SB    , R1     ' ctrl,R TAB,
  324:         SB    , R2     ' ctrl,R TAB,        SB    , R3     ' ctrl,R TAB,
  325:         SB    , A0     ' ctrl,R TAB,        SB    , A1     ' ctrl,R TAB,
  326:         SB    , [A0]   ' ctrl,[An] TAB,     SB    , [A1]   ' ctrl,[An] TAB,
  327:         SB    , [SB]   ' ctrl,[SB] TAB,     SB    , [FB]   ' ctrl,[FB] TAB,
  328:         SB    , abs:16 ' ctrl,abs:16 TAB,
  329:         FB    , R0     ' ctrl,R TAB,        FB    , R1     ' ctrl,R TAB,
  330:         FB    , R2     ' ctrl,R TAB,        FB    , R3     ' ctrl,R TAB,
  331:         FB    , A0     ' ctrl,R TAB,        FB    , A1     ' ctrl,R TAB,
  332:         FB    , [A0]   ' ctrl,[An] TAB,     FB    , [A1]   ' ctrl,[An] TAB,
  333:         FB    , [SB]   ' ctrl,[SB] TAB,     FB    , [FB]   ' ctrl,[FB] TAB,
  334:         FB    , abs:16 ' ctrl,abs:16 TAB,
  335: 
  336:  ;TABLE
  337: 
  338:  st-control-reg %11111111 %01111011 GROUP2: stc
  339: 
  340: \ ----------------------------------------------------------------------------------------------
  341:  : R,ctrl    ,ctrl
  342:              >opc OPC, ;
  343: 
  344:  : [An],ctrl opnd? <d-opnd> !
  345:              [An], ,ctrl
  346:              >opc OPC,
  347:              s-opnd?
  348:              IF abs8? IF X C, ELSE X , THEN THEN ;
  349: 
  350:  : [SB],ctrl opnd? <d-opnd> !
  351:              [SB], ,ctrl
  352:              >opc OPC,
  353:              abs8? IF X C, ELSE X , THEN ;
  354: 
  355:  : [FB],ctrl opnd? <d-opnd> !
  356:              [FB], ,ctrl
  357:              >opc OPC,
  358:              >8B? ABORT" displacement > 8 Bit"
  359:              X C, ;
  360: 
  361:  : #,ctrl    #, ,ctrl
  362:              <M> 1+ C@ %01110000 and <M> 1+ C!
  363:              >opc OPC,
  364:              X , ;
  365: 
  366:  Table: ld-control-reg
  367:         R0   , INTBL ' R,ctrl TAB,        R0   , INTBH  ' R,ctrl TAB,
  368:         R0   , FLG   ' R,ctrl TAB,        R0   , ISP    ' R,ctrl TAB,
  369:         R0   , SP    ' R,ctrl TAB,        R0   , SB     ' R,ctrl TAB,
  370:         R0   , FB    ' R,ctrl TAB,
  371:         R1   , INTBL ' R,ctrl TAB,        R1   , INTBH  ' R,ctrl TAB,
  372:         R1   , FLG   ' R,ctrl TAB,        R1   , ISP    ' R,ctrl TAB,
  373:         R1   , SP    ' R,ctrl TAB,        R1   , SB     ' R,ctrl TAB,
  374:         R1   , FB    ' R,ctrl TAB,
  375:         R2   , INTBL ' R,ctrl TAB,        R2   , INTBH  ' R,ctrl TAB,
  376:         R2   , FLG   ' R,ctrl TAB,        R2   , ISP    ' R,ctrl TAB,
  377:         R2   , SP    ' R,ctrl TAB,        R2   , SB     ' R,ctrl TAB,
  378:         R2   , FB    ' R,ctrl TAB,
  379:         R3   , INTBL ' R,ctrl TAB,        R3   , INTBH  ' R,ctrl TAB,
  380:         R3   , FLG   ' R,ctrl TAB,        R3   , ISP    ' R,ctrl TAB,
  381:         R3   , SP    ' R,ctrl TAB,        R3   , SB     ' R,ctrl TAB,
  382:         R3   , FB    ' R,ctrl TAB,
  383:         A0   , INTBL ' R,ctrl TAB,        A0   , INTBH  ' R,ctrl TAB,
  384:         A0   , FLG   ' R,ctrl TAB,        A0   , ISP    ' R,ctrl TAB,
  385:         A0   , SP    ' R,ctrl TAB,        A0   , SB     ' R,ctrl TAB,
  386:         A0   , FB    ' R,ctrl TAB,
  387:         A1   , INTBL ' R,ctrl TAB,        A1   , INTBH  ' R,ctrl TAB,
  388:         A1   , FLG   ' R,ctrl TAB,        A1   , ISP    ' R,ctrl TAB,
  389:         A1   , SP    ' R,ctrl TAB,        A1   , SB     ' R,ctrl TAB,
  390:         A1   , FB    ' R,ctrl TAB,
  391:         [A0] , INTBL ' [An],ctrl TAB,   [A0]   , INTBH  ' [An],ctrl TAB,
  392:         [A0] , FLG   ' [An],ctrl TAB,   [A0]   , ISP    ' [An],ctrl TAB,
  393:         [A0] , SP    ' [An],ctrl TAB,   [A0]   , SB     ' [An],ctrl TAB,
  394:         [A0] , FB    ' [An],ctrl TAB,
  395:         [A1] , INTBL ' [An],ctrl TAB,   [A1]   , INTBH  ' [An],ctrl TAB,
  396:         [A1] , FLG   ' [An],ctrl TAB,   [A1]   , ISP    ' [An],ctrl TAB,
  397:         [A1] , SP    ' [An],ctrl TAB,   [A1]   , SB     ' [An],ctrl TAB,
  398:         [A1] , FB    ' [An],ctrl TAB,
  399:         [SB] , INTBL ' [SB],ctrl TAB,   [SB]   , INTBH  ' [SB],ctrl TAB,
  400:         [SB] , FLG   ' [SB],ctrl TAB,   [SB]   , ISP    ' [SB],ctrl TAB,
  401:         [SB] , SP    ' [SB],ctrl TAB,   [SB]   , SB     ' [SB],ctrl TAB,
  402:         [SB] , FB    ' [FB],ctrl TAB,
  403:         [FB] , INTBL ' [FB],ctrl TAB,   [FB]   , INTBH  ' [FB],ctrl TAB,
  404:         [FB] , FLG   ' [FB],ctrl TAB,   [FB]   , ISP    ' [FB],ctrl TAB,
  405:         [FB] , SP    ' [FB],ctrl TAB,   [FB]   , SB     ' [FB],ctrl TAB,
  406:         [FB] , FB    ' [FB],ctrl TAB,
  407:          #   , INTBL ' #,ctrl TAB,        #    , INTBH  ' #,ctrl TAB,
  408:          #   , FLG   ' #,ctrl TAB,        #    , ISP    ' #,ctrl TAB,
  409:          #   , SP    ' #,ctrl TAB,        #    , SB     ' #,ctrl TAB,
  410:          #   , FB    ' #,ctrl TAB,
  411:  ;TABLE
  412: 
  413:  ld-control-reg %00000000 %11101011  %11111111 %01111010 GROUP4: ldc
  414: 
  415: \ ----------------------------------------------------------------------------------------------
  416:  : (R)    <OPC> 1+ c@ <M> 1+ c@ 4 rshift or <M> 1+ c!
  417:           >opc OPC, ;
  418: 
  419: 
  420:  : ([An]) <OPC> 1+ c@ <M> 1+ c@ 4 rshift or <M> 1+ c!
  421:           <M> 1+ C@ $0F AND
  422:           CASE
  423:               %0110 of opnd?  \ [A0]
  424:                        IF abs8? IF %1000 ELSE %1100 THEN
  425:                        <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
  426:                     endof
  427:               %0111 of opnd?  \ [A1]
  428:                        IF abs8? IF %1001 ELSE %1101 THEN
  429:                        <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
  430:                     endof
  431:            ENDCASE
  432:            >opc OPC,
  433:            <opc> c@ %01111101 = <opc> 1+ c@ %00101100 = and   \ $12345 [ao] jmpi.w
  434:            <opc> c@ %01111101 = <opc> 1+ c@ %00101101 = and   \ $12345 [a1] jmpi.w
  435:            or
  436:            IF   opnd? IF 8B? IF X C, ELSE ta, THEN THEN
  437:            ELSE opnd? IF 8B? IF X C, ELSE X , THEN THEN THEN ;
  438: 
  439:  : ([SB])  <OPC> 1+ c@ <M> 1+ c@ 4 rshift or <M> 1+ c!
  440:            opnd? <d-opnd> !
  441:            ,[SB]
  442:            >opc OPC,
  443:            8B? IF X C, ELSE X , THEN ;
  444: 
  445:  : ([FB])  <OPC> 1+ c@ <M> 1+ c@ 4 rshift or <M> 1+ c!
  446:            opnd? <d-opnd> !
  447:            ,[FB]
  448:            >opc OPC,
  449:            X C, ;
  450: 
  451:  : (abs:16) <OPC> 1+ c@ <M> 1+ c@ 4 rshift or <M> 1+ c!
  452:            opnd? <d-opnd> !
  453:            ,abs:16
  454:            >opc OPC,
  455:            X , ;
  456: 
  457:  : (#)     opnd? 0= ABORT" operand expected"
  458:            <OPC> 1+ c@ %01000000 =
  459:            IF   <OPC> c@
  460:                 CASE
  461:                     %01110100 OF %01111100 <OPC> c! ENDOF
  462:                     %01110101 OF %01111101 <OPC> c! ENDOF
  463:                 ENDCASE
  464:            ELSE
  465:                 ." push.?:g only" ABORT
  466:            THEN %11100010 <M> 1+ c!
  467:            >opc OPC,
  468:            8B? IF X C, ELSE X , THEN ;
  469: 
  470:  Table: 2ByteOPC(dsp8/dsp16)          \ 2ByteOPC(dsp8/dsp16)
  471:         R0          ' (R) TAB,        R1     ' (R) TAB,
  472:         R2          ' (R) TAB,        R3     ' (R) TAB,
  473:         A0          ' (R) TAB,        A1     ' (R) TAB,
  474:         [A0]        ' ([An]) TAB,     [A1]   ' ([An]) TAB,
  475:         [SB]        ' ([SB]) TAB,     [FB]   ' ([FB]) TAB,
  476:         abs:16      ' (abs:16) TAB,    #     ' (#) TAB,
  477:  ;TABLE
  478: 
  479:  2ByteOPC(dsp8/dsp16) %11110000 %01110110 GROUP2: abs.b
  480:  2ByteOPC(dsp8/dsp16) %11100000 %01110110 GROUP2: adcf.b
  481:  2ByteOPC(dsp8/dsp16) %11010000 %01110110 GROUP2: div.b
  482:  2ByteOPC(dsp8/dsp16) %11000000 %01110110 GROUP2: divu.b
  483:  2ByteOPC(dsp8/dsp16) %10010000 %01110110 GROUP2: divx.b
  484:  2ByteOPC(dsp8/dsp16) %01010000 %01110100 GROUP2: neg.b
  485:  2ByteOPC(dsp8/dsp16) %01110000 %01110100 GROUP2: not.b:g
  486:  2ByteOPC(dsp8/dsp16) %11010000 %01110100 GROUP2: pop.b:g
  487:  2ByteOPC(dsp8/dsp16) %01000000 %01110100 GROUP2: push.b:g
  488:  2ByteOPC(dsp8/dsp16) %10100000 %01110110 GROUP2: rolc.b
  489:  2ByteOPC(dsp8/dsp16) %10110000 %01110110 GROUP2: rorc.b
  490: 
  491:  2ByteOPC(dsp8/dsp16) %11110000 %01110111 GROUP2: abs.w
  492:  2ByteOPC(dsp8/dsp16) %11100000 %01110111 GROUP2: adcf.w
  493:  2ByteOPC(dsp8/dsp16) %11010000 %01110111 GROUP2: div.w
  494:  2ByteOPC(dsp8/dsp16) %11000000 %01110111 GROUP2: divu.w
  495:  2ByteOPC(dsp8/dsp16) %10010000 %01110111 GROUP2: divx.w
  496:  2ByteOPC(dsp8/dsp16) %01010000 %01110101 GROUP2: neg.w
  497:  2ByteOPC(dsp8/dsp16) %01110000 %01110101 GROUP2: not.w:g
  498:  2ByteOPC(dsp8/dsp16) %11010000 %01110101 GROUP2: pop.w:g
  499:  2ByteOPC(dsp8/dsp16) %01000000 %01110101 GROUP2: push.w:g
  500:  2ByteOPC(dsp8/dsp16) %10100000 %01110111 GROUP2: rolc.w
  501:  2ByteOPC(dsp8/dsp16) %10110000 %01110111 GROUP2: rorc.w
  502: 
  503:  2ByteOPC(dsp8/dsp16) %00100000 %01111101 GROUP2: jmpi.w
  504:  2ByteOPC(dsp8/dsp16) %00000000 %01111101 GROUP2: jmpi.a
  505: 
  506: \ ----------------------------------------------------------------------------------------------
  507:  : q#,R      opnd? <d-opnd> !
  508:              q#,
  509:              >opc OPC, ;
  510: 
  511:  : q#,[an]   opnd? <d-opnd> !
  512:              q#, ,[an]
  513:              >opc OPC,
  514:              d-opnd?
  515:              IF abs8? IF X C, ELSE X , THEN THEN ;
  516: 
  517:  : q#,[sb]   opnd? <d-opnd> !
  518:              q#, ,[sb]
  519:              >opc OPC,
  520:              abs8? IF X C, ELSE X , THEN ;
  521: 
  522:  : q#,[fb]   opnd? <d-opnd> !
  523:              q#, ,[fb]
  524:              >opc OPC,
  525:              X C, ;
  526: 
  527:  : q#,abs:16 opnd? <d-opnd> !
  528:              q#, ,abs:16
  529:              >opc OPC,
  530:              X , ;
  531:  Table: quick
  532:         #   , R0     ' q#,R TAB,        #   , R1     ' q#,R TAB,
  533:         #   , R2     ' q#,R TAB,        #   , R3     ' q#,R TAB,
  534:         #   , A0     ' q#,R TAB,        #   , A1     ' q#,R TAB,
  535:         #   , [A0]   ' q#,[An] TAB,     #   , [A1]   ' q#,[An] TAB,
  536:         #   , [SB]   ' q#,[SB] TAB,     #   , [FB]   ' q#,[FB] TAB,
  537:         #   , abs:16 ' q#,abs:16 TAB,
  538:  ;TABLE
  539: 
  540:  quick %00000000 %11001000 GROUP2: add.b:q
  541:  quick %00000000 %11010000 GROUP2: cmp.b:q
  542:  quick %00000000 %11011000 GROUP2: mov.b:q
  543: 
  544:  quick %00000000 %11001001 GROUP2: add.w:q
  545:  quick %00000000 %11010001 GROUP2: cmp.w:q
  546:  quick %00000000 %11011001 GROUP2: mov.w:q
  547: 
  548: \ ----------------------------------------------------------------------------------------------
  549:  : R,R      >opc OPC, ;
  550: 
  551:  : R,[An]    opnd? <d-opnd> !
  552:              ,[An]
  553:              >opc OPC,
  554:              d-opnd?
  555:              IF abs8? IF X C, ELSE X , THEN THEN ;
  556: 
  557:  : R,[SB]    opnd? <d-opnd> !
  558:              ,[SB]
  559:              >opc OPC,
  560:              abs8? IF X C, ELSE X , THEN ;
  561: 
  562:  : R,[FB]    opnd? <d-opnd> !
  563:              ,[FB]
  564:              >opc OPC,
  565:              >8B? ABORT" displacement > 8 Bit"
  566:              X C, ;
  567: 
  568:  : R,abs:16  opnd? <d-opnd> !
  569:              ,abs:16
  570:              >opc OPC,
  571:              X , ;
  572: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  573:  : [An],R    opnd? <d-opnd> !
  574:              [An],
  575:              >opc OPC,
  576:              s-opnd?
  577:              IF abs8? IF X C, ELSE X , THEN THEN ;
  578: 
  579:  : [An],[An] opnd? <d-opnd> !
  580:              [An], ,[An]
  581:              >opc OPC,
  582:              s-opnd? d-opnd? and IF swap THEN
  583:              s-opnd?
  584:              IF abs8? IF X C, ELSE X , THEN THEN
  585:              d-opnd?
  586:              IF abs8? IF X C, ELSE X , THEN THEN ;
  587: 
  588:  : [An],[SB] opnd? <d-opnd> !
  589:              [An], ,[SB]
  590:              >opc OPC,
  591:              s-opnd? d-opnd? and IF swap THEN
  592:              s-opnd?
  593:              IF abs8? IF X C, ELSE X , THEN THEN
  594:              abs8? IF X C, ELSE X , THEN ;
  595: 
  596:  : [An],[FB] opnd? <d-opnd> !
  597:              [An], ,[FB]
  598:              >opc OPC,
  599:              s-opnd? d-opnd? and IF swap THEN
  600:              s-opnd?
  601:              IF abs8? IF X C, ELSE X , THEN THEN
  602:              >8B? ABORT" displacement > 8 Bit"
  603:              X C, ;
  604: 
  605:  : [An],abs:16 opnd? <d-opnd> !
  606:              [An], ,abs:16
  607:              >opc OPC,
  608:              s-opnd? d-opnd? and IF swap THEN
  609:              s-opnd?
  610:              IF abs8? IF X C, ELSE X , THEN THEN
  611:              X , ;
  612: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  613:  : [SB],R    opnd? <d-opnd> !
  614:              [SB],
  615:              >opc OPC,
  616:              abs8? IF X C, ELSE X , THEN ;
  617: 
  618:  : [SB],[An] opnd? <d-opnd> !
  619:              [SB], ,[An]
  620:              >opc OPC,
  621:              s-opnd? d-opnd? and IF swap THEN
  622:              abs8? IF X C, ELSE X , THEN
  623:              d-opnd?
  624:              IF abs8? IF X C, ELSE X , THEN THEN ;
  625: 
  626:  : [SB],[SB] opnd? <d-opnd> !
  627:              [SB], ,[SB]
  628:              >opc OPC,
  629:              swap
  630:              abs8? IF X C, ELSE X , THEN
  631:              abs8? IF X C, ELSE X , THEN ;
  632: 
  633:  : [SB],[FB] opnd? <d-opnd> !
  634:              [SB], ,[FB]
  635:              >opc OPC,
  636:              swap
  637:              abs8? IF X C, ELSE X , THEN
  638:              >8B? ABORT" displacement > 8 Bit"
  639:              X C, ;
  640: 
  641:  : [SB],abs:16 opnd? <d-opnd> !
  642:              [SB], ,abs:16
  643:              >opc OPC,
  644:              swap
  645:              abs8? IF X C, ELSE X , THEN
  646:              X , ;
  647: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  648:  : [FB],R    opnd? <d-opnd> !
  649:              [FB],
  650:              >opc OPC,
  651:              >8B? ABORT" displacement > 8 Bit"
  652:              X C, ;
  653: 
  654:  : [FB],[An] opnd? <d-opnd> !
  655:              [FB], ,[An]
  656:              >opc OPC,
  657:              s-opnd? d-opnd? and IF swap THEN
  658:              >8B? ABORT" displacement > 8 Bit"
  659:              X C, 
  660:              d-opnd?
  661:              IF abs8? IF X C, ELSE X , THEN THEN ;
  662: 
  663:  : [FB],[SB] opnd? <d-opnd> !
  664:              [FB], ,[SB]
  665:              >opc OPC,
  666:              swap
  667:              >8B? ABORT" displacement > 8 Bit"
  668:              X C, 
  669:              abs8? IF X C, ELSE X , THEN ;
  670: 
  671:  : [FB],[FB] opnd? <d-opnd> !
  672:              [FB], ,[FB]
  673:              >opc OPC,
  674:              swap
  675:              >8B? ABORT" displacement > 8 Bit"
  676:              X C, 
  677:              d-opnd?
  678:              IF 8B?   IF X C, ELSE X , THEN THEN ;
  679: 
  680:  : [FB],abs:16 opnd? <d-opnd> !
  681:              [FB], ,abs:16
  682:              >opc OPC,
  683:              swap
  684:              >8B? ABORT" displacement > 8 Bit"
  685:              X C,
  686:              X , ;
  687: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  688:  : abs:16,R  opnd? <d-opnd> !
  689:              abs:16,
  690:              >opc OPC,
  691:              X , ;
  692: 
  693:  : abs:16,[An] opnd? <d-opnd> !
  694:              abs:16, ,[An]
  695:              >opc OPC,
  696:              s-opnd? d-opnd? and IF swap THEN
  697:              X ,
  698:              d-opnd?
  699:              IF abs8? IF X C, ELSE X , THEN THEN ;
  700: 
  701:  : abs:16,[SB] opnd? <d-opnd> !
  702:              abs:16, ,[SB]
  703:              >opc OPC,
  704:              swap
  705:              X ,
  706:              abs8? IF X C, ELSE X , THEN ;
  707: 
  708:  : abs:16,[FB] opnd? <d-opnd> !
  709:              abs:16, ,[FB]
  710:              >opc OPC,
  711:              swap
  712:              X ,
  713:              >8B? ABORT" displacement > 8 Bit"
  714:              X C, ;
  715: 
  716:  : abs:16,abs:16 opnd? <d-opnd> !
  717:              abs:16, ,abs:16
  718:              >opc OPC,
  719:              swap
  720:              X ,
  721:              X , ;
  722: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  723:  : #,R       opnd? <d-opnd> !
  724:              #,
  725:              >opc OPC,
  726:              <.b> @ IF X C, ELSE X , THEN ;
  727: 
  728:  : #,[An]    opnd? <d-opnd> !
  729:              #, ,[An]
  730:              >opc OPC,
  731:              d-opnd?
  732:              IF abs8? IF X C, ELSE X , THEN THEN
  733:              <.b> @ IF X C, ELSE X , THEN ;
  734: 
  735:  : #,[SB]    opnd? <d-opnd> !
  736:              #, ,[SB]
  737:              >opc OPC,
  738:              abs8? IF X C, ELSE X , THEN
  739:              <.b> @ IF X C, ELSE X , THEN ;
  740: 
  741:  : #,[FB]    opnd? <d-opnd> !
  742:              #, ,[FB]
  743:              >opc OPC,
  744:              >8B? ABORT" displacement > 8 Bit"
  745:              X C, 
  746:              <.b> @ IF X C, ELSE X , THEN ;
  747: 
  748:  : #,abs:16  opnd? <d-opnd> !
  749:              #, ,abs:16
  750:              >opc OPC,
  751:              X ,
  752:              <.b> @ IF X C, ELSE X , THEN ;
  753: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  754:  Table: generic
  755:         R0   , R0     ' R,R TAB,        R0   , R1     ' R,R TAB,
  756:         R0   , R2     ' R,R TAB,        R0   , R3     ' R,R TAB,
  757:         R0   , A0     ' R,R TAB,        R0   , A1     ' R,R TAB,
  758:         R0   , [A0]   ' R,[An] TAB,     R0   , [A1]   ' R,[An] TAB,
  759:         R0   , [SB]   ' R,[SB] TAB,     R0   , [FB]   ' R,[FB] TAB,
  760:         R0   , abs:16 ' R,abs:16 TAB,
  761: 
  762:         R1   , R0     ' R,R TAB,        R1   , R1     ' R,R TAB,
  763:         R1   , R2     ' R,R TAB,        R1   , R3     ' R,R TAB,
  764:         R1   , A0     ' R,R TAB,        R1   , A1     ' R,R TAB,
  765:         R1   , [A0]   ' R,[An] TAB,     R1   , [A1]   ' R,[An] TAB,
  766:         R1   , [SB]   ' R,[SB] TAB,     R1   , [FB]   ' R,[FB] TAB,
  767:         R1   , abs:16 ' R,abs:16 TAB,
  768: 
  769:         R2   , R0     ' R,R TAB,        R2   , R1     ' R,R TAB,
  770:         R2   , R2     ' R,R TAB,        R2   , R3     ' R,R TAB,
  771:         R2   , A0     ' R,R TAB,        R2   , A1     ' R,R TAB,
  772:         R2   , [A0]   ' R,[An] TAB,     R2   , [A1]   ' R,[An] TAB,
  773:         R2   , [SB]   ' R,[SB] TAB,     R2   , [FB]   ' R,[FB] TAB,
  774:         R2   , abs:16 ' R,abs:16 TAB,
  775: 
  776:         R3   , R0     ' R,R TAB,        R3   , R1     ' R,R TAB,
  777:         R3   , R2     ' R,R TAB,        R3   , R3     ' R,R TAB,
  778:         R3   , A0     ' R,R TAB,        R3   , A1     ' R,R TAB,
  779:         R3   , [A0]   ' R,[An] TAB,     R3   , [A1]   ' R,[An] TAB,
  780:         R3   , [SB]   ' R,[SB] TAB,     R3   , [FB]   ' R,[FB] TAB,
  781:         R3   , abs:16 ' R,abs:16 TAB,
  782: 
  783:         A0   , R0     ' R,R TAB,        A0   , R1     ' R,R TAB,
  784:         A0   , R2     ' R,R TAB,        A0   , R3     ' R,R TAB,
  785:         A0   , A0     ' R,R TAB,        A0   , A1     ' R,R TAB,
  786:         A0   , [A0]   ' R,[An] TAB,     A0   , [A1]   ' R,[An] TAB,
  787:         A0   , [SB]   ' R,[SB] TAB,     A0   , [FB]   ' R,[FB] TAB,
  788:         A0   , abs:16 ' R,abs:16 TAB,
  789: 
  790:         A1   , R0     ' R,R TAB,        A1   , R1     ' R,R TAB,
  791:         A1   , R2     ' R,R TAB,        A1   , R3     ' R,R TAB,
  792:         A1   , A0     ' R,R TAB,        A1   , A1     ' R,R TAB,
  793:         A1   , [A0]   ' R,[An] TAB,     A1   , [A1]   ' R,[An] TAB,
  794:         A1   , [SB]   ' R,[SB] TAB,     A1   , [FB]   ' R,[FB] TAB,
  795:         A1   , abs:16 ' R,abs:16 TAB,
  796: 
  797:         [A0] , R0     ' [An],R  TAB,      [A0] , R1     ' [An],R  TAB,
  798:         [A0] , R2     ' [An],R  TAB,      [A0] , R3     ' [An],R  TAB,
  799:         [A0] , A0     ' [An],R  TAB,      [A0] , A1     ' [An],R  TAB,
  800:         [A0] , [A0]   ' [An],[An] TAB,    [A0] , [A1]   ' [An],[An] TAB,
  801:         [A0] , [SB]   ' [An],[SB] TAB,    [A0] , [FB]   ' [An],[FB] TAB,
  802:         [A0] , abs:16 ' [An],abs:16 TAB,
  803: 
  804:         [A1] , R0     ' [An],R  TAB,      [A1] , R1     ' [An],R  TAB,
  805:         [A1] , R2     ' [An],R  TAB,      [A1] , R3     ' [An],R  TAB,
  806:         [A1] , A0     ' [An],R  TAB,      [A1] , A1     ' [An],R  TAB,
  807:         [A1] , [A0]   ' [An],[An] TAB,    [A1] , [A1]   ' [An],[An] TAB,
  808:         [A1] , [SB]   ' [An],[SB] TAB,    [A1] , [FB]   ' [An],[FB] TAB,
  809:         [A1] , abs:16 ' [An],abs:16 TAB,
  810: 
  811:         [SB] , R0     ' [SB],R TAB,       [SB] , R1     ' [SB],R TAB,
  812:         [SB] , R2     ' [SB],R TAB,       [SB] , R3     ' [SB],R TAB,
  813:         [SB] , A0     ' [SB],R TAB,       [SB] , A1     ' [SB],R TAB,
  814:         [SB] , [A0]   ' [SB],[An] TAB,    [SB] , [A1]   ' [SB],[An] TAB,
  815:         [SB] , [SB]   ' [SB],[SB] TAB,    [SB] , [FB]   ' [SB],[FB] TAB,
  816:         [SB] , abs:16 ' [SB],abs:16 TAB,
  817: 
  818:         [FB] , R0     ' [FB],R TAB,       [FB] , R1     ' [FB],R TAB,
  819:         [FB] , R2     ' [FB],R TAB,       [FB] , R3     ' [FB],R TAB,
  820:         [FB] , A0     ' [FB],R TAB,       [FB] , A1     ' [FB],R TAB,
  821:         [FB] , [A0]   ' [FB],[An] TAB,    [FB] , [A1]   ' [FB],[An] TAB,
  822:         [FB] , [SB]   ' [FB],[SB] TAB,    [FB] , [FB]   ' [FB],[FB] TAB,
  823:         [FB] , abs:16 ' [FB],abs:16 TAB,
  824: 
  825:          #   , R0     '  #,R TAB,          #   , R1     ' #,R TAB,
  826:          #   , R2     '  #,R TAB,          #   , R3     ' #,R TAB,
  827:          #   , A0     '  #,R TAB,          #   , A1     ' #,R TAB,
  828:          #   , [A0]   '  #,[An] TAB,       #   , [A1]   ' #,[An] TAB,
  829:          #   , [SB]   '  #,[SB] TAB,       #   , [FB]   ' #,[FB] TAB,
  830:          #   , abs:16 '  #,abs:16 TAB,
  831: 
  832:       abs:16 , R0     ' abs:16,R TAB,      abs:16 , R1   ' abs:16,R TAB,
  833:       abs:16 , R2     ' abs:16,R TAB,      abs:16 , R3   ' abs:16,R TAB,
  834:       abs:16 , A0     ' abs:16,R TAB,      abs:16 , A1   ' abs:16,R TAB,
  835:       abs:16 , [A0]   ' abs:16,[An] TAB,   abs:16 , [A1] ' abs:16,[An] TAB,
  836:       abs:16 , [SB]   ' abs:16,[SB] TAB,   abs:16 , [FB] ' abs:16,[FB] TAB,
  837:       abs:16 , abs:16 ' abs:16,abs:16 TAB,
  838:  ;TABLE
  839: 
  840:  generic %01100000 %01110110  %11111111 %10110000 GROUP4: adc.b
  841:  generic %01000000 %01110110  %11111111 %10100000 GROUP4: add.b:g
  842:  generic %00100000 %01110110  %11111111 %10010000 GROUP4: and.b:g
  843:  generic %10000000 %01110110  %11111111 %11000000 GROUP4: cmp.b:g
  844:  generic %11000000 %01110100  %11111111 %01110010 GROUP4: mov.b:g
  845:  generic %01010000 %01111100  %11111111 %01111000 GROUP4: mul.b:g
  846:  generic %01000000 %01111100  %11111111 %01110000 GROUP4: mulu.b:g
  847:  generic %00110000 %01110110  %11111111 %10011000 GROUP4: or.b:g
  848:  generic %01110000 %01110110  %11111111 %10111000 GROUP4: sbb.b
  849:  generic %01010000 %01110110  %11111111 %10101000 GROUP4: sub.b:g
  850:  generic %00000000 %01110110  %11111111 %10000000 GROUP4: tst.b
  851:  generic %00010000 %01110110  %11111111 %10001000 GROUP4: xor.b
  852: 
  853:  generic %01100000 %01110111  %11111111 %10110001 GROUP4: adc.w
  854:  generic %01000000 %01110111  %11111111 %10100001 GROUP4: add.w:g
  855:  generic %00100000 %01110111  %11111111 %10010001 GROUP4: and.w:g
  856:  generic %10000000 %01110111  %11111111 %11000001 GROUP4: cmp.w:g
  857:  generic %11000000 %01110101  %11111111 %01110011 GROUP4: mov.w:g
  858:  generic %01010000 %01111101  %11111111 %01111001 GROUP4: mul.w:g
  859:  generic %01000000 %01111101  %11111111 %01110001 GROUP4: mulu.w:g
  860:  generic %00110000 %01110111  %11111111 %10011001 GROUP4: or.w:g
  861:  generic %01110000 %01110111  %11111111 %10111001 GROUP4: sbb.w
  862:  generic %01010000 %01110111  %11111111 %10101001 GROUP4: sub.w:g
  863:  generic %00000000 %01110111  %11111111 %10000001 GROUP4: tst.w
  864:  generic %00010000 %01110111  %11111111 %10001001 GROUP4: xor.w
  865: 
  866: \ ----------------------------------------------------------------------------------------------
  867:  : r1h,      <OPC> 1 + c@ $F0 and <M> 1+ c@ $0F and or <M> 1+ c! ;
  868: 
  869:  : R1H,R      r1h, r,r ;
  870: 
  871:  : R1H,[An]   r1h, r,[An] ;
  872: 
  873:  : R1H,[SB]   r1h, r,[SB] ;
  874: 
  875:  : R1H,[FB]   r1h, r,[FB] ;
  876: 
  877:  : R1H,abs:16 r1h, r,abs:16 ;
  878: 
  879: \ ----------------------------------------------------------------------------------------------
  880:  : rot#        CASE
  881:                  1 of $00 endof
  882:                  2 of $10 endof
  883:                  3 of $20 endof
  884:                  4 of $30 endof
  885:                  5 of $40 endof
  886:                  6 of $50 endof
  887:                  7 of $60 endof
  888:                  8 of $70 endof
  889:                 -1 of $80 endof
  890:                 -2 of $90 endof
  891:                 -3 of $A0 endof
  892:                 -4 of $B0 endof
  893:                 -5 of $C0 endof
  894:                 -6 of $D0 endof
  895:                 -7 of $E0 endof
  896:                 -8 of $F0 endof
  897:                 abort
  898:                ENDCASE ;
  899: 
  900:  : rot#,       s-opnd? 0= ABORT" operand expected"
  901:                <OPC> 2 + c@ <OPC> c!
  902:                s-opnd? d-opnd? and IF swap THEN
  903:                rot# <M> 1+ c@ $0F and or <M> 1+ c! ;
  904: 
  905:  : rot#,R      rot#,
  906:                >opc OPC, ;
  907: 
  908:  : rot#,[An]   opnd? <d-opnd> !
  909:                rot#, ,[An]
  910:                >opc OPC,
  911:                d-opnd?
  912:                IF abs8? IF X C, ELSE X , THEN THEN ;
  913: 
  914:  : rot#,[SB]   opnd? <d-opnd> !
  915:                rot#, ,[SB]
  916:                >opc OPC,
  917:                abs8? IF X C, ELSE X , THEN ;
  918: 
  919:  : rot#,[FB]   opnd? <d-opnd> !
  920:                rot#, ,[FB]
  921:                >opc OPC,
  922:                >8B? ABORT" displacement > 8 Bit"
  923:                X C, ;
  924: 
  925:  : rot#,abs:16 opnd? <d-opnd> !
  926:                rot#, ,abs:16
  927:                >opc OPC,
  928:                X , ;
  929: 
  930:  Table: rot-group
  931:          R1H , R0L    '  R1H,R TAB,          R1H , R0H    ' R1H,R TAB,
  932:          R1H , R1L    '  R1H,R TAB,          R1H , R3     ' R1H,R TAB,
  933:          R1H , A0     '  R1H,R TAB,          R1H , A1     ' R1H,R TAB,
  934:          R1H , [A0]   '  R1H,[An] TAB,       R1H , [A1]   ' R1H,[An] TAB,
  935:          R1H , [SB]   '  R1H,[SB] TAB,       R1H , [FB]   ' R1H,[FB] TAB,
  936:          R1H , abs:16 '  R1H,abs:16 TAB,
  937:            # , R0L    ' rot#,R TAB,            # , R0H    ' rot#,R TAB,
  938:            # , R1L    ' rot#,R TAB,            # , R3     ' rot#,R TAB,
  939:            # , A0     ' rot#,R TAB,            # , A1     ' rot#,R TAB,
  940:            # , [A0]   ' rot#,[An] TAB,         # , [A1]   ' rot#,[An] TAB,
  941:            # , [SB]   ' rot#,[SB] TAB,         # , [FB]   ' rot#,[FB] TAB,
  942:            # , abs:16 ' rot#,abs:16 TAB,
  943:  ;TABLE
  944: 
  945:  rot-group %00001111 %11100001 %01101111 %01110101 GROUP4: rot.w
  946:  rot-group %00001111 %11101001 %11101111 %01110101 GROUP4: shl.w
  947:  rot-group %00001111 %11110001 %11111111 %01110101 GROUP4: sha.w
  948: 
  949:  rot-group %00001111 %11100000 %01101111 %01110100 GROUP4: rot.b
  950:  rot-group %00001111 %11101000 %11101111 %01110100 GROUP4: shl.b
  951:  rot-group %00001111 %11110000 %11111111 %01110100 GROUP4: sha.b
  952: 
  953: \ ----------------------------------------------------------------------------------------------
  954:  ' noop alias bit
  955: 
  956:  : bit,      s-opnd? 0= ABORT" operand expected"
  957:              <OPC> 1+ C@ $F0 AND <M> 1+ c@ $0F AND OR <M> 1+ c! ;
  958: 
  959:  : bit,R      bit,
  960:               >opc OPC,
  961:               %00000111 and
  962:               X c, ;
  963: 
  964:  : bit[An]    <OPC> 1+ c@ $F0 AND <M> 1+ c@ 4 rshift or <M> 1+ c!
  965:               <M> 1+ C@ $0F AND
  966:               CASE
  967:               %0110 of opnd?  \ [A0]
  968:                        IF abs8? IF %1000 ELSE %1100 THEN
  969:                        <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
  970:                     endof
  971:               %0111 of opnd?  \ [A1]
  972:                        IF abs8? IF %1001 ELSE %1101 THEN
  973:                        <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
  974:                     endof
  975:               ENDCASE
  976:               >opc OPC,
  977:               opnd?
  978:               IF abs8? IF X C, ELSE X , THEN THEN ;
  979: 
  980:  : bit,[SB]   opnd? <d-opnd> !
  981:               bit, ,[SB]
  982:               3 lshift swap %00000111 and or
  983:               >abs8? IF %1110 <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
  984:               >opc OPC,
  985:               abs8? IF X C, ELSE X , THEN ;
  986: 
  987:  : bit,[FB]   opnd? <d-opnd> !
  988:               bit, ,[FB]
  989:               >opc OPC,
  990:               3 lshift swap %00000111 and or
  991:               >8B? ABORT" displacement > 8 Bit"
  992:               X C, ;
  993: 
  994:  : bit,abs:16 opnd? <d-opnd> !
  995:               bit, ,abs:16
  996:               >opc OPC,
  997:               3 lshift swap %00000111 and or
  998:               X , ;
  999: 
 1000:  Table: bit-group
 1001:          bit , R0     '  bit,R TAB,          bit , R1     ' bit,R TAB,
 1002:          bit , R2     '  bit,R TAB,          bit , R3     ' bit,R TAB,
 1003:          bit , A0     '  bit,R TAB,          bit , A1     ' bit,R TAB,
 1004:                [A0]   '   bit[An] TAB,             [A1]   '  bit[An] TAB,
 1005:          bit , [SB]   '  bit,[SB] TAB,       bit , [FB]   ' bit,[FB] TAB,
 1006:          bit , abs:16 '  bit,abs:16 TAB,
 1007:  ;TABLE
 1008: 
 1009:  bit-group %01001111 %01111110 GROUP2: band
 1010:  bit-group %10001111 %01111110 GROUP2: bclr:g
 1011:  bit-group %01011111 %01111110 GROUP2: bnand
 1012:  bit-group %01111111 %01111110 GROUP2: bnor
 1013:  bit-group %10101111 %01111110 GROUP2: bnot:g
 1014:  bit-group %00111111 %01111110 GROUP2: bntst
 1015:  bit-group %11011111 %01111110 GROUP2: bnxor
 1016:  bit-group %01101111 %01111110 GROUP2: bor
 1017:  bit-group %10011111 %01111110 GROUP2: bset:g
 1018:  bit-group %10111111 %01111110 GROUP2: btst:g
 1019:  bit-group %00001111 %01111110 GROUP2: btstc
 1020:  bit-group %00011111 %01111110 GROUP2: btsts
 1021:  bit-group %11001111 %01111110 GROUP2: bxor
 1022: \ ----------------------------------------------------------------------------------------------
 1023: \ register definition
 1024:   ' R2 Alias rp
 1025:   ' R0 Alias tos
 1026:   ' A1 Alias ip
 1027:   ' A0 Alias w
 1028:   ' [A1] Alias [ip]
 1029:   ' [A0] Alias [w]
 1030: \ ----------------------------------------------------------------------------------------------
 1031: 
 1032: 	 $68 Constant u<
 1033: 	 $69 Constant u<=
 1034: 	 $6A Constant 0<>
 1035: 	 $6B Constant 0>=
 1036: 	 $6C Constant u>=
 1037: 	 $6D Constant u>
 1038: 	 $6E Constant 0=
 1039: 	 $6F Constant 0<
 1040: 	 
 1041: : IF          X c,   X here  0 X c, reset ;
 1042: : THEN        X here  over - swap X c! reset  ;
 1043: : AHEAD       $FE IF ;
 1044: : ELSE        AHEAD swap THEN reset ;
 1045: : WHILE       IF swap reset ;
 1046: : BEGIN       X here reset ;
 1047: : UNTIL       X c,   X here -  X c, reset  ;
 1048: : AGAIN       $FE UNTIL reset ;
 1049: : REPEAT      AGAIN THEN reset ;
 1050: 
 1051: 	 
 1052: \ include asm-test.fs
 1053: 
 1054:  HERE  SWAP -
 1055:  CR .( Length of Assembler: ) . .( Bytes ) CR
 1056: 
 1057: 

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