File:  [Research Unix] / researchv9 / jtools / src / pi / m68kasm.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:59 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv9-SUN3_old, researchv9-SUN3, HEAD
researchv9-SUN3(old)

#include "asm.pri"
#include "m68kasm.h"
#include "format.pub"
#include "core.pub"
SRCFILE("m68kasm.c")

M68kInstr::M68kInstr(Asm*a,long l):(a,l&1?l+1:l) { tab = 0; display(); }
Instr *M68kAsm::newInstr(long a)	{ return (Instr*) new M68kInstr(this,a); }
M68kAsm::M68kAsm(Core *c):(c)		{ }
char *M68kAsm::literaldelimiter()	{ return "&"; }

const short   SZ_MASK = 00300, SZ_SHIFT = 6;	// bits  (7-6)
const short  DEA_MASK = 00077;			// bits  (5-0)
const short  DRG_MASK = 00007;			// bits  (2-0)
const short DRGL_MASK = 07000;			// bits (11-9)
const short  DBR_MASK = 00377;			// bits  (7-0)
const short  DAQ_MASK = 07000;			// bits (11-9)
const short DEAM_MASK = 07700;			// bits (11-6)
const short  DMQ_MASK = 00377;			// bits  (7-0)

short OpMask[] = {
	0,		// DIG	0	/* ignore this address */
	DEA_MASK,	// DEA	1	/* E.A. to low order 6 bits */
	DRG_MASK,	// DRG	2	/* register to low order 3 bits */
	DRGL_MASK,	// DRGL	3	/* register to bits 11-9 */
	DBR_MASK,	// DBR	4	/* branch offset (short) */
	DMQ_MASK,	// DMQ	5	/* move-quick 8-bit value */
	DAQ_MASK,	// DAQ	6	/* add-quick 3-bit value in 11-9 */
	0,		// DIM	7	/* Immediate value, according to size */
	DEAM_MASK,	// DEAM	8	/* E.A. to bits 11-6 as in move */
	0,		// DBCC	9	/* branch address as in "dbcc" */
	0,		// DIMH	10	/* Immediate forced to be 1 word */
	0,		// D2L	11	/* register to bits 0-2 of next word */
	0,		// D2H	12	/* register to bits 12-14 of next word */
	0,		// DBL	13	/* qty in bits 0-5 of next word */
	0,		// DBH	14	/* qty in bits 6-11 of next word */
	0,		// DCR	15	/* control reg a bit combination in 0-11 */
};

char *M68kInstr::dotbwl()
{
	// must be +/- 1?
	if( (tab[1].opname && !strcmp(tab->opname, tab[1].opname))
	 || (tab[-1].opname && !strcmp(tab->opname, tab[-1].opname)) 
	 || tab->size == BWL )
		switch( size ){
		case B : return "b";
		case W : return "w";
		case L : return "l";
		}
	return "";
}

int M68kInstr::imm_bytes(short addr, short disp)
{
	int bytes = 0;
	switch( disp ){
	case DIMH: bytes = 2; break;
	case DIM:  switch(size){
		   case B:
		   case W: bytes = 2; break;	
		   case L: bytes = 4; break;
		   }
		   if( addr&H ) bytes = 2; break;
	}
	switch(bytes){
	case 2: immval = _asm->core->peekcode(next)->sht; break;
	case 4: immval = _asm->core->peekcode(next)->lng; break;
	}
	return bytes;
}

short M68kInstr::sizemask()
{
	static char bwl[4] = { B, W, L, 0 };
	size = tab->size;
	if( size!=BWL ) return 0;
	size = bwl[(opword0>>SZ_SHIFT)&3];
	return size ? SZ_MASK : 0;
}

char *M68kInstr::ea()
{
	if( mode>=1 && mode<=6 ) reg += 8;
	switch( mode ){
	case 0:	return regarg("%s%s",    fmt&F_SYMBOLIC|F_NONE);
	case 1: return regarg("%s%s",    fmt&F_SYMBOLIC|F_NONE);
	case 2:	return regarg("%s(%s)",  fmt&F_SYMBOLIC|F_NONE);
	case 3:	return regarg("%s(%s)+", fmt&F_SYMBOLIC|F_NONE);
	case 4:	return regarg("%s-(%s)", fmt&F_SYMBOLIC|F_NONE);
	case 5:	m = m.sht; next += 2;
		return regarg("%s(%s)", fmt|F_MASKEXT16);
	case 6: short brief = m.sht; next+= 2;
		if( brief & 0400 ) return "full";
		char ireg = (brief>>12)&15;
		m = (char)brief;
		int scale = (brief>>9)&3;
		scale = 1<<scale;
		char *wl = brief&04000 ? "l" : "w";
		char *pre = regarg("%s(%s,", fmt&F_SYMBOLIC|F_NONE);
		return sf("%s%s.%s*%d)", pre, _asm->core->regname(ireg), wl, scale);
	case 7:
	    switch( reg ){
	    case 0: m = m.sht; next += 2; return symbolic();
	    case 1: m = m.lng; next += 4; return symbolic();
	    case 4: switch( size ){
		    case B: m = m.sht; next += 2; return literal(F_MASKEXT8|fmt);
		    case W: m = m.sht; next += 2; return literal(F_MASKEXT16|fmt);
		    case L: m = m.lng; next += 4; return literal(fmt);
		    }
		    return "<imm?>";
	    }
	}
	return sf("mode=%d:reg=%d", mode, reg);
}

char *M68kInstr::dbr(char x)
{
	switch( x ){
	case  0: m = next + m.sht; next += 2; break;
	case -1: m = next + m.lng; next += 4; break;
	default: m = next + x;
	}
	return symbolic();
}

char *M68kInstr::dbh()
{
	if( opword1&0004000 ){
		reg = (opword1>>6)&7;
		return regarg("%s%s", fmt&F_SYMBOLIC|F_NONE);
	}
	m = (opword1>>6)&31;
	return literal(fmt);
}

char *M68kInstr::dbl()
{
	if( opword1&0000040 ){
		reg = opword1&7;
		return regarg("%s%s", fmt&F_SYMBOLIC|F_NONE);
	}
	m = opword1&31;
	return literal(fmt);
}

char *M68kInstr::dcr()
{
	next += 2;
	switch( opword1&0xFFF ){
	case 0x000: return "sfc";
	case 0x001: return "dfc";
	case 0x002: return "cacr";
	case 0x800: return "usp";
	case 0x801: return "vbr";
	case 0x802: return "caar";
	case 0x803: return "msp";
	case 0x804: return "vbr";
	}
	return "<dcr>";
}

char *M68kInstr::arg(int i)
{
	short disp;
	short addr;
	switch( i ){						// !!
	case 0: disp = tab->a1disp; addr = tab->addr1; break;
	case 1: disp = tab->a2disp; addr = tab->addr2; break;
	case 2: disp = tab->a3disp; addr = tab->addr3; break;
	case 3: disp = tab->a4disp; addr = tab->addr4; break;
	}

	disp &= 15;
	short mask = OpMask[disp];
	short x = mask ? (opword0&mask)/(((((~mask)+1)^(~mask))+1)>>1) : 0;
	m = *_asm->core->peekcode(next);
	switch( addr ){
	case AREG+C:  return "ccr";
	case AREG+SR: return "sr";
	}
	switch( disp ){
	case DEA: mode = x>>3; reg = x&7; return ea();
	case DRG:						// fall thru
	case DRGL:reg = x;
		  if( addr&A ) reg += 8;
		  return regarg("%s%s",fmt&F_SYMBOLIC|F_NONE);
	case DBR: return dbr(x);
	case DMQ: m = (long)(char)x; return literal(F_MASKEXT16|fmt);
	case DAQ: if( !x ) x = 8; m = x; return literal(fmt);
	case DIMH:						// fall thru
	case DIM: if( (addr&H)
		   || addr==AIMM ) { m = immval; return literal(F_MASKEXT16|fmt);}
		  return "DIM";
	case DEAM:mode = x&7; reg = x>>3; return ea();
	case DBCC:m = m.sht+next; next += 2; return symbolic();
	case D2L: return "D2L";
	case D2H: reg = (opword1>>12)&15;
		  return regarg("%s%s", fmt&F_SYMBOLIC|F_NONE);
	case DBH: return dbh();
	case DBL: return dbl();
	case DCR: return dcr();
	}
	return Instr::arg(i);
}

int M68kInstr::nargs()
{
	if( !tab->addr1 ) return 0;
	if( !tab->addr2 ) return 1;
	if( !tab->addr3 ) return 2;
	if( !tab->addr4 ) return 3;
	return 4;
}

int M68kInstr::argtype(int)
{
	return 0;
}

struct m68koptab M68kOpTab[] = {

{0140400,"abcd",B,	SIG,	AREG+D,	DRG,	AREG+D,	DRGL,	0},
{0140410,"abcd",B,	SIG,	ADEC,	DRG,	ADEC,	DRGL,	0},

{0050000,"add",	BWL,	SD,	AIMM+Q,	DAQ,	AGEN+AL,DEA,	0},
{0003000,"add",	BWL,	SD,	AIMM,	DIM,	AGEN+AL+DA,DEA,	0},
{0150000,"add",	BWL,	SD,	AGEN,	DEA,	AREG+D,	DRGL,	0},
{0150400,"add",	BWL,	SD,	AREG+D,	DRGL,	AGEN+AM,DEA,	0},
{0150300,"add",	W,	SIG,	AGEN,	DEA,	AREG+A,	DRGL,	0},
{0150700,"add",	L,	SIG,	AGEN,	DEA,	AREG+A,	DRGL,	ISL},

{0150400,"addx",BWL,	SD,	AREG+D,	DRG,	AREG+D,	DRGL,	0},
{0150410,"addx",BWL,	SD,	ADEC,	DRG,	ADEC,	DRGL,	0},

{0001174,"and",	W,	SIG,	AIMM,	DIM,	AREG+SR,DIG,	0},
{0001074,"and",	B,	SIG,	AIMM,	DIM,	AREG+C,	DIG,	0},
{0001000,"and",	BWL,	SD,	AIMM,	DIM,	AGEN+AL+DA,DEA,	0},
{0140000,"and",	BWL,	SD,	AGEN+DA,DEA,	AREG+D,	DRGL,	0},
{0140400,"and",	BWL,	SD,	AREG+D,	DRGL,	AGEN+AM,DEA,	0},

{0160700,"asl",	W,	SIG,	AIMM+O,	DIG,	AGEN+AM,DEA,	ISH},
{0160400,"asl",	BWL,	SD,	AIMM+Q,	DAQ,	AREG+D,	DRG,	ISH},
{0160440,"asl",	BWL,	SD,	AREG+D,	DRGL,	AREG+D,	DRG,	ISH},

{0160300,"asr",	W,	SIG,	AIMM+O,	DIG,	AGEN+AM,DEA,	ISH},
{0160000,"asr",	BWL,	SD,	AIMM+Q,	DAQ,	AREG+D,	DRG,	ISH},
{0160040,"asr",	BWL,	SD,	AREG+D,	DRGL,	AREG+D,	DRG,	ISH},

{0165300,"bfchg",0,	0,	AGEN+BF,DEA,	ABIT,	DBH,	I2W,	0,	ABIT,	DBL},
{0166300,"bfclr",0,	0,	AGEN+BF,DEA,	ABIT,	DBH,	I2W,	0,	ABIT,	DBL},
{0165700,"bfexts",0,	0,	AGEN+BF,DEA,	ABIT,	DBH,	I2W,	0,	ABIT,	DBL,	AREG+D,	D2H},
{0164700,"bfextu",0,	0,	AGEN+BF,DEA,	ABIT,	DBH,	I2W,	0,	ABIT,	DBL,	AREG+D,	D2H},
{0166700,"bfffo",0,	0,	AGEN+BF,DEA,	ABIT,	DBH,	I2W,	0,	ABIT,	DBL,	AREG+D,	D2H},
{0167700,"bfins",0,	0,	AREG+D,	D2H,	AGEN+BF,DEA,	I2W,	0,	ABIT,	DBH,	ABIT,	DBL},
{0167300,"bfset",0,	0,	AGEN+BF,DEA,	ABIT,	DBH,	I2W,	0,	ABIT,	DBL},
{0164300,"bftst",0,	0,	AGEN+BF,DEA,	ABIT,	DBH,	I2W,	0,	ABIT,	DBL},

//{0060000,"br",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0060000,"bra",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0061000,"bhi",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
//{0062000,"bhs",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0062000,"bcc",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0063000,"bne",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0064000,"bvc",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0065000,"bpl",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0066000,"bge",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0067000,"bgt",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0061400,"bls",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
//{0062400,"blo",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0062400,"bcs",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0063400,"beq",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0064400,"bvs",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0065400,"bmi",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0066400,"blt",	B,	SIG,	AEXP,	DBR,	0,	0,	0},
{0067400,"ble",	B,	SIG,	AEXP,	DBR,	0,	0,	0},

{0000500,"bchg",0,	0,	AREG+D,	DRGL,	AGEN+AL+DA,DEA,	0},
{0004100,"bchg",0,	0,	AIMM+H,	DIM,	AGEN+AL+DA,DEA,	0},

{0000600,"bclr",0,	0,	AREG+D,	DRGL,	AGEN+AL+DA,DEA,	0},
{0004200,"bclr",0,	0,	AIMM+H,	DIM,	AGEN+AL+DA,DEA,	0},

{0000700,"bset",0,	0,	AREG+D,	DRGL,	AGEN+AL+DA,DEA,	0},
{0004300,"bset",0,	0,	AIMM+H,	DIM,	AGEN+AL+DA,DEA,	0},

{0060400,"bsr",	B,	SIG,	AEXP,	DBR,	0,	0,	0},

{0000400,"btst",0,	0,	AREG+D,	DRGL,	AGEN+DA,DEA,	0},
{0004000,"btst",0,	0,	AIMM+H,	DIM,	AGEN+DA,DEA,	0},

{0040600,"chk",	W,	SIG,	AGEN,	DEA,	AREG+D,	DRGL,	0},

{0041000,"clr",	BWL,	SD,	AGEN+AL+DA,DEA,	0,	0,	0},

{0006000,"cmp",	BWL,	SD,	AGEN+AL+DA,DEA,	AIMM,	DIM,	0},
{0130000,"cmp",	BWL,	SD,	AREG+D,	DRGL,	AGEN,	DEA,	0},
{0130300,"cmp",	W,	SIG,	AREG+A,	DRGL,	AGEN,	DEA,	0},
{0130700,"cmp",	L,	SIG,	AREG+A,	DRGL,	AGEN,	DEA,	ISL},
{0130410,"cmp",	BWL,	SD,	AINC,	DRGL,	AINC,	DRG,	0},

{0050310,"dbt",	0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0051310,"dbhi",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0052310,"dbhs",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0053310,"dbne",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0052310,"dbcc",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0054310,"dbvc",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0055310,"dbpl",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0056310,"dbge",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0057310,"dbgt",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0051710,"dbls",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0050710,"dbr",	0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0050710,"dbf",	0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0050710,"dbra",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0052710,"dblo",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0053710,"dbeq",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0052710,"dbcs",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0054710,"dbvs",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0055710,"dbmi",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0056710,"dblt",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},
{0057710,"dble",0,	0,	AREG+D,	DRG,	AEXP,	DBCC,	0},

{0100700,"divs",W,	SIG,	AGEN+DA,DEA,	AREG+D,	DRGL,	0},
/*
 * tricky stuff here.  divs.l is really a 3 operand instruction but it can be
 * parsed as a two operand one, in which case the second argument is copied
 * in outins() and the remainder is discarded.  honest, read the 68020 manual.
 */
{0046100,"divs",L,	SIG,	AGEN+DA,DEA,	AREG+D,	D2L,	I2W,	0004000,	AREG+D,	D2H},
{0046100,"divs3",L,	SIG,	AGEN+DA,DEA,	AREG+D,	D2L,	I2W,	0004000,	AREG+D,	D2H},

{0046100,"divsl",L,	SIG,	AGEN+DA,DEA,	AREG+D,	D2L,	I2W,	0006000,	AREG+D,	D2H},

{0100300,"divu",W,	SIG,	AGEN+DA,DEA,	AREG+D,	DRGL,	0},
{0046100,"divu",L,	SIG,	AGEN+DA,DEA,	AREG+D,	D2L,	I2W,	0000000,	AREG+D,	D2H},
{0046100,"divu3",L,	SIG,	AGEN+DA,DEA,	AREG+D,	D2L,	I2W,	0000000,	AREG+D,	D2H},

{0046100,"divul",L,	SIG,	AGEN+DA,DEA,	AREG+D,	D2L,	I2W,	0002000,	AREG+D,	D2H},

{0005000,"eor",	BWL,	SD,	AIMM,	DIM,	AGEN+AL+DA,DEA,	0},
{0005074,"eor",	B,	SIG,	AIMM,	DIM,	AREG+C,	DIG,	0},
{0005174,"eor",	W,	SIG,	AIMM,	DIM,	AREG+SR,DIG,	0},
{0130400,"eor",	BWL,	SD,	AREG+D,	DRGL,	AGEN+AL+DA,DEA,	0},

{0140500,"exg",	0,	0,	AREG+D,	DRG,	AREG+D,	DRGL,	0},
{0140510,"exg",	0,	0,	AREG+A,	DRG,	AREG+A,	DRGL,	0},
{0140610,"exg",	0,	0,	AREG+A,	DRG,	AREG+D,	DRGL,	0},
{0140610,"exg",	0,	0,	AREG+D,	DRGL,	AREG+A,	DRG,	0},

{0044200,"ext",	W,	SIG,	AREG+D,	DRG,	0,	0,	0},
{0044300,"ext",	L,	SIG,	AREG+D,	DRG,	0,	0,	0},
{0044700,"extb",L,	SIG,	AREG+D,	DRG,	0,	0,	0},

{0047300,"jmp",	0,	0,	AGEN+CT,DEA,	0,	0,	0},

{0047200,"jsr",	0,	0,	AGEN+CT,DEA,	0,	0,	0},

{0040700,"lea",	L,	SIG,	AGEN+CT,DEA,	AREG+A,	DRGL,	0},

{0047120,"link",0,	0,	AREG+A,	DRG,	AIMM+H,	DIM,	0},

{0161700,"lsl",	W,	SIG,	AIMM+O,	DIG,	AGEN+AM,DEA,	ISH},
{0160410,"lsl",	BWL,	SD,	AIMM+Q,	DAQ,	AREG+D,	DRG,	ISH},
{0160450,"lsl",	BWL,	SD,	AREG+D,	DRGL,	AREG+D,	DRG,	ISH},

{0161300,"lsr",	W,	SIG,	AIMM+O,	DIG,	AGEN+AM,DEA,	ISH},
{0160010,"lsr",	BWL,	SD,	AIMM+Q,	DAQ,	AREG+D,	DRG,	ISH},
{0160050,"lsr",	BWL,	SD,	AREG+D,	DRGL,	AREG+D,	DRG,	ISH},

{0070000,"mov",	L,	SIG,	AIMM+M,	DMQ,	AREG+D,	DRGL,	0},
{0030000,"mov",	W,	SIG,	AGEN,	DEA,	AGEN+AL+DA,DEAM,0},
{0020000,"mov",	L,	SIG,	AGEN,	DEA,	AGEN+AL+DA,DEAM,0},
{0010000,"mov",	B,	SIG,	AGEN,	DEA,	AGEN+AL+DA,DEAM,0},
{0030100,"mov",	W,	SIG,	AGEN,	DEA,	AREG+A,	DRGL,	0},
{0020100,"mov",	L,	SIG,	AGEN,	DEA,	AREG+A,	DRGL,	ISL},
{0040300,"mov",	W,	SIG,	AREG+SR,DIG,	AGEN+AL+DA,DEA,	0},
{0043300,"mov",	W,	SIG,	AGEN+DA,DEA,	AREG+SR,DIG,	0},
{0042300,"mov",	W,	SIG,	AGEN+DA,DEA,	AREG+C,	DIG,	0},
{0041300,"mov",	W,	SIG,	AREG+C,	DIG,	AGEN+AL+DA,DEA,	0},
{0047140,"mov",	L,	SIG,	AREG+A,	DRG,	AREG+U,	DIG,	0},
{0047150,"mov",	L,	SIG,	AREG+U,	DIG,	AREG+A,	DRG,	0},
{0047172,"mov",	L,	SIG,	AREG+CR,DCR,	AREG+D,	D2H,	I2W,	0000000},
{0047172,"mov",	L,	SIG,	AREG+CR,DCR,	AREG+A,	D2H,	I2W,	0100000},
{0047173,"mov",	L,	SIG,	AREG+D,	D2H,	AREG+CR,DCR,	I2W,	0000000},
{0047173,"mov",	L,	SIG,	AREG+A,	D2H,	AREG+CR,DCR,	I2W,	0100000},

{0044200,"movm",W,	SIG,	AIMM+H,	DIMH,	AGEN+AM,DEA,	0},
{0044300,"movm",L,	SIG,	AIMM+H,	DIMH,	AGEN+AM,DEA,	0},
{0046200,"movm",W,	SIG,	AGEN+AM,DEA,	AIMM+H,	DIMH,	0},
{0046300,"movm",L,	SIG,	AGEN+AM,DEA,	AIMM+H,	DIMH,	0},

{0007000,"movs",BWL,	SD,	AGEN+AM,DEA,	AREG+D,	D2H,	I2W,	0000000},
{0007000,"movs",BWL,	SD,	AGEN+AM,DEA,	AREG+A,	D2H,	I2W,	0100000},
{0007000,"movs",BWL,	SD,	AREG+D,	D2H,	AGEN+AM,DEA,	I2W,	0004000},
{0007000,"movs",BWL,	SD,	AREG+A,	D2H,	AGEN+AM,DEA,	I2W,	0104000},

/*
 * more tricky stuff.  D2L and D2H mean low and high register fields of
 * second instruction word, NOT low and high components of product.
 * read the manual.
 */
{0140700,"muls",W,	SIG,	AGEN+DA,DEA,	AREG+D,	DRGL,	0},
{0046000,"muls",L,	SIG,	AGEN+DA,DEA,	AREG+D,	D2H,	I2W,	0004000},
{0046000,"mulsl",L,	SIG,	AGEN+DA,DEA,	AREG+D,	D2L,	I2W,	0006000,	AREG+D,	D2H},

{0140300,"mulu",W,	SIG,	AGEN+DA,DEA,	AREG+D,	DRGL,	0},
{0046000,"mulu",L,	SIG,	AGEN+DA,DEA,	AREG+D,	D2H,	I2W,	0000000},
{0046000,"mulul",L,	SIG,	AGEN+DA,DEA,	AREG+D,	D2L,	I2W,	0002000,	AREG+D,	D2H},

{0044000,"nbcd",B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},

{0042000,"neg",	BWL,	SD,	AGEN+AL+DA,DEA,	0,	0,	0},

{0040000,"negx",BWL,	SD,	AGEN+AL+DA,DEA,	0,	0,	0},

{0047161,"nop",	0,	0,	0,	0,	0,	0,	0},

{0043000,"not",	BWL,	SD,	AGEN+AL+DA,DEA,	0,	0,	0},

{0000174,"or",	W,	SIG,	AIMM,	DIM,	AREG+SR,DIG,	0},
{0000074,"or",	B,	SIG,	AIMM,	DIM,	AREG+C,	DIG,	0},
{0000000,"or",	BWL,	SD,	AIMM,	DIM,	AGEN+AL+DA,DEA,	0},
{0100000,"or",	BWL,	SD,	AGEN+DA,DEA,	AREG+D,	DRGL,	0},
{0100400,"or",	BWL,	SD,	AREG+D,	DRGL,	AGEN+AM,DEA,	0},

{0100500,"pack",0,	0,	AREG+D,	DRG,	AREG+D,	DRGL,	0,	0,	AIMM+H,	DIMH},
{0100510,"pack",0,	0,	ADEC,	DRG,	ADEC,	DRGL,	0,	0,	AIMM+H,	DIMH},
{0100600,"unpk",0,	0,	AREG+D,	DRG,	AREG+D,	DRGL,	0,	0,	AIMM+H,	DIMH},
{0100610,"unpk",0,	0,	ADEC,	DRG,	ADEC,	DRGL,	0,	0,	AIMM+H,	DIMH},

{0044100,"swap",W,	SIG,	AREG+D,	DRG,	0,	0,	0},
{0044100,"pea",	L,	SIG,	AGEN+CT,DEA,	0,	0,	0},

{0047160,"reset",0,	0,	0,	0,	0,	0,	0},

{0163700,"rol",	W,	SIG,	AIMM+O,	DIG,	AGEN+AM,DEA,	ISH},
{0160430,"rol",	BWL,	SD,	AIMM+Q,	DAQ,	AREG+D,	DRG,	ISH},
{0160470,"rol",	BWL,	SD,	AREG+D,	DRGL,	AREG+D,	DRG,	ISH},

{0163300,"ror",	W,	SIG,	AIMM+O,	DIG,	AGEN+AM,DEA,	ISH},
{0160030,"ror",	BWL,	SD,	AIMM+Q,	DAQ,	AREG+D,	DRG,	ISH},
{0160070,"ror",	BWL,	SD,	AREG+D,	DRGL,	AREG+D,	DRG,	ISH},

{0162700,"roxl",W,	SIG,	AIMM+O,	DIG,	AGEN+AM,DEA,	ISH},
{0160420,"roxl",BWL,	SD,	AIMM+Q,	DAQ,	AREG+D,	DRG,	ISH},
{0160460,"roxl",BWL,	SD,	AREG+D,	DRGL,	AREG+D,	DRG,	ISH},

{0162300,"roxr",W,	SIG,	AIMM+O,	DIG,	AGEN+AM,DEA,	ISH},
{0160020,"roxr",BWL,	SD,	AIMM+Q,	DAQ,	AREG+D,	DRG,	ISH},
{0160060,"roxr",BWL,	SD,	AREG+D,	DRGL,	AREG+D,	DRG,	ISH},

{0047163,"rte",	0,	0,	0,	0,	0,	0,	0},

{0047167,"rtr",	0,	0,	0,	0,	0,	0,	0},

{0047165,"rts",	0,	0,	0,	0,	0,	0,	0},

{0100400,"sbcd",B,	SIG,	AREG+D,	DRG,	AREG+D,	DRGL,	0},
{0100410,"sbcd",B,	SIG,	ADEC,	DRG,	ADEC,	DRGL,	0},

{0050300,"st",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0051300,"shi",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0052300,"shs",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0053300,"sne",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0052300,"scc",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0054300,"svc",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0055300,"spl",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0056300,"sge",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0057300,"sgt",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0050700,"sf",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0051700,"sls",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0052700,"slo",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0053700,"seq",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0052700,"scs",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0054700,"svs",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0055700,"smi",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0056700,"slt",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},
{0057700,"sle",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},

{0047162,"stop",0,	0,	AIMM+H,	DIMH,	0,	0,	0},

{0050400,"sub",	BWL,	SD,	AIMM+Q,	DAQ,	AGEN+AL,DEA,	0},
{0002000,"sub",	BWL,	SD,	AIMM,	DIM,	AGEN+AL+DA,DEA,	0},
{0110000,"sub",	BWL,	SD,	AGEN,	DEA,	AREG+D,	DRGL,	0},
{0110400,"sub",	BWL,	SD,	AREG+D,	DRGL,	AGEN+AM,DEA,	0},
{0110300,"sub",	W,	SIG,	AGEN,	DEA,	AREG+A,	DRGL,	0},
{0110700,"sub",	L,	SIG,	AGEN,	DEA,	AREG+A,	DRGL,	ISL},

{0110400,"subx",BWL,	SD,	AREG+D,	DRG,	AREG+D,	DRGL,	0},
{0110410,"subx",BWL,	SD,	ADEC,	DRG,	ADEC,	DRGL,	0},

{0045300,"tas",	B,	SIG,	AGEN+AL+DA,DEA,	0,	0,	0},

{0047100,"trap",0,	0,	AIMM+V,	DMQ,	0,	0,	0},

{0047166,"trapv",0,	0,	0,	0,	0,	0,	0},

{0045000,"tst",	BWL,	SD,	AGEN+AL+DA,	DEA,	0,	0,	0},

{0047130,"unlk",0,	0,	AREG+A,	DRG,	0,	0,	0},
{0, 0},
};

char *M68kInstr::mnemonic()
{
	opword0 = _asm->core->peekcode(addr)->sht;
	opword1 = _asm->core->peekcode(next = addr+2)->sht;
	for( tab = M68kOpTab; tab->opname; ++tab ){
		short m = sizemask();
		m |= OpMask[tab->a1disp&15] | OpMask[tab->a2disp&15];
		if( (unsigned short)(opword0 & ~m) == tab->opcode ){
			next += imm_bytes(tab->addr1, tab->a1disp)
			      + imm_bytes(tab->addr2, tab->a2disp);
			if( tab->iflag == I2W ) next = addr+4;
			return sf("%s%s", tab->opname, dotbwl());
		}
	}
	return sf("0%o", opword0);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.