From 399692f17adaa4ea649b4dd235ced6596ba7db6a Mon Sep 17 00:00:00 2001 From: Ville Linde Date: Sun, 20 Dec 2015 18:27:29 +0200 Subject: [PATCH] taitopjc: hook up TC0780FPA (nw) --- src/devices/cpu/tms32051/32051ops.inc | 36 ++++++++++-- src/devices/cpu/tms32051/tms32051.cpp | 1 + src/mame/drivers/taitopjc.cpp | 84 ++++++++++++++++++++------- 3 files changed, 97 insertions(+), 24 deletions(-) diff --git a/src/devices/cpu/tms32051/32051ops.inc b/src/devices/cpu/tms32051/32051ops.inc index 8324984f53c..dd849e438e6 100644 --- a/src/devices/cpu/tms32051/32051ops.inc +++ b/src/devices/cpu/tms32051/32051ops.inc @@ -663,7 +663,17 @@ void tms32051_device::op_sath() void tms32051_device::op_satl() { - fatalerror("32051: unimplemented op satl at %08X\n", m_pc-1); + int count = m_treg1 & 0xf; + if (m_st1.sxm) + { + m_acc = (INT32)(m_acc) >> count; + } + else + { + m_acc = (UINT32)(m_acc) >> count; + } + + CYCLES(1); } void tms32051_device::op_sbb() @@ -1093,7 +1103,19 @@ void tms32051_device::op_calld() void tms32051_device::op_cc() { - fatalerror("32051: unimplemented op cc at %08X\n", m_pc-1); + UINT16 pma = ROPCODE(); + + if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3)) + { + PUSH_STACK(m_pc); + + CHANGE_PC(pma); + CYCLES(4); + } + else + { + CYCLES(2); + } } void tms32051_device::op_ccd() @@ -1590,7 +1612,11 @@ void tms32051_device::op_sph() void tms32051_device::op_spl() { - fatalerror("32051: unimplemented op spl at %08X\n", m_pc-1); + UINT16 ea = GET_ADDRESS(); + UINT16 spreg = (UINT16)(PREG_PSCALER(m_preg)); + DM_WRITE16(ea, spreg); + + CYCLES(1); } void tms32051_device::op_spm() @@ -1794,7 +1820,9 @@ void tms32051_device::op_setc_hold() void tms32051_device::op_setc_tc() { - fatalerror("32051: unimplemented op setc tc at %08X\n", m_pc-1); + m_st1.tc = 1; + + CYCLES(1); } void tms32051_device::op_setc_carry() diff --git a/src/devices/cpu/tms32051/tms32051.cpp b/src/devices/cpu/tms32051/tms32051.cpp index ac979099bc8..d4b565675fc 100644 --- a/src/devices/cpu/tms32051/tms32051.cpp +++ b/src/devices/cpu/tms32051/tms32051.cpp @@ -557,6 +557,7 @@ WRITE16_MEMBER( tms32051_device::cpuregs_w ) } case 0x09: m_brcr = data; break; + case 0x0d: m_treg1 = data; break; case 0x0e: m_treg2 = data; break; case 0x0f: m_dbmr = data; break; case 0x10: m_ar[0] = data; break; diff --git a/src/mame/drivers/taitopjc.cpp b/src/mame/drivers/taitopjc.cpp index 1d7c90201a4..47a6e3197a3 100644 --- a/src/mame/drivers/taitopjc.cpp +++ b/src/mame/drivers/taitopjc.cpp @@ -88,6 +88,7 @@ #include "cpu/tlcs900/tlcs900.h" #include "cpu/mn10200/mn10200.h" #include "cpu/tms32051/tms32051.h" +#include "video/tc0780fpa.h" #include "machine/nvram.h" #define LOG_TLCS_TO_PPC_COMMANDS 1 @@ -101,13 +102,19 @@ public: m_maincpu(*this, "maincpu"), m_iocpu(*this, "iocpu"), m_soundcpu(*this, "mn10200"), - m_dsp(*this, "dsp") + m_dsp(*this, "dsp"), + m_tc0780fpa(*this, "tc0780fpa"), + m_palette(*this, "palette"), + m_polyrom(*this, "poly") { } required_device m_maincpu; required_device m_iocpu; required_device m_soundcpu; required_device m_dsp; + required_device m_tc0780fpa; + required_device m_palette; + required_memory_region m_polyrom; DECLARE_READ64_MEMBER(video_r); DECLARE_WRITE64_MEMBER(video_w); @@ -122,9 +129,12 @@ public: DECLARE_WRITE16_MEMBER(tlcs_unk_w); DECLARE_READ16_MEMBER(tms_dspshare_r); DECLARE_WRITE16_MEMBER(tms_dspshare_w); + DECLARE_READ16_MEMBER(dsp_rom_r); + DECLARE_WRITE16_MEMBER(dsp_roml_w); + DECLARE_WRITE16_MEMBER(dsp_romh_w); virtual void machine_reset() override; virtual void video_start() override; - UINT32 screen_update_taitopjc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + UINT32 screen_update_taitopjc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(taitopjc_vbi); UINT32 videochip_r(offs_t address); void videochip_w(offs_t address, UINT32 data); @@ -139,6 +149,8 @@ public: UINT32 *m_pal_ram; UINT32 m_video_address; + + UINT32 m_dsp_rom_address; }; void taitopjc_state::video_exit() @@ -177,7 +189,7 @@ void taitopjc_state::video_start() machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(taitopjc_state::video_exit), this)); } -UINT32 taitopjc_state::screen_update_taitopjc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +UINT32 taitopjc_state::screen_update_taitopjc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 *s = (UINT8*)m_screen_ram; int x,y,t,u; @@ -201,23 +213,21 @@ UINT32 taitopjc_state::screen_update_taitopjc(screen_device &screen, bitmap_rgb3 for (y=0; y < 16; y++) { - UINT32 *fb = &bitmap.pix32(y+(u*16)); + UINT16 *fb = &bitmap.pix16(y+(u*16)); for (x=0; x < 16; x++) { UINT8 p = s[((tile*256) + ((y*16)+x)) ^3]; if (p != 0) { - UINT32 color = m_pal_ram[(palette << 8) + p]; - UINT32 r = (color & 0xff) << 16; - UINT32 g = (color & 0xff00); - UINT32 b = (color >> 16) & 0xff; - fb[x+(t*16)] = 0xff000000 | r | g | b; + fb[x+(t*16)] = (palette << 8) + p; } } } } } + m_tc0780fpa->draw(bitmap, cliprect); + return 0; } @@ -237,11 +247,12 @@ void taitopjc_state::videochip_w(offs_t address, UINT32 data) { if (address >= 0x20000000 && address < 0x20008000) { - //UINT32 r = (data >> 16) & 0xff; - //UINT32 g = (data >> 8) & 0xff; - //UINT32 b = (data >> 0) & 0xff; - //palette_set_color_rgb(space.machine, address & 0x7fff, r, g, b); m_pal_ram[address - 0x20000000] = data; + + int b = (data >> 16) & 0xff; + int g = (data >> 8) & 0xff; + int r = (data >> 0) & 0xff; + m_palette->set_pen_color(address - 0x20000000, rgb_t(r, g, b)); } else if (address >= 0x10000000 && address < 0x10040000) { @@ -357,7 +368,7 @@ READ64_MEMBER(taitopjc_state::dsp_r) WRITE64_MEMBER(taitopjc_state::dsp_w) { - 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()); + //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) { @@ -527,10 +538,31 @@ WRITE16_MEMBER(taitopjc_state::tms_dspshare_w) m_dsp_ram[offset] = data; } +READ16_MEMBER(taitopjc_state::dsp_rom_r) +{ + assert(m_dsp_rom_address < 0x800000); + + UINT16 data = ((UINT16*)m_polyrom->base())[m_dsp_rom_address]; + m_dsp_rom_address++; + return data; +} + +WRITE16_MEMBER(taitopjc_state::dsp_roml_w) +{ + m_dsp_rom_address &= 0xffff0000; + m_dsp_rom_address |= data; +} + +WRITE16_MEMBER(taitopjc_state::dsp_romh_w) +{ + m_dsp_rom_address &= 0xffff; + m_dsp_rom_address |= (UINT32)(data) << 16; +} + static ADDRESS_MAP_START( tms_program_map, AS_PROGRAM, 16, taitopjc_state ) AM_RANGE(0x0000, 0x3fff) AM_ROM AM_REGION("user2", 0) - AM_RANGE(0x5000, 0xefff) AM_ROM AM_REGION("user2", 0xa000) + AM_RANGE(0x4c00, 0xefff) AM_ROM AM_REGION("user2", 0x9800) ADDRESS_MAP_END static ADDRESS_MAP_START( tms_data_map, AS_DATA, 16, taitopjc_state ) @@ -540,7 +572,12 @@ static ADDRESS_MAP_START( tms_data_map, AS_DATA, 16, taitopjc_state ) ADDRESS_MAP_END static ADDRESS_MAP_START( tms_io_map, AS_IO, 16, taitopjc_state ) - AM_RANGE(0x005f, 0x005f) AM_NOP + AM_RANGE(0x0053, 0x0053) AM_WRITE(dsp_roml_w) + AM_RANGE(0x0057, 0x0057) AM_WRITE(dsp_romh_w) + AM_RANGE(0x0058, 0x0058) AM_DEVWRITE("tc0780fpa", tc0780fpa_device, poly_fifo_w) + AM_RANGE(0x005a, 0x005a) AM_DEVWRITE("tc0780fpa", tc0780fpa_device, tex_w) + AM_RANGE(0x005b, 0x005b) AM_DEVREADWRITE("tc0780fpa", tc0780fpa_device, tex_addr_r, tex_addr_w) + AM_RANGE(0x005f, 0x005f) AM_READ(dsp_rom_r) ADDRESS_MAP_END @@ -595,6 +632,8 @@ 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_rom_address = 0; } @@ -636,6 +675,11 @@ static MACHINE_CONFIG_START( taitopjc, taitopjc_state ) MCFG_SCREEN_SIZE(512, 384) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) MCFG_SCREEN_UPDATE_DRIVER(taitopjc_state, screen_update_taitopjc) + MCFG_SCREEN_PALETTE("palette") + + MCFG_PALETTE_ADD("palette", 32768) + + MCFG_DEVICE_ADD("tc0780fpa", TC0780FPA, 0) MACHINE_CONFIG_END @@ -675,10 +719,10 @@ ROM_START( optiger ) ROM_LOAD32_WORD_SWAP( "e63-22_m-h.25", 0x800000, 0x400000, CRC(6d895eb6) SHA1(473795da42fd29841a926f18a93e5992f4feb27c) ) ROM_LOAD32_WORD_SWAP( "e63-16_m-l.10", 0x800002, 0x400000, CRC(d39c1e34) SHA1(6db0ce2251841db3518a9bd9c4520c3c666d19a0) ) - ROM_REGION( 0xc00000, "poly", 0 ) - ROM_LOAD( "e63-09_poly0.3", 0x000000, 0x400000, CRC(c3e2b1e0) SHA1(ee71f3f59b46e26dbe2ff724da2c509267c8bf2f) ) - ROM_LOAD( "e63-10_poly1.4", 0x400000, 0x400000, CRC(f4a56390) SHA1(fc3c51a7f4639479e66ad50dcc94255d94803c97) ) - ROM_LOAD( "e63-11_poly2.5", 0x800000, 0x400000, CRC(2293d9f8) SHA1(16adaa0523168ee63a7a34b29622c623558fdd82) ) + ROM_REGION16_BE( 0xc00000, "poly", 0 ) + ROM_LOAD16_WORD_SWAP( "e63-09_poly0.3", 0x000000, 0x400000, CRC(c3e2b1e0) SHA1(ee71f3f59b46e26dbe2ff724da2c509267c8bf2f) ) + ROM_LOAD16_WORD_SWAP( "e63-10_poly1.4", 0x400000, 0x400000, CRC(f4a56390) SHA1(fc3c51a7f4639479e66ad50dcc94255d94803c97) ) + ROM_LOAD16_WORD_SWAP( "e63-11_poly2.5", 0x800000, 0x400000, CRC(2293d9f8) SHA1(16adaa0523168ee63a7a34b29622c623558fdd82) ) // Poly 3 is not populated ROM_REGION( 0x800000, "sound_data", 0 )