From cca406d348c47a16b6871752867cc8bcb903db99 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Fri, 19 Sep 2014 20:52:03 +0000 Subject: [PATCH] special functions hookup. sqrt is probably newton (nw) --- src/mame/drivers/r2dx_v33.c | 113 ++++++++++++++---------------------- 1 file changed, 45 insertions(+), 68 deletions(-) diff --git a/src/mame/drivers/r2dx_v33.c b/src/mame/drivers/r2dx_v33.c index 5c4637e2311..cbb0740a3a1 100644 --- a/src/mame/drivers/r2dx_v33.c +++ b/src/mame/drivers/r2dx_v33.c @@ -32,22 +32,21 @@ public: r2dx_v33_state(const machine_config &mconfig, device_type type, const char *tag) : raiden2_state(mconfig, type, tag), m_eeprom(*this, "eeprom"), + m_math(*this, "math"), m_r2dxbank(0), m_r2dxgameselect(0) { } optional_device m_eeprom; + required_memory_region m_math; DECLARE_WRITE16_MEMBER(r2dx_angle_w); - - DECLARE_WRITE16_MEMBER(r2dx_unk1_w); - DECLARE_WRITE16_MEMBER(r2dx_unk2_w); DECLARE_WRITE16_MEMBER(r2dx_dx_w); DECLARE_WRITE16_MEMBER(r2dx_dy_w); - - DECLARE_READ16_MEMBER(rdx_angle_r); - DECLARE_READ16_MEMBER(rdx_dist_r); - + DECLARE_WRITE16_MEMBER(r2dx_sdistl_w); + DECLARE_WRITE16_MEMBER(r2dx_sdisth_w); + DECLARE_READ16_MEMBER(r2dx_angle_r); + DECLARE_READ16_MEMBER(r2dx_dist_r); DECLARE_READ16_MEMBER(r2dx_sin_r); DECLARE_READ16_MEMBER(r2dx_cos_r); @@ -71,8 +70,6 @@ public: DECLARE_DRIVER_INIT(nzerotea); DECLARE_DRIVER_INIT(zerotm2k); - DECLARE_READ16_MEMBER(rdx_v33_unknown2_r); - void r2dx_setbanking(void); DECLARE_MACHINE_RESET(r2dx_v33); @@ -82,6 +79,9 @@ public: int m_r2dxgameselect; INT16 m_r2dx_angle; + UINT16 r2dx_i_dx, r2dx_i_dy, r2dx_i_angle; + UINT32 r2dx_i_sdist; + UINT32 screen_update_rdx_v33(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(rdx_v33_interrupt); void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect,int pri); @@ -232,69 +232,51 @@ WRITE16_MEMBER(r2dx_v33_state::r2dx_rom_bank_w) } -//Olivier Galibert: ok, write angle at 428, get sin/cos results at 434/436 -//Olivier Galibert: 16-bits signed -//Olivier Galibert: write dx/dy at 424/426, get dist and angle at 432/430 - -// Angle protection 1: -// writes angle WRITE16_MEMBER(r2dx_v33_state::r2dx_angle_w) { - m_r2dx_angle = data; + COMBINE_DATA(&r2dx_i_angle); } -// reads sin and cos -READ16_MEMBER(r2dx_v33_state::r2dx_sin_r) -{ - double angle = m_r2dx_angle * M_PI / 128; - return int(4096*sin(angle)); -} - -READ16_MEMBER(r2dx_v33_state::r2dx_cos_r) -{ - double angle = m_r2dx_angle * M_PI / 128; - return int(4096*cos(angle)); -} - -// Angle protection 2: -// write 2 co-ordinates? WRITE16_MEMBER(r2dx_v33_state::r2dx_dx_w) { - + COMBINE_DATA(&r2dx_i_dx); } WRITE16_MEMBER(r2dx_v33_state::r2dx_dy_w) { - + COMBINE_DATA(&r2dx_i_dy); } -WRITE16_MEMBER(r2dx_v33_state::r2dx_unk1_w) +READ16_MEMBER(r2dx_v33_state::r2dx_angle_r) { - + return m_math->base()[((r2dx_i_dy & 0xff) << 8) | (r2dx_i_dx & 0xff)]; } -WRITE16_MEMBER(r2dx_v33_state::r2dx_unk2_w) +READ16_MEMBER(r2dx_v33_state::r2dx_dist_r) { - + return sqrt(double(r2dx_i_sdist)); } -// reads angle and distance -READ16_MEMBER(r2dx_v33_state::rdx_angle_r) +READ16_MEMBER(r2dx_v33_state::r2dx_sin_r) { - return 0x0000; + int off = 65536 + (r2dx_i_angle & 0xff)*4; + return (m_math->base()[off+0]) | (m_math->base()[off+1] << 8); } -READ16_MEMBER(r2dx_v33_state::rdx_dist_r) +READ16_MEMBER(r2dx_v33_state::r2dx_cos_r) { - return 0x0000; + int off = 65536 + (r2dx_i_angle & 0xff)*4; + return (m_math->base()[off+2]) | (m_math->base()[off+3] << 8); } - - -READ16_MEMBER(r2dx_v33_state::rdx_v33_unknown2_r) +WRITE16_MEMBER(r2dx_v33_state::r2dx_sdistl_w) { - // debug port maybe? read on R2 startup, player can't die if you return 0x0000 - return 0xffff; + r2dx_i_sdist = (r2dx_i_sdist & (0xffff0000 | UINT16(~mem_mask))) | (data & mem_mask); +} + +WRITE16_MEMBER(r2dx_v33_state::r2dx_sdisth_w) +{ + r2dx_i_sdist = (r2dx_i_sdist & (0x0000ffff | (UINT16(~mem_mask)) << 16)) | ((data & mem_mask) << 16); } static ADDRESS_MAP_START( rdx_v33_map, AS_PROGRAM, 16, r2dx_v33_state ) @@ -307,16 +289,14 @@ static ADDRESS_MAP_START( rdx_v33_map, AS_PROGRAM, 16, r2dx_v33_state ) AM_RANGE(0x00404, 0x00405) AM_WRITE(r2dx_rom_bank_w) AM_RANGE(0x00406, 0x00407) AM_WRITE(tile_bank_w) - AM_RANGE(0x00420, 0x00421) AM_WRITE(r2dx_unk1_w) - AM_RANGE(0x00422, 0x00423) AM_WRITE(r2dx_unk2_w) - AM_RANGE(0x00424, 0x00425) AM_WRITE(r2dx_dx_w) - AM_RANGE(0x00426, 0x00427) AM_WRITE(r2dx_dy_w) - + AM_RANGE(0x00420, 0x00421) AM_WRITE(r2dx_dx_w) + AM_RANGE(0x00422, 0x00423) AM_WRITE(r2dx_dy_w) + AM_RANGE(0x00424, 0x00425) AM_WRITE(r2dx_sdistl_w) + AM_RANGE(0x00426, 0x00427) AM_WRITE(r2dx_sdisth_w) AM_RANGE(0x00428, 0x00429) AM_WRITE(r2dx_angle_w) - AM_RANGE(0x00430, 0x00431) AM_READ(rdx_angle_r) - AM_RANGE(0x00432, 0x00433) AM_READ(rdx_dist_r) - + AM_RANGE(0x00430, 0x00431) AM_READ(r2dx_angle_r) + AM_RANGE(0x00432, 0x00433) AM_READ(r2dx_dist_r) AM_RANGE(0x00434, 0x00435) AM_READ(r2dx_sin_r) AM_RANGE(0x00436, 0x00437) AM_READ(r2dx_cos_r) @@ -343,7 +323,6 @@ static ADDRESS_MAP_START( rdx_v33_map, AS_PROGRAM, 16, r2dx_v33_state ) AM_RANGE(0x00700, 0x00701) AM_WRITE(rdx_v33_eeprom_w) - AM_RANGE(0x00740, 0x00741) AM_READ(rdx_v33_unknown2_r) AM_RANGE(0x00744, 0x00745) AM_READ_PORT("INPUT") AM_RANGE(0x0074c, 0x0074d) AM_READ_PORT("SYSTEM") AM_RANGE(0x00762, 0x00763) AM_READ(sprite_prot_dst1_r) @@ -377,16 +356,14 @@ static ADDRESS_MAP_START( nzeroteam_base_map, AS_PROGRAM, 16, r2dx_v33_state ) // 0x404 is bank on r2dx, this doesn't need it // AM_RANGE(0x00406, 0x00407) AM_WRITE(tile_bank_w) // not the same? - AM_RANGE(0x00420, 0x00421) AM_WRITE(r2dx_unk1_w) - AM_RANGE(0x00422, 0x00423) AM_WRITE(r2dx_unk2_w) - AM_RANGE(0x00424, 0x00425) AM_WRITE(r2dx_dx_w) - AM_RANGE(0x00426, 0x00427) AM_WRITE(r2dx_dy_w) - + AM_RANGE(0x00420, 0x00421) AM_WRITE(r2dx_dx_w) + AM_RANGE(0x00422, 0x00423) AM_WRITE(r2dx_dy_w) + AM_RANGE(0x00424, 0x00425) AM_WRITE(r2dx_sdistl_w) + AM_RANGE(0x00426, 0x00427) AM_WRITE(r2dx_sdisth_w) AM_RANGE(0x00428, 0x00429) AM_WRITE(r2dx_angle_w) - AM_RANGE(0x00430, 0x00431) AM_READ(rdx_angle_r) - AM_RANGE(0x00432, 0x00433) AM_READ(rdx_dist_r) - + AM_RANGE(0x00430, 0x00431) AM_READ(r2dx_angle_r) + AM_RANGE(0x00432, 0x00433) AM_READ(r2dx_dist_r) AM_RANGE(0x00434, 0x00435) AM_READ(r2dx_sin_r) AM_RANGE(0x00436, 0x00437) AM_READ(r2dx_cos_r) @@ -875,7 +852,7 @@ ROM_START( r2dx_v33 ) ROM_REGION( 0x100000, "oki", 0 ) /* ADPCM samples */ ROM_LOAD( "pcm.099", 0x00000, 0x100000, CRC(97ca2907) SHA1(bfe8189300cf72089d0beaeab8b1a0a1a4f0a5b6) ) - ROM_REGION( 0x40000, "user2", 0 ) /* SEI333 (AKA COPX-D3) data */ + ROM_REGION( 0x40000, "math", 0 ) /* SEI333 (AKA COPX-D3) data */ ROM_LOAD( "copx_d3.357", 0x00000, 0x20000, CRC(fa2cf3ad) SHA1(13eee40704d3333874b6e3da9ee7d969c6dc662a) ) ROM_REGION16_BE( 0x80, "eeprom", 0 ) @@ -902,7 +879,7 @@ ROM_START( r2dx_v33_r2 ) ROM_REGION( 0x100000, "oki", 0 ) /* ADPCM samples */ ROM_LOAD( "pcm.099", 0x00000, 0x100000, CRC(97ca2907) SHA1(bfe8189300cf72089d0beaeab8b1a0a1a4f0a5b6) ) - ROM_REGION( 0x40000, "user2", 0 ) /* SEI333 (AKA COPX-D3) data */ + ROM_REGION( 0x40000, "math", 0 ) /* SEI333 (AKA COPX-D3) data */ ROM_LOAD( "copx_d3.357", 0x00000, 0x20000, CRC(fa2cf3ad) SHA1(13eee40704d3333874b6e3da9ee7d969c6dc662a) ) ROM_REGION16_BE( 0x80, "eeprom", 0 ) @@ -917,7 +894,7 @@ ROM_START( nzeroteam ) /* V33 SYSTEM TYPE_B hardware, uses SEI333 (AKA COPX-D3) ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF ) /* v33 main cpu */ - ROM_REGION( 0x40000, "user2", 0 ) /* SEI333 (AKA COPX-D3) data */ + ROM_REGION( 0x40000, "math", 0 ) /* SEI333 (AKA COPX-D3) data */ ROM_LOAD( "copx-d3.bin", 0x00000, 0x20000, CRC(fa2cf3ad) SHA1(13eee40704d3333874b6e3da9ee7d969c6dc662a) ) /* Not from this set, but same data as Zero Team 2000 & Raiden II New */ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k code for sound Z80 */ @@ -949,7 +926,7 @@ ROM_START( zerotm2k ) /* V33 SYSTEM TYPE_C VER2 hardware, uses SEI333 (AKA COPX- ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF ) /* v33 main cpu */ - ROM_REGION( 0x40000, "user2", 0 ) /* SEI333 (AKA COPX-D3) data */ + ROM_REGION( 0x40000, "math", 0 ) /* SEI333 (AKA COPX-D3) data */ ROM_LOAD( "mx27c1000mc.u0366", 0x00000, 0x20000, CRC(fa2cf3ad) SHA1(13eee40704d3333874b6e3da9ee7d969c6dc662a) ) /* PCB silkscreened 333ROM */ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k code for sound Z80 */