mirror of
https://github.com/holub/mame
synced 2025-04-21 16:01:56 +03:00
tms32051: add I/O space (nw)
This commit is contained in:
parent
4e0b6882b3
commit
2847b88e25
@ -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()
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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) )
|
||||
|
Loading…
Reference in New Issue
Block a user