diff --git a/src/emu/cpu/i386/i386dasm.c b/src/emu/cpu/i386/i386dasm.c index 57737434e1e..2a74503d81e 100644 --- a/src/emu/cpu/i386/i386dasm.c +++ b/src/emu/cpu/i386/i386dasm.c @@ -98,6 +98,7 @@ enum #define ALWAYS64 0x400 #define SPECIAL64 0x800 #define SPECIAL64_ENT(x) (SPECIAL64 | ((x) << 24)) +#define GROUP_MOD 0x1000 struct I386_OPCODE { const char *mnemonic; @@ -425,10 +426,7 @@ static const I386_OPCODE i386_opcode_table2[256] = "movupd\0" "movsd\0" "movss", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 }, - {"movlps\0" - "movlpd\0" - "movddup\0" - "movsldup", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, + {"group0F12", GROUP|GROUP_MOD, 0, 0, 0 }, {"movlps\0" "movlpd\0" "???\0" @@ -441,14 +439,11 @@ static const I386_OPCODE i386_opcode_table2[256] = "unpckhpd\0" "???\0" "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, + { "group0F16", GROUP|GROUP_MOD, 0, 0, 0 }, {"movhps\0" "movhpd\0" "???\0" - "movshdup", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 }, - {"movhps\0" - "movhpd\0" - "???\0" - "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, + "???", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 }, {"group0F18", GROUP, 0, 0, 0 }, {"nop_hint", 0, PARAM_RMPTR8, 0, 0 }, {"nop_hint", 0, PARAM_RMPTR8, 0, 0 }, @@ -1810,6 +1805,46 @@ static const I386_OPCODE group0F0D_table[8] = {"???", 0, 0, 0, 0 } }; +static const I386_OPCODE group0F12_table[4] = +{ + { "movlps\0" + "movlpd\0" + "movddup\0" + "movsldup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, + { "movlps\0" + "movlpd\0" + "movddup\0" + "movsldup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, + { "movlps\0" + "movlpd\0" + "movddup\0" + "movsldup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, + { "movhlps\0" + "???\0" + "movddup\0" + "movsldup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 } +}; + +static const I386_OPCODE group0F16_table[4] = +{ + { "movhps\0" + "movhpd\0" + "???\0" + "movshdup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, + { "movhps\0" + "movhpd\0" + "???\0" + "movshdup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, + { "movhps\0" + "movhpd\0" + "???\0" + "movshdup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, + { "movlhps\0" + "movhpd\0" + "???\0" + "movshdup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 } +}; + static const I386_OPCODE group0F18_table[8] = { {"prefetchnta", 0, PARAM_RM8, 0, 0 }, @@ -1916,7 +1951,9 @@ static const GROUP_OP group_op_table[] = { "group0F00", group0F00_table }, { "group0F01", group0F01_table }, { "group0F0D", group0F0D_table }, - { "group0F18", group0F18_table }, + { "group0F12", group0F12_table }, + { "group0F16", group0F16_table }, + { "group0F18", group0F18_table }, { "group0F71", group0F71_table }, { "group0F72", group0F72_table }, { "group0F73", group0F73_table }, @@ -1954,6 +1991,7 @@ static UINT8 curmode; #define MODRM_REG1 ((modrm >> 3) & 0x7) #define MODRM_REG2 (modrm & 0x7) +#define MODRM_MOD ((modrm >> 6) & 0x3) INLINE UINT8 FETCH(void) { @@ -2959,7 +2997,10 @@ static void decode_opcode(char *s, const I386_OPCODE *op, UINT8 op1) handle_modrm( modrm_string ); for( i=0; i < ARRAY_LENGTH(group_op_table); i++ ) { if( strcmp(op->mnemonic, group_op_table[i].mnemonic) == 0 ) { - decode_opcode( s, &group_op_table[i].opcode[MODRM_REG1], op1 ); + if (op->flags & GROUP_MOD) + decode_opcode( s, &group_op_table[i].opcode[MODRM_MOD], op1 ); + else + decode_opcode( s, &group_op_table[i].opcode[MODRM_REG1], op1 ); return; } } diff --git a/src/emu/cpu/powerpc/ppccom.c b/src/emu/cpu/powerpc/ppccom.c index b0b12409e7f..22f9209d3a5 100644 --- a/src/emu/cpu/powerpc/ppccom.c +++ b/src/emu/cpu/powerpc/ppccom.c @@ -693,6 +693,8 @@ void ppc_device::device_start() m_hotspot_select = 0; memset(m_hotspot, 0, sizeof(m_hotspot)); + m_debugger_temp = 0; + m_cache_line_size = 32; m_cpu_clock = clock(); m_program = &space(AS_PROGRAM); diff --git a/src/mame/drivers/zn.c b/src/mame/drivers/zn.c index af0ac51738c..5dbcb907960 100644 --- a/src/mame/drivers/zn.c +++ b/src/mame/drivers/zn.c @@ -83,6 +83,7 @@ public: DECLARE_READ16_MEMBER(bam2_unk_r); DECLARE_WRITE16_MEMBER(acpsx_00_w); DECLARE_WRITE16_MEMBER(acpsx_10_w); + DECLARE_WRITE16_MEMBER(nbajamex_bank_w); DECLARE_WRITE16_MEMBER(nbajamex_80_w); DECLARE_READ16_MEMBER(nbajamex_08_r); DECLARE_READ16_MEMBER(nbajamex_80_r); @@ -2034,17 +2035,55 @@ WRITE16_MEMBER(zn_state::acpsx_00_w) verboselog(0, "acpsx_00_w( %08x, %08x, %08x )\n", offset, data, mem_mask ); } +WRITE16_MEMBER(zn_state::nbajamex_bank_w) +{ + UINT32 newbank = 0; + + verboselog(0, "nbajamex_bank_w( %08x, %08x, %08x )\n", offset, data, mem_mask ); + + if (offset > 1) + { + logerror("Unknown banking offset %x!\n", offset); + } + + if (offset == 1) + { + data -= 1; + } + + if (data <= 1) + { + newbank = (data * 0x400000); + } + else if (data >= 0x10) + { + data -= 0x10; + newbank = (data * 0x400000); + newbank += 0x200000; + } + + if (offset == 0) + { + membank( "bankedroms" )->set_base( memregion( "bankedroms" )->base() + newbank); + } + else if (offset == 1) + { + newbank += 0x200000; + membank( "bankedroms2" )->set_base( memregion( "bankedroms" )->base() + newbank); + } +} + WRITE16_MEMBER(zn_state::acpsx_10_w) { verboselog(0, "acpsx_10_w( %08x, %08x, %08x )\n", offset, data, mem_mask ); } +// all 16 bits goes to the external soundboard's latch (see sound test menu) WRITE16_MEMBER(zn_state::nbajamex_80_w) { verboselog(0, "nbajamex_80_w( %08x, %08x, %08x )\n", offset, data, mem_mask ); psxirq_device *psxirq = (psxirq_device *) machine().device("maincpu:irq"); psxirq->intin10(1); - membank( "bankedroms" )->set_base( memregion( "bankedroms" )->base() + (data ? 0xe00000 : 0)); } READ16_MEMBER(zn_state::nbajamex_08_r) @@ -2054,6 +2093,7 @@ READ16_MEMBER(zn_state::nbajamex_08_r) return data; } +// possibly a readback from the external soundboard? READ16_MEMBER(zn_state::nbajamex_80_r) { UINT32 data = 0xffffffff; @@ -2070,7 +2110,8 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(nbajamex_map, AS_PROGRAM, 32, zn_state) AM_RANGE(0x1f000000, 0x1f1fffff) AM_ROMBANK("bankedroms") - AM_RANGE(0x1f200000, 0x1f207fff) AM_RAM AM_SHARE("eeprom") + AM_RANGE(0x1f200000, 0x1f7fffff) AM_ROMBANK("bankedroms2") + AM_RANGE(0x1fbfff00, 0x1fbfff07) AM_WRITE16(nbajamex_bank_w, 0xffffffff) AM_RANGE(0x1fbfff08, 0x1fbfff0b) AM_READ16(nbajamex_08_r, 0xffff) AM_RANGE(0x1fbfff80, 0x1fbfff83) AM_READWRITE16(nbajamex_80_r, nbajamex_80_w, 0xffff) @@ -2080,6 +2121,7 @@ ADDRESS_MAP_END MACHINE_RESET_MEMBER(zn_state,nbajamex) { membank( "bankedroms" )->set_base( memregion( "bankedroms" )->base() ); + membank( "bankedroms2" )->set_base( memregion( "bankedroms" )->base() + 0x200000 ); } static ADDRESS_MAP_START(jdredd_map, AS_PROGRAM, 32, zn_state) @@ -4825,7 +4867,7 @@ GAME( 1996, primrag2, atpsx, coh1000w, primrag2, driver_device, 0, ROT0, "Ata /* it in every zip file */ GAME( 1995, acpsx, 0, coh1000a, zn, driver_device, 0, ROT0, "Acclaim", "Acclaim PSX", GAME_IS_BIOS_ROOT ) -GAME( 1996, nbajamex, acpsx, nbajamex, zn, driver_device, 0, ROT0, "Acclaim", "NBA Jam Extreme", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) +GAME( 1996, nbajamex, acpsx, nbajamex, zn, driver_device, 0, ROT0, "Acclaim", "NBA Jam Extreme", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, jdredd, acpsx, jdredd, jdredd, driver_device, 0, ROT0, "Acclaim", "Judge Dredd (Rev C Dec. 17 1997)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, jdreddb, jdredd, jdredd, jdredd, driver_device, 0, ROT0, "Acclaim", "Judge Dredd (Rev B Nov. 26 1997)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )