summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Ville Linde <villedevs@gmail.com>2015-12-14 18:28:45 +0200
committer Ville Linde <villedevs@gmail.com>2015-12-14 18:31:33 +0200
commit2847b88e253acea7e27f55c40ec2da338192cef5 (patch)
treeb9ccf3ea1c54d542ba9931cff192bb89f6f6a583 /src
parent4e0b6882b3cb17f9994cfb1223f68aa4f50a4a01 (diff)
tms32051: add I/O space (nw)
Diffstat (limited to 'src')
-rw-r--r--src/devices/cpu/tms32051/32051ops.inc17
-rw-r--r--src/devices/cpu/tms32051/tms32051.cpp44
-rw-r--r--src/devices/cpu/tms32051/tms32051.h4
-rw-r--r--src/mame/drivers/taitopjc.cpp75
4 files changed, 103 insertions, 37 deletions
diff --git a/src/devices/cpu/tms32051/32051ops.inc b/src/devices/cpu/tms32051/32051ops.inc
index c52cf4a1d5d..01c09aeb818 100644
--- a/src/devices/cpu/tms32051/32051ops.inc
+++ b/src/devices/cpu/tms32051/32051ops.inc
@@ -1314,7 +1314,14 @@ void tms32051_device::op_lmmr()
void tms32051_device::op_out()
{
- fatalerror("32051: unimplemented op out at %08X\n", m_pc-1);
+ UINT16 port = ROPCODE();
+ UINT16 ea = GET_ADDRESS();
+
+ UINT16 data = DM_READ16(ea);
+ m_io->write_word(port << 1, data);
+
+ // TODO: handle repeat
+ CYCLES(3);
}
void tms32051_device::op_smmr()
@@ -1670,7 +1677,9 @@ void tms32051_device::op_clrc_intm()
void tms32051_device::op_clrc_xf()
{
- fatalerror("32051: unimplemented op clrc xf at %08X\n", m_pc-1);
+ m_st1.xf = 0;
+
+ CYCLES(1);
}
void tms32051_device::op_idle()
@@ -1790,7 +1799,9 @@ void tms32051_device::op_setc_carry()
void tms32051_device::op_setc_xf()
{
- fatalerror("32051: unimplemented op setc xf at %08X\n", m_pc-1);
+ m_st1.xf = 1;
+
+ CYCLES(1);
}
void tms32051_device::op_setc_cnf()
diff --git a/src/devices/cpu/tms32051/tms32051.cpp b/src/devices/cpu/tms32051/tms32051.cpp
index 881a28fe4e1..110a13d5a9c 100644
--- a/src/devices/cpu/tms32051/tms32051.cpp
+++ b/src/devices/cpu/tms32051/tms32051.cpp
@@ -74,6 +74,7 @@ tms32051_device::tms32051_device(const machine_config &mconfig, const char *tag,
: cpu_device(mconfig, TMS32051, "TMS32051", tag, owner, clock, "tms32051", __FILE__)
, m_program_config("program", ENDIANNESS_LITTLE, 16, 16, -1, ADDRESS_MAP_NAME(tms32051_internal_pgm))
, m_data_config("data", ENDIANNESS_LITTLE, 16, 16, -1, ADDRESS_MAP_NAME(tms32051_internal_data))
+ , m_io_config("io", ENDIANNESS_LITTLE, 16, 16, -1)
{
}
@@ -81,6 +82,7 @@ tms32051_device::tms32051_device(const machine_config &mconfig, device_type type
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_LITTLE, 16, 16, -1)
, m_data_config("data", ENDIANNESS_LITTLE, 16, 16, -1)
+ , m_io_config("io", ENDIANNESS_LITTLE, 16, 16, -1)
{
}
@@ -179,6 +181,7 @@ void tms32051_device::device_start()
m_program = &space(AS_PROGRAM);
m_direct = &m_program->direct();
m_data = &space(AS_DATA);
+ m_io = &space(AS_IO);
m_pcstack_ptr = 0;
m_op = 0;
@@ -489,6 +492,24 @@ READ16_MEMBER( tms32051_device::cpuregs_r )
case 0x28: // PDWSR
return 0;
+ case 0x50: // Memory-mapped I/O ports
+ case 0x51:
+ case 0x52:
+ case 0x53:
+ case 0x54:
+ case 0x55:
+ case 0x56:
+ case 0x57:
+ case 0x58:
+ case 0x59:
+ case 0x5a:
+ case 0x5b:
+ case 0x5c:
+ case 0x5d:
+ case 0x5e:
+ case 0x5f:
+ return m_io->read_word(offset << 1);
+
default:
if (!space.debugger_access())
fatalerror("32051: cpuregs_r: unimplemented memory-mapped register %02X at %04X\n", offset, m_pc-1);
@@ -581,6 +602,25 @@ WRITE16_MEMBER( tms32051_device::cpuregs_w )
case 0x2a: // CWSR
break;
+ case 0x50: // Memory-mapped I/O ports
+ case 0x51:
+ case 0x52:
+ case 0x53:
+ case 0x54:
+ case 0x55:
+ case 0x56:
+ case 0x57:
+ case 0x58:
+ case 0x59:
+ case 0x5a:
+ case 0x5b:
+ case 0x5c:
+ case 0x5d:
+ case 0x5e:
+ case 0x5f:
+ m_io->write_word(offset << 1, data);
+ break;
+
default:
if (!space.debugger_access())
fatalerror("32051: cpuregs_w: unimplemented memory-mapped register %02X, data %04X at %04X\n", offset, data, m_pc-1);
@@ -599,6 +639,10 @@ bool tms32051_device::memory_read(address_spacenum spacenum, offs_t offset, int
{
value = (DM_READ16(offset>>1));
}
+ else if (spacenum == AS_IO)
+ {
+ value = m_io->read_word(offset);
+ }
return 1;
}
diff --git a/src/devices/cpu/tms32051/tms32051.h b/src/devices/cpu/tms32051/tms32051.h
index cbae57ef6a0..8110fe80b63 100644
--- a/src/devices/cpu/tms32051/tms32051.h
+++ b/src/devices/cpu/tms32051/tms32051.h
@@ -76,7 +76,7 @@ protected:
virtual void execute_set_input(int inputnum, int state) override;
// device_memory_interface overrides
- virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_DATA) ? &m_data_config : nullptr ); }
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : ( (spacenum == AS_DATA) ? &m_data_config : nullptr ) ); }
virtual bool memory_read(address_spacenum spacenum, offs_t offset, int size, UINT64 &value) override;
// device_disasm_interface overrides
@@ -86,6 +86,7 @@ protected:
address_space_config m_program_config;
address_space_config m_data_config;
+ address_space_config m_io_config;
typedef void ( tms32051_device::*opcode_func )();
static const opcode_func s_opcode_table[256];
@@ -162,6 +163,7 @@ protected:
address_space *m_program;
direct_read_data *m_direct;
address_space *m_data;
+ address_space *m_io;
int m_icount;
bool m_idle;
diff --git a/src/mame/drivers/taitopjc.cpp b/src/mame/drivers/taitopjc.cpp
index 2f7564322f6..44a50d8cc96 100644
--- a/src/mame/drivers/taitopjc.cpp
+++ b/src/mame/drivers/taitopjc.cpp
@@ -77,6 +77,10 @@
0xf010:
0xf020:
+ TLCS -> PPC Commands:
+ 0x7000: DSP ready
+ 0xd000: Vblank
+
*/
#include "emu.h"
@@ -122,6 +126,8 @@ public:
DECLARE_READ8_MEMBER(tlcs_sound_r);
DECLARE_WRITE8_MEMBER(tlcs_sound_w);
DECLARE_WRITE16_MEMBER(tlcs_unk_w);
+ DECLARE_READ16_MEMBER(tms_dspshare_r);
+ DECLARE_WRITE16_MEMBER(tms_dspshare_w);
virtual void machine_reset() override;
virtual void video_start() override;
UINT32 screen_update_taitopjc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -288,7 +294,10 @@ WRITE64_MEMBER(taitopjc_state::ppc_common_w)
if (offset == 0x7ff && ACCESSING_BITS_48_63)
{
#if LOG_PPC_TO_TLCS_COMMANDS
- printf("PPC -> TLCS cmd %04X\n", m_io_share_ram[0xfff]);
+ if (m_io_share_ram[0xfff] != 0x0000)
+ {
+ printf("PPC -> TLCS cmd %04X\n", m_io_share_ram[0xfff]);
+ }
#endif
m_iocpu->set_input_line(TLCS900_INT6, ASSERT_LINE);
@@ -316,12 +325,7 @@ READ64_MEMBER(taitopjc_state::dsp_r)
WRITE64_MEMBER(taitopjc_state::dsp_w)
{
- printf("dsp_w: %08X, %08X%08X, %08X%08X\n", offset, (UINT32)(data >> 32), (UINT32)(data), (UINT32)(mem_mask >> 32), (UINT32)(mem_mask));
-
- if (offset != 0x7fe)
- {
- logerror("dsp_w: %08X, %08X%08X, %08X%08X\n", offset, (UINT32)(data >> 32), (UINT32)(data), (UINT32)(mem_mask >> 32), (UINT32)(mem_mask));
- }
+ logerror("dsp_w: %08X, %08X%08X, %08X%08X at %08X\n", offset, (UINT32)(data >> 32), (UINT32)(data), (UINT32)(mem_mask >> 32), (UINT32)(mem_mask), space.device().safe_pc());
if (offset == 0x7fe)
{
@@ -337,6 +341,8 @@ WRITE64_MEMBER(taitopjc_state::dsp_w)
fclose(f);
}
#endif
+
+ printf("DSP command %04X\n", (UINT16)(data >> 48) & 0xffff);
}
if (ACCESSING_BITS_48_63)
@@ -349,25 +355,6 @@ WRITE64_MEMBER(taitopjc_state::dsp_w)
int addr = offset * 2;
m_dsp_ram[addr+1] = (data >> 16) & 0xffff;
}
-
-
-
- if (offset == 0x7fe && ACCESSING_BITS_48_63)
- {
- UINT16 w = data >> 48;
- if (w == 0x4450)
- {
- m_dsp_ram[0xffc] = 0;
- }
- else if (w == 0x4558)
- {
- m_dsp_ram[0xffc] = 0;
- }
- else if (w == 0x5349)
- {
- m_dsp_ram[0xffc] = 0;
- }
- }
}
// BAT Config:
@@ -385,6 +372,7 @@ static ADDRESS_MAP_START( ppc603e_mem, AS_PROGRAM, 64, taitopjc_state )
AM_RANGE(0x40000000, 0x4000000f) AM_READWRITE(video_r, video_w)
AM_RANGE(0x80000000, 0x80003fff) AM_READWRITE(dsp_r, dsp_w)
AM_RANGE(0xc0000000, 0xc0003fff) AM_READWRITE(ppc_common_r, ppc_common_w)
+ AM_RANGE(0xfe800000, 0xfeffffff) AM_ROM AM_REGION("gfx1", 0)
AM_RANGE(0xff000000, 0xff01ffff) AM_ROM AM_REGION("user2", 0)
AM_RANGE(0xffe00000, 0xffffffff) AM_ROM AM_REGION("user1", 0)
ADDRESS_MAP_END
@@ -425,10 +413,15 @@ WRITE8_MEMBER(taitopjc_state::tlcs_common_w)
if (offset == 0x1ffd)
{
#if LOG_TLCS_TO_PPC_COMMANDS
- printf("TLCS -> PPC cmd %04X\n", m_io_share_ram[0xffe]);
+ if (m_io_share_ram[0xffe] != 0xd000 &&
+ m_io_share_ram[0xffe] != 0x7000)
+ {
+ printf("TLCS -> PPC cmd %04X\n", m_io_share_ram[0xffe]);
+ }
#endif
m_iocpu->set_input_line(TLCS900_INT1, CLEAR_LINE);
+ m_iocpu->set_input_line(TLCS900_INT2, CLEAR_LINE);
m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
}
}
@@ -460,12 +453,12 @@ WRITE16_MEMBER(taitopjc_state::tlcs_unk_w)
// TLCS900 interrupt vectors
// 0xfc0100: reset
// 0xfc00ea: INT0 (dummy)
-// 0xfc00eb: INT1
-// 0xfc00f0: INT2
+// 0xfc00eb: INT1 vblank?
+// 0xfc00f0: INT2 DSP ready?
// 0xfc00f5: INT3 (dummy)
// 0xfc00f6: INT4 (dummy)
// 0xfc00f7: INT5 (dummy)
-// 0xfc00f8: INT6
+// 0xfc00f8: INT6 PPC command
// 0xfc00fd: INT7 (dummy)
// 0xfc00fe: INT8 (dummy)
// 0xfc0663: INTT1
@@ -488,11 +481,29 @@ ADDRESS_MAP_START( mn10200_map, AS_PROGRAM, 16, driver_device )
ADDRESS_MAP_END
+
+READ16_MEMBER(taitopjc_state::tms_dspshare_r)
+{
+ return m_dsp_ram[offset];
+}
+
+WRITE16_MEMBER(taitopjc_state::tms_dspshare_w)
+{
+ if (offset == 0xffc)
+ {
+ m_iocpu->set_input_line(TLCS900_INT2, ASSERT_LINE);
+ }
+ m_dsp_ram[offset] = data;
+}
+
+
static ADDRESS_MAP_START( tms_program_map, AS_PROGRAM, 16, taitopjc_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM AM_REGION("user2", 0)
ADDRESS_MAP_END
static ADDRESS_MAP_START( tms_data_map, AS_DATA, 16, taitopjc_state )
+ AM_RANGE(0x7000, 0xefff) AM_RAM
+ AM_RANGE(0xf000, 0xffff) AM_READWRITE(tms_dspshare_r, tms_dspshare_w)
ADDRESS_MAP_END
@@ -506,8 +517,6 @@ void taitopjc_state::machine_reset()
m_soundcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
-
- m_dsp_ram[0x0ffc] = 0x4f4b;
}
@@ -579,7 +588,7 @@ ROM_START( optiger )
ROM_LOAD16_BYTE( "e63-17-1_s-l.18", 0x000000, 0x040000, CRC(2a063d5b) SHA1(a2b2fe4d8bad1aef7d9dcc0be607cc4e5bc4f0eb) )
ROM_LOAD16_BYTE( "e63-18-1_s-h.19", 0x000001, 0x040000, CRC(2f590881) SHA1(7fb827a676f45b24380558b0068b76cb858314f6) )
- ROM_REGION( 0x1000000, "gfx1", 0 )
+ ROM_REGION64_BE( 0x1000000, "gfx1", 0 )
ROM_LOAD32_WORD_SWAP( "e63-21_c-h.24", 0x000000, 0x400000, CRC(c818b211) SHA1(dce07bfe71a9ba11c3f028a640226c6e59c6aece) )
ROM_LOAD32_WORD_SWAP( "e63-15_c-l.9", 0x000002, 0x400000, CRC(4ec6a2d7) SHA1(2ee6270cff7ea2459121961a29d42e000cee2921) )
ROM_LOAD32_WORD_SWAP( "e63-22_m-h.25", 0x800000, 0x400000, CRC(6d895eb6) SHA1(473795da42fd29841a926f18a93e5992f4feb27c) )