Repository URL to install this package:
|
Version:
9.0~240925-3.fc42 ▾
|
/*
* Interactive disassembler (IDA).
* Version 3.05
* Copyright (c) 1990-95 by Ilfak Guilfanov.
* ALL RIGHTS RESERVED.
* FIDO: 2:5020/209
* E-mail: ig@estar.msk.su
*
*/
#include "7900.hpp"
#define SetTypeDataM (getFlag_M ? dt_byte : dt_word)
#define SetTypeDataX (getFlag_X ? dt_byte : dt_word)
//----------------------------------------------------------------------
// reg - register
//
inline void Operand_Registr(op_t &x, uint16 rReg)
{
x.type = o_reg;
x.reg = rReg;
// x.dtype = dt_word; // For A and B, for E need dt_dword
}
//----------------------------------------------------------------------
static void Operand_Imm_32(insn_t &insn, op_t &x)
{
uint32 L_L = insn.get_next_byte();
uint32 L_H = insn.get_next_byte();
uint32 H_L = insn.get_next_byte();
uint32 H_H = insn.get_next_byte();
uint32 data = ((L_L | (H_H<<24)) | (H_L << 16)) | (L_H<<8);
x.type = o_imm;
x.value = data;
x.dtype = dt_dword;
x.xmode = IMM_32;
}
//----------------------------------------------------------------------
static void Operand_Imm_16(insn_t &insn, op_t &x)
{
uint32 high = insn.get_next_byte();
uint32 low = insn.get_next_byte();
uint32 data = high | (low<<8);
x.type = o_imm;
x.value = data;
x.dtype = dt_word;
x.xmode = IMM_16;
}
//----------------------------------------------------------------------
static void Operand_Imm_8(insn_t &insn, op_t &x)
{
uint32 high = insn.get_next_byte();
x.type = o_imm;
x.value = high;
x.dtype = dt_byte;
x.xmode = IMM_8;
}
//----------------------------------------------------------------------
// Raz - instruction bitness (8, 16, 32)
//----------------------------------------------------------------------
static void Operand_Imm(insn_t &insn, op_t &x, int Raz)
{
switch ( Raz )
{
case 8: Operand_Imm_8(insn, x); break;
case 16: Operand_Imm_16(insn, x); break;
case 32: Operand_Imm_32(insn, x); break;
}
}
//----------------------------------------------------------------------
static void Operand_Imm_Spesh(op_t &x, uchar dtype, uint32 data)
{
uchar type = 0;
x.type = o_imm;
x.value = data;
x.dtype = dtype;
if ( dtype == dt_byte )
type= IMM_8;
if ( dtype == dt_word )
type= IMM_16;
x.xmode = type;
}
sel_t getDPR(const insn_t &insn, int iDPR)
{
switch ( iDPR )
{
case 0x0: return getDPR0;
case 0x40: return getDPR1;
case 0x80: return getDPR2;
case 0xC0: return getDPR3;
}
return 0;
}
//----------------------------------------------------------------------
// TypeDIR
// TDIR_DIR - Direct addressing mode DIR
// TDIR_DIR_X - Direct index X addressing DIR,X
// TDIR_DIR_Y - Direct index Y addressing DIR,Y
// TDIR_INDIRECT_DIR - Direct indirect addressing mode (DIR)
// TDIR_INDIRECT_DIR_X - Direct index X indirect addressing mode (DIR,X)
// TDIR_INDIRECT_DIR_Y - Direct index Y indirect addressing mode (DIR,Y)
// TDIR_L_INDIRECT_DIR - Direct indirect long addressing mode L(DIR)
// TDIR_L_INDIRECT_DIR_Y - Direct indirect long indexed Y addressing mode L(DIR),Y
//
//----------------------------------------------------------------------
inline void DIR(insn_t &insn, op_t &x, uchar TypeDir, char dtype)
{
uint32 higth = insn.get_next_byte();
uint32 Addr;
if ( getDPReg == 1 )
{
sel_t ValDPR = getDPR(insn, higth & 0xC0);
Addr = uint32(ValDPR + higth);
}
else
{
Addr = uint32(getDPR0 + higth);
}
x.type = o_mem;
x.addr = Addr;
x.dtype = dtype;
x.TypeOper = TypeDir;
}
static void LDIR(insn_t &insn, op_t &x, uchar TypeDir, char dtype)
{
uint32 higth = insn.get_next_byte();
uint32 Addr;
if ( getDPReg == 1 )
{
sel_t ValDPR = getDPR(insn, higth & 0xC0);
Addr = uint32(ValDPR + higth);
}
else
{
Addr = uint32(getDPR0 + higth);
}
x.type = o_mem;
x.addr = Addr;
x.dtype = dtype;
x.TypeOper = TypeDir;
}
//----------------------------------------------------------------------
// TypeDIR
// TDIR_DIR - Direct addressing mode DIR
// TDIR_DIR_X - Direct index X addressing DIR,X
// TDIR_DIR_Y - Direct index Y addressing DIR,Y
// TDIR_INDIRECT_DIR - Direct indirect addressing mode (DIR)
// TDIR_INDIRECT_DIR_X - Direct index X indirect addressing mode (DIR,X)
// TDIR_INDIRECT_DIR_Y - Direct index Y indirect addressing mode (DIR,Y)
// TDIR_L_INDIRECT_DIR - Direct indirect long addressing mode L(DIR)
// TDIR_L_INDIRECT_DIR_Y - Direct indirect long indexed Y addressing mode L(DIR),Y
//
//
// dtype - target data type for memory cell
//----------------------------------------------------------------------
static void Operand_Dir(insn_t &insn, op_t &x, uchar TypeDir, char dtype = dt_word)
{
switch ( TypeDir )
{
case TDIR_DIR:// - Direct addressing mode DIR
DIR(insn, x, TypeDir, dtype);
break;
case TDIR_DIR_X:// - Direct index X addressing DIR,X
DIR(insn, x, TypeDir, dtype);
break;
case TDIR_DIR_Y:// - Direct index Y addressing DIR,Y
DIR(insn, x, TypeDir, dtype);
break;
case TDIR_INDIRECT_DIR:// - Direct indirect addressing mode (DIR)
LDIR(insn, x, TypeDir, dtype);
break;
case TDIR_INDIRECT_DIR_X:// - Direct index X indirect addressing mode (DIR,X)
LDIR(insn, x, TypeDir, dtype);
break;
case TDIR_INDIRECT_DIR_Y:// - Direct index Y indirect addressing mode (DIR,Y)
LDIR(insn, x, TypeDir, dtype);
break;
case TDIR_L_INDIRECT_DIR:// - Direct indirect long addressing mode L(DIR)
LDIR(insn, x, TypeDir, dtype);
break;
case TDIR_L_INDIRECT_DIR_Y:// - Direct indirect long indexed Y addressing mode L(DIR),Y
LDIR(insn, x, TypeDir, dtype);
break;
}
}
//----------------------------------------------------------------------
static void Operand_SR_16(insn_t &insn, op_t &x, uchar Type)
{
uint32 data = insn.get_next_byte();
x.type = o_sr;
x.value = data;
x.dtype = dt_word;
x.TypeOper = Type;
}
//----------------------------------------------------------------------
static void Operand_SR_8(insn_t &insn, op_t &x, uchar Type)
{
uint32 data = insn.get_next_byte();
x.type = o_sr;
x.value = data;
x.dtype = dt_byte;
x.TypeOper = Type;
}
//----------------------------------------------------------------------
static void Operand_SR(insn_t &insn, op_t &x, uchar TypeDir, int Raz)
{
switch ( Raz )
{
case 8: Operand_SR_8(insn, x, TypeDir); break;
case 16: Operand_SR_16(insn, x, TypeDir); break;
}
}
//----------------------------------------------------------------------
static void ABS(insn_t &insn, op_t &x, uchar Type, sel_t gDT, char dtype)
{
uint32 high = insn.get_next_byte();
uint32 low = insn.get_next_byte();
uint32 data = high | (low<<8);
data = uint32(data | (gDT<<16));
x.type = o_ab;
x.addr = data;
x.dtype = dtype;
x.TypeOper = Type;
}
//----------------------------------------------------------------------
static void ABL(insn_t &insn, op_t &x, uchar Type, char dtype)
{
uint32 ll = insn.get_next_byte();
uint32 mm = insn.get_next_byte();
uint32 hh = insn.get_next_byte();
uint32 data = (ll | (hh<<16)) | (mm<<8);
x.type = o_ab;
x.addr = data;
x.dtype = dtype;
x.TypeOper = Type;
}
//----------------------------------------------------------------------
static void Indirect_ABS(insn_t &insn, op_t &x, uchar Type, sel_t /*gPG*/, char dtype)
{
uint32 high = insn.get_next_byte();
uint32 low = insn.get_next_byte();
uint32 addr = high | (low<<8);
// This looks like a bug, FIXME!
/*uint32 Addr =*/ get_word(addr);
// Addr = uint32(Addr | (gPG<<16));
x.type = o_ab;
x.addr = addr;
x.dtype = dtype;
x.TypeOper = Type;
}
//----------------------------------------------------------------------
static void Operand_AB(insn_t &insn, op_t &x, uchar TypeDir, int /*Raz*/, char dtype = dt_word)
{
switch ( TypeDir )
{
case TAB_ABS: // - Absolute addressing mode(ABS)
ABS(insn, x, TypeDir, getDT, dtype);
break;
case TAB_ABS_X:// - Absolute indexed X addressing mode(ABS,X)
ABS(insn, x, TypeDir, getDT, dtype);
break;
case TAB_ABS_Y:// - Absolute indexed Y addressing mode(ABS,Y)
ABS(insn, x, TypeDir, getDT, dtype);
break;
case TAB_ABL: // - Absolute long addressing mode(ABL)
ABL(insn, x, TypeDir, dtype);
break;
case TAB_ABL_X:// - Absolute long indexed X addressing mode(ABS,X)
ABL(insn, x, TypeDir, dtype);
break;
case TAB_INDIRECTED_ABS:// - Absolute indirect addressing mode((ABS))
Indirect_ABS(insn, x, TypeDir, getPG, dtype);//???
break;
case TAB_L_INDIRECTED_ABS:// - Absolute indirect long addressing mode(L(ABS))
Indirect_ABS(insn, x, TypeDir, getPG, dtype);//???
break;
case TAB_INDIRECTED_ABS_X:// - Absolute indexed X indirect addressing mode((ABS,X))
Indirect_ABS(insn, x, TypeDir, getPG, dtype);//???
break;
}
}
//----------------------------------------------------------------------
static void Bral(insn_t &insn, op_t &x, int del)
{
x.type = o_near;
uint32 high = insn.get_next_byte();
uint32 low = insn.get_next_byte();
uint32 addr = high | (low<<8);
x.addr = insn.ip + (signed short)addr + del;
}
//----------------------------------------------------------------------
inline void Operand_BSR(const insn_t &insn, op_t &x, uint32 addr, int del)
{
x.type = o_near;
x.addr = insn.ip + (int32)addr + del;
}
//----------------------------------------------------------------------
inline void Operand_BBC(const insn_t &insn, op_t &x, uchar addr, int del)
{
x.type = o_near;
x.addr = insn.ip + (signed char)addr + del;
}
//----------------------------------------------------------------------
inline void Operand_BBS(const insn_t &insn, op_t &x, uchar addr, int del)
{
Operand_BBC(insn, x, addr, del);
}
//----------------------------------------------------------------------
inline void Operand_DEBNE(const insn_t &insn, op_t &x, uchar addr, int del)
{
x.type = o_near;
x.addr = insn.ip + (signed char)addr + del;
}
//----------------------------------------------------------------------
inline void Operand_Near(const insn_t &insn, op_t &x, uchar addr, int del)
{
x.type = o_near;
x.addr = insn.ip + (signed char)addr + del;
}
//----------------------------------------------------------------------
inline void Operand_IMP(op_t & /*x*/)
{
}
//----------------------------------------------------------------------
static void Jsr_24(insn_t &insn, op_t &x)
{
x.type = o_near;
uint32 ll = insn.get_next_byte();
uint32 mm = insn.get_next_byte();
uint32 hh = insn.get_next_byte();
uint32 data = (ll | (hh<<16)) | (mm<<8);
x.addr = data;
x.dtype = dt_dword;
}
//----------------------------------------------------------------------
static void Jsr_16(insn_t &insn, op_t &x, sel_t gPG)
{
x.type = o_near;
uint32 high = insn.get_next_byte();
uint32 low = insn.get_next_byte();
uint32 data = high | (low<<8);
data = uint32(data | (gPG<<16));
x.addr = data;
x.dtype = dt_word;
}
//----------------------------------------------------------------------
// dt_byte
// dt_word
// dt_dword
//----------------------------------------------------------------------
static void Operand_STK_16(insn_t &insn, op_t &x, uchar dtype)
{
uint32 high = insn.get_next_byte();
uint32 low = insn.get_next_byte();
uint32 data = high | (low<<8);
x.type = o_stk;
x.value = data;
x.dtype = dtype;
x.xmode = IMM_16;
}
//----------------------------------------------------------------------
// dt_byte
// dt_word
// dt_dword
//----------------------------------------------------------------------
inline void Operand_STK_8(insn_t &insn, op_t &x, uchar dt_type)
{
uint32 high = insn.get_next_byte();
x.type = o_stk;
x.value = high;
x.dtype = dt_type;
x.xmode = IMM_8;
}
//----------------------------------------------------------------------
inline void Operand_STK(insn_t &insn, op_t &x, int Razr)
{
switch ( Razr )
{
case 8: Operand_STK_8(insn, x, dt_byte); break;
case 16: Operand_STK_16(insn, x, dt_word); break;
}
}
//----------------------------------------------------------------------
static void Branch(insn_t &insn, op_t &x, int cd)
{
static const uchar icode[] =
{
0, // 0
m7900_bpl, // 1
m7900_bra, // 2
m7900_bmi, // 3
m7900_bgtu, // 4
m7900_bvc, // 5
m7900_bleu, // 6
m7900_bvs, // 7
m7900_bgt, // 8
m7900_bcc, // 9
m7900_ble, // a
m7900_bcs, // b
m7900_bge, // c
m7900_bne, // d
m7900_blt, // e
m7900_beq // F
};
insn.itype = icode[ cd ];
Operand_Near(insn, x, insn.get_next_byte(), 2);
}
//----------------------------------------------------------------------
int Opcode_91(insn_t &insn)
{
TRACE("Opcode_91");
uchar code = insn.get_next_byte();
TRACE(code);
switch ( code )
{
// ________________________ ADD________________________
// 101 - ADd
// add B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [91 20 dd]
case 0x20:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 101 - ADd
// add B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [91 21 dd]
case 0x21:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 101 - ADd
// add B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [91 28 dd]
case 0x28:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 101 - ADd
// add B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 22 dd]
case 0x22:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 101 - ADd
// add B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 29 dd]
case 0x29:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
// Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, 8, SetTypeDataM);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 101 - ADd
// add B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [91 23 nn]
case 0x23:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 101 - ADd
// add B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [91 24 nn]
case 0x24:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 101 - ADd
// add B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [91 26 ll mm]
case 0x26:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 101 - ADd
// add B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [91 2C ll mm hh]
case 0x2C:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 101 - ADd
// add B, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [91 2D ll mm hh]
case 0x2D:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END ADD _____________________
// ________________________ CMP________________________
// 161 - CoMPare
// cmp B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [91 40 dd]
case 0x40:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 161 - CoMPare
// cmp B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [91 41 dd]
case 0x41:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 161 - CoMPare
// cmp B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [91 48 dd]
case 0x48:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 161 - CoMPare
// cmp B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 42 dd]
case 0x42:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 161 - CoMPare
// cmp B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 49 dd]
case 0x49:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 161 - CoMPare
// cmp B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [91 43 nn]
case 0x43:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 161 - CoMPare
// cmp B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [91 44 nn]
case 0x44:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 161 - CoMPare
// cmp B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [91 46 ll mm]
case 0x46:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 161 - CoMPare
// cmp B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [91 4C ll mm hh]
case 0x4C:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 161 - CoMPare
// cmp B, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [91 4D ll mm hh]
case 0x4D:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END CMP _____________________
// ________________________ AND________________________
// 111 - logical AND
// and B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [91 60 dd]
case 0x60:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 111 - logical AND
// and B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [91 61 dd]
case 0x61:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 111 - logical AND
// and B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [91 68 dd]
case 0x68:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 111 - logical AND
// and B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 62 dd]
case 0x62:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 111 - logical AND
// and B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 69 dd]
case 0x69:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 111 - logical AND
// and B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [91 63 nn]
case 0x63:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 111 - logical AND
// and B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [91 64 nn]
case 0x64:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 111 - logical AND
// and B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [91 66 ll mm]
case 0x66:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 111 - logical AND
// and B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [91 6C ll mm hh]
case 0x6C:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 111 - logical AND
// and B, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [91 6D ll mm hh]
case 0x6D:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END AND _____________________
// ________________________ EOR________________________
// 180 - Exclusive OR memory with accumulator
// eor B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [91 70 dd]
case 0x70:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [91 71 dd]
case 0x71:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [91 78 dd]
case 0x78:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 72 dd]
case 0x72:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 79 dd]
case 0x79:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [91 73 nn]
case 0x73:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [91 74 nn]
case 0x74:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [91 76 ll mm]
case 0x76:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [91 7C ll mm hh]
case 0x7C:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [91 7D ll mm hh]
case 0x7D:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END eor _____________________
// ___________________ LDA _________________________
// 195 - LoaD Accumulator from memory
// lda B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [91 10 dd]
case 0x10:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 195 - LoaD Accumulator from memory
// lda B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [91 11 dd]
case 0x11:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 195 - LoaD Accumulator from memory
// lda B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 12 dd]
case 0x12:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 195 - LoaD Accumulator from memory
// lda B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [91 13 nn]
case 0x13:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 195 - LoaD Accumulator from memory
// lda B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [91 14 nn]
case 0x14:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 195 - LoaD Accumulator from memory
// lda B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [91 16 ll mm]
case 0x16:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// _____________________ END LDA ____________________
// ___________________ LDAB _________________________
// 196 - LoaD Accumulator from memory at Byte
// ldab B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [91 00 dd]
case 0x00:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [91 01 dd]
case 0x01:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 02 dd]
case 0x02:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [91 03 nn]
case 0x03:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [91 04 nn]
case 0x04:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [91 06 ll mm]
case 0x06:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_byte);
Operand_Registr(insn.Op3, rY);
break;
// _____________________ END LDAB ____________________
// ___________________ STA _________________________
// 271 - STore Accumulator in memory
// sta B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [91 D0 dd]
case 0xD0:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 271 - STore Accumulator in memory
// sta B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [91 D1 dd]
case 0xD1:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 271 - STore Accumulator in memory
// sta B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 D2 dd]
case 0xD2:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_byte);
break;
// 271 - STore Accumulator in memory
// sta B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [91 D3 nn]
case 0xD3:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 271 - STore Accumulator in memory
// sta B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [91 D4 nn]
case 0xD4:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 271 - STore Accumulator in memory
// sta B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [91 D6 ll mm]
case 0xD6:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// _____________________ END STA ____________________
// _____________________ STAB ____________________
// 272 - STore Accumulator in memory at Byte
// stab B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [91 C0 dd]
case 0xC0:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_byte);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [91 C1 dd]
case 0xC1:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, dt_byte);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 C2 dd]
case 0xC2:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [91 C3 nn]
case 0xC3:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [91 C4 nn]
case 0xC4:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [91 C6 ll mm]
case 0xC6:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_byte);
Operand_Registr(insn.Op3, rY);
break;
// _____________________ END STAB ____________________
// ________________________ ORA________________________
// 220 - OR memory with Accumulator
// ora B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [91 50 dd]
case 0x50:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 220 - OR memory with Accumulator
// ora B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [91 51 dd]
case 0x51:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 220 - OR memory with Accumulator
// ora B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [91 58 dd]
case 0x58:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 220 - OR memory with Accumulator
// ora B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 52 dd]
case 0x52:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 220 - OR memory with Accumulator
// ora B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 59 dd]
case 0x59:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 220 - OR memory with Accumulator
// ora B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [91 53 nn]
case 0x53:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 220 - OR memory with Accumulator
// ora B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [91 54 nn]
case 0x54:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 220 - OR memory with Accumulator
// ora B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [91 56 ll mm]
case 0x56:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 220 - OR memory with Accumulator
// ora B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [91 5C ll mm hh]
case 0x5C:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// ora B, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [91 5D ll mm hh]
case 0x5D:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END ora _____________________
// ________________________ SUB________________________
// 278 - SUBtract
// sub B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [91 30 dd]
case 0x30:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 278 - SUBtract
// sub B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [91 31 dd]
case 0x31:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 278 - SUBtract
// sub B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [91 38 dd]
case 0x38:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 278 - SUBtract
// sub B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 32 dd]
case 0x32:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 278 - SUBtract
// sub B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [91 39 dd]
case 0x39:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 278 - SUBtract
// sub B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [91 33 nn]
case 0x33:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 278 - SUBtract
// sub B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [91 34 nn]
case 0x34:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 278 - SUBtract
// sub B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [91 36 ll mm]
case 0x36:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 278 - SUBtract
// sub B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [91 3C ll mm hh]
case 0x3C:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 278 - SUBtract
// sub B, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [91 3D ll mm hh]
case 0x3D:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END SUB _____________________
default:
return 0;
}
return insn.size;
}
//--------------------------------------------------------------------------------------------
static int Opcode_21(insn_t &insn)
{
TRACE("Opcode_21");
uchar code = insn.get_next_byte();
TRACE(code);
switch ( code )
{
// ___________________ ADC _________________________
// 96 - ADd with Carry
// adc A, dd
// Operation data length: 16 bits or 8 bits
// [21 8A dd]
case 0x8A:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 96 - ADd with Carry
// adc A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 8B dd]
case 0x8B:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 96 - ADd with Carry
// adc A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [21 80 dd]
case 0x80:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 96 - ADd with Carry
// adc A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [21 81 dd]
case 0x81:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 96 - ADd with Carry
// adc A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [21 88 dd]
case 0x88:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 96 - ADd with Carry
// adc A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 82 dd]
case 0x82:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 96 - ADd with Carry
// adc A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 89 dd]
case 0x89:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 96 - ADd with Carry
// adc A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [21 83 nn]
case 0x83:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 96 - ADd with Carry
// adc A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 84 nn]
case 0x84:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 96 - ADd with Carry
// adc A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 8E ll mm]
case 0x8E:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16,SetTypeDataM);
break;
// 96 - ADd with Carry
// adc A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 8F ll mm]
case 0x8F:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 96 - ADd with Carry
// adc A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [21 86 ll mm]
case 0x86:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 96 - ADd with Carry
// adc A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 8C ll mm hh]
case 0x8C:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 96 - ADd with Carry
// adc A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 8D ll mm hh]
case 0x8D:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ___________________ END ADC _________________________
// ___________________ LSR _________________________
// 204 - Logical Shift Right
// lsr dd
// Operation data length: 16 bits or 8 bits
// [21 2A dd]
case 0x2A:
insn.itype = m7900_lsr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// 204 - Logical Shift Right
// lsr dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 2B dd]
case 0x2B:
insn.itype = m7900_lsr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 204 - Logical Shift Right
// lsr mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 2E ll mm]
case 0x2E:
insn.itype = m7900_lsr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// 204 - Logical Shift Right
// lsr mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 2F ll mm]
case 0x2F:
insn.itype = m7900_lsr;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// ___________________ END LSR _________________________
// ___________________ ROL _________________________
// 254 - ROtate one bit Left
// rol dd
// Operation data length: 16 bits or 8 bits
// [21 1A dd]
case 0x1A:
insn.itype = m7900_rol;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// 254 - ROtate one bit Left
// rol dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 1B dd]
case 0x1B:
insn.itype = m7900_rol;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 254 - ROtate one bit Left
// rol mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 1E ll mm]
case 0x1E:
insn.itype = m7900_rol;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// 254 - ROtate one bit Left
// rol mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 1F ll mm]
case 0x1F:
insn.itype = m7900_rol;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// ___________________ END ROL _________________________
// ___________________ ROR _________________________
// 255 - ROtate one bit Right
// rol dd
// Operation data length: 16 bits or 8 bits
// [21 3A dd]
case 0x3A:
insn.itype = m7900_ror;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// 255 - ROtate one bit Right
// rol dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 3B dd]
case 0x3B:
insn.itype = m7900_ror;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 255 - ROtate one bit Right
// ror mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 3E ll mm]
case 0x3E:
insn.itype = m7900_ror;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// 255 - ROtate one bit Right
// ror mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 3F ll mm]
case 0x3F:
insn.itype = m7900_ror;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// ___________________ END ROR _________________________
// ___________________ ASL _________________________
// 116 - Arithmetic Shift to Left
// asl dd
// Operation data length: 16 bits or 8 bits
// [21 0A dd]
case 0x0A:
insn.itype = m7900_asl;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// 116 - Arithmetic Shift to Left
// asl dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 0B dd]
case 0x0B:
insn.itype = m7900_asl;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 116 - Arithmetic Shift to Left
// asl mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 0E ll mm]
case 0x0E:
insn.itype = m7900_asl;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// 116 - Arithmetic Shift to Left
// asl mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 0F ll mm]
case 0x0F:
insn.itype = m7900_asl;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// ___________________ END ASL _________________________
// ___________________ ASR _________________________
// 119 - Arithmetic Shift to Right
// asr dd
// Operation data length: 16 bits or 8 bits
// [21 4A dd]
case 0x4A:
insn.itype = m7900_asr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// 119 - Arithmetic Shift to Right
// asr dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 4B dd]
case 0x4B:
insn.itype = m7900_asr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 119 - Arithmetic Shift to Right
// asr mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 4E ll mm]
case 0x4E:
insn.itype = m7900_asr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// 119 - Arithmetic Shift to Right
// asr mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 4F ll mm]
case 0x4F:
insn.itype = m7900_asr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// ___________________ END ASR _________________________
// ___________________ ADCD _________________________
// 99 - ADd with Carry at Double-word
// adcd E, dd
// Operation data length: 32 bits
// [21 9A dd]
case 0x9A:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_dword);
break;
// 99 - ADd with Carry at Double-word
// adcd E, dd, X (Direct index X addressing DIR,X)
// Operation data length: 32
// [21 9B dd]
case 0x9B:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 99 - ADd with Carry at Double-word
// adcd E, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 32 bits
// [21 90 dd]
case 0x90:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
break;
// 99 - ADd with Carry at Double-word
// adcd E, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 32 buts
// [21 91 dd]
case 0x91:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, dt_dword);
break;
// 99 - ADd with Carry at Double-word
// adcd E, (dd), Y ()
// Operation data length: 32 bits
// [21 98 dd]
case 0x98:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 99 - ADd with Carry at Double-word
// adcd E, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [21 92 dd]
case 0x92:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
// should collect 3 bytes, but collect as 2 bytes
// can use dt_tbyte
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 99 - ADd with Carry at Double-word
// adcd E, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [21 99 dd]
case 0x99:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
// should collect 3 bytes, but collect as 2 bytes
// can use dt_tbyte
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 99 - ADd with Carry at Double-word
// adcd E, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 32 bits
// [21 93 nn]
case 0x93:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 99 - ADd with Carry at Double-word
// adcd E, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 32 bits
// [21 94 nn]
case 0x94:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 99 - ADd with Carry at Double-word
// adcd E, mmll (Absolute addressing mode(ABS))
// Operation data length: 32 bits
// [21 9E ll mm]
case 0x9E:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_dword);
break;
// 99 - ADd with Carry at Double-word
// adcd E, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [21 9F ll mm]
case 0x9F:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 99 - ADd with Carry at Double-word
// adcd E, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 32 bits
// [21 96 ll mm]
case 0x96:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 99 - ADd with Carry at Double-word
// adcd E, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 9C ll mm hh]
case 0x9C:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_dword);
break;
// 99 - ADd with Carry at Double-word
// adcd A, hhmmll, X (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [21 9D ll mm hh]
case 0x9D:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// ___________________ END ADCD _________________________
// ___________________ DIV _________________________
// 174 - DIVide unsigned
// div A, dd
// Operation data length: 16 bits or 8 bits
// [21 EA dd]
case 0xEA:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// 174 - DIVide unsigned
// div A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 EB dd]
case 0xEB:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 174 - DIVide unsigned
// div A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [21 E0 dd]
case 0xE0:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 174 - DIVide unsigned
// div A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [21 E1 dd]
case 0xE1:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 174 - DIVide unsigned
// div A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [21 E8 dd]
case 0xE8:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op2, rY);
break;
// 174 - DIVide unsigned
// div A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 E2 dd]
case 0xE2:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 174 - DIVide unsigned
// div A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 E9 dd]
case 0xE9:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op2, rY);
break;
// 174 - DIVide unsigned
// div A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [21 E3 nn]
case 0xE3:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_SR(insn, insn.Op1, TSP_SP, 8);
Operand_Registr(insn.Op2, rPS);
break;
// 174 - DIVide unsigned
// div A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 E4 nn]
case 0xE4:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_SR(insn, insn.Op1, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op2, rY);
break;
// 174 - DIVide unsigned
// div A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 EE ll mm]
case 0xEE:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// 174 - DIVide unsigned
// div A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 EF ll mm]
case 0xEF:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 174 - DIVide unsigned
// div A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [21 E6 ll mm]
case 0xE6:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rY);
break;
// 174 - DIVide unsigned
// div A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 EC ll mm hh]
case 0xEC:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABL, 24, SetTypeDataM);
break;
// 174 - DIVide unsigned
// div A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 ED ll mm hh]
case 0xED:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// ___________________ END DIV _________________________
// ___________________ DIVS _________________________
// 176 - DIVide with Sign
// divs A, dd
// Operation data length: 16 bits or 8 bits
// [21 FA dd]
case 0xFA:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// 176 - DIVide with Sign
// divs A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 FB dd]
case 0xFB:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 176 - DIVide with Sign
// divs A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [21 F0 dd]
case 0xF0:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 176 - DIVide with Sign
// divs A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [21 F1 dd]
case 0xF1:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 176 - DIVide with Sign
// divs A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [21 F8 dd]
case 0xF8:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op2, rY);
break;
// 176 - DIVide with Sign
// divs A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 F2 dd]
case 0xF2:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 176 - DIVide with Sign
// divs A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 F9 dd]
case 0xF9:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op2, rY);
break;
// 176 - DIVide with Sign
// divs A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [21 F3 nn]
case 0xF3:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_SR(insn, insn.Op1, TSP_SP, 8);
Operand_Registr(insn.Op2, rPS);
break;
// 176 - DIVide with Sign
// divs A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 F4 nn]
case 0xF4:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_SR(insn, insn.Op1, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op2, rY);
break;
// 176 - DIVide with Sign
// divs A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 FE ll mm]
case 0xFE:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// 176 - DIVide with Sign
// divs A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 FF ll mm]
case 0xFF:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 176 - DIVide with Sign
// divs A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [21 F6 ll mm]
case 0xF6:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rY);
break;
// 176 - DIVide with Sign
// divs A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 FC ll mm hh]
case 0xFC:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABL, 24, SetTypeDataM);
break;
// 176 - DIVide with Sign
// divs A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 FD ll mm hh]
case 0xFD:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// ___________________ END DIVS _________________________
// ___________________ MPY _________________________
// 212 - MultiPlY
// Operation data length: 16 bits or 8 bits
// [21 CA dd]
case 0xCA:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// 212 - MultiPlY
// mpy dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 CB dd]
case 0xCB:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 212 - MultiPlY
// mpy (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [21 C0 dd]
case 0xC0:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 212 - MultiPlY
// mpy (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [21 C1 dd]
case 0xC1:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 212 - MultiPlY
// mpy (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [21 C8 dd]
case 0xC8:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op2, rY);
break;
// 212 - MultiPlY
// mpy L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 C2 dd]
case 0xC2:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 212 - MultiPlY
// mpy L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 C9 dd]
case 0xC9:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op2, rY);
break;
// 212 - MultiPlY
// mpy nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [21 C3 nn]
case 0xC3:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_SR(insn, insn.Op1, TSP_SP, 8);
Operand_Registr(insn.Op2, rPS);
break;
// 212 - MultiPlY
// mpy (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 C4 nn]
case 0xC4:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_SR(insn, insn.Op1, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op2, rY);
break;
// 212 - MultiPlY
// mpy mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 CE ll mm]
case 0xCE:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// 212 - MultiPlY
// mpy mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 CF ll mm]
case 0xCF:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 212 - MultiPlY
// mpy A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [21 C6 ll mm]
case 0xC6:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rY);
break;
// 212 - MultiPlY
// mpy hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 CC ll mm hh]
case 0xCC:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABL, 24, SetTypeDataM);
break;
// 212 - MultiPlY
// mpy hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 CD ll mm hh]
case 0xCD:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// ___________________ END MPY _________________________
// ___________________ MPYS _________________________
// 213 - MultiPlY with Sign
// Operation data length: 16 bits or 8 bits
// [21 DA dd]
case 0xDA:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// 213 - MultiPlY with Sign
// mpys dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 DB dd]
case 0xDB:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 213 - MultiPlY with Sign
// mpys (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [21 D0 dd]
case 0xD0:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 213 - MultiPlY with Sign
// mpys (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [21 D1 dd]
case 0xD1:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 213 - MultiPlY with Sign
// mpys (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [21 D8 dd]
case 0xD8:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op2, rY);
break;
// 213 - MultiPlY with Sign
// mpys L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 D2 dd]
case 0xD2:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 213 - MultiPlY with Sign
// mpys L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 D9 dd]
case 0xD9:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op2, rY);
break;
// 213 - MultiPlY with Sign
// mpys nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [21 D3 nn]
case 0xD3:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_SR(insn, insn.Op1, TSP_SP, 8);
Operand_Registr(insn.Op2, rPS);
break;
// 213 - MultiPlY with Sign
// mpys (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 D4 nn]
case 0xD4:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_SR(insn, insn.Op1, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op2, rY);
break;
// 213 - MultiPlY with Sign
// mpys mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 DE ll mm]
case 0xDE:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// 213 - MultiPlY with Sign
// mpys mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 DF ll mm]
case 0xDF:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 213 - MultiPlY with Sign
// mpys A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [21 D6 ll mm]
case 0xD6:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rY);
break;
// 213 - MultiPlY with Sign
// mpys hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 DC ll mm hh]
case 0xDC:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABL, 24, SetTypeDataM);
break;
// 213 - MultiPlY with Sign
// mpys hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 DD ll mm hh]
case 0xDD:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// ___________________ END MPYS _________________________
// ___________________ SBC _________________________
// 264 - SuBtract with Carry
// sbc A, dd
// Operation data length: 16 bits or 8 bits
// [21 AA dd]
case 0xAA:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 264 - SuBtract with Carry
// sbc A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 AB dd]
case 0xAB:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 264 - SuBtract with Carry
// sbc A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [21 A0 dd]
case 0xA0:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 264 - SuBtract with Carry
// sbc A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [21 A1 dd]
case 0xA1:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 264 - SuBtract with Carry
// sbc A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [21 A8 dd]
case 0xA8:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 264 - SuBtract with Carry
// sbc A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 A2 dd]
case 0xA2:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 264 - SuBtract with Carry
// sbc A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 A9 dd]
case 0xA9:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 264 - SuBtract with Carry
// sbc A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [21 A3 nn]
case 0xA3:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 264 - SuBtract with Carry
// sbc A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 A4 nn]
case 0xA4:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 264 - SuBtract with Carry
// sbc A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 AE ll mm]
case 0xAE:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 264 - SuBtract with Carry
// sbc A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 AF ll mm]
case 0xAF:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 264 - SuBtract with Carry
// sbc A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [21 A6 ll mm]
case 0xA6:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 264 - SuBtract with Carry
// sbc A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 AC ll mm hh]
case 0xAC:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 264 - SuBtract with Carry
// sbc A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 AD ll mm hh]
case 0xAD:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ___________________ END sbc _________________________
// ___________________ SBCD _________________________
// 266 - SuBtract with Carry at Double-word
// sbcd E, dd
// Operation data length: 16 bits or 8 bits
// [21 BA dd]
case 0xBA:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_dword);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 BB dd]
case 0xBB:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [21 B0 dd]
case 0xB0:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [21 B1 dd]
case 0xB1:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, dt_dword);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [21 B8 dd]
case 0xB8:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 B2 dd]
case 0xB2:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 B9 dd]
case 0xB9:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [21 B3 nn]
case 0xB3:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 B4 nn]
case 0xB4:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd BE mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 BE ll mm]
case 0xBE:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_dword);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 BF ll mm]
case 0xBF:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [21 B6 ll mm]
case 0xB6:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 BC ll mm hh]
case 0xBC:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_dword);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 BD ll mm hh]
case 0xBD:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// ___________________ END SBCD _________________________
default:
return 0;
}
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_31(insn_t &insn)
{
TRACE("Opcode_31");
uchar code = insn.get_next_byte();
TRACE(code);
uchar nib = (code >> 4) & 0xF;
switch ( code )
{
// _____________________ JMPJMPL ____________________
// 192 - JuMP
// jmp (mmll)
// Operation data -
// [31 5C ll mm]
case 0x5C:// jmp (mmll) ((ABS))
insn.itype = m7900_jmp;
Operand_AB(insn, insn.Op1, TAB_INDIRECTED_ABS, 16, dt_word);
break;
// 192 - JuMP
// jmp L(mmll)
// Operation data -
// [31 5D ll mm]
case 0x5D:// jmp L(mmll) (L(ABS))
insn.itype = m7900_jmp;
Operand_AB(insn, insn.Op1, TAB_L_INDIRECTED_ABS, 16, dt_tbyte);
break;
// _____________________ END JMP/JMPL ____________________
// 232 - PusH proGram bank register on stack
// phg
// Operation data length: 8 bits
// [31 60]
case 0x60:
insn.itype = m7900_phg;
RAZOPER = INSN_PREF_U;
break;
// 235 -
// pht
// Operation data length: 8 bits
// [31 40]
case 0x40:
insn.itype = m7900_pht;
RAZOPER = INSN_PREF_U;
break;
// 243 - PuLl daTa bank register from stack
// plt
// Operation data length: 8 bits
// [31 50]
case 0x50:
insn.itype = m7900_plt;
RAZOPER = INSN_PREF_U;
break;
// 96 - ADd with Carry
// adc A, #imm
// Operation data length: 16 bits or 8 bits
// [31 87 imm]
case 0x87:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 274 -
// stp
// Operation data length: -
// [31 30]
case 0x30:
insn.itype = m7900_stp;
break;
// 284 - SUBtract Stack pointer
// subs #imm
// Operation data length: 16 bits
// [31 0B imm]
case 0x0B:
insn.itype = m7900_subs;
RAZOPER = INSN_PREF_W;
Operand_Imm(insn, insn.Op1, 8);
break;
// 288 - Transfer accumulator A to Stack pointer
// tas
// Operation data length: 16 bits
// [31 82]
case 0x82:
insn.itype = m7900_tas;
break;
// 297 - Transfer Direct page register to Stack pointer
// tds
// Operation data length: 16 bits
// [31 73]
case 0x73:
insn.itype = m7900_tds;
break;
// 298- Transfer Stack pointer to accumulator A
// tsa
// Operation data length: 16 bits or 8 bit
// [31 92]
case 0x92:
insn.itype = m7900_tsa;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
break;
// 300- Transfer Stack pointer to Direct page register
// tsd
// Operation data length: 16 bits
// [31 70]
case 0x70:
insn.itype = m7900_tsd;
break;
// 301- Transfer Stack pointer to index register X
// tsx
// Operation data length: 16 bits or 8 bits
// [31 F2]
case 0xF2:
insn.itype = m7900_tsx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
// 304- Transfer index register X to Stack pointer
// txs
// Operation data length: 16 bits or 8 bits
// [31 E2]
case 0xE2:
insn.itype = m7900_txs;
break;
// 305- Transfer index register X to Y
// txy
// Operation data length: 16 bits or 8 bits
// [31 C2]
case 0xC2:
insn.itype = m7900_txy;
break;
// 308- Transfer index register Y to X
// tyx
// Operation data length: 16 bits or 8 bits
// [31 D2]
case 0xD2:
insn.itype = m7900_tyx;
break;
// 309- WaIT
// wit
// Operation data length: 16 bits or 8 bits
// [31 10]
case 0x10:
insn.itype = m7900_wit;
break;
//---------------------------BYTE-------------------------------------//
// 98 - ADd with Carry at Byte
// adcb A, #imm
// Operation data length: 8 bits
// [31 1A imm]
case 0x1A:
insn.itype = m7900_adcb;
RAZOPER = 8;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
break;
// 199 - LoaD immediate to DaTa bank register
// ldt A, #imm
// Operation data length: 8 bits
// [31 4A imm]
case 0x4A:
insn.itype = m7900_ldt;
RAZOPER = INSN_PREF_U;
Operand_Imm(insn, insn.Op1, 8);
break;
// 208 - MOVe Memory to memory at Byte
// movmb mmll, #imm
// Operation data length: 8 bits
// [3B imm ll mm]
case 0x3B:
insn.itype = m7900_movmb;
RAZOPER = INSN_PREF_U;
Operand_Imm(insn, insn.Op3, 8);
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
Operand_Registr(insn.Op2, rX);
break;
// 208 - MOVe Memory to memory at Byte
// movmb dd, #imm
// Operation data length: 8 bits
// [3A imm dd]
case 0x3A:
insn.itype = m7900_movmb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op3, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op1, 8);
Operand_Registr(insn.Op2, rX);
break;
// 265 - SuBtract with Carry at Byte
// sbcb A, #imm
// Operation data length: 8 bits
// [31 1B imm]
case 0x1B:
insn.itype = m7900_sbcb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
break;
//---------------------------WORD------------------------------------//
// 107 - ADD Stack pointer and immediate
// adds #imm
// Operation data length: 16 bits
// [31 0A imm]
case 0x0A:
insn.itype = m7900_adds;
RAZOPER = INSN_PREF_W;
Operand_Imm(insn, insn.Op1, 8);
break;
//---------------------------DWORD------------------------------------//
// 95 - ABSolute at Double-word
// absd E
// Operation data length: 32 bits
// [31 90]
case 0x90:
insn.itype = m7900_absd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
break;
// 186 - EXTension Sign at Double-word
// extsd E
// Operation data length: 32 bits
// [31 B0]
case 0xB0:// extsd
insn.itype = m7900_extsd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
break;
// 188 - EXTension Zero at Double-word
// extzd E
// Operation data length: 32 bits
// [31 A0]
case 0xA0:// extsd
insn.itype = m7900_extzd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
break;
// 99 - ADd with Carry at Double-word
// adcd E, #imm
// Operation data length: 32 bits
// [31 1C imm imm imm imm]
case 0x1C:
insn.itype = m7900_adcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Imm(insn, insn.Op2, 32);
break;
// 217 - NEGative at Double-word
// negd E
// Operation data length: 32 bits
// [31 80]
case 0x80:
insn.itype = m7900_negd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
break;
// 266 - SuBtract with Carry at Double-word
// sbcd E
// Operation data length: 32 bits
// [31 1D]
case 0x1D:
insn.itype = m7900_sbcd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Imm(insn, insn.Op2, 32);
break;
//---------------------------WORD/byte------------------------------------//
// 174 - DIVide unsigned
// div #imm
// Operation data length: 16 bits or 8 bits
// [31 E7 imm]
case 0xE7:
insn.itype = m7900_div;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op1, getFlag_M ? 8 : 16);
break;
// 174 - DIVide with Sign
// divs #imm
// Operation data length: 16 bits or 8 bits
// [31 F7 imm]
case 0xF7:
insn.itype = m7900_divs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op1, getFlag_M ? 8 : 16);
break;
// 207 - MOVe Memory to memory
// movm mmll, X, #imm
// Operation data length: 16 bits or 8 bits
// [31 57 imm]
case 0x57:
insn.itype = m7900_movm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op3, getFlag_M ? 8 : 16);
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// 207 - MOVe Memory to memory
// movm #imm dd
// Operation data length: 16 bits or 8 bits
// [31 47 imm]
case 0x47:
insn.itype = m7900_movm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op3, getFlag_M ? 8 : 16);
Operand_Dir(insn, insn.Op1, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// _____________________ MPY ____________________
// 212 - MultiPlY
// MPY #imm
// Operation data - 16 bits or 8 bits
// [31 C7 imm]
case 0xC7:
insn.itype = m7900_mpy;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op1, getFlag_M ? 8 : 16);
break;
// _____________________ END MPY ____________________
// _____________________ MPYS ____________________
// 213 - MultiPlY
// MPYS #imm
// Operation data - 16 bits or 8 bits
// [31 D7 imm]
case 0xD7:
insn.itype = m7900_mpys;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op1, getFlag_M ? 8 : 16);
break;
// _____________________ END MPY ____________________
// _____________________ MVN ____________________
// 214 - MoVe Negative
// mvn hh1 hh2
// Operation data - 16 bits or 8 bits
// [31 2B hh1 hh2]
case 0x2B:
insn.itype = m7900_mvn;
Operand_Dir(insn, insn.Op1, TDIR_DIR);
Operand_Dir(insn, insn.Op2, TDIR_DIR);
break;
// _____________________ END MVN ____________________
// _____________________ MVP ____________________
// 215 - MoVe Positive
// mvp hh1 hh2
// Operation data - 16 bits or 8 bits
// [31 2A hh1 hh2]
case 0x2A:
insn.itype = m7900_mvp;
Operand_Dir(insn, insn.Op1, TDIR_DIR);
Operand_Dir(insn, insn.Op2, TDIR_DIR);
break;
// _____________________ END MVP ____________________
case 0x4B:// pei
insn.itype = m7900_pei;
RAZOPER = INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR);
break;
case 0x4C:// pea
insn.itype = m7900_pea;
RAZOPER = INSN_PREF_W;
Operand_STK(insn, insn.Op1, 16);
break;
case 0x4D:// per
insn.itype = m7900_per;
RAZOPER = INSN_PREF_W;
Operand_STK(insn, insn.Op1, 16);
break;
// _____________________ RLA ____________________
// 250 - Rotate Left accumulator A
// RLA #imm
// Operation data - 16 bits or 8 bits
// [31 07 imm]
case 0x07:
insn.itype = m7900_rla;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op1, getFlag_M ? 8 : 16);
break;
// _____________________ END RLA ____________________
// _____________________ RMPA ____________________
// 250 - Repeat Multiply and Accumulate
// RMPA #imm
// Operation data - 16 bits or 8 bits
// [31 5A imm]
case 0x5A:
insn.itype = m7900_rmpa;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op1, 8);
break;
// _____________________ END RMPA ____________________
// _____________________ SBC ____________________
// 264 - SuBtract with Carry
// sbc A,#imm
// Operation data - 16 bits or 8 bits
// [31 A7 imm]
case 0xA7:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// _____________________ END SBC ____________________
default:
{
uchar cm = code & 0x40;
if ( cm == 0x40 )
{
insn.itype = m7900_tdan;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, dt_byte, (((code-0x40) >> 4) & 0xF)+0x1);
}
else
{
insn.itype = m7900_tadn;
Operand_Imm_Spesh(insn.Op1, dt_byte, nib);
}
}
break;
}
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_41(insn_t &insn)
{
TRACE("Opcode_41");
uchar code = insn.get_next_byte();
TRACE(code);
switch ( code )
{
// ________________________ BBC________________________
// 122 -Branch on Bit Clear
// bbc #imm dd rr (DIR)
// Operation data length: 16 bits or 8 bits
// [41 5A dd imm rr]
case 0x5A:
insn.itype = m7900_bbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
Operand_Imm(insn, insn.Op1, getFlag_M ? 8 : 16);
Operand_BBC(insn, insn.Op3, insn.get_next_byte(), getFlag_M ? 5 : 6);
break;
// 122 -Branch on Bit Clear
// bbc #imm mmll rr (ABS)
// Operation data length: 16 bits or 8 bits
// [41 5E ll mm imm rr]
case 0x5E:
insn.itype = m7900_bbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
Operand_Imm(insn, insn.Op1, getFlag_M ? 8 : 16);
Operand_BBC(insn, insn.Op3, insn.get_next_byte(), getFlag_M ? 6 : 7);
break;
// ________________________ END BBC________________________
// ________________________ BBS________________________
// 124 - Branch on Bit Set
// bbs #imm dd rr (DIR)
// Operation data length: 16 bits or 8 bits
// [41 4A dd imm rr]
case 0x4A:
insn.itype = m7900_bbs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
Operand_Imm(insn, insn.Op1, getFlag_M ? 8 : 16);
Operand_BBS(insn, insn.Op3, insn.get_next_byte(), getFlag_M ? 5 : 6);
break;
// 124 - Branch on Bit Set
// bbs #imm mmll rr (ABS)
// Operation data length: 16 bits or 8 bits
// [41 4E ll mm imm rr]
case 0x4E:
insn.itype = m7900_bbs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
Operand_Imm(insn, insn.Op1, getFlag_M ? 8 : 16);
Operand_BBS(insn, insn.Op3, insn.get_next_byte(), getFlag_M ? 6 : 7);
break;
// ________________________ END BBS________________________
// _____________________ CBEQ ____________________
// 145 - Compare immediate and Branch on EQual
// cbeq dd, #imm, rr
// Operation data length: 16 bits or 8 bits
// [41 6A dd imm rr]
case 0x6A:
insn.itype = m7900_cbeq;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), getFlag_M ? 5 : 6);
break;
// _____________________ END CBEQ ____________________
// _____________________ CBNE ____________________
// 147 - Compare immediate and Branch on Not Equal
// cbne dd, #imm, rr
// Operation data length: 16 bits or 8 bits
// [7A dd imm rr]
case 0x7A:
insn.itype = m7900_cbne;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), getFlag_M ? 5 : 6);
break;
// _____________________ END CBNE ____________________
// _____________________ CPX ____________________
// 167 - ComPare memory and index register X
// cpx mmll
// Operation data length: 16 bits or 8 bits
// [41 2E ll mm]
case 0x2E:
insn.itype = m7900_cpx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, getFlag_X ? 8 : 16, SetTypeDataX);
break;
// _____________________ END CPX ____________________
// 168 - ComPare memory and index register Y
// cpy mmll
// Operation data length: 16 bits or 8 bits
// [41 3E ll mm]
case 0x3E:// cpy
insn.itype = m7900_cpy;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, getFlag_M ? 8 : 16, SetTypeDataX);
break;
// _____________________ DEC ____________________
// 170 - DECrement by one
// dec dd, X
// Operation data - 16 bits or 8 bits
// [41 9B dd]
case 0x9B:
insn.itype = m7900_dec;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
case 0x9F:// dec
insn.itype = m7900_dec;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// _____________________ END DEC ____________________
// _____________________ INC ____________________
// 189 - INCrement by one
// inc dd, X
// Operation data - 16 bits or 8 bits
// [41 8B dd]
case 0x8B:
insn.itype = m7900_inc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
case 0x8F:// inc
insn.itype = m7900_inc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rX);
break;
// _____________________ END INC ____________________
// _____________________ DEX ____________________
// 171 - DEcrement index register X by one
// dex
// Operation data - 16 bits or 8 bits
// [E3]
case 0xE3:
insn.itype = m7900_dex;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
// _____________________ END DEX ____________________
// _____________________ DEY ____________________
// 172 - DEcrement index register Y by one
// dex
// Operation data - 16 bits or 8 bits
// [F3]
case 0xF3:
insn.itype = m7900_dey;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
// _____________________ END DEY ____________________
// _____________________ LDX ____________________
// 200 - Load
// ldx dd, Y
// Operation data - 16 bits or 8 bits
// [41 05 dd]
case 0x05:
insn.itype = m7900_ldx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataX);
Operand_Registr(insn.Op2, rY);
break;
case 0x06:
insn.itype = m7900_ldx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op2, rY);
break;
// _____________________ END LDX ____________________
// _____________________ LDY ____________________
// 202 - LoaD index register Y from memory
// ldy dd, X
// Operation data - 16 bits or 8 bits
// [41 1B dd]
case 0x1B:
insn.itype = m7900_ldy;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataX);
Operand_Registr(insn.Op2, rX);
break;
case 0x1F:
insn.itype = m7900_ldy;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS_X, 16);
Operand_Registr(insn.Op2, rX);
break;
// _____________________ END INC ____________________
// _____________________ STX ____________________
// 275 - STore index register X in memory
// stx dd, Y
// Operation data - 16 bits or 8 bits
// [41 E5 dd]
case 0xE5:// stx dd,Y (DIR,Y)
insn.itype = m7900_stx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_Y, SetTypeDataX);
Operand_Registr(insn.Op2, rY);
break;
// _____________________ END STX ____________________
// _____________________ STY ____________________
// 276 - STore index register Y in memory
// sty dd, X
// Operation data - 16 bits or 8 bits
// [41 FB dd]
case 0xFB:// sty dd,X (DIR,X)
insn.itype = m7900_sty;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR_Y, SetTypeDataX);
Operand_Registr(insn.Op2, rX);
break;
// _____________________ END STX ____________________
default:
return 0;
}
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_51(insn_t &insn)
{
TRACE("Opcode_51");
uchar code = insn.get_next_byte();
TRACE(code);
switch ( code )
{
//---------------------------BYTE-------------------------------------//
// 105 - ADD immediate and Memory at Byte
// addmb dd, #imm
// Operation data length: 8 bits
// [51 02 dd imm]
case 0x02:
insn.itype = m7900_addmb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 105 - ADD immediate and Memory at Byte
// addmb mmll, #imm
// Operation data length: 8 bits
// [51 06 ll mm imm]
case 0x06:
insn.itype = m7900_addmb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 114 - logical AND between immediate value and Memory (Byte)
// andmb dd, #imm
// Operation data length: 8 bits
// [51 62 dd imm]
case 0x62:
insn.itype = m7900_andmb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 105 - ADD immediate and Memory at Byte
// addmb mmll, #imm
// Operation data length: 8 bits
// [51 66 ll mm imm]
case 0x66:
insn.itype = m7900_andmb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 165 - CoMPare immediate with Memory at Byte
// cmpmb dd, #imm
// Operation data length: 8 bits
// [51 22 dd imm]
case 0x22:
insn.itype = m7900_cmpmb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 165 - CoMPare immediate with Memory at Byte
// cmpmb mmll, #imm
// Operation data length: 8 bits
// [51 26 ll mm imm]
case 0x26:
insn.itype = m7900_cmpmb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 183 - Exclusive OR immediate with Memory at Byte
// eormb dd, #imm
// Operation data length: 8 bits
// [51 72 dd imm]
case 0x72:
insn.itype = m7900_eormb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 183 - Exclusive OR immediate with Memory at Byte
// eormb mmll, #imm
// Operation data length: 8 bits
// [51 76 ll mm imm]
case 0x76:
insn.itype = m7900_eormb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 223 - OR immediAte with Memory at Byte
// oramb dd, #imm
// Operation data length: 8 bits
// [51 32 dd imm]
case 0x32:
insn.itype = m7900_oramb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 223 - OR immediAte with Memory at Byte
// oramb mmll, #imm
// Operation data length: 8 bits
// [51 36 ll mm imm]
case 0x36:
insn.itype = m7900_oramb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 282 - SUBtract immediate from Memory at Byte SUBMB
// submb dd, #imm
// Operation data length: 8 bits
// [51 12 dd imm]
case 0x12:
insn.itype = m7900_submb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// 282 - SUBtract immediate from Memory at Byte SUBMB
// submb mmll, #imm
// Operation data length: 8 bits
// [51 16 ll mm imm]
case 0x16:
insn.itype = m7900_submb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
break;
// __________________________ ADDM ___________________
// 104 - ADD immediate and Memory
// addm dd, #imm
// Operation data length: 16 bits or 8 bits
// [51 03 dd imm]
case 0x03:
insn.itype = m7900_addm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 104 - ADD immediate and Memory
// addm mmll, #imm
// Operation data length: 16 bits or 8 bits
// [51 07 ll mm imm]
case 0x07:
insn.itype = m7900_addm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 8, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// _______________________END ADDM ___________________
// __________________________ ANDM ___________________
// 113 - logical AND between immediate value and Memory
// andm dd, #imm
// Operation data length: 16 bits or 8 bits
// [51 63 dd imm]
case 0x63:
insn.itype = m7900_andm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 113 - logical AND between immediate value and Memory
// andm mmll, #imm
// Operation data length: 16 bits or 8 bits
// [51 67 ll mm imm]
case 0x67:
insn.itype = m7900_andm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 8, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// _______________________END ANDM ___________________
// __________________________ CMPM ___________________
// 164 - CoMPare immediate with Memory
// cmpm dd, #imm
// Operation data length: 16 bits or 8 bits
// [51 23 dd imm]
case 0x23:
insn.itype = m7900_cmpm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 164 - CoMPare immediate with Memory
// cmpm mmll, #imm
// Operation data length: 16 bits or 8 bits
// [51 27 ll mm imm]
case 0x27:
insn.itype = m7900_cmpm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 8, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// _______________________END CMPM ___________________
// __________________________ EORM ___________________
// 182 - Exclusive OR immediate with Memory
// eorm dd, #imm
// Operation data length: 16 bits or 8 bits
// [51 73 dd imm]
case 0x73:
insn.itype = m7900_eorm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 182 - Exclusive OR immediate with Memory
// eorm mmll, #imm
// Operation data length: 16 bits or 8 bits
// [51 77 ll mm imm]
case 0x77:
insn.itype = m7900_eorm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, getFlag_M ? 8 : 16, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// _______________________END EORM ___________________
// __________________________ ORAM ___________________
// 222 - OR immediAte with Memory
// oram dd, #imm
// Operation data length: 16 bits or 8 bits
// [51 33 dd imm]
case 0x33:
insn.itype = m7900_oram;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 222 - OR immediAte with Memory
// oram mmll, #imm
// Operation data length: 16 bits or 8 bits
// [51 37 ll mm imm]
case 0x37:
insn.itype = m7900_oram;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, getFlag_M ? 8 : 16, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// _______________________END oraM ___________________
// __________________________ subM ___________________
// 281 - SUBtract immediate from Memory
// subm dd, #imm
// Operation data length: 16 bits or 8 bits
// [51 13 dd imm]
case 0x13:
insn.itype = m7900_subm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 281 - SUBtract immediate from Memory
// subm mmll, #imm
// Operation data length: 16 bits or 8 bits
// [51 17 ll mm imm]
case 0x17:
insn.itype = m7900_subm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 8, SetTypeDataM);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// _______________________END subM ___________________
// __________________________ ADDMD ___________________
// 106 - ADD immediate and Memory at Double-word
// addmd dd, #imm32
// Operation data length: 32 bits
// [51 83 dd imm imm imm imm]
case 0x83:
insn.itype = m7900_addmd;
RAZOPER = INSN_PREF_D;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// 106 - ADD immediate and Memory at Double-word
// addmd mmll, #imm32
// Operation data length: 32 bits
// [51 87 ll mm imm imm imm imm]
case 0x87:
insn.itype = m7900_addmd;
RAZOPER = INSN_PREF_D;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// _______________________END ADDMD ___________________
// __________________________ ANDMD ___________________
// 115 - logical AND between immediate value and Memory (Double word)
// andmd dd, #imm32
// Operation data length: 32 bits
// [51 E3 dd imm imm imm imm]
case 0xE3:
insn.itype = m7900_andmd;
RAZOPER = INSN_PREF_D;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// 115 - logical AND between immediate value and Memory (Double word)
// andmd mmll, #imm32
// Operation data length: 32 bits
// [51 E7 ll mm imm imm imm imm]
case 0xE7:
insn.itype = m7900_andmd;
RAZOPER = INSN_PREF_D;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// _______________________END ADDMD ___________________
// __________________________ CMPMD ___________________
// 166 - CoMPare immediate with Memory at Double-word
// cmpmd dd, #imm32
// Operation data length: 32 bits
// [51 A3 dd imm imm imm imm]
case 0xA3:
insn.itype = m7900_cmpmd;
RAZOPER = INSN_PREF_D;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// 166 - CoMPare immediate with Memory at Double-word
// cmpmd mmll, #imm32
// Operation data length: 32 bits
// [51 A7 ll mm imm imm imm imm]
case 0xA7:
insn.itype = m7900_cmpmd;
RAZOPER = INSN_PREF_D;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// _______________________END CMPMD ___________________
// __________________________ EORMD ___________________
// 184 - Exclusive OR immediate with Memory at Double-word
// eormd dd, #imm32
// Operation data length: 32 bits
// [51 F3 dd imm imm imm imm]
case 0xF3:
insn.itype = m7900_eormd;
RAZOPER = INSN_PREF_D;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// 184 - Exclusive OR immediate with Memory at Double-word
// eormd mmll, #imm32
// Operation data length: 32 bits
// [51 F7 ll mm imm imm imm imm]
case 0xF7:
insn.itype = m7900_eormd;
RAZOPER = INSN_PREF_D;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// _______________________END EORMD ___________________
// __________________________ ORAMD ___________________
// 224 -OR immediAte with Memory at Double-word
// oramd dd, #imm32
// Operation data length: 32 bits
// [51 B3 dd imm imm imm imm]
case 0xB3:
insn.itype = m7900_oramd;
RAZOPER = INSN_PREF_D;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// 224 - OR immediAte with Memory at Double-word
// oramd mmll, #imm32
// Operation data length: 32 bits
// [51 B7 ll mm imm imm imm imm]
case 0xB7:
insn.itype = m7900_oramd;
RAZOPER = INSN_PREF_D;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// _______________________END ORAMD ___________________
// __________________________ SUBMD ___________________
// 283 - SUBtract immediate from Memory at Double-word
// submd dd, #imm32
// Operation data length: 32 bits
// [51 93 dd imm imm imm imm]
case 0x93:
insn.itype = m7900_submd;
RAZOPER = INSN_PREF_D;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// 283 - SUBtract immediate from Memory at Double-word
// submd mmll, #imm32
// Operation data length: 32 bits
// [51 97 ll mm imm imm imm imm]
case 0x97:
insn.itype = m7900_submd;
RAZOPER = INSN_PREF_D;
Operand_Dir(insn, insn.Op1, TAB_ABS, dt_dword);
Operand_Imm(insn, insn.Op2, 32);
break;
// _______________________END ORAMD ___________________
default:
return 0;
}
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_81(insn_t &insn)
{
TRACE("Opcode_81");
uchar code = insn.get_next_byte();
TRACE(code);
switch ( code )
{
case 0x85:// phb
insn.itype = m7900_phb;
break;
// [ 81 A4]
case 0xA4:// txb
insn.itype = m7900_txb;
break;
case 0xB4:// tyb
insn.itype = m7900_tyb;
break;
case 0x95:// plb
insn.itype = m7900_plb;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
break;
// 116 - Arithmetic Shift to Left
// asl B
// Operation data length: 16 bits or 8 bits
// [81 03]
case 0x03:// asl
insn.itype = m7900_asl;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// 119 - Arithmetic Shift to Right
// asr B
// Operation data length: 16 bits or 8 bits
// [64]
case 0x64:// asr
insn.itype = m7900_asr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// 94 - Absolute value
// abs B
case 0xE1:
insn.itype = m7900_abs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// 185 - EXTension Sign
// exts B
// Operation data length: 16 bits
// [35]
case 0x35:// exts
insn.itype = m7900_exts;
RAZOPER = INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// 187 - EXTension Zero
// extz B
// Operation data length: 16 bits
// [34]
case 0x34:// extz
insn.itype = m7900_extz;
RAZOPER = INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// 216 - NEGative
// neg B
// Operation data length: 16 bits or 8 bits
// [24]
case 0x24:// neg
insn.itype = m7900_neg;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// 293 - Transfer accumulator B to index register X
// tbx
// Operation data length: 16 bits or 8 bits
// [C4]
case 0xC4:
insn.itype = m7900_tbx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
// 294 - Transfer accumulator B to index register Y
// tby
// Operation data length: 16 bits or 8 bits
// [D4]
case 0xD4:
insn.itype = m7900_tby;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
// _____________________ DEC ____________________
// 170 - DECrement by one
// dec B
// Operation data - 16 bits or 8 bits
// [B3]
case 0xB3:
insn.itype = m7900_dec;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// _____________________ END DEC ____________________
// _____________________ INC ____________________
// 189 - INCrement by one
// inc B
// Operation data - 16 bits or 8 bits
// [A3]
case 0xA3:
insn.itype = m7900_inc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// _____________________ END INC ____________________
// _____________________ LSR ____________________
// 204 - Logical Shift Right
// lsr B
// Operation data - 16 bits or 8 bits
// [43]
case 0x43:
insn.itype = m7900_lsr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// _____________________ END LSR ____________________
// _____________________ ROL ____________________
// 254 - ROtate one bit Left
// rol B
// Operation data - 16 bits or 8 bits
// [13]
case 0x13:
insn.itype = m7900_rol;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// _____________________ END ROL ____________________
// _____________________ ROR ____________________
// 255 - ROtate one bit Right
// ror B
// Operation data - 16 bits or 8 bits
// [53]
case 0x53:// ror
insn.itype = m7900_ror;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// _____________________ END ROR ____________________
//---------------------------BYTE/WORD-------------------------------------//
// _____________________ ADD ____________________
// 101 - ADd
// add B, #imm
// Operation data length: 16 bits or 8 bits
// [26 imm]
case 0x26:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 101 - ADd
// add B, dd
// Operation data length: 16 bits or 8 bits
// [2A dd]
case 0x2A:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR,SetTypeDataM);
break;
// 101 - ADd
// add B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [2B dd]
case 0x2B:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 101 - ADd
// add B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [2E ll mm]
case 0x2E:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 101 - ADd
// add B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [2F ll mm]
case 0x2F:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END ADD ____________________
// _____________________ CMP ____________________
// 161 - CoMPare
// cmp B, #imm
// Operation data length: 16 bits or 8 bits
// [46 imm]
case 0x46:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 161 - CoMPare
// cmp B, dd
// Operation data length: 16 bits or 8 bits
// [4A dd]
case 0x4A:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 161 - CoMPare
// cmp B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [4B dd]
case 0x4B:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 161 - CoMPare
// cmp B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [4E ll mm]
case 0x4E:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 161 - CoMPare
// cmp B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [4F ll mm]
case 0x4F:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END CMP ____________________
// _____________________ AND ____________________
// 111 - logical AND
// and B, #imm
// Operation data length: 16 bits or 8 bits
// [66 imm]
case 0x66:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 111 - logical AND
// and B, #imm
// Operation data length: 16 bits or 8 bits
// [6A dd]
case 0x6A:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 111 - logical AND
// and B, #imm
// Operation data length: 16 bits or 8 bits
// [6B dd]
case 0x6B:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 111 - logical AND
// and B, #imm
// Operation data length: 16 bits or 8 bits
// [6E ll mm]
case 0x6E:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 111 - logical AND
// and B, #imm
// Operation data length: 16 bits or 8 bits
// [6F ll mm]
case 0x6F:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END AND ____________________
// _____________________ CBEQ ____________________
// 145 - Compare immediate and Branch on EQual
// cbeq B, #imm, rr
// Operation data length: 16 bits or 8 bits
// [A6 imm rr]
case 0xA6:
insn.itype = m7900_cbeq;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), getFlag_M ? 4 : 5);
break;
// _____________________ END CBEQ ____________________
// _____________________ CBNE ____________________
// 147 - Compare immediate and Branch on Not Equal
// cbne B, #imm, rr
// Operation data length: 16 bits or 8 bits
// [B6 imm rr]
case 0xB6:
insn.itype = m7900_cbne;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), getFlag_M ? 4 : 5);
break;
// _____________________ END CBNE ____________________
// _____________________ CLr ____________________
// 153 - CLeaR accumulator
// clr B
// Operation data length: 16 bits or 8 bits
// [54]
case 0x54:// clr
insn.itype = m7900_clr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
break;
// _____________________ END CLr ____________________
// _____________________ EOR ____________________
// 180 - Exclusive OR memory with accumulator
// eor B, #imm
// Operation data length: 16 bits or 8 bits
// [76 imm]
case 0x76:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, dd
// Operation data length: 16 bits or 8 bits
// [7A dd]
case 0x7A:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [7B dd]
case 0x7B:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [7E ll mm]
case 0x7E:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 180 - Exclusive OR memory with accumulator
// eor B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [7F ll mm]
case 0x7F:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END EOR ____________________
// _____________________ LDA ____________________
// 195 - LoaD Accumulator from memory
// lda B, #imm
// Operation data length: 16 bits or 8 bits
// [16 imm]
case 0x16:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 195 - LoaD Accumulator from memory
// lda B, dd
// Operation data length: 16 bits or 8 bits
// [1A dd]
case 0x1A:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 195 - LoaD Accumulator from memory
// lda B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [1B dd]
case 0x1B:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 195 - LoaD Accumulator from memory
// lda B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [18 dd]
case 0x18:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 195 - LoaD Accumulator from memory
// lda B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [19 dd]
case 0x19:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 195 - LoaD Accumulator from memory
// lda B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [1E ll mm]
case 0x1E:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 195 - LoaD Accumulator from memory
// lda B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [1F ll mm]
case 0x1F:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 195 - LoaD Accumulator from memory
// lda B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [1C ll mm hh]
case 0x1C:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 195 - LoaD Accumulator from memory
// lda B, hhmmll, X (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [1D ll mm hh]
case 0x1D:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END LDA ____________________
// _____________________ LDAB ____________________
// 196 - LoaD Accumulator from memory at Byte
// ldab B, #imm
// Operation data length: 16 bits
// [28 imm]
case 0x28:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, dd
// Operation data length: 16 bits
// [0A dd]
case 0x0A:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits
// [0B dd]
case 0x0B:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X);
Operand_Registr(insn.Op3, rX);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [08 dd]
case 0x08:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR);
Operand_Registr(insn.Op3, rY);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits
// [09 dd]
case 0x09:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [0E ll mm]
case 0x0E:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_byte);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [0F ll mm]
case 0x0F:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [0C ll mm hh]
case 0x0C:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_byte);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab B, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [0D ll mm hh]
case 0x0D:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END LDAB ____________________
// _____________________ ORA ____________________
// 220 - OR memory with Accumulator
// ora B, #imm
// Operation data length: 16 bits or 8 bits
// [56 imm]
case 0x56:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 220 - OR memory with Accumulator
// ora B, dd
// Operation data length: 16 bits or 8 bits
// [5A dd]
case 0x5A:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 220 - OR memory with Accumulator
// ora B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [5B dd]
case 0x5B:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 220 - OR memory with Accumulator
// ora B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [5E ll mm]
case 0x5E:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 220 - OR memory with Accumulator
// ora B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [5F ll mm]
case 0x5F:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END ORA ____________________
// _____________________ STA ____________________
// 271 - STore Accumulator in memory
// sta B, dd
// Operation data length: 16 bits or 8 bits
// [DA dd]
case 0xDA:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 271 - STore Accumulator in memory
// sta B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [DB dd]
case 0xDB:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 271 - STore Accumulator in memory
// sta B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [D8 dd]
case 0xD8:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 271 - STore Accumulator in memory
// sta B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [D9 dd]
case 0xD9:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 271 - STore Accumulator in memory
// sta B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [DE ll mm]
case 0xDE:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 271 - STore Accumulator in memory
// sta B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [DF ll mm]
case 0xDF:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 271 - STore Accumulator in memory
// sta B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [DC ll mm hh]
case 0xDC:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 271 - STore Accumulator in memory
// sta B, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [DD ll mm hh]
case 0xDD:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END STA ____________________
// _____________________ STAB ____________________
// 272 - STore Accumulator in memory at Byte
// stab B, dd
// Operation data length: 16 bits or 8 bits
// [CA dd]
case 0xCA:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_byte);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [CB dd]
case 0xCB:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [C8 dd]
case 0xC8:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_byte);
Operand_Registr(insn.Op3, rY);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [C9 dd]
case 0xC9:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [CE ll mm]
case 0xCE:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_byte);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [CF ll mm]
case 0xCF:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [CC ll mm hh]
case 0xCC:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_byte);
break;
// 272 - STore Accumulator in memory at Byte
// stab B, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [CD ll mm hh]
case 0xCD:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END STAB ____________________
// _____________________ SUB ____________________
// 278 - SUBtract
// sub B, #imm
// Operation data length: 16 bits or 8 bits
// [36 #imm]
case 0x36:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 278 - SUBtract
// sub B, dd
// Operation data length: 16 bits or 8 bits
// [3A dd]
case 0x3A:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 278 - SUBtract
// sub B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [3B dd]
case 0x3B:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 278 - SUBtract
// sub B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [3E ll mm]
case 0x3E:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 278 - SUBtract
// sub B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [3F ll mm]
case 0x3F:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END SUB ____________________
//---------------------------BYTE-------------------------------------//
// 102 - ADD at Byte
// addb B, #imm
// Operation data length: 8 bits
// [81 29 imm]
case 0x29:
insn.itype = m7900_addb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
break;
// 112 - logical AND between immediate (Byte)
// andb B, #imm
// Operation data length: 8 bits
// [81 23 imm]
case 0x23:
insn.itype = m7900_andb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
break;
// 146 - Compare immediate and Branch on EQual at Byte
// cbeqb B, #imm, rr (DIR)
// Operation data length: 8 bits
// [A2 imm rr]
case 0xA2:
insn.itype = m7900_cbeqb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 4);
break;
// 148 - Compare immediate and Branch on Not Equal at Byte
// cbneb B, #imm, rr ()
// Operation data length: 8 bits
// [B2 imm rr]
case 0xB2:
insn.itype = m7900_cbneb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 4);
break;
// 154 - CLeaR accumulator at Byte
// clrb B
// Operation data length: 8 bits
// [44]
case 0x44:// clrb
insn.itype = m7900_clrb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
break;
// 162 - CoMPare at Byte
// cmpb B, #imm
// Operation data length: 8 bits
// [38 imm]
case 0x38:
insn.itype = m7900_cmpb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
break;
// 181 - Exclusive OR immediate with accumulator at Byte
// eorb B, #imm
// Operation data length: 8 bits
// [33 imm]
case 0x33:
insn.itype = m7900_eorb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
break;
// 221 - OR immediate with Accumulator at Byte
// orab B, #imm
// Operation data length: 8 bits
// [63 imm]
case 0x63:
insn.itype = m7900_orab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
break;
// 279 - OR immediate with Accumulator at Byte
// subb B, #imm
// Operation data length: 8 bits
// [81 39 imm]
case 0x39:
insn.itype = m7900_subb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
break;
default:
return 0;
}
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_A1(insn_t &insn)
{
TRACE("Opcode_A1");
uchar code = insn.get_next_byte();
TRACE(code);
switch ( code )
{
// ___________________ ADC _________________________
// 96 - ADd with Carry
// adc B, dd
// Operation data length: 16 bits or 8 bits
// [A1 8A dd]
case 0x8A:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 96 - ADd with Carry
// adc B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [A1 8B dd]
case 0x8B:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
break;
// 96 - ADd with Carry
// adc B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [A1 80 dd]
case 0x80:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 96 - ADd with Carry
// adc B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [A1 81 dd]
case 0x81:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 96 - ADd with Carry
// adc B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [A1 88 dd]
case 0x88:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 96 - ADd with Carry
// adc B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [A1 82 dd]
case 0x82:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 96 - ADd with Carry
// adc B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [A1 89 dd]
case 0x89:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 96 - ADd with Carry
// adc B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [A1 83 nn]
case 0x83:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 96 - ADd with Carry
// adc B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [A1 84 nn]
case 0x84:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 96 - ADd with Carry
// adc B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [A1 8E ll mm]
case 0x8E:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 96 - ADd with Carry
// adc B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [A1 8F ll mm]
case 0x8F:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 96 - ADd with Carry
// adc B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [A1 86 ll mm]
case 0x86:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 96 - ADd with Carry
// adc B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [A1 8C ll mm hh]
case 0x8C:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 96 - ADd with Carry
// adc B, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [A1 8D ll mm hh]
case 0x8D:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ___________________ END ADC _________________________
// ___________________ SBC _________________________
// 264 - SuBtract with Carry
// sbc B, dd
// Operation data length: 16 bits or 8 bits
// [21 AA dd]
case 0xAA:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 264 - SuBtract with Carry
// sbc B, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [21 AB dd]
case 0xAB:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 264 - SuBtract with Carry
// sbc B, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [21 A0 dd]
case 0xA0:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 264 - SuBtract with Carry
// sbc B, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [21 A1 dd]
case 0xA1:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 264 - SuBtract with Carry
// sbc B, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [21 A8 dd]
case 0xA8:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 264 - SuBtract with Carry
// sbc B, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 A2 dd]
case 0xA2:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 264 - SuBtract with Carry
// sbc B, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [21 A9 dd]
case 0xA9:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 264 - SuBtract with Carry
// sbc B, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [21 A3 nn]
case 0xA3:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 264 - SuBtract with Carry
// sbc B, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 A4 nn]
case 0xA4:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 264 - SuBtract with Carry
// sbc B, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [21 AE ll mm]
case 0xAE:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 264 - SuBtract with Carry
// sbc B, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 AF ll mm]
case 0xAF:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 264 - SuBtract with Carry
// sbc B, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [21 A6 ll mm]
case 0xA6:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 264 - SuBtract with Carry
// sbc B, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 AC ll mm hh]
case 0xAC:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 264 - SuBtract with Carry
// sbc B, hhmmll, X (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 AD ll mm hh]
case 0xAD:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ___________________ END sbc _________________________
default:
return 0;
}
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_11(insn_t &insn)
{
TRACE("Opcode_11");
uchar code = insn.get_next_byte();
TRACE(code);
switch ( code )
{
// ________________________ ADD________________________
// 101 - ADd
// add A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [11 20 dd]
case 0x20:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 101 - ADd
// add A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [11 21 dd]
case 0x21:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 101 - ADd
// add A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [11 28 dd]
case 0x28:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 101 - ADd
// add A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 22 dd]
case 0x22:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_byte);
break;
// 101 - ADd
// add A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 29 dd]
case 0x29:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 101 - ADd
// add A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [11 23 nn]
case 0x23:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 101 - ADd
// add A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 24 nn]
case 0x24:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 101 - ADd
// add A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [11 26 ll mm]
case 0x26:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 101 - ADd
// add A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 2C ll mm hh]
case 0x2C:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 101 - ADd
// add A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 2D ll mm hh]
case 0x2D:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END ADD _____________________
// ________________________ CMP________________________
// 161 - CoMPare
// cmp A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [11 40 dd]
case 0x40:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 161 - CoMPare
// cmp A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [11 41 dd]
case 0x41:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 161 - CoMPare
// cmp A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [11 48 dd]
case 0x48:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 161 - CoMPare
// cmp A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 42 dd]
case 0x42:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 161 - CoMPare
// cmp A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 49 dd]
case 0x49:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_byte);
Operand_Registr(insn.Op3, rY);
break;
// 161 - CoMPare
// cmp A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [11 43 nn]
case 0x43:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 161 - CoMPare
// cmp A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 44 nn]
case 0x44:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 161 - CoMPare
// cmp A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [11 46 ll mm]
case 0x46:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 161 - CoMPare
// cmp A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 4C ll mm hh]
case 0x4C:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 161 - CoMPare
// cmp A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 4D ll mm hh]
case 0x4D:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END CMP _____________________
// ________________________ AND________________________
// 111 - logical AND
// and A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [11 60 dd]
case 0x60:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 111 - logical AND
// and A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [11 61 dd]
case 0x61:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 111 - logical AND
// and A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [11 68 dd]
case 0x68:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 111 - logical AND
// and A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 62 dd]
case 0x62:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 111 - logical AND
// and A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 69 dd]
case 0x69:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 111 - logical AND
// and A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [11 63 nn]
case 0x63:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 111 - logical AND
// and A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 64 nn]
case 0x64:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 111 - logical AND
// and A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [11 66 ll mm]
case 0x66:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 111 - logical AND
// and A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 6C ll mm hh]
case 0x6C:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 111 - logical AND
// and A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [ 6D ll mm hh]
case 0x6D:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END AND _____________________
// ________________________ EOR________________________
// 180 - Exclusive OR memory with accumulator
// eor A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [11 70 dd]
case 0x70:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [11 71 dd]
case 0x71:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [11 78 dd]
case 0x78:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 72 dd]
case 0x72:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 79 dd]
case 0x79:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [11 73 nn]
case 0x73:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 74 nn]
case 0x74:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [11 76 ll mm]
case 0x76:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [21 7C ll mm hh]
case 0x7C:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [21 7D ll mm hh]
case 0x7D:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END eor _____________________
// ___________________ LDA _________________________
// 195 - LoaD Accumulator from memory
// lda A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [11 10 dd]
case 0x10:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 195 - LoaD Accumulator from memory
// lda A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [11 11 dd]
case 0x11:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 195 - LoaD Accumulator from memory
// lda A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 12 dd]
case 0x12:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 195 - LoaD Accumulator from memory
// lda A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [11 13 nn]
case 0x13:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 195 - LoaD Accumulator from memory
// lda A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [11 14 nn]
case 0x14:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 195 - LoaD Accumulator from memory
// lda A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [11 16 ll mm]
case 0x16:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// _____________________ END LDA ____________________
// ___________________ LDAB _________________________
// 196 - LoaD Accumulator from memory at Byte
// ldab a, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [11 00 dd]
case 0x00:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [11 01 dd]
case 0x01:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 02 dd]
case 0x02:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [11 03 nn]
case 0x03:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [11 04 nn]
case 0x04:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [11 06 ll mm]
case 0x06:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_byte);
Operand_Registr(insn.Op3, rY);
break;
// _____________________ END LDAB ____________________
// ___________________ STA _________________________
// 271 - STore Accumulator in memory
// sta A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [D0 dd]
case 0xD0:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 271 - STore Accumulator in memory
// sta A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [D1 dd]
case 0xD1:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 271 - STore Accumulator in memory
// sta A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [D2 dd]
case 0xD2:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 271 - STore Accumulator in memory
// sta A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [D3 nn]
case 0xD3:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 271 - STore Accumulator in memory
// sta A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [D4 nn]
case 0xD4:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 271 - STore Accumulator in memory
// sta A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [D6 ll mm]
case 0xD6:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// _____________________ END STA ____________________
// _____________________ STAB ____________________
// 272 - STore Accumulator in memory at Byte
// stab A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [C0 dd]
case 0xC0:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_byte);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [C1 dd]
case 0xC1:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, dt_byte);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [C2 dd]
case 0xC2:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [C3 nn]
case 0xC3:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [C4 nn]
case 0xC4:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [C6 ll mm]
case 0xC6:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_byte);
Operand_Registr(insn.Op3, rY);
break;
// _____________________ END STAB ____________________
// _____________________ STAD ____________________
// 273 - STore Accumulator in memory at Double-word
// stad E, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 32 bits
// [E0 dd]
case 0xE0:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 32 bits
// [E1 dd]
case 0xE1:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, dt_dword);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [11 E2 dd]
case 0xE2:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 32 bits
// [E3 nn]
case 0xE3:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 32 bits
// [E4 nn]
case 0xE4:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 32 bits
// [E6 ll mm]
case 0xE6:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// _____________________ END STAD ____________________
// ________________________ ORA________________________
// 220 - OR memory with Accumulator
// ora A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [11 50 dd]
case 0x50:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 220 - OR memory with Accumulator
// ora A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [11 51 dd]
case 0x51:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 220 - OR memory with Accumulator
// ora A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [11 58 dd]
case 0x58:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 220 - OR memory with Accumulator
// ora A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 52 dd]
case 0x52:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 220 - OR memory with Accumulator
// ora A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 59 dd]
case 0x59:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 220 - OR memory with Accumulator
// ora A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [11 53 nn]
case 0x53:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 220 - OR memory with Accumulator
// ora A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 54 nn]
case 0x54:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 220 - OR memory with Accumulator
// ora A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [11 56 ll mm]
case 0x56:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 220 - OR memory with Accumulator
// ora A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [11 5C ll mm hh]
case 0x5C:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// ora A, hhmmll, X (Absolute long indexed X addressing mode(ABL,X)
// Operation data length: 16 bits or 8 bits
// [11 5D ll mm hh]
case 0x5D:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END ora _____________________
// ________________________ SUB________________________
// 278 - SUBtract
// sub A, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 16 bits or 8 bits
// [11 30 dd]
case 0x30:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
break;
// 278 - SUBtract
// sub A, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 16 bits or 8 bits
// [11 31 dd]
case 0x31:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, SetTypeDataM);
break;
// 278 - SUBtract
// sub A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [11 38 dd]
case 0x38:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 278 - SUBtract
// sub A, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 32 dd]
case 0x32:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 278 - SUBtract
// sub A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [11 39 dd]
case 0x39:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 278 - SUBtract
// sub A, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 16 bits or 8 bits
// [11 33 nn]
case 0x33:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 278 - SUBtract
// sub A, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 16 bits or 8 bits
// [21 34 nn]
case 0x34:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 278 - SUBtract
// sub A, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 16 bits or 8 bits
// [11 36 ll mm]
case 0x36:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 278 - SUBtract
// sub A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [11 3C ll mm hh]
case 0x3C:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 278 - SUBtract
// sub A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [11 3D ll mm hh]
case 0x3D:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// ______________________ END SUB _____________________
// ___________________ ADDD _________________________
// 101 - ADd Double-word
// addd E, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 32 bits
// [11 90 dd]
case 0x90:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
break;
// 103 - ADd at Double-word
// addd E, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 32 buts
// [11 91 dd]
case 0x91:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, dt_dword);
break;
// 103 - ADd at Double-word
// addd E, (dd), Y ()
// Operation data length: 32 bits
// [11 98 dd]
case 0x98:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 103 - ADd Double-word
// addd E, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [11 92 dd]
case 0x92:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 103 - ADd at Double-word
// addd E, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [11 99 dd]
case 0x99:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 103 - ADd at Double-word
// addd E, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 32 bits
// [11 93 nn]
case 0x93:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 103 - ADd at Double-word
// addd E, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 32 bits
// [11 94 nn]
case 0x94:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 103 - ADd at Double-word
// addd E, mmll (Absolute addressing mode(ABS))
// Operation data length: 32 bits
// [11 9E ll mm]
case 0x9E:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_dword);
break;
// 103 - ADd at Double-word
// addd E, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [11 9F ll mm]
case 0x9F:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 103 - ADd at Double-word
// addd E, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 32 bits
// [11 96 ll mm]
case 0x96:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 103 - ADd at Double-word
// addd E, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [11 9C ll mm hh]
case 0x9C:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_dword);
break;
// 103 - ADd at Double-word
// addd A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [11 9D ll mm hh]
case 0x9D:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// ___________________ END ADCD _________________________
// ___________________ CMPD _________________________
// 163 - CoMPare at Double-word
// cmpd E, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 32 bits
// [11 B0 dd]
case 0xB0:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
break;
// 163 - CoMPare at Double-word
// cmpd E, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 32 buts
// [11 B1 dd]
case 0xB1:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, dt_dword);
break;
// 163 - CoMPare at Double-word
// cmpd E, (dd), Y ()
// Operation data length: 32 bits
// [11 B8 dd]
case 0xB8:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 163 - CoMPare at Double-word
// cmpd E, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [11 B2 dd]
case 0xB2:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 163 - CoMPare at Double-word
// cmpd E, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [11 B9 dd]
case 0xB9:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 163 - CoMPare at Double-word
// cmpd E, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 32 bits
// [11 B3 nn]
case 0xB3:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 163 - CoMPare at Double-word
// cmpd E, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 32 bits
// [11 B4 nn]
case 0xB4:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 163 - CoMPare at Double-word
// cmpd E, mmll (Absolute addressing mode(ABS))
// Operation data length: 32 bits
// [11 BE ll mm]
case 0xBE:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_dword);
break;
// 163 - CoMPare at Double-word
// cmpd E, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [11 BF ll mm]
case 0xBF:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 163 - CoMPare at Double-word
// cmpd E, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 32 bits
// [11 B6 ll mm]
case 0xB6:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 163 - CoMPare at Double-word
// cmpd E, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [11 BC ll mm hh]
case 0xBC:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_dword);
break;
// 163 - CoMPare at Double-word
// cmpd A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [11 BD ll mm hh]
case 0xBD:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// ___________________ END CMPD _________________________
// ___________________ LDAD _________________________
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 32 bits
// [11 80 dd]
case 0x80:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 32 buts
// [11 81 dd]
case 0x81:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, dt_dword);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [11 82 dd]
case 0x82:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 32 bits
// [11 83 nn]
case 0x83:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 32 bits
// [11 84 nn]
case 0x84:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 32 bits
// [11 86 ll mm]
case 0x86:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// ___________________ END LDAD _________________________
// ___________________ SUBD _________________________
// 280 - SUBtract Double-word
// subd E, (dd) (Direct indirect addressing mode (DIR))
// Operation data length: 32 bits
// [11 A0 dd]
case 0xA0:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
break;
// 280 - SUBtract Double-word
// subd E, (dd, X) (Direct index X indirect addressing mode (DIR,X))
// Operation data length: 32 bits
// [11 A1 dd]
case 0xA1:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR_X, dt_dword);
break;
// 280 - SUBtract Double-word
// subd E, (dd), Y ()
// Operation data length: 32 bits
// [11 A8 dd]
case 0xA8:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 280 - SUBtract Double-word
// subd E, L(dd)(Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [11 A2 dd]
case 0xA2:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
break;
// 280 - SUBtract Double-word
// subd E, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [11 A9 dd]
case 0xA9:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 280 - SUBtract Double-word
// subd E, nn, S (Stack pointer relative addressing mode(SR))
// Operation data length: 32 bits
// [11 A3 nn]
case 0xA3:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_SP, 8);
Operand_Registr(insn.Op3, rPS);
break;
// 280 - SUBtract Double-word
// subd E, (nn,S), Y (Stack pointer relative indexed Y addressing mode((SR),Y))
// Operation data length: 32 bits
// [11 A4 nn]
case 0xA4:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_SR(insn, insn.Op2, TSP_INDEX_SP_Y, 8);
Operand_Registr(insn.Op3, rY);
break;
// 280 - SUBtract Double-word
// subd E, mmll, Y (Absolute indexed X addressing mode(ABS,Y))
// Operation data length: 32 bits
// [11 A6 ll mm]
case 0xA6:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_Y, 16, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 280 - SUBtract Double-word
// subd E, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [11 AC ll mm hh]
case 0xAC:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_dword);
break;
// 280 - SUBtract Double-word
// subd A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [11 AD ll mm hh]
case 0xAD:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// ___________________ END SUBD _________________________
default:
return 0;
}
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_B1(insn_t &insn)
{
TRACE("Opcode_B1");
uchar code = insn.get_next_byte();
TRACE(code);
uchar nib = (code >> 4) & 0xF;
switch ( code )
{
// 292 - Transfer accumulator B to Stack pointer
// tbs
// Operation data length: 8 bits
// [B1 82]
case 0x82:
insn.itype = m7900_tbs;
break;
// 96 - ADc with Carry
// adc B, #imm
// Operation data length: 16 bits or 8 bits
// [B1 87 imm]
case 0x87:
insn.itype = m7900_adc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 98 - ADd with Carry at Byte
// adcb B, #imm
// Operation data length: 8 bits
// [B1 1A imm]
case 0x1A:
insn.itype = m7900_adcb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
break;
// 265 - SuBtract with Carry at Byte
// sbcb A, #imm
// Operation data length: 8 bits
// [B1 1B imm]
case 0x1B:
insn.itype = m7900_sbcb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, 8);
break;
// 299 - Transfer Stack pointer to accumulator B
// tsb
// Operation data length: 16 bits or 8 bits
// [B1 92]
case 0x92:
insn.itype = m7900_tsb;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
break;
// _____________________ SBC ____________________
// 264 - SuBtract with Carry
// sbc B, #imm
// Operation data - 16 bits or 8 bits
// [B1 A7 imm]
case 0xA7:
insn.itype = m7900_sbc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// _____________________ END SBC ____________________
default:
{
uchar cm = code & 0x40;
if ( cm == 0x40 )
{
insn.itype = m7900_tdbn;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, dt_byte, (((code-0x40) >> 4) & 0xF)+0x1);
}
else
{
insn.itype = m7900_tbdn;
Operand_Imm_Spesh(insn.Op1, dt_byte, nib);
}
}
break;
}
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_B8(insn_t &insn)
{
TRACE("Opcode_B8");
uchar code = insn.get_next_byte();
TRACE(code);
uchar nib = (code >> 4) & 0xF;
uchar cd = code & 0xF;
uchar Nib;
if ( nib == 0 && cd == 0 )
return 0;
if ( nib == 0 )
{
insn.itype = m7900_phdn;
RAZOPER = INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, dt_byte, cd);
return insn.size;
}
else if ( cd == 0 )
{
insn.itype = m7900_lddn;
RAZOPER = INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, dt_byte, nib);
Nib = nib;
}
else
{
if ( nib != cd )
return 0;
insn.itype = m7900_phldn;
RAZOPER = INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, dt_byte, cd);
Nib = cd;
}
for ( int i=0; i < 4; ++i )
if ( GETBIT(Nib, i) == 1 )
Operand_STK(insn, insn.ops[1+i], 16);
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_77(insn_t &insn)
{
TRACE("Opcode_77");
uchar code = insn.get_next_byte();
TRACE(code);
uchar nib = (code >> 4) & 0xF;
uchar cd = code & 0xF;
switch ( cd )
{
case 0xC:
insn.itype = m7900_rtld;
Operand_Imm_Spesh(insn.Op1, dt_byte, nib);
break;
case 0x0:
insn.itype = m7900_pldn;
RAZOPER = INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, dt_byte, nib);
break;
case 0x8:
insn.itype = m7900_rtsdn;
Operand_Imm_Spesh(insn.Op1, dt_byte, nib);
break;
default:
return 0;
}
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_61(insn_t &insn)
{
TRACE("Opcode_61");
uchar code = insn.get_next_byte();
TRACE(code);
uchar nib = (code >> 4) & 0xF;
uchar count = code & 0x0F;
Operand_Imm_Spesh(insn.Op1, dt_byte, count);
uchar i;
switch ( nib )
{
case 0x0:
insn.itype = m7900_movrb;
// This instruction is unaffected by flag m
RAZOPER = INSN_PREF_U;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movrb;
for ( i=0; i < count; i++ )
{
insn.get_next_byte();// imm
insn.get_next_byte();// dd
}
break;
case 0x2:
insn.itype = m7900_movrb;
RAZOPER = INSN_PREF_U;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movrb;
for ( i=0; i < count; i++ )
{
insn.get_next_byte();// imm
insn.get_next_word();// llmm
}
break;
case 0x4:
insn.itype = m7900_movrb;
RAZOPER = INSN_PREF_U;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movrb;
for ( i=0; i < count; i++ )
{
insn.get_next_byte();// dds1
insn.get_next_byte();// ddd1
}
break;
case 0x6:
insn.itype = m7900_movrb;
RAZOPER = INSN_PREF_U;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movrb;
for ( i=0; i < count; i++ )
{
insn.get_next_byte();// dd
insn.get_next_word();// llmm
}
break;
case 0x8:
insn.itype = m7900_movrb;
RAZOPER = INSN_PREF_U;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movrb;
for ( i=0; i < count; i++ )
{
insn.get_next_word();// llmm
insn.get_next_byte();// dd
}
break;
case 0xA:
insn.itype = m7900_movrb;
RAZOPER = INSN_PREF_U;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movrb;
for ( i=0; i < count; i++ )
{
insn.get_next_word();// mmll1
insn.get_next_word();// mmll2
}
break;
// ______________________________________________
case 0x1:
insn.itype = m7900_movr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movr;
for ( i=0; i < count; i++ )
{
insn.get_next_byte();// dd
if ( getFlag_M == 0 )
insn.get_next_word();// imm
else
insn.get_next_byte();// imm
}
break;
case 0x3:
insn.itype = m7900_movr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movr;
for ( i=0; i < count; i++ )
{
if ( getFlag_M != 0 )
{
insn.get_next_byte();// imm
insn.get_next_word();// llmm
}
else
{
insn.get_next_word();// imm
insn.get_next_word();// llmm
}
}
break;
case 0x5:
insn.itype = m7900_movr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movr;
for ( i=0; i < count; i++ )
{
insn.get_next_byte();// dd1
insn.get_next_byte();// dd2
}
break;
case 0x7:
insn.itype = m7900_movr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movr;
for ( i=0; i < count; i++ )
{
insn.get_next_byte();// dd
insn.get_next_word();// llmm
}
break;
case 0x9:
insn.itype = m7900_movr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movr;
for ( i=0; i < count; i++ )
{
insn.get_next_word();// llmm
insn.get_next_byte();// dd
}
break;
case 0xB:
insn.itype = m7900_movr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movr;
for ( i=0; i < count; i++ )
{
insn.get_next_word();// mmll1
insn.get_next_word();// mmll2
}
break;
default:
return 0;
}
return insn.size;
}
//----------------------------------------------------------------------
static int Opcode_71(insn_t &insn)
{
int i;
TRACE("Opcode_71");
uchar code = insn.get_next_byte();
TRACE(code);
uchar nib = (code >> 4) & 0xF;
uchar cd = code & 0x0F;
Operand_Imm_Spesh(insn.Op1, dt_byte, cd);
// 140 - Branch on Single bit Clear
// bsc n, dd, rr
// bsc n, mmll, rr
// Operation data length: 16 bits or 8 bits
// [71 n+E0 ll mm rr]
// [71 n+A0 dd rr]
switch ( nib )
{
case 0x0:
insn.itype = m7900_movrb;
RAZOPER = INSN_PREF_U;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movr;
for ( i=0; i < cd; i++ )
{
insn.get_next_word();// mmll1
insn.get_next_byte();// dd
}
break;
case 0x6:
insn.itype = m7900_movrb;
RAZOPER = INSN_PREF_U;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movr;
for ( i=0; i < cd; i++ )
{
insn.get_next_word();// mmll1
insn.get_next_byte();// dd
}
break;
case 0x1:
insn.itype = m7900_movr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movrb;
for ( i=0; i < cd; i++ )
{
insn.get_next_word();// mmll1
insn.get_next_byte();// dd
}
break;
case 0x7:
insn.itype = m7900_movr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
insn.Op2.type = o_mem;
insn.Op2.TypeOper = m7900_movrb;
for ( i=0; i < cd; i++ )
{
insn.get_next_byte();// dd
insn.get_next_word();// llmm
}
break;
case 0xA:
insn.itype = m7900_bsc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, dt_byte, cd);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 4);
break;
case 0xE:
insn.itype = m7900_bsc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, dt_byte, cd);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 5);
break;
case 0x8:
insn.itype = m7900_bss;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, dt_byte, cd);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 4);
break;
case 0xC:
insn.itype = m7900_bss;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, dt_byte, cd);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 5);
break;
default:
return 0;
}
return insn.size;
}
//----------------------------------------------------------------------
int idaapi ana(insn_t *_insn)
{
insn_t &insn = *_insn;
TRACE("ana");
RAZOPER = 0;
uchar code = insn.get_next_byte();
uchar nib = (code >> 4) & 0xF;
uchar imm, com;
switch ( code )
{
// 116 - Arithmetic Shift to Left
// asl A
// Operation data length: 16 bits or 8 bits
// [03]
case 0x03:// asl
insn.itype = m7900_asl;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
// 119 - Arithmetic Shift to Right
// asr A
// Operation data length: 16 bits or 8 bits
// [64]
case 0x64:// asr
insn.itype = m7900_asr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
case 0x91:
return Opcode_91(insn);
case 0x21:
return Opcode_21(insn);
case 0x31:
return Opcode_31(insn);
case 0x41:
return Opcode_41(insn);
case 0x51:
return Opcode_51(insn);
case 0x81:
return Opcode_81(insn);
case 0x11:
return Opcode_11(insn);
case 0xA1:
return Opcode_A1(insn);
case 0xB1:
return Opcode_B1(insn);
case 0xB8:
return Opcode_B8(insn);
// 94 - Absolute value
// abs A
case 0xE1:
insn.itype = m7900_abs;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
//-----------------------------------------------------------//
// 139 - force BReaK
// brk
// Operation data length: -
// [00 74]
case 0x00:// brk (IMP)
if ( get_byte(insn.ea + 1) == 0x74 )
{
insn.get_next_byte();
insn.itype = m7900_brk;
Operand_IMP(insn.Op1);
}
else
{
return 0;
}
break;
case 0x14:// clc
insn.itype = m7900_clc;
break;
case 0x15:// cli
insn.itype = m7900_cli;
break;
case 0x65:// clv
insn.itype = m7900_clv;
break;
// 154 - CLeaR accumulator at Byte
// clrb A
// Operation data length: 8 bits
// [44]
case 0x44:// clrb
insn.itype = m7900_clrb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
break;
// 153 - CLeaR accumulator
// clr A
// Operation data length: 16 bits or 8 bits
// [54]
case 0x54:// clr
insn.itype = m7900_clr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
case 0xA4:// txa
insn.itype = m7900_txa;
break;
case 0xB4:// tya
insn.itype = m7900_tya;
break;
case 0xC4:// tax
insn.itype = m7900_tax;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
case 0xD4:// tay
insn.itype = m7900_tay;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
case 0x55:// xab
insn.itype = m7900_xab;
break;
case 0xE3:// dex
insn.itype = m7900_dex;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
case 0xF3:// dey
insn.itype = m7900_dey;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
// 185 - EXTension Sign
// exts A
// Operation data length: 16 bits
// [35]
case 0x35:// exts
insn.itype = m7900_exts;
RAZOPER = INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
// 187 - EXTension Zero
// extz A
// Operation data length: 16 bits
// [34]
case 0x34:// extz
insn.itype = m7900_extz;
RAZOPER = INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
//********************************************************IN
case 0xC3:// inx (IMP)
insn.itype = m7900_inx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
case 0xD3:// iny (IMP)
insn.itype = m7900_iny;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
//************************************************
case 0x24:// neg
insn.itype = m7900_neg;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
case 0x74:// nop
insn.itype = m7900_nop;
break;
//*********************************************************PUSH
case 0x85:// pha
insn.itype = m7900_pha;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
break;
case 0x83:// phd
insn.itype = m7900_phd;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
break;
case 0xA5:// php
insn.itype = m7900_php;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
break;
case 0xC5:// phx
insn.itype = m7900_phx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
case 0xE5:// phy
insn.itype = m7900_phy;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
case 0x95:// pla
insn.itype = m7900_pla;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
break;
case 0x93:// pld
insn.itype = m7900_pld;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
break;
case 0xB5:// plp
insn.itype = m7900_plp;
RAZOPER = INSN_PREF_W;
break;
case 0xD5:// plx
insn.itype = m7900_plx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
case 0xF5:// ply
insn.itype = m7900_ply;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
//****************************************************************
case 0xF1:// rti
insn.itype = m7900_rti;
break;
case 0x94:// rtl
insn.itype = m7900_rtl;
break;
case 0x84:// rts
insn.itype = m7900_rts;
break;
case 0x04:// sec
insn.itype = m7900_sec;
break;
case 0x05:// sei
insn.itype = m7900_sei;
break;
case 0x45:// clm
insn.itype = m7900_clm;
break;
case 0x25:// sem
insn.itype = m7900_sem;
break;
case 0x77://
return Opcode_77(insn);
case 0x61:
return Opcode_61(insn);
case 0x71:
return Opcode_71(insn);
// 102 - ADD at Byte
// addb A, #imm
// Operation data length: 8 bits
// [29 imm]
case 0x29:
insn.itype = m7900_addb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
break;
// 112 - logical AND between immediate (Byte)
// andb A, #imm
// Operation data length: 8 bits
// [23 imm]
case 0x23:
insn.itype = m7900_andb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
break;
// 123 -Branch on Bit Clear (Byte)
// bbcb #imm dd rr (DIR)
// Operation data length: 8 bits
// [52 dd imm rr]
case 0x52:
insn.itype = m7900_bbcb;
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_byte);
RAZOPER = INSN_PREF_U;
Operand_Imm(insn, insn.Op1, 8);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 4);
break;
// 123 -Branch on Bit Clear (Byte)
// bbcb #imm dd rr (ABS)
// Operation data length: 8 bits
// [57 dd imm rr]
case 0x57:
insn.itype = m7900_bbcb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op2, TAB_ABS, 8, dt_byte);
Operand_Imm(insn, insn.Op1, 8);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 5);
break;
// 125 - Branch on Bit Set (Byte)
// bbsb #imm dd rr (DIR)
// Operation data length: 8 bits
// [42 dd imm rr]
case 0x42:
insn.itype = m7900_bbsb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op1, 8);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 4);
break;
// 125 - Branch on Bit Set (Byte)
// bbsb #imm dd rr (ABS)
// Operation data length: 8 bits
// [47 dd imm rr]
case 0x47:
insn.itype = m7900_bbsb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op2, TAB_ABS, 8, dt_byte);
Operand_Imm(insn, insn.Op1, 8);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 5);
break;
// 146 - Compare immediate and Branch on EQual at Byte
// cbeqb A, #imm, rr ()
// Operation data length: 8 bits
// [A2 imm rr]
case 0xA2:
insn.itype = m7900_cbeqb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 3);
break;
// 146 - Compare immediate and Branch on EQual at Byte
// cbeqb A,dd, #imm, rr (DIR)
// Operation data length: 8 bits
// [62 dd imm rr]
case 0x62:// cbeqb dd,#imm,rr
insn.itype = m7900_cbeqb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
Operand_Near(insn, insn.Op3,insn.get_next_byte(), 4);
break;
// 148 - Compare immediate and Branch on Not Equal at Byte
// cbneb A, #imm, rr (DIR)
// Operation data length: 8 bits
// [B2 imm rr]
case 0xB2:
insn.itype = m7900_cbneb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 3);
break;
// 148 - Compare immediate and Branch on Not Equal at Byte
// cbneb A,dd, #imm, rr (DIR)
// Operation data length: 8 bits
// [72 dd imm rr]
case 0x72:// cbneb dd,#imm,rr
insn.itype = m7900_cbneb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op2, 8);
Operand_Near(insn, insn.Op3,insn.get_next_byte(), 4);
break;
// 156 - CLeaR Memory at Byte
// clrmb dd(DIR)
// Operation data length: 8 bits
// [C2 dd]
case 0xC2:
insn.itype = m7900_clrmb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_byte);
break;
// 156 - CLeaR Memory at Byte
// clrmb mmll(ABS)
// Operation data length: 8 bits
// [C2 ll mm]
case 0xC7:// clrmb
insn.itype = m7900_clrmb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
break;
// 162 - CoMPare at Byte
// cmpb A, #imm
// Operation data length: 8 bits
// [38 imm]
case 0x38:
insn.itype = m7900_cmpb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
break;
// 181 - Exclusive OR immediate with accumulator at Byte
// eorb A, #imm
// Operation data length: 8 bits
// [33 imm]
case 0x33:
insn.itype = m7900_eorb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
break;
// __________________________________________________________//
// 208 - MOVe Memory to memory at Byte
// movmb dd, #imm
// Operation data length: 8 bits
// [A9 imm dd]
case 0xA9:
insn.itype = m7900_movmb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_byte);
Operand_Imm(insn, insn.Op1, 8);
break;
// 208 - MOVe Memory to memory at Byte
// movmb dd, mmll
// Operation data length: 8 bits
// [4C imm ll mm]
case 0x4C:
insn.itype = m7900_movmb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_byte);
Operand_Imm(insn, insn.Op1, 8);
break;
// 208 - MOVe Memory to memory at Byte
// movmb dd, mmll, X
// Operation data length: 8 bits
// [4D imm ll mm]
case 0x4D:
insn.itype = m7900_movmb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_byte);
Operand_Imm(insn, insn.Op1, 8);
Operand_Registr(insn.Op3, rX);
break;
// 208 - MOVe Memory to memory at Byte
// movmb mmll, #imm
// Operation data length: 8 bits
// [B9 imm ll mm]
case 0xB9:
insn.itype = m7900_movmb;
RAZOPER = INSN_PREF_U;
Operand_Imm(insn, insn.Op2, 8);
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
break;
// 208 - MOVe Memory to memory at Byte
// movmb mmll, dd
// Operation data length: 8 bits
// [68 dd ll mm]
case 0x68:
insn.itype = m7900_movmb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_byte);
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
break;
// 208 - MOVe Memory to memory at Byte
// movmb mmll, dd
// Operation data length: 8 bits
// [69 dd ll mm]
case 0x69:
insn.itype = m7900_movmb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_byte);
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// 208 - MOVe Memory to memory at Byte
// movmb mmll, mmll
// Operation data length: 8 bits
// [6C ll mm ll mm]
case 0x6C:
insn.itype = m7900_movmb;
RAZOPER = INSN_PREF_U;
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_byte);
Operand_AB(insn, insn.Op1, TAB_ABS, 16, dt_byte);
break;
// 208 - MOVe Memory to memory at Byte
// movmb mmll, mmll
// Operation data length: 8 bits
// [48 dd dd]
case 0x48:
insn.itype = m7900_movmb;
RAZOPER = INSN_PREF_U;
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_byte);
Operand_Dir(insn, insn.Op1, TDIR_DIR, dt_byte);
break;
// 221 - OR immediate with Accumulator at Byte
// orab A, #imm
// Operation data length: 8 bits
// [63 imm]
case 0x63:
insn.itype = m7900_orab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
break;
// 279 - OR immediate with Accumulator at Byte
// subb A, #imm
// Operation data length: 8 bits
// [39 imm]
case 0x39:
insn.itype = m7900_subb;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
break;
// _____________________ ADD ____________________
// 101 - ADd
// add A, #imm
// Operation data length: 16 bits or 8 bits
// [26 imm]
case 0x26:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 101 - ADd
// add A, dd
// Operation data length: 16 bits or 8 bits
// [2A dd]
case 0x2A:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 101 - ADd
// add A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [2B dd]
case 0x2B:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 101 - ADd
// add A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [2E ll mm]
case 0x2E:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 101 - ADd
// add A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [2F ll mm]
case 0x2F:
insn.itype = m7900_add;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END ADD ____________________
// _____________________ CMP ____________________
// 161 - CoMPare
// cmp A, #imm
// Operation data length: 16 bits or 8 bits
// [46 imm]
case 0x46:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 161 - CoMPare
// cmp A, dd
// Operation data length: 16 bits or 8 bits
// [4A dd]
case 0x4A:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 161 - CoMPare
// cmp A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [4B dd]
case 0x4B:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 161 - CoMPare
// cmp A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [4E ll mm]
case 0x4E:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 161 - CoMPare
// cmp A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [4F ll mm]
case 0x4F:
insn.itype = m7900_cmp;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END CMP ____________________
// _____________________ EOR ____________________
// 180 - Exclusive OR memory with accumulator
// eor A, #imm
// Operation data length: 16 bits or 8 bits
// [76 imm]
case 0x76:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, dd
// Operation data length: 16 bits or 8 bits
// [7A dd]
case 0x7A:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [7B dd]
case 0x7B:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [7E ll mm]
case 0x7E:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 180 - Exclusive OR memory with accumulator
// eor A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [7F ll mm]
case 0x7F:
insn.itype = m7900_eor;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END EOR ____________________
// _____________________ LDA ____________________
// 195 - LoaD Accumulator from memory
// lda A, #imm
// Operation data length: 16 bits or 8 bits
// [16 imm]
case 0x16:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 195 - LoaD Accumulator from memory
// lda A, dd
// Operation data length: 16 bits or 8 bits
// [1A dd]
case 0x1A:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 195 - LoaD Accumulator from memory
// lda A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [1B dd]
case 0x1B:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 195 - LoaD Accumulator from memory
// lda A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [18 dd]
case 0x18:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rB);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 195 - LoaD Accumulator from memory
// lda A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [19 dd]
case 0x19:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 195 - LoaD Accumulator from memory
// lda A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [1E ll mm]
case 0x1E:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 195 - LoaD Accumulator from memory
// lda A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [1F ll mm]
case 0x1F:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 195 - LoaD Accumulator from memory
// lda A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [1C ll mm hh]
case 0x1C:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 195 - LoaD Accumulator from memory
// lda A, hhmmll, X (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [1D ll mm hh]
case 0x1D:
insn.itype = m7900_lda;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END LDA ____________________
// _____________________ LDAB ____________________
// 196 - LoaD Accumulator from memory at Byte
// ldab A, #imm
// Operation data length: 16 bits
// [28 imm]
case 0x28:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, 8);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, dd
// Operation data length: 16 bits
// [0A dd]
case 0x0A:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits
// [0B dd]
case 0x0B:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X);
Operand_Registr(insn.Op3, rX);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [08 dd]
case 0x08:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR);
Operand_Registr(insn.Op3, rY);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits
// [09 dd]
case 0x09:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [0E ll mm]
case 0x0E:
insn.itype = m7900_ldab;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_byte);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [0F ll mm]
case 0x0F:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [0C ll mm hh]
case 0x0C:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_byte);
break;
// 196 - LoaD Accumulator from memory at Byte
// ldab A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [0D ll mm hh]
case 0x0D:
insn.itype = m7900_ldab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END LDAB ____________________
// _____________________ STA ____________________
// 271 - STore Accumulator in memory
// sta A, dd
// Operation data length: 16 bits or 8 bits
// [DA dd]
case 0xDA:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 271 - STore Accumulator in memory
// sta A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [DB dd]
case 0xDB:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 271 - STore Accumulator in memory
// sta A, (dd), Y ()
// Operation data length: 16 bits or 8 bits
// [D8 dd]
case 0xD8:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rY);
break;
// 271 - STore Accumulator in memory
// sta A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 16 bits or 8 bits
// [D9 dd]
case 0xD9:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 271 - STore Accumulator in memory
// sta A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [DE ll mm]
case 0xDE:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 271 - STore Accumulator in memory
// sta A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [DF ll mm]
case 0xDF:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 271 - STore Accumulator in memory
// sta A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [DC ll mm hh]
case 0xDC:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, SetTypeDataM);
break;
// 271 - STore Accumulator in memory
// sta A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [DD ll mm hh]
case 0xDD:
insn.itype = m7900_sta;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END STA ____________________
// _____________________ ORA ____________________
// 220 - OR memory with Accumulator
// ora A, #imm
// Operation data length: 16 bits or 8 bits
// [56 imm]
case 0x56:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 220 - OR memory with Accumulator
// ora A, dd
// Operation data length: 16 bits or 8 bits
// [5A dd]
case 0x5A:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 220 - OR memory with Accumulator
// ora A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [5B dd]
case 0x5B:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 220 - OR memory with Accumulator
// ora A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [5E ll mm]
case 0x5E:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 220 - OR memory with Accumulator
// ora A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [5F ll mm]
case 0x5F:
insn.itype = m7900_ora;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END ORA ____________________
// _____________________ ADDD ____________________
// 103 - ADd at Double-word
// addd E, #imm
// Operation data length: 32 bits
// [2D imm imm imm imm]
case 0x2D:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Imm(insn, insn.Op2, 32);
break;
// 103 - ADd at Double-word
// addd E, dd
// Operation data length: 32 bits
// [9A dd]
case 0x9A:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_dword);
break;
// 103 - ADd at Double-word
// addd E, dd, X (Direct index X addressing DIR,X)
// Operation data length: 32 bits
// [9B dd]
case 0x9B:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 103 - ADd at Double-word
// addD E, mmll (Absolute addressing mode(ABS))
// Operation data length: 32 bits
// [9E ll mm]
case 0x9E:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_dword);
break;
// 103 - ADd at Double-word
// add A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [9F ll mm]
case 0x9F:
insn.itype = m7900_addd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END ADDD ____________________
// _____________________ LDAD ____________________
// 197 - LoaD Accumulator from memory at Double-word
// addd E, #imm
// Operation data length: 32 bits
// [2C imm imm imm imm]
case 0x2C:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Imm(insn, insn.Op2, 32);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, dd
// Operation data length: 32 bits
// [8A dd]
case 0x8A:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_dword);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, dd, X (Direct index X addressing DIR,X)
// Operation data length: 32 bits
// [8B dd]
case 0x8B:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, (dd), Y ()
// Operation data length: 32 bits
// [88 dd]
case 0x88:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [89 dd]
case 0x89:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldaD E, mmll (Absolute addressing mode(ABS))
// Operation data length: 32 bits
// [8E ll mm]
case 0x8E:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_dword);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [8F ll mm]
case 0x8F:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad E, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 16 bits or 8 bits
// [8C ll mm hh]
case 0x8C:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_dword);
break;
// 197 - LoaD Accumulator from memory at Double-word
// ldad A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [8D ll mm hh]
case 0x8D:
insn.itype = m7900_ldad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END LDAD ____________________
// _____________________ CMPD ____________________
// 163 - CoMPare at Double-word
// cmpd E, #imm
// Operation data length: 32 bits
// [3C imm imm imm imm]
case 0x3C:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Imm(insn, insn.Op2, 32);
break;
// 163 - CoMPare at Double-word
// cmpd E, dd
// Operation data length: 32 bits
// [BA dd]
case 0xBA:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_dword);
break;
// 163 - CoMPare at Double-word
// cmpd E, dd, X (Direct index X addressing DIR,X)
// Operation data length: 32 bits
// [BB dd]
case 0xBB:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 163 - CoMPare at Double-word
// cmpd E, mmll (Absolute addressing mode(ABS))
// Operation data length: 32 bits
// [BE ll mm]
case 0xBE:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_dword);
break;
// 163 - CoMPare at Double-word
// cmpd A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [BF ll mm]
case 0xBF:
insn.itype = m7900_cmpd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END CMPD ____________________
// 108 - ADD index register X and immediate
// addx #imm
// Operation data length: 16 bits
// [01 imm]
// 140 - Branch on Single bit Clear
// bsc n, A, rr
// Operation data length: 16 bits or 8 bits
// [01 n+A0 rr]
// 142 - Branch on Single bit Set
// bss n, A, rr
// Operation data length: 16 bits or 8 bits
// [01 n+80 rr]
case 0x01:
imm = insn.get_next_byte();
switch ( imm & 0xE0 )
{
case 0x0: /*addx*/
insn.itype = m7900_addx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, SetTypeDataX, imm);
break;
case 0x20: /*addy*/
insn.itype = m7900_addy;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, SetTypeDataX, (imm & 0x1F));
break;
case 0x40: /*subx*/
insn.itype = m7900_subx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, SetTypeDataX, (imm & 0x1F));
break;
case 0x60: /*suby*/
insn.itype = m7900_suby;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, SetTypeDataX, (imm & 0x1F));
break;
case 0x80: /*bss*/
insn.itype = m7900_bss;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, SetTypeDataX, (imm & 0x0F));
Operand_Registr(insn.Op2, rA);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 3);
break;
case 0xA0: /*bcs*/
insn.itype = m7900_bsc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, SetTypeDataX, (imm & 0x0F));
Operand_Registr(insn.Op2, rA);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), 3);
break;
case 0xC0: /*dxbne*/
insn.itype = m7900_dxbne;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, SetTypeDataX, (imm -0xC0));
Operand_Near(insn, insn.Op2, insn.get_next_byte(), 3);
break;
case 0xE0: /*dybne*/
insn.itype = m7900_dybne;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op1, SetTypeDataX, (imm - 0xE0));
Operand_Near(insn, insn.Op2, insn.get_next_byte(), 3);
break;
}
break;
// _____________________ AND ____________________
// 111 - logical AND
// and A, #imm
// Operation data length: 16 bits or 8 bits
// [66 imm]
case 0x66:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 111 - logical AND
// and A, #imm
// Operation data length: 16 bits or 8 bits
// [6A dd]
case 0x6A:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 111 - logical AND
// and A, #imm
// Operation data length: 16 bits or 8 bits
// [6B dd]
case 0x6B:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 111 - logical AND
// and A, #imm
// Operation data length: 16 bits or 8 bits
// [6E ll mm]
case 0x6E:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 111 - logical AND
// and A, #imm
// Operation data length: 16 bits or 8 bits
// [6F ll mm]
case 0x6F:
insn.itype = m7900_and;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END AND ____________________
// 117 - Arithmetic Shift to Left by n bits
// asl n A,#imm
// Operation data length: 16 bits or 8 bits
// [C1 imm+40]
// 120 - Arithmetic Shift to Right by n bits
// asr n A,#imm
// Operation data length: 16 bits or 8 bits
// [C1 imm+80]
// 169 - DEcrement memory and Branch on Not Equal
// debne dd #imm rr
// Operation data length: 16 bits or 8 bits
// [D1 imm+A0 dd rr]
// 253 - n bits ROtate Left
// rol n #imm
// Operation data length: 16 bits or 8 bits
// [C1 imm+A0]
// 256 - n bits ROtate Right
// ror n #imm
// Operation data length: 16 bits or 8 bits
// [C1 imm+20]
case 0xC1:
imm = insn.get_next_byte();
com = imm & 0xE0;
if ( com == 0x20 )
{
insn.itype = m7900_rorn;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm_Spesh(insn.Op2, dt_byte, (imm & 0x1F));
}
else if ( com == 0x40 )
{
insn.itype = m7900_asln;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm_Spesh(insn.Op2, dt_byte, (imm & 0x0F));
}
else if ( com == 0x60 )
{
insn.itype = m7900_roln;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm_Spesh(insn.Op2, dt_byte, (imm & 0x1F));
}
else if ( com == 0x80 )
{
insn.itype = m7900_asrn;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm_Spesh(insn.Op2, dt_byte, (imm & 0x1F));
}
else if ( com == 0xA0 )
{
insn.itype = m7900_debne;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op2, dt_byte, (imm & 0x1F));
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_DEBNE(insn, insn.Op3, insn.get_next_byte(), 4);
}
else
{
insn.itype = m7900_lsrn;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm_Spesh(insn.Op2, dt_byte, imm);
}
break;
// 118 - Arithmetic Shift to Left by n bits (Double word)
// asld n E,#imm
// Operation data length: 32 bits
// [D1 imm+40]
// 169 - DEcrement memory and Branch on Not Equal
// debne mmll #imm rr
// Operation data length: 16 bits or 8 bits
// [D1 imm+E0 ll mm rr]
// 206 - Logical n bits Shift Right at Double-word
// lsrd E #imm
// Operation data length: 32 bits
// [D1 imm]
// 254 - n bits ROtate Left at Double-word
// rold E #imm
// Operation data length: 32 bits
// [D1 imm+60]
// 254 - n bits ROtate Right at Double-word
// rord E #imm
// Operation data length: 32 bits
// [D1 imm+20]
case 0xD1:
imm = insn.get_next_byte();
com = imm & 0xE0;
if ( com == 0x20 )
{
insn.itype = m7900_rordn;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Imm_Spesh(insn.Op2, dt_dword, imm & 0x1F);
}
else if ( com == 0x40 )
{
insn.itype = m7900_asldn;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Imm_Spesh(insn.Op2, dt_dword, imm & 0x1F);
}
else if ( com == 0x60 )
{
insn.itype = m7900_roldn;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Imm_Spesh(insn.Op2, dt_dword, imm & 0x1F);
}
else if ( com == 0x80 )
{
insn.itype = m7900_asrdn;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Imm_Spesh(insn.Op2, dt_dword, imm & 0x1F);
}
else if ( com == 0xE0 )
{
insn.itype = m7900_debne;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm_Spesh(insn.Op2, dt_dword, (imm & 0x1F));
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
Operand_DEBNE(insn, insn.Op3, insn.get_next_byte(), 5);
}
else
{
insn.itype = m7900_lsrdn;
RAZOPER = 32;
Operand_Registr(insn.Op1, rE);
Operand_Imm_Spesh(insn.Op2, dt_dword, imm);
}
break;
// 126 - Branch on Carry Clear
// bcc rr
// Operation data length: -
// [90 rr]
// 138 - BRanch Always
// bra rr
// Operation data length: -
// [20 rr]
// 127 - Branch on Carry Set
// bcs rr
// Operation data length: -
// [B0 rr]
// 128 - Branch on EQual
// beq rr
// Operation data length: -
// [F0 rr]
// 129 - Branch on Greater or Equal
// bge rr
// Operation data length: -
// [C0 rr]
// 130 -
// bgt rr
// Operation data length: -
// [80 rr]
// 131 - Branch on Greater Than with Unsign
// bgtu rr
// Operation data length: -
// [40 rr]
// 132 - Branch on Less or Equal
// ble rr
// Operation data length: -
// [A0 rr]
// 133 - Branch on Less Equal with Unsign
// bleu rr
// Operation data length: -
// [60 rr]
// 134 - Branch on Less Than
// blt rr
// Operation data length: -
// [E0 rr]
// 135 - Branch on result MInus
// bmi rr
// Operation data length: -
// [30 rr]
// 136 - Branch on Not Equal
// bne rr
// Operation data length: -
// [D0 rr]
// 137 - Branch on result PLus
// bpl rr
// Operation data length: -
// [10 rr]
// 143 - Branch on oVerflow Clear
// bvc rr
// Operation data length: -
// [50 rr]
// 144 - Branch on oVerflow Set
// bvs rr
// Operation data length: -
// [70 rr]
case 0x10:
case 0x20:
case 0x30:
case 0x40:
case 0x50:
case 0x60:
case 0x70:
case 0x80:
case 0x90:
case 0xA0:
case 0xB0:
case 0xC0:
case 0xD0:
case 0xE0:
case 0xF0:
RAZOPER = 0;
Branch(insn, insn.Op1, nib);
break;
case 0xA7:
insn.itype = m7900_bral;
RAZOPER = 0;
Bral(insn, insn.Op1, 3);
break;
// _____________________ CBEQ ____________________
// 145 - Compare immediate and Branch on EQual
// cbeq A, #imm, rr
// Operation data length: 16 bits or 8 bits
// [A6 imm rr]
case 0xA6:
insn.itype = m7900_cbeq;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), getFlag_M ? 3 : 4);
break;
// _____________________ END CBEQ ____________________
// _____________________ CBNE ____________________
// 147 - Compare immediate and Branch on Not Equal
// cbne A, #imm, rr
// Operation data length: 16 bits or 8 bits
// [B6 imm rr]
case 0xB6:
insn.itype = m7900_cbne;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
Operand_Near(insn, insn.Op3, insn.get_next_byte(), getFlag_M ? 3 : 4);
break;
// _____________________ END CBNE ____________________
// _____________________ CLP ____________________
// 153 - CLear Processor status
// clp #imm
// Operation data -
// [98 imm]
case 0x98:// clp
insn.itype = m7900_clp;
Operand_Imm(insn, insn.Op1, 8);
break;
// _____________________ END CLP ____________________
// _____________________ CLPM ____________________
// 155 - CLeaR Memory
// clpm dd
// Operation data - 16 bits or 8 bits
// [D2 dd]
case 0xD2:// clrm
insn.itype = m7900_clrm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// 155 - CLeaR Memory
// clpm mmll
// Operation data - 16 bits or 8 bits
// [D7 ll mm]
case 0xD7:// clrm
insn.itype = m7900_clrm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// _____________________ END CLPM ____________________
// _____________________ CLPX ____________________
// 157 - CLeaR index register X
// clpx
// Operation data - 16 bits or 8 bits
// [E4]
case 0xE4:
insn.itype = m7900_clrx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
// 158 - CLeaR index register Y
// clpy
// Operation data - 16 bits or 8 bits
// [F4]
case 0xF4:
insn.itype = m7900_clry;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
break;
// _____________________ END CLPX CLPY ____________________
// _____________________ CPX ____________________
// 167 - ComPare memory and index register X
// cpx #imm
// Operation data - 16 bits or 8 bits
// [E6 imm]
case 0xE6:// cpx
insn.itype = m7900_cpx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op1, getFlag_X ? 8 : 16);
break;
// 167 - ComPare memory and index register X
// cpx dd
// Operation data - 16 bits or 8 bits
// [22 dd]
case 0x22:// cpx
insn.itype = m7900_cpx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataX);
break;
// _____________________ END CPX ____________________
// _____________________ CPY ____________________
// 168 - ComPare memory and index register Y
// cpy #imm
// Operation data - 16 bits or 8 bits
// [F6 imm]
case 0xF6:// cpy
insn.itype = m7900_cpy;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op1, getFlag_X ? 8 : 16);
break;
// 168 - ComPare memory and index register Y
// cpy dd
// Operation data - 16 bits or 8 bits
// [32 dd]
case 0x32:// cpy
insn.itype = m7900_cpy;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataX);
break;
// _____________________ END CPY ____________________
// _____________________ DEC ____________________
// 170 - DECrement by one
// dec A
// Operation data - 16 bits or 8 bits
// [B3]
case 0xB3:
insn.itype = m7900_dec;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
case 0x92:
insn.itype = m7900_dec;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
case 0x97:
insn.itype = m7900_dec;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// _____________________ END DEC ____________________
// _____________________ INC ____________________
// 189 - INCrement by one
// inc A
// Operation data - 16 bits or 8 bits
// [A3]
case 0xA3:
insn.itype = m7900_inc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
case 0x82:
insn.itype = m7900_inc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
case 0x87:
insn.itype = m7900_inc;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
// _____________________ END INC ____________________
// _____________________ LDX ____________________
// 200 - load
// ldx #imm
// Operation data - 16 bits or 8 bits
// [C6]
case 0xC6:
insn.itype = m7900_ldx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op1, getFlag_X ? 8 : 16);
break;
case 0x02:
insn.itype = m7900_ldx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataX);
break;
case 0x07:
insn.itype = m7900_ldx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataX);
break;
// _____________________ END LDX ____________________
// _____________________ LDXB ____________________
// 201 - LoaD index register X from memory at Byte
// ldxb #imm
// Operation data - 16 bits
// [27]
case 0x27:
insn.itype = m7900_ldxb;
RAZOPER = INSN_PREF_W;
Operand_Imm(insn, insn.Op1, 8);
break;
// _____________________ END LDXB ____________________
// _____________________ LDY ____________________
// 202 - LoaD index register Y from memory
// ldy #imm
// Operation data - 16 bits or 8 bits
// [D6]
case 0xD6:
insn.itype = m7900_ldy;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op1, getFlag_X ? 8 : 16);
break;
case 0x12:
insn.itype = m7900_ldy;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataX);
break;
case 0x17:
insn.itype = m7900_ldy;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16);
break;
// _____________________ END LDY ____________________
// _____________________ LDYB ____________________
// 202 - LoaD index register Y from memory at Byte
// ldyb #imm
// Operation data - 16 bits
// [37]
case 0x37:
insn.itype = m7900_ldyb;
RAZOPER = INSN_PREF_U;
Operand_Imm(insn, insn.Op1, 8);
break;
// _____________________ END LDX ____________________
// _____________________ JMP ____________________
// 192 - JUMP
// jmp mmll
// Operation data -
// [9C ll mm]
case 0x9C:
{
insn.itype = m7900_jmp;
insn.Op1.type = o_near;
uint32 high = insn.get_next_byte();
uint32 low = insn.get_next_byte();
uint32 addr = high | (low<<8);
addr = uint32(addr | (getPG<<16));
insn.Op1.addr = addr;
}
break;
// [AC ll mm hh]
case 0xAC:// jmpl hhmmll
{
insn.itype = m7900_jmpl;
insn.Op1.type = o_near;
uint32 ll = insn.get_next_byte();
uint32 mm = insn.get_next_byte();
uint32 hh = insn.get_next_byte();
uint32 addr = (ll | (hh<<16)) | (mm<<8);
insn.Op1.addr = addr;
}
break;
case 0xBC:// jmpl mmll((ABS,X))
insn.itype = m7900_jmp;
Operand_AB(insn, insn.Op1, TAB_INDIRECTED_ABS_X, 16, dt_word);
break;
// _____________________ END JMP ____________________
// _____________________ JSR ____________________
case 0x9D:// jsr mmll
insn.itype = m7900_jsr;
Jsr_16(insn, insn.Op1, getPG);
break;
case 0xAD:// jsrl hhmmll
insn.itype = m7900_jsrl;
Jsr_24(insn, insn.Op1);
break;
case 0xBD:// jsr mmll((ABS,X))
insn.itype = m7900_jsr;
Operand_AB(insn, insn.Op1, TAB_INDIRECTED_ABS_X, 16, dt_word);
break;
// _____________________ END JSR ____________________
// _____________________ LSR ____________________
// 204 - Logical Shift Right
// lsr A
// Operation data - 16 bits or 8 bits
// [43]
case 0x43:
insn.itype = m7900_lsr;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
// _____________________ END LSR ____________________
// _____________________ ROL ____________________
// 254 - ROtate one bit Left
// rol A
// Operation data - 16 bits or 8 bits
// [13]
case 0x13:
insn.itype = m7900_rol;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
// _____________________ END ROL ____________________
// _____________________ ROR ____________________
// 255 - ROtate one bit Right
// ror A
// Operation data - 16 bits or 8 bits
// [53]
case 0x53:// ror
insn.itype = m7900_ror;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
break;
// _____________________ END ROR ____________________
// _____________________ MOVM ____________________
case 0x86:// movm dd,#imm(DIR, IMM)
insn.itype = m7900_movm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
case 0x5C:// movm dd, mmll(DIR, ABS)
insn.itype = m7900_movm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
case 0x5D:// movm dd, mmll(DIR, ABS,X)
insn.itype = m7900_movm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
case 0x96:// movm dd, mmll(ABS, IMM)
insn.itype = m7900_movm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
case 0x78:// movm dd, mmll(ABS, DIR)
insn.itype = m7900_movm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
Operand_AB(insn, insn.Op1, TAB_ABS, getFlag_M ? 8 : 16,SetTypeDataM);
break;
case 0x79:// movm dd, mmll(ABS, DIR)
insn.itype = m7900_movm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_AB(insn, insn.Op1, TAB_ABS, getFlag_M ? 8 : 16, SetTypeDataM);
break;
case 0x7C:// movm mmll1,mmll2(ABS, ABS)
insn.itype = m7900_movm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataM);
break;
case 0x58:// movm dd1, dd2(DIR, DIR)
insn.itype = m7900_movm;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataM);
break;
// _____________________ END MOVM ____________________
// _____________________ PSH ____________________
// 246 - PuSH
// psh #imm
// Operation data - 16 bits or 8 bits
// [A8 imm]
case 0xA8:
insn.itype = m7900_psh;
Operand_Imm(insn, insn.Op1, 8);
break;
// _____________________ END PSH ____________________
// _____________________ PUL ____________________
// 246 - PuLl
// pul #imm
// Operation data - 16 bits or 8 bits
// [67 imm]
case 0x67:
insn.itype = m7900_pul;
Operand_Imm(insn, insn.Op1, 8);
break;
// _____________________ END PUL ____________________
// _____________________ SEP ____________________
case 0x99:
insn.itype = m7900_sep;
Operand_Imm(insn, insn.Op1, 8);
break;
// _____________________ END SEP ____________________
// _____________________ STAB ____________________
// 272 - STore Accumulator in memory at Byte
// stab A, dd
// Operation data length: 8 bits
// [CA dd]
case 0xCA:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_byte);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 8 bits
// [CB dd]
case 0xCB:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, (dd), Y ()
// Operation data length: 8 bits
// [C8 dd]
case 0xC8:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_byte);
Operand_Registr(insn.Op3, rY);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 8 bits
// [C9 dd]
case 0xC9:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, mmll (Absolute addressing mode(ABS))
// Operation data length: 8 bits
// [CE ll mm]
case 0xCE:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_byte);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 8 bits
// [CF ll mm]
case 0xCF:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 8 bits
// [CC ll mm hh]
case 0xCC:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_byte);
break;
// 272 - STore Accumulator in memory at Byte
// stab A, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 8 bits
// [CD ll mm hh]
case 0xCD:
insn.itype = m7900_stab;
RAZOPER = INSN_PREF_U;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_byte);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END STAB ____________________
// _____________________ STAD ____________________
// 273 - STore Accumulator in memory at Double-word
// stad E, dd
// Operation data length: 32 bits
// [EA dd]
case 0xEA:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_dword);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, dd, X (Direct index X addressing DIR,X)
// Operation data length: 32 bits
// [EB dd]
case 0xEB:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, (dd), Y ()
// Operation data length: 32 bits
// [E8 dd]
case 0xE8:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_INDIRECT_DIR, dt_dword);
Operand_Registr(insn.Op3, rY);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, L(dd),Y (Direct indirect long addressing mode L(DIR))
// Operation data length: 32 bits
// [E9 dd]
case 0xE9:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_L_INDIRECT_DIR, dt_tbyte);
Operand_Registr(insn.Op3, rY);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, mmll (Absolute addressing mode(ABS))
// Operation data length: 32 bits
// [EE ll mm]
case 0xEE:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_dword);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [EF ll mm]
case 0xEF:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, hhmmll, Y (Absolute long addressing mode(ABL))
// Operation data length: 32 bits
// [EC ll mm hh]
case 0xEC:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL, 24, dt_dword);
break;
// 273 - STore Accumulator in memory at Double-word
// stad E, hhmmll, Y (Absolute long indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [ED ll mm hh]
case 0xED:
insn.itype = m7900_stad;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABL_X, 24, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END STAD ____________________
// _____________________ STX ____________________
// 275 - STore index register X in memory
// stx dd
// Operation data length: 16 bits or 8 bits
// [E2 dd]
case 0xE2:// stx (DIR)
insn.itype = m7900_stx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataX);
break;
// 275 - STore index register X in memory
// stx mmll
// Operation data length: 16 bits or 8 bits
// [E7 ll mm]
case 0xE7:// stx ABS
insn.itype = m7900_stx;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataX);
break;
// _____________________ END STX ____________________
// _____________________ STY ____________________
// 276 - STore index register Y in memory
// sty dd
// Operation data length: 16 bits or 8 bits
// [F2 dd]
case 0xF2:// sty (DIR)
insn.itype = m7900_sty;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_Dir(insn, insn.Op1, TDIR_DIR, SetTypeDataX);
break;
case 0xF7:// sty ABS
insn.itype = m7900_sty;
RAZOPER = getFlag_X ? INSN_PREF_B : INSN_PREF_W;
Operand_AB(insn, insn.Op1, TAB_ABS, 16, SetTypeDataX);
break;
// _____________________END STY ____________________
// _____________________ SUB ____________________
// 278 - SUBtract
// sub A, #imm
// Operation data length: 16 bits or 8 bits
// [36 #imm]
case 0x36:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Imm(insn, insn.Op2, getFlag_M ? 8 : 16);
break;
// 278 - SUBtract
// sub A, dd
// Operation data length: 16 bits or 8 bits
// [3A dd]
case 0x3A:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR, SetTypeDataM);
break;
// 278 - SUBtract
// sub A, dd, X (Direct index X addressing DIR,X)
// Operation data length: 16 bits or 8 bits
// [3B dd]
case 0x3B:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// 278 - SUBtract
// sub A, mmll (Absolute addressing mode(ABS))
// Operation data length: 16 bits or 8 bits
// [3E ll mm]
case 0x3E:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, SetTypeDataM);
break;
// 278 - SUBtract
// sub A, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 16 bits or 8 bits
// [3F ll mm]
case 0x3F:
insn.itype = m7900_sub;
RAZOPER = getFlag_M ? INSN_PREF_B : INSN_PREF_W;
Operand_Registr(insn.Op1, rA);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, SetTypeDataM);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END SUB ____________________
// _____________________ SUBD ____________________
// 280 - SUBtract at Double-word
// subd E, #imm
// Operation data length: 32 bits
// [3D #imm]
case 0x3D:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Imm(insn, insn.Op2, 32);
break;
// 280 - SUBtract at Double-word
// subd E, dd
// Operation data length: 32 bits
// [AA dd]
case 0xAA:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR, dt_dword);
break;
// 280 - SUBtract at Double-word
// subd E, dd, X (Direct index X addressing DIR,X)
// Operation data length: 32 bits
// [AB dd]
case 0xAB:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_Dir(insn, insn.Op2, TDIR_DIR_X, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// 280 - SUBtract at Double-word
// subd E, mmll (Absolute addressing mode(ABS))
// Operation data length: 32 bits
// [AE ll mm]
case 0xAE:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS, 16, dt_dword);
break;
// 280 - SUBtract at Double-word
// subd E, mmll, X (Absolute indexed X addressing mode(ABS,X))
// Operation data length: 32 bits
// [AF ll mm]
case 0xAF:
insn.itype = m7900_subd;
RAZOPER = INSN_PREF_D;
Operand_Registr(insn.Op1, rE);
Operand_AB(insn, insn.Op2, TAB_ABS_X, 16, dt_dword);
Operand_Registr(insn.Op3, rX);
break;
// _____________________ END SUBD ____________________
default:
{
uchar cd = code & 0xF8;
if ( cd == 0xF8 )
{
// 141 - Branch to SubRoutine
// bsr rr
// Operation data length: -
// [11111 B10-b0]
insn.itype = m7900_bsr;
uint32 low = insn.get_next_byte();
uint32 addr = low | (code<<8);
addr&=0x000007FF;
if ( addr & 0x400 )
addr |= 0xfffff800;
Operand_BSR(insn, insn.Op1, addr, 2);
}
else
{
// msg("ana: %a: bad optype %d\n", insn.ip, code);
return 0;
}
}
break;
}
return insn.size;
}