Checkpoint (nw)

This commit is contained in:
angelosa 2016-06-23 18:30:46 +02:00
parent 64f9a674d1
commit a0bd75459b
3 changed files with 23 additions and 13 deletions

View File

@ -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;
}
}

View File

@ -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

View File

@ -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?