diff --git a/src/emu/cpu/mb86233/mb86233.c b/src/emu/cpu/mb86233/mb86233.c index 9d7668e2dbc..67e2d388330 100644 --- a/src/emu/cpu/mb86233/mb86233.c +++ b/src/emu/cpu/mb86233/mb86233.c @@ -17,129 +17,167 @@ #include "debugger.h" #include "mb86233.h" -CPU_DISASSEMBLE( mb86233 ); -/*************************************************************************** - STRUCTURES & TYPEDEFS -***************************************************************************/ +const device_type MB86233 = &device_creator; -union MB86233_REG + +mb86233_cpu_device::mb86233_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : cpu_device(mconfig, MB86233, "MB86233", tag, owner, clock, "mb86233", __FILE__) + , m_program_config("program", ENDIANNESS_LITTLE, 32, 32, -2) + , m_data_config("data", ENDIANNESS_LITTLE, 32, 32, 0) + , m_fifo_read_cb(*this) + , m_fifo_read_ok_cb(*this) + , m_fifo_write_cb(*this) + , m_tablergn(NULL) + , m_Tables(NULL) { - INT32 i; - UINT32 u; - float f; -}; - -struct mb86233_state -{ - UINT16 pc; - MB86233_REG a; - MB86233_REG b; - MB86233_REG d; - MB86233_REG p; - - UINT16 reps; - UINT16 pcs[4]; - UINT8 pcsp; - UINT32 eb; - UINT32 shift; - UINT32 repcnt; - UINT16 sr; - - UINT32 gpr[16]; - UINT32 extport[0x30]; - - legacy_cpu_device *device; - address_space *program; - direct_read_data *direct; - int icount; - - /* FIFO */ - int fifo_wait; - mb86233_fifo_read_func fifo_read_cb; - mb86233_fifo_write_func fifo_write_cb; - - /* internal RAM */ - UINT32 *RAM; - UINT32 *ARAM, *BRAM; - UINT32 *Tables; -}; - -INLINE mb86233_state *get_safe_token(device_t *device) -{ - assert(device != NULL); - assert(device->type() == MB86233); - return (mb86233_state *)downcast(device)->token(); } + +offs_t mb86233_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) +{ + extern CPU_DISASSEMBLE( mb86233 ); + return CPU_DISASSEMBLE_NAME(mb86233)(this, buffer, pc, oprom, opram, options); +} + + /*************************************************************************** MACROS ***************************************************************************/ -#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 ZERO_FLAG (1 << 0) +#define SIGN_FLAG (1 << 1) +#define EXTERNAL_FLAG (1 << 2) //This seems to be a flag coming from some external circuit?? -#define ROPCODE(a) cpustate->direct->read_decrypted_dword(a<<2) -#define RDMEM(a) cpustate->program->read_dword((a<<2)) -#define WRMEM(a,v) cpustate->program->write_dword((a<<2), v) +#define GETPC() m_pc +#define GETA() m_a +#define GETB() m_b +#define GETD() m_d +#define GETP() m_p +#define GETSR() m_sr +#define GETGPR(a) m_gpr[a] +#define GETSHIFT() m_shift +#define GETPCS() m_pcs +#define GETPCSP() m_pcsp +#define GETEB() m_eb +#define GETREPS() m_reps +#define GETEXTPORT() m_extport +#define GETFIFOWAIT() m_fifo_wait +#define GETARAM() m_ARAM +#define GETBRAM() m_BRAM +#define GETREPCNT() m_repcnt + +#define ROPCODE(a) m_direct->read_decrypted_dword(a<<2) +#define RDMEM(a) m_program->read_dword((a<<2)) +#define WRMEM(a,v) m_program->write_dword((a<<2), v) /*************************************************************************** Initialization and Shutdown ***************************************************************************/ -static CPU_INIT( mb86233 ) +void mb86233_cpu_device::device_start() { - mb86233_state *cpustate = get_safe_token(device); - mb86233_cpu_core * _config = (mb86233_cpu_core *)device->static_config(); - (void)irqcallback; + m_pc = 0; + m_a.u = 0; + m_b.u = 0; + m_d.u = 0; + m_p.u = 0; + m_reps = 0; + m_pcs[0] = m_pcs[1] = m_pcs[2] = m_pcs[3] = 0; + m_pcsp = 0; + m_eb = 0; + m_shift = 0; + m_repcnt = 0; + m_sr = 0; + memset(m_gpr, 0, sizeof(m_gpr)); + memset(m_extport, 0, sizeof(m_extport)); + m_fifo_wait = 0; - memset(cpustate, 0, sizeof( *cpustate ) ); - cpustate->device = device; - cpustate->program = &device->space(AS_PROGRAM); - cpustate->direct = &cpustate->program->direct(); + m_fifo_read_cb.resolve_safe(0); + m_fifo_read_ok_cb.resolve_safe(0); + m_fifo_write_cb.resolve_safe(); + + m_program = &space(AS_PROGRAM); + m_direct = &m_program->direct(); - if ( _config ) + if ( m_tablergn ) { - cpustate->fifo_read_cb = _config->fifo_read_cb; - cpustate->fifo_write_cb = _config->fifo_write_cb; - cpustate->Tables = (UINT32*) device->machine().root_device().memregion(_config->tablergn)->base(); + m_Tables = (UINT32*) machine().root_device().memregion(m_tablergn)->base(); } - cpustate->RAM = auto_alloc_array(device->machine(), UINT32, 2 * 0x200); /* 2x 2KB */ - memset( cpustate->RAM, 0, 2 * 0x200 * sizeof(UINT32) ); - cpustate->ARAM = &cpustate->RAM[0]; - cpustate->BRAM = &cpustate->RAM[0x200]; + memset( m_RAM, 0, 2 * 0x200 * sizeof(UINT32) ); + m_ARAM = &m_RAM[0]; + m_BRAM = &m_RAM[0x200]; - device->machine().save().save_pointer(NAME(cpustate->RAM),2 * 0x200 * sizeof(UINT32)); + save_item(NAME(m_pc)); + save_item(NAME(m_a.u)); + save_item(NAME(m_b.u)); + save_item(NAME(m_d.u)); + save_item(NAME(m_p.u)); + save_item(NAME(m_reps)); + save_item(NAME(m_pcs)); + save_item(NAME(m_pcsp)); + save_item(NAME(m_eb)); + save_item(NAME(m_shift)); + save_item(NAME(m_repcnt)); + save_item(NAME(m_sr)); + save_item(NAME(m_gpr)); + save_item(NAME(m_extport)); + save_item(NAME(m_RAM)); + + state_add( MB86233_PC, "PC", m_pc).formatstr("%04X"); + state_add( MB86233_A, "PA", m_a.u).formatstr("%08X"); + state_add( MB86233_B, "PB", m_b.u).formatstr("%08X"); + state_add( MB86233_P, "PP", m_p.u).formatstr("%08X"); + state_add( MB86233_D, "PD", m_d.u).formatstr("%08X"); + state_add( MB86233_REP, "REPS", m_reps).formatstr("%08X"); + state_add( MB86233_SP, "PCSP", m_pcsp).mask(0xf).formatstr("%01X"); + state_add( MB86233_EB, "EB", m_eb).formatstr("%08X"); + state_add( MB86233_SHIFT, "SHIFT", m_shift).formatstr("%08X"); + state_add( MB86233_R0, "R0", m_gpr[0]).formatstr("%08X"); + state_add( MB86233_R1, "R1", m_gpr[1]).formatstr("%08X"); + state_add( MB86233_R2, "R2", m_gpr[2]).formatstr("%08X"); + state_add( MB86233_R3, "R3", m_gpr[3]).formatstr("%08X"); + state_add( MB86233_R4, "R4", m_gpr[4]).formatstr("%08X"); + state_add( MB86233_R5, "R5", m_gpr[5]).formatstr("%08X"); + state_add( MB86233_R6, "R6", m_gpr[6]).formatstr("%08X"); + state_add( MB86233_R7, "R7", m_gpr[7]).formatstr("%08X"); + state_add( MB86233_R8, "R8", m_gpr[8]).formatstr("%08X"); + state_add( MB86233_R9, "R9", m_gpr[9]).formatstr("%08X"); + state_add( MB86233_R10, "R10", m_gpr[10]).formatstr("%08X"); + state_add( MB86233_R11, "R11", m_gpr[11]).formatstr("%08X"); + state_add( MB86233_R12, "R12", m_gpr[12]).formatstr("%08X"); + state_add( MB86233_R13, "R13", m_gpr[13]).formatstr("%08X"); + state_add( MB86233_R14, "R14", m_gpr[14]).formatstr("%08X"); + state_add( MB86233_R15, "R15", m_gpr[15]).formatstr("%08X"); + + state_add( STATE_GENPC, "GENPC", m_pc).noshow(); + state_add( STATE_GENFLAGS, "GENFLAGS", m_sr).formatstr("%2s").noshow(); + + m_icountptr = &m_icount; } -static CPU_RESET( mb86233 ) -{ - mb86233_state *cpustate = get_safe_token(device); +void mb86233_cpu_device::state_string_export(const device_state_entry &entry, astring &string) +{ + switch (entry.index()) + { + case STATE_GENFLAGS: + string.printf("%c%c", (m_sr & SIGN_FLAG) ? 'N' : 'n', (m_sr & ZERO_FLAG) ? 'Z' : 'z' ); + break; + } +} + + +void mb86233_cpu_device::device_reset() +{ /* zero registers and flags */ - cpustate->pc = 0; - cpustate->sr = 0; - cpustate->pcsp = 0; - cpustate->eb = 0; - cpustate->shift = 0; - cpustate->fifo_wait = 0; + m_pc = 0; + m_sr = 0; + m_pcsp = 0; + m_eb = 0; + m_shift = 0; + m_fifo_wait = 0; } @@ -152,7 +190,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( mb86233_state *cpustate, float v ) +void mb86233_cpu_device::FLAGSF( float v ) { GETSR() = 0; @@ -163,7 +201,7 @@ static void FLAGSF( mb86233_state *cpustate, float v ) GETSR() |= SIGN_FLAG; } -static void FLAGSI( mb86233_state *cpustate, UINT32 v ) +void mb86233_cpu_device::FLAGSI( UINT32 v ) { GETSR() = 0; @@ -180,7 +218,7 @@ static void FLAGSI( mb86233_state *cpustate, UINT32 v ) Condition Codes ***************************************************************************/ -static int COND( mb86233_state *cpustate, UINT32 cond ) +int mb86233_cpu_device::COND( UINT32 cond ) { switch( cond ) { @@ -230,7 +268,7 @@ static int COND( mb86233_state *cpustate, UINT32 cond ) ALU ***************************************************************************/ -static void ALU( mb86233_state *cpustate, UINT32 alu) +void mb86233_cpu_device::ALU( UINT32 alu) { float ftmp; @@ -241,135 +279,135 @@ static void ALU( mb86233_state *cpustate, UINT32 alu) case 0x01: /* D = D & A */ GETD().u &= GETA().u; - FLAGSI(cpustate, GETD().u); + FLAGSI( GETD().u); break; case 0x02: /* D = D | A */ GETD().u |= GETA().u; - FLAGSI(cpustate, GETD().u); + FLAGSI( GETD().u); break; case 0x03: /* D = D ^ A */ GETD().u ^= GETA().u; - FLAGSI(cpustate, GETD().u); + FLAGSI( GETD().u); break; case 0x05: /* CMP D,A */ ftmp = GETD().f - GETA().f; - FLAGSF(cpustate, ftmp); - cpustate->icount--; + FLAGSF( ftmp); + m_icount--; break; case 0x06: /* D = D + A */ GETD().f += GETA().f; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x07: /* D = D - A */ GETD().f -= GETA().f; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x08: /* P = A * B */ GETP().f = GETA().f * GETB().f; - cpustate->icount--; + m_icount--; break; case 0x09: /* D = D + P; P = A * B */ GETD().f += GETP().f; GETP().f = GETA().f * GETB().f; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x0A: /* D = D - P; P = A * B */ GETD().f -= GETP().f; GETP().f = GETA().f * GETB().f; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x0B: /* D = fabs(D) */ GETD().f = fabs( GETD().f ); - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x0C: /* D = D + P */ GETD().f += GETP().f; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x0D: /* D = P; P = A * B */ GETD().f = GETP().f; GETP().f = GETA().f * GETB().f; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x0E: /* D = float(D) */ GETD().f = (float)GETD().i; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x0F: /* D = int(D) */ GETD().i = (INT32)GETD().f; - FLAGSI(cpustate, GETD().u); + FLAGSI( GETD().u); break; case 0x10: /* D = D / A */ if ( GETA().u != 0 ) GETD().f = GETD().f / GETA().f; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x11: /* D = -D */ GETD().f = -GETD().f; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x13: /* D = A + B */ GETD().f = GETA().f + GETB().f; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x14: /* D = B - A */ GETD().f = GETB().f - GETA().f; - FLAGSF(cpustate, GETD().f); - cpustate->icount--; + FLAGSF( GETD().f); + m_icount--; break; case 0x16: /* LSR D, SHIFT */ GETD().u >>= GETSHIFT(); - FLAGSI(cpustate, GETD().u); + FLAGSI( GETD().u); break; case 0x17: /* LSL D, SHIFT */ GETD().u <<= GETSHIFT(); - FLAGSI(cpustate, GETD().u); + FLAGSI( GETD().u); break; case 0x18: /* ASR D, SHIFT */ // GETD().u = (GETD().u & 0x80000000) | (GETD().u >> GETSHIFT()); GETD().i >>= GETSHIFT(); - FLAGSI(cpustate, GETD().u); + FLAGSI( GETD().u); break; case 0x1A: /* D = D + A */ GETD().i += GETA().i; - FLAGSI(cpustate, GETD().u); + FLAGSI( GETD().u); break; case 0x1B: /* D = D - A */ GETD().i -= GETA().i; - FLAGSI(cpustate, GETD().u); + FLAGSI( GETD().u); break; default: @@ -384,7 +422,7 @@ static void ALU( mb86233_state *cpustate, UINT32 alu) Memory Access ***************************************************************************/ -static UINT32 ScaleExp(unsigned int v,int scale) +UINT32 mb86233_cpu_device::ScaleExp(unsigned int v,int scale) { int exp=(v>>23)&0xff; exp+=scale; @@ -393,7 +431,7 @@ static UINT32 ScaleExp(unsigned int v,int scale) } -static UINT32 GETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset ) +UINT32 mb86233_cpu_device::GETEXTERNAL( UINT32 EB, UINT32 offset ) { UINT32 addr; @@ -414,7 +452,7 @@ static UINT32 GETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset ) { if(value&0x4000) off=0x4000-off; - r=cpustate->Tables[off]; + r=m_Tables[off]; } if(value&0x8000) r|=1<<31; @@ -478,7 +516,7 @@ static UINT32 GETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset ) } - res=(cpustate->Tables[index+0x10000/4]>>sign)&0xffff; + res=(m_Tables[index+0x10000/4]>>sign)&0xffff; if((a.u&0x7fffffff)<=(b.u&0x7fffffff)) res=0x4000-res; @@ -504,7 +542,7 @@ static UINT32 GETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset ) if(offset==0x28) { UINT32 offset=(GETEXTPORT()[0x28]>>10)&0x1fff; - UINT32 value=cpustate->Tables[offset*2+0x20000/4]; + UINT32 value=m_Tables[offset*2+0x20000/4]; UINT32 srcexp=(GETEXTPORT()[0x28]>>23)&0xff; value&=0x7FFFFFFF; @@ -514,7 +552,7 @@ static UINT32 GETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset ) if(offset==0x29) { UINT32 offset=(GETEXTPORT()[0x28]>>10)&0x1fff; - UINT32 value=cpustate->Tables[offset*2+(0x20000/4)+1]; + UINT32 value=m_Tables[offset*2+(0x20000/4)+1]; UINT32 srcexp=(GETEXTPORT()[0x28]>>23)&0xff; value&=0x7FFFFFFF; @@ -526,7 +564,7 @@ static UINT32 GETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset ) if(offset==0x2a) { UINT32 offset=((GETEXTPORT()[0x2a]>>11)&0x1fff)^0x1000; - UINT32 value=cpustate->Tables[offset*2+0x30000/4]; + UINT32 value=m_Tables[offset*2+0x30000/4]; UINT32 srcexp=(GETEXTPORT()[0x2a]>>24)&0x7f; value&=0x7FFFFFFF; @@ -536,7 +574,7 @@ static UINT32 GETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset ) if(offset==0x2b) { UINT32 offset=((GETEXTPORT()[0x2a]>>11)&0x1fff)^0x1000; - UINT32 value=cpustate->Tables[offset*2+(0x30000/4)+1]; + UINT32 value=m_Tables[offset*2+(0x30000/4)+1]; UINT32 srcexp=(GETEXTPORT()[0x2a]>>24)&0x7f; value&=0x7FFFFFFF; @@ -554,7 +592,7 @@ static UINT32 GETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset ) return RDMEM(addr); } -static void SETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset, UINT32 value ) +void mb86233_cpu_device::SETEXTERNAL( UINT32 EB, UINT32 offset, UINT32 value ) { UINT32 addr; @@ -587,7 +625,7 @@ static void SETEXTERNAL( mb86233_state *cpustate, UINT32 EB, UINT32 offset, UINT Register Access ***************************************************************************/ -static UINT32 GETREGS( mb86233_state *cpustate, UINT32 reg, int source ) +UINT32 mb86233_cpu_device::GETREGS( UINT32 reg, int source ) { UINT32 mode = ( reg >> 6 ) & 0x07; @@ -647,14 +685,9 @@ static UINT32 GETREGS( mb86233_state *cpustate, UINT32 reg, int source ) case 0x21: /* FIn */ { - UINT32 fifo_data; - - if ( cpustate->fifo_read_cb ) + if ( m_fifo_read_ok_cb() == ASSERT_LINE ) { - if ( cpustate->fifo_read_cb(cpustate->device, &fifo_data) ) - { - return fifo_data; - } + return m_fifo_read_cb(); } GETFIFOWAIT() = 1; @@ -740,7 +773,7 @@ static UINT32 GETREGS( mb86233_state *cpustate, UINT32 reg, int source ) return 0; } -static void SETREGS( mb86233_state *cpustate, UINT32 reg, UINT32 val ) +void mb86233_cpu_device::SETREGS( UINT32 reg, UINT32 val ) { int mode = ( reg >> 6) & 0x07; @@ -828,10 +861,7 @@ static void SETREGS( mb86233_state *cpustate, UINT32 reg, UINT32 val ) break; case 0x22: /* FOut */ - if ( cpustate->fifo_write_cb ) - { - cpustate->fifo_write_cb( cpustate->device, val ); - } + m_fifo_write_cb( val ); break; case 0x23: @@ -860,7 +890,7 @@ static void SETREGS( mb86233_state *cpustate, UINT32 reg, UINT32 val ) Addressing Modes ***************************************************************************/ -static UINT32 INDIRECT( mb86233_state *cpustate, UINT32 reg, int source ) +UINT32 mb86233_cpu_device::INDIRECT( UINT32 reg, int source ) { UINT32 mode = ( reg >> 6 ) & 0x07; @@ -937,16 +967,14 @@ static UINT32 INDIRECT( mb86233_state *cpustate, UINT32 reg, int source ) Core Execution Loop ***************************************************************************/ -static CPU_EXECUTE( mb86233 ) +void mb86233_cpu_device::execute_run() { - mb86233_state *cpustate = get_safe_token(device); - - while( cpustate->icount > 0 ) + while( m_icount > 0 ) { UINT32 val; UINT32 opcode; - debugger_instruction_hook(device, GETPC()); + debugger_instruction_hook(this, GETPC()); opcode = ROPCODE(GETPC()); @@ -961,7 +989,7 @@ static CPU_EXECUTE( mb86233 ) UINT32 alu = ( opcode >> 21 ) & 0x1f; UINT32 op = ( opcode >> 16 ) & 0x1f; - ALU( cpustate, alu ); + ALU( alu ); switch( op ) { @@ -971,23 +999,23 @@ static CPU_EXECUTE( mb86233 ) break; case 0x0D: - GETA().u = GETARAM()[INDIRECT(cpustate,r1,0)]; - GETB().u = GETBRAM()[INDIRECT(cpustate,r2|2<<6,0)]; + GETA().u = GETARAM()[INDIRECT(r1,0)]; + GETB().u = GETBRAM()[INDIRECT(r2|2<<6,0)]; break; case 0x0F: GETA().u = GETARAM()[r1]; - GETB().u = GETBRAM()[INDIRECT(cpustate,r2|6<<6,0)]; + GETB().u = GETBRAM()[INDIRECT(r2|6<<6,0)]; break; case 0x10: - GETA().u = GETBRAM()[INDIRECT(cpustate,r1,1)]; + GETA().u = GETBRAM()[INDIRECT(r1,1)]; GETB().u = GETARAM()[r2]; break; case 0x11: - GETA().u = GETARAM()[INDIRECT(cpustate,r1,1)]; - GETB().u = GETBRAM()[INDIRECT(cpustate,r2|(2<<6),0)]; + GETA().u = GETARAM()[INDIRECT(r1,1)]; + GETB().u = GETBRAM()[INDIRECT(r2|(2<<6),0)]; break; default: @@ -1008,15 +1036,15 @@ static CPU_EXECUTE( mb86233 ) { case 0x04: /* MOV RAM->External */ { - SETEXTERNAL(cpustate, GETEB(), r2, GETARAM()[r1]); - ALU(cpustate, alu); + SETEXTERNAL( GETEB(), r2, GETARAM()[r1]); + ALU( alu); } break; case 0x0c: /* MOV RAM->BRAM */ { GETBRAM()[r2] = GETARAM()[r1]; - ALU(cpustate, alu); + ALU( alu); } break; @@ -1024,7 +1052,7 @@ static CPU_EXECUTE( mb86233 ) { if ( r1 & 0x180 ) { - val = GETARAM()[GETREGS(cpustate,r1,0)]; + val = GETARAM()[GETREGS(r1,0)]; } else { @@ -1035,28 +1063,28 @@ static CPU_EXECUTE( mb86233 ) if ( GETFIFOWAIT() ) break; - ALU(cpustate, alu); - SETREGS(cpustate,r2,val); + ALU( alu); + SETREGS(r2,val); } break; case 0x1c: /* MOV Reg->RAMInd */ { - val = GETREGS(cpustate,r2,1); + val = GETREGS(r2,1); /* if we're waiting for data, don't complete the instruction */ if ( GETFIFOWAIT() ) break; - ALU(cpustate, alu); + ALU( alu); if ( ( r2 >> 6 ) & 0x01) { - SETEXTERNAL(cpustate, GETEB(),INDIRECT(cpustate,r1,0),val); + SETEXTERNAL( GETEB(),INDIRECT(r1,0),val); } else { - GETARAM()[INDIRECT(cpustate,r1,0)] = val; + GETARAM()[INDIRECT(r1,0)] = val; } } break; @@ -1066,42 +1094,42 @@ static CPU_EXECUTE( mb86233 ) if ( r1 == 0x10 && r2 == 0xf ) { /* NOP */ - ALU(cpustate, alu); + ALU( alu); } else { - val = GETREGS(cpustate,r1,1); + val = GETREGS(r1,1); /* if we're waiting for data, don't complete the instruction */ if ( GETFIFOWAIT() ) break; - ALU(cpustate, alu); - SETREGS(cpustate, r2, val ); + ALU( alu); + SETREGS( r2, val ); } } break; case 0x0f: /* MOV RAMInd->BRAMInd */ { - val = GETARAM()[INDIRECT(cpustate,r1,1)]; - ALU(cpustate, alu); - GETBRAM()[INDIRECT(cpustate,r2|(6<<6),0)] = val; + val = GETARAM()[INDIRECT(r1,1)]; + ALU( alu); + GETBRAM()[INDIRECT(r2|(6<<6),0)] = val; } break; case 0x13: /* MOV BRAMInd->RAMInd */ { - val = GETBRAM()[INDIRECT(cpustate,r1,1)]; - ALU(cpustate, alu); - GETARAM()[INDIRECT(cpustate,r2|(6<<6),0)] = val; + val = GETBRAM()[INDIRECT(r1,1)]; + ALU( alu); + GETARAM()[INDIRECT(r2|(6<<6),0)] = val; } break; case 0x10: /* MOV RAMInd->RAM */ { - val = GETBRAM()[INDIRECT(cpustate,r1,1)]; - ALU(cpustate, alu); + val = GETBRAM()[INDIRECT(r1,1)]; + ALU( alu); GETARAM()[r2] = val; } break; @@ -1111,45 +1139,45 @@ static CPU_EXECUTE( mb86233 ) UINT32 offset; if ( ( r2 >> 6 ) & 1 ) - offset = INDIRECT(cpustate,r1,1); + offset = INDIRECT(r1,1); else - offset = INDIRECT(cpustate,r1,0); + offset = INDIRECT(r1,0); - val = GETEXTERNAL(cpustate, GETEB(),offset); - ALU(cpustate, alu); - SETREGS(cpustate,r2,val); + val = GETEXTERNAL( GETEB(),offset); + ALU( alu); + SETREGS(r2,val); } break; case 0x03: /* RAM->External Ind */ { val = GETARAM()[r1]; - ALU(cpustate, alu); - SETEXTERNAL(cpustate, GETEB(),INDIRECT(cpustate,r2|(6<<6),0),val); + ALU( alu); + SETEXTERNAL( GETEB(),INDIRECT(r2|(6<<6),0),val); } break; case 0x07: /* RAMInd->External */ { - val = GETARAM()[INDIRECT(cpustate,r1,1)]; - ALU(cpustate, alu); - SETEXTERNAL(cpustate, GETEB(),INDIRECT(cpustate,r2|(6<<6),0),val); + val = GETARAM()[INDIRECT(r1,1)]; + ALU( alu); + SETEXTERNAL( GETEB(),INDIRECT(r2|(6<<6),0),val); } break; case 0x08: /* External->RAM */ { - val = GETEXTERNAL(cpustate, GETEB(),INDIRECT(cpustate,r1,1)); - ALU(cpustate, alu); + val = GETEXTERNAL( GETEB(),INDIRECT(r1,1)); + ALU( alu); GETARAM()[r2] = val; } break; case 0x0b: /* External->RAMInd */ { - val = GETEXTERNAL(cpustate, GETEB(),INDIRECT(cpustate,r1,1)); - ALU(cpustate, alu); - GETARAM()[INDIRECT(cpustate,r2|(6<<6),0)] = val; + val = GETEXTERNAL( GETEB(),INDIRECT(r1,1)); + ALU( alu); + GETARAM()[INDIRECT(r2|(6<<6),0)] = val; } break; @@ -1195,7 +1223,7 @@ static CPU_EXECUTE( mb86233 ) UINT32 alu = ( opcode >> 20 ) & 0x1f; UINT32 sub2 = ( opcode >> 16 ) & 0x0f; - ALU(cpustate, alu ); + ALU( alu ); if( sub2 == 0x00 ) /* CLEAR reg */ { @@ -1231,7 +1259,7 @@ static CPU_EXECUTE( mb86233 ) } else if ( sub3 == 8 ) { - GETREPS() = GETREGS(cpustate, opcode & 0xfff, 0 ); + GETREPS() = GETREGS( opcode & 0xfff, 0 ); GETPC()++; } } @@ -1402,7 +1430,7 @@ static CPU_EXECUTE( mb86233 ) UINT32 subtype = ( opcode >> 16 ) & 0x0f; UINT32 data = opcode & 0xffff; - if( COND(cpustate, cond) ) + if( COND( cond) ) { switch( subtype ) { @@ -1412,7 +1440,7 @@ static CPU_EXECUTE( mb86233 ) case 0x02: /* BRIF indirect */ if ( data & 0x4000 ) - data = GETREGS(cpustate,data&0x3f,0) - 1; + data = GETREGS(data&0x3f,0) - 1; else data = ((GETARAM()[data&0x3ff])&0xffff)-1; @@ -1433,7 +1461,7 @@ static CPU_EXECUTE( mb86233 ) GETPCS()[GETPCSP()] = GETPC(); GETPCSP()++; if ( data & 0x4000 ) - data = GETREGS(cpustate,data&0x3f,0) - 1; + data = GETREGS(data&0x3f,0) - 1; else data = ((GETARAM()[data&0x3ff])&0xffff)-1; @@ -1450,7 +1478,7 @@ static CPU_EXECUTE( mb86233 ) break; case 0x0c: /* LDIF */ - SETREGS(cpustate,((data>>9)&0x3f), GETARAM()[data&0x1FF] ); + SETREGS(((data>>9)&0x3f), GETARAM()[data&0x1FF] ); break; case 0x0e: /* RIIF */ @@ -1471,7 +1499,7 @@ static CPU_EXECUTE( mb86233 ) UINT32 subtype = ( opcode >> 16 ) & 0x0f; UINT32 data = opcode & 0xffff; - if( !COND(cpustate, cond) ) + if( !COND( cond) ) { switch( subtype ) { @@ -1481,7 +1509,7 @@ static CPU_EXECUTE( mb86233 ) case 0x02: /* BRUL indirect */ if ( data & 0x4000 ) - data = GETREGS(cpustate,data&0x3f,0) - 1; + data = GETREGS(data&0x3f,0) - 1; else data = ((GETARAM()[data&0x3ff])&0xffff)-1; @@ -1502,7 +1530,7 @@ static CPU_EXECUTE( mb86233 ) GETPCS()[GETPCSP()] = GETPC(); GETPCSP()++; if ( data & 0x4000 ) - data = GETREGS(cpustate,data&0x3f,0) - 1; + data = GETREGS(data&0x3f,0) - 1; else data = ((GETARAM()[data&0x3ff])&0xffff)-1; @@ -1519,7 +1547,7 @@ static CPU_EXECUTE( mb86233 ) break; case 0x0c: /* LDUL */ - SETREGS(cpustate,((data>>9)&0x3f), GETARAM()[data&0x1FF] ); + SETREGS(((data>>9)&0x3f), GETARAM()[data&0x1FF] ); break; case 0x0e: /* RIUL */ @@ -1546,170 +1574,12 @@ static CPU_EXECUTE( mb86233 ) else --GETREPS(); - cpustate->icount--; + m_icount--; } else { - cpustate->icount = 0; + m_icount = 0; } } } -/*************************************************************************** - Information Setters -***************************************************************************/ - -static CPU_SET_INFO( mb86233 ) -{ - mb86233_state *cpustate = get_safe_token(device); - - switch (state) - { - case CPUINFO_INT_PC: - case CPUINFO_INT_REGISTER + MB86233_PC: GETPC() = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_A: GETA().u = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_B: GETB().u = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_P: GETP().u = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_D: GETD().u = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_REP: GETREPS() = info->i; break; - case CPUINFO_INT_SP: - case CPUINFO_INT_REGISTER + MB86233_SP: GETPCSP() = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_EB: GETEB() = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_SHIFT: GETSHIFT() = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_FLAGS: GETSR() = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R0: GETGPR(0) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R1: GETGPR(1) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R2: GETGPR(2) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R3: GETGPR(3) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R4: GETGPR(4) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R5: GETGPR(5) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R6: GETGPR(6) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R7: GETGPR(7) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R8: GETGPR(8) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R9: GETGPR(9) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R10: GETGPR(10) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R11: GETGPR(11) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R12: GETGPR(12) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R13: GETGPR(13) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R14: GETGPR(14) = info->i; break; - case CPUINFO_INT_REGISTER + MB86233_R15: GETGPR(15) = info->i; break; - } -} - -/*************************************************************************** - Information Getters -***************************************************************************/ - -CPU_GET_INFO( mb86233 ) -{ - mb86233_state *cpustate = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL; - - switch (state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - 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; - case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break; - case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break; - case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 4; break; - case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 4; break; - case CPUINFO_INT_MIN_CYCLES: info->i = 1; break; - case CPUINFO_INT_MAX_CYCLES: info->i = 2; break; - - case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 32; break; - case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 32; break; - case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = -2; break; - case CPUINFO_INT_DATABUS_WIDTH + AS_DATA: info->i = 32; break; - case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA: info->i = 32; break; - case CPUINFO_INT_ADDRBUS_SHIFT + AS_DATA: info->i = 0; break; - case CPUINFO_INT_DATABUS_WIDTH + AS_IO: info->i = 0; break; - case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO: info->i = 0; break; - case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO: info->i = 0; break; - - case CPUINFO_INT_PREVIOUSPC: /* not implemented */ break; - - case CPUINFO_INT_PC: - case CPUINFO_INT_REGISTER + MB86233_PC: info->i = GETPC(); break; - case CPUINFO_INT_REGISTER + MB86233_A: info->i = GETA().u; break; - case CPUINFO_INT_REGISTER + MB86233_B: info->i = GETB().u; break; - case CPUINFO_INT_REGISTER + MB86233_P: info->i = GETP().u; break; - case CPUINFO_INT_REGISTER + MB86233_D: info->i = GETD().u; break; - case CPUINFO_INT_REGISTER + MB86233_REP: info->i = GETREPS(); break; - case CPUINFO_INT_SP: - case CPUINFO_INT_REGISTER + MB86233_SP: info->i = GETPCSP(); break; - case CPUINFO_INT_REGISTER + MB86233_EB: info->i = GETEB(); break; - case CPUINFO_INT_REGISTER + MB86233_SHIFT: info->i = GETSHIFT(); break; - case CPUINFO_INT_REGISTER + MB86233_FLAGS: info->i = GETSR(); break; - case CPUINFO_INT_REGISTER + MB86233_R0: info->i = GETGPR(0); break; - case CPUINFO_INT_REGISTER + MB86233_R1: info->i = GETGPR(1); break; - case CPUINFO_INT_REGISTER + MB86233_R2: info->i = GETGPR(2); break; - case CPUINFO_INT_REGISTER + MB86233_R3: info->i = GETGPR(3); break; - case CPUINFO_INT_REGISTER + MB86233_R4: info->i = GETGPR(4); break; - case CPUINFO_INT_REGISTER + MB86233_R5: info->i = GETGPR(5); break; - case CPUINFO_INT_REGISTER + MB86233_R6: info->i = GETGPR(6); break; - case CPUINFO_INT_REGISTER + MB86233_R7: info->i = GETGPR(7); break; - case CPUINFO_INT_REGISTER + MB86233_R8: info->i = GETGPR(8); break; - case CPUINFO_INT_REGISTER + MB86233_R9: info->i = GETGPR(9); break; - case CPUINFO_INT_REGISTER + MB86233_R10: info->i = GETGPR(10); break; - case CPUINFO_INT_REGISTER + MB86233_R11: info->i = GETGPR(11); break; - case CPUINFO_INT_REGISTER + MB86233_R12: info->i = GETGPR(12); break; - case CPUINFO_INT_REGISTER + MB86233_R13: info->i = GETGPR(13); break; - case CPUINFO_INT_REGISTER + MB86233_R14: info->i = GETGPR(14); break; - case CPUINFO_INT_REGISTER + MB86233_R15: info->i = GETGPR(15); break; - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(mb86233); break; - case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(mb86233); break; - case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(mb86233); break; - case CPUINFO_FCT_EXIT: info->exit = NULL; break; - case CPUINFO_FCT_EXECUTE: info->execute = CPU_EXECUTE_NAME(mb86233); break; - case CPUINFO_FCT_BURN: info->burn = NULL; break; - case CPUINFO_FCT_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(mb86233); 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; - case CPUINFO_STR_FAMILY: strcpy(info->s, "Fujitsu MB86233"); break; - case CPUINFO_STR_VERSION: strcpy(info->s, "1.0"); break; - case CPUINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case CPUINFO_STR_CREDITS: strcpy(info->s, "Copyright Miguel Angel Horna and Ernesto Corvi"); break; - - case CPUINFO_STR_FLAGS: - sprintf(info->s, "%c%c", (GETSR()&SIGN_FLAG) ? 'N' : 'n', (GETSR()&ZERO_FLAG) ? 'Z' : 'z' ); - break; - - case CPUINFO_STR_REGISTER + MB86233_FLAGS: - sprintf(info->s, "FL:%c%c", (GETSR()&SIGN_FLAG) ? 'N' : 'n', (GETSR()&ZERO_FLAG) ? 'Z' : 'z' ); - break; - - case CPUINFO_STR_REGISTER + MB86233_PC: sprintf(info->s, "PC:%04X", GETPC()); break; - case CPUINFO_STR_REGISTER + MB86233_A: sprintf(info->s, "PA:%08X (%f)", GETA().u, GETA().f); break; - case CPUINFO_STR_REGISTER + MB86233_B: sprintf(info->s, "PB:%08X (%f)", GETB().u, GETB().f); break; - case CPUINFO_STR_REGISTER + MB86233_P: sprintf(info->s, "PP:%08X (%f)", GETP().u, GETP().f); break; - case CPUINFO_STR_REGISTER + MB86233_D: sprintf(info->s, "PD:%08X (%f)", GETD().u, GETD().f); break; - case CPUINFO_STR_REGISTER + MB86233_REP: sprintf(info->s, "REPS:%08X", GETREPS()); break; - case CPUINFO_STR_REGISTER + MB86233_SP: sprintf(info->s, "PCSP:%1X", GETPCSP()); break; - case CPUINFO_STR_REGISTER + MB86233_EB: sprintf(info->s, "EB:%08X", GETEB()); break; - case CPUINFO_STR_REGISTER + MB86233_SHIFT: sprintf(info->s, "SHIFT:%08X", GETSHIFT()); break; - case CPUINFO_STR_REGISTER + MB86233_R0: sprintf(info->s, "R0:%08X", GETGPR(0)); break; - case CPUINFO_STR_REGISTER + MB86233_R1: sprintf(info->s, "R1:%08X", GETGPR(1)); break; - case CPUINFO_STR_REGISTER + MB86233_R2: sprintf(info->s, "R2:%08X", GETGPR(2)); break; - case CPUINFO_STR_REGISTER + MB86233_R3: sprintf(info->s, "R3:%08X", GETGPR(3)); break; - case CPUINFO_STR_REGISTER + MB86233_R4: sprintf(info->s, "R4:%08X", GETGPR(4)); break; - case CPUINFO_STR_REGISTER + MB86233_R5: sprintf(info->s, "R5:%08X", GETGPR(5)); break; - case CPUINFO_STR_REGISTER + MB86233_R6: sprintf(info->s, "R6:%08X", GETGPR(6)); break; - case CPUINFO_STR_REGISTER + MB86233_R7: sprintf(info->s, "R7:%08X", GETGPR(7)); break; - case CPUINFO_STR_REGISTER + MB86233_R8: sprintf(info->s, "R8:%08X", GETGPR(8)); break; - case CPUINFO_STR_REGISTER + MB86233_R9: sprintf(info->s, "R9:%08X", GETGPR(9)); break; - case CPUINFO_STR_REGISTER + MB86233_R10: sprintf(info->s, "R10:%08X", GETGPR(10)); break; - case CPUINFO_STR_REGISTER + MB86233_R11: sprintf(info->s, "R11:%08X", GETGPR(11)); break; - case CPUINFO_STR_REGISTER + MB86233_R12: sprintf(info->s, "R12:%08X", GETGPR(12)); break; - case CPUINFO_STR_REGISTER + MB86233_R13: sprintf(info->s, "R13:%08X", GETGPR(13)); break; - case CPUINFO_STR_REGISTER + MB86233_R14: sprintf(info->s, "R14:%08X", GETGPR(14)); break; - case CPUINFO_STR_REGISTER + MB86233_R15: sprintf(info->s, "R15:%08X", GETGPR(15)); break; - } -} - -DEFINE_LEGACY_CPU_DEVICE(MB86233, mb86233); diff --git a/src/emu/cpu/mb86233/mb86233.h b/src/emu/cpu/mb86233/mb86233.h index 03dae885dab..1320c3f67b9 100644 --- a/src/emu/cpu/mb86233/mb86233.h +++ b/src/emu/cpu/mb86233/mb86233.h @@ -38,20 +38,105 @@ enum MB86233_R15 }; -/*************************************************************************** - STRUCTURES -***************************************************************************/ -typedef int (*mb86233_fifo_read_func)(device_t *device, UINT32 *data); -typedef void (*mb86233_fifo_write_func)(device_t *device, UINT32 data); +#define MCFG_MB86233_FIFO_READ_CB(_devcb) mb86233_cpu_device::set_fifo_read_cb(*device, DEVCB2_##_devcb); +#define MCFG_MB86233_FIFO_READ_OK_CB(_devcb) mb86233_cpu_device::set_fifo_read_ok_cb(*device, DEVCB2_##_devcb); +#define MCFG_MB86233_FIFO_WRITE_CB(_devcb) mb86233_cpu_device::set_fifo_write_cb(*device, DEVCB2_##_devcb); +#define MCFG_MB86233_TABLE_REGION(_region) mb86233_cpu_device::set_tablergn(*device, _region); -struct mb86233_cpu_core + +class mb86233_cpu_device : public cpu_device { - mb86233_fifo_read_func fifo_read_cb; - mb86233_fifo_write_func fifo_write_cb; - const char *tablergn; +public: + // construction/destruction + mb86233_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // static configuration helpers + template static devcb2_base &set_fifo_read_cb(device_t &device, _Object object) { return downcast(device).m_fifo_read_cb.set_callback(object); } + template static devcb2_base &set_fifo_read_ok_cb(device_t &device, _Object object) { return downcast(device).m_fifo_read_ok_cb.set_callback(object); } + template static devcb2_base &set_fifo_write_cb(device_t &device, _Object object) { return downcast(device).m_fifo_write_cb.set_callback(object); } + static void set_tablergn(device_t &device, const char *tablergn) { downcast(device).m_tablergn = tablergn; } + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + + // device_execute_interface overrides + virtual UINT32 execute_min_cycles() const { return 1; } + virtual UINT32 execute_max_cycles() const { return 2; } + virtual UINT32 execute_input_lines() const { return 0; } + virtual void execute_run(); + + // device_memory_interface overrides + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_DATA) ? &m_data_config : NULL ); } + + // device_state_interface overrides + void state_string_export(const device_state_entry &entry, astring &string); + + // device_disasm_interface overrides + virtual UINT32 disasm_min_opcode_bytes() const { return 4; } + virtual UINT32 disasm_max_opcode_bytes() const { return 4; } + virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options); + +private: + address_space_config m_program_config; + address_space_config m_data_config; + + union MB86233_REG + { + INT32 i; + UINT32 u; + float f; + }; + + UINT16 m_pc; + MB86233_REG m_a; + MB86233_REG m_b; + MB86233_REG m_d; + MB86233_REG m_p; + + UINT16 m_reps; + UINT16 m_pcs[4]; + UINT8 m_pcsp; + UINT32 m_eb; + UINT32 m_shift; + UINT32 m_repcnt; + UINT16 m_sr; + + UINT32 m_gpr[16]; + UINT32 m_extport[0x30]; + + address_space *m_program; + direct_read_data *m_direct; + int m_icount; + + /* FIFO */ + int m_fifo_wait; + devcb2_read32 m_fifo_read_cb; + devcb2_read_line m_fifo_read_ok_cb; + devcb2_write32 m_fifo_write_cb; + const char *m_tablergn; + + /* internal RAM */ + UINT32 m_RAM[2 * 0x200]; + UINT32 *m_ARAM, *m_BRAM; + UINT32 *m_Tables; + + void FLAGSF( float v ); + void FLAGSI( UINT32 v ); + int COND( UINT32 cond ); + void ALU( UINT32 alu); + UINT32 ScaleExp(unsigned int v,int scale); + UINT32 GETEXTERNAL( UINT32 EB, UINT32 offset ); + void SETEXTERNAL( UINT32 EB, UINT32 offset, UINT32 value ); + UINT32 GETREGS( UINT32 reg, int source ); + void SETREGS( UINT32 reg, UINT32 val ); + UINT32 INDIRECT( UINT32 reg, int source ); + }; -DECLARE_LEGACY_CPU_DEVICE(MB86233, mb86233); + +extern const device_type MB86233; #endif /* __MB86233_H__ */ diff --git a/src/mame/drivers/model1.c b/src/mame/drivers/model1.c index 6cd86b7da17..471828975f0 100644 --- a/src/mame/drivers/model1.c +++ b/src/mame/drivers/model1.c @@ -1594,8 +1594,11 @@ static MACHINE_CONFIG_START( model1_vr, model1_state ) MCFG_CPU_PROGRAM_MAP(model1_snd) MCFG_CPU_ADD("tgp", MB86233, 16000000) - MCFG_CPU_CONFIG(model1_vr_tgp_config) MCFG_CPU_PROGRAM_MAP(model1_vr_tgp_map) + MCFG_MB86233_FIFO_READ_CB(READ32(model1_state,copro_fifoin_pop)) + MCFG_MB86233_FIFO_READ_OK_CB(READLINE(model1_state,copro_fifoin_pop_ok)) + MCFG_MB86233_FIFO_WRITE_CB(WRITE32(model1_state,copro_fifoout_push)) + MCFG_MB86233_TABLE_REGION("user5") MCFG_MACHINE_START_OVERRIDE(model1_state,model1) MCFG_MACHINE_RESET_OVERRIDE(model1_state,model1_vr) diff --git a/src/mame/drivers/model2.c b/src/mame/drivers/model2.c index 5867bd26846..e737ac6d0da 100644 --- a/src/mame/drivers/model2.c +++ b/src/mame/drivers/model2.c @@ -147,6 +147,32 @@ static int copro_fifoin_pop(device_t *device, UINT32 *result) return 1; } +READ_LINE_MEMBER(model2_state::copro_tgp_fifoin_pop_ok) +{ + if (m_copro_fifoin_num == 0) + { + return CLEAR_LINE; + } + + return ASSERT_LINE; +} + + +READ32_MEMBER(model2_state::copro_tgp_fifoin_pop) +{ + UINT32 r = m_copro_fifoin_data[m_copro_fifoin_rpos++]; + + if (m_copro_fifoin_rpos == COPRO_FIFOIN_SIZE) + { + m_copro_fifoin_rpos = 0; + } + + m_copro_fifoin_num--; + + return r; +} + + static void copro_fifoin_push(device_t *device, UINT32 data) { model2_state *state = device->machine().driver_data(); @@ -256,6 +282,25 @@ static void copro_fifoout_push(device_t *device, UINT32 data) } } +WRITE32_MEMBER(model2_state::copro_tgp_fifoout_push) +{ + if (m_copro_fifoout_num == COPRO_FIFOOUT_SIZE) + { + fatalerror("Copro FIFOOUT overflow (at %08X)\n", m_tgp->pc()); + return; + } + +// logerror("COPRO FIFOOUT PUSH %08X, %f, %d\n", data, *(float*)&data,m_copro_fifoout_num); + + m_copro_fifoout_data[m_copro_fifoout_wpos++] = data; + if (m_copro_fifoout_wpos == COPRO_FIFOOUT_SIZE) + { + m_copro_fifoout_wpos = 0; + } + + m_copro_fifoout_num++; +} + /* Timers - these count down at 25 MHz and pull IRQ2 when they hit 0 */ READ32_MEMBER(model2_state::timers_r) { @@ -1951,15 +1996,6 @@ ADDRESS_MAP_END /*****************************************************************************/ -static const mb86233_cpu_core tgp_config = -{ - copro_fifoin_pop, - copro_fifoout_push, - "user5", -}; - - - /* original Model 2 */ static MACHINE_CONFIG_START( model2o, model2_state ) MCFG_CPU_ADD("maincpu", I960, 25000000) @@ -1970,8 +2006,12 @@ static MACHINE_CONFIG_START( model2o, model2_state ) MCFG_CPU_PROGRAM_MAP(model1_snd) MCFG_CPU_ADD("tgp", MB86233, 16000000) - MCFG_CPU_CONFIG(tgp_config) MCFG_CPU_PROGRAM_MAP(copro_tgp_map) + MCFG_MB86233_FIFO_READ_CB(READ32(model2_state,copro_tgp_fifoin_pop)) + MCFG_MB86233_FIFO_READ_OK_CB(READLINE(model2_state,copro_tgp_fifoin_pop_ok)) + MCFG_MB86233_FIFO_WRITE_CB(WRITE32(model2_state,copro_tgp_fifoout_push)) + MCFG_MB86233_TABLE_REGION("user5") + MCFG_MACHINE_START_OVERRIDE(model2_state,model2) MCFG_MACHINE_RESET_OVERRIDE(model2_state,model2o) @@ -2029,8 +2069,12 @@ static MACHINE_CONFIG_START( model2a, model2_state ) MCFG_CPU_PROGRAM_MAP(model2_snd) MCFG_CPU_ADD("tgp", MB86233, 16000000) - MCFG_CPU_CONFIG(tgp_config) MCFG_CPU_PROGRAM_MAP(copro_tgp_map) + MCFG_MB86233_FIFO_READ_CB(READ32(model2_state,copro_tgp_fifoin_pop)) + MCFG_MB86233_FIFO_READ_OK_CB(READLINE(model2_state,copro_tgp_fifoin_pop_ok)) + MCFG_MB86233_FIFO_WRITE_CB(WRITE32(model2_state,copro_tgp_fifoout_push)) + MCFG_MB86233_TABLE_REGION("user5") + MCFG_MACHINE_START_OVERRIDE(model2_state,model2) MCFG_MACHINE_RESET_OVERRIDE(model2_state,model2) diff --git a/src/mame/includes/model1.h b/src/mame/includes/model1.h index 96af7f6161f..ab2b215554f 100644 --- a/src/mame/includes/model1.h +++ b/src/mame/includes/model1.h @@ -16,6 +16,7 @@ public: m_multipcm_1(*this, "sega1"), m_multipcm_2(*this, "sega2"), m_dsbz80(*this, DSBZ80_TAG), + m_tgp(*this, "tgp"), m_mr2(*this, "mr2"), m_mr(*this, "mr"), m_display_list0(*this, "display_list0"), @@ -27,6 +28,7 @@ public: required_device m_multipcm_1; required_device m_multipcm_2; optional_device m_dsbz80; // Digital Sound Board + optional_device m_tgp; required_shared_ptr m_mr2; required_shared_ptr m_mr; @@ -148,12 +150,14 @@ public: void irq_raise(int level); void irq_init(); IRQ_CALLBACK_MEMBER(irq_callback); + DECLARE_READ_LINE_MEMBER(copro_fifoin_pop_ok); + DECLARE_READ32_MEMBER(copro_fifoin_pop); + DECLARE_WRITE32_MEMBER(copro_fifoout_push); }; /*----------- defined in machine/model1.c -----------*/ -extern const mb86233_cpu_core model1_vr_tgp_config; ADDRESS_MAP_EXTERN( model1_vr_tgp_map, 32 ); void model1_vr_tgp_reset( running_machine &machine ); diff --git a/src/mame/includes/model2.h b/src/mame/includes/model2.h index d1c96c20099..d5c0376b9db 100644 --- a/src/mame/includes/model2.h +++ b/src/mame/includes/model2.h @@ -189,6 +189,9 @@ public: TIMER_DEVICE_CALLBACK_MEMBER(model2c_interrupt); void model2_exit(); DECLARE_WRITE_LINE_MEMBER(scsp_irq); + DECLARE_READ_LINE_MEMBER(copro_tgp_fifoin_pop_ok); + DECLARE_READ32_MEMBER(copro_tgp_fifoin_pop); + DECLARE_WRITE32_MEMBER(copro_tgp_fifoout_push); }; /*----------- defined in video/model2.c -----------*/ diff --git a/src/mame/machine/model1.c b/src/mame/machine/model1.c index 5c7a2135454..e0154fb2ece 100644 --- a/src/mame/machine/model1.c +++ b/src/mame/machine/model1.c @@ -2047,30 +2047,31 @@ void model1_vr_tgp_reset( running_machine &machine ) } /* FIFO */ -static int copro_fifoin_pop(device_t *device, UINT32 *result) +READ_LINE_MEMBER(model1_state::copro_fifoin_pop_ok) { - model1_state *state = device->machine().driver_data(); - UINT32 r; - - if (state->m_copro_fifoin_num == 0) + if (m_copro_fifoin_num == 0) { - return 0; + return CLEAR_LINE; } - r = state->m_copro_fifoin_data[state->m_copro_fifoin_rpos++]; - - if (state->m_copro_fifoin_rpos == FIFO_SIZE) - { - state->m_copro_fifoin_rpos = 0; - } - - state->m_copro_fifoin_num--; - - *result = r; - - return 1; + return ASSERT_LINE; } +READ32_MEMBER(model1_state::copro_fifoin_pop) +{ + UINT32 r = m_copro_fifoin_data[m_copro_fifoin_rpos++]; + + if (m_copro_fifoin_rpos == FIFO_SIZE) + { + m_copro_fifoin_rpos = 0; + } + + m_copro_fifoin_num--; + + return r; +} + + static void copro_fifoin_push(address_space &space, UINT32 data) { model1_state *state = space.machine().driver_data(); @@ -2117,23 +2118,22 @@ static UINT32 copro_fifoout_pop(address_space &space) return r; } -static void copro_fifoout_push(device_t *device, UINT32 data) +WRITE32_MEMBER(model1_state::copro_fifoout_push) { - model1_state *state = device->machine().driver_data(); - if (state->m_copro_fifoout_num == FIFO_SIZE) + if (m_copro_fifoout_num == FIFO_SIZE) { - fatalerror("Copro FIFOOUT overflow (at %08X)\n", device->safe_pc()); + fatalerror("Copro FIFOOUT overflow (at %08X)\n", m_tgp->pc()); return; } - state->m_copro_fifoout_data[state->m_copro_fifoout_wpos++] = data; + m_copro_fifoout_data[m_copro_fifoout_wpos++] = data; - if (state->m_copro_fifoout_wpos == FIFO_SIZE) + if (m_copro_fifoout_wpos == FIFO_SIZE) { - state->m_copro_fifoout_wpos = 0; + m_copro_fifoout_wpos = 0; } - state->m_copro_fifoout_num++; + m_copro_fifoout_num++; } READ32_MEMBER(model1_state::copro_ram_r) @@ -2222,14 +2222,6 @@ WRITE16_MEMBER(model1_state::model1_vr_tgp_w) m_vr_w = (m_vr_w & 0xffff0000) | data; } -/* TGP config */ -const mb86233_cpu_core model1_vr_tgp_config = -{ - copro_fifoin_pop, - copro_fifoout_push, - "user5" -}; - /* TGP memory map */ ADDRESS_MAP_START( model1_vr_tgp_map, AS_PROGRAM, 32, model1_state ) AM_RANGE(0x00000000, 0x000007ff) AM_RAM AM_REGION("tgp", 0)