tms32051: add I/O space (nw)

This commit is contained in:
Ville Linde 2015-12-14 18:28:45 +02:00
parent 4e0b6882b3
commit 2847b88e25
4 changed files with 103 additions and 37 deletions

View File

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

View File

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

View File

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

View File

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