From b98c709380e0a52f963d497eb619a90214785a2c Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Wed, 10 Dec 2008 06:15:38 +0000 Subject: [PATCH] Pointer-ified the mb86233 core. --- src/emu/cpu/mb86233/mb86233.c | 355 ++++++++++++++++------------------ 1 file changed, 170 insertions(+), 185 deletions(-) diff --git a/src/emu/cpu/mb86233/mb86233.c b/src/emu/cpu/mb86233/mb86233.c index f5884e8c472..32276611701 100644 --- a/src/emu/cpu/mb86233/mb86233.c +++ b/src/emu/cpu/mb86233/mb86233.c @@ -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;