mirror of
https://github.com/holub/mame
synced 2025-04-23 17:00:53 +03:00
Changed the mb86233 disassembler to use 'std::ostream &' internally
This commit is contained in:
parent
0ca7ac3b2a
commit
b3c9e674d3
@ -4,380 +4,354 @@
|
||||
#include "debugger.h"
|
||||
#include "mb86233.h"
|
||||
|
||||
static char * COND(unsigned int cond)
|
||||
static std::string COND(unsigned int cond)
|
||||
{
|
||||
static char bufs[4][256];
|
||||
static int bufindex = 0;
|
||||
char *buf = &bufs[bufindex++][0];
|
||||
|
||||
bufindex &= 3;
|
||||
std::stringstream stream;
|
||||
|
||||
switch(cond)
|
||||
{
|
||||
case 0x16:
|
||||
sprintf(buf,"always");
|
||||
return buf;
|
||||
util::stream_format(stream, "always");
|
||||
return stream.str();
|
||||
|
||||
case 0x00:
|
||||
sprintf(buf,"eq");
|
||||
return buf;
|
||||
util::stream_format(stream, "eq");
|
||||
return stream.str();
|
||||
|
||||
case 0x01:
|
||||
sprintf(buf,"ge");
|
||||
return buf;
|
||||
util::stream_format(stream, "ge");
|
||||
return stream.str();
|
||||
|
||||
case 0x02:
|
||||
sprintf(buf,"le");
|
||||
return buf;
|
||||
util::stream_format(stream, "le");
|
||||
return stream.str();
|
||||
|
||||
case 0x06:
|
||||
sprintf(buf,"never");
|
||||
return buf;
|
||||
util::stream_format(stream, "never");
|
||||
return stream.str();
|
||||
|
||||
case 0x10:
|
||||
sprintf(buf,"(--r12)!=0");
|
||||
return buf;
|
||||
util::stream_format(stream, "(--r12)!=0");
|
||||
return stream.str();
|
||||
|
||||
case 0x11:
|
||||
sprintf(buf,"(--r13)!=0");
|
||||
return buf;
|
||||
util::stream_format(stream, "(--r13)!=0");
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
sprintf(buf,"unk (%x)",cond);
|
||||
return buf;
|
||||
util::stream_format(stream, "unk (%x)",cond);
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
static char * REGS( uint32_t reg, int IsSource )
|
||||
static std::string REGS( uint32_t reg, int IsSource )
|
||||
{
|
||||
static char bufs[4][256];
|
||||
static int bufindex = 0;
|
||||
char *buf = &bufs[bufindex++][0];
|
||||
std::stringstream stream;
|
||||
int mode = (reg >> 6 ) & 0x07;
|
||||
|
||||
bufindex &= 3;
|
||||
|
||||
reg &= 0x3f;
|
||||
|
||||
if ( mode == 0 || mode == 1 || mode == 3 )
|
||||
{
|
||||
if ( reg < 0x10 )
|
||||
{
|
||||
sprintf(buf,"r%d",reg);
|
||||
return buf;
|
||||
util::stream_format(stream, "r%d",reg);
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
switch(reg)
|
||||
{
|
||||
case 0x10:
|
||||
sprintf(buf,"a");
|
||||
util::stream_format(stream, "a");
|
||||
break;
|
||||
|
||||
case 0x11:
|
||||
sprintf(buf,"a.e");
|
||||
util::stream_format(stream, "a.e");
|
||||
break;
|
||||
|
||||
case 0x12:
|
||||
sprintf(buf,"a.m");
|
||||
util::stream_format(stream, "a.m");
|
||||
break;
|
||||
|
||||
case 0x13:
|
||||
sprintf(buf,"b");
|
||||
util::stream_format(stream, "b");
|
||||
break;
|
||||
|
||||
case 0x14:
|
||||
sprintf(buf,"b.e");
|
||||
util::stream_format(stream, "b.e");
|
||||
break;
|
||||
|
||||
case 0x15:
|
||||
sprintf(buf,"b.m");
|
||||
util::stream_format(stream, "b.m");
|
||||
break;
|
||||
|
||||
case 0x19:
|
||||
sprintf(buf,"d");
|
||||
util::stream_format(stream, "d");
|
||||
break;
|
||||
|
||||
case 0x1a:
|
||||
sprintf(buf,"d.e");
|
||||
util::stream_format(stream, "d.e");
|
||||
break;
|
||||
|
||||
case 0x1b:
|
||||
sprintf(buf,"d.m");
|
||||
util::stream_format(stream, "d.m");
|
||||
break;
|
||||
|
||||
case 0x1c:
|
||||
sprintf(buf,"p");
|
||||
util::stream_format(stream, "p");
|
||||
break;
|
||||
|
||||
case 0x1d:
|
||||
sprintf(buf,"p.e");
|
||||
util::stream_format(stream, "p.e");
|
||||
break;
|
||||
|
||||
case 0x1e:
|
||||
sprintf(buf,"p.m");
|
||||
util::stream_format(stream, "p.m");
|
||||
break;
|
||||
|
||||
case 0x1f:
|
||||
sprintf(buf,"shift");
|
||||
util::stream_format(stream, "shift");
|
||||
break;
|
||||
|
||||
case 0x20:
|
||||
sprintf(buf,"parport");
|
||||
util::stream_format(stream, "parport");
|
||||
break;
|
||||
|
||||
case 0x21:
|
||||
sprintf(buf,"FIn");
|
||||
util::stream_format(stream, "FIn");
|
||||
break;
|
||||
|
||||
case 0x22:
|
||||
sprintf(buf,"FOut");
|
||||
util::stream_format(stream, "FOut");
|
||||
break;
|
||||
|
||||
case 0x23:
|
||||
sprintf(buf,"EB");
|
||||
util::stream_format(stream, "EB");
|
||||
break;
|
||||
|
||||
default:
|
||||
sprintf(buf,"Unkreg (%x)",reg);
|
||||
util::stream_format(stream, "Unkreg (%x)",reg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if ( mode == 2 )
|
||||
{
|
||||
char *p = buf;
|
||||
|
||||
p += sprintf(p,"0x%x+",reg & 0x1f);
|
||||
util::stream_format(stream, "0x%x+",reg & 0x1f);
|
||||
|
||||
if ( IsSource )
|
||||
{
|
||||
if ( !( reg & 0x20 ) )
|
||||
p += sprintf(p,"r0+");
|
||||
util::stream_format(stream, "r0+");
|
||||
|
||||
p += sprintf(p,"r2");
|
||||
util::stream_format(stream, "r2");
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !( reg & 0x20 ) )
|
||||
p += sprintf(p,"r1+");
|
||||
util::stream_format(stream, "r1+");
|
||||
|
||||
p += sprintf(p,"r3");
|
||||
util::stream_format(stream, "r3");
|
||||
}
|
||||
}
|
||||
else if ( mode == 6 )
|
||||
{
|
||||
char *p = buf;
|
||||
|
||||
if ( IsSource )
|
||||
{
|
||||
if ( !( reg & 0x20 ) )
|
||||
p += sprintf(p,"r0+");
|
||||
util::stream_format(stream, "r0+");
|
||||
|
||||
p += sprintf(p,"r2");
|
||||
util::stream_format(stream, "r2");
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !( reg & 0x20 ) )
|
||||
p += sprintf(p,"r1+");
|
||||
util::stream_format(stream, "r1+");
|
||||
|
||||
p += sprintf(p,"r3");
|
||||
util::stream_format(stream, "r3");
|
||||
}
|
||||
|
||||
if ( reg & 0x10 )
|
||||
p += sprintf(p,"--%d", 0x20 - ( reg & 0x1f ) );
|
||||
util::stream_format(stream, "--%d", 0x20 - ( reg & 0x1f ) );
|
||||
else
|
||||
p += sprintf(p,"++%d", reg & 0x1f );
|
||||
util::stream_format(stream, "++%d", reg & 0x1f );
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(buf,"UNKMOD %x (0x%x)", mode, reg);
|
||||
util::stream_format(stream, "UNKMOD %x (0x%x)", mode, reg);
|
||||
}
|
||||
|
||||
return buf;
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
static char * INDIRECT( uint32_t reg, int IsSource )
|
||||
static std::string INDIRECT( uint32_t reg, int IsSource )
|
||||
{
|
||||
static char bufs[4][256];
|
||||
static int bufindex = 0;
|
||||
char *buf = &bufs[bufindex++][0];
|
||||
std::stringstream stream;
|
||||
int mode = ( reg >> 6 ) & 0x07;
|
||||
|
||||
bufindex &= 3;
|
||||
|
||||
if ( mode == 0 || mode == 3 || mode == 1)
|
||||
{
|
||||
sprintf(buf,"0x%x",reg);
|
||||
util::stream_format(stream, "0x%x", reg);
|
||||
}
|
||||
else if ( mode == 2 )
|
||||
{
|
||||
char *p = buf;
|
||||
|
||||
p += sprintf(p,"0x%x+",reg&0x1f);
|
||||
util::stream_format(stream, "0x%x+",reg&0x1f);
|
||||
|
||||
if ( IsSource )
|
||||
{
|
||||
if ( !(reg & 0x20) )
|
||||
p += sprintf(p,"r0+");
|
||||
util::stream_format(stream, "r0+");
|
||||
|
||||
p += sprintf(p,"r2");
|
||||
util::stream_format(stream, "r2");
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !(reg & 0x20) )
|
||||
p += sprintf(p,"r1+");
|
||||
util::stream_format(stream, "r1+");
|
||||
|
||||
p += sprintf(p,"r3");
|
||||
util::stream_format(stream, "r3");
|
||||
}
|
||||
}
|
||||
else if ( mode == 6 || mode == 7 )
|
||||
{
|
||||
char *p = buf;
|
||||
|
||||
if ( IsSource )
|
||||
{
|
||||
if ( !( reg & 0x20 ) )
|
||||
p += sprintf(p,"r0+");
|
||||
util::stream_format(stream, "r0+");
|
||||
|
||||
p += sprintf(p,"r2");
|
||||
util::stream_format(stream, "r2");
|
||||
}
|
||||
else
|
||||
{
|
||||
if( !( reg & 0x20 ) )
|
||||
p += sprintf(p,"r1+");
|
||||
util::stream_format(stream, "r1+");
|
||||
|
||||
p += sprintf(p,"r3");
|
||||
util::stream_format(stream, "r3");
|
||||
}
|
||||
|
||||
if ( reg & 0x10 )
|
||||
p += sprintf(p,"--%d",0x20 - ( reg & 0x1f ));
|
||||
util::stream_format(stream, "--%d",0x20 - ( reg & 0x1f ));
|
||||
else
|
||||
p += sprintf(p,"++%d",reg & 0x1f);
|
||||
util::stream_format(stream, "++%d",reg & 0x1f);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(buf,"UNKMOD %x (0x%x)", mode, reg);
|
||||
util::stream_format(stream, "UNKMOD %x (0x%x)", mode, reg);
|
||||
}
|
||||
|
||||
return buf;
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
|
||||
static char * ALU( uint32_t alu)
|
||||
static std::string ALU( uint32_t alu)
|
||||
{
|
||||
static char bufs[4][256];
|
||||
static int bufindex = 0;
|
||||
char *buf = &bufs[bufindex++][0];
|
||||
|
||||
bufindex &= 3;
|
||||
std::stringstream stream;
|
||||
|
||||
switch( alu )
|
||||
{
|
||||
case 0x0:
|
||||
buf[0] = 0;
|
||||
break;
|
||||
|
||||
case 0x1:
|
||||
sprintf(buf,"d=d&a");
|
||||
util::stream_format(stream, "d=d&a");
|
||||
break;
|
||||
|
||||
case 0x2:
|
||||
sprintf(buf,"d=d|a");
|
||||
util::stream_format(stream, "d=d|a");
|
||||
break;
|
||||
|
||||
case 0x3:
|
||||
sprintf(buf,"d=d^a");
|
||||
util::stream_format(stream, "d=d^a");
|
||||
break;
|
||||
|
||||
case 0x5:
|
||||
sprintf(buf,"cmp d,a");
|
||||
util::stream_format(stream, "cmp d,a");
|
||||
break;
|
||||
|
||||
case 0x6:
|
||||
sprintf(buf,"d=d+a");
|
||||
util::stream_format(stream, "d=d+a");
|
||||
break;
|
||||
|
||||
case 0x7:
|
||||
sprintf(buf,"d=d-a");
|
||||
util::stream_format(stream, "d=d-a");
|
||||
break;
|
||||
|
||||
case 0x8:
|
||||
sprintf(buf,"p=a*b");
|
||||
util::stream_format(stream, "p=a*b");
|
||||
break;
|
||||
|
||||
case 0x9:
|
||||
sprintf(buf,"d=d+p, p=a*b");
|
||||
util::stream_format(stream, "d=d+p, p=a*b");
|
||||
break;
|
||||
|
||||
case 0xa:
|
||||
sprintf(buf,"d=d-p, p=a*b");
|
||||
util::stream_format(stream, "d=d-p, p=a*b");
|
||||
break;
|
||||
|
||||
case 0xb:
|
||||
sprintf(buf,"d=fabs d");
|
||||
util::stream_format(stream, "d=fabs d");
|
||||
break;
|
||||
|
||||
case 0xc:
|
||||
sprintf(buf,"d=d+p");
|
||||
util::stream_format(stream, "d=d+p");
|
||||
break;
|
||||
|
||||
case 0xd:
|
||||
sprintf(buf,"d=p, p=a*b");
|
||||
util::stream_format(stream, "d=p, p=a*b");
|
||||
break;
|
||||
|
||||
case 0xe:
|
||||
sprintf(buf,"d=float(d)");
|
||||
util::stream_format(stream, "d=float(d)");
|
||||
break;
|
||||
|
||||
case 0xf:
|
||||
sprintf(buf,"d=int(d)");
|
||||
util::stream_format(stream, "d=int(d)");
|
||||
break;
|
||||
|
||||
case 0x10:
|
||||
sprintf(buf,"d=d/a");
|
||||
util::stream_format(stream, "d=d/a");
|
||||
break;
|
||||
|
||||
case 0x11:
|
||||
sprintf(buf,"d=-d");
|
||||
util::stream_format(stream, "d=-d");
|
||||
break;
|
||||
|
||||
case 0x13:
|
||||
sprintf(buf,"d=a+b");
|
||||
util::stream_format(stream, "d=a+b");
|
||||
break;
|
||||
|
||||
case 0x14:
|
||||
sprintf(buf,"d=b-a");
|
||||
util::stream_format(stream, "d=b-a");
|
||||
break;
|
||||
|
||||
case 0x16:
|
||||
sprintf(buf,"d=(lsr d,shift)");
|
||||
util::stream_format(stream, "d=(lsr d,shift)");
|
||||
break;
|
||||
|
||||
case 0x17:
|
||||
sprintf(buf,"d=(lsl d,shift)");
|
||||
util::stream_format(stream, "d=(lsl d,shift)");
|
||||
break;
|
||||
|
||||
case 0x18:
|
||||
sprintf(buf,"d=(asr d,shift)");
|
||||
util::stream_format(stream, "d=(asr d,shift)");
|
||||
break;
|
||||
|
||||
case 0x1a:
|
||||
sprintf(buf,"d=d+a (int)");
|
||||
util::stream_format(stream, "d=d+a (int)");
|
||||
break;
|
||||
|
||||
case 0x1b:
|
||||
sprintf(buf,"d=d-a (int)");
|
||||
util::stream_format(stream, "d=d-a (int)");
|
||||
break;
|
||||
|
||||
default:
|
||||
sprintf(buf,"ALU UNK(%x)",alu);
|
||||
util::stream_format(stream, "ALU UNK(%x)",alu);
|
||||
break;
|
||||
}
|
||||
|
||||
return buf;
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
static unsigned dasm_mb86233(std::ostream &stream, uint32_t opcode )
|
||||
{
|
||||
char *p = buffer;
|
||||
uint32_t grp = ( opcode >> 26 ) & 0x3f;
|
||||
|
||||
switch( grp )
|
||||
@ -390,28 +364,28 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
uint32_t op=(opcode>>16) & 0x1f;
|
||||
|
||||
if ( alu != 0 )
|
||||
p += sprintf(p, "%s, ", ALU(alu) );
|
||||
util::stream_format(stream, "%s, ", ALU(alu) );
|
||||
|
||||
switch( op )
|
||||
{
|
||||
case 0x0c: /* a = RAM[addr], b = BRAM[addr] */
|
||||
p += sprintf(p,"LAB RAM(0x%x)->a,BRAM(0x%x)->b",r1,r2);
|
||||
util::stream_format(stream, "LAB RAM(0x%x)->a,BRAM(0x%x)->b",r1,r2);
|
||||
break;
|
||||
|
||||
case 0x0d: /* a = RAM[addr], b = BRAM[addr] */
|
||||
p += sprintf(p,"LAB RAM(0x%x)->a,BRAM(%s)->b",r1,INDIRECT(r2|(2<<6),0));
|
||||
util::stream_format(stream, "LAB RAM(0x%x)->a,BRAM(%s)->b",r1,INDIRECT(r2|(2<<6),0));
|
||||
break;
|
||||
|
||||
case 0x0f: /* a = RAM[addr], b = BRAM[reg] */
|
||||
p += sprintf(p,"LAB RAM(0x%x)->a,BRAM(%s)->b",r1,INDIRECT(r2|(6<<6),0));
|
||||
util::stream_format(stream, "LAB RAM(0x%x)->a,BRAM(%s)->b",r1,INDIRECT(r2|(6<<6),0));
|
||||
break;
|
||||
|
||||
case 0x10: /* a = BRAM[reg], b = RAM[addr] */
|
||||
p += sprintf(p,"LAB BRAM(%s)->a,RAM(0x%x)->b",INDIRECT(r1,1),r2);
|
||||
util::stream_format(stream, "LAB BRAM(%s)->a,RAM(0x%x)->b",INDIRECT(r1,1),r2);
|
||||
break;
|
||||
|
||||
default:
|
||||
p += sprintf(p,"UNKDUAL (%x)",op);
|
||||
util::stream_format(stream, "UNKDUAL (%x)",op);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -426,37 +400,37 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
|
||||
if ( alu != 0 )
|
||||
{
|
||||
p += sprintf(p, "%s", ALU(alu) );
|
||||
util::stream_format(stream, "%s", ALU(alu) );
|
||||
|
||||
if ( !(op == 0x1f && r1 == 0x10 && r2 == 0x0f) )
|
||||
p += sprintf(p, ", ");
|
||||
util::stream_format(stream, ", ");
|
||||
}
|
||||
|
||||
switch(op)
|
||||
{
|
||||
case 0x03: /* RAM->External Indirect */
|
||||
{
|
||||
p += sprintf(p,"MOV RAM(0x%x)->E(EB+%s)",r1,INDIRECT(r2|(6<<6),0));
|
||||
util::stream_format(stream, "MOV RAM(0x%x)->E(EB+%s)",r1,INDIRECT(r2|(6<<6),0));
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x04: /* MOV RAM->External */
|
||||
{
|
||||
p += sprintf(p,"MOV RAM(0x%x)->E(EB+0x%x)",r1,r2);
|
||||
util::stream_format(stream, "MOV RAM(0x%x)->E(EB+0x%x)",r1,r2);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x07: /* RAMInd->External */
|
||||
{
|
||||
p += sprintf(p,"MOV RAM(%s)->E(EB+%s)",INDIRECT(r1,1),INDIRECT(r2|(6<<6),0));
|
||||
util::stream_format(stream, "MOV RAM(%s)->E(EB+%s)",INDIRECT(r1,1),INDIRECT(r2|(6<<6),0));
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x08: /* External->RAM */
|
||||
{
|
||||
p += sprintf(p,"MOV EXT(EB+");
|
||||
p += sprintf(p,"%s",INDIRECT(r1,1));
|
||||
p += sprintf(p,")->RAM(0x%x)",r2);
|
||||
util::stream_format(stream, "MOV EXT(EB+");
|
||||
util::stream_format(stream, "%s",INDIRECT(r1,1));
|
||||
util::stream_format(stream, ")->RAM(0x%x)",r2);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -464,44 +438,44 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
{
|
||||
int mode = ( r1 >> 6 ) & 0x07;
|
||||
|
||||
p += sprintf(p,"MOV EXT(EB+");
|
||||
util::stream_format(stream, "MOV EXT(EB+");
|
||||
|
||||
if ( mode == 0 || mode == 3 || mode == 1 )
|
||||
p += sprintf(p,"RAM(");
|
||||
util::stream_format(stream, "RAM(");
|
||||
|
||||
p += sprintf(p,"%s",INDIRECT(r1,1));
|
||||
util::stream_format(stream, "%s",INDIRECT(r1,1));
|
||||
|
||||
if ( mode == 0 || mode == 3 || mode == 1)
|
||||
p += sprintf(p,")");
|
||||
util::stream_format(stream, ")");
|
||||
|
||||
p += sprintf(p,")->RAM(%s)",INDIRECT(r2|(6<<6),0));
|
||||
util::stream_format(stream, ")->RAM(%s)",INDIRECT(r2|(6<<6),0));
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0c: /* MOV RAM->BRAM */
|
||||
p += sprintf(p,"MOV RAM(0x%x)->BRAM(0x%x)",r1,r2);
|
||||
util::stream_format(stream, "MOV RAM(0x%x)->BRAM(0x%x)",r1,r2);
|
||||
break;
|
||||
|
||||
case 0x0f: /* MOV RAMInd->BRAMInd */
|
||||
p += sprintf(p,"MOV RAM(%s)->BRAM(%s)",INDIRECT(r1,1),INDIRECT(r2|(6<<6),0));
|
||||
util::stream_format(stream, "MOV RAM(%s)->BRAM(%s)",INDIRECT(r1,1),INDIRECT(r2|(6<<6),0));
|
||||
break;
|
||||
|
||||
case 0x10: /* MOV BRAMInd->RAM */
|
||||
p += sprintf(p,"MOV BRAM(%s)->RAM(0x%x)",INDIRECT(r1,1),r2);
|
||||
util::stream_format(stream, "MOV BRAM(%s)->RAM(0x%x)",INDIRECT(r1,1),r2);
|
||||
break;
|
||||
|
||||
case 0x13: /* MOV BRAMInd->RAMInd */
|
||||
p += sprintf(p,"MOV BRAM(%s)->RAM(%s)",INDIRECT(r1,1),INDIRECT(r2|(6<<6),0));
|
||||
util::stream_format(stream, "MOV BRAM(%s)->RAM(%s)",INDIRECT(r1,1),INDIRECT(r2|(6<<6),0));
|
||||
break;
|
||||
|
||||
case 0x1c: /* MOV Reg->RAMInd */
|
||||
if ( ( r2 >> 6 ) & 0x01)
|
||||
{
|
||||
p += sprintf(p,"MOV %s->EXT(EB+%s)",REGS(r2,1),INDIRECT(r1,0));
|
||||
util::stream_format(stream, "MOV %s->EXT(EB+%s)",REGS(r2,1),INDIRECT(r1,0));
|
||||
}
|
||||
else
|
||||
{
|
||||
p += sprintf(p,"MOV %s->RAM(%s)",REGS(r2,1),INDIRECT(r1,0));
|
||||
util::stream_format(stream, "MOV %s->RAM(%s)",REGS(r2,1),INDIRECT(r1,0));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -509,11 +483,11 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
{
|
||||
if ( r1 & 0x180 )
|
||||
{
|
||||
p += sprintf(p,"MOV RAM(%s)->%s",REGS(r1,0),REGS(r2,0));
|
||||
util::stream_format(stream, "MOV RAM(%s)->%s",REGS(r1,0),REGS(r2,0));
|
||||
}
|
||||
else
|
||||
{
|
||||
p += sprintf(p,"MOV RAM(0x%x)->%s",r1,REGS(r2,0));
|
||||
util::stream_format(stream, "MOV RAM(0x%x)->%s",r1,REGS(r2,0));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -521,19 +495,19 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
case 0x1e: /* External->Reg */
|
||||
{
|
||||
int mode2 = (r2 >> 6) & 1;
|
||||
p += sprintf(p,"MOV EXT(EB+%s)->%s",INDIRECT(r1,mode2),REGS(r2,0));
|
||||
util::stream_format(stream, "MOV EXT(EB+%s)->%s",INDIRECT(r1,mode2),REGS(r2,0));
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x1f: /* MOV Reg->Reg */
|
||||
if ( !(r1 == 0x10 && r2 == 0x0f) )
|
||||
{
|
||||
p += sprintf(p,"MOV %s->%s",REGS(r1,1),REGS(r2,0));
|
||||
util::stream_format(stream, "MOV %s->%s",REGS(r1,1),REGS(r2,0));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
p += sprintf(p,"UNKMV (0x%x)",op);
|
||||
util::stream_format(stream, "UNKMV (0x%x)",op);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -544,7 +518,7 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
uint32_t sub=(opcode>>24)&0x3;
|
||||
static const char regs[4] = { 'p', 'a', 'b', 'd' };
|
||||
|
||||
p += sprintf(p,"LDIMM24 0x%X->%c",opcode&0xffffff, regs[sub]);
|
||||
util::stream_format(stream, "LDIMM24 0x%X->%c",opcode&0xffffff, regs[sub]);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -554,31 +528,31 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
uint32_t sub2 = ( opcode >> 16 ) & 0x0f;
|
||||
|
||||
if ( alu != 0 )
|
||||
p += sprintf(p, "%s, ", ALU(alu) );
|
||||
util::stream_format(stream, "%s, ", ALU(alu) );
|
||||
|
||||
if ( sub2 == 0x00 )
|
||||
{
|
||||
p += sprintf(p,"CLEAR ");
|
||||
util::stream_format(stream, "CLEAR ");
|
||||
|
||||
switch( opcode & 0x3f )
|
||||
{
|
||||
case 0x04: p += sprintf(p, "a" ); break;
|
||||
case 0x08: p += sprintf(p, "b" ); break;
|
||||
case 0x10: p += sprintf(p, "d" ); break;
|
||||
default: p += sprintf(p, "UNKNOWN REG(%x)",opcode&0x3F); break;
|
||||
case 0x04: util::stream_format(stream, "a" ); break;
|
||||
case 0x08: util::stream_format(stream, "b" ); break;
|
||||
case 0x10: util::stream_format(stream, "d" ); break;
|
||||
default: util::stream_format(stream, "UNKNOWN REG(%x)",opcode&0x3F); break;
|
||||
}
|
||||
}
|
||||
else if ( sub2 == 0x02 )
|
||||
p += sprintf(p,"CLRFLAG 0x%x",opcode&0xffff);
|
||||
util::stream_format(stream, "CLRFLAG 0x%x",opcode&0xffff);
|
||||
else if ( sub2==0x4 )
|
||||
{
|
||||
if ( (opcode & 0xfff) == 0 )
|
||||
p += sprintf(p,"REP 0x100");
|
||||
util::stream_format(stream, "REP 0x100");
|
||||
else
|
||||
p += sprintf(p,"REP 0x%x",opcode&0xff);
|
||||
util::stream_format(stream, "REP 0x%x",opcode&0xff);
|
||||
}
|
||||
else if ( sub2 == 0x06 )
|
||||
p += sprintf(p,"SETFLAG 0x%x",opcode&0xffff);
|
||||
util::stream_format(stream, "SETFLAG 0x%x",opcode&0xffff);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -588,9 +562,9 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
uint32_t imm=(opcode)&0xFFFF;
|
||||
|
||||
if ( dst <= 3 )
|
||||
p += sprintf(p,"LDIMM 0x%x->r%d",imm,dst);
|
||||
util::stream_format(stream, "LDIMM 0x%x->r%d",imm,dst);
|
||||
else
|
||||
p += sprintf(p,"LDIMM 0x%x->UNKDST(0x%x)",imm,dst);
|
||||
util::stream_format(stream, "LDIMM 0x%x->UNKDST(0x%x)",imm,dst);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -598,11 +572,11 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
{
|
||||
uint32_t sub = ( opcode >> 24 ) & 0x03;
|
||||
|
||||
p += sprintf(p,"LDIMM 0x%X->",opcode&0xffffff);
|
||||
util::stream_format(stream, "LDIMM 0x%X->",opcode&0xffffff);
|
||||
|
||||
if ( sub == 0 ) p += sprintf(p,"r12");
|
||||
else if ( sub == 1 ) p += sprintf(p,"r13");
|
||||
else p += sprintf(p,"UNKREG(%x)", sub);
|
||||
if ( sub == 0 ) util::stream_format(stream, "r12");
|
||||
else if ( sub == 1 ) util::stream_format(stream, "r13");
|
||||
else util::stream_format(stream, "UNKREG(%x)", sub);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -610,12 +584,12 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
{
|
||||
uint32_t sub = ( opcode >> 24 ) & 0x03;
|
||||
|
||||
p += sprintf(p,"LDIMM 0x%X->",opcode&0xffffff);
|
||||
util::stream_format(stream, "LDIMM 0x%X->",opcode&0xffffff);
|
||||
|
||||
if ( sub == 0 ) p += sprintf(p,"a.exp");
|
||||
else if ( sub == 1 ) p += sprintf(p,"a.e");
|
||||
else if ( sub == 2 ) p += sprintf(p,"a.m");
|
||||
else p += sprintf(p,"UNKREG(%x)", sub);
|
||||
if ( sub == 0 ) util::stream_format(stream, "a.exp");
|
||||
else if ( sub == 1 ) util::stream_format(stream, "a.e");
|
||||
else if ( sub == 2 ) util::stream_format(stream, "a.m");
|
||||
else util::stream_format(stream, "UNKREG(%x)", sub);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -623,12 +597,12 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
{
|
||||
uint32_t sub = ( opcode >> 24 ) & 0x03;
|
||||
|
||||
p += sprintf(p,"LDIMM 0x%X->",opcode&0xffffff);
|
||||
util::stream_format(stream, "LDIMM 0x%X->",opcode&0xffffff);
|
||||
|
||||
if ( sub == 0 ) p += sprintf(p,"b.exp");
|
||||
else if ( sub == 1 ) p += sprintf(p,"b.e");
|
||||
else if ( sub == 2 ) p += sprintf(p,"b.m");
|
||||
else p += sprintf(p,"UNKREG(%x)", sub);
|
||||
if ( sub == 0 ) util::stream_format(stream, "b.exp");
|
||||
else if ( sub == 1 ) util::stream_format(stream, "b.e");
|
||||
else if ( sub == 2 ) util::stream_format(stream, "b.m");
|
||||
else util::stream_format(stream, "UNKREG(%x)", sub);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -636,11 +610,11 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
{
|
||||
uint32_t sub = ( opcode >> 24 ) & 0x03;
|
||||
|
||||
p += sprintf(p,"LDIMM 0x%X->",opcode&0xffffff);
|
||||
util::stream_format(stream, "LDIMM 0x%X->",opcode&0xffffff);
|
||||
|
||||
if ( sub == 2 ) p += sprintf(p,"d.e");
|
||||
else if ( sub == 3 ) p += sprintf(p,"d.m");
|
||||
else p += sprintf(p,"UNKREG(%x)", sub);
|
||||
if ( sub == 2 ) util::stream_format(stream, "d.e");
|
||||
else if ( sub == 3 ) util::stream_format(stream, "d.m");
|
||||
else util::stream_format(stream, "UNKREG(%x)", sub);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -648,10 +622,10 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
{
|
||||
uint32_t sub = ( opcode >> 24 ) & 0x03;
|
||||
|
||||
p += sprintf(p,"LDIMM 0x%X->",opcode&0xffffff);
|
||||
util::stream_format(stream, "LDIMM 0x%X->",opcode&0xffffff);
|
||||
|
||||
if ( sub == 0x03 ) p += sprintf(p,"shift");
|
||||
else p += sprintf(p,"UNKREG(%x)", sub);
|
||||
if ( sub == 0x03 ) util::stream_format(stream, "shift");
|
||||
else util::stream_format(stream, "UNKREG(%x)", sub);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -659,10 +633,10 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
{
|
||||
uint32_t sub = ( opcode >> 24 ) & 0x03;
|
||||
|
||||
p += sprintf(p,"LDIMM24 0x%X->",opcode&0xffffff);
|
||||
util::stream_format(stream, "LDIMM24 0x%X->",opcode&0xffffff);
|
||||
|
||||
if ( sub == 0x03 ) p += sprintf(p,"EB");
|
||||
else p += sprintf(p,"UNKREG(%x)", sub);
|
||||
if ( sub == 0x03 ) util::stream_format(stream, "EB");
|
||||
else util::stream_format(stream, "UNKREG(%x)", sub);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -675,43 +649,43 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
switch( subtype )
|
||||
{
|
||||
case 0:
|
||||
p += sprintf(p,"BRIF %s 0x%X", COND(cond), data);
|
||||
util::stream_format(stream, "BRIF %s 0x%X", COND(cond), data);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
p += sprintf(p,"BRIF %s ", COND(cond));
|
||||
util::stream_format(stream, "BRIF %s ", COND(cond));
|
||||
if ( data & 0x4000 )
|
||||
p += sprintf(p,"%s",REGS(data&0x3f,0));
|
||||
util::stream_format(stream, "%s",REGS(data&0x3f,0));
|
||||
else
|
||||
p += sprintf(p,"RAM(0x%x)",data);
|
||||
util::stream_format(stream, "RAM(0x%x)",data);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
p += sprintf(p,"BSIF %s 0x%X", COND(cond), data);
|
||||
util::stream_format(stream, "BSIF %s 0x%X", COND(cond), data);
|
||||
break;
|
||||
|
||||
case 0x6:
|
||||
p += sprintf(p,"BSIF %s ", COND(cond));
|
||||
util::stream_format(stream, "BSIF %s ", COND(cond));
|
||||
if ( data & 0x4000 )
|
||||
p += sprintf(p,"%s",REGS(data&0x3f,0));
|
||||
util::stream_format(stream, "%s",REGS(data&0x3f,0));
|
||||
else
|
||||
p += sprintf(p,"RAM(0x%x)",data);
|
||||
util::stream_format(stream, "RAM(0x%x)",data);
|
||||
break;
|
||||
|
||||
case 0xa:
|
||||
p += sprintf(p,"RTIF %s", COND(cond));
|
||||
util::stream_format(stream, "RTIF %s", COND(cond));
|
||||
break;
|
||||
|
||||
case 0xc:
|
||||
p += sprintf(p,"LDIF %s RAM(0x%x)->%s", COND(cond),data&0x1ff,REGS((data>>9)&0x3f,0));
|
||||
util::stream_format(stream, "LDIF %s RAM(0x%x)->%s", COND(cond),data&0x1ff,REGS((data>>9)&0x3f,0));
|
||||
break;
|
||||
|
||||
case 0xe:
|
||||
p += sprintf(p,"RIIF %s", COND(cond));
|
||||
util::stream_format(stream, "RIIF %s", COND(cond));
|
||||
break;
|
||||
|
||||
default:
|
||||
p += sprintf(p,"UNKG5 (%x cond %x)",subtype,cond);
|
||||
util::stream_format(stream, "UNKG5 (%x cond %x)",subtype,cond);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -726,59 +700,68 @@ static unsigned dasm_mb86233(char *buffer, uint32_t opcode )
|
||||
switch( subtype )
|
||||
{
|
||||
case 0:
|
||||
p += sprintf(p,"BRUL %s 0x%X", COND(cond), data);
|
||||
util::stream_format(stream, "BRUL %s 0x%X", COND(cond), data);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
p += sprintf(p,"BRUL %s ", COND(cond));
|
||||
util::stream_format(stream, "BRUL %s ", COND(cond));
|
||||
if ( data & 0x4000 )
|
||||
p += sprintf(p,"%s",REGS(data&0x3f,0));
|
||||
util::stream_format(stream, "%s",REGS(data&0x3f,0));
|
||||
else
|
||||
p += sprintf(p,"RAM(0x%x)",data);
|
||||
util::stream_format(stream, "RAM(0x%x)",data);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
p += sprintf(p,"BSUL %s 0x%X", COND(cond), data);
|
||||
util::stream_format(stream, "BSUL %s 0x%X", COND(cond), data);
|
||||
break;
|
||||
|
||||
case 0x6:
|
||||
p += sprintf(p,"BSUL %s ", COND(cond));
|
||||
util::stream_format(stream, "BSUL %s ", COND(cond));
|
||||
if ( data & 0x4000 )
|
||||
p += sprintf(p,"%s",REGS(data&0x3f,0));
|
||||
util::stream_format(stream, "%s",REGS(data&0x3f,0));
|
||||
else
|
||||
p += sprintf(p,"RAM(0x%x)",data);
|
||||
util::stream_format(stream, "RAM(0x%x)",data);
|
||||
break;
|
||||
|
||||
case 0xa:
|
||||
p += sprintf(p,"RTUL %s", COND(cond));
|
||||
util::stream_format(stream, "RTUL %s", COND(cond));
|
||||
break;
|
||||
|
||||
case 0xc:
|
||||
p += sprintf(p,"LDUL %s RAM(0x%x)->%s", COND(cond),data&0x1ff,REGS((data>>9)&0x3f,0));
|
||||
util::stream_format(stream, "LDUL %s RAM(0x%x)->%s", COND(cond),data&0x1ff,REGS((data>>9)&0x3f,0));
|
||||
break;
|
||||
|
||||
case 0xe:
|
||||
p += sprintf(p,"RIUL %s", COND(cond));
|
||||
util::stream_format(stream, "RIUL %s", COND(cond));
|
||||
break;
|
||||
|
||||
default:
|
||||
p += sprintf(p,"UNKG5 (%x cond %x)",subtype,cond);
|
||||
util::stream_format(stream, "UNKG5 (%x cond %x)",subtype,cond);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
p += sprintf(p,"UNKOP");
|
||||
util::stream_format(stream, "UNKOP");
|
||||
break;
|
||||
}
|
||||
|
||||
return (1 | DASMFLAG_SUPPORTED);
|
||||
}
|
||||
|
||||
CPU_DISASSEMBLE( mb86233 )
|
||||
static offs_t internal_disasm_mb86233(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options)
|
||||
{
|
||||
uint32_t op = *(uint32_t *)oprom;
|
||||
op = little_endianize_int32(op);
|
||||
return dasm_mb86233(buffer, op);
|
||||
return dasm_mb86233(stream, op);
|
||||
}
|
||||
|
||||
CPU_DISASSEMBLE(mb86233)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
offs_t result = internal_disasm_mb86233(device, stream, pc, oprom, opram, options);
|
||||
std::string stream_str = stream.str();
|
||||
strcpy(buffer, stream_str.c_str());
|
||||
return result;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user