\ 1802opcodes3

needs 1802cycle
needs 1802regs
needs 1802io

hex

\ opcode 8N
: #GLO  ( opcode -- )
    0F and  R c@lobyte  D! ;

\ opcode 9N
: #GHI  ( opcode -- )
    0F and  R c@hibyte  D! ;

\ opcode AN
: #PLO  ( opcode -- )
    D@  swap
    0F and  R    c!lobyte ;

\ opcode BN
: #PHI  ( opcode -- )
     D@  swap
    0F and  R    c!hibyte ;
  
: do-long-branch  ( opcode -- )
    drop cycle
    fetch-byte   8 lshift    ( hi )
    fetch-byte  ( hi lo )
    or                     ( newaddr )
    P @  R ! ;

: do-long-condbr  ( opcode flag -- )
    if        do-long-branch
    else   drop cycle   2 P @  R +!
    then ;

\ opcode C0
: #LBR  ( opcode -- )
    do-long-branch ;

\ opcode C1
: #LBQ  ( opcode -- )
    Q@ do-long-condbr ;

\ opcode C2
: #LBZ  ( opcode -- )
    D@ 0= do-long-condbr ;

\ opcode C3
: #LBDF  ( opcode -- )
    DF @  do-long-condbr ;

\ opcode C4
: #NOP  ( opcode -- )
    drop cycle ;

: do-long-skip  ( opcode -- )
    drop cycle
    2  P @  R +! ;

: do-long-condsk  ( opcode flag -- )
    if        do-long-skip
    else   drop cycle
    then ;

\ opcode C5
: #LSNQ  ( opcode -- )
    Q@ 0= do-long-condsk ;

\ opcode C6
: #LSNZ  ( opcode -- )
    D@  do-long-condsk ;

\ opcode C7
: #LSNF  ( opcode -- )
    DF @ 0=  do-long-condsk ;

\ opcode C8
: #LSKP  ( opcode -- )
    do-long-skip ;

\ opcode C9
: #LBNQ  ( opcode -- )
    Q@ 0= do-long-condbr ;

\ opcode CA
: #LBNZ  ( opcode -- )
    D@ do-long-condbr ;

\ opcode CB
: #LBNF  ( opcode -- )
    DF @ 0= do-long-condbr ;

\ opcode CC
: #LSIE  ( opcode -- )
    IE @ do-long-condsk ;

\ opcode CD
: #LSQ  ( opcode -- )
    Q@ do-long-condsk ;

\ opcode CE
: #LSZ  ( opcode -- )
    D@ 0= do-long-condsk ;

\ opcode CF
: #LSDF  ( opcode -- )
    DF @ do-long-condsk ;

\ opcode DN
: #SEP  ( opcode -- )
    0F and   P ! ;

\ opcode EN
: #SEX  ( opcode -- )
    0F and   X ! ;

\ opcode F0
: #LDX  ( opcode -- )
    drop
    M(R(X))@   D! ;

\ opcode F1
: #OR  ( opcode -- )
    drop
    M(R(X))@  D@ or    D! ;

\ opcode F2
: #AND  ( opcode -- )
    drop
    M(R(X))@  D@ and    D! ;

\ opcode F3
: #XOR  ( opcode -- )
    drop
    M(R(X))@  D@ xor    D! ;

\ opcode F4
: #ADD  ( opcode -- )
    drop
    M(R(X))@  D@   +
    dup  D!
    0100 and  DF ! ;

\ opcode F5
: #SD  ( opcode -- )
    drop
    M(R(X))@  D@   -
    dup   D!
    0100 and  0= DF ! ;

\ opcode F6
: #SHR  ( opcode -- )
    drop
    D@
    dup 0001 and             ( d lsb )
    DF !
    2/   D! ;

\ opcode F7
: #SM  ( opcode -- )
    drop
    D@   M(R(X))@   -
    dup   D!
    0100 and  0=  DF ! ;  

\ opcode F8
: #LDI  ( opcode -- )
    drop
    fetch-byte  D! ;

\ opcode F9
: #ORI  ( opcode -- )
    drop
    fetch-byte   D@  or  D! ;

\ opcode FA
: #ANI  ( opcode -- )
    drop
    fetch-byte   D@  and  D! ;

\ opcode FB
: #XRI  ( opcode -- )
    drop
    fetch-byte   D@  xor  D! ;

\ opcode FC
: #ADI  ( opcode -- )
    drop
    fetch-byte  D@  +
    dup  D!
    0100 and  DF ! ;

\ opcode FD
: #SDI  ( opcode -- )
    drop
    fetch-byte  D@  -
    dup   D!
    0100 and  0=  DF ! ;

\ opcode FE
: #SHL  ( opcode -- )
    drop
    D@
    dup 0080 and             ( d lsb )
    DF !
    2*   D! ;

\ opcode FF
: #SMI  ( opcode -- )
    drop
    D@   fetch-byte -
    dup  D!
    0100 and   0=  DF ! ;


