Pointer-ified the mb86233 core.

This commit is contained in:
Aaron Giles 2008-12-10 06:15:38 +00:00
parent 0dcdc62b8d
commit b98c709380

View File

@ -1,6 +1,6 @@
/***************************************************************************
mb86233.c
cpustate->c
Core implementation for the portable Fujitsu MB86233 series DSP emulator.
Written by ElSemi
@ -27,7 +27,8 @@ typedef union
float f;
} MB86233_REG;
typedef struct
typedef struct _mb86233_state mb86233_state;
struct _mb86233_state
{
UINT16 pc;
MB86233_REG a;
@ -48,6 +49,7 @@ typedef struct
const device_config *device;
const address_space *program;
int icount;
/* FIFO */
int fifo_wait;
@ -58,59 +60,34 @@ typedef struct
UINT32 *RAM;
UINT32 *ARAM, *BRAM;
UINT32 *Tables;
} MB86233_REGS;
/***************************************************************************
PRIVATE GLOBAL VARIABLES
***************************************************************************/
static MB86233_REGS mb86233;
static int mb86233_icount;
};
/***************************************************************************
MACROS
***************************************************************************/
#define GETPC() mb86233.pc
#define GETA() mb86233.a
#define GETB() mb86233.b
#define GETD() mb86233.d
#define GETP() mb86233.p
#define GETSR() mb86233.sr
#define GETGPR(a) mb86233.gpr[a]
#define GETSHIFT() mb86233.shift
#define GETPCS() mb86233.pcs
#define GETPCSP() mb86233.pcsp
#define GETEB() mb86233.eb
#define GETREPS() mb86233.reps
#define GETEXTPORT() mb86233.extport
#define GETFIFOWAIT() mb86233.fifo_wait
#define GETARAM() mb86233.ARAM
#define GETBRAM() mb86233.BRAM
#define ALU(a) mb86233_alu(a)
#define GETREPCNT() mb86233.repcnt
#define ROPCODE(a) memory_decrypted_read_dword(mb86233.program, a<<2)
#define RDMEM(a) memory_read_dword_32le(mb86233.program, (a<<2))
#define WRMEM(a,v) memory_write_dword_32le(mb86233.program, (a<<2), v)
/***************************************************************************
Context Switching
***************************************************************************/
static CPU_GET_CONTEXT( mb86233 )
{
/* copy the context */
*(MB86233_REGS *)dst = mb86233;
}
static CPU_SET_CONTEXT( mb86233 )
{
/* copy the context */
if (src)
mb86233 = *(MB86233_REGS *)src;
}
#define GETPC() cpustate->pc
#define GETA() cpustate->a
#define GETB() cpustate->b
#define GETD() cpustate->d
#define GETP() cpustate->p
#define GETSR() cpustate->sr
#define GETGPR(a) cpustate->gpr[a]
#define GETSHIFT() cpustate->shift
#define GETPCS() cpustate->pcs
#define GETPCSP() cpustate->pcsp
#define GETEB() cpustate->eb
#define GETREPS() cpustate->reps
#define GETEXTPORT() cpustate->extport
#define GETFIFOWAIT() cpustate->fifo_wait
#define GETARAM() cpustate->ARAM
#define GETBRAM() cpustate->BRAM
#define ALU(cs,a) mb86233_alu(cs,a)
#define GETREPCNT() cpustate->repcnt
#define ROPCODE(a) memory_decrypted_read_dword(cpustate->program, a<<2)
#define RDMEM(a) memory_read_dword_32le(cpustate->program, (a<<2))
#define WRMEM(a,v) memory_write_dword_32le(cpustate->program, (a<<2), v)
/***************************************************************************
Initialization and Shutdown
@ -118,39 +95,42 @@ static CPU_SET_CONTEXT( mb86233 )
static CPU_INIT( mb86233 )
{
mb86233_state *cpustate = device->token;
mb86233_cpu_core * _config = (mb86233_cpu_core *)device->static_config;
(void)index;
(void)clock;
(void)irqcallback;
memset(&mb86233, 0, sizeof( MB86233_REGS ) );
mb86233.device = device;
mb86233.program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
memset(cpustate, 0, sizeof( *cpustate ) );
cpustate->device = device;
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
if ( _config )
{
mb86233.fifo_read_cb = _config->fifo_read_cb;
mb86233.fifo_write_cb = _config->fifo_write_cb;
cpustate->fifo_read_cb = _config->fifo_read_cb;
cpustate->fifo_write_cb = _config->fifo_write_cb;
}
mb86233.RAM = auto_malloc(2 * 0x200 * sizeof(UINT32)); /* 2x 2KB */
memset( mb86233.RAM, 0, 2 * 0x200 * sizeof(UINT32) );
mb86233.ARAM = &mb86233.RAM[0];
mb86233.BRAM = &mb86233.RAM[0x200];
mb86233.Tables = (UINT32*) memory_region(device->machine, _config->tablergn);
cpustate->RAM = auto_malloc(2 * 0x200 * sizeof(UINT32)); /* 2x 2KB */
memset( cpustate->RAM, 0, 2 * 0x200 * sizeof(UINT32) );
cpustate->ARAM = &cpustate->RAM[0];
cpustate->BRAM = &cpustate->RAM[0x200];
cpustate->Tables = (UINT32*) memory_region(device->machine, _config->tablergn);
state_save_register_global_pointer(device->machine, mb86233.RAM,2 * 0x200 * sizeof(UINT32));
state_save_register_global_pointer(device->machine, cpustate->RAM,2 * 0x200 * sizeof(UINT32));
}
static CPU_RESET( mb86233 )
{
mb86233_state *cpustate = device->token;
/* zero registers and flags */
mb86233.pc = 0;
mb86233.sr = 0;
mb86233.pcsp = 0;
mb86233.eb = 0;
mb86233.shift = 0;
mb86233.fifo_wait = 0;
cpustate->pc = 0;
cpustate->sr = 0;
cpustate->pcsp = 0;
cpustate->eb = 0;
cpustate->shift = 0;
cpustate->fifo_wait = 0;
}
@ -163,7 +143,7 @@ static CPU_RESET( mb86233 )
#define SIGN_FLAG (1 << 1)
#define EXTERNAL_FLAG (1 << 2) //This seems to be a flag coming from some external circuit??
static void FLAGSF( float v )
static void FLAGSF( mb86233_state *cpustate, float v )
{
GETSR() = 0;
@ -174,7 +154,7 @@ static void FLAGSF( float v )
GETSR() |= SIGN_FLAG;
}
static void FLAGSI( UINT32 v )
static void FLAGSI( mb86233_state *cpustate, UINT32 v )
{
GETSR() = 0;
@ -191,7 +171,7 @@ static void FLAGSI( UINT32 v )
Condition Codes
***************************************************************************/
static int COND( UINT32 cond )
static int COND( mb86233_state *cpustate, UINT32 cond )
{
switch( cond )
{
@ -242,7 +222,7 @@ static int COND( UINT32 cond )
ALU
***************************************************************************/
static void ALU( UINT32 alu)
static void ALU( mb86233_state *cpustate, UINT32 alu)
{
float ftmp;
@ -253,135 +233,135 @@ static void ALU( UINT32 alu)
case 0x01: /* D = D & A */
GETD().u &= GETA().u;
FLAGSI(GETD().u);
FLAGSI(cpustate, GETD().u);
break;
case 0x02: /* D = D | A */
GETD().u |= GETA().u;
FLAGSI(GETD().u);
FLAGSI(cpustate, GETD().u);
break;
case 0x03: /* D = D ^ A */
GETD().u ^= GETA().u;
FLAGSI(GETD().u);
FLAGSI(cpustate, GETD().u);
break;
case 0x05: /* CMP D,A */
ftmp = GETD().f - GETA().f;
FLAGSF(ftmp);
mb86233_icount--;
FLAGSF(cpustate, ftmp);
cpustate->icount--;
break;
case 0x06: /* D = D + A */
GETD().f += GETA().f;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x07: /* D = D - A */
GETD().f -= GETA().f;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x08: /* P = A * B */
GETP().f = GETA().f * GETB().f;
mb86233_icount--;
cpustate->icount--;
break;
case 0x09: /* D = D + P; P = A * B */
GETD().f += GETP().f;
GETP().f = GETA().f * GETB().f;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x0A: /* D = D - P; P = A * B */
GETD().f -= GETP().f;
GETP().f = GETA().f * GETB().f;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x0B: /* D = fabs(D) */
GETD().f = fabs( GETD().f );
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x0C: /* D = D + P */
GETD().f += GETP().f;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x0D: /* D = P; P = A * B */
GETD().f = GETP().f;
GETP().f = GETA().f * GETB().f;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x0E: /* D = float(D) */
GETD().f = (float)GETD().i;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x0F: /* D = int(D) */
GETD().i = (INT32)GETD().f;
FLAGSI(GETD().u);
FLAGSI(cpustate, GETD().u);
break;
case 0x10: /* D = D / A */
if ( GETA().u != 0 )
GETD().f = GETD().f / GETA().f;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x11: /* D = -D */
GETD().f = -GETD().f;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x13: /* D = A + B */
GETD().f = GETA().f + GETB().f;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x14: /* D = B - A */
GETD().f = GETB().f - GETA().f;
FLAGSF(GETD().f);
mb86233_icount--;
FLAGSF(cpustate, GETD().f);
cpustate->icount--;
break;
case 0x16: /* LSR D, SHIFT */
GETD().u >>= GETSHIFT();
FLAGSI(GETD().u);
FLAGSI(cpustate, GETD().u);
break;
case 0x17: /* LSL D, SHIFT */
GETD().u <<= GETSHIFT();
FLAGSI(GETD().u);
FLAGSI(cpustate, GETD().u);
break;
case 0x18: /* ASR D, SHIFT */
// GETD().u = (GETD().u & 0x80000000) | (GETD().u >> GETSHIFT());
GETD().i >>= GETSHIFT();
FLAGSI(GETD().u);
FLAGSI(cpustate, GETD().u);
break;
case 0x1A: /* D = D + A */
GETD().i += GETA().i;
FLAGSI(GETD().u);
FLAGSI(cpustate, GETD().u);
break;
case 0x1B: /* D = D - A */
GETD().i -= GETA().i;
FLAGSI(GETD().u);
FLAGSI(cpustate, GETD().u);
break;
default:
@ -405,7 +385,7 @@ static UINT32 ScaleExp(unsigned int v,int scale)
}
static UINT32 GETEXTERNAL( UINT32 EB, UINT32 offset )
static UINT32 GETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset )
{
UINT32 addr;
@ -426,7 +406,7 @@ static UINT32 GETEXTERNAL( UINT32 EB, UINT32 offset )
{
if(value&0x4000)
off=0x4000-off;
r=mb86233.Tables[off];
r=cpustate->Tables[off];
}
if(value&0x8000)
r|=1<<31;
@ -490,7 +470,7 @@ static UINT32 GETEXTERNAL( UINT32 EB, UINT32 offset )
}
res=(mb86233.Tables[index+0x10000/4]>>sign)&0xffff;
res=(cpustate->Tables[index+0x10000/4]>>sign)&0xffff;
if((a.u&0x7fffffff)<=(b.u&0x7fffffff))
res=0x4000-res;
@ -516,7 +496,7 @@ static UINT32 GETEXTERNAL( UINT32 EB, UINT32 offset )
if(offset==0x28)
{
UINT32 offset=(GETEXTPORT()[0x28]>>10)&0x1fff;
UINT32 value=mb86233.Tables[offset*2+0x20000/4];
UINT32 value=cpustate->Tables[offset*2+0x20000/4];
UINT32 srcexp=(GETEXTPORT()[0x28]>>23)&0xff;
value&=0x7FFFFFFF;
@ -526,7 +506,7 @@ static UINT32 GETEXTERNAL( UINT32 EB, UINT32 offset )
if(offset==0x29)
{
UINT32 offset=(GETEXTPORT()[0x28]>>10)&0x1fff;
UINT32 value=mb86233.Tables[offset*2+(0x20000/4)+1];
UINT32 value=cpustate->Tables[offset*2+(0x20000/4)+1];
UINT32 srcexp=(GETEXTPORT()[0x28]>>23)&0xff;
value&=0x7FFFFFFF;
@ -538,7 +518,7 @@ static UINT32 GETEXTERNAL( UINT32 EB, UINT32 offset )
if(offset==0x2a)
{
UINT32 offset=((GETEXTPORT()[0x2a]>>11)&0x1fff)^0x1000;
UINT32 value=mb86233.Tables[offset*2+0x30000/4];
UINT32 value=cpustate->Tables[offset*2+0x30000/4];
UINT32 srcexp=(GETEXTPORT()[0x2a]>>24)&0x7f;
value&=0x7FFFFFFF;
@ -548,7 +528,7 @@ static UINT32 GETEXTERNAL( UINT32 EB, UINT32 offset )
if(offset==0x2b)
{
UINT32 offset=((GETEXTPORT()[0x2a]>>11)&0x1fff)^0x1000;
UINT32 value=mb86233.Tables[offset*2+(0x30000/4)+1];
UINT32 value=cpustate->Tables[offset*2+(0x30000/4)+1];
UINT32 srcexp=(GETEXTPORT()[0x2a]>>24)&0x7f;
value&=0x7FFFFFFF;
@ -566,7 +546,7 @@ static UINT32 GETEXTERNAL( UINT32 EB, UINT32 offset )
return RDMEM(addr);
}
static void SETEXTERNAL( UINT32 EB, UINT32 offset, UINT32 value )
static void SETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset, UINT32 value )
{
UINT32 addr;
@ -599,7 +579,7 @@ static void SETEXTERNAL( UINT32 EB, UINT32 offset, UINT32 value )
Register Access
***************************************************************************/
static UINT32 GETREGS( UINT32 reg, int source )
static UINT32 GETREGS( mb86233_state *cpustate, UINT32 reg, int source )
{
UINT32 mode = ( reg >> 6 ) & 0x07;
@ -675,9 +655,9 @@ static UINT32 GETREGS( UINT32 reg, int source )
{
UINT32 fifo_data;
if ( mb86233.fifo_read_cb )
if ( cpustate->fifo_read_cb )
{
if ( mb86233.fifo_read_cb(mb86233.device, &fifo_data) )
if ( cpustate->fifo_read_cb(cpustate->device, &fifo_data) )
{
return fifo_data;
}
@ -770,7 +750,7 @@ static UINT32 GETREGS( UINT32 reg, int source )
return 0;
}
static void SETREGS( UINT32 reg, UINT32 val )
static void SETREGS( mb86233_state *cpustate, UINT32 reg, UINT32 val )
{
int mode = ( reg >> 6) & 0x07;
@ -858,9 +838,9 @@ static void SETREGS( UINT32 reg, UINT32 val )
break;
case 0x22: /* FOut */
if ( mb86233.fifo_write_cb )
if ( cpustate->fifo_write_cb )
{
mb86233.fifo_write_cb( mb86233.device, val );
cpustate->fifo_write_cb( cpustate->device, val );
}
break;
@ -890,7 +870,7 @@ static void SETREGS( UINT32 reg, UINT32 val )
Addressing Modes
***************************************************************************/
static UINT32 INDIRECT( UINT32 reg, int source )
static UINT32 INDIRECT( mb86233_state *cpustate, UINT32 reg, int source )
{
UINT32 mode = ( reg >> 6 ) & 0x07;
@ -969,10 +949,11 @@ static UINT32 INDIRECT( UINT32 reg, int source )
static CPU_EXECUTE( mb86233 )
{
mb86233_state *cpustate = device->token;
cpustate->icount = cycles;
mb86233_icount = cycles;
while( mb86233_icount > 0 )
while( cpustate->icount > 0 )
{
UINT32 val;
UINT32 opcode;
@ -992,7 +973,7 @@ static CPU_EXECUTE( mb86233 )
UINT32 alu = ( opcode >> 21 ) & 0x1f;
UINT32 op = ( opcode >> 16 ) & 0x1f;
ALU( alu );
ALU( cpustate, alu );
switch( op )
{
@ -1002,23 +983,23 @@ static CPU_EXECUTE( mb86233 )
break;
case 0x0D:
GETA().u = GETARAM()[INDIRECT(r1,0)];
GETB().u = GETBRAM()[INDIRECT(r2|2<<6,0)];
GETA().u = GETARAM()[INDIRECT(cpustate,r1,0)];
GETB().u = GETBRAM()[INDIRECT(cpustate,r2|2<<6,0)];
break;
case 0x0F:
GETA().u = GETARAM()[r1];
GETB().u = GETBRAM()[INDIRECT(r2|6<<6,0)];
GETB().u = GETBRAM()[INDIRECT(cpustate,r2|6<<6,0)];
break;
case 0x10:
GETA().u = GETBRAM()[INDIRECT(r1,1)];
GETA().u = GETBRAM()[INDIRECT(cpustate,r1,1)];
GETB().u = GETARAM()[r2];
break;
case 0x11:
GETA().u = GETARAM()[INDIRECT(r1,1)];
GETB().u = GETBRAM()[INDIRECT(r2|(2<<6),0)];
GETA().u = GETARAM()[INDIRECT(cpustate,r1,1)];
GETB().u = GETBRAM()[INDIRECT(cpustate,r2|(2<<6),0)];
break;
default:
@ -1039,15 +1020,15 @@ static CPU_EXECUTE( mb86233 )
{
case 0x04: /* MOV RAM->External */
{
SETEXTERNAL(GETEB(), r2, GETARAM()[r1]);
ALU(alu);
SETEXTERNAL(cpustate, GETEB(), r2, GETARAM()[r1]);
ALU(cpustate, alu);
}
break;
case 0x0c: /* MOV RAM->BRAM */
{
GETBRAM()[r2] = GETARAM()[r1];
ALU(alu);
ALU(cpustate, alu);
}
break;
@ -1055,7 +1036,7 @@ static CPU_EXECUTE( mb86233 )
{
if ( r1 & 0x180 )
{
val = GETARAM()[GETREGS(r1,0)];
val = GETARAM()[GETREGS(cpustate,r1,0)];
}
else
{
@ -1066,28 +1047,28 @@ static CPU_EXECUTE( mb86233 )
if ( GETFIFOWAIT() )
break;
ALU(alu);
SETREGS(r2,val);
ALU(cpustate, alu);
SETREGS(cpustate,r2,val);
}
break;
case 0x1c: /* MOV Reg->RAMInd */
{
val = GETREGS(r2,1);
val = GETREGS(cpustate,r2,1);
/* if we're waiting for data, don't complete the instruction */
if ( GETFIFOWAIT() )
break;
ALU(alu);
ALU(cpustate, alu);
if ( ( r2 >> 6 ) & 0x01)
{
SETEXTERNAL(GETEB(),INDIRECT(r1,0),val);
SETEXTERNAL(cpustate, GETEB(),INDIRECT(cpustate,r1,0),val);
}
else
{
GETARAM()[INDIRECT(r1,0)] = val;
GETARAM()[INDIRECT(cpustate,r1,0)] = val;
}
}
break;
@ -1097,42 +1078,42 @@ static CPU_EXECUTE( mb86233 )
if ( r1 == 0x10 && r2 == 0xf )
{
/* NOP */
ALU(alu);
ALU(cpustate, alu);
}
else
{
val = GETREGS(r1,1);
val = GETREGS(cpustate,r1,1);
/* if we're waiting for data, don't complete the instruction */
if ( GETFIFOWAIT() )
break;
ALU(alu);
SETREGS( r2, val );
ALU(cpustate, alu);
SETREGS(cpustate, r2, val );
}
}
break;
case 0x0f: /* MOV RAMInd->BRAMInd */
{
val = GETARAM()[INDIRECT(r1,1)];
ALU(alu);
GETBRAM()[INDIRECT(r2|(6<<6),0)] = val;
val = GETARAM()[INDIRECT(cpustate,r1,1)];
ALU(cpustate, alu);
GETBRAM()[INDIRECT(cpustate,r2|(6<<6),0)] = val;
}
break;
case 0x13: /* MOV BRAMInd->RAMInd */
{
val = GETBRAM()[INDIRECT(r1,1)];
ALU(alu);
GETARAM()[INDIRECT(r2|(6<<6),0)] = val;
val = GETBRAM()[INDIRECT(cpustate,r1,1)];
ALU(cpustate, alu);
GETARAM()[INDIRECT(cpustate,r2|(6<<6),0)] = val;
}
break;
case 0x10: /* MOV RAMInd->RAM */
{
val = GETBRAM()[INDIRECT(r1,1)];
ALU(alu);
val = GETBRAM()[INDIRECT(cpustate,r1,1)];
ALU(cpustate, alu);
GETARAM()[r2] = val;
}
break;
@ -1142,45 +1123,45 @@ static CPU_EXECUTE( mb86233 )
UINT32 offset;
if ( ( r2 >> 6 ) & 1 )
offset = INDIRECT(r1,1);
offset = INDIRECT(cpustate,r1,1);
else
offset = INDIRECT(r1,0);
offset = INDIRECT(cpustate,r1,0);
val = GETEXTERNAL(GETEB(),offset);
ALU(alu);
SETREGS(r2,val);
val = GETEXTERNAL(cpustate, GETEB(),offset);
ALU(cpustate, alu);
SETREGS(cpustate,r2,val);
}
break;
case 0x03: /* RAM->External Ind */
{
val = GETARAM()[r1];
ALU(alu);
SETEXTERNAL(GETEB(),INDIRECT(r2|(6<<6),0),val);
ALU(cpustate, alu);
SETEXTERNAL(cpustate, GETEB(),INDIRECT(cpustate,r2|(6<<6),0),val);
}
break;
case 0x07: /* RAMInd->External */
{
val = GETARAM()[INDIRECT(r1,1)];
ALU(alu);
SETEXTERNAL(GETEB(),INDIRECT(r2|(6<<6),0),val);
val = GETARAM()[INDIRECT(cpustate,r1,1)];
ALU(cpustate, alu);
SETEXTERNAL(cpustate, GETEB(),INDIRECT(cpustate,r2|(6<<6),0),val);
}
break;
case 0x08: /* External->RAM */
{
val = GETEXTERNAL(GETEB(),INDIRECT(r1,1));
ALU(alu);
val = GETEXTERNAL(cpustate, GETEB(),INDIRECT(cpustate,r1,1));
ALU(cpustate, alu);
GETARAM()[r2] = val;
}
break;
case 0x0b: /* External->RAMInd */
{
val = GETEXTERNAL(GETEB(),INDIRECT(r1,1));
ALU(alu);
GETARAM()[INDIRECT(r2|(6<<6),0)] = val;
val = GETEXTERNAL(cpustate, GETEB(),INDIRECT(cpustate,r1,1));
ALU(cpustate, alu);
GETARAM()[INDIRECT(cpustate,r2|(6<<6),0)] = val;
}
break;
@ -1226,7 +1207,7 @@ static CPU_EXECUTE( mb86233 )
UINT32 alu = ( opcode >> 20 ) & 0x1f;
UINT32 sub2 = ( opcode >> 16 ) & 0x0f;
ALU( alu );
ALU(cpustate, alu );
if( sub2 == 0x00 ) /* CLEAR reg */
{
@ -1262,7 +1243,7 @@ static CPU_EXECUTE( mb86233 )
}
else if ( sub3 == 8 )
{
GETREPS() = GETREGS( opcode & 0xfff, 0 );
GETREPS() = GETREGS(cpustate, opcode & 0xfff, 0 );
GETPC()++;
}
}
@ -1433,7 +1414,7 @@ static CPU_EXECUTE( mb86233 )
UINT32 subtype = ( opcode >> 16 ) & 0x0f;
UINT32 data = opcode & 0xffff;
if( COND(cond) )
if( COND(cpustate, cond) )
{
switch( subtype )
{
@ -1443,7 +1424,7 @@ static CPU_EXECUTE( mb86233 )
case 0x02: /* BRIF indirect */
if ( data & 0x4000 )
data = GETREGS(data&0x3f,0) - 1;
data = GETREGS(cpustate,data&0x3f,0) - 1;
else
data = ((GETARAM()[data&0x3ff])&0xffff)-1;
@ -1464,7 +1445,7 @@ static CPU_EXECUTE( mb86233 )
GETPCS()[GETPCSP()] = GETPC();
GETPCSP()++;
if ( data & 0x4000 )
data = GETREGS(data&0x3f,0) - 1;
data = GETREGS(cpustate,data&0x3f,0) - 1;
else
data = ((GETARAM()[data&0x3ff])&0xffff)-1;
@ -1481,7 +1462,7 @@ static CPU_EXECUTE( mb86233 )
break;
case 0x0c: /* LDIF */
SETREGS(((data>>9)&0x3f), GETARAM()[data&0x1FF] );
SETREGS(cpustate,((data>>9)&0x3f), GETARAM()[data&0x1FF] );
break;
case 0x0e: /* RIIF */
@ -1502,7 +1483,7 @@ static CPU_EXECUTE( mb86233 )
UINT32 subtype = ( opcode >> 16 ) & 0x0f;
UINT32 data = opcode & 0xffff;
if( !COND(cond) )
if( !COND(cpustate, cond) )
{
switch( subtype )
{
@ -1512,7 +1493,7 @@ static CPU_EXECUTE( mb86233 )
case 0x02: /* BRUL indirect */
if ( data & 0x4000 )
data = GETREGS(data&0x3f,0) - 1;
data = GETREGS(cpustate,data&0x3f,0) - 1;
else
data = ((GETARAM()[data&0x3ff])&0xffff)-1;
@ -1533,7 +1514,7 @@ static CPU_EXECUTE( mb86233 )
GETPCS()[GETPCSP()] = GETPC();
GETPCSP()++;
if ( data & 0x4000 )
data = GETREGS(data&0x3f,0) - 1;
data = GETREGS(cpustate,data&0x3f,0) - 1;
else
data = ((GETARAM()[data&0x3ff])&0xffff)-1;
@ -1550,7 +1531,7 @@ static CPU_EXECUTE( mb86233 )
break;
case 0x0c: /* LDUL */
SETREGS(((data>>9)&0x3f), GETARAM()[data&0x1FF] );
SETREGS(cpustate,((data>>9)&0x3f), GETARAM()[data&0x1FF] );
break;
case 0x0e: /* RIUL */
@ -1577,15 +1558,15 @@ static CPU_EXECUTE( mb86233 )
else
--GETREPS();
mb86233_icount--;
cpustate->icount--;
}
else
{
mb86233_icount = 0;
cpustate->icount = 0;
}
}
return cycles - mb86233_icount;
return cycles - cpustate->icount;
}
/***************************************************************************
@ -1608,6 +1589,8 @@ static CPU_DISASSEMBLE( mb86233 )
static CPU_SET_INFO( mb86233 )
{
mb86233_state *cpustate = device->token;
switch (state)
{
case CPUINFO_INT_PC:
@ -1647,10 +1630,12 @@ static CPU_SET_INFO( mb86233 )
CPU_GET_INFO( mb86233 )
{
mb86233_state *cpustate = (device != NULL) ? device->token : NULL;
switch (state)
{
/* --- the following bits of info are returned as 64-bit signed integers --- */
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(MB86233_REGS); break;
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(mb86233_state); break;
case CPUINFO_INT_INPUT_LINES: info->i = 0; break;
case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break;
case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_LITTLE; break;
@ -1704,15 +1689,15 @@ CPU_GET_INFO( mb86233 )
/* --- the following bits of info are returned as pointers to data or functions --- */
case CPUINFO_PTR_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(mb86233); break;
case CPUINFO_PTR_GET_CONTEXT: info->getcontext = CPU_GET_CONTEXT_NAME(mb86233); break;
case CPUINFO_PTR_SET_CONTEXT: info->setcontext = CPU_SET_CONTEXT_NAME(mb86233); break;
case CPUINFO_PTR_GET_CONTEXT: info->getcontext = CPU_GET_CONTEXT_NAME(dummy); break;
case CPUINFO_PTR_SET_CONTEXT: info->setcontext = CPU_SET_CONTEXT_NAME(dummy); break;
case CPUINFO_PTR_INIT: info->init = CPU_INIT_NAME(mb86233); break;
case CPUINFO_PTR_RESET: info->reset = CPU_RESET_NAME(mb86233); break;
case CPUINFO_PTR_EXIT: info->exit = NULL; break;
case CPUINFO_PTR_EXECUTE: info->execute = CPU_EXECUTE_NAME(mb86233); break;
case CPUINFO_PTR_BURN: info->burn = NULL; break;
case CPUINFO_PTR_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(mb86233); break;
case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &mb86233_icount; break;
case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &cpustate->icount; break;
/* --- the following bits of info are returned as NULL-terminated strings --- */
case CPUINFO_STR_NAME: strcpy(info->s, "MB86233"); break;