diff --git a/src/mame/machine/seibucop/seibucop.cpp b/src/mame/machine/seibucop/seibucop.cpp index 61ea9ce7198..b4adcb40348 100644 --- a/src/mame/machine/seibucop/seibucop.cpp +++ b/src/mame/machine/seibucop/seibucop.cpp @@ -30,13 +30,19 @@ - (fixed) player walks on spot on stage clear; - several enemies seems to not like a missing min/max range limit for a specific operation? (when i.e. first boss goes to bottom of the screen and become unreachable) + - (btanb) Throw is made by quickly double jumping (!) heated barrel - gives random value to hi-score if you continue (only the first time, not a bug?); - (fixed?) throws random address exceptions at level 3 and above, a RAM address arrives corrupt in the snippet at 0x136a; - (fixed?) some corrupt sprites, probably a non-fatal version of the one above; - stage 2 boss attacks only in vertical (regressed with the 130e / 3b30 / 42c2 command merge); - (fixed) level 3+ boss movements looks wrong; - - missiles doesn't seem to like our 6200 hookup here; + - stage 3 "homing" missiles doesn't seem to like our 6200 hookup here, except it's NOT 6200!? + sd gundam + - stage 3 mid-boss still has the sprite garbage bug; + - stage 4: has sprite stuck on bottom-left of screen; + - palette dims too much on attract / continue screen. + It's known that the DMA data arrangement gives same results on a real Legionnaire board, so shrug Tech notes: @@ -331,7 +337,7 @@ WRITE16_MEMBER(raiden2cop_device::cop_pgm_data_w) logerror("addmem16 (r%x)\n", reg); break; default: - logerror("?\n"); + logerror("? %x(r%x)\n",off,reg); break; } } diff --git a/src/mame/machine/seibucop/seibucop.h b/src/mame/machine/seibucop/seibucop.h index d44df886eb9..87ef1a69fc2 100644 --- a/src/mame/machine/seibucop/seibucop.h +++ b/src/mame/machine/seibucop/seibucop.h @@ -13,20 +13,17 @@ #define LOG_Commands 0 #define LOG_Phytagoras 0 #define LOG_Division 0 +#define LOG_Move0205 0 +#define LOG_Move0905 0 #define MCFG_RAIDEN2COP_VIDEORAM_OUT_CB(_devcb) \ devcb = &raiden2cop_device::set_m_videoramout_cb(*device, DEVCB_##_devcb); -#define MCFG_CPU_IS_68K(value) \ - raiden2cop_device::set_cpu_is_68k(*device, value); - #define MCFG_RAIDEN2COP_ADD(_tag ) \ - MCFG_DEVICE_ADD(_tag, RAIDEN2COP, 0) \ - MCFG_CPU_IS_68K(0) + MCFG_DEVICE_ADD(_tag, RAIDEN2COP, 0) #define MCFG_LEGIONNACOP_ADD(_tag ) \ - MCFG_DEVICE_ADD(_tag, RAIDEN2COP, 0) \ - MCFG_CPU_IS_68K(1) + MCFG_DEVICE_ADD(_tag, RAIDEN2COP, 0) class raiden2cop_device : public device_t diff --git a/src/mame/machine/seibucop/seibucop_cmd.hxx b/src/mame/machine/seibucop/seibucop_cmd.hxx index 6987c86b5a9..19f6f2a4ad8 100644 --- a/src/mame/machine/seibucop/seibucop_cmd.hxx +++ b/src/mame/machine/seibucop/seibucop_cmd.hxx @@ -20,10 +20,13 @@ 00 - 0105 ( 00) ( 105) : (180, 2e0, 0a0, 000, 000, 000, 000, 000) 6 fffb (zeroteamsr) */ void raiden2cop_device::execute_0205(int offset, UINT16 data) -{ +{ int ppos = m_host_space->read_dword(cop_regs[0] + 0x04 + offset * 4); int npos = ppos + m_host_space->read_dword(cop_regs[0] + 0x10 + offset * 4); int delta = (npos >> 16) - (ppos >> 16); +#if LOG_Move0205 + // ... +#endif m_host_space->write_dword(cop_regs[0] + 4 + offset * 4, npos); cop_write_word(cop_regs[0] + 0x1e + offset * 4, cop_read_word(cop_regs[0] + 0x1e + offset * 4) + delta); } @@ -38,6 +41,10 @@ void raiden2cop_device::execute_0205(int offset, UINT16 data) void raiden2cop_device::execute_0904(int offset, UINT16 data) { +#if LOG_Move0905 + printf("cmd %04x: %08x %08x [%08x]\n",data, m_host_space->read_dword(cop_regs[0] + 16 + offset * 4),m_host_space->read_dword(cop_regs[0] + 0x28 + offset * 4),cop_regs[0]); +#endif + if (data&0x0001) m_host_space->write_dword(cop_regs[0] + 16 + offset * 4, m_host_space->read_dword(cop_regs[0] + 16 + offset * 4) + m_host_space->read_dword(cop_regs[0] + 0x28 + offset * 4)); else /* X Se Dae and Zero Team uses this variant */ @@ -57,7 +64,7 @@ void raiden2cop_device::execute_0904(int offset, UINT16 data) // triggered with 130e, 138e void raiden2cop_device::execute_130e(int offset, UINT16 data) { - // this can't be right + // this can't be right, or bits 15-12 from mask have different meaning ... execute_338e(offset, data); } @@ -155,7 +162,7 @@ void raiden2cop_device::execute_338e(int offset, UINT16 data) } #if LOG_Phytagoras - printf("cmd %04x: dx = %d dy = %d angle = %02x\n",data,dx,dy,cop_angle); + printf("cmd %04x: dx = %d dy = %d angle = %02x %04x\n",data,dx,dy,cop_angle); #endif if (data & 0x0080) { @@ -299,7 +306,7 @@ void raiden2cop_device::execute_6200(int offset, UINT16 data) } cop_write_word(cop_regs[primary_reg], flags); - + if (!m_host_endian) cop_write_byte(cop_regs[primary_reg] + primary_offset, angle); else // angle is a byte, but grainbow (cave mid-boss) is only happy with write-word, could be more endian weirdness, or it always writes a word?