diff options
Diffstat (limited to 'src')
274 files changed, 11868 insertions, 7565 deletions
diff --git a/src/devices/bus/a2bus/a2echoii.cpp b/src/devices/bus/a2bus/a2echoii.cpp index bfd5be37545..edbd5dc5693 100644 --- a/src/devices/bus/a2bus/a2echoii.cpp +++ b/src/devices/bus/a2bus/a2echoii.cpp @@ -133,7 +133,7 @@ uint8_t a2bus_echoii_device::read_c0nx(uint8_t offset) // upon the falling edge of /DEVREAD, the active part of the read... if (m_readlatch_flag == false) // /RS was low, so we need to return a value from the tms5220 { - retval = 0x1f | m_tms->status_r(machine().dummy_space(), 0, 0xff); + retval = 0x1f | m_tms->status_r(); LOGMASKED(LOG_READ,"Returning status of speech chip, which is %02x\n", retval); } else @@ -157,7 +157,7 @@ void a2bus_echoii_device::write_c0nx(uint8_t offset, uint8_t data) m_writelatch_flag = false; // /DEVWRITE clears the latch on its falling edge m_tms->wsq_w(m_writelatch_flag); - m_tms->data_w(machine().dummy_space(), 0, m_writelatch_data); + m_tms->data_w(m_writelatch_data); } bool a2bus_echoii_device::take_c800() diff --git a/src/devices/bus/a2bus/a2mockingboard.cpp b/src/devices/bus/a2bus/a2mockingboard.cpp index dbc9370bf69..c1d67bfa7d3 100644 --- a/src/devices/bus/a2bus/a2mockingboard.cpp +++ b/src/devices/bus/a2bus/a2mockingboard.cpp @@ -90,6 +90,7 @@ void a2bus_echoplus_device::device_add_mconfig(machine_config &config) SPEAKER(config, "echosp").front_center(); TMS5220(config, m_tms, 640000); + // echo+ has a TSP5220C soldered down on it m_tms->add_route(ALL_OUTPUTS, "echosp", 1.0); } @@ -413,7 +414,7 @@ uint8_t a2bus_echoplus_device::read_c0nx(uint8_t offset) switch (offset) { case 0: - return 0x1f | m_tms->read_status(); + return 0x1f | m_tms->status_r(); } return 0; @@ -424,7 +425,7 @@ void a2bus_echoplus_device::write_c0nx(uint8_t offset, uint8_t data) switch (offset) { case 0: - m_tms->write_data(data); + m_tms->data_w(data); break; } } diff --git a/src/devices/bus/a2bus/ezcgi.cpp b/src/devices/bus/a2bus/ezcgi.cpp index 44550a7a83a..ec9dce1cad4 100644 --- a/src/devices/bus/a2bus/ezcgi.cpp +++ b/src/devices/bus/a2bus/ezcgi.cpp @@ -49,27 +49,29 @@ void a2bus_ezcgi_device::device_add_mconfig(machine_config &config) } MACHINE_CONFIG_START(a2bus_ezcgi_9938_device::device_add_mconfig) - MCFG_V9938_ADD(TMS_TAG, SCREEN_TAG, 0x30000, XTAL(21'477'272)) // 192K of VRAM / typical 9938 clock, not verified - MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(*this, a2bus_ezcgi_9938_device, tms_irq_w)) + V9938(config, m_tms, XTAL(21'477'272)); // typical 9938 clock, not verified + m_tms->set_vram_size(0x30000); // 192K of VRAM + m_tms->set_screen(SCREEN_TAG); + m_tms->int_cb().set(FUNC(a2bus_ezcgi_9938_device::tms_irq_w)); MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_UPDATE_DEVICE(TMS_TAG, v9938_device, screen_update) MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 262*2) MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1) MACHINE_CONFIG_END MACHINE_CONFIG_START(a2bus_ezcgi_9958_device::device_add_mconfig) - MCFG_V9958_ADD(TMS_TAG, SCREEN_TAG, 0x30000, XTAL(21'477'272)) // 192K of VRAM / typcial 9938/9958 clock, not verified - MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(*this, a2bus_ezcgi_9958_device, tms_irq_w)) + V9958(config, m_tms, XTAL(21'477'272)); // typical 9938/9958 clock, not verified + m_tms->set_vram_size(0x30000); // 192K of VRAM + m_tms->set_screen(SCREEN_TAG); + m_tms->int_cb().set(FUNC(a2bus_ezcgi_9958_device::tms_irq_w)); MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_UPDATE_DEVICE(TMS_TAG, v9938_device, screen_update) MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 262*2) MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1) MACHINE_CONFIG_END diff --git a/src/devices/bus/a2bus/ssbapple.cpp b/src/devices/bus/a2bus/ssbapple.cpp index 494a49f2b81..bde53973c13 100644 --- a/src/devices/bus/a2bus/ssbapple.cpp +++ b/src/devices/bus/a2bus/ssbapple.cpp @@ -77,10 +77,10 @@ bool a2bus_ssb_device::take_c800() uint8_t a2bus_ssb_device::read_cnxx(uint8_t offset) { - return 0x1f | m_tms->read_status(); + return 0x1f | m_tms->status_r(); } void a2bus_ssb_device::write_cnxx(uint8_t offset, uint8_t data) { - m_tms->write_data(data); + m_tms->data_w(data); } diff --git a/src/devices/bus/a2bus/ssprite.cpp b/src/devices/bus/a2bus/ssprite.cpp index de49a875ce4..818bde14b89 100644 --- a/src/devices/bus/a2bus/ssprite.cpp +++ b/src/devices/bus/a2bus/ssprite.cpp @@ -101,7 +101,7 @@ uint8_t a2bus_ssprite_device::read_c0nx(uint8_t offset) case 1: return m_tms->register_read(); case 2: - return 0x1f | m_tms5220->read_status(); // copied this line from a2echoii.cpp + return 0x1f | m_tms5220->status_r(); case 14: case 15: return m_ay->read_data(); @@ -121,7 +121,7 @@ void a2bus_ssprite_device::write_c0nx(uint8_t offset, uint8_t data) m_tms->register_write(data); break; case 2: - m_tms5220->write_data(data); + m_tms5220->data_w(data); break; case 12: case 13: diff --git a/src/devices/bus/bbc/userport/beebspch.cpp b/src/devices/bus/bbc/userport/beebspch.cpp index 3ca1a0ca4cd..ee2bdb67e6b 100644 --- a/src/devices/bus/bbc/userport/beebspch.cpp +++ b/src/devices/bus/bbc/userport/beebspch.cpp @@ -107,7 +107,7 @@ WRITE8_MEMBER(bbc_beebspch_device::pb_w) } // allophone - m_nsp->ald_w(space, 0, data & 0x3f); + m_nsp->ald_w(data & 0x3f); } WRITE_LINE_MEMBER(bbc_beebspch_device::cb1_w) diff --git a/src/devices/bus/bml3/bml3mp1805.cpp b/src/devices/bus/bml3/bml3mp1805.cpp index 5b07646379c..4ac4dc66df6 100644 --- a/src/devices/bus/bml3/bml3mp1805.cpp +++ b/src/devices/bus/bml3/bml3mp1805.cpp @@ -56,11 +56,12 @@ ROM_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(bml3bus_mp1805_device::device_add_mconfig) - MCFG_DEVICE_ADD( "mc6843", MC6843, 0 ) - MCFG_MC6843_IRQ_CALLBACK(WRITELINE(*this, bml3bus_mp1805_device, bml3_mc6843_intrq_w)) - MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(bml3_mp1805_floppy_interface) -MACHINE_CONFIG_END +void bml3bus_mp1805_device::device_add_mconfig(machine_config &config) +{ + MC6843(config, m_mc6843, 0); + m_mc6843->irq().set(FUNC(bml3bus_mp1805_device::bml3_mc6843_intrq_w)); + legacy_floppy_image_device::add_4drives(config, &bml3_mp1805_floppy_interface); +} //------------------------------------------------- // rom_region - device-specific ROM region diff --git a/src/devices/bus/c64/currah_speech.cpp b/src/devices/bus/c64/currah_speech.cpp index 5e97ee9b645..84d64f2ea2a 100644 --- a/src/devices/bus/c64/currah_speech.cpp +++ b/src/devices/bus/c64/currah_speech.cpp @@ -234,6 +234,6 @@ void c64_currah_speech_cartridge_device::c64_cd_w(address_space &space, offs_t o set_osc1(voice, intonation); - m_nsp->ald_w(space, 0, data & 0x3f); + m_nsp->ald_w(data & 0x3f); } } diff --git a/src/devices/bus/coco/coco_ssc.cpp b/src/devices/bus/coco/coco_ssc.cpp index e19a7cdd2f5..21eab3abc53 100644 --- a/src/devices/bus/coco/coco_ssc.cpp +++ b/src/devices/bus/coco/coco_ssc.cpp @@ -448,7 +448,7 @@ WRITE8_MEMBER(coco_ssc_device::ssc_port_c_w) if( (data & C_ALD) == 0 ) { - m_spo->ald_w(space, 0, m_tms7000_portd); + m_spo->ald_w(m_tms7000_portd); } if( ((m_tms7000_portc & C_BSY) == 0) && ((data & C_BSY) == C_BSY) ) diff --git a/src/devices/bus/cpc/cpc_ssa1.cpp b/src/devices/bus/cpc/cpc_ssa1.cpp index ae661828a9e..c5758069a26 100644 --- a/src/devices/bus/cpc/cpc_ssa1.cpp +++ b/src/devices/bus/cpc/cpc_ssa1.cpp @@ -41,7 +41,7 @@ READ8_MEMBER(cpc_ssa1_device::ssa1_r) WRITE8_MEMBER(cpc_ssa1_device::ssa1_w) { - m_sp0256_device->ald_w(space, 0, data); + m_sp0256_device->ald_w(data); } READ8_MEMBER(cpc_dkspeech_device::dkspeech_r) @@ -58,7 +58,7 @@ READ8_MEMBER(cpc_dkspeech_device::dkspeech_r) WRITE8_MEMBER(cpc_dkspeech_device::dkspeech_w) { - m_sp0256_device->ald_w(space, 0, data & 0x3f); + m_sp0256_device->ald_w(data & 0x3f); } WRITE_LINE_MEMBER(cpc_ssa1_device::lrq_cb) diff --git a/src/devices/bus/dmv/k801.cpp b/src/devices/bus/dmv/k801.cpp index 45ee5df50ad..601f8b5ecaa 100644 --- a/src/devices/bus/dmv/k801.cpp +++ b/src/devices/bus/dmv/k801.cpp @@ -84,6 +84,7 @@ dmv_k801_device::dmv_k801_device(const machine_config &mconfig, device_type type : device_t(mconfig, type, tag, owner, clock), device_dmvslot_interface( mconfig, *this ), m_epci(*this, "epci"), + m_rs232(*this, "rs232"), m_dsw(*this, "DSW"), m_bus(nullptr) { } @@ -142,41 +143,39 @@ void dmv_k801_device::device_reset() // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(dmv_k801_device::device_add_mconfig) - MCFG_DEVICE_ADD("epci", MC2661, XTAL(5'068'800)) - MCFG_MC2661_TXD_HANDLER(WRITELINE("rs232", rs232_port_device, write_txd)) - MCFG_MC2661_RTS_HANDLER(WRITELINE("rs232", rs232_port_device, write_rts)) - MCFG_MC2661_DTR_HANDLER(WRITELINE("rs232", rs232_port_device, write_dtr)) - MCFG_MC2661_RXRDY_HANDLER(WRITELINE(*this, dmv_k801_device, epci_irq_w)) - MCFG_MC2661_TXRDY_HANDLER(WRITELINE(*this, dmv_k801_device, epci_irq_w)) - - MCFG_DEVICE_ADD("rs232", RS232_PORT, default_rs232_devices, "printer") - MCFG_RS232_RXD_HANDLER(WRITELINE("epci", mc2661_device, rx_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE("epci", mc2661_device, dcd_w)) - MCFG_RS232_DSR_HANDLER(WRITELINE("epci", mc2661_device, dsr_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("epci", mc2661_device, cts_w)) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(dmv_k211_device::device_add_mconfig) - dmv_k801_device::device_add_mconfig(config); +void dmv_k801_device::device_add_mconfig(machine_config &config) +{ + MC2661(config, m_epci, XTAL(5'068'800)); + m_epci->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); + m_epci->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts)); + m_epci->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr)); + m_epci->rxrdy_handler().set(FUNC(dmv_k801_device::epci_irq_w)); + m_epci->txrdy_handler().set(FUNC(dmv_k801_device::epci_irq_w)); - MCFG_DEVICE_MODIFY("rs232") - MCFG_SLOT_DEFAULT_OPTION("null_modem") -MACHINE_CONFIG_END + RS232_PORT(config, m_rs232, default_rs232_devices, "printer"); + m_rs232->rxd_handler().set(m_epci, FUNC(mc2661_device::rx_w)); + m_rs232->dcd_handler().set(m_epci, FUNC(mc2661_device::dcd_w)); + m_rs232->dsr_handler().set(m_epci, FUNC(mc2661_device::dsr_w)); + m_rs232->cts_handler().set(m_epci, FUNC(mc2661_device::cts_w)); +} -MACHINE_CONFIG_START(dmv_k212_device::device_add_mconfig) +void dmv_k211_device::device_add_mconfig(machine_config &config) +{ dmv_k801_device::device_add_mconfig(config); + m_rs232->set_default_option("null_modem"); +} - MCFG_DEVICE_MODIFY("rs232") - MCFG_SLOT_DEFAULT_OPTION("printer") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(dmv_k213_device::device_add_mconfig) +void dmv_k212_device::device_add_mconfig(machine_config &config) +{ dmv_k801_device::device_add_mconfig(config); + m_rs232->set_default_option("printer"); +} - MCFG_DEVICE_MODIFY("rs232") - MCFG_SLOT_DEFAULT_OPTION(nullptr) -MACHINE_CONFIG_END +void dmv_k213_device::device_add_mconfig(machine_config &config) +{ + dmv_k801_device::device_add_mconfig(config); + m_rs232->set_default_option(nullptr); +} //------------------------------------------------- // input_ports - device-specific input ports diff --git a/src/devices/bus/dmv/k801.h b/src/devices/bus/dmv/k801.h index cba10725e0a..26f314b2149 100644 --- a/src/devices/bus/dmv/k801.h +++ b/src/devices/bus/dmv/k801.h @@ -40,6 +40,7 @@ protected: virtual void io_write(address_space &space, int ifsel, offs_t offset, uint8_t data) override; required_device<mc2661_device> m_epci; + required_device<rs232_port_device> m_rs232; required_ioport m_dsw; private: diff --git a/src/devices/bus/econet/e01.cpp b/src/devices/bus/econet/e01.cpp index b7e8bab4002..cb1f385aa86 100644 --- a/src/devices/bus/econet/e01.cpp +++ b/src/devices/bus/econet/e01.cpp @@ -245,7 +245,7 @@ void econet_e01_device::device_add_mconfig(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &econet_e01_device::e01_mem); MC146818(config, m_rtc, 32.768_kHz_XTAL); - m_rtc->irq_callback().set(FUNC(econet_e01_device::rtc_irq_w)); + m_rtc->irq().set(FUNC(econet_e01_device::rtc_irq_w)); // devices via6522_device &via(VIA6522(config, R6522_TAG, 8_MHz_XTAL / 4)); diff --git a/src/devices/bus/einstein/userport/speech.cpp b/src/devices/bus/einstein/userport/speech.cpp index f8ea0d72b31..435423f9f82 100644 --- a/src/devices/bus/einstein/userport/speech.cpp +++ b/src/devices/bus/einstein/userport/speech.cpp @@ -85,5 +85,5 @@ uint8_t einstein_speech_device::read() void einstein_speech_device::write(uint8_t data) { if (BIT(data, 7) == 0) - m_sp0256->ald_w(machine().dummy_space(), 0, data & 0x3f); + m_sp0256->ald_w(data & 0x3f); } diff --git a/src/devices/bus/electron/cart/click.cpp b/src/devices/bus/electron/cart/click.cpp index 0c4dfa8b43c..a4a0bfd5af2 100644 --- a/src/devices/bus/electron/cart/click.cpp +++ b/src/devices/bus/electron/cart/click.cpp @@ -23,11 +23,12 @@ DEFINE_DEVICE_TYPE(ELECTRON_CLICK, electron_click_device, "electron_click", "Slo // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(electron_click_device::device_add_mconfig) +void electron_click_device::device_add_mconfig(machine_config &config) +{ /* rtc */ - MCFG_DEVICE_ADD("rtc", MC146818, 32.768_kHz_XTAL) - MCFG_MC146818_IRQ_HANDLER(WRITELINE(*this, electron_click_device, irq_w)) -MACHINE_CONFIG_END + MC146818(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->irq().set(FUNC(electron_click_device::irq_w)); +} //------------------------------------------------- // INPUT_PORTS( click ) diff --git a/src/devices/bus/intv/voice.cpp b/src/devices/bus/intv/voice.cpp index d10abb03e23..7cc62da7856 100644 --- a/src/devices/bus/intv/voice.cpp +++ b/src/devices/bus/intv/voice.cpp @@ -98,7 +98,7 @@ const tiny_rom_entry *intv_voice_device::device_rom_region() const READ16_MEMBER(intv_voice_device::read_speech) { if (ACCESSING_BITS_0_7) - return m_speech->spb640_r(space, offset, mem_mask); + return m_speech->spb640_r(offset); else return 0xff; } @@ -110,7 +110,7 @@ READ16_MEMBER(intv_voice_device::read_speech) WRITE16_MEMBER(intv_voice_device::write_speech) { if (ACCESSING_BITS_0_7) - return m_speech->spb640_w(space, offset, data, mem_mask); + return m_speech->spb640_w(offset, data); } diff --git a/src/devices/bus/lpci/southbridge.cpp b/src/devices/bus/lpci/southbridge.cpp index d566cc22515..9e281e83437 100644 --- a/src/devices/bus/lpci/southbridge.cpp +++ b/src/devices/bus/lpci/southbridge.cpp @@ -521,9 +521,9 @@ MACHINE_CONFIG_START(southbridge_extended_device::device_add_mconfig) MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE("keybc", at_keyboard_controller_device, keyboard_data_w)) MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL) - MCFG_DS12885_ADD("rtc") - MCFG_MC146818_IRQ_HANDLER(WRITELINE("pic8259_slave", pic8259_device, ir0_w)) - MCFG_MC146818_CENTURY_INDEX(0x32) + ds12885_device &rtc(DS12885(config, "rtc")); + rtc.irq().set("pic8259_slave", FUNC(pic8259_device::ir0_w)); + rtc.set_century_index(0x32); // on board devices MCFG_DEVICE_ADD("board1", ISA16_SLOT, 0, "isabus", pc_isa_onboard, "fdcsmc", true) // FIXME: determine ISA bus clock diff --git a/src/devices/bus/odyssey2/voice.cpp b/src/devices/bus/odyssey2/voice.cpp index d4d8e83b738..073b4a83173 100644 --- a/src/devices/bus/odyssey2/voice.cpp +++ b/src/devices/bus/odyssey2/voice.cpp @@ -88,7 +88,7 @@ WRITE_LINE_MEMBER(o2_voice_device::lrq_callback) WRITE8_MEMBER(o2_voice_device::io_write) { if (data & 0x20) - m_speech->ald_w(space, 0, offset & 0x7f); + m_speech->ald_w(offset & 0x7f); else m_speech->reset(); } diff --git a/src/devices/bus/sbus/bwtwo.cpp b/src/devices/bus/sbus/bwtwo.cpp new file mode 100644 index 00000000000..29a40719091 --- /dev/null +++ b/src/devices/bus/sbus/bwtwo.cpp @@ -0,0 +1,107 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + Sun bwtwo monochrome video controller + +***************************************************************************/ + +#include "emu.h" +#include "bwtwo.h" +#include "screen.h" + +DEFINE_DEVICE_TYPE(SBUS_BWTWO, sbus_bwtwo_device, "bwtwo", "Sun bwtwo SBus Video") + +void sbus_bwtwo_device::mem_map(address_map &map) +{ + map(0x00000000, 0x000007ff).r(FUNC(sbus_bwtwo_device::rom_r)); + map(0x00400000, 0x0040001f).rw(FUNC(sbus_bwtwo_device::regs_r), FUNC(sbus_bwtwo_device::regs_w)); + map(0x00800000, 0x008fffff).rw(FUNC(sbus_bwtwo_device::vram_r), FUNC(sbus_bwtwo_device::vram_w)); +} + +ROM_START( sbus_bwtwo ) + ROM_REGION32_BE(0x800, "prom", ROMREGION_ERASEFF) + ROM_LOAD( "sunw,501-1561.bin", 0x0000, 0x0800, CRC(e37a3314) SHA1(78761bd2369cb0c58ef1344c697a47d3a659d4bc)) +ROM_END + +const tiny_rom_entry *sbus_bwtwo_device::device_rom_region() const +{ + return ROM_NAME( sbus_bwtwo ); +} + +void sbus_bwtwo_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_screen_update(FUNC(sbus_bwtwo_device::screen_update)); + screen.set_size(1152, 900); + screen.set_visarea(0, 1152-1, 0, 900-1); + screen.set_refresh_hz(72); +} + + +sbus_bwtwo_device::sbus_bwtwo_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, SBUS_BWTWO, tag, owner, clock) + , device_sbus_card_interface(mconfig, *this) + , m_rom(*this, "prom") + //, m_vram(*this, "vram") + , m_screen(*this, "screen") +{ +} + +void sbus_bwtwo_device::device_start() +{ + m_vram = std::make_unique<uint32_t[]>(0x100000/4); +} + +void sbus_bwtwo_device::install_device() +{ + m_sbus->install_device(m_base, m_base + 0x1ffffff, *this, &sbus_bwtwo_device::mem_map); +} + +uint32_t sbus_bwtwo_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + static const uint32_t palette[2] = { 0xffffff, 0 }; + uint8_t *vram = (uint8_t *)&m_vram[0]; + + for (int y = 0; y < 900; y++) + { + uint32_t *scanline = &bitmap.pix32(y); + for (int x = 0; x < 1152/8; x++) + { + const uint8_t pixels = vram[(y * (1152/8)) + (BYTE4_XOR_BE(x))]; + + for (int bit = 7; bit >= 0; bit--) + { + *scanline++ = palette[BIT(pixels, bit)]; + } + } + } + + return 0; +} + +READ8_MEMBER(sbus_bwtwo_device::regs_r) +{ + logerror("%s: regs_r (unimplemented): %08x\n", machine().describe_context(), 0x400000 + offset); + return 0; +} + +WRITE8_MEMBER(sbus_bwtwo_device::regs_w) +{ + logerror("%s: regs_w (unimplemented): %08x = %02x\n", machine().describe_context(), 0x400000 + offset, data); +} + +READ32_MEMBER(sbus_bwtwo_device::vram_r) +{ + return m_vram[offset]; +} + +READ32_MEMBER(sbus_bwtwo_device::rom_r) +{ + return ((uint32_t*)m_rom->base())[offset]; +} + +WRITE32_MEMBER(sbus_bwtwo_device::vram_w) +{ + COMBINE_DATA(&m_vram[offset]); +} diff --git a/src/devices/bus/sbus/bwtwo.h b/src/devices/bus/sbus/bwtwo.h new file mode 100644 index 00000000000..089d99d4615 --- /dev/null +++ b/src/devices/bus/sbus/bwtwo.h @@ -0,0 +1,51 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + Sun bwtwo monochrome video controller + +***************************************************************************/ + +#ifndef MAME_BUS_SBUS_BWTWO_H +#define MAME_BUS_SBUS_BWTWO_H + +#pragma once + +#include "sbus.h" + + +class sbus_bwtwo_device : public device_t, public device_sbus_card_interface +{ +public: + // construction/destruction + sbus_bwtwo_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t overrides + virtual const tiny_rom_entry *device_rom_region() const override; + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + + // device_sbus_slot_interface overrides + virtual void install_device() override; + + DECLARE_READ8_MEMBER(regs_r); + DECLARE_WRITE8_MEMBER(regs_w); + DECLARE_READ32_MEMBER(rom_r); + DECLARE_READ32_MEMBER(vram_r); + DECLARE_WRITE32_MEMBER(vram_w); + +private: + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void mem_map(address_map &map) override; + + required_memory_region m_rom; + std::unique_ptr<uint32_t[]> m_vram; + required_device<screen_device> m_screen; +}; + +// device type definition +DECLARE_DEVICE_TYPE(SBUS_BWTWO, sbus_bwtwo_device) + +#endif // MAME_BUS_SBUS_BWTWO_H diff --git a/src/devices/bus/sbus/cgthree.cpp b/src/devices/bus/sbus/cgthree.cpp new file mode 100644 index 00000000000..006d924b96d --- /dev/null +++ b/src/devices/bus/sbus/cgthree.cpp @@ -0,0 +1,182 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + Sun cgthree color video controller + +***************************************************************************/ + +#include "emu.h" +#include "cgthree.h" +#include "screen.h" + +DEFINE_DEVICE_TYPE(SBUS_CGTHREE, sbus_cgthree_device, "cgthree", "Sun cgthree SBus Video") + +void sbus_cgthree_device::mem_map(address_map &map) +{ + map(0x00000000, 0x01ffffff).rw(FUNC(sbus_cgthree_device::unknown_r), FUNC(sbus_cgthree_device::unknown_w)); + map(0x00000000, 0x000007ff).r(FUNC(sbus_cgthree_device::rom_r)); + map(0x00400000, 0x00400007).w(FUNC(sbus_cgthree_device::palette_w)); + map(0x007ff800, 0x007ff81f).rw(FUNC(sbus_cgthree_device::regs_r), FUNC(sbus_cgthree_device::regs_w)); + map(0x00800000, 0x008fd1ff).rw(FUNC(sbus_cgthree_device::vram2_r), FUNC(sbus_cgthree_device::vram2_w)); + map(0x00bff800, 0x00cfcbff).rw(FUNC(sbus_cgthree_device::vram_r), FUNC(sbus_cgthree_device::vram_w)); +} + +ROM_START( sbus_cgthree ) + ROM_REGION32_BE(0x800, "prom", ROMREGION_ERASEFF) + ROM_LOAD( "sunw,501-1415.bin", 0x0000, 0x0800, CRC(d1eb6f4d) SHA1(9bef98b2784b6e70167337bb27cd07952b348b5a)) +ROM_END + +const tiny_rom_entry *sbus_cgthree_device::device_rom_region() const +{ + return ROM_NAME( sbus_cgthree ); +} + +void sbus_cgthree_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_screen_update(FUNC(sbus_cgthree_device::screen_update)); + screen.set_size(1152, 900); + screen.set_visarea(0, 1152-1, 0, 900-1); + screen.set_refresh_hz(72); + + PALETTE(config, m_palette, 256).set_init(DEVICE_SELF, FUNC(sbus_cgthree_device::palette_init)); +} + +sbus_cgthree_device::sbus_cgthree_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, SBUS_CGTHREE, tag, owner, clock) + , device_sbus_card_interface(mconfig, *this) + , m_rom(*this, "prom") + , m_screen(*this, "screen") + , m_palette(*this, "palette") +{ +} + +void sbus_cgthree_device::device_start() +{ + m_vram = std::make_unique<uint32_t[]>(0x100000/4); + m_vram2 = std::make_unique<uint32_t[]>(0x100000/4); + + save_item(NAME(m_palette_entry)); + save_item(NAME(m_palette_r)); + save_item(NAME(m_palette_g)); + save_item(NAME(m_palette_b)); + save_item(NAME(m_palette_step)); +} + +void sbus_cgthree_device::device_reset() +{ + m_palette_entry = 0; + m_palette_r = 0; + m_palette_g = 0; + m_palette_b = 0; + m_palette_step = 0; +} + +void sbus_cgthree_device::install_device() +{ + m_sbus->install_device(m_base, m_base + 0x1ffffff, *this, &sbus_cgthree_device::mem_map); +} + +void sbus_cgthree_device::palette_init(palette_device &palette) +{ + for (int i = 0; i < 256; i++) + { + const uint8_t reversed = 255 - i; + palette.set_pen_color(i, rgb_t(reversed, reversed, reversed)); + } +} + +uint32_t sbus_cgthree_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + const pen_t *pens = m_palette->pens(); + uint8_t *vram = (uint8_t *)&m_vram2[0]; + + for (int y = 0; y < 900; y++) + { + uint32_t *scanline = &bitmap.pix32(y); + for (int x = 0; x < 1152; x++) + { + const uint8_t pixel = vram[y * 1152 + BYTE4_XOR_BE(x)]; + *scanline++ = pens[pixel]; + } + } + + return 0; +} + +READ32_MEMBER(sbus_cgthree_device::unknown_r) +{ + logerror("%s: unknown_r: %08x & %08x\n", machine().describe_context(), offset << 2, mem_mask); + return 0; +} + +WRITE32_MEMBER(sbus_cgthree_device::unknown_w) +{ + logerror("%s: unknown_w: %08x = %08x & %08x\n", machine().describe_context(), offset << 2, data, mem_mask); +} + +WRITE32_MEMBER(sbus_cgthree_device::palette_w) +{ + if (offset == 0) + { + m_palette_entry = data >> 24; + m_palette_step = 0; + } + else + { + switch (m_palette_step) + { + case 0: + m_palette_r = data >> 24; + m_palette_step++; + break; + case 1: + m_palette_g = data >> 24; + m_palette_step++; + break; + case 2: + m_palette_b = data >> 24; + m_palette->set_pen_color(m_palette_entry, rgb_t(m_palette_r, m_palette_g, m_palette_b)); + m_palette_step = 0; + m_palette_entry++; + break; + } + } +} + +READ8_MEMBER(sbus_cgthree_device::regs_r) +{ + logerror("%s: regs_r: Unimplemented: %08x\n", machine().describe_context(), 0x7ff800 + offset); + return 0; +} + +WRITE8_MEMBER(sbus_cgthree_device::regs_w) +{ + logerror("%s: regs_w: Unimplemented: %08x = %02x\n", machine().describe_context(), 0x7ff800 + offset, data); +} + +READ32_MEMBER(sbus_cgthree_device::rom_r) +{ + return ((uint32_t*)m_rom->base())[offset]; +} + +READ32_MEMBER(sbus_cgthree_device::vram_r) +{ + return m_vram[offset]; +} + +WRITE32_MEMBER(sbus_cgthree_device::vram_w) +{ + COMBINE_DATA(&m_vram[offset]); +} + +READ32_MEMBER(sbus_cgthree_device::vram2_r) +{ + return m_vram2[offset]; +} + +WRITE32_MEMBER(sbus_cgthree_device::vram2_w) +{ + COMBINE_DATA(&m_vram2[offset]); +} diff --git a/src/devices/bus/sbus/cgthree.h b/src/devices/bus/sbus/cgthree.h new file mode 100644 index 00000000000..c6640a295b9 --- /dev/null +++ b/src/devices/bus/sbus/cgthree.h @@ -0,0 +1,66 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + Sun cgthree color video controller + +***************************************************************************/ + +#ifndef MAME_BUS_SBUS_CGTHREE_H +#define MAME_BUS_SBUS_CGTHREE_H + +#pragma once + +#include "sbus.h" +#include "emupal.h" + +class sbus_cgthree_device : public device_t, public device_sbus_card_interface +{ +public: + // construction/destruction + sbus_cgthree_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t overrides + virtual const tiny_rom_entry *device_rom_region() const override; + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + virtual void device_reset() override; + + // device_sbus_slot_interface overrides + virtual void install_device() override; + + void palette_init(palette_device &palette); + + DECLARE_READ32_MEMBER(unknown_r); + DECLARE_WRITE32_MEMBER(unknown_w); + DECLARE_WRITE32_MEMBER(palette_w); + DECLARE_READ8_MEMBER(regs_r); + DECLARE_WRITE8_MEMBER(regs_w); + DECLARE_READ32_MEMBER(rom_r); + DECLARE_READ32_MEMBER(vram_r); + DECLARE_WRITE32_MEMBER(vram_w); + DECLARE_READ32_MEMBER(vram2_r); + DECLARE_WRITE32_MEMBER(vram2_w); + +private: + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void mem_map(address_map &map) override; + + required_memory_region m_rom; + std::unique_ptr<uint32_t[]> m_vram; + std::unique_ptr<uint32_t[]> m_vram2; // ??? + required_device<screen_device> m_screen; + required_device<palette_device> m_palette; + uint8_t m_palette_entry; + uint8_t m_palette_r; + uint8_t m_palette_g; + uint8_t m_palette_b; + uint8_t m_palette_step; +}; + +// device type definition +DECLARE_DEVICE_TYPE(SBUS_CGTHREE, sbus_cgthree_device) + +#endif // MAME_BUS_SBUS_CGTHREE_H diff --git a/src/devices/bus/sbus/sbus.cpp b/src/devices/bus/sbus/sbus.cpp new file mode 100644 index 00000000000..ecd3c45b785 --- /dev/null +++ b/src/devices/bus/sbus/sbus.cpp @@ -0,0 +1,206 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + sbus.c - Sun SBus slot bus and card emulation + +***************************************************************************/ + +#include "emu.h" +#include "bwtwo.h" +#include "cgthree.h" +#include "turbogx.h" +#include "sbus.h" + +void sbus_cards(device_slot_interface &device) +{ + device.option_add("bwtwo", SBUS_BWTWO); /* Sun bwtwo monochrome display board */ + device.option_add("cgthree", SBUS_CGTHREE); /* Sun cgthree color display board */ + device.option_add("turbogx", SBUS_TURBOGX); /* Sun TurboGX 8-bit color display board */ +} + +DEFINE_DEVICE_TYPE(SBUS_SLOT, sbus_slot_device, "sbus_slot", "Sun SBus Slot") + +sbus_slot_device::sbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : sbus_slot_device(mconfig, SBUS_SLOT, tag, owner, clock) +{ +} + +sbus_slot_device::sbus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , device_slot_interface(mconfig, *this) + , m_sbus(*this, finder_base::DUMMY_TAG) +{ +} + +void sbus_slot_device::device_validity_check(validity_checker &valid) const +{ + device_t *const card(get_card_device()); + if (card && !dynamic_cast<device_sbus_card_interface *>(card)) + osd_printf_error("Card device %s (%s) does not implement device_sbus_card_interface\n", card->tag(), card->name()); +} + +void sbus_slot_device::device_resolve_objects() +{ + device_sbus_card_interface *const sbus_card(dynamic_cast<device_sbus_card_interface *>(get_card_device())); + if (sbus_card) + sbus_card->set_sbus(m_sbus, tag()); +} + +void sbus_slot_device::device_start() +{ + device_t *const card(get_card_device()); + if (card && !dynamic_cast<device_sbus_card_interface *>(card)) + throw emu_fatalerror("sbus_slot_device: card device %s (%s) does not implement device_sbus_card_interface\n", card->tag(), card->name()); +} + + +DEFINE_DEVICE_TYPE(SBUS, sbus_device, "sbus", "Sun SBus") + +device_memory_interface::space_config_vector sbus_device::memory_space_config() const +{ + return space_config_vector { + std::make_pair(0, &m_space_config) + }; +} + +sbus_device::sbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : sbus_device(mconfig, SBUS, tag, owner, clock) +{ +} + +sbus_device::sbus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , device_memory_interface(mconfig, *this) + , m_space_config("SBus Space", ENDIANNESS_BIG, 32, 32, 0, address_map_constructor()) + , m_maincpu(*this, finder_base::DUMMY_TAG) + , m_type1space(*this, finder_base::DUMMY_TAG) + , m_irq_cb{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} + , m_buserr(*this) +{ +} + +void sbus_device::device_resolve_objects() +{ + // resolve callbacks + for (int i = 0; i < 7; i++) + m_irq_cb[i].resolve_safe(); + m_buserr.resolve_safe(); +} + +void sbus_device::device_start() +{ + std::fill(std::begin(m_device_list), std::end(m_device_list), nullptr); + + m_space = &space(0); + m_space->install_readwrite_handler(0x00000000, 0x01ffffff, read32_delegate(FUNC(sbus_device::slot_timeout_r<0>), this), write32_delegate(FUNC(sbus_device::slot_timeout_w<0>), this)); + m_space->install_readwrite_handler(0x02000000, 0x03ffffff, read32_delegate(FUNC(sbus_device::slot_timeout_r<1>), this), write32_delegate(FUNC(sbus_device::slot_timeout_w<1>), this)); + m_space->install_readwrite_handler(0x04000000, 0x05ffffff, read32_delegate(FUNC(sbus_device::slot_timeout_r<2>), this), write32_delegate(FUNC(sbus_device::slot_timeout_w<2>), this)); +} + +template <unsigned Slot> READ32_MEMBER(sbus_device::slot_timeout_r) +{ + m_maincpu->set_mae(); + m_buserr(0, 0x20); + m_buserr(1, 0xffa00000 + (Slot << 21)); + return 0; +} + +template <unsigned Slot> WRITE32_MEMBER(sbus_device::slot_timeout_w) +{ + m_maincpu->set_mae(); + m_buserr(0, 0x8020); + m_buserr(1, 0xffa00000 + (Slot << 21)); +} + +READ32_MEMBER(sbus_device::read) +{ + return m_space->read_dword(offset << 2, mem_mask); +} + +WRITE32_MEMBER(sbus_device::write) +{ + m_space->write_dword(offset << 2, data, mem_mask); +} + +device_sbus_card_interface *sbus_device::get_sbus_card(int slot) +{ + if (slot < 0) + { + return nullptr; + } + + if (m_device_list[slot]) + { + return m_device_list[slot]; + } + + return nullptr; +} + +void sbus_device::add_sbus_card(int slot, device_sbus_card_interface *card) +{ + m_device_list[slot] = card; + card->install_device(); +} + +void sbus_device::set_irq_line(int state, int line) +{ + m_irq_cb[line](state); +} + + + +device_sbus_card_interface::device_sbus_card_interface(const machine_config &mconfig, device_t &device) + : device_slot_card_interface(mconfig, device) + , m_sbus_finder(device, finder_base::DUMMY_TAG) + , m_sbus(nullptr) + , m_sbus_slottag(nullptr) + , m_slot(-1) + , m_base(0) +{ +} + +device_sbus_card_interface::~device_sbus_card_interface() +{ +} + +void device_sbus_card_interface::interface_validity_check(validity_checker &valid) const +{ + if (m_sbus_finder && m_sbus && (m_sbus != m_sbus_finder)) + osd_printf_error("Contradictory buses configured (%s and %s)\n", m_sbus_finder->tag(), m_sbus->tag()); +} + +void device_sbus_card_interface::interface_pre_start() +{ + device_slot_card_interface::interface_pre_start(); + + if (!m_sbus) + { + m_sbus = m_sbus_finder; + if (!m_sbus) + fatalerror("Can't find Sun SBus device %s\n", m_sbus_finder.finder_tag()); + } + + if (0 > m_slot) + { + if (!m_sbus->started()) + throw device_missing_dependencies(); + + // extract the slot number from the last digit of the slot tag + size_t const tlen = strlen(m_sbus_slottag); + + m_slot = (m_sbus_slottag[tlen - 1] - '1'); + if (m_slot < 0 || m_slot > 2) + fatalerror("Slot %x out of range for Sun SBus\n", m_slot); + + m_base = m_slot << 25; + m_sbus->add_sbus_card(m_slot, this); + } +} + +void device_sbus_card_interface::set_sbus(sbus_device *sbus, const char *slottag) +{ + m_sbus = sbus; + m_sbus_slottag = slottag; +} diff --git a/src/devices/bus/sbus/sbus.h b/src/devices/bus/sbus/sbus.h new file mode 100644 index 00000000000..15ca1f40ea2 --- /dev/null +++ b/src/devices/bus/sbus/sbus.h @@ -0,0 +1,160 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + sbus.h - Sun SBus slot bus and card emulation + +***************************************************************************/ + +#ifndef MAME_BUS_SBUS_SBUS_H +#define MAME_BUS_SBUS_SBUS_H + +#pragma once + +#include "cpu/sparc/sparc.h" +#include "machine/bankdev.h" + +class sbus_device; + +class sbus_slot_device : public device_t, public device_slot_interface +{ +public: + // construction/destruction + template <typename T, typename U> + sbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&sbus_tag, U &&opts, const char *dflt) + : sbus_slot_device(mconfig, tag, owner, clock) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + m_sbus.set_tag(std::forward<T>(sbus_tag)); + } + sbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + sbus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + // device-level overrides + virtual void device_validity_check(validity_checker &valid) const override; + virtual void device_resolve_objects() override; + virtual void device_start() override; + + // configuration + required_device<sbus_device> m_sbus; + + DECLARE_READ32_MEMBER(timeout_r); + DECLARE_WRITE32_MEMBER(timeout_w); +}; + +DECLARE_DEVICE_TYPE(SBUS_SLOT, sbus_slot_device) + + +class device_sbus_card_interface; + +class sbus_device : public device_t, + public device_memory_interface +{ + friend class device_sbus_card_interface; +public: + // construction/destruction + template <typename T, typename U> + sbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&space_tag) + : sbus_device(mconfig, tag, owner, clock) + { + set_cpu_tag(std::forward<T>(cpu_tag)); + set_space_tag(std::forward<U>(space_tag)); + } + + sbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + // inline configuration + template <typename T> void set_cpu_tag(T &&tag) { m_maincpu.set_tag(std::forward<T>(tag)); } + template <typename T> void set_space_tag(T &&tag) { m_type1space.set_tag(std::forward<T>(tag)); } + + // devcb3 + template <unsigned Line> auto irq() { return m_irq_cb[Line].bind(); } + auto buserr() { return m_buserr.bind(); } + + virtual space_config_vector memory_space_config() const override; + + const address_space_config m_space_config; + + void add_sbus_card(int slot, device_sbus_card_interface *card); + device_sbus_card_interface *get_sbus_card(int slot); + + void set_irq_line(int state, int line); + + template<typename T> void install_device(offs_t addrstart, offs_t addrend, T &device, void (T::*map)(class address_map &map), uint64_t unitmask = ~u64(0)) + { + m_space->install_device(addrstart, addrend, device, map, unitmask); + } + + DECLARE_READ32_MEMBER(read); + DECLARE_WRITE32_MEMBER(write); + +protected: + sbus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + // device-level overrides + virtual void device_resolve_objects() override; + virtual void device_start() override; + + // internal state + required_device<mb86901_device> m_maincpu; + required_device<address_map_bank_device> m_type1space; + address_space *m_space; + + devcb_write_line m_irq_cb[7]; + devcb_write32 m_buserr; + + device_sbus_card_interface *m_device_list[3]; + +private: + void slot1_timeout_map(address_map &map); + void slot2_timeout_map(address_map &map); + void slot3_timeout_map(address_map &map); + + template <unsigned Slot> DECLARE_READ32_MEMBER(slot_timeout_r); + template <unsigned Slot> DECLARE_WRITE32_MEMBER(slot_timeout_w); +}; + +DECLARE_DEVICE_TYPE(SBUS, sbus_device) + + +// class representing interface-specific live sbus card +class device_sbus_card_interface : public device_slot_card_interface +{ + friend class sbus_device; +public: + // construction/destruction + virtual ~device_sbus_card_interface(); + + // inline configuration + void set_sbus(sbus_device *sbus, const char *slottag); + template <typename T> void set_onboard(T &&sbus) { m_sbus_finder.set_tag(std::forward<T>(sbus)); m_sbus_slottag = device().tag(); } + + virtual void mem_map(address_map &map) = 0; + +protected: + void raise_irq(int line) { m_sbus->set_irq_line(ASSERT_LINE, line); } + void lower_irq(int line) { m_sbus->set_irq_line(CLEAR_LINE, line); } + + device_sbus_card_interface(const machine_config &mconfig, device_t &device); + + virtual void interface_validity_check(validity_checker &valid) const override; + virtual void interface_pre_start() override; + virtual void install_device() = 0; + + sbus_device &sbus() { assert(m_sbus); return *m_sbus; } + + optional_device<sbus_device> m_sbus_finder; + sbus_device *m_sbus; + const char *m_sbus_slottag; + int m_slot; + uint32_t m_base; +}; + +void sbus_cards(device_slot_interface &device); + +#endif // MAME_BUS_SBUS_SBUS_H diff --git a/src/devices/bus/sbus/turbogx.cpp b/src/devices/bus/sbus/turbogx.cpp new file mode 100644 index 00000000000..4c2d57c0cc2 --- /dev/null +++ b/src/devices/bus/sbus/turbogx.cpp @@ -0,0 +1,1028 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + Sun TurboGX accelerated 8-bit color video controller + +***************************************************************************/ + +#include "emu.h" +#include "turbogx.h" +#include "screen.h" + +DEFINE_DEVICE_TYPE(SBUS_TURBOGX, sbus_turbogx_device, "turbogx", "Sun TurboGX SBus Video") + +void sbus_turbogx_device::mem_map(address_map &map) +{ + map(0x00000000, 0x01ffffff).rw(FUNC(sbus_turbogx_device::unknown_r), FUNC(sbus_turbogx_device::unknown_w)); + map(0x00000000, 0x00007fff).r(FUNC(sbus_turbogx_device::rom_r)); + map(0x00200000, 0x00200007).w(FUNC(sbus_turbogx_device::palette_w)); + map(0x00700000, 0x00700fff).rw(FUNC(sbus_turbogx_device::fbc_r), FUNC(sbus_turbogx_device::fbc_w)); + map(0x00800000, 0x008fffff).rw(FUNC(sbus_turbogx_device::vram_r), FUNC(sbus_turbogx_device::vram_w)); +} + +ROM_START( sbus_turbogx ) + ROM_REGION32_BE(0x8000, "prom", ROMREGION_ERASEFF) + ROM_LOAD( "sunw,501-2325.bin", 0x0000, 0x8000, CRC(bbdc45f8) SHA1(e4a51d78e199cd57f2fcb9d45b25dfae2bd537e4)) +ROM_END + +const tiny_rom_entry *sbus_turbogx_device::device_rom_region() const +{ + return ROM_NAME( sbus_turbogx ); +} + +void sbus_turbogx_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_screen_update(FUNC(sbus_turbogx_device::screen_update)); + screen.set_size(1152, 900); + screen.set_visarea(0, 1152-1, 0, 900-1); + screen.set_refresh_hz(72); + + PALETTE(config, m_palette, 256).set_init(DEVICE_SELF, FUNC(sbus_turbogx_device::palette_init)); +} + + +sbus_turbogx_device::sbus_turbogx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, SBUS_TURBOGX, tag, owner, clock) + , device_sbus_card_interface(mconfig, *this) + , m_rom(*this, "prom") + , m_screen(*this, "screen") + , m_palette(*this, "palette") +{ +} + +void sbus_turbogx_device::device_start() +{ + m_vram = std::make_unique<uint32_t[]>(0x100000/4); + + save_item(NAME(m_palette_entry)); + save_item(NAME(m_palette_r)); + save_item(NAME(m_palette_g)); + save_item(NAME(m_palette_b)); + save_item(NAME(m_palette_step)); +} + +void sbus_turbogx_device::device_reset() +{ + m_palette_entry = 0; + m_palette_r = 0; + m_palette_g = 0; + m_palette_b = 0; + m_palette_step = 0; + + memset(&m_fbc, 0, sizeof(m_fbc)); +} + +void sbus_turbogx_device::install_device() +{ + m_sbus->install_device(m_base, m_base + 0x1ffffff, *this, &sbus_turbogx_device::mem_map); +} + +void sbus_turbogx_device::palette_init(palette_device &palette) +{ + for (int i = 0; i < 256; i++) + { + const uint8_t reversed = 255 - i; + palette.set_pen_color(i, rgb_t(reversed, reversed, reversed)); + } +} + +uint32_t sbus_turbogx_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + const pen_t *pens = m_palette->pens(); + uint8_t *vram = (uint8_t *)&m_vram[0]; + + for (int y = 0; y < 900; y++) + { + uint32_t *scanline = &bitmap.pix32(y); + for (int x = 0; x < 1152; x++) + { + const uint8_t pixel = vram[y * 1152 + BYTE4_XOR_BE(x)]; + *scanline++ = pens[pixel]; + } + } + + return 0; +} + +READ32_MEMBER(sbus_turbogx_device::rom_r) +{ + return ((uint32_t*)m_rom->base())[offset]; +} + +READ32_MEMBER(sbus_turbogx_device::unknown_r) +{ + logerror("%s: unknown_r: %08x & %08x\n", machine().describe_context(), offset << 2, mem_mask); + return 0; +} + +WRITE32_MEMBER(sbus_turbogx_device::unknown_w) +{ + logerror("%s: unknown_w: %08x = %08x & %08x\n", machine().describe_context(), offset << 2, data, mem_mask); +} + +READ32_MEMBER(sbus_turbogx_device::vram_r) +{ + return m_vram[offset]; +} + +WRITE32_MEMBER(sbus_turbogx_device::vram_w) +{ + COMBINE_DATA(&m_vram[offset]); +} + +WRITE32_MEMBER(sbus_turbogx_device::palette_w) +{ + if (offset == 0) + { + m_palette_entry = data >> 24; + logerror("selecting palette entry %d\n", (uint32_t)m_palette_entry); + m_palette_step = 0; + } + else if (offset == 1) + { + switch (m_palette_step) + { + case 0: + logerror("palette entry %d red: %02x\n", (uint32_t)m_palette_entry, data); + m_palette_r = data >> 24; + m_palette_step++; + break; + case 1: + logerror("palette entry %d green: %02x\n", (uint32_t)m_palette_entry, data); + m_palette_g = data >> 24; + m_palette_step++; + break; + case 2: + logerror("palette entry %d blue: %02x\n", (uint32_t)m_palette_entry, data); + m_palette_b = data >> 24; + m_palette->set_pen_color(m_palette_entry, rgb_t(m_palette_r, m_palette_g, m_palette_b)); + m_palette_step = 0; + m_palette_entry++; + break; + } + } +} + +uint8_t sbus_turbogx_device::perform_rasterop(uint8_t src, uint8_t dst) +{ + const uint32_t rops[4] = { fbc_rasterop_rop00(), fbc_rasterop_rop01(), fbc_rasterop_rop10(), fbc_rasterop_rop11() }; + + uint8_t result = 0; + //logerror("src:%02x dst:%02x\n", src, dst); + for (int bit = 0; bit < 8; bit++) + { + const uint8_t mask = (1 << bit); + const uint8_t f = BIT(m_fbc.m_fcolor, bit) << 1; + const uint8_t b = BIT(m_fbc.m_bcolor, bit); + const uint8_t s = src & mask; + const uint8_t d = dst & mask; + const uint32_t rop = rops[f | b]; + //logerror("f:%d b:%d s:%02x d:%02x rop:%d\n", f >> 1, b, s, d, rop); + + uint8_t value = 0; + switch (rop) + { + case ROP_CLR: break; + case ROP_SRC_NOR_DST: value = ~(s | d); break; + case ROP_NSRC_AND_DST: value = ~s & d; break; + case ROP_NOT_SRC: value = ~s; break; + case ROP_SRC_AND_NDST: value = s & ~d; break; + case ROP_NOT_DST: value = ~d; break; + case ROP_SRC_XOR_DST: value = s ^ d; break; + case ROP_SRC_NAND_DST: value = ~(s & d); break; + case ROP_SRC_AND_DST: value = s & d; break; + case ROP_SRC_XNOR_DST: value = ~(s ^ d); break; + case ROP_DST: value = d; break; + case ROP_NSRC_OR_DST: value = ~s | d; break; + case ROP_SRC: value = s; break; + case ROP_SRC_OR_NDST: value = s | ~d; break; + case ROP_SRC_OR_DST: value = s | d; break; + case ROP_SET: value = 0xff; break; + default: value = 0; break; + } + result |= value & mask; + } + return result; +} + +// NOTE: This is basically untested, and probably full of bugs! +void sbus_turbogx_device::handle_draw_command() +{ + if (fbc_misc_draw() != FBC_MISC_DRAW_RENDER) + { + logerror("handle_draw_command: Unsupported draw mode %d, abandoning draw\n", fbc_misc_draw()); + return; + } + + if (m_fbc.m_curr_prim_type != PRIM_RECT) + { + logerror("handle_draw_command: Unsupported prim type %d, abandoning draw\n", m_fbc.m_curr_prim_type); + return; + } + + if (m_fbc.m_vertex_count < 2) + { + logerror("handle_draw_command: Insufficient number of vertices queued, abandoning draw\n"); + return; + } + + uint8_t *vram = (uint8_t*)&m_vram[0]; + + uint32_t vindex = 0; + while (vindex < m_fbc.m_vertex_count) + { + vertex_t &v0 = m_fbc.m_prim_buf[vindex++]; + vertex_t &v1 = m_fbc.m_prim_buf[vindex++]; + + for (uint32_t y = v0.m_absy; y < v1.m_absy; y++) + { + const uint32_t line = y * (m_fbc.m_clip_maxx + 1); + for (uint32_t x = v0.m_absx; x < v1.m_absx; x++) + { + const uint8_t src = vram[line + x]; + const uint8_t dst = src; + const uint8_t result = perform_rasterop(src, dst); + vram[line + x] = result; + } + } + } + m_fbc.m_vertex_count = 0; +} + +// NOTE: This is basically untested, and probably full of bugs! +void sbus_turbogx_device::handle_blit_command() +{ + uint8_t *vram = (uint8_t*)&m_vram[0]; + const uint32_t fbw = (m_fbc.m_clip_maxx + 1); + logerror("Copying from %d,%d-%d,%d to %d,%d-%d,%d, width %d, height %d\n" + , m_fbc.m_x0, m_fbc.m_y0 + , m_fbc.m_x1, m_fbc.m_y1 + , m_fbc.m_x2, m_fbc.m_y2 + , m_fbc.m_x3, m_fbc.m_y3 + , m_fbc.m_clip_maxx, m_fbc.m_clip_maxy); + uint32_t srcy = m_fbc.m_y0; + uint32_t dsty = m_fbc.m_y2; + for (; srcy < m_fbc.m_y1; srcy++, dsty++) + { + uint32_t srcy_index = srcy * fbw; + uint32_t dsty_index = dsty * fbw; + uint32_t srcx = m_fbc.m_x0; + uint32_t dstx = m_fbc.m_x2; + for (; srcx < m_fbc.m_x1; srcx++, dstx++) + { + const uint8_t src = vram[srcy_index + srcx]; + const uint8_t dst = vram[dsty_index + dstx]; + const uint8_t result = perform_rasterop(src, dst); + //logerror("vram[%d] = %02x\n", result); + vram[dsty_index + dstx] = result; + } + } +} + +READ32_MEMBER(sbus_turbogx_device::fbc_r) +{ + uint32_t ret = 0; + switch (offset) + { + case FBC_MISC: + logerror("fbc_r: MISC (%08x & %08x)\n", m_fbc.m_misc, mem_mask); + return m_fbc.m_misc; + case FBC_CLIP_CHECK: + logerror("fbc_r: CLIP_CHECK (%08x & %08x)\n", m_fbc.m_clip_check, mem_mask); + return m_fbc.m_clip_check; + + case FBC_STATUS: + logerror("fbc_r: STATUS (%08x & %08x)\n", m_fbc.m_status, mem_mask); + return m_fbc.m_status; + case FBC_DRAW_STATUS: + logerror("fbc_r: DRAW_STATUS (%08x & %08x)\n", m_fbc.m_draw_status, mem_mask); + handle_draw_command(); + return m_fbc.m_draw_status; + case FBC_BLIT_STATUS: + logerror("fbc_r: BLIT_STATUS (%08x & %08x)\n", m_fbc.m_blit_status, mem_mask); + handle_blit_command(); + return m_fbc.m_blit_status; + case FBC_FONT: + logerror("fbc_r: FONT (%08x & %08x)\n", m_fbc.m_font, mem_mask); + return m_fbc.m_font; + + case FBC_X0: + logerror("fbc_r: X0 (%08x & %08x)\n", m_fbc.m_x0, mem_mask); + return m_fbc.m_x0; + case FBC_Y0: + logerror("fbc_r: Y0 (%08x & %08x)\n", m_fbc.m_y0, mem_mask); + return m_fbc.m_y0; + case FBC_Z0: + logerror("fbc_r: Z0 (%08x & %08x)\n", m_fbc.m_z0, mem_mask); + return m_fbc.m_z0; + case FBC_COLOR0: + logerror("fbc_r: COLOR0 (%08x & %08x)\n", m_fbc.m_color0, mem_mask); + return m_fbc.m_color0; + case FBC_X1: + logerror("fbc_r: X1 (%08x & %08x)\n", m_fbc.m_x1, mem_mask); + return m_fbc.m_x1; + case FBC_Y1: + logerror("fbc_r: Y1 (%08x & %08x)\n", m_fbc.m_y1, mem_mask); + return m_fbc.m_y1; + case FBC_Z1: + logerror("fbc_r: Z1 (%08x & %08x)\n", m_fbc.m_z1, mem_mask); + return m_fbc.m_z1; + case FBC_COLOR1: + logerror("fbc_r: COLOR1 (%08x & %08x)\n", m_fbc.m_color1, mem_mask); + return m_fbc.m_color1; + case FBC_X2: + logerror("fbc_r: X2 (%08x & %08x)\n", m_fbc.m_x2, mem_mask); + return m_fbc.m_x2; + case FBC_Y2: + logerror("fbc_r: Y2 (%08x & %08x)\n", m_fbc.m_y2, mem_mask); + return m_fbc.m_y2; + case FBC_Z2: + logerror("fbc_r: Z2 (%08x & %08x)\n", m_fbc.m_z2, mem_mask); + return m_fbc.m_z2; + case FBC_COLOR2: + logerror("fbc_r: COLOR2 (%08x & %08x)\n", m_fbc.m_color2, mem_mask); + return m_fbc.m_color2; + case FBC_X3: + logerror("fbc_r: X3 (%08x & %08x)\n", m_fbc.m_x3, mem_mask); + return m_fbc.m_x3; + case FBC_Y3: + logerror("fbc_r: Y3 (%08x & %08x)\n", m_fbc.m_y3, mem_mask); + return m_fbc.m_y3; + case FBC_Z3: + logerror("fbc_r: Z3 (%08x & %08x)\n", m_fbc.m_z3, mem_mask); + return m_fbc.m_z3; + case FBC_COLOR3: + logerror("fbc_r: COLOR3 (%08x & %08x)\n", m_fbc.m_color3, mem_mask); + return m_fbc.m_color3; + + case FBC_RASTER_OFFX: + logerror("fbc_r: RASTER_OFFX (%08x & %08x)\n", m_fbc.m_raster_offx, mem_mask); + return m_fbc.m_raster_offx; + case FBC_RASTER_OFFY: + logerror("fbc_r: RASTER_OFFY (%08x & %08x)\n", m_fbc.m_raster_offy, mem_mask); + return m_fbc.m_raster_offy; + case FBC_AUTOINCX: + logerror("fbc_r: AUTOINCX (%08x & %08x)\n", m_fbc.m_autoincx, mem_mask); + return m_fbc.m_autoincx; + case FBC_AUTOINCY: + logerror("fbc_r: AUTOINCY (%08x & %08x)\n", m_fbc.m_autoincy, mem_mask); + return m_fbc.m_autoincy; + case FBC_CLIP_MINX: + logerror("fbc_r: CLIP_MINX (%08x & %08x)\n", m_fbc.m_clip_minx, mem_mask); + return m_fbc.m_clip_minx; + case FBC_CLIP_MINY: + logerror("fbc_r: CLIP_MINY (%08x & %08x)\n", m_fbc.m_clip_miny, mem_mask); + return m_fbc.m_clip_miny; + case FBC_CLIP_MAXX: + logerror("fbc_r: CLIP_MAXX (%08x & %08x)\n", m_fbc.m_clip_maxx, mem_mask); + return m_fbc.m_clip_maxx; + case FBC_CLIP_MAXY: + logerror("fbc_r: CLIP_MAXY (%08x & %08x)\n", m_fbc.m_clip_maxy, mem_mask); + return m_fbc.m_clip_maxy; + + case FBC_FCOLOR: + logerror("fbc_r: FCOLOR (%08x & %08x)\n", m_fbc.m_fcolor, mem_mask); + return m_fbc.m_fcolor; + case FBC_BCOLOR: + logerror("fbc_r: BCOLOR (%08x & %08x)\n", m_fbc.m_bcolor, mem_mask); + return m_fbc.m_bcolor; + case FBC_RASTEROP: + logerror("fbc_r: RASTEROP (%08x & %08x)\n", m_fbc.m_rasterop, mem_mask); + return m_fbc.m_rasterop; + case FBC_PLANE_MASK: + logerror("fbc_r: PLANE_MASK (%08x & %08x)\n", m_fbc.m_plane_mask, mem_mask); + return m_fbc.m_plane_mask; + case FBC_PIXEL_MASK: + logerror("fbc_r: PIXEL_MASK (%08x & %08x)\n", m_fbc.m_pixel_mask, mem_mask); + return m_fbc.m_pixel_mask; + + case FBC_PATT_ALIGN: + logerror("fbc_r: PATT_ALIGN (%08x & %08x)\n", m_fbc.m_patt_align, mem_mask); + return m_fbc.m_patt_align; + case FBC_PATTERN0: + logerror("fbc_r: PATTERN0 (%08x & %08x)\n", m_fbc.m_pattern[0], mem_mask); + return m_fbc.m_pattern[0]; + case FBC_PATTERN1: + logerror("fbc_r: PATTERN1 (%08x & %08x)\n", m_fbc.m_pattern[1], mem_mask); + return m_fbc.m_pattern[1]; + case FBC_PATTERN2: + logerror("fbc_r: PATTERN2 (%08x & %08x)\n", m_fbc.m_pattern[2], mem_mask); + return m_fbc.m_pattern[2]; + case FBC_PATTERN3: + logerror("fbc_r: PATTERN3 (%08x & %08x)\n", m_fbc.m_pattern[3], mem_mask); + return m_fbc.m_pattern[3]; + case FBC_PATTERN4: + logerror("fbc_r: PATTERN4 (%08x & %08x)\n", m_fbc.m_pattern[4], mem_mask); + return m_fbc.m_pattern[4]; + case FBC_PATTERN5: + logerror("fbc_r: PATTERN5 (%08x & %08x)\n", m_fbc.m_pattern[5], mem_mask); + return m_fbc.m_pattern[5]; + case FBC_PATTERN6: + logerror("fbc_r: PATTERN6 (%08x & %08x)\n", m_fbc.m_pattern[6], mem_mask); + return m_fbc.m_pattern[6]; + case FBC_PATTERN7: + logerror("fbc_r: PATTERN7 (%08x & %08x)\n", m_fbc.m_pattern[7], mem_mask); + return m_fbc.m_pattern[7]; + + case FBC_IPOINT_ABSX: + logerror("fbc_r: IPOINT_ABSX (%08x & %08x)\n", m_fbc.m_ipoint_absx, mem_mask); + return m_fbc.m_ipoint_absx; + case FBC_IPOINT_ABSY: + logerror("fbc_r: IPOINT_ABSY (%08x & %08x)\n", m_fbc.m_ipoint_absy, mem_mask); + return m_fbc.m_ipoint_absy; + case FBC_IPOINT_ABSZ: + logerror("fbc_r: IPOINT_ABSZ (%08x & %08x)\n", m_fbc.m_ipoint_absz, mem_mask); + return m_fbc.m_ipoint_absz; + case FBC_IPOINT_RELX: + logerror("fbc_r: IPOINT_RELX (%08x & %08x)\n", m_fbc.m_ipoint_relx, mem_mask); + return m_fbc.m_ipoint_relx; + case FBC_IPOINT_RELY: + logerror("fbc_r: IPOINT_RELY (%08x & %08x)\n", m_fbc.m_ipoint_rely, mem_mask); + return m_fbc.m_ipoint_rely; + case FBC_IPOINT_RELZ: + logerror("fbc_r: IPOINT_RELZ (%08x & %08x)\n", m_fbc.m_ipoint_relz, mem_mask); + return m_fbc.m_ipoint_relz; + case FBC_IPOINT_R: + logerror("fbc_r: IPOINT_R (%08x & %08x)\n", m_fbc.m_ipoint_r, mem_mask); + return m_fbc.m_ipoint_r; + case FBC_IPOINT_G: + logerror("fbc_r: IPOINT_G (%08x & %08x)\n", m_fbc.m_ipoint_g, mem_mask); + return m_fbc.m_ipoint_g; + case FBC_IPOINT_B: + logerror("fbc_r: IPOINT_B (%08x & %08x)\n", m_fbc.m_ipoint_b, mem_mask); + return m_fbc.m_ipoint_b; + case FBC_IPOINT_A: + logerror("fbc_r: IPOINT_A (%08x & %08x)\n", m_fbc.m_ipoint_a, mem_mask); + return m_fbc.m_ipoint_a; + + case FBC_ILINE_ABSX: + logerror("fbc_r: ILINE_ABSX (%08x & %08x)\n", m_fbc.m_iline_absx, mem_mask); + return m_fbc.m_iline_absx; + case FBC_ILINE_ABSY: + logerror("fbc_r: ILINE_ABSY (%08x & %08x)\n", m_fbc.m_iline_absy, mem_mask); + return m_fbc.m_iline_absy; + case FBC_ILINE_ABSZ: + logerror("fbc_r: ILINE_ABSZ (%08x & %08x)\n", m_fbc.m_iline_absz, mem_mask); + return m_fbc.m_iline_absz; + case FBC_ILINE_RELX: + logerror("fbc_r: ILINE_RELX (%08x & %08x)\n", m_fbc.m_iline_relx, mem_mask); + return m_fbc.m_iline_relx; + case FBC_ILINE_RELY: + logerror("fbc_r: ILINE_RELY (%08x & %08x)\n", m_fbc.m_iline_rely, mem_mask); + return m_fbc.m_iline_rely; + case FBC_ILINE_RELZ: + logerror("fbc_r: ILINE_RELZ (%08x & %08x)\n", m_fbc.m_iline_relz, mem_mask); + return m_fbc.m_iline_relz; + case FBC_ILINE_R: + logerror("fbc_r: ILINE_R (%08x & %08x)\n", m_fbc.m_iline_r, mem_mask); + return m_fbc.m_iline_r; + case FBC_ILINE_G: + logerror("fbc_r: ILINE_G (%08x & %08x)\n", m_fbc.m_iline_g, mem_mask); + return m_fbc.m_iline_g; + case FBC_ILINE_B: + logerror("fbc_r: ILINE_B (%08x & %08x)\n", m_fbc.m_iline_b, mem_mask); + return m_fbc.m_iline_b; + case FBC_ILINE_A: + logerror("fbc_r: ILINE_A (%08x & %08x)\n", m_fbc.m_iline_a, mem_mask); + return m_fbc.m_iline_a; + + case FBC_ITRI_ABSX: + logerror("fbc_r: ITRI_ABSX (%08x & %08x)\n", m_fbc.m_itri_absx, mem_mask); + return m_fbc.m_itri_absx; + case FBC_ITRI_ABSY: + logerror("fbc_r: ITRI_ABSY (%08x & %08x)\n", m_fbc.m_itri_absy, mem_mask); + return m_fbc.m_itri_absy; + case FBC_ITRI_ABSZ: + logerror("fbc_r: ITRI_ABSZ (%08x & %08x)\n", m_fbc.m_itri_absz, mem_mask); + return m_fbc.m_itri_absz; + case FBC_ITRI_RELX: + logerror("fbc_r: ITRI_RELX (%08x & %08x)\n", m_fbc.m_itri_relx, mem_mask); + return m_fbc.m_itri_relx; + case FBC_ITRI_RELY: + logerror("fbc_r: ITRI_RELY (%08x & %08x)\n", m_fbc.m_itri_rely, mem_mask); + return m_fbc.m_itri_rely; + case FBC_ITRI_RELZ: + logerror("fbc_r: ITRI_RELZ (%08x & %08x)\n", m_fbc.m_itri_relz, mem_mask); + return m_fbc.m_itri_relz; + case FBC_ITRI_R: + logerror("fbc_r: ITRI_R (%08x & %08x)\n", m_fbc.m_itri_r, mem_mask); + return m_fbc.m_itri_r; + case FBC_ITRI_G: + logerror("fbc_r: ITRI_G (%08x & %08x)\n", m_fbc.m_itri_g, mem_mask); + return m_fbc.m_itri_g; + case FBC_ITRI_B: + logerror("fbc_r: ITRI_B (%08x & %08x)\n", m_fbc.m_itri_b, mem_mask); + return m_fbc.m_itri_b; + case FBC_ITRI_A: + logerror("fbc_r: ITRI_A (%08x & %08x)\n", m_fbc.m_itri_a, mem_mask); + return m_fbc.m_itri_a; + + case FBC_IQUAD_ABSX: + logerror("fbc_r: IQUAD_ABSX (%08x & %08x)\n", m_fbc.m_iquad_absx, mem_mask); + return m_fbc.m_iquad_absx; + case FBC_IQUAD_ABSY: + logerror("fbc_r: IQUAD_ABSY (%08x & %08x)\n", m_fbc.m_iquad_absy, mem_mask); + return m_fbc.m_iquad_absy; + case FBC_IQUAD_ABSZ: + logerror("fbc_r: IQUAD_ABSZ (%08x & %08x)\n", m_fbc.m_iquad_absz, mem_mask); + return m_fbc.m_iquad_absz; + case FBC_IQUAD_RELX: + logerror("fbc_r: IQUAD_RELX (%08x & %08x)\n", m_fbc.m_iquad_relx, mem_mask); + return m_fbc.m_iquad_relx; + case FBC_IQUAD_RELY: + logerror("fbc_r: IQUAD_RELY (%08x & %08x)\n", m_fbc.m_iquad_rely, mem_mask); + return m_fbc.m_iquad_rely; + case FBC_IQUAD_RELZ: + logerror("fbc_r: IQUAD_RELZ (%08x & %08x)\n", m_fbc.m_iquad_relz, mem_mask); + return m_fbc.m_iquad_relz; + case FBC_IQUAD_R: + logerror("fbc_r: IQUAD_R (%08x & %08x)\n", m_fbc.m_iquad_r, mem_mask); + return m_fbc.m_iquad_r; + case FBC_IQUAD_G: + logerror("fbc_r: IQUAD_G (%08x & %08x)\n", m_fbc.m_iquad_g, mem_mask); + return m_fbc.m_iquad_g; + case FBC_IQUAD_B: + logerror("fbc_r: IQUAD_B (%08x & %08x)\n", m_fbc.m_iquad_b, mem_mask); + return m_fbc.m_iquad_b; + case FBC_IQUAD_A: + logerror("fbc_r: IQUAD_A (%08x & %08x)\n", m_fbc.m_iquad_a, mem_mask); + return m_fbc.m_iquad_a; + + case FBC_IRECT_ABSX: + logerror("fbc_r: IRECT_ABSX (%08x & %08x)\n", m_fbc.m_irect_absx, mem_mask); + return m_fbc.m_irect_absx; + case FBC_IRECT_ABSY: + logerror("fbc_r: IRECT_ABSY (%08x & %08x)\n", m_fbc.m_irect_absy, mem_mask); + return m_fbc.m_irect_absy; + case FBC_IRECT_ABSZ: + logerror("fbc_r: IRECT_ABSZ (%08x & %08x)\n", m_fbc.m_irect_absz, mem_mask); + return m_fbc.m_irect_absz; + case FBC_IRECT_RELX: + logerror("fbc_r: IRECT_RELX (%08x & %08x)\n", m_fbc.m_irect_relx, mem_mask); + return m_fbc.m_irect_relx; + case FBC_IRECT_RELY: + logerror("fbc_r: IRECT_RELY (%08x & %08x)\n", m_fbc.m_irect_rely, mem_mask); + return m_fbc.m_irect_rely; + case FBC_IRECT_RELZ: + logerror("fbc_r: IRECT_RELZ (%08x & %08x)\n", m_fbc.m_irect_relz, mem_mask); + return m_fbc.m_irect_relz; + case FBC_IRECT_R: + logerror("fbc_r: IRECT_R (%08x & %08x)\n", m_fbc.m_irect_r, mem_mask); + return m_fbc.m_irect_r; + case FBC_IRECT_G: + logerror("fbc_r: IRECT_G (%08x & %08x)\n", m_fbc.m_irect_g, mem_mask); + return m_fbc.m_irect_g; + case FBC_IRECT_B: + logerror("fbc_r: IRECT_B (%08x & %08x)\n", m_fbc.m_irect_b, mem_mask); + return m_fbc.m_irect_b; + case FBC_IRECT_A: + logerror("fbc_r: IRECT_A (%08x & %08x)\n", m_fbc.m_irect_a, mem_mask); + return m_fbc.m_irect_a; + + default: + logerror("fbc_r: Unknown register %08x & %08x\n", 0x00700000 | (offset << 2), mem_mask); + break; + } + return ret; +} + +WRITE32_MEMBER(sbus_turbogx_device::fbc_w) +{ + static const char* misc_bdisp_name[4] = { "IGNORE", "0", "1", "ILLEGAL" }; + static const char* misc_bread_name[4] = { "IGNORE", "0", "1", "ILLEGAL" }; + static const char* misc_bwrite1_name[4] = { "IGNORE", "ENABLE", "DISABLE", "ILLEGAL" }; + static const char* misc_bwrite0_name[4] = { "IGNORE", "ENABLE", "DISABLE", "ILLEGAL" }; + static const char* misc_draw_name[4] = { "IGNORE", "RENDER", "PICK", "ILLEGAL" }; + static const char* misc_data_name[4] = { "IGNORE", "COLOR8", "COLOR1", "HRMONO" }; + static const char* misc_blit_name[4] = { "IGNORE", "NOSRC", "SRC", "ILLEGAL" }; + static const char* rasterop_rop_name[16] = + { + "CLR", "SRC_NOR_DST", "NSRC_AND_DST", "NOT_SRC", "SRC_AND_NDST", "NOT_DST", "SRC_XOR_DST", "SRC_NAND_DST", + "SRC_AND_DST", "SRC_XNOR_DST", "DST", "NSRC_OR_DST", "SRC", "SRC_OR_NDST", "SRC_OR_DST", "SET" + }; + static const char* rasterop_plot_name[2] = { "PLOT", "UNPLOT" }; + static const char* rasterop_rast_name[2] = { "BOOL", "LINEAR" }; + static const char* rasterop_attr_name[4] = { "IGNORE", "UNSUPP", "SUPP", "ILLEGAL" }; + static const char* rasterop_polyg_name[4] = { "IGNORE", "OVERLAP", "NONOVERLAP", "ILLEGAL" }; + static const char* rasterop_pattern_name[4] = { "IGNORE", "ZEROES", "ONES", "MASK" }; + static const char* rasterop_pixel_name[4] = { "IGNORE", "ZEROES", "ONES", "MASK" }; + static const char* rasterop_plane_name[4] = { "IGNORE", "ZEROES", "ONES", "MASK" }; + + switch (offset) + { + case FBC_MISC: + COMBINE_DATA(&m_fbc.m_misc); + logerror("fbc_w: MISC = %08x & %08x\n", data, mem_mask); + logerror(" MISC_INDEX = %d\n", fbc_misc_index()); + logerror(" MISC_INDEX_MOD = %d\n", fbc_misc_index_mod()); + logerror(" MISC_BDISP = %d (%s)\n", fbc_misc_bdisp(), misc_bdisp_name[fbc_misc_bdisp()]); + logerror(" MISC_BREAD = %d (%s)\n", fbc_misc_bread(), misc_bread_name[fbc_misc_bread()]); + logerror(" MISC_BWRITE1 = %d (%s)\n", fbc_misc_bwrite1(), misc_bwrite1_name[fbc_misc_bwrite1()]); + logerror(" MISC_BWRITE0 = %d (%s)\n", fbc_misc_bwrite0(), misc_bwrite0_name[fbc_misc_bwrite0()]); + logerror(" MISC_DRAW = %d (%s)\n", fbc_misc_draw(), misc_draw_name[fbc_misc_draw()]); + logerror(" MISC_DATA = %d (%s)\n", fbc_misc_data(), misc_data_name[fbc_misc_data()]); + logerror(" MISC_BLIT = %d (%s)\n", fbc_misc_blit(), misc_blit_name[fbc_misc_blit()]); + break; + case FBC_CLIP_CHECK: + logerror("fbc_w: CLIP_CHECK = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_clip_check); + break; + + case FBC_STATUS: + logerror("fbc_w: STATUS = %08x & %08x\n", data, mem_mask); + //COMBINE_DATA(&m_fbc.m_status); + break; + case FBC_DRAW_STATUS: + logerror("fbc_w: DRAW_STATUS = %08x & %08x\n", data, mem_mask); + //COMBINE_DATA(&m_fbc.m_draw_status); + break; + case FBC_BLIT_STATUS: + logerror("fbc_w: BLIT_STATUS = %08x & %08x\n", data, mem_mask); + //COMBINE_DATA(&m_fbc.m_blit_status); + break; + case FBC_FONT: + logerror("fbc_w: FONT = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_font); + break; + + case FBC_X0: + logerror("fbc_w: X0 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_x0); + break; + case FBC_Y0: + logerror("fbc_w: Y0 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_y0); + break; + case FBC_Z0: + logerror("fbc_w: Z0 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_z0); + break; + case FBC_COLOR0: + logerror("fbc_w: COLOR0 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_color0); + break; + case FBC_X1: + logerror("fbc_w: X1 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_x1); + break; + case FBC_Y1: + logerror("fbc_w: Y1 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_y1); + break; + case FBC_Z1: + logerror("fbc_w: Z1 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_z1); + break; + case FBC_COLOR1: + logerror("fbc_w: COLOR1 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_color1); + break; + case FBC_X2: + logerror("fbc_w: X2 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_x2); + break; + case FBC_Y2: + logerror("fbc_w: Y2 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_y2); + break; + case FBC_Z2: + logerror("fbc_w: Z2 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_z2); + break; + case FBC_COLOR2: + logerror("fbc_w: COLOR2 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_color2); + break; + case FBC_X3: + logerror("fbc_w: X3 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_x3); + break; + case FBC_Y3: + logerror("fbc_w: Y3 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_y3); + break; + case FBC_Z3: + logerror("fbc_w: Z3 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_z3); + break; + case FBC_COLOR3: + logerror("fbc_w: COLOR3 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_color3); + break; + + case FBC_RASTER_OFFX: + logerror("fbc_w: RASTER_OFFX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_raster_offx); + break; + case FBC_RASTER_OFFY: + logerror("fbc_w: RASTER_OFFY = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_raster_offy); + break; + case FBC_AUTOINCX: + logerror("fbc_w: AUTOINCX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_autoincx); + break; + case FBC_AUTOINCY: + logerror("fbc_w: AUTOINCY = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_autoincy); + break; + case FBC_CLIP_MINX: + logerror("fbc_w: CLIP_MINX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_clip_minx); + break; + case FBC_CLIP_MINY: + logerror("fbc_w: CLIP_MINY = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_clip_miny); + break; + case FBC_CLIP_MAXX: + logerror("fbc_w: CLIP_MAXX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_clip_maxx); + break; + case FBC_CLIP_MAXY: + logerror("fbc_w: CLIP_MAXY (%08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_clip_maxy); + break; + + case FBC_FCOLOR: + logerror("fbc_w: FCOLOR = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_fcolor); + break; + case FBC_BCOLOR: + logerror("fbc_w: BCOLOR = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_bcolor); + break; + case FBC_RASTEROP: + COMBINE_DATA(&m_fbc.m_rasterop); + logerror("fbc_w: RASTEROP = %08x & %08x\n", data, mem_mask); + logerror(" RASTEROP_ROP00 = %d (%s)\n", fbc_rasterop_rop00(), rasterop_rop_name[fbc_rasterop_rop00()]); + logerror(" RASTEROP_ROP01 = %d (%s)\n", fbc_rasterop_rop01(), rasterop_rop_name[fbc_rasterop_rop01()]); + logerror(" RASTEROP_ROP10 = %d (%s)\n", fbc_rasterop_rop10(), rasterop_rop_name[fbc_rasterop_rop10()]); + logerror(" RASTEROP_ROP11 = %d (%s)\n", fbc_rasterop_rop11(), rasterop_rop_name[fbc_rasterop_rop11()]); + logerror(" RASTEROP_PLOT = %d (%s)\n", fbc_rasterop_plot(), rasterop_plot_name[fbc_rasterop_plot()]); + logerror(" RASTEROP_RAST = %d (%s)\n", fbc_rasterop_rast(), rasterop_rast_name[fbc_rasterop_rast()]); + logerror(" RASTEROP_ATTR = %d (%s)\n", fbc_rasterop_attr(), rasterop_attr_name[fbc_rasterop_attr()]); + logerror(" RASTEROP_POLYG = %d (%s)\n", fbc_rasterop_polyg(), rasterop_polyg_name[fbc_rasterop_polyg()]); + logerror(" RASTEROP_PATT = %d (%s)\n", fbc_rasterop_pattern(), rasterop_pattern_name[fbc_rasterop_pattern()]); + logerror(" RASTEROP_PIXEL = %d (%s)\n", fbc_rasterop_pixel(), rasterop_pixel_name[fbc_rasterop_pixel()]); + logerror(" RASTEROP_PLANE = %d (%s)\n", fbc_rasterop_plane(), rasterop_plane_name[fbc_rasterop_plane()]); + break; + case FBC_PLANE_MASK: + logerror("fbc_w: PLANE_MASK = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_plane_mask); + break; + case FBC_PIXEL_MASK: + logerror("fbc_w: PIXEL_MASK = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_pixel_mask); + break; + + case FBC_PATT_ALIGN: + logerror("fbc_w: PATT_ALIGN = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_patt_align); + break; + case FBC_PATTERN0: + logerror("fbc_w: PATTERN0 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_pattern[0]); + break; + case FBC_PATTERN1: + logerror("fbc_w: PATTERN1 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_pattern[1]); + break; + case FBC_PATTERN2: + logerror("fbc_w: PATTERN2 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_pattern[2]); + break; + case FBC_PATTERN3: + logerror("fbc_w: PATTERN3 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_pattern[3]); + break; + case FBC_PATTERN4: + logerror("fbc_w: PATTERN4 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_pattern[4]); + break; + case FBC_PATTERN5: + logerror("fbc_w: PATTERN5 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_pattern[5]); + break; + case FBC_PATTERN6: + logerror("fbc_w: PATTERN6 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_pattern[6]); + break; + case FBC_PATTERN7: + logerror("fbc_w: PATTERN7 = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_pattern[7]); + break; + + case FBC_IPOINT_ABSX: + logerror("fbc_w: IPOINT_ABSX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_ipoint_absx); + break; + case FBC_IPOINT_ABSY: + logerror("fbc_w: IPOINT_ABSY = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_ipoint_absy); + break; + case FBC_IPOINT_ABSZ: + logerror("fbc_w: IPOINT_ABSZ = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_ipoint_absz); + break; + case FBC_IPOINT_RELX: + logerror("fbc_w: IPOINT_RELX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_ipoint_relx); + break; + case FBC_IPOINT_RELY: + logerror("fbc_w: IPOINT_RELY = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_ipoint_rely); + break; + case FBC_IPOINT_RELZ: + logerror("fbc_w: IPOINT_RELZ = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_ipoint_relz); + break; + case FBC_IPOINT_R: + logerror("fbc_w: IPOINT_R = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_ipoint_r); + break; + case FBC_IPOINT_G: + logerror("fbc_w: IPOINT_G = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_ipoint_g); + break; + case FBC_IPOINT_B: + logerror("fbc_w: IPOINT_B = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_ipoint_b); + break; + case FBC_IPOINT_A: + logerror("fbc_w: IPOINT_A = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_ipoint_a); + break; + + case FBC_ILINE_ABSX: + logerror("fbc_w: ILINE_ABSX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iline_absx); + break; + case FBC_ILINE_ABSY: + logerror("fbc_w: ILINE_ABSY = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iline_absy); + break; + case FBC_ILINE_ABSZ: + logerror("fbc_w: ILINE_ABSZ = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iline_absz); + break; + case FBC_ILINE_RELX: + logerror("fbc_w: ILINE_RELX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iline_relx); + break; + case FBC_ILINE_RELY: + logerror("fbc_w: ILINE_RELY = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iline_rely); + break; + case FBC_ILINE_RELZ: + logerror("fbc_w: ILINE_RELZ = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iline_relz); + break; + case FBC_ILINE_R: + logerror("fbc_w: ILINE_R = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iline_r); + break; + case FBC_ILINE_G: + logerror("fbc_w: ILINE_G = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iline_g); + break; + case FBC_ILINE_B: + logerror("fbc_w: ILINE_B = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iline_b); + break; + case FBC_ILINE_A: + logerror("fbc_w: ILINE_A = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iline_a); + break; + + case FBC_ITRI_ABSX: + logerror("fbc_w: ITRI_ABSX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_itri_absx); + break; + case FBC_ITRI_ABSY: + COMBINE_DATA(&m_fbc.m_itri_absy); + logerror("fbc_w: ITRI_ABSY = %08x & %08x\n", data, mem_mask); + break; + case FBC_ITRI_ABSZ: + logerror("fbc_w: ITRI_ABSZ = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_itri_absz); + break; + case FBC_ITRI_RELX: + logerror("fbc_w: ITRI_RELX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_itri_relx); + break; + case FBC_ITRI_RELY: + logerror("fbc_w: ITRI_RELY = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_itri_rely); + break; + case FBC_ITRI_RELZ: + logerror("fbc_w: ITRI_RELZ = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_itri_relz); + break; + case FBC_ITRI_R: + logerror("fbc_w: ITRI_R = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_itri_r); + break; + case FBC_ITRI_G: + logerror("fbc_w: ITRI_G = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_itri_g); + break; + case FBC_ITRI_B: + logerror("fbc_w: ITRI_B = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_itri_b); + break; + case FBC_ITRI_A: + logerror("fbc_w: ITRI_A = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_itri_a); + break; + + case FBC_IQUAD_ABSX: + logerror("fbc_w: IQUAD_ABSX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iquad_absx); + break; + case FBC_IQUAD_ABSY: + logerror("fbc_w: IQUAD_ABSY = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iquad_absy); + break; + case FBC_IQUAD_ABSZ: + logerror("fbc_w: IQUAD_ABSZ = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iquad_absz); + break; + case FBC_IQUAD_RELX: + logerror("fbc_w: IQUAD_RELX = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iquad_relx); + break; + case FBC_IQUAD_RELY: + logerror("fbc_w: IQUAD_RELY = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iquad_rely); + break; + case FBC_IQUAD_RELZ: + logerror("fbc_w: IQUAD_RELZ = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iquad_relz); + break; + case FBC_IQUAD_R: + logerror("fbc_w: IQUAD_R = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iquad_r); + break; + case FBC_IQUAD_G: + logerror("fbc_w: IQUAD_G = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iquad_g); + break; + case FBC_IQUAD_B: + logerror("fbc_w: IQUAD_B = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iquad_b); + break; + case FBC_IQUAD_A: + logerror("fbc_w: IQUAD_A = %08x & %08x\n", data, mem_mask); + COMBINE_DATA(&m_fbc.m_iquad_a); + break; + + case FBC_IRECT_ABSX: + logerror("fbc_w: IRECT_ABSX = %08x & %08x\n", data, mem_mask); + m_fbc.m_prim_buf[m_fbc.m_vertex_count].m_absx = data; + m_fbc.m_vertex_count++; + m_fbc.m_curr_prim_type = PRIM_RECT; + break; + case FBC_IRECT_ABSY: + logerror("fbc_w: IRECT_ABSY = %08x & %08x\n", data, mem_mask); + m_fbc.m_prim_buf[m_fbc.m_vertex_count].m_absy = data; + break; + case FBC_IRECT_ABSZ: + logerror("fbc_w: IRECT_ABSZ = %08x & %08x\n", data, mem_mask); + m_fbc.m_prim_buf[m_fbc.m_vertex_count].m_absz = data; + break; + case FBC_IRECT_RELX: + logerror("fbc_w: IRECT_RELX = %08x & %08x\n", data, mem_mask); + m_fbc.m_prim_buf[m_fbc.m_vertex_count].m_relx = data; + break; + case FBC_IRECT_RELY: + logerror("fbc_w: IRECT_RELY = %08x & %08x\n", data, mem_mask); + m_fbc.m_prim_buf[m_fbc.m_vertex_count].m_rely = data; + break; + case FBC_IRECT_RELZ: + logerror("fbc_w: IRECT_RELZ = %08x & %08x\n", data, mem_mask); + m_fbc.m_prim_buf[m_fbc.m_vertex_count].m_relz = data; + break; + case FBC_IRECT_R: + logerror("fbc_w: IRECT_R = %08x & %08x\n", data, mem_mask); + m_fbc.m_prim_buf[m_fbc.m_vertex_count].m_r = data; + break; + case FBC_IRECT_G: + logerror("fbc_w: IRECT_G = %08x & %08x\n", data, mem_mask); + m_fbc.m_prim_buf[m_fbc.m_vertex_count].m_g = data; + break; + case FBC_IRECT_B: + logerror("fbc_w: IRECT_B = %08x & %08x\n", data, mem_mask); + m_fbc.m_prim_buf[m_fbc.m_vertex_count].m_b = data; + break; + case FBC_IRECT_A: + logerror("fbc_w: IRECT_A = %08x & %08x\n", data, mem_mask); + m_fbc.m_prim_buf[m_fbc.m_vertex_count].m_a = data; + break; + + default: + logerror("fbc_w: Unknown register %08x = %08x & %08x\n", 0x00700000 | (offset << 2), data, mem_mask); + break; + } +} diff --git a/src/devices/bus/sbus/turbogx.h b/src/devices/bus/sbus/turbogx.h new file mode 100644 index 00000000000..aa7a3e850bf --- /dev/null +++ b/src/devices/bus/sbus/turbogx.h @@ -0,0 +1,483 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + Sun TurboGX accelerated 8-bit color video controller + +***************************************************************************/ + +#ifndef MAME_BUS_SBUS_TURBOGX_H +#define MAME_BUS_SBUS_TURBOGX_H + +#pragma once + +#include "sbus.h" +#include "emupal.h" + +class sbus_turbogx_device : public device_t, public device_sbus_card_interface +{ +public: + // construction/destruction + sbus_turbogx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t overrides + virtual const tiny_rom_entry *device_rom_region() const override; + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + virtual void device_reset() override; + + // device_sbus_slot_interface overrides + virtual void install_device() override; + + void palette_init(palette_device &palette); + + DECLARE_READ32_MEMBER(rom_r); + DECLARE_READ32_MEMBER(unknown_r); + DECLARE_WRITE32_MEMBER(unknown_w); + DECLARE_READ32_MEMBER(vram_r); + DECLARE_WRITE32_MEMBER(vram_w); + DECLARE_WRITE32_MEMBER(palette_w); + DECLARE_READ32_MEMBER(fbc_r); + DECLARE_WRITE32_MEMBER(fbc_w); + +private: + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + uint8_t perform_rasterop(uint8_t src, uint8_t dst); + void handle_blit_command(); + void handle_draw_command(); + + void mem_map(address_map &map) override; + + enum + { + ROP_CLR = 0x00, + ROP_SRC_NOR_DST = 0x01, + ROP_NSRC_AND_DST = 0x02, + ROP_NOT_SRC = 0x03, + ROP_SRC_AND_NDST = 0x04, + ROP_NOT_DST = 0x05, + ROP_SRC_XOR_DST = 0x06, + ROP_SRC_NAND_DST = 0x07, + ROP_SRC_AND_DST = 0x08, + ROP_SRC_XNOR_DST = 0x09, + ROP_DST = 0x0a, + ROP_NSRC_OR_DST = 0x0b, + ROP_SRC = 0x0c, + ROP_SRC_OR_NDST = 0x0d, + ROP_SRC_OR_DST = 0x0e, + ROP_SET = 0x0f + }; + + enum + { + FBC_MISC_INDEX_SHIFT = 4, + FBC_MISC_INDEX_MOD_SHIFT = 6, + FBC_MISC_BDISP_SHIFT = 7, + FBC_MISC_BREAD_SHIFT = 9, + FBC_MISC_BWRITE1_SHIFT = 11, + FBC_MISC_BWRITE0_SHIFT = 13, + FBC_MISC_DRAW_SHIFT = 15, + FBC_MISC_DATA_SHIFT = 17, + FBC_MISC_VBLANK_SHIFT = 19, + FBC_MISC_BLIT_SHIFT = 20 + }; + + enum + { + FBC_MISC_INDEX_MASK = 0x3, + FBC_MISC_INDEX_MOD_MASK = 0x1, + FBC_MISC_BDISP_MASK = 0x3, + FBC_MISC_BREAD_MASK = 0x3, + FBC_MISC_BWRITE1_MASK = 0x3, + FBC_MISC_BWRITE0_MASK = 0x3, + FBC_MISC_DRAW_MASK = 0x3, + FBC_MISC_DATA_MASK = 0x3, + FBC_MISC_VBLANK_MASK = 0x1, + FBC_MISC_BLIT_MASK = 0x3 + }; + + enum + { + FBC_MISC_BDISP_IGNORE = 0, + FBC_MISC_BDISP_0 = 1, + FBC_MISC_BDISP_1 = 2, + FBC_MISC_BDISP_ILLEGAL = 3, + + FBC_MISC_BREAD_IGNORE = 0, + FBC_MISC_BREAD_0 = 1, + FBC_MISC_BREAD_1 = 2, + FBC_MISC_BREAD_ILLEGAL = 3, + + FBC_MISC_BWRITE1_IGNORE = 0, + FBC_MISC_BWRITE1_ENABLE = 1, + FBC_MISC_BWRITE1_DISABLE = 2, + FBC_MISC_BWRITE1_ILLEGAL = 3, + + FBC_MISC_BWRITE0_IGNORE = 0, + FBC_MISC_BWRITE0_ENABLE = 1, + FBC_MISC_BWRITE0_DISABLE = 2, + FBC_MISC_BWRITE0_ILLEGAL = 3, + + FBC_MISC_DRAW_IGNORE = 0, + FBC_MISC_DRAW_RENDER = 1, + FBC_MISC_DRAW_PICK = 2, + FBC_MISC_DRAW_ILLEGAL = 3, + + FBC_MISC_DATA_IGNORE = 0, + FBC_MISC_DATA_COLOR8 = 1, + FBC_MISC_DATA_COLOR1 = 2, + FBC_MISC_DATA_HRMONO = 3, + + FBC_MISC_BLIT_IGNORE = 0, + FBC_MISC_BLIT_NOSRC = 1, + FBC_MISC_BLIT_SRC = 2, + FBC_MISC_BLIT_ILLEGAL = 3 + }; + + inline uint32_t fbc_misc_index() { return (m_fbc.m_misc >> FBC_MISC_INDEX_SHIFT) & FBC_MISC_INDEX_MASK; } + inline uint32_t fbc_misc_index_mod() { return (m_fbc.m_misc >> FBC_MISC_INDEX_MOD_SHIFT) & FBC_MISC_INDEX_MOD_MASK; } + inline uint32_t fbc_misc_bdisp() { return (m_fbc.m_misc >> FBC_MISC_BDISP_SHIFT) & FBC_MISC_BDISP_MASK; } + inline uint32_t fbc_misc_bread() { return (m_fbc.m_misc >> FBC_MISC_BREAD_SHIFT) & FBC_MISC_BREAD_MASK; } + inline uint32_t fbc_misc_bwrite1() { return (m_fbc.m_misc >> FBC_MISC_BWRITE1_SHIFT) & FBC_MISC_BWRITE1_MASK; } + inline uint32_t fbc_misc_bwrite0() { return (m_fbc.m_misc >> FBC_MISC_BWRITE0_SHIFT) & FBC_MISC_BWRITE0_MASK; } + inline uint32_t fbc_misc_draw() { return (m_fbc.m_misc >> FBC_MISC_DRAW_SHIFT) & FBC_MISC_DRAW_MASK; } + inline uint32_t fbc_misc_data() { return (m_fbc.m_misc >> FBC_MISC_DATA_SHIFT) & FBC_MISC_DATA_MASK; } + inline uint32_t fbc_misc_blit() { return (m_fbc.m_misc >> FBC_MISC_BLIT_SHIFT) & FBC_MISC_BLIT_MASK; } + + enum + { + FBC_RASTEROP_ROP00_SHIFT = 0, + FBC_RASTEROP_ROP01_SHIFT = 4, + FBC_RASTEROP_ROP10_SHIFT = 8, + FBC_RASTEROP_ROP11_SHIFT = 12, + FBC_RASTEROP_PLOT_SHIFT = 16, + FBC_RASTEROP_RAST_SHIFT = 17, + FBC_RASTEROP_ATTR_SHIFT = 22, + FBC_RASTEROP_POLYG_SHIFT = 24, + FBC_RASTEROP_PATT_SHIFT = 26, + FBC_RASTEROP_PIXEL_SHIFT = 28, + FBC_RASTEROP_PLANE_SHIFT = 30 + }; + + enum + { + FBC_RASTEROP_ROP00_MASK = 0xf, + FBC_RASTEROP_ROP01_MASK = 0xf, + FBC_RASTEROP_ROP10_MASK = 0xf, + FBC_RASTEROP_ROP11_MASK = 0xf, + FBC_RASTEROP_PLOT_MASK = 0x1, + FBC_RASTEROP_RAST_MASK = 0x1, + FBC_RASTEROP_ATTR_MASK = 0x3, + FBC_RASTEROP_POLYG_MASK = 0x3, + FBC_RASTEROP_PATT_MASK = 0x3, + FBC_RASTEROP_PIXEL_MASK = 0x3, + FBC_RASTEROP_PLANE_MASK = 0x3 + }; + + enum + { + FBC_RASTEROP_PLOT_PLOT = 0, + FBC_RASTEROP_PLOT_UNPLOT = 1, + + FBC_RASTEROP_RAST_BOOL = 0, + FBC_RASTEROP_RAST_LINEAR = 1, + + FBC_RASTEROP_ATTR_IGNORE = 0, + FBC_RASTEROP_ATTR_UNSUPP = 1, + FBC_RASTEROP_ATTR_SUPP = 2, + FBC_RASTEROP_ATTR_ILLEGAL = 3, + + FBC_RASTEROP_POLYG_IGNORE = 0, + FBC_RASTEROP_POLYG_OVERLAP = 1, + FBC_RASTEROP_POLYG_NONOVERLAP = 2, + FBC_RASTEROP_POLYG_ILLEGAL = 3, + + FBC_RASTEROP_PATTERN_IGNORE = 0, + FBC_RASTEROP_PATTERN_ZEROES = 1, + FBC_RASTEROP_PATTERN_ONES = 2, + FBC_RASTEROP_PATTERN_MSK = 3, + + FBC_RASTEROP_PIXEL_IGNORE = 0, + FBC_RASTEROP_PIXEL_ZEROES = 1, + FBC_RASTEROP_PIXEL_ONES = 2, + FBC_RASTEROP_PIXEL_MSK = 3, + + FBC_RASTEROP_PLANE_IGNORE = 0, + FBC_RASTEROP_PLANE_ZEROES = 1, + FBC_RASTEROP_PLANE_ONES = 2, + FBC_RASTEROP_PLANE_MSK = 3 + }; + + inline uint32_t fbc_rasterop_rop00() { return (m_fbc.m_rasterop >> FBC_RASTEROP_ROP00_SHIFT) & FBC_RASTEROP_ROP00_MASK; } + inline uint32_t fbc_rasterop_rop01() { return (m_fbc.m_rasterop >> FBC_RASTEROP_ROP01_SHIFT) & FBC_RASTEROP_ROP01_MASK; } + inline uint32_t fbc_rasterop_rop10() { return (m_fbc.m_rasterop >> FBC_RASTEROP_ROP10_SHIFT) & FBC_RASTEROP_ROP10_MASK; } + inline uint32_t fbc_rasterop_rop11() { return (m_fbc.m_rasterop >> FBC_RASTEROP_ROP11_SHIFT) & FBC_RASTEROP_ROP11_MASK; } + inline uint32_t fbc_rasterop_plot() { return (m_fbc.m_rasterop >> FBC_RASTEROP_PLOT_SHIFT) & FBC_RASTEROP_PLOT_MASK; } + inline uint32_t fbc_rasterop_rast() { return (m_fbc.m_rasterop >> FBC_RASTEROP_RAST_SHIFT) & FBC_RASTEROP_RAST_MASK; } + inline uint32_t fbc_rasterop_attr() { return (m_fbc.m_rasterop >> FBC_RASTEROP_ATTR_SHIFT) & FBC_RASTEROP_ATTR_MASK; } + inline uint32_t fbc_rasterop_polyg() { return (m_fbc.m_rasterop >> FBC_RASTEROP_POLYG_SHIFT) & FBC_RASTEROP_POLYG_MASK; } + inline uint32_t fbc_rasterop_pattern() { return (m_fbc.m_rasterop >> FBC_RASTEROP_PATT_SHIFT) & FBC_RASTEROP_PATT_MASK; } + inline uint32_t fbc_rasterop_pixel() { return (m_fbc.m_rasterop >> FBC_RASTEROP_PIXEL_SHIFT) & FBC_RASTEROP_PIXEL_MASK; } + inline uint32_t fbc_rasterop_plane() { return (m_fbc.m_rasterop >> FBC_RASTEROP_PLANE_SHIFT) & FBC_RASTEROP_PLANE_MASK; } + + enum + { + FBC_MISC = 0x004/4, + FBC_CLIP_CHECK = 0x008/4, + + FBC_STATUS = 0x010/4, + FBC_DRAW_STATUS = 0x014/4, + FBC_BLIT_STATUS = 0x018/4, + FBC_FONT = 0x01c/4, + + FBC_X0 = 0x080/4, + FBC_Y0 = 0x084/4, + FBC_Z0 = 0x088/4, + FBC_COLOR0 = 0x08c/4, + FBC_X1 = 0x090/4, + FBC_Y1 = 0x094/4, + FBC_Z1 = 0x098/4, + FBC_COLOR1 = 0x09c/4, + FBC_X2 = 0x0a0/4, + FBC_Y2 = 0x0a4/4, + FBC_Z2 = 0x0a8/4, + FBC_COLOR2 = 0x0ac/4, + FBC_X3 = 0x0b0/4, + FBC_Y3 = 0x0b4/4, + FBC_Z3 = 0x0b8/4, + FBC_COLOR3 = 0x0bc/4, + + FBC_RASTER_OFFX = 0x0c0/4, + FBC_RASTER_OFFY = 0x0c4/4, + FBC_AUTOINCX = 0x0d0/4, + FBC_AUTOINCY = 0x0d4/4, + FBC_CLIP_MINX = 0x0e0/4, + FBC_CLIP_MINY = 0x0e4/4, + FBC_CLIP_MAXX = 0x0f0/4, + FBC_CLIP_MAXY = 0x0f4/4, + + FBC_FCOLOR = 0x100/4, + FBC_BCOLOR = 0x104/4, + FBC_RASTEROP = 0x108/4, + FBC_PLANE_MASK = 0x10c/4, + FBC_PIXEL_MASK = 0x110/4, + + FBC_PATT_ALIGN = 0x11c/4, + FBC_PATTERN0 = 0x120/4, + FBC_PATTERN1 = 0x124/4, + FBC_PATTERN2 = 0x128/4, + FBC_PATTERN3 = 0x12c/4, + FBC_PATTERN4 = 0x130/4, + FBC_PATTERN5 = 0x134/4, + FBC_PATTERN6 = 0x138/4, + FBC_PATTERN7 = 0x13c/4, + + FBC_IPOINT_ABSX = 0x800/4, + FBC_IPOINT_ABSY = 0x804/4, + FBC_IPOINT_ABSZ = 0x808/4, + FBC_IPOINT_RELX = 0x810/4, + FBC_IPOINT_RELY = 0x814/4, + FBC_IPOINT_RELZ = 0x818/4, + FBC_IPOINT_R = 0x830/4, + FBC_IPOINT_G = 0x834/4, + FBC_IPOINT_B = 0x838/4, + FBC_IPOINT_A = 0x83c/4, + + FBC_ILINE_ABSX = 0x840/4, + FBC_ILINE_ABSY = 0x844/4, + FBC_ILINE_ABSZ = 0x848/4, + FBC_ILINE_RELX = 0x850/4, + FBC_ILINE_RELY = 0x854/4, + FBC_ILINE_RELZ = 0x858/4, + FBC_ILINE_R = 0x870/4, + FBC_ILINE_G = 0x874/4, + FBC_ILINE_B = 0x878/4, + FBC_ILINE_A = 0x87c/4, + + FBC_ITRI_ABSX = 0x880/4, + FBC_ITRI_ABSY = 0x884/4, + FBC_ITRI_ABSZ = 0x888/4, + FBC_ITRI_RELX = 0x890/4, + FBC_ITRI_RELY = 0x894/4, + FBC_ITRI_RELZ = 0x898/4, + FBC_ITRI_R = 0x8b0/4, + FBC_ITRI_G = 0x8b4/4, + FBC_ITRI_B = 0x8b8/4, + FBC_ITRI_A = 0x8bc/4, + + FBC_IQUAD_ABSX = 0x8c0/4, + FBC_IQUAD_ABSY = 0x8c4/4, + FBC_IQUAD_ABSZ = 0x8c8/4, + FBC_IQUAD_RELX = 0x8d0/4, + FBC_IQUAD_RELY = 0x8d4/4, + FBC_IQUAD_RELZ = 0x8d8/4, + FBC_IQUAD_R = 0x8f0/4, + FBC_IQUAD_G = 0x8f4/4, + FBC_IQUAD_B = 0x8f8/4, + FBC_IQUAD_A = 0x8fc/4, + + FBC_IRECT_ABSX = 0x900/4, + FBC_IRECT_ABSY = 0x904/4, + FBC_IRECT_ABSZ = 0x908/4, + FBC_IRECT_RELX = 0x910/4, + FBC_IRECT_RELY = 0x914/4, + FBC_IRECT_RELZ = 0x918/4, + FBC_IRECT_R = 0x930/4, + FBC_IRECT_G = 0x934/4, + FBC_IRECT_B = 0x938/4, + FBC_IRECT_A = 0x93c/4, + }; + + struct vertex_t + { + uint32_t m_absx; + uint32_t m_absy; + uint32_t m_absz; + uint32_t m_relx; + uint32_t m_rely; + uint32_t m_relz; + uint32_t m_r; + uint32_t m_g; + uint32_t m_b; + uint32_t m_a; + }; + + enum prim_type + { + PRIM_POINT = 0, + PRIM_LINE, + PRIM_TRI, + PRIM_QUAD, + PRIM_RECT, + + PRIM_COUNT + }; + + struct fbc_t + { + uint32_t m_misc; + uint32_t m_clip_check; + uint32_t m_status; + uint32_t m_draw_status; + uint32_t m_blit_status; + uint32_t m_font; + + uint32_t m_x0; + uint32_t m_y0; + uint32_t m_z0; + uint32_t m_color0; + uint32_t m_x1; + uint32_t m_y1; + uint32_t m_z1; + uint32_t m_color1; + uint32_t m_x2; + uint32_t m_y2; + uint32_t m_z2; + uint32_t m_color2; + uint32_t m_x3; + uint32_t m_y3; + uint32_t m_z3; + uint32_t m_color3; + + uint32_t m_raster_offx; + uint32_t m_raster_offy; + + uint32_t m_autoincx; + uint32_t m_autoincy; + + uint32_t m_clip_minx; + uint32_t m_clip_miny; + + uint32_t m_clip_maxx; + uint32_t m_clip_maxy; + + uint8_t m_fcolor; + uint8_t m_bcolor; + + uint32_t m_rasterop; + + uint32_t m_plane_mask; + uint32_t m_pixel_mask; + + uint32_t m_patt_align; + uint32_t m_pattern[8]; + + uint32_t m_ipoint_absx; + uint32_t m_ipoint_absy; + uint32_t m_ipoint_absz; + uint32_t m_ipoint_relx; + uint32_t m_ipoint_rely; + uint32_t m_ipoint_relz; + uint32_t m_ipoint_r; + uint32_t m_ipoint_g; + uint32_t m_ipoint_b; + uint32_t m_ipoint_a; + + uint32_t m_iline_absx; + uint32_t m_iline_absy; + uint32_t m_iline_absz; + uint32_t m_iline_relx; + uint32_t m_iline_rely; + uint32_t m_iline_relz; + uint32_t m_iline_r; + uint32_t m_iline_g; + uint32_t m_iline_b; + uint32_t m_iline_a; + + uint32_t m_itri_absx; + uint32_t m_itri_absy; + uint32_t m_itri_absz; + uint32_t m_itri_relx; + uint32_t m_itri_rely; + uint32_t m_itri_relz; + uint32_t m_itri_r; + uint32_t m_itri_g; + uint32_t m_itri_b; + uint32_t m_itri_a; + + uint32_t m_iquad_absx; + uint32_t m_iquad_absy; + uint32_t m_iquad_absz; + uint32_t m_iquad_relx; + uint32_t m_iquad_rely; + uint32_t m_iquad_relz; + uint32_t m_iquad_r; + uint32_t m_iquad_g; + uint32_t m_iquad_b; + uint32_t m_iquad_a; + + uint32_t m_irect_absx; + uint32_t m_irect_absy; + uint32_t m_irect_absz; + uint32_t m_irect_relx; + uint32_t m_irect_rely; + uint32_t m_irect_relz; + uint32_t m_irect_r; + uint32_t m_irect_g; + uint32_t m_irect_b; + uint32_t m_irect_a; + + vertex_t m_prim_buf[0x1000]; // unknown size + uint32_t m_vertex_count; + prim_type m_curr_prim_type; + }; + + required_memory_region m_rom; + std::unique_ptr<uint32_t[]> m_vram; + required_device<screen_device> m_screen; + required_device<palette_device> m_palette; + + uint8_t m_palette_entry; + uint8_t m_palette_r; + uint8_t m_palette_g; + uint8_t m_palette_b; + uint8_t m_palette_step; + + fbc_t m_fbc; +}; + +// device type definition +DECLARE_DEVICE_TYPE(SBUS_TURBOGX, sbus_turbogx_device) + +#endif // MAME_BUS_SBUS_TURBOGX_H diff --git a/src/devices/bus/spectrum/uspeech.cpp b/src/devices/bus/spectrum/uspeech.cpp index a07852c15c7..852ac24c11d 100644 --- a/src/devices/bus/spectrum/uspeech.cpp +++ b/src/devices/bus/spectrum/uspeech.cpp @@ -128,7 +128,7 @@ WRITE8_MEMBER(spectrum_uspeech_device::mreq_w) { case 0x1000: // allophone - m_nsp->ald_w(space, 0, data & 0x3f); + m_nsp->ald_w(data & 0x3f); break; case 0x3000: diff --git a/src/devices/bus/ti99/internal/998board.cpp b/src/devices/bus/ti99/internal/998board.cpp index 957fd1f0558..b81eeb01c59 100644 --- a/src/devices/bus/ti99/internal/998board.cpp +++ b/src/devices/bus/ti99/internal/998board.cpp @@ -749,7 +749,7 @@ READ8_MEMBER( mainboard8_device::read ) // Speech if (m_vaquerro->sprd_out()==ASSERT_LINE) { - value = m_speech->status_r(space, 0) & 0xff; + value = m_speech->status_r() & 0xff; what = "speech"; goto readdone; } @@ -947,7 +947,7 @@ WRITE8_MEMBER( mainboard8_device::write ) if (m_vaquerro->spwt_out()==ASSERT_LINE) { LOGMASKED(LOG_MEM, "Write %04x (speech) <- %02x\n", m_logical_address, data); - m_speech->data_w(space, 0, data); + m_speech->data_w(data); m_pending_write = false; } diff --git a/src/devices/bus/ti99/peb/spchsyn.cpp b/src/devices/bus/ti99/peb/spchsyn.cpp index 233f8d58e4d..0f10eea1f33 100644 --- a/src/devices/bus/ti99/peb/spchsyn.cpp +++ b/src/devices/bus/ti99/peb/spchsyn.cpp @@ -61,7 +61,7 @@ READ8Z_MEMBER( ti_speech_synthesizer_device::readz ) if (m_sbe) { - *value = m_vsp->status_r(space, 0, 0xff) & 0xff; + *value = m_vsp->status_r() & 0xff; LOGMASKED(LOG_MEM, "read value = %02x\n", *value); // We should clear the lines at this point. The TI-99/4A clears the // lines by setting the address bus to a different value, but the @@ -81,7 +81,7 @@ WRITE8_MEMBER( ti_speech_synthesizer_device::write ) if (m_sbe) { LOGMASKED(LOG_MEM, "write value = %02x\n", data); - m_vsp->data_w(space, 0, data); + m_vsp->data_w(data); // Note that we must NOT clear the lines here. Find the lines in the // READY callback below. } diff --git a/src/devices/cpu/m6502/m6500_1.cpp b/src/devices/cpu/m6502/m6500_1.cpp index 153954f8845..cb3630e6668 100644 --- a/src/devices/cpu/m6502/m6500_1.cpp +++ b/src/devices/cpu/m6502/m6500_1.cpp @@ -486,6 +486,13 @@ void m6500_1_device::toggle_cntr() void m6500_1_device::memory_map(address_map &map) { + // there's probably a lot more mirroring here + // it's likely RAM is mirrored at 0x0040-0x007f and the entire 0x0000-0x00ff repeats every 0x100 up to 0x07ff + // this would make the decoding simple: + // 0xxx 0xaa aaaa -> RAM + // 0xxx 1xxx aaaa -> peripheral + // 1aaa aaaa aaaa -> ROM + map.global_mask(0x0fff); // guessed map.unmap_value_high(); // guessed diff --git a/src/devices/cpu/sparc/mb86901.cpp b/src/devices/cpu/sparc/mb86901.cpp index 977455e72f0..f01e21909f1 100644 --- a/src/devices/cpu/sparc/mb86901.cpp +++ b/src/devices/cpu/sparc/mb86901.cpp @@ -11,7 +11,6 @@ // To-Do: // - Ops: FBFcc, LDF, STF // - Test: SPARCv8 ops are untested -// - Test: Traps are untested // - FPU support // - Coprocessor support // @@ -1337,6 +1336,7 @@ void mb86901_device::execute_saverestore(uint32_t op) result = rs1 + operand2; PSR &= ~PSR_CWP_MASK; PSR |= new_cwp; + BREAK_PSR; } } else if (RESTORE) @@ -1352,6 +1352,7 @@ void mb86901_device::execute_saverestore(uint32_t op) result = rs1 + operand2; PSR &= ~PSR_CWP_MASK; PSR |= new_cwp; + BREAK_PSR; } } @@ -2588,7 +2589,7 @@ void mb86901_device::select_trap() else if (m_interrupt_level > 0) m_tt = 0x10 | m_interrupt_level; - TBR |= m_tt << 4; + TBR = (TBR & 0xfffff000) | (m_tt << 4); m_trap = 0; m_instruction_access_exception = 0; m_illegal_instruction = 0; diff --git a/src/devices/cpu/sparc/sparc.h b/src/devices/cpu/sparc/sparc.h index 435fee74e91..29856915845 100644 --- a/src/devices/cpu/sparc/sparc.h +++ b/src/devices/cpu/sparc/sparc.h @@ -50,6 +50,7 @@ public: uint8_t get_asi() { return m_asi; } uint32_t pc() { return m_pc; } + void set_mae() { m_mae = 1; } void add_asi_desc(std::function<void (sparc_disassembler *)> f) { m_asi_desc_adder = f; } diff --git a/src/devices/cpu/tms32025/tms32025.h b/src/devices/cpu/tms32025/tms32025.h index de7f2681bb7..4deaac2423f 100644 --- a/src/devices/cpu/tms32025/tms32025.h +++ b/src/devices/cpu/tms32025/tms32025.h @@ -23,25 +23,6 @@ #pragma once -#define MCFG_TMS32025_BIO_IN_CB(_devcb) \ - downcast<tms32025_device &>(*device).set_bio_in_cb(DEVCB_##_devcb); /* BIO input */ - -#define MCFG_TMS32025_HOLD_IN_CB(_devcb) \ - downcast<tms32025_device &>(*device).set_hold_in_cb(DEVCB_##_devcb); /* HOLD input */ - -#define MCFG_TMS32025_HOLD_ACK_OUT_CB(_devcb) \ - downcast<tms32025_device &>(*device).set_hold_ack_out_cb(DEVCB_##_devcb); /* HOLD Acknowledge output */ - -#define MCFG_TMS32025_XF_OUT_CB(_devcb) \ - downcast<tms32025_device &>(*device).set_xf_out_cb(DEVCB_##_devcb); /* XF output */ - -#define MCFG_TMS32025_DR_IN_CB(_devcb) \ - downcast<tms32025_device &>(*device).set_dr_in_cb(DEVCB_##_devcb); /* Serial Data Receive input */ - -#define MCFG_TMS32025_DX_OUT_CB(_devcb) \ - downcast<tms32025_device &>(*device).set_dx_out_cb(DEVCB_##_devcb); /* Serial Data Transmit output */ - - /**************************************************************************** * Interrupt constants */ @@ -84,12 +65,12 @@ public: tms32025_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // configuration helpers - template<class Object> devcb_base &set_bio_in_cb(Object &&cb) { return m_bio_in.set_callback(std::forward<Object>(cb)); } - template<class Object> devcb_base &set_hold_in_cb(Object &&cb) { return m_hold_in.set_callback(std::forward<Object>(cb)); } - template<class Object> devcb_base &set_hold_ack_out_cb(Object &&cb) { return m_hold_ack_out.set_callback(std::forward<Object>(cb)); } - template<class Object> devcb_base &set_xf_out_cb(Object &&cb) { return m_xf_out.set_callback(std::forward<Object>(cb)); } - template<class Object> devcb_base &set_dr_in_cb(Object &&cb) { return m_dr_in.set_callback(std::forward<Object>(cb)); } - template<class Object> devcb_base &set_dx_out_cb(Object &&cb) { return m_dx_out.set_callback(std::forward<Object>(cb)); } + auto bio_in_cb() { return m_bio_in.bind(); } + auto hold_in_cb() { return m_hold_in.bind(); } + auto hold_ack_out_cb() { return m_hold_ack_out.bind(); } + auto xf_out_cb() { return m_xf_out.bind(); } + auto dr_in_cb() { return m_dr_in.bind(); } + auto dx_out_cb() { return m_dx_out.bind(); } DECLARE_READ16_MEMBER( drr_r); DECLARE_WRITE16_MEMBER(drr_w); diff --git a/src/devices/cpu/z8/z8.cpp b/src/devices/cpu/z8/z8.cpp index c13bfa11883..3545b7cf620 100644 --- a/src/devices/cpu/z8/z8.cpp +++ b/src/devices/cpu/z8/z8.cpp @@ -523,7 +523,7 @@ uint8_t z8_device::get_intermediate_register(int offset) void z8_device::stack_push_byte(uint8_t src) { - if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK) + if (P01M & Z8_P01M_INTERNAL_STACK) { // SP <- SP - 1 (predecrement) uint8_t sp = register_read(Z8_REGISTER_SPL) - 1; @@ -545,7 +545,7 @@ void z8_device::stack_push_byte(uint8_t src) void z8_device::stack_push_word(uint16_t src) { - if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK) + if (P01M & Z8_P01M_INTERNAL_STACK) { // SP <- SP - 2 (predecrement) uint8_t sp = register_read(Z8_REGISTER_SPL) - 2; @@ -567,7 +567,7 @@ void z8_device::stack_push_word(uint16_t src) uint8_t z8_device::stack_pop_byte() { - if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK) + if (P01M & Z8_P01M_INTERNAL_STACK) { // @SP <- src uint8_t sp = register_read(Z8_REGISTER_SPL); @@ -593,7 +593,7 @@ uint8_t z8_device::stack_pop_byte() uint16_t z8_device::stack_pop_word() { - if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK) + if (P01M & Z8_P01M_INTERNAL_STACK) { // @SP <- src uint8_t sp = register_read(Z8_REGISTER_SPL); diff --git a/src/devices/cpu/z8/z8ops.hxx b/src/devices/cpu/z8/z8ops.hxx index 1cf49f81832..fbab7c3385c 100644 --- a/src/devices/cpu/z8/z8ops.hxx +++ b/src/devices/cpu/z8/z8ops.hxx @@ -502,7 +502,7 @@ void z8_device::call(uint16_t dst) m_pc = dst; } -INSTRUCTION( call_IRR1 ) { uint16_t dst = register_pair_read(get_intermediate_register(get_register(fetch()))); call(dst); } +INSTRUCTION( call_IRR1 ) { uint16_t dst = register_pair_read(get_register(fetch())); call(dst); } INSTRUCTION( call_DA ) { uint16_t dst = fetch_word(); call(dst); } INSTRUCTION( djnz_r1_RA ) @@ -549,7 +549,7 @@ void z8_device::jump(uint16_t dst) m_pc = dst; } -INSTRUCTION( jp_IRR1 ) { jump(register_pair_read(IR)); } +INSTRUCTION( jp_IRR1 ) { jump(register_pair_read(get_register(IM))); } int z8_device::check_condition_code(int cc) { diff --git a/src/devices/imagedev/flopdrv.h b/src/devices/imagedev/flopdrv.h index 11182f2dc00..cae694146b7 100644 --- a/src/devices/imagedev/flopdrv.h +++ b/src/devices/imagedev/flopdrv.h @@ -11,6 +11,11 @@ #include "formats/flopimg.h" #include "softlist_dev.h" +#define FLOPPY_0 "floppy0" +#define FLOPPY_1 "floppy1" +#define FLOPPY_2 "floppy2" +#define FLOPPY_3 "floppy3" + #define FLOPPY_TYPE_REGULAR 0 #define FLOPPY_TYPE_APPLE 1 #define FLOPPY_TYPE_SONY 2 @@ -53,7 +58,7 @@ TYPE DEFINITIONS ***************************************************************************/ -// ======================> floppy_type_t +DECLARE_DEVICE_TYPE(LEGACY_FLOPPY, legacy_floppy_image_device) struct floppy_type_t { @@ -95,12 +100,26 @@ class legacy_floppy_image_device : public device_t, { public: // construction/destruction + legacy_floppy_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const floppy_interface *config) + : legacy_floppy_image_device(mconfig, tag, owner, clock) + { + set_floppy_config(config); + } + legacy_floppy_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); ~legacy_floppy_image_device(); void set_floppy_config(const floppy_interface *config) { m_config = config; } template<class Object> devcb_base &set_out_idx_func(Object &&cb) { return m_out_idx_func.set_callback(std::forward<Object>(cb)); } + static void add_4drives(machine_config &mconfig, const floppy_interface *config) + { + LEGACY_FLOPPY(mconfig, FLOPPY_0, 0, config); + LEGACY_FLOPPY(mconfig, FLOPPY_1, 0, config); + LEGACY_FLOPPY(mconfig, FLOPPY_2, 0, config); + LEGACY_FLOPPY(mconfig, FLOPPY_3, 0, config); + } + virtual image_init_result call_load() override; virtual const software_list_loader &get_software_list_loader() const override { return image_software_list_loader::instance(); } virtual image_init_result call_create(int format_type, util::option_resolution *format_options) override; @@ -226,11 +245,6 @@ protected: char m_extension_list[256]; }; -// device type definition -DECLARE_DEVICE_TYPE(LEGACY_FLOPPY, legacy_floppy_image_device) - - - legacy_floppy_image_device *floppy_get_device(running_machine &machine,int drive); legacy_floppy_image_device *floppy_get_device_by_type(running_machine &machine,int ftype,int drive); int floppy_get_drive_by_type(legacy_floppy_image_device *image,int ftype); @@ -240,10 +254,6 @@ int floppy_get_count(running_machine &machine); /*************************************************************************** DEVICE CONFIGURATION MACROS ***************************************************************************/ -#define FLOPPY_0 "floppy0" -#define FLOPPY_1 "floppy1" -#define FLOPPY_2 "floppy2" -#define FLOPPY_3 "floppy3" #define MCFG_LEGACY_FLOPPY_CONFIG(_config) \ diff --git a/src/devices/machine/am79c90.cpp b/src/devices/machine/am79c90.cpp new file mode 100644 index 00000000000..67f7754b6b9 --- /dev/null +++ b/src/devices/machine/am79c90.cpp @@ -0,0 +1,570 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/***************************************************************************** + + AMD Am79C90 CMOS Local Area Network Controller for Ethernet (C-LANCE) + + TODO: + - Communication with the outside world + - Error handling + - Clocks + +*****************************************************************************/ + +#include "emu.h" +#include "am79c90.h" + +DEFINE_DEVICE_TYPE(AM79C90, am79c90_device, "am79c90", "Am79C90 LANCE Ethernet Controller") + +am79c90_device::am79c90_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, AM79C90, tag, owner, clock) + , m_receive_timer(nullptr) + //, m_receive_poll_timer(nullptr) + , m_transmit_timer(nullptr) + , m_transmit_poll_timer(nullptr) + , m_irq_out_cb(*this) + , m_dma_out_cb(*this) + , m_dma_in_cb(*this) +{ +} + +void am79c90_device::device_start() +{ + m_irq_out_cb.resolve_safe(); + m_dma_out_cb.resolve_safe(); // TODO: Should be read/write16! + m_dma_in_cb.resolve_safe(0); + + m_transmit_poll_timer = timer_alloc(TIMER_TRANSMIT_POLL); + m_transmit_poll_timer->adjust(attotime::never); + m_transmit_timer = timer_alloc(TIMER_TRANSMIT); + m_transmit_timer->adjust(attotime::never); + m_receive_timer = timer_alloc(TIMER_RECEIVE); + m_receive_timer->adjust(attotime::never); + + save_item(NAME(m_curr_transmit_desc.m_tmd01)); + save_item(NAME(m_curr_transmit_desc.m_tmd23)); + save_item(NAME(m_next_transmit_desc.m_tmd01)); + save_item(NAME(m_next_transmit_desc.m_tmd23)); + save_item(NAME(m_curr_recv_desc.m_tmd01)); + save_item(NAME(m_curr_recv_desc.m_tmd23)); + save_item(NAME(m_next_recv_desc.m_tmd01)); + save_item(NAME(m_next_recv_desc.m_tmd23)); + save_item(NAME(m_rap)); + save_item(NAME(m_csr)); + save_item(NAME(m_mode)); + save_item(NAME(m_logical_addr_filter)); + save_item(NAME(m_physical_addr)); + + save_item(NAME(m_recv_message_count)); + save_item(NAME(m_recv_ring_addr)); + save_item(NAME(m_recv_buf_addr)); + save_item(NAME(m_recv_buf_count)); + save_item(NAME(m_recv_ring_length)); + save_item(NAME(m_recv_ring_pos)); + save_item(NAME(m_recv_fifo)); + save_item(NAME(m_recv_fifo_write)); + save_item(NAME(m_recv_fifo_read)); + save_item(NAME(m_receiving)); + + save_item(NAME(m_transmit_ring_addr)); + save_item(NAME(m_transmit_buf_addr)); + save_item(NAME(m_transmit_buf_count)); + save_item(NAME(m_transmit_ring_length)); + save_item(NAME(m_transmit_ring_pos)); + save_item(NAME(m_transmit_fifo)); + save_item(NAME(m_transmit_fifo_write)); + save_item(NAME(m_transmit_fifo_read)); + save_item(NAME(m_transmitting)); +} + +void am79c90_device::device_reset() +{ + memset(&m_curr_transmit_desc, 0, sizeof(ring_descriptor)); + memset(&m_next_transmit_desc, 0, sizeof(ring_descriptor)); + memset(&m_curr_recv_desc, 0, sizeof(ring_descriptor)); + memset(&m_next_recv_desc, 0, sizeof(ring_descriptor)); + m_rap = 0; + memset(m_csr, 0, sizeof(uint16_t) * 4); + m_csr[0] = CSR0_STOP; + m_mode = 0; + m_logical_addr_filter = 0; + m_physical_addr = 0; + + m_recv_message_count = 0; + m_recv_ring_addr = 0; + m_recv_buf_addr = 0; + m_recv_buf_count = 0; + m_recv_ring_length = 0; + m_recv_ring_pos = 0; + memset(m_recv_fifo, 0, sizeof(uint32_t) * ARRAY_LENGTH(m_recv_fifo)); + m_recv_fifo_write = 0; + m_recv_fifo_read = 0; + m_receiving = false; + + m_transmit_ring_addr = 0; + m_transmit_buf_addr = 0; + m_transmit_buf_count = 0; + m_transmit_ring_length = 0; + m_transmit_ring_pos = 0; + memset(m_transmit_fifo, 0, sizeof(uint32_t) * ARRAY_LENGTH(m_transmit_fifo)); + m_transmit_fifo_write = 0; + m_transmit_fifo_read = 0; + m_transmitting = false; +} + +void am79c90_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case TIMER_TRANSMIT_POLL: + poll_transmit(); + break; + + case TIMER_TRANSMIT: + transmit(); + break; + + case TIMER_RECEIVE: + receive(); + break; + } +} + +void am79c90_device::fetch_transmit_descriptor() +{ + const uint32_t next_addr = (m_transmit_ring_addr >> 2) + (m_transmit_ring_pos << 1); + ring_descriptor &next = m_next_transmit_desc; + next.m_tmd01 = m_dma_in_cb(next_addr, ~0); + next.m_tmd23 = m_dma_in_cb(next_addr + 1, ~0); +} + +void am79c90_device::fetch_receive_descriptor() +{ + const uint32_t next_addr = (m_recv_ring_addr >> 2) + (m_recv_ring_pos << 1); + ring_descriptor &next = m_next_recv_desc; + next.m_rmd01 = m_dma_in_cb(next_addr, ~0); + next.m_rmd23 = m_dma_in_cb(next_addr + 1, ~0); +} + +void am79c90_device::recv_fifo_push(uint32_t value) +{ + // TODO: Poll for the FIFO at 1.6ms, don't instantly start receiving! + // "...If the C-LANCE does not own it, it will poll the ring once every 1.6ms until + // it owns it." + + logerror("%s: LANCE pushing %08x onto receive FIFO\n", machine().describe_context(), value); + if (!m_receiving && !(m_mode & MODE_LOOP)) + { + begin_receiving(); + } + + if (m_recv_fifo_write >= ARRAY_LENGTH(m_recv_fifo)) + { + logerror("%s: LANCE can't push onto receive FIFO, %d >= %d\n", machine().describe_context(), value, m_recv_fifo_write, ARRAY_LENGTH(m_recv_fifo)); + // TODO: Do something + return; + } + m_recv_fifo[m_recv_fifo_write] = value; + m_recv_fifo_write++; + if (m_recv_fifo_write == ARRAY_LENGTH(m_recv_fifo)) + { + // TODO: Do something + } +} + +void am79c90_device::begin_receiving() +{ + fetch_receive_descriptor(); + m_curr_recv_desc = m_next_recv_desc; + + ring_descriptor &curr = m_curr_recv_desc; + if (curr.m_rmd01 & RMD1_OWN) + { + logerror("%s: LANCE owns the current buffer, activating receive timer, RMD0123 is %08x %08x\n", machine().describe_context(), curr.m_rmd01, curr.m_rmd23); + + m_receiving = true; + m_recv_buf_addr = (((curr.m_rmd01 << 16) | (curr.m_rmd01 >> 16)) & 0x00ffffff) | 0xff000000; + const int32_t rmd2 = (int16_t)(curr.m_rmd23 >> 16); + m_recv_buf_count = (uint16_t)((-rmd2) & 0x00000fff); + if (m_recv_buf_count == 0) + m_recv_buf_count = 0x1000; + + if (m_mode & MODE_LOOP) + { + m_recv_buf_count = (m_mode & MODE_DTCR) ? 32 : 36; + } + + if (curr.m_rmd01 & RMD1_STP) + { + m_recv_message_count = 0; + } + m_receive_timer->adjust(attotime::from_hz(10'000'000), 0, attotime::from_hz(10'000'000)); + } + else + { + logerror("%s: LANCE does not own the current buffer, deactivating receive timer\n", machine().describe_context()); + m_receiving = false; + m_receive_timer->adjust(attotime::never); + } +} + +void am79c90_device::receive() +{ + const uint32_t received_value = (m_recv_fifo_write == 0) ? 0 : m_recv_fifo[m_recv_fifo_read]; + m_recv_fifo_read++; + if (m_recv_fifo_read >= m_recv_fifo_write) + { + m_recv_fifo_read = 0; + m_recv_fifo_write = 0; + } + + if (m_recv_buf_count >= 4) + { + logerror("%s: LANCE receiving %08x to address %08x, remaining %d\n", machine().describe_context(), received_value, m_recv_buf_addr, m_recv_buf_count - 4); + m_dma_out_cb(m_recv_buf_addr >> 2, received_value, ~0); + + m_recv_buf_addr += 4; + m_recv_message_count += 4; + m_recv_buf_count -= 4; + } + else + { + const uint32_t mask = 0xffffffff << (m_recv_buf_count << 3); + logerror("%s: LANCE receiving %08x & %08x to address %08x, remaining %d\n", machine().describe_context(), received_value, mask, m_recv_buf_addr, 0); + m_dma_out_cb(m_recv_buf_addr >> 2, received_value, mask); + + m_recv_buf_addr += m_recv_buf_count; + m_recv_message_count += m_recv_buf_count; + m_recv_buf_count = 0; + } + + if (m_recv_buf_count == 0) + { + logerror("%s: LANCE has completed receiving a buffer, clearing OWN bit and advancing receive ring position\n", machine().describe_context()); + ring_descriptor &curr = m_curr_recv_desc; + curr.m_rmd01 &= ~RMD1_OWN; + const uint32_t addr = (m_recv_ring_addr >> 2) + (m_recv_ring_pos << 1); + logerror("%s: LANCE is writing new RMD01: %08x\n", machine().describe_context(), curr.m_rmd01); + m_dma_out_cb(addr, curr.m_rmd01, ~0); + + if (curr.m_rmd01 & TMD1_ENP) + { + curr.m_rmd23 &= 0xfffff000; + if (m_recv_message_count != 0x1000) + { + curr.m_rmd23 |= m_recv_message_count & 0xfff; + } + + m_dma_out_cb(addr + 1, curr.m_rmd23, ~0); + + logerror("%s: LANCE has completed receiving a message, total message length %d bytes, new RMD23 %08x\n", machine().describe_context(), m_recv_message_count, curr.m_rmd23); + } + m_recv_ring_pos++; + m_recv_ring_pos &= m_recv_ring_length - 1; + + if (!(m_mode & MODE_LOOP)) + { + begin_receiving(); + } + else + { + logerror("%s: LANCE loopback test receive finished, setting RINT and stopping timer.\n", machine().describe_context()); + m_csr[0] |= CSR0_RINT; + update_interrupts(); + m_receiving = false; + m_receive_timer->adjust(attotime::never); + } + } +} + +void am79c90_device::transmit() +{ + logerror("%s: LANCE transmit, fetching from %08x\n", machine().describe_context(), m_transmit_buf_addr >> 2); + uint32_t transmit_value = 0; + const bool dtcr = m_mode & MODE_DTCR; + if (m_transmit_buf_count > 4 || dtcr) + { + transmit_value = m_dma_in_cb(m_transmit_buf_addr >> 2, ~0); + if (!dtcr) + { + m_crc32.append(&transmit_value, sizeof(uint32_t)); + } + } + else + { + transmit_value = (uint32_t)m_crc32.finish(); + } + const bool loopback = (m_mode & MODE_LOOP); + if (loopback) + { + // TODO: Differentiate between internal and external loopback + recv_fifo_push(transmit_value); + } + else + { + // TODO: Send data to an actual network interface and/or our real transmit FIFO + } + + if (m_transmit_buf_count >= 4) + { + m_transmit_buf_addr += 4; + m_transmit_buf_count -= 4; + } + else + { + m_transmit_buf_addr += m_transmit_buf_count; + m_transmit_buf_count = 0; + } + + if (m_transmit_buf_count == 0) + { + const uint32_t base_addr = (m_transmit_ring_addr >> 2) + (m_transmit_ring_pos << 1); + ring_descriptor &curr = m_curr_transmit_desc; + curr.m_tmd01 &= ~TMD1_OWN; + + m_dma_out_cb(base_addr, curr.m_tmd01, ~0); + + if (!(curr.m_tmd01 & TMD1_ENP)) + { + fetch_transmit_descriptor(); + m_curr_transmit_desc = m_next_transmit_desc; + + if (!(curr.m_tmd01 & TMD1_OWN)) + { + logerror("%s: LANCE is done transmitting a buffer of this descriptor ring, next ring unowned, resuming polling.\n", machine().describe_context()); + m_transmitting = false; + m_transmit_timer->adjust(attotime::never); + m_transmit_poll_timer->adjust(attotime::from_usec(1600), 0, attotime::from_usec(1600)); + } + else + { + logerror("%s: LANCE is done transmitting a buffer of this descriptor ring, preparing to transmit next buffer.\n", machine().describe_context()); + prepare_transmit_buf(); + } + } + else + { + logerror("%s: LANCE is done transmitting the last buffer of this descriptor ring, raising TINT and resuming polling.\n", machine().describe_context()); + if (m_mode & MODE_LOOP) + { + begin_receiving(); + } + + m_csr[0] |= CSR0_TINT; + update_interrupts(); + m_transmitting = false; + m_transmit_timer->adjust(attotime::never); + m_transmit_poll_timer->adjust(attotime::from_usec(1600), 0, attotime::from_usec(1600)); + } + } +} + +void am79c90_device::prepare_transmit_buf() +{ + ring_descriptor &curr = m_curr_transmit_desc; + m_transmit_buf_addr = ((curr.m_tmd01 << 16) | ((curr.m_tmd01 >> 16) & 0x00ffffff)) | 0xff000000; + const int32_t tmd2 = (int16_t)(curr.m_tmd23 >> 16); + m_transmit_buf_count = (uint16_t)((-tmd2) & 0x00000fff); + if (m_transmit_buf_count == 0) + m_transmit_buf_count = 0x1000; + if (!(m_mode & MODE_DTCR)) + { + m_transmit_buf_count += 4; + } + logerror("%s: LANCE: Valid transmit descriptors found, preparing to transmit %d bytes\n", machine().describe_context(), m_transmit_buf_count); +} + +void am79c90_device::poll_transmit() +{ + ring_descriptor &curr = m_curr_transmit_desc; + const uint32_t base_addr = (m_transmit_ring_addr >> 2) + (m_transmit_ring_pos << 1); + //logerror("%s: LANCE polling for packets from %08x\n", machine().describe_context(), base_addr); + curr.m_tmd01 = m_dma_in_cb(base_addr, ~0); + + const uint16_t tmd1 = (uint16_t)curr.m_tmd01; + if (!(tmd1 & TMD1_OWN)) + return; + + if (!(tmd1 & TMD1_STP) && !m_transmitting) + { + // "The STP bit must be set in the first buffer of the packet, or the C-LANCE will skip over this + // descriptor and poll the next descriptor(s) until the OWN and STP bits are set." + m_transmit_ring_pos++; + m_transmit_ring_pos &= m_transmit_ring_length - 1; + logerror("%s: LANCE: No STP on this entry and not transmitting, skipping to next entry\n", machine().describe_context()); + return; + } + + //logerror("%s: LANCE: Starting transmitting\n", machine().describe_context()); + + m_transmit_poll_timer->adjust(attotime::never); + m_transmitting = true; + m_crc32.reset(); + + // TMD0's value is retrieved from the value fetched above, but per the AMD Am79C90 manual, page 30: + // "The C-LANCE will read TMD0 and TMD2 to get the rest of the buffer address and the buffer byte count + // when it owns the descriptor. Each of these memory reads is done separately with a new arbitration + // cycle for each transfer." + m_dma_in_cb(base_addr, ~0); + + curr.m_tmd23 = m_dma_in_cb(base_addr + 1, ~0); + + m_transmit_ring_pos++; + m_transmit_ring_pos &= m_transmit_ring_length - 1; + + if (!(tmd1 & TMD1_ENP)) + { + logerror("%s: LANCE: No EOP on this entry, caching next entry and checking ownership\n", machine().describe_context()); + // "BUFFER ERROR is set by the C-LANCE during transmission when the C-LANCE does not find the ENP + // flag in the current buffer and does not own the next buffer." + fetch_transmit_descriptor(); + ring_descriptor &next = m_next_transmit_desc; + + if (!((next.m_tmd01 >> 16) & TMD1_OWN)) + { + logerror("%s: LANCE: No EOP on this entry, but we don't own the next one; setting BUFF\n", machine().describe_context()); + curr.m_tmd23 |= TMD3_BUFF; + m_dma_out_cb(base_addr + 1, curr.m_tmd23, ~0); + m_csr[0] &= ~CSR0_TXON; + m_transmitting = false; + return; + } + } + + prepare_transmit_buf(); + + m_transmit_timer->adjust(attotime::from_hz(10'000'000), 0, attotime::from_hz(10'000'000)); +} + +void am79c90_device::update_interrupts() +{ + if (m_csr[0] & CSR0_ANY_INTR) + { + m_csr[0] |= CSR0_INTR; + } + else + { + m_csr[0] &= ~CSR0_INTR; + } + m_irq_out_cb((m_csr[0] & CSR0_INTR) ? 1 : 0); +} + +READ16_MEMBER(am79c90_device::regs_r) +{ + uint16_t ret = 0; + if (offset) + { + ret = m_rap; + logerror("%s: lance_r: RAP = %04x\n", machine().describe_context(), ret); + } + else + { + ret = m_csr[m_rap]; + logerror("%s: lance_r: CSR%d = %04x\n", machine().describe_context(), m_rap, ret); + } + return ret; +} + +WRITE16_MEMBER(am79c90_device::regs_w) +{ + if (offset) + { + logerror("%s: lance_r: RAP = %d\n", machine().describe_context(), data & 3); + m_rap = data & 3; + } + else + { + logerror("%s: lance_w: CSR%d = %04x\n", machine().describe_context(), m_rap, data); + switch (m_rap) + { + case 0: // Control/Status + m_csr[0] &= ~(data & (CSR0_ANY_ERR | CSR0_IDON)); + if (m_csr[0] & CSR0_ANY_ERR) + m_csr[0] |= CSR0_ERR; + else + m_csr[0] &= ~CSR0_ERR; + if (data & CSR0_STOP) + { + data &= ~(CSR0_RXON | CSR0_TXON | CSR0_TDMD | CSR0_STRT | CSR0_INIT); + m_csr[0] &= ~(CSR0_IDON | CSR0_RXON | CSR0_TXON | CSR0_TDMD | CSR0_STRT | CSR0_INIT); + m_csr[0] |= CSR0_STOP; + m_csr[3] = 0; + m_receive_timer->adjust(attotime::never); + m_transmit_timer->adjust(attotime::never); + m_transmit_poll_timer->adjust(attotime::never); + } + if (data & CSR0_INIT) + { + uint32_t init_addr = 0xff000000 | m_csr[1] | (m_csr[2] << 16); + uint16_t init_block[12]; + + logerror("%s: LANCE Init block:\n", machine().describe_context()); + + for (uint32_t i = 0; i < 6; i++) + { + uint32_t value = m_dma_in_cb((init_addr >> 2) + i, ~0); + init_block[i*2 + 0] = (uint16_t)(value >> 16); + init_block[i*2 + 1] = (uint16_t)value; + logerror("%s: IADR +%02d: %04x\n", machine().describe_context(), i*4, init_block[i*2 + 0]); + logerror("%s: IADR +%02d: %04x\n", machine().describe_context(), i*4 + 2, init_block[i*2 + 1]); + } + + m_mode = init_block[0]; + m_physical_addr = ((uint64_t)init_block[3] << 32) | ((uint64_t)init_block[2] << 16) | (uint64_t)init_block[1]; + m_logical_addr_filter = ((uint64_t)init_block[7] << 48) | ((uint64_t)init_block[6] << 32) + | ((uint64_t)init_block[5] << 16) | (uint64_t)init_block[4]; + m_recv_ring_addr = (((uint32_t)init_block[9] << 16) | (uint32_t)init_block[8]) & 0x00fffff8; + m_recv_ring_addr |= 0xff000000; + m_transmit_ring_addr = (((uint32_t)init_block[11] << 16) | (uint32_t)init_block[10]) & 0x00fffff8; + m_transmit_ring_addr |= 0xff000000; + m_recv_ring_length = 1 << ((init_block[9] >> 13) & 7); + m_transmit_ring_length = 1 << ((init_block[11] >> 13) & 7); + + m_transmit_ring_pos = 0; + m_recv_ring_pos = 0; + + logerror("%s: Mode: %04x\n", machine().describe_context(), m_mode); + logerror("%s: Physical Address: %08x%08x\n", machine().describe_context(), + (uint32_t)(m_physical_addr >> 32), (uint32_t)m_physical_addr); + logerror("%s: Logical Address Filter: %08x%08x\n", machine().describe_context(), + (uint32_t)(m_logical_addr_filter >> 32), (uint32_t)m_logical_addr_filter); + logerror("%s: Receive Ring Address: %08x\n", machine().describe_context(), m_recv_ring_addr); + logerror("%s: Receive Ring Length: %04x\n", machine().describe_context(), m_recv_ring_length); + logerror("%s: Transmit Ring Address: %08x\n", machine().describe_context(), m_transmit_ring_addr); + logerror("%s: Transmit Ring Length: %04x\n", machine().describe_context(), m_transmit_ring_length); + + m_csr[0] &= ~CSR0_STOP; + m_csr[0] |= CSR0_IDON | CSR0_INIT | CSR0_TXON | CSR0_RXON; + + m_receive_timer->adjust(attotime::never); + m_transmit_timer->adjust(attotime::never); + m_transmit_poll_timer->adjust(attotime::never); + } + if (data & CSR0_STRT) + { + m_csr[0] &= ~CSR0_STOP; + if (m_mode & MODE_DRX) + m_csr[0] &= ~CSR0_RXON; + if (m_mode & MODE_DTX) + m_csr[0] &= ~CSR0_TXON; + if (m_csr[0] & CSR0_TXON) + m_transmit_poll_timer->adjust(attotime::from_usec(1600), 0, attotime::from_usec(1600)); + } + update_interrupts(); + if (data & CSR0_TDMD) + { + // TODO: Handle transmit demand + } + break; + case 1: // Least significant 15 bits of the Initialization Block + m_csr[1] = data & 0xfffe; + break; + case 2: // Most significant 8 bits of the Initialization Block + m_csr[2] = data & 0x00ff; + break; + case 3: // Bus master interface + m_csr[3] = data & 0x0007; + break; + } + } +} diff --git a/src/devices/machine/am79c90.h b/src/devices/machine/am79c90.h new file mode 100644 index 00000000000..1f6fcfedd5e --- /dev/null +++ b/src/devices/machine/am79c90.h @@ -0,0 +1,202 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/***************************************************************************** + + AMD Am79C90 CMOS Local Area Network Controller for Ethernet (C-LANCE) + + TODO: + - Communication with the outside world + - Error handling + - Clocks + +****************************************************************************** + _____ _____ + Vss 1 |* \_/ | 48 Vdd + DAL7 2 | | 47 DAL8 + DAL6 3 | | 46 DAL9 + DAL5 4 | | 45 DAL10 + DAL4 5 | | 44 DAL11 + DAL3 6 | | 43 DAL12 + DAL2 7 | | 42 DAL13 + DAL1 8 | | 41 DAL14 + DAL0 9 | | 40 DAL15 + READ 10 | | 39 A16 + /INTR 11 | | 38 A17 + /DALI 12 | Am79C90 | 37 A18 + /DALI 13 | | 36 A19 + /DAS 14 | | 35 A20 + /BM0,BYTE 15 | | 34 A21 + /BM1,/BUSAKO 16 | | 33 A22 + /HOLD,/BUSRQ 17 | | 32 A23 + ALE,/AS 18 | | 31 RX + /HLDA 19 | | 30 RENA + /CS 20 | | 29 TX + ADR 21 | | 28 CLSN + /READY 22 | | 27 RCLK + /RESET 23 | | 26 TENA + Vss 24 |_____________| 25 TCLK + +**********************************************************************/ + +#ifndef MAME_MACHINE_AM79C90_H +#define MAME_MACHINE_AM79C90_H + +#pragma once + +#include "hashing.h" + +class am79c90_device : public device_t +{ +public: + am79c90_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + auto dma_out() { return m_dma_out_cb.bind(); } + auto dma_in() { return m_dma_in_cb.bind(); } + auto irq_out() { return m_irq_out_cb.bind(); } + + DECLARE_READ16_MEMBER(regs_r); + DECLARE_WRITE16_MEMBER(regs_w); + +private: + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + + static const device_timer_id TIMER_TRANSMIT_POLL = 0; + static const device_timer_id TIMER_TRANSMIT = 1; + //static const device_timer_id TIMER_RECEIVE_POLL = 2; + static const device_timer_id TIMER_RECEIVE = 3; + + enum + { + CSR0_ERR = 0x8000, + CSR0_BABL = 0x4000, + CSR0_CERR = 0x2000, + CSR0_MISS = 0x1000, + CSR0_MERR = 0x0800, + CSR0_RINT = 0x0400, + CSR0_TINT = 0x0200, + CSR0_IDON = 0x0100, + CSR0_INTR = 0x0080, + CSR0_INEA = 0x0040, + CSR0_RXON = 0x0020, + CSR0_TXON = 0x0010, + CSR0_TDMD = 0x0008, + CSR0_STOP = 0x0004, + CSR0_STRT = 0x0002, + CSR0_INIT = 0x0001, + CSR0_ANY_INTR = CSR0_BABL | CSR0_MISS | CSR0_MERR | CSR0_RINT | CSR0_TINT | CSR0_IDON, + CSR0_ANY_ERR = CSR0_BABL | CSR0_CERR | CSR0_MISS | CSR0_MERR, + + CSR3_BSWP = 0x0004, + CSR3_ACON = 0x0002, + CSR3_BCON = 0x0001, + + MODE_DRX = 0x0001, + MODE_DTX = 0x0002, + MODE_LOOP = 0x0004, + MODE_DTCR = 0x0008, + MODE_COLL = 0x0010, + MODE_DRTY = 0x0020, + MODE_INTL = 0x0040, + MODE_EMBA = 0x0080, + MODE_PROM = 0x8000, + + TMD1_ENP = 0x0100, + TMD1_STP = 0x0200, + TMD1_DEF = 0x0400, + TMD1_ONE = 0x0800, + TMD1_MORE = 0x1000, + TMD1_ADD_FCS = 0x2000, + TMD1_ERR = 0x4000, + TMD1_OWN = 0x8000, + + TMD3_RTRY = 0x0400, + TMD3_LCAR = 0x0800, + TMD3_LCOL = 0x1000, + TMD3_RES = 0x2000, + TMD3_UFLO = 0x4000, + TMD3_BUFF = 0x8000, + + RMD1_ENP = 0x0100, + RMD1_STP = 0x0200, + RMD1_BUFF = 0x0400, + RMD1_CRC = 0x0800, + RMD1_OFLO = 0x1000, + RMD1_FRAM = 0x2000, + RMD1_ERR = 0x4000, + RMD1_OWN = 0x8000 + }; + + void prepare_transmit_buf(); + void begin_receiving(); + void recv_fifo_push(uint32_t value); + void fetch_receive_descriptor(); + void fetch_transmit_descriptor(); + void poll_transmit(); + //void poll_receive(); TODO + void transmit(); + void receive(); + void update_interrupts(); + + struct ring_descriptor + { + union + { + uint32_t m_tmd23; + uint32_t m_rmd23; + }; + union + { + uint32_t m_tmd01; + uint32_t m_rmd01; + }; + uint16_t m_byte_count; + uint32_t m_buffer_addr; + }; + + ring_descriptor m_curr_transmit_desc; + ring_descriptor m_next_transmit_desc; + ring_descriptor m_curr_recv_desc; + ring_descriptor m_next_recv_desc; + + uint16_t m_rap; + uint16_t m_csr[4]; + uint16_t m_mode; + uint64_t m_logical_addr_filter; + uint64_t m_physical_addr; + uint32_t m_recv_message_count; + uint32_t m_recv_ring_addr; + uint32_t m_recv_buf_addr; + uint16_t m_recv_buf_count; + uint8_t m_recv_ring_length; + uint8_t m_recv_ring_pos; + uint32_t m_recv_fifo[16]; + uint8_t m_recv_fifo_write; + uint8_t m_recv_fifo_read; + bool m_receiving; + emu_timer *m_receive_timer; + //emu_timer *m_receive_poll_timer; + + uint32_t m_transmit_ring_addr; + uint32_t m_transmit_buf_addr; + uint16_t m_transmit_buf_count; + uint8_t m_transmit_ring_length; + uint8_t m_transmit_ring_pos; + uint32_t m_transmit_fifo[12]; + uint8_t m_transmit_fifo_write; + uint8_t m_transmit_fifo_read; + bool m_transmitting; + emu_timer *m_transmit_timer; + emu_timer *m_transmit_poll_timer; + + devcb_write_line m_irq_out_cb; + devcb_write32 m_dma_out_cb; // TODO: Should be read/write16! + devcb_read32 m_dma_in_cb; + + util::crc32_creator m_crc32; +}; + +DECLARE_DEVICE_TYPE(AM79C90, am79c90_device) + +#endif // MAME_MACHINE_AM79C90_H
\ No newline at end of file diff --git a/src/devices/machine/cs4031.cpp b/src/devices/machine/cs4031.cpp index 1467fb43987..ea314b7aa5c 100644 --- a/src/devices/machine/cs4031.cpp +++ b/src/devices/machine/cs4031.cpp @@ -149,7 +149,7 @@ void cs4031_device::device_add_mconfig(machine_config &config) m_ctc->out_handler<2>().set(FUNC(cs4031_device::ctc_out2_w)); DS12885(config, m_rtc); - m_rtc->irq_callback().set(m_intc2, FUNC(pic8259_device::ir0_w)); + m_rtc->irq().set(m_intc2, FUNC(pic8259_device::ir0_w)); m_rtc->set_century_index(0x32); } diff --git a/src/devices/machine/fdc37c93x.cpp b/src/devices/machine/fdc37c93x.cpp index c61716f2c4e..ce18f033dea 100644 --- a/src/devices/machine/fdc37c93x.cpp +++ b/src/devices/machine/fdc37c93x.cpp @@ -265,9 +265,10 @@ MACHINE_CONFIG_START(fdc37c93x_device::device_add_mconfig) pc_serial2_comdev->out_rts_callback().set(FUNC(fdc37c93x_device::rts_serial2_w)); // RTC - MCFG_DS12885_ADD("rtc") - MCFG_MC146818_IRQ_HANDLER(WRITELINE(*this, fdc37c93x_device, irq_rtc_w)) - MCFG_MC146818_CENTURY_INDEX(0x32) + ds12885_device &rtc(DS12885(config, "rtc")); + rtc.irq().set(FUNC(fdc37c93x_device::irq_rtc_w)); + rtc.set_century_index(0x32); + // keyboard KBDC8042(config, m_kbdc); m_kbdc->set_keyboard_type(kbdc8042_device::KBDC8042_PS2); diff --git a/src/devices/machine/mc146818.h b/src/devices/machine/mc146818.h index 91cdcf35a1b..499698a84cd 100644 --- a/src/devices/machine/mc146818.h +++ b/src/devices/machine/mc146818.h @@ -17,39 +17,6 @@ #pragma once -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_MC146818_IRQ_HANDLER(_irq) \ - downcast<mc146818_device &>(*device).set_irq_callback(DEVCB_##_irq); - -// The MC146818 doesn't have century support, but when syncing the date & time at startup we can optionally store the century. -#define MCFG_MC146818_CENTURY_INDEX(_century_index) \ - downcast<mc146818_device *>(device)->set_century_index(_century_index); - -// The MC146818 doesn't have UTC support, but when syncing the data & time at startup we can use UTC instead of local time. -#define MCFG_MC146818_UTC(_utc) \ - downcast<mc146818_device *>(device)->set_use_utc(_utc); - -#define MCFG_MC146818_BINARY(_bin) \ - downcast<mc146818_device *>(device)->set_binary(_bin); - -#define MCFG_MC146818_24_12(_hour) \ - downcast<mc146818_device *>(device)->set_hour(_hour); - -#define MCFG_MC146818_EPOCH(_epoch) \ - downcast<mc146818_device *>(device)->set_epoch(_epoch); - -#define MCFG_MC146818_BINARY_YEAR(_bin) \ - downcast<mc146818_device *>(device)->set_binary_year(_bin); - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> mc146818_device - class mc146818_device : public device_t, public device_nvram_interface { @@ -58,13 +25,16 @@ public: mc146818_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // callbacks - template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); } - auto irq_callback() { return m_write_irq.bind(); } + auto irq() { return m_write_irq.bind(); } + // The MC146818 doesn't have century support, but when syncing the date & time at startup we can optionally store the century. void set_century_index(int century_index) { m_century_index = century_index; } + + // The MC146818 doesn't have UTC support, but when syncing the data & time at startup we can use UTC instead of local time. void set_use_utc(bool use_utc) { m_use_utc = use_utc; } + void set_binary(bool binary) { m_binary = binary; } - void set_hour(bool hour) { m_hour = hour; } + void set_24hrs(bool hour) { m_hour = hour; } void set_epoch(int epoch) { m_epoch = epoch; } void set_binary_year(int bin) { m_binyear = bin; } diff --git a/src/devices/machine/mc2661.h b/src/devices/machine/mc2661.h index 9c6decef34c..5be3520a8d5 100644 --- a/src/devices/machine/mc2661.h +++ b/src/devices/machine/mc2661.h @@ -31,48 +31,6 @@ #include "diserial.h" -/*************************************************************************** - DEVICE CONFIGURATION MACROS -***************************************************************************/ - -#define MCFG_MC2661_RXC(_clock) \ - downcast<mc2661_device &>(*device).set_rxc(_clock); - -#define MCFG_MC2661_TXC(_clock) \ - downcast<mc2661_device &>(*device).set_txc(_clock); - -#define MCFG_MC2661_TXD_HANDLER(_write) \ - downcast<mc2661_device &>(*device).set_txd_callback(DEVCB_##_write); - -#define MCFG_MC2661_RXRDY_HANDLER(_write) \ - downcast<mc2661_device &>(*device).set_rxrdy_callback(DEVCB_##_write); - -#define MCFG_MC2661_TXRDY_HANDLER(_write) \ - downcast<mc2661_device &>(*device).set_txrdy_callback(DEVCB_##_write); - -#define MCFG_MC2661_RTS_HANDLER(_write) \ - downcast<mc2661_device &>(*device).set_rts_callback(DEVCB_##_write); - -#define MCFG_MC2661_DTR_HANDLER(_write) \ - downcast<mc2661_device &>(*device).set_dtr_callback(DEVCB_##_write); - -#define MCFG_MC2661_TXEMT_DSCHG_HANDLER(_write) \ - downcast<mc2661_device &>(*device).set_txemt_dschg_callback(DEVCB_##_write); - -#define MCFG_MC2661_BKDET_HANDLER(_write) \ - downcast<mc2661_device &>(*device).set_bkdet_callback(DEVCB_##_write); - -#define MCFG_MC2661_XSYNC_HANDLER(_write) \ - downcast<mc2661_device &>(*device).set_xsync_callback(DEVCB_##_write); - - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -// ======================> mc2661_device - class mc2661_device : public device_t, public device_serial_interface { @@ -83,15 +41,6 @@ public: void set_rxc(int clock) { m_rxc = clock; } void set_txc(int clock) { m_txc = clock; } - template <class Object> devcb_base &set_txd_callback(Object &&cb) { return m_write_txd.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_rxrdy_callback(Object &&cb) { return m_write_rxrdy.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_txrdy_callback(Object &&cb) { return m_write_txrdy.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_rts_callback(Object &&cb) { return m_write_rts.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_dtr_callback(Object &&cb) { return m_write_dtr.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_txemt_dschg_callback(Object &&cb) { return m_write_txemt_dschg.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_bkdet_callback(Object &&cb) { return m_write_bkdet.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_xsync_callback(Object &&cb) { return m_write_xsync.set_callback(std::forward<Object>(cb)); } - auto txd_handler() { return m_write_txd.bind(); } auto rxrdy_handler() { return m_write_rxrdy.bind(); } auto txrdy_handler() { return m_write_txrdy.bind(); } @@ -147,8 +96,6 @@ private: int m_sync_index; }; - -// device type definition DECLARE_DEVICE_TYPE(MC2661, mc2661_device) #endif // MAME_MACHINE_MC2661_H diff --git a/src/devices/machine/mc68328.h b/src/devices/machine/mc68328.h index f146c6856c5..d9b169b5324 100644 --- a/src/devices/machine/mc68328.h +++ b/src/devices/machine/mc68328.h @@ -4,11 +4,7 @@ Motorola 68328 ("DragonBall") System-on-a-Chip implementation - By Ryan Holtz - - **********************************************************************/ - -/***************************************************************************************************************** +*********************************************************************** P P P P P P P P P P P P P P E E E E E E E J J J J J J J @@ -95,33 +91,39 @@ class mc68328_device : public device_t { public: + template <typename T> + mc68328_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag) + : mc68328_device(mconfig, tag, owner, clock) + { + m_cpu.set_tag(std::forward<T>(cpu_tag)); + } + mc68328_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - void set_cpu_tag(const char *tag) { m_cpu.set_tag(tag); } - template <class Object> devcb_base &set_out_port_a_callback(Object &&cb) { return m_out_port_a_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_port_b_callback(Object &&cb) { return m_out_port_b_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_port_c_callback(Object &&cb) { return m_out_port_c_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_port_d_callback(Object &&cb) { return m_out_port_d_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_port_e_callback(Object &&cb) { return m_out_port_e_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_port_f_callback(Object &&cb) { return m_out_port_f_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_port_g_callback(Object &&cb) { return m_out_port_g_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_port_j_callback(Object &&cb) { return m_out_port_j_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_port_k_callback(Object &&cb) { return m_out_port_k_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_port_m_callback(Object &&cb) { return m_out_port_m_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_a_callback(Object &&cb) { return m_in_port_a_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_b_callback(Object &&cb) { return m_in_port_b_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_c_callback(Object &&cb) { return m_in_port_c_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_d_callback(Object &&cb) { return m_in_port_d_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_e_callback(Object &&cb) { return m_in_port_e_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_f_callback(Object &&cb) { return m_in_port_f_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_g_callback(Object &&cb) { return m_in_port_g_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_j_callback(Object &&cb) { return m_in_port_j_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_k_callback(Object &&cb) { return m_in_port_k_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_m_callback(Object &&cb) { return m_in_port_m_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_pwm_callback(Object &&cb) { return m_out_pwm_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_spim_callback(Object &&cb) { return m_out_spim_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_spim_callback(Object &&cb) { return m_in_spim_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_spim_xch_trigger_callback(Object &&cb) { return m_spim_xch_trigger_cb.set_callback(std::forward<Object>(cb)); } + auto out_port_a() { return m_out_port_a_cb.bind(); } + auto out_port_b() { return m_out_port_b_cb.bind(); } + auto out_port_c() { return m_out_port_c_cb.bind(); } + auto out_port_d() { return m_out_port_d_cb.bind(); } + auto out_port_e() { return m_out_port_e_cb.bind(); } + auto out_port_f() { return m_out_port_f_cb.bind(); } + auto out_port_g() { return m_out_port_g_cb.bind(); } + auto out_port_j() { return m_out_port_j_cb.bind(); } + auto out_port_k() { return m_out_port_k_cb.bind(); } + auto out_port_m() { return m_out_port_m_cb.bind(); } + auto in_port_a() { return m_in_port_a_cb.bind(); } + auto in_port_b() { return m_in_port_b_cb.bind(); } + auto in_port_c() { return m_in_port_c_cb.bind(); } + auto in_port_d() { return m_in_port_d_cb.bind(); } + auto in_port_e() { return m_in_port_e_cb.bind(); } + auto in_port_f() { return m_in_port_f_cb.bind(); } + auto in_port_g() { return m_in_port_g_cb.bind(); } + auto in_port_j() { return m_in_port_j_cb.bind(); } + auto in_port_k() { return m_in_port_k_cb.bind(); } + auto in_port_m() { return m_in_port_m_cb.bind(); } + auto out_pwm() { return m_out_pwm_cb.bind(); } + auto out_spim() { return m_out_spim_cb.bind(); } + auto in_spim() { return m_in_spim_cb.bind(); } + auto spim_xch_trigger() { return m_spim_xch_trigger_cb.bind(); } DECLARE_WRITE16_MEMBER(write); @@ -385,80 +387,4 @@ private: DECLARE_DEVICE_TYPE(MC68328, mc68328_device) -#define MCFG_MC68328_CPU(_tag) \ - downcast<mc68328_device &>(*device).set_cpu_tag(_tag); - -#define MCFG_MC68328_OUT_PORT_A_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_port_a_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_PORT_B_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_port_b_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_PORT_C_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_port_c_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_PORT_D_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_port_d_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_PORT_E_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_port_e_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_PORT_F_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_port_f_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_PORT_G_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_port_g_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_PORT_J_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_port_j_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_PORT_K_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_port_k_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_PORT_M_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_port_m_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_PORT_A_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_port_a_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_PORT_B_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_port_b_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_PORT_C_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_port_c_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_PORT_D_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_port_d_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_PORT_E_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_port_e_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_PORT_F_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_port_f_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_PORT_G_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_port_g_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_PORT_J_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_port_j_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_PORT_K_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_port_k_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_PORT_M_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_port_m_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_PWM_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_pwm_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_OUT_SPIM_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_out_spim_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_IN_SPIM_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_in_spim_callback(DEVCB_##_devcb); - -#define MCFG_MC68328_SPIM_XCH_TRIGGER_CB(_devcb) \ - downcast<mc68328_device &>(*device).set_spim_xch_trigger_callback(DEVCB_##_devcb); - - #endif // MAME_MACHINE_MC68328_H diff --git a/src/devices/machine/mc6843.h b/src/devices/machine/mc6843.h index 54f6fff58a3..29f3b862bda 100644 --- a/src/devices/machine/mc6843.h +++ b/src/devices/machine/mc6843.h @@ -23,7 +23,7 @@ class mc6843_device : public device_t public: mc6843_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); } + auto irq() { return m_write_irq.bind(); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); diff --git a/src/devices/machine/mc6846.h b/src/devices/machine/mc6846.h index c5870dc6c39..1b960ae1ef3 100644 --- a/src/devices/machine/mc6846.h +++ b/src/devices/machine/mc6846.h @@ -14,36 +14,17 @@ #pragma once -#define MCFG_MC6846_OUT_PORT_CB(_devcb) \ - downcast<mc6846_device &>(*device).set_out_port_callback(DEVCB_##_devcb); - -#define MCFG_MC6846_OUT_CP1_CB(_devcb) \ - downcast<mc6846_device &>(*device).set_out_cp1_callback(DEVCB_##_devcb); - -#define MCFG_MC6846_OUT_CP2_CB(_devcb) \ - downcast<mc6846_device &>(*device).set_out_cp2_callback(DEVCB_##_devcb); - -#define MCFG_MC6846_IN_PORT_CB(_devcb) \ - downcast<mc6846_device &>(*device).set_in_port_callback(DEVCB_##_devcb); - -#define MCFG_MC6846_OUT_CTO_CB(_devcb) \ - downcast<mc6846_device &>(*device).set_out_cto_callback(DEVCB_##_devcb); - -#define MCFG_MC6846_IRQ_CB(_devcb) \ - downcast<mc6846_device &>(*device).set_irq_callback(DEVCB_##_devcb); - - class mc6846_device : public device_t { public: mc6846_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_out_port_callback(Object &&cb) { return m_out_port_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_cp1_callback(Object &&cb) { return m_out_cp1_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_cp2_callback(Object &&cb) { return m_out_cp2_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_port_callback(Object &&cb) { return m_in_port_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_cto_callback(Object &&cb) { return m_out_cto_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); } + auto out_port() { return m_out_port_cb.bind(); } + auto in_port() { return m_in_port_cb.bind(); } + auto cp1() { return m_out_cp1_cb.bind(); } + auto cp2() { return m_out_cp2_cb.bind(); } + auto cto() { return m_out_cto_cb.bind(); } + auto irq() { return m_irq_cb.bind(); } /* interface to CPU via address/data bus*/ DECLARE_READ8_MEMBER(read); diff --git a/src/devices/machine/ncr5390.cpp b/src/devices/machine/ncr5390.cpp index 264cbc3fa72..8d9f4b9641b 100644 --- a/src/devices/machine/ncr5390.cpp +++ b/src/devices/machine/ncr5390.cpp @@ -340,7 +340,7 @@ void ncr5390_device::step(bool timeout) case DISC_SEL_ARBITRATION_INIT: // wait until a command is in the fifo - if (!fifo_pos || (dma_command && !(status & S_TC0))) + if (!fifo_pos && dma_command && !(status & S_TC0)) break; command_length = derive_msg_size(fifo[0]); @@ -375,7 +375,7 @@ void ncr5390_device::step(bool timeout) case DISC_SEL_ATN_SEND_BYTE: if(c == CD_SELECT_ATN_STOP) { seq = 1; - function_complete(); + function_bus_complete(); } else { command_length = derive_msg_size(fifo[0]); state = DISC_SEL_WAIT_REQ; @@ -825,6 +825,7 @@ void ncr5390_device::start_command() case CI_COMPLETE: LOGMASKED(LOG_COMMAND, "Initiator command complete sequence\n"); state = INIT_CPT_RECV_BYTE_ACK; + dma_set(dma_command ? DMA_IN : DMA_NONE); recv_byte(); break; diff --git a/src/devices/machine/pci9050.cpp b/src/devices/machine/pci9050.cpp index 0238d699ece..e65434d3f5a 100644 --- a/src/devices/machine/pci9050.cpp +++ b/src/devices/machine/pci9050.cpp @@ -81,11 +81,9 @@ void pci9050_device::device_start() save_item(NAME(m_erombrd)); save_item(NAME(m_intcsr)); save_item(NAME(m_cntrl)); - machine().save().register_postload(save_prepost_delegate(FUNC(pci9050_device::postload), this)); - } -void pci9050_device::postload(void) +void pci9050_device::device_post_load() { remap_rom(); for (int id = 0; id < 4; id++) diff --git a/src/devices/machine/pci9050.h b/src/devices/machine/pci9050.h index e1a6da148fd..03bbde058ab 100644 --- a/src/devices/machine/pci9050.h +++ b/src/devices/machine/pci9050.h @@ -27,10 +27,9 @@ public: protected: virtual void device_start() override; + virtual void device_post_load() override; virtual void device_reset() override; - void postload(void); - private: void map(address_map &map); diff --git a/src/devices/machine/s3c44b0.cpp b/src/devices/machine/s3c44b0.cpp index 00d8ac91513..0c56bb51a17 100644 --- a/src/devices/machine/s3c44b0.cpp +++ b/src/devices/machine/s3c44b0.cpp @@ -225,7 +225,7 @@ DEFINE_DEVICE_TYPE(S3C44B0, s3c44b0_device, "s3c44b0", "Samsung S3C44B0 SoC") s3c44b0_device::s3c44b0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, S3C44B0, tag, owner, clock) , device_video_interface(mconfig, *this) - , m_cpu(nullptr) + , m_cpu(*this, finder_base::DUMMY_TAG) , m_port_r_cb(*this) , m_port_w_cb(*this) , m_scl_w_cb(*this) @@ -256,8 +256,6 @@ s3c44b0_device::s3c44b0_device(const machine_config &mconfig, const char *tag, d void s3c44b0_device::device_start() { - m_cpu = machine().device<cpu_device>("maincpu"); - m_port_r_cb.resolve(); m_port_w_cb.resolve(); m_scl_w_cb.resolve(); @@ -332,8 +330,6 @@ void s3c44b0_device::device_start() save_item(NAME(m_lcd.vpos_end)); save_item(NAME(m_lcd.frame_time)); - machine().save().register_postload(save_prepost_delegate(FUNC(s3c44b0_device::s3c44b0_postload), this)); - for (int i = 0; i < 2; i++) { save_item(NAME(m_zdma[i].regs.dcon), i); @@ -446,7 +442,13 @@ void s3c44b0_device::device_start() } -void s3c44b0_device::s3c44b0_postload() +//------------------------------------------------- +// device_post_load - called after the loading a +// saved state, so that registered variables can +// be expaneded as necessary +//------------------------------------------------- + +void s3c44b0_device::device_post_load() { m_lcd.frame_period = HZ_TO_ATTOSECONDS(m_lcd.framerate); m_lcd.scantime = m_lcd.frame_period / m_lcd.vpos_end; diff --git a/src/devices/machine/s3c44b0.h b/src/devices/machine/s3c44b0.h index 21d6d7e0082..f4f194ce3c8 100644 --- a/src/devices/machine/s3c44b0.h +++ b/src/devices/machine/s3c44b0.h @@ -116,13 +116,14 @@ class s3c44b0_device : public device_t, public device_video_interface public: s3c44b0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_gpio_port_r_callback(Object &&cb) { return m_port_r_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_gpio_port_w_callback(Object &&cb) { return m_port_w_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_i2c_scl_w_callback(Object &&cb) { return m_scl_w_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_i2c_sda_r_callback(Object &&cb) { return m_sda_r_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_i2c_sda_w_callback(Object &&cb) { return m_sda_w_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_adc_data_r_callback(Object &&cb) { return m_data_r_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_i2s_data_w_callback(Object &&cb) { return m_data_w_cb.set_callback(std::forward<Object>(cb)); } + template <class T> void set_cpu(T &&tag) { m_cpu.set_tag(std::forward<T>(tag)); } + auto gpio_port_r_cb() { return m_port_r_cb.bind(); } + auto gpio_port_w_cb() { return m_port_w_cb.bind(); } + auto i2c_scl_w_cb() { return m_scl_w_cb.bind(); } + auto i2c_sda_r_cb() { return m_sda_r_cb.bind(); } + auto i2c_sda_w_cb() { return m_sda_w_cb.bind(); } + auto adc_data_r_cb() { return m_data_r_cb.bind(); } + auto i2s_data_w_cb() { return m_data_w_cb.bind(); } DECLARE_READ32_MEMBER(lcd_r); DECLARE_READ32_MEMBER(clkpow_r); @@ -166,6 +167,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_post_load() override; virtual void device_reset() override; private: @@ -572,7 +574,7 @@ private: void bdma_w(int ch, uint32_t offset, uint32_t data, uint32_t mem_mask); TIMER_CALLBACK_MEMBER(bdma_timer_exp); - cpu_device *m_cpu; + required_device<cpu_device> m_cpu; //s3c44b0_memcon_t m_memcon; s3c44b0_irq_t m_irq; s3c44b0_dma_t m_zdma[2]; @@ -597,33 +599,9 @@ private: devcb_write_line m_sda_w_cb; devcb_read32 m_data_r_cb; devcb_write16 m_data_w_cb; - - void s3c44b0_postload(); }; DECLARE_DEVICE_TYPE(S3C44B0, s3c44b0_device) -#define MCFG_S3C44B0_GPIO_PORT_R_CB(cb) \ - downcast<s3c44b0_device &>(*device).set_gpio_port_r_callback(DEVCB_##cb); - -#define MCFG_S3C44B0_GPIO_PORT_W_CB(cb) \ - downcast<s3c44b0_device &>(*device).set_gpio_port_w_callback(DEVCB_##cb); - -#define MCFG_S3C44B0_I2C_SCL_W_CB(cb) \ - downcast<s3c44b0_device &>(*device).set_i2c_scl_w_callback(DEVCB_##cb); - -#define MCFG_S3C44B0_I2C_SDA_R_CB(cb) \ - downcast<s3c44b0_device &>(*device).set_i2c_sda_r_callback(DEVCB_##cb); - -#define MCFG_S3C44B0_I2C_SDA_W_CB(cb) \ - downcast<s3c44b0_device &>(*device).set_i2c_sda_w_callback(DEVCB_##cb); - -#define MCFG_S3C44B0_ADC_DATA_R_CB(cb) \ - downcast<s3c44b0_device &>(*device).set_adc_data_r_callback(DEVCB_##cb); - -#define MCFG_S3C44B0_I2S_DATA_W_CB(cb) \ - downcast<s3c44b0_device &>(*device).set_i2s_data_w_callback(DEVCB_##cb); - - #endif // MAME_MACHINE_S3C44B0_H diff --git a/src/devices/machine/sis85c496.cpp b/src/devices/machine/sis85c496.cpp index 372d99a756c..f4e9f426fc1 100644 --- a/src/devices/machine/sis85c496.cpp +++ b/src/devices/machine/sis85c496.cpp @@ -109,7 +109,7 @@ MACHINE_CONFIG_START(sis85c496_host_device::device_add_mconfig) MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL) DS12885(config, m_ds12885); - m_ds12885->irq_callback().set(m_pic8259_slave, FUNC(pic8259_device::ir0_w)); + m_ds12885->irq().set(m_pic8259_slave, FUNC(pic8259_device::ir0_w)); m_ds12885->set_century_index(0x32); /* sound hardware */ diff --git a/src/devices/machine/upd71071.cpp b/src/devices/machine/upd71071.cpp index bbd79dc3f6a..1232819c6ae 100644 --- a/src/devices/machine/upd71071.cpp +++ b/src/devices/machine/upd71071.cpp @@ -3,7 +3,7 @@ /* - am9517a.c is a more complete implementation of this, the uPD71071 appears to be a clone of it + am9517a.cpp is a more complete implementation of this, the uPD71071 appears to be a clone of it NEC uPD71071 DMA Controller Used on the Fujitsu FM-Towns diff --git a/src/devices/machine/upd71071.h b/src/devices/machine/upd71071.h index 9b05766dd74..211e39cd51e 100644 --- a/src/devices/machine/upd71071.h +++ b/src/devices/machine/upd71071.h @@ -14,12 +14,12 @@ public: void set_cpu_tag(const char *tag) { m_cpu.set_tag(tag); } void set_clock(int clock) { m_upd_clock = clock; } - template <class Object> devcb_base &set_out_hreq_callback(Object &&cb) { return m_out_hreq_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_eop_callback(Object &&cb) { return m_out_eop_cb.set_callback(std::forward<Object>(cb)); } + auto out_hreq_callback() { return m_out_hreq_cb.bind(); } + auto out_eop_callback() { return m_out_eop_cb.bind(); } - template <unsigned N, class Object> devcb_base &set_dma_read_callback(Object &&cb) { return m_dma_read_cb[N].set_callback(std::forward<Object>(cb)); } - template <unsigned N, class Object> devcb_base &set_dma_write_callback(Object &&cb) { return m_dma_write_cb[N].set_callback(std::forward<Object>(cb)); } - template <unsigned N, class Object> devcb_base &set_out_dack_callback(Object &&cb) { return m_out_dack_cb[N].set_callback(std::forward<Object>(cb)); } + template <unsigned N> auto dma_read_callback() { return m_dma_read_cb[N].bind(); } + template <unsigned N> auto dma_write_callback() { return m_dma_write_cb[N].bind(); } + template <unsigned N> auto out_dack_callback() { return m_out_dack_cb[N].bind(); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -75,52 +75,5 @@ private: DECLARE_DEVICE_TYPE(UPD71071, upd71071_device) -#define MCFG_UPD71071_CPU(tag) \ - downcast<upd71071_device &>(*device).set_cpu_tag(tag); - -#define MCFG_UPD71071_CLOCK(clk) \ - downcast<upd71071_device &>(*device).set_clock((clk)); - -#define MCFG_UPD71071_OUT_HREQ_CB(cb) \ - downcast<upd71071_device &>(*device).set_out_hreq_callback((DEVCB_##cb)); - -#define MCFG_UPD71071_OUT_EOP_CB(cb) \ - downcast<upd71071_device &>(*device).set_out_eop_callback((DEVCB_##cb)); - -#define MCFG_UPD71071_DMA_READ_0_CB(cb) \ - downcast<upd71071_device &>(*device).set_dma_read_callback<0>((DEVCB_##cb)); - -#define MCFG_UPD71071_DMA_READ_1_CB(cb) \ - downcast<upd71071_device &>(*device).set_dma_read_callback<1>((DEVCB_##cb)); - -#define MCFG_UPD71071_DMA_READ_2_CB(cb) \ - downcast<upd71071_device &>(*device).set_dma_read_callback<2>((DEVCB_##cb)); - -#define MCFG_UPD71071_DMA_READ_3_CB(cb) \ - downcast<upd71071_device &>(*device).set_dma_read_callback<3>((DEVCB_##cb)); - -#define MCFG_UPD71071_DMA_WRITE_0_CB(cb) \ - downcast<upd71071_device &>(*device).set_dma_write_callback<0>((DEVCB_##cb)); - -#define MCFG_UPD71071_DMA_WRITE_1_CB(cb) \ - downcast<upd71071_device &>(*device).set_dma_write_callback<1>((DEVCB_##cb)); - -#define MCFG_UPD71071_DMA_WRITE_2_CB(cb) \ - downcast<upd71071_device &>(*device).set_dma_write_callback<2>((DEVCB_##cb)); - -#define MCFG_UPD71071_DMA_WRITE_3_CB(cb) \ - downcast<upd71071_device &>(*device).set_dma_write_callback<3>((DEVCB_##cb)); - -#define MCFG_UPD71071_OUT_DACK_0_CB(cb) \ - downcast<upd71071_device &>(*device).set_out_dack_callback<0>((DEVCB_##cb)); - -#define MCFG_UPD71071_OUT_DACK_1_CB(cb) \ - downcast<upd71071_device &>(*device).set_out_dack_callback<1>((DEVCB_##cb)); - -#define MCFG_UPD71071_OUT_DACK_2_CB(cb) \ - downcast<upd71071_device &>(*device).set_out_dack_callback<2>((DEVCB_##cb)); - -#define MCFG_UPD71071_OUT_DACK_3_CB(cb) \ - downcast<upd71071_device &>(*device).set_out_dack_callback<3>((DEVCB_##cb)); #endif // MAME_MACHINE_UPD71071_H diff --git a/src/devices/machine/v3021.h b/src/devices/machine/v3021.h index b412163cb22..4f3b4635ea4 100644 --- a/src/devices/machine/v3021.h +++ b/src/devices/machine/v3021.h @@ -16,14 +16,6 @@ #pragma once - -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_V3021_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, V3021, XTAL(32'768)) - //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -34,7 +26,7 @@ class v3021_device : public device_t { public: // construction/destruction - v3021_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + v3021_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 32'768); // I/O operations DECLARE_WRITE8_MEMBER( write ); diff --git a/src/devices/machine/vt82c496.cpp b/src/devices/machine/vt82c496.cpp index f7f58db89fe..f72108d7fe1 100644 --- a/src/devices/machine/vt82c496.cpp +++ b/src/devices/machine/vt82c496.cpp @@ -17,24 +17,16 @@ DEFINE_DEVICE_TYPE(VT82C496, vt82c496_device, "vt82c496", "VIA VT82C496 system c vt82c496_device::vt82c496_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, VT82C496, tag, owner, clock), m_cpu_tag(nullptr), m_region_tag(nullptr), m_space(nullptr), m_ram(nullptr), m_rom(nullptr), m_reg_select(0) + : device_t(mconfig, VT82C496, tag, owner, clock), m_cpu(*this, finder_base::DUMMY_TAG), m_space(nullptr), m_ram(*this, finder_base::DUMMY_TAG), m_rom(*this, finder_base::DUMMY_TAG), m_reg_select(0) { } void vt82c496_device::device_start() { /* get address space we are working on */ - device_t *cpu = machine().device(m_cpu_tag); - assert(cpu != nullptr); - - m_space = &cpu->memory().space(AS_PROGRAM); - - /* get rom region */ - m_rom = machine().root_device().memregion(m_region_tag)->base(); + m_space = &m_cpu->space(AS_PROGRAM); save_pointer(m_reg,"Registers",0x100); - - m_ram = machine().device<ram_device>(RAM_TAG); } void vt82c496_device::device_reset() diff --git a/src/devices/machine/vt82c496.h b/src/devices/machine/vt82c496.h index 60fa191c3f6..f248247a831 100644 --- a/src/devices/machine/vt82c496.h +++ b/src/devices/machine/vt82c496.h @@ -13,23 +13,16 @@ #include "ram.h" -#define MCFG_VT82C496_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, VT82C496, 0) - -#define MCFG_VT82C496_CPU( _tag ) \ - downcast<vt82c496_device &>(*device).set_cpu(_tag); - -#define MCFG_VT82C496_REGION( _tag ) \ - downcast<vt82c496_device &>(*device).set_region(_tag); class vt82c496_device : public device_t { public: // construction/destruction - vt82c496_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + vt82c496_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); - void set_cpu(const char *tag) { m_cpu_tag = tag; } - void set_region(const char *tag) { m_region_tag = tag; } + template <typename T> void set_cputag(T &&tag) { m_cpu.set_tag(std::forward<T>(tag)); } + template <typename T> void set_ramtag(T &&tag) { m_ram.set_tag(std::forward<T>(tag)); } + template <typename T> void set_isatag(T &&tag) { m_rom.set_tag(std::forward<T>(tag)); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -39,12 +32,10 @@ protected: virtual void device_reset() override; private: - const char* m_cpu_tag; - const char* m_region_tag; -// cpu_device* m_maincpu; + required_device<cpu_device> m_cpu; address_space* m_space; - ram_device* m_ram; - uint8_t* m_rom; + required_device<ram_device> m_ram; + required_region_ptr<uint8_t> m_rom; uint8_t m_reg[0x100]; uint8_t m_reg_select; diff --git a/src/devices/machine/wd7600.cpp b/src/devices/machine/wd7600.cpp index 419042631e0..2da075c83c4 100644 --- a/src/devices/machine/wd7600.cpp +++ b/src/devices/machine/wd7600.cpp @@ -74,7 +74,7 @@ void wd7600_device::device_add_mconfig(machine_config & config) m_ctc->out_handler<2>().set(FUNC(wd7600_device::ctc_out2_w)); DS12885(config, m_rtc); - m_rtc->irq_callback().set(m_pic2, FUNC(pic8259_device::ir0_w)); + m_rtc->irq().set(m_pic2, FUNC(pic8259_device::ir0_w)); m_rtc->set_century_index(0x32); } diff --git a/src/devices/sound/k056800.h b/src/devices/sound/k056800.h index 38d4902cfeb..ea20ebdb23d 100644 --- a/src/devices/sound/k056800.h +++ b/src/devices/sound/k056800.h @@ -11,18 +11,6 @@ /*************************************************************************** - DEVICE CONFIGURATION MACROS -***************************************************************************/ - -#define MCFG_K056800_ADD(tag, clock) \ - MCFG_DEVICE_ADD((tag), K056800, (clock)) - -#define MCFG_K056800_INT_HANDLER(cb) \ - downcast<k056800_device &>(*device).set_int_handler((DEVCB_##cb)); - - - -/*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ @@ -33,7 +21,7 @@ public: k056800_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // configuration helpers - template <class Object> devcb_base &set_int_handler(Object &&cb) { return m_int_handler.set_callback(std::forward<Object>(cb)); } + auto int_callback() { return m_int_handler.bind(); } DECLARE_READ8_MEMBER( host_r ); DECLARE_WRITE8_MEMBER( host_w ); diff --git a/src/devices/sound/msm5232.cpp b/src/devices/sound/msm5232.cpp index eb887a111f7..7bcaf059d5d 100644 --- a/src/devices/sound/msm5232.cpp +++ b/src/devices/sound/msm5232.cpp @@ -37,7 +37,6 @@ void msm5232_device::device_start() m_stream = machine().sound().stream_alloc(*this, 0, 11, rate); /* register with the save state system */ - machine().save().register_postload(save_prepost_delegate(FUNC(msm5232_device::postload), this)); save_item(NAME(m_EN_out16)); save_item(NAME(m_EN_out8)); save_item(NAME(m_EN_out4)); @@ -709,7 +708,7 @@ void msm5232_device::TG_group_advance(int groupidx) /* MAME Interface */ -void msm5232_device::postload() +void msm5232_device::device_post_load() { init_tables(); } diff --git a/src/devices/sound/msm5232.h b/src/devices/sound/msm5232.h index 11e68c6ec02..7afc5131f0d 100644 --- a/src/devices/sound/msm5232.h +++ b/src/devices/sound/msm5232.h @@ -30,6 +30,7 @@ protected: virtual void device_start() override; virtual void device_stop() override; virtual void device_reset() override; + virtual void device_post_load() override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; @@ -101,7 +102,6 @@ private: void init(int clock, int rate); void EG_voices_advance(); void TG_group_advance(int groupidx); - void postload(); }; DECLARE_DEVICE_TYPE(MSM5232, msm5232_device) diff --git a/src/devices/sound/multipcm.cpp b/src/devices/sound/multipcm.cpp index dab667234ab..e1aa70bddb6 100644 --- a/src/devices/sound/multipcm.cpp +++ b/src/devices/sound/multipcm.cpp @@ -17,13 +17,13 @@ * 6: LFO frequency + Phase LFO depth * 7: Amplitude LFO size * - * The first sample ROM contains a variable length table with 12 - * bytes per instrument/sample. This is very similar to the YMF278B. + * The first sample ROM contains a variable length metadata table with 12 + * bytes per instrument sample. This is very similar to the YMF278B 'OPL4'. * This sample format might be derived from the one used by the older YM7138 'GEW6' chip. * * The first 3 bytes are the offset into the file (big endian). (0, 1, 2) - * The next 2 are the loop start offset into the file (big endian) (3, 4) - * The next 2 are the 2's complement of the total sample size (big endian) (5, 6) + * The next 2 are the loop start point, in samples (big endian) (3, 4) + * The next 2 are the 2's complement negation of of the total number of samples (big endian) (5, 6) * The next byte is LFO freq + depth (copied to reg 6 ?) (7, 8) * The next 3 are envelope params (Attack, Decay1 and 2, sustain level, release, Key Rate Scaling) (9, 10, 11) * The next byte is Amplitude LFO size (copied to reg 7 ?) diff --git a/src/devices/sound/okiadpcm.cpp b/src/devices/sound/okiadpcm.cpp index 8fc33565aaf..160ddc3519b 100644 --- a/src/devices/sound/okiadpcm.cpp +++ b/src/devices/sound/okiadpcm.cpp @@ -4,8 +4,19 @@ okiadpcm.h - OKI ADCPM emulation. - + OKI ADPCM emulation. + + See the following patents/applications: + (Note: if not registered, the application below was not actually granted, and is effectively abandoned) + Application JP,1980-109800 (Unexamined Publication JP,S57-035434,A) (Examined Publication JP,S61-024850,B) (Registration number JP,1356613,B) https://patents.google.com/patent/JPS5735434A/en + Application JP,1981-185490 (Unexamined Publication JP,S58-088926,A) (Not examined or registered) https://patents.google.com/patent/JPS5888926A/en + Application JP,1982-213971 (Unexamined Publication JP,S59-104699,A) (Not examined or registered) https://patents.google.com/patent/JPS59104699A/en <- this one goes into a bit more detail/better arranged diagrams, and shows a Q table with entries 0-63 rather than 0-48 of the real msm5205 + + Application JP,1987-184421 (Unexamined Publication JP,S64-028700,A) (Not examined) (Registration number JP,2581696,B) https://patents.google.com/patent/JPS6428700A/en <- quad band coding system for adpcm? + Application JP,1994-039523 (Unexamined Publication JP,H07-248798,A) (Not examined) (Registration number JP,3398457,B) https://patents.google.com/patent/JP3398457B2/en <- this may cover the 'adpcm2' method + Application JP,1995-104333 (Unexamined Publication JP,H08-307371,A) (Not examined or registered) https://patents.google.com/patent/JPH08307371A/en <- something unrelated to adpcm, wireless transmission error detection related? + Application JP,1995-162009 (Unexamined Publication JP,H09-018425,A) (Not examined or registered) https://patents.google.com/patent/JPH0918425A/en <- looks like ADPCM2 maybe? + Application JP,1988-176215 (Unexamined Publication JP,H02-026426,A) (Not examined or registered) https://patents.google.com/patent/JPH0226426A/en <- Fujitsu variant on (G.726/727?) SB-ADPCM, cited by above ***************************************************************************/ #include "emu.h" diff --git a/src/devices/sound/okim6376.cpp b/src/devices/sound/okim6376.cpp index 0446cf50eb4..0e33c83d7a8 100644 --- a/src/devices/sound/okim6376.cpp +++ b/src/devices/sound/okim6376.cpp @@ -355,7 +355,7 @@ void okim6376_device::generate_adpcm(struct ADPCMVoice *voice, int16_t *buffer, ***********************************************************************************************/ -void okim6376_device::postload() +void okim6376_device::device_post_load() { notify_clock_changed(); } @@ -378,21 +378,21 @@ void okim6376_device::okim6376_state_save_register() { adpcm_state_save_register(&m_voice[j], j); } - machine().save().register_postload(save_prepost_delegate(FUNC(okim6376_device::postload), this)); - save_item(NAME(m_command[0])); - save_item(NAME(m_command[1])); - save_item(NAME(m_stage[0])); - save_item(NAME(m_stage[1])); - save_item(NAME(m_latch)); - save_item(NAME(m_divisor)); - save_item(NAME(m_nar)); - save_item(NAME(m_nartimer)); - save_item(NAME(m_busy)); - save_item(NAME(m_st)); - save_item(NAME(m_st_pulses)); - save_item(NAME(m_st_update)); - save_item(NAME(m_ch2)); - save_item(NAME(m_ch2_update)); + + save_item(NAME(m_command[0])); + save_item(NAME(m_command[1])); + save_item(NAME(m_stage[0])); + save_item(NAME(m_stage[1])); + save_item(NAME(m_latch)); + save_item(NAME(m_divisor)); + save_item(NAME(m_nar)); + save_item(NAME(m_nartimer)); + save_item(NAME(m_busy)); + save_item(NAME(m_st)); + save_item(NAME(m_st_pulses)); + save_item(NAME(m_st_update)); + save_item(NAME(m_ch2)); + save_item(NAME(m_ch2_update)); } void okim6376_device::device_clock_changed() diff --git a/src/devices/sound/okim6376.h b/src/devices/sound/okim6376.h index 52760be23ca..7efaa337d49 100644 --- a/src/devices/sound/okim6376.h +++ b/src/devices/sound/okim6376.h @@ -26,6 +26,7 @@ protected: virtual void device_start() override; virtual void device_reset() override; virtual void device_clock_changed() override; + virtual void device_post_load() override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; @@ -70,7 +71,6 @@ private: void oki_process(int channel, int command); void generate_adpcm(struct ADPCMVoice *voice, int16_t *buffer, int samples,int channel); - void postload(); void okim6376_state_save_register(); void adpcm_state_save_register(struct ADPCMVoice *voice, int index); }; diff --git a/src/devices/sound/sp0256.cpp b/src/devices/sound/sp0256.cpp index 78f77da29ba..54c17fcaf21 100644 --- a/src/devices/sound/sp0256.cpp +++ b/src/devices/sound/sp0256.cpp @@ -1141,7 +1141,7 @@ void sp0256_device::micro() -WRITE8_MEMBER( sp0256_device::ald_w ) +void sp0256_device::ald_w(uint8_t data) { /* ---------------------------------------------------------------- */ /* Drop writes to the ALD register if we're busy. */ @@ -1180,7 +1180,7 @@ READ_LINE_MEMBER( sp0256_device::sby_r ) return m_sby_line; } -READ16_MEMBER( sp0256_device::spb640_r ) +uint16_t sp0256_device::spb640_r(offs_t offset) { /* -------------------------------------------------------------------- */ /* Offset 0 returns the SP0256 LRQ status on bit 15. */ @@ -1204,11 +1204,11 @@ READ16_MEMBER( sp0256_device::spb640_r ) return 0x00ff; } -WRITE16_MEMBER( sp0256_device::spb640_w ) +void sp0256_device::spb640_w(offs_t offset, uint16_t data) { if (offset == 0) { - ald_w(space, 0, data & 0xff); + ald_w(data & 0xff); return; } diff --git a/src/devices/sound/sp0256.h b/src/devices/sound/sp0256.h index aad9370e91c..83a3aa75c5d 100644 --- a/src/devices/sound/sp0256.h +++ b/src/devices/sound/sp0256.h @@ -45,11 +45,11 @@ public: auto data_request_callback() { return m_drq_cb.bind(); } auto standby_callback() { return m_sby_cb.bind(); } - DECLARE_WRITE8_MEMBER(ald_w); + void ald_w(uint8_t data); DECLARE_READ_LINE_MEMBER(lrq_r); DECLARE_READ_LINE_MEMBER(sby_r); - DECLARE_READ16_MEMBER(spb640_r); - DECLARE_WRITE16_MEMBER(spb640_w); + uint16_t spb640_r(offs_t offset); + void spb640_w(offs_t offset, uint16_t data); TIMER_CALLBACK_MEMBER(set_lrq_timer_proc); void set_clock(int clock); diff --git a/src/devices/sound/spkrdev.cpp b/src/devices/sound/spkrdev.cpp index fc912fbd367..c44e00f5708 100644 --- a/src/devices/sound/spkrdev.cpp +++ b/src/devices/sound/spkrdev.cpp @@ -168,8 +168,6 @@ void speaker_sound_device::device_start() save_item(NAME(m_last_update_time)); save_item(NAME(m_prevx)); save_item(NAME(m_prevy)); - - machine().save().register_postload(save_prepost_delegate(FUNC(speaker_sound_device::speaker_postload), this)); } void speaker_sound_device::device_reset() @@ -193,7 +191,7 @@ void speaker_sound_device::device_reset() m_prevx = m_prevy = 0.0; } -void speaker_sound_device::speaker_postload() +void speaker_sound_device::device_post_load() { m_channel_next_sample_time = m_channel_last_sample_time + attotime(0, m_channel_sample_period); m_next_interm_sample_time = m_channel_last_sample_time + attotime(0, m_interm_sample_period); diff --git a/src/devices/sound/spkrdev.h b/src/devices/sound/spkrdev.h index b7d0ac95cec..3d5f70477c2 100644 --- a/src/devices/sound/spkrdev.h +++ b/src/devices/sound/spkrdev.h @@ -32,6 +32,7 @@ protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; + virtual void device_post_load() override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; @@ -78,8 +79,6 @@ private: int m_interm_sample_index; /* counts interm. samples between stream samples */ attotime m_last_update_time; /* internal timestamp */ - void speaker_postload(); - // DC blocker state double m_prevx, m_prevy; diff --git a/src/devices/sound/tms5220.cpp b/src/devices/sound/tms5220.cpp index 3899675c2ec..285347f9010 100644 --- a/src/devices/sound/tms5220.cpp +++ b/src/devices/sound/tms5220.cpp @@ -1963,7 +1963,7 @@ WRITE8_MEMBER( tms5220_device::combined_rsq_wsq_w ) ***********************************************************************************************/ -void tms5220_device::write_data(uint8_t data) +void tms5220_device::data_w(uint8_t data) { LOGMASKED(LOG_RS_WS, "tms5220_write_data: data %02x\n", data); /* bring up to date first */ @@ -1987,7 +1987,7 @@ void tms5220_device::write_data(uint8_t data) ***********************************************************************************************/ -uint8_t tms5220_device::read_status() +uint8_t tms5220_device::status_r() { // prevent debugger from changing the internal state if (!machine().side_effects_disabled()) diff --git a/src/devices/sound/tms5220.h b/src/devices/sound/tms5220.h index 4a61f104f30..a14d1ef86ce 100644 --- a/src/devices/sound/tms5220.h +++ b/src/devices/sound/tms5220.h @@ -91,11 +91,9 @@ public: /RS is bit 1, /WS is bit 0 Note this is a hack and probably can be removed later, once the 'real' line handlers above defer by at least 4 clock cycles before taking effect */ - DECLARE_WRITE8_MEMBER( data_w ) { write_data(data); } - DECLARE_READ8_MEMBER( status_r ) { return read_status(); } - void write_data(uint8_t data); - uint8_t read_status(); + void data_w(uint8_t data); + uint8_t status_r(); READ_LINE_MEMBER( readyq_r ); READ_LINE_MEMBER( intq_r ); diff --git a/src/devices/sound/vlm5030.cpp b/src/devices/sound/vlm5030.cpp index b77a5bfc193..9bdbd807876 100644 --- a/src/devices/sound/vlm5030.cpp +++ b/src/devices/sound/vlm5030.cpp @@ -235,7 +235,6 @@ void vlm5030_device::device_start() save_item(NAME(m_target_pitch)); save_item(NAME(m_target_k)); save_item(NAME(m_x)); - machine().save().register_postload(save_prepost_delegate(FUNC(vlm5030_device::restore_state), this)); } //------------------------------------------------- @@ -263,6 +262,11 @@ void vlm5030_device::device_reset() setup_parameter( 0x00); } +void vlm5030_device::device_post_load() +{ + restore_state(); +} + void vlm5030_device::rom_bank_updated() { m_channel->update(); diff --git a/src/devices/sound/vlm5030.h b/src/devices/sound/vlm5030.h index 48e0d712b2f..af5f6dbc75b 100644 --- a/src/devices/sound/vlm5030.h +++ b/src/devices/sound/vlm5030.h @@ -29,6 +29,7 @@ protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; + virtual void device_post_load() override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; diff --git a/src/devices/video/psx.cpp b/src/devices/video/psx.cpp index 70f43c49f0a..464e2a1fd59 100644 --- a/src/devices/video/psx.cpp +++ b/src/devices/video/psx.cpp @@ -37,6 +37,8 @@ void psxgpu_device::device_start() { m_vblank_handler.resolve_safe(); + screen().register_vblank_callback(vblank_state_delegate(&psxgpu_device::vblank, this)); + for( int n_colour = 0; n_colour < 0x10000; n_colour++ ) { set_pen_color( n_colour, pal555(n_colour,0, 5, 10) ); @@ -87,12 +89,12 @@ cxd8654q_device::cxd8654q_device(const machine_config &mconfig, const char *tag, { } -static const uint16_t m_p_n_nextpointlist4[] = { 1, 3, 0, 2 }; -static const uint16_t m_p_n_prevpointlist4[] = { 2, 0, 3, 1 }; -static const uint16_t m_p_n_nextpointlist4b[] = { 0, 3, 1, 2 }; -static const uint16_t m_p_n_prevpointlist4b[] = { 0, 2, 3, 1 }; -static const uint16_t m_p_n_nextpointlist3[] = { 1, 2, 0 }; -static const uint16_t m_p_n_prevpointlist3[] = { 2, 0, 1 }; +static const int m_p_n_nextpointlist4[] = { 1, 3, 0, 2 }; +static const int m_p_n_prevpointlist4[] = { 2, 0, 3, 1 }; +static const int m_p_n_nextpointlist4b[] = { 0, 3, 1, 2 }; +static const int m_p_n_prevpointlist4b[] = { 0, 2, 3, 1 }; +static const int m_p_n_nextpointlist3[] = { 1, 2, 0 }; +static const int m_p_n_prevpointlist3[] = { 2, 0, 1 }; #define SINT11( x ) ( ( (int32_t)( x ) << 21 ) >> 21 ) @@ -138,8 +140,6 @@ void psxgpu_device::DebugMeshInit() void psxgpu_device::DebugMesh( int n_coordx, int n_coordy ) { - int n_coord; - int n_colour; int width = screen().width(); int height = screen().height(); @@ -152,7 +152,9 @@ void psxgpu_device::DebugMesh( int n_coordx, int n_coordy ) m_debug.b_clear = 0; } - n_colour = 0x1f; + int n_coord; + int n_colour = 0x1f; + for( n_coord = 0; n_coord < m_debug.n_coord; n_coord++ ) { if( n_coordx != m_debug.n_coordx[ n_coord ] || @@ -161,26 +163,17 @@ void psxgpu_device::DebugMesh( int n_coordx, int n_coordy ) break; } } + if( n_coord == m_debug.n_coord && m_debug.n_coord > 1 ) { n_colour = 0xffff; } + for( n_coord = 0; n_coord < m_debug.n_coord; n_coord++ ) { - PAIR n_x; - PAIR n_y; - int32_t n_xstart; - int32_t n_ystart; - int32_t n_xend; - int32_t n_yend; + int32_t n_xstart = m_debug.n_coordx[ n_coord ]; + int32_t n_xend = n_coordx; int32_t n_xlen; - int32_t n_ylen; - int32_t n_len; - int32_t n_dx; - int32_t n_dy; - - n_xstart = m_debug.n_coordx[ n_coord ]; - n_xend = n_coordx; if( n_xend > n_xstart ) { n_xlen = n_xend - n_xstart; @@ -190,8 +183,9 @@ void psxgpu_device::DebugMesh( int n_coordx, int n_coordy ) n_xlen = n_xstart - n_xend; } - n_ystart = m_debug.n_coordy[ n_coord ]; - n_yend = n_coordy; + int32_t n_ystart = m_debug.n_coordy[ n_coord ]; + int32_t n_yend = n_coordy; + int32_t n_ylen; if( n_yend > n_ystart ) { n_ylen = n_yend - n_ystart; @@ -201,6 +195,7 @@ void psxgpu_device::DebugMesh( int n_coordx, int n_coordy ) n_ylen = n_ystart - n_yend; } + int32_t n_len; if( n_xlen > n_ylen ) { n_len = n_xlen; @@ -210,16 +205,17 @@ void psxgpu_device::DebugMesh( int n_coordx, int n_coordy ) n_len = n_ylen; } - n_x.sw.h = n_xstart; n_x.sw.l = 0; - n_y.sw.h = n_ystart; n_y.sw.l = 0; + PAIR n_x; n_x.sw.h = n_xstart; n_x.sw.l = 0; + PAIR n_y; n_y.sw.h = n_ystart; n_y.sw.l = 0; if( n_len == 0 ) { n_len = 1; } - n_dx = (int32_t)( ( n_xend << 16 ) - n_x.d ) / n_len; - n_dy = (int32_t)( ( n_yend << 16 ) - n_y.d ) / n_len; + int32_t n_dx = (int32_t)( ( n_xend << 16 ) - n_x.d ) / n_len; + int32_t n_dy = (int32_t)( ( n_yend << 16 ) - n_y.d ) / n_len; + while( n_len > 0 ) { if( (int16_t)n_x.w.h >= 0 && @@ -227,9 +223,10 @@ void psxgpu_device::DebugMesh( int n_coordx, int n_coordy ) (int16_t)n_x.w.h <= width - 1 && (int16_t)n_y.w.h <= height - 1 ) { - if( m_debug.mesh->pix16(n_y.w.h, n_x.w.h) != 0xffff ) - m_debug.mesh->pix16(n_y.w.h, n_x.w.h) = n_colour; + if( m_debug.mesh->pix16( n_y.w.h, n_x.w.h ) != 0xffff ) + m_debug.mesh->pix16( n_y.w.h, n_x.w.h ) = n_colour; } + n_x.d += n_dx; n_y.d += n_dy; n_len--; @@ -293,29 +290,27 @@ void psxgpu_device::DebugCheckKeys() #if 0 if( machine().input().code_pressed_once( KEYCODE_D ) ) { - FILE *f; - int n_x; - f = fopen( "dump.txt", "w" ); - for( n_y = 256; n_y < 512; n_y++ ) - for( n_x = 640; n_x < 1024; n_x++ ) + FILE *f = fopen( "dump.txt", "w" ); + for( int n_y = 256; n_y < 512; n_y++ ) + for( int n_x = 640; n_x < 1024; n_x++ ) fprintf( f, "%04u,%04u = %04x\n", n_y, n_x, p_p_vram[ n_y ][ n_x ] ); fclose( f ); } if( machine().input().code_pressed_once( KEYCODE_S ) ) { - FILE *f; popmessage( "saving..." ); - f = fopen( "VRAM.BIN", "wb" ); - for( n_y = 0; n_y < 1024; n_y++ ) + + FILE *f = fopen( "VRAM.BIN", "wb" ); + for( int n_y = 0; n_y < 1024; n_y++ ) fwrite( p_p_vram[ n_y ], 1024 * 2, 1, f ); fclose( f ); } if( machine().input().code_pressed_once( KEYCODE_L ) ) { - FILE *f; popmessage( "loading..." ); - f = fopen( "VRAM.BIN", "rb" ); - for( n_y = 0; n_y < 1024; n_y++ ) + + FILE *f = fopen( "VRAM.BIN", "rb" ); + for( int n_y = 0; n_y < 1024; n_y++ ) fread( p_p_vram[ n_y ], 1024 * 2, 1, f ); fclose( f ); } @@ -326,31 +321,30 @@ int psxgpu_device::DebugMeshDisplay( bitmap_rgb32 &bitmap, const rectangle &clip { if( m_debug.b_mesh ) { - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) - draw_scanline16( bitmap, cliprect.min_x, y, cliprect.max_x+1-cliprect.min_x, &m_debug.mesh.pix16(y), pens() ); + for( int y = cliprect.min_y; y <= cliprect.max_y; y++ ) + draw_scanline16( bitmap, cliprect.min_x, y, cliprect.max_x + 1 - cliprect.min_x, &m_debug.mesh->pix16( y ), pens() ); } + m_debug.b_clear = 1; return m_debug.b_mesh; } int psxgpu_device::DebugTextureDisplay( bitmap_rgb32 &bitmap ) { - uint32_t n_y; - if( m_debug.b_texture ) { int width = screen().width(); int height = screen().height(); - for( n_y = 0; n_y < height; n_y++ ) + for( int n_y = 0; n_y < height; n_y++ ) { - int n_x; - int n_xi; - int n_yi; uint16_t p_n_interleave[ 1024 ]; - for( n_x = 0; n_x < width; n_x++ ) + for( int n_x = 0; n_x < width; n_x++ ) { + int n_xi; + int n_yi; + if( m_debug.n_interleave == 0 ) { n_xi = ( n_x & ~0x3c ) + ( ( n_y << 2 ) & 0x3c ); @@ -366,11 +360,14 @@ int psxgpu_device::DebugTextureDisplay( bitmap_rgb32 &bitmap ) n_xi = n_x; n_yi = n_y; } + p_n_interleave[ n_x ] = p_p_vram[ n_yi ][ n_xi ]; } + draw_scanline16( bitmap, 0, n_y, width, p_n_interleave, pens() ); } } + return m_debug.b_texture; } @@ -455,11 +452,6 @@ void psxgpu_device::updatevisiblearea() void psxgpu_device::psx_gpu_init( int n_gputype ) { - int n_line; - int n_level; - int n_level2; - int n_shade; - int n_shaded; int width = 1024; int height = ( vramSize / width ) / sizeof( uint16_t ); @@ -478,17 +470,17 @@ void psxgpu_device::psx_gpu_init( int n_gputype ) p_vram = make_unique_clear<uint16_t[]>(width * height ); - for( n_line = 0; n_line < 1024; n_line++ ) + for( int n_line = 0; n_line < 1024; n_line++ ) { p_p_vram[ n_line ] = &p_vram[ ( n_line % height ) * width ]; } - for( n_level = 0; n_level < MAX_LEVEL; n_level++ ) + for( int n_level = 0; n_level < MAX_LEVEL; n_level++ ) { - for( n_shade = 0; n_shade < MAX_SHADE; n_shade++ ) + for( int n_shade = 0; n_shade < MAX_SHADE; n_shade++ ) { /* shaded */ - n_shaded = ( n_level * n_shade ) / MID_SHADE; + int n_shaded = ( n_level * n_shade ) / MID_SHADE; if( n_shaded > MAX_LEVEL - 1 ) { n_shaded = MAX_LEVEL - 1; @@ -525,7 +517,7 @@ void psxgpu_device::psx_gpu_init( int n_gputype ) } } - for( n_level = 0; n_level < 0x10000; n_level++ ) + for( int n_level = 0; n_level < 0x10000; n_level++ ) { p_n_redlevel[ n_level ] = ( n_level & ( MAX_LEVEL - 1 ) ) * MAX_SHADE; p_n_greenlevel[ n_level ] = ( ( n_level >> 5 ) & ( MAX_LEVEL - 1 ) ) * MAX_SHADE; @@ -548,12 +540,12 @@ void psxgpu_device::psx_gpu_init( int n_gputype ) p_n_b1g1[ n_level ] = ( ( ( n_level >> 8 ) & 0xff ) << 0 ) | ( ( ( n_level >> 0 ) & 0xff ) << 8 ); } - for( n_level = 0; n_level < MAX_LEVEL; n_level++ ) + for( int n_level = 0; n_level < MAX_LEVEL; n_level++ ) { - for( n_level2 = 0; n_level2 < MAX_LEVEL; n_level2++ ) + for( int n_level2 = 0; n_level2 < MAX_LEVEL; n_level2++ ) { /* add transparency */ - n_shaded = ( n_level + n_level2 ); + int n_shaded = ( n_level + n_level2 ); if( n_shaded > MAX_LEVEL - 1 ) { n_shaded = MAX_LEVEL - 1; @@ -608,8 +600,11 @@ void psxgpu_device::psx_gpu_init( int n_gputype ) save_item(NAME(n_ix)); save_item(NAME(n_iy)); save_item(NAME(n_ti)); +} - machine().save().register_postload( save_prepost_delegate( FUNC( psxgpu_device::updatevisiblearea ), this ) ); +void psxgpu_device::device_post_load() +{ + updatevisiblearea(); } uint32_t psxgpu_device::update_screen(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -768,7 +763,7 @@ uint32_t psxgpu_device::update_screen(screen_device &screen, bitmap_rgb32 &bitma return 0; } -#define WRITE_PIXEL( p ) *( p_vram ) = p +#define WRITE_PIXEL( p ) *( p_vram ) = p; /* type 1 @@ -831,6 +826,7 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) } #define SPRITESETUP \ + int n_dv; \ if( n_iy != 0 ) \ { \ n_dv = -1; \ @@ -839,6 +835,7 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) { \ n_dv = 1; \ } \ + int n_du; \ if( n_ix != 0 ) \ { \ n_du = -1; \ @@ -849,13 +846,13 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) } #define TRANSPARENCYSETUP \ - p_n_f = p_n_f1; \ - p_n_redb = p_n_redb1; \ - p_n_greenb = p_n_greenb1; \ - p_n_blueb = p_n_blueb1; \ - p_n_redtrans = p_n_redaddtrans; \ - p_n_greentrans = p_n_greenaddtrans; \ - p_n_bluetrans = p_n_blueaddtrans; \ + uint16_t *p_n_f = p_n_f1; \ + uint16_t *p_n_redb = p_n_redb1; \ + uint16_t *p_n_greenb = p_n_greenb1; \ + uint16_t *p_n_blueb = p_n_blueb1; \ + uint16_t *p_n_redtrans = p_n_redaddtrans; \ + uint16_t *p_n_greentrans = p_n_greenaddtrans; \ + uint16_t *p_n_bluetrans = p_n_blueaddtrans; \ \ switch( n_cmd & 0x02 ) \ { \ @@ -910,9 +907,9 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) TRANSPARENCYSETUP #define TEXTURESETUP \ - n_tx = m_n_tx; \ - n_ty = m_n_ty; \ - p_clut = p_p_vram[ n_cluty ] + n_clutx; \ + int n_tx = m_n_tx; \ + int n_ty = m_n_ty; \ + uint16_t *p_clut = p_p_vram[ n_cluty ] + n_clutx; \ switch( n_tp ) \ { \ case 0: \ @@ -942,7 +939,7 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) { \ n_distance = ( n_drawarea_x2 - drawx ) + 1; \ } \ - p_vram = p_p_vram[ drawy ] + drawx; \ + uint16_t *p_vram = p_p_vram[ drawy ] + drawx; \ \ switch( n_cmd & 0x02 ) \ { \ @@ -953,7 +950,7 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) WRITE_PIXEL( \ p_n_redshade[ MID_LEVEL | n_r.w.h ] | \ p_n_greenshade[ MID_LEVEL | n_g.w.h ] | \ - p_n_blueshade[ MID_LEVEL | n_b.w.h ] ); \ + p_n_blueshade[ MID_LEVEL | n_b.w.h ] ) \ p_vram++; \ PIXELUPDATE \ n_distance--; \ @@ -966,7 +963,7 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) WRITE_PIXEL( \ p_n_redtrans[ p_n_f[ MID_LEVEL | n_r.w.h ] | p_n_redb[ *( p_vram ) ] ] | \ p_n_greentrans[ p_n_f[ MID_LEVEL | n_g.w.h ] | p_n_greenb[ *( p_vram ) ] ] | \ - p_n_bluetrans[ p_n_f[ MID_LEVEL | n_b.w.h ] | p_n_blueb[ *( p_vram ) ] ] ); \ + p_n_bluetrans[ p_n_f[ MID_LEVEL | n_b.w.h ] | p_n_blueb[ *( p_vram ) ] ] ) \ p_vram++; \ PIXELUPDATE \ n_distance--; \ @@ -996,15 +993,15 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) #define TEXTURE4BIT( TXV, TXU ) \ TEXTURE_LOOP \ - n_bgr = p_clut[ ( *( p_p_vram[ n_ty + TXV ] + n_tx + ( TXU >> 2 ) ) >> ( ( TXU & 0x03 ) << 2 ) ) & 0x0f ]; + uint16_t n_bgr = p_clut[ ( *( p_p_vram[ n_ty + TXV ] + n_tx + ( TXU >> 2 ) ) >> ( ( TXU & 0x03 ) << 2 ) ) & 0x0f ]; #define TEXTURE8BIT( TXV, TXU ) \ TEXTURE_LOOP \ - n_bgr = p_clut[ ( *( p_p_vram[ n_ty + TXV ] + n_tx + ( TXU >> 1 ) ) >> ( ( TXU & 0x01 ) << 3 ) ) & 0xff ]; + uint16_t n_bgr = p_clut[ ( *( p_p_vram[ n_ty + TXV ] + n_tx + ( TXU >> 1 ) ) >> ( ( TXU & 0x01 ) << 3 ) ) & 0xff ]; #define TEXTURE15BIT( TXV, TXU ) \ TEXTURE_LOOP \ - n_bgr = *( p_p_vram[ n_ty + TXV ] + n_tx + TXU ); + uint16_t n_bgr = *( p_p_vram[ n_ty + TXV ] + n_tx + TXU ); #define TEXTUREWINDOW4BIT( TXV, TXU ) TEXTURE4BIT( ( TXV & n_twh ), ( TXU & n_tww ) ) #define TEXTUREWINDOW8BIT( TXV, TXU ) TEXTURE8BIT( ( TXV & n_twh ), ( TXU & n_tww ) ) @@ -1014,19 +1011,19 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) TEXTURE_LOOP \ int n_xi = ( ( TXU >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c ); \ int n_yi = ( TXV & ~0xf ) + ( ( TXU >> 4 ) & 0xf ); \ - n_bgr = p_clut[ ( *( p_p_vram[ n_ty + n_yi ] + n_tx + n_xi ) >> ( ( TXU & 0x03 ) << 2 ) ) & 0x0f ]; + uint16_t n_bgr = p_clut[ ( *( p_p_vram[ n_ty + n_yi ] + n_tx + n_xi ) >> ( ( TXU & 0x03 ) << 2 ) ) & 0x0f ]; #define TEXTUREINTERLEAVED8BIT( TXV, TXU ) \ TEXTURE_LOOP \ int n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 ); \ int n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 ); \ - n_bgr = p_clut[ ( *( p_p_vram[ n_ty + n_yi ] + n_tx + n_xi ) >> ( ( TXU & 0x01 ) << 3 ) ) & 0xff ]; + uint16_t n_bgr = p_clut[ ( *( p_p_vram[ n_ty + n_yi ] + n_tx + n_xi ) >> ( ( TXU & 0x01 ) << 3 ) ) & 0xff ]; #define TEXTUREINTERLEAVED15BIT( TXV, TXU ) \ TEXTURE_LOOP \ int n_xi = TXU; \ int n_yi = TXV; \ - n_bgr = *( p_p_vram[ n_ty + n_yi ] + n_tx + n_xi ); + uint16_t n_bgr = *( p_p_vram[ n_ty + n_yi ] + n_tx + n_xi ); #define TEXTUREWINDOWINTERLEAVED4BIT( TXV, TXU ) TEXTUREINTERLEAVED4BIT( ( TXV & n_twh ), ( TXU & n_tww ) ) #define TEXTUREWINDOWINTERLEAVED8BIT( TXV, TXU ) TEXTUREINTERLEAVED8BIT( ( TXV & n_twh ), ( TXU & n_tww ) ) @@ -1038,7 +1035,7 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) WRITE_PIXEL( \ p_n_redshade[ p_n_redlevel[ n_bgr ] | n_r.w.h ] | \ p_n_greenshade[ p_n_greenlevel[ n_bgr ] | n_g.w.h ] | \ - p_n_blueshade[ p_n_bluelevel[ n_bgr ] | n_b.w.h ] ); \ + p_n_blueshade[ p_n_bluelevel[ n_bgr ] | n_b.w.h ] ) \ } \ p_vram++; \ PIXELUPDATE \ @@ -1053,14 +1050,14 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) WRITE_PIXEL( \ p_n_redtrans[ p_n_f[ p_n_redlevel[ n_bgr ] | n_r.w.h ] | p_n_redb[ *( p_vram ) ] ] | \ p_n_greentrans[ p_n_f[ p_n_greenlevel[ n_bgr ] | n_g.w.h ] | p_n_greenb[ *( p_vram ) ] ] | \ - p_n_bluetrans[ p_n_f[ p_n_bluelevel[ n_bgr ] | n_b.w.h ] | p_n_blueb[ *( p_vram ) ] ] ); \ + p_n_bluetrans[ p_n_f[ p_n_bluelevel[ n_bgr ] | n_b.w.h ] | p_n_blueb[ *( p_vram ) ] ] ) \ } \ else \ { \ WRITE_PIXEL( \ p_n_redshade[ p_n_redlevel[ n_bgr ] | n_r.w.h ] | \ p_n_greenshade[ p_n_greenlevel[ n_bgr ] | n_g.w.h ] | \ - p_n_blueshade[ p_n_bluelevel[ n_bgr ] | n_b.w.h ] ); \ + p_n_blueshade[ p_n_bluelevel[ n_bgr ] | n_b.w.h ] ) \ } \ } \ p_vram++; \ @@ -1073,7 +1070,7 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) { \ n_distance = ( n_drawarea_x2 - drawx ) + 1; \ } \ - p_vram = p_p_vram[ drawy ] + drawx; \ + uint16_t *p_vram = p_p_vram[ drawy ] + drawx; \ \ if( n_ti != 0 ) \ { \ @@ -1312,12 +1309,14 @@ static inline int CullVertex( int a, int b ) ) #define FINDTOPLEFT( PacketType ) \ - for( n_point = 0; n_point < n_points; n_point++ ) \ + for( int n_point = 0; n_point < n_points; n_point++ ) \ { \ GET_COORD( m_packet.PacketType.vertex[ n_point ].n_coord ); \ } \ \ - n_leftpoint = 0; \ + const int *p_n_rightpointlist; \ + const int *p_n_leftpointlist; \ + int n_leftpoint = 0; \ if( n_points == 4 ) \ { \ if( CULLTRIANGLE( PacketType, 0 ) ) \ @@ -1353,7 +1352,7 @@ static inline int CullVertex( int a, int b ) p_n_leftpointlist = m_p_n_prevpointlist3; \ } \ \ - for( n_point = n_leftpoint + 1; n_point < n_points; n_point++ ) \ + for( int n_point = n_leftpoint + 1; n_point < n_points; n_point++ ) \ { \ if( COORD_Y( m_packet.PacketType.vertex[ n_point ].n_coord ) < COORD_Y( m_packet.PacketType.vertex[ n_leftpoint ].n_coord ) || \ ( COORD_Y( m_packet.PacketType.vertex[ n_point ].n_coord ) == COORD_Y( m_packet.PacketType.vertex[ n_leftpoint ].n_coord ) && \ @@ -1362,70 +1361,39 @@ static inline int CullVertex( int a, int b ) n_leftpoint = n_point; \ } \ } \ - n_rightpoint = n_leftpoint; + int n_rightpoint = n_leftpoint; void psxgpu_device::FlatPolygon( int n_points ) { - int16_t n_y; - int16_t n_x; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - - PAIR n_r; - PAIR n_g; - PAIR n_b; - PAIR n_cx1; - PAIR n_cx2; - int32_t n_dx1; - int32_t n_dx2; - - uint8_t n_cmd; - - int32_t n_distance; - - uint16_t n_point; - uint16_t n_rightpoint; - uint16_t n_leftpoint; - const uint16_t *p_n_rightpointlist; - const uint16_t *p_n_leftpointlist; - - uint16_t *p_vram; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 1 ) { return; } - for( n_point = 0; n_point < n_points; n_point++ ) + for( int n_point = 0; n_point < n_points; n_point++ ) { DebugMesh( SINT11( COORD_X( m_packet.FlatPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_y ); } DebugMeshEnd(); #endif - n_cmd = BGR_C( m_packet.FlatPolygon.n_bgr ); + uint8_t n_cmd = BGR_C( m_packet.FlatPolygon.n_bgr ); - n_cx1.d = 0; - n_cx2.d = 0; + PAIR n_cx1; n_cx1.d = 0; + PAIR n_cx2; n_cx2.d = 0; SOLIDSETUP - n_r.w.h = BGR_R( m_packet.FlatPolygon.n_bgr ); n_r.w.l = 0; - n_g.w.h = BGR_G( m_packet.FlatPolygon.n_bgr ); n_g.w.l = 0; - n_b.w.h = BGR_B( m_packet.FlatPolygon.n_bgr ); n_b.w.l = 0; + PAIR n_r; n_r.w.h = BGR_R( m_packet.FlatPolygon.n_bgr ); n_r.w.l = 0; + PAIR n_g; n_g.w.h = BGR_G( m_packet.FlatPolygon.n_bgr ); n_g.w.l = 0; + PAIR n_b; n_b.w.h = BGR_B( m_packet.FlatPolygon.n_bgr ); n_b.w.l = 0; FINDTOPLEFT( FlatPolygon ) - n_dx1 = 0; - n_dx2 = 0; + int32_t n_dx1 = 0; + int32_t n_dx2 = 0; - n_y = COORD_Y( m_packet.FlatPolygon.vertex[ n_rightpoint ].n_coord ); + int16_t n_y = COORD_Y( m_packet.FlatPolygon.vertex[ n_rightpoint ].n_coord ); for( ;; ) { @@ -1439,15 +1407,19 @@ void psxgpu_device::FlatPolygon( int n_points ) break; } } + n_cx1.sw.h = COORD_X( m_packet.FlatPolygon.vertex[ n_leftpoint ].n_coord ); n_cx1.sw.l = 0; n_leftpoint = p_n_leftpointlist[ n_leftpoint ]; - n_distance = COORD_Y( m_packet.FlatPolygon.vertex[ n_leftpoint ].n_coord ) - n_y; + + int32_t n_distance = COORD_Y( m_packet.FlatPolygon.vertex[ n_leftpoint ].n_coord ) - n_y; if( n_distance < 1 ) { break; } + n_dx1 = (int32_t)( ( COORD_X( m_packet.FlatPolygon.vertex[ n_leftpoint ].n_coord ) << 16 ) - n_cx1.d ) / n_distance; } + if( n_y == COORD_Y( m_packet.FlatPolygon.vertex[ n_rightpoint ].n_coord ) ) { while( n_y == COORD_Y( m_packet.FlatPolygon.vertex[ p_n_rightpointlist[ n_rightpoint ] ].n_coord ) ) @@ -1458,13 +1430,16 @@ void psxgpu_device::FlatPolygon( int n_points ) break; } } + n_cx2.sw.h = COORD_X( m_packet.FlatPolygon.vertex[ n_rightpoint ].n_coord ); n_cx2.sw.l = 0; n_rightpoint = p_n_rightpointlist[ n_rightpoint ]; - n_distance = COORD_Y( m_packet.FlatPolygon.vertex[ n_rightpoint ].n_coord ) - n_y; + + int32_t n_distance = COORD_Y( m_packet.FlatPolygon.vertex[ n_rightpoint ].n_coord ) - n_y; if( n_distance < 1 ) { break; } + n_dx2 = (int32_t)( ( COORD_X( m_packet.FlatPolygon.vertex[ n_rightpoint ].n_coord ) << 16 ) - n_cx2.d ) / n_distance; } @@ -1472,6 +1447,9 @@ void psxgpu_device::FlatPolygon( int n_points ) if( (int16_t)n_cx1.sw.h != (int16_t)n_cx2.sw.h && drawy >= (int32_t)n_drawarea_y1 && drawy <= (int32_t)n_drawarea_y2 ) { + int16_t n_x; + int32_t n_distance; + if( (int16_t)n_cx1.sw.h < (int16_t)n_cx2.sw.h ) { n_x = n_cx1.sw.h; @@ -1493,6 +1471,7 @@ void psxgpu_device::FlatPolygon( int n_points ) SOLIDFILL( FLATPOLYGONUPDATE ) } + n_cx1.d += n_dx1; n_cx2.d += n_dx2; n_y++; @@ -1501,109 +1480,47 @@ void psxgpu_device::FlatPolygon( int n_points ) void psxgpu_device::FlatTexturedPolygon( int n_points ) { - int16_t n_y; - int16_t n_x; - int n_tx; - int n_ty; - - uint8_t n_cmd; - - uint32_t n_clutx; - uint32_t n_cluty; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - - PAIR n_r; - PAIR n_g; - PAIR n_b; - PAIR n_u; - PAIR n_v; - - PAIR n_cx1; - PAIR n_cx2; - PAIR n_cu1; - PAIR n_cv1; - PAIR n_cu2; - PAIR n_cv2; - int32_t n_du; - int32_t n_dv; - int32_t n_dx1; - int32_t n_dx2; - int32_t n_du1; - int32_t n_dv1; - int32_t n_du2; - int32_t n_dv2; - - int32_t n_distance; - uint16_t n_point; - uint16_t n_rightpoint; - uint16_t n_leftpoint; - const uint16_t *p_n_rightpointlist; - const uint16_t *p_n_leftpointlist; - uint16_t *p_clut; - uint16_t *p_vram; - uint32_t n_bgr; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 2 ) { return; } - for( n_point = 0; n_point < n_points; n_point++ ) + for( int n_point = 0; n_point < n_points; n_point++ ) { DebugMesh( SINT11( COORD_X( m_packet.FlatTexturedPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatTexturedPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_y ); } DebugMeshEnd(); #endif - n_cmd = BGR_C( m_packet.FlatTexturedPolygon.n_bgr ); + uint8_t n_cmd = BGR_C( m_packet.FlatTexturedPolygon.n_bgr ); - n_clutx = ( m_packet.FlatTexturedPolygon.vertex[ 0 ].n_texture.w.h & 0x3f ) << 4; - n_cluty = ( m_packet.FlatTexturedPolygon.vertex[ 0 ].n_texture.w.h >> 6 ) & 0x3ff; + uint32_t n_clutx = ( m_packet.FlatTexturedPolygon.vertex[ 0 ].n_texture.w.h & 0x3f ) << 4; + uint32_t n_cluty = ( m_packet.FlatTexturedPolygon.vertex[ 0 ].n_texture.w.h >> 6 ) & 0x3ff; - n_r.d = 0; - n_g.d = 0; - n_b.d = 0; - n_cx1.d = 0; - n_cu1.d = 0; - n_cv1.d = 0; - n_cx2.d = 0; - n_cu2.d = 0; - n_cv2.d = 0; + PAIR n_cx1; n_cx1.d = 0; + PAIR n_cu1; n_cu1.d = 0; + PAIR n_cv1; n_cv1.d = 0; + PAIR n_cx2; n_cx2.d = 0; + PAIR n_cu2; n_cu2.d = 0; + PAIR n_cv2; n_cv2.d = 0; decode_tpage( m_packet.FlatTexturedPolygon.vertex[ 1 ].n_texture.w.h ); TEXTURESETUP - switch( n_cmd & 0x01 ) - { - case 0: - n_r.w.h = BGR_R( m_packet.FlatTexturedPolygon.n_bgr ); n_r.w.l = 0; - n_g.w.h = BGR_G( m_packet.FlatTexturedPolygon.n_bgr ); n_g.w.l = 0; - n_b.w.h = BGR_B( m_packet.FlatTexturedPolygon.n_bgr ); n_b.w.l = 0; - break; - case 1: - n_r.w.h = 0x80; n_r.w.l = 0; - n_g.w.h = 0x80; n_g.w.l = 0; - n_b.w.h = 0x80; n_b.w.l = 0; - break; - } + PAIR n_r; n_r.w.h = n_cmd & 0x01 ? 0x80 : BGR_R( m_packet.FlatTexturedPolygon.n_bgr ); n_r.w.l = 0; + PAIR n_g; n_g.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.FlatTexturedPolygon.n_bgr ); n_g.w.l = 0; + PAIR n_b; n_b.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.FlatTexturedPolygon.n_bgr ); n_b.w.l = 0; FINDTOPLEFT( FlatTexturedPolygon ) - n_dx1 = 0; - n_dx2 = 0; - n_du1 = 0; - n_du2 = 0; - n_dv1 = 0; - n_dv2 = 0; + int32_t n_dx1 = 0; + int32_t n_dx2 = 0; + int32_t n_du1 = 0; + int32_t n_du2 = 0; + int32_t n_dv1 = 0; + int32_t n_dv2 = 0; - n_y = COORD_Y( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_coord ); + int16_t n_y = COORD_Y( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_coord ); for( ;; ) { @@ -1617,19 +1534,23 @@ void psxgpu_device::FlatTexturedPolygon( int n_points ) break; } } + n_cx1.sw.h = COORD_X( m_packet.FlatTexturedPolygon.vertex[ n_leftpoint ].n_coord ); n_cx1.sw.l = 0; n_cu1.w.h = TEXTURE_U( m_packet.FlatTexturedPolygon.vertex[ n_leftpoint ].n_texture ); n_cu1.w.l = 0; n_cv1.w.h = TEXTURE_V( m_packet.FlatTexturedPolygon.vertex[ n_leftpoint ].n_texture ); n_cv1.w.l = 0; n_leftpoint = p_n_leftpointlist[ n_leftpoint ]; - n_distance = COORD_Y( m_packet.FlatTexturedPolygon.vertex[ n_leftpoint ].n_coord ) - n_y; + + int32_t n_distance = COORD_Y( m_packet.FlatTexturedPolygon.vertex[ n_leftpoint ].n_coord ) - n_y; if( n_distance < 1 ) { break; } + n_dx1 = (int32_t)( ( COORD_X( m_packet.FlatTexturedPolygon.vertex[ n_leftpoint ].n_coord ) << 16 ) - n_cx1.d ) / n_distance; n_du1 = (int32_t)( ( TEXTURE_U( m_packet.FlatTexturedPolygon.vertex[ n_leftpoint ].n_texture ) << 16 ) - n_cu1.d ) / n_distance; n_dv1 = (int32_t)( ( TEXTURE_V( m_packet.FlatTexturedPolygon.vertex[ n_leftpoint ].n_texture ) << 16 ) - n_cv1.d ) / n_distance; } + if( n_y == COORD_Y( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_coord ) ) { while( n_y == COORD_Y( m_packet.FlatTexturedPolygon.vertex[ p_n_rightpointlist[ n_rightpoint ] ].n_coord ) ) @@ -1640,15 +1561,18 @@ void psxgpu_device::FlatTexturedPolygon( int n_points ) break; } } + n_cx2.sw.h = COORD_X( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_coord ); n_cx2.sw.l = 0; n_cu2.w.h = TEXTURE_U( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_texture ); n_cu2.w.l = 0; n_cv2.w.h = TEXTURE_V( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_texture ); n_cv2.w.l = 0; n_rightpoint = p_n_rightpointlist[ n_rightpoint ]; - n_distance = COORD_Y( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_coord ) - n_y; + + int32_t n_distance = COORD_Y( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_coord ) - n_y; if( n_distance < 1 ) { break; } + n_dx2 = (int32_t)( ( COORD_X( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_coord ) << 16 ) - n_cx2.d ) / n_distance; n_du2 = (int32_t)( ( TEXTURE_U( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_texture ) << 16 ) - n_cu2.d ) / n_distance; n_dv2 = (int32_t)( ( TEXTURE_V( m_packet.FlatTexturedPolygon.vertex[ n_rightpoint ].n_texture ) << 16 ) - n_cv2.d ) / n_distance; @@ -1658,6 +1582,13 @@ void psxgpu_device::FlatTexturedPolygon( int n_points ) if( (int16_t)n_cx1.sw.h != (int16_t)n_cx2.sw.h && drawy >= (int32_t)n_drawarea_y1 && drawy <= (int32_t)n_drawarea_y2 ) { + int16_t n_x; + int32_t n_distance; + PAIR n_u; + PAIR n_v; + int32_t n_du; + int32_t n_dv; + if( (int16_t)n_cx1.sw.h < (int16_t)n_cx2.sw.h ) { n_x = n_cx1.sw.h; @@ -1691,6 +1622,7 @@ void psxgpu_device::FlatTexturedPolygon( int n_points ) TEXTUREFILL( FLATTEXTUREDPOLYGONUPDATE, n_u.w.h, n_v.w.h ); } + n_cx1.d += n_dx1; n_cu1.d += n_du1; n_cv1.d += n_dv1; @@ -1703,89 +1635,43 @@ void psxgpu_device::FlatTexturedPolygon( int n_points ) void psxgpu_device::GouraudPolygon( int n_points ) { - int16_t n_y; - int16_t n_x; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - - uint8_t n_cmd; - - PAIR n_r; - PAIR n_g; - PAIR n_b; - PAIR n_cx1; - PAIR n_cx2; - PAIR n_cr1; - PAIR n_cg1; - PAIR n_cb1; - PAIR n_cr2; - PAIR n_cg2; - PAIR n_cb2; - int32_t n_dr; - int32_t n_dg; - int32_t n_db; - int32_t n_dx1; - int32_t n_dx2; - int32_t n_dr1; - int32_t n_dg1; - int32_t n_db1; - int32_t n_dr2; - int32_t n_dg2; - int32_t n_db2; - - int32_t n_distance; - - uint16_t n_point; - uint16_t n_rightpoint; - uint16_t n_leftpoint; - const uint16_t *p_n_rightpointlist; - const uint16_t *p_n_leftpointlist; - - uint16_t *p_vram; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 3 ) { return; } - for( n_point = 0; n_point < n_points; n_point++ ) + for( int n_point = 0; n_point < n_points; n_point++ ) { DebugMesh( SINT11( COORD_X( m_packet.GouraudPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.GouraudPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_y ); } DebugMeshEnd(); #endif - n_cmd = BGR_C( m_packet.GouraudPolygon.vertex[ 0 ].n_bgr ); + uint8_t n_cmd = BGR_C( m_packet.GouraudPolygon.vertex[ 0 ].n_bgr ); - n_cx1.d = 0; - n_cr1.d = 0; - n_cg1.d = 0; - n_cb1.d = 0; - n_cx2.d = 0; - n_cr2.d = 0; - n_cg2.d = 0; - n_cb2.d = 0; + PAIR n_cx1; n_cx1.d = 0; + PAIR n_cr1; n_cr1.d = 0; + PAIR n_cg1; n_cg1.d = 0; + PAIR n_cb1; n_cb1.d = 0; + PAIR n_cx2; n_cx2.d = 0; + PAIR n_cr2; n_cr2.d = 0; + PAIR n_cg2; n_cg2.d = 0; + PAIR n_cb2; n_cb2.d = 0; SOLIDSETUP FINDTOPLEFT( GouraudPolygon ) - n_dx1 = 0; - n_dx2 = 0; - n_dr1 = 0; - n_dr2 = 0; - n_dg1 = 0; - n_dg2 = 0; - n_db1 = 0; - n_db2 = 0; + int32_t n_dx1 = 0; + int32_t n_dx2 = 0; + int32_t n_dr1 = 0; + int32_t n_dr2 = 0; + int32_t n_dg1 = 0; + int32_t n_dg2 = 0; + int32_t n_db1 = 0; + int32_t n_db2 = 0; - n_y = COORD_Y( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_coord ); + int16_t n_y = COORD_Y( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_coord ); for( ;; ) { @@ -1799,21 +1685,25 @@ void psxgpu_device::GouraudPolygon( int n_points ) break; } } + n_cx1.sw.h = COORD_X( m_packet.GouraudPolygon.vertex[ n_leftpoint ].n_coord ); n_cx1.sw.l = 0; n_cr1.w.h = BGR_R( m_packet.GouraudPolygon.vertex[ n_leftpoint ].n_bgr ); n_cr1.w.l = 0; n_cg1.w.h = BGR_G( m_packet.GouraudPolygon.vertex[ n_leftpoint ].n_bgr ); n_cg1.w.l = 0; n_cb1.w.h = BGR_B( m_packet.GouraudPolygon.vertex[ n_leftpoint ].n_bgr ); n_cb1.w.l = 0; n_leftpoint = p_n_leftpointlist[ n_leftpoint ]; - n_distance = COORD_Y( m_packet.GouraudPolygon.vertex[ n_leftpoint ].n_coord ) - n_y; + + int32_t n_distance = COORD_Y( m_packet.GouraudPolygon.vertex[ n_leftpoint ].n_coord ) - n_y; if( n_distance < 1 ) { break; } + n_dx1 = (int32_t)( ( COORD_X( m_packet.GouraudPolygon.vertex[ n_leftpoint ].n_coord ) << 16 ) - n_cx1.d ) / n_distance; n_dr1 = (int32_t)( ( BGR_R( m_packet.GouraudPolygon.vertex[ n_leftpoint ].n_bgr ) << 16 ) - n_cr1.d ) / n_distance; n_dg1 = (int32_t)( ( BGR_G( m_packet.GouraudPolygon.vertex[ n_leftpoint ].n_bgr ) << 16 ) - n_cg1.d ) / n_distance; n_db1 = (int32_t)( ( BGR_B( m_packet.GouraudPolygon.vertex[ n_leftpoint ].n_bgr ) << 16 ) - n_cb1.d ) / n_distance; } + if( n_y == COORD_Y( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_coord ) ) { while( n_y == COORD_Y( m_packet.GouraudPolygon.vertex[ p_n_rightpointlist[ n_rightpoint ] ].n_coord ) ) @@ -1824,16 +1714,19 @@ void psxgpu_device::GouraudPolygon( int n_points ) break; } } + n_cx2.sw.h = COORD_X( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_coord ); n_cx2.sw.l = 0; n_cr2.w.h = BGR_R( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_bgr ); n_cr2.w.l = 0; n_cg2.w.h = BGR_G( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_bgr ); n_cg2.w.l = 0; n_cb2.w.h = BGR_B( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_bgr ); n_cb2.w.l = 0; n_rightpoint = p_n_rightpointlist[ n_rightpoint ]; - n_distance = COORD_Y( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_coord ) - n_y; + + int32_t n_distance = COORD_Y( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_coord ) - n_y; if( n_distance < 1 ) { break; } + n_dx2 = (int32_t)( ( COORD_X( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_coord ) << 16 ) - n_cx2.d ) / n_distance; n_dr2 = (int32_t)( ( BGR_R( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_bgr ) << 16 ) - n_cr2.d ) / n_distance; n_dg2 = (int32_t)( ( BGR_G( m_packet.GouraudPolygon.vertex[ n_rightpoint ].n_bgr ) << 16 ) - n_cg2.d ) / n_distance; @@ -1844,6 +1737,15 @@ void psxgpu_device::GouraudPolygon( int n_points ) if( (int16_t)n_cx1.sw.h != (int16_t)n_cx2.sw.h && drawy >= (int32_t)n_drawarea_y1 && drawy <= (int32_t)n_drawarea_y2 ) { + int16_t n_x; + int32_t n_distance; + PAIR n_r; + PAIR n_g; + PAIR n_b; + int32_t n_dr; + int32_t n_dg; + int32_t n_db; + if( (int16_t)n_cx1.sw.h < (int16_t)n_cx2.sw.h ) { n_x = n_cx1.sw.h; @@ -1882,6 +1784,7 @@ void psxgpu_device::GouraudPolygon( int n_points ) SOLIDFILL( GOURAUDPOLYGONUPDATE ) } + n_cx1.d += n_dx1; n_cr1.d += n_dr1; n_cg1.d += n_dg1; @@ -1896,119 +1799,55 @@ void psxgpu_device::GouraudPolygon( int n_points ) void psxgpu_device::GouraudTexturedPolygon( int n_points ) { - int16_t n_y; - int16_t n_x; - int n_tx; - int n_ty; - - uint8_t n_cmd; - - uint32_t n_clutx; - uint32_t n_cluty; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - - PAIR n_r; - PAIR n_g; - PAIR n_b; - PAIR n_u; - PAIR n_v; - - PAIR n_cx1; - PAIR n_cx2; - PAIR n_cu1; - PAIR n_cv1; - PAIR n_cu2; - PAIR n_cv2; - PAIR n_cr1; - PAIR n_cg1; - PAIR n_cb1; - PAIR n_cr2; - PAIR n_cg2; - PAIR n_cb2; - int32_t n_dr; - int32_t n_dg; - int32_t n_db; - int32_t n_du; - int32_t n_dv; - int32_t n_dx1; - int32_t n_dx2; - int32_t n_dr1; - int32_t n_dg1; - int32_t n_db1; - int32_t n_dr2; - int32_t n_dg2; - int32_t n_db2; - int32_t n_du1; - int32_t n_dv1; - int32_t n_du2; - int32_t n_dv2; - - int32_t n_distance; - uint16_t n_point; - uint16_t n_rightpoint; - uint16_t n_leftpoint; - const uint16_t *p_n_rightpointlist; - const uint16_t *p_n_leftpointlist; - uint16_t *p_clut; - uint16_t *p_vram; - uint32_t n_bgr; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 4 ) { return; } - for( n_point = 0; n_point < n_points; n_point++ ) + for( int n_point = 0; n_point < n_points; n_point++ ) { DebugMesh( SINT11( COORD_X( m_packet.GouraudTexturedPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_y ); } DebugMeshEnd(); #endif - n_cmd = BGR_C( m_packet.GouraudTexturedPolygon.vertex[ 0 ].n_bgr ); + uint8_t n_cmd = BGR_C( m_packet.GouraudTexturedPolygon.vertex[ 0 ].n_bgr ); - n_clutx = ( m_packet.GouraudTexturedPolygon.vertex[ 0 ].n_texture.w.h & 0x3f ) << 4; - n_cluty = ( m_packet.GouraudTexturedPolygon.vertex[ 0 ].n_texture.w.h >> 6 ) & 0x3ff; + uint32_t n_clutx = ( m_packet.GouraudTexturedPolygon.vertex[ 0 ].n_texture.w.h & 0x3f ) << 4; + uint32_t n_cluty = ( m_packet.GouraudTexturedPolygon.vertex[ 0 ].n_texture.w.h >> 6 ) & 0x3ff; - n_cx1.d = 0; - n_cr1.d = 0; - n_cg1.d = 0; - n_cb1.d = 0; - n_cu1.d = 0; - n_cv1.d = 0; - n_cx2.d = 0; - n_cr2.d = 0; - n_cg2.d = 0; - n_cb2.d = 0; - n_cu2.d = 0; - n_cv2.d = 0; + PAIR n_cx1; n_cx1.d = 0; + PAIR n_cr1; n_cr1.d = 0; + PAIR n_cg1; n_cg1.d = 0; + PAIR n_cb1; n_cb1.d = 0; + PAIR n_cu1; n_cu1.d = 0; + PAIR n_cv1; n_cv1.d = 0; + PAIR n_cx2; n_cx2.d = 0; + PAIR n_cr2; n_cr2.d = 0; + PAIR n_cg2; n_cg2.d = 0; + PAIR n_cb2; n_cb2.d = 0; + PAIR n_cu2; n_cu2.d = 0; + PAIR n_cv2; n_cv2.d = 0; decode_tpage( m_packet.GouraudTexturedPolygon.vertex[ 1 ].n_texture.w.h ); TEXTURESETUP FINDTOPLEFT( GouraudTexturedPolygon ) - n_dx1 = 0; - n_dx2 = 0; - n_du1 = 0; - n_du2 = 0; - n_dr1 = 0; - n_dr2 = 0; - n_dg1 = 0; - n_dg2 = 0; - n_db1 = 0; - n_db2 = 0; - n_dv1 = 0; - n_dv2 = 0; - - n_y = COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_coord ); + int32_t n_dx1 = 0; + int32_t n_dx2 = 0; + int32_t n_du1 = 0; + int32_t n_du2 = 0; + int32_t n_dr1 = 0; + int32_t n_dr2 = 0; + int32_t n_dg1 = 0; + int32_t n_dg2 = 0; + int32_t n_db1 = 0; + int32_t n_db2 = 0; + int32_t n_dv1 = 0; + int32_t n_dv2 = 0; + + int16_t n_y = COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_coord ); for( ;; ) { @@ -2022,45 +1861,29 @@ void psxgpu_device::GouraudTexturedPolygon( int n_points ) break; } } + n_cx1.sw.h = COORD_X( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_coord ); n_cx1.sw.l = 0; - switch( n_cmd & 0x01 ) - { - case 0x00: - n_cr1.w.h = BGR_R( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ); n_cr1.w.l = 0; - n_cg1.w.h = BGR_G( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ); n_cg1.w.l = 0; - n_cb1.w.h = BGR_B( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ); n_cb1.w.l = 0; - break; - case 0x01: - n_cr1.w.h = 0x80; n_cr1.w.l = 0; - n_cg1.w.h = 0x80; n_cg1.w.l = 0; - n_cb1.w.h = 0x80; n_cb1.w.l = 0; - break; - } + n_cr1.w.h = n_cmd & 0x01 ? 0x80 : BGR_R( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ); n_cr1.w.l = 0; + n_cg1.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ); n_cg1.w.l = 0; + n_cb1.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ); n_cb1.w.l = 0; n_cu1.w.h = TEXTURE_U( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_texture ); n_cu1.w.l = 0; n_cv1.w.h = TEXTURE_V( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_texture ); n_cv1.w.l = 0; n_leftpoint = p_n_leftpointlist[ n_leftpoint ]; - n_distance = COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_coord ) - n_y; + + int32_t n_distance = COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_coord ) - n_y; if( n_distance < 1 ) { break; } + n_dx1 = (int32_t)( ( COORD_X( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_coord ) << 16 ) - n_cx1.d ) / n_distance; - switch( n_cmd & 0x01 ) - { - case 0x00: - n_dr1 = (int32_t)( ( BGR_R( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ) << 16 ) - n_cr1.d ) / n_distance; - n_dg1 = (int32_t)( ( BGR_G( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ) << 16 ) - n_cg1.d ) / n_distance; - n_db1 = (int32_t)( ( BGR_B( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ) << 16 ) - n_cb1.d ) / n_distance; - break; - case 0x01: - n_dr1 = 0; - n_dg1 = 0; - n_db1 = 0; - break; - } + n_dr1 = n_cmd & 0x01 ? 0 : (int32_t)( ( BGR_R( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ) << 16 ) - n_cr1.d ) / n_distance; + n_dg1 = n_cmd & 0x01 ? 0 : (int32_t)( ( BGR_G( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ) << 16 ) - n_cg1.d ) / n_distance; + n_db1 = n_cmd & 0x01 ? 0 : (int32_t)( ( BGR_B( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_bgr ) << 16 ) - n_cb1.d ) / n_distance; n_du1 = (int32_t)( ( TEXTURE_U( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_texture ) << 16 ) - n_cu1.d ) / n_distance; n_dv1 = (int32_t)( ( TEXTURE_V( m_packet.GouraudTexturedPolygon.vertex[ n_leftpoint ].n_texture ) << 16 ) - n_cv1.d ) / n_distance; } + if( n_y == COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_coord ) ) { while( n_y == COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ p_n_rightpointlist[ n_rightpoint ] ].n_coord ) ) @@ -2071,42 +1894,25 @@ void psxgpu_device::GouraudTexturedPolygon( int n_points ) break; } } + n_cx2.sw.h = COORD_X( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_coord ); n_cx2.sw.l = 0; - switch( n_cmd & 0x01 ) - { - case 0x00: - n_cr2.w.h = BGR_R( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ); n_cr2.w.l = 0; - n_cg2.w.h = BGR_G( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ); n_cg2.w.l = 0; - n_cb2.w.h = BGR_B( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ); n_cb2.w.l = 0; - break; - case 0x01: - n_cr2.w.h = 0x80; n_cr2.w.l = 0; - n_cg2.w.h = 0x80; n_cg2.w.l = 0; - n_cb2.w.h = 0x80; n_cb2.w.l = 0; - break; - } + n_cr2.w.h = n_cmd & 0x01 ? 0x80 : BGR_R( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ); n_cr2.w.l = 0; + n_cg2.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ); n_cg2.w.l = 0; + n_cb2.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ); n_cb2.w.l = 0; n_cu2.w.h = TEXTURE_U( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_texture ); n_cu2.w.l = 0; n_cv2.w.h = TEXTURE_V( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_texture ); n_cv2.w.l = 0; n_rightpoint = p_n_rightpointlist[ n_rightpoint ]; - n_distance = COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_coord ) - n_y; + + int32_t n_distance = COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_coord ) - n_y; if( n_distance < 1 ) { break; } + n_dx2 = (int32_t)( ( COORD_X( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_coord ) << 16 ) - n_cx2.d ) / n_distance; - switch( n_cmd & 0x01 ) - { - case 0x00: - n_dr2 = (int32_t)( ( BGR_R( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ) << 16 ) - n_cr2.d ) / n_distance; - n_dg2 = (int32_t)( ( BGR_G( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ) << 16 ) - n_cg2.d ) / n_distance; - n_db2 = (int32_t)( ( BGR_B( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ) << 16 ) - n_cb2.d ) / n_distance; - break; - case 0x01: - n_dr2 = 0; - n_dg2 = 0; - n_db2 = 0; - break; - } + n_dr2 = n_cmd & 0x01 ? 0 : (int32_t)( ( BGR_R( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ) << 16 ) - n_cr2.d ) / n_distance; + n_dg2 = n_cmd & 0x01 ? 0 : (int32_t)( ( BGR_G( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ) << 16 ) - n_cg2.d ) / n_distance; + n_db2 = n_cmd & 0x01 ? 0 : (int32_t)( ( BGR_B( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_bgr ) << 16 ) - n_cb2.d ) / n_distance; n_du2 = (int32_t)( ( TEXTURE_U( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_texture ) << 16 ) - n_cu2.d ) / n_distance; n_dv2 = (int32_t)( ( TEXTURE_V( m_packet.GouraudTexturedPolygon.vertex[ n_rightpoint ].n_texture ) << 16 ) - n_cv2.d ) / n_distance; } @@ -2115,6 +1921,19 @@ void psxgpu_device::GouraudTexturedPolygon( int n_points ) if( (int16_t)n_cx1.sw.h != (int16_t)n_cx2.sw.h && drawy >= (int32_t)n_drawarea_y1 && drawy <= (int32_t)n_drawarea_y2 ) { + int16_t n_x; + int32_t n_distance; + PAIR n_r; + PAIR n_g; + PAIR n_b; + PAIR n_u; + PAIR n_v; + int32_t n_dr; + int32_t n_dg; + int32_t n_db; + int32_t n_du; + int32_t n_dv; + if( (int16_t)n_cx1.sw.h < (int16_t)n_cx2.sw.h ) { n_x = n_cx1.sw.h; @@ -2163,6 +1982,7 @@ void psxgpu_device::GouraudTexturedPolygon( int n_points ) TEXTUREFILL( GOURAUDTEXTUREDPOLYGONUPDATE, n_u.w.h, n_v.w.h ); } + n_cx1.d += n_dx1; n_cr1.d += n_dr1; n_cg1.d += n_dg1; @@ -2181,22 +2001,6 @@ void psxgpu_device::GouraudTexturedPolygon( int n_points ) void psxgpu_device::MonochromeLine() { - PAIR n_x; - PAIR n_y; - int32_t n_dx; - int32_t n_dy; - int32_t n_len; - int32_t n_xlen; - int32_t n_ylen; - int32_t n_xstart; - int32_t n_ystart; - int32_t n_xend; - int32_t n_yend; - uint32_t n_r; - uint32_t n_g; - uint32_t n_b; - uint16_t *p_vram; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 5 ) { @@ -2207,15 +2011,19 @@ void psxgpu_device::MonochromeLine() DebugMeshEnd(); #endif - n_xstart = SINT11( COORD_X( m_packet.MonochromeLine.vertex[ 0 ].n_coord ) ); - n_xend = SINT11( COORD_X( m_packet.MonochromeLine.vertex[ 1 ].n_coord ) ); - n_ystart = SINT11( COORD_Y( m_packet.MonochromeLine.vertex[ 0 ].n_coord ) ); - n_yend = SINT11( COORD_Y( m_packet.MonochromeLine.vertex[ 1 ].n_coord ) ); + int32_t n_xstart = SINT11( COORD_X( m_packet.MonochromeLine.vertex[ 0 ].n_coord ) ); + int32_t n_xend = SINT11( COORD_X( m_packet.MonochromeLine.vertex[ 1 ].n_coord ) ); + int32_t n_ystart = SINT11( COORD_Y( m_packet.MonochromeLine.vertex[ 0 ].n_coord ) ); + int32_t n_yend = SINT11( COORD_Y( m_packet.MonochromeLine.vertex[ 1 ].n_coord ) ); + + uint8_t n_cmd = BGR_C( m_packet.MonochromeLine.n_bgr ); + uint8_t n_r = BGR_R( m_packet.MonochromeLine.n_bgr ); + uint8_t n_g = BGR_G( m_packet.MonochromeLine.n_bgr ); + uint8_t n_b = BGR_B( m_packet.MonochromeLine.n_bgr ); - n_r = BGR_R( m_packet.MonochromeLine.n_bgr ); - n_g = BGR_G( m_packet.MonochromeLine.n_bgr ); - n_b = BGR_B( m_packet.MonochromeLine.n_bgr ); + TRANSPARENCYSETUP + int32_t n_xlen; if( n_xend > n_xstart ) { n_xlen = n_xend - n_xstart; @@ -2225,6 +2033,7 @@ void psxgpu_device::MonochromeLine() n_xlen = n_xstart - n_xend; } + int32_t n_ylen; if( n_yend > n_ystart ) { n_ylen = n_yend - n_ystart; @@ -2234,6 +2043,7 @@ void psxgpu_device::MonochromeLine() n_ylen = n_ystart - n_yend; } + int32_t n_len; if( n_xlen > n_ylen ) { n_len = n_xlen; @@ -2248,11 +2058,11 @@ void psxgpu_device::MonochromeLine() n_len = 1; } - n_x.sw.h = n_xstart; n_x.sw.l = 0; - n_y.sw.h = n_ystart; n_y.sw.l = 0; + PAIR n_x; n_x.sw.h = n_xstart; n_x.sw.l = 0; + PAIR n_y; n_y.sw.h = n_ystart; n_y.sw.l = 0; - n_dx = (int32_t)( ( n_xend << 16 ) - n_x.d ) / n_len; - n_dy = (int32_t)( ( n_yend << 16 ) - n_y.d ) / n_len; + int32_t n_dx = (int32_t)( ( n_xend << 16 ) - n_x.d ) / n_len; + int32_t n_dy = (int32_t)( ( n_yend << 16 ) - n_y.d ) / n_len; while( n_len > 0 ) { @@ -2262,12 +2072,27 @@ void psxgpu_device::MonochromeLine() if( drawx >= (int32_t)n_drawarea_x1 && drawy >= (int32_t)n_drawarea_y1 && drawx <= (int32_t)n_drawarea_x2 && drawy <= (int32_t)n_drawarea_y2 ) { - p_vram = p_p_vram[ drawy ] + drawx; - WRITE_PIXEL( - p_n_redshade[ MID_LEVEL | n_r ] | - p_n_greenshade[ MID_LEVEL | n_g ] | - p_n_blueshade[ MID_LEVEL | n_b ] ); + uint16_t *p_vram = p_p_vram[ drawy ] + drawx; + + switch( n_cmd & 0x02 ) + { + case 0x00: + /* transparency off */ + WRITE_PIXEL( + p_n_redshade[ MID_LEVEL | n_r ] | + p_n_greenshade[ MID_LEVEL | n_g ] | + p_n_blueshade[ MID_LEVEL | n_b ] ) + break; + case 0x02: + /* transparency on */ + WRITE_PIXEL( + p_n_redtrans[ p_n_f[ MID_LEVEL | n_r ] | p_n_redb[ *( p_vram ) ] ] | + p_n_greentrans[ p_n_f[ MID_LEVEL | n_g ] | p_n_greenb[ *( p_vram ) ] ] | + p_n_bluetrans[ p_n_f[ MID_LEVEL | n_b ] | p_n_blueb[ *( p_vram ) ] ] ) + break; + } } + n_x.d += n_dx; n_y.d += n_dy; n_len--; @@ -2276,31 +2101,6 @@ void psxgpu_device::MonochromeLine() void psxgpu_device::GouraudLine() { - PAIR n_x; - PAIR n_y; - int32_t n_dx; - int32_t n_dy; - int32_t n_dr; - int32_t n_dg; - int32_t n_db; - int32_t n_distance; - int32_t n_xlen; - int32_t n_ylen; - int32_t n_xstart; - int32_t n_ystart; - int32_t n_xend; - int32_t n_yend; - PAIR n_r; - PAIR n_g; - PAIR n_b; - PAIR n_cr1; - PAIR n_cg1; - PAIR n_cb1; - PAIR n_cr2; - PAIR n_cg2; - PAIR n_cb2; - uint16_t *p_vram; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 6 ) { @@ -2311,24 +2111,30 @@ void psxgpu_device::GouraudLine() DebugMeshEnd(); #endif - n_xstart = SINT11( COORD_X( m_packet.GouraudLine.vertex[ 0 ].n_coord ) ); - n_ystart = SINT11( COORD_Y( m_packet.GouraudLine.vertex[ 0 ].n_coord ) ); - n_cr1.w.h = BGR_R( m_packet.GouraudLine.vertex[ 0 ].n_bgr ); n_cr1.w.l = 0; - n_cg1.w.h = BGR_G( m_packet.GouraudLine.vertex[ 0 ].n_bgr ); n_cg1.w.l = 0; - n_cb1.w.h = BGR_B( m_packet.GouraudLine.vertex[ 0 ].n_bgr ); n_cb1.w.l = 0; + uint8_t n_cmd = BGR_C( m_packet.GouraudLine.vertex[ 0 ].n_bgr ); - n_xend = SINT11( COORD_X( m_packet.GouraudLine.vertex[ 1 ].n_coord ) ); - n_yend = SINT11( COORD_Y( m_packet.GouraudLine.vertex[ 1 ].n_coord ) ); - n_cr2.w.h = BGR_R( m_packet.GouraudLine.vertex[ 1 ].n_bgr ); n_cr2.w.l = 0; - n_cg2.w.h = BGR_G( m_packet.GouraudLine.vertex[ 1 ].n_bgr ); n_cg2.w.l = 0; - n_cb2.w.h = BGR_B( m_packet.GouraudLine.vertex[ 1 ].n_bgr ); n_cb2.w.l = 0; + TRANSPARENCYSETUP - n_x.sw.h = n_xstart; n_x.sw.l = 0; - n_y.sw.h = n_ystart; n_y.sw.l = 0; - n_r.d = n_cr1.d; - n_g.d = n_cg1.d; - n_b.d = n_cb1.d; + int32_t n_xstart = SINT11( COORD_X( m_packet.GouraudLine.vertex[ 0 ].n_coord ) ); + int32_t n_ystart = SINT11( COORD_Y( m_packet.GouraudLine.vertex[ 0 ].n_coord ) ); + PAIR n_cr1; n_cr1.w.h = BGR_R( m_packet.GouraudLine.vertex[ 0 ].n_bgr ); n_cr1.w.l = 0; + PAIR n_cg1; n_cg1.w.h = BGR_G( m_packet.GouraudLine.vertex[ 0 ].n_bgr ); n_cg1.w.l = 0; + PAIR n_cb1; n_cb1.w.h = BGR_B( m_packet.GouraudLine.vertex[ 0 ].n_bgr ); n_cb1.w.l = 0; + int32_t n_xend = SINT11( COORD_X( m_packet.GouraudLine.vertex[ 1 ].n_coord ) ); + int32_t n_yend = SINT11( COORD_Y( m_packet.GouraudLine.vertex[ 1 ].n_coord ) ); + PAIR n_cr2; n_cr2.w.h = BGR_R( m_packet.GouraudLine.vertex[ 1 ].n_bgr ); n_cr2.w.l = 0; + PAIR n_cg2; n_cg2.w.h = BGR_G( m_packet.GouraudLine.vertex[ 1 ].n_bgr ); n_cg2.w.l = 0; + PAIR n_cb2; n_cb2.w.h = BGR_B( m_packet.GouraudLine.vertex[ 1 ].n_bgr ); n_cb2.w.l = 0; + + + PAIR n_x; n_x.sw.h = n_xstart; n_x.sw.l = 0; + PAIR n_y; n_y.sw.h = n_ystart; n_y.sw.l = 0; + PAIR n_r; n_r.d = n_cr1.d; + PAIR n_g; n_g.d = n_cg1.d; + PAIR n_b; n_b.d = n_cb1.d; + + int32_t n_xlen; if( n_xend > n_xstart ) { n_xlen = n_xend - n_xstart; @@ -2338,6 +2144,7 @@ void psxgpu_device::GouraudLine() n_xlen = n_xstart - n_xend; } + int32_t n_ylen; if( n_yend > n_ystart ) { n_ylen = n_yend - n_ystart; @@ -2347,6 +2154,7 @@ void psxgpu_device::GouraudLine() n_ylen = n_ystart - n_yend; } + int32_t n_distance; if( n_xlen > n_ylen ) { n_distance = n_xlen; @@ -2361,11 +2169,11 @@ void psxgpu_device::GouraudLine() n_distance = 1; } - n_dx = (int32_t)( ( n_xend << 16 ) - n_x.sd ) / n_distance; - n_dy = (int32_t)( ( n_yend << 16 ) - n_y.sd ) / n_distance; - n_dr = (int32_t)( n_cr2.d - n_cr1.d ) / n_distance; - n_dg = (int32_t)( n_cg2.d - n_cg1.d ) / n_distance; - n_db = (int32_t)( n_cb2.d - n_cb1.d ) / n_distance; + int32_t n_dx = (int32_t)( ( n_xend << 16 ) - n_x.sd ) / n_distance; + int32_t n_dy = (int32_t)( ( n_yend << 16 ) - n_y.sd ) / n_distance; + int32_t n_dr = (int32_t)( n_cr2.d - n_cr1.d ) / n_distance; + int32_t n_dg = (int32_t)( n_cg2.d - n_cg1.d ) / n_distance; + int32_t n_db = (int32_t)( n_cb2.d - n_cb1.d ) / n_distance; while( n_distance > 0 ) { @@ -2375,12 +2183,27 @@ void psxgpu_device::GouraudLine() if( drawx >= (int32_t)n_drawarea_x1 && drawy >= (int32_t)n_drawarea_y1 && drawx <= (int32_t)n_drawarea_x2 && drawy <= (int32_t)n_drawarea_y2 ) { - p_vram = p_p_vram[ drawy ] + drawx; - WRITE_PIXEL( - p_n_redshade[ MID_LEVEL | n_r.w.h ] | - p_n_greenshade[ MID_LEVEL | n_g.w.h ] | - p_n_blueshade[ MID_LEVEL | n_b.w.h ] ); + uint16_t *p_vram = p_p_vram[ drawy ] + drawx; + + switch( n_cmd & 0x02 ) + { + case 0x00: + /* transparency off */ + WRITE_PIXEL( + p_n_redshade[ MID_LEVEL | n_r.w.h ] | + p_n_greenshade[ MID_LEVEL | n_g.w.h ] | + p_n_blueshade[ MID_LEVEL | n_b.w.h ] ) + break; + case 0x02: + /* transparency on */ + WRITE_PIXEL( + p_n_redtrans[ p_n_f[ MID_LEVEL | n_r.w.h ] | p_n_redb[ *( p_vram ) ] ] | + p_n_greentrans[ p_n_f[ MID_LEVEL | n_g.w.h ] | p_n_greenb[ *( p_vram ) ] ] | + p_n_bluetrans[ p_n_f[ MID_LEVEL | n_b.w.h ] | p_n_blueb[ *( p_vram ) ] ] ) + break; + } } + n_x.sd += n_dx; n_y.sd += n_dy; n_r.d += n_dr; @@ -2392,15 +2215,6 @@ void psxgpu_device::GouraudLine() void psxgpu_device::FrameBufferRectangleDraw() { - PAIR n_r; - PAIR n_g; - PAIR n_b; - int32_t n_distance; - int32_t n_h; - int16_t n_y; - int16_t n_x; - uint16_t *p_vram; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 7 ) { @@ -2413,28 +2227,28 @@ void psxgpu_device::FrameBufferRectangleDraw() DebugMeshEnd(); #endif - n_r.w.h = BGR_R( m_packet.FlatRectangle.n_bgr ); n_r.w.l = 0; - n_g.w.h = BGR_G( m_packet.FlatRectangle.n_bgr ); n_g.w.l = 0; - n_b.w.h = BGR_B( m_packet.FlatRectangle.n_bgr ); n_b.w.l = 0; + PAIR n_r; n_r.w.h = BGR_R( m_packet.FlatRectangle.n_bgr ); n_r.w.l = 0; + PAIR n_g; n_g.w.h = BGR_G( m_packet.FlatRectangle.n_bgr ); n_g.w.l = 0; + PAIR n_b; n_b.w.h = BGR_B( m_packet.FlatRectangle.n_bgr ); n_b.w.l = 0; - n_y = COORD_Y( m_packet.FlatRectangle.n_coord ); - n_h = SIZE_H( m_packet.FlatRectangle.n_size ); + int16_t n_y = COORD_Y( m_packet.FlatRectangle.n_coord ); + int32_t n_h = SIZE_H( m_packet.FlatRectangle.n_size ); while( n_h > 0 ) { - n_x = COORD_X( m_packet.FlatRectangle.n_coord ); + int16_t n_x = COORD_X( m_packet.FlatRectangle.n_coord ); + int32_t n_distance = SIZE_W( m_packet.FlatRectangle.n_size ); - n_distance = SIZE_W( m_packet.FlatRectangle.n_size ); while( n_distance > 0 ) { - p_vram = p_p_vram[ n_y & 1023 ] + ( n_x & 1023 ); - WRITE_PIXEL( + p_p_vram[ n_y & 1023 ][ n_x & 1023 ] = p_n_redshade[ MID_LEVEL | n_r.w.h ] | p_n_greenshade[ MID_LEVEL | n_g.w.h ] | - p_n_blueshade[ MID_LEVEL | n_b.w.h ] ); + p_n_blueshade[ MID_LEVEL | n_b.w.h ]; n_x++; n_distance--; } + n_y++; n_h--; } @@ -2442,27 +2256,6 @@ void psxgpu_device::FrameBufferRectangleDraw() void psxgpu_device::FlatRectangle() { - int16_t n_y; - int16_t n_x; - - uint8_t n_cmd; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - - PAIR n_r; - PAIR n_g; - PAIR n_b; - - int32_t n_distance; - int32_t n_h; - uint16_t *p_vram; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 8 ) { @@ -2475,22 +2268,21 @@ void psxgpu_device::FlatRectangle() DebugMeshEnd(); #endif - n_cmd = BGR_C( m_packet.FlatRectangle.n_bgr ); + uint8_t n_cmd = BGR_C( m_packet.FlatRectangle.n_bgr ); SOLIDSETUP - n_r.w.h = BGR_R( m_packet.FlatRectangle.n_bgr ); n_r.w.l = 0; - n_g.w.h = BGR_G( m_packet.FlatRectangle.n_bgr ); n_g.w.l = 0; - n_b.w.h = BGR_B( m_packet.FlatRectangle.n_bgr ); n_b.w.l = 0; + PAIR n_r; n_r.w.h = BGR_R( m_packet.FlatRectangle.n_bgr ); n_r.w.l = 0; + PAIR n_g; n_g.w.h = BGR_G( m_packet.FlatRectangle.n_bgr ); n_g.w.l = 0; + PAIR n_b; n_b.w.h = BGR_B( m_packet.FlatRectangle.n_bgr ); n_b.w.l = 0; - n_x = SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ); - n_y = SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ); - n_h = SIZE_H( m_packet.FlatRectangle.n_size ); + int16_t n_x = SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ); + int16_t n_y = SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ); + int32_t n_h = SIZE_H( m_packet.FlatRectangle.n_size ); while( n_h > 0 ) { - n_distance = SIZE_W( m_packet.FlatRectangle.n_size ); - + int32_t n_distance = SIZE_W( m_packet.FlatRectangle.n_size ); int drawy = n_y + n_drawoffset_y; if( n_distance > 0 && drawy >= (int32_t)n_drawarea_y1 && drawy <= (int32_t)n_drawarea_y2 ) @@ -2505,6 +2297,7 @@ void psxgpu_device::FlatRectangle() SOLIDFILL( FLATRECTANGEUPDATE ) } + n_y++; n_h--; } @@ -2512,27 +2305,6 @@ void psxgpu_device::FlatRectangle() void psxgpu_device::FlatRectangle8x8() { - int16_t n_y; - int16_t n_x; - - uint8_t n_cmd; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - - PAIR n_r; - PAIR n_g; - PAIR n_b; - - int32_t n_distance; - int32_t n_h; - uint16_t *p_vram; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 9 ) { @@ -2545,22 +2317,21 @@ void psxgpu_device::FlatRectangle8x8() DebugMeshEnd(); #endif - n_cmd = BGR_C( m_packet.FlatRectangle8x8.n_bgr ); + uint8_t n_cmd = BGR_C( m_packet.FlatRectangle8x8.n_bgr ); SOLIDSETUP - n_r.w.h = BGR_R( m_packet.FlatRectangle8x8.n_bgr ); n_r.w.l = 0; - n_g.w.h = BGR_G( m_packet.FlatRectangle8x8.n_bgr ); n_g.w.l = 0; - n_b.w.h = BGR_B( m_packet.FlatRectangle8x8.n_bgr ); n_b.w.l = 0; + PAIR n_r; n_r.w.h = BGR_R( m_packet.FlatRectangle8x8.n_bgr ); n_r.w.l = 0; + PAIR n_g; n_g.w.h = BGR_G( m_packet.FlatRectangle8x8.n_bgr ); n_g.w.l = 0; + PAIR n_b; n_b.w.h = BGR_B( m_packet.FlatRectangle8x8.n_bgr ); n_b.w.l = 0; - n_x = SINT11( COORD_X( m_packet.FlatRectangle8x8.n_coord ) ); - n_y = SINT11( COORD_Y( m_packet.FlatRectangle8x8.n_coord ) ); - n_h = 8; + int16_t n_x = SINT11( COORD_X( m_packet.FlatRectangle8x8.n_coord ) ); + int16_t n_y = SINT11( COORD_Y( m_packet.FlatRectangle8x8.n_coord ) ); + int32_t n_h = 8; while( n_h > 0 ) { - n_distance = 8; - + int32_t n_distance = 8; int drawy = n_y + n_drawoffset_y; if( n_distance > 0 && drawy >= (int32_t)n_drawarea_y1 && drawy <= (int32_t)n_drawarea_y2 ) @@ -2575,6 +2346,7 @@ void psxgpu_device::FlatRectangle8x8() SOLIDFILL( FLATRECTANGEUPDATE ) } + n_y++; n_h--; } @@ -2582,27 +2354,6 @@ void psxgpu_device::FlatRectangle8x8() void psxgpu_device::FlatRectangle16x16() { - int16_t n_y; - int16_t n_x; - - uint8_t n_cmd; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - - PAIR n_r; - PAIR n_g; - PAIR n_b; - - int32_t n_distance; - int32_t n_h; - uint16_t *p_vram; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 10 ) { @@ -2615,22 +2366,21 @@ void psxgpu_device::FlatRectangle16x16() DebugMeshEnd(); #endif - n_cmd = BGR_C( m_packet.FlatRectangle16x16.n_bgr ); + uint8_t n_cmd = BGR_C( m_packet.FlatRectangle16x16.n_bgr ); SOLIDSETUP - n_r.w.h = BGR_R( m_packet.FlatRectangle16x16.n_bgr ); n_r.w.l = 0; - n_g.w.h = BGR_G( m_packet.FlatRectangle16x16.n_bgr ); n_g.w.l = 0; - n_b.w.h = BGR_B( m_packet.FlatRectangle16x16.n_bgr ); n_b.w.l = 0; + PAIR n_r; n_r.w.h = BGR_R( m_packet.FlatRectangle16x16.n_bgr ); n_r.w.l = 0; + PAIR n_g; n_g.w.h = BGR_G( m_packet.FlatRectangle16x16.n_bgr ); n_g.w.l = 0; + PAIR n_b; n_b.w.h = BGR_B( m_packet.FlatRectangle16x16.n_bgr ); n_b.w.l = 0; - n_x = SINT11( COORD_X( m_packet.FlatRectangle16x16.n_coord ) ); - n_y = SINT11( COORD_Y( m_packet.FlatRectangle16x16.n_coord ) ); - n_h = 16; + int16_t n_x = SINT11( COORD_X( m_packet.FlatRectangle16x16.n_coord ) ); + int16_t n_y = SINT11( COORD_Y( m_packet.FlatRectangle16x16.n_coord ) ); + int32_t n_h = 16; while( n_h > 0 ) { - n_distance = 16; - + int32_t n_distance = 16; int drawy = n_y + n_drawoffset_y; if( n_distance > 0 && n_y >= (int32_t)n_drawarea_y1 && n_y <= (int32_t)n_drawarea_y2 ) @@ -2645,6 +2395,7 @@ void psxgpu_device::FlatRectangle16x16() SOLIDFILL( FLATRECTANGEUPDATE ) } + n_y++; n_h--; } @@ -2652,38 +2403,6 @@ void psxgpu_device::FlatRectangle16x16() void psxgpu_device::FlatTexturedRectangle() { - int16_t n_y; - int16_t n_x; - int n_tx; - int n_ty; - - uint8_t n_cmd; - - uint32_t n_clutx; - uint32_t n_cluty; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - - PAIR n_r; - PAIR n_g; - PAIR n_b; - uint8_t n_u; - uint8_t n_v; - int n_du; - int n_dv; - - int16_t n_distance; - uint32_t n_h; - uint16_t *p_vram; - uint16_t *p_clut; - uint16_t n_bgr; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 11 ) { @@ -2696,42 +2415,27 @@ void psxgpu_device::FlatTexturedRectangle() DebugMeshEnd(); #endif - n_cmd = BGR_C( m_packet.FlatTexturedRectangle.n_bgr ); + uint8_t n_cmd = BGR_C( m_packet.FlatTexturedRectangle.n_bgr ); - n_clutx = ( m_packet.FlatTexturedRectangle.n_texture.w.h & 0x3f ) << 4; - n_cluty = ( m_packet.FlatTexturedRectangle.n_texture.w.h >> 6 ) & 0x3ff; - - n_r.d = 0; - n_g.d = 0; - n_b.d = 0; + uint32_t n_clutx = ( m_packet.FlatTexturedRectangle.n_texture.w.h & 0x3f ) << 4; + uint32_t n_cluty = ( m_packet.FlatTexturedRectangle.n_texture.w.h >> 6 ) & 0x3ff; TEXTURESETUP SPRITESETUP - switch( n_cmd & 0x01 ) - { - case 0: - n_r.w.h = BGR_R( m_packet.FlatTexturedRectangle.n_bgr ); n_r.w.l = 0; - n_g.w.h = BGR_G( m_packet.FlatTexturedRectangle.n_bgr ); n_g.w.l = 0; - n_b.w.h = BGR_B( m_packet.FlatTexturedRectangle.n_bgr ); n_b.w.l = 0; - break; - case 1: - n_r.w.h = 0x80; n_r.w.l = 0; - n_g.w.h = 0x80; n_g.w.l = 0; - n_b.w.h = 0x80; n_b.w.l = 0; - break; - } + PAIR n_r; n_r.w.h = n_cmd & 0x01 ? 0x80 : BGR_R( m_packet.FlatTexturedRectangle.n_bgr ); n_r.w.l = 0; + PAIR n_g; n_g.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.FlatTexturedRectangle.n_bgr ); n_g.w.l = 0; + PAIR n_b; n_b.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.FlatTexturedRectangle.n_bgr ); n_b.w.l = 0; - n_x = SINT11( COORD_X( m_packet.FlatTexturedRectangle.n_coord ) ); - n_y = SINT11( COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) ); - n_v = TEXTURE_V( m_packet.FlatTexturedRectangle.n_texture ); - n_h = SIZE_H( m_packet.FlatTexturedRectangle.n_size ); + int16_t n_x = SINT11( COORD_X( m_packet.FlatTexturedRectangle.n_coord ) ); + int16_t n_y = SINT11( COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) ); + uint8_t n_v = TEXTURE_V( m_packet.FlatTexturedRectangle.n_texture ); + uint32_t n_h = SIZE_H( m_packet.FlatTexturedRectangle.n_size ); while( n_h > 0 ) { - n_u = TEXTURE_U( m_packet.FlatTexturedRectangle.n_texture ); - n_distance = SIZE_W( m_packet.FlatTexturedRectangle.n_size ); - + uint8_t n_u = TEXTURE_U( m_packet.FlatTexturedRectangle.n_texture ); + int16_t n_distance = SIZE_W( m_packet.FlatTexturedRectangle.n_size ); int drawy = n_y + n_drawoffset_y; if( n_distance > 0 && drawy >= (int32_t)n_drawarea_y1 && drawy <= (int32_t)n_drawarea_y2 ) @@ -2747,6 +2451,7 @@ void psxgpu_device::FlatTexturedRectangle() TEXTUREFILL( FLATTEXTUREDRECTANGLEUPDATE, n_u, n_v ); } + n_v += n_dv; n_y++; n_h--; @@ -2755,38 +2460,6 @@ void psxgpu_device::FlatTexturedRectangle() void psxgpu_device::Sprite8x8() { - int16_t n_y; - int16_t n_x; - int n_tx; - int n_ty; - - uint8_t n_cmd; - - uint32_t n_clutx; - uint32_t n_cluty; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - - PAIR n_r; - PAIR n_g; - PAIR n_b; - uint8_t n_u; - uint8_t n_v; - int n_du; - int n_dv; - - int16_t n_distance; - uint32_t n_h; - uint16_t *p_vram; - uint16_t *p_clut; - uint16_t n_bgr; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 12 ) { @@ -2799,41 +2472,27 @@ void psxgpu_device::Sprite8x8() DebugMeshEnd(); #endif - n_cmd = BGR_C( m_packet.Sprite8x8.n_bgr ); - - n_clutx = ( m_packet.Sprite8x8.n_texture.w.h & 0x3f ) << 4; - n_cluty = ( m_packet.Sprite8x8.n_texture.w.h >> 6 ) & 0x3ff; + uint8_t n_cmd = BGR_C( m_packet.Sprite8x8.n_bgr ); - n_r.d = 0; - n_g.d = 0; - n_b.d = 0; + uint32_t n_clutx = ( m_packet.Sprite8x8.n_texture.w.h & 0x3f ) << 4; + uint32_t n_cluty = ( m_packet.Sprite8x8.n_texture.w.h >> 6 ) & 0x3ff; TEXTURESETUP SPRITESETUP - switch( n_cmd & 0x01 ) - { - case 0: - n_r.w.h = BGR_R( m_packet.Sprite8x8.n_bgr ); n_r.w.l = 0; - n_g.w.h = BGR_G( m_packet.Sprite8x8.n_bgr ); n_g.w.l = 0; - n_b.w.h = BGR_B( m_packet.Sprite8x8.n_bgr ); n_b.w.l = 0; - break; - case 1: - n_r.w.h = 0x80; n_r.w.l = 0; - n_g.w.h = 0x80; n_g.w.l = 0; - n_b.w.h = 0x80; n_b.w.l = 0; - break; - } + PAIR n_r; n_r.w.h = n_cmd & 0x01 ? 0x80 : BGR_R( m_packet.Sprite8x8.n_bgr ); n_r.w.l = 0; + PAIR n_g; n_g.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.Sprite8x8.n_bgr ); n_g.w.l = 0; + PAIR n_b; n_b.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.Sprite8x8.n_bgr ); n_b.w.l = 0; - n_x = SINT11( COORD_X( m_packet.Sprite8x8.n_coord ) ); - n_y = SINT11( COORD_Y( m_packet.Sprite8x8.n_coord ) ); - n_v = TEXTURE_V( m_packet.Sprite8x8.n_texture ); - n_h = 8; + int16_t n_x = SINT11( COORD_X( m_packet.Sprite8x8.n_coord ) ); + int16_t n_y = SINT11( COORD_Y( m_packet.Sprite8x8.n_coord ) ); + uint8_t n_v = TEXTURE_V( m_packet.Sprite8x8.n_texture ); + uint32_t n_h = 8; while( n_h > 0 ) { - n_u = TEXTURE_U( m_packet.Sprite8x8.n_texture ); - n_distance = 8; + uint8_t n_u = TEXTURE_U( m_packet.Sprite8x8.n_texture ); + int16_t n_distance = 8; int drawy = n_y + n_drawoffset_y; @@ -2850,6 +2509,7 @@ void psxgpu_device::Sprite8x8() TEXTUREFILL( FLATTEXTUREDRECTANGLEUPDATE, n_u, n_v ); } + n_v += n_dv; n_y++; n_h--; @@ -2858,38 +2518,6 @@ void psxgpu_device::Sprite8x8() void psxgpu_device::Sprite16x16() { - int16_t n_y; - int16_t n_x; - int n_tx; - int n_ty; - - uint8_t n_cmd; - - uint32_t n_clutx; - uint32_t n_cluty; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - - PAIR n_r; - PAIR n_g; - PAIR n_b; - uint8_t n_u; - uint8_t n_v; - int n_du; - int n_dv; - - int16_t n_distance; - uint32_t n_h; - uint16_t *p_vram; - uint16_t *p_clut; - uint16_t n_bgr; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 13 ) { @@ -2902,41 +2530,27 @@ void psxgpu_device::Sprite16x16() DebugMeshEnd(); #endif - n_cmd = BGR_C( m_packet.Sprite16x16.n_bgr ); + uint8_t n_cmd = BGR_C( m_packet.Sprite16x16.n_bgr ); - n_clutx = ( m_packet.Sprite16x16.n_texture.w.h & 0x3f ) << 4; - n_cluty = ( m_packet.Sprite16x16.n_texture.w.h >> 6 ) & 0x3ff; - - n_r.d = 0; - n_g.d = 0; - n_b.d = 0; + uint32_t n_clutx = ( m_packet.Sprite16x16.n_texture.w.h & 0x3f ) << 4; + uint32_t n_cluty = ( m_packet.Sprite16x16.n_texture.w.h >> 6 ) & 0x3ff; TEXTURESETUP SPRITESETUP - switch( n_cmd & 0x01 ) - { - case 0: - n_r.w.h = BGR_R( m_packet.Sprite16x16.n_bgr ); n_r.w.l = 0; - n_g.w.h = BGR_G( m_packet.Sprite16x16.n_bgr ); n_g.w.l = 0; - n_b.w.h = BGR_B( m_packet.Sprite16x16.n_bgr ); n_b.w.l = 0; - break; - case 1: - n_r.w.h = 0x80; n_r.w.l = 0; - n_g.w.h = 0x80; n_g.w.l = 0; - n_b.w.h = 0x80; n_b.w.l = 0; - break; - } + PAIR n_r; n_r.w.h = n_cmd & 0x01 ? 0x80 : BGR_R( m_packet.Sprite16x16.n_bgr ); n_r.w.l = 0; + PAIR n_g; n_g.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.Sprite16x16.n_bgr ); n_g.w.l = 0; + PAIR n_b; n_b.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.Sprite16x16.n_bgr ); n_b.w.l = 0; - n_x = SINT11( COORD_X( m_packet.Sprite16x16.n_coord ) ); - n_y = SINT11( COORD_Y( m_packet.Sprite16x16.n_coord ) ); - n_v = TEXTURE_V( m_packet.Sprite16x16.n_texture ); - n_h = 16; + int16_t n_x = SINT11( COORD_X( m_packet.Sprite16x16.n_coord ) ); + int16_t n_y = SINT11( COORD_Y( m_packet.Sprite16x16.n_coord ) ); + uint8_t n_v = TEXTURE_V( m_packet.Sprite16x16.n_texture ); + uint32_t n_h = 16; while( n_h > 0 ) { - n_u = TEXTURE_U( m_packet.Sprite16x16.n_texture ); - n_distance = 16; + uint8_t n_u = TEXTURE_U( m_packet.Sprite16x16.n_texture ); + int16_t n_distance = 16; int drawy = n_y + n_drawoffset_y; @@ -2953,6 +2567,7 @@ void psxgpu_device::Sprite16x16() TEXTUREFILL( FLATTEXTUREDRECTANGLEUPDATE, n_u, n_v ); } + n_v += n_dv; n_y++; n_h--; @@ -2961,13 +2576,6 @@ void psxgpu_device::Sprite16x16() void psxgpu_device::Dot() { - int32_t n_x; - int32_t n_y; - uint32_t n_r; - uint32_t n_g; - uint32_t n_b; - uint16_t *p_vram; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 14 ) { @@ -2977,11 +2585,14 @@ void psxgpu_device::Dot() DebugMeshEnd(); #endif - n_r = BGR_R( m_packet.Dot.n_bgr ); - n_g = BGR_G( m_packet.Dot.n_bgr ); - n_b = BGR_B( m_packet.Dot.n_bgr ); - n_x = SINT11( COORD_X( m_packet.Dot.vertex.n_coord ) ); - n_y = SINT11( COORD_Y( m_packet.Dot.vertex.n_coord ) ); + uint8_t n_cmd = BGR_C( m_packet.Dot.n_bgr ); + uint8_t n_r = BGR_R( m_packet.Dot.n_bgr ); + uint8_t n_g = BGR_G( m_packet.Dot.n_bgr ); + uint8_t n_b = BGR_B( m_packet.Dot.n_bgr ); + int32_t n_x = SINT11( COORD_X( m_packet.Dot.vertex.n_coord ) ); + int32_t n_y = SINT11( COORD_Y( m_packet.Dot.vertex.n_coord ) ); + + TRANSPARENCYSETUP int drawx = n_x + n_drawoffset_x; int drawy = n_y + n_drawoffset_y; @@ -2989,11 +2600,25 @@ void psxgpu_device::Dot() if( drawx >= (int32_t)n_drawarea_x1 && drawy >= (int32_t)n_drawarea_y1 && drawx <= (int32_t)n_drawarea_x2 && drawy <= (int32_t)n_drawarea_y2 ) { - p_vram = p_p_vram[ drawy ] + drawx; - WRITE_PIXEL( - p_n_redshade[ MID_LEVEL | n_r ] | - p_n_greenshade[ MID_LEVEL | n_g ] | - p_n_blueshade[ MID_LEVEL | n_b ] ); + uint16_t *p_vram = p_p_vram[ drawy ] + drawx; + + switch( n_cmd & 0x02 ) + { + case 0x00: + /* transparency off */ + WRITE_PIXEL( + p_n_redshade[ MID_LEVEL | n_r ] | + p_n_greenshade[ MID_LEVEL | n_g ] | + p_n_blueshade[ MID_LEVEL | n_b ] ) + break; + case 0x02: + /* transparency on */ + WRITE_PIXEL( + p_n_redtrans[ p_n_f[ MID_LEVEL | n_r ] | p_n_redb[ *( p_vram ) ] ] | + p_n_greentrans[ p_n_f[ MID_LEVEL | n_g ] | p_n_greenb[ *( p_vram ) ] ] | + p_n_bluetrans[ p_n_f[ MID_LEVEL | n_b ] | p_n_blueb[ *( p_vram ) ] ] ) + break; + } } } @@ -3004,73 +2629,39 @@ void psxgpu_device::TexturedDot() { return; } - DebugMesh(SINT11(COORD_X(m_packet.TexturedDot.vertex.n_coord)) + n_drawoffset_x, SINT11(COORD_Y(m_packet.TexturedDot.vertex.n_coord)) + n_drawoffset_y); + DebugMesh( SINT11( COORD_X( m_packet.TexturedDot.vertex.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.TexturedDot.vertex.n_coord ) ) + n_drawoffset_y ); DebugMeshEnd(); #endif - uint8_t n_cmd = BGR_C(m_packet.TexturedDot.n_bgr); + uint8_t n_cmd = BGR_C( m_packet.TexturedDot.n_bgr ); - PAIR n_r; - PAIR n_g; - PAIR n_b; + PAIR n_r; n_r.w.h = n_cmd & 0x01 ? 0x80 : BGR_R( m_packet.TexturedDot.n_bgr ); n_r.w.l = 0; + PAIR n_g; n_g.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.TexturedDot.n_bgr ); n_g.w.l = 0; + PAIR n_b; n_b.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.TexturedDot.n_bgr ); n_b.w.l = 0; - switch (n_cmd & 0x01) - { - case 0: - n_r.w.h = BGR_R(m_packet.TexturedDot.n_bgr); n_r.w.l = 0; - n_g.w.h = BGR_G(m_packet.TexturedDot.n_bgr); n_g.w.l = 0; - n_b.w.h = BGR_B(m_packet.TexturedDot.n_bgr); n_b.w.l = 0; - break; - case 1: - n_r.w.h = 0x80; n_r.w.l = 0; - n_g.w.h = 0x80; n_g.w.l = 0; - n_b.w.h = 0x80; n_b.w.l = 0; - break; - } - - int32_t n_x = SINT11(COORD_X(m_packet.TexturedDot.vertex.n_coord)); - int32_t n_y = SINT11(COORD_Y(m_packet.TexturedDot.vertex.n_coord)); - uint8_t n_u = TEXTURE_U(m_packet.TexturedDot.vertex.n_texture); - uint8_t n_v = TEXTURE_V(m_packet.TexturedDot.vertex.n_texture); - uint32_t n_clutx = (m_packet.TexturedDot.vertex.n_texture.w.h & 0x3f) << 4; - uint32_t n_cluty = (m_packet.TexturedDot.vertex.n_texture.w.h >> 6) & 0x3ff; - - uint16_t *p_n_f; - uint16_t *p_n_redb; - uint16_t *p_n_greenb; - uint16_t *p_n_blueb; - uint16_t *p_n_redtrans; - uint16_t *p_n_greentrans; - uint16_t *p_n_bluetrans; - int n_tx; - int n_ty; - uint32_t n_bgr; - uint16_t *p_clut; - int32_t n_distance = 1; + int32_t n_x = SINT11( COORD_X( m_packet.TexturedDot.vertex.n_coord ) ); + int32_t n_y = SINT11( COORD_Y( m_packet.TexturedDot.vertex.n_coord ) ); + uint8_t n_u = TEXTURE_U(m_packet.TexturedDot.vertex.n_texture ); + uint8_t n_v = TEXTURE_V(m_packet.TexturedDot.vertex.n_texture ); + uint32_t n_clutx = ( m_packet.TexturedDot.vertex.n_texture.w.h & 0x3f ) << 4; + uint32_t n_cluty = ( m_packet.TexturedDot.vertex.n_texture.w.h >> 6 ) & 0x3ff; TEXTURESETUP + int32_t n_distance = 1; + int drawx = n_x + n_drawoffset_x; int drawy = n_y + n_drawoffset_y; - if (drawx >= (int32_t)n_drawarea_x1 && drawy >= (int32_t)n_drawarea_y1 && - drawx <= (int32_t)n_drawarea_x2 && drawy <= (int32_t)n_drawarea_y2) + if( drawx >= (int32_t)n_drawarea_x1 && drawy >= (int32_t)n_drawarea_y1 && + drawx <= (int32_t)n_drawarea_x2 && drawy <= (int32_t)n_drawarea_y2 ) { - uint16_t *p_vram = p_p_vram[drawy] + drawx; - TEXTUREFILL({}, n_u, n_v); + TEXTUREFILL( {}, n_u, n_v ); } } void psxgpu_device::MoveImage() { - int16_t n_w; - int16_t n_h; - int16_t n_srcx; - int16_t n_srcy; - int16_t n_dsty; - int16_t n_dstx; - uint16_t *p_vram; - #if PSXGPU_DEBUG_VIEWER if( m_debug.n_skip == 16 ) { @@ -3083,23 +2674,25 @@ void psxgpu_device::MoveImage() DebugMeshEnd(); #endif - n_srcy = COORD_Y( m_packet.MoveImage.vertex[ 0 ].n_coord ); - n_dsty = COORD_Y( m_packet.MoveImage.vertex[ 1 ].n_coord ); - n_h = SIZE_H( m_packet.MoveImage.n_size ); + int16_t n_srcy = COORD_Y( m_packet.MoveImage.vertex[ 0 ].n_coord ); + int16_t n_dsty = COORD_Y( m_packet.MoveImage.vertex[ 1 ].n_coord ); + int16_t n_h = SIZE_H( m_packet.MoveImage.n_size ); while( n_h > 0 ) { - n_srcx = COORD_X( m_packet.MoveImage.vertex[ 0 ].n_coord ); - n_dstx = COORD_X( m_packet.MoveImage.vertex[ 1 ].n_coord ); - n_w = SIZE_W( m_packet.MoveImage.n_size ); + int16_t n_srcx = COORD_X( m_packet.MoveImage.vertex[ 0 ].n_coord ); + int16_t n_dstx = COORD_X( m_packet.MoveImage.vertex[ 1 ].n_coord ); + int16_t n_w = SIZE_W( m_packet.MoveImage.n_size ); + while( n_w > 0 ) { - p_vram = p_p_vram[ n_dsty & 1023 ] + ( n_dstx & 1023 ); - WRITE_PIXEL( *( p_p_vram[ n_srcy & 1023 ] + ( n_srcx & 1023 ) ) ); + uint16_t *p_vram = p_p_vram[ n_dsty & 1023 ] + ( n_dstx & 1023 ); + WRITE_PIXEL( *( p_p_vram[ n_srcy & 1023 ] + ( n_srcx & 1023 ) ) ) n_srcx++; n_dstx++; n_w--; } + n_srcy++; n_dsty++; n_h--; @@ -3407,9 +3000,9 @@ void psxgpu_device::gpu_write( uint32_t *p_ram, int32_t n_size ) else { verboselog(*this, 1, "%02x: textured dot %d,%d %08x\n", - m_packet.n_entry[0] >> 24, - (int16_t)(m_packet.n_entry[1] & 0xffff), (int16_t)(m_packet.n_entry[1] >> 16), - m_packet.n_entry[0] & 0xffffff); + m_packet.n_entry[ 0 ] >> 24, + (int16_t)( m_packet.n_entry[ 1 ] & 0xffff ), (int16_t)( m_packet.n_entry[ 1 ] >> 16 ), + m_packet.n_entry[ 0 ] & 0xffffff ); TexturedDot(); n_gpu_buffer_offset = 0; } @@ -3499,18 +3092,15 @@ void psxgpu_device::gpu_write( uint32_t *p_ram, int32_t n_size ) } else { - uint32_t n_pixel; - for( n_pixel = 0; n_pixel < 2; n_pixel++ ) + for( int n_pixel = 0; n_pixel < 2; n_pixel++ ) { - uint16_t *p_vram; - verboselog( *this, 2, "send image to framebuffer ( pixel %u,%u = %u )\n", ( n_vramx + m_packet.n_entry[ 1 ] ) & 1023, ( n_vramy + ( m_packet.n_entry[ 1 ] >> 16 ) ) & 1023, data & 0xffff ); - p_vram = p_p_vram[ ( n_vramy + ( m_packet.n_entry[ 1 ] >> 16 ) ) & 1023 ] + ( ( n_vramx + m_packet.n_entry[ 1 ] ) & 1023 ); - WRITE_PIXEL( data & 0xffff ); + uint16_t *p_vram = p_p_vram[ ( n_vramy + ( m_packet.n_entry[ 1 ] >> 16 ) ) & 1023 ] + ( ( n_vramx + m_packet.n_entry[ 1 ] ) & 1023 ); + WRITE_PIXEL( data & 0xffff ) n_vramx++; if( n_vramx >= ( m_packet.n_entry[ 2 ] & 0xffff ) ) { @@ -3775,12 +3365,11 @@ void psxgpu_device::gpu_read( uint32_t *p_ram, int32_t n_size ) { if( ( n_gpustatus & ( 1L << 0x1b ) ) != 0 ) { - uint32_t n_pixel; PAIR data; verboselog( *this, 2, "copy image from frame buffer ( %d, %d )\n", n_vramx, n_vramy ); data.d = 0; - for( n_pixel = 0; n_pixel < 2; n_pixel++ ) + for( int n_pixel = 0; n_pixel < 2; n_pixel++ ) { data.w.l = data.w.h; data.w.h = *( p_p_vram[ ( n_vramy + ( m_packet.n_entry[ 1 ] >> 16 ) ) & 0x3ff ] + ( ( n_vramx + ( m_packet.n_entry[ 1 ] & 0xffff ) ) & 0x3ff ) ); @@ -3884,15 +3473,24 @@ void psxgpu_device::lightgun_set( int n_x, int n_y ) } //------------------------------------------------- -// device_add_mconfig - add device configuration +// device_config_complete - perform any +// operations now that the configuration is +// complete //------------------------------------------------- -MACHINE_CONFIG_START(psxgpu_device::device_add_mconfig) - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE( 60 ) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_SIZE( 1024, 1024 ) - MCFG_SCREEN_VISIBLE_AREA( 0, 639, 0, 479 ) - MCFG_SCREEN_UPDATE_DEVICE( DEVICE_SELF, psxgpu_device, update_screen ) - ((screen_device *)device)->register_vblank_callback(vblank_state_delegate(&psxgpu_device::vblank, this)); -MACHINE_CONFIG_END +void psxgpu_device::device_config_complete() +{ + if (!has_screen()) + return; + + if (!screen().refresh_attoseconds()) + { + screen().set_refresh_hz(60); + screen().set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); + screen().set_size(1024, 1024); + screen().set_visarea(0, 639, 0, 479); + } + + if (!screen().has_screen_update()) + screen().set_screen_update(screen_update_rgb32_delegate(FUNC(psxgpu_device::update_screen), this)); +} diff --git a/src/devices/video/psx.h b/src/devices/video/psx.h index 09c591563fb..6fdbcc80633 100644 --- a/src/devices/video/psx.h +++ b/src/devices/video/psx.h @@ -38,9 +38,6 @@ MCFG_PSX_DMA_CHANNEL_READ( cputag, 2, psxdma_device::write_delegate(&psxgpu_device::dma_read, (psxgpu_device *) device ) ) \ MCFG_PSX_DMA_CHANNEL_WRITE( cputag, 2, psxdma_device::read_delegate(&psxgpu_device::dma_write, (psxgpu_device *) device ) ) -#define MCFG_PSXGPU_VBLANK_CALLBACK( _delegate ) \ - ((screen_device *) config.device_find( device, "screen" ))->register_vblank_callback( _delegate ); - DECLARE_DEVICE_TYPE(CXD8514Q, cxd8514q_device) DECLARE_DEVICE_TYPE(CXD8538Q, cxd8538q_device) DECLARE_DEVICE_TYPE(CXD8561Q, cxd8561q_device) @@ -53,6 +50,7 @@ class psxgpu_device : public device_t, public device_video_interface, public dev public: // configuration helpers template <class Object> devcb_base &set_vblank_handler(Object &&cb) { return m_vblank_handler.set_callback(std::forward<Object>(cb)); } + auto vblank_callback() { return m_vblank_handler.bind(); } void set_vram_size(int size) { vramSize = size; } DECLARE_WRITE32_MEMBER( write ); @@ -73,8 +71,9 @@ protected: psxgpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual void device_start() override; + virtual void device_post_load() override; virtual void device_reset() override; - virtual void device_add_mconfig(machine_config &config) override; + virtual void device_config_complete() override; // device_palette_interface overrides virtual uint32_t palette_entries() const override { return 32*32*32*2; } diff --git a/src/devices/video/scn2674.h b/src/devices/video/scn2674.h index 0d75ef883ff..b594f0dcb52 100644 --- a/src/devices/video/scn2674.h +++ b/src/devices/video/scn2674.h @@ -6,27 +6,8 @@ #pragma once -#define MCFG_SCN2672_INTR_CALLBACK(_intr) \ - downcast<scn2672_device &>(*device).set_intr_callback(DEVCB_##_intr); - -#define MCFG_SCN2672_CHARACTER_WIDTH(_value) \ - downcast<scn2672_device &>(*device).set_character_width(_value); - -#define MCFG_SCN2672_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \ - downcast<scn2672_device &>(*device).set_display_callback(scn2672_device::draw_character_delegate(&_class::_method, #_class "::" #_method, this)); - #define SCN2672_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int x, int y, uint8_t linecount, uint8_t charcode, uint8_t attrcode, uint16_t address, bool cursor, bool dw, bool lg, bool ul, bool blink) - -#define MCFG_SCN2674_INTR_CALLBACK(_intr) \ - downcast<scn2674_device &>(*device).set_intr_callback(DEVCB_##_intr); - -#define MCFG_SCN2674_CHARACTER_WIDTH(_value) \ - downcast<scn2674_device &>(*device).set_character_width(_value); - -#define MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \ - downcast<scn2674_device &>(*device).set_display_callback(scn2674_device::draw_character_delegate(&_class::_method, #_class "::" #_method, this)); - #define SCN2674_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int x, int y, uint8_t linecount, uint8_t charcode, uint8_t attrcode, uint16_t address, bool cursor, bool dw, bool lg, bool ul, bool blink) @@ -40,9 +21,22 @@ public: typedef device_delegate<void (bitmap_rgb32 &bitmap, int x, int y, uint8_t linecount, uint8_t charcode, uint8_t attrcode, uint16_t address, bool cursor, bool dw, bool lg, bool ul, bool blink)> draw_character_delegate; // static configuration - template <class Object> devcb_base &set_intr_callback(Object &&cb) { return m_intr_cb.set_callback(std::forward<Object>(cb)); } + auto intr_callback() { return m_intr_cb.bind(); } void set_character_width(int value) { m_hpixels_per_column = value; } - template <typename Object> void set_display_callback(Object &&cb) { m_display_cb = std::forward<Object>(cb); } + template <class FunctionClass> + void set_display_callback(void (FunctionClass::*callback)(bitmap_rgb32 &, int, int, uint8_t, uint8_t, uint8_t, uint16_t, bool, bool, bool, bool, bool), const char *name) + { + set_display_callback(draw_character_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr))); + } + template <class FunctionClass> + void set_display_callback(const char *devname, void (FunctionClass::*callback)(bitmap_rgb32 &, int, int, uint8_t, uint8_t, uint8_t, uint16_t, bool, bool, bool, bool, bool), const char *name) + { + set_display_callback(draw_character_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr))); + } + void set_display_callback(draw_character_delegate callback) + { + m_display_cb = callback; + } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); diff --git a/src/devices/video/sed1330.h b/src/devices/video/sed1330.h index f9cc1d5d120..d29f24a721f 100644 --- a/src/devices/video/sed1330.h +++ b/src/devices/video/sed1330.h @@ -15,17 +15,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_SED1330_ADD(_tag, _clock, _screen_tag, _map) \ - MCFG_DEVICE_ADD(_tag, SED1330, _clock) \ - MCFG_DEVICE_ADDRESS_MAP(0, _map) \ - MCFG_VIDEO_SET_SCREEN(_screen_tag) - - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** diff --git a/src/devices/video/tms9927.cpp b/src/devices/video/tms9927.cpp index 0ea7d7c89aa..70b4ecd6983 100644 --- a/src/devices/video/tms9927.cpp +++ b/src/devices/video/tms9927.cpp @@ -91,9 +91,7 @@ void tms9927_device::device_start() m_vsync_timer = timer_alloc(TIMER_VSYNC); m_hsync_timer = timer_alloc(TIMER_HSYNC); - /* register for state saving */ - machine().save().register_postload(save_prepost_delegate(FUNC(tms9927_device::state_postload), this)); - + // register for state saving save_item(NAME(m_reg)); save_item(NAME(m_start_datarow)); save_item(NAME(m_reset)); @@ -181,7 +179,7 @@ void tms9927_device::device_timer(emu_timer &timer, device_timer_id id, int para } } -void tms9927_device::state_postload() +void tms9927_device::device_post_load() { recompute_parameters(true); } diff --git a/src/devices/video/tms9927.h b/src/devices/video/tms9927.h index e373ae89ffe..2e00344c1e7 100644 --- a/src/devices/video/tms9927.h +++ b/src/devices/video/tms9927.h @@ -10,30 +10,13 @@ #define MAME_VIDEO_TMS9927_H -#define MCFG_TMS9927_VSYN_CALLBACK(_write) \ - downcast<tms9927_device &>(*device).set_vsyn_wr_callback(DEVCB_##_write); - -#define MCFG_TMS9927_HSYN_CALLBACK(_write) \ - downcast<tms9927_device &>(*device).set_hsyn_wr_callback(DEVCB_##_write); - -#define MCFG_TMS9927_CHAR_WIDTH(_pixels) \ - downcast<tms9927_device &>(*device).set_char_width(_pixels); - -#define MCFG_TMS9927_REGION(_tag) \ - downcast<tms9927_device &>(*device).set_region_tag(_tag); - -#define MCFG_TMS9927_OVERSCAN(_left, _right, _top, _bottom) \ - downcast<tms9927_device &>(*device).set_overscan(_left, _right, _top, _bottom); - class tms9927_device : public device_t, public device_video_interface { public: tms9927_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_vsyn_wr_callback(Object &&cb) { return m_write_vsyn.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_hsyn_wr_callback(Object &&cb) { return m_write_hsyn.set_callback(std::forward<Object>(cb)); } - auto vsyn_wr_callback() { return m_write_vsyn.bind(); } - auto hsyn_wr_callback() { return m_write_hsyn.bind(); } + auto vsyn_callback() { return m_write_vsyn.bind(); } + auto hsyn_callback() { return m_write_hsyn.bind(); } void set_char_width(int pixels) { m_hpixels_per_column = pixels; } void set_region_tag(const char *tag) { m_selfload.set_tag(tag); } @@ -62,6 +45,7 @@ protected: virtual void device_reset() override; virtual void device_clock_changed() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + virtual void device_post_load() override; private: enum @@ -70,7 +54,6 @@ private: TIMER_HSYNC }; - void state_postload(); void recompute_parameters(bool postload); void generic_access(address_space &space, offs_t offset); diff --git a/src/devices/video/v9938.cpp b/src/devices/video/v9938.cpp index 5b628aa5817..a77ce812446 100644 --- a/src/devices/video/v9938.cpp +++ b/src/devices/video/v9938.cpp @@ -108,6 +108,7 @@ v99x8_device::v99x8_device(const machine_config &mconfig, device_type type, cons device_video_interface(mconfig, *this), m_space_config("vram", ENDIANNESS_BIG, 8, 18), m_model(model), + m_pal_config(false), m_offset_x(0), m_offset_y(0), m_visible_y(0), @@ -153,6 +154,25 @@ device_memory_interface::space_config_vector v99x8_device::memory_space_config() } +void v99x8_device::device_config_complete() +{ + if (!has_screen()) + return; + + if (!screen().refresh_attoseconds()) + screen().set_raw(clock(), + HTOTAL, + 0, + HVISIBLE - 1, + (m_pal_config ? VTOTAL_PAL : VTOTAL_NTSC) * 2, + VERTICAL_ADJUST * 2, + (m_pal_config ? VVISIBLE_PAL : VVISIBLE_NTSC) * 2 - 1 - VERTICAL_ADJUST * 2); + + if (!screen().has_screen_update()) + screen().set_screen_update(screen_update_rgb32_delegate(FUNC(v99x8_device::screen_update), this)); +} + + void v99x8_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { int scanline = (m_scanline - (m_scanline_start + m_offset_y)); diff --git a/src/devices/video/v9938.h b/src/devices/video/v9938.h index cdf07dced31..0e1a3640cb9 100644 --- a/src/devices/video/v9938.h +++ b/src/devices/video/v9938.h @@ -15,45 +15,6 @@ //************************************************************************** -// DEVICE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_V9938_ADD(_tag, _screen, _vramsize, _clock) \ - MCFG_DEVICE_ADD(_tag, V9938, _clock) \ - MCFG_VIDEO_SET_SCREEN(_screen) \ - downcast<v99x8_device &>(*device).set_vram_size(_vramsize); -#define MCFG_V9958_ADD(_tag, _screen, _vramsize, _clock) \ - MCFG_DEVICE_ADD(_tag, V9958, _clock) \ - MCFG_VIDEO_SET_SCREEN(_screen) \ - downcast<v99x8_device &>(*device).set_vram_size(_vramsize); - -#define MCFG_V99X8_SCREEN_ADD_NTSC(_screen_tag, _v9938_tag, _clock) \ - MCFG_SCREEN_ADD(_screen_tag, RASTER) \ - MCFG_SCREEN_RAW_PARAMS(_clock, \ - v99x8_device::HTOTAL, \ - 0, \ - v99x8_device::HVISIBLE - 1, \ - v99x8_device::VTOTAL_NTSC * 2, \ - v99x8_device::VERTICAL_ADJUST * 2, \ - v99x8_device::VVISIBLE_NTSC * 2 - 1 - v99x8_device::VERTICAL_ADJUST * 2) \ - MCFG_SCREEN_UPDATE_DEVICE(_v9938_tag, v9938_device, screen_update) - -#define MCFG_V99X8_SCREEN_ADD_PAL(_screen_tag, _v9938_tag, _clock) \ - MCFG_SCREEN_ADD(_screen_tag, RASTER) \ - MCFG_SCREEN_RAW_PARAMS(_clock, \ - v99x8_device::HTOTAL, \ - 0, \ - v99x8_device::HVISIBLE - 1, \ - v99x8_device::VTOTAL_PAL * 2, \ - v99x8_device::VERTICAL_ADJUST * 2, \ - v99x8_device::VVISIBLE_PAL * 2 - 1 - v99x8_device::VERTICAL_ADJUST * 2) \ - MCFG_SCREEN_UPDATE_DEVICE(_v9938_tag, v9938_device, screen_update) - -#define MCFG_V99X8_INTERRUPT_CALLBACK(_irq) \ - downcast<v99x8_device *>(device)->set_interrupt_callback(DEVCB_##_irq); - - -//************************************************************************** // GLOBAL VARIABLES //************************************************************************** @@ -75,6 +36,18 @@ class v99x8_device : public device_t, public device_video_interface { public: + auto int_cb() { return m_int_callback.bind(); } + template <class T> void set_screen_ntsc(T &&screen) + { + set_screen(std::forward<T>(screen)); + m_pal_config = false; + } + template <class T> void set_screen_pal(T &&screen) + { + set_screen(std::forward<T>(screen)); + m_pal_config = true; + } + template <class Object> devcb_base &set_interrupt_callback(Object &&irq) { return m_int_callback.set_callback(std::forward<Object>(irq)); } bitmap_rgb32 &get_bitmap() { return m_bitmap; } void update_mouse_state(int mx_delta, int my_delta, int button_state); @@ -84,8 +57,6 @@ public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); - auto int_cb() { return m_int_callback.bind(); } - uint8_t vram_r(); uint8_t status_r(); void palette_w(uint8_t data); @@ -122,7 +93,10 @@ protected: const int m_model; + bool m_pal_config; + // device overrides + virtual void device_config_complete() override; virtual void device_start() override; virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp index 3112636b12e..85f064dcddf 100644 --- a/src/emu/xtal.cpp +++ b/src/emu/xtal.cpp @@ -223,6 +223,7 @@ const double XTAL::known_xtals[] = { 17'064'000, /* 17.064_MHz_XTAL Memorex 1377 */ 17'360'000, /* 17.36_MHz_XTAL OMTI Series 10 SCSI controller */ 17'550'000, /* 17.55_MHz_XTAL HP 264x display clock (50 Hz configuration) */ + 17'600'000, /* 17.6_MHz_XTAL LSI Octopus */ 17'734'470, /* 17.73447_MHz_XTAL (~4x PAL subcarrier) */ 17'734'472, /* 17.734472_MHz_XTAL actually ~4x PAL subcarrier */ 17'971'200, /* 17.9712_MHz_XTAL - */ @@ -251,6 +252,7 @@ const double XTAL::known_xtals[] = { 21'300'000, /* 21.3_MHz_XTAL - */ 21'477'272, /* 21.477272_MHz_XTAL BMC bowling, some Data East 90's games, Vtech Socrates; (6x NTSC subcarrier) */ 22'000'000, /* 22_MHz_XTAL - */ + 22'032'000, /* 22.032_MHz_XTAL Intellec Series II I/O controller */ 22'096'000, /* 22.096_MHz_XTAL ADDS Viewpoint 122 */ 22'118'400, /* 22.1184_MHz_XTAL Amusco Poker */ 22'321'000, /* 22.321_MHz_XTAL Apple LaserWriter II NT */ diff --git a/src/lib/util/chdcd.cpp b/src/lib/util/chdcd.cpp index 63a94ed7d4b..85bd7cdad27 100644 --- a/src/lib/util/chdcd.cpp +++ b/src/lib/util/chdcd.cpp @@ -1173,7 +1173,7 @@ chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i return chdcd_parse_nero(tocfname, outtoc, outinfo); } - if (strstr(tocftemp,".iso") || strstr(tocftemp,".cdr")) + if (strstr(tocftemp,".iso") || strstr(tocftemp,".cdr") || strstr(tocftemp,".toast")) { return chdcd_parse_iso(tocfname, outtoc, outinfo); } diff --git a/src/mame/arcade.flt b/src/mame/arcade.flt index db3a9391ba4..58a964ff8eb 100644 --- a/src/mame/arcade.flt +++ b/src/mame/arcade.flt @@ -1315,6 +1315,7 @@ vendetta.cpp vertigo.cpp vicdual.cpp victory.cpp +videolich.cpp videopin.cpp videopkr.cpp videosaa.cpp diff --git a/src/mame/audio/atarijsa.cpp b/src/mame/audio/atarijsa.cpp index d40cf12332f..aa93f8ef1ee 100644 --- a/src/mame/audio/atarijsa.cpp +++ b/src/mame/audio/atarijsa.cpp @@ -460,6 +460,8 @@ WRITE8_MEMBER( atari_jsa_oki_base_device::mix_w ) if (m_oki2_banklo != nullptr) m_oki2_banklo->set_entry((data >> 6) & 3); + // TODO: emulate the low pass filter! + // update the (left) OKI bank (JSA III/IIIs only) if (m_oki1_banklo != nullptr) m_oki1_banklo->set_entry((m_oki1_banklo->entry() & 1) | ((data >> 3) & 2)); @@ -662,7 +664,7 @@ WRITE8_MEMBER( atari_jsa_i_device::mix_w ) WRITE8_MEMBER( atari_jsa_i_device::tms5220_voice ) { if (m_tms5220 != nullptr) - m_tms5220->data_w(space, 0, data); + m_tms5220->data_w(data); } diff --git a/src/mame/audio/exidy.cpp b/src/mame/audio/exidy.cpp index 15979c4532b..bbd4f283fa3 100644 --- a/src/mame/audio/exidy.cpp +++ b/src/mame/audio/exidy.cpp @@ -397,7 +397,7 @@ WRITE8_MEMBER(exidy_sh8253_sound_device::r6532_porta_w) if (m_tms.found()) { logerror("(%f)%s:TMS5220 data write = %02X\n", machine().time().as_double(), machine().describe_context(), m_riot->porta_out_get()); - m_tms->data_w(space, 0, data); + m_tms->data_w(data); } } @@ -405,8 +405,8 @@ READ8_MEMBER(exidy_sh8253_sound_device::r6532_porta_r) { if (m_tms.found()) { - logerror("(%f)%s:TMS5220 status read = %02X\n", machine().time().as_double(), machine().describe_context(), m_tms->status_r(space, 0)); - return m_tms->status_r(space, 0); + logerror("(%f)%s:TMS5220 status read = %02X\n", machine().time().as_double(), machine().describe_context(), m_tms->status_r()); + return m_tms->status_r(); } else return 0xff; diff --git a/src/mame/audio/midway.cpp b/src/mame/audio/midway.cpp index 11ab65620e8..b12adc67b59 100644 --- a/src/mame/audio/midway.cpp +++ b/src/mame/audio/midway.cpp @@ -879,7 +879,7 @@ WRITE8_MEMBER(midway_squawk_n_talk_device::portb2_w) // write strobe -- pass the current command to the TMS5200 if (((data ^ m_tms_strobes) & 0x02) && !(data & 0x02)) { - m_tms5200->data_w(space, offset, m_tms_command); + m_tms5200->data_w(m_tms_command); // DoT expects the ready line to transition on a command/write here, so we oblige m_pia1->ca2_w(1); @@ -889,7 +889,7 @@ WRITE8_MEMBER(midway_squawk_n_talk_device::portb2_w) // read strobe -- read the current status from the TMS5200 else if (((data ^ m_tms_strobes) & 0x01) && !(data & 0x01)) { - m_pia1->write_porta(m_tms5200->status_r(space, offset)); + m_pia1->write_porta(m_tms5200->status_r()); // DoT expects the ready line to transition on a command/write here, so we oblige m_pia1->ca2_w(1); diff --git a/src/mame/drivers/accomm.cpp b/src/mame/drivers/accomm.cpp index e8463a342c9..c38b093bfc2 100644 --- a/src/mame/drivers/accomm.cpp +++ b/src/mame/drivers/accomm.cpp @@ -70,8 +70,6 @@ private: DECLARE_WRITE8_MEMBER(ram_w); DECLARE_READ8_MEMBER(sheila_r); DECLARE_WRITE8_MEMBER(sheila_w); - DECLARE_WRITE_LINE_MEMBER(write_acia_clock); - DECLARE_WRITE_LINE_MEMBER(econet_clk_w); DECLARE_PALETTE_INIT(accomm); INTERRUPT_GEN_MEMBER(vbl_int); @@ -220,6 +218,7 @@ void accomm_state::video_start() WRITE8_MEMBER(accomm_state::ch00switch_w) { + logerror("ch00switch_w: offset %04x, data %02x\n", offset, data); if (!machine().side_effects_disabled()) m_ch00rom_enabled = false; } @@ -439,7 +438,7 @@ READ8_MEMBER(accomm_state::ram_r) if (m_ch00rom_enabled && (offset < 0x10000)) { - data = memregion("maincpu")->base()[0x30000 + offset]; + data = memregion("maincpu")->base()[offset]; } else { @@ -621,42 +620,30 @@ void accomm_state::interrupt_handler(int mode, int interrupt) } } -WRITE_LINE_MEMBER(accomm_state::write_acia_clock) -{ - m_acia->write_txc(state); - m_acia->write_rxc(state); -} - -WRITE_LINE_MEMBER(accomm_state::econet_clk_w) -{ - m_adlc->rxc_w(state); - m_adlc->txc_w(state); -} - void accomm_state::main_map(address_map &map) { - map(0x000000, 0x1fffff).rw(FUNC(accomm_state::ram_r), FUNC(accomm_state::ram_w)); /* System RAM */ - map(0x200000, 0x3fffff).noprw(); /* External expansion RAM */ - map(0x400000, 0x400000).noprw(); /* MODEM */ - map(0x410000, 0x410000).ram(); /* Econet ID */ - map(0x420000, 0x42000f).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write)); /* 6522 VIA (printer etc) */ - map(0x430000, 0x430001).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); /* 2641 ACIA (RS423) */ - map(0x440000, 0x440000).w(FUNC(accomm_state::ch00switch_w)); /* CH00SWITCH */ - map(0x450000, 0x457fff).ram().share("vram"); /* Video RAM */ - map(0x458000, 0x459fff).r(FUNC(accomm_state::read_keyboard1)); /* Video ULA */ - map(0x45a000, 0x45bfff).r(FUNC(accomm_state::read_keyboard2)); /* Video ULA */ - map(0x45fe00, 0x45feff).rw(FUNC(accomm_state::sheila_r), FUNC(accomm_state::sheila_w)); /* Video ULA */ - map(0x460000, 0x467fff).ram().share("nvram"); /* CMOS RAM */ - map(0x470000, 0x47001f).rw(m_adlc, FUNC(mc6854_device::read), FUNC(mc6854_device::write)); /* 68B54 (Econet) */ - map(0x480000, 0x7fffff).noprw(); /* Reserved */ - map(0x800000, 0xbfffff).noprw(); /* External expansion IO */ - map(0xc00000, 0xf7ffff).noprw(); /* External expansion ROM */ - map(0xf80000, 0xf9ffff).noprw(); /* Empty */ - map(0xfa0000, 0xfbffff).noprw(); /* ROM bank 4 */ - map(0xfc0000, 0xfcffff).rom().region("maincpu", 0x000000); /* ROM bank 3 */ - map(0xfd0000, 0xfdffff).rom().region("maincpu", 0x010000); /* ROM bank 2 */ - map(0xfe0000, 0xfeffff).rom().region("maincpu", 0x020000); /* ROM bank 0 */ - map(0xff0000, 0xffffff).rom().region("maincpu", 0x030000); /* ROM bank 1 */ + map(0x000000, 0x1fffff).rw(FUNC(accomm_state::ram_r), FUNC(accomm_state::ram_w)); /* System RAM */ + map(0x200000, 0x3fffff).noprw(); /* External expansion RAM */ + map(0x400000, 0x400000).noprw(); /* MODEM */ + map(0x410000, 0x410000).ram(); /* Econet ID */ + map(0x420000, 0x42000f).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write)); /* 6522 VIA (printer etc) */ + map(0x430000, 0x430001).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); /* 2641 ACIA (RS423) */ + map(0x440000, 0x44ffff).w(FUNC(accomm_state::ch00switch_w)); /* CH00SWITCH */ + map(0x450000, 0x457fff).ram().share("vram"); /* Video RAM */ + map(0x458000, 0x459fff).r(FUNC(accomm_state::read_keyboard1)); /* Video ULA */ + map(0x45a000, 0x45bfff).r(FUNC(accomm_state::read_keyboard2)); /* Video ULA */ + map(0x45fe00, 0x45feff).rw(FUNC(accomm_state::sheila_r), FUNC(accomm_state::sheila_w)); /* Video ULA */ + map(0x460000, 0x467fff).ram().share("nvram"); /* CMOS RAM */ + map(0x470000, 0x47001f).rw(m_adlc, FUNC(mc6854_device::read), FUNC(mc6854_device::write)); /* 68B54 (Econet) */ + map(0x480000, 0x7fffff).noprw(); /* Reserved */ + map(0x800000, 0xbfffff).noprw(); /* External expansion IO */ + map(0xc00000, 0xf7ffff).rom().region("ext", 0); /* External expansion ROM */ + map(0xf80000, 0xf9ffff).rom().region("maincpu", 0x060000); /* Empty (ROM Slot 3) */ + map(0xfa0000, 0xfbffff).rom().region("maincpu", 0x040000); /* ROM bank 4 (ROM Slot 2) */ + map(0xfc0000, 0xfcffff).rom().region("maincpu", 0x030000); /* ROM bank 3 (ROM Slot 1) */ + map(0xfd0000, 0xfdffff).rom().region("maincpu", 0x020000); /* ROM bank 2 (ROM Slot 1) */ + map(0xfe0000, 0xfeffff).rom().region("maincpu", 0x000000); /* ROM bank 0 (ROM Slot 0) */ + map(0xff0000, 0xffffff).rom().region("maincpu", 0x010000); /* ROM bank 1 (ROM Slot 0) */ } static INPUT_PORTS_START( accomm ) @@ -829,21 +816,22 @@ static INPUT_PORTS_START( accomm ) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) INPUT_PORTS_END -MACHINE_CONFIG_START(accomm_state::accomm) +void accomm_state::accomm(machine_config &config) +{ G65816(config, m_maincpu, 16_MHz_XTAL / 8); m_maincpu->set_addrmap(AS_PROGRAM, &accomm_state::main_map); m_maincpu->set_vblank_int("screen", FUNC(accomm_state::vbl_int)); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE( 50.08 ) - MCFG_SCREEN_SIZE( 640, 312 ) - MCFG_SCREEN_VISIBLE_AREA( 0, 640-1, 0, 256-1 ) - MCFG_SCREEN_UPDATE_DRIVER(accomm_state, screen_update) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE) - MCFG_SCREEN_PALETTE("palette") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(50.08); + screen.set_size(640, 312); + screen.set_visarea(0, 640 - 1, 0, 256 - 1); + screen.set_screen_update(FUNC(accomm_state::screen_update)); + screen.set_video_attributes(VIDEO_UPDATE_SCANLINE); + screen.set_palette("palette"); - MCFG_PALETTE_ADD( "palette", 16 ) - MCFG_PALETTE_INIT_OWNER(accomm_state, accomm) + palette_device &palette(PALETTE(config, "palette", 16)); + palette.set_init(palette_init_delegate(FUNC(accomm_state::palette_init_accomm), this)); config.set_default_layout(layout_accomm); @@ -854,13 +842,12 @@ MACHINE_CONFIG_START(accomm_state::accomm) /* sound */ SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("beeper", BEEP, 300) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) + BEEP(config, m_beeper, 300).add_route(ALL_OUTPUTS, "mono", 1.00); /* rtc pcf8573 */ /* via */ - VIA6522(config, m_via, XTAL(16'000'000) / 16); + VIA6522(config, m_via, 16_MHz_XTAL / 16); m_via->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); m_via->ca2_handler().set("centronics", FUNC(centronics_device::write_strobe)); @@ -870,39 +857,122 @@ MACHINE_CONFIG_START(accomm_state::accomm) m_acia->rts_handler().set("serial", FUNC(rs232_port_device::write_rts)); m_acia->irq_handler().set_inputline("maincpu", G65816_LINE_IRQ); - MCFG_DEVICE_ADD("serial", RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("acia", acia6850_device, write_rxd)) - MCFG_RS232_DCD_HANDLER(WRITELINE("acia", acia6850_device, write_dcd)) - MCFG_RS232_CTS_HANDLER(WRITELINE("acia", acia6850_device, write_cts)) + rs232_port_device &serial(RS232_PORT(config, "serial", default_rs232_devices, nullptr)); + serial.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); + serial.dcd_handler().set(m_acia, FUNC(acia6850_device::write_dcd)); + serial.cts_handler().set(m_acia, FUNC(acia6850_device::write_cts)); - MCFG_DEVICE_ADD("acia_clock", CLOCK, XTAL(16'000'000) / 13) - MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, accomm_state, write_acia_clock)) + CLOCK(config, m_acia_clock, 16_MHz_XTAL / 13); + m_acia_clock->signal_handler().set(m_acia, FUNC(acia6850_device::write_txc)); + m_acia_clock->signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)); /* econet */ MC6854(config, m_adlc); - m_adlc->out_txd_cb().set(ECONET_TAG, FUNC(econet_device::host_data_w)); + m_adlc->out_txd_cb().set("econet", FUNC(econet_device::host_data_w)); m_adlc->out_irq_cb().set_inputline(m_maincpu, G65816_LINE_NMI); - MCFG_ECONET_ADD() - MCFG_ECONET_CLK_CALLBACK(WRITELINE(*this, accomm_state, econet_clk_w)) - MCFG_ECONET_DATA_CALLBACK(WRITELINE("mc6854", mc6854_device, set_rx)) - MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr) + + econet_device &econet(ECONET(config, "econet", 0)); + econet.clk_wr_callback().set(m_adlc, FUNC(mc6854_device::txc_w)); + econet.clk_wr_callback().append(m_adlc, FUNC(mc6854_device::rxc_w)); + econet.data_wr_callback().set(m_adlc, FUNC(mc6854_device::set_rx)); + + econet_slot_device &econet_slot(ECONET_SLOT(config, "econet254", 0)); + econet_devices(econet_slot); + econet_slot.set_slot(254); /* printer */ - MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer") - MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("via6522", via6522_device, write_ca1)) - MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") -MACHINE_CONFIG_END + centronics_device ¢ronics(CENTRONICS(config, "centronics", centronics_devices, "printer")); + centronics.ack_handler().set(m_via, FUNC(via6522_device::write_ca1)); + output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out")); + centronics.set_output_latch(cent_data_out); +} ROM_START(accomm) - ROM_REGION(0x40000, "maincpu", 0) + ROM_REGION(0x80000, "maincpu", 0) ROM_DEFAULT_BIOS("100") - ROM_SYSTEM_BIOS(0, "100", "1.00 13/Nov/86") /* Version 1.00 13/Nov/86 (C)1986 */ - ROMX_LOAD( "romv100-3.rom", 0x000000, 0x010000, CRC(bd87a157) SHA1(b9b9ed1aab9ffef2de988b2cfeac293afa11448a), ROM_BIOS(0) ) - ROMX_LOAD( "romv100-2.rom", 0x010000, 0x010000, CRC(3438adee) SHA1(cd9d5522d9430cb2e1936210b77d2edd280f9419), ROM_BIOS(0) ) - ROMX_LOAD( "romv100-1.rom", 0x020000, 0x010000, CRC(adc6a073) SHA1(3e87f21fafc1d69f33c5b541a20a98e82aacbfab), ROM_BIOS(0) ) - ROMX_LOAD( "romv100-0.rom", 0x030000, 0x010000, CRC(6d22950d) SHA1(d4cbdccf8d2bc836fb81182b2ed344d7134fe5c9), ROM_BIOS(0) ) - /* Version 1.70 04/Jun/87 (C)1987 */ - /* Versone 3.00 13/gen/88 (C)1988 */ + ROM_SYSTEM_BIOS(0, "100", "MOS v1.00 13/Nov/86") /* MOS: Version 1.00 13/Nov/86 (C)1986 */ + ROMX_LOAD("romv100-0.rom", 0x000000, 0x010000, CRC(6d22950d) SHA1(d4cbdccf8d2bc836fb81182b2ed344d7134fe5c9), ROM_BIOS(0)) + ROM_RELOAD( 0x010000, 0x010000) + ROMX_LOAD("romv100-1.rom", 0x020000, 0x010000, CRC(adc6a073) SHA1(3e87f21fafc1d69f33c5b541a20a98e82aacbfab), ROM_BIOS(0)) + ROM_RELOAD( 0x030000, 0x010000) + ROMX_LOAD("romv100-2.rom", 0x040000, 0x010000, CRC(3438adee) SHA1(cd9d5522d9430cb2e1936210b77d2edd280f9419), ROM_BIOS(0)) + ROM_RELOAD( 0x050000, 0x010000) + ROMX_LOAD("romv100-3.rom", 0x060000, 0x010000, CRC(bd87a157) SHA1(b9b9ed1aab9ffef2de988b2cfeac293afa11448a), ROM_BIOS(0)) + ROM_RELOAD( 0x070000, 0x010000) + + ROM_REGION(0x380000, "ext", ROMREGION_ERASEFF) +ROM_END + +ROM_START(accommp) + ROM_REGION(0x80000, "maincpu", 0) + /* ROM labels on both evaluation prototypes were hand written A, B, C, D */ + ROM_DEFAULT_BIOS("011-1985") + /* Serial B01-PPC01-0000004 (owned by Acorn co-founder Chris Curry) */ + ROM_SYSTEM_BIOS(0, "011-1985", "CMOS v0.11 1985") /* CMOS version 0.11 October (C)1985 */ + ROMX_LOAD("004-a.rom", 0x000000, 0x008000, CRC(d0d4d5e3) SHA1(67710e349235ed5c71380b5a7d4b570ce355b10e), ROM_BIOS(0)) + ROM_RELOAD( 0x008000, 0x008000) + ROM_RELOAD( 0x010000, 0x008000) + ROM_RELOAD( 0x018000, 0x008000) + ROMX_LOAD("004-b.rom", 0x020000, 0x010000, CRC(e2fcef94) SHA1(fd065bcdb6c48bee39db9f71b8d193ee228557f7), ROM_BIOS(0)) + ROM_RELOAD( 0x030000, 0x010000) + ROMX_LOAD("004-c.rom", 0x040000, 0x008000, CRC(348c0018) SHA1(9681b6b9eefa9ba294fac6a41dec12ba203e5142), ROM_BIOS(0)) + ROM_RELOAD( 0x048000, 0x008000) + ROM_RELOAD( 0x050000, 0x008000) + ROM_RELOAD( 0x058000, 0x008000) + ROMX_LOAD("004-d.rom", 0x060000, 0x010000, CRC(1379eb9f) SHA1(8d57bc7e279c5f17c6f0e4d1d5fa7f784aadd549), ROM_BIOS(0)) + ROM_RELOAD( 0x070000, 0x010000) + /* Serial ending 094 */ + ROM_SYSTEM_BIOS(1, "011-1986", "CMOS v0.11 1986") /* CMOS version 0.11 October (C)1985 */ + ROMX_LOAD("094-a.rom", 0x008000, 0x008000, CRC(d0d4d5e3) SHA1(67710e349235ed5c71380b5a7d4b570ce355b10e), ROM_BIOS(1)) + ROM_RELOAD( 0x008000, 0x008000) + ROM_RELOAD( 0x010000, 0x008000) + ROM_RELOAD( 0x018000, 0x008000) + ROMX_LOAD("094-b.rom", 0x020000, 0x008000, CRC(8d793909) SHA1(392028386f831dfae3353e0b7b51a608798e89c6), ROM_BIOS(1)) + ROM_RELOAD( 0x028000, 0x008000) + ROM_RELOAD( 0x030000, 0x008000) + ROM_RELOAD( 0x038000, 0x008000) + ROMX_LOAD("094-c.rom", 0x040000, 0x008000, CRC(e544e849) SHA1(31cd2dcd2a50880a97b12d61ef144f7d7f112345), ROM_BIOS(1)) + ROM_RELOAD( 0x048000, 0x008000) + ROM_RELOAD( 0x050000, 0x008000) + ROM_RELOAD( 0x058000, 0x008000) + ROMX_LOAD("094-d-view+castoff.rom", 0x060000, 0x010000, CRC(8027df77) SHA1(51751bfdcf68683c092b6442fb22f11cb565898c), ROM_BIOS(1)) + ROM_RELOAD( 0x070000, 0x010000) + + ROM_REGION(0x380000, "ext", ROMREGION_ERASEFF) +ROM_END + +ROM_START(accommb) + ROM_REGION(0x80000, "maincpu", 0) + ROM_DEFAULT_BIOS("170") + ROM_SYSTEM_BIOS(0, "170", "MOS v1.70 04/Jun/87") /* MOS: Version 1.70 04/Jun/87 (C)1987 */ + ROMX_LOAD("0252.200-1-rom0-v1.00.rom", 0x000000, 0x010000, CRC(6d22950d) SHA1(d4cbdccf8d2bc836fb81182b2ed344d7134fe5c9), ROM_BIOS(0)) + ROM_RELOAD( 0x010000, 0x010000) + ROMX_LOAD("0252.201-1-rom1-v1.00.rom", 0x020000, 0x010000, CRC(adc6a073) SHA1(3e87f21fafc1d69f33c5b541a20a98e82aacbfab), ROM_BIOS(0)) + ROM_RELOAD( 0x030000, 0x010000) + ROMX_LOAD("0252.202-1-rom2-v1.00.rom", 0x040000, 0x010000, CRC(3438adee) SHA1(cd9d5522d9430cb2e1936210b77d2edd280f9419), ROM_BIOS(0)) + ROM_RELOAD( 0x050000, 0x010000) + ROMX_LOAD("0252.203-1-rom3-v1.00.rom", 0x060000, 0x010000, CRC(bd87a157) SHA1(b9b9ed1aab9ffef2de988b2cfeac293afa11448a), ROM_BIOS(0)) + ROM_RELOAD( 0x070000, 0x010000) + + /* Expansion board: Acorn Computer 0167,000 Issue 1 Spectar II */ + /* Contains 8 slots for ASTRON Data Cards */ + ROM_REGION(0x380000, "ext", ROMREGION_ERASEFF) + ROM_LOAD("spectar-v1.0-0267-200-03.ic1", 0x000000, 0x010000, CRC(71ad0491) SHA1(c3ace8cdd2383e97eb58d64d011444da678d537c)) +ROM_END + +ROM_START(accommi) + ROM_REGION(0x80000, "maincpu", 0) + ROM_DEFAULT_BIOS("300") + ROM_SYSTEM_BIOS(0, "300", "MOS v3.00 13/gen/88") /* MOS: Versione 3.00 13/gen/88 (C)1988 */ + ROMX_LOAD("rom0.rom", 0x000000, 0x020000, CRC(841bd984) SHA1(2c3bc77178e5bf0342e0410f6c398bb3ac40d0c4), ROM_BIOS(0)) + ROMX_LOAD("252216-iss1.rom", 0x020000, 0x020000, CRC(40767d31) SHA1(258f4ed92d74523aaaa4aa250db5a99428aaf960), ROM_BIOS(0)) + ROMX_LOAD("rom2.rom", 0x040000, 0x010000, CRC(e3511af8) SHA1(88a5654a5e84a31078a0a64139fe84db08196c2a), ROM_BIOS(0)) + ROM_RELOAD( 0x050000, 0x010000) + + ROM_REGION(0x380000, "ext", ROMREGION_ERASEFF) ROM_END -COMP( 1986, accomm, 0, 0, accomm, accomm, accomm_state, empty_init, "Acorn", "Acorn Communicator", MACHINE_NOT_WORKING ) +COMP( 1986, accomm, 0, 0, accomm, accomm, accomm_state, empty_init, "Acorn", "Acorn Communicator", MACHINE_NOT_WORKING ) +COMP( 1985, accommp, accomm, 0, accomm, accomm, accomm_state, empty_init, "Acorn", "Acorn Communicator (prototype)", MACHINE_NOT_WORKING ) +COMP( 1987, accommb, accomm, 0, accomm, accomm, accomm_state, empty_init, "Acorn", "Acorn Briefcase Communicator", MACHINE_NOT_WORKING ) +COMP( 1988, accommi, accomm, 0, accomm, accomm, accomm_state, empty_init, "Acorn", "Acorn Communicator (Italian)", MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/alphatpx.cpp b/src/mame/drivers/alphatpx.cpp index 8f1b71aeb57..71225a67d7e 100644 --- a/src/mame/drivers/alphatpx.cpp +++ b/src/mame/drivers/alphatpx.cpp @@ -1229,8 +1229,8 @@ MACHINE_CONFIG_START(alphatp_12_state::alphatp2) CRT5027(config, m_crtc, 12.8544_MHz_XTAL / 8); m_crtc->set_char_width(8); - m_crtc->hsyn_wr_callback().set_inputline("maincpu", I8085_RST55_LINE); - m_crtc->vsyn_wr_callback().set_inputline("maincpu", I8085_RST65_LINE).exor(1); + m_crtc->hsyn_callback().set_inputline("maincpu", I8085_RST55_LINE); + m_crtc->vsyn_callback().set_inputline("maincpu", I8085_RST65_LINE).exor(1); m_crtc->set_screen("screen"); MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_alphatp3) @@ -1306,7 +1306,7 @@ MACHINE_CONFIG_START(alphatp_34_state::alphatp3) CRT5037(config, m_crtc, 12.8544_MHz_XTAL / 8); m_crtc->set_char_width(8); - m_crtc->vsyn_wr_callback().set_inputline("maincpu", I8085_RST65_LINE).exor(1); + m_crtc->vsyn_callback().set_inputline("maincpu", I8085_RST65_LINE).exor(1); m_crtc->set_screen("screen"); MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_alphatp3) diff --git a/src/mame/drivers/ampex.cpp b/src/mame/drivers/ampex.cpp index 7c718bb04b3..4585f3ecc06 100644 --- a/src/mame/drivers/ampex.cpp +++ b/src/mame/drivers/ampex.cpp @@ -31,6 +31,7 @@ public: ampex_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_vtac(*this, "vtac") , m_uart(*this, "uart") , m_dbrg(*this, "dbrg") , m_p_chargen(*this, "chargen") @@ -68,6 +69,7 @@ private: std::unique_ptr<u16[]> m_paged_ram; required_device<cpu_device> m_maincpu; + required_device<crt5037_device> m_vtac; required_device<ay31015_device> m_uart; required_device<com8116_device> m_dbrg; required_region_ptr<u8> m_p_chargen; @@ -170,7 +172,7 @@ void ampex_state::mem_map(address_map &map) map(0x5843, 0x5843).r(m_uart, FUNC(ay31015_device::receive)).w(FUNC(ampex_state::write_5843)); map(0x5846, 0x5846).r(FUNC(ampex_state::read_5846)); map(0x5847, 0x5847).r(FUNC(ampex_state::read_5847)); - map(0x5c00, 0x5c0f).rw("vtac", FUNC(crt5037_device::read), FUNC(crt5037_device::write)); + map(0x5c00, 0x5c0f).rw(m_vtac, FUNC(crt5037_device::read), FUNC(crt5037_device::write)); map(0x8000, 0x97ff).rw(FUNC(ampex_state::page_r), FUNC(ampex_state::page_w)); map(0xc000, 0xcfff).ram(); // video RAM } @@ -207,18 +209,19 @@ void ampex_state::machine_start() save_pointer(NAME(m_paged_ram), 0x1800 * 4); } -MACHINE_CONFIG_START(ampex_state::ampex) - MCFG_DEVICE_ADD("maincpu", Z80, XTAL(23'814'000) / 9) // clocked by 8224? - MCFG_DEVICE_PROGRAM_MAP(mem_map) +void ampex_state::ampex(machine_config &config) +{ + Z80(config, m_maincpu, 23.814_MHz_XTAL / 9); // clocked by 8224? + m_maincpu->set_addrmap(AS_PROGRAM, &ex_state::mem_map); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(23.814_MHz_XTAL / 2, 105 * CHAR_WIDTH, 0, 80 * CHAR_WIDTH, 270, 0, 250); screen.set_screen_update(FUNC(ampex_state::screen_update)); - MCFG_DEVICE_ADD("vtac", CRT5037, XTAL(23'814'000) / 2 / CHAR_WIDTH) - MCFG_TMS9927_CHAR_WIDTH(CHAR_WIDTH) - MCFG_TMS9927_VSYN_CALLBACK(WRITELINE(*this, ampex_state, vsyn_w)) - MCFG_VIDEO_SET_SCREEN("screen") + CRT5037(config, m_vtac, 23.814_MHz_XTAL / 2 / CHAR_WIDTH); + m_vtac->set_char_width(CHAR_WIDTH); + m_vtac->vsyn_callback().set(FUNC(ampex_state::vsyn_w)); + m_vtac->set_screen("screen"); AY31015(config, m_uart, 0); // COM8017, actually m_uart->write_so_callback().set(FUNC(ampex_state::so_w)); @@ -228,7 +231,7 @@ MACHINE_CONFIG_START(ampex_state::ampex) COM5016_5(config, m_dbrg, 4.9152_MHz_XTAL); m_dbrg->fr_handler().set(m_uart, FUNC(ay31015_device::write_rcp)); m_dbrg->ft_handler().set(m_uart, FUNC(ay31015_device::write_tcp)); -MACHINE_CONFIG_END +} ROM_START( dialog80 ) ROM_REGION( 0x3000, "roms", 0 ) diff --git a/src/mame/drivers/ampex210.cpp b/src/mame/drivers/ampex210.cpp index ea8f2bbc8ff..62a576a9594 100644 --- a/src/mame/drivers/ampex210.cpp +++ b/src/mame/drivers/ampex210.cpp @@ -58,24 +58,25 @@ static INPUT_PORTS_START(ampex210p) INPUT_PORTS_END -MACHINE_CONFIG_START(ampex210_state::ampex210p) - MCFG_DEVICE_ADD("maincpu", Z80, 4'000'000) - MCFG_DEVICE_PROGRAM_MAP(mem_map) - MCFG_DEVICE_IO_MAP(io_map) +void ampex210_state::ampex210p(machine_config &config) +{ + Z80(config, m_maincpu, 4'000'000); + m_maincpu->set_addrmap(AS_PROGRAM, &ex210_state::mem_map); + m_maincpu->set_addrmap(AS_IO, &ex210_state::io_map); mos6551_device &acia(MOS6551(config, "acia", 1'843'200)); acia.irq_handler().set_inputline("maincpu", INPUT_LINE_IRQ0); - MCFG_DEVICE_ADD("pvtc", SCN2672, 2'178'000) - MCFG_SCN2672_INTR_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI)) - MCFG_SCN2672_CHARACTER_WIDTH(10) - MCFG_SCN2672_DRAW_CHARACTER_CALLBACK_OWNER(ampex210_state, draw_character) - MCFG_VIDEO_SET_SCREEN("screen") + scn2672_device &pvtc(SCN2672(config, "pvtc", 2'178'000)); + pvtc.intr_callback().set_inputline("maincpu", INPUT_LINE_NMI); + pvtc.set_character_width(10); + pvtc.set_display_callback(FUNC(ampex210_state::draw_character)); + pvtc.set_screen("screen"); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(21'780'000, 1000, 0, 800, 363, 0, 300) // clock guessed - MCFG_SCREEN_UPDATE_DEVICE("pvtc", scn2672_device, screen_update) -MACHINE_CONFIG_END + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(21'780'000, 1000, 0, 800, 363, 0, 300); // clock guessed + screen.set_screen_update("pvtc", FUNC(scn2672_device::screen_update)); +} ROM_START(ampex210p) // Z80 (+6551,MC2672,3515260-01, 3 xtals, speaker) // 8k ram // amber diff --git a/src/mame/drivers/amust.cpp b/src/mame/drivers/amust.cpp index 5224f8e363d..7f9f315c240 100644 --- a/src/mame/drivers/amust.cpp +++ b/src/mame/drivers/amust.cpp @@ -1,17 +1,22 @@ // license:BSD-3-Clause // copyright-holders:Robbbert -/*************************************************************************** +/***************************************************************************************** Amust Compak - also known as Amust Executive 816. 2014-03-21 Skeleton driver. [Robbbert] -An unusual-looking CP/M computer. +An unusual-looking CP/M computer. The screen is a tiny CRT not much bigger +than a modern smartphone. + +Z-80A @ 4MHz; 64KB dynamic RAM (8x 4164); 2KB video ram (6116); 2x 13cm drives; +80 track DD with data capacity of 790KB; in a lockable Samsonite briefcase. + There are no manuals or schematics known to exist. The entire driver is guesswork. The board has LH0080 (Z80A), 2x 8251, 2x 8255, 8253, uPD765A and a HD46505SP-2. -The videoram is a 6116 RAM. There is a piezo beeper. There are 3 crystals, -X1 = 4.9152 (serial chips?), X2 = 16 (CPU), X3 = 14.31818 MHz (Video?). +There is a piezo beeper. There are 3 crystals, X1 = 4.9152 (serial chips), +X2 = 16 (CPU), X3 = 14.31818 MHz (Video). There are numerous jumpers, all of which perform unknown functions. The keyboard is a plug-in unit, same idea as Kaypro and Zorba. It has these @@ -50,21 +55,6 @@ Two Side Skew 1,3,5,2,4 -Stuff that doesn't make sense: ------------------------------- -1. To access the screen, it waits for IRQ presumably from sync pulse. It sets INT -mode 0 which means a page-zero jump, but doesn't write anything to the zero-page ram. -That's why I added a RETI at 0038 and set the vector to there. A bit later it writes -a jump at 0000. Then it sets the interrupting device to the fdc (not sure how yet), -then proceeds to overwrite all of page-zero with the disk contents. This of course -kills the jump it just wrote, and my RETI. So it runs into the weeds at high speed. -What should happen is after loading the boot sector succesfully it will jump to 0000, -otherwise it will write BOOT NG to the screen and you're in the monitor. The bios -contains no RETI instructions. -2. At F824 it copies itself to the same address which is presumably shadow ram. But -it never switches to it. The ram is physically in the machine. - - Monitor Commands: ----------------- B = Boot from floppy @@ -73,12 +63,17 @@ B = Boot from floppy ToDo: - Everything -- Need software -- Keyboard controller needs to be emulated +- Floppy issues: + - The loop to read a sector has no escape. The interrupt handler (which can't be found) + needs to take another path when the sector is complete. + - The loop uses "ini" to read a byte, but this doesn't clear DRQ, so memory rapidly fills + up with garbage, mostly FF. +- Keyboard controller needs to be emulated. - If booting straight to CP/M, the load message should be in the middle of the screen. +- Looks like port 5 has a row of function keys or similar. Need to be added. -****************************************************************************/ +*******************************************************************************************/ #include "emu.h" #include "cpu/z80/z80.h" @@ -120,7 +115,6 @@ private: TIMER_BEEP_OFF }; - DECLARE_MACHINE_RESET(amust); DECLARE_READ8_MEMBER(port04_r); DECLARE_WRITE8_MEMBER(port04_w); DECLARE_READ8_MEMBER(port05_r); @@ -132,18 +126,28 @@ private: DECLARE_READ8_MEMBER(port0a_r); DECLARE_WRITE8_MEMBER(port0a_w); DECLARE_WRITE8_MEMBER(port0d_w); + DECLARE_WRITE_LINE_MEMBER(hsync_w); + DECLARE_WRITE_LINE_MEMBER(vsync_w); + DECLARE_WRITE_LINE_MEMBER(drq_w); + DECLARE_WRITE_LINE_MEMBER(intrq_w); void kbd_put(u8 data); - INTERRUPT_GEN_MEMBER(irq_vs); MC6845_UPDATE_ROW(crtc_update_row); void io_map(address_map &map); void mem_map(address_map &map); + void machine_reset() override; + void do_int(); u8 m_port04; u8 m_port06; u8 m_port08; + u8 m_port09; u8 m_port0a; u8 m_term_data; + bool m_drq; + //bool m_intrq; + bool m_hsync; + bool m_vsync; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; required_device<palette_device> m_palette; required_device<cpu_device> m_maincpu; @@ -211,21 +215,60 @@ static void amust_floppies(device_slot_interface &device) static INPUT_PORTS_START( amust ) PORT_START("P9") // bits 6,7 not used? - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // code @ FB83 + // bit 5 - fdc intrq + PORT_DIPNAME( 0x01, 0x01, "Bit0" ) // code @ FC99 + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPNAME( 0x02, 0x02, "Bit1" ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPNAME( 0x04, 0x04, "Bit2" ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPNAME( 0x08, 0x08, "Bit3" ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPNAME( 0x10, 0x10, "Boot to Monitor" ) // code @ F895 PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x10, DEF_STR( On ) ) - PORT_DIPNAME( 0x0f, 0x01, "Unknown" ) // code @ FC99 - PORT_DIPSETTING( 0x01, "1" ) - PORT_DIPSETTING( 0x02, "2" ) - PORT_DIPSETTING( 0x04, "3" ) - PORT_DIPSETTING( 0x08, "4" ) INPUT_PORTS_END -// bodgy -INTERRUPT_GEN_MEMBER( amust_state::irq_vs ) +void amust_state::do_int() +{ + bool sync = m_hsync | m_vsync; + + if ((BIT(m_port0a, 3) && sync) // when writing to the screen, only do it during blanking + || (BIT(m_port0a, 5) && m_drq)) // when reading from floppy, only do it when DRQ is high. + { + //printf("%X,%X,%X ",m_port0a,sync,m_drq); + m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0x00); + } + else + m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); +} + +WRITE_LINE_MEMBER( amust_state::drq_w ) +{ + m_drq = state; + do_int(); + m_fdc->tc_w(1); +} + +WRITE_LINE_MEMBER( amust_state::intrq_w ) +{ + m_port09 = (m_port09 & 0xdf) | (state ? 0x20 : 0); +} + +WRITE_LINE_MEMBER( amust_state::hsync_w ) { - m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xff); + m_hsync = state; + do_int(); +} + +WRITE_LINE_MEMBER( amust_state::vsync_w ) +{ + m_vsync = state; + do_int(); } READ8_MEMBER( amust_state::port04_r ) @@ -271,14 +314,14 @@ d1 - d2 - d3 - d4 - H = go to monitor; L = boot from disk -d5 - status of disk-related; loops till NZ +d5 - status of fdc intrq; loops till NZ d6 - d7 - */ READ8_MEMBER( amust_state::port09_r ) { logerror("%s\n",machine().describe_context()); - return ioport("P9")->read(); + return (ioport("P9")->read() & 0x1f) | m_port09; } READ8_MEMBER( amust_state::port0a_r ) @@ -302,6 +345,14 @@ WRITE8_MEMBER( amust_state::port0a_w ) m_beep->set_state(1); timer_set(attotime::from_msec(150), TIMER_BEEP_OFF); } + floppy_image_device *floppy = m_floppy0->get_device(); + m_fdc->set_floppy(floppy); + if (floppy) + { + floppy->mon_w(0); + + //floppy->ss_w(0); // side 0? hopefully fdc does this + } } WRITE8_MEMBER( amust_state::port0d_w ) @@ -357,17 +408,20 @@ MC6845_UPDATE_ROW( amust_state::crtc_update_row ) } } -MACHINE_RESET_MEMBER( amust_state, amust ) +void amust_state::machine_reset() { membank("bankr0")->set_entry(0); // point at rom membank("bankw0")->set_entry(0); // always write to ram - address_space &space = m_maincpu->space(AS_PROGRAM); - space.write_byte(0x38, 0xed); - space.write_byte(0x39, 0x4d); m_port04 = 0; m_port06 = 0; m_port08 = 0; + m_port09 = 0; m_port0a = 0; + m_hsync = false; + m_vsync = false; + m_drq = false; + m_fdc->set_ready_line_connected(1); // always ready for minifloppy; controlled by fdc for 20cm + m_fdc->set_unscaled_clock(4000000); // 4MHz for minifloppy; 8MHz for 20cm m_maincpu->set_state_int(Z80_PC, 0xf800); } @@ -385,8 +439,6 @@ MACHINE_CONFIG_START(amust_state::amust) MCFG_DEVICE_ADD("maincpu",Z80, XTAL(16'000'000) / 4) MCFG_DEVICE_PROGRAM_MAP(mem_map) MCFG_DEVICE_IO_MAP(io_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", amust_state, irq_vs) - MCFG_MACHINE_RESET_OVERRIDE(amust_state, amust) /* video hardware */ MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green()) @@ -408,8 +460,12 @@ MACHINE_CONFIG_START(amust_state::amust) MCFG_MC6845_SHOW_BORDER_AREA(false) MCFG_MC6845_CHAR_WIDTH(8) MCFG_MC6845_UPDATE_ROW_CB(amust_state, crtc_update_row) + MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(*this, amust_state, hsync_w)) + MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(*this, amust_state, vsync_w)) - MCFG_UPD765A_ADD("fdc", false, true) + UPD765A(config, m_fdc, true, true); + m_fdc->drq_wr_callback().set(FUNC(amust_state::drq_w)); + m_fdc->intrq_wr_callback().set(FUNC(amust_state::intrq_w)); MCFG_FLOPPY_DRIVE_ADD("fdc:0", amust_floppies, "525qd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_SOUND(true) MCFG_FLOPPY_DRIVE_ADD("fdc:1", amust_floppies, "525qd", floppy_image_device::default_floppy_formats) @@ -454,13 +510,13 @@ MACHINE_CONFIG_END /* ROM definition */ ROM_START( amust ) ROM_REGION( 0x11000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "mon_h.rom", 0x10000, 0x1000, CRC(10dceac6) SHA1(1ef80039063f7a6455563d59f1bcc23e09eca369) ) + ROM_LOAD( "mon_h.ic25", 0x10000, 0x1000, CRC(10dceac6) SHA1(1ef80039063f7a6455563d59f1bcc23e09eca369) ) ROM_REGION( 0x800, "chargen", 0 ) - ROM_LOAD( "cg4.rom", 0x000, 0x800, CRC(52e7b9d8) SHA1(cc6d457634eb688ccef471f72bddf0424e64b045) ) + ROM_LOAD( "cg4.ic74", 0x000, 0x800, CRC(52e7b9d8) SHA1(cc6d457634eb688ccef471f72bddf0424e64b045) ) ROM_REGION( 0x800, "keyboard", 0 ) - ROM_LOAD( "kbd_3.rom", 0x000, 0x800, CRC(d9441b35) SHA1(ce250ab1e892a13fd75182703f259855388c6bf4) ) + ROM_LOAD( "kbd_3.rom", 0x000, 0x800, CRC(d9441b35) SHA1(ce250ab1e892a13fd75182703f259855388c6bf4) ) ROM_REGION( 0x800, "videoram", ROMREGION_ERASE00 ) ROM_END diff --git a/src/mame/drivers/apollo.cpp b/src/mame/drivers/apollo.cpp index 96e983e007e..95dfd473828 100644 --- a/src/mame/drivers/apollo.cpp +++ b/src/mame/drivers/apollo.cpp @@ -1115,8 +1115,7 @@ MACHINE_CONFIG_START(apollo_state::dn3000) m_ram->set_default_size("8M").set_extra_options("4M"); // FIXME: is this interrupt really only connected on DN3000? - MCFG_DEVICE_MODIFY(APOLLO_RTC_TAG) - MCFG_MC146818_IRQ_HANDLER(WRITELINE(*this, apollo_state, apollo_rtc_irq_function)) + m_rtc->irq().set(FUNC(apollo_state::apollo_rtc_irq_function)); MACHINE_CONFIG_END MACHINE_CONFIG_START(apollo_state::dsp3000) diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp index aabcfd1dd1a..59b6c9d361e 100644 --- a/src/mame/drivers/apple2e.cpp +++ b/src/mame/drivers/apple2e.cpp @@ -1443,6 +1443,13 @@ void apple2e_state::do_io(address_space &space, int offset, bool is_iic) return; } + if ((offset & 0xf0) == 0x30) // speaker, $C030 is really 30-3f + { + m_speaker_state ^= 1; + m_speaker->level_w(m_speaker_state); + return; + } + switch (offset) { case 0x20: @@ -1482,11 +1489,6 @@ void apple2e_state::do_io(address_space &space, int offset, bool is_iic) } break; - case 0x30: - m_speaker_state ^= 1; - m_speaker->level_w(m_speaker_state); - break; - case 0x48: // (IIc only) clear mouse X/Y interrupt flags m_xirq = m_yirq = false; lower_irq(IRQ_MOUSEXY); @@ -1599,11 +1601,13 @@ READ8_MEMBER(apple2e_state::c000_r) { if(machine().side_effects_disabled()) return read_floatingbus(); - switch (offset) + if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F { - case 0x00: // keyboard latch - return m_transchar | m_strobe; + return m_transchar | m_strobe; + } + switch (offset) + { case 0x10: // read any key down, reset keyboard strobe { uint8_t rv = m_transchar | (m_anykeydown ? 0x80 : 0x00); @@ -1611,50 +1615,50 @@ READ8_MEMBER(apple2e_state::c000_r) return rv; } - case 0x11: // read LCRAM2 (LC Dxxx bank) - return m_lcram2 ? 0x80 : 0x00; + case 0x11: // read LCRAM2 (LC Dxxx bank), also reads like $C010 without strobe reset + return (m_lcram2 ? 0x80 : 0x00) | m_strobe | m_transchar; case 0x12: // read LCRAM (is LC readable?) - return m_lcram ? 0x80 : 0x00; + return (m_lcram ? 0x80 : 0x00) | m_transchar; case 0x13: // read RAMRD - return m_ramrd ? 0x80 : 0x00; + return (m_ramrd ? 0x80 : 0x00) | m_transchar; case 0x14: // read RAMWRT - return m_ramwrt ? 0x80 : 0x00; + return (m_ramwrt ? 0x80 : 0x00) | m_transchar; case 0x15: // read INTCXROM - return m_intcxrom ? 0x80 : 0x00; + return (m_intcxrom ? 0x80 : 0x00) | m_transchar; case 0x16: // read ALTZP - return m_altzp ? 0x80 : 0x00; + return (m_altzp ? 0x80 : 0x00) | m_transchar; case 0x17: // read SLOTC3ROM - return m_slotc3rom ? 0x80 : 0x00; + return (m_slotc3rom ? 0x80 : 0x00) | m_transchar; case 0x18: // read 80STORE - return m_80store ? 0x80 : 0x00; + return (m_80store ? 0x80 : 0x00) | m_transchar; case 0x19: // read VBLBAR - return m_screen->vblank() ? 0x00 : 0x80; + return (m_screen->vblank() ? 0x00 : 0x80) | m_transchar; case 0x1a: // read TEXT - return m_video->m_graphics ? 0x00 : 0x80; + return (m_video->m_graphics ? 0x00 : 0x80) | m_transchar; case 0x1b: // read MIXED - return m_video->m_mix ? 0x80 : 0x00; + return (m_video->m_mix ? 0x80 : 0x00) | m_transchar; case 0x1c: // read PAGE2 - return m_page2 ? 0x80 : 0x00; + return (m_page2 ? 0x80 : 0x00) | m_transchar; case 0x1d: // read HIRES - return m_video->m_hires ? 0x80 : 0x00; + return (m_video->m_hires ? 0x80 : 0x00) | m_transchar; case 0x1e: // read ALTCHARSET - return m_video->m_altcharset ? 0x80 : 0x00; + return (m_video->m_altcharset ? 0x80 : 0x00) | m_transchar; case 0x1f: // read 80COL - return m_video->m_80col ? 0x80 : 0x00; + return (m_video->m_80col ? 0x80 : 0x00) | m_transchar; case 0x60: // cassette in case 0x68: @@ -1710,6 +1714,12 @@ WRITE8_MEMBER(apple2e_state::c000_w) { if(machine().side_effects_disabled()) return; + if ((offset & 0xf0) == 0x10) // clear keyboard latch, $C010 is really 10-1F + { + m_strobe = 0; + return; + } + switch (offset) { case 0x00: // 80STOREOFF @@ -1796,10 +1806,6 @@ WRITE8_MEMBER(apple2e_state::c000_w) m_video->m_altcharset = true; break; - case 0x10: // clear keyboard latch - m_strobe = 0; - break; - case 0x20: // cassette output if (m_cassette) { @@ -1836,31 +1842,13 @@ READ8_MEMBER(apple2e_state::c000_iic_r) { if(machine().side_effects_disabled()) return read_floatingbus(); - switch (offset) + if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F { - case 0x00: // keyboard latch - return m_transchar | m_strobe; - - case 0x02: // RAMRDOFF - m_ramrd = false; - auxbank_update(); - break; - - case 0x03: // RAMRDON - m_ramrd = true; - auxbank_update(); - break; - - case 0x04: // RAMWRTOFF - m_ramwrt = false; - auxbank_update(); - break; - - case 0x05: // RAMWRTON - m_ramwrt = true; - auxbank_update(); - break; + return m_transchar | m_strobe; + } + switch (offset) + { case 0x10: // read any key down, reset keyboard strobe { uint8_t rv = m_transchar | (m_anykeydown ? 0x80 : 0x00); @@ -1868,54 +1856,52 @@ READ8_MEMBER(apple2e_state::c000_iic_r) return rv; } - case 0x11: // read LCRAM2 (LC Dxxx bank) - return m_lcram2 ? 0x80 : 0x00; - break; + case 0x11: // read LCRAM2 (LC Dxxx bank), also reads like $C010 without strobe reset + return (m_lcram2 ? 0x80 : 0x00) | m_strobe | m_transchar; case 0x12: // read LCRAM (is LC readable?) - return m_lcram ? 0x80 : 0x00; - break; + return (m_lcram ? 0x80 : 0x00) | m_transchar; case 0x13: // read RAMRD - return m_ramrd ? 0x80 : 0x00; + return (m_ramrd ? 0x80 : 0x00) | m_transchar; case 0x14: // read RAMWRT - return m_ramwrt ? 0x80 : 0x00; + return (m_ramwrt ? 0x80 : 0x00) | m_transchar; case 0x15: // read & reset mouse X0 interrupt flag lower_irq(IRQ_MOUSEXY); - return m_xirq ? 0x80 : 0x00; + return (m_xirq ? 0x80 : 0x00) | m_transchar; case 0x16: // read ALTZP - return m_altzp ? 0x80 : 0x00; + return (m_altzp ? 0x80 : 0x00) | m_transchar; case 0x17: // read & reset mouse Y0 interrupt flag lower_irq(IRQ_MOUSEXY); - return m_yirq ? 0x80 : 0x00; + return (m_yirq ? 0x80 : 0x00) | m_transchar; case 0x18: // read 80STORE - return m_80store ? 0x80 : 0x00; + return (m_80store ? 0x80 : 0x00) | m_transchar; case 0x19: // read VBL - return m_vbl ? 0x80 : 0x00; + return (m_vbl ? 0x80 : 0x00) | m_transchar; case 0x1a: // read TEXT - return m_video->m_graphics ? 0x00 : 0x80; + return (m_video->m_graphics ? 0x00 : 0x80) | m_transchar; case 0x1b: // read MIXED - return m_video->m_mix ? 0x80 : 0x00; + return (m_video->m_mix ? 0x80 : 0x00) | m_transchar; case 0x1c: // read PAGE2 - return m_page2 ? 0x80 : 0x00; + return (m_page2 ? 0x80 : 0x00) | m_transchar; case 0x1d: // read HIRES - return m_video->m_hires ? 0x80 : 0x00; + return (m_video->m_hires ? 0x80 : 0x00) | m_transchar; case 0x1e: // read ALTCHARSET - return m_video->m_altcharset ? 0x80 : 0x00; + return (m_video->m_altcharset ? 0x80 : 0x00) | m_transchar; case 0x1f: // read 80COL - return m_video->m_80col ? 0x80 : 0x00; + return (m_video->m_80col ? 0x80 : 0x00) | m_transchar; case 0x40: // read XYMask (IIc only) return m_xy ? 0x80 : 0x00; @@ -1980,6 +1966,12 @@ WRITE8_MEMBER(apple2e_state::c000_iic_w) { if(machine().side_effects_disabled()) return; + if ((offset & 0xf0) == 0x10) // clear keyboard latch, $C010 is really 10-1F + { + m_strobe = 0; + return; + } + switch (offset) { case 0x00: // 80STOREOFF @@ -2058,10 +2050,6 @@ WRITE8_MEMBER(apple2e_state::c000_iic_w) m_video->m_altcharset = true; break; - case 0x10: // clear keyboard latch - m_strobe = 0; - break; - case 0x5a: // IIC+ accelerator unlock if (m_isiicplus) { @@ -2338,7 +2326,7 @@ READ8_MEMBER(apple2e_state::c300_r) { return read_slot_rom(3, offset); } READ8_MEMBER(apple2e_state::c300_int_r) { - if (!m_slotc3rom) + if ((!m_slotc3rom) && !machine().side_effects_disabled()) { m_intc8rom = true; update_slotrom_banks(); @@ -2348,7 +2336,7 @@ READ8_MEMBER(apple2e_state::c300_int_r) READ8_MEMBER(apple2e_state::c300_int_bank_r) { - if (!m_slotc3rom) + if ((!m_slotc3rom) && !machine().side_effects_disabled()) { m_intc8rom = true; update_slotrom_banks(); @@ -2358,7 +2346,7 @@ READ8_MEMBER(apple2e_state::c300_int_bank_r) WRITE8_MEMBER(apple2e_state::c300_w) { - if (!m_slotc3rom) + if ((!m_slotc3rom) && !machine().side_effects_disabled()) { m_intc8rom = true; update_slotrom_banks(); @@ -2409,6 +2397,7 @@ READ8_MEMBER(apple2e_state::c800_r) if ((offset == 0x7ff) && !machine().side_effects_disabled()) { m_cnxx_slot = CNXX_UNCLAIMED; + m_intc8rom = false; update_slotrom_banks(); return 0xff; } diff --git a/src/mame/drivers/argus.cpp b/src/mame/drivers/argus.cpp index c0df2ee27c5..78b9c62e1a6 100644 --- a/src/mame/drivers/argus.cpp +++ b/src/mame/drivers/argus.cpp @@ -665,25 +665,25 @@ ROM_END ROM_START( valtric ) ROM_REGION( 0x30000, "maincpu", 0 ) /* Main CPU */ - ROM_LOAD( "vt_04.bin", 0x00000, 0x08000, CRC(709c705f) SHA1(b82e2209a0371dcbc2708c485b02985cea04353f) ) - ROM_LOAD( "vt_06.bin", 0x10000, 0x10000, CRC(c9cbb4e4) SHA1(3c84cda778263a9bb2031e29f6f29f29878d2070) ) - ROM_LOAD( "vt_05.bin", 0x20000, 0x10000, CRC(7ab2684b) SHA1(9bca7e2fd3b5f4043de37cd439d5235957e5012f) ) + ROM_LOAD( "vt_04.bin", 0x00000, 0x08000, CRC(709c705f) SHA1(b82e2209a0371dcbc2708c485b02985cea04353f) ) // 512 + ROM_LOAD( "vt_06.bin", 0x10000, 0x10000, CRC(c9cbb4e4) SHA1(3c84cda778263a9bb2031e29f6f29f29878d2070) ) // 512 + ROM_LOAD( "vt_05.bin", 0x20000, 0x10000, CRC(7ab2684b) SHA1(9bca7e2fd3b5f4043de37cd439d5235957e5012f) ) // 512 ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */ - ROM_LOAD( "vt_01.bin", 0x00000, 0x08000, CRC(4616484f) SHA1(24d060218cc1542ebfc2100ecd6489a0e17b36ee) ) + ROM_LOAD( "vt_01.bin", 0x00000, 0x08000, CRC(4616484f) SHA1(24d060218cc1542ebfc2100ecd6489a0e17b36ee) ) // 512 ROM_REGION( 0x20000, "gfx1", 0 ) /* Sprite */ - ROM_LOAD( "vt_02.bin", 0x00000, 0x10000, CRC(66401977) SHA1(91c527d0bcea54d723068715a12cb3c976d04294) ) - ROM_LOAD( "vt_03.bin", 0x10000, 0x10000, CRC(9203bbce) SHA1(f40cee48f62a87a0b5d18e271faa5b8dd36ae5f1) ) + ROM_LOAD( "vt_02.bin", 0x00000, 0x10000, CRC(66401977) SHA1(91c527d0bcea54d723068715a12cb3c976d04294) ) // 512 + ROM_LOAD( "vt_03.bin", 0x10000, 0x10000, CRC(9203bbce) SHA1(f40cee48f62a87a0b5d18e271faa5b8dd36ae5f1) ) // 512 ROM_REGION( 0x40000, "gfx2", 0 ) /* BG */ - ROM_LOAD( "vt_08.bin", 0x00000, 0x10000, CRC(661dd338) SHA1(cc643a14607c10e4a1710766f77422cd89a6bf94) ) - ROM_LOAD( "vt_09.bin", 0x10000, 0x10000, CRC(085a35b1) SHA1(ff589e67b6b5a6e661f29294a32a3840f45a9304) ) - ROM_LOAD( "vt_10.bin", 0x20000, 0x10000, CRC(09c47323) SHA1(fcfbd5054e63fae00b6a3959228964ac8f3cbf37) ) - ROM_LOAD( "vt_11.bin", 0x30000, 0x10000, CRC(4cf800b5) SHA1(7241e284b15475d8a6d533e4caadd0acbf058231) ) + ROM_LOAD( "vt_08.bin", 0x00000, 0x10000, CRC(661dd338) SHA1(cc643a14607c10e4a1710766f77422cd89a6bf94) ) // 27512 + ROM_LOAD( "vt_09.bin", 0x10000, 0x10000, CRC(085a35b1) SHA1(ff589e67b6b5a6e661f29294a32a3840f45a9304) ) // 27512 + ROM_LOAD( "vt_10.bin", 0x20000, 0x10000, CRC(09c47323) SHA1(fcfbd5054e63fae00b6a3959228964ac8f3cbf37) ) // 27512 + ROM_LOAD( "vt_11.bin", 0x30000, 0x10000, CRC(4cf800b5) SHA1(7241e284b15475d8a6d533e4caadd0acbf058231) ) // 27512 ROM_REGION( 0x08000, "gfx3", 0 ) /* Text */ - ROM_LOAD( "vt_07.bin", 0x00000, 0x08000, CRC(d5f9bfb9) SHA1(6b3f11f9b8f76c0144a109f1506d8cbb01876237) ) + ROM_LOAD( "vt_07.bin", 0x00000, 0x04000, CRC(4b9771ae) SHA1(6079f2d3abf836f04b83983485fdaba2fb357811) ) // 27128 ROM_REGION (0x100, "proms", 0) // currently not used by the emulation, without it you just get diagonal glitches on a real board. ROM_LOAD( "82s129.1s", 0x000, 0x100, CRC(bc42f9b5) SHA1(962c812d5d1f0e539238a4ec49866ef3558db629) ) // located on the top board diff --git a/src/mame/drivers/arkanoid.cpp b/src/mame/drivers/arkanoid.cpp index 873aa65aa15..dd65bb7dc95 100644 --- a/src/mame/drivers/arkanoid.cpp +++ b/src/mame/drivers/arkanoid.cpp @@ -1500,10 +1500,10 @@ MACHINE_CONFIG_END /* ROMs */ /* rom numbering, with guesses for version numbers and missing roms: - A75 01 = Z80 code 1/2 v1.0 Japan (NOT DUMPED, arkatayt and arkangc and - maybe arkanoidjbl may actually be bootlegs of this undumped - version, so it might be possible to 'restore' this version by - 'de-bootlegging' those sets?) + A75 01 = Z80 code 1/2 v1.0 Japan (NOT DUMPED; it has been rumored that arkatayt + and arkangc and maybe arkanoidjbl might actually be bootlegs of this + undumped version, so, if true, it might be possible to 'restore' this + version by 'de-bootlegging' those sets.) A75 01-1 = Z80 code 1/2 v1.1 Japan and USA/Romstar and World A75 02 = Z80 code 2/2 v1.0 Japan (has 'Notice: This game is for use in Japan only' screen) A75 03 = GFX 1/3 @@ -1525,7 +1525,7 @@ MACHINE_CONFIG_END A75 20 = MC68705P5 MCU code, v2.0 USA/Romstar (verified. dumped from MCU) A75 21 = Z80 code v2.0 1/2 Japan w/level select A75 22 = Z80 code v2.0 2/2 Japan w/level select - A75 23 = MC68705P5 MCU code, v2.0 Japan w/level select (NOT DUMPED, PLACEHOLDER HACKED FROM BOOTLEG MCU) + A75 23 = MC68705P5 MCU code, v2.0 Japan w/level select (NOT DUMPED) A75 24 = Z80 code v2.1 1/2 Japan A75 25 = Z80 code v2.1 2/2 Japan A75 26 = MC68705P5 MCU code, v2.1 Japan (verified. dumped from MCU) diff --git a/src/mame/drivers/at.cpp b/src/mame/drivers/at.cpp index 886d3a1921c..635a04b03f1 100644 --- a/src/mame/drivers/at.cpp +++ b/src/mame/drivers/at.cpp @@ -524,10 +524,11 @@ MACHINE_CONFIG_START(at_state::neat) atvga(config); MCFG_DEVICE_MODIFY("maincpu") MCFG_DEVICE_IO_MAP(neat_io) - MCFG_DEVICE_REMOVE("mb:rtc") // TODO: move this into the cs8221 - MCFG_DS12885_ADD("mb:rtc") - MCFG_MC146818_IRQ_HANDLER(WRITELINE("mb:pic8259_slave", pic8259_device, ir0_w)) // this is in :mb - MCFG_MC146818_CENTURY_INDEX(0x32) + + ds12885_device &rtc(DS12885(config.replace(), "mb:rtc")); // TODO: move this into the cs8221 + rtc.irq().set("mb:pic8259_slave", FUNC(pic8259_device::ir0_w)); // this is in :mb + rtc.set_century_index(0x32); + CS8221(config, "cs8221", 0, "maincpu", "mb:isa", "bios"); MACHINE_CONFIG_END @@ -758,10 +759,9 @@ MACHINE_CONFIG_START(at_state::ficpio2) MCFG_QUANTUM_TIME(attotime::from_hz(60)) downcast<at_mb_device *>(device)->at_softlists(config); - MCFG_DEVICE_REMOVE("mb:rtc") - MCFG_DS12885_ADD("mb:rtc") - MCFG_MC146818_IRQ_HANDLER(WRITELINE("mb:pic8259_slave", pic8259_device, ir0_w)) // this is in :mb - MCFG_MC146818_CENTURY_INDEX(0x32) + ds12885_device &rtc(DS12885(config.replace(), "mb:rtc")); + rtc.irq().set("mb:pic8259_slave", FUNC(pic8259_device::ir0_w)); // this is in :mb + rtc.set_century_index(0x32); RAM(config, m_ram).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M,128M"); @@ -783,9 +783,10 @@ MACHINE_CONFIG_START(at_state::ficpio2) MCFG_DEVICE_ADD("isa4", ISA16_SLOT, 0, "mb:isabus", pc_isa16_cards, nullptr, false) MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL) - MCFG_VT82C496_ADD("chipset") - MCFG_VT82C496_CPU("maincpu") - MCFG_VT82C496_REGION("isa") + vt82c496_device &chipset(VT82C496(config, "chipset")); + chipset.set_cputag(m_maincpu); + chipset.set_ramtag(m_ram); + chipset.set_isatag("isa"); MACHINE_CONFIG_END // Compaq Portable III diff --git a/src/mame/drivers/atarisy1.cpp b/src/mame/drivers/atarisy1.cpp index 57f73f7fcce..05b2303b4f4 100644 --- a/src/mame/drivers/atarisy1.cpp +++ b/src/mame/drivers/atarisy1.cpp @@ -369,13 +369,13 @@ READ8_MEMBER(atarisy1_state::switch_6502_r) WRITE8_MEMBER(atarisy1_state::via_pa_w) { - m_tms->data_w(space, 0, data); + m_tms->data_w(data); } READ8_MEMBER(atarisy1_state::via_pa_r) { - return m_tms->status_r(space, 0); + return m_tms->status_r(); } diff --git a/src/mame/drivers/atarisy2.cpp b/src/mame/drivers/atarisy2.cpp index ccb86bc6e60..5b01de2eaf6 100644 --- a/src/mame/drivers/atarisy2.cpp +++ b/src/mame/drivers/atarisy2.cpp @@ -700,7 +700,7 @@ WRITE8_MEMBER(atarisy2_state::tms5220_w) { if (m_tms5220.found()) { - m_tms5220->data_w(space, 0, data); + m_tms5220->data_w(data); } } @@ -1300,7 +1300,7 @@ MACHINE_CONFIG_END * *************************************/ -ROM_START( paperboy ) +ROM_START( paperboy ) // ALL of these roms should be 136034-xxx but the correct labels aren't known per game rev! ROM_REGION( 0x90000, "maincpu", 0 ) /* 9*64k for T11 code */ ROM_LOAD16_BYTE( "cpu_l07.rv3", 0x008000, 0x004000, CRC(4024bb9b) SHA1(9030ce5a6a1a3d769c699a92b32a55013f9766aa) ) ROM_LOAD16_BYTE( "cpu_n07.rv3", 0x008001, 0x004000, CRC(0260901a) SHA1(39d786f5c440ca1fd529ee73e2a4d2406cd1db8f) ) diff --git a/src/mame/drivers/atlantis.cpp b/src/mame/drivers/atlantis.cpp index 4dbf4fe6da4..6dc37fc8cfe 100644 --- a/src/mame/drivers/atlantis.cpp +++ b/src/mame/drivers/atlantis.cpp @@ -841,11 +841,11 @@ MACHINE_CONFIG_START(atlantis_state::mwskins) m_zeus->set_float_mode(1); m_zeus->irq_callback().set(FUNC(atlantis_state::zeus_irq)); m_zeus->vblank_callback().set(FUNC(atlantis_state::vblank_irq)); - m_zeus->set_screen("screen"); + m_zeus->set_screen(m_screen); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(ZEUS2_VIDEO_CLOCK / 8, 529, 0, 400, 278, 0, 256) - MCFG_SCREEN_UPDATE_DEVICE("zeus2", zeus2_device, screen_update) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(ZEUS2_VIDEO_CLOCK / 8, 529, 0, 400, 278, 0, 256); + m_screen->set_screen_update("zeus2", FUNC(zeus2_device::screen_update)); /* sound hardware */ DCS2_AUDIO_DENVER_2CH(config, m_dcs, 0); diff --git a/src/mame/drivers/attache.cpp b/src/mame/drivers/attache.cpp index e21824d1f76..951473295c8 100644 --- a/src/mame/drivers/attache.cpp +++ b/src/mame/drivers/attache.cpp @@ -1187,10 +1187,10 @@ MACHINE_CONFIG_START(attache_state::attache) FLOPPY_CONNECTOR(config, "fdc:0", attache_floppies, "525dd", floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, "fdc:1", attache_floppies, "525dd", floppy_image_device::default_floppy_formats); - MCFG_DEVICE_ADD("crtc", TMS9927, 12324000 / 8) - MCFG_TMS9927_CHAR_WIDTH(8) - MCFG_TMS9927_VSYN_CALLBACK(WRITELINE("ctc", z80ctc_device, trg2)) - MCFG_VIDEO_SET_SCREEN("screen") + TMS9927(config, m_crtc, 12.324_MHz_XTAL / 8); + m_crtc->set_char_width(8); + m_crtc->vsyn_callback().set(m_ctc, FUNC(z80ctc_device::trg2)); + m_crtc->set_screen("screen"); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); @@ -1277,10 +1277,10 @@ MACHINE_CONFIG_START(attache816_state::attache816) FLOPPY_CONNECTOR(config, "fdc:0", attache_floppies, "525dd", floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, "fdc:1", attache_floppies, "525dd", floppy_image_device::default_floppy_formats); - MCFG_DEVICE_ADD("crtc", TMS9927, 12324000) - MCFG_TMS9927_CHAR_WIDTH(8) - MCFG_TMS9927_VSYN_CALLBACK(WRITELINE("ctc", z80ctc_device, trg2)) - MCFG_VIDEO_SET_SCREEN("screen") + TMS9927(config, m_crtc, 12.324_MHz_XTAL / 8); + m_crtc->set_char_width(8); + m_crtc->vsyn_callback().set(m_ctc, FUNC(z80ctc_device::trg2)); + m_crtc->set_screen("screen"); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); diff --git a/src/mame/drivers/bagman.cpp b/src/mame/drivers/bagman.cpp index b5d982b4bb2..ab44357d04d 100644 --- a/src/mame/drivers/bagman.cpp +++ b/src/mame/drivers/bagman.cpp @@ -829,7 +829,7 @@ ROM_START( bagmanj ) ROM_LOAD( "bf8_13.t9", 0x1000, 0x1000, CRC(b2120edd) SHA1(52b89dbcc749b084331fa82b13d0876e911fce52) ) // 2732 ROM_END -ROM_START( botanic2 ) // PCB has Valadon logo with 'bajo licencia Itisa (Palamos)'. +ROM_START( botanic2 ) // PCB has Valadon logo with 'bajo licencia Itisa (Palamos)'. Most likely just a bootleg Bagman PCB conversion. ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "5.9e", 0x0000, 0x1000, CRC(c5170449) SHA1(3f85f254f1a318a0b4d6e12d4df756c880751327) ) // 2732 ROM_LOAD( "6.9f", 0x1000, 0x1000, CRC(33b2df44) SHA1(9d3697bdf0d906b27374a1460cdac715ef10565d) ) // 2732 @@ -1121,7 +1121,7 @@ GAME( 1984, sbagmans, sbagman, sbagman, sbagman, bagman_state, empty_init, GAME( 1983, pickin, 0, pickin, pickin, bagman_state, empty_init, ROT270, "Valadon Automation", "Pickin'", MACHINE_SUPPORTS_SAVE ) GAME( 1983, botanic, 0, botanic, botanici, bagman_state, empty_init, ROT90, "Itisa", "Botanic (English / Spanish)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, botanic2, botanic, bagman, botanici2, bagman_state, empty_init, ROT90, "Itisa", "Botanic (English / Spanish, with TMS5110)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // At the title screen, Botanic in corrupted in the first loop, ok from the second on. Colors likely wrong, too. +GAME( 1983, botanic2, botanic, bagman, botanici2, bagman_state, empty_init, ROT90, "Itisa", "Botanic (English / Spanish, bootleg conversion)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // At the title screen, Botanic in corrupted in the first loop, ok from the second on. Colors likely wrong, too. Has a leftover 5110. GAME( 1984, botanicf, botanic, botanic, botanicf, bagman_state, empty_init, ROT270, "Itisa (Valadon Automation license)", "Botanic (French)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, squaitsa, 0, botanic, squaitsa, squaitsa_state, empty_init, ROT0, "Itisa", "Squash (Itisa)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/big10.cpp b/src/mame/drivers/big10.cpp index 3cda33f6458..b201abee938 100644 --- a/src/mame/drivers/big10.cpp +++ b/src/mame/drivers/big10.cpp @@ -69,7 +69,6 @@ class big10_state : public driver_device public: big10_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) - , m_v9938(*this, "v9938") , m_maincpu(*this, "maincpu") , m_hopper(*this, "hopper") , m_in(*this, "IN%u", 1) @@ -87,7 +86,6 @@ protected: DECLARE_WRITE8_MEMBER(mux_w); private: - required_device<v9938_device> m_v9938; uint8_t m_mux_data; required_device<cpu_device> m_maincpu; required_device<ticket_dispenser_device> m_hopper; @@ -139,7 +137,7 @@ void big10_state::main_io(address_map &map) map.global_mask(0xff); map(0x00, 0x00).r(FUNC(big10_state::mux_r)); /* present in test mode */ map(0x02, 0x02).portr("SYSTEM"); /* coins and service */ - map(0x98, 0x9b).rw(m_v9938, FUNC(v9938_device::read), FUNC(v9938_device::write)); + map(0x98, 0x9b).rw("v9938", FUNC(v9938_device::read), FUNC(v9938_device::write)); map(0xa0, 0xa1).w("aysnd", FUNC(ay8910_device::address_data_w)); map(0xa2, 0xa2).r("aysnd", FUNC(ay8910_device::data_r)); /* Dip-Switches routes here. */ } @@ -240,9 +238,11 @@ MACHINE_CONFIG_START(big10_state::big10) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); /* video hardware */ - MCFG_V9938_ADD("v9938", "screen", VDP_MEM, MASTER_CLOCK) - MCFG_V99X8_INTERRUPT_CALLBACK(INPUTLINE("maincpu", 0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MASTER_CLOCK) + v9938_device &v9938(V9938(config, "v9938", MASTER_CLOCK)); + v9938.set_screen_ntsc("screen"); + v9938.set_vram_size(VDP_MEM); + v9938.int_cb().set_inputline("maincpu", 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "mono").front_center(); diff --git a/src/mame/drivers/calchase.cpp b/src/mame/drivers/calchase.cpp index 23ad807611d..c8303bb5c53 100644 --- a/src/mame/drivers/calchase.cpp +++ b/src/mame/drivers/calchase.cpp @@ -695,10 +695,9 @@ MACHINE_CONFIG_START(calchase_state::calchase) /* video hardware */ pcvideo_trident_vga(config); - MCFG_DEVICE_REMOVE("rtc") - MCFG_DS12885_ADD("rtc") - MCFG_MC146818_IRQ_HANDLER(WRITELINE("pic8259_2", pic8259_device, ir0_w)) - MCFG_MC146818_CENTURY_INDEX(0x32) + ds12885_device &rtc(DS12885(config.replace(), "rtc")); + rtc.irq().set("pic8259_2", FUNC(pic8259_device::ir0_w)); + rtc.set_century_index(0x32); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); diff --git a/src/mame/drivers/cdc721.cpp b/src/mame/drivers/cdc721.cpp index 0a79492e570..b570cbdd3b0 100644 --- a/src/mame/drivers/cdc721.cpp +++ b/src/mame/drivers/cdc721.cpp @@ -31,6 +31,7 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_bank_16k(*this, {"block0", "block4", "block8", "blockc"}) + , m_crtc(*this, "crtc") , m_rom_chargen(*this, "chargen") , m_ram_chargen(*this, "chargen") , m_videoram(*this, "videoram") @@ -72,6 +73,7 @@ private: required_device<cpu_device> m_maincpu; required_device_array<address_map_bank_device, 4> m_bank_16k; + required_device<crt5037_device> m_crtc; required_region_ptr<u8> m_rom_chargen; required_shared_ptr<u8> m_ram_chargen; required_shared_ptr<u8> m_videoram; @@ -326,8 +328,7 @@ MACHINE_CONFIG_START(cdc721_state::cdc721) MCFG_PALETTE_INIT_OWNER(cdc721_state, cdc721) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cdc721) - MCFG_DEVICE_ADD("crtc", CRT5037, 12.936_MHz_XTAL / 8) - MCFG_TMS9927_CHAR_WIDTH(8) + CRT5037(config, m_crtc, 12.936_MHz_XTAL / 8).set_char_width(8); z80ctc_device& ctc(Z80CTC(config, "ctc", 6_MHz_XTAL)); // Zilog Z8430B (M1 pulled up) ctc.intr_callback().set(FUNC(cdc721_state::int_w<6>)); diff --git a/src/mame/drivers/cit220.cpp b/src/mame/drivers/cit220.cpp index 806ddd99cf3..851c8fd4309 100644 --- a/src/mame/drivers/cit220.cpp +++ b/src/mame/drivers/cit220.cpp @@ -42,7 +42,7 @@ private: void keyboard_map(address_map &map); void kbd_io_map(address_map &map); - required_device<cpu_device> m_maincpu; + required_device<i8085a_cpu_device> m_maincpu; required_device<screen_device> m_screen; //required_region_ptr<u8> m_p_chargen; }; @@ -106,35 +106,36 @@ static INPUT_PORTS_START( cit220p ) INPUT_PORTS_END -MACHINE_CONFIG_START(cit220_state::cit220p) - MCFG_DEVICE_ADD("maincpu", I8085A, 6000000) - MCFG_DEVICE_PROGRAM_MAP(mem_map) - MCFG_DEVICE_IO_MAP(io_map) - MCFG_I8085A_SOD(WRITELINE(*this, cit220_state, sod_w)) - - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(24553200, 1580, 0, 1320, 259, 0, 240) // dot clock guessed - MCFG_SCREEN_UPDATE_DEVICE("avdc", scn2674_device, screen_update) - - MCFG_DEVICE_ADD("avdc", SCN2674, 24553200 / 10) - MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("maincpu", I8085_RST65_LINE)) - MCFG_SCN2674_CHARACTER_WIDTH(10) - MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(cit220_state, draw_character) - MCFG_DEVICE_ADDRESS_MAP(0, char_map) - MCFG_DEVICE_ADDRESS_MAP(1, attr_map) - MCFG_VIDEO_SET_SCREEN("screen") +void cit220_state::cit220p(machine_config &config) +{ + I8085A(config, m_maincpu, 6000000); + m_maincpu->set_addrmap(AS_PROGRAM, &cit220_state::mem_map); + m_maincpu->set_addrmap(AS_IO, &cit220_state::io_map); + m_maincpu->out_sod_func().set(FUNC(cit220_state::sod_w)); + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(24553200, 1580, 0, 1320, 259, 0, 240); // dot clock guessed + m_screen->set_screen_update("avdc", FUNC(scn2674_device::screen_update)); + + scn2674_device &avdc(SCN2674(config, "avdc", 24553200 / 10)); + avdc.intr_callback().set_inputline(m_maincpu, I8085_RST65_LINE); + avdc.set_character_width(10); + avdc.set_display_callback(FUNC(cit220_state::draw_character)); + avdc.set_addrmap(0, &cit220_state::char_map); + avdc.set_addrmap(1, &cit220_state::attr_map); + avdc.set_screen(m_screen); scn2681_device &duart(SCN2681(config, "duart", 3686400)); duart.irq_cb().set_inputline("maincpu", I8085_RST55_LINE); duart.outport_cb().set("usart", FUNC(i8251_device::write_txc)).bit(3); // 9600 baud? duart.outport_cb().append("usart", FUNC(i8251_device::write_rxc)).bit(3); - MCFG_DEVICE_ADD("usart", I8251, 3000000) + I8251(config, "usart", 3000000); - MCFG_DEVICE_ADD("kbdmcu", I8035, 4608000) - MCFG_DEVICE_PROGRAM_MAP(keyboard_map) - MCFG_DEVICE_IO_MAP(kbd_io_map) -MACHINE_CONFIG_END + mcs48_cpu_device &kbdmcu(I8035(config, "kbdmcu", 4608000)); + kbdmcu.set_addrmap(AS_PROGRAM, &cit220_state::keyboard_map); + kbdmcu.set_addrmap(AS_IO, &cit220_state::kbd_io_map); +} ROM_START( cit220p ) diff --git a/src/mame/drivers/compucolor.cpp b/src/mame/drivers/compucolor.cpp index 1442e1b33c5..5e834e34369 100644 --- a/src/mame/drivers/compucolor.cpp +++ b/src/mame/drivers/compucolor.cpp @@ -409,12 +409,12 @@ MACHINE_CONFIG_START(compucolor2_state::compucolor2) MCFG_PALETTE_ADD_3BIT_RGB("palette") - MCFG_DEVICE_ADD(CRT5027_TAG, CRT5027, XTAL(17'971'200)/2/6) - MCFG_TMS9927_CHAR_WIDTH(6) - MCFG_TMS9927_VSYN_CALLBACK(WRITELINE("blink", ripple_counter_device, clock_w)) - MCFG_VIDEO_SET_SCREEN("screen") + CRT5027(config, m_vtac, XTAL(17'971'200)/2/6); + m_vtac->set_char_width(6); + m_vtac->vsyn_callback().set("blink", FUNC(ripple_counter_device::clock_w)); + m_vtac->set_screen("screen"); - ripple_counter_device &blink(RIPPLE_COUNTER(config, "blink", 0)); // 74LS393 at UG10 + ripple_counter_device &blink(RIPPLE_COUNTER(config, "blink")); // 74LS393 at UG10 blink.set_stages(8); blink.count_out_cb().set(m_mioc, FUNC(tms5501_device::sens_w)).bit(4); diff --git a/src/mame/drivers/coolpool.cpp b/src/mame/drivers/coolpool.cpp index 14a5efa1a9c..6167a3d461a 100644 --- a/src/mame/drivers/coolpool.cpp +++ b/src/mame/drivers/coolpool.cpp @@ -764,12 +764,12 @@ MACHINE_CONFIG_START(coolpool_state::coolpool) MCFG_TMS340X0_TO_SHIFTREG_CB(coolpool_state, to_shiftreg) /* write to shiftreg function */ MCFG_TMS340X0_FROM_SHIFTREG_CB(coolpool_state, from_shiftreg) /* read from shiftreg function */ - MCFG_DEVICE_ADD("dsp", TMS32026,XTAL(40'000'000)) - MCFG_DEVICE_PROGRAM_MAP(coolpool_dsp_pgm_map) - MCFG_DEVICE_IO_MAP(coolpool_dsp_io_map) - MCFG_TMS32025_BIO_IN_CB(READ16(*this, coolpool_state, dsp_bio_line_r)) - MCFG_TMS32025_HOLD_IN_CB(READ16(*this, coolpool_state, dsp_hold_line_r)) -// MCFG_TMS32025_HOLD_ACK_OUT_CB(WRITE16(*this, coolpool_state, dsp_HOLDA_signal_w)) + tms32026_device& dsp(TMS32026(config, m_dsp, XTAL(40'000'000))); + dsp.set_addrmap(AS_PROGRAM, &coolpool_state::coolpool_dsp_pgm_map); + dsp.set_addrmap(AS_IO, &coolpool_state::coolpool_dsp_io_map); + dsp.bio_in_cb().set(FUNC(coolpool_state::dsp_bio_line_r)); + dsp.hold_in_cb().set(FUNC(coolpool_state::dsp_hold_line_r)); +// dsp.hold_ack_out_cb().set(FUNC(coolpool_state::dsp_HOLDA_signal_w)); MCFG_GENERIC_LATCH_16_ADD("main2dsp") MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("dsp", 0)) /* ??? I have no idea who should generate this! */ @@ -805,8 +805,7 @@ MACHINE_CONFIG_START(coolpool_state::_9ballsht) MCFG_DEVICE_MODIFY("maincpu") MCFG_DEVICE_PROGRAM_MAP(nballsht_map) - MCFG_DEVICE_MODIFY("dsp") - MCFG_DEVICE_IO_MAP(nballsht_dsp_io_map) + subdevice<tms32026_device>("dsp")->set_addrmap(AS_IO, &coolpool_state::nballsht_dsp_io_map); MACHINE_CONFIG_END diff --git a/src/mame/drivers/crospang.cpp b/src/mame/drivers/crospang.cpp index c283edf52f6..c4033000661 100644 --- a/src/mame/drivers/crospang.cpp +++ b/src/mame/drivers/crospang.cpp @@ -379,7 +379,7 @@ static INPUT_PORTS_START( pitapat ) PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:6") PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") // this and the following dip might be difficulty related. By having one or both of them on, most of the times you win the first round without doing anything PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:8") diff --git a/src/mame/drivers/csplayh5.cpp b/src/mame/drivers/csplayh5.cpp index b5c43f9c7f5..f233c1b8dd6 100644 --- a/src/mame/drivers/csplayh5.cpp +++ b/src/mame/drivers/csplayh5.cpp @@ -50,7 +50,6 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_tmp68301(*this, "tmp68301"), - m_v9958(*this, "v9958"), m_nichisnd(*this, "nichisnd"), m_key(*this, "KEY.%u", 0), m_region_maincpu(*this, "maincpu") @@ -58,7 +57,6 @@ public: required_device<cpu_device> m_maincpu; required_device<tmp68301_device> m_tmp68301; - required_device<v9958_device> m_v9958; required_device<nichisnd_device> m_nichisnd; required_ioport_array<5> m_key; required_memory_region m_region_maincpu; @@ -139,7 +137,7 @@ void csplayh5_state::csplayh5_map(address_map &map) map(0x200200, 0x200201).rw(FUNC(csplayh5_state::csplayh5_mux_r), FUNC(csplayh5_state::csplayh5_mux_w)); map(0x200400, 0x200401).portr("SYSTEM"); - map(0x200600, 0x200607).rw(m_v9958, FUNC(v9958_device::read), FUNC(v9958_device::write)).umask16(0x00ff); + map(0x200600, 0x200607).rw("v9958", FUNC(v9958_device::read), FUNC(v9958_device::write)).umask16(0x00ff); map(0x800000, 0xbfffff).rom().region("blit_gfx", 0); // GFX ROM routes here @@ -385,9 +383,11 @@ MACHINE_CONFIG_START(csplayh5_state::csplayh5) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); /* video hardware */ - MCFG_V9958_ADD("v9958", "screen", 0x20000, XTAL(21'477'272)) // typical 9958 clock, not verified - MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(*this, csplayh5_state, csplayh5_vdp0_interrupt)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9958", XTAL(21'477'272)) + v9958_device &v9958(V9958(config, "v9958", XTAL(21'477'272))); // typical 9958 clock, not verified + v9958.set_screen_ntsc("screen"); + v9958.set_vram_size(0x20000); + v9958.int_cb().set(FUNC(csplayh5_state::csplayh5_vdp0_interrupt)); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ MCFG_NICHISND_ADD("nichisnd") diff --git a/src/mame/drivers/decstation.cpp b/src/mame/drivers/decstation.cpp index 5593bad0c25..f74e430c0b7 100644 --- a/src/mame/drivers/decstation.cpp +++ b/src/mame/drivers/decstation.cpp @@ -4,10 +4,10 @@ decstation.cpp: MIPS-based DECstation family - WANTED: all boot ROM dumps except 5000/133, all TURBOchannel card ROM dumps + WANTED: boot ROM dumps for KN02CA/KN04CA (MAXine) systems. - NOTE: after all the spew of failing tests (it really wants a VT102 terminal), - press 'q' at the MORE prompt and wait a few seconds for the PROM monitor to appear. + NOTE: after all the spew of failing tests, press 'q' at the MORE prompt and + wait a few seconds for the PROM monitor to appear. Type 'ls' for a list of commands (this is a very UNIX-flavored PROM monitor). Machine types: @@ -19,9 +19,9 @@ Ethernet: AMD7990 "LANCE" controller Monochrome or color video on-board PMIN/KN01: - Cheaper PMAX, 12.5 MHz R2000, same as PMAX + Cheaper PMAX, 12.5 MHz R2000, othersame as PMAX - Personal DECstation 5000/xx (MAXine/KN02BA): + Personal DECstation 5000/xx (MAXine/KN02CA for R3000, KN04CA? for R4000) 20, 25, or 33 MHz R3000 or 100 MHz R4000 40 MiB max RAM Serial: DEC "DZ" quad-UART for keyboard/mouse, SCC8530 for modem/printer @@ -31,7 +31,7 @@ Color 1024x768 8bpp video on-board 2 TURBOchannel slots - DECstation 5000/1xx: (3MIN/KN02DA): + DECstation 5000/1xx: (3MIN/KN02BA, KN04BA? for R4000): 20, 25, or 33 MHz R3000 or 100 MHz R4000 128 MiB max RAM Serial: 2x SCC8530 @@ -47,7 +47,7 @@ SCSI: NCR53C94 Ethernet: AMD7990 "LANCE" controllor - DECstation 5000/240, 5000/261 (3MAX+/KN03) + DECstation 5000/240 (3MAX+/KN03AA), 5000/260 (3MAX+/KN05) 40 MHz R3400, or 120 MHz R4400. 480 MiB max RAM Serial: 2x SCC8530 @@ -58,6 +58,7 @@ #include "emu.h" #include "cpu/mips/r3000.h" +#include "cpu/mips/mips3.h" #include "machine/decioga.h" #include "machine/mc146818.h" #include "machine/z80scc.h" @@ -65,7 +66,11 @@ #include "machine/nscsi_bus.h" #include "machine/nscsi_cd.h" #include "machine/nscsi_hd.h" +#include "machine/dec_lk201.h" +#include "machine/am79c90.h" #include "bus/rs232/rs232.h" +#include "screen.h" +#include "video/bt459.h" class decstation_state : public driver_device { @@ -73,19 +78,25 @@ public: decstation_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu"), + m_screen(*this, "screen"), + m_lk201(*this, "lk201"), m_ioga(*this, "ioga"), m_rtc(*this, "rtc"), m_scc0(*this, "scc0"), m_scc1(*this, "scc1"), - m_asc(*this, "scsibus:7:asc") + m_asc(*this, "scsibus:7:asc"), + m_vrom(*this, "gfx"), + m_bt459(*this, "bt459"), + m_lance(*this, "am79c90") { } - void kn02da(machine_config &config); + void kn02ba(machine_config &config); void init_decstation(); protected: DECLARE_READ_LINE_MEMBER(brcond0_r) { return ASSERT_LINE; } + DECLARE_WRITE_LINE_MEMBER(ioga_irq_w); DECLARE_READ32_MEMBER(cfb_r); DECLARE_WRITE32_MEMBER(cfb_w); @@ -95,65 +106,102 @@ protected: private: virtual void machine_start() override; virtual void machine_reset() override; + virtual void video_start() override; - required_device<cpu_device> m_maincpu; + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + required_device<r3041_device> m_maincpu; + required_device<screen_device> m_screen; + required_device<lk201_device> m_lk201; required_device<dec_ioga_device> m_ioga; required_device<mc146818_device> m_rtc; required_device<z80scc_device> m_scc0, m_scc1; required_device<ncr53c94_device> m_asc; + required_memory_region m_vrom; + required_device<bt459_device> m_bt459; + required_device<am79c90_device> m_lance; + + void threemin_map(address_map &map); - void decstation_map(address_map &map); + uint8_t *m_vrom_ptr; + uint32_t m_vram[0x200000/4]; + uint32_t m_sfb[0x80]; + int m_copy_src; }; /*************************************************************************** VIDEO HARDWARE ***************************************************************************/ +void decstation_state::video_start() +{ +} + +uint32_t decstation_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + m_bt459->screen_update(screen, bitmap, cliprect, (uint8_t *)&m_vram[0]); + return 0; +} + +/* + 0x100000 copy register 0 + 0x100004 copy register 1 + 0x100008 copy register 2 + 0x10000C copy register 3 + 0x100010 copy register 4 + 0x100014 copy register 5 + 0x100018 copy register 6 + 0x10001C copy register 7 + 0x100020 foreground register + 0x100024 background register + 0x100028 plane mask + 0x10002C pixel mask + 0x100030 cxt mode + 0x100034 boolean operation + 0x100038 pixel shift + 0x10003C line address + 0x100040 bresh 1 + 0x100044 bresh 2 + 0x100048 bresh 3 + 0x10004C bresh continue + 0x100050 deep register + 0x100054 start register + 0x100058 Clear Interrupt + 0x10005C reserved 2 + 0x100060 refresh count + 0x100064 video horiz + 0x100068 video vertical + 0x10006C refresh base + 0x100070 video valid + 0x100074 Interrupt Enable +*/ + +#define MODE_SIMPLE 0 +#define MODE_OPAQUESTIPPLE 1 +#define MODE_OPAQUELINE 2 +#define MODE_TRANSPARENTSTIPPLE 5 +#define MODE_TRANSPARENTLINE 6 +#define MODE_COPY 7 + READ32_MEMBER(decstation_state::cfb_r) { - static const char fwver[8] = "V5.3a "; - static const char fwvendor[8] = "DEC "; - static const char fwmodule[8] = "PMAG-BA"; - static const char fwtype[8] = "TCF0 "; - static const char fwinfo[8] = "CX - D8"; uint32_t addr = offset << 2; - logerror("cfb_r: reading at %x\n", addr); +// logerror("cfb_r: reading at %x\n", addr); - // attempt to fake the ROM ID bytes of a PMAG-BA - // color framebuffer card. doesn't work for unknown reasons. - if ((addr >= 0x3c0400) && (addr < 0x3c0420)) + if (addr < 0x800000) { - return fwver[(addr>>2)&0x7]; + return m_vrom_ptr[addr>>2] & 0xff; } - if ((addr >= 0x3c0420) && (addr < 0x3c0440)) - { - return fwvendor[(addr>>2)&0x7]; - } - if ((addr >= 0x3c0440) && (addr < 0x3c0460)) - { - return fwmodule[(addr>>2)&0x7]; - } - if ((addr >= 0x3c0460) && (addr < 0x3c0480)) - { - return fwtype[(addr>>2)&0x7]; - } - if ((addr >= 0x3c0480) && (addr < 0x3c04a0)) + + if ((addr >= 0x100000) && (addr < 0x100200)) { - return fwinfo[(addr>>2)&0x7]; + return m_sfb[offset-(0x100000/4)]; } - switch (addr) + if ((addr >= 0x200000) && (addr < 0x400000)) { - case 0x3c03e0: return 1; // ROM width - case 0x3c03e4: return 4; // ROM stride - case 0x3c03e8: return 1; // ROM size in 8 KiB units - case 0x3c03ec: return 1; // card address space in 4 MiB units - case 0x3c03f0: return 0x55555555; // TURBOchannel ID bytes - case 0x3c03f4: return 0x00000000; - case 0x3c03f8: return 0xaaaaaaaa; - case 0x3c03fc: return 0xffffffff; - case 0x3c0470: return 0; // does card support parity? + return m_vram[offset-(0x200000/4)]; } return 0xffffffff; @@ -161,30 +209,129 @@ READ32_MEMBER(decstation_state::cfb_r) WRITE32_MEMBER(decstation_state::cfb_w) { - logerror("cfb: %08x (mask %08x) @ %x\n", data, mem_mask, offset); + uint32_t addr = offset << 2; + + if ((addr >= 0x100000) && (addr < 0x100200)) + { + //printf("SFB: %08x (mask %08x) @ %x\n", data, mem_mask, offset<<2); + COMBINE_DATA(&m_sfb[offset-(0x100000/4)]); + + if ((addr == 0x100030) && (data = 7)) + { + m_copy_src = 1; + } + return; + } + + if ((addr >= 0x1c0000) && (addr < 0x200000)) + { + //printf("Bt459: %08x (mask %08x) @ %x\n", data, mem_mask, offset<<2); + return; + } + + if ((addr >= 0x200000) && (addr < 0x400000)) + { + //printf("FB: %08x (mask %08x) @ %x\n", data, mem_mask, offset<<2); + + switch (m_sfb[0x30/4]) + { + case MODE_SIMPLE: // simple + COMBINE_DATA(&m_vram[offset-(0x200000/4)]); + break; + + case MODE_TRANSPARENTSTIPPLE: + { + uint8_t *pVRAM = (uint8_t *)&m_vram[offset-(0x200000/4)]; + uint8_t fgs[4]; + + fgs[0] = m_sfb[0x20/4] >> 24; + fgs[1] = (m_sfb[0x20/4] >> 16) & 0xff; + fgs[2] = (m_sfb[0x20/4] >> 8) & 0xff; + fgs[3] = m_sfb[0x20/4] & 0xff; + for (int x = 0; x < 32; x++) + { + if (data & (1<<(31-x))) + { + pVRAM[x] = fgs[x & 3]; + } + } + } + break; + + case MODE_COPY: + { + uint8_t *pVRAM = (uint8_t *)&m_vram[offset-(0x200000/4)]; + uint8_t *pBuffer = (uint8_t *)&m_sfb[0]; // first 8 32-bit regs are the copy buffer + + if (m_copy_src) + { + m_copy_src = 0; + + for (int x = 0; x < 32; x++) + { + if (data & (1<<(31-x))) + { + pBuffer[x] = pVRAM[x]; + } + } + } + else + { + m_copy_src = 1; + + for (int x = 0; x < 32; x++) + { + if (data & (1<<(31-x))) + { + pVRAM[x] = pBuffer[x]; + } + } + } + } + break; + + default: + logerror("SFB: Unsupported VRAM write %08x (mask %08x) at %08x in mode %x\n", data, mem_mask, offset<<2, m_sfb[0x30/4]); + break; + } + return; + } } /*************************************************************************** MACHINE FUNCTIONS ***************************************************************************/ +WRITE_LINE_MEMBER(decstation_state::ioga_irq_w) +{ + // not sure this is correct + m_maincpu->set_input_line(R3000_IRQ3, state); +} + void decstation_state::machine_start() { + m_vrom_ptr = m_vrom->base(); + save_item(NAME(m_vram)); + save_item(NAME(m_sfb)); + save_item(NAME(m_copy_src)); } void decstation_state::machine_reset() { + m_copy_src = 1; } /*************************************************************************** ADDRESS MAPS ***************************************************************************/ -void decstation_state::decstation_map(address_map &map) +void decstation_state::threemin_map(address_map &map) { map(0x00000000, 0x07ffffff).ram(); // full 128 MB - map(0x10000000, 0x103cffff).rw(FUNC(decstation_state::cfb_r), FUNC(decstation_state::cfb_w)); + map(0x10000000, 0x13ffffff).rw(FUNC(decstation_state::cfb_r), FUNC(decstation_state::cfb_w)); + map(0x101c0000, 0x101c000f).m("bt459", FUNC(bt459_device::map)).umask32(0x000000ff); map(0x1c000000, 0x1c07ffff).m(m_ioga, FUNC(dec_ioga_device::map)); + map(0x1c0c0000, 0x1c0c0007).rw(m_lance, FUNC(am79c90_device::regs_r), FUNC(am79c90_device::regs_w)).umask32(0x0000ffff); map(0x1c100000, 0x1c100003).rw(m_scc0, FUNC(z80scc_device::ca_r), FUNC(z80scc_device::ca_w)).umask32(0x0000ff00); map(0x1c100004, 0x1c100007).rw(m_scc0, FUNC(z80scc_device::da_r), FUNC(z80scc_device::da_w)).umask32(0x0000ff00); map(0x1c100008, 0x1c10000b).rw(m_scc0, FUNC(z80scc_device::cb_r), FUNC(z80scc_device::cb_w)).umask32(0x0000ff00); @@ -216,35 +363,49 @@ static void dec_scsi_devices(device_slot_interface &device) device.option_add_internal("asc", NCR53C94); } -MACHINE_CONFIG_START(decstation_state::kn02da) +MACHINE_CONFIG_START(decstation_state::kn02ba) MCFG_DEVICE_ADD( "maincpu", R3041, 33000000 ) // FIXME: Should be R3000A MCFG_R3000_ENDIANNESS(ENDIANNESS_LITTLE) MCFG_R3000_BRCOND0_INPUT(READLINE(*this, decstation_state, brcond0_r)) - MCFG_DEVICE_PROGRAM_MAP( decstation_map ) + MCFG_DEVICE_PROGRAM_MAP( threemin_map ) + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(130000000, 1704, 32, (1280+32), 1064, 3, (1024+3)); + m_screen->set_screen_update(FUNC(decstation_state::screen_update)); - MCFG_DEVICE_ADD("ioga", DECSTATION_IOGA, XTAL(12'500'000)) + BT459(config, m_bt459, 83'020'800); - MCFG_DEVICE_ADD("rtc", MC146818, XTAL(32'768)) - MCFG_MC146818_IRQ_HANDLER(WRITELINE("ioga", dec_ioga_device, rtc_irq_w)) - MCFG_MC146818_BINARY(true) + AM79C90(config, m_lance, XTAL(12'500'000)); + m_lance->irq_out().set("ioga", FUNC(dec_ioga_device::lance_irq_w)); + + DECSTATION_IOGA(config, m_ioga, XTAL(12'500'000)); + m_ioga->irq_out().set(FUNC(decstation_state::ioga_irq_w)); + + MC146818(config, m_rtc, XTAL(32'768)); + m_rtc->irq().set("ioga", FUNC(dec_ioga_device::rtc_irq_w)); + m_rtc->set_binary(true); SCC85C30(config, m_scc0, XTAL(14'745'600)/2); - //m_scc0->out_int_callback().set("ioga", FUNC(dec_ioga_device::scc0_irq_w)); + m_scc0->out_int_callback().set("ioga", FUNC(dec_ioga_device::scc0_irq_w)); + m_scc0->out_txda_callback().set("rs232a", FUNC(rs232_port_device::write_txd)); + m_scc0->out_txdb_callback().set("rs232b", FUNC(rs232_port_device::write_txd)); SCC85C30(config, m_scc1, XTAL(14'745'600)/2); - //m_scc1->out_int_callback().set("ioga", FUNC(dec_ioga_device::scc1_irq_w)); - m_scc1->out_txda_callback().set("rs232a", FUNC(rs232_port_device::write_txd)); - m_scc1->out_txdb_callback().set("rs232b", FUNC(rs232_port_device::write_txd)); + m_scc1->out_int_callback().set("ioga", FUNC(dec_ioga_device::scc1_irq_w)); + m_scc1->out_txdb_callback().set("lk201", FUNC(lk201_device::rx_w)); - MCFG_DEVICE_ADD("rs232a", RS232_PORT, default_rs232_devices, "terminal") - MCFG_RS232_RXD_HANDLER(WRITELINE("scc1", z80scc_device, rxa_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE("scc1", z80scc_device, dcda_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("scc1", z80scc_device, ctsa_w)) + MCFG_DEVICE_ADD("lk201", LK201, 0) + MCFG_LK201_TX_HANDLER(WRITELINE("scc1", z80scc_device, rxb_w)) + + MCFG_DEVICE_ADD("rs232a", RS232_PORT, default_rs232_devices, nullptr) + MCFG_RS232_RXD_HANDLER(WRITELINE("scc0", z80scc_device, rxa_w)) + MCFG_RS232_DCD_HANDLER(WRITELINE("scc0", z80scc_device, dcda_w)) + MCFG_RS232_CTS_HANDLER(WRITELINE("scc0", z80scc_device, ctsa_w)) MCFG_DEVICE_ADD("rs232b", RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("scc1", z80scc_device, rxb_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE("scc1", z80scc_device, dcdb_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("scc1", z80scc_device, ctsb_w)) + MCFG_RS232_RXD_HANDLER(WRITELINE("scc0", z80scc_device, rxb_w)) + MCFG_RS232_DCD_HANDLER(WRITELINE("scc0", z80scc_device, dcdb_w)) + MCFG_RS232_CTS_HANDLER(WRITELINE("scc0", z80scc_device, ctsb_w)) MCFG_NSCSI_BUS_ADD("scsibus") MCFG_NSCSI_ADD("scsibus:0", dec_scsi_devices, "harddisk", false) @@ -275,8 +436,12 @@ void decstation_state::init_decstation() ROM_START( ds5k133 ) ROM_REGION32_LE( 0x40000, "user1", 0 ) + // 5.7j sx ROM_LOAD( "ds5000-133_005eb.bin", 0x000000, 0x040000, CRC(76a91d29) SHA1(140fcdb4fd2327daf764a35006d05fabfbee8da6) ) + + ROM_REGION32_LE( 0x20000, "gfx", 0 ) + ROM_LOAD( "pmagb-ba-rom.img", 0x000000, 0x020000, CRC(91f40ab0) SHA1(a39ce6ed52697a513f0fb2300a1a6cf9e2eabe33) ) ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1992, ds5k133, 0, 0, kn02da, decstation, decstation_state, init_decstation, "Digital Equipment Corporation", "DECstation 5000/133", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +COMP( 1992, ds5k133, 0, 0, kn02ba, decstation, decstation_state, init_decstation, "Digital Equipment Corporation", "DECstation 5000/133", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) diff --git a/src/mame/drivers/dps1.cpp b/src/mame/drivers/dps1.cpp index 271d72014c9..8d104b1fdc0 100644 --- a/src/mame/drivers/dps1.cpp +++ b/src/mame/drivers/dps1.cpp @@ -197,25 +197,25 @@ static void floppies(device_slot_interface &device) MACHINE_CONFIG_START(dps1_state::dps1) // basic machine hardware - MCFG_DEVICE_ADD("maincpu", Z80, 4000000) - MCFG_DEVICE_PROGRAM_MAP(mem_map) - MCFG_DEVICE_IO_MAP(io_map) + Z80(config, m_maincpu, 4000000); + m_maincpu->set_addrmap(AS_PROGRAM, &dps1_state::mem_map); + m_maincpu->set_addrmap(AS_IO, &dps1_state::io_map); + MCFG_MACHINE_RESET_OVERRIDE(dps1_state, dps1) /* video hardware */ - MCFG_DEVICE_ADD("uart", MC2661, XTAL(5'068'800)) - MCFG_MC2661_TXD_HANDLER(WRITELINE("rs232", rs232_port_device, write_txd)) - MCFG_MC2661_RTS_HANDLER(WRITELINE("rs232", rs232_port_device, write_rts)) - MCFG_MC2661_DTR_HANDLER(WRITELINE("rs232", rs232_port_device, write_dtr)) - - MCFG_DEVICE_ADD("rs232", RS232_PORT, default_rs232_devices, "terminal") - MCFG_RS232_RXD_HANDLER(WRITELINE("uart",mc2661_device,rx_w)) - MCFG_RS232_DSR_HANDLER(WRITELINE("uart",mc2661_device,dsr_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("uart",mc2661_device,cts_w)) - - MCFG_DEVICE_ADD("am9519a", AM9519, 0) - - MCFG_DEVICE_ADD("am9519b", AM9519, 0) + mc2661_device &uart(MC2661(config, "uart", XTAL(5'068'800))); + uart.txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); + uart.rts_handler().set("rs232", FUNC(rs232_port_device::write_rts)); + uart.dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr)); + + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal")); + rs232.rxd_handler().set(uart, FUNC(mc2661_device::rx_w)); + rs232.dsr_handler().set(uart, FUNC(mc2661_device::dsr_w)); + rs232.cts_handler().set(uart, FUNC(mc2661_device::cts_w)); + + AM9519(config, "am9519a", 0); + AM9519(config, "am9519b", 0); // floppy MCFG_UPD765A_ADD("fdc", false, true) diff --git a/src/mame/drivers/electron.cpp b/src/mame/drivers/electron.cpp index 478e46b954c..be07cc1b85e 100644 --- a/src/mame/drivers/electron.cpp +++ b/src/mame/drivers/electron.cpp @@ -113,7 +113,6 @@ INPUT_CHANGED_MEMBER(electron_state::trigger_reset) } static INPUT_PORTS_START( electron ) - PORT_START("LINE.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x92 | \\") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR('|') PORT_CHAR('\\') // on the real keyboard, this would be on the 1st row, the 3rd key after 0 PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("COPY") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHAR('[') PORT_CHAR(']') @@ -213,29 +212,29 @@ static INPUT_PORTS_START( electron64 ) INPUT_PORTS_END MACHINE_CONFIG_START(electron_state::electron) - MCFG_DEVICE_ADD( "maincpu", M6502, 16_MHz_XTAL/8 ) - MCFG_DEVICE_PROGRAM_MAP( electron_mem ) + M6502(config, m_maincpu, 16_MHz_XTAL / 8); + m_maincpu->set_addrmap(AS_PROGRAM, &electron_state::electron_mem); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256) - //MCFG_SCREEN_RAW_PARAMS(16_MHz_XTAL, 1024, 264, 264 + 640, 312, 31, 31 + 256) - MCFG_SCREEN_UPDATE_DRIVER(electron_state, screen_update_electron) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE) - MCFG_SCREEN_PALETTE("palette") + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256); + //m_screen->set_raw(16_MHz_XTAL, 1024, 264, 264 + 640, 312, 31, 31 + 256) + m_screen->set_screen_update(FUNC(electron_state::screen_update_electron)); + m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE); + m_screen->set_palette("palette"); - MCFG_PALETTE_ADD( "palette", 16 ) - MCFG_PALETTE_INIT_OWNER(electron_state, electron) + palette_device &palette(PALETTE(config, "palette", 16)); + palette.set_init(palette_init_delegate(FUNC(electron_state::palette_init_electron), this)); SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD( "beeper", BEEP, 300 ) - MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 ) + BEEP(config, m_beeper, 300); + m_beeper->add_route(ALL_OUTPUTS, "mono", 1.00); RAM(config, m_ram).set_default_size("32K"); - MCFG_CASSETTE_ADD( "cassette" ) - MCFG_CASSETTE_FORMATS(bbc_cassette_formats) - MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED) - MCFG_CASSETTE_INTERFACE("electron_cass") + CASSETTE(config, m_cassette); + m_cassette->set_formats(bbc_cassette_formats); + m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED); + m_cassette->set_interface("electron_cass"); /* expansion port */ MCFG_ELECTRON_EXPANSION_SLOT_ADD("exp", electron_expansion_devices, "plus3", false) @@ -243,36 +242,39 @@ MACHINE_CONFIG_START(electron_state::electron) MCFG_ELECTRON_EXPANSION_SLOT_NMI_HANDLER(INPUTLINE("maincpu", M6502_NMI_LINE)) /* software lists */ - MCFG_SOFTWARE_LIST_ADD("cass_list", "electron_cass") - MCFG_SOFTWARE_LIST_ADD("cart_list", "electron_cart") - MCFG_SOFTWARE_LIST_ADD("flop_list", "electron_flop") - MCFG_SOFTWARE_LIST_ADD("rom_list", "electron_rom") + SOFTWARE_LIST(config, "cass_list").set_original("electron_cass"); + SOFTWARE_LIST(config, "cart_list").set_original("electron_cart"); + SOFTWARE_LIST(config, "flop_list").set_original("electron_flop"); + SOFTWARE_LIST(config, "rom_list").set_original("electron_rom"); MACHINE_CONFIG_END MACHINE_CONFIG_START(electron_state::btm2105) electron(config); - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_COLOR(rgb_t::amber()) + + m_screen->set_color(rgb_t::amber()); /* expansion port */ MCFG_DEVICE_MODIFY("exp") MCFG_DEVICE_SLOT_INTERFACE(electron_expansion_devices, "m2105", true) /* software lists */ - MCFG_SOFTWARE_LIST_REMOVE("cass_list") + config.device_remove("cass_list"); + config.device_remove("cart_list"); + config.device_remove("flop_list"); + config.device_remove("rom_list"); MACHINE_CONFIG_END -MACHINE_CONFIG_START(electron_state::electron64) +void electron_state::electron64(machine_config &config) +{ electron(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(electron_mem) - MCFG_DEVICE_OPCODES_MAP(electron64_opcodes) + m_maincpu->set_addrmap(AS_PROGRAM, &electron_state::electron_mem); + m_maincpu->set_addrmap(AS_OPCODES, &electron_state::electron64_opcodes); m_ram->set_default_size("64K"); -MACHINE_CONFIG_END +} /* Electron Rom Load */ @@ -283,6 +285,14 @@ ROM_START(electron) ROM_LOAD( "basic.rom", 0x0000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281) ) ROM_END +ROM_START(electront) + ROM_REGION( 0x4000, "mos", 0 ) + /* Serial 06-ALA01-0000087 from Centre for Computing History */ + ROM_LOAD( "elk_036.rom", 0x0000, 0x4000, CRC(dd1a99c3) SHA1(87ee1b14895e476909dd002d5ca2346a3a5f3f57) ) + ROM_REGION( 0x4000, "basic", 0 ) + ROM_LOAD( "basic.rom", 0x0000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281) ) +ROM_END + ROM_START(electron64) ROM_REGION( 0x4000, "mos", 0 ) ROM_LOAD( "os_300.rom", 0x0000, 0x4000, CRC(f80a0cea) SHA1(165e42ff4164a842e56f08ebd420d5027af99fdd) ) @@ -295,5 +305,6 @@ ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ COMP ( 1983, electron, 0, 0, electron, electron, electron_state, empty_init, "Acorn", "Acorn Electron", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +COMP ( 1983, electront, electron, 0, electron, electron, electron_state, empty_init, "Acorn", "Acorn Electron (Trial)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) COMP ( 1985, btm2105, electron, 0, btm2105, electron, electron_state, empty_init, "British Telecom Business Systems", "BT Merlin M2105", MACHINE_NOT_WORKING ) COMP ( 1987, electron64, electron, 0, electron64, electron64, electron_state, empty_init, "Acorn/Slogger", "Acorn Electron (64K Master RAM Board)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/drivers/esripsys.cpp b/src/mame/drivers/esripsys.cpp index 792e963bbce..5adab44b8f0 100644 --- a/src/mame/drivers/esripsys.cpp +++ b/src/mame/drivers/esripsys.cpp @@ -512,7 +512,7 @@ READ8_MEMBER(esripsys_state::tms5220_r) if (offset == 0) { /* TMS5220 core returns status bits in D7-D6 */ - uint8_t status = m_tms->status_r(space, 0); + uint8_t status = m_tms->status_r(); status = ((status & 0x80) >> 5) | ((status & 0x40) >> 5) | ((status & 0x20) >> 5); return (m_tms->readyq_r() << 7) | (m_tms->intq_r() << 6) | status; @@ -527,7 +527,7 @@ WRITE8_MEMBER(esripsys_state::tms5220_w) if (offset == 0) { m_tms_data = data; - m_tms->data_w(space, 0, m_tms_data); + m_tms->data_w(m_tms_data); } #if 0 if (offset == 1) diff --git a/src/mame/drivers/exelv.cpp b/src/mame/drivers/exelv.cpp index a8a4ebc061c..2c3d425d1b0 100644 --- a/src/mame/drivers/exelv.cpp +++ b/src/mame/drivers/exelv.cpp @@ -359,9 +359,8 @@ WRITE8_MEMBER(exelv_state::tms7041_portc_w) */ READ8_MEMBER(exelv_state::tms7041_portd_r) { - uint8_t data = 0xff; - data=m_tms5220c->status_r(space, 0, data); - logerror("tms7041_portd_r\n"); + uint8_t data = m_tms5220c->status_r(); + logerror("tms7041_portd_r: data = 0x%02x\n", data); return data; } @@ -370,7 +369,7 @@ WRITE8_MEMBER(exelv_state::tms7041_portd_w) { logerror("tms7041_portd_w: data = 0x%02x\n", data); - m_tms5220c->data_w(space, 0, data); + m_tms5220c->data_w(data); m_tms7041_portd = data; } diff --git a/src/mame/drivers/fmtowns.cpp b/src/mame/drivers/fmtowns.cpp index 733cd5d8e7d..62681fb91b2 100644 --- a/src/mame/drivers/fmtowns.cpp +++ b/src/mame/drivers/fmtowns.cpp @@ -2842,22 +2842,22 @@ MACHINE_CONFIG_START(towns_state::towns_base) MCFG_FMSCSI_IRQ_HANDLER(WRITELINE(*this, towns_state, towns_scsi_irq)) MCFG_FMSCSI_DRQ_HANDLER(WRITELINE(*this, towns_state, towns_scsi_drq)) - MCFG_DEVICE_ADD("dma_1", UPD71071, 0) - MCFG_UPD71071_CPU("maincpu") - MCFG_UPD71071_CLOCK(4000000) - MCFG_UPD71071_DMA_READ_0_CB(READ16(*this, towns_state, towns_fdc_dma_r)) - MCFG_UPD71071_DMA_READ_1_CB(READ16(*this, towns_state, towns_scsi_dma_r)) - MCFG_UPD71071_DMA_READ_3_CB(READ16(*this, towns_state, towns_cdrom_dma_r)) - MCFG_UPD71071_DMA_WRITE_0_CB(WRITE16(*this, towns_state, towns_fdc_dma_w)) - MCFG_UPD71071_DMA_WRITE_1_CB(WRITE16(*this, towns_state, towns_scsi_dma_w)) - MCFG_DEVICE_ADD("dma_2", UPD71071, 0) - MCFG_UPD71071_CPU("maincpu") - MCFG_UPD71071_CLOCK(4000000) - MCFG_UPD71071_DMA_READ_0_CB(READ16(*this, towns_state, towns_fdc_dma_r)) - MCFG_UPD71071_DMA_READ_1_CB(READ16(*this, towns_state, towns_scsi_dma_r)) - MCFG_UPD71071_DMA_READ_3_CB(READ16(*this, towns_state, towns_cdrom_dma_r)) - MCFG_UPD71071_DMA_WRITE_0_CB(WRITE16(*this, towns_state, towns_fdc_dma_w)) - MCFG_UPD71071_DMA_WRITE_1_CB(WRITE16(*this, towns_state, towns_scsi_dma_w)) + UPD71071(config, m_dma[0], 0); + m_dma[0]->set_cpu_tag("maincpu"); + m_dma[0]->set_clock(4000000); + m_dma[0]->dma_read_callback<0>().set(FUNC(towns_state::towns_fdc_dma_r)); + m_dma[0]->dma_read_callback<1>().set(FUNC(towns_state::towns_scsi_dma_r)); + m_dma[0]->dma_read_callback<3>().set(FUNC(towns_state::towns_state::towns_cdrom_dma_r)); + m_dma[0]->dma_write_callback<0>().set(FUNC(towns_state::towns_fdc_dma_w)); + m_dma[0]->dma_write_callback<1>().set(FUNC(towns_state::towns_scsi_dma_w)); + UPD71071(config, m_dma[1], 0); + m_dma[1]->set_cpu_tag("maincpu"); + m_dma[1]->set_clock(4000000); + m_dma[1]->dma_read_callback<0>().set(FUNC(towns_state::towns_fdc_dma_r)); + m_dma[1]->dma_read_callback<1>().set(FUNC(towns_state::towns_scsi_dma_r)); + m_dma[1]->dma_read_callback<3>().set(FUNC(towns_state::towns_state::towns_cdrom_dma_r)); + m_dma[1]->dma_write_callback<0>().set(FUNC(towns_state::towns_fdc_dma_w)); + m_dma[1]->dma_write_callback<1>().set(FUNC(towns_state::towns_scsi_dma_w)); //MCFG_VIDEO_START_OVERRIDE(towns_state,towns) diff --git a/src/mame/drivers/fortecar.cpp b/src/mame/drivers/fortecar.cpp index 64e21f8c950..1309531ef47 100644 --- a/src/mame/drivers/fortecar.cpp +++ b/src/mame/drivers/fortecar.cpp @@ -710,7 +710,7 @@ MACHINE_CONFIG_START(fortecar_state::fortecar) fcppi0.in_pc_callback().set(FUNC(fortecar_state::ppi0_portc_r)); fcppi0.out_pc_callback().set(FUNC(fortecar_state::ppi0_portc_w)); - MCFG_V3021_ADD("rtc") + V3021(config, "rtc"); MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_fortecar) MCFG_PALETTE_ADD("palette", 0x200) diff --git a/src/mame/drivers/gal3.cpp b/src/mame/drivers/gal3.cpp index 4b9ee2e2f7a..002ae32e84c 100644 --- a/src/mame/drivers/gal3.cpp +++ b/src/mame/drivers/gal3.cpp @@ -127,8 +127,6 @@ better notes (complete chip lists) for each board still needed */ #include "emu.h" -#include "includes/namcos2.h" -#include "machine/namcoic.h" #include "cpu/m68000/m68000.h" #include "cpu/tms32025/tms32025.h" @@ -136,21 +134,28 @@ better notes (complete chip lists) for each board still needed #include "sound/c140.h" #include "rendlay.h" #include "speaker.h" +#include "video/namco_c355spr.h" +#define NAMCOS21_NUM_COLORS 0x8000 -class gal3_state : public namcos2_shared_state +class gal3_state : public driver_device { public: gal3_state(const machine_config &mconfig, device_type type, const char *tag) : - namcos2_shared_state(mconfig, type, tag) , + driver_device(mconfig, type, tag), + m_c355spr(*this, "c355spr"), + m_palette(*this, "palette"), m_rso_shared_ram(*this, "rso_shared_ram"), m_generic_paletteram_16(*this, "paletteram"), m_c140_16a(*this, "c140_16a"), - m_c140_16g(*this, "c140_16g") { } + m_c140_16g(*this, "c140_16g") + { } void gal3(machine_config &config); private: + required_device<namco_c355spr_device> m_c355spr; + required_device<palette_device> m_palette; uint16_t m_namcos21_video_enable; required_shared_ptr<uint16_t> m_rso_shared_ram; optional_shared_ptr<uint16_t> m_generic_paletteram_16; @@ -182,12 +187,6 @@ private: VIDEO_START_MEMBER(gal3_state,gal3) { m_generic_paletteram_16.allocate(0x10000); - - c355_obj_init( - 0, /* gfx bank */ - 0xf, /* reverse palette mapping */ - namcos2_shared_state::c355_obj_code2tile_delegate() ); - } /* FIXME: this code has simply been copypasted from namcos21.c @@ -228,14 +227,14 @@ uint32_t gal3_state::screen_update_gal3(screen_device &screen, bitmap_rgb32 &bit for( pri=0; pri<pivot; pri++ ) { - c355_obj_draw(screen, bitmap, cliprect, pri); + m_c355spr->draw(screen, bitmap, cliprect, pri); } /* CopyVisiblePolyFrameBuffer( bitmap, cliprect,0,0x7fbf ); for( pri=pivot; pri<15; pri++ ) { - c355_obj_draw(screen, bitmap, cliprect, pri); + m_c355spr->draw(screen, bitmap, cliprect, pri); }*/ // CPU Diag LEDs @@ -377,14 +376,14 @@ void gal3_state::cpu_slv_map(address_map &map) /// AM_RANGE(0xf1440000, 0xf1440003) AM_READWRITE(pointram_data_r,pointram_data_w) /// AM_RANGE(0x440002, 0x47ffff) AM_WRITENOP /* (frame buffer?) */ /// AM_RANGE(0xf1480000, 0xf14807ff) AM_READWRITE(namcos21_depthcue_r,namcos21_depthcue_w) - map(0xf1700000, 0xf170ffff).rw(FUNC(gal3_state::c355_obj_ram_r), FUNC(gal3_state::c355_obj_ram_w)).share("objram"); - map(0xf1720000, 0xf1720007).rw(FUNC(gal3_state::c355_obj_position_r), FUNC(gal3_state::c355_obj_position_w)); + map(0xf1700000, 0xf170ffff).rw(m_c355spr, FUNC(namco_c355spr_device::spriteram_r), FUNC(namco_c355spr_device::spriteram_w)).share("objram"); + map(0xf1720000, 0xf1720007).rw(m_c355spr, FUNC(namco_c355spr_device::position_r), FUNC(namco_c355spr_device::position_w)); map(0xf1740000, 0xf175ffff).rw(FUNC(gal3_state::paletteram32_r), FUNC(gal3_state::paletteram32_w)); map(0xf1760000, 0xf1760003).rw(FUNC(gal3_state::namcos21_video_enable_r), FUNC(gal3_state::namcos21_video_enable_w)); map(0xf2200000, 0xf220ffff).ram(); - map(0xf2700000, 0xf270ffff).ram(); //AM_READWRITE16(c355_obj_ram_r,c355_obj_ram_w,0xffffffff) AM_SHARE("objram") - map(0xf2720000, 0xf2720007).ram(); //AM_READWRITE16(c355_obj_position_r,c355_obj_position_w,0xffffffff) + map(0xf2700000, 0xf270ffff).ram(); //AM_READWRITE16(spriteram_r,spriteram_w,0xffffffff) AM_SHARE("objram") + map(0xf2720000, 0xf2720007).ram(); //AM_READWRITE16(position_r,position_w,0xffffffff) map(0xf2740000, 0xf275ffff).ram(); //AM_READWRITE(paletteram16_r,paletteram16_w) AM_SHARE("paletteram") map(0xf2760000, 0xf2760003).ram(); //AM_READWRITE(namcos21_video_enable_r,namcos21_video_enable_w) } @@ -654,6 +653,14 @@ MACHINE_CONFIG_START(gal3_state::gal3) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_namcos21) MCFG_PALETTE_ADD("palette", NAMCOS21_NUM_COLORS) + NAMCO_C355SPR(config, m_c355spr, 0); + m_c355spr->set_palette_tag("palette"); + m_c355spr->set_gfxdecode_tag("gfxdecode"); + m_c355spr->set_is_namcofl(false); + m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); + m_c355spr->set_palxor(0xf); // reverse mapping + m_c355spr->set_gfxregion(0); + MCFG_VIDEO_START_OVERRIDE(gal3_state,gal3) SPEAKER(config, "lspeaker").front_left(); diff --git a/src/mame/drivers/gamecube.cpp b/src/mame/drivers/gamecube.cpp index 72bc082176d..cf6884285c9 100644 --- a/src/mame/drivers/gamecube.cpp +++ b/src/mame/drivers/gamecube.cpp @@ -208,7 +208,7 @@ ROM_START( gceu ) // DOL-001(EUR) and DOL-101(EUR); PAL gamecube board, outputs ROM_DEFAULT_BIOS("v12") ROM_SYSTEM_BIOS(0, "v10", "PAL Revision 1.0") // Internal version 47 Sep 27 2001 15:15:22 ROMX_LOAD("ipl_pal_v10.bin", 0x000000, 0x200000, CRC(4f319f43) SHA1(f27c63e5394e2fd1606f70df004c4fc2d6027700), ROM_BIOS(0)) - // there might be an undumped "PAL Revision 1.1" IPL + // "PAL Revision 1.1" IPL probably doesn't exist; the internal version of "PAL Revision 1.0" lines up with "NTSC Revision 1.1" ROM_SYSTEM_BIOS(1, "v12", "PAL Revision 1.2") // Internal version 0x2301 Jun 16 2003 04:27:06 ROMX_LOAD("ipl_pal_v12.bin", 0x000000, 0x200000, CRC(ad1b7f16) SHA1(80b8744ff5e43585392f55546bd03a673d11ef5f), ROM_BIOS(1)) // not verified from console yet but seems good diff --git a/src/mame/drivers/goupil.cpp b/src/mame/drivers/goupil.cpp index 5a62a95acc2..8a6c47b2a73 100644 --- a/src/mame/drivers/goupil.cpp +++ b/src/mame/drivers/goupil.cpp @@ -174,7 +174,7 @@ void goupil_g1_state::device_timer(emu_timer &timer, device_timer_id id, int par m_scanline_timer->adjust(m_screen->time_until_pos(m_screen->vpos() + 10)); break; default: - assert_always(false, "Unknown id in goupil_g1_state::device_timer"); + throw emu_fatalerror("Unknown id in goupil_g1_state::device_timer"); } } diff --git a/src/mame/drivers/gticlub.cpp b/src/mame/drivers/gticlub.cpp index ec88a735c21..3bfd87943c9 100644 --- a/src/mame/drivers/gticlub.cpp +++ b/src/mame/drivers/gticlub.cpp @@ -1011,8 +1011,8 @@ MACHINE_CONFIG_START(gticlub_state::gticlub) MCFG_K001006_GFX_REGION("gfx1") MCFG_K001006_TEX_LAYOUT(1) - MCFG_K056800_ADD("k056800", XTAL(33'868'800)/2) - MCFG_K056800_INT_HANDLER(INPUTLINE("audiocpu", M68K_IRQ_2)) + K056800(config, m_k056800, XTAL(33'868'800)/2); + m_k056800->int_callback().set_inputline(m_audiocpu, M68K_IRQ_2); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -1130,8 +1130,8 @@ MACHINE_CONFIG_START(gticlub_state::hangplt) MCFG_K001604_ROZ_OFFSET(16384) MCFG_K001604_PALETTE("palette") - MCFG_K056800_ADD("k056800", XTAL(33'868'800)/2) - MCFG_K056800_INT_HANDLER(INPUTLINE("audiocpu", M68K_IRQ_2)) + K056800(config, m_k056800, XTAL(33'868'800)/2); + m_k056800->int_callback().set_inputline(m_audiocpu, M68K_IRQ_2); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); diff --git a/src/mame/drivers/hornet.cpp b/src/mame/drivers/hornet.cpp index 1c48d2258d0..ea88a965432 100644 --- a/src/mame/drivers/hornet.cpp +++ b/src/mame/drivers/hornet.cpp @@ -1067,145 +1067,133 @@ double hornet_state::adc12138_input_callback(uint8_t input) MACHINE_CONFIG_START(hornet_state::hornet) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", PPC403GA, XTAL(64'000'000)/2) /* PowerPC 403GA 32MHz */ - MCFG_DEVICE_PROGRAM_MAP(hornet_map) + PPC403GA(config, m_maincpu, XTAL(64'000'000) / 2); /* PowerPC 403GA 32MHz */ + m_maincpu->set_addrmap(AS_PROGRAM, &hornet_state::hornet_map); - MCFG_DEVICE_ADD("audiocpu", M68000, XTAL(64'000'000)/4) /* 16MHz */ - MCFG_DEVICE_PROGRAM_MAP(sound_memmap) + M68000(config, m_audiocpu, XTAL(64'000'000) / 4); /* 16MHz */ + m_audiocpu->set_addrmap(AS_PROGRAM, &hornet_state::sound_memmap); - MCFG_DEVICE_ADD("dsp", ADSP21062, XTAL(36'000'000)) - MCFG_SHARC_BOOT_MODE(BOOT_MODE_EPROM) - MCFG_DEVICE_DATA_MAP(sharc0_map) + ADSP21062(config, m_dsp, XTAL(36'000'000)); + m_dsp->set_boot_mode(adsp21062_device::BOOT_MODE_EPROM); + m_dsp->set_addrmap(AS_DATA, &hornet_state::sharc0_map); - MCFG_QUANTUM_TIME(attotime::from_hz(6000)) + config.m_minimum_quantum = attotime::from_hz(6000); WATCHDOG_TIMER(config, m_watchdog); // PCB description at top doesn't mention any EEPROM on the base board... // EEPROM_93C46_16BIT(config, "eeprom"); - MCFG_DEVICE_ADD("voodoo0", VOODOO_1, STD_VOODOO_1_CLOCK) - MCFG_VOODOO_FBMEM(2) - MCFG_VOODOO_TMUMEM(4,0) - MCFG_VOODOO_SCREEN_TAG("screen") - MCFG_VOODOO_CPU_TAG("dsp") - MCFG_VOODOO_VBLANK_CB(WRITELINE(*this, hornet_state,voodoo_vblank_0)) + VOODOO_1(config, m_voodoo[0], STD_VOODOO_1_CLOCK); + m_voodoo[0]->set_fbmem(2); + m_voodoo[0]->set_tmumem(4, 0); + m_voodoo[0]->set_screen_tag("screen"); + m_voodoo[0]->set_cpu_tag("dsp"); // ?? + m_voodoo[0]->vblank_callback().set(FUNC(hornet_state::voodoo_vblank_0)); K033906(config, "k033906_1", 0, "voodoo0"); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_SIZE(64*8, 48*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 48*8-1) - MCFG_SCREEN_UPDATE_DRIVER(hornet_state, screen_update) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + // Screeen size and timing is re-calculated later in voodoo card + screen.set_refresh_hz(60); + screen.set_size(64 * 8, 48 * 8); + screen.set_visarea(0, 64 * 8 - 1, 0, 48 * 8 - 1); + screen.set_screen_update(FUNC(hornet_state::screen_update)); - MCFG_PALETTE_ADD("palette", 65536) + PALETTE(config, "palette", 65536); - MCFG_K037122_ADD("k037122_1", "screen") - MCFG_K037122_PALETTE("palette") + K037122(config, m_k037122_1, 0); + m_k037122_1->set_screen("screen"); + m_k037122_1->set_palette("palette"); - MCFG_K056800_ADD("k056800", XTAL(16'934'400)) - MCFG_K056800_INT_HANDLER(INPUTLINE("audiocpu", M68K_IRQ_2)) + K056800(config, m_k056800, XTAL(16'934'400)); + m_k056800->int_callback().set_inputline(m_audiocpu, M68K_IRQ_2); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("rfsnd", RF5C400, XTAL(16'934'400)) // value from Guru readme, gives 44100 Hz sample rate - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + RF5C400(config, "rfsnd", XTAL(16'934'400)) // value from Guru readme, gives 44100 Hz sample rate + .add_route(0, "lspeaker", 1.0) + .add_route(1, "rspeaker", 1.0); - MCFG_DEVICE_ADD("m48t58", M48T58, 0) + M48T58(config, "m48t58", 0); ADC12138(config, m_adc12138, 0); m_adc12138->set_ipt_convert_callback(FUNC(hornet_state::adc12138_input_callback)); - MCFG_DEVICE_ADD("konppc", KONPPC, 0) - MCFG_KONPPC_CGBOARD_NUMBER(1) - MCFG_KONPPC_CGBOARD_TYPE(HORNET) + KONPPC(config, m_konppc, 0); + m_konppc->set_num_boards(1); + m_konppc->set_cbboard_type(konppc_device::CGBOARD_TYPE_HORNET); MACHINE_CONFIG_END MACHINE_CONFIG_START(hornet_state::hornet_2board) hornet(config); - MCFG_DEVICE_ADD("dsp2", ADSP21062, XTAL(36'000'000)) - MCFG_SHARC_BOOT_MODE(BOOT_MODE_EPROM) - MCFG_DEVICE_DATA_MAP(sharc1_map) + ADSP21062(config, m_dsp2, XTAL(36'000'000)); + m_dsp2->set_boot_mode(adsp21062_device::BOOT_MODE_EPROM); + m_dsp2->set_addrmap(AS_DATA, &hornet_state::sharc1_map); + m_k037122_1->set_screen("lscreen"); + m_k037122_1->set_palette("palette"); - MCFG_DEVICE_REMOVE("k037122_1") - MCFG_K037122_ADD("k037122_1", "lscreen") - MCFG_K037122_PALETTE("palette") + K037122(config, m_k037122_2, 0); + m_k037122_2->set_screen("rscreen"); + m_k037122_2->set_palette("palette"); - MCFG_K037122_ADD("k037122_2", "rscreen") - MCFG_K037122_PALETTE("palette") + m_voodoo[0]->set_screen_tag("lscreen"); - MCFG_DEVICE_REMOVE("voodoo0") - - MCFG_DEVICE_ADD("voodoo0", VOODOO_1, STD_VOODOO_1_CLOCK) - MCFG_VOODOO_FBMEM(2) - MCFG_VOODOO_TMUMEM(4,0) - MCFG_VOODOO_SCREEN_TAG("lscreen") - MCFG_VOODOO_CPU_TAG("dsp") - MCFG_VOODOO_VBLANK_CB(WRITELINE(*this, hornet_state,voodoo_vblank_0)) - - MCFG_DEVICE_ADD("voodoo1", VOODOO_1, STD_VOODOO_1_CLOCK) - MCFG_VOODOO_FBMEM(2) - MCFG_VOODOO_TMUMEM(4,0) - MCFG_VOODOO_SCREEN_TAG("rscreen") - MCFG_VOODOO_CPU_TAG("dsp2") - MCFG_VOODOO_VBLANK_CB(WRITELINE(*this, hornet_state,voodoo_vblank_1)) + VOODOO_1(config, m_voodoo[1], STD_VOODOO_1_CLOCK); + m_voodoo[1]->set_fbmem(2); + m_voodoo[1]->set_tmumem(4, 0); + m_voodoo[1]->set_screen_tag("rscreen"); + m_voodoo[1]->set_cpu_tag("dsp2"); // ?? + m_voodoo[1]->vblank_callback().set(FUNC(hornet_state::voodoo_vblank_1)); K033906(config, "k033906_2", 0, "voodoo1"); /* video hardware */ - MCFG_PALETTE_MODIFY("palette") - MCFG_PALETTE_ENTRIES(65536) - - MCFG_DEVICE_REMOVE("screen") - - MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_SIZE(512, 384) - MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) - MCFG_SCREEN_UPDATE_DRIVER(hornet_state, screen_update) - - MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_SIZE(512, 384) - MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) - MCFG_SCREEN_UPDATE_DRIVER(hornet_state, screen_update_rscreen) - - MCFG_DEVICE_REMOVE("konppc") - MCFG_DEVICE_ADD("konppc", KONPPC, 0) - MCFG_KONPPC_CGBOARD_NUMBER(2) - MCFG_KONPPC_CGBOARD_TYPE(HORNET) + config.device_remove("screen"); + + screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER)); + // Screeen size and timing is re-calculated later in voodoo card + lscreen.set_refresh_hz(60); + lscreen.set_size(512, 384); + lscreen.set_visarea(0, 512 - 1, 0, 384 - 1); + lscreen.set_screen_update(FUNC(hornet_state::screen_update)); + + screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER)); + // Screeen size and timing is re-calculated later in voodoo card + rscreen.set_refresh_hz(60); + rscreen.set_size(512, 384); + rscreen.set_visarea(0, 512 - 1, 0, 384 - 1); + rscreen.set_screen_update(FUNC(hornet_state::screen_update_rscreen)); + + m_konppc->set_num_boards(2); MACHINE_CONFIG_END MACHINE_CONFIG_START(hornet_state::terabrst) hornet(config); - MCFG_DEVICE_ADD("gn680", M68000, XTAL(32'000'000)/2) /* 16MHz */ - MCFG_DEVICE_PROGRAM_MAP(gn680_memmap) + M68000(config, m_gn680, XTAL(32'000'000) / 2); /* 16MHz */ + m_gn680->set_addrmap(AS_PROGRAM, &hornet_state::gn680_memmap); MACHINE_CONFIG_END MACHINE_CONFIG_START(hornet_state::hornet_2board_v2) hornet_2board(config); - MCFG_DEVICE_REMOVE("voodoo0") - MCFG_DEVICE_ADD("voodoo0", VOODOO_2, STD_VOODOO_2_CLOCK) - MCFG_VOODOO_FBMEM(2) - MCFG_VOODOO_TMUMEM(4,0) - MCFG_VOODOO_SCREEN_TAG("lscreen") - MCFG_VOODOO_CPU_TAG("dsp") - MCFG_VOODOO_VBLANK_CB(WRITELINE(*this, hornet_state,voodoo_vblank_0)) - - MCFG_DEVICE_REMOVE("voodoo1") - MCFG_DEVICE_ADD("voodoo1", VOODOO_2, STD_VOODOO_2_CLOCK) - MCFG_VOODOO_FBMEM(2) - MCFG_VOODOO_TMUMEM(4,0) - MCFG_VOODOO_SCREEN_TAG("rscreen") - MCFG_VOODOO_CPU_TAG("dsp2") - MCFG_VOODOO_VBLANK_CB(WRITELINE(*this, hornet_state,voodoo_vblank_1)) + VOODOO_2(config.replace(), m_voodoo[0], STD_VOODOO_2_CLOCK); + m_voodoo[0]->set_fbmem(2); + m_voodoo[0]->set_tmumem(4, 0); + m_voodoo[0]->set_screen_tag("lscreen"); + m_voodoo[0]->set_cpu_tag("dsp"); // ?? + m_voodoo[0]->vblank_callback().set(FUNC(hornet_state::voodoo_vblank_0)); + + VOODOO_2(config.replace(), m_voodoo[1], STD_VOODOO_2_CLOCK); + m_voodoo[1]->set_fbmem(2); + m_voodoo[1]->set_tmumem(4, 0); + m_voodoo[1]->set_screen_tag("rscreen"); + m_voodoo[1]->set_cpu_tag("dsp2"); // ?? + m_voodoo[1]->vblank_callback().set(FUNC(hornet_state::voodoo_vblank_1)); MACHINE_CONFIG_END void hornet_state::sscope2(machine_config &config) diff --git a/src/mame/drivers/hotstuff.cpp b/src/mame/drivers/hotstuff.cpp index 8f09949a8de..6bde0ec44ac 100644 --- a/src/mame/drivers/hotstuff.cpp +++ b/src/mame/drivers/hotstuff.cpp @@ -121,8 +121,8 @@ MACHINE_CONFIG_START(hotstuff_state::hotstuff) scc8530_device& scc2(SCC8530N(config, "scc2", 4915200)); scc2.out_int_callback().set_inputline(m_maincpu, M68K_IRQ_5); - MCFG_DEVICE_ADD("rtc", MC146818, XTAL(32'768)) - MCFG_MC146818_IRQ_HANDLER(INPUTLINE("maincpu", M68K_IRQ_1)) + MC146818(config, m_rtc, XTAL(32'768)); + m_rtc->irq().set_inputline("maincpu", M68K_IRQ_1); MACHINE_CONFIG_END diff --git a/src/mame/drivers/hx20.cpp b/src/mame/drivers/hx20.cpp index 2bc18ffd65a..d2eae4d7ca3 100644 --- a/src/mame/drivers/hx20.cpp +++ b/src/mame/drivers/hx20.cpp @@ -929,8 +929,9 @@ MACHINE_CONFIG_START(hx20_state::hx20) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) // devices - MCFG_DEVICE_ADD(MC146818_TAG, MC146818, 4.194304_MHz_XTAL) - MCFG_MC146818_IRQ_HANDLER(WRITELINE(*this, hx20_state, rtc_irq_w)) + MC146818(config, m_rtc, 4.194304_MHz_XTAL); + m_rtc->irq().set(FUNC(hx20_state::rtc_irq_w)); + MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr) MCFG_CASSETTE_ADD(CASSETTE_TAG) MCFG_EPSON_SIO_ADD("sio", "tf20") diff --git a/src/mame/drivers/idsa.cpp b/src/mame/drivers/idsa.cpp index 11b2bfcac01..d10be5f8c59 100644 --- a/src/mame/drivers/idsa.cpp +++ b/src/mame/drivers/idsa.cpp @@ -233,7 +233,7 @@ INPUT_PORTS_END // This came from pinmame, even though there's no spb640 chip READ8_MEMBER( idsa_state::portb0_r ) { - uint16_t data = m_speech->spb640_r(space, offset / 2); + uint16_t data = m_speech->spb640_r(offset / 2); return offset % 2 ? (uint8_t)(data >> 8) : (uint8_t)(data & 0xff); } diff --git a/src/mame/drivers/imds.cpp b/src/mame/drivers/imds.cpp deleted file mode 100644 index 6d1ea0c0416..00000000000 --- a/src/mame/drivers/imds.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Robbbert -/*************************************************************************** - - Intel Intellec MDS - - 28/06/2011 Skeleton driver. - -This is a prototyping machine, very complex and expensive. - -It does all i/o via uarts, that is TTY, paper-tape puncher, CRT terminal. -It also has proms which can be dynamically programmed to alter the machine -architecture, so internal ports change meaning mid-stream. (e.g. port 80). - -The code below is just a sample; it does not represent any aspect of the -real hardware. - -****************************************************************************/ - -#include "emu.h" -#include "cpu/i8085/i8085.h" -#include "machine/terminal.h" - - -class imds_state : public driver_device -{ -public: - imds_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_terminal(*this, "terminal") - { } - - void imds(machine_config &config); - -private: - DECLARE_READ8_MEMBER(term_r); - DECLARE_READ8_MEMBER(term_status_r); - void kbd_put(u8 data); - uint8_t m_term_data; - virtual void machine_reset() override; - void imds_io(address_map &map); - void imds_mem(address_map &map); - - required_device<cpu_device> m_maincpu; - required_device<generic_terminal_device> m_terminal; -}; - -READ8_MEMBER( imds_state::term_status_r ) -{ - uint8_t ret = m_term_data; - m_term_data = 0; - return ret; -} - -READ8_MEMBER( imds_state::term_r ) -{ - return (m_term_data) ? 0x21 : 0x20; -} - -void imds_state::imds_mem(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x1fff).rom(); - map(0x2000, 0xffff).ram(); -} - -void imds_state::imds_io(address_map &map) -{ - map.unmap_value_high(); - map.global_mask(0xff); -} - -/* Input ports */ -static INPUT_PORTS_START( imds ) -INPUT_PORTS_END - -void imds_state::kbd_put(u8 data) -{ - m_term_data = data; -} - -void imds_state::machine_reset() -{ - m_term_data = 0; -} - -MACHINE_CONFIG_START(imds_state::imds) - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", I8080, 4_MHz_XTAL) // no idea of clock. - MCFG_DEVICE_PROGRAM_MAP(imds_mem) - MCFG_DEVICE_IO_MAP(imds_io) - -// INS8250(config, "ins8250", 1843200); - - /* video hardware */ - MCFG_DEVICE_ADD(m_terminal, GENERIC_TERMINAL, 0) - MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(imds_state, kbd_put)) -MACHINE_CONFIG_END - -/* ROM definition */ -ROM_START( imds ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "a62_2716.bin", 0x0000, 0x0800, CRC(86a55b2f) SHA1(21033f7abb2c3e08028613e0c35ffecb703ff4f1)) - ROM_LOAD( "a51_2716.bin", 0x0800, 0x0800, CRC(ee55c448) SHA1(16c2f7e3b5baeb398adcc59603943910813e6a9b)) - ROM_LOAD( "a52_2716.bin", 0x1000, 0x0800, CRC(8db1b33e) SHA1(6fc5e438009636dd6d7185071b152b0491d3baeb)) - ROM_LOAD( "a53_2716.bin", 0x1800, 0x0800, CRC(01690f4f) SHA1(eadef30a3797f41e08d28e7691f8de44c0f3b8ea)) -ROM_END - -/* Driver */ - -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP( 1983, imds, 0, 0, imds, imds, imds_state, empty_init, "Intel", "Intellec MDS", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) diff --git a/src/mame/drivers/imds2.cpp b/src/mame/drivers/imds2.cpp index 09876e27c6d..b0f44b148c7 100644 --- a/src/mame/drivers/imds2.cpp +++ b/src/mame/drivers/imds2.cpp @@ -60,15 +60,6 @@ // // A3 8741 CPU @ 3.58 MHz // -// NOTE: -// Firmware running on PIO is NOT original because a dump is not available at the moment. -// Emulator runs a version of PIO firmware that was specifically developed by me to implement -// line printer output. -// -// TODO: -// - Find a dump of the original PIO firmware -// - Adjust speed of processors. Wait states are not accounted for yet. -// // Huge thanks to Dave Mabry for dumping IOC firmware, KB firmware and character generator. This driver would not // exist without his dumps. // (https://web.archive.org/web/20080509062332/http://www.s100-manuals.com/intel/IOC_iMDX_511_Upgrade.zip) @@ -88,27 +79,59 @@ // the content of floppy disk. #include "emu.h" -#include "includes/imds2.h" -#include "screen.h" -#include "speaker.h" +#include "machine/imds2ioc.h" + +#include "cpu/i8085/i8085.h" +#include "machine/74259.h" +#include "machine/i8251.h" +#include "machine/pit8253.h" +#include "machine/pic8259.h" +#include "bus/rs232/rs232.h" // CPU oscillator of IPC board: 8 MHz -#define IPC_XTAL_Y2 XTAL(8'000'000) +#define IPC_XTAL_Y2 8_MHz_XTAL // Y1 oscillator of IPC board: 19.6608 MHz -#define IPC_XTAL_Y1 XTAL(19'660'800) +#define IPC_XTAL_Y1 19.6608_MHz_XTAL + +class imds2_state : public driver_device +{ +public: + imds2_state(const machine_config &mconfig, device_type type, const char *tag); -// Main oscillator of IOC board: 22.032 MHz -#define IOC_XTAL_Y2 22032000 + void imds2(machine_config &config); -// FDC oscillator of IOC board: 8 MHz -#define IOC_XTAL_Y1 XTAL(8'000'000) +private: + DECLARE_READ8_MEMBER(ipc_mem_read); + DECLARE_WRITE8_MEMBER(ipc_mem_write); + DECLARE_WRITE8_MEMBER(ipc_control_w); + DECLARE_WRITE_LINE_MEMBER(ipc_intr_w); + DECLARE_READ8_MEMBER(ipcsyspic_r); + DECLARE_READ8_MEMBER(ipclocpic_r); + DECLARE_WRITE8_MEMBER(ipcsyspic_w); + DECLARE_WRITE8_MEMBER(ipclocpic_w); -// PIO oscillator: 6 MHz -#define IOC_XTAL_Y3 XTAL(6'000'000) + virtual void driver_start() override; -// Frequency of beeper -#define IOC_BEEP_FREQ 3300 + void ipc_io_map(address_map &map); + void ipc_mem_map(address_map &map); + + required_device<i8085a_cpu_device> m_ipccpu; + required_device<pic8259_device> m_ipcsyspic; + required_device<pic8259_device> m_ipclocpic; + required_device<pit8253_device> m_ipctimer; + required_device_array<i8251_device, 2> m_ipcusart; + required_device<ls259_device> m_ipcctrl; + required_device_array<rs232_port_device, 2> m_serial; + required_device<imds2ioc_device> m_ioc; + + std::vector<uint8_t> m_ipc_ram; + + bool in_ipc_rom(offs_t offset) const; + + // IPC ROM content + required_region_ptr<uint8_t> m_ipc_rom; +}; void imds2_state::ipc_mem_map(address_map &map) { @@ -118,85 +141,35 @@ void imds2_state::ipc_mem_map(address_map &map) void imds2_state::ipc_io_map(address_map &map) { map.unmap_value_low(); - map(0xc0, 0xc0).rw(FUNC(imds2_state::imds2_ipc_dbbout_r), FUNC(imds2_state::imds2_ipc_dbbin_data_w)); - map(0xc1, 0xc1).rw(FUNC(imds2_state::imds2_ipc_status_r), FUNC(imds2_state::imds2_ipc_dbbin_cmd_w)); + map(0xc0, 0xc1).rw(m_ioc, FUNC(imds2ioc_device::dbb_master_r), FUNC(imds2ioc_device::dbb_master_w)); map(0xf0, 0xf3).rw(m_ipctimer, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); - map(0xf4, 0xf4).rw(m_ipcusart0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf5, 0xf5).rw(m_ipcusart0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xf6, 0xf6).rw(m_ipcusart1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf7, 0xf7).rw(m_ipcusart1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xf8, 0xf9).rw(m_iocpio, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w)); - map(0xfa, 0xfb).rw(FUNC(imds2_state::imds2_ipclocpic_r), FUNC(imds2_state::imds2_ipclocpic_w)); - map(0xfc, 0xfd).rw(FUNC(imds2_state::imds2_ipcsyspic_r), FUNC(imds2_state::imds2_ipcsyspic_w)); - map(0xff, 0xff).w(FUNC(imds2_state::imds2_ipc_control_w)); -} - -void imds2_state::ioc_mem_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x1fff).rom(); - map(0x4000, 0x5fff).ram(); -} - -void imds2_state::ioc_io_map(address_map &map) -{ - map.unmap_value_high(); - map(0x00, 0x0f).w(FUNC(imds2_state::imds2_ioc_dbbout_w)); - map(0x20, 0x2f).w(FUNC(imds2_state::imds2_ioc_f0_w)); - map(0x30, 0x3f).w(FUNC(imds2_state::imds2_ioc_set_f1_w)); - map(0x40, 0x4f).w(FUNC(imds2_state::imds2_ioc_reset_f1_w)); - map(0x50, 0x5f).w(FUNC(imds2_state::imds2_start_timer_w)); - map(0x60, 0x6f).w(FUNC(imds2_state::imds2_miscout_w)); - map(0x80, 0x8f).r(FUNC(imds2_state::imds2_miscin_r)); - map(0x90, 0x9f).r(FUNC(imds2_state::imds2_kb_read)); - map(0xa0, 0xaf).r(FUNC(imds2_state::imds2_ioc_status_r)); - map(0xb0, 0xbf).r(FUNC(imds2_state::imds2_ioc_dbbin_r)); - map(0xc0, 0xcf).m(m_iocfdc, FUNC(i8271_device::map)); - map(0xd0, 0xdf).rw(m_ioccrtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); - map(0xe0, 0xef).rw(m_ioctimer, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); -// DMA controller range doesn't extend to 0xff because register 0xfd needs to be read as 0xff -// This register is used by IOC firmware to detect DMA controller model (either 8237 or 8257) - map(0xf0, 0xf8).rw(m_iocdma, FUNC(i8257_device::read), FUNC(i8257_device::write)); + map(0xf4, 0xf4).rw(m_ipcusart[0], FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); + map(0xf5, 0xf5).rw(m_ipcusart[0], FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf6, 0xf6).rw(m_ipcusart[1], FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); + map(0xf7, 0xf7).rw(m_ipcusart[1], FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf8, 0xf9).rw(m_ioc, FUNC(imds2ioc_device::pio_master_r), FUNC(imds2ioc_device::pio_master_w)); + map(0xfa, 0xfb).rw(FUNC(imds2_state::ipclocpic_r), FUNC(imds2_state::ipclocpic_w)); + map(0xfc, 0xfd).rw(FUNC(imds2_state::ipcsyspic_r), FUNC(imds2_state::ipcsyspic_w)); + map(0xff, 0xff).w(FUNC(imds2_state::ipc_control_w)); } imds2_state::imds2_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig , type , tag), - m_ipccpu(*this , "ipccpu"), - m_ipcsyspic(*this , "ipcsyspic"), - m_ipclocpic(*this , "ipclocpic"), - m_ipctimer(*this , "ipctimer"), - m_ipcusart0(*this , "ipcusart0"), - m_ipcusart1(*this , "ipcusart1"), - m_serial0(*this , "serial0"), - m_serial1(*this , "serial1"), - m_ioccpu(*this , "ioccpu"), - m_iocdma(*this , "iocdma"), - m_ioccrtc(*this , "ioccrtc"), - m_iocbeep(*this , "iocbeep"), - m_ioctimer(*this , "ioctimer"), - m_iocfdc(*this , "iocfdc"), - m_flop0(*this, "iocfdc:0"), - m_iocpio(*this , "iocpio"), - m_kbcpu(*this , "kbcpu"), - m_palette(*this , "palette"), - m_gfxdecode(*this, "gfxdecode"), - m_centronics(*this , "centronics"), - m_io_key0(*this , "KEY0"), - m_io_key1(*this , "KEY1"), - m_io_key2(*this , "KEY2"), - m_io_key3(*this , "KEY3"), - m_io_key4(*this , "KEY4"), - m_io_key5(*this , "KEY5"), - m_io_key6(*this , "KEY6"), - m_io_key7(*this , "KEY7"), - m_ioc_options(*this , "IOC_OPTS"), - m_device_status_byte(0xff) + driver_device(mconfig, type, tag), + m_ipccpu(*this, "ipccpu"), + m_ipcsyspic(*this, "ipcsyspic"), + m_ipclocpic(*this, "ipclocpic"), + m_ipctimer(*this, "ipctimer"), + m_ipcusart(*this, "ipcusart%u", 0U), + m_ipcctrl(*this, "ipcctrl"), + m_serial(*this, "serial%u", 0U), + m_ioc(*this, "ioc"), + m_ipc_rom(*this, "ipcrom") { } READ8_MEMBER(imds2_state::ipc_mem_read) { - if (imds2_in_ipc_rom(offset)) { + if (in_ipc_rom(offset)) { return m_ipc_rom[ (offset & 0x07ff) | ((offset & 0x1000) >> 1) ]; } else { return m_ipc_ram[ offset ]; @@ -205,410 +178,63 @@ READ8_MEMBER(imds2_state::ipc_mem_read) WRITE8_MEMBER(imds2_state::ipc_mem_write) { - if (!imds2_in_ipc_rom(offset)) { + if (!in_ipc_rom(offset)) { m_ipc_ram[ offset ] = data; } } -WRITE8_MEMBER(imds2_state::imds2_ipc_control_w) +WRITE8_MEMBER(imds2_state::ipc_control_w) { // See A84, pg 28 of [1] // b3 is ~(bit to be written) // b2-b0 is ~(no. of bit to be written) - uint8_t mask = (1U << (~data & 0x07)); - - if (BIT(data , 3)) { - m_ipc_control &= ~mask; - } else { - m_ipc_control |= mask; - } -} - -WRITE_LINE_MEMBER(imds2_state::imds2_ipc_intr) -{ - m_ipccpu->set_input_line(I8085_INTR_LINE , (state != 0) && BIT(m_ipc_control , 2)); -} - -READ8_MEMBER(imds2_state::imds2_ipcsyspic_r) -{ - return m_ipcsyspic->read(space , offset == 0); -} - -READ8_MEMBER(imds2_state::imds2_ipclocpic_r) -{ - return m_ipclocpic->read(space , offset == 0); -} - -WRITE8_MEMBER(imds2_state::imds2_ipcsyspic_w) -{ - m_ipcsyspic->write(space , offset == 0 , data); -} - -WRITE8_MEMBER(imds2_state::imds2_ipclocpic_w) -{ - m_ipclocpic->write(space , offset == 0 , data); -} - -WRITE_LINE_MEMBER(imds2_state::imds2_baud_clk_0_w) -{ - m_ipcusart0->write_txc(state); - m_ipcusart0->write_rxc(state); -} - -WRITE_LINE_MEMBER(imds2_state::imds2_baud_clk_1_w) -{ - m_ipcusart1->write_txc(state); - m_ipcusart1->write_rxc(state); + m_ipcctrl->write_bit(~data & 7, BIT(~data, 3)); } -WRITE8_MEMBER(imds2_state::imds2_miscout_w) +WRITE_LINE_MEMBER(imds2_state::ipc_intr_w) { - m_miscout = data; - imds2_update_beeper(); - // Send INTR to IPC - m_ipclocpic->ir6_w(BIT(m_miscout , 1)); + m_ipccpu->set_input_line(I8085_INTR_LINE, (state != 0) && m_ipcctrl->q2_r()); } -READ8_MEMBER(imds2_state::imds2_miscin_r) +READ8_MEMBER(imds2_state::ipcsyspic_r) { - uint8_t res = m_ioc_options->read(); - return res | ((m_beeper_timer == 0) << 2); + return m_ipcsyspic->read(space, !BIT(offset, 0)); } -WRITE_LINE_MEMBER(imds2_state::imds2_beep_timer_w) +READ8_MEMBER(imds2_state::ipclocpic_r) { - m_beeper_timer = state; - imds2_update_beeper(); + return m_ipclocpic->read(space, !BIT(offset, 0)); } -WRITE8_MEMBER(imds2_state::imds2_start_timer_w) +WRITE8_MEMBER(imds2_state::ipcsyspic_w) { - // Trigger timer 2 of ioctimer - m_ioctimer->write_gate2(0); - m_ioctimer->write_gate2(1); + m_ipcsyspic->write(space, !BIT(offset, 0), data); } -READ8_MEMBER(imds2_state::imds2_kb_read) +WRITE8_MEMBER(imds2_state::ipclocpic_w) { - return m_kbcpu->upi41_master_r(space , (offset & 2) >> 1); -} - -READ8_MEMBER(imds2_state::imds2_kb_port_p2_r) -{ - if ((m_kb_p1 & 3) == 0) { - // Row selected - // Row number is encoded on bits P15..P12, they are "backwards" (P15 is LSB) and keyboard rows are encoded starting with value 2 on these bits (see A4, pg 56 of [1]) - unsigned row = (m_kb_p1 >> 2) & 0x0f; - ioport_value data; - - switch (row) { - case 4: - // Row 0 - data = m_io_key0->read(); - break; - - case 12: - // Row 1 - data = m_io_key1->read(); - break; - - case 2: - // Row 2 - data = m_io_key2->read(); - break; - - case 10: - // Row 3 - data = m_io_key3->read(); - break; - - case 6: - // Row 4 - data = m_io_key4->read(); - break; - - case 14: - // Row 5 - data = m_io_key5->read(); - break; - - case 1: - // Row 6 - data = m_io_key6->read(); - break; - - case 9: - // Row 7 - data = m_io_key7->read(); - break; - - default: - data = 0xff; - break; - } - return data & 0xff; - } else { - // No row selected - return 0xff; - } -} - -WRITE8_MEMBER(imds2_state::imds2_kb_port_p1_w) -{ - m_kb_p1 = data; -} - -READ_LINE_MEMBER(imds2_state::imds2_kb_port_t0_r) -{ - // T0 tied low - // It appears to be some kind of strapping option on kb hw - return 0; -} - -READ_LINE_MEMBER(imds2_state::imds2_kb_port_t1_r) -{ - // T1 tied low - // It appears to be some kind of strapping option on kb hw - return 0; -} - -WRITE8_MEMBER(imds2_state::imds2_ioc_dbbout_w) -{ - m_ioc_obf = ~data; - // Set/reset OBF flag (b0) - m_ipc_ioc_status = ((offset & 1) == 0) | (m_ipc_ioc_status & ~0x01); -} - -WRITE8_MEMBER(imds2_state::imds2_ioc_f0_w) -{ - // Set/reset F0 flag (b2) - m_ipc_ioc_status = ((offset & 1) << 2) | (m_ipc_ioc_status & ~0x04); -} - -WRITE8_MEMBER(imds2_state::imds2_ioc_set_f1_w) -{ - // Set F1 flag (b3) - m_ipc_ioc_status |= 0x08; -} - -WRITE8_MEMBER(imds2_state::imds2_ioc_reset_f1_w) -{ - // Reset F1 flag (b3) - m_ipc_ioc_status &= ~0x08; -} - -READ8_MEMBER(imds2_state::imds2_ioc_status_r) -{ - return ~m_ipc_ioc_status; -} - -READ8_MEMBER(imds2_state::imds2_ioc_dbbin_r) -{ - // Reset IBF flag (b1) - m_ipc_ioc_status &= ~0x02; - return ~m_ioc_ibf; -} - -READ8_MEMBER(imds2_state::imds2_ipc_dbbout_r) -{ - // Reset OBF flag (b0) - m_ipc_ioc_status &= ~0x01; - return m_ioc_obf; -} - -READ8_MEMBER(imds2_state::imds2_ipc_status_r) -{ - return m_ipc_ioc_status; -} - -WRITE8_MEMBER(imds2_state::imds2_ipc_dbbin_data_w) -{ - // Set IBF flag (b1) - m_ipc_ioc_status |= 0x02; - // Reset F1 flag (b3) - m_ipc_ioc_status &= ~0x08; - m_ioc_ibf = data; -} - -WRITE8_MEMBER(imds2_state::imds2_ipc_dbbin_cmd_w) -{ - // Set IBF flag (b1) - m_ipc_ioc_status |= 0x02; - // Set F1 flag (b3) - m_ipc_ioc_status |= 0x08; - m_ioc_ibf = data; -} - -WRITE_LINE_MEMBER(imds2_state::imds2_hrq_w) -{ - // Should be propagated to HOLD input of IOC CPU - m_iocdma->hlda_w(state); -} - -READ8_MEMBER(imds2_state::imds2_ioc_mem_r) -{ - address_space& prog_space = m_ioccpu->space(AS_PROGRAM); - return prog_space.read_byte(offset); -} - -WRITE8_MEMBER(imds2_state::imds2_ioc_mem_w) -{ - address_space& prog_space = m_ioccpu->space(AS_PROGRAM); - return prog_space.write_byte(offset , data); -} - -READ8_MEMBER(imds2_state::imds2_pio_port_p1_r) -{ - // If STATUS ENABLE/ == 0 return inverted device status byte, else return 0xff - // STATUS ENABLE/ == 0 when P23-P20 == 12 & P24 == 0 & P25 = 1 & P26 = 1 - if ((m_pio_port2 & 0x7f) == 0x6c) { - return ~m_device_status_byte; - } else { - return 0xff; -} -} - -WRITE8_MEMBER(imds2_state::imds2_pio_port_p1_w) -{ - m_pio_port1 = data; - imds2_update_printer(); -} - -READ8_MEMBER(imds2_state::imds2_pio_port_p2_r) -{ - return m_pio_port2; -} - -WRITE8_MEMBER(imds2_state::imds2_pio_port_p2_w) -{ - m_pio_port2 = data; - imds2_update_printer(); - // Send INTR to IPC - m_ipclocpic->ir5_w(BIT(data , 7)); -} - -WRITE_LINE_MEMBER(imds2_state::imds2_pio_lpt_ack_w) -{ - if (state) { - m_device_status_byte |= 0x20; - } else { - m_device_status_byte &= ~0x20; - } -} - -WRITE_LINE_MEMBER(imds2_state::imds2_pio_lpt_busy_w) -{ - // Busy is active high in centronics_device whereas it's active low in MDS - if (!state) { - m_device_status_byte |= 0x10; - } else { - m_device_status_byte &= ~0x10; - } -} - -WRITE_LINE_MEMBER(imds2_state::imds2_pio_lpt_select_w) -{ - if (state) { - m_device_status_byte |= 0x40; - } else { - m_device_status_byte &= ~0x40; - } -} - -I8275_DRAW_CHARACTER_MEMBER(imds2_state::crtc_display_pixels) -{ - unsigned i; - const rgb_t *palette = m_palette->palette()->entry_list_raw(); - uint8_t chargen_byte = m_chargen[ (linecount & 7) | ((unsigned)charcode << 3) ]; - uint16_t pixels; - - if (lten) { - pixels = ~0; - } else if (vsp != 0 || (linecount & 8) != 0) { - pixels = 0; // VSP is gated with LC3 - } else { - // See [2], pg 58 for the very peculiar way of generating character images - // Here each half-pixel is translated into a full pixel - uint16_t exp_pix_l; - uint16_t exp_pix_r; - - exp_pix_l = (uint16_t)chargen_byte; - exp_pix_l = ((exp_pix_l & 0x80) << 5) | - ((exp_pix_l & 0x40) << 4) | - ((exp_pix_l & 0x20) << 3) | - ((exp_pix_l & 0x10) << 2) | - ((exp_pix_l & 0x08) << 1) | - (exp_pix_l & 0x04); - exp_pix_l |= (exp_pix_l << 1); - exp_pix_r = exp_pix_l; - - // Layout of exp_pix_l/r: - // Bit # : F E D C B A 9 8 7 6 5 4 3 2 1 0 - // Bit of chargen_byte: 0 0 b7 b7 b6 b6 b5 b5 b4 b4 b3 b3 b2 b2 0 0 - if ((chargen_byte & 2) == 0) { - exp_pix_l >>= 1; - } - exp_pix_l &= 0x3fc0; - - if ((chargen_byte & 1) == 0) { - exp_pix_r >>= 1; - } - exp_pix_r &= 0x003e; - - pixels = exp_pix_l | exp_pix_r; - } - - if (rvv) { - pixels = ~pixels; - } - - for (i = 0; i < 14; i++) { - bitmap.pix32(y, x + i) = palette[ (pixels & (1U << (13 - i))) != 0 ]; - } + m_ipclocpic->write(space, !BIT(offset, 0), data); } void imds2_state::driver_start() { // Allocate 64k for IPC RAM m_ipc_ram.resize(0x10000); - - memory_region *ipcrom = memregion("ipcrom"); - if (ipcrom == nullptr) { - fatalerror("Unable to find IPC ROM region\n"); - } else { - m_ipc_rom = ipcrom->base(); - } -} - -void imds2_state::machine_start() -{ - m_iocfdc->set_ready_line_connected(true); } -void imds2_state::video_start() -{ - m_chargen = memregion("gfx1")->base(); -} - -void imds2_state::machine_reset() -{ - m_ipc_control = 0x00; - m_ipc_ioc_status = 0x0f; - - m_iocfdc->set_rate(500000); // The IMD images show a rate of 500kbps -} - -bool imds2_state::imds2_in_ipc_rom(offs_t offset) const +bool imds2_state::in_ipc_rom(offs_t offset) const { offs_t masked_offset = offset & 0xf800; + bool start_up = m_ipcctrl->q5_r(); + bool sel_boot = m_ipcctrl->q3_r(); // Region 0000-07ff is in ROM when START_UP/ == 0 && SEL_BOOT/ == 0 - if (masked_offset == 0x0000 && (m_ipc_control & 0x28) == 0) { + if (masked_offset == 0x0000 && !start_up && !sel_boot) { return true; } // Region e800-efff is in ROM when SEL_BOOT/ == 0 - if (masked_offset == 0xe800 && (m_ipc_control & 0x08) == 0) { + if (masked_offset == 0xe800 && !sel_boot) { return true; } @@ -620,308 +246,80 @@ bool imds2_state::imds2_in_ipc_rom(offs_t offset) const return false; } -void imds2_state::imds2_update_beeper(void) -{ - m_iocbeep->set_state(m_beeper_timer == 0 && BIT(m_miscout , 0) == 0); -} - -void imds2_state::imds2_update_printer(void) -{ - // Data to printer is ~P1 when STATUS ENABLE/==1, else 0xff (assuming pull-ups on printer) - uint8_t printer_data; - if ((m_pio_port2 & 0x7f) == 0x6c) { - printer_data = 0xff; - } else { - printer_data = ~m_pio_port1; - } - m_centronics->write_data0(BIT(printer_data , 0)); - m_centronics->write_data1(BIT(printer_data , 1)); - m_centronics->write_data2(BIT(printer_data , 2)); - m_centronics->write_data3(BIT(printer_data , 3)); - m_centronics->write_data4(BIT(printer_data , 4)); - m_centronics->write_data5(BIT(printer_data , 5)); - m_centronics->write_data6(BIT(printer_data , 6)); - m_centronics->write_data7(BIT(printer_data , 7)); - - // LPT DATA STROBE/ == 0 when P23-P20 == 9 & P24 == 0 - m_centronics->write_strobe((m_pio_port2 & 0x1f) != 0x09); -} - static INPUT_PORTS_START(imds2) - // See [1], pg 56 for key matrix layout - // See [1], pg 57 for keyboard layout - PORT_START("KEY0") - PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') // OK - PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR('@') PORT_CHAR('`') // OK - PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') // OK - PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) // OK - PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') // OK - PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(':') PORT_CHAR('*') // OK - PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') // OK - PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') // OK - - PORT_START("KEY1") - PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') // OK - PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') // OK - PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') // OK - PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') // OK - PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_UNUSED) - PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') // OK - PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') // OK - PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') // OK - - PORT_START("KEY2") - PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('~') // OK - PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') // OK - PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') // OK - PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') // OK - PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') // OK - PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') // OK - PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') // OK - PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(';') PORT_CHAR('+') // OK - - PORT_START("KEY3") - PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') // OK - PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') // OK - PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') // OK - PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') // OK - PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') // OK - PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') // OK - PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') // OK - PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') // OK - - PORT_START("KEY4") - PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') // OK - PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') // OK - PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') // OK - PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') // OK - PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') // OK - PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') // OK - PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') // OK - PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') // OK - - PORT_START("KEY5") - PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') // OK - PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') // OK - PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') // OK - PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') // OK - PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') // OK - PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') // OK - PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') // OK - PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') // OK - - PORT_START("KEY6") - PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) // BS - PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME)) // OK - PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('\\') PORT_CHAR('|') // OK - PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) // OK - PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) // OK - PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) // OK - PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') // OK - PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) // OK - - PORT_START("KEY7") - PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) // OK - PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) // OK - PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('_') PORT_CHAR('^') // OK - PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // OK - PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) // OK - PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) - PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_UNUSED) - PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_UNUSED) - - // Options on IOC: see [1], pg 40 - PORT_START("IOC_OPTS") - PORT_DIPNAME(0x80 , 0x80 , "Keyboard present") - PORT_DIPSETTING(0x80 , DEF_STR(Yes)) - PORT_DIPSETTING(0x00 , DEF_STR(No)) - PORT_DIPNAME(0x28 , 0x00 , "IOC mode") - PORT_DIPSETTING(0x00 , "On line") - PORT_DIPSETTING(0x08 , "Local") - PORT_DIPSETTING(0x20 , "Diagnostic") - PORT_DIPNAME(0x02 , 0x00 , "Floppy present") - PORT_DIPSETTING(0x02 , DEF_STR(Yes)) - PORT_DIPSETTING(0x00 , DEF_STR(No)) - PORT_DIPNAME(0x01 , 0x01 , "CRT frame frequency") - PORT_DIPSETTING(0x01 , "50 Hz") - PORT_DIPSETTING(0x00 , "60 Hz") INPUT_PORTS_END -static GFXLAYOUT_RAW(imds2_charlayout , 8 , 8 , 8 , 64) - -static GFXDECODE_START(gfx_imds2) - GFXDECODE_ENTRY("gfx1" , 0x0000 , imds2_charlayout , 0 , 1) -GFXDECODE_END - -static void imds2_floppies(device_slot_interface &device) -{ - device.option_add("8sssd", FLOPPY_8_SSSD); +void imds2_state::imds2(machine_config &config) +{ + I8085A(config, m_ipccpu, IPC_XTAL_Y2); // CLK OUT = 4 MHz + m_ipccpu->set_addrmap(AS_PROGRAM, &imds2_state::ipc_mem_map); + m_ipccpu->set_addrmap(AS_IO, &imds2_state::ipc_io_map); + m_ipccpu->set_irq_acknowledge_callback("ipcsyspic", FUNC(pic8259_device::inta_cb)); + //MCFG_QUANTUM_TIME(attotime::from_hz(100)) + + PIC8259(config, m_ipcsyspic, 0); + m_ipcsyspic->out_int_callback().set(FUNC(imds2_state::ipc_intr_w)); + m_ipcsyspic->in_sp_callback().set_constant(1); + + PIC8259(config, m_ipclocpic, 0); + m_ipclocpic->out_int_callback().set(m_ipcsyspic, FUNC(pic8259_device::ir7_w)); + m_ipclocpic->in_sp_callback().set_constant(1); + + PIT8253(config, m_ipctimer, 0); + m_ipctimer->set_clk<0>(IPC_XTAL_Y1 / 16); + m_ipctimer->set_clk<1>(IPC_XTAL_Y1 / 16); + m_ipctimer->set_clk<2>(IPC_XTAL_Y1 / 16); + m_ipctimer->out_handler<0>().set(m_ipcusart[0], FUNC(i8251_device::write_txc)); + m_ipctimer->out_handler<0>().append(m_ipcusart[0], FUNC(i8251_device::write_rxc)); + m_ipctimer->out_handler<1>().set(m_ipcusart[1], FUNC(i8251_device::write_txc)); + m_ipctimer->out_handler<1>().append(m_ipcusart[1], FUNC(i8251_device::write_rxc)); + m_ipctimer->out_handler<2>().set(m_ipclocpic, FUNC(pic8259_device::ir4_w)); + + I8251(config, m_ipcusart[0], IPC_XTAL_Y1 / 9); + m_ipcusart[0]->rts_handler().set(m_ipcusart[0], FUNC(i8251_device::write_cts)); + m_ipcusart[0]->rxrdy_handler().set(m_ipclocpic, FUNC(pic8259_device::ir0_w)); + m_ipcusart[0]->txrdy_handler().set(m_ipclocpic, FUNC(pic8259_device::ir1_w)); + m_ipcusart[0]->txd_handler().set(m_serial[0], FUNC(rs232_port_device::write_txd)); + + I8251(config, m_ipcusart[1], IPC_XTAL_Y1 / 9); + m_ipcusart[1]->rxrdy_handler().set(m_ipclocpic, FUNC(pic8259_device::ir2_w)); + m_ipcusart[1]->txrdy_handler().set(m_ipclocpic, FUNC(pic8259_device::ir3_w)); + m_ipcusart[1]->txd_handler().set(m_serial[1], FUNC(rs232_port_device::write_txd)); + m_ipcusart[1]->rts_handler().set(m_serial[1], FUNC(rs232_port_device::write_rts)); + m_ipcusart[1]->dtr_handler().set(m_serial[1], FUNC(rs232_port_device::write_dtr)); + + LS259(config, m_ipcctrl); // A84 + + RS232_PORT(config, m_serial[0], default_rs232_devices, nullptr); + m_serial[0]->rxd_handler().set(m_ipcusart[0], FUNC(i8251_device::write_rxd)); + m_serial[0]->dsr_handler().set(m_ipcusart[0], FUNC(i8251_device::write_dsr)); + + RS232_PORT(config, m_serial[1], default_rs232_devices, nullptr); + m_serial[1]->rxd_handler().set(m_ipcusart[1], FUNC(i8251_device::write_rxd)); + m_serial[1]->cts_handler().set(m_ipcusart[1], FUNC(i8251_device::write_cts)); + m_serial[1]->dsr_handler().set(m_ipcusart[1], FUNC(i8251_device::write_dsr)); + + IMDS2IOC(config, m_ioc); + m_ioc->master_intr_cb().set(m_ipclocpic, FUNC(pic8259_device::ir6_w)); + m_ioc->parallel_int_cb().set(m_ipclocpic, FUNC(pic8259_device::ir5_w)); } -MACHINE_CONFIG_START(imds2_state::imds2) - MCFG_DEVICE_ADD("ipccpu" , I8085A , IPC_XTAL_Y2 / 2) // 4 MHz - MCFG_DEVICE_PROGRAM_MAP(ipc_mem_map) - MCFG_DEVICE_IO_MAP(ipc_io_map) - MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("ipcsyspic" , pic8259_device , inta_cb) - MCFG_QUANTUM_TIME(attotime::from_hz(100)) - - MCFG_DEVICE_ADD("ipcsyspic", PIC8259, 0) - MCFG_PIC8259_OUT_INT_CB(WRITELINE(*this, imds2_state, imds2_ipc_intr)) - MCFG_PIC8259_IN_SP_CB(CONSTANT(1)) - - MCFG_DEVICE_ADD("ipclocpic", PIC8259, 0) - MCFG_PIC8259_OUT_INT_CB(WRITELINE("ipcsyspic", pic8259_device, ir7_w)) - MCFG_PIC8259_IN_SP_CB(CONSTANT(1)) // ??? - - MCFG_DEVICE_ADD("ipctimer" , PIT8253 , 0) - MCFG_PIT8253_CLK0(IPC_XTAL_Y1 / 16) - MCFG_PIT8253_CLK1(IPC_XTAL_Y1 / 16) - MCFG_PIT8253_CLK2(IPC_XTAL_Y1 / 16) - MCFG_PIT8253_OUT0_HANDLER(WRITELINE(*this, imds2_state , imds2_baud_clk_0_w)) - MCFG_PIT8253_OUT1_HANDLER(WRITELINE(*this, imds2_state , imds2_baud_clk_1_w)) - MCFG_PIT8253_OUT2_HANDLER(WRITELINE("ipclocpic" , pic8259_device , ir4_w)) - - I8251(config , m_ipcusart0 , 0); - m_ipcusart0->rts_handler().set("ipcusart0" , FUNC(i8251_device::write_cts)); - m_ipcusart0->rxrdy_handler().set("ipclocpic" , FUNC(pic8259_device::ir0_w)); - m_ipcusart0->txrdy_handler().set("ipclocpic" , FUNC(pic8259_device::ir1_w)); - m_ipcusart0->txd_handler().set("serial0" , FUNC(rs232_port_device::write_txd)); - - I8251(config , m_ipcusart1 , 0); - m_ipcusart1->rxrdy_handler().set("ipclocpic" , FUNC(pic8259_device::ir2_w)); - m_ipcusart1->txrdy_handler().set("ipclocpic" , FUNC(pic8259_device::ir3_w)); - m_ipcusart1->txd_handler().set("serial1" , FUNC(rs232_port_device::write_txd)); - m_ipcusart1->rts_handler().set("serial1" , FUNC(rs232_port_device::write_rts)); - m_ipcusart1->dtr_handler().set("serial1" , FUNC(rs232_port_device::write_dtr)); - - MCFG_DEVICE_ADD("serial0" , RS232_PORT, default_rs232_devices , nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("ipcusart0" , i8251_device , write_rxd)) - MCFG_RS232_DSR_HANDLER(WRITELINE("ipcusart0" , i8251_device , write_dsr)) - - MCFG_DEVICE_ADD("serial1" , RS232_PORT, default_rs232_devices , nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("ipcusart1" , i8251_device , write_rxd)) - MCFG_RS232_CTS_HANDLER(WRITELINE("ipcusart1" , i8251_device , write_cts)) - MCFG_RS232_DSR_HANDLER(WRITELINE("ipcusart1" , i8251_device , write_dsr)) - - MCFG_DEVICE_ADD("ioccpu" , I8080A , IOC_XTAL_Y2 / 18) // 2.448 MHz but running at 50% (due to wait states & DMA usage of bus) - MCFG_DEVICE_PROGRAM_MAP(ioc_mem_map) - MCFG_DEVICE_IO_MAP(ioc_io_map) - MCFG_QUANTUM_TIME(attotime::from_hz(100)) - - // The IOC CRT hw is a bit complex, as the character clock (CCLK) to i8275 - // is varied according to the part of the video frame being scanned and according to - // the 50/60 Hz option jumper (W8). - // The basic clock (BCLK) runs at 22.032 MHz. - // CCLK = BCLK / 14 when in the active region of video - // CCLK = BCLK / 12 when in horizontal retrace (HRTC=1) - // CCLK = BCLK / 10 when in horizontal retrace of "short scan lines" (50 Hz only) - // - // ***** 50 Hz timings ***** - // 80 chars/row, 26 chars/h. retrace, 11 scan lines/row, 25 active rows, 3 vertical retrace rows - // Scan line: 80 chars * 14 BCLK + 26 chars * 12 BCLK = 1432 BCLK (64.996 usec) - // Scan row: 11 * scan lines = 15752 BCLK (714.960 usec) - // "Short" scan line: 80 chars * 14 BCLK + 26 chars * 10 BCLK = 1380 BCLK (62.636 usec) - // Frame: 28 scan rows (8 scan lines of 27th row are short): 27 * scan row + 3 * scan line + 8 * short scan line: 440640 BCLK (20 msec) - // - // ***** 60 Hz timings ***** - // 80 chars/row, 20 chars/h. retrace, 10 scan lines/row, 25 active rows, 2 vertical retrace rows - // Scan line: 80 chars * 14 BCLK + 20 chars * 12 BCLK = 1360 BCLK (61.728 usec) - // Scan row: 10 * scan lines = 13600 BCLK (617.284 usec) - // Frame: 27 scan rows : 367200 BCLK (16.667 msec) - // - // Clock here is semi-bogus: it gives the correct frame frequency at 50 Hz (with the incorrect - // assumption that CCLK is fixed at BCLK / 14) - MCFG_DEVICE_ADD("ioccrtc" , I8275 , 22853600 / 14) - MCFG_I8275_CHARACTER_WIDTH(14) - MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(imds2_state , crtc_display_pixels) - MCFG_I8275_DRQ_CALLBACK(WRITELINE(m_iocdma , i8257_device , dreq2_w)) - MCFG_I8275_IRQ_CALLBACK(INPUTLINE("ioccpu" , I8085_INTR_LINE)) - MCFG_VIDEO_SET_SCREEN("screen") - - MCFG_SCREEN_ADD("screen" , RASTER) - MCFG_SCREEN_UPDATE_DEVICE("ioccrtc" , i8275_device , screen_update) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_DEVICE_ADD("gfxdecode" , GFXDECODE, "palette" , gfx_imds2) - MCFG_PALETTE_ADD_MONOCHROME("palette") - - SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("iocbeep" , BEEP , IOC_BEEP_FREQ) - MCFG_SOUND_ROUTE(ALL_OUTPUTS , "mono" , 1.00) - - I8257(config , m_iocdma , IOC_XTAL_Y2 / 9); - m_iocdma->out_hrq_cb().set(FUNC(imds2_state::imds2_hrq_w)); - m_iocdma->in_memr_cb().set(FUNC(imds2_state::imds2_ioc_mem_r)); - m_iocdma->out_memw_cb().set(FUNC(imds2_state::imds2_ioc_mem_w)); - m_iocdma->in_ior_cb<1>().set("iocfdc" , FUNC(i8271_device::data_r)); - m_iocdma->out_iow_cb<1>().set("iocfdc" , FUNC(i8271_device::data_w)); - m_iocdma->out_iow_cb<2>().set("ioccrtc" , FUNC(i8275_device::dack_w)); - - MCFG_DEVICE_ADD("ioctimer" , PIT8253 , 0) - MCFG_PIT8253_CLK0(IOC_XTAL_Y1 / 4) - MCFG_PIT8253_OUT0_HANDLER(WRITELINE("ioctimer" , pit8253_device , write_clk2)); - MCFG_PIT8253_OUT2_HANDLER(WRITELINE(*this, imds2_state , imds2_beep_timer_w)); - - I8271(config, m_iocfdc, IOC_XTAL_Y1 / 2); - m_iocfdc->drq_wr_callback().set(m_iocdma, FUNC(i8257_device::dreq1_w)); - MCFG_FLOPPY_DRIVE_ADD("iocfdc:0", imds2_floppies, "8sssd", floppy_image_device::default_floppy_formats) - MCFG_SLOT_FIXED(true) - - MCFG_DEVICE_ADD("iocpio" , I8041 , IOC_XTAL_Y3) - MCFG_MCS48_PORT_P1_IN_CB(READ8(*this, imds2_state, imds2_pio_port_p1_r)) - MCFG_MCS48_PORT_P1_OUT_CB(WRITE8(*this, imds2_state, imds2_pio_port_p1_w)) - MCFG_MCS48_PORT_P2_IN_CB(READ8(*this, imds2_state, imds2_pio_port_p2_r)) - MCFG_MCS48_PORT_P2_OUT_CB(WRITE8(*this, imds2_state, imds2_pio_port_p2_w)) - MCFG_QUANTUM_TIME(attotime::from_hz(100)) - - MCFG_DEVICE_ADD("kbcpu", I8741, XTAL(3'579'545)) /* 3.579545 MHz */ - MCFG_MCS48_PORT_P1_OUT_CB(WRITE8(*this, imds2_state, imds2_kb_port_p1_w)) - MCFG_MCS48_PORT_P2_IN_CB(READ8(*this, imds2_state, imds2_kb_port_p2_r)) - MCFG_MCS48_PORT_T0_IN_CB(READLINE(*this, imds2_state, imds2_kb_port_t0_r)) - MCFG_MCS48_PORT_T1_IN_CB(READLINE(*this, imds2_state, imds2_kb_port_t1_r)) - MCFG_QUANTUM_TIME(attotime::from_hz(100)) - - MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer") - MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, imds2_state , imds2_pio_lpt_ack_w)) - MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, imds2_state , imds2_pio_lpt_busy_w)) - MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, imds2_state , imds2_pio_lpt_select_w)) -MACHINE_CONFIG_END - ROM_START(imds2) - // ROM definition of IPC cpu (8085A) - ROM_REGION(0x1000 , "ipcrom" , 0) - ROM_DEFAULT_BIOS("mon13") - // 1x2732 Copyright 1979 - ROM_SYSTEM_BIOS(0, "mon13", "Series II Monitor v1.3") - ROMX_LOAD("ipc13_a82.bin" , 0x0000 , 0x1000 , CRC(0889394f) SHA1(b7525baf1884a7d67402dea4b5566016a9861ef2), ROM_BIOS(0)) - // 2x2716 Copyright 1978 - ROM_SYSTEM_BIOS(1, "mon12", "Series II Monitor v1.2") - ROMX_LOAD("ipc12_a57.bin" , 0x0000 , 0x0800 , CRC(6496efaf) SHA1(1a9c0f1b19c1807803db3f1543f51349d7fd693a), ROM_BIOS(1)) - ROMX_LOAD("ipc12_a48.bin" , 0x0800 , 0x0800 , CRC(258dc9a6) SHA1(3fde993aee06d9af5093d7a2d9a8cbd71fed0951), ROM_BIOS(1)) - // 2x2716 Copyright 1977 - ROM_SYSTEM_BIOS(2, "mon11", "Series II Monitor v1.1") - ROMX_LOAD("ipc11_a57.bin" , 0x0000 , 0x0800 , CRC(ffb7c036) SHA1(6f60cdfe20621c4b633c972adcb644a1c02eaa39), ROM_BIOS(2)) - ROMX_LOAD("ipc11_a48.bin" , 0x0800 , 0x0800 , CRC(3696ff28) SHA1(38b435e10a81629430275aec051fb0a55ec1f6fd), ROM_BIOS(2)) - - // ROM definition of IOC cpu (8080A) - ROM_REGION(0x2000 , "ioccpu" , 0) - ROM_LOAD("ioc_a50.bin" , 0x0000 , 0x0800 , CRC(d9f926a1) SHA1(bd9d0f7458acc2806120a6dbaab9c48be315b060)) - ROM_LOAD("ioc_a51.bin" , 0x0800 , 0x0800 , CRC(6aa2f86c) SHA1(d3a5314d86e3366545b4c97b29e323dfab383d5f)) - ROM_LOAD("ioc_a52.bin" , 0x1000 , 0x0800 , CRC(b88a38d5) SHA1(934716a1daec852f4d1f846510f42408df0c9584)) - ROM_LOAD("ioc_a53.bin" , 0x1800 , 0x0800 , CRC(c8df4bb9) SHA1(2dfb921e94ae7033a7182457b2f00657674d1b77)) - - // ROM definition of PIO controller (8041A) - // For the time being a specially developed PIO firmware is used until a dump of the original PIO is - // available. - ROM_REGION(0x400 , "iocpio" , 0) - ROM_LOAD("pio_a72.bin" , 0 , 0x400 , BAD_DUMP CRC(8c8e740b) SHA1(9b9333a9dc9585aa8f630721d13e551a5c87defc)) - - // ROM definition of keyboard controller (8741) - ROM_REGION(0x400 , "kbcpu" , 0) - ROM_LOAD("kbd511.bin" , 0 , 0x400 , CRC(ba7c4303) SHA1(19899af732d0ae1247bfc79979b1ee5f339ee5cf)) - // ROM definition of character generator (2708, A19 on IOC) - ROM_REGION(0x400 , "gfx1" , 0) - ROM_LOAD ("ioc_a19.bin" , 0x0000 , 0x0400 , CRC(47487d0f) SHA1(0ed98f9f06622949ee3cc2ffc572fb9702db0f81)) + // ROM definition of IPC cpu (8085A) + ROM_REGION(0x1000, "ipcrom", 0) + ROM_DEFAULT_BIOS("mon13") + // 1x2732 Copyright 1979 + ROM_SYSTEM_BIOS(0, "mon13", "Series II Monitor v1.3") + ROMX_LOAD("ipc13_a82.bin", 0x0000, 0x1000, CRC(0889394f) SHA1(b7525baf1884a7d67402dea4b5566016a9861ef2), ROM_BIOS(0)) + // 2x2716 Copyright 1978 + ROM_SYSTEM_BIOS(1, "mon12", "Series II Monitor v1.2") + ROMX_LOAD("ipc12_a57.bin", 0x0000, 0x0800, CRC(6496efaf) SHA1(1a9c0f1b19c1807803db3f1543f51349d7fd693a), ROM_BIOS(1)) + ROMX_LOAD("ipc12_a48.bin", 0x0800, 0x0800, CRC(258dc9a6) SHA1(3fde993aee06d9af5093d7a2d9a8cbd71fed0951), ROM_BIOS(1)) + // 2x2716 Copyright 1977 + ROM_SYSTEM_BIOS(2, "mon11", "Series II Monitor v1.1") + ROMX_LOAD("ipc11_a57.bin", 0x0000, 0x0800, CRC(ffb7c036) SHA1(6f60cdfe20621c4b633c972adcb644a1c02eaa39), ROM_BIOS(2)) + ROMX_LOAD("ipc11_a48.bin", 0x0800, 0x0800, CRC(3696ff28) SHA1(38b435e10a81629430275aec051fb0a55ec1f6fd), ROM_BIOS(2)) ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */ -COMP( 1979, imds2, 0, 0, imds2, imds2, imds2_state, empty_init, "Intel", "Intellec MDS-II" , 0) +COMP( 1979, imds2, 0, 0, imds2, imds2, imds2_state, empty_init, "Intel", "Intellec MDS-II", 0) diff --git a/src/mame/drivers/interpro.cpp b/src/mame/drivers/interpro.cpp index 760a648c8cf..3f8dfe1d4a1 100644 --- a/src/mame/drivers/interpro.cpp +++ b/src/mame/drivers/interpro.cpp @@ -813,7 +813,7 @@ void interpro_state::interpro(machine_config &config) // real-time clock/non-volatile memory MC146818(config, m_rtc, 32.768_kHz_XTAL); m_rtc->set_use_utc(true); - m_rtc->irq_callback().set(m_ioga, FUNC(interpro_ioga_device::ir9_w)); + m_rtc->irq().set(m_ioga, FUNC(interpro_ioga_device::ir9_w)); // scsi bus and devices NSCSI_BUS(config, m_scsibus, 0); diff --git a/src/mame/drivers/intv.cpp b/src/mame/drivers/intv.cpp index e174f85742f..8a57a061247 100644 --- a/src/mame/drivers/intv.cpp +++ b/src/mame/drivers/intv.cpp @@ -556,10 +556,13 @@ MACHINE_CONFIG_START(intv_state::intvkbd) MCFG_PALETTE_INIT_OWNER(intv_state, intv) /* crt controller */ - MCFG_DEVICE_ADD("crtc", TMS9927, XTAL(7'159'090)/8) - MCFG_TMS9927_CHAR_WIDTH(8) - MCFG_TMS9927_OVERSCAN(stic_device::OVERSCAN_LEFT_WIDTH*stic_device::X_SCALE*INTVKBD_X_SCALE, stic_device::OVERSCAN_RIGHT_WIDTH*stic_device::X_SCALE*INTVKBD_X_SCALE, - stic_device::OVERSCAN_TOP_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE, stic_device::OVERSCAN_BOTTOM_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE) + TMS9927(config, m_crtc, XTAL(7'159'090)/8); + m_crtc->set_char_width(8); + m_crtc->set_overscan( + stic_device::OVERSCAN_LEFT_WIDTH*stic_device::X_SCALE*INTVKBD_X_SCALE, + stic_device::OVERSCAN_RIGHT_WIDTH*stic_device::X_SCALE*INTVKBD_X_SCALE, + stic_device::OVERSCAN_TOP_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE, + stic_device::OVERSCAN_BOTTOM_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE); MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_UPDATE_DRIVER(intv_state, screen_update_intvkbd) diff --git a/src/mame/drivers/iteagle.cpp b/src/mame/drivers/iteagle.cpp index 22534cd78aa..eef52e1f4ed 100644 --- a/src/mame/drivers/iteagle.cpp +++ b/src/mame/drivers/iteagle.cpp @@ -197,16 +197,15 @@ MACHINE_CONFIG_START(iteagle_state::iteagle) voodoo_3_pci_device &voodoo(VOODOO_3_PCI(config, PCI_ID_VIDEO, 0, m_maincpu, "screen")); voodoo.set_fbmem(16); - MCFG_DEVICE_MODIFY(PCI_ID_VIDEO":voodoo") - MCFG_VOODOO_VBLANK_CB(WRITELINE(PCI_ID_FPGA, iteagle_fpga_device, vblank_update)) + subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(m_fpga, FUNC(iteagle_fpga_device::vblank_update)); ITEAGLE_EEPROM(config, m_eeprom, 0); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_SIZE(512, 384) - MCFG_SCREEN_UPDATE_DEVICE(PCI_ID_VIDEO, voodoo_pci_device, screen_update) - + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(60); + screen.set_size(512, 384); + screen.set_visarea(0, 512 - 1, 0, 384 - 1); + screen.set_screen_update(PCI_ID_VIDEO, FUNC(voodoo_pci_device::screen_update)); MACHINE_CONFIG_END MACHINE_CONFIG_START(iteagle_state::gtfore01) diff --git a/src/mame/drivers/itech32.cpp b/src/mame/drivers/itech32.cpp index c4763adf3ca..cf1160a8d67 100644 --- a/src/mame/drivers/itech32.cpp +++ b/src/mame/drivers/itech32.cpp @@ -1770,7 +1770,6 @@ void drivedge_state::drivedge(machine_config &config) void itech32_state::sftm(machine_config &config) { base_devices(config); - via(config); M68EC020(config, m_maincpu, CPU020_CLOCK); m_maincpu->set_addrmap(AS_PROGRAM, &itech32_state::itech020_map); diff --git a/src/mame/drivers/itt3030.cpp b/src/mame/drivers/itt3030.cpp index d12c8b4b075..b5bfce7f1e5 100644 --- a/src/mame/drivers/itt3030.cpp +++ b/src/mame/drivers/itt3030.cpp @@ -724,8 +724,7 @@ MACHINE_CONFIG_START(itt3030_state::itt3030) /* devices */ ADDRESS_MAP_BANK(config, "lowerbank").set_map(&itt3030_state::lower48_map).set_options(ENDIANNESS_LITTLE, 8, 20, 0xc000); - MCFG_DEVICE_ADD("crt5027", CRT5027, 6_MHz_XTAL / 8) - MCFG_TMS9927_CHAR_WIDTH(8) + CRT5027(config, m_crtc, 6_MHz_XTAL / 8).set_char_width(8); FD1791(config, m_fdc, 20_MHz_XTAL / 20); m_fdc->intrq_wr_callback().set(FUNC(itt3030_state::fdcirq_w)); diff --git a/src/mame/drivers/jtc.cpp b/src/mame/drivers/jtc.cpp index 1f6c544ca87..7a93142b2d5 100644 --- a/src/mame/drivers/jtc.cpp +++ b/src/mame/drivers/jtc.cpp @@ -46,7 +46,6 @@ public: virtual void machine_start() override; - virtual void video_start() override; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); DECLARE_WRITE8_MEMBER( p2_w ); @@ -81,7 +80,6 @@ public: : jtc_state(mconfig, type, tag) { } - virtual void video_start() override; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void jtces23(machine_config &config); void jtc_es23_mem(address_map &map); @@ -191,20 +189,20 @@ READ8_MEMBER( jtces40_state::videoram_r ) { uint8_t data = 0; - if (m_video_bank & 0x80) data |= m_color_ram_r[offset]; - if (m_video_bank & 0x40) data |= m_color_ram_g[offset]; - if (m_video_bank & 0x20) data |= m_color_ram_b[offset]; - if (m_video_bank & 0x10) data |= m_video_ram[offset]; + if (BIT(m_video_bank, 7)) data |= m_color_ram_r[offset]; + if (BIT(m_video_bank, 6)) data |= m_color_ram_g[offset]; + if (BIT(m_video_bank, 5)) data |= m_color_ram_b[offset]; + if (BIT(m_video_bank, 4)) data |= m_video_ram[offset]; return data; } WRITE8_MEMBER( jtces40_state::videoram_w ) { - if (m_video_bank & 0x80) m_color_ram_r[offset] = data; - if (m_video_bank & 0x40) m_color_ram_g[offset] = data; - if (m_video_bank & 0x20) m_color_ram_b[offset] = data; - if (m_video_bank & 0x10) m_video_ram[offset] = data; + if (BIT(m_video_bank, 7)) m_color_ram_r[offset] = data; + if (BIT(m_video_bank, 6)) m_color_ram_g[offset] = data; + if (BIT(m_video_bank, 5)) m_color_ram_b[offset] = data; + if (BIT(m_video_bank, 4)) m_video_ram[offset] = data; } WRITE8_MEMBER( jtces40_state::banksel_w ) @@ -217,25 +215,6 @@ WRITE8_MEMBER( jtces40_state::banksel_w ) void jtc_state::jtc_mem(address_map &map) { map.unmap_value_high(); - map(0x7001, 0x7001).mirror(0x0ff0).portr("Y1"); - map(0x7002, 0x7002).mirror(0x0ff0).portr("Y2"); - map(0x7003, 0x7003).mirror(0x0ff0).portr("Y3"); - map(0x7004, 0x7004).mirror(0x0ff0).portr("Y4"); - map(0x7005, 0x7005).mirror(0x0ff0).portr("Y5"); - map(0x7006, 0x7006).mirror(0x0ff0).portr("Y6"); - map(0x7007, 0x7007).mirror(0x0ff0).portr("Y7"); - map(0x7008, 0x7008).mirror(0x0ff0).portr("Y8"); - map(0x7009, 0x7009).mirror(0x0ff0).portr("Y9"); - map(0x700a, 0x700a).mirror(0x0ff0).portr("Y10"); - map(0x700b, 0x700b).mirror(0x0ff0).portr("Y11"); - map(0x700c, 0x700c).mirror(0x0ff0).portr("Y12"); - map(0xe000, 0xfdff).ram(); - map(0xfe00, 0xffff).ram().share("video_ram"); -} - -void jtces88_state::jtc_es1988_mem(address_map &map) -{ - map.unmap_value_high(); map(0x0800, 0x0fff).rom(); map(0x2000, 0x27ff).rom(); map(0x7001, 0x7001).mirror(0x0ff0).portr("Y1"); @@ -250,6 +229,9 @@ void jtces88_state::jtc_es1988_mem(address_map &map) map(0x700a, 0x700a).mirror(0x0ff0).portr("Y10"); map(0x700b, 0x700b).mirror(0x0ff0).portr("Y11"); map(0x700c, 0x700c).mirror(0x0ff0).portr("Y12"); + map(0x700d, 0x700d).mirror(0x0ff0).portr("Y13"); + map(0x700e, 0x700e).mirror(0x0ff0).portr("Y14"); + map(0x700f, 0x700f).mirror(0x0ff0).portr("Y15"); map(0xe000, 0xfdff).ram(); map(0xfe00, 0xffff).ram().share("video_ram"); } @@ -284,6 +266,7 @@ void jtces40_state::jtc_es40_mem(address_map &map) map(0x0800, 0x1fff).rom(); map(0x4000, 0x5fff).rw(FUNC(jtces40_state::videoram_r), FUNC(jtces40_state::videoram_w)); map(0x6000, 0x63ff).w(FUNC(jtces40_state::banksel_w)); + map(0x7000, 0x7000).mirror(0x0ff0).portr("Y0"); map(0x7001, 0x7001).mirror(0x0ff0).portr("Y1"); map(0x7002, 0x7002).mirror(0x0ff0).portr("Y2"); map(0x7003, 0x7003).mirror(0x0ff0).portr("Y3"); @@ -296,6 +279,9 @@ void jtces40_state::jtc_es40_mem(address_map &map) map(0x700a, 0x700a).mirror(0x0ff0).portr("Y10"); map(0x700b, 0x700b).mirror(0x0ff0).portr("Y11"); map(0x700c, 0x700c).mirror(0x0ff0).portr("Y12"); + map(0x700d, 0x700d).mirror(0x0ff0).portr("Y13"); + map(0x700e, 0x700e).mirror(0x0ff0).portr("Y14"); + map(0x700f, 0x700f).mirror(0x0ff0).portr("Y15"); map(0x8000, 0xffff).ram();//BANK(1) } @@ -303,336 +289,331 @@ void jtces40_state::jtc_es40_mem(address_map &map) static INPUT_PORTS_START( jtc ) PORT_START("Y1") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x91 \xE2\x86\x93") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x90 \xE2\x86\x92") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x91 \xE2\x86\x93") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x90 \xE2\x86\x92") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_START("Y2") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Y') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_START("Y3") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_START("Y4") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_START("Y5") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('?') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('?') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_START("Y6") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('*') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('*') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_START("Y7") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('%') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Z') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('%') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_START("Y8") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR(0x2030) // per mille - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR(0x2030) // per mille + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_START("Y9") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') PORT_START("Y10") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') PORT_START("Y11") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR('*') PORT_CHAR(':') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR('*') PORT_CHAR(':') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') PORT_START("Y12") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CLR") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('+') PORT_CHAR(';') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('-') PORT_CHAR('=') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CLR") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('+') PORT_CHAR(';') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('-') PORT_CHAR('=') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + + PORT_START("Y13") + PORT_START("Y14") + PORT_START("Y15") INPUT_PORTS_END static INPUT_PORTS_START( jtces23 ) PORT_START("Y0") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CONTROL") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CONTROL") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_START("Y1") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Y') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_START("Y2") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_START("Y3") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_START("Y4") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_START("Y5") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_START("Y6") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Z') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_START("Y7") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_START("Y8") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('@') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('[') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('@') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('[') PORT_START("Y9") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(']') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(']') PORT_START("Y10") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') PORT_START("Y11") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('<') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('-') PORT_CHAR('_') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('+') PORT_CHAR('\\') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RET") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('<') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('+') PORT_CHAR('\\') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RET") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_START("Y12") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('>') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) //PORT_CODE() PORT_CHAR('=') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) //PORT_CODE() PORT_CHAR('*') PORT_CHAR('^') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('>') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) //PORT_CODE() PORT_CHAR('=') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) //PORT_CODE() PORT_CHAR('*') PORT_CHAR('^') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_START("Y13") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) // DBS - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) // DEL - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) // SPA + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // DBS + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // DEL + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // SPA PORT_START("Y14") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) // INS - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) // HOM - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // INS + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // HOM + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_START("Y15") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) // CLS - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) // SOL - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) // RET + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // CLS + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // SOL + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // RET INPUT_PORTS_END static INPUT_PORTS_START( jtces40 ) + PORT_START("Y0") PORT_START("Y1") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHT3") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHT2") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHT1") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHT3") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHT2") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHT1") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_START("Y2") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_START("Y3") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_START("Y4") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_START("Y5") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_START("Y6") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_START("Y7") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('z') PORT_CHAR('Z') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_START("Y8") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_START("Y9") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('@') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('@') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('[') PORT_CHAR('{') PORT_START("Y10") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(']') PORT_CHAR('}') PORT_START("Y11") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_CHAR('=') PORT_CHAR('_') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_CHAR('=') PORT_CHAR('_') PORT_START("Y12") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CLR") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('+') PORT_CHAR('-') PORT_CHAR('\\') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('*') PORT_CHAR('/') PORT_CHAR('|') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RET") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_CHAR('?') PORT_CHAR('~') + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CLR") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('+') PORT_CHAR('-') PORT_CHAR('\\') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('*') PORT_CHAR('/') PORT_CHAR('|') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RET") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_CHAR('?') PORT_CHAR('~') + + PORT_START("Y13") + PORT_START("Y14") + PORT_START("Y15") INPUT_PORTS_END /* Video */ -void jtc_state::video_start() -{ -} - uint32_t jtc_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int x, y, sx; + u8 i, y, sx; for (y = 0; y < 64; y++) { for (sx = 0; sx < 8; sx++) { - uint8_t data = m_video_ram[(y * 8) + sx]; + u8 data = m_video_ram[(y * 8) + sx]; - for (x = 0; x < 8; x++) - { - int color = BIT(data, x); - bitmap.pix16(y, (sx * 8) + x) = color; - } + for (i = 0; i < 8; i++) + bitmap.pix16(y, (sx * 8) + i) = BIT(data, 7-i); } } return 0; } -void jtces23_state::video_start() -{ -} - uint32_t jtces23_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int x, y, sx; + u8 i, y, sx; for (y = 0; y < 128; y++) { for (sx = 0; sx < 16; sx++) { - uint8_t data = m_video_ram[(y * 16) + sx]; + u8 data = m_video_ram[(y * 16) + sx]; - for (x = 0; x < 8; x++) - { - int color = BIT(data, x); - bitmap.pix16(y, (sx * 8) + x) = color; - } + for (i = 0; i < 8; i++) + bitmap.pix16(y, (sx * 8) + i) = BIT(data, 7-i); } } @@ -662,23 +643,20 @@ void jtces40_state::video_start() uint32_t jtces40_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int x, y, sx; + u8 i, y, sx; for (y = 0; y < 192; y++) { for (sx = 0; sx < 40; sx++) { - uint8_t data = m_video_ram[(y * 40) + sx]; - uint8_t color_r = m_color_ram_r[(y * 40) + sx]; - uint8_t color_g = m_color_ram_g[(y * 40) + sx]; - uint8_t color_b = m_color_ram_b[(y * 40) + sx]; - - for (x = 0; x < 8; x++) - { - int color = (BIT(color_r, x) << 3) | (BIT(color_g, x) << 2) | (BIT(color_b, x) << 1) | BIT(data, x); - - bitmap.pix16(y, (sx * 8) + x) = color; - } + u8 data = m_video_ram[(y * 40) + sx]; + u8 r = m_color_ram_r[(y * 40) + sx]; + u8 g = m_color_ram_g[(y * 40) + sx]; + u8 b = m_color_ram_b[(y * 40) + sx]; + + for (i = 0; i < 8; i++) + //bitmap.pix16(y, (sx * 8) + 7 - i) = (BIT(r, i) << 3) | (BIT(g, i) << 2) | (BIT(b, i) << 1) | BIT(data, i); + bitmap.pix16(y, (sx * 8) + 7 - i) = BIT(data, i) ? 0 : (BIT(r, i) << 0) | (BIT(g, i) << 1) | (BIT(b, i) << 2); } } @@ -771,9 +749,6 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(jtces88_state::jtces88) jtc(config); - /* basic machine hardware */ - MCFG_DEVICE_MODIFY(UB8830D_TAG) - MCFG_DEVICE_PROGRAM_MAP(jtc_es1988_mem) /* internal ram */ m_ram->set_default_size("4K"); @@ -789,7 +764,7 @@ MACHINE_CONFIG_START(jtces23_state::jtces23) MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_UPDATE_DRIVER(jtc_state, screen_update) + MCFG_SCREEN_UPDATE_DRIVER(jtces23_state, screen_update) MCFG_SCREEN_SIZE(128, 128) MCFG_SCREEN_VISIBLE_AREA(0, 128-1, 0, 128-1) MCFG_SCREEN_PALETTE("palette") @@ -811,7 +786,7 @@ MACHINE_CONFIG_START(jtces40_state::jtces40) MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_UPDATE_DRIVER(jtc_state, screen_update) + MCFG_SCREEN_UPDATE_DRIVER(jtces40_state, screen_update) MCFG_SCREEN_SIZE(320, 192) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 192-1) MCFG_SCREEN_PALETTE("palette") @@ -829,8 +804,8 @@ MACHINE_CONFIG_END ROM_START( jtc ) ROM_REGION( 0x10000, UB8830D_TAG, 0 ) ROM_LOAD( "u883rom.bin", 0x0000, 0x0800, CRC(2453c8c1) SHA1(816f5d08f8064b69b1779eb6661fde091aa58ba8) ) - ROM_LOAD( "u2716c1.bin", 0x0800, 0x0800, NO_DUMP ) - ROM_LOAD( "u2716c2.bin", 0x2000, 0x0800, NO_DUMP ) + ROM_LOAD( "os2k_0800.bin", 0x0800, 0x0800, CRC(c81a2e19) SHA1(97c3b36c7b555081e084403e8f800fc9dbf5e68d) ) // u2716c1.bin + ROM_LOAD_OPTIONAL( "u2716c2.bin", 0x2000, 0x0800, NO_DUMP ) // doesn't seem to be needed? ROM_END ROM_START( jtces88 ) diff --git a/src/mame/drivers/juicebox.cpp b/src/mame/drivers/juicebox.cpp index 04fc84667df..4d7392c8a84 100644 --- a/src/mame/drivers/juicebox.cpp +++ b/src/mame/drivers/juicebox.cpp @@ -69,7 +69,7 @@ private: void smc_write(uint8_t data); DECLARE_READ32_MEMBER(s3c44b0_gpio_port_r); DECLARE_WRITE32_MEMBER(s3c44b0_gpio_port_w); - DECLARE_WRITE16_MEMBER(s3c44b0_i2s_data_w); + //DECLARE_WRITE16_MEMBER(s3c44b0_i2s_data_w); void juicebox_map(address_map &map); }; @@ -327,10 +327,11 @@ MACHINE_CONFIG_START(juicebox_state::juicebox) MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT) - MCFG_DEVICE_ADD("s3c44b0", S3C44B0, 10000000) - MCFG_S3C44B0_GPIO_PORT_R_CB(READ32(*this, juicebox_state, s3c44b0_gpio_port_r)) - MCFG_S3C44B0_GPIO_PORT_W_CB(WRITE32(*this, juicebox_state, s3c44b0_gpio_port_w)) - MCFG_S3C44B0_I2S_DATA_W_CB(WRITE16("dac", dac_word_interface, data_w)) + S3C44B0(config, m_s3c44b0, 10000000); + m_s3c44b0->set_cpu("maincpu"); + m_s3c44b0->gpio_port_r_cb().set(FUNC(juicebox_state::s3c44b0_gpio_port_r)); + m_s3c44b0->gpio_port_w_cb().set(FUNC(juicebox_state::s3c44b0_gpio_port_w)); + m_s3c44b0->i2s_data_w_cb().set("dac", FUNC(dac_word_interface::data_w)); MCFG_DEVICE_ADD("smartmedia", SMARTMEDIA, 0) diff --git a/src/mame/drivers/jupace.cpp b/src/mame/drivers/jupace.cpp index 4b016b66190..d2db0f2b4b4 100644 --- a/src/mame/drivers/jupace.cpp +++ b/src/mame/drivers/jupace.cpp @@ -666,7 +666,7 @@ WRITE8_MEMBER(ace_state::ald_w) if (!BIT(data, 6)) { - m_sp0256->ald_w(space, 0, data & 0x3f); + m_sp0256->ald_w(data & 0x3f); } } diff --git a/src/mame/drivers/kas89.cpp b/src/mame/drivers/kas89.cpp index 618d7f842aa..97237377dde 100644 --- a/src/mame/drivers/kas89.cpp +++ b/src/mame/drivers/kas89.cpp @@ -212,7 +212,6 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), - m_v9938(*this, "v9938"), m_soundlatch(*this, "soundlatch"), m_pl1(*this, "PL1"), m_pl2(*this, "PL2"), @@ -257,7 +256,6 @@ private: required_device<cpu_device> m_maincpu; required_device<cpu_device> m_audiocpu; - required_device<v9938_device> m_v9938; required_device<generic_latch_8_device> m_soundlatch; required_ioport m_pl1; required_ioport m_pl2; @@ -537,7 +535,7 @@ void kas89_state::kas89_map(address_map &map) void kas89_state::kas89_io(address_map &map) { map.global_mask(0xff); - map(0x40, 0x43).rw(m_v9938, FUNC(v9938_device::read), FUNC(v9938_device::write)); + map(0x40, 0x43).rw("v9938", FUNC(v9938_device::read), FUNC(v9938_device::write)); map(0x80, 0x80).w(FUNC(kas89_state::mux_w)); map(0x81, 0x81).r(FUNC(kas89_state::mux_r)); map(0x82, 0x82).w(FUNC(kas89_state::control_w)); /* Bit6 trigger the 138Hz osc. tied to main Z80's NMI.*/ @@ -785,9 +783,11 @@ MACHINE_CONFIG_START(kas89_state::kas89) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); /* video hardware */ - MCFG_V9938_ADD("v9938", "screen", VDP_MEM, MASTER_CLOCK) - MCFG_V99X8_INTERRUPT_CALLBACK(INPUTLINE("maincpu", 0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MASTER_CLOCK) + v9938_device &v9938(V9938(config, "v9938", MASTER_CLOCK)); + v9938.set_screen_ntsc("screen"); + v9938.set_vram_size(VDP_MEM); + v9938.int_cb().set_inputline("maincpu", 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "mono").front_center(); diff --git a/src/mame/drivers/konamigq.cpp b/src/mame/drivers/konamigq.cpp index 35679c96eee..41ba62ced58 100644 --- a/src/mame/drivers/konamigq.cpp +++ b/src/mame/drivers/konamigq.cpp @@ -81,6 +81,7 @@ #include "sound/k054539.h" #include "sound/k056800.h" #include "video/psx.h" +#include "screen.h" #include "speaker.h" @@ -362,13 +363,16 @@ MACHINE_CONFIG_START(konamigq_state::konamigq) /* video hardware */ MCFG_PSXGPU_ADD("maincpu", "gpu", CXD8538Q, 0x200000, XTAL(53'693'175)) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_K056800_ADD("k056800", XTAL(18'432'000)) - MCFG_K056800_INT_HANDLER(INPUTLINE("soundcpu", M68K_IRQ_1)) + K056800(config, m_k056800, XTAL(18'432'000)); + m_k056800->int_callback().set_inputline(m_soundcpu, M68K_IRQ_1); MCFG_DEVICE_ADD("k054539_1", K054539, XTAL(18'432'000)) MCFG_DEVICE_ADDRESS_MAP(0, konamigq_k054539_map) diff --git a/src/mame/drivers/konamigv.cpp b/src/mame/drivers/konamigv.cpp index f6783885128..1d126a06536 100644 --- a/src/mame/drivers/konamigv.cpp +++ b/src/mame/drivers/konamigv.cpp @@ -135,6 +135,7 @@ Notes: #include "sound/cdda.h" #include "sound/spu.h" #include "video/psx.h" +#include "screen.h" #include "speaker.h" #include "cdrom.h" @@ -376,6 +377,9 @@ MACHINE_CONFIG_START(konamigv_state::konamigv) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8514Q, 0x100000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); diff --git a/src/mame/drivers/konamigx.cpp b/src/mame/drivers/konamigx.cpp index a606b396202..bd7456e7cbe 100644 --- a/src/mame/drivers/konamigx.cpp +++ b/src/mame/drivers/konamigx.cpp @@ -1685,8 +1685,8 @@ MACHINE_CONFIG_START(konamigx_state::konamigx) MCFG_SOUND_ROUTE(2, "lspeaker", 0.3) MCFG_SOUND_ROUTE(3, "rspeaker", 0.3) - MCFG_K056800_ADD("k056800", XTAL(18'432'000)) - MCFG_K056800_INT_HANDLER(INPUTLINE("soundcpu", M68K_IRQ_1)) + K056800(config, m_k056800, XTAL(18'432'000)); + m_k056800->int_callback().set_inputline(m_soundcpu, M68K_IRQ_1); MCFG_DEVICE_ADD("k054539_1", K054539, XTAL(18'432'000)) MCFG_DEVICE_ROM("k054539") diff --git a/src/mame/drivers/ksys573.cpp b/src/mame/drivers/ksys573.cpp index f90f802df5e..b937fcd8a44 100644 --- a/src/mame/drivers/ksys573.cpp +++ b/src/mame/drivers/ksys573.cpp @@ -523,7 +523,7 @@ private: void cdrom_dma_read( uint32_t *ram, uint32_t n_address, int32_t n_size ); void cdrom_dma_write( uint32_t *ram, uint32_t n_address, int32_t n_size ); - void sys573_vblank( screen_device &screen, bool vblank_state ); + DECLARE_WRITE_LINE_MEMBER( sys573_vblank ); void punchmania_cassette_install(device_t *device); void salarymc_cassette_install(device_t *device); @@ -823,7 +823,7 @@ MACHINE_RESET_MEMBER( ksys573_state,konami573 ) m_h8_clk = 0; } -void ksys573_state::sys573_vblank( screen_device &screen, bool vblank_state ) +WRITE_LINE_MEMBER(ksys573_state::sys573_vblank) { update_disc(); @@ -2128,7 +2128,9 @@ MACHINE_CONFIG_START(ksys573_state::konami573) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x200000, XTAL(53'693'175) ) - MCFG_PSXGPU_VBLANK_CALLBACK(vblank_state_delegate(&ksys573_state::sys573_vblank, this )) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER).screen_vblank().set(FUNC(ksys573_state::sys573_vblank)); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); diff --git a/src/mame/drivers/kurukuru.cpp b/src/mame/drivers/kurukuru.cpp index 5b328728b64..a9d6e5a692c 100644 --- a/src/mame/drivers/kurukuru.cpp +++ b/src/mame/drivers/kurukuru.cpp @@ -403,7 +403,6 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), - m_v9938(*this, "v9938"), m_adpcm(*this, "adpcm"), m_soundirq(*this, "soundirq"), m_hopper(*this, "hopper"), @@ -416,7 +415,6 @@ public: private: required_device<cpu_device> m_maincpu; required_device<cpu_device> m_audiocpu; - required_device<v9938_device> m_v9938; required_device<msm5205_device> m_adpcm; required_device<rst_neg_buffer_device> m_soundirq; required_device<ticket_dispenser_device> m_hopper; @@ -531,7 +529,7 @@ void kurukuru_state::kurukuru_io(address_map &map) map(0x00, 0x00).mirror(0x0f).w(FUNC(kurukuru_state::kurukuru_out_latch_w)); map(0x10, 0x10).mirror(0x0f).portr("DSW1"); map(0x20, 0x20).mirror(0x0f).w("soundlatch", FUNC(generic_latch_8_device::write)); - map(0x80, 0x83).mirror(0x0c).rw(m_v9938, FUNC(v9938_device::read), FUNC(v9938_device::write)); + map(0x80, 0x83).mirror(0x0c).rw("v9938", FUNC(v9938_device::read), FUNC(v9938_device::write)); map(0x90, 0x90).mirror(0x0f).w(FUNC(kurukuru_state::kurukuru_bankswitch_w)); map(0xa0, 0xa0).mirror(0x0f).portr("IN0"); map(0xb0, 0xb0).mirror(0x0f).portr("IN1"); @@ -550,7 +548,7 @@ void kurukuru_state::ppj_io(address_map &map) { map.global_mask(0xff); map(0x00, 0x00).mirror(0x0f).w(FUNC(kurukuru_state::kurukuru_bankswitch_w)); - map(0x10, 0x13).mirror(0x0c).rw(m_v9938, FUNC(v9938_device::read), FUNC(v9938_device::write)); + map(0x10, 0x13).mirror(0x0c).rw("v9938", FUNC(v9938_device::read), FUNC(v9938_device::write)); map(0x30, 0x30).mirror(0x0f).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x40, 0x40).mirror(0x0f).portr("DSW1"); map(0x50, 0x50).mirror(0x0f).w(FUNC(kurukuru_state::kurukuru_out_latch_w)); @@ -857,9 +855,11 @@ MACHINE_CONFIG_START(kurukuru_state::kurukuru) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); /* video hardware */ - MCFG_V9938_ADD("v9938", "screen", VDP_MEM, MAIN_CLOCK) - MCFG_V99X8_INTERRUPT_CALLBACK(INPUTLINE("maincpu", 0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MAIN_CLOCK) + v9938_device &v9938(V9938(config, "v9938", MAIN_CLOCK)); + v9938.set_screen_ntsc("screen"); + v9938.set_vram_size(VDP_MEM); + v9938.int_cb().set_inputline("maincpu", 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(HOPPER_PULSE), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH ) diff --git a/src/mame/drivers/lft.cpp b/src/mame/drivers/lft.cpp index 72b210a940c..ddaf9c809f6 100644 --- a/src/mame/drivers/lft.cpp +++ b/src/mame/drivers/lft.cpp @@ -1,15 +1,35 @@ // license:BSD-3-Clause // copyright-holders:Robbbert -/*************************************************************************** +/****************************************************************************************** -2013-09-09 Skeleton of LFT computer system. A search on the net produces - no finds. +2013-09-09 Skeleton of LFT computer system. -****************************************************************************/ +These are the monitor programs for 80186-based "S100+" systems by L/F Technologies. Many +of these boards were distributed under the IMS International name. Documentation available +online is woefully inadequate. + +LFT1230 does extensive testing of devices at boot time. As they are mostly missing, +it gets caught in a loop. There's unknown devices in the i/o 008x, 00Ax, 00Cx range. +The devices at 008x and 00Cx would appear to be the same type. +BUG:If the rtc fails to clear the interrupt pin (first test), it cannot print the error +as the SCC hasn't yet been set up. +***Status: hangs at start + + +LFT1510 doesn't bother with the tests. The i/o ports seem to be the same. +***Status: mostly working + + +Note: Backspace/delete performs oddly. + +******************************************************************************************/ #include "emu.h" #include "cpu/i86/i186.h" -#include "machine/terminal.h" +#include "machine/mm58167.h" +#include "machine/z80scc.h" +#include "bus/rs232/rs232.h" +//#include "bus/s100/s100.h" class lft_state : public driver_device @@ -18,44 +38,40 @@ public: lft_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") - , m_terminal(*this, "terminal") - { - } + , m_rtc(*this, "rtc") + , m_scc(*this, "scc") + { } void lft(machine_config &config); private: - void kbd_put(u8 data); - DECLARE_WRITE16_MEMBER(term_w); - DECLARE_READ16_MEMBER(keyin_r); - DECLARE_READ16_MEMBER(status_r); - void lft_io(address_map &map); - void lft_mem(address_map &map); + void io_map(address_map &map); + void mem_map(address_map &map); - uint8_t m_term_data; virtual void machine_reset() override; required_device<cpu_device> m_maincpu; - required_device<generic_terminal_device> m_terminal; + required_device<mm58167_device> m_rtc; + required_device<scc8530_device> m_scc; }; -void lft_state::lft_mem(address_map &map) +void lft_state::mem_map(address_map &map) { map.unmap_value_high(); map(0x00000, 0x5ffff).ram(); map(0xfc000, 0xfffff).rom().region("roms", 0); } -void lft_state::lft_io(address_map &map) +void lft_state::io_map(address_map &map) { map.unmap_value_high(); - map.global_mask(0xff); - // screen 1 - map(0x00, 0x01).nopr(); - map(0x04, 0x05).rw(FUNC(lft_state::keyin_r), FUNC(lft_state::term_w)); - // screen 2 - map(0x02, 0x03).nopr(); - map(0x06, 0x07).nopw(); + //map.global_mask(0x3ff); + //map(0x0080, 0x0087) // unknown device + //map(0x00a0, 0x00a?) // unknown device + //map(0x00c0, 0x00c7) // unknown device + map(0x0100, 0x0107).rw(m_scc, FUNC(z80scc_device::cd_ab_r), FUNC(z80scc_device::cd_ab_w)).umask16(0x00ff); + map(0x0180, 0x01bf).rw(m_rtc, FUNC(mm58167_device::read), FUNC(mm58167_device::write)).umask16(0x00ff); + //map(0x0200, 0x0207) // unknown device } @@ -63,42 +79,37 @@ void lft_state::lft_io(address_map &map) static INPUT_PORTS_START( lft ) INPUT_PORTS_END -READ16_MEMBER( lft_state::keyin_r ) -{ - uint16_t ret = m_term_data; - m_term_data = 0; - return ret; -} - -READ16_MEMBER( lft_state::status_r ) -{ - return (m_term_data) ? 5 : 4; -} - -void lft_state::kbd_put(u8 data) -{ - m_term_data = data; -} - -WRITE16_MEMBER( lft_state::term_w ) -{ - m_terminal->write(space, 0, data & 0x7f); // fix backspace -} - void lft_state::machine_reset() { - m_term_data = 0; } MACHINE_CONFIG_START(lft_state::lft) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", I80186, 4000000) // no idea - MCFG_DEVICE_PROGRAM_MAP(lft_mem) - MCFG_DEVICE_IO_MAP(lft_io) - - /* video hardware */ - MCFG_DEVICE_ADD(m_terminal, GENERIC_TERMINAL, 0) - MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(lft_state, kbd_put)) + MCFG_DEVICE_ADD("maincpu", I80186, 16_MHz_XTAL) + MCFG_DEVICE_PROGRAM_MAP(mem_map) + MCFG_DEVICE_IO_MAP(io_map) + + // Devices + MM58167(config, m_rtc, 32.768_kHz_XTAL); + + SCC8530N(config, m_scc, 4.9152_MHz_XTAL); + m_scc->out_txda_callback().set("rs232a", FUNC(rs232_port_device::write_txd)); + m_scc->out_dtra_callback().set("rs232a", FUNC(rs232_port_device::write_dtr)); + m_scc->out_rtsa_callback().set("rs232a", FUNC(rs232_port_device::write_rts)); + + MCFG_DEVICE_ADD("rs232a", RS232_PORT, default_rs232_devices, nullptr) + MCFG_RS232_RXD_HANDLER(WRITELINE(m_scc, scc8530_device, rxa_w)) + MCFG_RS232_DCD_HANDLER(WRITELINE(m_scc, scc8530_device, dcda_w)) + MCFG_RS232_CTS_HANDLER(WRITELINE(m_scc, scc8530_device, ctsa_w)) + + m_scc->out_txdb_callback().set("rs232b", FUNC(rs232_port_device::write_txd)); + m_scc->out_dtrb_callback().set("rs232b", FUNC(rs232_port_device::write_dtr)); + m_scc->out_rtsb_callback().set("rs232b", FUNC(rs232_port_device::write_rts)); + + MCFG_DEVICE_ADD("rs232b", RS232_PORT, default_rs232_devices, "terminal") + MCFG_RS232_RXD_HANDLER(WRITELINE(m_scc, scc8530_device, rxb_w)) + MCFG_RS232_DCD_HANDLER(WRITELINE(m_scc, scc8530_device, dcdb_w)) + MCFG_RS232_CTS_HANDLER(WRITELINE(m_scc, scc8530_device, ctsb_w)) MACHINE_CONFIG_END @@ -120,6 +131,6 @@ ROM_END /* Driver */ -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( ????, lft1510, 0, 0, lft, lft, lft_state, empty_init, "LFT", "LFT 1510", MACHINE_IS_SKELETON) -COMP( ????, lft1230, lft1510, 0, lft, lft, lft_state, empty_init, "LFT", "LFT 1230", MACHINE_IS_SKELETON) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1986, lft1510, 0, 0, lft, lft, lft_state, empty_init, "L/F Technologies", "A1510 186 User Processor", MACHINE_IS_SKELETON) +COMP( 1985, lft1230, lft1510, 0, lft, lft, lft_state, empty_init, "L/F Technologies", "A1230 186 Master Processor", MACHINE_IS_SKELETON) diff --git a/src/mame/drivers/luckybal.cpp b/src/mame/drivers/luckybal.cpp index 4a4b5219ac9..463af27eda1 100644 --- a/src/mame/drivers/luckybal.cpp +++ b/src/mame/drivers/luckybal.cpp @@ -588,9 +588,11 @@ MACHINE_CONFIG_START(luckybal_state::luckybal) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); /* video hardware */ - MCFG_V9938_ADD("v9938", "screen", VDP_MEM, VID_CLOCK) - MCFG_V99X8_INTERRUPT_CALLBACK(INPUTLINE("maincpu", 0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", VID_CLOCK) + v9938_device &v9938(V9938(config, "v9938", VID_CLOCK)); + v9938.set_screen_ntsc("screen"); + v9938.set_vram_size(VDP_MEM); + v9938.int_cb().set_inputline("maincpu", 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "speaker").front_center(); diff --git a/src/mame/drivers/mbee.cpp b/src/mame/drivers/mbee.cpp index a56a03fa10b..d86fea26a67 100644 --- a/src/mame/drivers/mbee.cpp +++ b/src/mame/drivers/mbee.cpp @@ -775,8 +775,8 @@ MACHINE_CONFIG_START(mbee_state::mbeeppc) MCFG_PALETTE_MODIFY("palette") MCFG_PALETTE_INIT_OWNER(mbee_state, premium) - MCFG_DEVICE_ADD("rtc", MC146818, 32.768_kHz_XTAL) - MCFG_MC146818_IRQ_HANDLER(WRITELINE(*this, mbee_state, rtc_irq_w)) + MC146818(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->irq().set(FUNC(mbee_state::rtc_irq_w)); MACHINE_CONFIG_END MACHINE_CONFIG_START(mbee_state::mbee56) @@ -803,8 +803,8 @@ MACHINE_CONFIG_START(mbee_state::mbee128) MCFG_DEVICE_IO_MAP(mbee128_io) MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee128) - MCFG_DEVICE_ADD("rtc", MC146818, 32.768_kHz_XTAL) - MCFG_MC146818_IRQ_HANDLER(WRITELINE(*this, mbee_state, rtc_irq_w)) + MC146818(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->irq().set(FUNC(mbee_state::rtc_irq_w)); MACHINE_CONFIG_END MACHINE_CONFIG_START(mbee_state::mbee128p) diff --git a/src/mame/drivers/meritm.cpp b/src/mame/drivers/meritm.cpp index 36d9d259c9b..c3fb5db404a 100644 --- a/src/mame/drivers/meritm.cpp +++ b/src/mame/drivers/meritm.cpp @@ -1133,14 +1133,17 @@ MACHINE_CONFIG_START(meritm_state::crt250) MCFG_DS1204_ADD(m_ds1204) - MCFG_V9938_ADD(m_v9938[0], "screen", 0x20000, SYSTEM_CLK) - MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(*this, meritm_state, vdp0_interrupt)) + V9938(config, m_v9938[0], SYSTEM_CLK); + m_v9938[0]->set_screen_ntsc("screen"); + m_v9938[0]->set_vram_size(0x20000); + m_v9938[0]->int_cb().set(FUNC(meritm_state::vdp0_interrupt)); - MCFG_V9938_ADD(m_v9938[1], "screen", 0x20000, SYSTEM_CLK) - MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(*this, meritm_state, vdp1_interrupt)) + V9938(config, m_v9938[1], SYSTEM_CLK); + m_v9938[1]->set_screen_ntsc("screen"); + m_v9938[1]->set_vram_size(0x20000); + m_v9938[1]->int_cb().set(FUNC(meritm_state::vdp0_interrupt)); - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938_0", SYSTEM_CLK) - MCFG_SCREEN_UPDATE_DRIVER(meritm_state, screen_update) + SCREEN(config, "screen", SCREEN_TYPE_RASTER).set_screen_update(FUNC(meritm_state::screen_update)); /* sound hardware */ SPEAKER(config, "mono").front_center(); diff --git a/src/mame/drivers/micral.cpp b/src/mame/drivers/micral.cpp index 0b9371826a0..a5c17635a9d 100644 --- a/src/mame/drivers/micral.cpp +++ b/src/mame/drivers/micral.cpp @@ -399,10 +399,10 @@ MACHINE_CONFIG_START(micral_state::micral) MCFG_PALETTE_ADD_MONOCHROME("palette") //MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_micral) - MCFG_DEVICE_ADD("crtc", CRT5037, 4000000 / 8) // xtal freq unknown - MCFG_TMS9927_CHAR_WIDTH(8) // unknown - //MCFG_TMS9927_VSYN_CALLBACK(WRITELINE(TMS5501_TAG, tms5501_device, sens_w)) - MCFG_VIDEO_SET_SCREEN("screen") + CRT5037(config, m_crtc, 4000000 / 8); // xtal freq unknown + m_crtc->set_char_width(8); // unknown + //m_crtc->vsyn_callback().set(TMS5501_TAG, FUNC(tms5501_device::sens_w)); + m_crtc->set_screen("screen"); /* sound hardware */ //MCFG_SPEAKER_STANDARD_MONO("mono") diff --git a/src/mame/drivers/micro3d.cpp b/src/mame/drivers/micro3d.cpp index 67a331cd2af..888282c562c 100644 --- a/src/mame/drivers/micro3d.cpp +++ b/src/mame/drivers/micro3d.cpp @@ -358,8 +358,8 @@ MACHINE_CONFIG_START(micro3d_state::micro3d) MCFG_SCREEN_UPDATE_DEVICE("vgb", tms34010_device, tms340x0_ind16) MCFG_SCREEN_PALETTE("palette") - MCFG_DEVICE_ADD("uart", MC2661, 40_MHz_XTAL / 8) // actually SCN2651 - MCFG_MC2661_TXD_HANDLER(WRITELINE("monitor_vgb", rs232_port_device, write_txd)) + MC2661(config, m_vgb_uart, 40_MHz_XTAL / 8); // actually SCN2651 + m_vgb_uart->txd_handler().set("monitor_vgb", FUNC(rs232_port_device::write_txd)); rs232_port_device &monitor_host(RS232_PORT(config, "monitor_host", default_rs232_devices, nullptr)); // J2 (4-pin molex) monitor_host.rxd_handler().set("duart", FUNC(mc68681_device::rx_a_w)); diff --git a/src/mame/drivers/micronic.cpp b/src/mame/drivers/micronic.cpp index e124e4c7ec9..360f53ed2cc 100644 --- a/src/mame/drivers/micronic.cpp +++ b/src/mame/drivers/micronic.cpp @@ -379,8 +379,8 @@ MACHINE_CONFIG_START(micronic_state::micronic) NVRAM(config, "nvram1").set_custom_handler(FUNC(micronic_state::nvram_init)); // base ram NVRAM(config, "nvram2").set_custom_handler(FUNC(micronic_state::nvram_init)); // additional ram banks - MCFG_DEVICE_ADD(MC146818_TAG, MC146818, 32.768_kHz_XTAL) - MCFG_MC146818_IRQ_HANDLER(WRITELINE(*this, micronic_state, mc146818_irq)) + MC146818(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->irq().set(FUNC(micronic_state::mc146818_irq)); MACHINE_CONFIG_END /* ROM definition */ diff --git a/src/mame/drivers/microterm.cpp b/src/mame/drivers/microterm.cpp index beb1785ff17..a7ba32afebb 100644 --- a/src/mame/drivers/microterm.cpp +++ b/src/mame/drivers/microterm.cpp @@ -94,40 +94,42 @@ void microterm_state::mt5510_io_map(address_map &map) static INPUT_PORTS_START( microterm ) INPUT_PORTS_END -MACHINE_CONFIG_START(microterm_state::mt420) - MCFG_DEVICE_ADD("maincpu", Z80, 4'000'000) - MCFG_DEVICE_PROGRAM_MAP(mt420_mem_map) - MCFG_DEVICE_IO_MAP(mt420_io_map) +void microterm_state::mt420(machine_config &config) +{ + Z80(config, m_maincpu, 4'000'000); + m_maincpu->set_addrmap(AS_PROGRAM, µterm_state::mt420_mem_map); + m_maincpu->set_addrmap(AS_IO, µterm_state::mt420_io_map); - scn2681_device &duart(SCN2681(config, "duart", XTAL(3'686'400))); // MC2681 + scn2681_device &duart(SCN2681(config, "duart", 3.6864_MHz_XTAL)); // MC2681 duart.irq_cb().set_inputline(m_maincpu, 0); duart.outport_cb().set("eeprom", FUNC(eeprom_serial_93cxx_device::di_write)).bit(5); duart.outport_cb().append("eeprom", FUNC(eeprom_serial_93cxx_device::cs_write)).bit(4); duart.outport_cb().append("eeprom", FUNC(eeprom_serial_93cxx_device::clk_write)).bit(3); - MC2661(config, "aci", XTAL(3'686'400)); // SCN2641 + MC2661(config, "aci", 3.6864_MHz_XTAL); // SCN2641 EEPROM_93C46_16BIT(config, "eeprom").do_callback().set("duart", FUNC(scn2681_device::ip6_w)); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(XTAL(9'877'680), 612, 0, 480, 269, 0, 250) - //MCFG_SCREEN_RAW_PARAMS(XTAL(15'300'720), 948, 0, 792, 269, 0, 250) - MCFG_SCREEN_UPDATE_DEVICE("avdc", scn2674_device, screen_update) - - MCFG_DEVICE_ADD("avdc", SCN2674, XTAL(9'877'680) / 6) - //MCFG_DEVICE_CLOCK(XTAL(15'300'720) / 6) - MCFG_SCN2674_CHARACTER_WIDTH(6) - MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(microterm_state, draw_character) - MCFG_DEVICE_ADDRESS_MAP(0, mt420_vram_map) - MCFG_VIDEO_SET_SCREEN("screen") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(microterm_state::mt5510) - MCFG_DEVICE_ADD("maincpu", Z80, XTAL(6'000'000)) - MCFG_DEVICE_PROGRAM_MAP(mt5510_mem_map) - MCFG_DEVICE_IO_MAP(mt5510_io_map) - - scn2681_device &duart(SCN2681(config, "duart", XTAL(3'686'400))); + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(9.87768_MHz_XTAL, 612, 0, 480, 269, 0, 250); + //screen.set_raw(15.30072_MHz_XTAL, 948, 0, 792, 269, 0, 250); + screen.set_screen_update("avdc", FUNC(scn2674_device::screen_update)); + + scn2674_device &avdc(SCN2674(config, "avdc", 9.87768_MHz_XTAL / 6)); + //avdc.set_clock(15.30072_MHz_XTAL / 6); + avdc.set_character_width(6); + avdc.set_display_callback(FUNC(microterm_state::draw_character)); + avdc.set_addrmap(0, µterm_state::mt420_vram_map); + avdc.set_screen("screen"); +} + +void microterm_state::mt5510(machine_config &config) +{ + Z80(config, m_maincpu, 6_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, µterm_state::mt5510_mem_map); + m_maincpu->set_addrmap(AS_IO, µterm_state::mt5510_io_map); + + scn2681_device &duart(SCN2681(config, "duart", 3.6864_MHz_XTAL)); duart.irq_cb().set_inputline(m_maincpu, 0); duart.outport_cb().set("eeprom1", FUNC(eeprom_serial_93cxx_device::di_write)).bit(6); duart.outport_cb().append("eeprom2", FUNC(eeprom_serial_93cxx_device::di_write)).bit(5); @@ -140,10 +142,10 @@ MACHINE_CONFIG_START(microterm_state::mt5510) EEPROM_93C46_16BIT(config, "eeprom2").do_callback().set("duart", FUNC(scn2681_device::ip5_w)); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(XTAL(45'830'400) / 2, 1120, 0, 960, 341, 0, 300) // wild guess at resolution - MCFG_SCREEN_UPDATE_DRIVER(microterm_state, mt5510_update) -MACHINE_CONFIG_END + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(45.8304_MHz_XTAL / 2, 1120, 0, 960, 341, 0, 300); // wild guess at resolution + screen.set_screen_update(FUNC(microterm_state::mt5510_update)); +} /************************************************************************************************************** diff --git a/src/mame/drivers/microterm_f8.cpp b/src/mame/drivers/microterm_f8.cpp index 88d512db37f..878b9c96c81 100644 --- a/src/mame/drivers/microterm_f8.cpp +++ b/src/mame/drivers/microterm_f8.cpp @@ -256,6 +256,15 @@ bool microterm_f8_state::poll_keyboard() READ8_MEMBER(microterm_f8_state::key_r) { + // Cursor is supposed to stop blinking temporarily when keys are depressed + // This implementation suspends cursor blinking when keys are actually read + // It also suspends blinking text, which perhaps is supposed to happen + if (!machine().side_effects_disabled()) + { + m_blinkcount->reset_w(1); + m_blinkcount->reset_w(0); + } + return m_keylatch; } @@ -276,11 +285,6 @@ READ8_MEMBER(microterm_f8_state::port00_r) WRITE8_MEMBER(microterm_f8_state::port00_w) { m_port00 = data; - - // Cursor is supposed to stop blinking temporarily when keys are depressed - // This implementation suspends cursor blinking when keys are acknowledged and the cursor is repositioned - // It also suspends blinking text, which perhaps is supposed to happen - m_blinkcount->reset_w(BIT(data, 0)); } READ8_MEMBER(microterm_f8_state::port01_r) diff --git a/src/mame/drivers/midzeus.cpp b/src/mame/drivers/midzeus.cpp index cf7cb7e01bd..ba02c534e00 100644 --- a/src/mame/drivers/midzeus.cpp +++ b/src/mame/drivers/midzeus.cpp @@ -1267,12 +1267,12 @@ MACHINE_CONFIG_START(midzeus_state::midzeus) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); /* video hardware */ - MCFG_PALETTE_ADD("palette", 32768) + PALETTE(config, "palette", 32768); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(MIDZEUS_VIDEO_CLOCK/8, 529, 0, 400, 278, 0, 256) - MCFG_SCREEN_UPDATE_DRIVER(midzeus_state, screen_update_midzeus) - MCFG_SCREEN_PALETTE("palette") + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(MIDZEUS_VIDEO_CLOCK / 8, 529, 0, 400, 278, 0, 256); + m_screen->set_screen_update(FUNC(midzeus_state::screen_update_midzeus)); + m_screen->set_palette("palette"); MCFG_VIDEO_START_OVERRIDE(midzeus_state,midzeus) @@ -1307,9 +1307,9 @@ MACHINE_CONFIG_START(midzeus2_state::midzeus2) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(MIDZEUS_VIDEO_CLOCK/4, 666, 0, 512, 438, 0, 400) - MCFG_SCREEN_UPDATE_DEVICE("zeus2", zeus2_device, screen_update) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(MIDZEUS_VIDEO_CLOCK / 4, 666, 0, 512, 438, 0, 400); + m_screen->set_screen_update("zeus2", FUNC(zeus2_device::screen_update)); ZEUS2(config, m_zeus, ZEUS2_VIDEO_CLOCK); m_zeus->vblank_callback().set(FUNC(midzeus2_state::zeus_irq)); diff --git a/src/mame/drivers/milwaukee.cpp b/src/mame/drivers/milwaukee.cpp index a0017b97413..44e6c587ace 100644 --- a/src/mame/drivers/milwaukee.cpp +++ b/src/mame/drivers/milwaukee.cpp @@ -9,6 +9,13 @@ Milwaukee Computer MC-1000 series (MC-1000/1100/1200/1300/1400) all the same exc Chips: SY6502, 2x 6821, 2x MC6850P, 6852, INS8253 Other: 2x 7-position rotary "dips" to select baud rates on each 6850 (19.2K, 9600, 4800, 2400, 1200, 600, 300). + +Status: +- When booted it asks for a test to perform. Valid answers are A,B,D,E,H,I,M,O,P,S,W. To exit a test, press E. + M displays * then loops. E just asks the Test question again. P gets caught in a loop (fdc test). + When W pressed, N is displayed. + + ************************************************************************************************************************************/ #include "emu.h" @@ -26,7 +33,6 @@ public: milwaukee_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") - //, m_p_chargen(*this, "chargen") { } void milwaukee(machine_config &config); @@ -34,12 +40,11 @@ public: private: void mem_map(address_map &map); required_device<cpu_device> m_maincpu; - //required_region_ptr<u8> m_p_chargen; }; void milwaukee_state::mem_map(address_map &map) { map(0x0000, 0xf7ff).ram(); - //AM_RANGE(0xf800, 0xf87f) expansion i/o + //map(0xf800, 0xf87f) expansion i/o map(0xf880, 0xf881).rw("acia1", FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // terminal map(0xf882, 0xf883).rw("acia2", FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // remote map(0xf884, 0xf887).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // centronics diff --git a/src/mame/drivers/mlanding.cpp b/src/mame/drivers/mlanding.cpp index 0e5521ed97f..feb2a1a93c5 100644 --- a/src/mame/drivers/mlanding.cpp +++ b/src/mame/drivers/mlanding.cpp @@ -8,38 +8,42 @@ Based on early work by David Haywood CPU Board quick layout: - |------------------------------------| - | 68000P8 DSW DSW | - | J|--| - | uPD4701? |--| - | x x TMS32025 uPD4701? |--| - | |--| - | TC0060DCA? |--| - |A |--| - | |--| - | |--| - | |--| - | | - | XTAL x YM2151 R | - |B x | - | x x x 5205 5205 | - | x x x | - | x x x x | - | PC060HA | - | | - | x Z80 CTC | - | 68000P8 Z80 | - |------------------------------------| - * A, B, R are flatcable connectors, and J is for Jamma - * XTAL is assumed to be around 32MHz - * x are ROM chips, PCB photo was too small to determine which + |----------------------------------------| + | 68000CP8 PAL DSW DSW | + | * * J|--| + | 22 23 5165 uPD4701 |--| + | 6264 6264 5165 TMS32020 uPD4701 |--| + | |--| + | PC050CM |--| + |A MB3731 x 3 |--| + | 5165 5165 VR1 VR2 VR3 |--| + | PAL |--| + | PAL PAL |--| + | | + | 16.000MHz 30 YM2151 R | + |B * * 31 384KHz | + | 24 25 32 5205 5205 | + | # 26 27 33 | + | 28 29 34 | + | 36 | + | PAL PC060HA | + |PAL PAL 35 Z80 CTC | + | 68000CP8 PAL Z80 | + |----------------------------------------| + + A, B, R are flatcable connectors, and J is for Jamma + All numbered roms are prefixed with B09 + XTALs are 16.0000MHz, 384KHz + VR1, VR2 & VR3 are sound pots + # denotes a MB3771 Power Supply Monitor + * denotes unpopulated ROM sockets To do: - * Find Japanese version - * Determine correct CPU and video timings + * Determine correct video timing * Unknown sound writes (volume and body sonic control?) * Better document mecha drive CPU + * Use TMS32020(currently unemulated) device instead of TMS32025 ****************************************************************************/ @@ -93,6 +97,11 @@ public: void mlanding(machine_config &config); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + private: enum { @@ -133,9 +142,6 @@ private: uint8_t m_msm2_vck; uint8_t m_msm2_vck2; - virtual void machine_start() override; - virtual void machine_reset() override; - DECLARE_WRITE16_MEMBER(dma_start_w); DECLARE_WRITE16_MEMBER(dma_stop_w); DECLARE_WRITE16_MEMBER(output_w); @@ -164,7 +170,7 @@ private: DECLARE_READ8_MEMBER(motor_r); - uint32_t screen_update_mlanding(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t exec_dma(); void msm5205_update(int chip); @@ -175,8 +181,6 @@ private: void main_map(address_map &map); void mecha_map_prog(address_map &map); void sub_map(address_map &map); - - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; }; @@ -233,7 +237,7 @@ void mlanding_state::machine_reset() * *************************************/ -uint32_t mlanding_state::screen_update_mlanding(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t mlanding_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { const pen_t *pens = m_palette->pens(); @@ -262,7 +266,7 @@ uint32_t mlanding_state::screen_update_mlanding(screen_device &screen, bitmap_in WRITE16_MEMBER(mlanding_state::dma_start_w) { m_dma_cpu_bank ^= 1; - membank("dma_ram")->set_entry(m_dma_cpu_bank); + m_dma_bank->set_entry(m_dma_cpu_bank); uint32_t pixels = exec_dma(); @@ -590,7 +594,8 @@ void mlanding_state::msm5205_update(int chip) WRITE_LINE_MEMBER(mlanding_state::msm5205_1_vck) { - msm5205_update(0); + if (state) + msm5205_update(0); } @@ -723,9 +728,9 @@ void mlanding_state::main_map(address_map &map) { map(0x000000, 0x05ffff).rom(); map(0x080000, 0x08ffff).ram(); - map(0x100000, 0x17ffff).ram().share("g_ram"); - map(0x180000, 0x1bffff).ram().share("cha_ram"); - map(0x1c0000, 0x1c3fff).bankrw("dma_ram"); + map(0x100000, 0x17ffff).ram().share(m_g_ram); + map(0x180000, 0x1bffff).ram().share(m_cha_ram); + map(0x1c0000, 0x1c3fff).bankrw(m_dma_bank); map(0x1c4000, 0x1cffff).ram().share("sub_com_ram"); map(0x1d0000, 0x1d0001).w(FUNC(mlanding_state::dma_start_w)); map(0x1d0002, 0x1d0003).w(FUNC(mlanding_state::dma_stop_w)); @@ -761,10 +766,10 @@ void mlanding_state::sub_map(address_map &map) map(0x040000, 0x043fff).ram(); map(0x050000, 0x0503ff).ram().share("dsp_prog"); map(0x060000, 0x060001).w(FUNC(mlanding_state::dsp_control_w)); - map(0x1c0000, 0x1c3fff).bankrw("dma_ram"); + map(0x1c0000, 0x1c3fff).bankrw(m_dma_bank); map(0x1c4000, 0x1cffff).ram().share("sub_com_ram"); map(0x200000, 0x2007ff).ram(); - map(0x200800, 0x203fff).ram().share("dot_ram"); + map(0x200800, 0x203fff).ram().share(m_dot_ram); } @@ -782,7 +787,7 @@ void mlanding_state::dsp_map_prog(address_map &map) void mlanding_state::dsp_map_data(address_map &map) { - map(0x0400, 0x1fff).ram().share("dot_ram"); + map(0x0400, 0x1fff).ram().share(m_dot_ram); } /************************************* @@ -828,7 +833,7 @@ void mlanding_state::mecha_map_prog(address_map &map) { map(0x0000, 0x7fff).rom(); map(0x8000, 0x87ff).ram(); - map(0x8800, 0x8fff).ram().share("power_ram"); + map(0x8800, 0x8fff).ram().share(m_power_ram); map(0x9000, 0x9003).nopw(); map(0x9800, 0x9805).r(FUNC(mlanding_state::motor_r)); } @@ -919,6 +924,14 @@ static INPUT_PORTS_START( mlanding ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("yokectrl", taitoio_yoke_device, handle_up_r ) INPUT_PORTS_END +static INPUT_PORTS_START( mlandingj ) + PORT_INCLUDE(mlanding) + + PORT_MODIFY("DSWB") + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Language ) ) PORT_DIPLOCATION("SWB:7") + PORT_DIPSETTING( 0x40, DEF_STR( Japanese ) ) + PORT_DIPSETTING( 0x00, DEF_STR( English ) ) +INPUT_PORTS_END /************************************* * @@ -926,70 +939,67 @@ INPUT_PORTS_END * *************************************/ -MACHINE_CONFIG_START(mlanding_state::mlanding) - +void mlanding_state::mlanding(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68000, 8000000) // Appears to be 68000P8 in PCB photo - MCFG_DEVICE_PROGRAM_MAP(main_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mlanding_state, irq6_line_hold) + M68000(config, m_maincpu, 16_MHz_XTAL / 2); // TS68000CP8 + m_maincpu->set_addrmap(AS_PROGRAM, &mlanding_state::main_map); + m_maincpu->set_vblank_int("screen", FUNC(mlanding_state::irq6_line_hold)); - MCFG_DEVICE_ADD("subcpu", M68000, 8000000) // Appears to be 68000P8 in PCB photo - MCFG_DEVICE_PROGRAM_MAP(sub_map) + M68000(config, m_subcpu, 16_MHz_XTAL / 2); // TS68000CP8 + m_subcpu->set_addrmap(AS_PROGRAM, &mlanding_state::sub_map); - MCFG_DEVICE_ADD("audiocpu", Z80, 4000000) // ? - MCFG_DEVICE_PROGRAM_MAP(audio_map_prog) - MCFG_DEVICE_IO_MAP(audio_map_io) + Z80(config, m_audiocpu, 16_MHz_XTAL / 4); // Z08040004PSC + m_audiocpu->set_addrmap(AS_PROGRAM, &mlanding_state::audio_map_prog); + m_audiocpu->set_addrmap(AS_IO, &mlanding_state::audio_map_io); - MCFG_DEVICE_ADD("mechacpu", Z80, 4000000) // ? - MCFG_DEVICE_PROGRAM_MAP(mecha_map_prog) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mlanding_state, irq0_line_hold) + Z80(config, m_mechacpu, 4000000); // ? + m_mechacpu->set_addrmap(AS_PROGRAM, &mlanding_state::mecha_map_prog); + m_mechacpu->set_vblank_int("screen", FUNC(mlanding_state::irq0_line_hold)); - MCFG_DEVICE_ADD("dsp", TMS32025, 32000000) // ? - MCFG_DEVICE_PROGRAM_MAP(dsp_map_prog) - MCFG_DEVICE_DATA_MAP(dsp_map_data) - MCFG_TMS32025_HOLD_IN_CB(READ16(*this, mlanding_state, dsp_hold_signal_r)) - MCFG_TMS32025_HOLD_ACK_OUT_CB(NOOP) + tms32025_device& dsp(TMS32025(config, m_dsp, 16_MHz_XTAL)); // TMS32020GBL + dsp.set_addrmap(AS_PROGRAM, &mlanding_state::dsp_map_prog); + dsp.set_addrmap(AS_DATA, &mlanding_state::dsp_map_data); + dsp.hold_in_cb().set(FUNC(mlanding_state::dsp_hold_signal_r)); + dsp.hold_ack_out_cb().set_nop(); - Z80CTC(config, m_ctc, 4000000); + Z80CTC(config, m_ctc, 16_MHz_XTAL / 4); m_ctc->zc_callback<0>().set(FUNC(mlanding_state::z80ctc_to0)); - MCFG_DEVICE_ADD("ciu", PC060HA, 0) - MCFG_PC060HA_MASTER_CPU("maincpu") - MCFG_PC060HA_SLAVE_CPU("audiocpu") + pc060ha_device& ciu(PC060HA(config, "ciu", 0)); + ciu.set_master_tag("maincpu"); + ciu.set_slave_tag("audiocpu"); - MCFG_QUANTUM_TIME(attotime::from_hz(600)) + config.m_minimum_quantum = attotime::from_hz(600); TAITOIO_YOKE(config, m_yoke, 0); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - - // Estimated - MCFG_SCREEN_RAW_PARAMS(16000000, 640, 0, 512, 462, 0, 400) - MCFG_SCREEN_UPDATE_DRIVER(mlanding_state, screen_update_mlanding) - MCFG_SCREEN_PALETTE("palette") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(16_MHz_XTAL, 640, 0, 512, 462, 0, 400); // Estimated + screen.set_screen_update(FUNC(mlanding_state::screen_update)); + screen.set_palette(m_palette); - MCFG_PALETTE_ADD("palette", 32768) - MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR) + PALETTE(config, m_palette, 32768).set_format(PALETTE_FORMAT_xBBBBBGGGGGRRRRR); /* sound hardware */ SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("ymsnd", YM2151, 4000000) - MCFG_YM2151_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) - MCFG_YM2151_PORT_WRITE_HANDLER(WRITE8(*this, mlanding_state, sound_bankswitch_w)) - MCFG_SOUND_ROUTE(0, "mono", 0.50) - MCFG_SOUND_ROUTE(1, "mono", 0.50) + ym2151_device &ymsnd(YM2151(config, "ymsnd", 16_MHz_XTAL / 4)); + ymsnd.irq_handler().set_inputline("audiocpu", 0); + ymsnd.port_write_handler().set(FUNC(mlanding_state::sound_bankswitch_w)); + ymsnd.add_route(0, "mono", 0.50); + ymsnd.add_route(1, "mono", 0.50); - MCFG_DEVICE_ADD("msm1", MSM5205, 384000) - MCFG_MSM5205_VCLK_CB(WRITELINE(*this, mlanding_state, msm5205_1_vck)) // VCK function - MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) // 8 kHz, 4-bit - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) + MSM5205(config, m_msm1, 384_kHz_XTAL); + m_msm1->vck_callback().set(FUNC(mlanding_state::msm5205_1_vck)); // VCK function + m_msm1->set_prescaler_selector(msm5205_device::S48_4B); // 8 kHz, 4-bit + m_msm1->add_route(ALL_OUTPUTS, "mono", 0.80); - MCFG_DEVICE_ADD("msm2", MSM5205, 384000) - MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B) // Slave mode, 4-bit - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.10) -MACHINE_CONFIG_END + MSM5205(config, m_msm2, 384_kHz_XTAL); + m_msm2->set_prescaler_selector(msm5205_device::SEX_4B); // Slave mode, 4-bit + m_msm2->add_route(ALL_OUTPUTS, "mono", 0.10); +} @@ -1001,35 +1011,63 @@ MACHINE_CONFIG_END ROM_START( mlanding ) ROM_REGION( 0x60000, "maincpu", 0 ) - ROM_LOAD16_BYTE( "ml_b0929.epr", 0x00000, 0x10000, CRC(ab3f38f3) SHA1(4357112ca11a8e7bfe08ba99ac3bddac046c230a)) - ROM_LOAD16_BYTE( "ml_b0928.epr", 0x00001, 0x10000, CRC(21e7a8f6) SHA1(860d3861d4375866cd27d426d546ddb2894a6629) ) - ROM_LOAD16_BYTE( "ml_b0927.epr", 0x20000, 0x10000, CRC(b02f1805) SHA1(b8050f955c7070dc9b962db329b5b0ee8b2acb70) ) - ROM_LOAD16_BYTE( "ml_b0926.epr", 0x20001, 0x10000, CRC(d57ff428) SHA1(8ff1ab666b06fb873f1ba9b25edf4cd49b9861a1) ) - ROM_LOAD16_BYTE( "ml_b0925.epr", 0x40000, 0x10000, CRC(ff59f049) SHA1(aba490a28aba03728415f34d321fd599c31a5fde) ) - ROM_LOAD16_BYTE( "ml_b0924.epr", 0x40001, 0x10000, CRC(9bc3e1b0) SHA1(6d86804327df11a513a0f06dceb57b83b34ac007) ) + ROM_LOAD16_BYTE( "b09_29.ic44", 0x00000, 0x10000, CRC(ab3f38f3) SHA1(4357112ca11a8e7bfe08ba99ac3bddac046c230a) ) // label needs verifying + ROM_LOAD16_BYTE( "b09_28.ic27", 0x00001, 0x10000, CRC(21e7a8f6) SHA1(860d3861d4375866cd27d426d546ddb2894a6629) ) // label needs verifying + ROM_LOAD16_BYTE( "b09_27.ic45", 0x20000, 0x10000, CRC(b02f1805) SHA1(b8050f955c7070dc9b962db329b5b0ee8b2acb70) ) + ROM_LOAD16_BYTE( "b09_26.ic28", 0x20001, 0x10000, CRC(d57ff428) SHA1(8ff1ab666b06fb873f1ba9b25edf4cd49b9861a1) ) + ROM_LOAD16_BYTE( "b09_25.ic46", 0x40000, 0x10000, CRC(ff59f049) SHA1(aba490a28aba03728415f34d321fd599c31a5fde) ) + ROM_LOAD16_BYTE( "b09_24.ic29", 0x40001, 0x10000, CRC(9bc3e1b0) SHA1(6d86804327df11a513a0f06dceb57b83b34ac007) ) ROM_REGION( 0x20000, "subcpu", 0 ) - ROM_LOAD16_BYTE( "ml_b0923.epr", 0x00000, 0x10000, CRC(81b2c871) SHA1(a085bc528c63834079469db6ae263a5b9b984a7c) ) - ROM_LOAD16_BYTE( "ml_b0922.epr", 0x00001, 0x10000, CRC(36923b42) SHA1(c31d7c45a563cfc4533379f69f32889c79562534) ) + ROM_LOAD16_BYTE( "b09_23.ic56", 0x00000, 0x10000, CRC(81b2c871) SHA1(a085bc528c63834079469db6ae263a5b9b984a7c) ) + ROM_LOAD16_BYTE( "b09_22.ic39", 0x00001, 0x10000, CRC(36923b42) SHA1(c31d7c45a563cfc4533379f69f32889c79562534) ) ROM_REGION( 0x10000, "audiocpu", 0 ) - ROM_LOAD( "ml_b0935.epr", 0x00000, 0x08000, CRC(b85915c5) SHA1(656e97035ae304f84e90758d0dd6f0616c40f1db) ) + ROM_LOAD( "b09_35.ic80", 0x00000, 0x08000, CRC(b85915c5) SHA1(656e97035ae304f84e90758d0dd6f0616c40f1db) ) ROM_REGION( 0x10000, "mechacpu", 0 ) - ROM_LOAD( "ml_b0937.epr", 0x00000, 0x08000, CRC(4bdf15ed) SHA1(b960208e63cede116925e064279a6cf107aef81c) ) + ROM_LOAD( "b09_37.epr", 0x00000, 0x08000, CRC(4bdf15ed) SHA1(b960208e63cede116925e064279a6cf107aef81c) ) ROM_REGION( 0x80000, "adpcm1", 0 ) - ROM_LOAD( "ml_b0934.epr", 0x00000, 0x10000, CRC(0899666f) SHA1(032e3ddd4caa48f82592570616e16c084de91f3e) ) - ROM_LOAD( "ml_b0933.epr", 0x10000, 0x10000, CRC(f5cac954) SHA1(71abdc545e0196ad4d357af22dd6312d10a1323f) ) - ROM_LOAD( "ml_b0932.epr", 0x20000, 0x10000, CRC(4721dc59) SHA1(faad75d577344e9ba495059040a2cf0647567426) ) - ROM_LOAD( "ml_b0931.epr", 0x30000, 0x10000, CRC(9c4a82bf) SHA1(daeac620c636013a36595ce9f37e84e807f88977) ) - ROM_LOAD( "ml_b0930.epr", 0x40000, 0x10000, CRC(214a30e2) SHA1(3dcc3a89ed52e4dbf232d2a92a3e64975b46c2dd) ) + ROM_LOAD( "b09_34.ic62", 0x00000, 0x10000, CRC(0899666f) SHA1(032e3ddd4caa48f82592570616e16c084de91f3e) ) + ROM_LOAD( "b09_33.ic63", 0x10000, 0x10000, CRC(f5cac954) SHA1(71abdc545e0196ad4d357af22dd6312d10a1323f) ) + ROM_LOAD( "b09_32.ic64", 0x20000, 0x10000, CRC(4721dc59) SHA1(faad75d577344e9ba495059040a2cf0647567426) ) + ROM_LOAD( "b09_31.ic65", 0x30000, 0x10000, CRC(9c4a82bf) SHA1(daeac620c636013a36595ce9f37e84e807f88977) ) + ROM_LOAD( "b09_30.ic66", 0x40000, 0x10000, CRC(214a30e2) SHA1(3dcc3a89ed52e4dbf232d2a92a3e64975b46c2dd) ) ROM_REGION( 0x2000, "adpcm2", 0 ) - ROM_LOAD( "ml_b0936.epr", 0x00000, 0x02000, CRC(51fd3a77) SHA1(1fcbadf1877e25848a1d1017322751560a4823c0) ) + ROM_LOAD( "b09_36.ic111", 0x00000, 0x02000, CRC(51fd3a77) SHA1(1fcbadf1877e25848a1d1017322751560a4823c0) ) ROM_END +ROM_START( mlandingj ) + ROM_REGION( 0x60000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "b09_29-2.ic44", 0x00000, 0x10000, CRC(c78d55cd) SHA1(0126524310048a55f4c0c361a1673cc259e461ba) ) // 27512 + ROM_LOAD16_BYTE( "b09_28-3.ic27", 0x00001, 0x10000, CRC(7098c18d) SHA1(ee5b386fed9df5edfd19cb967fd01e9e7fd9ad08) ) // 27512 + ROM_LOAD16_BYTE( "b09_27.ic45", 0x20000, 0x10000, CRC(b02f1805) SHA1(b8050f955c7070dc9b962db329b5b0ee8b2acb70) ) + ROM_LOAD16_BYTE( "b09_26.ic28", 0x20001, 0x10000, CRC(d57ff428) SHA1(8ff1ab666b06fb873f1ba9b25edf4cd49b9861a1) ) + ROM_LOAD16_BYTE( "b09_25.ic46", 0x40000, 0x10000, CRC(ff59f049) SHA1(aba490a28aba03728415f34d321fd599c31a5fde) ) + ROM_LOAD16_BYTE( "b09_24.ic29", 0x40001, 0x10000, CRC(9bc3e1b0) SHA1(6d86804327df11a513a0f06dceb57b83b34ac007) ) + + ROM_REGION( 0x20000, "subcpu", 0 ) + ROM_LOAD16_BYTE( "b09_23.ic56", 0x00000, 0x10000, CRC(81b2c871) SHA1(a085bc528c63834079469db6ae263a5b9b984a7c) ) + ROM_LOAD16_BYTE( "b09_22.ic39", 0x00001, 0x10000, CRC(36923b42) SHA1(c31d7c45a563cfc4533379f69f32889c79562534) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "b09_35.ic80", 0x00000, 0x08000, CRC(b85915c5) SHA1(656e97035ae304f84e90758d0dd6f0616c40f1db) ) + + ROM_REGION( 0x10000, "mechacpu", 0 ) + ROM_LOAD( "b09_37.epr", 0x00000, 0x08000, CRC(4bdf15ed) SHA1(b960208e63cede116925e064279a6cf107aef81c) ) + ROM_REGION( 0x80000, "adpcm1", 0 ) + ROM_LOAD( "b09_34.ic62", 0x00000, 0x10000, CRC(0899666f) SHA1(032e3ddd4caa48f82592570616e16c084de91f3e) ) + ROM_LOAD( "b09_33.ic63", 0x10000, 0x10000, CRC(f5cac954) SHA1(71abdc545e0196ad4d357af22dd6312d10a1323f) ) + ROM_LOAD( "b09_32.ic64", 0x20000, 0x10000, CRC(4721dc59) SHA1(faad75d577344e9ba495059040a2cf0647567426) ) + ROM_LOAD( "b09_31.ic65", 0x30000, 0x10000, CRC(9c4a82bf) SHA1(daeac620c636013a36595ce9f37e84e807f88977) ) + ROM_LOAD( "b09_30.ic66", 0x40000, 0x10000, CRC(214a30e2) SHA1(3dcc3a89ed52e4dbf232d2a92a3e64975b46c2dd) ) + + ROM_REGION( 0x2000, "adpcm2", 0 ) + ROM_LOAD( "b09_36.ic111", 0x00000, 0x02000, CRC(51fd3a77) SHA1(1fcbadf1877e25848a1d1017322751560a4823c0) ) +ROM_END /************************************* * @@ -1037,4 +1075,5 @@ ROM_END * *************************************/ -GAME( 1987, mlanding, 0, mlanding, mlanding, mlanding_state, empty_init, ROT0, "Taito America Corporation", "Midnight Landing (Germany)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, mlanding, 0, mlanding, mlanding, mlanding_state, empty_init, ROT0, "Taito America Corporation", "Midnight Landing (Germany)", MACHINE_SUPPORTS_SAVE ) // Japanese or German selectable via dip-switch. Copyright changes accordingly. +GAME( 1987, mlandingj, mlanding, mlanding, mlandingj, mlanding_state, empty_init, ROT0, "Taito Corporation", "Midnight Landing (Japan)", MACHINE_SUPPORTS_SAVE ) // Japanese or English selectable via dip-switch. Copyright changes accordingly. diff --git a/src/mame/drivers/mpu4vid.cpp b/src/mame/drivers/mpu4vid.cpp index 2941cdd5dd6..653f95e7070 100644 --- a/src/mame/drivers/mpu4vid.cpp +++ b/src/mame/drivers/mpu4vid.cpp @@ -1278,7 +1278,7 @@ void mpu4_state::mpu4_6809_map(address_map &map) MACHINE_CONFIG_START(mpu4vid_state::mpu4_vid) - MCFG_DEVICE_ADD("maincpu", M6809, MPU4_MASTER_CLOCK/4 ) + MCFG_DEVICE_ADD("maincpu", MC6809, MPU4_MASTER_CLOCK) MCFG_DEVICE_PROGRAM_MAP(mpu4_6809_map) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); /* confirm */ @@ -1286,20 +1286,18 @@ MACHINE_CONFIG_START(mpu4vid_state::mpu4_vid) mpu4_common(config); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_SIZE((63*8)+(17*8), (37*8)+17) // note this directly affects the scanline counters used below, and thus the timing of everything - MCFG_SCREEN_VISIBLE_AREA(0, (63*8)+(0)-1, 0, (37*8)+0-1) - - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_UPDATE_DEVICE("scn2674_vid", scn2674_device, screen_update) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(VIDEO_MASTER_CLOCK, (63*8)+(17*8), 0, (63*8), (37*8)+17, 0, (37*8)); + // note this directly affects the scanline counters used below, and thus the timing of everything + screen.set_screen_update("scn2674_vid", FUNC(scn2674_device::screen_update)); MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfxdecode_device::empty) - MCFG_DEVICE_ADD("scn2674_vid", SCN2674, 0) - MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("video", M68K_IRQ_3)) - MCFG_SCN2674_CHARACTER_WIDTH(8) - MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(mpu4vid_state, display_pixels) - MCFG_DEVICE_ADDRESS_MAP(0, mpu4_vram) + SCN2674(config, m_scn2674, VIDEO_MASTER_CLOCK / 8); + m_scn2674->intr_callback().set_inputline("video", M68K_IRQ_3); + m_scn2674->set_character_width(8); + m_scn2674->set_display_callback(FUNC(mpu4vid_state::display_pixels)); + m_scn2674->set_addrmap(0, &mpu4vid_state::mpu4_vram); MCFG_DEVICE_ADD("video", M68000, VIDEO_MASTER_CLOCK ) diff --git a/src/mame/drivers/msx.cpp b/src/mame/drivers/msx.cpp index eeb74bc3311..d9b2a5f5fdb 100644 --- a/src/mame/drivers/msx.cpp +++ b/src/mame/drivers/msx.cpp @@ -1425,9 +1425,11 @@ MACHINE_CONFIG_START(msx_state::msx2) ppi.out_pc_callback().set(FUNC(msx_state::msx_ppi_port_c_w)); /* video hardware */ - MCFG_V9938_ADD("v9938", "screen", 0x20000, 21.477272_MHz_XTAL) - MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(*this, msx_state,msx_irq_source0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", 21.477272_MHz_XTAL) + V9938(config, m_v9938, 21.477272_MHz_XTAL); + m_v9938->set_screen_ntsc("screen"); + m_v9938->set_vram_size(0x20000); + m_v9938->int_cb().set(FUNC(msx_state::msx_irq_source0)); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "speaker").front_center(); @@ -1482,9 +1484,11 @@ MACHINE_CONFIG_START(msx_state::msx2p) ppi.out_pc_callback().set(FUNC(msx_state::msx_ppi_port_c_w)); /* video hardware */ - MCFG_V9958_ADD("v9958", "screen", 0x20000, 21.477272_MHz_XTAL) - MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(*this, msx_state,msx_irq_source0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9958", 21.477272_MHz_XTAL) + V9958(config, m_v9958, 21.477272_MHz_XTAL); + m_v9958->set_screen_ntsc("screen"); + m_v9958->set_vram_size(0x20000); + m_v9958->int_cb().set(FUNC(msx_state::msx_irq_source0)); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "speaker").front_center(); @@ -1526,11 +1530,11 @@ MACHINE_CONFIG_START(msx_state::msx2p) MACHINE_CONFIG_END -MACHINE_CONFIG_START(msx_state::msx2_pal) +void msx_state::msx2_pal(machine_config &config) +{ msx2(config); - MCFG_DEVICE_REMOVE("screen") - MCFG_V99X8_SCREEN_ADD_PAL("screen", "v9938", 21.477272_MHz_XTAL) -MACHINE_CONFIG_END + m_v9938->set_screen_pal("screen"); +} /*************************************************************************** diff --git a/src/mame/drivers/mtouchxl.cpp b/src/mame/drivers/mtouchxl.cpp index 452ff7acbc0..f185d0975aa 100644 --- a/src/mame/drivers/mtouchxl.cpp +++ b/src/mame/drivers/mtouchxl.cpp @@ -247,10 +247,9 @@ MACHINE_CONFIG_START(mtxl_state::at486) kbdc.gate_a20_callback().set_inputline(m_maincpu, INPUT_LINE_A20); kbdc.input_buffer_full_callback().set("mb:pic8259_master", FUNC(pic8259_device::ir1_w)); - MCFG_DEVICE_REMOVE("mb:rtc") - MCFG_DS12885_ADD("mb:rtc") - MCFG_MC146818_IRQ_HANDLER(WRITELINE("mb:pic8259_slave", pic8259_device, ir0_w)) - MCFG_MC146818_CENTURY_INDEX(0x32) + ds12885_device &rtc(DS12885(config.replace(), "mb:rtc")); + rtc.irq().set("mb:pic8259_slave", FUNC(pic8259_device::ir0_w)); + rtc.set_century_index(0x32); #endif /* internal ram */ RAM(config, RAM_TAG).set_default_size("32M"); // Early XL games had 8 MB RAM, 6000 and later require 32MB diff --git a/src/mame/drivers/namcofl.cpp b/src/mame/drivers/namcofl.cpp index 9946692e0fb..0c9218efd46 100644 --- a/src/mame/drivers/namcofl.cpp +++ b/src/mame/drivers/namcofl.cpp @@ -159,7 +159,6 @@ OSC3: 48.384MHz #include "emu.h" #include "includes/namcofl.h" -#include "machine/namcoic.h" #include "cpu/i960/i960.h" #include "sound/c352.h" @@ -225,11 +224,11 @@ void namcofl_state::namcofl_mem(address_map &map) map(0x30300000, 0x30303fff).ram(); /* COMRAM */ map(0x30380000, 0x303800ff).r(FUNC(namcofl_state::fl_network_r)); /* network registers */ map(0x30400000, 0x30407fff).r(m_c116, FUNC(namco_c116_device::read)).w(FUNC(namcofl_state::namcofl_c116_w)); - map(0x30800000, 0x3080ffff).rw(FUNC(namcofl_state::c123_tilemap_videoram_r), FUNC(namcofl_state::c123_tilemap_videoram_w)); - map(0x30a00000, 0x30a0003f).rw(FUNC(namcofl_state::c123_tilemap_control_r), FUNC(namcofl_state::c123_tilemap_control_w)); - map(0x30c00000, 0x30c1ffff).rw(FUNC(namcofl_state::c169_roz_videoram_r), FUNC(namcofl_state::c169_roz_videoram_w)).share("rozvideoram"); - map(0x30d00000, 0x30d0001f).rw(FUNC(namcofl_state::c169_roz_control_r), FUNC(namcofl_state::c169_roz_control_w)); - map(0x30e00000, 0x30e1ffff).rw(FUNC(namcofl_state::c355_obj_ram_r), FUNC(namcofl_state::c355_obj_ram_w)).share("objram"); + map(0x30800000, 0x3080ffff).rw(m_c123tmap, FUNC(namco_c123tmap_device::videoram_r), FUNC(namco_c123tmap_device::videoram_w)); + map(0x30a00000, 0x30a0003f).rw(m_c123tmap, FUNC(namco_c123tmap_device::control_r), FUNC(namco_c123tmap_device::control_w)); + map(0x30c00000, 0x30c1ffff).rw(m_c169roz, FUNC(namco_c169roz_device::videoram_r), FUNC(namco_c169roz_device::videoram_w)); + map(0x30d00000, 0x30d0001f).rw(m_c169roz, FUNC(namco_c169roz_device::control_r), FUNC(namco_c169roz_device::control_w)); + map(0x30e00000, 0x30e1ffff).rw(m_c355spr, FUNC(namco_c355spr_device::spriteram_r), FUNC(namco_c355spr_device::spriteram_w)).share("objram"); map(0x30f00000, 0x30f0000f).ram(); /* NebulaM2 code says this is int enable at 0000, int request at 0004, but doesn't do much about it */ map(0x40000000, 0x4000005f).rw(FUNC(namcofl_state::namcofl_sysreg_r), FUNC(namcofl_state::namcofl_sysreg_w)); map(0xfffffffc, 0xffffffff).r(FUNC(namcofl_state::fl_unk1_r)); @@ -607,6 +606,28 @@ MACHINE_CONFIG_START(namcofl_state::namcofl) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_namcofl) + NAMCO_C169ROZ(config, m_c169roz, 0); + m_c169roz->set_gfxdecode_tag("gfxdecode"); + m_c169roz->set_is_namcofl(true); + m_c169roz->set_ram_words(0x20000/2); + m_c169roz->set_tile_callback(namco_c169roz_device::c169_tilemap_delegate(&namcofl_state::RozCB, this)); + m_c169roz->set_maskregion_tag(NAMCOFL_ROTMASKREGION); + m_c169roz->set_gfxregion(NAMCOFL_ROTGFX); + + NAMCO_C355SPR(config, m_c355spr, 0); + m_c355spr->set_palette_tag("palette"); + m_c355spr->set_gfxdecode_tag("gfxdecode"); + m_c355spr->set_is_namcofl(true); + m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate(&namcofl_state::FLobjcode2tile, this)); + m_c355spr->set_palxor(0x0); + m_c355spr->set_gfxregion(NAMCOFL_SPRITEGFX); + + NAMCO_C123TMAP(config, m_c123tmap, 0); + m_c123tmap->set_gfxdecode_tag("gfxdecode"); + m_c123tmap->set_tile_callback(namco_c123tmap_device::c123_tilemap_delegate(&namcofl_state::TilemapCB, this)); + m_c123tmap->set_maskregion_tag(NAMCOFL_TILEMASKREGION); + m_c123tmap->set_gfxregion(NAMCOFL_TILEGFX); + NAMCO_C116(config, m_c116, 0); m_c116->set_palette(m_palette); @@ -804,13 +825,11 @@ void namcofl_state::common_init() void namcofl_state::init_speedrcr() { common_init(); - m_gametype = NAMCOFL_SPEED_RACER; } void namcofl_state::init_finalapr() { common_init(); - m_gametype = NAMCOFL_FINAL_LAP_R; } GAME( 1995, speedrcr, 0, namcofl, speedrcr, namcofl_state, init_speedrcr, ROT0, "Namco", "Speed Racer", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/namconb1.cpp b/src/mame/drivers/namconb1.cpp index 077b2be5e2f..0c67eb74324 100644 --- a/src/mame/drivers/namconb1.cpp +++ b/src/mame/drivers/namconb1.cpp @@ -272,7 +272,6 @@ GFX: Custom 145 ( 80 pin PQFP) */ #include "emu.h" #include "includes/namconb1.h" -#include "machine/namcoic.h" #include "cpu/m68000/m68000.h" #include "machine/namcomcu.h" @@ -700,10 +699,10 @@ void namconb1_state::namconb1_am(address_map &map) map(0x208000, 0x2fffff).ram(); map(0x400000, 0x40001f).rw(FUNC(namconb1_state::namconb1_cpureg_r), FUNC(namconb1_state::namconb1_cpureg_w)); map(0x580000, 0x5807ff).rw(m_eeprom, FUNC(eeprom_parallel_28xx_device::read), FUNC(eeprom_parallel_28xx_device::write)); - map(0x600000, 0x61ffff).rw(FUNC(namconb1_state::c355_obj_ram_r), FUNC(namconb1_state::c355_obj_ram_w)).share("objram"); - map(0x620000, 0x620007).rw(FUNC(namconb1_state::c355_obj_position_r), FUNC(namconb1_state::c355_obj_position_w)); - map(0x640000, 0x64ffff).rw(FUNC(namconb1_state::c123_tilemap_videoram_r), FUNC(namconb1_state::c123_tilemap_videoram_w)); - map(0x660000, 0x66003f).rw(FUNC(namconb1_state::c123_tilemap_control_r), FUNC(namconb1_state::c123_tilemap_control_w)); + map(0x600000, 0x61ffff).rw(m_c355spr, FUNC(namco_c355spr_device::spriteram_r), FUNC(namco_c355spr_device::spriteram_w)).share("objram"); + map(0x620000, 0x620007).rw(m_c355spr, FUNC(namco_c355spr_device::position_r), FUNC(namco_c355spr_device::position_w)); + map(0x640000, 0x64ffff).rw(m_c123tmap, FUNC(namco_c123tmap_device::videoram_r), FUNC(namco_c123tmap_device::videoram_w)); + map(0x660000, 0x66003f).rw(m_c123tmap, FUNC(namco_c123tmap_device::control_r), FUNC(namco_c123tmap_device::control_w)); map(0x680000, 0x68000f).ram().share("spritebank32"); map(0x6e0000, 0x6e001f).r(FUNC(namconb1_state::custom_key_r)).nopw(); map(0x700000, 0x707fff).rw(m_c116, FUNC(namco_c116_device::read), FUNC(namco_c116_device::write)); @@ -717,13 +716,13 @@ void namconb1_state::namconb2_am(address_map &map) map(0x200000, 0x207fff).rw(FUNC(namconb1_state::share_r), FUNC(namconb1_state::share_w)); map(0x208000, 0x2fffff).ram(); map(0x400000, 0x4fffff).rom().region("data", 0); - map(0x600000, 0x61ffff).rw(FUNC(namconb1_state::c355_obj_ram_r), FUNC(namconb1_state::c355_obj_ram_w)).share("objram"); - map(0x620000, 0x620007).rw(FUNC(namconb1_state::c355_obj_position_r), FUNC(namconb1_state::c355_obj_position_w)); + map(0x600000, 0x61ffff).rw(m_c355spr, FUNC(namco_c355spr_device::spriteram_r), FUNC(namco_c355spr_device::spriteram_w)).share("objram"); + map(0x620000, 0x620007).rw(m_c355spr, FUNC(namco_c355spr_device::position_r), FUNC(namco_c355spr_device::position_w)); map(0x640000, 0x64000f).ram(); /* unknown xy offset */ - map(0x680000, 0x68ffff).rw(FUNC(namconb1_state::c123_tilemap_videoram_r), FUNC(namconb1_state::c123_tilemap_videoram_w)); - map(0x6c0000, 0x6c003f).rw(FUNC(namconb1_state::c123_tilemap_control_r), FUNC(namconb1_state::c123_tilemap_control_w)); - map(0x700000, 0x71ffff).rw(FUNC(namconb1_state::c169_roz_videoram_r), FUNC(namconb1_state::c169_roz_videoram_w)).share("rozvideoram"); - map(0x740000, 0x74001f).rw(FUNC(namconb1_state::c169_roz_control_r), FUNC(namconb1_state::c169_roz_control_w)); + map(0x680000, 0x68ffff).rw(m_c123tmap, FUNC(namco_c123tmap_device::videoram_r), FUNC(namco_c123tmap_device::videoram_w)); + map(0x6c0000, 0x6c003f).rw(m_c123tmap, FUNC(namco_c123tmap_device::control_r), FUNC(namco_c123tmap_device::control_w)); + map(0x700000, 0x71ffff).rw(m_c169roz, FUNC(namco_c169roz_device::videoram_r), FUNC(namco_c169roz_device::videoram_w)); + map(0x740000, 0x74001f).rw(m_c169roz, FUNC(namco_c169roz_device::control_r), FUNC(namco_c169roz_device::control_w)); map(0x800000, 0x807fff).rw(m_c116, FUNC(namco_c116_device::read), FUNC(namco_c116_device::write)); map(0x900008, 0x90000f).ram().share("spritebank32"); map(0x940000, 0x94000f).ram().share("tilebank32"); @@ -1096,6 +1095,20 @@ MACHINE_CONFIG_START(namconb1_state::namconb1) MCFG_PALETTE_ADD("palette", 0x2000) MCFG_PALETTE_ENABLE_SHADOWS() + NAMCO_C355SPR(config, m_c355spr, 0); + m_c355spr->set_palette_tag("palette"); + m_c355spr->set_gfxdecode_tag("gfxdecode"); + m_c355spr->set_is_namcofl(false); + m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate(&namconb1_state::NB1objcode2tile, this)); + m_c355spr->set_palxor(0x0); + m_c355spr->set_gfxregion(NAMCONB1_SPRITEGFX); + + NAMCO_C123TMAP(config, m_c123tmap, 0); + m_c123tmap->set_gfxdecode_tag("gfxdecode"); + m_c123tmap->set_tile_callback(namco_c123tmap_device::c123_tilemap_delegate(&namconb1_state::NB1TilemapCB, this)); + m_c123tmap->set_maskregion_tag(NAMCONB1_TILEMASKREGION); + m_c123tmap->set_gfxregion(NAMCONB1_TILEGFX); + NAMCO_C116(config, m_c116, 0); m_c116->set_palette(m_palette); @@ -1119,17 +1132,37 @@ MACHINE_CONFIG_START(namconb1_state::namconb2) MCFG_SCREEN_UPDATE_DRIVER(namconb1_state, screen_update_namconb2) MCFG_DEVICE_REPLACE("gfxdecode", GFXDECODE, "palette", gfx_namconb2) + + NAMCO_C169ROZ(config, m_c169roz, 0); + m_c169roz->set_gfxdecode_tag("gfxdecode"); + m_c169roz->set_is_namcofl(false); + m_c169roz->set_ram_words(0x20000/2); + m_c169roz->set_maskregion_tag(NAMCONB1_ROTMASKREGION); + m_c169roz->set_gfxregion(NAMCONB1_ROTGFX); + MACHINE_CONFIG_END MACHINE_CONFIG_START(namconb1_state::machbrkr) namconb2(config); + m_c123tmap->set_tile_callback(namco_c123tmap_device::c123_tilemap_delegate(&namconb1_state::NB2TilemapCB_machbrkr, this)); + + m_c169roz->set_tile_callback(namco_c169roz_device::c169_tilemap_delegate(&namconb1_state::NB2RozCB_machbrkr, this)); + + m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate(&namconb1_state::NB2objcode2tile_machbrkr, this)); + MCFG_VIDEO_START_OVERRIDE(namconb1_state,machbrkr) MACHINE_CONFIG_END MACHINE_CONFIG_START(namconb1_state::outfxies) namconb2(config); + m_c123tmap->set_tile_callback(namco_c123tmap_device::c123_tilemap_delegate(&namconb1_state::NB2TilemapCB_outfxies, this)); + + m_c169roz->set_tile_callback(namco_c169roz_device::c169_tilemap_delegate(&namconb1_state::NB2RozCB_outfxies, this)); + + m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate(&namconb1_state::NB2objcode2tile_outfxies, this)); + MCFG_VIDEO_START_OVERRIDE(namconb1_state,outfxies) MACHINE_CONFIG_END diff --git a/src/mame/drivers/namcos10.cpp b/src/mame/drivers/namcos10.cpp index c391fd6a288..58930b534a5 100644 --- a/src/mame/drivers/namcos10.cpp +++ b/src/mame/drivers/namcos10.cpp @@ -398,6 +398,7 @@ earlier TK games, so it appears to be optional or is only used by the later TK51 #include "cpu/psx/psx.h" #include "machine/ram.h" #include "video/psx.h" +#include "screen.h" #include "speaker.h" @@ -938,6 +939,9 @@ MACHINE_CONFIG_START(namcos10_state::namcos10_memm) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561CQ, 0x200000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -962,6 +966,9 @@ MACHINE_CONFIG_START(namcos10_state::namcos10_memn) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561CQ, 0x200000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); diff --git a/src/mame/drivers/namcos11.cpp b/src/mame/drivers/namcos11.cpp index 9c0a010dc03..fd434f52ebe 100644 --- a/src/mame/drivers/namcos11.cpp +++ b/src/mame/drivers/namcos11.cpp @@ -304,6 +304,7 @@ Pin 22 Solder Side - Gun 2 Trigger #include "machine/timer.h" #include "sound/c352.h" #include "video/psx.h" +#include "screen.h" #include "speaker.h" #define C76_SPEEDUP ( 1 ) /* sound cpu idle skipping */ @@ -623,6 +624,9 @@ MACHINE_CONFIG_START(namcos11_state::coh110) MCFG_TIMER_DRIVER_ADD_PERIODIC("mcu_adc", namcos11_state, mcu_adc_cb, attotime::from_hz(60)) MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x200000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -644,6 +648,7 @@ MACHINE_CONFIG_START(namcos11_state::coh100) subdevice<ram_device>("maincpu:ram")->set_default_size("4M"); MCFG_PSXGPU_REPLACE( "maincpu", "gpu", CXD8538Q, 0x200000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN("screen") MACHINE_CONFIG_END MACHINE_CONFIG_START(namcos11_state::tekken) diff --git a/src/mame/drivers/namcos12.cpp b/src/mame/drivers/namcos12.cpp index 412e29b2fbd..eed67de65d1 100644 --- a/src/mame/drivers/namcos12.cpp +++ b/src/mame/drivers/namcos12.cpp @@ -1207,7 +1207,7 @@ private: inline void ATTR_PRINTF(3,4) verboselog( int n_level, const char *s_fmt, ... ); void namcos12_rom_read( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ); - void namcos12_sub_irq( screen_device &screen, bool vblank_state ); + DECLARE_WRITE_LINE_MEMBER(namcos12_sub_irq); }; @@ -1347,11 +1347,11 @@ void namcos12_state::namcos12_rom_read( uint32_t *p_n_psxram, uint32_t n_address } } -void namcos12_state::namcos12_sub_irq( screen_device &screen, bool vblank_state ) +WRITE_LINE_MEMBER(namcos12_state::namcos12_sub_irq) { - m_sub->set_input_line(1, vblank_state ? ASSERT_LINE : CLEAR_LINE); - m_adc->adtrg_w(vblank_state); - m_sub_portb = (m_sub_portb & 0x7f) | (vblank_state << 7); + m_sub->set_input_line(1, state ? ASSERT_LINE : CLEAR_LINE); + m_adc->adtrg_w(state); + m_sub_portb = (m_sub_portb & 0x7f) | (state << 7); } void namcos12_state::namcos12_map(address_map &map) @@ -1768,7 +1768,9 @@ MACHINE_CONFIG_START(namcos12_state::coh700) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8654Q, 0x200000, XTAL(53'693'175) ) - MCFG_PSXGPU_VBLANK_CALLBACK(vblank_state_delegate(&namcos12_state::namcos12_sub_irq, this ) ) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER).screen_vblank().set(FUNC(namcos12_state::namcos12_sub_irq)); MACHINE_CONFIG_END // CPU PCB COH716 @@ -1784,7 +1786,9 @@ MACHINE_CONFIG_START(namcos12_state::coh716) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561CQ, 0x400000, XTAL(53'693'175) ) - MCFG_PSXGPU_VBLANK_CALLBACK(vblank_state_delegate(&namcos12_state::namcos12_sub_irq, this ) ) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER).screen_vblank().set(FUNC(namcos12_state::namcos12_sub_irq)); MACHINE_CONFIG_END MACHINE_CONFIG_START(namcos12_boothack_state::ptblank2) diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp index 79f101200bf..b214e6c571d 100644 --- a/src/mame/drivers/namcos2.cpp +++ b/src/mame/drivers/namcos2.cpp @@ -447,11 +447,102 @@ Again this board has a different graphics layout, also the protection checks are done at $a00000 as opposed to $d00000 on a standard board. Similar $a00000 checks have been seen on the Final Lap boards. + +Custom Chips Notes (moved to here from Stroff's old namcoic.c) +================== + +System 21 here presumably refers to the Winning Run PCB, not the later games? + +Custom Chips: Final Lap Assault LuckyWld System21 NA1/2 NB1/2 + C45 Land Generator * * + C65 I/O Controller (older) * * + C67 TMS320C25 (DSP int rom) + C68 I/O Controller (newer) * * + C70 * + C95 * * + C102 ROZ:Memory Access Control * + C106 OBJ:X-Axis Zoom Control * * + C107 Land Line Buffer * + C116 Screen Waveform Generator * * * * + C121 Yamaha YM2151 Sound Gen * * * + C123 GFX:Tile Mem Decoder * * * * + C134 OBJ:Address Generator * * + C135 OBJ:Line matching * * + C137 Clock Generator IC * * * * * + C138 * + C139 Serial I/F Controller * * * * + C140 24 Channel PCM * * * + C145 GFX:Tile Memory Access * * * * + C146 OBJ:Line Buf Steering * * + C148 CPU Bus Manager * * * * + C149 Mouse/Trackball Decoder * * * * + C156 Pixel Stream Combo * * * * + C160 Control * + C165 * + C169 ROZ(B) * * + C187 * * * + C210 * + C215 * + C218 * + C219 * + C329 CPU? * + C347 GfxObj * + C352 PCM * + C355 Motion Obj(B) * * * + C373 LAND-related * + C382 * + C383 * + C384 GFX(3) * + C385 * + C390 Key Custom * + + +General Support +--------------- +C65 - This is the I/O Microcontroller, handles all input/output devices. 63705 uC, CPU4 in Namco System2. +C137 - Takes System clock and generates all sub-system clocks, doesn't need emulation, not accessed via CPU +C139 - Serial Interface Controller +C148 - Does some Memory Decode, Interrupt Handling, 3 bit PIO port, Bus Controller +C149 - Does decoding of mouse/trackball input streams for the I/O Controller. (Offset Square wave) + + +Tile Fields Static/Scrolled +--------------------------- +Combination of these two devices and associated RAM & TileGFX produces a pixel stream that is fed +into the Pixel stream decoder. + +C145 - Tile Screen Memory Access controller +C123 - Tile Memory decoder Part 1, converts X,Y,Tile into character ROM address index + + +Pixel Stream Decode +------------------- +These two devices take the pixel streams from the tilefield generator and the associated graphics board +and combine them to form an RGB data stream that is fed to the monitor. + +C156 - Pixel stream combiner +Takes tile field & graphics board streams and generates the prioritized pixel, then does the lookup to +go from palettised to 24bit RGB pixel. + +C116 - Screen Waveform Generator +Takes RGB24 pixel stream from C156 and generates the waveform signals for the monitor, also generates +the line interrupt and controls screen blanking,shift, etc. + +Object Control +-------------- +C106 - Generates memory output clocks to generate X-Axis Zoom for Line Buffer Writes +C134 - Object Memory Address Generator. Sequences the sprite memory contents to the hardware. +C135 - Checks is object is displayed on Current output line. +C146 - Steers the Decode Object Pixel data to the correct line buffer A or B + +ROZ +--- +C102 - Controls CPU access to ROZ Memory Area. + ***************************************************************************/ #include "emu.h" #include "includes/namcos2.h" -#include "machine/namcoic.h" #include "cpu/m68000/m68000.h" #include "cpu/m6805/m6805.h" @@ -542,6 +633,7 @@ WRITE16_MEMBER(namcos2_state::dpram_word_w) { m_dpram[offset] = data&0xff; + // TODO : This is a hack! should be output ports MCU side, not probing into DPRAM content if( m_gametype==NAMCOS2_GOLLY_GHOST ) { switch( offset ) @@ -594,8 +686,8 @@ WRITE8_MEMBER(namcos2_state::dpram_byte_w) void namcos2_state::namcos2_68k_default_cpu_board_am(address_map &map) { map(0x200000, 0x3fffff).rom().region("data_rom", 0); - map(0x400000, 0x41ffff).rw(FUNC(namcos2_state::c123_tilemap_videoram_r), FUNC(namcos2_state::c123_tilemap_videoram_w)); - map(0x420000, 0x42003f).rw(FUNC(namcos2_state::c123_tilemap_control_r), FUNC(namcos2_state::c123_tilemap_control_w)); + map(0x400000, 0x41ffff).rw(m_c123tmap, FUNC(namco_c123tmap_device::videoram_r), FUNC(namco_c123tmap_device::videoram_w)); + map(0x420000, 0x42003f).rw(m_c123tmap, FUNC(namco_c123tmap_device::control_r), FUNC(namco_c123tmap_device::control_w)); map(0x440000, 0x44ffff).r(FUNC(namcos2_state::c116_r)).w(m_c116, FUNC(namco_c116_device::write)).umask16(0x00ff).cswidth(16); map(0x460000, 0x460fff).mirror(0xf000).rw(FUNC(namcos2_state::dpram_word_r), FUNC(namcos2_state::dpram_word_w)); map(0x480000, 0x483fff).rw(m_sci, FUNC(namco_c139_device::ram_r), FUNC(namco_c139_device::ram_w)); @@ -609,7 +701,7 @@ void namcos2_state::common_default_am(address_map &map) namcos2_68k_default_cpu_board_am(map); map(0xc00000, 0xc03fff).ram().share("spriteram"); map(0xc40000, 0xc40001).rw(FUNC(namcos2_state::gfx_ctrl_r), FUNC(namcos2_state::gfx_ctrl_w)); - map(0xc80000, 0xc9ffff).ram().w(FUNC(namcos2_state::rozram_word_w)).share("rozram"); + map(0xc80000, 0xc9ffff).ram().w(m_ns2roz, FUNC(namcos2_roz_device::rozram_word_w)).share("rozram"); map(0xcc0000, 0xcc000f).ram().share("rozctrl"); map(0xd00000, 0xd0000f).rw(FUNC(namcos2_state::namcos2_68k_key_r), FUNC(namcos2_state::namcos2_68k_key_w)); } @@ -666,7 +758,7 @@ void namcos2_state::slave_finallap_am(address_map &map) void namcos2_state::common_sgunner_am(address_map &map) { namcos2_68k_default_cpu_board_am(map); - map(0x800000, 0x8141ff).rw(FUNC(namcos2_state::c355_obj_ram_r), FUNC(namcos2_state::c355_obj_ram_w)); + map(0x800000, 0x8141ff).rw(m_c355spr, FUNC(namco_c355spr_device::spriteram_r), FUNC(namco_c355spr_device::spriteram_w)); map(0x818000, 0x818001).nopw(); map(0xa00000, 0xa0000f).rw(FUNC(namcos2_state::namcos2_68k_key_r), FUNC(namcos2_state::namcos2_68k_key_w)); } @@ -694,8 +786,8 @@ void namcos2_state::common_metlhawk_am(address_map &map) { namcos2_68k_default_cpu_board_am(map); map(0xc00000, 0xc03fff).ram().share("spriteram"); - map(0xc40000, 0xc4ffff).rw(FUNC(namcos2_state::c169_roz_videoram_r), FUNC(namcos2_state::c169_roz_videoram_w)).share("rozvideoram"); - map(0xd00000, 0xd0001f).rw(FUNC(namcos2_state::c169_roz_control_r), FUNC(namcos2_state::c169_roz_control_w)); + map(0xc40000, 0xc4ffff).rw(m_c169roz, FUNC(namco_c169roz_device::videoram_r), FUNC(namco_c169roz_device::videoram_w)); + map(0xd00000, 0xd0001f).rw(m_c169roz, FUNC(namco_c169roz_device::control_r), FUNC(namco_c169roz_device::control_w)); map(0xe00000, 0xe00001).rw(FUNC(namcos2_state::gfx_ctrl_r), FUNC(namcos2_state::gfx_ctrl_w)); /* ??? */ } @@ -718,35 +810,59 @@ void namcos2_state::slave_metlhawk_am(address_map &map) /*************************************************************/ -void namcos2_state::common_luckywld_am(address_map &map) +void namcos2_state::common_suzuka8h_am(address_map &map) { namcos2_68k_default_cpu_board_am(map); - map(0x800000, 0x8141ff).rw(FUNC(namcos2_state::c355_obj_ram_r), FUNC(namcos2_state::c355_obj_ram_w)); + map(0x800000, 0x8141ff).rw(m_c355spr, FUNC(namco_c355spr_device::spriteram_r), FUNC(namco_c355spr_device::spriteram_w)); map(0x818000, 0x818001).noprw(); /* enable? */ map(0x81a000, 0x81a001).nopw(); /* enable? */ map(0x840000, 0x840001).nopr(); - map(0x900000, 0x900007).rw(FUNC(namcos2_state::c355_obj_position_r), FUNC(namcos2_state::c355_obj_position_w)); + map(0x900000, 0x900007).rw(m_c355spr, FUNC(namco_c355spr_device::position_r), FUNC(namco_c355spr_device::position_w)); map(0xa00000, 0xa1ffff).rw(m_c45_road, FUNC(namco_c45_road_device::read), FUNC(namco_c45_road_device::write)); - map(0xc00000, 0xc0ffff).rw(FUNC(namcos2_state::c169_roz_videoram_r), FUNC(namcos2_state::c169_roz_videoram_w)).share("rozvideoram"); - map(0xd00000, 0xd0001f).rw(FUNC(namcos2_state::c169_roz_control_r), FUNC(namcos2_state::c169_roz_control_w)); map(0xf00000, 0xf00007).rw(FUNC(namcos2_state::namcos2_68k_key_r), FUNC(namcos2_state::namcos2_68k_key_w)); } + +void namcos2_state::master_suzuka8h_am(address_map &map) +{ + common_suzuka8h_am(map); + map(0x000000, 0x03ffff).rom(); + map(0x100000, 0x10ffff).bankrw(NAMCOS2_68K_MASTER_RAM); + map(0x180000, 0x183fff).rw(FUNC(namcos2_state::namcos2_68k_eeprom_r), FUNC(namcos2_state::namcos2_68k_eeprom_w)).umask16(0x00ff); + map(0x1c0000, 0x1fffff).m(m_master_intc, FUNC(namco_c148_device::map)); + map(0xc00000, 0xc0ffff).ram(); // is roz hardware populated? + map(0xd00000, 0xd0001f).ram(); // is roz hardware populated? +} + +void namcos2_state::slave_suzuka8h_am(address_map &map) +{ + common_suzuka8h_am(map); + map(0x000000, 0x03ffff).rom(); + map(0x100000, 0x13ffff).bankrw(NAMCOS2_68K_SLAVE_RAM); + map(0x1c0000, 0x1fffff).m(m_slave_intc, FUNC(namco_c148_device::map)); + map(0xc00000, 0xc0ffff).ram(); // is roz hardware populated? + map(0xd00000, 0xd0001f).ram(); // is roz hardware populated? +} + void namcos2_state::master_luckywld_am(address_map &map) { - common_luckywld_am(map); + common_suzuka8h_am(map); map(0x000000, 0x03ffff).rom(); map(0x100000, 0x10ffff).bankrw(NAMCOS2_68K_MASTER_RAM); map(0x180000, 0x183fff).rw(FUNC(namcos2_state::namcos2_68k_eeprom_r), FUNC(namcos2_state::namcos2_68k_eeprom_w)).umask16(0x00ff); map(0x1c0000, 0x1fffff).m(m_master_intc, FUNC(namco_c148_device::map)); + map(0xc00000, 0xc0ffff).rw(m_c169roz, FUNC(namco_c169roz_device::videoram_r), FUNC(namco_c169roz_device::videoram_w)); + map(0xd00000, 0xd0001f).rw(m_c169roz, FUNC(namco_c169roz_device::control_r), FUNC(namco_c169roz_device::control_w)); } void namcos2_state::slave_luckywld_am(address_map &map) { - common_luckywld_am(map); + common_suzuka8h_am(map); map(0x000000, 0x03ffff).rom(); map(0x100000, 0x13ffff).bankrw(NAMCOS2_68K_SLAVE_RAM); map(0x1c0000, 0x1fffff).m(m_slave_intc, FUNC(namco_c148_device::map)); + map(0xc00000, 0xc0ffff).rw(m_c169roz, FUNC(namco_c169roz_device::videoram_r), FUNC(namco_c169roz_device::videoram_w)); + map(0xd00000, 0xd0001f).rw(m_c169roz, FUNC(namco_c169roz_device::control_r), FUNC(namco_c169roz_device::control_w)); } /*************************************************************/ @@ -755,7 +871,7 @@ void namcos2_state::slave_luckywld_am(address_map &map) void namcos2_state::sound_default_am(address_map &map) { - map(0x0000, 0x3fff).bankr("bank6"); /* banked */ + map(0x0000, 0x3fff).bankr("audiobank"); /* banked */ map(0x4000, 0x4001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); map(0x5000, 0x6fff).rw(m_c140, FUNC(c140_device::c140_r), FUNC(c140_device::c140_w)); map(0x7000, 0x77ff).rw(FUNC(namcos2_state::dpram_byte_r), FUNC(namcos2_state::dpram_byte_w)).share("dpram"); @@ -765,7 +881,7 @@ void namcos2_state::sound_default_am(address_map &map) map(0xc000, 0xc001).w(FUNC(namcos2_state::namcos2_sound_bankselect_w)); map(0xd001, 0xd001).nopw(); /* Watchdog */ map(0xe000, 0xe000).nopw(); - map(0xd000, 0xffff).rom(); + map(0xd000, 0xffff).rom().region("audiocpu", 0x01000); } /*************************************************************/ @@ -1372,57 +1488,6 @@ static INPUT_PORTS_START( sgunner ) NAMCOS2_MCU_DIAL_DEFAULT INPUT_PORTS_END -static INPUT_PORTS_START( sgunner2 ) - PORT_START("MCUB") /* M37450 - PORT 5 (multiplexed) */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) - - PORT_START("MCUB2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) - - PORT_START("MCUC") /* M37450 - PORT 6 */ - PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("AN0") /* M37450 - 8 CHANNEL ANALOG - CHANNEL 0 */ - PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("AN1") - PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("AN2") - PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("AN3") - PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("AN4") - PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(8) - PORT_START("AN5") - PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(8) PORT_PLAYER(2) - PORT_START("AN6") - PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(8) - PORT_START("AN7") - PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(8) PORT_PLAYER(2) - - PORT_START("MCUH") /* M37450 - PORT 3 */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Service Button") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) - - NAMCOS2_MCU_DIPSW_DEFAULT - NAMCOS2_MCU_DIAL_DEFAULT -INPUT_PORTS_END static INPUT_PORTS_START( dirtfox ) PORT_START("MCUB") /* 63B05Z0 - PORT B */ @@ -1688,26 +1753,25 @@ void namcos2_state::configure_c65_standard(machine_config &config) void namcos2_state::configure_c68_standard(machine_config &config) { - NAMCOC68(config, m_c68new, C68_CPU_CLOCK); - m_c68new->in_pb_callback().set_ioport("MCUB"); - m_c68new->in_pb2_callback().set_ioport("MCUB2"); - m_c68new->in_pc_callback().set_ioport("MCUC"); - m_c68new->in_ph_callback().set_ioport("MCUH"); - m_c68new->in_pdsw_callback().set_ioport("DSW"); - m_c68new->di0_in_cb().set_ioport("MCUDI0"); - m_c68new->di1_in_cb().set_ioport("MCUDI1"); - m_c68new->di2_in_cb().set_ioport("MCUDI2"); - m_c68new->di3_in_cb().set_ioport("MCUDI3"); - m_c68new->an0_in_cb().set_ioport("AN0"); - m_c68new->an1_in_cb().set_ioport("AN1"); - m_c68new->an2_in_cb().set_ioport("AN2"); - m_c68new->an3_in_cb().set_ioport("AN3"); - m_c68new->an4_in_cb().set_ioport("AN4"); - m_c68new->an5_in_cb().set_ioport("AN5"); - m_c68new->an6_in_cb().set_ioport("AN6"); - m_c68new->an7_in_cb().set_ioport("AN7"); - m_c68new->dp_in_callback().set(FUNC(namcos2_state::dpram_byte_r)); - m_c68new->dp_out_callback().set(FUNC(namcos2_state::dpram_byte_w)); + NAMCOC68(config, m_c68, C68_CPU_CLOCK); + m_c68->in_pb_callback().set_ioport("MCUB"); + m_c68->in_pc_callback().set_ioport("MCUC"); + m_c68->in_ph_callback().set_ioport("MCUH"); + m_c68->in_pdsw_callback().set_ioport("DSW"); + m_c68->di0_in_cb().set_ioport("MCUDI0"); + m_c68->di1_in_cb().set_ioport("MCUDI1"); + m_c68->di2_in_cb().set_ioport("MCUDI2"); + m_c68->di3_in_cb().set_ioport("MCUDI3"); + m_c68->an0_in_cb().set_ioport("AN0"); + m_c68->an1_in_cb().set_ioport("AN1"); + m_c68->an2_in_cb().set_ioport("AN2"); + m_c68->an3_in_cb().set_ioport("AN3"); + m_c68->an4_in_cb().set_ioport("AN4"); + m_c68->an5_in_cb().set_ioport("AN5"); + m_c68->an6_in_cb().set_ioport("AN6"); + m_c68->an7_in_cb().set_ioport("AN7"); + m_c68->dp_in_callback().set(FUNC(namcos2_state::dpram_byte_r)); + m_c68->dp_out_callback().set(FUNC(namcos2_state::dpram_byte_w)); } // TODO: temp @@ -1716,16 +1780,20 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos2_state::screen_scanline) int scanline = param; int cur_posirq = get_pos_irq_scanline(); + if (scanline == 200) // triggering this a bit before Vblank allows the Assault Plus mode select screen to work without overclocking the IO MCU, exact timings unknown. + { + if (m_c65) + m_c65->ext_interrupt(HOLD_LINE); + + if (m_c68) + m_c68->ext_interrupt(ASSERT_LINE); + } + if(scanline == 240) { m_master_intc->vblank_irq_trigger(); m_slave_intc->vblank_irq_trigger(); - if (m_c65) - m_c65->ext_interrupt(HOLD_LINE); - - if (m_c68new) - m_c68new->ext_interrupt(ASSERT_LINE); } if(scanline == cur_posirq) @@ -1737,7 +1805,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos2_state::screen_scanline) } } -MACHINE_CONFIG_START(namcos2_state::base) +void namcos2_state::configure_c123tmap_standard(machine_config &config) +{ + NAMCO_C123TMAP(config, m_c123tmap, 0); + m_c123tmap->set_gfxdecode_tag("gfxdecode"); + m_c123tmap->set_tile_callback(namco_c123tmap_device::c123_tilemap_delegate(&namcos2_state::TilemapCB, this)); + m_c123tmap->set_maskregion_tag("gfx4"); + m_c123tmap->set_gfxregion(2); +} + +MACHINE_CONFIG_START(namcos2_state::base_noio) MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */ MCFG_DEVICE_PROGRAM_MAP(master_default_am) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1) @@ -1747,10 +1824,8 @@ MACHINE_CONFIG_START(namcos2_state::base) MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */ MCFG_DEVICE_PROGRAM_MAP(sound_default_am) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq0_line_hold, 2*60) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq1_line_hold, 120) - - configure_c65_standard(config); + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120) MCFG_QUANTUM_TIME(attotime::from_hz(12000)) /* CPU slices per frame */ @@ -1768,6 +1843,19 @@ MACHINE_CONFIG_START(namcos2_state::base) MCFG_SCREEN_UPDATE_DRIVER(namcos2_state, screen_update) MCFG_SCREEN_PALETTE("palette") + configure_c123tmap_standard(config); + + NAMCOS2_SPRITE(config, m_ns2sprite, 0); + m_ns2sprite->set_palette_tag("palette"); + m_ns2sprite->set_gfxdecode_tag("gfxdecode"); + m_ns2sprite->set_spriteram_tag("spriteram"); + + NAMCOS2_ROZ(config, m_ns2roz, 0); + m_ns2roz->set_palette_tag("palette"); + m_ns2roz->set_gfxdecode_tag("gfxdecode"); + m_ns2roz->set_rozram_tag("rozram"); + m_ns2roz->set_rozctrl_tag("rozctrl"); + configure_c116_standard(config); MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_namcos2) @@ -1785,6 +1873,17 @@ MACHINE_CONFIG_START(namcos2_state::base) MCFG_SOUND_ROUTE(1, "rspeaker", 0.80) MACHINE_CONFIG_END + +MACHINE_CONFIG_START(namcos2_state::base) + base_noio(config); + configure_c65_standard(config); +MACHINE_CONFIG_END + +MACHINE_CONFIG_START(namcos2_state::base_c68) + base_noio(config); + configure_c68_standard(config); +MACHINE_CONFIG_END + /* adjusted machine driver start */ MACHINE_CONFIG_START(namcos2_state::base2) base(config); @@ -1823,8 +1922,8 @@ MACHINE_CONFIG_START(namcos2_state::gollygho) MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */ MCFG_DEVICE_PROGRAM_MAP(sound_default_am) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq0_line_hold, 2*60) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq1_line_hold, 120) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120) configure_c65_standard(config); @@ -1846,6 +1945,19 @@ MACHINE_CONFIG_START(namcos2_state::gollygho) MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_namcos2) + configure_c123tmap_standard(config); + + NAMCOS2_SPRITE(config, m_ns2sprite, 0); + m_ns2sprite->set_palette_tag("palette"); + m_ns2sprite->set_gfxdecode_tag("gfxdecode"); + m_ns2sprite->set_spriteram_tag("spriteram"); + + NAMCOS2_ROZ(config, m_ns2roz, 0); + m_ns2roz->set_palette_tag("palette"); + m_ns2roz->set_gfxdecode_tag("gfxdecode"); + m_ns2roz->set_rozram_tag("rozram"); + m_ns2roz->set_rozctrl_tag("rozctrl"); + configure_c116_standard(config); SPEAKER(config, "lspeaker").front_left(); @@ -1863,7 +1975,7 @@ MACHINE_CONFIG_END -MACHINE_CONFIG_START(namcos2_state::finallap) +MACHINE_CONFIG_START(namcos2_state::finallap_noio) MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */ MCFG_DEVICE_PROGRAM_MAP(master_finallap_am) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1) @@ -1873,10 +1985,8 @@ MACHINE_CONFIG_START(namcos2_state::finallap) MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */ MCFG_DEVICE_PROGRAM_MAP(sound_default_am) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq0_line_hold, 2*60) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq1_line_hold, 120) - - configure_c65_standard(config); + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* CPU slices per frame */ @@ -1896,6 +2006,13 @@ MACHINE_CONFIG_START(namcos2_state::finallap) MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_finallap) + configure_c123tmap_standard(config); + + NAMCOS2_SPRITE(config, m_ns2sprite, 0); + m_ns2sprite->set_palette_tag("palette"); + m_ns2sprite->set_gfxdecode_tag("gfxdecode"); + m_ns2sprite->set_spriteram_tag("spriteram"); + configure_c116_standard(config); MCFG_VIDEO_START_OVERRIDE(namcos2_state, finallap) @@ -1916,13 +2033,32 @@ MACHINE_CONFIG_START(namcos2_state::finallap) MCFG_SOUND_ROUTE(1, "rspeaker", 0.80) MACHINE_CONFIG_END +MACHINE_CONFIG_START(namcos2_state::finallap) + finallap_noio(config); + configure_c65_standard(config); +MACHINE_CONFIG_END + +MACHINE_CONFIG_START(namcos2_state::finallap_c68) + finallap_noio(config); + configure_c68_standard(config); +MACHINE_CONFIG_END + + // finalap2 has different mangle MACHINE_CONFIG_START(namcos2_state::finalap2) finallap(config); + m_c123tmap->set_tile_callback(namco_c123tmap_device::c123_tilemap_delegate(&namcos2_state::TilemapCB_finalap2, this)); + MCFG_VIDEO_START_OVERRIDE(namcos2_state, finalap2) MACHINE_CONFIG_END +MACHINE_CONFIG_START(namcos2_state::finalap3) + finallap_c68(config); + MCFG_VIDEO_START_OVERRIDE(namcos2_state, finalap2) +MACHINE_CONFIG_END + + MACHINE_CONFIG_START(namcos2_state::sgunner) MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */ MCFG_DEVICE_PROGRAM_MAP(master_sgunner_am) @@ -1933,8 +2069,8 @@ MACHINE_CONFIG_START(namcos2_state::sgunner) MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */ MCFG_DEVICE_PROGRAM_MAP(sound_default_am) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq0_line_hold, 2*60) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq1_line_hold, 120) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120) configure_c65_standard(config); @@ -1956,6 +2092,16 @@ MACHINE_CONFIG_START(namcos2_state::sgunner) MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_sgunner) + NAMCO_C355SPR(config, m_c355spr, 0); + m_c355spr->set_palette_tag("palette"); + m_c355spr->set_gfxdecode_tag("gfxdecode"); + m_c355spr->set_is_namcofl(false); + m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); + m_c355spr->set_palxor(0x0); + m_c355spr->set_gfxregion(0); + + configure_c123tmap_standard(config); + configure_c116_standard(config); MCFG_VIDEO_START_OVERRIDE(namcos2_state, sgunner) @@ -1983,8 +2129,8 @@ MACHINE_CONFIG_START(namcos2_state::sgunner2) MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */ MCFG_DEVICE_PROGRAM_MAP(sound_default_am) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq0_line_hold, 2*60) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq1_line_hold, 120) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120) configure_c68_standard(config); @@ -2006,6 +2152,16 @@ MACHINE_CONFIG_START(namcos2_state::sgunner2) MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_sgunner) + NAMCO_C355SPR(config, m_c355spr, 0); + m_c355spr->set_palette_tag("palette"); + m_c355spr->set_gfxdecode_tag("gfxdecode"); + m_c355spr->set_is_namcofl(false); + m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); + m_c355spr->set_palxor(0x0); + m_c355spr->set_gfxregion(0); + + configure_c123tmap_standard(config); + configure_c116_standard(config); MCFG_VIDEO_START_OVERRIDE(namcos2_state, sgunner) @@ -2023,20 +2179,20 @@ MACHINE_CONFIG_START(namcos2_state::sgunner2) MCFG_SOUND_ROUTE(1, "rspeaker", 0.80) MACHINE_CONFIG_END -MACHINE_CONFIG_START(namcos2_state::luckywld) +MACHINE_CONFIG_START(namcos2_state::suzuka8h) MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */ - MCFG_DEVICE_PROGRAM_MAP(master_luckywld_am) + MCFG_DEVICE_PROGRAM_MAP(master_suzuka8h_am) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1) MCFG_DEVICE_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */ - MCFG_DEVICE_PROGRAM_MAP(slave_luckywld_am) + MCFG_DEVICE_PROGRAM_MAP(slave_suzuka8h_am) MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */ MCFG_DEVICE_PROGRAM_MAP(sound_default_am) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq0_line_hold, 2*60) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq1_line_hold, 120) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120) - configure_c65_standard(config); + configure_c68_standard(config); MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* CPU slices per frame */ @@ -2056,6 +2212,16 @@ MACHINE_CONFIG_START(namcos2_state::luckywld) MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_luckywld) + NAMCO_C355SPR(config, m_c355spr, 0); + m_c355spr->set_palette_tag("palette"); + m_c355spr->set_gfxdecode_tag("gfxdecode"); + m_c355spr->set_is_namcofl(false); + m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); + m_c355spr->set_palxor(0x0); + m_c355spr->set_gfxregion(0); + + configure_c123tmap_standard(config); + configure_c116_standard(config); MCFG_VIDEO_START_OVERRIDE(namcos2_state, luckywld) @@ -2076,6 +2242,26 @@ MACHINE_CONFIG_START(namcos2_state::luckywld) MCFG_SOUND_ROUTE(1, "rspeaker", 0.80) MACHINE_CONFIG_END +MACHINE_CONFIG_START(namcos2_state::luckywld) + suzuka8h(config); + + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(master_luckywld_am) + + MCFG_DEVICE_MODIFY("slave") + MCFG_DEVICE_PROGRAM_MAP(slave_luckywld_am) + + + NAMCO_C169ROZ(config, m_c169roz, 0); + m_c169roz->set_gfxdecode_tag("gfxdecode"); + m_c169roz->set_is_namcofl(false); + m_c169roz->set_ram_words(0x10000/2); + m_c169roz->set_tile_callback(namco_c169roz_device::c169_tilemap_delegate(&namcos2_state::RozCB_luckywld, this)); + m_c169roz->set_maskregion_tag("gfx5"); + m_c169roz->set_gfxregion(1); + +MACHINE_CONFIG_END + MACHINE_CONFIG_START(namcos2_state::metlhawk) MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */ MCFG_DEVICE_PROGRAM_MAP(master_metlhawk_am) @@ -2086,8 +2272,8 @@ MACHINE_CONFIG_START(namcos2_state::metlhawk) MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */ MCFG_DEVICE_PROGRAM_MAP(sound_default_am) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq0_line_hold, 2*60) - MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_shared_state, irq1_line_hold, 120) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60) + MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120) configure_c65_standard(config); @@ -2109,6 +2295,21 @@ MACHINE_CONFIG_START(namcos2_state::metlhawk) MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_metlhawk) + NAMCO_C169ROZ(config, m_c169roz, 0); + m_c169roz->set_gfxdecode_tag("gfxdecode"); + m_c169roz->set_is_namcofl(false); + m_c169roz->set_ram_words(0x10000/2); + m_c169roz->set_tile_callback(namco_c169roz_device::c169_tilemap_delegate(&namcos2_state::RozCB_metlhawk, this)); + m_c169roz->set_maskregion_tag("gfx5"); + m_c169roz->set_gfxregion(1); + + configure_c123tmap_standard(config); + + NAMCOS2_SPRITE(config, m_ns2sprite, 0); + m_ns2sprite->set_palette_tag("palette"); + m_ns2sprite->set_gfxdecode_tag("gfxdecode"); + m_ns2sprite->set_spriteram_tag("spriteram"); + configure_c116_standard(config); MCFG_VIDEO_START_OVERRIDE(namcos2_state, metlhawk) @@ -2179,10 +2380,8 @@ ROM_START( assault ) ROM_LOAD16_BYTE( "at1sp0.bin", 0x000000, 0x010000, CRC(0de2a0da) SHA1(5f6ce61f2ad1e50f0eac3a115c511151bbb00fd2) ) ROM_LOAD16_BYTE( "at1sp1.bin", 0x000001, 0x010000, CRC(02d15fbe) SHA1(7c1bc845a06188ebe2efdb5880562beae11a7b4f) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "at1snd0.bin", 0x00c000, 0x004000, CRC(1d1ffe12) SHA1(5a49bf1eef981df69abac28132af65670ba01118) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "at1snd0.bin", 0x000000, 0x020000, CRC(1d1ffe12) SHA1(5a49bf1eef981df69abac28132af65670ba01118) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65b.bin", 0x000000, 0x008000, CRC(e9f2922a) SHA1(5767d2f85e1eb3de19192e73b02221f28b1fbb83) ) @@ -2232,10 +2431,8 @@ ROM_START( assaultj ) ROM_LOAD16_BYTE( "at1sp0.bin", 0x000000, 0x010000, CRC(0de2a0da) SHA1(5f6ce61f2ad1e50f0eac3a115c511151bbb00fd2) ) ROM_LOAD16_BYTE( "at1sp1.bin", 0x000001, 0x010000, CRC(02d15fbe) SHA1(7c1bc845a06188ebe2efdb5880562beae11a7b4f) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "at1snd0.bin", 0x00c000, 0x004000, CRC(1d1ffe12) SHA1(5a49bf1eef981df69abac28132af65670ba01118) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "at1snd0.bin", 0x000000, 0x020000, CRC(1d1ffe12) SHA1(5a49bf1eef981df69abac28132af65670ba01118) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65b.bin", 0x000000, 0x008000, CRC(e9f2922a) SHA1(5767d2f85e1eb3de19192e73b02221f28b1fbb83) ) @@ -2285,10 +2482,8 @@ ROM_START( assaultp ) ROM_LOAD16_BYTE( "at1sp0.bin", 0x000000, 0x010000, CRC(0de2a0da) SHA1(5f6ce61f2ad1e50f0eac3a115c511151bbb00fd2) ) ROM_LOAD16_BYTE( "at1sp1.bin", 0x000001, 0x010000, CRC(02d15fbe) SHA1(7c1bc845a06188ebe2efdb5880562beae11a7b4f) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "at1snd0.bin", 0x00c000, 0x004000, CRC(1d1ffe12) SHA1(5a49bf1eef981df69abac28132af65670ba01118) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "at1snd0.bin", 0x000000, 0x020000, CRC(1d1ffe12) SHA1(5a49bf1eef981df69abac28132af65670ba01118) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65b.bin", 0x000000, 0x008000, CRC(e9f2922a) SHA1(5767d2f85e1eb3de19192e73b02221f28b1fbb83) ) @@ -2338,10 +2533,8 @@ ROM_START( burnforc ) ROM_LOAD16_BYTE( "bu1_spr0.bin", 0x000000, 0x010000, CRC(17022a21) SHA1(331fb1a8e97f21bd5e0a5889fc960b1d187f1ee1) ) ROM_LOAD16_BYTE( "bu1_spr1.bin", 0x000001, 0x010000, CRC(5255f8a5) SHA1(e2253b98a1b7b7c761ea71c201320711dc7d2e32) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "bu1_snd0.bin", 0x00c000, 0x004000, CRC(fabb1150) SHA1(61e3133adf8d593419f70a854ff91dd5011de3b3) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "bu1_snd0.bin", 0x000000, 0x020000, CRC(fabb1150) SHA1(61e3133adf8d593419f70a854ff91dd5011de3b3) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -2389,10 +2582,8 @@ ROM_START( burnforco ) ROM_LOAD16_BYTE( "bu1_spr0.bin", 0x000000, 0x010000, CRC(17022a21) SHA1(331fb1a8e97f21bd5e0a5889fc960b1d187f1ee1) ) ROM_LOAD16_BYTE( "bu1_spr1.bin", 0x000001, 0x010000, CRC(5255f8a5) SHA1(e2253b98a1b7b7c761ea71c201320711dc7d2e32) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "bu1_snd0.bin", 0x00c000, 0x004000, CRC(fabb1150) SHA1(61e3133adf8d593419f70a854ff91dd5011de3b3) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "bu1_snd0.bin", 0x000000, 0x020000, CRC(fabb1150) SHA1(61e3133adf8d593419f70a854ff91dd5011de3b3) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -2441,10 +2632,8 @@ ROM_START( cosmogng ) ROM_LOAD16_BYTE( "co1spr0.bin", 0x000000, 0x020000, CRC(bba2c28f) SHA1(5adf4eb9d24833e462a240253ab9ac0205cb6501) ) ROM_LOAD16_BYTE( "co1spr1.bin", 0x000001, 0x020000, CRC(c029b459) SHA1(b92c0d24449b8db352bbbd782dc43af0640479e5) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "co2_s0", 0x00c000, 0x004000, CRC(4ca59338) SHA1(95916977ab4e0704216984ceed66df7b9e1fdf44) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "co2_s0", 0x000000, 0x020000, CRC(4ca59338) SHA1(95916977ab4e0704216984ceed66df7b9e1fdf44) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -2486,10 +2675,8 @@ ROM_START( cosmogngj ) ROM_LOAD16_BYTE( "co1spr0.bin", 0x000000, 0x020000, CRC(bba2c28f) SHA1(5adf4eb9d24833e462a240253ab9ac0205cb6501) ) ROM_LOAD16_BYTE( "co1spr1.bin", 0x000001, 0x020000, CRC(c029b459) SHA1(b92c0d24449b8db352bbbd782dc43af0640479e5) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "co1snd0.bin", 0x00c000, 0x004000, CRC(6bfa619f) SHA1(71e57adf320034d6cacd9f4a9e93891c8143542f) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "co1snd0.bin", 0x000000, 0x020000, CRC(6bfa619f) SHA1(71e57adf320034d6cacd9f4a9e93891c8143542f) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -2531,10 +2718,8 @@ ROM_START( dirtfoxj ) ROM_LOAD16_BYTE( "df1_spr0.bin", 0x000000, 0x020000, CRC(d4906585) SHA1(b205663f60f682f2e645c2a0118c7bf14d2b0651) ) ROM_LOAD16_BYTE( "df1_spr1.bin", 0x000001, 0x020000, CRC(7d76cf57) SHA1(cd13deb8131f87fd9bbf5caa8b3d6f88bc8d4d7d) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "df1_snd0.bin", 0x00c000, 0x004000, CRC(66b4f3ab) SHA1(b165b2b222c0ce62a16f09e4a0741ca8459b624d) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "df1_snd0.bin", 0x000000, 0x020000, CRC(66b4f3ab) SHA1(b165b2b222c0ce62a16f09e4a0741ca8459b624d) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -2570,6 +2755,9 @@ ROM_START( dirtfoxj ) ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */ ROM_LOAD( "df1_voi1.bin", 0x000000, 0x080000, CRC(15053904) SHA1(b8ca7e5e53249dbee8284ce1e5c0e6438e64b2cf) ) + + ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */ + ROM_LOAD( "nvram", 0x000000, 0x2000, CRC(4b9f7b06) SHA1(384496d2d80a48d31084dc316ebae3a5c1aa1ab9) ) ROM_END /* DRAGON SABER */ @@ -2582,11 +2770,9 @@ ROM_START( dsaber ) ROM_LOAD16_BYTE( "do1 spr0.spr0", 0x000000, 0x010000, CRC(013faf80) SHA1(2cb086e9bb6a551e9fc185c40b976989f758cc57) ) ROM_LOAD16_BYTE( "do1 spr1.spr1", 0x000001, 0x010000, CRC(c36242bb) SHA1(776f0ab4b2798bc7fc293e27a455675c01ff3132) ) - ROM_REGION( 0x050000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "do1 snd0.snd0", 0x00c000, 0x004000, CRC(af5b1ff8) SHA1(fc2a104788f081e4d2ddd22c586e541d6c5b5d69) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) - ROM_LOAD( "do1 snd1.snd1", 0x030000, 0x020000, CRC(c4ca6f3f) SHA1(829a053451be07b296fb4d97818d59eb1e68c807) ) + ROM_REGION( 0x040000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "do1 snd0.snd0", 0x000000, 0x020000, CRC(af5b1ff8) SHA1(fc2a104788f081e4d2ddd22c586e541d6c5b5d69) ) + ROM_LOAD( "do1 snd1.snd1", 0x020000, 0x020000, CRC(c4ca6f3f) SHA1(829a053451be07b296fb4d97818d59eb1e68c807) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -2632,11 +2818,9 @@ ROM_START( dsabera ) ROM_LOAD16_BYTE( "do1 spr0.spr0", 0x000000, 0x010000, CRC(013faf80) SHA1(2cb086e9bb6a551e9fc185c40b976989f758cc57) ) ROM_LOAD16_BYTE( "do1 spr1.spr1", 0x000001, 0x010000, CRC(c36242bb) SHA1(776f0ab4b2798bc7fc293e27a455675c01ff3132) ) - ROM_REGION( 0x050000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "do1 snd0.snd0", 0x00c000, 0x004000, CRC(af5b1ff8) SHA1(fc2a104788f081e4d2ddd22c586e541d6c5b5d69) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) - ROM_LOAD( "do1 snd1.snd1", 0x030000, 0x020000, CRC(c4ca6f3f) SHA1(829a053451be07b296fb4d97818d59eb1e68c807) ) + ROM_REGION( 0x040000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "do1 snd0.snd0", 0x000000, 0x020000, CRC(af5b1ff8) SHA1(fc2a104788f081e4d2ddd22c586e541d6c5b5d69) ) + ROM_LOAD( "do1 snd1.snd1", 0x020000, 0x020000, CRC(c4ca6f3f) SHA1(829a053451be07b296fb4d97818d59eb1e68c807) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -2681,11 +2865,9 @@ ROM_START( dsaberj ) ROM_LOAD16_BYTE( "do1 spr0.spr0", 0x000000, 0x010000, CRC(013faf80) SHA1(2cb086e9bb6a551e9fc185c40b976989f758cc57) ) ROM_LOAD16_BYTE( "do1 spr1.spr1", 0x000001, 0x010000, CRC(c36242bb) SHA1(776f0ab4b2798bc7fc293e27a455675c01ff3132) ) - ROM_REGION( 0x050000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "do1 snd0.snd0", 0x00c000, 0x004000, CRC(af5b1ff8) SHA1(fc2a104788f081e4d2ddd22c586e541d6c5b5d69) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) - ROM_LOAD( "do1 snd1.snd1", 0x030000, 0x020000, CRC(c4ca6f3f) SHA1(829a053451be07b296fb4d97818d59eb1e68c807) ) + ROM_REGION( 0x040000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "do1 snd0.snd0", 0x000000, 0x020000, CRC(af5b1ff8) SHA1(fc2a104788f081e4d2ddd22c586e541d6c5b5d69) ) + ROM_LOAD( "do1 snd1.snd1", 0x020000, 0x020000, CRC(c4ca6f3f) SHA1(829a053451be07b296fb4d97818d59eb1e68c807) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -2730,10 +2912,8 @@ ROM_START( finallap ) ROM_LOAD16_BYTE( "fl1-sp0", 0x000000, 0x010000, CRC(2c5ff15d) SHA1(762b49016e8688a3b323b85bc4009b1745f86a3f) ) ROM_LOAD16_BYTE( "fl1-sp1", 0x000001, 0x010000, CRC(ea9d1a2e) SHA1(37f96306c49475bf45157f768c9173a057bade20) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "fl1-s0b", 0x00c000, 0x004000, CRC(f5d76989) SHA1(05c45ccc60fe833cee04f8300620bea5fecc110f) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "fl1-s0b", 0x000000, 0x020000, CRC(f5d76989) SHA1(05c45ccc60fe833cee04f8300620bea5fecc110f) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ /* no external MCU ROM? previously loaded type C, but the game predates it */ @@ -2784,10 +2964,8 @@ ROM_START( finallapd ) ROM_LOAD16_BYTE( "fl1-sp0", 0x000000, 0x010000, CRC(2c5ff15d) SHA1(762b49016e8688a3b323b85bc4009b1745f86a3f) ) ROM_LOAD16_BYTE( "fl1-sp1", 0x000001, 0x010000, CRC(ea9d1a2e) SHA1(37f96306c49475bf45157f768c9173a057bade20) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "fl1-s0b", 0x00c000, 0x004000, CRC(f5d76989) SHA1(05c45ccc60fe833cee04f8300620bea5fecc110f) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "fl1-s0b", 0x000000, 0x020000, CRC(f5d76989) SHA1(05c45ccc60fe833cee04f8300620bea5fecc110f) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ /* no external MCU ROM? previously loaded type C, but the game predates it */ @@ -2838,10 +3016,8 @@ ROM_START( finallapc ) ROM_LOAD16_BYTE( "fl1-sp0", 0x000000, 0x010000, CRC(2c5ff15d) SHA1(762b49016e8688a3b323b85bc4009b1745f86a3f) ) ROM_LOAD16_BYTE( "fl1-sp1", 0x000001, 0x010000, CRC(ea9d1a2e) SHA1(37f96306c49475bf45157f768c9173a057bade20) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "fl1-s0", 0x00c000, 0x004000, CRC(1f8ff494) SHA1(10a90291159e29a905c6d438aa2bc98ccf906a69) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "fl1-s0", 0x000000, 0x020000, CRC(1f8ff494) SHA1(10a90291159e29a905c6d438aa2bc98ccf906a69) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ /* no external MCU ROM? previously loaded type C, but the game predates it */ @@ -2892,10 +3068,8 @@ ROM_START( finallapjc ) ROM_LOAD16_BYTE( "fl1-sp0", 0x000000, 0x010000, CRC(2c5ff15d) SHA1(762b49016e8688a3b323b85bc4009b1745f86a3f) ) ROM_LOAD16_BYTE( "fl1-sp1", 0x000001, 0x010000, CRC(ea9d1a2e) SHA1(37f96306c49475bf45157f768c9173a057bade20) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "fl1_s0b", 0x00c000, 0x004000, CRC(f5d76989) SHA1(05c45ccc60fe833cee04f8300620bea5fecc110f) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "fl1-s0b", 0x000000, 0x020000, CRC(f5d76989) SHA1(05c45ccc60fe833cee04f8300620bea5fecc110f) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ /* no external MCU ROM? previously loaded type C, but the game predates it */ @@ -2946,10 +3120,8 @@ ROM_START( finallapjb ) ROM_LOAD16_BYTE( "fl1-sp0", 0x000000, 0x010000, CRC(2c5ff15d) SHA1(762b49016e8688a3b323b85bc4009b1745f86a3f) ) ROM_LOAD16_BYTE( "fl1-sp1", 0x000001, 0x010000, CRC(ea9d1a2e) SHA1(37f96306c49475bf45157f768c9173a057bade20) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "fl1_s0.bin", 0x00c000, 0x004000, CRC(1f8ff494) SHA1(10a90291159e29a905c6d438aa2bc98ccf906a69) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "fl1-s0", 0x000000, 0x020000, CRC(1f8ff494) SHA1(10a90291159e29a905c6d438aa2bc98ccf906a69) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ /* no external MCU ROM? previously loaded type C, but the game predates it */ @@ -2999,13 +3171,11 @@ ROM_START( finalap2 ) ROM_LOAD16_BYTE( "fls2sp0b", 0x000000, 0x020000, CRC(8bf15d9c) SHA1(b6c14a9d06e99d03636fd6eb2163a18e2bbcc4b1) ) ROM_LOAD16_BYTE( "fls2sp1b", 0x000001, 0x020000, CRC(c1a31086) SHA1(55317b72a219ffbfe00bf62ad2a635790d56f84e) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "flss0", 0x00c000, 0x004000, CRC(c07cc10a) SHA1(012f19a8014a77fdf0409241c0223b2c0c247357) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "flss0", 0x000000, 0x020000, CRC(c07cc10a) SHA1(012f19a8014a77fdf0409241c0223b2c0c247357) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, BAD_DUMP CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) /* not sure */ + ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "fl2obj0", 0x000000, 0x80000, CRC(3657dd7a) SHA1(8f286ec0642b09ff42bf0dbd784ae257d4ab278a) ) @@ -3055,13 +3225,11 @@ ROM_START( finalap2j ) ROM_LOAD16_BYTE( "fls2sp0b", 0x000000, 0x020000, CRC(8bf15d9c) SHA1(b6c14a9d06e99d03636fd6eb2163a18e2bbcc4b1) ) ROM_LOAD16_BYTE( "fls2sp1b", 0x000001, 0x020000, CRC(c1a31086) SHA1(55317b72a219ffbfe00bf62ad2a635790d56f84e) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "flss0", 0x00c000, 0x004000, CRC(c07cc10a) SHA1(012f19a8014a77fdf0409241c0223b2c0c247357) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "flss0", 0x000000, 0x020000, CRC(c07cc10a) SHA1(012f19a8014a77fdf0409241c0223b2c0c247357) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, BAD_DUMP CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) /* not sure */ + ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "fl2obj0", 0x000000, 0x80000, CRC(3657dd7a) SHA1(8f286ec0642b09ff42bf0dbd784ae257d4ab278a) ) @@ -3112,13 +3280,11 @@ ROM_START( finalap3 ) // this set displays MOTION (Ver. 3) in the test mode menu ROM_LOAD16_BYTE( "flt1_sp0.11k", 0x000000, 0x020000, CRC(e804ced1) SHA1(b31e1fddd202ba503b28455a270e8d45a348dc2e) ) ROM_LOAD16_BYTE( "flt1_sp1.13k", 0x000001, 0x020000, CRC(3a2b24ee) SHA1(e4f16f30516dab13cc8b1cb6c80ec1df129f8851) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "flt1_snd0.7j", 0x00c000, 0x004000, CRC(60b72aed) SHA1(f12e157ae5e9f373ba1d75012b869b1c4ad9fb00) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "flt1_snd0.7j", 0x000000, 0x020000, CRC(60b72aed) SHA1(f12e157ae5e9f373ba1d75012b869b1c4ad9fb00) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "flt_obj-0.4c", 0x000000, 0x80000, CRC(eab19ec6) SHA1(2859e88b94aa873f3b6ba22790f2211f3e172dd1) ) @@ -3172,13 +3338,11 @@ ROM_START( finalap3a ) ROM_LOAD16_BYTE( "flt1_sp0.11k", 0x000000, 0x020000, CRC(e804ced1) SHA1(b31e1fddd202ba503b28455a270e8d45a348dc2e) ) ROM_LOAD16_BYTE( "flt1_sp1.13k", 0x000001, 0x020000, CRC(3a2b24ee) SHA1(e4f16f30516dab13cc8b1cb6c80ec1df129f8851) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "flt1_snd0.7j", 0x00c000, 0x004000, CRC(60b72aed) SHA1(f12e157ae5e9f373ba1d75012b869b1c4ad9fb00) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "flt1_snd0.7j", 0x000000, 0x020000, CRC(60b72aed) SHA1(f12e157ae5e9f373ba1d75012b869b1c4ad9fb00) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "flt_obj-0.4c", 0x000000, 0x80000, CRC(eab19ec6) SHA1(2859e88b94aa873f3b6ba22790f2211f3e172dd1) ) @@ -3235,13 +3399,11 @@ ROM_START( finalap3j ) ROM_LOAD16_BYTE( "flt1_sp0.11k", 0x000000, 0x020000, CRC(e804ced1) SHA1(b31e1fddd202ba503b28455a270e8d45a348dc2e) ) ROM_LOAD16_BYTE( "flt1_sp1.13k", 0x000001, 0x020000, CRC(3a2b24ee) SHA1(e4f16f30516dab13cc8b1cb6c80ec1df129f8851) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "flt1_snd0.7j", 0x00c000, 0x004000, CRC(60b72aed) SHA1(f12e157ae5e9f373ba1d75012b869b1c4ad9fb00) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "flt1_snd0.7j", 0x000000, 0x020000, CRC(60b72aed) SHA1(f12e157ae5e9f373ba1d75012b869b1c4ad9fb00) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "flt_obj-0.4c", 0x000000, 0x80000, CRC(eab19ec6) SHA1(2859e88b94aa873f3b6ba22790f2211f3e172dd1) ) @@ -3294,13 +3456,11 @@ ROM_START( finalap3jc ) ROM_LOAD16_BYTE( "flt1_sp0.11k", 0x000000, 0x020000, CRC(e804ced1) SHA1(b31e1fddd202ba503b28455a270e8d45a348dc2e) ) ROM_LOAD16_BYTE( "flt1_sp1.13k", 0x000001, 0x020000, CRC(3a2b24ee) SHA1(e4f16f30516dab13cc8b1cb6c80ec1df129f8851) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "flt1_snd0.7j", 0x00c000, 0x004000, CRC(60b72aed) SHA1(f12e157ae5e9f373ba1d75012b869b1c4ad9fb00) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "flt1_snd0.7j", 0x000000, 0x020000, CRC(60b72aed) SHA1(f12e157ae5e9f373ba1d75012b869b1c4ad9fb00) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "flt_obj-0.4c", 0x000000, 0x80000, CRC(eab19ec6) SHA1(2859e88b94aa873f3b6ba22790f2211f3e172dd1) ) @@ -3352,13 +3512,11 @@ ROM_START( finalap3bl ) // bootleg set ROM_LOAD16_BYTE( "flt1sp0", 0x000000, 0x020000, CRC(e804ced1) SHA1(b31e1fddd202ba503b28455a270e8d45a348dc2e) ) ROM_LOAD16_BYTE( "flt1sp1", 0x000001, 0x020000, CRC(3a2b24ee) SHA1(e4f16f30516dab13cc8b1cb6c80ec1df129f8851) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "flt1snd0", 0x00c000, 0x004000, CRC(60b72aed) SHA1(f12e157ae5e9f373ba1d75012b869b1c4ad9fb00) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "flt1_snd0.7j", 0x000000, 0x020000, CRC(60b72aed) SHA1(f12e157ae5e9f373ba1d75012b869b1c4ad9fb00) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "fltobj0", 0x000000, 0x80000, CRC(eab19ec6) SHA1(2859e88b94aa873f3b6ba22790f2211f3e172dd1) ) @@ -3411,10 +3569,8 @@ ROM_START( finehour ) ROM_LOAD16_BYTE( "fh1_sp0.bin", 0x000000, 0x020000, CRC(aa6289e9) SHA1(d20a62481c3ea386a9eee952388d9cb7137e07de) ) ROM_LOAD16_BYTE( "fh1_sp1.bin", 0x000001, 0x020000, CRC(8532d5c7) SHA1(b32416e444393c0ba685a9d11bb7fba7a53f63db) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "fh1_sd0.bin", 0x00c000, 0x004000, CRC(059a9cfd) SHA1(6b9ba6c270c90b382bd4c656e0ddca076a04a919) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "fh1_sd0.bin", 0x000000, 0x020000, CRC(059a9cfd) SHA1(6b9ba6c270c90b382bd4c656e0ddca076a04a919) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -3624,10 +3780,8 @@ ROM_START( fourtrax ) ROM_LOAD16_BYTE( "fx2_sp0.11k", 0x000000, 0x020000, CRC(48548e78) SHA1(b3a9de8682fe63c1c3ecab3e3f9380a884efd4af) ) ROM_LOAD16_BYTE( "fx2_sp1.13k", 0x000001, 0x020000, CRC(d2861383) SHA1(36be5a8c8a19f35f9a9bd3ef725a83c5e58ccbe0) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "fx1_sd0.7j", 0x00c000, 0x004000, CRC(acccc934) SHA1(98f1a823ba7e3f258a73d5780953f9339d438e1a) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "fx1_sd0.7j", 0x000000, 0x020000, CRC(acccc934) SHA1(98f1a823ba7e3f258a73d5780953f9339d438e1a) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -3679,19 +3833,82 @@ ROM_START( fourtrax ) ROM_LOAD( "fx_voi-1.3m", 0x000000, 0x080000, CRC(6173364f) SHA1(cc426f49b7e87b11f1f51e8e10db7cad87ffb44d) ) ROM_END +ROM_START( fourtraxj ) + ROM_REGION( 0x040000, "maincpu", 0 ) /* Master CPU */ + ROM_LOAD16_BYTE( "fx1_mp0.11d", 0x000000, 0x020000, CRC(35a690b1) SHA1(0e5157d0b1b54aaac22f725e712bb61104f199e3) ) + ROM_LOAD16_BYTE( "fx1_mp1.13d", 0x000001, 0x020000, CRC(005bda8b) SHA1(2f258a30ff307e06b715321e48b3b649bce6648a) ) + + ROM_REGION( 0x040000, "slave", 0 ) /* Slave CPU */ + ROM_LOAD16_BYTE( "fx1_sp0.11k", 0x000000, 0x020000, CRC(48548e78) SHA1(b3a9de8682fe63c1c3ecab3e3f9380a884efd4af) ) // same content as fx2 set, different label + ROM_LOAD16_BYTE( "fx1_sp1.13k", 0x000001, 0x020000, CRC(d2861383) SHA1(36be5a8c8a19f35f9a9bd3ef725a83c5e58ccbe0) ) // same content as fx2 set, different label + + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "fx1_sd0.7j", 0x000000, 0x020000, CRC(acccc934) SHA1(98f1a823ba7e3f258a73d5780953f9339d438e1a) ) + + ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ + ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) + + ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ + ROM_LOAD( "fx_obj-0.4c", 0x000000, 0x040000, CRC(1aa60ffa) SHA1(1fa625a52c763b8db718af14e9f3cc3e076ff83b) ) + ROM_LOAD( "fx_obj-1.3c", 0x040000, 0x040000, CRC(7509bc09) SHA1(823d8d884afc685dda26c1256c2d241c7f626f9e) ) + ROM_LOAD( "fx_obj-4.4a", 0x080000, 0x040000, CRC(30add52a) SHA1(ff782d9dca96967233e435c3dd7d69ffde45db43) ) + ROM_LOAD( "fx_obj-5.3a", 0x0c0000, 0x040000, CRC(e3cd2776) SHA1(6155e9ad90b8a885125c8a76e9c068247e7693ae) ) + ROM_LOAD( "fx_obj-8.8c", 0x100000, 0x040000, CRC(b165acab) SHA1(86bd2cc22e25ddbf73e62426762aa72205868660) ) + ROM_LOAD( "fx_obj-9.7c", 0x140000, 0x040000, CRC(90f0735b) SHA1(2adbe72c6547075c0cc0386789cc1b8c1a0bc84f) ) + ROM_LOAD( "fx_obj-12.8a", 0x180000, 0x040000, CRC(f5e23b78) SHA1(99896bd7c6663e3f57cb5d206964b81b5d64c8b6) ) + ROM_LOAD( "fx_obj-13.7a", 0x1c0000, 0x040000, CRC(04a25007) SHA1(0c33450b0d6907754dbf1914849d1630baa824bd) ) + ROM_LOAD( "fx_obj2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) ) + ROM_LOAD( "fx_obj-3.1c", 0x240000, 0x040000, CRC(b7e5d17d) SHA1(3d8ea7cbf33b595ddf739024e8d0fccd5f9e073b) ) + ROM_LOAD( "fx_obj6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) ) + ROM_LOAD( "fx_obj7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) ) + ROM_LOAD( "fx_obj10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) ) + ROM_LOAD( "fx_obj-11.5c", 0x340000, 0x040000, CRC(514b3fe5) SHA1(19562ba2ac04a16d335bdc81b34d929f7ff9161c) ) + ROM_LOAD( "fx_obj-14.6a", 0x380000, 0x040000, CRC(c1658c77) SHA1(ec689d0e5cf95085c193aa8949c6ec6e7243338b) ) + ROM_LOAD( "fx_obj15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) ) + + ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles */ + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) ) + NAMCOS2_GFXROM_LOAD_128K( "fx2_ch2.11r", 0x100000, CRC(fdf1e86b) SHA1(91a61c10a9e92f8bbc26ffc9cb72deb31378a843) ) // should this be the same, fx2 is the world set label, needs checking + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-6.9r", 0x300000, CRC(c3dba42e) SHA1(2b5a8fabec11ccd44156ecfccf86fc713845d262) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-7.9s", 0x380000, CRC(c009f3ae) SHA1(394beed29bda97f4f5ba532bc0bd22177154746b) ) + + ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASEFF ) /* ROZ Tiles */ + /* No ROZ files in zip */ + + ROM_REGION( 0x080000, "gfx4", 0 ) /* Mask shape */ + NAMCOS2_GFXROM_LOAD_128K( "fx_sha.7n", 0x000000, CRC(f7aa4af7) SHA1(b18ffda9e35beb0f072825e2899691be370f33b1) ) + + ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */ + NAMCOS2_DATA_LOAD_E_256K( "fx_dat0.13s", 0x000000, CRC(63abf69b) SHA1(6776991eeff434bf9720f49ad6e62c37fc7ddf40) ) + NAMCOS2_DATA_LOAD_O_256K( "fx_dat1.13r", 0x000000, CRC(725bed14) SHA1(bbf886ac7f8c2c7857bc0b5d7f8fc7e63e8e9559) ) + NAMCOS2_DATA_LOAD_E_256K( "fx_dat2.13p", 0x100000, CRC(71e4a5a0) SHA1(a0188c920a43c5e69e25464627094b6b6ed26a59) ) + NAMCOS2_DATA_LOAD_O_256K( "fx_dat3.13n", 0x100000, CRC(605725f7) SHA1(b94ce0ec37f879a5e46a097058cb2dd57e2281f1) ) + + ROM_REGION( 0x100, "c45_road:clut", 0 ) /* prom for road colors */ + ROM_LOAD( "fx1_1.5b", 0, 0x100, CRC(85ffd753) SHA1(7dbc8c295204877f41289141a146aa4f5f9f9c96) ) + + ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */ + ROM_LOAD( "fx_voi-1.3m", 0x000000, 0x080000, CRC(6173364f) SHA1(cc426f49b7e87b11f1f51e8e10db7cad87ffb44d) ) +ROM_END + +// this is a strange, it's based on the fx2 set, but with one of the 68k pair modified (21 bytes changed) and a unique GFX rom? +// changes seem to be related to the trackside advertising banners ROM_START( fourtraxa ) ROM_REGION( 0x040000, "maincpu", 0 ) /* Master CPU */ - ROM_LOAD16_BYTE( "fx4_mp0.11d", 0x000000, 0x020000, CRC(f87b3dce) SHA1(a0534c47c3197e38dc277d6b91d6d990a89844df) ) - ROM_LOAD16_BYTE( "fx4_mp1.13d", 0x000001, 0x020000, CRC(d82f7c20) SHA1(a818ff89362044a5257a0a9b701feaad84496d88) ) + // the old dump of this set only differed in having a 0x00 fill in the 2nd half instead of a 0xff fill + ROM_LOAD16_BYTE( "fx4_mp0a.11d", 0x000000, 0x020000, CRC(f147cd6b) SHA1(7cdadd68d55dd8fa9b19cbee1434d9266ae1f4b9) ) // == fx2_mp0.11d + ROM_LOAD16_BYTE( "fx4_mp1a.13d", 0x000001, 0x020000, CRC(d1138c85) SHA1(32bf68ae36f72b84f3c3df28425147b6aaac1edf) ) ROM_REGION( 0x040000, "slave", 0 ) /* Slave CPU */ ROM_LOAD16_BYTE( "fx1_sp0.11k", 0x000000, 0x020000, CRC(41687edd) SHA1(1e79dc9abe5614f836e89b376be1dc70deaac889) ) ROM_LOAD16_BYTE( "fx1_sp1.13k", 0x000001, 0x020000, CRC(dbbae326) SHA1(6743054f7796bd5b1d24fa9cf0095544420b2c76) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "fx1_sd0.7j", 0x00c000, 0x004000, CRC(acccc934) SHA1(98f1a823ba7e3f258a73d5780953f9339d438e1a) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "fx1_sd0.7j", 0x000000, 0x020000, CRC(acccc934) SHA1(98f1a823ba7e3f258a73d5780953f9339d438e1a) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -3717,7 +3934,7 @@ ROM_START( fourtraxa ) ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles */ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) ) NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) ) - NAMCOS2_GFXROM_LOAD_128K( "fx4_ch2.11r", 0x100000, CRC(a5d1ab10) SHA1(8624ef0911c57155b46e184d10cb122d4a41a2de) ) + NAMCOS2_GFXROM_LOAD_128K( "fx4_ch-2a.11r",0x100000, CRC(a5d1ab10) SHA1(8624ef0911c57155b46e184d10cb122d4a41a2de) ) // unique to this set, mask ROM intentionally replaced NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) ) NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) ) NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) ) @@ -3754,10 +3971,8 @@ ROM_START( marvland ) ROM_LOAD16_BYTE( "mv2_spr1", 0x000001, 0x010000, CRC(dbd94def) SHA1(56a8d7acd483bc4d12c8bc5b7e90ffdb132be670) ) // This needs re-dumping, sound is very poor in this version and doesn't match Japanese version or any of the ports. High res photos of PCB required too. - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "mv2_snd0", 0x00c000, 0x004000, BAD_DUMP CRC(a5b99162) SHA1(cafe8d1dae1e981c7ff9b70076b3e1d52cd806f7) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "mv2_snd0", 0x000000, 0x020000, BAD_DUMP CRC(a5b99162) SHA1(cafe8d1dae1e981c7ff9b70076b3e1d52cd806f7) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -3804,10 +4019,8 @@ ROM_START( marvlandj ) ROM_LOAD16_BYTE( "mv1-spr0.bin", 0x000000, 0x010000, CRC(c3909925) SHA1(bf76cb77c38787574bf75caf868700316894895c) ) ROM_LOAD16_BYTE( "mv1-spr1.bin", 0x000001, 0x010000, CRC(1c5599f5) SHA1(6bdf11da4e2a56c6bb6011977b045d9537d0597f) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "mv1-snd0.bin", 0x00c000, 0x004000, CRC(51b8ccd7) SHA1(5aacb020c12d9a3c43c098f3abd8358bc18acc64) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "mv1-snd0.bin", 0x000000, 0x020000, CRC(51b8ccd7) SHA1(5aacb020c12d9a3c43c098f3abd8358bc18acc64) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -3852,10 +4065,8 @@ ROM_START( metlhawk ) ROM_LOAD16_BYTE( "mh1sp0f.11k", 0x000000, 0x010000, CRC(2c141fea) SHA1(b767bbb69843df9916a042cae5a8ff745e30b9d3) ) ROM_LOAD16_BYTE( "mh1sp1f.13k", 0x000001, 0x010000, CRC(8ccf98e0) SHA1(c4a0b573553fd609751e6f227f7ee3f28f78f589) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "mh1s0.7j", 0x00c000, 0x004000, CRC(79e054cf) SHA1(934a15a1bdb2751f28cc23471d1c5e5b9af80815) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "mh1s0.7j", 0x000000, 0x020000, CRC(79e054cf) SHA1(934a15a1bdb2751f28cc23471d1c5e5b9af80815) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -3922,10 +4133,8 @@ ROM_START( metlhawkj ) ROM_LOAD16_BYTE( "mh1sp0f.11k", 0x000000, 0x010000, CRC(2c141fea) SHA1(b767bbb69843df9916a042cae5a8ff745e30b9d3) ) ROM_LOAD16_BYTE( "mh1sp1f.13k", 0x000001, 0x010000, CRC(8ccf98e0) SHA1(c4a0b573553fd609751e6f227f7ee3f28f78f589) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "mh1s0.7j", 0x00c000, 0x004000, CRC(79e054cf) SHA1(934a15a1bdb2751f28cc23471d1c5e5b9af80815) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "mh1s0.7j", 0x000000, 0x020000, CRC(79e054cf) SHA1(934a15a1bdb2751f28cc23471d1c5e5b9af80815) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -3992,10 +4201,8 @@ ROM_START( mirninja ) ROM_LOAD16_BYTE( "mn1_spr0.bin", 0x000000, 0x010000, CRC(3f1a17be) SHA1(0d6a4e26235f44db4ad217b859c3d215f4e9b423) ) ROM_LOAD16_BYTE( "mn1_spr1.bin", 0x000001, 0x010000, CRC(2bc66f60) SHA1(7b778ee3a24f57d43c9bcffbdb77cf8be2463c2d) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "mn_snd0.bin", 0x00c000, 0x004000, CRC(6aa1ae84) SHA1(2186f93c4ccc4c202fa14d80b440060237659fc5) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "mn_snd0.bin", 0x000000, 0x020000, CRC(6aa1ae84) SHA1(2186f93c4ccc4c202fa14d80b440060237659fc5) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65b.bin", 0x000000, 0x008000, CRC(e9f2922a) SHA1(5767d2f85e1eb3de19192e73b02221f28b1fbb83) ) @@ -4046,10 +4253,8 @@ ROM_START( ordyne ) ROM_LOAD16_BYTE( "or1_sp0.spr0", 0x000000, 0x010000, CRC(01ef6638) SHA1(403abd548014b671658aa7d40414b09c095c831d) ) ROM_LOAD16_BYTE( "or1_sp1.spr1", 0x000001, 0x010000, CRC(b632adc3) SHA1(3d301d4ce9bf835c0f4c8ef883dba3fc4e3a5f12) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "or1_sd.snd0", 0x00c000, 0x004000, CRC(c41e5d22) SHA1(7cb98d8068ddf92aadf0228b977df2ce1d866466) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "or1_sd.snd0", 0x000000, 0x020000, CRC(c41e5d22) SHA1(7cb98d8068ddf92aadf0228b977df2ce1d866466) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2_c65b.3f", 0x000000, 0x008000, CRC(e9f2922a) SHA1(5767d2f85e1eb3de19192e73b02221f28b1fbb83) ) @@ -4104,10 +4309,8 @@ ROM_START( ordyneje ) ROM_LOAD16_BYTE( "or1_sp0.spr0", 0x000000, 0x010000, CRC(01ef6638) SHA1(403abd548014b671658aa7d40414b09c095c831d) ) ROM_LOAD16_BYTE( "or1_sp1.spr1", 0x000001, 0x010000, CRC(b632adc3) SHA1(3d301d4ce9bf835c0f4c8ef883dba3fc4e3a5f12) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "or1_sd.snd0", 0x00c000, 0x004000, CRC(c41e5d22) SHA1(7cb98d8068ddf92aadf0228b977df2ce1d866466) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "or1_sd.snd0", 0x000000, 0x020000, CRC(c41e5d22) SHA1(7cb98d8068ddf92aadf0228b977df2ce1d866466) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2_c65b.3f", 0x000000, 0x008000, CRC(e9f2922a) SHA1(5767d2f85e1eb3de19192e73b02221f28b1fbb83) ) @@ -4162,10 +4365,8 @@ ROM_START( ordynej ) ROM_LOAD16_BYTE( "or1_sp0.spr0", 0x000000, 0x010000, CRC(01ef6638) SHA1(403abd548014b671658aa7d40414b09c095c831d) ) ROM_LOAD16_BYTE( "or1_sp1.spr1", 0x000001, 0x010000, CRC(b632adc3) SHA1(3d301d4ce9bf835c0f4c8ef883dba3fc4e3a5f12) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "or1_sd.snd0", 0x00c000, 0x004000, CRC(c41e5d22) SHA1(7cb98d8068ddf92aadf0228b977df2ce1d866466) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "or1_sd.snd0", 0x000000, 0x020000, CRC(c41e5d22) SHA1(7cb98d8068ddf92aadf0228b977df2ce1d866466) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2_c65b.3f", 0x000000, 0x008000, CRC(e9f2922a) SHA1(5767d2f85e1eb3de19192e73b02221f28b1fbb83) ) @@ -4220,10 +4421,8 @@ ROM_START( phelios ) ROM_LOAD16_BYTE( "ps2_spr0.spr0", 0x000000, 0x010000, CRC(e9c6987e) SHA1(325532b065999276e4629b10c27d7df083e81c33) ) ROM_LOAD16_BYTE( "ps2_spr1.spr1", 0x000001, 0x010000, CRC(02b074fb) SHA1(4025c3dd83e26ac87de9f2f73753d1cb1211c1ae) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "ps2_snd0.snd0", 0x00c000, 0x004000, CRC(da694838) SHA1(e1a20aedd18c49dcd12717e8ce479a5a441c10e6) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "ps2_snd0.snd0", 0x000000, 0x020000, CRC(da694838) SHA1(e1a20aedd18c49dcd12717e8ce479a5a441c10e6) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2_c65c.3f", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -4277,10 +4476,8 @@ ROM_START( pheliosj ) ROM_LOAD16_BYTE( "ps1_spr0.spr0", 0x000000, 0x010000, CRC(e9c6987e) SHA1(325532b065999276e4629b10c27d7df083e81c33) ) /* Same DATA as World set, but labeled PS1 */ ROM_LOAD16_BYTE( "ps1_spr1.spr1", 0x000001, 0x010000, CRC(02b074fb) SHA1(4025c3dd83e26ac87de9f2f73753d1cb1211c1ae) ) /* Same DATA as World set, but labeled PS1 */ - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "ps1_snd0.snd0", 0x00c000, 0x004000, CRC(da694838) SHA1(e1a20aedd18c49dcd12717e8ce479a5a441c10e6) ) /* Same DATA as World set, but labeled PS1 */ - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "ps1_snd0.snd0", 0x000000, 0x020000, CRC(da694838) SHA1(e1a20aedd18c49dcd12717e8ce479a5a441c10e6) ) /* Same DATA as World set, but labeled PS1 */ ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2_c65c.3f", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -4334,11 +4531,9 @@ ROM_START( rthun2 ) ROM_LOAD16_BYTE( "rts2_spr0.bin", 0x000000, 0x010000, CRC(54c22ac5) SHA1(747df2362839e6af15bdbf3298f9ea1c6e25f76a) ) ROM_LOAD16_BYTE( "rts2_spr1.bin", 0x000001, 0x010000, CRC(060eb393) SHA1(e8f7dd163df16747a74713a6cadd1d52c09b8036) ) - ROM_REGION( 0x050000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "rst1_snd0.bin", 0x00c000, 0x004000, CRC(55b7562a) SHA1(47b12206ec4a709769351f3f5b4a1c5ebb98b416) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) - ROM_LOAD( "rst1_snd1.bin", 0x030000, 0x020000, CRC(00445a4f) SHA1(2e136e3c38e4a1b69f80a19e07555f3269b7beb1) ) + ROM_REGION( 0x040000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "rst1_snd0.bin", 0x000000, 0x020000, CRC(55b7562a) SHA1(47b12206ec4a709769351f3f5b4a1c5ebb98b416) ) + ROM_LOAD( "rst1_snd1.bin", 0x020000, 0x020000, CRC(00445a4f) SHA1(2e136e3c38e4a1b69f80a19e07555f3269b7beb1) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -4379,11 +4574,9 @@ ROM_START( rthun2j ) ROM_LOAD16_BYTE( "rst1_spr0.bin", 0x000000, 0x010000, CRC(f8ef5150) SHA1(92fddf08b97210afe8d47386fe73078ffc00bd90) ) ROM_LOAD16_BYTE( "rst1_spr1.bin", 0x000001, 0x010000, CRC(52ed3a48) SHA1(21a9f0be29a7b121f1a8ca802af3a5ebf2c49cc0) ) - ROM_REGION( 0x050000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "rst1_snd0.bin", 0x00c000, 0x004000, CRC(55b7562a) SHA1(47b12206ec4a709769351f3f5b4a1c5ebb98b416) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) - ROM_LOAD( "rst1_snd1.bin", 0x030000, 0x020000, CRC(00445a4f) SHA1(2e136e3c38e4a1b69f80a19e07555f3269b7beb1) ) + ROM_REGION( 0x040000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "rst1_snd0.bin", 0x000000, 0x020000, CRC(55b7562a) SHA1(47b12206ec4a709769351f3f5b4a1c5ebb98b416) ) + ROM_LOAD( "rst1_snd1.bin", 0x020000, 0x020000, CRC(00445a4f) SHA1(2e136e3c38e4a1b69f80a19e07555f3269b7beb1) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -4412,7 +4605,7 @@ ROM_START( rthun2j ) ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */ ROM_LOAD( "rst1_voi1.bin", 0x000000, 0x080000, CRC(e42027cd) SHA1(fa3a81118c7f112289c27023236dec2e9cbc78b5) ) ROM_LOAD( "rst1_voi2.bin", 0x080000, 0x080000, CRC(0c4c2b66) SHA1(7723cbef755439a66d026015596fe1547ccd65b1) ) - + /* stuff below isn't used but loaded because it was on the board .. */ ROM_REGION( 0x0950, "plds", 0 ) ROM_LOAD( "pal12l10.8d", 0x0000, 0x0040, CRC(d3ae64a6) SHA1(8e56f447908246e84d5a79df1a1cd3d5c8a040fb) ) @@ -4432,13 +4625,11 @@ ROM_START( sgunner ) ROM_LOAD16_BYTE( "sn1spr0.11k", 0x000000, 0x010000, CRC(4638b512) SHA1(8a075f9739870ca90d5f1ac01ece6c0efe2f5f1a) ) ROM_LOAD16_BYTE( "sn1spr1.13k", 0x000001, 0x010000, CRC(e8b1ee73) SHA1(b459cb197807eb7cbc4ca34a1f52d7f46e23e37c) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "sn1_snd0.8j", 0x00c000, 0x004000, CRC(bdf36d44) SHA1(46ee7c1b320fec3296e2483d6a68a1f11bcf196d) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "sn1_snd0.8j", 0x000000, 0x020000, CRC(bdf36d44) SHA1(46ee7c1b320fec3296e2483d6a68a1f11bcf196d) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c68.3f", 0x000000, 0x008000, BAD_DUMP CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) /* not sure */ + ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "sn_obj0.8c", 0x000000, 0x80000, CRC(bbae38f7) SHA1(7a40ade13307791f5c5d300882f9a38e18c411d6) ) @@ -4482,13 +4673,11 @@ ROM_START( sgunnerj ) ROM_LOAD16_BYTE( "sn1spr0.11k", 0x000000, 0x010000, CRC(4638b512) SHA1(8a075f9739870ca90d5f1ac01ece6c0efe2f5f1a) ) ROM_LOAD16_BYTE( "sn1spr1.13k", 0x000001, 0x010000, CRC(e8b1ee73) SHA1(b459cb197807eb7cbc4ca34a1f52d7f46e23e37c) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "sn1_snd0.8j", 0x00c000, 0x004000, CRC(bdf36d44) SHA1(46ee7c1b320fec3296e2483d6a68a1f11bcf196d) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "sn1_snd0.8j", 0x000000, 0x020000, CRC(bdf36d44) SHA1(46ee7c1b320fec3296e2483d6a68a1f11bcf196d) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c68.3f", 0x000000, 0x008000, BAD_DUMP CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) /* not sure */ + ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "sn_obj0.8c", 0x000000, 0x80000, CRC(bbae38f7) SHA1(7a40ade13307791f5c5d300882f9a38e18c411d6) ) @@ -4532,10 +4721,8 @@ ROM_START( sgunner2 ) ROM_LOAD16_BYTE( "sns_spr0.bin", 0x000000, 0x010000, CRC(e5e40ed0) SHA1(7bd8cd9030ddb640613420388c26220d120a1244) ) ROM_LOAD16_BYTE( "sns_spr1.bin", 0x000001, 0x010000, CRC(3a85a5e9) SHA1(8528520c9b0fa4a38fbf0e3935418403c6d055a2) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "sns_snd0.bin", 0x00c000, 0x004000, CRC(f079cd32) SHA1(da507390b3e56ba4ad0f6e877d5ac82009b7bd32) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "sns_snd0.bin", 0x000000, 0x020000, CRC(f079cd32) SHA1(da507390b3e56ba4ad0f6e877d5ac82009b7bd32) ) ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ /* external ROM not populated, unclear how it would map */ @@ -4586,10 +4773,8 @@ ROM_START( sgunner2j ) ROM_LOAD16_BYTE( "sns_spr0.bin", 0x000000, 0x010000, CRC(e5e40ed0) SHA1(7bd8cd9030ddb640613420388c26220d120a1244) ) ROM_LOAD16_BYTE( "sns_spr1.bin", 0x000001, 0x010000, CRC(3a85a5e9) SHA1(8528520c9b0fa4a38fbf0e3935418403c6d055a2) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "sns_snd0.bin", 0x00c000, 0x004000, CRC(f079cd32) SHA1(da507390b3e56ba4ad0f6e877d5ac82009b7bd32) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "sns_snd0.bin", 0x000000, 0x020000, CRC(f079cd32) SHA1(da507390b3e56ba4ad0f6e877d5ac82009b7bd32) ) ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ /* external ROM not populated, unclear how it would map */ @@ -4640,13 +4825,11 @@ ROM_START( sws ) ROM_LOAD16_BYTE( "sst1spr0.bin", 0x000000, 0x020000, CRC(9777ee2f) SHA1(95b769402cea53c7f557aab97e0bea61edfd4a35) ) ROM_LOAD16_BYTE( "sst1spr1.bin", 0x000001, 0x020000, CRC(27a35c69) SHA1(cb23a357f6f608cb9afdeca9ea11d123b69272ef) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "sst1snd0.bin", 0x00c000, 0x004000, CRC(8fc45114) SHA1(d0dc5c8af8733f1ac7cbe46f0f6cfbe188124d42) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "sst1snd0.bin", 0x000000, 0x020000, CRC(8fc45114) SHA1(d0dc5c8af8733f1ac7cbe46f0f6cfbe188124d42) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "ss1_obj0.5b", 0x000000, 0x80000, CRC(9bd6add1) SHA1(34595987670d7f64ba18a840e98667b96ae5e4bf) ) @@ -4683,13 +4866,11 @@ ROM_START( sws92 ) ROM_LOAD16_BYTE( "sst1spr0.bin", 0x000000, 0x020000, CRC(9777ee2f) SHA1(95b769402cea53c7f557aab97e0bea61edfd4a35) ) ROM_LOAD16_BYTE( "sst1spr1.bin", 0x000001, 0x020000, CRC(27a35c69) SHA1(cb23a357f6f608cb9afdeca9ea11d123b69272ef) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "sst1snd0.bin", 0x00c000, 0x004000, CRC(8fc45114) SHA1(d0dc5c8af8733f1ac7cbe46f0f6cfbe188124d42) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "sst1snd0.bin", 0x000000, 0x020000, CRC(8fc45114) SHA1(d0dc5c8af8733f1ac7cbe46f0f6cfbe188124d42) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "sss_obj0.bin", 0x000000, 0x80000, CRC(375e8f1f) SHA1(b737bcceb498a66593d06ef102958bea90032106) ) @@ -4728,13 +4909,11 @@ ROM_START( sws92g ) ROM_LOAD16_BYTE( "sst1spr0.bin", 0x000000, 0x020000, CRC(9777ee2f) SHA1(95b769402cea53c7f557aab97e0bea61edfd4a35) ) ROM_LOAD16_BYTE( "sst1spr1.bin", 0x000001, 0x020000, CRC(27a35c69) SHA1(cb23a357f6f608cb9afdeca9ea11d123b69272ef) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "sst1snd0.bin", 0x00c000, 0x004000, CRC(8fc45114) SHA1(d0dc5c8af8733f1ac7cbe46f0f6cfbe188124d42) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "sst1snd0.bin", 0x000000, 0x020000, CRC(8fc45114) SHA1(d0dc5c8af8733f1ac7cbe46f0f6cfbe188124d42) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "sss_obj0.bin", 0x000000, 0x80000, CRC(375e8f1f) SHA1(b737bcceb498a66593d06ef102958bea90032106) ) @@ -4775,13 +4954,11 @@ ROM_START( sws93 ) ROM_LOAD16_BYTE( "sst1spr0.bin", 0x000000, 0x020000, CRC(9777ee2f) SHA1(95b769402cea53c7f557aab97e0bea61edfd4a35) ) ROM_LOAD16_BYTE( "sst1spr1.bin", 0x000001, 0x020000, CRC(27a35c69) SHA1(cb23a357f6f608cb9afdeca9ea11d123b69272ef) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "sst1snd0.bin", 0x00c000, 0x004000, CRC(8fc45114) SHA1(d0dc5c8af8733f1ac7cbe46f0f6cfbe188124d42) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "sst1snd0.bin", 0x000000, 0x020000, CRC(8fc45114) SHA1(d0dc5c8af8733f1ac7cbe46f0f6cfbe188124d42) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "sst_obj0.bin", 0x000000, 0x80000, CRC(4089dfd7) SHA1(d37fb08d03a4d3f87b10a8e73bbb1817543396ff) ) @@ -4820,13 +4997,11 @@ ROM_START( suzuka8h ) ROM_LOAD16_BYTE( "eh1-sp0.bin", 0x000000, 0x020000, CRC(4a8c4709) SHA1(c08b618296088d6f4b4906817a0eea8d79448e98) ) ROM_LOAD16_BYTE( "eh1-sp1.bin", 0x000001, 0x020000, CRC(2256b14e) SHA1(5bf45cf90d9b6ca349cdb26c68a80008880e107d) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "eh1-snd0.bin", 0x00c000, 0x004000, CRC(36748d3c) SHA1(30bf3310b513c7fcee28a908563459e154c5292a) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "eh1-snd0.bin", 0x000000, 0x020000, CRC(36748d3c) SHA1(30bf3310b513c7fcee28a908563459e154c5292a) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, BAD_DUMP CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) /* not sure */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "eh1-obj0.bin", 0x000000, 0x80000, CRC(864b6816) SHA1(72d831b631afb2848578bd49cd7d3e12a78644b4) ) @@ -4871,13 +5046,11 @@ ROM_START( suzuka8hj ) ROM_LOAD16_BYTE( "eh1-sp0.bin", 0x000000, 0x020000, CRC(4a8c4709) SHA1(c08b618296088d6f4b4906817a0eea8d79448e98) ) ROM_LOAD16_BYTE( "eh1-sp1.bin", 0x000001, 0x020000, CRC(2256b14e) SHA1(5bf45cf90d9b6ca349cdb26c68a80008880e107d) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "eh1-snd0.bin", 0x00c000, 0x004000, CRC(36748d3c) SHA1(30bf3310b513c7fcee28a908563459e154c5292a) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "eh1-snd0.bin", 0x000000, 0x020000, CRC(36748d3c) SHA1(30bf3310b513c7fcee28a908563459e154c5292a) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, BAD_DUMP CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) /* not sure */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "eh1-obj0.bin", 0x000000, 0x80000, CRC(864b6816) SHA1(72d831b631afb2848578bd49cd7d3e12a78644b4) ) @@ -4922,13 +5095,11 @@ ROM_START( suzuk8h2 ) ROM_LOAD16_BYTE( "ehs1-sp0.11k", 0x000000, 0x020000, CRC(9ca967bc) SHA1(a4d19ae72d0d8e96c1fa5f7e9d8e002275e7be32) ) ROM_LOAD16_BYTE( "ehs1-sp1.13k", 0x000001, 0x020000, CRC(f25bfaaa) SHA1(829936a9d19c4a8818684ce263e9ae5cbc7d5ca4) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "ehs1-snd0.7j", 0x00c000, 0x004000, CRC(fc95993b) SHA1(e8ecd6dc37634bdd030b8cea0b69818fba5a9388) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "ehs1-snd0.7j", 0x000000, 0x020000, CRC(fc95993b) SHA1(e8ecd6dc37634bdd030b8cea0b69818fba5a9388) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c68.3f", 0x000000, 0x008000, BAD_DUMP CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "ehs1-obj0.3p", 0x000000, 0x80000, CRC(a0acf307) SHA1(6d79d2dd00da4f8f0462245f42a9d88b6ad632b1) ) @@ -4980,13 +5151,11 @@ ROM_START( suzuk8h2j ) ROM_LOAD16_BYTE( "ehs1-sp0.11k", 0x000000, 0x020000, CRC(9ca967bc) SHA1(a4d19ae72d0d8e96c1fa5f7e9d8e002275e7be32) ) ROM_LOAD16_BYTE( "ehs1-sp1.13k", 0x000001, 0x020000, CRC(f25bfaaa) SHA1(829936a9d19c4a8818684ce263e9ae5cbc7d5ca4) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "ehs1-snd0.7j", 0x00c000, 0x004000, CRC(fc95993b) SHA1(e8ecd6dc37634bdd030b8cea0b69818fba5a9388) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "ehs1-snd0.7j", 0x000000, 0x020000, CRC(fc95993b) SHA1(e8ecd6dc37634bdd030b8cea0b69818fba5a9388) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c68.3f", 0x000000, 0x008000, BAD_DUMP CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "ehs1-obj0.3p", 0x000000, 0x80000, CRC(a0acf307) SHA1(6d79d2dd00da4f8f0462245f42a9d88b6ad632b1) ) @@ -5038,10 +5207,8 @@ ROM_START( valkyrie ) ROM_LOAD16_BYTE( "wd1spr0.bin", 0x000000, 0x010000, CRC(b2398321) SHA1(13b76d8756a5e47d7469f72ef5fd2837b3e24b3e) ) ROM_LOAD16_BYTE( "wd1spr1.bin", 0x000001, 0x010000, CRC(38dba897) SHA1(22254186906b1accfb043172e6d0129d23d83b02) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "wd1snd0.bin", 0x00c000, 0x004000, CRC(d0fbf58b) SHA1(bc149eefcf5566a8e37ae60a62f5037a6e0f10bd) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "wd1snd0.bin", 0x000000, 0x020000, CRC(d0fbf58b) SHA1(bc149eefcf5566a8e37ae60a62f5037a6e0f10bd) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -5096,10 +5263,8 @@ ROM_START( kyukaidk ) ROM_LOAD16_BYTE( "ky1_sp0.bin", 0x000000, 0x010000, CRC(4b4d2385) SHA1(e67e97108c63f1236e80045474a45ede386170f8) ) ROM_LOAD16_BYTE( "ky1_sp1.bin", 0x000001, 0x010000, CRC(bd3368cd) SHA1(4fc9d3f5182fd7db7e6003c15cdec1dbcdff5384) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "ky1_s0.bin", 0x00c000, 0x004000, CRC(27aea3e9) SHA1(c9ee7eaef1885fd8642595fa46833e1b473e66b5) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "ky1_s0.bin", 0x000000, 0x020000, CRC(27aea3e9) SHA1(c9ee7eaef1885fd8642595fa46833e1b473e66b5) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -5145,10 +5310,8 @@ ROM_START( kyukaidko ) ROM_LOAD16_BYTE( "ky1_sp0.bin", 0x000000, 0x010000, CRC(4b4d2385) SHA1(e67e97108c63f1236e80045474a45ede386170f8) ) ROM_LOAD16_BYTE( "ky1_sp1.bin", 0x000001, 0x010000, CRC(bd3368cd) SHA1(4fc9d3f5182fd7db7e6003c15cdec1dbcdff5384) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "ky1_s0.bin", 0x00c000, 0x004000, CRC(27aea3e9) SHA1(c9ee7eaef1885fd8642595fa46833e1b473e66b5) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "ky1_s0.bin", 0x000000, 0x020000, CRC(27aea3e9) SHA1(c9ee7eaef1885fd8642595fa46833e1b473e66b5) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) @@ -5194,10 +5357,8 @@ ROM_START( gollygho ) ROM_LOAD16_BYTE( "gl1spr0.11k", 0x000000, 0x010000, CRC(a108136f) SHA1(5a90d9d77a0c98b590c8979df25821331c669c09) ) ROM_LOAD16_BYTE( "gl1spr1.13k", 0x000001, 0x010000, CRC(da8443b7) SHA1(99bb873c253da65422b872783f28eb13993b0e2f) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "gl1snd0.7j", 0x00c000, 0x004000, CRC(008bce72) SHA1(4197a492639a80457fdb7851ffc95587dfd64320) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "gl1snd0.7j", 0x000000, 0x020000, CRC(008bce72) SHA1(4197a492639a80457fdb7851ffc95587dfd64320) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "gl1edr0c.ic7", 0x0000, 0x8000, CRC(db60886f) SHA1(a1183c058c0470a4ef8b0f69a3637b1640c5b5a4) ) @@ -5242,10 +5403,8 @@ ROM_START( bubbletr ) /* All labels were hand written and included the rom size, ROM_LOAD16_BYTE( "bt1-spr0.11k", 0x000000, 0x010000, CRC(b507b00a) SHA1(e7dcb36accf91e8b5b5321e65e6fd6bca7c6dce2) ) /* dated 6/8 */ ROM_LOAD16_BYTE( "bt1-spr1.13k", 0x000001, 0x010000, CRC(4f35540f) SHA1(519510de81e566ed74b80987860778201f6ac785) ) /* dated 6/8 */ - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "bt1-snd0.7j", 0x00c000, 0x004000, CRC(46a5c625) SHA1(ccc7098f76a0bc39c9fe578d575e6002eca172b5) ) /* dated 6/8 */ - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "bt1-snd0.7j", 0x000000, 0x020000, CRC(46a5c625) SHA1(ccc7098f76a0bc39c9fe578d575e6002eca172b5) ) /* dated 6/8 */ ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "bt1edr0a.ic7", 0x0000, 0x8000, CRC(155b02fc) SHA1(191683c19f756ac150b8e037f46a6daca1a082fa) ) /* dated 4/24 */ @@ -5290,10 +5449,8 @@ ROM_START( bubbletrj ) ROM_LOAD16_BYTE( "bt1-spr0.11k", 0x000000, 0x010000, CRC(b507b00a) SHA1(e7dcb36accf91e8b5b5321e65e6fd6bca7c6dce2) ) ROM_LOAD16_BYTE( "bt1-spr1.13k", 0x000001, 0x010000, CRC(4f35540f) SHA1(519510de81e566ed74b80987860778201f6ac785) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "bt1-snd0.7j", 0x00c000, 0x004000, CRC(46a5c625) SHA1(ccc7098f76a0bc39c9fe578d575e6002eca172b5) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "bt1-snd0.7j", 0x000000, 0x020000, CRC(46a5c625) SHA1(ccc7098f76a0bc39c9fe578d575e6002eca172b5) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "bt1edr0a.ic7", 0x0000, 0x8000, CRC(155b02fc) SHA1(191683c19f756ac150b8e037f46a6daca1a082fa) ) @@ -5446,13 +5603,11 @@ ROM_START( luckywld ) ROM_LOAD16_BYTE( "lw1sp0.11k", 0x000000, 0x020000, CRC(1eed12cb) SHA1(a978c0da0157ec0b8a7ba7cb6b6732fe89bac615) ) ROM_LOAD16_BYTE( "lw1sp1.13k", 0x000001, 0x020000, CRC(535033bc) SHA1(2ab10bc9adebd93e385e02f211c5705863a49c9a) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "lw1snd0.7j", 0x00c000, 0x004000, CRC(cc83c6b6) SHA1(6ac6848f7ac72feb756c5d76de9ea7d26814cb6e) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "lw1snd0.7j", 0x000000, 0x020000, CRC(cc83c6b6) SHA1(6ac6848f7ac72feb756c5d76de9ea7d26814cb6e) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "lw1obj0.3p", 0x000000, 0x80000, CRC(21485830) SHA1(e55a1f6df90c17b9c49e2b08c423b9be86996659) ) @@ -5511,13 +5666,11 @@ ROM_START( luckywldj ) ROM_LOAD16_BYTE( "lw1sp0.11k", 0x000000, 0x020000, CRC(1eed12cb) SHA1(a978c0da0157ec0b8a7ba7cb6b6732fe89bac615) ) ROM_LOAD16_BYTE( "lw1sp1.13k", 0x000001, 0x020000, CRC(535033bc) SHA1(2ab10bc9adebd93e385e02f211c5705863a49c9a) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound CPU (Banked) */ - ROM_LOAD( "lw1snd0.7j", 0x00c000, 0x004000, CRC(cc83c6b6) SHA1(6ac6848f7ac72feb756c5d76de9ea7d26814cb6e) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU (Banked) */ + ROM_LOAD( "lw1snd0.7j", 0x000000, 0x020000, CRC(cc83c6b6) SHA1(6ac6848f7ac72feb756c5d76de9ea7d26814cb6e) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - /* should be c68 */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "lw1obj0.3p", 0x000000, 0x80000, CRC(21485830) SHA1(e55a1f6df90c17b9c49e2b08c423b9be86996659) ) @@ -5582,20 +5735,6 @@ void namcos2_state::init_assaultp() m_gametype = NAMCOS2_ASSAULT_PLUS; } -void namcos2_state::init_assaultp_hack() -{ - // HACK! - // boost the MCU speed to avoid a race condition which causes - // the mode select menu to vanish before you have a chance to use - // it. It probably needs better RAM access timing etc. - // - // This is used in conjunction with the interleave increase in the - // MACHINE_DRIVER - m_mcu->set_clock_scale(4.0f); - - init_assaultp(); -} - void namcos2_state::init_burnforc() { m_gametype = NAMCOS2_BURNING_FORCE; @@ -5812,7 +5951,7 @@ GAMEL( 1987, finallapjb, finallap, finallap, finallap, namcos2_state, init_final GAME( 1988, assault, 0, base2, assault, namcos2_state, init_assault, ROT90, "Namco", "Assault (Rev B)", 0 ) GAME( 1988, assaultj, assault, base2, assault, namcos2_state, init_assaultj, ROT90, "Namco", "Assault (Japan)", 0 ) -GAME( 1988, assaultp, assault, assaultp, assault, namcos2_state, init_assaultp_hack, ROT90, "Namco", "Assault Plus (Japan)", 0) +GAME( 1988, assaultp, assault, assaultp, assault, namcos2_state, init_assaultp, ROT90, "Namco", "Assault Plus (Japan)", 0) GAME( 1988, metlhawk, 0, metlhawk, metlhawk, namcos2_state, init_metlhawk, ROT90, "Namco", "Metal Hawk (Rev C)", 0 ) GAME( 1988, metlhawkj, metlhawk, metlhawk, metlhawk, namcos2_state, init_metlhawk, ROT90, "Namco", "Metal Hawk (Japan, Rev F)", 0 ) @@ -5829,7 +5968,8 @@ GAME( 1988, pheliosj, phelios, base2, base, namcos2_state, init_pheli GAME( 1989, dirtfoxj, 0, base2, dirtfox, namcos2_state, init_dirtfoxj, ROT90, "Namco", "Dirt Fox (Japan)", MACHINE_NODEVICE_LAN ) GAMEL( 1989, fourtrax, 0, finallap, fourtrax, namcos2_state, init_fourtrax, ROT0, "Namco", "Four Trax (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) -GAMEL( 1989, fourtraxa, fourtrax, finallap, fourtrax, namcos2_state, init_fourtrax, ROT0, "Namco", "Four Trax (Asia)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) // believed to be Asia due to the 4 appended to the changed ROMs. All other games with 2 are marked World and with 1 are marked Japan. +GAMEL( 1989, fourtraxj, fourtrax, finallap, fourtrax, namcos2_state, init_fourtrax, ROT0, "Namco", "Four Trax (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) +GAMEL( 1989, fourtraxa, fourtrax, finallap, fourtrax, namcos2_state, init_fourtrax, ROT0, "Namco (Atari license?)", "Four Trax (US?, censored banners)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) // boards using the ROM code FX4 were produced for Atari? there's no US region warning or Atari copyright tho, modded version of the World code GAME( 1989, valkyrie, 0, base3, base, namcos2_state, init_valkyrie, ROT90, "Namco", "Valkyrie No Densetsu (Japan)", 0 ) @@ -5859,33 +5999,35 @@ GAME( 1990, rthun2j, rthun2, base3, base, namcos2_state, init_rthun GAME( 1990, sgunner, 0, sgunner, sgunner, namcos2_state, init_sgunner2, ROT0, "Namco", "Steel Gunner (Rev B)", 0 ) GAME( 1990, sgunnerj, sgunner, sgunner, sgunner, namcos2_state, init_sgunner2, ROT0, "Namco", "Steel Gunner (Japan)", 0 ) -GAME( 1991, sgunner2, 0, sgunner2, sgunner2, namcos2_state, init_sgunner2, ROT0, "Namco", "Steel Gunner 2 (US)", 0 ) -GAME( 1991, sgunner2j, sgunner2, sgunner2, sgunner2, namcos2_state, init_sgunner2, ROT0, "Namco", "Steel Gunner 2 (Japan, Rev A)", 0 ) +// The C68 I/O MCU contains a 1991 copyright, so anything after this point is potentially using that instead of C65, games before this point can't be using it + +GAME( 1991, sgunner2, 0, sgunner2, sgunner, namcos2_state, init_sgunner2, ROT0, "Namco", "Steel Gunner 2 (US)", 0 ) +GAME( 1991, sgunner2j, sgunner2, sgunner2, sgunner, namcos2_state, init_sgunner2, ROT0, "Namco", "Steel Gunner 2 (Japan, Rev A)", 0 ) GAME( 1991, cosmogng, 0, base, base, namcos2_state, init_cosmogng, ROT90, "Namco", "Cosmo Gang the Video (US)", 0 ) GAME( 1991, cosmogngj, cosmogng, base, base, namcos2_state, init_cosmogng, ROT90, "Namco", "Cosmo Gang the Video (Japan)", 0 ) -GAME( 1992, bubbletr, 0, gollygho, bubbletr, namcos2_state, init_bubbletr, ROT180, "Namco", "Bubble Trouble (World, Rev B)", MACHINE_REQUIRES_ARTWORK ) -GAME( 1992, bubbletrj, bubbletr, gollygho, bubbletr, namcos2_state, init_bubbletr, ROT180, "Namco", "Bubble Trouble (Japan, Rev C)", MACHINE_REQUIRES_ARTWORK ) +GAME( 1992, bubbletr, 0, gollygho, bubbletr, namcos2_state, init_bubbletr, ROT180, "Namco", "Bubble Trouble - Golly Ghost 2 (World, Rev B)", MACHINE_REQUIRES_ARTWORK ) +GAME( 1992, bubbletrj, bubbletr, gollygho, bubbletr, namcos2_state, init_bubbletr, ROT180, "Namco", "Bubble Trouble - Golly Ghost 2 (Japan, Rev C)", MACHINE_REQUIRES_ARTWORK ) -GAMEL( 1992, finalap3, 0, finalap2, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (World, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) -GAMEL( 1992, finalap3a, finalap3, finalap2, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (World, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) -GAMEL( 1992, finalap3j, finalap3, finalap2, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) -GAMEL( 1992, finalap3jc, finalap3, finalap2, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (Japan, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) -GAMEL( 1992, finalap3bl, finalap3, finalap2, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) +GAMEL( 1992, finalap3, 0, finalap3, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (World, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) +GAMEL( 1992, finalap3a, finalap3, finalap3, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (World, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) +GAMEL( 1992, finalap3j, finalap3, finalap3, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) +GAMEL( 1992, finalap3jc, finalap3, finalap3, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (Japan, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) +GAMEL( 1992, finalap3bl, finalap3, finalap3, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap ) GAME( 1992, luckywld, 0, luckywld, luckywld, namcos2_state, init_luckywld, ROT0, "Namco", "Lucky & Wild", 0 ) GAME( 1992, luckywldj, luckywld, luckywld, luckywld, namcos2_state, init_luckywld, ROT0, "Namco", "Lucky & Wild (Japan)", 0 ) -GAME( 1992, suzuka8h, 0, luckywld, suzuka, namcos2_state, init_suzuka8h, ROT0, "Namco", "Suzuka 8 Hours (World, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN ) -GAME( 1992, suzuka8hj, suzuka8h, luckywld, suzuka, namcos2_state, init_suzuka8h, ROT0, "Namco", "Suzuka 8 Hours (Japan, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN ) +GAME( 1992, suzuka8h, 0, suzuka8h, suzuka, namcos2_state, init_suzuka8h, ROT0, "Namco", "Suzuka 8 Hours (World, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN ) +GAME( 1992, suzuka8hj, suzuka8h, suzuka8h, suzuka, namcos2_state, init_suzuka8h, ROT0, "Namco", "Suzuka 8 Hours (Japan, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN ) -GAME( 1992, sws, 0, base, base, namcos2_state, init_sws, ROT0, "Namco", "Super World Stadium (Japan)", 0 ) +GAME( 1992, sws, 0, base_c68, base, namcos2_state, init_sws, ROT0, "Namco", "Super World Stadium (Japan)", 0 ) -GAME( 1992, sws92, 0, base, base, namcos2_state, init_sws92, ROT0, "Namco", "Super World Stadium '92 (Japan)", 0 ) -GAME( 1992, sws92g, sws92, base, base, namcos2_state, init_sws92g, ROT0, "Namco", "Super World Stadium '92 Gekitouban (Japan)", 0 ) +GAME( 1992, sws92, 0, base_c68, base, namcos2_state, init_sws92, ROT0, "Namco", "Super World Stadium '92 (Japan)", 0 ) +GAME( 1992, sws92g, sws92, base_c68, base, namcos2_state, init_sws92g, ROT0, "Namco", "Super World Stadium '92 Gekitouban (Japan)", 0 ) -GAME( 1993, suzuk8h2, 0, luckywld, suzuka, namcos2_state, init_suzuk8h2, ROT0, "Namco", "Suzuka 8 Hours 2 (World, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN ) -GAME( 1993, suzuk8h2j, suzuk8h2, luckywld, suzuka, namcos2_state, init_suzuk8h2, ROT0, "Namco", "Suzuka 8 Hours 2 (Japan, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN ) +GAME( 1993, suzuk8h2, 0, suzuka8h, suzuka, namcos2_state, init_suzuk8h2, ROT0, "Namco", "Suzuka 8 Hours 2 (World, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN ) +GAME( 1993, suzuk8h2j, suzuk8h2, suzuka8h, suzuka, namcos2_state, init_suzuk8h2, ROT0, "Namco", "Suzuka 8 Hours 2 (Japan, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN ) -GAME( 1993, sws93, 0, base, base, namcos2_state, init_sws93, ROT0, "Namco", "Super World Stadium '93 (Japan)", 0 ) +GAME( 1993, sws93, 0, base_c68, base, namcos2_state, init_sws93, ROT0, "Namco", "Super World Stadium '93 (Japan)", 0 ) // this appears to have a subtitle, what is it? diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index d7a135d46bc..88610cbc8dd 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -36,7 +36,7 @@ Driver's Eyes --------------------------+-------------+---------------+-----------+------------ GPU+bitmap layer | yes | no | no | no Namco System NB1 Sprites | no | yes | yes | yes -Number of DSPs | 1 | 1 | 5 | 4 +Number of DSPs | 1 | 1 | 5 | 1x Ma, 4x Sl The main 68k CPUs populate a chunk of shared RAM with an display list describing a scene to be rendered. The main CPUs also specify attributes for a master camera which provides additional global transformations. @@ -170,8 +170,8 @@ quad primitives (n x 5 words) - color code and four vertex indices ----------------------------------------------------------------------- Board 1 : DSP Board - 1st PCB. (Uppermost) -DSP Type 1 : 4 x TMS320C25 connected x 4 x Namco Custom chip 67 (68 pin PLCC) (Cybersled) -DSP Type 2 : 5 x TMS320C20 (Starblade) +DSP Type 1 : 1 x Master TMS320C25 (C67) 4 x Slave TMS320C25 (C67) each connected to a Namco Custom chip 342 +DSP Type 2 : 5 x TMS320C20 (Starblade) (verify this information) OSC: 40.000MHz RAM: HM62832 x 2, M5M5189 x 4, ISSI IS61C68 x 16 ROMS: TMS27C040 @@ -520,7 +520,6 @@ Filter Board */ #include "emu.h" #include "includes/namcos21.h" -#include "machine/namcoic.h" #include "cpu/m68000/m68000.h" #include "cpu/m6805/m6805.h" @@ -723,22 +722,22 @@ void namcos21_kickstart(running_machine &machine, int internal) namcos21_state *state = machine.driver_data<namcos21_state>(); /* patch dsp watchdog */ - switch( state->m_gametype ) + switch (state->m_gametype) { - case NAMCOS21_AIRCOMBAT: - state->m_master_dsp_code[0x008e] = 0x808f; - break; - case NAMCOS21_SOLVALOU: - state->m_master_dsp_code[0x008b] = 0x808c; - break; - default: - break; + case namcos21_state::NAMCOS21_AIRCOMBAT: + state->m_master_dsp_code[0x008e] = 0x808f; + break; + case namcos21_state::NAMCOS21_SOLVALOU: + state->m_master_dsp_code[0x008b] = 0x808c; + break; + default: + break; } - if( internal ) + if (internal) { - if( state->m_mbNeedsKickstart==0 ) return; - state->m_mbNeedsKickstart--; - if( state->m_mbNeedsKickstart ) return; + if (state->m_mbNeedsKickstart == 0) return; + state->m_mbNeedsKickstart--; + if (state->m_mbNeedsKickstart) return; } state->clear_poly_framebuffer(); @@ -1248,8 +1247,8 @@ void namcos21_state::common_map(address_map &map) map(0x440000, 0x440001).rw(FUNC(namcos21_state::pointram_data_r), FUNC(namcos21_state::pointram_data_w)); map(0x440002, 0x47ffff).nopw(); /* (?) Air Combat */ map(0x480000, 0x4807ff).rw(FUNC(namcos21_state::namcos21_depthcue_r), FUNC(namcos21_state::namcos21_depthcue_w)); /* Air Combat */ - map(0x700000, 0x71ffff).rw(FUNC(namcos21_state::c355_obj_ram_r), FUNC(namcos21_state::c355_obj_ram_w)); - map(0x720000, 0x720007).rw(FUNC(namcos21_state::c355_obj_position_r), FUNC(namcos21_state::c355_obj_position_w)); + map(0x700000, 0x71ffff).rw(m_c355spr, FUNC(namco_c355spr_device::spriteram_r), FUNC(namco_c355spr_device::spriteram_w)); + map(0x720000, 0x720007).rw(m_c355spr, FUNC(namco_c355spr_device::position_r), FUNC(namco_c355spr_device::position_w)); map(0x740000, 0x74ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x750000, 0x75ffff).ram().w(m_palette, FUNC(palette_device::write16_ext)).share("palette_ext"); map(0x760000, 0x760001).rw(FUNC(namcos21_state::namcos21_video_enable_r), FUNC(namcos21_state::namcos21_video_enable_w)); @@ -1533,7 +1532,7 @@ void namcos21_state::winrun_gpu_map(address_map &map) void namcos21_state::sound_map(address_map &map) { - map(0x0000, 0x3fff).bankr("bank6"); /* banked */ + map(0x0000, 0x3fff).bankr("audiobank"); /* banked */ map(0x3000, 0x3003).nopw(); /* ? */ map(0x4000, 0x4001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); map(0x5000, 0x6fff).rw(m_c140, FUNC(c140_device::c140_r), FUNC(c140_device::c140_w)); @@ -1544,7 +1543,7 @@ void namcos21_state::sound_map(address_map &map) map(0xc000, 0xffff).nopw(); /* avoid debug log noise; games write frequently to 0xe000 */ map(0xc000, 0xc001).w(FUNC(namcos21_state::namcos2_sound_bankselect_w)); map(0xd001, 0xd001).nopw(); /* watchdog */ - map(0xd000, 0xffff).rom(); + map(0xd000, 0xffff).rom().region("audiocpu", 0x01000); } @@ -1555,14 +1554,14 @@ void namcos21_state::sound_map(address_map &map) void namcos21_state::configure_c65_namcos21(machine_config &config) { NAMCOC65(config, m_c65, 2048000); - m_c65->in_pb_callback().set_ioport("PORTB"); - m_c65->in_pc_callback().set_ioport("PORTC"); - m_c65->in_ph_callback().set_ioport("PORTH"); + m_c65->in_pb_callback().set_ioport("MCUB"); + m_c65->in_pc_callback().set_ioport("MCUC"); + m_c65->in_ph_callback().set_ioport("MCUH"); m_c65->in_pdsw_callback().set_ioport("DSW"); - m_c65->di0_in_cb().set_ioport("DIAL0"); - m_c65->di1_in_cb().set_ioport("DIAL1"); - m_c65->di2_in_cb().set_ioport("DIAL2"); - m_c65->di3_in_cb().set_ioport("DIAL3"); + m_c65->di0_in_cb().set_ioport("MCUDI0"); + m_c65->di1_in_cb().set_ioport("MCUDI1"); + m_c65->di2_in_cb().set_ioport("MCUDI2"); + m_c65->di3_in_cb().set_ioport("MCUDI3"); m_c65->an0_in_cb().set_ioport("AN0"); m_c65->an1_in_cb().set_ioport("AN1"); m_c65->an2_in_cb().set_ioport("AN2"); @@ -1575,6 +1574,28 @@ void namcos21_state::configure_c65_namcos21(machine_config &config) m_c65->dp_out_callback().set(FUNC(namcos21_state::namcos2_dualportram_byte_w)); } +void namcos21_state::configure_c68_namcos21(machine_config &config) +{ + NAMCOC68(config, m_c68, 8000000); + m_c68->in_pb_callback().set_ioport("MCUB"); + m_c68->in_pc_callback().set_ioport("MCUC"); + m_c68->in_ph_callback().set_ioport("MCUH"); + m_c68->in_pdsw_callback().set_ioport("DSW"); + m_c68->di0_in_cb().set_ioport("MCUDI0"); + m_c68->di1_in_cb().set_ioport("MCUDI1"); + m_c68->di2_in_cb().set_ioport("MCUDI2"); + m_c68->di3_in_cb().set_ioport("MCUDI3"); + m_c68->an0_in_cb().set_ioport("AN0"); + m_c68->an1_in_cb().set_ioport("AN1"); + m_c68->an2_in_cb().set_ioport("AN2"); + m_c68->an3_in_cb().set_ioport("AN3"); + m_c68->an4_in_cb().set_ioport("AN4"); + m_c68->an5_in_cb().set_ioport("AN5"); + m_c68->an6_in_cb().set_ioport("AN6"); + m_c68->an7_in_cb().set_ioport("AN7"); + m_c68->dp_in_callback().set(FUNC(namcos21_state::namcos2_dualportram_byte_r)); + m_c68->dp_out_callback().set(FUNC(namcos21_state::namcos2_dualportram_byte_w)); +} /*************************************************************/ /* Driver's Eyes Memory declarations overrides */ @@ -1583,8 +1604,8 @@ void namcos21_state::configure_c65_namcos21(machine_config &config) void namcos21_state::driveyes_common_map(address_map &map) { - map(0x700000, 0x71ffff).rw(FUNC(namcos21_state::c355_obj_ram_r), FUNC(namcos21_state::c355_obj_ram_w)); - map(0x720000, 0x720007).rw(FUNC(namcos21_state::c355_obj_position_r), FUNC(namcos21_state::c355_obj_position_w)); + map(0x700000, 0x71ffff).rw(m_c355spr, FUNC(namco_c355spr_device::spriteram_r), FUNC(namco_c355spr_device::spriteram_w)); + map(0x720000, 0x720007).rw(m_c355spr, FUNC(namco_c355spr_device::position_r), FUNC(namco_c355spr_device::position_w)); map(0x740000, 0x74ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x750000, 0x75ffff).ram().w(m_palette, FUNC(palette_device::write16_ext)).share("palette_ext"); map(0x760000, 0x760001).rw(FUNC(namcos21_state::namcos21_video_enable_r), FUNC(namcos21_state::namcos21_video_enable_w)); @@ -1625,12 +1646,12 @@ void namcos21_state::driveyes_slave_map(address_map &map) /*************************************************************/ static INPUT_PORTS_START( s21default ) - PORT_START("PORTB") /* 63B05Z0 - PORT B */ + PORT_START("MCUB") /* 63B05Z0 - PORT B */ PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) - PORT_START("PORTC") /* 63B05Z0 - PORT C & SCI */ + PORT_START("MCUC") /* 63B05Z0 - PORT C & SCI */ PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -1654,7 +1675,7 @@ static INPUT_PORTS_START( s21default ) PORT_START("AN7") /* 63B05Z0 - 8 CHANNEL ANALOG - CHANNEL 7 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("PORTH") /* 63B05Z0 - PORT H */ + PORT_START("MCUH") /* 63B05Z0 - PORT H */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1687,13 +1708,13 @@ static INPUT_PORTS_START( s21default ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("DIAL0") /* 63B05Z0 - $3000 */ + PORT_START("MCUDI0") /* 63B05Z0 - $3000 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("DIAL1") /* 63B05Z0 - $3001 */ + PORT_START("MCUDI1") /* 63B05Z0 - $3001 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("DIAL2") /* 63B05Z0 - $3002 */ + PORT_START("MCUDI2") /* 63B05Z0 - $3002 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("DIAL3") /* 63B05Z0 - $3003 */ + PORT_START("MCUDI3") /* 63B05Z0 - $3003 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -1706,7 +1727,7 @@ static INPUT_PORTS_START( winrun ) PORT_DIPSETTING( 0x20, "2M" ) PORT_DIPSETTING( 0x00, "4M" ) - PORT_MODIFY("PORTB") /* 63B05Z0 - PORT B */ + PORT_MODIFY("MCUB") /* 63B05Z0 - PORT B */ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) /* ? */ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) /* ? */ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) /* ? */ @@ -1729,7 +1750,7 @@ static INPUT_PORTS_START( winrun ) PORT_MODIFY("AN7") /* 63B05Z0 - 8 CHANNEL ANALOG - CHANNEL 7 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_MODIFY("PORTH") /* 63B05Z0 - PORT H */ + PORT_MODIFY("MCUH") /* 63B05Z0 - PORT H */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1751,15 +1772,15 @@ INPUT_PORTS_END static INPUT_PORTS_START( driveyes ) PORT_INCLUDE(winrungp) - PORT_MODIFY("PORTB") + PORT_MODIFY("MCUB") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("gearbox", namcoio_gearbox_device, clutch_r ) PORT_BIT( 0x37, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_MODIFY("DIAL0") + PORT_MODIFY("MCUDI0") PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER("gearbox", namcoio_gearbox_device, in_r, nullptr ) PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_MODIFY("PORTH") /* 63B05Z0 - PORT H */ + PORT_MODIFY("MCUH") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1767,6 +1788,14 @@ static INPUT_PORTS_START( driveyes ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Green Button") PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x0c, 0x0c, "Screen") + PORT_DIPSETTING( 0x0c, "Center" ) + // these will show 'receive error' because they want comms from the main screen + PORT_DIPSETTING( 0x08, "Left" ) + PORT_DIPSETTING( 0x04, "Right" ) + PORT_DIPSETTING( 0x00, "Right (duplicate)" ) INPUT_PORTS_END // the default inc/dec analog keys have been chosen to map 'tank' style inputs found on Assault. @@ -1793,7 +1822,7 @@ static INPUT_PORTS_START( cybsled ) PORT_MODIFY("AN7") /* 63B05Z0 - 8 CHANNEL ANALOG - CHANNEL 7 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_MODIFY("PORTH") /* 63B05Z0 - PORT H */ + PORT_MODIFY("MCUH") /* 63B05Z0 - PORT H */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Viewport Change Button") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1837,7 +1866,7 @@ static INPUT_PORTS_START( aircomb ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_MODIFY("PORTH") /* IN#10: 63B05Z0 - PORT H */ + PORT_MODIFY("MCUH") /* IN#10: 63B05Z0 - PORT H */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON6 ) ///??? @@ -1875,9 +1904,138 @@ static GFXDECODE_START( gfx_namcos21 ) GFXDECODE_ENTRY( "gfx1", 0x000000, tile_layout, 0x1000, 0x10 ) GFXDECODE_END + +WRITE8_MEMBER( namcos21_state::namcos2_sound_bankselect_w ) +{ + m_audiobank->set_entry(data>>4); +} + +void (*namcos2_kickstart)(running_machine &machine, int internal); + +WRITE8_MEMBER(namcos21_state::sound_reset_w) +{ + if (data & 0x01) + { + /* Resume execution */ + m_audiocpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + m_maincpu->yield(); + } + else + { + /* Suspend execution */ + m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + } + + if (namcos2_kickstart != nullptr) + { + //printf( "dspkick=0x%x\n", data ); + if (data & 0x04) + { + (*namcos2_kickstart)(machine(), 1); + } + } +} + +WRITE8_MEMBER(namcos21_state::system_reset_w) +{ + reset_all_subcpus(data & 1 ? CLEAR_LINE : ASSERT_LINE); + + if (data & 0x01) + m_maincpu->yield(); +} + +void namcos21_state::reset_all_subcpus(int state) +{ + m_slave->set_input_line(INPUT_LINE_RESET, state); + if (m_c68) + { + m_c68->ext_reset(state); + } + else if (m_c65) + { + m_c65->ext_reset(state); + } + else + { + logerror("no MCU to reset?\n"); + } + + switch (m_gametype) + { + case namcos21_state::NAMCOS21_SOLVALOU: + case namcos21_state::NAMCOS21_STARBLADE: + case namcos21_state::NAMCOS21_AIRCOMBAT: + case namcos21_state::NAMCOS21_CYBERSLED: + m_dspmaster->set_input_line(INPUT_LINE_RESET, state); + m_dspslave->set_input_line(INPUT_LINE_RESET, state); + break; + + //case namcos21_state::NAMCOS21_WINRUN91: + //case namcos21_state::NAMCOS21_DRIVERS_EYES: + default: + break; + } +} + + +bool namcos21_state::is_system21() +{ + switch (m_gametype) + { + case namcos21_state::NAMCOS21_AIRCOMBAT: + case namcos21_state::NAMCOS21_STARBLADE: + case namcos21_state::NAMCOS21_CYBERSLED: + case namcos21_state::NAMCOS21_SOLVALOU: + case namcos21_state::NAMCOS21_WINRUN91: + case namcos21_state::NAMCOS21_DRIVERS_EYES: + return 1; + default: + return 0; + } +} + + +WRITE8_MEMBER(namcos21_state::namcos2_68k_eeprom_w) +{ + m_eeprom[offset] = data; +} + +READ8_MEMBER(namcos21_state::namcos2_68k_eeprom_r) +{ + return m_eeprom[offset]; +} + +MACHINE_RESET_MEMBER(namcos21_state, namcos21) +{ +// address_space &space = m_maincpu->space(AS_PROGRAM); + address_space &audio_space = m_audiocpu->space(AS_PROGRAM); + + /* Initialise the bank select in the sound CPU */ + namcos2_sound_bankselect_w(audio_space, 0, 0); /* Page in bank 0 */ + + m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE ); + + /* Place CPU2 & CPU3 into the reset condition */ + reset_all_subcpus(ASSERT_LINE); +} + + + MACHINE_START_MEMBER(namcos21_state,namcos21) { - MACHINE_START_CALL_MEMBER( namcos2 ); + namcos2_kickstart = nullptr; + m_eeprom = std::make_unique<uint8_t[]>(0x2000); + subdevice<nvram_device>("nvram")->set_base(m_eeprom.get(), 0x2000); + + if (m_audiobank) + { + uint32_t max = memregion("audiocpu")->bytes() / 0x4000; + for (int i = 0; i < 0x10; i++) + m_audiobank->configure_entry(i, memregion("audiocpu")->base() + (i % max) * 0x4000); + + m_audiobank->set_entry(0); + } + namcos2_kickstart = namcos21_kickstart; } @@ -1895,6 +2053,10 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline) if (m_c65) m_c65->ext_interrupt(HOLD_LINE); + + if (m_c68) + m_c68->ext_interrupt(ASSERT_LINE); + } if(m_gpu_intc != nullptr) @@ -1915,13 +2077,14 @@ void namcos21_state::configure_c148_standard(machine_config &config) m_slave_intc->link_c148_device(m_master_intc); } -MACHINE_CONFIG_START(namcos21_state::namcos21) +// winrun, winrungp, winrun91 +MACHINE_CONFIG_START(namcos21_state::winrun) MCFG_DEVICE_ADD("maincpu", M68000,12288000) /* Master */ - MCFG_DEVICE_PROGRAM_MAP(master_map) + MCFG_DEVICE_PROGRAM_MAP(winrun_master_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos21_state, screen_scanline, "screen", 0, 1) MCFG_DEVICE_ADD("slave", M68000,12288000) /* Slave */ - MCFG_DEVICE_PROGRAM_MAP(slave_map) + MCFG_DEVICE_PROGRAM_MAP(winrun_slave_map) MCFG_DEVICE_ADD("audiocpu", MC6809E, 3072000) /* Sound */ MCFG_DEVICE_PROGRAM_MAP(sound_map) @@ -1930,37 +2093,33 @@ MACHINE_CONFIG_START(namcos21_state::namcos21) configure_c65_namcos21(config); - MCFG_DEVICE_ADD("dspmaster", TMS32025,24000000) /* 24 MHz? overclocked */ - MCFG_DEVICE_PROGRAM_MAP(master_dsp_program) - MCFG_DEVICE_DATA_MAP(master_dsp_data) - MCFG_DEVICE_IO_MAP(master_dsp_io) - MCFG_TMS32025_HOLD_IN_CB(CONSTANT(0)) - MCFG_TMS32025_HOLD_ACK_OUT_CB(NOOP) - MCFG_TMS32025_XF_OUT_CB(WRITE16(*this, namcos21_state, dsp_xf_w)) - - MCFG_DEVICE_ADD("dspslave", TMS32025,24000000*4) /* 24 MHz?; overclocked */ - MCFG_DEVICE_PROGRAM_MAP(slave_dsp_program) - MCFG_DEVICE_DATA_MAP(slave_dsp_data) - MCFG_DEVICE_IO_MAP(slave_dsp_io) - MCFG_TMS32025_HOLD_IN_CB(CONSTANT(0)) - MCFG_TMS32025_HOLD_ACK_OUT_CB(NOOP) - MCFG_TMS32025_XF_OUT_CB(WRITE16(*this, namcos21_state, slave_XF_output_w)) + tms32025_device& dsp(TMS32025(config, m_dsp, 24000000)); /* 24 MHz? overclocked */ + dsp.set_addrmap(AS_PROGRAM, &namcos21_state::winrun_dsp_program); + dsp.set_addrmap(AS_DATA, &namcos21_state::winrun_dsp_data); + dsp.set_addrmap(AS_IO, &namcos21_state::winrun_dsp_io); + dsp.bio_in_cb().set(FUNC(namcos21_state::winrun_poly_reset_r)); + dsp.hold_in_cb().set_constant(0); + dsp.hold_ack_out_cb().set_nop(); + dsp.xf_out_cb().set_nop(); - MCFG_QUANTUM_TIME(attotime::from_hz(12000)) + MCFG_DEVICE_ADD("gpu", M68000,12288000) /* graphics coprocessor */ + MCFG_DEVICE_PROGRAM_MAP(winrun_gpu_map) + + configure_c148_standard(config); + NAMCO_C148(config, m_gpu_intc, 0, "gpu", false); + NAMCO_C139(config, m_sci, 0); + + MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */ MCFG_MACHINE_START_OVERRIDE(namcos21_state,namcos21) - MCFG_MACHINE_RESET_OVERRIDE(namcos21_state,namcos2) + MCFG_MACHINE_RESET_OVERRIDE(namcos21_state,namcos21) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS_NAMCO480I - MCFG_SCREEN_UPDATE_DRIVER(namcos21_state, screen_update_namcos21) + MCFG_SCREEN_UPDATE_DRIVER(namcos21_state, screen_update_winrun) MCFG_SCREEN_PALETTE("palette") - configure_c148_standard(config); - NAMCO_C139(config, m_sci, 0); - - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_namcos21) MCFG_PALETTE_ADD("palette", NAMCOS21_NUM_COLORS) MCFG_PALETTE_FORMAT(XBRG) @@ -1980,6 +2139,7 @@ MACHINE_CONFIG_START(namcos21_state::namcos21) MACHINE_CONFIG_END +// driveyes only MACHINE_CONFIG_START(namcos21_state::driveyes) MCFG_DEVICE_ADD("maincpu", M68000,12288000) /* Master */ MCFG_DEVICE_PROGRAM_MAP(driveyes_master_map) @@ -1993,21 +2153,21 @@ MACHINE_CONFIG_START(namcos21_state::driveyes) MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos21_state, irq0_line_hold, 2*60) MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos21_state, irq1_line_hold, 120) - configure_c65_namcos21(config); + configure_c68_namcos21(config); - MCFG_DEVICE_ADD("dsp", TMS32025,24000000*2) /* 24 MHz? overclocked */ - MCFG_DEVICE_PROGRAM_MAP(winrun_dsp_program) - MCFG_DEVICE_DATA_MAP(winrun_dsp_data) - MCFG_DEVICE_IO_MAP(winrun_dsp_io) - MCFG_TMS32025_BIO_IN_CB(READ16(*this, namcos21_state, winrun_poly_reset_r)) - MCFG_TMS32025_HOLD_IN_CB(CONSTANT(0)) - MCFG_TMS32025_HOLD_ACK_OUT_CB(NOOP) - MCFG_TMS32025_XF_OUT_CB(NOOP) + tms32025_device& dsp(TMS32025(config, m_dsp, 24000000*2)); /* 24 MHz? overclocked */ + dsp.set_addrmap(AS_PROGRAM, &namcos21_state::winrun_dsp_program); + dsp.set_addrmap(AS_DATA, &namcos21_state::winrun_dsp_data); + dsp.set_addrmap(AS_IO, &namcos21_state::winrun_dsp_io); + dsp.bio_in_cb().set(FUNC(namcos21_state::winrun_poly_reset_r)); + dsp.hold_in_cb().set_constant(0); + dsp.hold_ack_out_cb().set_nop(); + dsp.xf_out_cb().set_nop(); MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */ MCFG_MACHINE_START_OVERRIDE(namcos21_state,namcos21) - MCFG_MACHINE_RESET_OVERRIDE(namcos21_state,namcos2) + MCFG_MACHINE_RESET_OVERRIDE(namcos21_state,namcos21) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); MCFG_DEVICE_ADD("gearbox", NAMCOIO_GEARBOX, 0) @@ -2024,6 +2184,14 @@ MACHINE_CONFIG_START(namcos21_state::driveyes) MCFG_PALETTE_ADD("palette", NAMCOS21_NUM_COLORS) MCFG_PALETTE_FORMAT(XBRG) + NAMCO_C355SPR(config, m_c355spr, 0); + m_c355spr->set_palette_tag("palette"); + m_c355spr->set_gfxdecode_tag("gfxdecode"); + m_c355spr->set_is_namcofl(false); + m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); + m_c355spr->set_palxor(0xf); // reverse mapping + m_c355spr->set_gfxregion(0); + MCFG_VIDEO_START_OVERRIDE(namcos21_state,namcos21) SPEAKER(config, "lspeaker").front_left(); @@ -2039,51 +2207,64 @@ MACHINE_CONFIG_START(namcos21_state::driveyes) MCFG_SOUND_ROUTE(1, "rspeaker", 0.30) MACHINE_CONFIG_END -MACHINE_CONFIG_START(namcos21_state::winrun) +// starblad, solvalou, aircomb, cybsled +MACHINE_CONFIG_START(namcos21_state::namcos21) MCFG_DEVICE_ADD("maincpu", M68000,12288000) /* Master */ - MCFG_DEVICE_PROGRAM_MAP(winrun_master_map) + MCFG_DEVICE_PROGRAM_MAP(master_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos21_state, screen_scanline, "screen", 0, 1) MCFG_DEVICE_ADD("slave", M68000,12288000) /* Slave */ - MCFG_DEVICE_PROGRAM_MAP(winrun_slave_map) + MCFG_DEVICE_PROGRAM_MAP(slave_map) MCFG_DEVICE_ADD("audiocpu", MC6809E, 3072000) /* Sound */ MCFG_DEVICE_PROGRAM_MAP(sound_map) MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos21_state, irq0_line_hold, 2*60) MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos21_state, irq1_line_hold, 120) - configure_c65_namcos21(config); - - MCFG_DEVICE_ADD("dsp", TMS32025,24000000) /* 24 MHz? overclocked */ - MCFG_DEVICE_PROGRAM_MAP(winrun_dsp_program) - MCFG_DEVICE_DATA_MAP(winrun_dsp_data) - MCFG_DEVICE_IO_MAP(winrun_dsp_io) - MCFG_TMS32025_BIO_IN_CB(READ16(*this, namcos21_state, winrun_poly_reset_r)) - MCFG_TMS32025_HOLD_IN_CB(CONSTANT(0)) - MCFG_TMS32025_HOLD_ACK_OUT_CB(NOOP) - MCFG_TMS32025_XF_OUT_CB(NOOP) + configure_c68_namcos21(config); - MCFG_DEVICE_ADD("gpu", M68000,12288000) /* graphics coprocessor */ - MCFG_DEVICE_PROGRAM_MAP(winrun_gpu_map) + tms32025_device& dspmaster(TMS32025(config, m_dspmaster, 24000000)); /* 24 MHz? overclocked */ + dspmaster.set_addrmap(AS_PROGRAM, &namcos21_state::master_dsp_program); + dspmaster.set_addrmap(AS_DATA, &namcos21_state::master_dsp_data); + dspmaster.set_addrmap(AS_IO, &namcos21_state::master_dsp_io); + dspmaster.hold_in_cb().set_constant(0); + dspmaster.hold_ack_out_cb().set_nop(); + dspmaster.xf_out_cb().set(FUNC(namcos21_state::dsp_xf_w)); - configure_c148_standard(config); - NAMCO_C148(config, m_gpu_intc, 0, "gpu", false); - NAMCO_C139(config, m_sci, 0); + tms32025_device& dspslave(TMS32025(config, m_dspslave, 24000000*4)); /* 24 MHz? overclocked */ + dspslave.set_addrmap(AS_PROGRAM, &namcos21_state::slave_dsp_program); + dspslave.set_addrmap(AS_DATA, &namcos21_state::slave_dsp_data); + dspslave.set_addrmap(AS_IO, &namcos21_state::slave_dsp_io); + dspslave.hold_in_cb().set_constant(0); + dspslave.hold_ack_out_cb().set_nop(); + dspslave.xf_out_cb().set(FUNC(namcos21_state::slave_XF_output_w)); - MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */ + MCFG_QUANTUM_TIME(attotime::from_hz(12000)) MCFG_MACHINE_START_OVERRIDE(namcos21_state,namcos21) - MCFG_MACHINE_RESET_OVERRIDE(namcos21_state,namcos2) + MCFG_MACHINE_RESET_OVERRIDE(namcos21_state,namcos21) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS_NAMCO480I - MCFG_SCREEN_UPDATE_DRIVER(namcos21_state, screen_update_winrun) + MCFG_SCREEN_UPDATE_DRIVER(namcos21_state, screen_update_namcos21) MCFG_SCREEN_PALETTE("palette") + configure_c148_standard(config); + NAMCO_C139(config, m_sci, 0); + + MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_namcos21) MCFG_PALETTE_ADD("palette", NAMCOS21_NUM_COLORS) MCFG_PALETTE_FORMAT(XBRG) + NAMCO_C355SPR(config, m_c355spr, 0); + m_c355spr->set_palette_tag("palette"); + m_c355spr->set_gfxdecode_tag("gfxdecode"); + m_c355spr->set_is_namcofl(false); + m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); + m_c355spr->set_palxor(0xf); // reverse mapping + m_c355spr->set_gfxregion(0); + MCFG_VIDEO_START_OVERRIDE(namcos21_state,namcos21) SPEAKER(config, "lspeaker").front_left(); @@ -2100,242 +2281,176 @@ MACHINE_CONFIG_START(namcos21_state::winrun) MACHINE_CONFIG_END -ROM_START( aircomb ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Master */ - ROM_LOAD16_BYTE( "ac2-mpr-u.3j", 0x000000, 0x80000, CRC(a7133f85) SHA1(9f1c99dd503f1fc81096170fd272e33ae8a7de2f) ) - ROM_LOAD16_BYTE( "ac2-mpr-l.1j", 0x000001, 0x80000, CRC(520a52e6) SHA1(74306e02abfe08aa1afbf325b74dbc0840c3ad3a) ) - ROM_REGION( 0x80000, "slave", 0 ) /* Slave */ - ROM_LOAD16_BYTE( "ac2-spr-u.6c", 0x000000, 0x20000, CRC(42aca956) SHA1(10ea2400bb4d5b2d805e2de43ca0e0f54597f660) ) - ROM_LOAD16_BYTE( "ac2-spr-l.4c", 0x000001, 0x20000, CRC(3e15fa19) SHA1(65dbb33ab6b3c06c793613348ebb7b110b8bba0d) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound */ - ROM_LOAD( "ac1-snd0.8j", 0x00c000, 0x004000, CRC(5c1fb84b) SHA1(20e4d81289dbe58ffcfc947251a6ff1cc1e36436) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) - - ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ - ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) - ROM_REGION( 0x20000, "dspslave", 0 ) /* Slave DSP */ - ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) - - ROM_REGION( 0x400000, "gfx1", 0 ) - ROM_LOAD( "ac2-obj0.5s", 0x000000, 0x80000, CRC(8327ff22) SHA1(16f6022dedb7a74590898bc8ed3e8a97993c4635) ) - ROM_LOAD( "ac2-obj4.4s", 0x080000, 0x80000, CRC(e433e344) SHA1(98ade550cf066fcb5c09fa905f441a1464d4d625) ) - ROM_LOAD( "ac2-obj1.5x", 0x100000, 0x80000, CRC(43af566d) SHA1(99f0d9f005e28040f5cc10de2198893946a31d09) ) - ROM_LOAD( "ac2-obj5.4x", 0x180000, 0x80000, CRC(ecb19199) SHA1(8e0aa1bc1141c4b09576ab08970d0c7629560643) ) - ROM_LOAD( "ac2-obj2.3s", 0x200000, 0x80000, CRC(dafbf489) SHA1(c53ccb3e1b4a6a660bd28c8abe52ccc3f85d111f) ) - ROM_LOAD( "ac2-obj6.2s", 0x280000, 0x80000, CRC(24cc3f36) SHA1(e50af176eb3034c9cab7613ca614f5cc2c62f95e) ) - ROM_LOAD( "ac2-obj3.3x", 0x300000, 0x80000, CRC(bd555a1d) SHA1(96e432b30da6f5f7ccb768c516b1f7186bc0d4c9) ) - ROM_LOAD( "ac2-obj7.2x", 0x380000, 0x80000, CRC(d561fbe3) SHA1(a23976e10bddf74d4a6b292f044dfd0affbab101) ) - ROM_REGION16_BE( 0x100000, "data", 0 ) /* collision */ - ROM_LOAD16_BYTE( "ac1-data-u.3a", 0x000000, 0x80000, CRC(82320c71) SHA1(2be98d46853febb46e1cc728af2735c0e00ce303) ) - ROM_LOAD16_BYTE( "ac1-data-l.1a", 0x000001, 0x80000, CRC(fd7947d3) SHA1(2696eeae37de6d256e626cc3f3cea7b0f6eff60e) ) - - ROM_REGION16_BE( 0x100000, "edata", 0 ) - ROM_LOAD16_BYTE( "ac1-edata1-u.3c", 0x000000, 0x80000, CRC(a9547509) SHA1(1bc663cec03b60ad968896bbc2546f02efda135e) ) - ROM_LOAD16_BYTE( "ac1-edata1-l.1c", 0x000001, 0x80000, CRC(a87087dd) SHA1(cd9b83a8f07886ab44e4ded68002b44338777e8c) ) - - ROM_REGION32_BE( 0x400000, "point24", ROMREGION_ERASE00) /* 24bit signed point data */ - ROM_LOAD32_BYTE( "ac1-poi-h.2f", 0x000001, 0x80000, CRC(573bbc3b) SHA1(371be12b915db6872049f18980c1b55544cfc445) ) /* most significant */ - ROM_LOAD32_BYTE( "ac1-poi-lu.2k", 0x000002, 0x80000, CRC(d99084b9) SHA1(c604d60a2162af7610e5ff7c1aa4195f7df82efe) ) - ROM_LOAD32_BYTE( "ac1-poi-ll.2n", 0x000003, 0x80000, CRC(abb32307) SHA1(8e936ba99479215dd33a951d81ec2b04020dfd62) ) /* least significant */ - - ROM_REGION( 0x200000, "c140", 0 ) /* sound samples */ - ROM_LOAD("ac1-voi0.12b", 0x000000, 0x80000,CRC(f427b119) SHA1(bd45bbe41c8be26d6c997fcdc226d080b416a2cf) ) - ROM_LOAD("ac1-voi1.12c", 0x080000, 0x80000,CRC(c9490667) SHA1(4b6fbe635c32469870a8e6f82742be6a9d4918c9) ) - ROM_LOAD("ac1-voi2.12d", 0x100000, 0x80000,CRC(1fcb51ba) SHA1(80fc815e5fad76d20c3795ab1d89b57d9abc3efd) ) - ROM_LOAD("ac1-voi3.12e", 0x180000, 0x80000,CRC(cd202e06) SHA1(72a18f5ba402caefef14b8d1304f337eaaa3eb1d) ) +ROM_START( winrun ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68k code */ + ROM_LOAD16_BYTE( "wr2-mpub.3k", 0x000000, 0x20000, CRC(3bb0ea17) SHA1(201cedf5865224c1c4a0c9b017982e36ec9b8243) ) + ROM_LOAD16_BYTE( "wr2-mplb.1k", 0x000001, 0x20000, CRC(95465062) SHA1(7d010ff92e87949b7b9109f8320ab61de7d0400a) ) - ROM_REGION( 0x0600, "plds", 0 ) - ROM_LOAD( "gal16v8a-3pdsp5.17d", 0x0000, 0x0117, CRC(799c1f26) SHA1(d28ed1b9fa78180c5a0b01a7198a2870137c7349) ) - ROM_LOAD( "plhs18p8-3pobj3.17n", 0x0200, 0x0149, CRC(9625f469) SHA1(29158a3d37485fb0714d0a60bcd07abd26a3f56e) ) - ROM_LOAD( "plhs18p8-3pobj4.17n", 0x0400, 0x0149, CRC(1b7c90c1) SHA1(ae65aab7a191cdf1af488e144af22b9d8669c903) ) + ROM_REGION( 0x40000, "slave", 0 ) /* 68k code */ + ROM_LOAD16_BYTE( "wr1-spu.6b", 0x000000, 0x20000, CRC(d4915d44) SHA1(57056051138b259d021b3e7cc1c43a9f951b5cc1) ) + ROM_LOAD16_BYTE( "wr1-spl.4b", 0x000001, 0x20000, CRC(0c336505) SHA1(edee073bf6fabe45c577b0b9375295183eb30c62) ) - ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */ - ROM_LOAD( "aircomb.nv", 0x0000, 0x2000, CRC(a97ea3e0) SHA1(95684bb7369c1cb1e2fa53c743d4f94b0080c6f5) ) -ROM_END + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Sound */ + ROM_LOAD( "wr1-snd0.7c", 0x000000, 0x020000, CRC(698bae12) SHA1(86d22c1c639a9489e3c95820e4e3f04c30407e41) ) -ROM_START( aircombj ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Master */ - ROM_LOAD16_BYTE( "ac1-mpr-u.3j", 0x000000, 0x80000, CRC(a4dec813) SHA1(2ee8b3492d30db4c841f695151880925a5e205e0) ) - ROM_LOAD16_BYTE( "ac1-mpr-l.1j", 0x000001, 0x80000, CRC(8577b6a2) SHA1(32194e392fbd051754be88eb8c90688c65c65d85) ) + ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ + ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) - ROM_REGION( 0x080000, "slave", 0 ) /* Slave */ - ROM_LOAD16_BYTE( "ac1-spr-u.6c", 0x000000, 0x20000, CRC(5810e219) SHA1(c312ffd8324670897871b12d521779570dc0f580) ) - ROM_LOAD16_BYTE( "ac1-spr-l.4c", 0x000001, 0x20000, CRC(175a7d6c) SHA1(9e31dde6646cd9b6dcdbdb3f2326177508559e56) ) + ROM_REGION( 0x20000, "dsp", ROMREGION_ERASEFF ) /* DSP */ - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound */ - ROM_LOAD( "ac1-snd0.8j", 0x00c000, 0x004000, CRC(5c1fb84b) SHA1(20e4d81289dbe58ffcfc947251a6ff1cc1e36436) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x80000, "gpu", 0 ) /* 68k code */ + ROM_LOAD16_BYTE( "wr1-gp0u.1k", 0x00000, 0x20000, CRC(c66a43be) SHA1(88ec02c5c18c8bb91a95934c14e9ae530ae09880) ) + ROM_LOAD16_BYTE( "wr1-gp0l.3k", 0x00001, 0x20000, CRC(91a70e6f) SHA1(e613e2544f63cd386588445a2a199ae6b84d741e) ) + ROM_LOAD16_BYTE( "wr1-gp1u.1l", 0x40000, 0x20000, CRC(8ff51a3d) SHA1(81fbcd4e8c51742f35607537e1b1a86fd7782827) ) + ROM_LOAD16_BYTE( "wr1-gp1l.3l", 0x40001, 0x20000, CRC(9360d34e) SHA1(e558eb540c02acfe84f2dfe2d65afd609b7f3207) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) + ROM_REGION16_BE( 0x80000, "data", 0 ) + ROM_LOAD16_BYTE( "wr1-d0u.3a", 0x00000, 0x20000, CRC(84ea1492) SHA1(56274b39bd5be076c9904d9ed9ce3f6e29d9f038) ) + ROM_LOAD16_BYTE( "wr1-d0l.1a", 0x00001, 0x20000, CRC(b81508f9) SHA1(51c03c3dff86cece9790667b1557de940ebccbe9) ) + ROM_LOAD16_BYTE( "wr1-d1u.3b", 0x40000, 0x20000, CRC(bbd1fdd7) SHA1(026e9410525fa0e93f155949bbc1d3b8a2785bd1) ) + ROM_LOAD16_BYTE( "wr1-d1l.1b", 0x40001, 0x20000, CRC(8ddd7eac) SHA1(b873b253b0a095e66a9f68d45a2cb41fa025ba16) ) - ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ - ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) - ROM_REGION( 0x20000, "dspslave", 0 ) /* Slave DSP */ - ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) + ROM_REGION16_BE( 0x100000, "gdata", 0 ) /* bitmapped graphics */ + ROM_LOAD16_BYTE( "wr1-gd0u-2.1p", 0x00000, 0x40000, CRC(9752eef5) SHA1(d6df0faf9c2696247bdf463f53c1e474ec595dd0) ) + ROM_LOAD16_BYTE( "wr1-gd0l-2.3p", 0x00001, 0x40000, CRC(349c95cc) SHA1(8898eecf5918485ec683900520f123483077df28) ) - ROM_REGION( 0x400000, "gfx1", 0 ) - ROM_LOAD( "ac1-obj0.5s", 0x000000, 0x80000, CRC(d2310c6a) SHA1(9bb8fdfc2c232574777248f4959975f9a20e3105) ) - ROM_LOAD( "ac1-obj4.4s", 0x080000, 0x80000, CRC(0c93b478) SHA1(a92ffbcf04b64e0eee5bcf37008e247700641b25) ) - ROM_LOAD( "ac1-obj1.5x", 0x100000, 0x80000, CRC(f5783a77) SHA1(0be1815ceb4ce4fa7ab75ba588e090f20ee0cac9) ) - ROM_LOAD( "ac1-obj5.4x", 0x180000, 0x80000, CRC(476aed15) SHA1(0e53fdf02e8ffe7852a1fa8bd2f64d0e58f3dc09) ) - ROM_LOAD( "ac1-obj2.3s", 0x200000, 0x80000, CRC(01343d5c) SHA1(64171fed1d1f8682b3d70d3233ea017719f4cc63) ) - ROM_LOAD( "ac1-obj6.2s", 0x280000, 0x80000, CRC(c67607b1) SHA1(df64ea7920cf64271fe742d3d0a57f842ee61e8d) ) - ROM_LOAD( "ac1-obj3.3x", 0x300000, 0x80000, CRC(7717f52e) SHA1(be1df3f4d0fdcaa5d3c81a724e5eb9d14136c6f5) ) - ROM_LOAD( "ac1-obj7.2x", 0x380000, 0x80000, CRC(cfa9fe5f) SHA1(0da25663b89d653c87ed32d15f7c82f3035702ab) ) + ROM_REGION16_BE( 0x80000, "point16", 0 ) /* 3d objects */ + ROM_LOAD16_BYTE( "wr1-pt0u.8j", 0x00000, 0x20000, CRC(7ec4cf6b) SHA1(92ec92567b9f7321efb4a3724cbcdba216eb22f9) ) + ROM_LOAD16_BYTE( "wr1-pt0l.8d", 0x00001, 0x20000, CRC(58c14b73) SHA1(e34a26866cd870743e166669f7fa5915a82104e9) ) - ROM_REGION16_BE( 0x100000, "data", 0 ) - ROM_LOAD16_BYTE( "ac1-data-u.3a", 0x000000, 0x80000, CRC(82320c71) SHA1(2be98d46853febb46e1cc728af2735c0e00ce303) ) - ROM_LOAD16_BYTE( "ac1-data-l.1a", 0x000001, 0x80000, CRC(fd7947d3) SHA1(2696eeae37de6d256e626cc3f3cea7b0f6eff60e) ) + ROM_REGION( 0x200000, "c140", 0 ) /* sound samples */ + ROM_LOAD("wr-voi-0.11b", 0x040000, 0x40000, CRC(8040b645) SHA1(7ccafb3073fa79910e26cf9b8b6e8e9ae22e55fc) ) + ROM_LOAD("wr-voi-1.11c", 0x0c0000, 0x40000, CRC(d347e904) SHA1(620cd07e6230322c306283e45a43fa1e217028d4) ) + ROM_LOAD("wr-voi-2.11d", 0x140000, 0x40000, CRC(b34747af) SHA1(7e0b55631bffa0583bf4f7f5368db9f09e411ba1) ) + ROM_LOAD("wr-voi-3.11e", 0x1c0000, 0x40000, CRC(43085303) SHA1(9f743055c20df3548879118194244e37a0b91f7e) ) - ROM_REGION16_BE( 0x100000, "edata", 0 ) - ROM_LOAD16_BYTE( "ac1-edata1-u.3c", 0x000000, 0x80000, CRC(a9547509) SHA1(1bc663cec03b60ad968896bbc2546f02efda135e) ) - ROM_LOAD16_BYTE( "ac1-edata1-l.1c", 0x000001, 0x80000, CRC(a87087dd) SHA1(cd9b83a8f07886ab44e4ded68002b44338777e8c) ) + ROM_REGION( 0x1000, "pals", 0 ) + /* Main PCB (2252960101) */ + ROM_LOAD("sys87b-2.3w", 0x000, 0x104, CRC(18f43c22) SHA1(72849c5b842678bb9037541d26d4c99cdf879982) ) /* PAL16L8ACN */ + ROM_LOAD("wr-c1.6p", 0x000, 0x040, CRC(d6c33258) SHA1(5baf71fae1ad73a75d91ee2dededca2254b4f414) ) /* PAL12L10CNS */ + ROM_LOAD("wr-c2.8k", 0x000, 0x040, CRC(a3e77ade) SHA1(b4282fc4d21ce7813aba7772a85d721fb25144b6) ) /* PAL12L10CNS */ - ROM_REGION32_BE( 0x400000, "point24", ROMREGION_ERASE00) /* 24bit signed point data */ - ROM_LOAD32_BYTE( "ac1-poi-h.2f", 0x000001, 0x80000, CRC(573bbc3b) SHA1(371be12b915db6872049f18980c1b55544cfc445) ) /* most significant */ - ROM_LOAD32_BYTE( "ac1-poi-lu.2k", 0x000002, 0x80000, CRC(d99084b9) SHA1(c604d60a2162af7610e5ff7c1aa4195f7df82efe) ) - ROM_LOAD32_BYTE( "ac1-poi-ll.2n", 0x000003, 0x80000, CRC(abb32307) SHA1(8e936ba99479215dd33a951d81ec2b04020dfd62) ) /* least significant */ + /* Framebuffer PCB (2252960900) */ + ROM_LOAD("wr-g1.3a", 0x000, 0x104, CRC(d6b4373d) SHA1(b4db4526a37b7d6862cec1d223f2281e5120f225) ) /* PAL16L8ACN */ + ROM_LOAD("wr-g2b.4p", 0x000, 0x104, NO_DUMP ) /* PAL16L8ACN */ + ROM_LOAD("wr-g3.4s", 0x000, 0x104, NO_DUMP ) /* GAL20V8 */ + ROM_LOAD("wr-g4.7f", 0x000, 0x104, CRC(f858b32b) SHA1(59af496e4416c9becb116315542858ac917cbe46) ) /* PAL16L8ACN */ - ROM_REGION( 0x200000, "c140", 0 ) /* sound samples */ - ROM_LOAD("ac1-voi0.12b", 0x000000, 0x80000,CRC(f427b119) SHA1(bd45bbe41c8be26d6c997fcdc226d080b416a2cf) ) - ROM_LOAD("ac1-voi1.12c", 0x080000, 0x80000,CRC(c9490667) SHA1(4b6fbe635c32469870a8e6f82742be6a9d4918c9) ) - ROM_LOAD("ac1-voi2.12d", 0x100000, 0x80000,CRC(1fcb51ba) SHA1(80fc815e5fad76d20c3795ab1d89b57d9abc3efd) ) - ROM_LOAD("ac1-voi3.12e", 0x180000, 0x80000,CRC(cd202e06) SHA1(72a18f5ba402caefef14b8d1304f337eaaa3eb1d) ) + /* 3D PCB (2252960701) */ + ROM_LOAD("wr-p1.1b", 0x000, 0x104, CRC(5856cc43) SHA1(4578c7a7d731c61d678d594dd071370db46cc3f7) ) /* PAL16L8ACN */ - ROM_REGION( 0x0600, "plds", 0 ) - ROM_LOAD( "gal16v8a-3pdsp5.17d", 0x0000, 0x0117, CRC(799c1f26) SHA1(d28ed1b9fa78180c5a0b01a7198a2870137c7349) ) - ROM_LOAD( "plhs18p8-3pobj3.17n", 0x0200, 0x0149, CRC(9625f469) SHA1(29158a3d37485fb0714d0a60bcd07abd26a3f56e) ) - ROM_LOAD( "plhs18p8-3pobj4.17n", 0x0400, 0x0149, CRC(1b7c90c1) SHA1(ae65aab7a191cdf1af488e144af22b9d8669c903) ) + /* DSP PCB (2252960601) */ + ROM_LOAD("wr-d1.3b", 0x000, 0x104, CRC(7a072b71) SHA1(45b8d9405a2c1a40f2cd9c6a33d105565136c538) ) /* PAL16L8ACN */ + ROM_LOAD("wr-d2.4j", 0x000, 0x104, CRC(614de474) SHA1(80c3ab287896e07073a70dd42e7b47f515dd3931) ) /* PAL16L8ACN */ ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */ - ROM_LOAD( "aircombj.nv", 0x0000, 0x2000, CRC(56c71c83) SHA1(83dfcf4e3232f78e3807e9d3e862aa5446444165) ) + ROM_LOAD( "nvram", 0x0000, 0x2000, CRC(93b4c4b5) SHA1(2fb5b9437304c97a2436b446671284aae69d545d) ) ROM_END -ROM_START( cybsled ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Master */ - ROM_LOAD16_BYTE( "cy2-mpr-u.3j", 0x000000, 0x80000, CRC(b35a72bc) SHA1(d9bc5b8f0bc30510fca8fc57eeb67e5ca0e4c67f) ) - ROM_LOAD16_BYTE( "cy2-mpr-l.1j", 0x000001, 0x80000, CRC(c4a25919) SHA1(52f6947102001376e37730ace16283141b13fee7) ) +ROM_START( winrungp ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68k code */ + ROM_LOAD16_BYTE( "sg1-mp-ub.3k", 0x000000, 0x20000, CRC(7f9b855a) SHA1(6d39a3a9959dbcd0047dbaab0fcd68adc81f5508) ) + ROM_LOAD16_BYTE( "sg1-mp-lb.1k", 0x000001, 0x20000, CRC(a45e8543) SHA1(f9e583a988e4661026ee7873a48d078225778df3) ) - ROM_REGION( 0x100000, "slave", 0 ) /* Slave */ - ROM_LOAD16_BYTE( "cy2-spr-u.6c", 0x000000, 0x80000, CRC(575a422d) SHA1(cad97742da1e2baf47ac110fadef5544b3a30cc7) ) - ROM_LOAD16_BYTE( "cy2-spr-l.4c", 0x000001, 0x80000, CRC(4066291a) SHA1(6ebbc11a68f66ec1e6d2e6ee857e8c599691e289) ) + ROM_REGION( 0x40000, "slave", 0 ) /* 68k code */ + ROM_LOAD16_BYTE( "sg1-sp-u.6b", 0x000000, 0x20000, CRC(7c9c3a3f) SHA1(cacb45c9111ac66c6e60b7a0cacd8bf47fd00752) ) + ROM_LOAD16_BYTE( "sg1-sp-l.4b", 0x000001, 0x20000, CRC(5068fc5d) SHA1(7f6e80f74985959509d824318a4a7ff2b11953da) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound */ - ROM_LOAD( "cy1-snd0.8j", 0x00c000, 0x004000, CRC(3dddf83b) SHA1(e16119cbef176b6f8f8ace773fcbc201e987823f) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Sound */ + ROM_LOAD( "sg1-snd0.7c", 0x000000, 0x020000, CRC(de04b794) SHA1(191f4d79ac2375d7060f3d83ec753185e92f28ea) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) - ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ - ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) - ROM_REGION( 0x20000, "dspslave", 0 ) /* Slave DSP */ - ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) + ROM_REGION( 0x20000, "dsp", ROMREGION_ERASEFF ) /* DSP */ - ROM_REGION( 0x400000, "gfx1", 0 ) - ROM_LOAD( "cy1-obj0.5s", 0x000000, 0x80000, CRC(5ae542d5) SHA1(99b1a3ed476da4a97cb864538909d7b831f0fd3b) ) - ROM_LOAD( "cy1-obj4.4s", 0x080000, 0x80000, CRC(57904076) SHA1(b1dc0d99543bc4b9584b37ffc12c6ebc59e30e3b) ) - ROM_LOAD( "cy1-obj1.5x", 0x100000, 0x80000, CRC(4aae3eff) SHA1(c80240bd2f4228a0261a14adb6b10560b31b5aa0) ) - ROM_LOAD( "cy1-obj5.4x", 0x180000, 0x80000, CRC(0e11ca47) SHA1(076a9a4cfddbee2d8aaa06110333090d8fdbefeb) ) - ROM_LOAD( "cy1-obj2.3s", 0x200000, 0x80000, CRC(d64ec4c3) SHA1(0bed1cafc21ed8cef3850fb81e30076977086eb0) ) - ROM_LOAD( "cy1-obj6.2s", 0x280000, 0x80000, CRC(7748b485) SHA1(adb4da419a6cdbefd0fef182d866a3479be379af) ) - ROM_LOAD( "cy1-obj3.3x", 0x300000, 0x80000, CRC(3d1f7168) SHA1(392dddcc79fe61dcc6514a91ac27b5e36825d8b7) ) - ROM_LOAD( "cy1-obj7.2x", 0x380000, 0x80000, CRC(b6eb6ad2) SHA1(85a660c5e44012491be7d4e783cce6ba12c135cb) ) + ROM_REGION( 0x80000, "gpu", 0 ) /* 68k code */ + ROM_LOAD16_BYTE( "sg1-gp0-u.1j", 0x00000, 0x20000, CRC(475da78a) SHA1(6e69bcc6caf2e3cd28fed75796c8992e754f9323) ) + ROM_LOAD16_BYTE( "sg1-gp0-l.3j", 0x00001, 0x20000, CRC(580479bf) SHA1(ba682190cba0d3cdc49aa4937c898ba7ed2a25f5) ) + ROM_LOAD16_BYTE( "sg1-gp1-u.1l", 0x40000, 0x20000, CRC(f5f2e927) SHA1(ebf709f16f01f1a634de9121454537cda74e891b) ) + ROM_LOAD16_BYTE( "sg1-gp1-l.3l", 0x40001, 0x20000, CRC(17ed90a5) SHA1(386bdcb11dcbe400f5be1fe4a7418158b46e50ef) ) - ROM_REGION16_BE( 0x100000, "data", 0 ) - ROM_LOAD16_BYTE( "cy1-data-u.3a", 0x000000, 0x80000, CRC(570da15d) SHA1(9ebe756f10756c079a92fb522332e9e52ff715c3) ) - ROM_LOAD16_BYTE( "cy1-data-l.1a", 0x000001, 0x80000, CRC(9cf96f9e) SHA1(91783f48b93e03c778c6641ca8fb419c13b0d3c5) ) + ROM_REGION16_BE( 0x80000, "data", 0 ) + ROM_LOAD16_BYTE( "sg1-data0-u.3a", 0x00000, 0x20000, CRC(1dde2ac2) SHA1(2d20a434561c04e48b52a2137a8c9047e17c1013) ) + ROM_LOAD16_BYTE( "sg1-data0-l.1a", 0x00001, 0x20000, CRC(2afeb77e) SHA1(ac1552f6e2788158d3477b6a0981d001d6cbdf13) ) + ROM_LOAD16_BYTE( "sg1-data1-u.3b", 0x40000, 0x20000, CRC(5664b09e) SHA1(10c1c29614eee2cffcfd69085f0450d81ba2e25f) ) + ROM_LOAD16_BYTE( "sg1-data1-l.1b", 0x40001, 0x20000, CRC(2dbc7de4) SHA1(824304c95942c7296f8e8dcf8ee7e22bf56154b1) ) - ROM_REGION16_BE( 0x100000, "edata", 0 ) - ROM_LOAD16_BYTE( "cy1-edata0-u.3b", 0x000000, 0x80000, CRC(77452533) SHA1(48fc199bcc1beb23c714eebd9b09b153c980170b) ) - ROM_LOAD16_BYTE( "cy1-edata0-l.1b", 0x000001, 0x80000, CRC(e812e290) SHA1(719e0a026ae8ef63d0d0269b67669ea9b4d950dd) ) + ROM_REGION16_BE( 0x100000, "gdata", 0 ) /* bitmapped graphics */ + ROM_LOAD16_BYTE( "sg1-gd0-u.1p", 0x00000, 0x40000, CRC(7838fcde) SHA1(45e31269eed1999b73c41c2f5d2c5bfbbdaf23df) ) + ROM_LOAD16_BYTE( "sg1-gd0-l.3p", 0x00001, 0x40000, CRC(4bd02b9a) SHA1(b2fdfd1c1325864aaad87f5358ab9bbdd79ff6ae) ) + ROM_LOAD16_BYTE( "sg1-gd1-u.1s", 0x80000, 0x40000, CRC(271db29b) SHA1(8b35fcf273b9aec28d4c606c41c0626dded697e1) ) + ROM_LOAD16_BYTE( "sg1-gd1-l.3s", 0x80001, 0x40000, CRC(a6c4da96) SHA1(377dbf21a1bede01de16708c96c112abab4417ce) ) - ROM_REGION32_BE( 0x400000, "point24", ROMREGION_ERASE00) /* 24bit signed point data */ - ROM_LOAD32_BYTE( "cy1-poi-h1.2f", 0x000001, 0x80000, CRC(eaf8bac3) SHA1(7a2caf6672af158b4a23ce4626342d1f17d1a4e4) ) /* most significant */ - ROM_LOAD32_BYTE( "cy1-poi-lu1.2k", 0x000002, 0x80000, CRC(c544a8dc) SHA1(4cce5f2ab3519b4aa7edbdd15b2d79a7fdcade3c) ) - ROM_LOAD32_BYTE( "cy1-poi-ll1.2n", 0x000003, 0x80000, CRC(30acb99b) SHA1(a28dcb3e5405f166644f6353a903c1143ee268f1) ) /* least significant */ - ROM_LOAD32_BYTE( "cy1-poi-h2.2j", 0x200001, 0x80000, CRC(4079f342) SHA1(fa36aed1abbda54a42f29b183007474580870319) ) - ROM_LOAD32_BYTE( "cy1-poi-lu2.2l", 0x200002, 0x80000, CRC(61d816d4) SHA1(7991957b910d32530151abc7f469fcf1de62d8f3) ) - ROM_LOAD32_BYTE( "cy1-poi-ll2.2p", 0x200003, 0x80000, CRC(faf09158) SHA1(b56ebed6012362b1d599c396a43e90a1e4d9dc38) ) + ROM_REGION16_BE( 0x80000, "point16", 0 ) /* 3d objects */ + ROM_LOAD16_BYTE( "sg1-pt0-u.8j", 0x00000, 0x20000, CRC(160c3634) SHA1(485d20d6cc459f17d77682201dee07bdf76bf343) ) + ROM_LOAD16_BYTE( "sg1-pt0-l.8d", 0x00001, 0x20000, CRC(b5a665bf) SHA1(5af6ec492f31395c0492e14590b025b120067b8d) ) + ROM_LOAD16_BYTE( "sg1-pt1-u.8l", 0x40000, 0x20000, CRC(b63d3006) SHA1(78e78619766b0fd91b1e830cfb066495d6773981) ) + ROM_LOAD16_BYTE( "sg1-pt1-l.8e", 0x40001, 0x20000, CRC(6385e325) SHA1(d50bceb2e9c0d0a38d7b0f918f99c482649e260d) ) ROM_REGION( 0x200000, "c140", 0 ) /* sound samples */ - ROM_LOAD("cy1-voi0.12b", 0x000000, 0x80000,CRC(99d7ce46) SHA1(b75f4055c3ce847daabfacda22df14e3f80c4fb9) ) - ROM_LOAD("cy1-voi1.12c", 0x080000, 0x80000,CRC(2b335f06) SHA1(2b2cd407c34388b56496f84a414daa153780b098) ) - ROM_LOAD("cy1-voi2.12d", 0x100000, 0x80000,CRC(10cd15f0) SHA1(9b721654ed97a13287373c1b2854ac9aeddc271f) ) - ROM_LOAD("cy1-voi3.12e", 0x180000, 0x80000,CRC(c902b4a4) SHA1(816357ec1a02a7ebf817ac1182e9c50ce5ca71f6) ) + ROM_LOAD("sg-voi-1.11c", 0x080000, 0x80000,CRC(7dcccb31) SHA1(4441b37691434b13eae5dee2d04dc12a56b04d2a) ) + ROM_LOAD("sg-voi-3.11e", 0x180000, 0x80000,CRC(a198141c) SHA1(b4ca352e6aedd9d7a7e5e39e840f1d3a7145900e) ) ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */ - ROM_LOAD( "cybsled.nv", 0x0000, 0x2000, CRC(aa18bf9e) SHA1(3712d4d20e5f5f1c920e3f1f6a00101e874662d0) ) + ROM_LOAD( "nvram", 0x0000, 0x2000, CRC(93cca84c) SHA1(e39510d9f066266a77780662a6d991c3dd0348d1) ) ROM_END -ROM_START( cybsledj ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Master */ - ROM_LOAD16_BYTE( "cy1-mpr-u.3j", 0x000000, 0x80000, CRC(cc5a2e83) SHA1(b794051b2c351e9ca43351603845e4e563f6740f) ) - ROM_LOAD16_BYTE( "cy1-mpr-l.1j", 0x000001, 0x80000, CRC(f7ee8b48) SHA1(6d36eb3dba9cf7f5f5e1a26c156e77a2dad3f257) ) +ROM_START( winrun91 ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68k code */ + ROM_LOAD16_BYTE( "r911-mpu.3k", 0x000000, 0x20000, CRC(80a0e5be) SHA1(6613b95e164c2032ea9043e4161130c6b3262492) ) + ROM_LOAD16_BYTE( "r911-mpl.1k", 0x000001, 0x20000, CRC(942172d8) SHA1(21d8dfd2165b5ceb0399fdb53d9d0f51f1255803) ) - ROM_REGION( 0x100000, "slave", 0 ) /* Slave */ - ROM_LOAD16_BYTE( "cy1-spr-u.6c", 0x000000, 0x80000, CRC(28dd707b) SHA1(11297ceae4fe78d170785a5cf9ad77833bbe7fff) ) - ROM_LOAD16_BYTE( "cy1-spr-l.4c", 0x000001, 0x80000, CRC(437029de) SHA1(3d275a2b0ce6909e77e657c371bd22597ea9d398) ) + ROM_REGION( 0x40000, "slave", 0 ) /* 68k code */ + ROM_LOAD16_BYTE( "r911-spu.6b", 0x000000, 0x20000, CRC(0221d4b2) SHA1(65fd38b1cfaa6693d71248561d764a9ea1098c56) ) + ROM_LOAD16_BYTE( "r911-spl.4b", 0x000001, 0x20000, CRC(288799e2) SHA1(2c4bf0cf9c71458fff4dd77e426a76685d9e1bab) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound */ - ROM_LOAD( "cy1-snd0.8j", 0x00c000, 0x004000, CRC(3dddf83b) SHA1(e16119cbef176b6f8f8ace773fcbc201e987823f) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Sound */ + ROM_LOAD( "r911-snd0.7c", 0x000000, 0x020000, CRC(6a321e1e) SHA1(b2e77cac4ed7609593fa5a462c9d78526451e477) ) ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) - ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ - ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) - ROM_REGION( 0x20000, "dspslave", 0 ) /* Slave DSP */ - ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) + ROM_REGION( 0x20000, "dsp", ROMREGION_ERASEFF ) /* DSP */ - ROM_REGION( 0x400000, "gfx1", 0 ) - ROM_LOAD( "cy1-obj0.5s", 0x000000, 0x80000, CRC(5ae542d5) SHA1(99b1a3ed476da4a97cb864538909d7b831f0fd3b) ) - ROM_LOAD( "cy1-obj4.4s", 0x080000, 0x80000, CRC(57904076) SHA1(b1dc0d99543bc4b9584b37ffc12c6ebc59e30e3b) ) - ROM_LOAD( "cy1-obj1.5x", 0x100000, 0x80000, CRC(4aae3eff) SHA1(c80240bd2f4228a0261a14adb6b10560b31b5aa0) ) - ROM_LOAD( "cy1-obj5.4x", 0x180000, 0x80000, CRC(0e11ca47) SHA1(076a9a4cfddbee2d8aaa06110333090d8fdbefeb) ) - ROM_LOAD( "cy1-obj2.3s", 0x200000, 0x80000, CRC(d64ec4c3) SHA1(0bed1cafc21ed8cef3850fb81e30076977086eb0) ) - ROM_LOAD( "cy1-obj6.2s", 0x280000, 0x80000, CRC(7748b485) SHA1(adb4da419a6cdbefd0fef182d866a3479be379af) ) - ROM_LOAD( "cy1-obj3.3x", 0x300000, 0x80000, CRC(3d1f7168) SHA1(392dddcc79fe61dcc6514a91ac27b5e36825d8b7) ) - ROM_LOAD( "cy1-obj7.2x", 0x380000, 0x80000, CRC(b6eb6ad2) SHA1(85a660c5e44012491be7d4e783cce6ba12c135cb) ) + ROM_REGION( 0x80000, "gpu", 0 ) /* 68k code */ + ROM_LOAD16_BYTE( "r911-gp0u.1j", 0x00000, 0x20000, CRC(f5469a29) SHA1(38b6ea1fbe482b69fbb0e2f44f44a0ca2a49f6bc) ) + ROM_LOAD16_BYTE( "r911-gp0l.3j", 0x00001, 0x20000, CRC(5c18f596) SHA1(215cbda62254e31b4ff6431623384df1639bfdb7) ) + ROM_LOAD16_BYTE( "r911-gp1u.1l", 0x40000, 0x20000, CRC(146ab6b8) SHA1(aefb89585bf311f8d33f18298fea326ef1f19f1e) ) + ROM_LOAD16_BYTE( "r911-gp1l.3l", 0x40001, 0x20000, CRC(96c2463c) SHA1(e43db580e7b454af04c22e894108fbb56da0eeb5) ) - ROM_REGION16_BE( 0x100000, "data", 0 ) - ROM_LOAD16_BYTE( "cy1-data-u.3a", 0x000000, 0x80000, CRC(570da15d) SHA1(9ebe756f10756c079a92fb522332e9e52ff715c3) ) - ROM_LOAD16_BYTE( "cy1-data-l.1a", 0x000001, 0x80000, CRC(9cf96f9e) SHA1(91783f48b93e03c778c6641ca8fb419c13b0d3c5) ) + ROM_REGION16_BE( 0x80000, "data", 0 ) + ROM_LOAD16_BYTE( "r911-d0u.3a", 0x00000, 0x20000, CRC(dcb27da5) SHA1(ecd72397d10313fe8dcb8589bdc5d88d4298b26c) ) + ROM_LOAD16_BYTE( "r911-d0l.1a", 0x00001, 0x20000, CRC(f692a8f3) SHA1(4c29f60400b18d9ef0425de149618da6cf762ca4) ) + ROM_LOAD16_BYTE( "r911-d1u.3b", 0x40000, 0x20000, CRC(ac2afd1b) SHA1(510eb41931164b086c85ba0a86d6f10b88f5e534) ) + ROM_LOAD16_BYTE( "r911-d1l.1b", 0x40001, 0x20000, CRC(ebb51af1) SHA1(87b7b64ee662bf652add1e1199e42391d0e2f7e8) ) - ROM_REGION16_BE( 0x100000, "edata", 0 ) - ROM_LOAD16_BYTE( "cy1-edata0-u.3b", 0x000000, 0x80000, CRC(77452533) SHA1(48fc199bcc1beb23c714eebd9b09b153c980170b) ) - ROM_LOAD16_BYTE( "cy1-edata0-l.1b", 0x000001, 0x80000, CRC(e812e290) SHA1(719e0a026ae8ef63d0d0269b67669ea9b4d950dd) ) + ROM_REGION16_BE( 0x100000, "gdata", 0 ) /* bitmapped graphics */ + ROM_LOAD16_BYTE( "r911-gd0u.1p", 0x00000, 0x40000, CRC(33f5a19b) SHA1(b1dbd242168007f80e13e11c78b34abc1668883e) ) + ROM_LOAD16_BYTE( "r911-gd0l.3p", 0x00001, 0x40000, CRC(9a29500e) SHA1(c605f86b138e0a4c3163ffd967482e298a15fbe7) ) + ROM_LOAD16_BYTE( "r911-gd1u.1s", 0x80000, 0x40000, CRC(17e5a61c) SHA1(272ebd7daa56847f1887809535362331b5465dec) ) + ROM_LOAD16_BYTE( "r911-gd1l.3s", 0x80001, 0x40000, CRC(64df59a2) SHA1(1e9d0945b94780bb0be16803e767466d2cda07e8) ) - ROM_REGION32_BE( 0x400000, "point24", ROMREGION_ERASE00) /* 24bit signed point data */ - ROM_LOAD32_BYTE( "cy1-poi-h1.2f", 0x000001, 0x80000, CRC(eaf8bac3) SHA1(7a2caf6672af158b4a23ce4626342d1f17d1a4e4) ) /* most significant */ - ROM_LOAD32_BYTE( "cy1-poi-lu1.2k", 0x000002, 0x80000, CRC(c544a8dc) SHA1(4cce5f2ab3519b4aa7edbdd15b2d79a7fdcade3c) ) - ROM_LOAD32_BYTE( "cy1-poi-ll1.2n", 0x000003, 0x80000, CRC(30acb99b) SHA1(a28dcb3e5405f166644f6353a903c1143ee268f1) ) /* least significant */ - ROM_LOAD32_BYTE( "cy1-poi-h2.2j", 0x200001, 0x80000, CRC(4079f342) SHA1(fa36aed1abbda54a42f29b183007474580870319) ) - ROM_LOAD32_BYTE( "cy1-poi-lu2.2l", 0x200002, 0x80000, CRC(61d816d4) SHA1(7991957b910d32530151abc7f469fcf1de62d8f3) ) - ROM_LOAD32_BYTE( "cy1-poi-ll2.2p", 0x200003, 0x80000, CRC(faf09158) SHA1(b56ebed6012362b1d599c396a43e90a1e4d9dc38) ) + ROM_REGION16_BE( 0x80000, "point16", 0 ) /* winrun91 - 3d objects */ + ROM_LOAD16_BYTE( "r911-pt0u.8j", 0x00000, 0x20000, CRC(abf512a6) SHA1(e86288039d6c4dedfa95b11cb7e4b87637f90c09) ) /* Version on SYSTEM21B CPU only has R911 PTU @ 8W */ + ROM_LOAD16_BYTE( "r911-pt0l.8d", 0x00001, 0x20000, CRC(ac8d468c) SHA1(d1b457a19a5d3259d0caf933f42b3a02b485867b) ) /* and R911 PTL @ 12W with rom type 27C020 */ + ROM_LOAD16_BYTE( "r911-pt1u.8l", 0x40000, 0x20000, CRC(7e5dab74) SHA1(5bde219d5b4305d38d17b494b2e759f05d05329f) ) + ROM_LOAD16_BYTE( "r911-pt1l.8e", 0x40001, 0x20000, CRC(38a54ec5) SHA1(5c6017c98cae674868153ff2d64532027cf0ab83) ) ROM_REGION( 0x200000, "c140", 0 ) /* sound samples */ - ROM_LOAD("cy1-voi0.12b", 0x000000, 0x80000,CRC(99d7ce46) SHA1(b75f4055c3ce847daabfacda22df14e3f80c4fb9) ) - ROM_LOAD("cy1-voi1.12c", 0x080000, 0x80000,CRC(2b335f06) SHA1(2b2cd407c34388b56496f84a414daa153780b098) ) - ROM_LOAD("cy1-voi2.12d", 0x100000, 0x80000,CRC(10cd15f0) SHA1(9b721654ed97a13287373c1b2854ac9aeddc271f) ) - ROM_LOAD("cy1-voi3.12e", 0x180000, 0x80000,CRC(c902b4a4) SHA1(816357ec1a02a7ebf817ac1182e9c50ce5ca71f6) ) + ROM_LOAD("r911-avo1.11c", 0x080000, 0x80000,CRC(9fb33af3) SHA1(666630a8e5766ca4c3275961963c3e713dfdda2d) ) + ROM_LOAD("r911-avo3.11e", 0x180000, 0x80000,CRC(76e22f92) SHA1(0e1b8d35a5b9c20cc3192d935f0c9da1e69679d2) ) ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */ - ROM_LOAD( "cybsledj.nv", 0x0000, 0x2000, CRC(a73bb03e) SHA1(e074bfeae14178c867070e06f6690ed13115f5fa) ) + ROM_LOAD( "nvram", 0x0000, 0x2000, CRC(75bcbc22) SHA1(1e7e785735d27aa8cd8393b16b589a46ecd7956a) ) ROM_END + + ROM_START( driveyes ) ROM_REGION( 0x40000, "maincpu", 0 ) /* C68C - 68k code */ ROM_LOAD16_BYTE( "de2-mp-ub.3j", 0x000000, 0x20000, CRC(f9c86fb5) SHA1(b48d16e8f26e7a2cfecb30285b517c42e5585ac7) ) @@ -2345,24 +2460,20 @@ ROM_START( driveyes ) ROM_LOAD16_BYTE( "de1-sp-ub.6c", 0x000000, 0x20000, CRC(231b144f) SHA1(42518614cb083455dc5fec71e699403907ca784b) ) ROM_LOAD16_BYTE( "de1-sp-lb.4c", 0x000001, 0x20000, CRC(50cb9f59) SHA1(aec7fa080854f0297d9e90e3aaeb0f332fd579bd) ) - ROM_REGION( 0x30000, "audiocpu", 0 ) /* Sound */ + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Sound */ /* There are 3 separate complete boards used for this 3 screen version.... "Set2" (center screen board?) has de1_snd0 while the other 2 sets have de1_snd0r (rear speakers??) Only "Set2" has voice roms present/dumped? We load the "r" set, then load set2's sound CPU code over it to keep the "r" rom in the set */ - ROM_LOAD( "de1-snd0r.8j", 0x00c000, 0x004000, CRC(7bbeda42) SHA1(fe840cc9069758928492bbeec79acded18daafd9) ) /* Sets 1 & 3 */ - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) - ROM_LOAD( "de1-snd0.8j", 0x00c000, 0x004000, CRC(5474f203) SHA1(e0ae2f6978deb0c934d9311a334a6e36bb402aee) ) /* Set 2 */ - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_LOAD( "de1-snd0r.8j", 0x000000, 0x020000, CRC(7bbeda42) SHA1(fe840cc9069758928492bbeec79acded18daafd9) ) /* Sets 1 & 3 */ + ROM_LOAD( "de1-snd0.8j", 0x000000, 0x020000, CRC(5474f203) SHA1(e0ae2f6978deb0c934d9311a334a6e36bb402aee) ) /* Set 2 */ - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ - ROM_REGION( 0x20000, "dsp", ROMREGION_ERASEFF ) /* C67 - DSP */ + ROM_REGION( 0x20000, "dsp", ROMREGION_ERASEFF ) /* DSP (no internal ROM?) */ ROM_REGION( 0x200000, "gfx1", 0 ) /* sprites */ ROM_LOAD( "de1-obj0.5s", 0x000000, 0x40000, CRC(7438bd53) SHA1(7619c4b56d5c466e845eb45e6157dcaf2a03ad94) ) @@ -2391,8 +2502,13 @@ We load the "r" set, then load set2's sound CPU code over it to keep the "r" rom ROM_LOAD("de1-voi1.12c", 0x0c0000, 0x40000, CRC(a71dc55a) SHA1(5e746184db9144ab4e3a97b20195b92b0f56c8cc) ) ROM_LOAD("de1-voi2.12d", 0x140000, 0x40000, CRC(4d32879a) SHA1(eae65f4b98cee9efe4e5dad7298c3717cfb1e6bf) ) ROM_LOAD("de1-voi3.12e", 0x1c0000, 0x40000, CRC(e4832d18) SHA1(0460c79d3942aab89a765b0bd8bbddaf19a6d682) ) + + ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */ + ROM_LOAD( "nvram", 0x0000, 0x2000, CRC(fa6623e9) SHA1(8c313f136724eb6c829261b223a2ac1fc08d00c2) ) ROM_END + + ROM_START( starblad ) ROM_REGION( 0x100000, "maincpu", 0 ) /* Master */ ROM_LOAD16_BYTE( "st2_mpu.mpru", 0x000000, 0x80000, CRC(35bc9e4a) SHA1(03401fb846c1b2aee775071a554654e49fe5c47c) ) @@ -2402,13 +2518,11 @@ ROM_START( starblad ) ROM_LOAD16_BYTE( "st1-sp-u.bin", 0x000000, 0x40000, CRC(9f9a55db) SHA1(72bf5d6908cc57cc490fa2292b4993d796b2974d) ) ROM_LOAD16_BYTE( "st1-sp-l.bin", 0x000001, 0x40000, CRC(acbe39c7) SHA1(ca48b7ea619b1caaf590eed33001826ce7ef36d8) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound */ - ROM_LOAD( "st1-snd0.bin", 0x00c000, 0x004000, CRC(c0e934a3) SHA1(678ed6705c6f494d7ecb801a4ef1b123b80979a5) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound */ + ROM_LOAD( "st1-snd0.bin", 0x000000, 0x020000, CRC(c0e934a3) SHA1(678ed6705c6f494d7ecb801a4ef1b123b80979a5) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) @@ -2454,13 +2568,11 @@ ROM_START( starbladj ) ROM_LOAD16_BYTE( "st1-sp-u.bin", 0x000000, 0x40000, CRC(9f9a55db) SHA1(72bf5d6908cc57cc490fa2292b4993d796b2974d) ) ROM_LOAD16_BYTE( "st1-sp-l.bin", 0x000001, 0x40000, CRC(acbe39c7) SHA1(ca48b7ea619b1caaf590eed33001826ce7ef36d8) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound */ - ROM_LOAD( "st1-snd0.bin", 0x00c000, 0x004000, CRC(c0e934a3) SHA1(678ed6705c6f494d7ecb801a4ef1b123b80979a5) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound */ + ROM_LOAD( "st1-snd0.bin", 0x000000, 0x020000, CRC(c0e934a3) SHA1(678ed6705c6f494d7ecb801a4ef1b123b80979a5) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) @@ -2506,13 +2618,11 @@ ROM_START( solvalou ) ROM_LOAD16_BYTE( "sv1-sp-u.bin", 0x000000, 0x20000, CRC(ebd4bf82) SHA1(67946360d680a675abcb3c131bac0502b2455573) ) ROM_LOAD16_BYTE( "sv1-sp-l.bin", 0x000001, 0x20000, CRC(7acab679) SHA1(764297c9601be99dbbffb75bbc6fe4a40ea38529) ) - ROM_REGION( 0x030000, "audiocpu", 0 ) /* Sound */ - ROM_LOAD( "sv1-snd0.bin", 0x00c000, 0x004000, CRC(5e007864) SHA1(94da2d51544c6127056beaa251353038646da15f) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound */ + ROM_LOAD( "sv1-snd0.bin", 0x000000, 0x020000, CRC(5e007864) SHA1(94da2d51544c6127056beaa251353038646da15f) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) @@ -2547,167 +2657,236 @@ ROM_START( solvalou ) ROM_LOAD("sv1-voi3.bin", 0x180000, 0x80000,CRC(33085ff3) SHA1(0a30b91618c250a5e7bd896a8ceeb3d16da178a9) ) ROM_END -ROM_START( winrun ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 68k code */ - ROM_LOAD16_BYTE( "wr2-mpub.3k", 0x000000, 0x20000, CRC(3bb0ea17) SHA1(201cedf5865224c1c4a0c9b017982e36ec9b8243) ) - ROM_LOAD16_BYTE( "wr2-mplb.1k", 0x000001, 0x20000, CRC(95465062) SHA1(7d010ff92e87949b7b9109f8320ab61de7d0400a) ) - ROM_REGION( 0x40000, "slave", 0 ) /* 68k code */ - ROM_LOAD16_BYTE( "wr1-spu.6b", 0x000000, 0x20000, CRC(d4915d44) SHA1(57056051138b259d021b3e7cc1c43a9f951b5cc1) ) - ROM_LOAD16_BYTE( "wr1-spl.4b", 0x000001, 0x20000, CRC(0c336505) SHA1(edee073bf6fabe45c577b0b9375295183eb30c62) ) +ROM_START( aircomb ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* Master */ + ROM_LOAD16_BYTE( "ac2-mpr-u.3j", 0x000000, 0x80000, CRC(a7133f85) SHA1(9f1c99dd503f1fc81096170fd272e33ae8a7de2f) ) + ROM_LOAD16_BYTE( "ac2-mpr-l.1j", 0x000001, 0x80000, CRC(520a52e6) SHA1(74306e02abfe08aa1afbf325b74dbc0840c3ad3a) ) - ROM_REGION( 0x30000, "audiocpu", 0 ) /* Sound */ - ROM_LOAD( "wr1-snd0.7c", 0x00c000, 0x004000, CRC(698bae12) SHA1(86d22c1c639a9489e3c95820e4e3f04c30407e41) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x80000, "slave", 0 ) /* Slave */ + ROM_LOAD16_BYTE( "ac2-spr-u.6c", 0x000000, 0x20000, CRC(42aca956) SHA1(10ea2400bb4d5b2d805e2de43ca0e0f54597f660) ) + ROM_LOAD16_BYTE( "ac2-spr-l.4c", 0x000001, 0x20000, CRC(3e15fa19) SHA1(65dbb33ab6b3c06c793613348ebb7b110b8bba0d) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound */ + ROM_LOAD( "ac1-snd0.8j", 0x000000, 0x020000, CRC(5c1fb84b) SHA1(20e4d81289dbe58ffcfc947251a6ff1cc1e36436) ) - ROM_REGION( 0x20000, "dsp", ROMREGION_ERASEFF ) /* DSP */ + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ - ROM_REGION( 0x80000, "gpu", 0 ) /* 68k code */ - ROM_LOAD16_BYTE( "wr1-gp0u.1k", 0x00000, 0x20000, CRC(c66a43be) SHA1(88ec02c5c18c8bb91a95934c14e9ae530ae09880) ) - ROM_LOAD16_BYTE( "wr1-gp0l.3k", 0x00001, 0x20000, CRC(91a70e6f) SHA1(e613e2544f63cd386588445a2a199ae6b84d741e) ) - ROM_LOAD16_BYTE( "wr1-gp1u.1l", 0x40000, 0x20000, CRC(8ff51a3d) SHA1(81fbcd4e8c51742f35607537e1b1a86fd7782827) ) - ROM_LOAD16_BYTE( "wr1-gp1l.3l", 0x40001, 0x20000, CRC(9360d34e) SHA1(e558eb540c02acfe84f2dfe2d65afd609b7f3207) ) + ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ + ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) + ROM_REGION( 0x20000, "dspslave", 0 ) /* Slave DSP */ + ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) - ROM_REGION16_BE( 0x80000, "data", 0 ) - ROM_LOAD16_BYTE( "wr1-d0u.3a", 0x00000, 0x20000, CRC(84ea1492) SHA1(56274b39bd5be076c9904d9ed9ce3f6e29d9f038) ) - ROM_LOAD16_BYTE( "wr1-d0l.1a", 0x00001, 0x20000, CRC(b81508f9) SHA1(51c03c3dff86cece9790667b1557de940ebccbe9) ) - ROM_LOAD16_BYTE( "wr1-d1u.3b", 0x40000, 0x20000, CRC(bbd1fdd7) SHA1(026e9410525fa0e93f155949bbc1d3b8a2785bd1) ) - ROM_LOAD16_BYTE( "wr1-d1l.1b", 0x40001, 0x20000, CRC(8ddd7eac) SHA1(b873b253b0a095e66a9f68d45a2cb41fa025ba16) ) + ROM_REGION( 0x400000, "gfx1", 0 ) + ROM_LOAD( "ac2-obj0.5s", 0x000000, 0x80000, CRC(8327ff22) SHA1(16f6022dedb7a74590898bc8ed3e8a97993c4635) ) + ROM_LOAD( "ac2-obj4.4s", 0x080000, 0x80000, CRC(e433e344) SHA1(98ade550cf066fcb5c09fa905f441a1464d4d625) ) + ROM_LOAD( "ac2-obj1.5x", 0x100000, 0x80000, CRC(43af566d) SHA1(99f0d9f005e28040f5cc10de2198893946a31d09) ) + ROM_LOAD( "ac2-obj5.4x", 0x180000, 0x80000, CRC(ecb19199) SHA1(8e0aa1bc1141c4b09576ab08970d0c7629560643) ) + ROM_LOAD( "ac2-obj2.3s", 0x200000, 0x80000, CRC(dafbf489) SHA1(c53ccb3e1b4a6a660bd28c8abe52ccc3f85d111f) ) + ROM_LOAD( "ac2-obj6.2s", 0x280000, 0x80000, CRC(24cc3f36) SHA1(e50af176eb3034c9cab7613ca614f5cc2c62f95e) ) + ROM_LOAD( "ac2-obj3.3x", 0x300000, 0x80000, CRC(bd555a1d) SHA1(96e432b30da6f5f7ccb768c516b1f7186bc0d4c9) ) + ROM_LOAD( "ac2-obj7.2x", 0x380000, 0x80000, CRC(d561fbe3) SHA1(a23976e10bddf74d4a6b292f044dfd0affbab101) ) - ROM_REGION16_BE( 0x100000, "gdata", 0 ) /* bitmapped graphics */ - ROM_LOAD16_BYTE( "wr1-gd0u-2.1p", 0x00000, 0x40000, CRC(9752eef5) SHA1(d6df0faf9c2696247bdf463f53c1e474ec595dd0) ) - ROM_LOAD16_BYTE( "wr1-gd0l-2.3p", 0x00001, 0x40000, CRC(349c95cc) SHA1(8898eecf5918485ec683900520f123483077df28) ) + ROM_REGION16_BE( 0x100000, "data", 0 ) /* collision */ + ROM_LOAD16_BYTE( "ac1-data-u.3a", 0x000000, 0x80000, CRC(82320c71) SHA1(2be98d46853febb46e1cc728af2735c0e00ce303) ) + ROM_LOAD16_BYTE( "ac1-data-l.1a", 0x000001, 0x80000, CRC(fd7947d3) SHA1(2696eeae37de6d256e626cc3f3cea7b0f6eff60e) ) - ROM_REGION16_BE( 0x80000, "point16", 0 ) /* 3d objects */ - ROM_LOAD16_BYTE( "wr1-pt0u.8j", 0x00000, 0x20000, CRC(7ec4cf6b) SHA1(92ec92567b9f7321efb4a3724cbcdba216eb22f9) ) - ROM_LOAD16_BYTE( "wr1-pt0l.8d", 0x00001, 0x20000, CRC(58c14b73) SHA1(e34a26866cd870743e166669f7fa5915a82104e9) ) + ROM_REGION16_BE( 0x100000, "edata", 0 ) + ROM_LOAD16_BYTE( "ac1-edata1-u.3c", 0x000000, 0x80000, CRC(a9547509) SHA1(1bc663cec03b60ad968896bbc2546f02efda135e) ) + ROM_LOAD16_BYTE( "ac1-edata1-l.1c", 0x000001, 0x80000, CRC(a87087dd) SHA1(cd9b83a8f07886ab44e4ded68002b44338777e8c) ) + + ROM_REGION32_BE( 0x400000, "point24", ROMREGION_ERASE00) /* 24bit signed point data */ + ROM_LOAD32_BYTE( "ac1-poi-h.2f", 0x000001, 0x80000, CRC(573bbc3b) SHA1(371be12b915db6872049f18980c1b55544cfc445) ) /* most significant */ + ROM_LOAD32_BYTE( "ac1-poi-lu.2k", 0x000002, 0x80000, CRC(d99084b9) SHA1(c604d60a2162af7610e5ff7c1aa4195f7df82efe) ) + ROM_LOAD32_BYTE( "ac1-poi-ll.2n", 0x000003, 0x80000, CRC(abb32307) SHA1(8e936ba99479215dd33a951d81ec2b04020dfd62) ) /* least significant */ ROM_REGION( 0x200000, "c140", 0 ) /* sound samples */ - ROM_LOAD("wr-voi-0.11b", 0x040000, 0x40000, CRC(8040b645) SHA1(7ccafb3073fa79910e26cf9b8b6e8e9ae22e55fc) ) - ROM_LOAD("wr-voi-1.11c", 0x0c0000, 0x40000, CRC(d347e904) SHA1(620cd07e6230322c306283e45a43fa1e217028d4) ) - ROM_LOAD("wr-voi-2.11d", 0x140000, 0x40000, CRC(b34747af) SHA1(7e0b55631bffa0583bf4f7f5368db9f09e411ba1) ) - ROM_LOAD("wr-voi-3.11e", 0x1c0000, 0x40000, CRC(43085303) SHA1(9f743055c20df3548879118194244e37a0b91f7e) ) + ROM_LOAD("ac1-voi0.12b", 0x000000, 0x80000,CRC(f427b119) SHA1(bd45bbe41c8be26d6c997fcdc226d080b416a2cf) ) + ROM_LOAD("ac1-voi1.12c", 0x080000, 0x80000,CRC(c9490667) SHA1(4b6fbe635c32469870a8e6f82742be6a9d4918c9) ) + ROM_LOAD("ac1-voi2.12d", 0x100000, 0x80000,CRC(1fcb51ba) SHA1(80fc815e5fad76d20c3795ab1d89b57d9abc3efd) ) + ROM_LOAD("ac1-voi3.12e", 0x180000, 0x80000,CRC(cd202e06) SHA1(72a18f5ba402caefef14b8d1304f337eaaa3eb1d) ) - ROM_REGION( 0x1000, "pals", 0 ) - /* Main PCB (2252960101) */ - ROM_LOAD("sys87b-2.3w", 0x000, 0x104, CRC(18f43c22) SHA1(72849c5b842678bb9037541d26d4c99cdf879982) ) /* PAL16L8ACN */ - ROM_LOAD("wr-c1.6p", 0x000, 0x040, CRC(d6c33258) SHA1(5baf71fae1ad73a75d91ee2dededca2254b4f414) ) /* PAL12L10CNS */ - ROM_LOAD("wr-c2.8k", 0x000, 0x040, CRC(a3e77ade) SHA1(b4282fc4d21ce7813aba7772a85d721fb25144b6) ) /* PAL12L10CNS */ + ROM_REGION( 0x0600, "plds", 0 ) + ROM_LOAD( "gal16v8a-3pdsp5.17d", 0x0000, 0x0117, CRC(799c1f26) SHA1(d28ed1b9fa78180c5a0b01a7198a2870137c7349) ) + ROM_LOAD( "plhs18p8-3pobj3.17n", 0x0200, 0x0149, CRC(9625f469) SHA1(29158a3d37485fb0714d0a60bcd07abd26a3f56e) ) + ROM_LOAD( "plhs18p8-3pobj4.17n", 0x0400, 0x0149, CRC(1b7c90c1) SHA1(ae65aab7a191cdf1af488e144af22b9d8669c903) ) - /* Framebuffer PCB (2252960900) */ - ROM_LOAD("wr-g1.3a", 0x000, 0x104, CRC(d6b4373d) SHA1(b4db4526a37b7d6862cec1d223f2281e5120f225) ) /* PAL16L8ACN */ - ROM_LOAD("wr-g2b.4p", 0x000, 0x104, NO_DUMP ) /* PAL16L8ACN */ - ROM_LOAD("wr-g3.4s", 0x000, 0x104, NO_DUMP ) /* GAL20V8 */ - ROM_LOAD("wr-g4.7f", 0x000, 0x104, CRC(f858b32b) SHA1(59af496e4416c9becb116315542858ac917cbe46) ) /* PAL16L8ACN */ + ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */ + ROM_LOAD( "aircomb.nv", 0x0000, 0x2000, CRC(a97ea3e0) SHA1(95684bb7369c1cb1e2fa53c743d4f94b0080c6f5) ) +ROM_END - /* 3D PCB (2252960701) */ - ROM_LOAD("wr-p1.1b", 0x000, 0x104, CRC(5856cc43) SHA1(4578c7a7d731c61d678d594dd071370db46cc3f7) ) /* PAL16L8ACN */ +ROM_START( aircombj ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* Master */ + ROM_LOAD16_BYTE( "ac1-mpr-u.3j", 0x000000, 0x80000, CRC(a4dec813) SHA1(2ee8b3492d30db4c841f695151880925a5e205e0) ) + ROM_LOAD16_BYTE( "ac1-mpr-l.1j", 0x000001, 0x80000, CRC(8577b6a2) SHA1(32194e392fbd051754be88eb8c90688c65c65d85) ) - /* DSP PCB (2252960601) */ - ROM_LOAD("wr-d1.3b", 0x000, 0x104, CRC(7a072b71) SHA1(45b8d9405a2c1a40f2cd9c6a33d105565136c538) ) /* PAL16L8ACN */ - ROM_LOAD("wr-d2.4j", 0x000, 0x104, CRC(614de474) SHA1(80c3ab287896e07073a70dd42e7b47f515dd3931) ) /* PAL16L8ACN */ + ROM_REGION( 0x080000, "slave", 0 ) /* Slave */ + ROM_LOAD16_BYTE( "ac1-spr-u.6c", 0x000000, 0x20000, CRC(5810e219) SHA1(c312ffd8324670897871b12d521779570dc0f580) ) + ROM_LOAD16_BYTE( "ac1-spr-l.4c", 0x000001, 0x20000, CRC(175a7d6c) SHA1(9e31dde6646cd9b6dcdbdb3f2326177508559e56) ) + + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound */ + ROM_LOAD( "ac1-snd0.8j", 0x000000, 0x020000, CRC(5c1fb84b) SHA1(20e4d81289dbe58ffcfc947251a6ff1cc1e36436) ) + + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ + + ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ + ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) + ROM_REGION( 0x20000, "dspslave", 0 ) /* Slave DSP */ + ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) + + ROM_REGION( 0x400000, "gfx1", 0 ) + ROM_LOAD( "ac1-obj0.5s", 0x000000, 0x80000, CRC(d2310c6a) SHA1(9bb8fdfc2c232574777248f4959975f9a20e3105) ) + ROM_LOAD( "ac1-obj4.4s", 0x080000, 0x80000, CRC(0c93b478) SHA1(a92ffbcf04b64e0eee5bcf37008e247700641b25) ) + ROM_LOAD( "ac1-obj1.5x", 0x100000, 0x80000, CRC(f5783a77) SHA1(0be1815ceb4ce4fa7ab75ba588e090f20ee0cac9) ) + ROM_LOAD( "ac1-obj5.4x", 0x180000, 0x80000, CRC(476aed15) SHA1(0e53fdf02e8ffe7852a1fa8bd2f64d0e58f3dc09) ) + ROM_LOAD( "ac1-obj2.3s", 0x200000, 0x80000, CRC(01343d5c) SHA1(64171fed1d1f8682b3d70d3233ea017719f4cc63) ) + ROM_LOAD( "ac1-obj6.2s", 0x280000, 0x80000, CRC(c67607b1) SHA1(df64ea7920cf64271fe742d3d0a57f842ee61e8d) ) + ROM_LOAD( "ac1-obj3.3x", 0x300000, 0x80000, CRC(7717f52e) SHA1(be1df3f4d0fdcaa5d3c81a724e5eb9d14136c6f5) ) + ROM_LOAD( "ac1-obj7.2x", 0x380000, 0x80000, CRC(cfa9fe5f) SHA1(0da25663b89d653c87ed32d15f7c82f3035702ab) ) + + ROM_REGION16_BE( 0x100000, "data", 0 ) + ROM_LOAD16_BYTE( "ac1-data-u.3a", 0x000000, 0x80000, CRC(82320c71) SHA1(2be98d46853febb46e1cc728af2735c0e00ce303) ) + ROM_LOAD16_BYTE( "ac1-data-l.1a", 0x000001, 0x80000, CRC(fd7947d3) SHA1(2696eeae37de6d256e626cc3f3cea7b0f6eff60e) ) + + ROM_REGION16_BE( 0x100000, "edata", 0 ) + ROM_LOAD16_BYTE( "ac1-edata1-u.3c", 0x000000, 0x80000, CRC(a9547509) SHA1(1bc663cec03b60ad968896bbc2546f02efda135e) ) + ROM_LOAD16_BYTE( "ac1-edata1-l.1c", 0x000001, 0x80000, CRC(a87087dd) SHA1(cd9b83a8f07886ab44e4ded68002b44338777e8c) ) + + ROM_REGION32_BE( 0x400000, "point24", ROMREGION_ERASE00) /* 24bit signed point data */ + ROM_LOAD32_BYTE( "ac1-poi-h.2f", 0x000001, 0x80000, CRC(573bbc3b) SHA1(371be12b915db6872049f18980c1b55544cfc445) ) /* most significant */ + ROM_LOAD32_BYTE( "ac1-poi-lu.2k", 0x000002, 0x80000, CRC(d99084b9) SHA1(c604d60a2162af7610e5ff7c1aa4195f7df82efe) ) + ROM_LOAD32_BYTE( "ac1-poi-ll.2n", 0x000003, 0x80000, CRC(abb32307) SHA1(8e936ba99479215dd33a951d81ec2b04020dfd62) ) /* least significant */ + + ROM_REGION( 0x200000, "c140", 0 ) /* sound samples */ + ROM_LOAD("ac1-voi0.12b", 0x000000, 0x80000,CRC(f427b119) SHA1(bd45bbe41c8be26d6c997fcdc226d080b416a2cf) ) + ROM_LOAD("ac1-voi1.12c", 0x080000, 0x80000,CRC(c9490667) SHA1(4b6fbe635c32469870a8e6f82742be6a9d4918c9) ) + ROM_LOAD("ac1-voi2.12d", 0x100000, 0x80000,CRC(1fcb51ba) SHA1(80fc815e5fad76d20c3795ab1d89b57d9abc3efd) ) + ROM_LOAD("ac1-voi3.12e", 0x180000, 0x80000,CRC(cd202e06) SHA1(72a18f5ba402caefef14b8d1304f337eaaa3eb1d) ) + + ROM_REGION( 0x0600, "plds", 0 ) + ROM_LOAD( "gal16v8a-3pdsp5.17d", 0x0000, 0x0117, CRC(799c1f26) SHA1(d28ed1b9fa78180c5a0b01a7198a2870137c7349) ) + ROM_LOAD( "plhs18p8-3pobj3.17n", 0x0200, 0x0149, CRC(9625f469) SHA1(29158a3d37485fb0714d0a60bcd07abd26a3f56e) ) + ROM_LOAD( "plhs18p8-3pobj4.17n", 0x0400, 0x0149, CRC(1b7c90c1) SHA1(ae65aab7a191cdf1af488e144af22b9d8669c903) ) + + ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */ + ROM_LOAD( "aircombj.nv", 0x0000, 0x2000, CRC(56c71c83) SHA1(83dfcf4e3232f78e3807e9d3e862aa5446444165) ) ROM_END -ROM_START( winrungp ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 68k code */ - ROM_LOAD16_BYTE( "sg1-mp-ub.3k", 0x000000, 0x20000, CRC(7f9b855a) SHA1(6d39a3a9959dbcd0047dbaab0fcd68adc81f5508) ) - ROM_LOAD16_BYTE( "sg1-mp-lb.1k", 0x000001, 0x20000, CRC(a45e8543) SHA1(f9e583a988e4661026ee7873a48d078225778df3) ) +ROM_START( cybsled ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* Master */ + ROM_LOAD16_BYTE( "cy2-mpr-u.3j", 0x000000, 0x80000, CRC(b35a72bc) SHA1(d9bc5b8f0bc30510fca8fc57eeb67e5ca0e4c67f) ) + ROM_LOAD16_BYTE( "cy2-mpr-l.1j", 0x000001, 0x80000, CRC(c4a25919) SHA1(52f6947102001376e37730ace16283141b13fee7) ) - ROM_REGION( 0x40000, "slave", 0 ) /* 68k code */ - ROM_LOAD16_BYTE( "sg1-sp-u.6b", 0x000000, 0x20000, CRC(7c9c3a3f) SHA1(cacb45c9111ac66c6e60b7a0cacd8bf47fd00752) ) - ROM_LOAD16_BYTE( "sg1-sp-l.4b", 0x000001, 0x20000, CRC(5068fc5d) SHA1(7f6e80f74985959509d824318a4a7ff2b11953da) ) + ROM_REGION( 0x100000, "slave", 0 ) /* Slave */ + ROM_LOAD16_BYTE( "cy2-spr-u.6c", 0x000000, 0x80000, CRC(575a422d) SHA1(cad97742da1e2baf47ac110fadef5544b3a30cc7) ) + ROM_LOAD16_BYTE( "cy2-spr-l.4c", 0x000001, 0x80000, CRC(4066291a) SHA1(6ebbc11a68f66ec1e6d2e6ee857e8c599691e289) ) - ROM_REGION( 0x30000, "audiocpu", 0 ) /* Sound */ - ROM_LOAD( "sg1-snd0.7c", 0x00c000, 0x004000, CRC(de04b794) SHA1(191f4d79ac2375d7060f3d83ec753185e92f28ea) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound */ + ROM_LOAD( "cy1-snd0.8j", 0x000000, 0x020000, CRC(3dddf83b) SHA1(e16119cbef176b6f8f8ace773fcbc201e987823f) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ - ROM_REGION( 0x20000, "dsp", ROMREGION_ERASEFF ) /* DSP */ + ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ + ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) + ROM_REGION( 0x20000, "dspslave", 0 ) /* Slave DSP */ + ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) - ROM_REGION( 0x80000, "gpu", 0 ) /* 68k code */ - ROM_LOAD16_BYTE( "sg1-gp0-u.1j", 0x00000, 0x20000, CRC(475da78a) SHA1(6e69bcc6caf2e3cd28fed75796c8992e754f9323) ) - ROM_LOAD16_BYTE( "sg1-gp0-l.3j", 0x00001, 0x20000, CRC(580479bf) SHA1(ba682190cba0d3cdc49aa4937c898ba7ed2a25f5) ) - ROM_LOAD16_BYTE( "sg1-gp1-u.1l", 0x40000, 0x20000, CRC(f5f2e927) SHA1(ebf709f16f01f1a634de9121454537cda74e891b) ) - ROM_LOAD16_BYTE( "sg1-gp1-l.3l", 0x40001, 0x20000, CRC(17ed90a5) SHA1(386bdcb11dcbe400f5be1fe4a7418158b46e50ef) ) + ROM_REGION( 0x400000, "gfx1", 0 ) + ROM_LOAD( "cy1-obj0.5s", 0x000000, 0x80000, CRC(5ae542d5) SHA1(99b1a3ed476da4a97cb864538909d7b831f0fd3b) ) + ROM_LOAD( "cy1-obj4.4s", 0x080000, 0x80000, CRC(57904076) SHA1(b1dc0d99543bc4b9584b37ffc12c6ebc59e30e3b) ) + ROM_LOAD( "cy1-obj1.5x", 0x100000, 0x80000, CRC(4aae3eff) SHA1(c80240bd2f4228a0261a14adb6b10560b31b5aa0) ) + ROM_LOAD( "cy1-obj5.4x", 0x180000, 0x80000, CRC(0e11ca47) SHA1(076a9a4cfddbee2d8aaa06110333090d8fdbefeb) ) + ROM_LOAD( "cy1-obj2.3s", 0x200000, 0x80000, CRC(d64ec4c3) SHA1(0bed1cafc21ed8cef3850fb81e30076977086eb0) ) + ROM_LOAD( "cy1-obj6.2s", 0x280000, 0x80000, CRC(7748b485) SHA1(adb4da419a6cdbefd0fef182d866a3479be379af) ) + ROM_LOAD( "cy1-obj3.3x", 0x300000, 0x80000, CRC(3d1f7168) SHA1(392dddcc79fe61dcc6514a91ac27b5e36825d8b7) ) + ROM_LOAD( "cy1-obj7.2x", 0x380000, 0x80000, CRC(b6eb6ad2) SHA1(85a660c5e44012491be7d4e783cce6ba12c135cb) ) - ROM_REGION16_BE( 0x80000, "data", 0 ) - ROM_LOAD16_BYTE( "sg1-data0-u.3a", 0x00000, 0x20000, CRC(1dde2ac2) SHA1(2d20a434561c04e48b52a2137a8c9047e17c1013) ) - ROM_LOAD16_BYTE( "sg1-data0-l.1a", 0x00001, 0x20000, CRC(2afeb77e) SHA1(ac1552f6e2788158d3477b6a0981d001d6cbdf13) ) - ROM_LOAD16_BYTE( "sg1-data1-u.3b", 0x40000, 0x20000, CRC(5664b09e) SHA1(10c1c29614eee2cffcfd69085f0450d81ba2e25f) ) - ROM_LOAD16_BYTE( "sg1-data1-l.1b", 0x40001, 0x20000, CRC(2dbc7de4) SHA1(824304c95942c7296f8e8dcf8ee7e22bf56154b1) ) + ROM_REGION16_BE( 0x100000, "data", 0 ) + ROM_LOAD16_BYTE( "cy1-data-u.3a", 0x000000, 0x80000, CRC(570da15d) SHA1(9ebe756f10756c079a92fb522332e9e52ff715c3) ) + ROM_LOAD16_BYTE( "cy1-data-l.1a", 0x000001, 0x80000, CRC(9cf96f9e) SHA1(91783f48b93e03c778c6641ca8fb419c13b0d3c5) ) - ROM_REGION16_BE( 0x100000, "gdata", 0 ) /* bitmapped graphics */ - ROM_LOAD16_BYTE( "sg1-gd0-u.1p", 0x00000, 0x40000, CRC(7838fcde) SHA1(45e31269eed1999b73c41c2f5d2c5bfbbdaf23df) ) - ROM_LOAD16_BYTE( "sg1-gd0-l.3p", 0x00001, 0x40000, CRC(4bd02b9a) SHA1(b2fdfd1c1325864aaad87f5358ab9bbdd79ff6ae) ) - ROM_LOAD16_BYTE( "sg1-gd1-u.1s", 0x80000, 0x40000, CRC(271db29b) SHA1(8b35fcf273b9aec28d4c606c41c0626dded697e1) ) - ROM_LOAD16_BYTE( "sg1-gd1-l.3s", 0x80001, 0x40000, CRC(a6c4da96) SHA1(377dbf21a1bede01de16708c96c112abab4417ce) ) + ROM_REGION16_BE( 0x100000, "edata", 0 ) + ROM_LOAD16_BYTE( "cy1-edata0-u.3b", 0x000000, 0x80000, CRC(77452533) SHA1(48fc199bcc1beb23c714eebd9b09b153c980170b) ) + ROM_LOAD16_BYTE( "cy1-edata0-l.1b", 0x000001, 0x80000, CRC(e812e290) SHA1(719e0a026ae8ef63d0d0269b67669ea9b4d950dd) ) - ROM_REGION16_BE( 0x80000, "point16", 0 ) /* 3d objects */ - ROM_LOAD16_BYTE( "sg1-pt0-u.8j", 0x00000, 0x20000, CRC(160c3634) SHA1(485d20d6cc459f17d77682201dee07bdf76bf343) ) - ROM_LOAD16_BYTE( "sg1-pt0-l.8d", 0x00001, 0x20000, CRC(b5a665bf) SHA1(5af6ec492f31395c0492e14590b025b120067b8d) ) - ROM_LOAD16_BYTE( "sg1-pt1-u.8l", 0x40000, 0x20000, CRC(b63d3006) SHA1(78e78619766b0fd91b1e830cfb066495d6773981) ) - ROM_LOAD16_BYTE( "sg1-pt1-l.8e", 0x40001, 0x20000, CRC(6385e325) SHA1(d50bceb2e9c0d0a38d7b0f918f99c482649e260d) ) + ROM_REGION32_BE( 0x400000, "point24", ROMREGION_ERASE00) /* 24bit signed point data */ + ROM_LOAD32_BYTE( "cy1-poi-h1.2f", 0x000001, 0x80000, CRC(eaf8bac3) SHA1(7a2caf6672af158b4a23ce4626342d1f17d1a4e4) ) /* most significant */ + ROM_LOAD32_BYTE( "cy1-poi-lu1.2k", 0x000002, 0x80000, CRC(c544a8dc) SHA1(4cce5f2ab3519b4aa7edbdd15b2d79a7fdcade3c) ) + ROM_LOAD32_BYTE( "cy1-poi-ll1.2n", 0x000003, 0x80000, CRC(30acb99b) SHA1(a28dcb3e5405f166644f6353a903c1143ee268f1) ) /* least significant */ + ROM_LOAD32_BYTE( "cy1-poi-h2.2j", 0x200001, 0x80000, CRC(4079f342) SHA1(fa36aed1abbda54a42f29b183007474580870319) ) + ROM_LOAD32_BYTE( "cy1-poi-lu2.2l", 0x200002, 0x80000, CRC(61d816d4) SHA1(7991957b910d32530151abc7f469fcf1de62d8f3) ) + ROM_LOAD32_BYTE( "cy1-poi-ll2.2p", 0x200003, 0x80000, CRC(faf09158) SHA1(b56ebed6012362b1d599c396a43e90a1e4d9dc38) ) ROM_REGION( 0x200000, "c140", 0 ) /* sound samples */ - ROM_LOAD("sg-voi-1.11c", 0x080000, 0x80000,CRC(7dcccb31) SHA1(4441b37691434b13eae5dee2d04dc12a56b04d2a) ) - ROM_LOAD("sg-voi-3.11e", 0x180000, 0x80000,CRC(a198141c) SHA1(b4ca352e6aedd9d7a7e5e39e840f1d3a7145900e) ) + ROM_LOAD("cy1-voi0.12b", 0x000000, 0x80000,CRC(99d7ce46) SHA1(b75f4055c3ce847daabfacda22df14e3f80c4fb9) ) + ROM_LOAD("cy1-voi1.12c", 0x080000, 0x80000,CRC(2b335f06) SHA1(2b2cd407c34388b56496f84a414daa153780b098) ) + ROM_LOAD("cy1-voi2.12d", 0x100000, 0x80000,CRC(10cd15f0) SHA1(9b721654ed97a13287373c1b2854ac9aeddc271f) ) + ROM_LOAD("cy1-voi3.12e", 0x180000, 0x80000,CRC(c902b4a4) SHA1(816357ec1a02a7ebf817ac1182e9c50ce5ca71f6) ) + + ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */ + ROM_LOAD( "cybsled.nv", 0x0000, 0x2000, CRC(aa18bf9e) SHA1(3712d4d20e5f5f1c920e3f1f6a00101e874662d0) ) ROM_END -ROM_START( winrun91 ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 68k code */ - ROM_LOAD16_BYTE( "r911-mpu.3k", 0x000000, 0x20000, CRC(80a0e5be) SHA1(6613b95e164c2032ea9043e4161130c6b3262492) ) - ROM_LOAD16_BYTE( "r911-mpl.1k", 0x000001, 0x20000, CRC(942172d8) SHA1(21d8dfd2165b5ceb0399fdb53d9d0f51f1255803) ) +ROM_START( cybsledj ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* Master */ + ROM_LOAD16_BYTE( "cy1-mpr-u.3j", 0x000000, 0x80000, CRC(cc5a2e83) SHA1(b794051b2c351e9ca43351603845e4e563f6740f) ) + ROM_LOAD16_BYTE( "cy1-mpr-l.1j", 0x000001, 0x80000, CRC(f7ee8b48) SHA1(6d36eb3dba9cf7f5f5e1a26c156e77a2dad3f257) ) - ROM_REGION( 0x40000, "slave", 0 ) /* 68k code */ - ROM_LOAD16_BYTE( "r911-spu.6b", 0x000000, 0x20000, CRC(0221d4b2) SHA1(65fd38b1cfaa6693d71248561d764a9ea1098c56) ) - ROM_LOAD16_BYTE( "r911-spl.4b", 0x000001, 0x20000, CRC(288799e2) SHA1(2c4bf0cf9c71458fff4dd77e426a76685d9e1bab) ) + ROM_REGION( 0x100000, "slave", 0 ) /* Slave */ + ROM_LOAD16_BYTE( "cy1-spr-u.6c", 0x000000, 0x80000, CRC(28dd707b) SHA1(11297ceae4fe78d170785a5cf9ad77833bbe7fff) ) + ROM_LOAD16_BYTE( "cy1-spr-l.4c", 0x000001, 0x80000, CRC(437029de) SHA1(3d275a2b0ce6909e77e657c371bd22597ea9d398) ) - ROM_REGION( 0x30000, "audiocpu", 0 ) /* Sound */ - ROM_LOAD( "r911-snd0.7c", 0x00c000, 0x004000, CRC(6a321e1e) SHA1(b2e77cac4ed7609593fa5a462c9d78526451e477) ) - ROM_CONTINUE( 0x010000, 0x01c000 ) - ROM_RELOAD( 0x010000, 0x020000 ) + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound */ + ROM_LOAD( "cy1-snd0.8j", 0x000000, 0x020000, CRC(3dddf83b) SHA1(e16119cbef176b6f8f8ace773fcbc201e987823f) ) - ROM_REGION( 0x8000, "c65mcu:external", ROMREGION_ERASE00 ) /* I/O MCU */ - ROM_LOAD( "sys2c65c.bin", 0x000000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) ) + ROM_REGION( 0x8000, "c68mcu:external", ROMREGION_ERASE00 ) /* C68 (M37450) I/O MCU program */ + /* external ROM not populated, unclear how it would map */ - ROM_REGION( 0x20000, "dsp", ROMREGION_ERASEFF ) /* DSP */ + ROM_REGION( 0x20000, "dspmaster", 0 ) /* Master DSP */ + ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) + ROM_REGION( 0x20000, "dspslave", 0 ) /* Slave DSP */ + ROM_LOAD( "c67.bin", 0, 0x2000, CRC(6bd8988e) SHA1(c9ec18d5f88d53976b94444eedc64d5568155958) ) - ROM_REGION( 0x80000, "gpu", 0 ) /* 68k code */ - ROM_LOAD16_BYTE( "r911-gp0u.1j", 0x00000, 0x20000, CRC(f5469a29) SHA1(38b6ea1fbe482b69fbb0e2f44f44a0ca2a49f6bc) ) - ROM_LOAD16_BYTE( "r911-gp0l.3j", 0x00001, 0x20000, CRC(5c18f596) SHA1(215cbda62254e31b4ff6431623384df1639bfdb7) ) - ROM_LOAD16_BYTE( "r911-gp1u.1l", 0x40000, 0x20000, CRC(146ab6b8) SHA1(aefb89585bf311f8d33f18298fea326ef1f19f1e) ) - ROM_LOAD16_BYTE( "r911-gp1l.3l", 0x40001, 0x20000, CRC(96c2463c) SHA1(e43db580e7b454af04c22e894108fbb56da0eeb5) ) + ROM_REGION( 0x400000, "gfx1", 0 ) + ROM_LOAD( "cy1-obj0.5s", 0x000000, 0x80000, CRC(5ae542d5) SHA1(99b1a3ed476da4a97cb864538909d7b831f0fd3b) ) + ROM_LOAD( "cy1-obj4.4s", 0x080000, 0x80000, CRC(57904076) SHA1(b1dc0d99543bc4b9584b37ffc12c6ebc59e30e3b) ) + ROM_LOAD( "cy1-obj1.5x", 0x100000, 0x80000, CRC(4aae3eff) SHA1(c80240bd2f4228a0261a14adb6b10560b31b5aa0) ) + ROM_LOAD( "cy1-obj5.4x", 0x180000, 0x80000, CRC(0e11ca47) SHA1(076a9a4cfddbee2d8aaa06110333090d8fdbefeb) ) + ROM_LOAD( "cy1-obj2.3s", 0x200000, 0x80000, CRC(d64ec4c3) SHA1(0bed1cafc21ed8cef3850fb81e30076977086eb0) ) + ROM_LOAD( "cy1-obj6.2s", 0x280000, 0x80000, CRC(7748b485) SHA1(adb4da419a6cdbefd0fef182d866a3479be379af) ) + ROM_LOAD( "cy1-obj3.3x", 0x300000, 0x80000, CRC(3d1f7168) SHA1(392dddcc79fe61dcc6514a91ac27b5e36825d8b7) ) + ROM_LOAD( "cy1-obj7.2x", 0x380000, 0x80000, CRC(b6eb6ad2) SHA1(85a660c5e44012491be7d4e783cce6ba12c135cb) ) - ROM_REGION16_BE( 0x80000, "data", 0 ) - ROM_LOAD16_BYTE( "r911-d0u.3a", 0x00000, 0x20000, CRC(dcb27da5) SHA1(ecd72397d10313fe8dcb8589bdc5d88d4298b26c) ) - ROM_LOAD16_BYTE( "r911-d0l.1a", 0x00001, 0x20000, CRC(f692a8f3) SHA1(4c29f60400b18d9ef0425de149618da6cf762ca4) ) - ROM_LOAD16_BYTE( "r911-d1u.3b", 0x40000, 0x20000, CRC(ac2afd1b) SHA1(510eb41931164b086c85ba0a86d6f10b88f5e534) ) - ROM_LOAD16_BYTE( "r911-d1l.1b", 0x40001, 0x20000, CRC(ebb51af1) SHA1(87b7b64ee662bf652add1e1199e42391d0e2f7e8) ) + ROM_REGION16_BE( 0x100000, "data", 0 ) + ROM_LOAD16_BYTE( "cy1-data-u.3a", 0x000000, 0x80000, CRC(570da15d) SHA1(9ebe756f10756c079a92fb522332e9e52ff715c3) ) + ROM_LOAD16_BYTE( "cy1-data-l.1a", 0x000001, 0x80000, CRC(9cf96f9e) SHA1(91783f48b93e03c778c6641ca8fb419c13b0d3c5) ) - ROM_REGION16_BE( 0x100000, "gdata", 0 ) /* bitmapped graphics */ - ROM_LOAD16_BYTE( "r911-gd0u.1p", 0x00000, 0x40000, CRC(33f5a19b) SHA1(b1dbd242168007f80e13e11c78b34abc1668883e) ) - ROM_LOAD16_BYTE( "r911-gd0l.3p", 0x00001, 0x40000, CRC(9a29500e) SHA1(c605f86b138e0a4c3163ffd967482e298a15fbe7) ) - ROM_LOAD16_BYTE( "r911-gd1u.1s", 0x80000, 0x40000, CRC(17e5a61c) SHA1(272ebd7daa56847f1887809535362331b5465dec) ) - ROM_LOAD16_BYTE( "r911-gd1l.3s", 0x80001, 0x40000, CRC(64df59a2) SHA1(1e9d0945b94780bb0be16803e767466d2cda07e8) ) + ROM_REGION16_BE( 0x100000, "edata", 0 ) + ROM_LOAD16_BYTE( "cy1-edata0-u.3b", 0x000000, 0x80000, CRC(77452533) SHA1(48fc199bcc1beb23c714eebd9b09b153c980170b) ) + ROM_LOAD16_BYTE( "cy1-edata0-l.1b", 0x000001, 0x80000, CRC(e812e290) SHA1(719e0a026ae8ef63d0d0269b67669ea9b4d950dd) ) - ROM_REGION16_BE( 0x80000, "point16", 0 ) /* winrun91 - 3d objects */ - ROM_LOAD16_BYTE( "r911-pt0u.8j", 0x00000, 0x20000, CRC(abf512a6) SHA1(e86288039d6c4dedfa95b11cb7e4b87637f90c09) ) /* Version on SYSTEM21B CPU only has R911 PTU @ 8W */ - ROM_LOAD16_BYTE( "r911-pt0l.8d", 0x00001, 0x20000, CRC(ac8d468c) SHA1(d1b457a19a5d3259d0caf933f42b3a02b485867b) ) /* and R911 PTL @ 12W with rom type 27C020 */ - ROM_LOAD16_BYTE( "r911-pt1u.8l", 0x40000, 0x20000, CRC(7e5dab74) SHA1(5bde219d5b4305d38d17b494b2e759f05d05329f) ) - ROM_LOAD16_BYTE( "r911-pt1l.8e", 0x40001, 0x20000, CRC(38a54ec5) SHA1(5c6017c98cae674868153ff2d64532027cf0ab83) ) + ROM_REGION32_BE( 0x400000, "point24", ROMREGION_ERASE00) /* 24bit signed point data */ + ROM_LOAD32_BYTE( "cy1-poi-h1.2f", 0x000001, 0x80000, CRC(eaf8bac3) SHA1(7a2caf6672af158b4a23ce4626342d1f17d1a4e4) ) /* most significant */ + ROM_LOAD32_BYTE( "cy1-poi-lu1.2k", 0x000002, 0x80000, CRC(c544a8dc) SHA1(4cce5f2ab3519b4aa7edbdd15b2d79a7fdcade3c) ) + ROM_LOAD32_BYTE( "cy1-poi-ll1.2n", 0x000003, 0x80000, CRC(30acb99b) SHA1(a28dcb3e5405f166644f6353a903c1143ee268f1) ) /* least significant */ + ROM_LOAD32_BYTE( "cy1-poi-h2.2j", 0x200001, 0x80000, CRC(4079f342) SHA1(fa36aed1abbda54a42f29b183007474580870319) ) + ROM_LOAD32_BYTE( "cy1-poi-lu2.2l", 0x200002, 0x80000, CRC(61d816d4) SHA1(7991957b910d32530151abc7f469fcf1de62d8f3) ) + ROM_LOAD32_BYTE( "cy1-poi-ll2.2p", 0x200003, 0x80000, CRC(faf09158) SHA1(b56ebed6012362b1d599c396a43e90a1e4d9dc38) ) ROM_REGION( 0x200000, "c140", 0 ) /* sound samples */ - ROM_LOAD("r911-avo1.11c", 0x080000, 0x80000,CRC(9fb33af3) SHA1(666630a8e5766ca4c3275961963c3e713dfdda2d) ) - ROM_LOAD("r911-avo3.11e", 0x180000, 0x80000,CRC(76e22f92) SHA1(0e1b8d35a5b9c20cc3192d935f0c9da1e69679d2) ) + ROM_LOAD("cy1-voi0.12b", 0x000000, 0x80000,CRC(99d7ce46) SHA1(b75f4055c3ce847daabfacda22df14e3f80c4fb9) ) + ROM_LOAD("cy1-voi1.12c", 0x080000, 0x80000,CRC(2b335f06) SHA1(2b2cd407c34388b56496f84a414daa153780b098) ) + ROM_LOAD("cy1-voi2.12d", 0x100000, 0x80000,CRC(10cd15f0) SHA1(9b721654ed97a13287373c1b2854ac9aeddc271f) ) + ROM_LOAD("cy1-voi3.12e", 0x180000, 0x80000,CRC(c902b4a4) SHA1(816357ec1a02a7ebf817ac1182e9c50ce5ca71f6) ) + + ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */ + ROM_LOAD( "cybsledj.nv", 0x0000, 0x2000, CRC(a73bb03e) SHA1(e074bfeae14178c867070e06f6690ed13115f5fa) ) ROM_END + void namcos21_state::init(int game_type) { m_gametype = game_type; @@ -2776,13 +2955,22 @@ void namcos21_state::init_driveyes() } /* YEAR NAME PARENT MACHINE INPUT CLASS INIT MONITOR COMPANY FULLNAME FLAGS */ -GAME( 1988, winrun, 0, winrun, winrun, namcos21_state, init_winrun, ROT0, "Namco", "Winning Run", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1989, winrungp, 0, winrun, winrungp, namcos21_state, init_winrun, ROT0, "Namco", "Winning Run Suzuka Grand Prix (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) -GAME( 1991, winrun91, 0, winrun, winrungp, namcos21_state, init_winrun, ROT0, "Namco", "Winning Run '91 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) -GAME( 1991, driveyes, 0, driveyes, driveyes, namcos21_state, init_driveyes, ROT0, "Namco", "Driver's Eyes (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN) -GAME( 1991, solvalou, 0, namcos21, s21default, namcos21_state, init_solvalou, ROT0, "Namco", "Solvalou (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) + +// Original 'Namco System 21' with C65 I/O MCU, uses TMS320C25 DSP with no custom part number (no internal ROM?) +GAME( 1988, winrun, 0, winrun, winrun, namcos21_state, init_winrun, ROT0, "Namco", "Winning Run (World) (89/06/06, Ver.09)", MACHINE_IMPERFECT_GRAPHICS ) // Sub Ver.09, 1989, Graphic Ver .06, 89/01/14, Sound Ver.2.00 +GAME( 1989, winrungp, 0, winrun, winrungp, namcos21_state, init_winrun, ROT0, "Namco", "Winning Run Suzuka Grand Prix (Japan) (89/12/03, Ver.02)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) // Sub Ver.02, 1989, Graphic Ver.02 89/12/03, Sound Ver.0000 +// Available on a size/cost reduced 2 PCB set with 'Namco System 21B' printed on each board, still C65 I/O MCU, appears to be functionally identical to original NS21 +GAME( 1991, winrun91, 0, winrun, winrungp, namcos21_state, init_winrun, ROT0, "Namco", "Winning Run '91 (Japan) (1991/03/05, Main Ver 1.0, Sub Ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) + +// 3 PCB stacks in a single cage (3x 4 PCBs) linked for 3 screen panorama, boards look similar to original Namco System 21 (not 21B) including TMS320C25 DSP, but use C68 I/O MCU and sprite chip instead of "68000 'GPU'" ? +GAME( 1992, driveyes, 0, driveyes, driveyes, namcos21_state, init_driveyes, ROT0, "Namco", "Driver's Eyes (Japan) (1992/01/10, Main Ver 2.1, Sub Ver 1.1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN) + +// revised hardware, much more DSP power, similar to below but apparently uses TMS320C20 (no Namco part #?) instead of TMS320C25 (C67)? (verify this isn't just a miscommunication, it seems out of place) GAME( 1991, starblad, 0, namcos21, starblad, namcos21_state, init_starblad, ROT0, "Namco", "Starblade (World)", MACHINE_IMPERFECT_GRAPHICS ) GAME( 1991, starbladj, starblad, namcos21, starblad, namcos21_state, init_starblad, ROT0, "Namco", "Starblade (Japan)", MACHINE_IMPERFECT_GRAPHICS ) + +// uses 5x TMS320C25 (C67, has internal ROM - dumped) but otherwise same as above? +GAME( 1991, solvalou, 0, namcos21, s21default, namcos21_state, init_solvalou, ROT0, "Namco", "Solvalou (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) GAME( 1992, aircomb, 0, namcos21, aircomb, namcos21_state, init_aircomb, ROT0, "Namco", "Air Combat (US)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // There's code for a SCI, is it even possible to play multiplayer? GAME( 1992, aircombj, aircomb, namcos21, aircomb, namcos21_state, init_aircomb, ROT0, "Namco", "Air Combat (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) GAME( 1993, cybsled, 0, namcos21, cybsled, namcos21_state, init_cybsled, ROT0, "Namco", "Cyber Sled (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN | MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/namcos22.cpp b/src/mame/drivers/namcos22.cpp index ea9e61104cc..a2aeb4bbdbd 100644 --- a/src/mame/drivers/namcos22.cpp +++ b/src/mame/drivers/namcos22.cpp @@ -3759,26 +3759,28 @@ MACHINE_CONFIG_START(namcos22_state::namcos22) MCFG_DEVICE_PROGRAM_MAP(namcos22_am) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", namcos22_state, namcos22_interrupt) - MCFG_DEVICE_ADD("master", TMS32025,SS22_MASTER_CLOCK) /* ? */ - MCFG_DEVICE_PROGRAM_MAP(master_dsp_program) - MCFG_DEVICE_DATA_MAP(master_dsp_data) - MCFG_DEVICE_IO_MAP(master_dsp_io) - MCFG_TMS32025_BIO_IN_CB(READ16(*this, namcos22_state, pdp_status_r)) - MCFG_TMS32025_HOLD_IN_CB(READ16(*this, namcos22_state, dsp_hold_signal_r)) - MCFG_TMS32025_HOLD_ACK_OUT_CB(WRITE16(*this, namcos22_state, dsp_hold_ack_w)) - MCFG_TMS32025_XF_OUT_CB(WRITE16(*this, namcos22_state, dsp_xf_output_w)) - MCFG_TMS32025_DR_IN_CB(READ16(*this, namcos22_state, master_serial_io_r)) + tms32025_device& master(TMS32025(config, m_master, SS22_MASTER_CLOCK)); /* ? */ + master.set_addrmap(AS_PROGRAM, &namcos22_state::master_dsp_program); + master.set_addrmap(AS_DATA, &namcos22_state::master_dsp_data); + master.set_addrmap(AS_IO, &namcos22_state::master_dsp_io); + master.bio_in_cb().set(FUNC(namcos22_state::pdp_status_r)); + master.hold_in_cb().set(FUNC(namcos22_state::dsp_hold_signal_r)); + master.hold_ack_out_cb().set(FUNC(namcos22_state::dsp_hold_ack_w)); + master.xf_out_cb().set(FUNC(namcos22_state::dsp_xf_output_w)); + master.dr_in_cb().set(FUNC(namcos22_state::master_serial_io_r)); + MCFG_TIMER_DRIVER_ADD_SCANLINE("master_st", namcos22_state, dsp_master_serial_irq, "screen", 0, 1) - MCFG_DEVICE_ADD("slave", TMS32025,SS22_MASTER_CLOCK) /* ? */ - MCFG_DEVICE_PROGRAM_MAP(slave_dsp_program) - MCFG_DEVICE_DATA_MAP(slave_dsp_data) - MCFG_DEVICE_IO_MAP(slave_dsp_io) - MCFG_TMS32025_BIO_IN_CB(READ16(*this, namcos22_state, dsp_bioz_r)) - MCFG_TMS32025_HOLD_IN_CB(READ16(*this, namcos22_state, dsp_hold_signal_r)) - MCFG_TMS32025_HOLD_ACK_OUT_CB(WRITE16(*this, namcos22_state, dsp_hold_ack_w)) - MCFG_TMS32025_XF_OUT_CB(WRITE16(*this, namcos22_state, dsp_xf_output_w)) - MCFG_TMS32025_DX_OUT_CB(WRITE16(*this, namcos22_state, slave_serial_io_w)) + tms32025_device& slave(TMS32025(config, m_slave, SS22_MASTER_CLOCK)); /* ? */ + slave.set_addrmap(AS_PROGRAM, &namcos22_state::slave_dsp_program); + slave.set_addrmap(AS_DATA, &namcos22_state::slave_dsp_data); + slave.set_addrmap(AS_IO, &namcos22_state::slave_dsp_io); + slave.bio_in_cb().set(FUNC(namcos22_state::dsp_bioz_r)); + slave.hold_in_cb().set(FUNC(namcos22_state::dsp_hold_signal_r)); + slave.hold_ack_out_cb().set(FUNC(namcos22_state::dsp_hold_ack_w)); + slave.xf_out_cb().set(FUNC(namcos22_state::dsp_xf_output_w)); + slave.dx_out_cb().set(FUNC(namcos22_state::slave_serial_io_w)); + MCFG_TIMER_DRIVER_ADD_SCANLINE("slave_st", namcos22_state, dsp_slave_serial_irq, "screen", 0, 1) MCFG_DEVICE_ADD("mcu", NAMCO_C74, SS22_MASTER_CLOCK/3) // C74 on the CPU board has no periodic interrupts, it runs entirely off Timer A0 @@ -3828,26 +3830,28 @@ MACHINE_CONFIG_START(namcos22_state::namcos22s) MCFG_DEVICE_PROGRAM_MAP(namcos22s_am) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", namcos22_state, namcos22s_interrupt) - MCFG_DEVICE_ADD("master", TMS32025,SS22_MASTER_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(master_dsp_program) - MCFG_DEVICE_DATA_MAP(master_dsp_data) - MCFG_DEVICE_IO_MAP(master_dsp_io) - MCFG_TMS32025_BIO_IN_CB(READ16(*this, namcos22_state, pdp_status_r)) - MCFG_TMS32025_HOLD_IN_CB(READ16(*this, namcos22_state, dsp_hold_signal_r)) - MCFG_TMS32025_HOLD_ACK_OUT_CB(WRITE16(*this, namcos22_state, dsp_hold_ack_w)) - MCFG_TMS32025_XF_OUT_CB(WRITE16(*this, namcos22_state, dsp_xf_output_w)) - MCFG_TMS32025_DR_IN_CB(READ16(*this, namcos22_state, master_serial_io_r)) + tms32025_device& master(TMS32025(config, m_master, SS22_MASTER_CLOCK)); + master.set_addrmap(AS_PROGRAM, &namcos22_state::master_dsp_program); + master.set_addrmap(AS_DATA, &namcos22_state::master_dsp_data); + master.set_addrmap(AS_IO, &namcos22_state::master_dsp_io); + master.bio_in_cb().set(FUNC(namcos22_state::pdp_status_r)); + master.hold_in_cb().set(FUNC(namcos22_state::dsp_hold_signal_r)); + master.hold_ack_out_cb().set(FUNC(namcos22_state::dsp_hold_ack_w)); + master.xf_out_cb().set(FUNC(namcos22_state::dsp_xf_output_w)); + master.dr_in_cb().set(FUNC(namcos22_state::master_serial_io_r)); + MCFG_TIMER_DRIVER_ADD_SCANLINE("master_st", namcos22_state, dsp_master_serial_irq, "screen", 0, 1) - MCFG_DEVICE_ADD("slave", TMS32025,SS22_MASTER_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(slave_dsp_program) - MCFG_DEVICE_DATA_MAP(slave_dsp_data) - MCFG_DEVICE_IO_MAP(slave_dsp_io) - MCFG_TMS32025_BIO_IN_CB(READ16(*this, namcos22_state, dsp_bioz_r)) - MCFG_TMS32025_HOLD_IN_CB(READ16(*this, namcos22_state, dsp_hold_signal_r)) - MCFG_TMS32025_HOLD_ACK_OUT_CB(WRITE16(*this, namcos22_state, dsp_hold_ack_w)) - MCFG_TMS32025_XF_OUT_CB(WRITE16(*this, namcos22_state, dsp_xf_output_w)) - MCFG_TMS32025_DX_OUT_CB(WRITE16(*this, namcos22_state, slave_serial_io_w)) + tms32025_device& slave(TMS32025(config, m_slave, SS22_MASTER_CLOCK)); + slave.set_addrmap(AS_PROGRAM, &namcos22_state::slave_dsp_program); + slave.set_addrmap(AS_DATA, &namcos22_state::slave_dsp_data); + slave.set_addrmap(AS_IO, &namcos22_state::slave_dsp_io); + slave.bio_in_cb().set(FUNC(namcos22_state::dsp_bioz_r)); + slave.hold_in_cb().set(FUNC(namcos22_state::dsp_hold_signal_r)); + slave.hold_ack_out_cb().set(FUNC(namcos22_state::dsp_hold_ack_w)); + slave.xf_out_cb().set(FUNC(namcos22_state::dsp_xf_output_w)); + slave.dx_out_cb().set(FUNC(namcos22_state::slave_serial_io_w)); + MCFG_TIMER_DRIVER_ADD_SCANLINE("slave_st", namcos22_state, dsp_slave_serial_irq, "screen", 0, 1) MCFG_DEVICE_ADD("mcu", M37710S4, SS22_MASTER_CLOCK/3) diff --git a/src/mame/drivers/nichild.cpp b/src/mame/drivers/nichild.cpp index 91aeed4f902..9728da99c64 100644 --- a/src/mame/drivers/nichild.cpp +++ b/src/mame/drivers/nichild.cpp @@ -246,10 +246,12 @@ MACHINE_CONFIG_START(nichild_state::nichild) m_maincpu->out_pe_callback().set(FUNC(nichild_state::gfxbank_w)); /* video hardware */ - MCFG_V9938_ADD("v9938", "screen", 0x40000, MAIN_CLOCK) -// MCFG_V99X8_INTERRUPT_CALLBACK(INPUTLINE("maincpu", 0)) -// MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(*this, nichild_state, vdp_irq)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MAIN_CLOCK) + V9938(config, m_v9938, MAIN_CLOCK); + m_v9938->set_screen_ntsc("screen"); + m_v9938->set_vram_size(0x40000); +// m_v9938->int_cb().set_inputline("maincpu", 0); +// m_v9938->int_cb().set(FUNC(nichild_state::vdp_irq)); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "mono").front_center(); diff --git a/src/mame/drivers/nmg5.cpp b/src/mame/drivers/nmg5.cpp index 3443df7c89c..3273864efe7 100644 --- a/src/mame/drivers/nmg5.cpp +++ b/src/mame/drivers/nmg5.cpp @@ -236,13 +236,11 @@ Stephh's notes (based on the games M68000 code and some tests) : class nmg5_state : public driver_device { public: - nmg5_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + nmg5_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_spriteram(*this, "spriteram"), m_scroll_ram(*this, "scroll_ram"), - m_bg_videoram(*this, "bg_videoram"), - m_fg_videoram(*this, "fg_videoram"), - m_bitmap(*this, "bitmap"), + m_vram(*this, "vram.%u", 0U), m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), m_oki(*this, "oki"), @@ -266,13 +264,11 @@ private: /* memory pointers */ required_shared_ptr<uint16_t> m_spriteram; required_shared_ptr<uint16_t> m_scroll_ram; - required_shared_ptr<uint16_t> m_bg_videoram; - required_shared_ptr<uint16_t> m_fg_videoram; - required_shared_ptr<uint16_t> m_bitmap; + required_shared_ptr_array<uint16_t, 2> m_vram; /* video-related */ - tilemap_t *m_bg_tilemap; - tilemap_t *m_fg_tilemap; + tilemap_t *m_tilemap[2]; + std::unique_ptr<bitmap_ind16> m_pixmap; /* misc */ uint8_t m_prot_val; @@ -288,21 +284,20 @@ private: optional_device<decospr_device> m_sprgen; required_device<generic_latch_8_device> m_soundlatch; - DECLARE_WRITE16_MEMBER(fg_videoram_w); - DECLARE_WRITE16_MEMBER(bg_videoram_w); - DECLARE_WRITE16_MEMBER(nmg5_soundlatch_w); + DECLARE_READ8_MEMBER(pixmap_r); + DECLARE_WRITE8_MEMBER(pixmap_w); + template<int Layer> DECLARE_WRITE16_MEMBER(vram_w); + DECLARE_WRITE8_MEMBER(soundlatch_w); DECLARE_READ16_MEMBER(prot_r); DECLARE_WRITE16_MEMBER(prot_w); DECLARE_WRITE16_MEMBER(gfx_bank_w); DECLARE_WRITE16_MEMBER(priority_reg_w); DECLARE_WRITE8_MEMBER(oki_banking_w); - TILE_GET_INFO_MEMBER(fg_get_tile_info); - TILE_GET_INFO_MEMBER(bg_get_tile_info); + template<int Layer> TILE_GET_INFO_MEMBER(get_tile_info); virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; - uint32_t screen_update_nmg5(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_bitmap( bitmap_ind16 &bitmap ); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void nmg5_map(address_map &map); void nmg5_sound_map(address_map &map); void pclubys_map(address_map &map); @@ -312,25 +307,34 @@ private: -WRITE16_MEMBER(nmg5_state::fg_videoram_w) +READ8_MEMBER(nmg5_state::pixmap_r) { - COMBINE_DATA(&m_fg_videoram[offset]); - m_fg_tilemap->mark_tile_dirty(offset); + int const sy = offset >> 8; + int const sx = (offset & 0xff) << 1; + + return ((m_pixmap->pix16(sy & 0xff, sx & ~1) & 0xf) << 4) | (m_pixmap->pix16(sy & 0xff, sx | 1) & 0xf); } -WRITE16_MEMBER(nmg5_state::bg_videoram_w) +WRITE8_MEMBER(nmg5_state::pixmap_w) { - COMBINE_DATA(&m_bg_videoram[offset]); - m_bg_tilemap->mark_tile_dirty(offset); + int const sy = offset >> 8; + int const sx = (offset & 0xff) << 1; + + m_pixmap->pix16(sy & 0xff, sx & ~1) = 0x300 + ((data & 0xf0) >> 4); + m_pixmap->pix16(sy & 0xff, sx | 1) = 0x300 + (data & 0x0f); } -WRITE16_MEMBER(nmg5_state::nmg5_soundlatch_w) +template<int Layer> +WRITE16_MEMBER(nmg5_state::vram_w) { - if (ACCESSING_BITS_0_7) - { - m_soundlatch->write(space, 0, data & 0xff); - m_soundcpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); - } + COMBINE_DATA(&m_vram[Layer][offset]); + m_tilemap[Layer]->mark_tile_dirty(offset); +} + +WRITE8_MEMBER(nmg5_state::soundlatch_w) +{ + m_soundlatch->write(space, 0, data); + m_soundcpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); } READ16_MEMBER(nmg5_state::prot_r) @@ -377,7 +381,7 @@ void nmg5_state::nmg5_map(address_map &map) map(0x120000, 0x12ffff).ram(); map(0x140000, 0x1407ff).ram().w("palette", FUNC(palette_device::write16)).share("palette"); map(0x160000, 0x1607ff).ram().share("spriteram"); - map(0x180000, 0x180001).w(FUNC(nmg5_state::nmg5_soundlatch_w)); + map(0x180001, 0x180001).w(FUNC(nmg5_state::soundlatch_w)); map(0x180002, 0x180003).nopw(); map(0x180004, 0x180005).rw(FUNC(nmg5_state::prot_r), FUNC(nmg5_state::prot_w)); map(0x180006, 0x180007).w(FUNC(nmg5_state::gfx_bank_w)); @@ -387,9 +391,9 @@ void nmg5_state::nmg5_map(address_map &map) map(0x18000e, 0x18000f).w(FUNC(nmg5_state::priority_reg_w)); map(0x300002, 0x300009).writeonly().share("scroll_ram"); map(0x30000a, 0x30000f).nopw(); - map(0x320000, 0x321fff).ram().w(FUNC(nmg5_state::bg_videoram_w)).share("bg_videoram"); - map(0x322000, 0x323fff).ram().w(FUNC(nmg5_state::fg_videoram_w)).share("fg_videoram"); - map(0x800000, 0x80ffff).ram().share("bitmap"); + map(0x320000, 0x321fff).ram().w(FUNC(nmg5_state::vram_w<0>)).share("vram.0"); + map(0x322000, 0x323fff).ram().w(FUNC(nmg5_state::vram_w<1>)).share("vram.1"); + map(0x800000, 0x80ffff).rw(FUNC(nmg5_state::pixmap_r), FUNC(nmg5_state::pixmap_w)); } void nmg5_state::pclubys_map(address_map &map) @@ -398,7 +402,7 @@ void nmg5_state::pclubys_map(address_map &map) map(0x200000, 0x20ffff).ram(); map(0x440000, 0x4407ff).ram().w("palette", FUNC(palette_device::write16)).share("palette"); map(0x460000, 0x4607ff).ram().share("spriteram"); - map(0x480000, 0x480001).w(FUNC(nmg5_state::nmg5_soundlatch_w)); + map(0x480001, 0x480001).w(FUNC(nmg5_state::soundlatch_w)); map(0x480002, 0x480003).nopw(); map(0x480004, 0x480005).rw(FUNC(nmg5_state::prot_r), FUNC(nmg5_state::prot_w)); map(0x480006, 0x480007).w(FUNC(nmg5_state::gfx_bank_w)); @@ -407,9 +411,9 @@ void nmg5_state::pclubys_map(address_map &map) map(0x48000c, 0x48000d).portr("INPUTS"); map(0x48000e, 0x48000f).w(FUNC(nmg5_state::priority_reg_w)); map(0x500002, 0x500009).writeonly().share("scroll_ram"); - map(0x520000, 0x521fff).ram().w(FUNC(nmg5_state::bg_videoram_w)).share("bg_videoram"); - map(0x522000, 0x523fff).ram().w(FUNC(nmg5_state::fg_videoram_w)).share("fg_videoram"); - map(0x800000, 0x80ffff).ram().share("bitmap"); + map(0x520000, 0x521fff).ram().w(FUNC(nmg5_state::vram_w<0>)).share("vram.0"); + map(0x522000, 0x523fff).ram().w(FUNC(nmg5_state::vram_w<1>)).share("vram.1"); + map(0x800000, 0x80ffff).rw(FUNC(nmg5_state::pixmap_r), FUNC(nmg5_state::pixmap_w)); } /******************************************************************* @@ -849,84 +853,63 @@ static INPUT_PORTS_START( wondstck ) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 ) INPUT_PORTS_END -TILE_GET_INFO_MEMBER(nmg5_state::fg_get_tile_info){ SET_TILE_INFO_MEMBER(0, m_fg_videoram[tile_index] | (m_gfx_bank << 16), 0, 0);} -TILE_GET_INFO_MEMBER(nmg5_state::bg_get_tile_info){ SET_TILE_INFO_MEMBER(0, m_bg_videoram[tile_index] | (m_gfx_bank << 16), 1, 0);} +template<int Layer> +TILE_GET_INFO_MEMBER(nmg5_state::get_tile_info){ SET_TILE_INFO_MEMBER(0, m_vram[Layer][tile_index] | (m_gfx_bank << 16), Layer ^ 1, 0);} void nmg5_state::video_start() { - m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmg5_state::bg_get_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); - m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmg5_state::fg_get_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); - m_fg_tilemap->set_transparent_pen(0); -} + m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmg5_state::get_tile_info<0>),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); + m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmg5_state::get_tile_info<1>),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); + m_tilemap[1]->set_transparent_pen(0); + m_pixmap = std::make_unique<bitmap_ind16>(512, 256); + const rectangle pixmap_rect(0,511,0,255); + m_pixmap->fill(0x300, pixmap_rect); -void nmg5_state::draw_bitmap( bitmap_ind16 &bitmap ) -{ - int yyy = 256; - int xxx = 512 / 4; - uint16_t x, y, count; - int xoff = -12; - int yoff = -9; - int pix; - - count = 0; - for (y = 0; y < yyy; y++) - { - for (x = 0; x < xxx; x++) - { - pix = (m_bitmap[count] & 0xf000) >> 12; - if (pix) bitmap.pix16(y + yoff, x * 4 + 0 + xoff) = pix + 0x300; - pix = (m_bitmap[count] & 0x0f00) >> 8; - if (pix) bitmap.pix16(y + yoff, x * 4 + 1 + xoff) = pix + 0x300; - pix = (m_bitmap[count] & 0x00f0) >> 4; - if (pix) bitmap.pix16(y + yoff, x * 4 + 2 + xoff) = pix + 0x300; - pix = (m_bitmap[count] & 0x000f) >> 0; - if (pix) bitmap.pix16(y + yoff, x * 4 + 3 + xoff) = pix + 0x300; - - count++; - } - } + save_item(NAME(*m_pixmap)); } -uint32_t nmg5_state::screen_update_nmg5(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t nmg5_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - m_bg_tilemap->set_scrolly(0, m_scroll_ram[3] + 9); - m_bg_tilemap->set_scrollx(0, m_scroll_ram[2] + 3); - m_fg_tilemap->set_scrolly(0, m_scroll_ram[1] + 9); - m_fg_tilemap->set_scrollx(0, m_scroll_ram[0] - 1); + int const xoff = -12; + int const yoff = -9; + m_tilemap[0]->set_scrolly(0, m_scroll_ram[3] + 9); + m_tilemap[0]->set_scrollx(0, m_scroll_ram[2] + 3); + m_tilemap[1]->set_scrolly(0, m_scroll_ram[1] + 9); + m_tilemap[1]->set_scrollx(0, m_scroll_ram[0] - 1); - m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0); if (m_priority_reg == 0) { m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram, 0x400); - m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - draw_bitmap(bitmap); + m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); + copybitmap_trans(bitmap, *m_pixmap, 0, 0, xoff, yoff, cliprect, 0x300); } else if (m_priority_reg == 1) { - draw_bitmap(bitmap); + copybitmap_trans(bitmap, *m_pixmap, 0, 0, xoff, yoff, cliprect, 0x300); m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram, 0x400); - m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); } else if (m_priority_reg == 2) { m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram, 0x400); - draw_bitmap(bitmap); - m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + copybitmap_trans(bitmap, *m_pixmap, 0, 0, xoff, yoff, cliprect, 0x300); + m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); } else if (m_priority_reg == 3) { - m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram, 0x400); - draw_bitmap(bitmap); + copybitmap_trans(bitmap, *m_pixmap, 0, 0, xoff, yoff, cliprect, 0x300); } else if (m_priority_reg == 7) { - m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - draw_bitmap(bitmap); + m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); + copybitmap_trans(bitmap, *m_pixmap, 0, 0, xoff, yoff, cliprect, 0x300); m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram, 0x400); } return 0; @@ -968,12 +951,12 @@ static const gfx_layout layout_16x16x5 = static GFXDECODE_START( gfx_nmg5 ) GFXDECODE_ENTRY( "gfx1", 0, nmg5_layout_8x8x8, 0x000, 2 ) - GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x5, 0x200, 16 ) + GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x5, 0x200, 16 ) GFXDECODE_END static GFXDECODE_START( gfx_pclubys ) GFXDECODE_ENTRY( "gfx1", 0, pclubys_layout_8x8x8, 0x000, 2 ) - GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x5, 0x200, 16 ) + GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x5, 0x200, 16 ) GFXDECODE_END @@ -1004,14 +987,13 @@ MACHINE_CONFIG_START(nmg5_state::nmg5) MCFG_DEVICE_PROGRAM_MAP(nmg5_sound_map) MCFG_DEVICE_IO_MAP(sound_io_map) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(nmg5_state, screen_update_nmg5) + MCFG_SCREEN_UPDATE_DRIVER(nmg5_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_nmg5) diff --git a/src/mame/drivers/notetaker.cpp b/src/mame/drivers/notetaker.cpp index bfcfed4c855..c4e8177361f 100644 --- a/src/mame/drivers/notetaker.cpp +++ b/src/mame/drivers/notetaker.cpp @@ -681,7 +681,7 @@ WRITE16_MEMBER(notetaker_state::EPConReg_w) m_EP_LED3 = (data&0x20)?1:0; m_EP_LED4 = (data&0x10)?1:0; m_EP_LED_SelROM_q = (data&0x08)?1:0; // this doesn't appear to be hooked anywhere, andjust drives an LED - // originally, SelROM_q enabled two 2716 EPROMS, later 82s137 PROMS to map code to the FFC00-FFFFF area but this was dropped in the 1979 design revision + // originally, SelROM_q enabled two 2716 EPROMS, later 82s137 PROMS to map code to the FFC00-FFFFF area but this was dropped in the 1979 design revision in favor of having the IOP write the boot vectors for the EP to the shared ram instead. See below for how the top two address bits are disconnected to allow this to work with the way the shared ram is mapped. m_EP_ProcLock = (data&0x04)?1:0; // bus lock for this processor (hold other processor in wait state) m_EP_SetParity_q = (data&0x02)?1:0; // enable parity checking on local ram if low m_EP_DisLMem_q = (data&0x01)?1:0; // if low, the low 8k of local memory is disabled and accesses the shared memory instead. @@ -690,7 +690,7 @@ WRITE16_MEMBER(notetaker_state::EPConReg_w) /* Emulator cpu mem map: -(The top two address bits are disconnected, to allow the ram board, which maps itself only at 00000-3ffff, to appear at "ffff0" to the processor when /reset is de-asserted by the iop) +(The top two address bits are disconnected, to allow the ram board, which maps itself only at 00000-3ffff, to appear at "ffff0" to the ep processor when /reset is de-asserted by the iop) a19 a18 a17 a16 a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 DisLMem_q x x 0 0 0 0 0 * * * * * * * * * * * * * 0 RW Local (fast) RAM x x 0 0 0 0 0 * * * * * * * * * * * * * 1 RW System/Shared RAM @@ -831,7 +831,7 @@ MACHINE_CONFIG_START(notetaker_state::notetakr) MCFG_PALETTE_ADD_MONOCHROME("palette") /* Devices */ - MCFG_DEVICE_ADD( "crt5027", CRT5027, (36_MHz_XTAL / 4) / 8) // See below + CRT5027(config, m_crtc, (36_MHz_XTAL / 4) / 8); // See below /* the clock for the crt5027 is configurable rate; 36MHz xtal divided by 1*, 2, 3, 4, 5, 6, 7, or 8 (* because this is a 74s163 this setting probably means divide by 1; documentation at @@ -841,17 +841,17 @@ MACHINE_CONFIG_START(notetaker_state::notetakr) on reset, bitclk is 000 so divider is (36mhz/8)/8; during boot it is written with 101, changing the divider to (36mhz/4)/8 */ // TODO: for now, we just hack it to the latter setting from start; this should be handled correctly in iop_reset(); - MCFG_TMS9927_CHAR_WIDTH(8) //(8 pixels per column/halfword, 16 pixels per fullword) + m_crtc->set_char_width(8); //(8 pixels per column/halfword, 16 pixels per fullword) // TODO: below is HACKED to trigger the odd/even int ir4 instead of vblank int ir7 since ir4 is required for anything to be drawn to screen! hence with the hack this interrupt triggers twice as often as it should - MCFG_TMS9927_VSYN_CALLBACK(WRITELINE("iop_pic8259", pic8259_device, ir4_w)) // note this triggers interrupts on both the iop (ir7) and emulatorcpu (ir4) - MCFG_VIDEO_SET_SCREEN("screen") + m_crtc->vsyn_callback().set("iop_pic8259", FUNC(pic8259_device::ir4_w)); // note this triggers interrupts on both the iop (ir7) and emulatorcpu (ir4) + m_crtc->set_screen("screen"); - AY31015(config, m_kbduart, 0); // HD6402, == AY-3-1015D + AY31015(config, m_kbduart); // HD6402, == AY-3-1015D m_kbduart->set_rx_clock(960_kHz_XTAL); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud) m_kbduart->set_tx_clock(960_kHz_XTAL); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud) m_kbduart->write_dav_callback().set("iop_pic8259", FUNC(pic8259_device::ir6_w)); // DataRecvd = KbdInt - AY31015(config, m_eiauart, 0); // HD6402, == AY-3-1015D + AY31015(config, m_eiauart); // HD6402, == AY-3-1015D m_eiauart->set_rx_clock(((960_kHz_XTAL/10)/4)/5); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud) m_eiauart->set_tx_clock(((960_kHz_XTAL/10)/4)/5); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud) m_eiauart->write_dav_callback().set("iop_pic8259", FUNC(pic8259_device::ir3_w)); // EIADataReady = EIAInt diff --git a/src/mame/drivers/nwk-tr.cpp b/src/mame/drivers/nwk-tr.cpp index 6695c2b21d4..c9a38b8413b 100644 --- a/src/mame/drivers/nwk-tr.cpp +++ b/src/mame/drivers/nwk-tr.cpp @@ -896,8 +896,8 @@ MACHINE_CONFIG_START(nwktr_state::nwktr) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_K056800_ADD("k056800", XTAL(16'934'400)) - MCFG_K056800_INT_HANDLER(INPUTLINE("audiocpu", M68K_IRQ_2)) + K056800(config, m_k056800, XTAL(16'934'400)); + m_k056800->int_callback().set_inputline(m_audiocpu, M68K_IRQ_2); MCFG_DEVICE_ADD("rfsnd", RF5C400, XTAL(16'934'400)) // as per Guru readme above MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) diff --git a/src/mame/drivers/octopus.cpp b/src/mame/drivers/octopus.cpp index 34f7b6a5878..7f1a2da06a3 100644 --- a/src/mame/drivers/octopus.cpp +++ b/src/mame/drivers/octopus.cpp @@ -42,7 +42,7 @@ MP/M 80 o 86 Concurrent CP/M LSI ELSIE MS-DOS -Text display: SCN2674 CRTC, SCB2675 for attributes +Text display: SCN2674B CRTC, SCB2675C for attributes Graphics: ?? (option board, ROM is dumped) Media: Two internal 5.25" floppy disk drives, DS DD, 96tpi. @@ -620,9 +620,24 @@ READ8_MEMBER(octopus_state::vidcontrol_r) WRITE8_MEMBER(octopus_state::vidcontrol_w) { + m_fdc->dden_w(BIT(data, 2)); + m_fdc->set_unscaled_clock(16_MHz_XTAL / (BIT(data, 3) ? 16 : 8)); + + if (((m_vidctrl ^ data) & 0x31) != 0) + { + unsigned dots = 4 + ((data & 0x30) >> 3); + if ((data & 0x30) == 0) + dots = 10; + else if ((data & 0x30) == 0x30) + dots = 9; + + auto dotclk = BIT(data, 0) ? 16_MHz_XTAL : 17.6_MHz_XTAL; + + m_crtc->set_character_width(dots); + m_crtc->set_unscaled_clock(dotclk / dots); + } + m_vidctrl = data; - m_fdc->dden_w(data & 0x04); - m_fdc->set_unscaled_clock(16_MHz_XTAL / ((data & 0x08) ? 16 : 8)); } // Sound hardware @@ -743,6 +758,7 @@ IRQ_CALLBACK_MEMBER(octopus_state::x86_irq_cb) void octopus_state::machine_start() { m_timer_beep = timer_alloc(BEEP_TIMER); + m_vidctrl = 0xff; // install RAM m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0x0000,m_ram->size()-1,"main_ram_bank"); @@ -944,7 +960,7 @@ MACHINE_CONFIG_START(octopus_state::octopus) m_ppi->out_pc_callback().set(FUNC(octopus_state::gpo_w)); MC146818(config, m_rtc, 32.768_kHz_XTAL); - m_rtc->irq_callback().set(m_pic2, FUNC(pic8259_device::ir2_w)); + m_rtc->irq().set(m_pic2, FUNC(pic8259_device::ir2_w)); // Keyboard UART I8251(config, m_kb_uart, 0); @@ -966,11 +982,11 @@ MACHINE_CONFIG_START(octopus_state::octopus) MCFG_SOFTWARE_LIST_ADD("fd_list","octopus") MCFG_DEVICE_ADD("pit", PIT8253, 0) - MCFG_PIT8253_CLK0(2457500) // DART channel A + MCFG_PIT8253_CLK0(4.9152_MHz_XTAL / 2) // DART channel A MCFG_PIT8253_OUT0_HANDLER(WRITELINE(*this, octopus_state,serial_clock_w)) // being able to write both Rx and Tx clocks at one time would be nice - MCFG_PIT8253_CLK1(2457500) // DART channel B + MCFG_PIT8253_CLK1(4.9152_MHz_XTAL / 2) // DART channel B MCFG_PIT8253_OUT1_HANDLER(WRITELINE(m_serial,z80sio_device,rxtxcb_w)) - MCFG_PIT8253_CLK2(2457500) // speaker frequency + MCFG_PIT8253_CLK2(4.9152_MHz_XTAL / 2) // speaker frequency MCFG_PIT8253_OUT2_HANDLER(WRITELINE(*this, octopus_state,spk_freq_w)) SPEAKER(config, "mono").front_center(); @@ -999,21 +1015,17 @@ MACHINE_CONFIG_START(octopus_state::octopus) // TODO: Winchester HD controller (Xebec/SASI compatible? uses TTL logic) /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(720, 360) - MCFG_SCREEN_VISIBLE_AREA(0, 720-1, 0, 360-1) - MCFG_SCREEN_UPDATE_DEVICE("crtc",scn2674_device, screen_update) -// MCFG_SCREEN_PALETTE("palette") -// MCFG_PALETTE_ADD_MONOCHROME("palette") - - MCFG_DEVICE_ADD("crtc", SCN2674, 0) // character clock can be selectable, either 16MHz or 17.6MHz - MCFG_SCN2674_INTR_CALLBACK(WRITELINE("pic_slave", pic8259_device, ir0_w)) - MCFG_SCN2674_CHARACTER_WIDTH(8) - MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(octopus_state, display_pixels) - MCFG_DEVICE_ADDRESS_MAP(0, octopus_vram) - MCFG_VIDEO_SET_SCREEN("screen") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(16_MHz_XTAL, 918, 0, 729, 350, 0, 325); + //screen.set_raw(17.6_MHz_XTAL, 1008, 0, 792, 348, 0, 319); + screen.set_screen_update("crtc", FUNC(scn2674_device::screen_update)); + + SCN2674(config, m_crtc, 16_MHz_XTAL / 9); // dot clock and character width are both selectable + m_crtc->intr_callback().set("pic_slave", FUNC(pic8259_device::ir0_w)); + m_crtc->set_character_width(9); + m_crtc->set_display_callback(FUNC(octopus_state::display_pixels)); + m_crtc->set_addrmap(0, &octopus_state::octopus_vram); + m_crtc->set_screen("screen"); ADDRESS_MAP_BANK(config, "z80_bank").set_map(&octopus_state::octopus_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x10000); diff --git a/src/mame/drivers/palm.cpp b/src/mame/drivers/palm.cpp index c60d306faac..68874958871 100644 --- a/src/mame/drivers/palm.cpp +++ b/src/mame/drivers/palm.cpp @@ -207,15 +207,14 @@ MACHINE_CONFIG_START(palm_state::palm) MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) - MCFG_DEVICE_ADD( MC68328_TAG, MC68328, 0 ) // lsi device - MCFG_MC68328_CPU("maincpu") - MCFG_MC68328_OUT_PORT_F_CB(WRITE8(*this, palm_state, palm_port_f_out)) // Port F Output - MCFG_MC68328_IN_PORT_C_CB(READ8(*this, palm_state, palm_port_c_in)) // Port C Input - MCFG_MC68328_IN_PORT_F_CB(READ8(*this, palm_state, palm_port_f_in)) // Port F Input - MCFG_MC68328_OUT_PWM_CB(WRITELINE("dac", dac_bit_interface, write)) - MCFG_MC68328_OUT_SPIM_CB(WRITE16(*this, palm_state, palm_spim_out)) - MCFG_MC68328_IN_SPIM_CB(READ16(*this, palm_state, palm_spim_in)) - MCFG_MC68328_SPIM_XCH_TRIGGER_CB(WRITELINE(*this, palm_state, palm_spim_exchange)) + MC68328(config, m_lsi, 0, "maincpu"); // on-board peripherals + m_lsi->out_port_f().set(FUNC(palm_state::palm_port_f_out)); + m_lsi->in_port_c().set(FUNC(palm_state::palm_port_c_in)); + m_lsi->in_port_f().set(FUNC(palm_state::palm_port_f_in)); + m_lsi->out_pwm().set("dac", FUNC(dac_bit_interface::write)); + m_lsi->out_spim().set(FUNC(palm_state::palm_spim_out)); + m_lsi->in_spim().set(FUNC(palm_state::palm_spim_in)); + m_lsi->spim_xch_trigger().set(FUNC(palm_state::palm_spim_exchange)); MACHINE_CONFIG_END static INPUT_PORTS_START( palm ) diff --git a/src/mame/drivers/pc1512.cpp b/src/mame/drivers/pc1512.cpp index c69a4d27f14..9d7286daa8d 100644 --- a/src/mame/drivers/pc1512.cpp +++ b/src/mame/drivers/pc1512.cpp @@ -1207,8 +1207,8 @@ MACHINE_CONFIG_START(pc1512_state::pc1512) MCFG_PIT8253_CLK2(28.636363_MHz_XTAL / 24) MCFG_PIT8253_OUT2_HANDLER(WRITELINE(*this, pc1512_state, pit2_w)) - MCFG_DEVICE_ADD(MC146818_TAG, MC146818, 32.768_kHz_XTAL) - MCFG_MC146818_IRQ_HANDLER(WRITELINE(I8259A2_TAG, pic8259_device, ir2_w)) + MC146818(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->irq().set(I8259A2_TAG, FUNC(pic8259_device::ir2_w)); MCFG_PC_FDC_XT_ADD(PC_FDC_XT_TAG) MCFG_PC_FDC_INTRQ_CALLBACK(WRITELINE(*this, pc1512_state, fdc_int_w)) @@ -1338,8 +1338,8 @@ MACHINE_CONFIG_START(pc1640_state::pc1640) MCFG_PIT8253_CLK2(28.636363_MHz_XTAL / 24) MCFG_PIT8253_OUT2_HANDLER(WRITELINE(*this, pc1512_base_state, pit2_w)) - MCFG_DEVICE_ADD(MC146818_TAG, MC146818, 32.768_kHz_XTAL) - MCFG_MC146818_IRQ_HANDLER(WRITELINE(I8259A2_TAG, pic8259_device, ir2_w)) + MC146818(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->irq().set(I8259A2_TAG, FUNC(pic8259_device::ir2_w)); MCFG_PC_FDC_XT_ADD(PC_FDC_XT_TAG) MCFG_PC_FDC_INTRQ_CALLBACK(WRITELINE(*this, pc1512_base_state, fdc_int_w)) diff --git a/src/mame/drivers/pcat_dyn.cpp b/src/mame/drivers/pcat_dyn.cpp index 86a80953f4f..6aa0d303c17 100644 --- a/src/mame/drivers/pcat_dyn.cpp +++ b/src/mame/drivers/pcat_dyn.cpp @@ -178,10 +178,9 @@ MACHINE_CONFIG_START(pcat_dyn_state::pcat_dyn) pcat_common(config); - MCFG_DEVICE_REMOVE("rtc") - MCFG_DS12885_ADD("rtc") - MCFG_MC146818_IRQ_HANDLER(WRITELINE("pic8259_2", pic8259_device, ir0_w)) - MCFG_MC146818_CENTURY_INDEX(0x32) + DS12885(config.replace(), m_mc146818); + m_mc146818->irq().set("pic8259_2", FUNC(pic8259_device::ir0_w)); + m_mc146818->set_century_index(0x32); MCFG_DEVICE_ADD("ad1848", AD1848, 0) MCFG_AD1848_IRQ_CALLBACK(WRITELINE("pic8259_1", pic8259_device, ir5_w)) diff --git a/src/mame/drivers/pcd.cpp b/src/mame/drivers/pcd.cpp index 1f632418c62..d7bfdbe7e16 100644 --- a/src/mame/drivers/pcd.cpp +++ b/src/mame/drivers/pcd.cpp @@ -44,6 +44,7 @@ public: , m_speaker(*this, "speaker") , m_fdc(*this, "fdc") , m_rtc(*this, "rtc") + , m_usart(*this, "usart%u", 1U) , m_scsi(*this, "scsi") , m_scsi_data_out(*this, "scsi_data_out") , m_scsi_data_in(*this, "scsi_data_in") @@ -99,6 +100,7 @@ private: required_device<speaker_sound_device> m_speaker; required_device<wd2793_device> m_fdc; required_device<mc146818_device> m_rtc; + required_device_array<mc2661_device, 3> m_usart; required_device<scsi_port_device> m_scsi; required_device<output_latch_device> m_scsi_data_out; required_device<input_buffer_device> m_scsi_data_in; @@ -459,9 +461,9 @@ void pcd_state::pcd_io(address_map &map) map(0xf904, 0xf905).rw(FUNC(pcd_state::dskctl_r), FUNC(pcd_state::dskctl_w)); map(0xf940, 0xf943).rw(FUNC(pcd_state::scsi_r), FUNC(pcd_state::scsi_w)); map(0xf980, 0xf9bf).m("video", FUNC(pcdx_video_device::map)); - map(0xf9c0, 0xf9c3).rw("usart1", FUNC(mc2661_device::read), FUNC(mc2661_device::write)); // UARTs - map(0xf9d0, 0xf9d3).rw("usart2", FUNC(mc2661_device::read), FUNC(mc2661_device::write)); - map(0xf9e0, 0xf9e3).rw("usart3", FUNC(mc2661_device::read), FUNC(mc2661_device::write)); + map(0xf9c0, 0xf9c3).rw(m_usart[0], FUNC(mc2661_device::read), FUNC(mc2661_device::write)); // UARTs + map(0xf9d0, 0xf9d3).rw(m_usart[1], FUNC(mc2661_device::read), FUNC(mc2661_device::write)); + map(0xf9e0, 0xf9e3).rw(m_usart[2], FUNC(mc2661_device::read), FUNC(mc2661_device::write)); // AM_RANGE(0xfa00, 0xfa7f) // pcs4-n (peripheral chip select) map(0xfb00, 0xfb00).rw(FUNC(pcd_state::nmi_io_r), FUNC(pcd_state::nmi_io_w)); map(0xfb02, 0xffff).rw(FUNC(pcd_state::nmi_io_r), FUNC(pcd_state::nmi_io_w)); @@ -530,23 +532,25 @@ MACHINE_CONFIG_START(pcd_state::pcd) MCFG_FLOPPY_DRIVE_ADD("fdc:1", pcd_floppies, "55f", pcd_state::floppy_formats) // usart - MCFG_DEVICE_ADD("usart1", MC2661, 4.9152_MHz_XTAL) - MCFG_MC2661_RXRDY_HANDLER(WRITELINE(m_pic1, pic8259_device, ir3_w)) - MCFG_MC2661_TXRDY_HANDLER(WRITELINE(m_pic1, pic8259_device, ir3_w)) - MCFG_MC2661_TXD_HANDLER(WRITELINE("rs232_1", rs232_port_device, write_txd)) - MCFG_DEVICE_ADD("usart2", MC2661, 4.9152_MHz_XTAL) - MCFG_MC2661_RXRDY_HANDLER(WRITELINE(m_pic1, pic8259_device, ir2_w)) - //MCFG_MC2661_TXRDY_HANDLER(WRITELINE(m_pic1, pic8259_device, ir2_w)) // this gets stuck high causing the keyboard to not work - MCFG_MC2661_TXD_HANDLER(WRITELINE("keyboard", pcd_keyboard_device, t0_w)) - MCFG_DEVICE_ADD("usart3", MC2661, 4.9152_MHz_XTAL) - MCFG_MC2661_RXRDY_HANDLER(WRITELINE(m_pic1, pic8259_device, ir4_w)) - MCFG_MC2661_TXRDY_HANDLER(WRITELINE(m_pic1, pic8259_device, ir4_w)) - MCFG_MC2661_TXD_HANDLER(WRITELINE("rs232_2", rs232_port_device, write_txd)) + MC2661(config, m_usart[0], 4.9152_MHz_XTAL); + m_usart[0]->rxrdy_handler().set(m_pic1, FUNC(pic8259_device::ir3_w)); + m_usart[0]->txrdy_handler().set(m_pic1, FUNC(pic8259_device::ir3_w)); + m_usart[0]->txd_handler().set("rs232_1", FUNC(rs232_port_device::write_txd)); + + MC2661(config, m_usart[1], 4.9152_MHz_XTAL); + m_usart[1]->rxrdy_handler().set(m_pic1, FUNC(pic8259_device::ir2_w)); + //m_usart[1]->.txrdy_handler().set(m_pic1, FUNC(pic8259_device::ir2_w)); // this gets stuck high causing the keyboard to not work + m_usart[1]->txd_handler().set("keyboard", FUNC(pcd_keyboard_device::t0_w)); + + MC2661(config, m_usart[2], 4.9152_MHz_XTAL); + m_usart[2]->rxrdy_handler().set(m_pic1, FUNC(pic8259_device::ir4_w)); + m_usart[2]->txrdy_handler().set(m_pic1, FUNC(pic8259_device::ir4_w)); + m_usart[2]->txd_handler().set("rs232_2", FUNC(rs232_port_device::write_txd)); MCFG_DEVICE_ADD("rs232_1", RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("usart1", mc2661_device, rx_w)) + MCFG_RS232_RXD_HANDLER(WRITELINE(m_usart[0], mc2661_device, rx_w)) MCFG_DEVICE_ADD("rs232_2", RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("usart3", mc2661_device, rx_w)) + MCFG_RS232_RXD_HANDLER(WRITELINE(m_usart[2], mc2661_device, rx_w)) // sound hardware SPEAKER(config, "mono").front_center(); @@ -554,15 +558,15 @@ MACHINE_CONFIG_START(pcd_state::pcd) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) // rtc - MCFG_DEVICE_ADD("rtc", MC146818, 32.768_kHz_XTAL) - MCFG_MC146818_IRQ_HANDLER(WRITELINE(m_pic1, pic8259_device, ir7_w)) - MCFG_MC146818_BINARY(true) - MCFG_MC146818_BINARY_YEAR(true) - MCFG_MC146818_EPOCH(1900) - MCFG_MC146818_24_12(true) + MC146818(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->irq().set(m_pic1, FUNC(pic8259_device::ir7_w)); + m_rtc->set_binary(true); + m_rtc->set_binary_year(true); + m_rtc->set_epoch(1900); + m_rtc->set_24hrs(true); MCFG_DEVICE_ADD("keyboard", PCD_KEYBOARD, 0) - MCFG_PCD_KEYBOARD_OUT_TX_HANDLER(WRITELINE("usart2", mc2661_device, rx_w)) + MCFG_PCD_KEYBOARD_OUT_TX_HANDLER(WRITELINE(m_usart[1], mc2661_device, rx_w)) MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) MCFG_SCSI_DATA_INPUT_BUFFER("scsi_data_in") @@ -588,8 +592,7 @@ MACHINE_CONFIG_START(pcd_state::pcx) MCFG_DEVICE_MODIFY("keyboard") MCFG_PCD_KEYBOARD_OUT_TX_HANDLER(WRITELINE("video", pcx_video_device, rx_w)) - MCFG_DEVICE_MODIFY("usart2") - MCFG_MC2661_TXD_HANDLER(NOOP) + m_usart[1]->txd_handler().set_nop(); MACHINE_CONFIG_END //************************************************************************** diff --git a/src/mame/drivers/pes.cpp b/src/mame/drivers/pes.cpp index 92b4744cbc5..b3ccd756979 100644 --- a/src/mame/drivers/pes.cpp +++ b/src/mame/drivers/pes.cpp @@ -131,14 +131,14 @@ WRITE8_MEMBER( pes_state::port1_w ) #ifdef DEBUG_PORTS logerror("port1 write: tms5220 data written: %02X\n", data); #endif - m_speech->data_w(space, 0, data); + m_speech->data_w(data); } READ8_MEMBER( pes_state::port1_r ) { uint8_t data = 0xFF; - data = m_speech->status_r(space, 0); + data = m_speech->status_r(); #ifdef DEBUG_PORTS logerror("port1 read: tms5220 data read: 0x%02X\n", data); #endif diff --git a/src/mame/drivers/pgm.cpp b/src/mame/drivers/pgm.cpp index cf3415aed40..bdb35e63993 100644 --- a/src/mame/drivers/pgm.cpp +++ b/src/mame/drivers/pgm.cpp @@ -523,7 +523,7 @@ MACHINE_CONFIG_START(pgm_state::pgmbase) MCFG_MACHINE_RESET_OVERRIDE(pgm_state, pgm ) NVRAM(config, "sram", nvram_device::DEFAULT_ALL_0); - MCFG_V3021_ADD("rtc") + V3021(config, "rtc"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) diff --git a/src/mame/drivers/psx.cpp b/src/mame/drivers/psx.cpp index 908c21e1426..1d4260396d8 100644 --- a/src/mame/drivers/psx.cpp +++ b/src/mame/drivers/psx.cpp @@ -23,6 +23,7 @@ #include "video/psx.h" #include "debugger.h" +#include "screen.h" #include "softlist.h" #include "speaker.h" @@ -536,6 +537,9 @@ MACHINE_CONFIG_START(psx1_state::psj) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -587,6 +591,9 @@ MACHINE_CONFIG_START(psx1_state::pse) /* video hardware */ /* TODO: visible area and refresh rate */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); diff --git a/src/mame/drivers/qvt201.cpp b/src/mame/drivers/qvt201.cpp index 8b415757045..49e6add37fb 100644 --- a/src/mame/drivers/qvt201.cpp +++ b/src/mame/drivers/qvt201.cpp @@ -118,15 +118,15 @@ MACHINE_CONFIG_START(qvt201_state::qvt201) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // TC5516APL-2 or uPD446C-2 + battery - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(48.654_MHz_XTAL / 3, 102 * 10, 0, 80 * 10, 265, 0, 250) - //MCFG_SCREEN_RAW_PARAMS(48.654_MHz_XTAL / 2, 170 * 9, 0, 132 * 9, 265, 0, 250) - MCFG_SCREEN_UPDATE_DEVICE("crtc", scn2672_device, screen_update) - - MCFG_DEVICE_ADD("crtc", SCN2672, 48.654_MHz_XTAL / 30) - MCFG_SCN2672_CHARACTER_WIDTH(10) // 9 in 132-column mode - MCFG_SCN2672_INTR_CALLBACK(WRITELINE("mainint", input_merger_device, in_w<0>)) - MCFG_VIDEO_SET_SCREEN("screen") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(48.654_MHz_XTAL / 3, 102 * 10, 0, 80 * 10, 265, 0, 250); + //screen.set_raw(48.654_MHz_XTAL / 2, 170 * 9, 0, 132 * 9, 265, 0, 250); + screen.set_screen_update("crtc", FUNC(scn2672_device::screen_update)); + + scn2672_device &crtc(SCN2672(config, "crtc", 48.654_MHz_XTAL / 30)); + crtc.set_character_width(10); // 9 in 132-column mode + crtc.intr_callback().set("mainint", FUNC(input_merger_device::in_w<0>)); + crtc.set_screen("screen"); MACHINE_CONFIG_END diff --git a/src/mame/drivers/qx10.cpp b/src/mame/drivers/qx10.cpp index 4b8829ffe36..b94c8b8e409 100644 --- a/src/mame/drivers/qx10.cpp +++ b/src/mame/drivers/qx10.cpp @@ -806,7 +806,7 @@ MACHINE_CONFIG_START(qx10_state::qx10) MCFG_VIDEO_SET_SCREEN("screen") MC146818(config, m_rtc, 32.768_kHz_XTAL); - m_rtc->irq_callback().set(m_pic_s, FUNC(pic8259_device::ir2_w)); + m_rtc->irq().set(m_pic_s, FUNC(pic8259_device::ir2_w)); UPD765A(config, m_fdc, true, true); m_fdc->intrq_wr_callback().set(FUNC(qx10_state::qx10_upd765_interrupt)); diff --git a/src/mame/drivers/s11c.cpp b/src/mame/drivers/s11c.cpp index 14c7aaa059b..27e6eae10a8 100644 --- a/src/mame/drivers/s11c.cpp +++ b/src/mame/drivers/s11c.cpp @@ -260,7 +260,7 @@ ROM_END ROM_START(diner_l3) ROM_REGION(0x10000, "maincpu", 0) - ROM_LOAD("u26-la3.rom", 0x4000, 0x4000, CRC(8b6aa22e) SHA1(6b802a85fc2babf5a183fb434df11597363c1c9d)) + ROM_LOAD("dinr_u26.l2", 0x4000, 0x4000, CRC(8b6aa22e) SHA1(6b802a85fc2babf5a183fb434df11597363c1c9d)) ROM_LOAD("u27-la3.rom", 0x8000, 0x8000, CRC(4171451a) SHA1(818e330245691d9ef3181b885c9342880f89d912)) ROM_REGION(0x50000, "bgcpu", ROMREGION_ERASEFF) ROM_LOAD("dinr_u4.l1", 0x10000, 0x10000, CRC(3bd28368) SHA1(41eec2f5f863039deaabfae8aece4b1cf15e4b78)) @@ -270,7 +270,7 @@ ROM_END ROM_START(diner_l2) ROM_REGION(0x10000, "maincpu", 0) - ROM_LOAD("u26-la3.rom", 0x4000, 0x4000, CRC(8b6aa22e) SHA1(6b802a85fc2babf5a183fb434df11597363c1c9d)) + ROM_LOAD("dinr_u26.l2", 0x4000, 0x4000, CRC(8b6aa22e) SHA1(6b802a85fc2babf5a183fb434df11597363c1c9d)) ROM_LOAD("dinr_u27.lu2", 0x8000, 0x8000, CRC(ea72f6aa) SHA1(58df02e8353dd9be2ecfbcdc78fc54981dd001e1)) ROM_REGION(0x50000, "bgcpu", ROMREGION_ERASEFF) ROM_LOAD("dinr_u4.l1", 0x10000, 0x10000, CRC(3bd28368) SHA1(41eec2f5f863039deaabfae8aece4b1cf15e4b78)) @@ -278,6 +278,16 @@ ROM_START(diner_l2) ROM_LOAD("dinr_u20.l1", 0x30000, 0x10000, CRC(511fb260) SHA1(e6e25b464c5c38f3c0492436f1e8aa2be33dd278)) ROM_END +ROM_START(diner_f2) + ROM_REGION(0x10000, "maincpu", 0) + ROM_LOAD("dinr_u26.l2", 0x4000, 0x4000, CRC(8b6aa22e) SHA1(6b802a85fc2babf5a183fb434df11597363c1c9d)) + ROM_LOAD("dinr_u27.lf2", 0x8000, 0x8000, CRC(343af291) SHA1(ecf30dd828537cd68dc6c9f97256a38c820b9afc)) + ROM_REGION(0x50000, "bgcpu", ROMREGION_ERASEFF) + ROM_LOAD("dinr_u4.l1", 0x10000, 0x10000, CRC(3bd28368) SHA1(41eec2f5f863039deaabfae8aece4b1cf15e4b78)) + ROM_LOAD("dinr_u19.l1", 0x20000, 0x10000, CRC(278b9a30) SHA1(41e59adb8b6c08caee46c3dd73256480b4041619)) + ROM_LOAD("dinr_u20.l1", 0x30000, 0x10000, CRC(511fb260) SHA1(e6e25b464c5c38f3c0492436f1e8aa2be33dd278)) +ROM_END + ROM_START(diner_l1) ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("u26-lu1.rom", 0x4000, 0x4000, CRC(259b302f) SHA1(d7e19c2d2ad7805d9158178c24d180d158a59b0c)) @@ -579,10 +589,11 @@ ROM_END GAME(1990, bbnny_l2, 0, s11c, s11c, s11c_state, init_s11c, ROT0, "Bally", "Bugs Bunny Birthday Ball (L-2)", MACHINE_IS_SKELETON_MECHANICAL) GAME(1990, bbnny_lu, bbnny_l2, s11c, s11c, s11c_state, init_s11c, ROT0, "Bally", "Bugs Bunny Birthday Ball (LU-2) European", MACHINE_IS_SKELETON_MECHANICAL) -GAME(1990, diner_l4, 0, s11c, s11c, s11c_state, init_s11c, ROT0, "Williams", "Diner (L-4)", MACHINE_IS_SKELETON_MECHANICAL) -GAME(1990, diner_l3, diner_l4, s11c, s11c, s11c_state, init_s11c, ROT0, "Williams", "Diner (L-3)", MACHINE_IS_SKELETON_MECHANICAL) -GAME(1990, diner_l2, diner_l4, s11c, s11c, s11c_state, init_s11c, ROT0, "Williams", "Diner (L-2)", MACHINE_IS_SKELETON_MECHANICAL) -GAME(1990, diner_l1, diner_l4, s11c, s11c, s11c_state, init_s11c, ROT0, "Williams", "Diner (L-1) Europe", MACHINE_IS_SKELETON_MECHANICAL) +GAME(1990, diner_l4, 0, s11c, s11c, s11c_state, init_s11c, ROT0, "Williams", "Diner (LA-4)", MACHINE_IS_SKELETON_MECHANICAL) +GAME(1990, diner_l3, diner_l4, s11c, s11c, s11c_state, init_s11c, ROT0, "Williams", "Diner (LA-3)", MACHINE_IS_SKELETON_MECHANICAL) +GAME(1990, diner_l2, diner_l4, s11c, s11c, s11c_state, init_s11c, ROT0, "Williams", "Diner (LU-2) Europe", MACHINE_IS_SKELETON_MECHANICAL) +GAME(1990, diner_f2, diner_l4, s11c, s11c, s11c_state, init_s11c, ROT0, "Williams", "Diner (LF-2) French", MACHINE_IS_SKELETON_MECHANICAL) +GAME(1990, diner_l1, diner_l4, s11c, s11c, s11c_state, init_s11c, ROT0, "Williams", "Diner (LU-1) Europe", MACHINE_IS_SKELETON_MECHANICAL) GAME(1990, dd_l2, 0, s11c, s11c, s11c_state, init_s11c, ROT0, "Bally", "Dr. Dude (LA-2)", MACHINE_IS_SKELETON_MECHANICAL) GAME(1990, dd_p6, dd_l2, s11c, s11c, s11c_state, init_s11c, ROT0, "Bally", "Dr. Dude (PA-6)", MACHINE_IS_SKELETON_MECHANICAL) GAME(1990, pool_l7, 0, s11c, s11c, s11c_state, init_s11c, ROT0, "Bally", "Pool Sharks (LA-7)", MACHINE_IS_SKELETON_MECHANICAL) diff --git a/src/mame/drivers/sangho.cpp b/src/mame/drivers/sangho.cpp index 5431e9cd676..bd6e859f44d 100644 --- a/src/mame/drivers/sangho.cpp +++ b/src/mame/drivers/sangho.cpp @@ -59,7 +59,6 @@ class sangho_state : public driver_device public: sangho_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) - , m_v9958(*this, "v9958") , m_maincpu(*this, "maincpu") , m_region_user1(*this, "user1") , m_banks(*this, "bank%u", 1U) @@ -71,7 +70,6 @@ protected: void sangho_map(address_map &map); std::unique_ptr<uint8_t[]> m_ram; - required_device<v9958_device> m_v9958; required_device<cpu_device> m_maincpu; required_memory_region m_region_user1; required_memory_bank_array<8> m_banks; @@ -315,7 +313,7 @@ void pzlestar_state::pzlestar_io_map(address_map &map) map.global_mask(0xff); map(0x7c, 0x7d).w("ymsnd", FUNC(ym2413_device::write)); map(0x91, 0x91).w(FUNC(pzlestar_state::pzlestar_bank_w)); - map(0x98, 0x9b).rw(m_v9958, FUNC(v9958_device::read), FUNC(v9958_device::write)); + map(0x98, 0x9b).rw("v9958", FUNC(v9958_device::read), FUNC(v9958_device::write)); map(0xa0, 0xa0).portr("P1"); map(0xa1, 0xa1).portr("P2"); map(0xa8, 0xa8).rw(FUNC(pzlestar_state::pzlestar_mem_bank_r), FUNC(pzlestar_state::pzlestar_mem_bank_w)); @@ -330,7 +328,7 @@ void sexyboom_state::sexyboom_io_map(address_map &map) map(0x7c, 0x7d).w("ymsnd", FUNC(ym2413_device::write)); map(0xa0, 0xa0).portr("P1"); map(0xa1, 0xa1).portr("P2"); - map(0xf0, 0xf3).rw(m_v9958, FUNC(v9958_device::read), FUNC(v9958_device::write)); + map(0xf0, 0xf3).rw("v9958", FUNC(v9958_device::read), FUNC(v9958_device::write)); map(0xf7, 0xf7).portr("DSW"); map(0xf8, 0xff).w(FUNC(sexyboom_state::sexyboom_bank_w)); } @@ -484,9 +482,11 @@ MACHINE_CONFIG_START(pzlestar_state::pzlestar) MCFG_DEVICE_PROGRAM_MAP(sangho_map) MCFG_DEVICE_IO_MAP(pzlestar_io_map) - MCFG_V9958_ADD("v9958", "screen", 0x20000, XTAL(21'477'272)) // typical 9958 clock, not verified - MCFG_V99X8_INTERRUPT_CALLBACK(INPUTLINE("maincpu", 0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9958", XTAL(21'477'272)) + v9958_device &v9958(V9958(config, "v9958", XTAL(21'477'272))); // typical 9958 clock, not verified + v9958.set_screen_ntsc("screen"); + v9958.set_vram_size(0x20000); + v9958.int_cb().set_inputline("maincpu", 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); SPEAKER(config, "mono").front_center(); MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(21'477'272)/6) @@ -500,9 +500,11 @@ MACHINE_CONFIG_START(sexyboom_state::sexyboom) MCFG_DEVICE_PROGRAM_MAP(sangho_map) MCFG_DEVICE_IO_MAP(sexyboom_io_map) - MCFG_V9958_ADD("v9958", "screen", 0x20000, XTAL(21'477'272)) - MCFG_V99X8_INTERRUPT_CALLBACK(INPUTLINE("maincpu", 0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9958", XTAL(21'477'272)) + v9958_device &v9958(V9958(config, "v9958", XTAL(21'477'272))); + v9958.set_screen_ntsc("screen"); + v9958.set_vram_size(0x20000); + v9958.int_cb().set_inputline("maincpu", 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); MCFG_PALETTE_ADD("palette", 19780) diff --git a/src/mame/drivers/sauro.cpp b/src/mame/drivers/sauro.cpp index 1e6c0934694..54d30fdc4bc 100644 --- a/src/mame/drivers/sauro.cpp +++ b/src/mame/drivers/sauro.cpp @@ -181,7 +181,7 @@ WRITE_LINE_MEMBER(sauro_state::flip_screen_w) WRITE8_MEMBER(sauro_state::adpcm_w) { - m_sp0256->ald_w(space, 0, data); + m_sp0256->ald_w(data); } void sauro_state::sauro_map(address_map &map) diff --git a/src/mame/drivers/seattle.cpp b/src/mame/drivers/seattle.cpp index 99736cd39e9..ce601f41db3 100644 --- a/src/mame/drivers/seattle.cpp +++ b/src/mame/drivers/seattle.cpp @@ -281,6 +281,7 @@ public: m_nvram(*this, "nvram"), m_maincpu(*this, "maincpu"), m_galileo(*this, PCI_ID_GALILEO), + m_voodoo(*this, PCI_ID_VIDEO), m_cage(*this, "cage"), m_dcs(*this, "dcs"), m_screen(*this, "screen"), @@ -337,6 +338,7 @@ private: required_device<nvram_device> m_nvram; required_device<mips3_device> m_maincpu; required_device<gt64010_device> m_galileo; + required_device<voodoo_1_pci_device> m_voodoo; optional_device<atari_cage_seattle_device> m_cage; optional_device<dcs_audio_device> m_dcs; required_device<screen_device> m_screen; @@ -1911,23 +1913,23 @@ MACHINE_CONFIG_START(seattle_state::seattle_common) ide.irq_handler().set_inputline(m_maincpu, IDE_IRQ_NUM); ide.set_legacy_top(0x0a0); - voodoo_1_pci_device &voodoo(VOODOO_1_PCI(config, PCI_ID_VIDEO, 0, m_maincpu, m_screen)); - voodoo.set_fbmem(2); - voodoo.set_tmumem(4, 0); + /* video hardware */ + VOODOO_1_PCI(config, m_voodoo, 0, m_maincpu, m_screen); + m_voodoo->set_fbmem(2); + m_voodoo->set_tmumem(4, 0); - voodoo_device *voodoo_base = static_cast<voodoo_device*>(config.device_find(this, PCI_ID_VIDEO":voodoo")); - voodoo_base->vblank_callback().set(FUNC(seattle_state::vblank_assert)); - voodoo_base->stall_callback().set(m_galileo, FUNC(gt64xxx_device::pci_stall)); + subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(seattle_state::vblank_assert)); + subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->stall_callback().set(m_galileo, FUNC(gt64xxx_device::pci_stall)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); - /* video hardware */ - MCFG_SCREEN_ADD(m_screen, RASTER) - MCFG_SCREEN_REFRESH_RATE(57) - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE_DEVICE(PCI_ID_VIDEO, voodoo_pci_device, screen_update) - /* sound hardware */ + /* screen */ + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + // Screeen size and timing is re-calculated later in voodoo card + m_screen->set_refresh_hz(57); + m_screen->set_size(640, 480); + m_screen->set_visarea(0, 640 - 1, 0, 480 - 1); + m_screen->set_screen_update(PCI_ID_VIDEO, FUNC(voodoo_1_pci_device::screen_update)); MACHINE_CONFIG_END @@ -1980,9 +1982,8 @@ MACHINE_CONFIG_START(seattle_state::flagstaff) SMC91C94(config, m_ethernet, 0); m_ethernet->irq_handler().set(FUNC(seattle_state::ethernet_interrupt)); - voodoo_1_pci_device *voodoo = static_cast<voodoo_1_pci_device*>(config.device_find(this, PCI_ID_VIDEO)); - voodoo->set_fbmem(2); - voodoo->set_tmumem(4, 4); + m_voodoo->set_fbmem(2); + m_voodoo->set_tmumem(4, 4); MACHINE_CONFIG_END // Per game configurations diff --git a/src/mame/drivers/seta.cpp b/src/mame/drivers/seta.cpp index aa9467e87c1..3fabb929eac 100644 --- a/src/mame/drivers/seta.cpp +++ b/src/mame/drivers/seta.cpp @@ -2955,7 +2955,7 @@ void seta_state::thunderlbl_map(address_map &map) map(0xb00000, 0xb00001).portr("P1"); // P1 map(0xb00002, 0xb00003).portr("P2"); // P2 map(0xb00004, 0xb00005).portr("COINS"); // Coins -// map(0xb0000c, 0xb0000d).r(FUNC(seta_state::thunderl_protection_r)); // Protection (not in wits) + map(0xb0000c, 0xb0000d).w(m_seta001, FUNC(seta001_device::spritectrl_w8)).umask16(0xff00); // the bootleg is modified to write the first byte of spritectrl here, rather than the usual address map(0xb00008, 0xb00009).portr("P3"); // P3 (wits) map(0xb00008, 0xb00008).w("soundlatch1", FUNC(generic_latch_8_device::write)); map(0xb0000a, 0xb0000b).portr("P4"); // P4 (wits) @@ -6069,17 +6069,6 @@ static INPUT_PORTS_START( thunderl ) PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END - -static INPUT_PORTS_START( thunderlbl ) - PORT_INCLUDE(thunderl) - - PORT_MODIFY("DSW") - PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:2") - PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) -INPUT_PORTS_END - - /*************************************************************************** Thundercade (US) ***************************************************************************/ @@ -12131,7 +12120,7 @@ GAME( 1989, drgnunit, 0, drgnunit, drgnunit, seta_state, empty_ini GAME( 1989, wits, 0, wits, wits, seta_state, empty_init, ROT0, "Athena (Visco license)", "Wit's (Japan)" , 0) // Country/License: DSW GAME( 1990, thunderl, 0, thunderl, thunderl, seta_state, empty_init, ROT270, "Seta", "Thunder & Lightning" , 0) // Country/License: DSW -GAME( 1990, thunderlbl,thunderl, thunderlbl,thunderlbl,seta_state, empty_init, ROT90, "bootleg", "Thunder & Lightning (bootleg with Tetris sound)", MACHINE_IMPERFECT_SOUND | MACHINE_NO_COCKTAIL ) // Country/License: DSW +GAME( 1990, thunderlbl,thunderl, thunderlbl,thunderl, seta_state, empty_init, ROT270, "bootleg (Hyogo)", "Thunder & Lightning (bootleg with Tetris sound)", MACHINE_IMPERFECT_SOUND | MACHINE_NO_COCKTAIL ) // Country/License: DSW GAME( 1994, wiggie, 0, wiggie, thunderl, seta_state, init_wiggie, ROT270, "Promat", "Wiggie Waggie", MACHINE_IMPERFECT_GRAPHICS ) // hack of Thunder & Lightning GAME( 1994, superbar, wiggie, superbar, thunderl, seta_state, init_wiggie, ROT270, "Promat", "Super Bar", MACHINE_IMPERFECT_GRAPHICS ) // hack of Thunder & Lightning @@ -12171,9 +12160,9 @@ GAME( 1993, daiohc, daioh, wrofaero, daioh, seta_state, empty_ini GAME( 1993, jjsquawk, 0, jjsquawk, jjsquawk, seta_state, empty_init, ROT0, "Athena / Able", "J. J. Squawkers", MACHINE_IMPERFECT_SOUND ) GAME( 1993, jjsquawko, jjsquawk, jjsquawk, jjsquawk, seta_state, empty_init, ROT0, "Athena / Able", "J. J. Squawkers (older)", MACHINE_IMPERFECT_SOUND ) -GAME( 1993, jjsquawkb, jjsquawk, jjsquawb, jjsquawk, seta_state, empty_init, ROT0, "bootleg", "J. J. Squawkers (bootleg)", MACHINE_IMPERFECT_SOUND ) -GAME( 1993, jjsquawkb2,jjsquawk, jjsquawk, jjsquawk, seta_state, empty_init, ROT0, "bootleg", "J. J. Squawkers (bootleg, Blandia Conversion)", MACHINE_IMPERFECT_SOUND ) -GAME( 2003, simpsonjr, jjsquawk, jjsquawb, jjsquawk, seta_state, empty_init, ROT0, "bootleg", "Simpson Junior (bootleg of J. J. Squawkers)", MACHINE_IMPERFECT_SOUND ) +GAME( 1999, jjsquawkb, jjsquawk, jjsquawb, jjsquawk, seta_state, empty_init, ROT0, "bootleg", "J. J. Squawkers (bootleg)", MACHINE_IMPERFECT_SOUND ) +GAME( 1999, jjsquawkb2,jjsquawk, jjsquawk, jjsquawk, seta_state, empty_init, ROT0, "bootleg", "J. J. Squawkers (bootleg, Blandia Conversion)", MACHINE_IMPERFECT_SOUND ) +GAME( 2003, simpsonjr, jjsquawk, jjsquawb, jjsquawk, seta_state, empty_init, ROT0, "bootleg (Daigom Games)", "Simpson Junior (bootleg of J. J. Squawkers)", MACHINE_IMPERFECT_SOUND ) GAME( 1993, kamenrid, 0, kamenrid, kamenrid, seta_state, empty_init, ROT0, "Banpresto / Toei", "Masked Riders Club Battle Race", 0 ) diff --git a/src/mame/drivers/seta2.cpp b/src/mame/drivers/seta2.cpp index 464c01a6c37..d63b6bef5da 100644 --- a/src/mame/drivers/seta2.cpp +++ b/src/mame/drivers/seta2.cpp @@ -3132,43 +3132,174 @@ void funcube_state::init_funcube3() Guardians Banpresto, 1995 -This hardware is not common Banpresto hardware. Possibly licensed -to them from another manufacturer? Or an early design that they decided -not to use for future games? Either way, this game is _extremely_ rare :-) - -PCB Layout ----------- - -P-FG01-1 ------------------------------------------------------- -| X1-010 6264 U32 CXK581000 | -| CXK581000 U16 | -| | -| U20 | -| U3 U5 U2 U4 62256 CXK58257 | -| 62256 CXK58257 U15 | -| | -|J U19 | -|A TMP68301AF-16 | -|M U18 | -|M NEC | -|A NEC DX-101 U22 | -| DX-102 | -| U17 | -| PAL 50MHz | -| U21 | -| DSW1(8) | -| DSW2(8) CXK58257 NEC | -| CXK58257 DX-102| ------------------------------------------------------- + CPU: Toshiba TMP68301AF-16 (100 Pin PQFP) + Video: NEC DX-101 (240 Pin PQFP, @ U10) + NEC DX-102 (52 Pin PQFP x2, @ U28 & U45) + Sound: X1-010 (Mitsubishi M60016 Gate Array, 80 Pin PQFP @ U26) + OSC: 50MHz + Other: 8 Position Dipswitch x 2 + GAL 16V8 at U38 + +Memory: +M1 are HM628128LFP-10L at U42 & U43 +M2 is W2465K-70LL at U27 +M3 are LH5168D-10L at U8 & U9 +M4 are CXK58257AM-10L at U6, U7, U13 & U14 + +PCB Number: P-FG01-1 ++-----------------------------------------------------------+ +| +------+ U U CN4* | +| VOL |Seta | M 5 5 +--------------+| +| |X1-010| 2 8 7 +-+ M | U16 || +| +------+ * * | | 1 +--------------+| ++-+ |U| +--------------+| + | +-++-++-++-+ |3| | U20 || ++-+ | || || || | M |2| M +--------------+| +| |U||U||U||U| M M 4 | | 1 +--------------+| +|J |3||5||2||4| 3 3 +-+ | U15 || +|A | || || || | M +--------------+| +|M +-++-++-++-+ 4 +--------------+| +|M | U19 || +|A +--------------+| +| +--------------+| +|C | U18 || +|o +----------+ +--------------+| +|n +-------+ | | +--------------+| +|n |Toshiba| | NEC | | U22 || +|e | TMP | | DX-101 | +--------------+| +|c | 68301 | | | +--------------+| +|t U +-------+ | | | U17 || +|e 5 +----------+ +--------------+| +|r 6 +--------------+| +| * | U21 || ++-+ +---+ U +--------------+| + | |DX | 3 50MHz 32MHz* | + | |102| 8 | ++-+ +---+ M M +---+ | +| D D 4 4 |DX | | +| S S |102| | +| W W +---+ | +| 2 1 | ++-----------------------------------------------------------+ + +U56 is unpopulated 93C45 EEPROM +CN4 - 96 pin connector (3 rows by 32 pins) +* Denotes not populated. Notes: HSync: 15.23kHz VSync: 58.5Hz +NOTE: There is known to exist an undumped version of Guardians on the + P-FG01-1 PCB half as many but larger ROMs. + + The following sockets have double size ROMS: + U4 & U5 - program ROMs + U15, U16, U17 & U18 - graphics ROMS + The following sockets are unpopulated: + U2 & U3 - program ROMs + U19, U20, U21 & U22 - graphics ROMS +********************************************************** + +There is known to exist an undumped version of Guardians on the + P0-113A PCB with P1-106-1 & P1-107-1 duaghtercards + + It's assumed the programs roms (at least) are different to cope + with the different hardware configuration. + + CPU: Toshiba TMP68301AF-16 (100 Pin PQFP) + Video: Allumer X1-020 (208 Pin PQFP) + Sound: X1-010 (Mitsubishi M60016 Gate Array, 80 Pin PQFP @ U26) + OSC: 50MHz, 32.530MHz + Other: 8 Position Dipswitch x 2 + 93C46 EEPROM + +Memory: +M1 are TC551001BFL-70L at U56 & U57 +M2 is CY7C185-25PC at U27 +M3 are N341256P-20 + +PCB Number: P0-113A BP49KA ++---------------------------------------------------------------+ +| +------+ +---+ | +| VOL |Seta | M | | +---------------+| +| |X1-010| 2 | U | M |KA2-001-014 U19|| +| +------+ | 2 | 1 +---------------+| ++-+ | 8 | +---------------+| + | +-++-+ +-++-+ | | |KA2-001-013 U17|| ++-+ | || | | || | +---+ M +---------------+| +| |U||U| M |U||U| M 1 +---------------+| +|J |3||5| 3 |2||4| 3 | U15 || +|A | || | | || | +---------------+| +|M +-++-+ +-++-+ +---------------+| +|M |KA2-001-011 U20|| +|A +----------+ +---------------+| +| | | +---------------+| +|C | ALLUMER | |KA2-001-010 U18|| +|o +---+ | X1-020 | +---------------+| +|n | | +-------+ | | +---------------+| +|n | U | |Toshiba| | 9426HK003| | U16* || +|e C | 7 | | TMP | +----------+ +---------------+| +|c N | 7 | | 68301 | +---------------+| +|t 2 | | +-------+ |KA2-001-008 U23|| +|e +---+ +---------------+| +|r 93C46 +---------------+| +| |KA2-001-007 U22|| ++-+ 50MHz 32.530MHz +---------------+| + | +---------------+| + | P P | U21* || ++-+ C A A M M +---------------+| +| N DSW1 L L 3 3 | +| 1 DSW2 | ++---------------------------------------------------------------+ + +U2 is KA2 001 001 EPROM +U4 is KA2 001 002 EPROM +U5 is KA2 001 003 EPROM +U3 is KA2 001 004 EPROM +U28 is KA2-001-015 mask ROM (silkscreened SOUND ROM) +U15 is socketted to receive P1-106-1 daughtercard +U77 is socketted to receive P1-107-1 daughtercard +CN2 - 5 Pin header +CN1 - 10 Pin header +* Denotes not populated. + +The daughtercards below are NOT to scale with the above main board. + +P1-107-1 (additional RAM) ++-------------------------------+ +| LOGIC JP5 JP6 JP7| +| CXK58257AM-10L CXK58257AM-10L | +| +-----------------------+ | +| |U7 42 pin header to U77| | +| +-----------------------+ | ++-------------------------------+ + +Unknown LOGIC chip +JP5 - JP7 single wire connections for power + + +P1-106-1 ++-------------------------------+ +| HD74HC373P HD74HC373P | +| +-----------------------+ | +| |U3 42 pin header to U15| | +| +-----------------------+ | +| +-----------------------+ | +| | KA2-001-017 U2 | | +| +-----------------------+ | +| +-----------------------+ | +| | KA2-001-016 U1 | | +| +-----------------------+ | +|JP1 JP2 JP3 JP4 LOGIC | ++-------------------------------+ + +Unknown LOGIC chip +JP1 - JP4 single wire connections for power + ***************************************************************************/ -ROM_START( grdians ) +ROM_START( grdians ) /* P-FG01-1 */ ROM_REGION( 0x200000, "maincpu", 0 ) // TMP68301 Code ROM_LOAD16_BYTE( "u2.bin", 0x000000, 0x080000, CRC(36adc6f2) SHA1(544e87f88179fe1342e7a06a8948ac1828e85108) ) ROM_LOAD16_BYTE( "u3.bin", 0x000001, 0x080000, CRC(2704f416) SHA1(9081a12cbb9927d36e1c50b52aa2c6003810ee42) ) @@ -3203,56 +3334,83 @@ Banpresto, 1994 This game runs on Seta/Allumer hardware -PCB Layout ----------- - -P0-113A BP949KA -|----------------------------------| -| X1-010 6264 U28 | -| 581001 U19 | -| U3 U5 U2 U4 581001 U17 | -| 62256 62256 U15 | -|J U20 | -|A U77 68301 U18 | -|M * U16 | -|M 93C46 U23 | -|A U22 | -| U21 | -| DSW1 50MHz | -| DSW2 PAL 32.5304MHz | -| 20MHz PAL | -|----------------------------------| + CPU: Toshiba TMP68301AF-16 (100 Pin PQFP) + Video: Allumer X1-020 (208 Pin PQFP) + Sound: X1-010 (Mitsubishi M60016 Gate Array, 80 Pin PQFP @ U26) + OSC: 50MHz, 32.530MHz + Other: 8 Position Dipswitch x 2 + 93C46 EEPROM + +Memory: +M1 are TC551001BFL-70L at U56 & U57 +M2 is CY7C185-25PC at U27 +M3 are N341256P-20 + +PCB Number: P0-113A BP49KA ++--------------------------------------------------------------+ +| +------+ +---+ | +| VOL |Seta | M | | +--------------+| +| |X1-010| 2 | U | M |KA-001-014 U19|| +| +------+ | 2 | 1 +--------------+| ++-+ | 8 | +--------------+| + | +-++-+ +-++-+ | | |KA-001-013 U17|| ++-+ | || | | || | +---+ M +--------------+| +| |U||U| M |U||U| M 1 +--------------+| +|J |3||5| 3 |2||4| 3 |KA-001-012 U15|| +|A | || | | || | +--------------+| +|M +-++-+ +-++-+ +--------------+| +|M |KA-001-011 U20|| +|A +----------+ +--------------+| +| | | +--------------+| +|C | ALLUMER | |KA-001-010 U18|| +|o +---+ | X1-020 | +--------------+| +|n | | +-------+ | | +--------------+| +|n | U | |Toshiba| | 9426HK003| |KA-001-009 U16|| +|e C | 7 | | TMP | +----------+ +--------------+| +|c N | 7 | | 68301 | +--------------+| +|t 2 | | +-------+ |KA-001-008 U23|| +|e +---+ +--------------+| +|r 93C46 +--------------+| +| |KA-001-007 U22|| ++-+ 50MHz 32.530MHz +--------------+| + | +--------------+| + | P P |KA-001-006 U21|| ++-+ C A A M M +--------------+| +| N DSW1 L L 3 3 | +| 1 DSW2 | ++--------------------------------------------------------------+ + +U28 is KA-001-015 mask ROM (silkscreened SOUND ROM) +U77 is KA-001-005 mask ROM +CN2 - 5 Pin header +CN1 - 10 Pin header -Notes: - *: unknown QFP208 (has large heatsink on it). Should be similar to other known - graphics chips used on Seta hardware of this era. - 68301 clock: 16.000MHz (?? From what OSC + divider??) VSync: 60Hz ***************************************************************************/ ROM_START( gundamex ) ROM_REGION( 0x600000, "maincpu", 0 ) // TMP68301 Code - ROM_LOAD16_BYTE( "ka002002.u2", 0x000000, 0x080000, CRC(e850f6d8) SHA1(026325e305676b1f8d3d9e7573920f8b70d7bccb) ) - ROM_LOAD16_BYTE( "ka002004.u3", 0x000001, 0x080000, CRC(c0fb1208) SHA1(84b25e4c73cb8e023ee5dbf69f588be98700b43f) ) - ROM_LOAD16_BYTE( "ka002001.u4", 0x100000, 0x080000, CRC(553ebe6b) SHA1(7fb8a159513d31a1d60520ff14e4c4d133fd3e19) ) - ROM_LOAD16_BYTE( "ka002003.u5", 0x100001, 0x080000, CRC(946185aa) SHA1(524911c4c510d6c3e17a7ab42c7077c2fffbf06b) ) - ROM_LOAD16_WORD_SWAP( "ka001005.u77", 0x500000, 0x080000, CRC(f01d3d00) SHA1(ff12834e99a76261d619f10d186f4b329fb9cb7a) ) + ROM_LOAD16_BYTE( "ka_002_002.u2", 0x000000, 0x080000, CRC(e850f6d8) SHA1(026325e305676b1f8d3d9e7573920f8b70d7bccb) ) + ROM_LOAD16_BYTE( "ka_002_004.u3", 0x000001, 0x080000, CRC(c0fb1208) SHA1(84b25e4c73cb8e023ee5dbf69f588be98700b43f) ) + ROM_LOAD16_BYTE( "ka_002_001.u4", 0x100000, 0x080000, CRC(553ebe6b) SHA1(7fb8a159513d31a1d60520ff14e4c4d133fd3e19) ) + ROM_LOAD16_BYTE( "ka_002_003.u5", 0x100001, 0x080000, CRC(946185aa) SHA1(524911c4c510d6c3e17a7ab42c7077c2fffbf06b) ) + ROM_LOAD16_WORD_SWAP( "ka-001-005.u77", 0x500000, 0x080000, CRC(f01d3d00) SHA1(ff12834e99a76261d619f10d186f4b329fb9cb7a) ) ROM_REGION( 0x2000000, "sprites", ROMREGION_ERASE) // Sprites - ROM_LOAD( "ka001009.u16", 0x0000000, 0x200000, CRC(997d8d93) SHA1(4cb4cdb7e8208af4b14483610d9d6aa5e13acd89) ) - ROM_LOAD( "ka001010.u18", 0x0200000, 0x200000, CRC(811b67ca) SHA1(c8cfae6f54c76d63bd625ff011c872ffb75fd2e2) ) - ROM_LOAD( "ka001011.u20", 0x0400000, 0x200000, CRC(08a72700) SHA1(fb8003aa02dd249c30a757cb43b516260b41c1bf) ) - ROM_LOAD( "ka001012.u15", 0x0800000, 0x200000, CRC(b789e4a8) SHA1(400b773f24d677a9d47466fdbbe68cb6efc1ad37) ) - ROM_LOAD( "ka001013.u17", 0x0a00000, 0x200000, CRC(d8a0201f) SHA1(fe8a2407c872adde8aec8e9340b00be4f00a2872) ) - ROM_LOAD( "ka001014.u19", 0x0c00000, 0x200000, CRC(7635e026) SHA1(116a3daab14a17faca85c4a956b356aaf0fc2276) ) - ROM_LOAD( "ka001006.u21", 0x1000000, 0x200000, CRC(6aac2f2f) SHA1(fac5478ca2941a93c57f670a058ff626e537bcde) ) - ROM_LOAD( "ka001007.u22", 0x1200000, 0x200000, CRC(588f9d63) SHA1(ed5148d09d02e3bc12c50c39c5c86e6356b2dd7a) ) - ROM_LOAD( "ka001008.u23", 0x1400000, 0x200000, CRC(db55a60a) SHA1(03d118c7284ca86219891c473e2a89489710ea27) ) + ROM_LOAD( "ka-001-009.u16", 0x0000000, 0x200000, CRC(997d8d93) SHA1(4cb4cdb7e8208af4b14483610d9d6aa5e13acd89) ) + ROM_LOAD( "ka-001-010.u18", 0x0200000, 0x200000, CRC(811b67ca) SHA1(c8cfae6f54c76d63bd625ff011c872ffb75fd2e2) ) + ROM_LOAD( "ka-001-011.u20", 0x0400000, 0x200000, CRC(08a72700) SHA1(fb8003aa02dd249c30a757cb43b516260b41c1bf) ) + ROM_LOAD( "ka-001-012.u15", 0x0800000, 0x200000, CRC(b789e4a8) SHA1(400b773f24d677a9d47466fdbbe68cb6efc1ad37) ) + ROM_LOAD( "ka-001-013.u17", 0x0a00000, 0x200000, CRC(d8a0201f) SHA1(fe8a2407c872adde8aec8e9340b00be4f00a2872) ) + ROM_LOAD( "ka-001-014.u19", 0x0c00000, 0x200000, CRC(7635e026) SHA1(116a3daab14a17faca85c4a956b356aaf0fc2276) ) + ROM_LOAD( "ka-001-006.u21", 0x1000000, 0x200000, CRC(6aac2f2f) SHA1(fac5478ca2941a93c57f670a058ff626e537bcde) ) + ROM_LOAD( "ka-001-007.u22", 0x1200000, 0x200000, CRC(588f9d63) SHA1(ed5148d09d02e3bc12c50c39c5c86e6356b2dd7a) ) + ROM_LOAD( "ka-001-008.u23", 0x1400000, 0x200000, CRC(db55a60a) SHA1(03d118c7284ca86219891c473e2a89489710ea27) ) ROM_FILL( 0x1800000, 0x600000, 0x00 ) // 6bpp instead of 8bpp ROM_REGION( 0x200000, "x1snd", 0 ) // Samples - ROM_LOAD( "ka001015.u28", 0x000000, 0x200000, CRC(ada2843b) SHA1(09d06026031bc7558da511c3c0e29187ea0a0099) ) + ROM_LOAD( "ka-001-015.u28", 0x000000, 0x200000, CRC(ada2843b) SHA1(09d06026031bc7558da511c3c0e29187ea0a0099) ) ROM_REGION16_BE( 0x80, "eeprom", 0 ) ROM_LOAD( "eeprom.bin", 0x0000, 0x0080, CRC(80f8e248) SHA1(1a9787811e56d95f7acbedfb00225b6e7df265eb) ) @@ -4207,8 +4365,8 @@ ROM_END ROM_START( wschamp ) /* Wing Shooting Championship V2.00 (01/23/2002) */ ROM_REGION( 0x200000, "maincpu", 0 ) // TMP68301 Code - ROM_LOAD16_BYTE( "as1006e03.u06", 0x000000, 0x100000, CRC(0ad01677) SHA1(63e09b9f7cc8b781af1756f86caa0cc0962ae584) ) /* checksum 421E printed on label */ - ROM_LOAD16_BYTE( "as1007e03.u07", 0x000001, 0x100000, CRC(572624f0) SHA1(0c2f67daa22f4edd66a2be990dc6cd999faff0fa) ) /* checksum A48F printed on label */ + ROM_LOAD16_BYTE( "as1006e03.u06", 0x000000, 0x100000, CRC(0ad01677) SHA1(63e09b9f7cc8b781af1756f86caa0cc0962ae584) ) /* also commonly labeled as: WSC U6 Ver. 2.00 421E */ + ROM_LOAD16_BYTE( "as1007e03.u07", 0x000001, 0x100000, CRC(572624f0) SHA1(0c2f67daa22f4edd66a2be990dc6cd999faff0fa) ) /* also commonly labeled as: WSC U7 Ver. 2.00 A48F */ ROM_REGION( 0x2000000, "sprites", 0 ) // Sprites ROM_LOAD( "as1001m01.u38", 0x0000000, 0x800000, CRC(92595579) SHA1(75a7131aedb18b7103677340c3cca7c91aaca2bf) ) diff --git a/src/mame/drivers/sfkick.cpp b/src/mame/drivers/sfkick.cpp index 1e2eda5929e..025453b7c06 100644 --- a/src/mame/drivers/sfkick.cpp +++ b/src/mame/drivers/sfkick.cpp @@ -167,7 +167,6 @@ class sfkick_state : public driver_device public: sfkick_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_v9938(*this, "v9938"), m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), m_region_bios(*this, "bios"), @@ -215,7 +214,6 @@ private: int m_bank[8]; int m_input_mux; - required_device<v9938_device> m_v9938; required_device<cpu_device> m_maincpu; required_device<cpu_device> m_soundcpu; required_memory_region m_region_bios; @@ -486,7 +484,7 @@ void sfkick_state::sfkick_io_map(address_map &map) map.unmap_value_high(); map.global_mask(0xff); map(0xa0, 0xa7).w("soundlatch", FUNC(generic_latch_8_device::write)); - map(0x98, 0x9b).rw(m_v9938, FUNC(v9938_device::read), FUNC(v9938_device::write)); + map(0x98, 0x9b).rw("v9938", FUNC(v9938_device::read), FUNC(v9938_device::write)); map(0xa8, 0xab).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xb4, 0xb5).ram(); /* loopback ? req by sfkicka (MSX Bios leftover)*/ } @@ -605,9 +603,11 @@ MACHINE_CONFIG_START(sfkick_state::sfkick) MCFG_DEVICE_PROGRAM_MAP(sfkick_sound_map) MCFG_DEVICE_IO_MAP(sfkick_sound_io_map) - MCFG_V9938_ADD("v9938", "screen", 0x80000, MASTER_CLOCK) - MCFG_V99X8_INTERRUPT_CALLBACK(INPUTLINE("maincpu", 0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MASTER_CLOCK) + v9938_device &v9938(V9938(config, "v9938", MASTER_CLOCK)); + v9938.set_screen_ntsc("screen"); + v9938.set_vram_size(0x80000); + v9938.int_cb().set_inputline("maincpu", 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); i8255_device &ppi(I8255A(config, "ppi8255")); ppi.out_pa_callback().set(FUNC(sfkick_state::ppi_port_a_w)); diff --git a/src/mame/drivers/slapfght.cpp b/src/mame/drivers/slapfght.cpp index 3e77fcc367f..6f1d0d6841f 100644 --- a/src/mame/drivers/slapfght.cpp +++ b/src/mame/drivers/slapfght.cpp @@ -1923,39 +1923,46 @@ ROM_START( getstarj ) ROM_END ROM_START( getstarb1 ) - ROM_REGION( 0x18000, "maincpu", 0 ) /* Region 0 - main cpu code */ - ROM_LOAD( "gs_rb_1.bin", 0x00000, 0x4000, CRC(9afad7e0) SHA1(6b2e82a6b7fcbfed5f4d250959ecc571fdf0cbc2) ) - ROM_LOAD( "gs_rb_2.bin", 0x04000, 0x4000, CRC(5feb0a60) SHA1(b1300055180ddf6ca96475eb3a27a17722273fc6) ) - ROM_LOAD( "gs_rb_3.bin", 0x10000, 0x8000, CRC(e3cfb1ba) SHA1(bd21655c82a14e18ff9df4539c4d0bb2484c73f1) ) - - ROM_REGION( 0x10000, "audiocpu", 0 ) /* Region 3 - sound cpu code */ - ROM_LOAD( "a68-03", 0x00000, 0x2000, CRC(18daa44c) SHA1(1a3d22a186c591321d1b836ee30d89fba4771122) ) - - ROM_REGION( 0x04000, "gfx1", 0 ) /* Region 1 - temporary for gfx */ - /* these roms were in the set, but they're corrupt */ -// ROM_LOAD( "gs_rb_8.bin", 0x00000, 0x2000, CRC(a30aaf04) SHA1(2509554c3851a68eaec1cadc01f4d69c7aa2c09d) ) /* Chars */ -// ROM_LOAD( "gs_rb_7.bin", 0x02000, 0x2000, CRC(f47a93c6) SHA1(441fee1fb195bb2583d220f30dfcff617a31742a) ) - /* use the original roms instead */ - ROM_LOAD( "a68_05.bin", 0x00000, 0x2000, CRC(e3d409e7) SHA1(0b6be4767f110729f4dd1a472ef8d9a0c718b684) ) /* Chars */ - ROM_LOAD( "a68_04.bin", 0x02000, 0x2000, CRC(6e5ac9d4) SHA1(74f90b7a1ceb3b1c2fd92dff100d92dea0155530) ) - - - ROM_REGION( 0x20000, "gfx2", 0 ) /* Region 1 - temporary for gfx */ - ROM_LOAD( "a68_09", 0x00000, 0x8000, CRC(a293cc2e) SHA1(a2c2598e92982d13b51cbb6efb4b963142233433) ) /* Tiles */ - ROM_LOAD( "a68_08", 0x08000, 0x8000, CRC(37662375) SHA1(46ba8a3f0b553d476ecf431d0d20556896b4ca43) ) - ROM_LOAD( "a68_07", 0x10000, 0x8000, CRC(cf1a964c) SHA1(e9223c8d4f3bdafed193a1ded63e377f16f45e17) ) - ROM_LOAD( "a68_06", 0x18000, 0x8000, CRC(05f9eb9a) SHA1(a71640a63b259799086d361ef293aa26cec46a0c) ) - - ROM_REGION( 0x20000, "gfx3", 0 ) /* Region 1 - temporary for gfx */ - ROM_LOAD( "a68-13", 0x00000, 0x8000, CRC(643fb282) SHA1(d904d3c27c2b56341929c5eed4ea97e948c53c34) ) /* Sprites */ - ROM_LOAD( "a68-12", 0x08000, 0x8000, CRC(11f74e32) SHA1(02d8b4cc679f45a02c4989f2b62cde91b7418235) ) - ROM_LOAD( "a68-11", 0x10000, 0x8000, CRC(f24158cf) SHA1(db4c6b68a488b0798ea5f793ac8ced283a8ecab2) ) - ROM_LOAD( "a68-10", 0x18000, 0x8000, CRC(83161ed0) SHA1(a6aa28f22f487dc3a2ec07935e6d42bcdd1eff81) ) + ROM_REGION( 0x18000, "maincpu", 0 ) /* Region 0 - main cpu code */ + ROM_LOAD( "getstar_14_b.8p", 0x00000, 0x4000, CRC(9afad7e0) SHA1(6b2e82a6b7fcbfed5f4d250959ecc571fdf0cbc2) ) // gs_rb_1 // 27128 (matches the socket label) + ROM_LOAD( "getstar_13_b.8n", 0x04000, 0x4000, CRC(5feb0a60) SHA1(b1300055180ddf6ca96475eb3a27a17722273fc6) ) // gs_rb_2 // 27128 (matches the socket label) + ROM_LOAD( "getstar_12_b.8k", 0x10000, 0x8000, CRC(e3cfb1ba) SHA1(bd21655c82a14e18ff9df4539c4d0bb2484c73f1) ) // gs_rb_3 // 27256 (The socket is labeled as 27128) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Region 3 - sound cpu code */ + ROM_LOAD( "getstar_5_a.12e", 0x00000, 0x2000, CRC(18daa44c) SHA1(1a3d22a186c591321d1b836ee30d89fba4771122) ) // a68-03 // 2764 (matches the socket label) + + ROM_REGION( 0x04000, "gfx1", 0 ) /* Region 1 - temporary for gfx */ /* Chars */ /* Verified on new bootleg PCB found */ + ROM_LOAD( "getstar_7_b.6f", 0x00000, 0x2000, CRC(e3d409e7) SHA1(0b6be4767f110729f4dd1a472ef8d9a0c718b684) ) // 2764 (matches the socket label) + ROM_LOAD( "getstar_8_b.6g", 0x02000, 0x2000, CRC(6e5ac9d4) SHA1(74f90b7a1ceb3b1c2fd92dff100d92dea0155530) ) // 2764 (matches the socket label) + + ROM_REGION( 0x20000, "gfx2", 0 ) /* Region 1 - temporary for gfx */ /* Tiles */ + ROM_LOAD( "getstar_6_b.4m", 0x00000, 0x8000, CRC(a293cc2e) SHA1(a2c2598e92982d13b51cbb6efb4b963142233433) ) // a68_09 // 27256 (the socket is labeled as 27128) + ROM_LOAD( "getstar_9_b.6m", 0x08000, 0x8000, CRC(37662375) SHA1(46ba8a3f0b553d476ecf431d0d20556896b4ca43) ) // a68_08 // 27256 (The socket is labeled as 27128) + ROM_LOAD( "getstar_10_b.6n", 0x10000, 0x8000, CRC(cf1a964c) SHA1(e9223c8d4f3bdafed193a1ded63e377f16f45e17) ) // a68_07 // 27256 (The socket is labeled as 27128) + ROM_LOAD( "getstar_11_b.6p", 0x18000, 0x8000, CRC(05f9eb9a) SHA1(a71640a63b259799086d361ef293aa26cec46a0c) ) // a68_06 // 27256 (The socket is labeled as 27128) + + ROM_REGION( 0x20000, "gfx3", 0 ) /* Region 1 - temporary for gfx */ /* Sprites */ + ROM_LOAD( "getstar_4_a.8j", 0x00000, 0x8000, CRC(643fb282) SHA1(d904d3c27c2b56341929c5eed4ea97e948c53c34) ) // a68-13 // 27256 (the socket is labeled as 27128) + ROM_LOAD( "getstar_2_a.7j", 0x08000, 0x8000, CRC(11f74e32) SHA1(02d8b4cc679f45a02c4989f2b62cde91b7418235) ) // a68-12 // 27256 (the socket is labeled as 27128) + ROM_LOAD( "getstar_3_a.8h", 0x10000, 0x8000, CRC(f24158cf) SHA1(db4c6b68a488b0798ea5f793ac8ced283a8ecab2) ) // a68-11 // 27256 (the socket is labeled as 27128) + ROM_LOAD( "getstar_1_a.7h", 0x18000, 0x8000, CRC(83161ed0) SHA1(a6aa28f22f487dc3a2ec07935e6d42bcdd1eff81) ) // a68-10 // 27256 (the socket is labeled as 27128) ROM_REGION( 0x0300, "proms", 0 ) - ROM_LOAD( "rom21", 0x0000, 0x0100, CRC(d6360b4d) SHA1(3e64548c82a3378fc091e104cdc2b0c7e592fc44) ) - ROM_LOAD( "rom20", 0x0100, 0x0100, CRC(4ca01887) SHA1(2892c89d5e60f1d10593adffff55c1a9654e8209) ) - ROM_LOAD( "rom19", 0x0200, 0x0100, CRC(513224f0) SHA1(15b34612206138f6fc5f7478925b1fff2ed56aa8) ) + ROM_LOAD( "getstar_p7_a.12q", 0x0000, 0x0100, CRC(d6360b4d) SHA1(3e64548c82a3378fc091e104cdc2b0c7e592fc44) ) // rom21 // 82S129N (matches the socket label) + ROM_LOAD( "getstar_p5_a.12m", 0x0100, 0x0100, CRC(4ca01887) SHA1(2892c89d5e60f1d10593adffff55c1a9654e8209) ) // rom20 // 82S129N (matches the socket label) + ROM_LOAD( "getstar_p6_a.12n", 0x0200, 0x0100, CRC(35eefbbb) SHA1(b885938cc7ef322b354a0d60f9c7614686bb33ea) ) // rom19 //82S129N (matches the socket label) + + /* Unused. Weren't on the first dump, but verified to be on the PCB */ + ROM_REGION( 0x0500, "proms2", 0 ) + ROM_LOAD( "getstar_p1_a.1c", 0x0000, 0x0100, CRC(d492e6c2) SHA1(5789adda3a63ef8656ebd012416fcf3f991241fe) ) // 82S129N (matches the socket label) + ROM_LOAD( "getstar_p2_a.1e", 0x0100, 0x0100, CRC(59490887) SHA1(c894edecbcfc67972ad893cd7c8197d07862a20a) ) // 82S129N (matches the socket label) + ROM_LOAD( "getstar_p3_a.2b", 0x0200, 0x0020, CRC(aa0ca5a5) SHA1(4c45be71658f40ebb05634febba5822f1a8a7f79) ) // 82S123N (matches the socket label) + ROM_LOAD( "getstar_p8_b.2c", 0x0300, 0x0100, CRC(4dc04453) SHA1(524e5a212ab496c52adc0def995b75e89aba48e7) ) // 82S129N (matches the socket label) + ROM_LOAD( "getstar_p9_b.8b", 0x0400, 0x0100, CRC(48ac3db4) SHA1(6a73fe21529bc760b8df1893aee9e89fb60976eb) ) // 82S129N (matches the socket label) + + /* Unused, but verified to be on the PCB */ + ROM_REGION( 0x0200, "plds", 0 ) + ROM_LOAD( "getstar_p4_a.2e", 0x0000, 0x0104, NO_DUMP ) // PAL16R4ACN - Protected ROM_END ROM_START( getstarb2 ) diff --git a/src/mame/drivers/sothello.cpp b/src/mame/drivers/sothello.cpp index 684a253c610..2c1d6a33211 100644 --- a/src/mame/drivers/sothello.cpp +++ b/src/mame/drivers/sothello.cpp @@ -54,7 +54,6 @@ public: m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), m_subcpu(*this, "subcpu"), - m_v9938(*this, "v9938"), m_msm(*this, "msm"), m_mainbank(*this, "mainbank") { } @@ -96,7 +95,6 @@ private: required_device<cpu_device> m_maincpu; required_device<cpu_device> m_soundcpu; required_device<cpu_device> m_subcpu; - required_device<v9938_device> m_v9938; required_device<msm5205_device> m_msm; required_memory_bank m_mainbank; }; @@ -189,7 +187,7 @@ void sothello_state::maincpu_io_map(address_map &map) map(0x50, 0x50).w(FUNC(sothello_state::bank_w)); map(0x60, 0x61).mirror(0x02).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); /* not sure, but the A1 line is ignored, code @ $8b8 */ - map(0x70, 0x73).rw(m_v9938, FUNC(v9938_device::read), FUNC(v9938_device::write)); + map(0x70, 0x73).rw("v9938", FUNC(v9938_device::read), FUNC(v9938_device::write)); } /* sound Z80 */ @@ -373,9 +371,11 @@ MACHINE_CONFIG_START(sothello_state::sothello) MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* video hardware */ - MCFG_V9938_ADD("v9938", "screen", VDP_MEM, XTAL(21'477'272)) - MCFG_V99X8_INTERRUPT_CALLBACK(INPUTLINE("maincpu", 0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", XTAL(21'477'272)) + v9938_device &v9938(V9938(config, "v9938", XTAL(21'477'272))); + v9938.set_screen_ntsc("screen"); + v9938.set_vram_size(VDP_MEM); + v9938.int_cb().set_inputline("maincpu", 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "mono").front_center(); diff --git a/src/mame/drivers/sshangha.cpp b/src/mame/drivers/sshangha.cpp index 4187993a9b8..cf97d40a778 100644 --- a/src/mame/drivers/sshangha.cpp +++ b/src/mame/drivers/sshangha.cpp @@ -10,11 +10,6 @@ Emulation by Bryan McPhail, mish@tendril.co.uk + Charles MacDonald, David Haywood - ToDo: - - Palette handling is somewhat hacked, see paletteram16_xbgr_word_be_sprites_w - - check this on the original set - ---- Stephh's notes (based on the games M68000 code and some tests) : @@ -88,7 +83,6 @@ HB-PCB-A5 M6100691A (distributed by Taito) #include "cpu/m68000/m68000.h" #include "sound/2203intf.h" #include "sound/okim6295.h" -#include "machine/deco146.h" #include "screen.h" #include "speaker.h" @@ -102,7 +96,7 @@ HB-PCB-A5 M6100691A (distributed by Taito) -READ16_MEMBER(sshangha_state::sshanghb_protection16_r) // bootleg inputs +READ16_MEMBER(sshangha_state::sshanghab_protection16_r) // bootleg inputs { switch (offset) { @@ -123,11 +117,6 @@ READ16_MEMBER(sshangha_state::deco_71_r) return 0xffff; } -/******************************************************************************/ - -void sshangha_state::machine_reset() -{ -} /******************************************************************************/ @@ -167,7 +156,7 @@ WRITE16_MEMBER( sshangha_state::sshangha_protection_region_8_146_w ) /* - Swizzzle palette writes a bit so that the 'tilemap_12_combine_draw' code in the tilemap device works with this game (used for girl, see attract mode) + Swizzle palette writes a bit so that the 'tilemap_12_combine_draw' code in the tilemap device works with this game (used for girl, see attract mode) Normal Palette layout @@ -214,22 +203,22 @@ void sshangha_state::sshangha_map(address_map &map) { map.global_mask(0x3fffff); map(0x000000, 0x03ffff).rom(); - map(0x100000, 0x10000f).ram().share("sound_shared"); + map(0x100000, 0x10000f).ram().share(m_sound_shared_ram); - map(0x200000, 0x201fff).rw(m_deco_tilegen1, FUNC(deco16ic_device::pf1_data_r), FUNC(deco16ic_device::pf1_data_w)); - map(0x202000, 0x203fff).rw(m_deco_tilegen1, FUNC(deco16ic_device::pf2_data_r), FUNC(deco16ic_device::pf2_data_w)); - map(0x204000, 0x2047ff).ram().share("pf1_rowscroll"); - map(0x206000, 0x2067ff).ram().share("pf2_rowscroll"); + map(0x200000, 0x201fff).rw(m_tilegen, FUNC(deco16ic_device::pf1_data_r), FUNC(deco16ic_device::pf1_data_w)); + map(0x202000, 0x203fff).rw(m_tilegen, FUNC(deco16ic_device::pf2_data_r), FUNC(deco16ic_device::pf2_data_w)); + map(0x204000, 0x2047ff).ram().share(m_pf1_rowscroll); + map(0x206000, 0x2067ff).ram().share(m_pf2_rowscroll); map(0x206800, 0x207fff).ram(); - map(0x300000, 0x30000f).w(m_deco_tilegen1, FUNC(deco16ic_device::pf_control_w)); - map(0x320000, 0x320001).w(FUNC(sshangha_state::sshangha_video_w)); + map(0x300000, 0x30000f).w(m_tilegen, FUNC(deco16ic_device::pf_control_w)); + map(0x320000, 0x320001).w(FUNC(sshangha_state::video_w)); map(0x320002, 0x320005).nopw(); map(0x320006, 0x320007).nopr(); //irq ack - map(0x340000, 0x3407ff).mirror(0x800).ram().share("spriteram2"); + map(0x340000, 0x3407ff).mirror(0x800).ram().share(m_spriteram2); map(0x350000, 0x350001).r(FUNC(sshangha_state::deco_71_r)); map(0x350000, 0x350007).nopw(); - map(0x360000, 0x3607ff).mirror(0x800).ram().share("spriteram"); + map(0x360000, 0x3607ff).mirror(0x800).ram().share(m_spriteram); map(0x370000, 0x370001).r(FUNC(sshangha_state::deco_71_r)); map(0x370000, 0x370007).nopw(); @@ -237,22 +226,22 @@ void sshangha_state::sshangha_map(address_map &map) map(0x381000, 0x383fff).ram(); // unused palette area map(0x3e0000, 0x3e3fff).rw(FUNC(sshangha_state::sshangha_protection_region_8_146_r), FUNC(sshangha_state::sshangha_protection_region_8_146_w)); map(0x3ec000, 0x3f3fff).ram(); - map(0x3f4000, 0x3f7fff).rw(FUNC(sshangha_state::sshangha_protection_region_d_146_r), FUNC(sshangha_state::sshangha_protection_region_d_146_w)).share("prot_data"); + map(0x3f4000, 0x3f7fff).rw(FUNC(sshangha_state::sshangha_protection_region_d_146_r), FUNC(sshangha_state::sshangha_protection_region_d_146_w)).share(m_prot_data); } -void sshangha_state::sshanghb_map(address_map &map) +void sshangha_state::sshanghab_map(address_map &map) { map(0x000000, 0x03ffff).rom(); - map(0x084000, 0x0847ff).r(FUNC(sshangha_state::sshanghb_protection16_r)); - map(0x101000, 0x10100f).ram().share("sound_shared"); /* the bootleg writes here */ + map(0x084000, 0x0847ff).r(FUNC(sshangha_state::sshanghab_protection16_r)); + map(0x101000, 0x10100f).ram().share(m_sound_shared_ram); /* the bootleg writes here */ - map(0x200000, 0x201fff).rw(m_deco_tilegen1, FUNC(deco16ic_device::pf1_data_r), FUNC(deco16ic_device::pf1_data_w)); - map(0x202000, 0x203fff).rw(m_deco_tilegen1, FUNC(deco16ic_device::pf2_data_r), FUNC(deco16ic_device::pf2_data_w)); - map(0x204000, 0x2047ff).ram().share("pf1_rowscroll"); - map(0x206000, 0x2067ff).ram().share("pf2_rowscroll"); + map(0x200000, 0x201fff).rw(m_tilegen, FUNC(deco16ic_device::pf1_data_r), FUNC(deco16ic_device::pf1_data_w)); + map(0x202000, 0x203fff).rw(m_tilegen, FUNC(deco16ic_device::pf2_data_r), FUNC(deco16ic_device::pf2_data_w)); + map(0x204000, 0x2047ff).ram().share(m_pf1_rowscroll); + map(0x206000, 0x2067ff).ram().share(m_pf2_rowscroll); map(0x206800, 0x207fff).ram(); - map(0x300000, 0x30000f).w(m_deco_tilegen1, FUNC(deco16ic_device::pf_control_w)); - map(0x320000, 0x320001).w(FUNC(sshangha_state::sshangha_video_w)); + map(0x300000, 0x30000f).w(m_tilegen, FUNC(deco16ic_device::pf_control_w)); + map(0x320000, 0x320001).w(FUNC(sshangha_state::video_w)); map(0x320002, 0x320005).nopw(); map(0x320006, 0x320007).nopr(); //irq ack @@ -261,8 +250,8 @@ void sshangha_state::sshanghb_map(address_map &map) map(0x380000, 0x380fff).ram().rw(FUNC(sshangha_state::palette_r),FUNC(sshangha_state::palette_w)).share("palette"); map(0x381000, 0x383fff).ram(); // unused palette area - map(0x3c0000, 0x3c07ff).ram().share("spriteram"); // bootleg spriteram - map(0x3c0800, 0x3c0fff).ram().share("spriteram2"); + map(0x3c0000, 0x3c07ff).ram().share(m_spriteram); // bootleg spriteram + map(0x3c0800, 0x3c0fff).ram().share(m_spriteram2); map(0xfec000, 0xff3fff).ram(); map(0xff4000, 0xff47ff).ram(); @@ -272,23 +261,23 @@ void sshangha_state::sshanghb_map(address_map &map) /* 8 "sound latches" shared between main and sound cpus. */ -READ8_MEMBER(sshangha_state::sshangha_sound_shared_r) +READ8_MEMBER(sshangha_state::sound_shared_r) { return m_sound_shared_ram[offset] & 0xff; } -WRITE8_MEMBER(sshangha_state::sshangha_sound_shared_w) +WRITE8_MEMBER(sshangha_state::sound_shared_w) { m_sound_shared_ram[offset] = data & 0xff; } /* Note: there's rom data after 0x8000 but the game never seem to call a rom bank, left-over? */ -void sshangha_state::sshangha_sound_map(address_map &map) +void sshangha_state::sound_map(address_map &map) { map(0x0000, 0x7fff).rom(); map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); map(0xc200, 0xc201).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0xf800, 0xf807).rw(FUNC(sshangha_state::sshangha_sound_shared_r), FUNC(sshangha_state::sshangha_sound_shared_w)); + map(0xf800, 0xf807).rw(FUNC(sshangha_state::sound_shared_r), FUNC(sshangha_state::sound_shared_w)); map(0xf808, 0xffff).ram(); } @@ -420,79 +409,81 @@ DECO16IC_BANK_CB_MEMBER(sshangha_state::bank_callback) return (bank >> 4) * 0x1000; } -MACHINE_CONFIG_START(sshangha_state::sshangha) - +void sshangha_state::sshangha(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68000, 16_MHz_XTAL) /* CPU marked as 16MHz part */ - MCFG_DEVICE_PROGRAM_MAP(sshangha_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sshangha_state, irq6_line_hold) - - MCFG_DEVICE_ADD("audiocpu", Z80, 16_MHz_XTAL / 4) - MCFG_DEVICE_PROGRAM_MAP(sshangha_sound_map) + M68000(config, m_maincpu, 16_MHz_XTAL); /* CPU marked as 16MHz part */ + m_maincpu->set_addrmap(AS_PROGRAM, &sshangha_state::sshangha_map); + m_maincpu->set_vblank_int("screen", FUNC(sshangha_state::irq6_line_hold)); - MCFG_QUANTUM_TIME(attotime::from_hz(6000)) + Z80(config, m_audiocpu, 16_MHz_XTAL / 4); + m_audiocpu->set_addrmap(AS_PROGRAM, &sshangha_state::sound_map); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_SIZE(40*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE_DRIVER(sshangha_state, screen_update_sshangha) - - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_sshangha) - MCFG_PALETTE_ADD("palette", 0x4000) - MCFG_PALETTE_FORMAT(XBGR) - - MCFG_DEVICE_ADD("tilegen1", DECO16IC, 0) - MCFG_DECO16IC_SPLIT(0) - MCFG_DECO16IC_PF1_SIZE(DECO_64x32) - MCFG_DECO16IC_PF2_SIZE(DECO_64x32) - MCFG_DECO16IC_PF1_TRANS_MASK(0x0f) - MCFG_DECO16IC_PF2_TRANS_MASK(0x0f) - MCFG_DECO16IC_PF1_COL_BANK(0x30) - MCFG_DECO16IC_PF2_COL_BANK(0x20) - MCFG_DECO16IC_PF1_COL_MASK(0x0f) - MCFG_DECO16IC_PF2_COL_MASK(0x0f) - MCFG_DECO16IC_BANK1_CB(sshangha_state, bank_callback) - MCFG_DECO16IC_BANK2_CB(sshangha_state, bank_callback) - MCFG_DECO16IC_PF12_8X8_BANK(0) - MCFG_DECO16IC_PF12_16X16_BANK(1) - MCFG_DECO16IC_GFXDECODE("gfxdecode") - - MCFG_DEVICE_ADD("spritegen1", DECO_SPRITE, 0) - MCFG_DECO_SPRITE_GFX_REGION(2) - MCFG_DECO_SPRITE_GFXDECODE("gfxdecode") - - MCFG_DEVICE_ADD("spritegen2", DECO_SPRITE, 0) - MCFG_DECO_SPRITE_GFX_REGION(3) - MCFG_DECO_SPRITE_GFXDECODE("gfxdecode") - - MCFG_DECO146_ADD("ioprot") - MCFG_DECO146_IN_PORTA_CB(IOPORT("INPUTS")) - MCFG_DECO146_IN_PORTB_CB(IOPORT("SYSTEM")) - MCFG_DECO146_IN_PORTC_CB(IOPORT("DSW")) + config.m_minimum_quantum = attotime::from_hz(6000); + + screen_device& screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(529)); + screen.set_size(40*8, 32*8); + screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1); + screen.set_screen_update(FUNC(sshangha_state::screen_update)); + + GFXDECODE(config, "gfxdecode", m_palette, gfx_sshangha); + + PALETTE(config, m_palette, 0x4000).set_format(PALETTE_FORMAT_XBGR); + + DECO16IC(config, m_tilegen, 0); + m_tilegen->set_split(0); + m_tilegen->set_pf1_size(DECO_64x32); + m_tilegen->set_pf2_size(DECO_64x32); + m_tilegen->set_pf1_trans_mask(0x0f); + m_tilegen->set_pf2_trans_mask(0x0f); + m_tilegen->set_pf1_col_bank(0x30); + m_tilegen->set_pf2_col_bank(0x20); + m_tilegen->set_pf1_col_mask(0x0f); + m_tilegen->set_pf2_col_mask(0x0f); + m_tilegen->set_bank1_callback(FUNC(sshangha_state::bank_callback), this); + m_tilegen->set_bank2_callback(FUNC(sshangha_state::bank_callback), this); + m_tilegen->set_pf12_8x8_bank(0); + m_tilegen->set_pf12_16x16_bank(1); + m_tilegen->set_gfxdecode_tag("gfxdecode"); + + DECO_SPRITE(config, m_sprgen1, 0); + m_sprgen1->set_gfx_region(2); + m_sprgen1->set_gfxdecode_tag("gfxdecode"); + + DECO_SPRITE(config, m_sprgen2, 0); + m_sprgen2->set_gfx_region(3); + m_sprgen2->set_gfxdecode_tag("gfxdecode"); + + DECO146PROT(config, m_deco146, 0); + m_deco146->port_a_cb().set_ioport("INPUTS"); + m_deco146->port_b_cb().set_ioport("SYSTEM"); + m_deco146->port_c_cb().set_ioport("DSW"); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); // sure it's stereo? SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("ymsnd", YM2203, 16_MHz_XTAL / 4) - MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.33) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.33) + ym2203_device &ymsnd(YM2203(config, "ymsnd", 16_MHz_XTAL / 4)); + ymsnd.irq_handler().set_inputline(m_audiocpu, 0); + ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.33); + ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.33); - MCFG_DEVICE_ADD("oki", OKIM6295, 16_MHz_XTAL / 8, okim6295_device::PIN7_LOW) // clock frequency & pin 7 not verified - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.27) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.27) -MACHINE_CONFIG_END + okim6295_device &oki(OKIM6295(config, "oki", 16_MHz_XTAL / 8, okim6295_device::PIN7_LOW)); // clock frequency & pin 7 not verified + oki.add_route(ALL_OUTPUTS, "lspeaker", 0.27); + oki.add_route(ALL_OUTPUTS, "rspeaker", 0.27); +} -MACHINE_CONFIG_START(sshangha_state::sshanghb) +void sshangha_state::sshanghab(machine_config &config) +{ sshangha(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(sshanghb_map) -MACHINE_CONFIG_END + m_maincpu->set_addrmap(AS_PROGRAM, &sshangha_state::sshanghab_map); + + config.device_remove("ioprot"); +} /******************************************************************************/ @@ -588,6 +579,6 @@ void sshangha_state::init_sshangha() } -GAME( 1992, sshangha, 0, sshangha, sshangha, sshangha_state, init_sshangha, ROT0, "Hot-B", "Super Shanghai Dragon's Eye (World)", 0 ) -GAME( 1992, sshanghaj, sshangha, sshangha, sshangha, sshangha_state, init_sshangha, ROT0, "Hot-B", "Super Shanghai Dragon's Eye (Japan)", 0 ) -GAME( 1992, sshanghab, sshangha, sshanghb, sshangha, sshangha_state, init_sshangha, ROT0, "bootleg", "Super Shanghai Dragon's Eye (World, bootleg)", 0 ) +GAME( 1992, sshangha, 0, sshangha, sshangha, sshangha_state, init_sshangha, ROT0, "Hot-B", "Super Shanghai Dragon's Eye (World)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, sshanghaj, sshangha, sshangha, sshangha, sshangha_state, init_sshangha, ROT0, "Hot-B", "Super Shanghai Dragon's Eye (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, sshanghab, sshangha, sshanghab, sshangha, sshangha_state, init_sshangha, ROT0, "bootleg", "Super Shanghai Dragon's Eye (World, bootleg)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/statriv2.cpp b/src/mame/drivers/statriv2.cpp index ce1a3e5d27b..4cbb3a179ef 100644 --- a/src/mame/drivers/statriv2.cpp +++ b/src/mame/drivers/statriv2.cpp @@ -630,8 +630,7 @@ MACHINE_CONFIG_START(statriv2_state::statriv2) MCFG_SCREEN_UPDATE_DRIVER(statriv2_state, screen_update_statriv2) MCFG_SCREEN_PALETTE("palette") - MCFG_DEVICE_ADD("tms", TMS9927, MASTER_CLOCK/2/8) - MCFG_TMS9927_CHAR_WIDTH(8) + TMS9927(config, m_tms, MASTER_CLOCK/2/8).set_char_width(8); MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_horizontal) MCFG_PALETTE_ADD("palette", 2*64) diff --git a/src/mame/drivers/su2000.cpp b/src/mame/drivers/su2000.cpp index 7c9c9aa3f4e..3fc8bdac1d4 100644 --- a/src/mame/drivers/su2000.cpp +++ b/src/mame/drivers/su2000.cpp @@ -152,10 +152,9 @@ MACHINE_CONFIG_START(su2000_state::su2000) pcat_common(config); - MCFG_DEVICE_REMOVE("rtc") - MCFG_DS12885_ADD("rtc") - MCFG_MC146818_IRQ_HANDLER(WRITELINE("pic8259_2", pic8259_device, ir0_w)) - MCFG_MC146818_CENTURY_INDEX(0x32) + DS12885(config.replace(), m_mc146818); // TODO: Rename m_mc146818 to m_rtc + m_mc146818->irq().set("pic8259_2", FUNC(pic8259_device::ir0_w)); + m_mc146818->set_century_index(0x32); MACHINE_CONFIG_END diff --git a/src/mame/drivers/sun2.cpp b/src/mame/drivers/sun2.cpp index f0f0ff53661..2576bd8fbff 100644 --- a/src/mame/drivers/sun2.cpp +++ b/src/mame/drivers/sun2.cpp @@ -733,10 +733,10 @@ ROM_START( sun2_120 ) // ROMs are located on the '501-1007' CPU PCB at locations //ROM_SYSTEM_BIOS( 8, "revq", "Bootrom Rev Q") // ROMX_LOAD( "520-1104-02.b11", 0x0000, 0x4000, NO_DUMP, ROM_SKIP(1) | ROM_BIOS(8)) // ROMX_LOAD( "520-1103-02.b10", 0x0001, 0x4000, NO_DUMP, ROM_SKIP(1) | ROM_BIOS(8)) - ROM_SYSTEM_BIOS(2, "revn", "Bootrom Rev N") // SunOS 2.0 requires this bootrom version at a minimum + ROM_SYSTEM_BIOS( 2, "revn", "Bootrom Rev N") // SunOS 2.0 requires this bootrom version at a minimum; this version supports the sun-2 keyboard ROMX_LOAD("revn.b11", 0x0000, 0x4000, CRC(b1e70965) SHA1(726b3ed9323750a1ae238cf6dccaed6ff5981ad1), ROM_SKIP(1) | ROM_BIOS(2)) // actual rom stickers had fallen off ROMX_LOAD("revn.b10", 0x0001, 0x4000, CRC(95fd9242) SHA1(1eee2d291f4b18f6aafdde1a9521d88e454843b9), ROM_SKIP(1) | ROM_BIOS(2)) // " - ROM_SYSTEM_BIOS(3, "revm", "Bootrom Rev M") // SunOS 1.0 apparently requires this bootrom revision? + ROM_SYSTEM_BIOS( 3, "revm", "Bootrom Rev M") // SunOS 1.0 apparently requires this bootrom revision; this version might only support the sun-1 keyboard? ROMX_LOAD("sun2-revm-8.b11", 0x0000, 0x4000, CRC(98b8ae55) SHA1(55485f4d8fd1ebc218aa8527c8bb62752c34abf7), ROM_SKIP(1) | ROM_BIOS(3)) // handwritten label: "SUN2-RevM-8" ROMX_LOAD("sun2-revm-0.b10", 0x0001, 0x4000, CRC(5117f431) SHA1(fce85c11ada1614152dde35bb329350f6fb2ecd9), ROM_SKIP(1) | ROM_BIOS(3)) // handwritten label: "SUN2-RevM-0" diff --git a/src/mame/drivers/sun4.cpp b/src/mame/drivers/sun4.cpp index fec52c0a6c8..d605f5963af 100644 --- a/src/mame/drivers/sun4.cpp +++ b/src/mame/drivers/sun4.cpp @@ -413,7 +413,10 @@ #include "bus/rs232/rs232.h" #include "bus/sunkbd/sunkbd.h" +#include "bus/sbus/sbus.h" +#include "bus/sbus/bwtwo.h" #include "cpu/sparc/sparc.h" +#include "machine/am79c90.h" #include "machine/bankdev.h" #include "machine/ncr5390.h" #include "machine/nscsi_bus.h" @@ -422,7 +425,6 @@ #include "machine/nvram.h" #include "machine/ram.h" #include "machine/timekpr.h" -#include "machine/timekpr.h" #include "machine/upd765.h" #include "machine/z80scc.h" @@ -434,7 +436,6 @@ #include "formats/mfi_dsk.h" #include "formats/pc_dsk.h" - #define SUN4_LOG_FCODES (0) #define TIMEKEEPER_TAG "timekpr" @@ -444,6 +445,7 @@ #define RS232A_TAG "rs232a" #define RS232B_TAG "rs232b" #define FDC_TAG "fdc" +#define LANCE_TAG "lance" #define ENA_NOTBOOT (0x80) #define ENA_SDVMA (0x20) @@ -540,19 +542,22 @@ public: , m_scc1(*this, SCC1_TAG) , m_scc2(*this, SCC2_TAG) , m_fdc(*this, FDC_TAG) + , m_lance(*this, LANCE_TAG) , m_scsibus(*this, "scsibus") - , m_scsi(*this, "scsibus:7:ncr5390") + , m_scsi(*this, "scsibus:7:ncr53c90a") + , m_sbus(*this, "sbus") , m_type0space(*this, "type0") , m_type1space(*this, "type1") , m_ram(*this, RAM_TAG) , m_rom(*this, "user1") - , m_bw2_vram(*this, "bw2_vram") , m_rom_ptr(nullptr) , m_system_enable(0) { } void sun4c(machine_config &config); + void sun4_40(machine_config &config); + void sun4_60(machine_config &config); void sun4(machine_config &config); void init_sun4(); @@ -575,6 +580,8 @@ private: DECLARE_READ32_MEMBER( ram_r ); DECLARE_WRITE32_MEMBER( ram_w ); DECLARE_READ32_MEMBER( ss1_sl0_id ); + DECLARE_READ32_MEMBER( ss1_sl1_id ); + DECLARE_READ32_MEMBER( ss1_sl2_id ); DECLARE_READ32_MEMBER( ss1_sl3_id ); DECLARE_READ32_MEMBER( timer_r ); DECLARE_WRITE32_MEMBER( timer_w ); @@ -584,6 +591,9 @@ private: DECLARE_WRITE8_MEMBER( fdc_w ); DECLARE_READ32_MEMBER( dma_r ); DECLARE_WRITE32_MEMBER( dma_w ); + DECLARE_READ32_MEMBER( lance_dma_r ); // TODO: Should be 16 bits + DECLARE_WRITE32_MEMBER( lance_dma_w ); + DECLARE_WRITE32_MEMBER( buserr_w ); DECLARE_WRITE_LINE_MEMBER( scsi_irq ); DECLARE_WRITE_LINE_MEMBER( scsi_drq ); @@ -593,16 +603,21 @@ private: DECLARE_FLOPPY_FORMATS( floppy_formats ); - uint32_t bw2_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - - void ncr5390(device_t *device); + void ncr53c90a(device_t *device); void sun4_mem(address_map &map); void sun4c_mem(address_map &map); void type0space_map(address_map &map); void type1space_map(address_map &map); + void type1space_sbus_map(address_map &map); void type1space_s4_map(address_map &map); + enum sun4_arch + { + SUN4 = 0, + SUN4C = 1 + }; + required_device<mb86901_device> m_maincpu; required_device<mk48t12_device> m_timekpr; @@ -611,13 +626,15 @@ private: required_device<z80scc_device> m_scc2; required_device<n82077aa_device> m_fdc; + required_device<am79c90_device> m_lance; required_device<nscsi_bus_device> m_scsibus; - required_device<ncr5390_device> m_scsi; + required_device<ncr53c90a_device> m_scsi; - optional_device<address_map_bank_device> m_type0space, m_type1space; + optional_device<sbus_device> m_sbus; + optional_device<address_map_bank_device> m_type0space; + optional_device<address_map_bank_device> m_type1space; required_device<ram_device> m_ram; required_memory_region m_rom; - optional_shared_ptr<uint32_t> m_bw2_vram; uint32_t *m_rom_ptr; uint32_t m_context; @@ -625,6 +642,7 @@ private: uint32_t m_buserr[4]; uint32_t m_counter[4]; uint32_t m_dma[4]; + bool m_dma_irq; bool m_dma_tc_read; uint32_t m_dma_pack_register; int m_scsi_irq; @@ -661,35 +679,6 @@ private: void fcodes_command(int ref, const std::vector<std::string> ¶ms); }; -uint32_t sun4_state::bw2_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - uint32_t *scanline; - int x, y; - uint8_t pixels; - static const uint32_t palette[2] = { 0xffffff, 0 }; - uint8_t *m_vram = (uint8_t *)m_bw2_vram.target(); - - for (y = 0; y < 900; y++) - { - scanline = &bitmap.pix32(y); - for (x = 0; x < 1152/8; x++) - { - pixels = m_vram[(y * (1152/8)) + (BYTE4_XOR_BE(x))]; - - *scanline++ = palette[(pixels>>7)&1]; - *scanline++ = palette[(pixels>>6)&1]; - *scanline++ = palette[(pixels>>5)&1]; - *scanline++ = palette[(pixels>>4)&1]; - *scanline++ = palette[(pixels>>3)&1]; - *scanline++ = palette[(pixels>>2)&1]; - *scanline++ = palette[(pixels>>1)&1]; - *scanline++ = palette[(pixels&1)]; - } - } - - return 0; -} - uint32_t sun4_state::read_insn_data_4c(uint8_t asi, address_space &space, uint32_t offset, uint32_t mem_mask) { // it's translation time @@ -728,10 +717,26 @@ uint32_t sun4_state::read_insn_data_4c(uint8_t asi, address_space &space, uint32 { if (!machine().side_effects_disabled()) { - printf("sun4c: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc()); - //m_maincpu->trap(SPARC_DATA_ACCESS_EXCEPTION); - //m_buserr[0] = 0x88; // read, invalid PTE - //m_buserr[1] = offset<<2; + //printf("sun4c: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc()); + m_maincpu->set_mae(); + m_buserr[0] |= 0x80; // invalid PTE + m_buserr[0] &= ~0x8000; // read + m_buserr[1] = offset<<2; + if (mem_mask != ~0 && mem_mask != 0xffff0000 && mem_mask != 0xff000000) + { + if (mem_mask == 0x0000ffff || mem_mask == 0x0000ff00) + { + m_buserr[1] |= 2; + } + else if (mem_mask == 0x00ff0000) + { + m_buserr[1] |= 1; + } + else if (mem_mask == 0x000000ff) + { + m_buserr[1] |= 3; + } + } } return 0; } @@ -748,9 +753,9 @@ void sun4_state::write_insn_data_4c(uint8_t asi, address_space &space, uint32_t if ((!(m_pagemap[entry] & PM_WRITEMASK)) || ((m_pagemap[entry] & PM_SYSMASK) && !(asi & 1))) { printf("sun4c: write protect MMU error (PC=%x)\n", m_maincpu->pc()); - m_buserr[0] = 0x8040; // write, protection error + m_buserr[0] |= 0x8040; // write, protection error m_buserr[1] = offset<<2; - m_maincpu->set_input_line(SPARC_MAE, ASSERT_LINE); + m_maincpu->set_mae(); return; } @@ -778,10 +783,25 @@ void sun4_state::write_insn_data_4c(uint8_t asi, address_space &space, uint32_t } else { - printf("sun4c: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc()); - //m_maincpu->trap(SPARC_DATA_ACCESS_EXCEPTION); - //m_buserr[0] = 0x8; // invalid PTE - //m_buserr[1] = offset<<2; + //printf("sun4c: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc()); + m_maincpu->set_mae(); + m_buserr[0] |= 0x8080; // write cycle, invalid PTE + m_buserr[1] = offset<<2; + if (mem_mask != ~0 && mem_mask != 0xffff0000 && mem_mask != 0xff000000) + { + if (mem_mask == 0x0000ffff || mem_mask == 0x0000ff00) + { + m_buserr[1] |= 2; + } + else if (mem_mask == 0x00ff0000) + { + m_buserr[1] |= 1; + } + else if (mem_mask == 0x000000ff) + { + m_buserr[1] |= 3; + } + } } } @@ -814,8 +834,7 @@ READ32_MEMBER( sun4_state::sun4c_mmu_r ) return m_system_enable<<24; case 6: // bus error register - printf("sun4c: read buserror, PC=%x (mask %08x)\n", m_maincpu->pc(), mem_mask); - m_maincpu->set_input_line(SPARC_MAE, CLEAR_LINE); + //printf("sun4c: read buserror %08x, PC=%x (mask %08x)\n", 0x60000000 | (offset << 2), m_maincpu->pc(), mem_mask); retval = m_buserr[offset & 0xf]; m_buserr[offset & 0xf] = 0; // clear on reading return retval; @@ -905,7 +924,7 @@ WRITE32_MEMBER( sun4_state::sun4c_mmu_w ) { m_reset_timer->adjust(attotime::from_usec(1)); m_maincpu->set_input_line(SPARC_RESET, ASSERT_LINE); - printf("Asserting reset line\n"); + logerror("%s: Asserting reset line\n", machine().describe_context()); } //printf("%08x to system enable, mask %08x\n", data, mem_mask); if (m_system_enable & ENA_RESET) @@ -954,7 +973,7 @@ WRITE32_MEMBER( sun4_state::sun4c_mmu_w ) else if (mem_mask == 0xff000000) segdata = (data >> 24) & 0xff; else logerror("sun4c: writing segment map with unknown mask %08x, PC=%x\n", mem_mask, m_maincpu->pc()); - //printf("sun4: %08x to segment map @ %x (ctx %d entry %d, mem_mask %08x, PC=%x)\n", segdata, offset << 2, m_context, (offset>>16) & 0xfff, mem_mask, m_maincpu->pc()); + //printf("sun4c: %08x to segment map @ %x (ctx %d entry %d, mem_mask %08x, PC=%x)\n", segdata, offset << 2, m_context, (offset>>16) & 0xfff, mem_mask, m_maincpu->pc()); m_segmap[m_context & m_ctx_mask][(offset>>16) & 0xfff] = segdata; // only 7 bits of the segment are necessary } return; @@ -962,7 +981,7 @@ WRITE32_MEMBER( sun4_state::sun4c_mmu_w ) case 4: // page map page = (m_segmap[m_context & m_ctx_mask][(offset >> 16) & 0xfff] & m_pmeg_mask) << 6; // get the PMEG page += (offset >> 10) & 0x3f; // add the offset - //printf("sun4: %08x to page map @ %x (entry %d, mem_mask %08x, PC=%x)\n", data, offset << 2, page, mem_mask, m_maincpu->pc()); + //printf("sun4c: %08x to page map @ %x (entry %d, mem_mask %08x, PC=%x)\n", data, offset << 2, page, mem_mask, m_maincpu->pc()); COMBINE_DATA(&m_pagemap[page]); m_pagemap[page] &= 0xff00ffff; // these 8 bits are cleared when written and tested as such return; @@ -974,6 +993,11 @@ WRITE32_MEMBER( sun4_state::sun4c_mmu_w ) write_insn_data_4c(asi, space, offset, data, mem_mask); return; + case 12: // Flush Cache (Segment) + case 13: // Flush Cache (Page) + case 14: // Flush Cache (Context) + // Ignored + return; } printf("sun4c: %08x to asi %d byte offset %x, PC = %x, mask = %08x\n", data, asi, offset << 2, m_maincpu->pc(), mem_mask); @@ -1019,10 +1043,26 @@ uint32_t sun4_state::read_insn_data(uint8_t asi, address_space &space, uint32_t { if (!machine().side_effects_disabled()) { - printf("sun4: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc()); - //m_maincpu->trap(SPARC_DATA_ACCESS_EXCEPTION); - //m_buserr[0] = 0x88; // read, invalid PTE - //m_buserr[1] = offset<<2; + //printf("sun4: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc()); + m_maincpu->set_mae(); + m_buserr[0] |= 0x80; // invalid PTE + m_buserr[0] &= ~0x8000; // read + m_buserr[1] = offset<<2; + if (mem_mask != ~0 && mem_mask != 0xffff0000 && mem_mask != 0xff000000) + { + if (mem_mask == 0x0000ffff || mem_mask == 0x0000ff00) + { + m_buserr[1] |= 2; + } + else if (mem_mask == 0x00ff0000) + { + m_buserr[1] |= 1; + } + else if (mem_mask == 0x000000ff) + { + m_buserr[1] |= 3; + } + } } return 0; } @@ -1061,7 +1101,7 @@ void sun4_state::write_insn_data(uint8_t asi, address_space &space, uint32_t off } else { - printf("sun4: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc()); + printf("sun4: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc()); //m_maincpu->trap(SPARC_DATA_ACCESS_EXCEPTION); //m_buserr[0] = 0x8; // invalid PTE //m_buserr[1] = offset<<2; @@ -1186,6 +1226,7 @@ WRITE32_MEMBER( sun4_state::sun4_mmu_w ) { m_reset_timer->adjust(attotime::from_usec(1)); m_maincpu->set_input_line(SPARC_RESET, ASSERT_LINE); + logerror("%s: Asserting reset line\n", machine().describe_context()); } //printf("%08x to system enable, mask %08x\n", data, mem_mask); if (m_system_enable & ENA_RESET) @@ -1347,7 +1388,6 @@ void sun4_state::sun4c_mem(address_map &map) static INPUT_PORTS_START( sun4 ) INPUT_PORTS_END - void sun4_state::machine_reset() { m_context = 0; @@ -1355,6 +1395,7 @@ void sun4_state::machine_reset() m_irq_reg = 0; m_scc1_int = m_scc2_int = 0; m_scsi_irq = 0; + m_dma_irq = false; m_dma_tc_read = false; m_dma_pack_register = 0; @@ -1480,9 +1521,14 @@ void sun4_state::type1space_map(address_map &map) map(0x07200000, 0x07200003).rw(FUNC(sun4_state::fdc_r), FUNC(sun4_state::fdc_w)); map(0x08000000, 0x08000003).r(FUNC(sun4_state::ss1_sl0_id)); // slot 0 contains SCSI/DMA/Ethernet map(0x08400000, 0x0840000f).rw(FUNC(sun4_state::dma_r), FUNC(sun4_state::dma_w)); - map(0x08800000, 0x0880001f).m(m_scsi, FUNC(ncr5390_device::map)).umask32(0xff000000); - map(0x0e000000, 0x0e000003).r(FUNC(sun4_state::ss1_sl3_id)); // slot 3 contains video board - map(0x0e800000, 0x0e8fffff).ram().share("bw2_vram"); + map(0x08800000, 0x0880002f).m(m_scsi, FUNC(ncr53c90a_device::map)).umask32(0xff000000); + map(0x08c00000, 0x08c00003).rw(m_lance, FUNC(am79c90_device::regs_r), FUNC(am79c90_device::regs_w)); +} + +void sun4_state::type1space_sbus_map(address_map &map) +{ + type1space_map(map); + map(0x0a000000, 0x0fffffff).rw(m_sbus, FUNC(sbus_device::read), FUNC(sbus_device::write)); } void sun4_state::type1space_s4_map(address_map &map) @@ -1542,11 +1588,12 @@ WRITE8_MEMBER( sun4_state::irq_w ) m_irq_reg = data; m_maincpu->set_input_line(SPARC_IRQ12, ((m_scc1_int || m_scc2_int) && (m_irq_reg & 0x01)) ? ASSERT_LINE : CLEAR_LINE); + if (!(m_irq_reg & 0x01)) + m_maincpu->set_input_line(SPARC_NMI, CLEAR_LINE); } WRITE_LINE_MEMBER( sun4_state::scc1_int ) { - printf("scc1 int: %d\n", state); m_scc1_int = state; m_maincpu->set_input_line(SPARC_IRQ12, ((m_scc1_int || m_scc2_int) && (m_irq_reg & 0x01)) ? ASSERT_LINE : CLEAR_LINE); @@ -1554,7 +1601,6 @@ WRITE_LINE_MEMBER( sun4_state::scc1_int ) WRITE_LINE_MEMBER( sun4_state::scc2_int ) { - printf("scc2 int: %d\n", state); m_scc2_int = state; m_maincpu->set_input_line(SPARC_IRQ12, ((m_scc1_int || m_scc2_int) && (m_irq_reg & 0x01)) ? ASSERT_LINE : CLEAR_LINE); @@ -1687,19 +1733,18 @@ void sun4_state::dma_check_interrupts() int irq_or_err_pending = (m_dma[DMA_CTRL] & (DMA_INT_PEND | DMA_ERR_PEND)) ? 1 : 0; int irq_enabled = (m_dma[DMA_CTRL] & DMA_INT_EN) ? 1 : 0; - if (irq_or_err_pending && irq_enabled) - { - m_maincpu->set_input_line(SPARC_IRQ3, ASSERT_LINE); - } - else + bool old_irq = m_dma_irq; + m_dma_irq = irq_or_err_pending && irq_enabled; + if (old_irq != m_dma_irq) { - m_maincpu->set_input_line(SPARC_IRQ3, CLEAR_LINE); + //logerror("m_dma_irq %d because irq_or_err_pending:%d and irq_enabled:%d\n", m_dma_irq ? 1 : 0, irq_or_err_pending, irq_enabled); + m_maincpu->set_input_line(SPARC_IRQ3, m_dma_irq ? ASSERT_LINE : CLEAR_LINE); } } void sun4_state::dma_transfer_write() { - logerror("DMAing from device to RAM\n"); + //logerror("DMAing from device to RAM\n"); address_space &space = m_maincpu->space(AS_PROGRAM); @@ -1708,16 +1753,16 @@ void sun4_state::dma_transfer_write() { int bit_index = (3 - pack_cnt) * 8; uint8_t dma_value = m_scsi->dma_r(); - logerror("Read from device: %02x\n", dma_value); + //logerror("Read from device: %02x, pack count %d\n", dma_value, pack_cnt); m_dma_pack_register |= dma_value << bit_index; - if ((m_dma[DMA_CTRL] & DMA_EN_CNT) != 0) + if (m_dma[DMA_CTRL] & DMA_EN_CNT) m_dma[DMA_BYTE_COUNT]--; pack_cnt++; if (pack_cnt == 4) { - logerror("Writing pack register %08x\n", m_dma_pack_register); + //logerror("Writing pack register %08x to %08x\n", m_dma_pack_register, m_dma[DMA_ADDR]); if (m_arch == ARCH_SUN4C) { write_insn_data_4c(11, space, m_dma[DMA_ADDR] >> 2, m_dma_pack_register, ~0); @@ -1729,6 +1774,7 @@ void sun4_state::dma_transfer_write() pack_cnt = 0; m_dma_pack_register = 0; + m_dma[DMA_ADDR] += 4; } } @@ -1738,7 +1784,7 @@ void sun4_state::dma_transfer_write() void sun4_state::dma_transfer_read() { - logerror("DMAing from RAM to device\n"); + //logerror("DMAing from RAM to device\n"); address_space &space = m_maincpu->space(AS_PROGRAM); @@ -1756,20 +1802,21 @@ void sun4_state::dma_transfer_read() { current_word = read_insn_data(11, space, m_dma[DMA_ADDR] >> 2, ~0); } - logerror("Current word: %08x\n", current_word); + word_cached = true; + //logerror("Current word: %08x\n", current_word); } int bit_index = (3 - (m_dma[DMA_ADDR] & 3)) * 8; uint8_t dma_value(current_word >> bit_index); - logerror("Write to device: %02x\n", dma_value); + //logerror("Write to device: %02x\n", dma_value); m_scsi->dma_w(dma_value); - m_dma[DMA_ADDR]++; - if ((m_dma[DMA_CTRL] & DMA_EN_CNT) != 0) - m_dma[DMA_BYTE_COUNT]--; - if ((m_dma[DMA_ADDR] & 3) == 3) word_cached = false; + + m_dma[DMA_ADDR]++; + if (m_dma[DMA_CTRL] & DMA_EN_CNT) + m_dma[DMA_BYTE_COUNT]--; } } @@ -1784,7 +1831,7 @@ void sun4_state::dma_transfer() dma_transfer_read(); } - if (m_dma[DMA_BYTE_COUNT] == 0 && (m_dma[DMA_CTRL] & DMA_EN_CNT) != 0) + if (m_dma[DMA_BYTE_COUNT] == 0 && (m_dma[DMA_CTRL] & DMA_EN_CNT)) { m_dma[DMA_CTRL] |= DMA_TC; m_dma_tc_read = false; @@ -1809,19 +1856,38 @@ WRITE32_MEMBER( sun4_state::dma_w ) case DMA_CTRL: { // clear write-only bits - logerror("dma_w: ctrl: %08x\n", data); + //logerror("dma_w: ctrl: %08x\n", data); mem_mask &= (DMA_READ_WRITE); COMBINE_DATA(&m_dma[DMA_CTRL]); if (data & DMA_RESET) + { + //logerror("dma_w: reset\n"); m_dma[DMA_CTRL] &= ~(DMA_ERR_PEND | DMA_PACK_CNT | DMA_INT_EN | DMA_FLUSH | DMA_DRAIN | DMA_WRITE | DMA_EN_DMA | DMA_REQ_PEND | DMA_EN_CNT | DMA_TC); + } else if (data & DMA_FLUSH) { + //logerror("dma_w: flush\n"); m_dma[DMA_CTRL] &= ~(DMA_PACK_CNT | DMA_ERR_PEND | DMA_TC); dma_check_interrupts(); } + else if (data & DMA_DRAIN) + { + m_dma[DMA_CTRL] &= ~DMA_DRAIN; + const uint8_t pack_cnt = (m_dma[DMA_CTRL] & DMA_PACK_CNT) >> DMA_PACK_CNT_SHIFT; + for (uint8_t i = 0; i < pack_cnt; i++) + { + const uint32_t bit_index = (3 - i) * 8; + //const uint32_t value = m_dma_pack_register & (0xff << bit_index); + //logerror("dma_w: draining %02x to RAM address %08x & %08x\n", value >> bit_index, m_dma[DMA_ADDR], 0xff << (24 - bit_index)); + write_insn_data_4c(11, space, m_dma[DMA_ADDR] >> 2, m_dma_pack_register, 0xff << bit_index); + m_dma[DMA_ADDR]++; + } + m_dma_pack_register = 0; + m_dma[DMA_CTRL] &= ~DMA_PACK_CNT; + } // TODO: DMA_DRAIN if (data & DMA_EN_DMA && (m_dma[DMA_CTRL] & DMA_REQ_PEND)) @@ -1830,12 +1896,12 @@ WRITE32_MEMBER( sun4_state::dma_w ) } case DMA_ADDR: - logerror("dma_w: addr: %08x\n", data); + //logerror("dma_w: addr: %08x\n", data); m_dma[offset] = data; break; case DMA_BYTE_COUNT: - logerror("dma_w: byte_count: %08x\n", data); + //logerror("dma_w: byte_count: %08x\n", data); m_dma[offset] = data; break; @@ -1846,26 +1912,52 @@ WRITE32_MEMBER( sun4_state::dma_w ) WRITE_LINE_MEMBER( sun4_state::scsi_irq ) { + int old_irq = m_scsi_irq; m_scsi_irq = state; - dma_check_interrupts(); + if (m_scsi_irq != old_irq) + { + //logerror("scsi_irq %d, checking interrupts\n", state); + dma_check_interrupts(); + } } WRITE_LINE_MEMBER( sun4_state::scsi_drq ) { - logerror("scsi_drq %d\n", state); + //logerror("scsi_drq %d\n", state); m_dma[DMA_CTRL] &= ~DMA_REQ_PEND; if (state) { - logerror("scsi_drq, DMA pending\n"); + //logerror("scsi_drq, DMA pending\n"); m_dma[DMA_CTRL] |= DMA_REQ_PEND; - if (m_dma[DMA_CTRL] & DMA_EN_DMA) + if (m_dma[DMA_CTRL] & DMA_EN_DMA/* && m_dma[DMA_BYTE_COUNT]*/) { - logerror("DMA enabled, starting dma\n"); + //logerror("DMA enabled, starting dma\n"); dma_transfer(); } } } +READ32_MEMBER( sun4_state::lance_dma_r ) +{ + if (m_arch == ARCH_SUN4) + return read_insn_data(11, m_maincpu->space(AS_PROGRAM), offset, mem_mask); + else + return read_insn_data_4c(11, m_maincpu->space(AS_PROGRAM), offset, mem_mask); +} + +WRITE32_MEMBER( sun4_state::lance_dma_w ) +{ + if (m_arch == ARCH_SUN4) + write_insn_data(11, m_maincpu->space(AS_PROGRAM), offset, data, mem_mask); + else + write_insn_data_4c(11, m_maincpu->space(AS_PROGRAM), offset, data, mem_mask); +} + +WRITE32_MEMBER( sun4_state::buserr_w ) +{ + COMBINE_DATA(&m_buserr[offset]); +} + // indicate 4/60 SCSI/DMA/Ethernet card exists READ32_MEMBER( sun4_state::ss1_sl0_id ) { @@ -1878,6 +1970,26 @@ READ32_MEMBER( sun4_state::ss1_sl3_id ) return 0xfe010101; } +// indicate no card exists +READ32_MEMBER( sun4_state::ss1_sl1_id ) +{ + m_maincpu->set_mae(); + m_buserr[0] |= 0x20; // timeout + m_buserr[0] &= ~0x8000; // read + m_buserr[1] = 0xffa00000; + return 0; +} + +// indicate no card exists +READ32_MEMBER( sun4_state::ss1_sl2_id ) +{ + m_maincpu->set_mae(); + m_buserr[0] |= 0x20; // timeout + m_buserr[0] &= ~0x8000; // read + m_buserr[1] = 0xffc00000; + return 0; +} + FLOPPY_FORMATS_MEMBER( sun4_state::floppy_formats ) FLOPPY_PC_FORMAT FLOPPY_FORMATS_END @@ -1891,10 +2003,10 @@ static void sun_scsi_devices(device_slot_interface &device) { device.option_add("cdrom", NSCSI_CDROM); device.option_add("harddisk", NSCSI_HARDDISK); - device.option_add_internal("ncr5390", NCR5390); + device.option_add_internal("ncr53c90a", NCR53C90A); } -void sun4_state::ncr5390(device_t *device) +void sun4_state::ncr53c90a(device_t *device) { devcb_base *devcb; (void)devcb; @@ -1905,7 +2017,7 @@ void sun4_state::ncr5390(device_t *device) MACHINE_CONFIG_START(sun4_state::sun4) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", MB86901, 16670000) + MCFG_DEVICE_ADD(m_maincpu, MB86901, 16670000) MCFG_DEVICE_ADDRESS_MAP(AS_PROGRAM, sun4_mem) MCFG_SPARC_ADD_ASI_DESC(sun4_asi_desc) @@ -1917,10 +2029,15 @@ MACHINE_CONFIG_START(sun4_state::sun4) MCFG_FLOPPY_DRIVE_ADD("fdc:0", sun_floppies, "35hd", sun4_state::floppy_formats) // MMU Type 0 device space - ADDRESS_MAP_BANK(config, "type0").set_map(&sun4_state::type0space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + ADDRESS_MAP_BANK(config, m_type0space).set_map(&sun4_state::type0space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); // MMU Type 1 device space - ADDRESS_MAP_BANK(config, "type1").set_map(&sun4_state::type1space_s4_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + ADDRESS_MAP_BANK(config, m_type1space).set_map(&sun4_state::type1space_s4_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + + // Ethernet + AM79C90(config, m_lance, 10'000'000); // clock is a guess + m_lance->dma_in().set(FUNC(sun4_state::lance_dma_r)); + m_lance->dma_out().set(FUNC(sun4_state::lance_dma_w)); // Keyboard/mouse SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); @@ -1948,19 +2065,19 @@ MACHINE_CONFIG_START(sun4_state::sun4) MCFG_NSCSI_BUS_ADD("scsibus") MCFG_NSCSI_ADD("scsibus:0", sun_scsi_devices, "harddisk", false) - MCFG_NSCSI_ADD("scsibus:1", sun_scsi_devices, "cdrom", false) + MCFG_NSCSI_ADD("scsibus:1", sun_scsi_devices, nullptr, false) MCFG_NSCSI_ADD("scsibus:2", sun_scsi_devices, nullptr, false) MCFG_NSCSI_ADD("scsibus:3", sun_scsi_devices, nullptr, false) MCFG_NSCSI_ADD("scsibus:4", sun_scsi_devices, nullptr, false) MCFG_NSCSI_ADD("scsibus:5", sun_scsi_devices, nullptr, false) - MCFG_NSCSI_ADD("scsibus:6", sun_scsi_devices, nullptr, false) - MCFG_NSCSI_ADD("scsibus:7", sun_scsi_devices, "ncr5390", true) - MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5390", [this] (device_t *device) { ncr5390(device); }) + MCFG_NSCSI_ADD("scsibus:6", sun_scsi_devices, "cdrom", false) + MCFG_NSCSI_ADD("scsibus:7", sun_scsi_devices, "ncr53c90a", true) + MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr53c90a", [this] (device_t *device) { ncr53c90a(device); }) MACHINE_CONFIG_END MACHINE_CONFIG_START(sun4_state::sun4c) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", MB86901, 16670000) + MCFG_DEVICE_ADD(m_maincpu, MB86901, 16670000) MCFG_DEVICE_ADDRESS_MAP(AS_PROGRAM, sun4c_mem) MCFG_SPARC_ADD_ASI_DESC(sun4c_asi_desc) @@ -1972,10 +2089,15 @@ MACHINE_CONFIG_START(sun4_state::sun4c) MCFG_FLOPPY_DRIVE_ADD("fdc:0", sun_floppies, "35hd", sun4_state::floppy_formats) // MMU Type 0 device space - ADDRESS_MAP_BANK(config, "type0").set_map(&sun4_state::type0space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + ADDRESS_MAP_BANK(config, m_type0space).set_map(&sun4_state::type0space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); // MMU Type 1 device space - ADDRESS_MAP_BANK(config, "type1").set_map(&sun4_state::type1space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + ADDRESS_MAP_BANK(config, m_type1space).set_map(&sun4_state::type1space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + + // Ethernet + AM79C90(config, m_lance, 10'000'000); // clock is a guess + m_lance->dma_in().set(FUNC(sun4_state::lance_dma_r)); + m_lance->dma_out().set(FUNC(sun4_state::lance_dma_w)); // Keyboard/mouse SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); @@ -2008,16 +2130,37 @@ MACHINE_CONFIG_START(sun4_state::sun4c) MCFG_NSCSI_ADD("scsibus:4", sun_scsi_devices, nullptr, false) MCFG_NSCSI_ADD("scsibus:5", sun_scsi_devices, nullptr, false) MCFG_NSCSI_ADD("scsibus:6", sun_scsi_devices, nullptr, false) - MCFG_NSCSI_ADD("scsibus:7", sun_scsi_devices, "ncr5390", true) - MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5390", [this] (device_t *device) { ncr5390(device); }) - - MCFG_SCREEN_ADD("bwtwo", RASTER) - MCFG_SCREEN_UPDATE_DRIVER(sun4_state, bw2_update) - MCFG_SCREEN_SIZE(1152,900) - MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 900-1) - MCFG_SCREEN_REFRESH_RATE(72) + MCFG_NSCSI_ADD("scsibus:7", sun_scsi_devices, "ncr53c90a", true) + MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr53c90a", [this] (device_t *device) { ncr53c90a(device); }) MACHINE_CONFIG_END +MACHINE_CONFIG_START(sun4_state::sun4_40) + sun4c(config); + + m_type1space->set_map(&sun4_state::type1space_sbus_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + + // SBus + SBUS(config, m_sbus, 16670000, "maincpu", "type1"); + SBUS_SLOT(config, "slot1", 16'670'000, m_sbus, sbus_cards, nullptr); + SBUS_SLOT(config, "slot2", 16'670'000, m_sbus, sbus_cards, nullptr); + SBUS_SLOT(config, "slot3", 16'670'000, m_sbus, sbus_cards, "bwtwo"); +MACHINE_CONFIG_END + +MACHINE_CONFIG_START(sun4_state::sun4_60) + sun4c(config); + + m_maincpu->set_clock(20'000'000); + + m_type1space->set_map(&sun4_state::type1space_sbus_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); + + // SBus + SBUS(config, m_sbus, 20'000'000, "maincpu", "type1"); + SBUS_SLOT(config, "slot1", 20'000'000, m_sbus, sbus_cards, nullptr); + SBUS_SLOT(config, "slot2", 20'000'000, m_sbus, sbus_cards, nullptr); + SBUS_SLOT(config, "slot3", 20'000'000, m_sbus, sbus_cards, nullptr); +MACHINE_CONFIG_END + + /* Boot PROM @@ -2126,16 +2269,6 @@ ROM_START( sun4_300 ) ROM_LOAD32_BYTE( "1036-09.rom", 0x00000, 0x10000, CRC(cb3d45a7) SHA1(9d5da09ff87ec52dc99ffabd1003d30811eafdb0)) ROM_LOAD32_BYTE( "1037-09.rom", 0x00001, 0x10000, CRC(4f005bea) SHA1(db3f6133ea7c497ba440bc797123dde41abea6fd)) ROM_LOAD32_BYTE( "1038-09.rom", 0x00002, 0x10000, CRC(1e429d31) SHA1(498ce4d34a74ea6e3e369bb7eb9c2b87e12bd080)) - - ROM_REGION( 0x10000, "devices", ROMREGION_ERASEFF ) - // CG3 Color frame buffer (cgthree) - ROM_LOAD( "sunw,501-1415.bin", 0x0000, 0x0800, CRC(d1eb6f4d) SHA1(9bef98b2784b6e70167337bb27cd07952b348b5a)) - - // BW2 frame buffer (bwtwo) - ROM_LOAD( "sunw,501-1561.bin", 0x0800, 0x0800, CRC(e37a3314) SHA1(78761bd2369cb0c58ef1344c697a47d3a659d4bc)) - - // TurboGX 8-Bit Color Frame Buffer - ROM_LOAD( "sunw,501-2325.bin", 0x1000, 0x8000, CRC(bbdc45f8) SHA1(e4a51d78e199cd57f2fcb9d45b25dfae2bd537e4)) ROM_END ROM_START( sun4_400 ) @@ -2295,10 +2428,10 @@ COMP( 1987, sun4_300, 0, 0, sun4, sun4, sun4_state, init_sun4, COMP( 198?, sun4_400, 0, 0, sun4, sun4, sun4_state, init_sun4, "Sun Microsystems", "Sun 4/4x0", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // sun4c -COMP( 1990, sun4_40, sun4_300, 0, sun4c, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation IPC (Sun 4/40)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +COMP( 1990, sun4_40, sun4_300, 0, sun4_40, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation IPC (Sun 4/40)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) COMP( 1991, sun4_50, sun4_300, 0, sun4c, sun4, sun4_state, init_ss2, "Sun Microsystems", "SPARCstation IPX (Sun 4/50)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) COMP( 199?, sun4_20, sun4_300, 0, sun4c, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation SLC (Sun 4/20)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -COMP( 1989, sun4_60, sun4_300, 0, sun4c, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation 1 (Sun 4/60)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +COMP( 1989, sun4_60, sun4_300, 0, sun4_60, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation 1 (Sun 4/60)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) COMP( 1990, sun4_65, sun4_300, 0, sun4c, sun4, sun4_state, init_sun4c, "Sun Microsystems", "SPARCstation 1+ (Sun 4/65)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) COMP( 1990, sun4_75, sun4_300, 0, sun4c, sun4, sun4_state, init_ss2, "Sun Microsystems", "SPARCstation 2 (Sun 4/75)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) diff --git a/src/mame/drivers/system16.cpp b/src/mame/drivers/system16.cpp index 7a1197cc50a..c2125212c46 100644 --- a/src/mame/drivers/system16.cpp +++ b/src/mame/drivers/system16.cpp @@ -2290,6 +2290,9 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(segas1x_bootleg_state::goldnaxeb1) goldnaxeb_base(config); + MCFG_PALETTE_MODIFY("palette") + MCFG_PALETTE_ENTRIES(0x2000*SHADOW_COLORS_MULTIPLIER) + z80_ym2151_upd7759(config); MACHINE_CONFIG_END @@ -2301,16 +2304,20 @@ MACHINE_CONFIG_START(segas1x_bootleg_state::goldnaxeb2) MCFG_DEVICE_PROGRAM_MAP(goldnaxeb2_map) MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_OPCODES) + MCFG_PALETTE_MODIFY("palette") + MCFG_PALETTE_ENTRIES(0x2000*SHADOW_COLORS_MULTIPLIER) + datsu_2x_ym2203_msm5205(config); MACHINE_CONFIG_END MACHINE_CONFIG_START(segas1x_bootleg_state::bayrouteb1) - goldnaxeb1(config); + goldnaxeb_base(config); /* basic machine hardware */ MCFG_DEVICE_MODIFY("maincpu") MCFG_DEVICE_PROGRAM_MAP(bayrouteb1_map) + z80_ym2151_upd7759(config); MACHINE_CONFIG_END MACHINE_CONFIG_START(segas1x_bootleg_state::bayrouteb2) diff --git a/src/mame/drivers/taito_b.cpp b/src/mame/drivers/taito_b.cpp index 81cb0a183e1..eae43cd4417 100644 --- a/src/mame/drivers/taito_b.cpp +++ b/src/mame/drivers/taito_b.cpp @@ -1772,7 +1772,6 @@ MACHINE_CONFIG_START(taitob_state::rastsag2) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -1830,7 +1829,6 @@ MACHINE_CONFIG_START(taitob_state::masterw) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -1909,7 +1907,6 @@ MACHINE_CONFIG_START(taitob_state::ashura) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -1967,7 +1964,6 @@ MACHINE_CONFIG_START(taitob_state::crimec) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2026,7 +2022,6 @@ MACHINE_CONFIG_START(taitob_state::hitice) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2090,7 +2085,6 @@ MACHINE_CONFIG_START(taitob_state::rambo3p) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2149,7 +2143,6 @@ MACHINE_CONFIG_START(taitob_state::rambo3) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2213,7 +2206,6 @@ MACHINE_CONFIG_START(taitob_state::pbobble) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2277,7 +2269,6 @@ MACHINE_CONFIG_START(taitob_state::spacedx) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2335,7 +2326,6 @@ MACHINE_CONFIG_START(taitob_state::spacedxo) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2399,7 +2389,6 @@ MACHINE_CONFIG_START(taitob_state::qzshowby) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2457,7 +2446,6 @@ MACHINE_CONFIG_START(taitob_state::viofight) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2520,7 +2508,6 @@ MACHINE_CONFIG_START(taitob_state::silentd) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2578,7 +2565,6 @@ MACHINE_CONFIG_START(taitob_state::selfeena) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2645,7 +2631,6 @@ MACHINE_CONFIG_START(taitob_state::ryujin) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2710,7 +2695,6 @@ MACHINE_CONFIG_START(taitob_state::sbm) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_taitob) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 4096) @@ -2767,7 +2751,6 @@ MACHINE_CONFIG_START(taitob_c_state::realpunc) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(taitob_c_state, screen_update_realpunc) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_PALETTE_ADD("palette", 4096) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBxxxx) diff --git a/src/mame/drivers/taitoair.cpp b/src/mame/drivers/taitoair.cpp index bdddcf3e54f..5973c5b82e5 100644 --- a/src/mame/drivers/taitoair.cpp +++ b/src/mame/drivers/taitoair.cpp @@ -712,11 +712,11 @@ MACHINE_CONFIG_START(taitoair_state::airsys) MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000) / 4) // Z8400AB1 MCFG_DEVICE_PROGRAM_MAP(sound_map) - MCFG_DEVICE_ADD("dsp", TMS32025, XTAL(36'000'000)) // Unverified - MCFG_DEVICE_PROGRAM_MAP(DSP_map_program) - MCFG_DEVICE_DATA_MAP(DSP_map_data) - MCFG_TMS32025_HOLD_IN_CB(READ16(*this, taitoair_state, dsp_HOLD_signal_r)) - MCFG_TMS32025_HOLD_ACK_OUT_CB(WRITE16(*this, taitoair_state, dsp_HOLDA_signal_w)) + tms32025_device& dsp(TMS32025(config, m_dsp, XTAL(36'000'000))); // Unverified + dsp.set_addrmap(AS_PROGRAM, &taitoair_state::DSP_map_program); + dsp.set_addrmap(AS_DATA, &taitoair_state::DSP_map_data); + dsp.hold_in_cb().set(FUNC(taitoair_state::dsp_HOLD_signal_r)); + dsp.hold_ack_out_cb().set(FUNC(taitoair_state::dsp_HOLDA_signal_w)); MCFG_QUANTUM_PERFECT_CPU("maincpu") diff --git a/src/mame/drivers/taitogn.cpp b/src/mame/drivers/taitogn.cpp index bc3cd545d24..ac8ce300943 100644 --- a/src/mame/drivers/taitogn.cpp +++ b/src/mame/drivers/taitogn.cpp @@ -344,6 +344,7 @@ Type 3 (PCMCIA Compact Flash Adaptor + Compact Flash card, sealed together with #include "machine/znmcu.h" #include "sound/spu.h" #include "video/psx.h" +#include "screen.h" #include "speaker.h" #include <algorithm> @@ -735,6 +736,9 @@ MACHINE_CONFIG_START(taitogn_state::coh3002t) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8654Q, 0x200000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); diff --git a/src/mame/drivers/tandy1t.cpp b/src/mame/drivers/tandy1t.cpp index 02ccea5de7b..250991c33c0 100644 --- a/src/mame/drivers/tandy1t.cpp +++ b/src/mame/drivers/tandy1t.cpp @@ -781,7 +781,7 @@ MACHINE_CONFIG_END #ifdef UNUSED_DEFINITION ROM_START( t1000 ) - // Schematics displays 2 32KB ROMs at U9 and U10 + // Schematic shows 2 32KB ROMs at U9 and U10 for Tandy 1000; 1000A is a different mainboard. ROM_REGION(0x20000,"bios", 0) ROM_SYSTEM_BIOS( 0, "v010000", "v010000" ) ROMX_LOAD("v010000.f0", 0x10000, 0x10000, NO_DUMP, ROM_BIOS(0)) diff --git a/src/mame/drivers/tdv2324.cpp b/src/mame/drivers/tdv2324.cpp index 7e4a6483438..55004c681f9 100644 --- a/src/mame/drivers/tdv2324.cpp +++ b/src/mame/drivers/tdv2324.cpp @@ -286,8 +286,7 @@ MACHINE_CONFIG_START(tdv2324_state::tdv2324) MCFG_PALETTE_ADD_MONOCHROME("palette") - MCFG_DEVICE_ADD(TMS9937NL_TAG, TMS9927, 25.39836_MHz_XTAL / 8) - MCFG_TMS9927_CHAR_WIDTH(8) + TMS9927(config, m_tms, 25.39836_MHz_XTAL / 8).set_char_width(8); // devices MCFG_DEVICE_ADD(P8259A_TAG, PIC8259, 0) diff --git a/src/mame/drivers/thief.cpp b/src/mame/drivers/thief.cpp index c6a6970ffb1..52e6409b97a 100644 --- a/src/mame/drivers/thief.cpp +++ b/src/mame/drivers/thief.cpp @@ -410,9 +410,10 @@ MACHINE_CONFIG_START(thief_state::thief) MCFG_SCREEN_UPDATE_DRIVER(thief_state, screen_update_thief) MCFG_SCREEN_PALETTE("palette") - MCFG_DEVICE_ADD("tms", TMS9927, XTAL(20'000'000)/4/8) - MCFG_TMS9927_CHAR_WIDTH(8) - MCFG_TMS9927_VSYN_CALLBACK(ASSERTLINE("maincpu", 0)) + TMS9927(config, m_tms, XTAL(20'000'000)/4/8); + m_tms->set_char_width(8); + m_tms->vsyn_callback().set_inputline("maincpu", 0, ASSERT_LINE); + MCFG_PALETTE_ADD("palette", 16) // sound hardware diff --git a/src/mame/drivers/thomson.cpp b/src/mame/drivers/thomson.cpp index 6f357037517..f3331971922 100644 --- a/src/mame/drivers/thomson.cpp +++ b/src/mame/drivers/thomson.cpp @@ -619,7 +619,7 @@ static void cd90_640_floppies(device_slot_interface &device) /* ------------ driver ------------ */ -MACHINE_CONFIG_START(thomson_state::to7) +MACHINE_CONFIG_START(thomson_state::to7_base) MCFG_MACHINE_START_OVERRIDE( thomson_state, to7 ) MCFG_MACHINE_RESET_OVERRIDE( thomson_state, to7 ) @@ -666,14 +666,6 @@ MACHINE_CONFIG_START(thomson_state::to7) MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED) MCFG_CASSETTE_INTERFACE("to_cass") -/* timer */ - MCFG_DEVICE_ADD("mc6846", MC6846, 16_MHz_XTAL / 16) - MCFG_MC6846_OUT_PORT_CB(WRITE8(*this, thomson_state, to7_timer_port_out)) - MCFG_MC6846_OUT_CP2_CB(WRITELINE("buzzer", dac_bit_interface, write)) - MCFG_MC6846_IN_PORT_CB(READ8(*this, thomson_state, to7_timer_port_in)) - MCFG_MC6846_OUT_CTO_CB(WRITELINE(*this, thomson_state, to7_set_cassette)) - MCFG_MC6846_IRQ_CB(WRITELINE("mainirq", input_merger_device, in_w<0>)) - /* floppy */ MCFG_DEVICE_ADD("mc6843", MC6843, 16_MHz_XTAL / 16 / 2) @@ -761,9 +753,23 @@ MACHINE_CONFIG_START(thomson_state::to7) MCFG_SOFTWARE_LIST_ADD("to7_qd_list","to7_qd") MACHINE_CONFIG_END -MACHINE_CONFIG_START(thomson_state::t9000) +void thomson_state::to7(machine_config &config) +{ + to7_base(config); + + /* timer */ + MC6846(config, m_mc6846, 16_MHz_XTAL / 16); + m_mc6846->out_port().set(FUNC(thomson_state::to7_timer_port_out)); + m_mc6846->in_port().set(FUNC(thomson_state::to7_timer_port_in)); + m_mc6846->cp2().set("buzzer", FUNC(dac_bit_interface::write)); + m_mc6846->cto().set(FUNC(thomson_state::to7_set_cassette)); + m_mc6846->irq().set("mainirq", FUNC(input_merger_device::in_w<0>)); +} + +void thomson_state::t9000(machine_config &config) +{ to7(config); -MACHINE_CONFIG_END +} COMP( 1982, to7, 0, 0, to7, to7, thomson_state, empty_init, "Thomson", "TO7", 0 ) @@ -938,8 +944,7 @@ MACHINE_CONFIG_START(thomson_state::to770) m_pia_sys->writepb_handler().set(FUNC(thomson_state::to770_sys_portb_out)); m_pia_sys->cb2_handler().set(FUNC(thomson_state::to770_sys_cb2_out)); - MCFG_DEVICE_MODIFY("mc6846") - MCFG_MC6846_OUT_PORT_CB(WRITE8(*this, thomson_state, to770_timer_port_out)) + m_mc6846->out_port().set(FUNC(thomson_state::to770_timer_port_out)); /* internal ram */ m_ram->set_default_size("128K").set_extra_options("64K"); @@ -1116,7 +1121,7 @@ INPUT_PORTS_END /* ------------ driver ------------ */ MACHINE_CONFIG_START(thomson_state::mo5) - to7(config); + to7_base(config); MCFG_MACHINE_START_OVERRIDE( thomson_state, mo5 ) MCFG_MACHINE_RESET_OVERRIDE( thomson_state, mo5 ) @@ -1127,8 +1132,6 @@ MACHINE_CONFIG_START(thomson_state::mo5) MCFG_CASSETTE_FORMATS(mo5_cassette_formats) MCFG_CASSETTE_INTERFACE("mo_cass") - MCFG_DEVICE_REMOVE( "mc6846" ) - MCFG_PALETTE_MODIFY( "palette" ) MCFG_PALETTE_INIT_OWNER(thomson_state, mo5) @@ -1492,8 +1495,7 @@ MACHINE_CONFIG_START(thomson_state::to9) m_pia_sys->cb2_handler().set_nop(); m_pia_sys->irqa_handler().set_nop(); - MCFG_DEVICE_MODIFY("mc6846") - MCFG_MC6846_OUT_PORT_CB(WRITE8(*this, thomson_state, to9_timer_port_out)) + m_mc6846->out_port().set(FUNC(thomson_state::to9_timer_port_out)); CENTRONICS(config, m_centronics, centronics_devices, "printer"); m_centronics->busy_handler().set(FUNC(thomson_state::write_centronics_busy)); @@ -1718,10 +1720,9 @@ MACHINE_CONFIG_START(thomson_state::to8) CENTRONICS(config, m_centronics, centronics_devices, "printer"); m_centronics->busy_handler().set(FUNC(thomson_state::write_centronics_busy)); - MCFG_DEVICE_MODIFY("mc6846") - MCFG_MC6846_OUT_PORT_CB(WRITE8(*this, thomson_state, to8_timer_port_out)) - MCFG_MC6846_OUT_CP2_CB(WRITELINE(*this, thomson_state, to8_timer_cp2_out)) - MCFG_MC6846_IN_PORT_CB(READ8(*this, thomson_state, to8_timer_port_in)) + m_mc6846->out_port().set(FUNC(thomson_state::to8_timer_port_out)); + m_mc6846->in_port().set(FUNC(thomson_state::to8_timer_port_in)); + m_mc6846->cp2().set(FUNC(thomson_state::to8_timer_cp2_out)); /* internal ram */ m_ram->set_default_size("512K").set_extra_options("256K"); @@ -1882,10 +1883,9 @@ MACHINE_CONFIG_START(thomson_state::to9p) CENTRONICS(config, m_centronics, centronics_devices, "printer"); m_centronics->busy_handler().set(FUNC(thomson_state::write_centronics_busy)); - MCFG_DEVICE_MODIFY("mc6846") - MCFG_MC6846_OUT_PORT_CB(WRITE8(*this, thomson_state, to9p_timer_port_out)) - MCFG_MC6846_OUT_CP2_CB(WRITELINE(*this, thomson_state, to8_timer_cp2_out)) - MCFG_MC6846_IN_PORT_CB(READ8(*this, thomson_state, to9p_timer_port_in)) + m_mc6846->out_port().set(FUNC(thomson_state::to9p_timer_port_out)); + m_mc6846->in_port().set(FUNC(thomson_state::to9p_timer_port_in)); + m_mc6846->cp2().set(FUNC(thomson_state::to8_timer_cp2_out)); /* internal ram */ m_ram->set_default_size("512K"); @@ -2211,7 +2211,7 @@ INPUT_PORTS_END /* ------------ driver ------------ */ MACHINE_CONFIG_START(thomson_state::mo6) - to7(config); + to7_base(config); MCFG_MACHINE_START_OVERRIDE( thomson_state, mo6 ) MCFG_MACHINE_RESET_OVERRIDE( thomson_state, mo6 ) @@ -2222,8 +2222,6 @@ MACHINE_CONFIG_START(thomson_state::mo6) MCFG_CASSETTE_FORMATS(mo5_cassette_formats) MCFG_CASSETTE_INTERFACE("mo_cass") - MCFG_DEVICE_REMOVE( "mc6846" ) - m_pia_sys->readpa_handler().set(FUNC(thomson_state::mo6_sys_porta_in)); m_pia_sys->readpb_handler().set(FUNC(thomson_state::mo6_sys_portb_in)); m_pia_sys->writepa_handler().set(FUNC(thomson_state::mo6_sys_porta_out)); @@ -2478,7 +2476,7 @@ INPUT_PORTS_END /* ------------ driver ------------ */ MACHINE_CONFIG_START(thomson_state::mo5nr) - to7(config); + to7_base(config); MCFG_MACHINE_START_OVERRIDE( thomson_state, mo5nr ) MCFG_MACHINE_RESET_OVERRIDE( thomson_state, mo5nr ) @@ -2489,8 +2487,6 @@ MACHINE_CONFIG_START(thomson_state::mo5nr) MCFG_CASSETTE_FORMATS(mo5_cassette_formats) MCFG_CASSETTE_INTERFACE("mo_cass") - MCFG_DEVICE_REMOVE( "mc6846" ) - m_pia_sys->readpa_handler().set(FUNC(thomson_state::mo6_sys_porta_in)); m_pia_sys->readpb_handler().set(FUNC(thomson_state::mo5nr_sys_portb_in)); m_pia_sys->writepa_handler().set(FUNC(thomson_state::mo5nr_sys_porta_out)); diff --git a/src/mame/drivers/tonton.cpp b/src/mame/drivers/tonton.cpp index a00e66a7782..189f9c409b4 100644 --- a/src/mame/drivers/tonton.cpp +++ b/src/mame/drivers/tonton.cpp @@ -233,9 +233,11 @@ MACHINE_CONFIG_START(tonton_state::tonton) /* video hardware */ - MCFG_V9938_ADD("v9938", "screen", VDP_MEM, MAIN_CLOCK) - MCFG_V99X8_INTERRUPT_CALLBACK(INPUTLINE("maincpu", 0)) - MCFG_V99X8_SCREEN_ADD_NTSC("screen", "v9938", MAIN_CLOCK) + v9938_device &v9938(V9938(config, "v9938", MAIN_CLOCK)); + v9938.set_screen_ntsc("screen"); + v9938.set_vram_size(0x20000); + v9938.int_cb().set_inputline("maincpu", 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(HOPPER_PULSE), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW ) diff --git a/src/mame/drivers/tr175.cpp b/src/mame/drivers/tr175.cpp index a2483da9233..88429cf2fef 100644 --- a/src/mame/drivers/tr175.cpp +++ b/src/mame/drivers/tr175.cpp @@ -86,27 +86,30 @@ void tr175_state::ramdac_map(address_map &map) static INPUT_PORTS_START( tr175 ) INPUT_PORTS_END -MACHINE_CONFIG_START(tr175_state::tr175) - MCFG_DEVICE_ADD("maincpu", M68000, 12'000'000) - MCFG_DEVICE_PROGRAM_MAP(mem_map) - - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(XTAL(28'322'000), 900, 0, 720, 449, 0, 416) // guess - MCFG_SCREEN_UPDATE_DEVICE("avdc", scn2674_device, screen_update) - - MCFG_DEVICE_ADD("avdc", SCN2674, XTAL(28'322'000) / 18) // guess - MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_2)) - MCFG_SCN2674_CHARACTER_WIDTH(18) // guess - MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(tr175_state, draw_character) - MCFG_DEVICE_ADDRESS_MAP(0, vram_map) - MCFG_VIDEO_SET_SCREEN("screen") - - MCFG_DEVICE_ADD("duart", SCN2681, XTAL(11'059'200) / 3) // is this the right clock? - MCFG_MC68681_IRQ_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_1)) - - MCFG_PALETTE_ADD("palette", 0x100) - MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette") -MACHINE_CONFIG_END +void tr175_state::tr175(machine_config &config) +{ + M68000(config, m_maincpu, 12'000'000); + m_maincpu->set_addrmap(AS_PROGRAM, &tr175_state::mem_map); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(28.322_MHz_XTAL, 900, 0, 720, 449, 0, 416); // guess + screen.set_screen_update("avdc", FUNC(scn2674_device::screen_update)); + + scn2674_device &avdc(SCN2674(config, "avdc", 28.322_MHz_XTAL / 18)); // guess + avdc.intr_callback().set_inputline("maincpu", M68K_IRQ_2); + avdc.set_character_width(18); // guess + avdc.set_display_callback(FUNC(tr175_state::draw_character)); + avdc.set_addrmap(0, &tr175_state::vram_map); + avdc.set_screen("screen"); + + scn2681_device &duart(SCN2681(config, "duart", 11.0592_MHz_XTAL / 3)); // is this the right clock? + duart.irq_cb().set_inputline("maincpu", M68K_IRQ_1); + + PALETTE(config, "palette", 0x100); + ramdac_device &ramdac(RAMDAC(config, "ramdac", 0)); + ramdac.set_addrmap(0, &tr175_state::ramdac_map); + ramdac.set_palette("palette"); +} diff --git a/src/mame/drivers/tricep.cpp b/src/mame/drivers/tricep.cpp index f2a924e5dc4..4459d4e5980 100644 --- a/src/mame/drivers/tricep.cpp +++ b/src/mame/drivers/tricep.cpp @@ -83,35 +83,38 @@ void tricep_state::machine_reset() m_mux = 0; } -static DEVICE_INPUT_DEFAULTS_START( terminal ) +static const input_device_default terminal_defaults[] = +{ DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 ) // FIXME: should be 19200 with SCN2661B DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 ) DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 ) DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 ) DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE ) DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 ) -DEVICE_INPUT_DEFAULTS_END - -MACHINE_CONFIG_START(tricep_state::tricep) - MCFG_DEVICE_ADD("maincpu", M68000, XTAL(8'000'000)) - MCFG_DEVICE_PROGRAM_MAP(tricep_mem) - - MCFG_DEVICE_ADD("pci0", MC2661, 4915200) - MCFG_MC2661_TXD_HANDLER(WRITELINE("rs232", rs232_port_device, write_txd)) - MCFG_MC2661_RTS_HANDLER(WRITELINE("rs232", rs232_port_device, write_rts)) - MCFG_MC2661_DTR_HANDLER(WRITELINE("rs232", rs232_port_device, write_dtr)) - - MCFG_DEVICE_ADD("pci1", MC2661, 4915200) - MCFG_DEVICE_ADD("pci2", MC2661, 4915200) - MCFG_DEVICE_ADD("pci3", MC2661, 4915200) - - MCFG_DEVICE_ADD("rs232", RS232_PORT, default_rs232_devices, "terminal") - MCFG_RS232_RXD_HANDLER(WRITELINE("pci0", mc2661_device, rx_w)) - MCFG_RS232_DSR_HANDLER(WRITELINE("pci0", mc2661_device, dsr_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE("pci0", mc2661_device, dcd_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("pci0", mc2661_device, cts_w)) - MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS("terminal", terminal) -MACHINE_CONFIG_END + { nullptr, 0, 0 } +}; + +void tricep_state::tricep(machine_config &config) +{ + M68000(config, m_maincpu, XTAL(8'000'000)); + m_maincpu->set_addrmap(AS_PROGRAM, &tricep_state::tricep_mem); + + MC2661(config, m_pci[0], 4915200); + m_pci[0]->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); + m_pci[0]->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts)); + m_pci[0]->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr)); + + MC2661(config, m_pci[1], 4915200); + MC2661(config, m_pci[2], 4915200); + MC2661(config, m_pci[3], 4915200); + + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal")); + rs232.rxd_handler().set(m_pci[0], FUNC(mc2661_device::rx_w)); + rs232.dsr_handler().set(m_pci[0], FUNC(mc2661_device::dsr_w)); + rs232.dcd_handler().set(m_pci[0], FUNC(mc2661_device::dcd_w)); + rs232.cts_handler().set(m_pci[0], FUNC(mc2661_device::cts_w)); + rs232.set_option_device_input_defaults("terminal", terminal_defaults); +} /* ROM definition */ ROM_START( tricep ) diff --git a/src/mame/drivers/tv912.cpp b/src/mame/drivers/tv912.cpp index 4fada0f6ec3..637497d5f1a 100644 --- a/src/mame/drivers/tv912.cpp +++ b/src/mame/drivers/tv912.cpp @@ -896,7 +896,7 @@ void tv912_state::tv912(machine_config &config) TMS9927(config, m_crtc, 23.814_MHz_XTAL / CHAR_WIDTH); m_crtc->set_char_width(CHAR_WIDTH); - m_crtc->vsyn_wr_callback().set_inputline(m_maincpu, MCS48_INPUT_IRQ); + m_crtc->vsyn_callback().set_inputline(m_maincpu, MCS48_INPUT_IRQ); m_crtc->set_screen("screen"); AY51013(config, m_uart); diff --git a/src/mame/drivers/tv955.cpp b/src/mame/drivers/tv955.cpp index e95f79084e5..f31cb308372 100644 --- a/src/mame/drivers/tv955.cpp +++ b/src/mame/drivers/tv955.cpp @@ -82,29 +82,29 @@ void tv955_state::mem_map(address_map &map) static INPUT_PORTS_START( tv955 ) INPUT_PORTS_END -MACHINE_CONFIG_START(tv955_state::tv955) - MCFG_DEVICE_ADD("maincpu", M65C02, 19.3396_MHz_XTAL / 9) - MCFG_DEVICE_PROGRAM_MAP(mem_map) +void tv955_state::tv955(machine_config &config) +{ + M65C02(config, m_maincpu, 19.3396_MHz_XTAL / 9); + m_maincpu->set_addrmap(AS_PROGRAM, &tv955_state::mem_map); - MCFG_INPUT_MERGER_ANY_HIGH("mainirq") - MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", m6502_device::IRQ_LINE)) + INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, m6502_device::IRQ_LINE); - MCFG_DEVICE_ADD("keyboard", I8049, 5.7143_MHz_XTAL) + I8049(config, "keyboard", 5.7143_MHz_XTAL); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // HM6116LP-4 + 3.2V battery - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(19.3396_MHz_XTAL, 846, 0, 720, 381, 0, 364) - //MCFG_SCREEN_RAW_PARAMS(31.684_MHz_XTAL, 1386, 0, 1188, 381, 0, 364) - MCFG_SCREEN_UPDATE_DEVICE("crtc", scn2674_device, screen_update) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(19.3396_MHz_XTAL, 846, 0, 720, 381, 0, 364); + //screen.set_raw(31.684_MHz_XTAL, 1386, 0, 1188, 381, 0, 364); + screen.set_screen_update("crtc", FUNC(scn2674_device::screen_update)); - MCFG_DEVICE_ADD("crtc", SCN2674, 19.3396_MHz_XTAL / 9) + SCN2674(config, m_crtc, 19.3396_MHz_XTAL / 9); // Character clock is 31.684_MHz_XTAL / 9 in 132-column mode // Character cells are 9 pixels wide by 14 pixels high - MCFG_SCN2674_CHARACTER_WIDTH(9) - MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(tv955_state, draw_character) - MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("maincpu", m6502_device::NMI_LINE)) - MCFG_VIDEO_SET_SCREEN("screen") + m_crtc->set_character_width(9); + m_crtc->set_display_callback(FUNC(tv955_state::draw_character)); + m_crtc->intr_callback().set_inputline(m_maincpu, m6502_device::NMI_LINE); + m_crtc->set_screen("screen"); MOS6551(config, m_hostuart, 0); m_hostuart->set_xtal(3.6864_MHz_XTAL); @@ -117,7 +117,7 @@ MACHINE_CONFIG_START(tv955_state::tv955) mos6551_device &keybuart(MOS6551(config, "keybuart", 0)); keybuart.set_xtal(3.6864_MHz_XTAL / 2); keybuart.irq_handler().set("mainirq", FUNC(input_merger_device::in_w<2>)); -MACHINE_CONFIG_END +} /************************************************************************************************************** diff --git a/src/mame/drivers/tv965.cpp b/src/mame/drivers/tv965.cpp index 8cb3ae3f92c..35feda20d5c 100644 --- a/src/mame/drivers/tv965.cpp +++ b/src/mame/drivers/tv965.cpp @@ -70,30 +70,31 @@ void tv965_state::program_map(address_map &map) static INPUT_PORTS_START( tv965 ) INPUT_PORTS_END -MACHINE_CONFIG_START(tv965_state::tv965) - MCFG_DEVICE_ADD("maincpu", G65816, 44.4528_MHz_XTAL / 10) - MCFG_DEVICE_DATA_MAP(mem_map) - MCFG_DEVICE_PROGRAM_MAP(program_map) +void tv965_state::tv965(machine_config &config) +{ + G65816(config, m_maincpu, 44.4528_MHz_XTAL / 10); + m_maincpu->set_addrmap(AS_DATA, &tv965_state::mem_map); + m_maincpu->set_addrmap(AS_PROGRAM, &tv965_state::program_map); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // CXK5864BP-10L + battery - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(26.9892_MHz_XTAL, 1020, 0, 800, 441, 0, 416) - //MCFG_SCREEN_RAW_PARAMS(44.4528_MHz_XTAL, 1680, 0, 1320, 441, 0, 416) - MCFG_SCREEN_UPDATE_DEVICE("crtc", scn2672_device, screen_update) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(26.9892_MHz_XTAL, 1020, 0, 800, 441, 0, 416); + //m_screen->set_raw(44.4528_MHz_XTAL, 1680, 0, 1320, 441, 0, 416); + m_screen->set_screen_update("crtc", FUNC(scn2672_device::screen_update)); - MCFG_DEVICE_ADD("crtc", SCN2672, 26.9892_MHz_XTAL / 10) - MCFG_SCN2672_CHARACTER_WIDTH(10) - MCFG_SCN2672_DRAW_CHARACTER_CALLBACK_OWNER(tv965_state, draw_character) - MCFG_SCN2672_INTR_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI)) - MCFG_VIDEO_SET_SCREEN("screen") + scn2672_device &crtc(SCN2672(config, "crtc", 26.9892_MHz_XTAL / 10)); + crtc.set_character_width(10); + crtc.set_display_callback(FUNC(tv965_state::draw_character)); + crtc.intr_callback().set_inputline("maincpu", INPUT_LINE_NMI); + crtc.set_screen("screen"); mos6551_device &acia1(MOS6551(config, "acia1", 0)); acia1.set_xtal(3.6864_MHz_XTAL / 2); // divider not verified, possibly even programmable mos6551_device &acia2(MOS6551(config, "acia2", 0)); acia2.set_xtal(3.6864_MHz_XTAL / 2); // divider not verified, possibly even programmable -MACHINE_CONFIG_END +} /************************************************************************************************************** diff --git a/src/mame/drivers/twinkle.cpp b/src/mame/drivers/twinkle.cpp index cea9840352d..042f08abef0 100644 --- a/src/mame/drivers/twinkle.cpp +++ b/src/mame/drivers/twinkle.cpp @@ -245,6 +245,7 @@ Notes: #include "sound/spu.h" #include "sound/cdda.h" #include "sound/rf5c400.h" +#include "screen.h" #include "speaker.h" #include "bmiidx.lh" @@ -1122,6 +1123,9 @@ MACHINE_CONFIG_START(twinkle_state::twinkle) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x200000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN("screen") + + SCREEN(config, "screen", SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "speakerleft").front_left(); diff --git a/src/mame/drivers/ultrsprt.cpp b/src/mame/drivers/ultrsprt.cpp index 5f2b09f50f4..9ee55da84b6 100644 --- a/src/mame/drivers/ultrsprt.cpp +++ b/src/mame/drivers/ultrsprt.cpp @@ -267,8 +267,8 @@ MACHINE_CONFIG_START(ultrsprt_state::ultrsprt) MCFG_PALETTE_FORMAT(xRRRRRGGGGGBBBBB) /* sound hardware */ - MCFG_K056800_ADD("k056800", XTAL(18'432'000)) - MCFG_K056800_INT_HANDLER(INPUTLINE("audiocpu", M68K_IRQ_6)) + K056800(config, m_k056800, XTAL(18'432'000)); + m_k056800->int_callback().set_inputline(m_audiocpu, M68K_IRQ_6); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); diff --git a/src/mame/drivers/v100.cpp b/src/mame/drivers/v100.cpp index d5fa5d4152f..7f4ba23e410 100644 --- a/src/mame/drivers/v100.cpp +++ b/src/mame/drivers/v100.cpp @@ -371,8 +371,8 @@ MACHINE_CONFIG_START(v100_state::v100) CRT5037(config, m_vtac, XTAL(47'736'000) / CHAR_WIDTH); m_vtac->set_char_width(CHAR_WIDTH); m_vtac->set_screen("screen"); - m_vtac->hsyn_wr_callback().set(FUNC(v100_state::picu_r_w<7>)).invert(); - m_vtac->vsyn_wr_callback().set(FUNC(v100_state::picu_r_w<6>)).invert(); + m_vtac->hsyn_callback().set(FUNC(v100_state::picu_r_w<7>)).invert(); + m_vtac->vsyn_callback().set(FUNC(v100_state::picu_r_w<6>)).invert(); I8214(config, m_picu, XTAL(47'736'000) / 12); m_picu->int_wr_callback().set_inputline(m_maincpu, 0, ASSERT_LINE); diff --git a/src/mame/drivers/v550.cpp b/src/mame/drivers/v550.cpp index 546efa12438..eafbd292fbd 100644 --- a/src/mame/drivers/v550.cpp +++ b/src/mame/drivers/v550.cpp @@ -107,17 +107,18 @@ void v550_state::machine_start() m_usart->write_cts(0); } -MACHINE_CONFIG_START(v550_state::v550) - MCFG_DEVICE_ADD("maincpu", Z80, 34.846_MHz_XTAL / 16) // NEC D780C (2.177875 MHz verified) - MCFG_DEVICE_PROGRAM_MAP(mem_map) - MCFG_DEVICE_IO_MAP(io_map) +void v550_state::v550(machine_config &config) +{ + Z80(config, m_maincpu, 34.846_MHz_XTAL / 16); // NEC D780C (2.177875 MHz verified) + m_maincpu->set_addrmap(AS_PROGRAM, &v550_state::mem_map); + m_maincpu->set_addrmap(AS_IO, &v550_state::io_map); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // NEC D444C-2 + battery - MCFG_DEVICE_ADD("gdc", UPD7220, 34.846_MHz_XTAL / 16) // NEC D7220D (2.177875 MHz verified) - MCFG_VIDEO_SET_SCREEN("screen") + upd7220_device &gdc(UPD7220(config, "gdc", 34.846_MHz_XTAL / 16)); // NEC D7220D (2.177875 MHz verified) + gdc.set_screen("screen"); - MCFG_DEVICE_ADD("ppi", I8255, 0) // NEC D8255AC-5 + I8255(config, "ppi"); // NEC D8255AC-5 I8251(config, m_usart, 34.846_MHz_XTAL / 16); // NEC D8251AC m_usart->rxrdy_handler().set("mainint", FUNC(input_merger_device::in_w<1>)); @@ -137,21 +138,21 @@ MACHINE_CONFIG_START(v550_state::v550) brg2.fr_handler().set("usart", FUNC(i8251_device::write_txc)); brg2.fr_handler().append("usart", FUNC(i8251_device::write_rxc)); - MCFG_DEVICE_ADD("kbdmcu", I8035, 4'608'000) - MCFG_DEVICE_PROGRAM_MAP(kbd_map) + mcs48_cpu_device &kbdmcu(I8035(config, "kbdmcu", 4'608'000)); + kbdmcu.set_addrmap(AS_PROGRAM, &v550_state::kbd_map); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(34.846_MHz_XTAL, 19 * 102, 0, 19 * 80, 295, 0, 272) - MCFG_SCREEN_UPDATE_DRIVER(v550_state, screen_update) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(34.846_MHz_XTAL, 19 * 102, 0, 19 * 80, 295, 0, 272); + m_screen->set_screen_update(FUNC(v550_state::screen_update)); - MCFG_DEVICE_ADD("pvtc", SCN2672, 34.846_MHz_XTAL / 19) - MCFG_DEVICE_ADDRESS_MAP(0, pvtc_char_map) - MCFG_DEVICE_ADDRESS_MAP(1, pvtc_attr_map) - MCFG_SCN2672_CHARACTER_WIDTH(19) - MCFG_SCN2672_INTR_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI)) - MCFG_VIDEO_SET_SCREEN("screen") + scn2672_device &pvtc(SCN2672(config, "pvtc", 34.846_MHz_XTAL / 19)); + pvtc.set_addrmap(0, &v550_state::pvtc_char_map); + pvtc.set_addrmap(1, &v550_state::pvtc_attr_map); + pvtc.set_character_width(19); + pvtc.intr_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); + pvtc.set_screen("screen"); // SCB2673 clock verified at 17.423 MHz -MACHINE_CONFIG_END +} ROM_START( v550 ) diff --git a/src/mame/drivers/vastar.cpp b/src/mame/drivers/vastar.cpp index b13171a41da..8a872e9bf13 100644 --- a/src/mame/drivers/vastar.cpp +++ b/src/mame/drivers/vastar.cpp @@ -674,9 +674,9 @@ ROM_START( dogfightp ) // all 2732 ROM_LOAD( "9.7m", 0x0800, 0x1000, CRC(ffe05fee) SHA1(70b9d0808defd936e2c3567f8e6996a19753de81) ) ROM_LOAD( "10.7p", 0x1800, 0x1000, CRC(2cb51793) SHA1(d90177ef28730774202a04a0846281537a1883df) ) - ROM_REGION( 0x0040, "videopcb:proms", 0 ) // not dumped for this set, on ORCA OVG-40c sub board - ROM_LOAD( "mmi6331.2a", 0x0000, 0x0020, CRC(69a35aa5) SHA1(fe494ed1ff642f95834dfca92e9c4494e04f7b81) ) - ROM_LOAD( "mmi6331.2b", 0x0020, 0x0020, CRC(596ae457) SHA1(1c1a3130d88c5fd5c66ce9f91d97a09c0a0b535f) ) + ROM_REGION( 0x0040, "videopcb:proms", 0 ) // on ORCA OVG-40c sub board + ROM_LOAD( "blue.2a.82s123", 0x0000, 0x0020, CRC(aa839a24) SHA1(9b8217e1c257d24e873888fd083c099fc93c7878) ) //doesn't match parent + ROM_LOAD( "pink.2b.82s123", 0x0020, 0x0020, CRC(596ae457) SHA1(1c1a3130d88c5fd5c66ce9f91d97a09c0a0b535f) ) ROM_END ROM_START( pprobe ) diff --git a/src/mame/drivers/vegas.cpp b/src/mame/drivers/vegas.cpp index 03881dfa565..90c69decf34 100644 --- a/src/mame/drivers/vegas.cpp +++ b/src/mame/drivers/vegas.cpp @@ -1763,6 +1763,7 @@ MACHINE_CONFIG_START(vegas_state::vegascore) ide.irq_handler().set(PCI_ID_NILE, FUNC(vrc5074_device::pci_intr_d)); //ide.set_pif(0x8f); + /* video hardware */ voodoo_2_pci_device &voodoo(VOODOO_2_PCI(config, PCI_ID_VIDEO, 0, m_maincpu, "screen")); voodoo.set_fbmem(2); voodoo.set_tmumem(4, 4); @@ -1775,15 +1776,13 @@ MACHINE_CONFIG_START(vegas_state::vegascore) SMC91C94(config, m_ethernet, 0); m_ethernet->irq_handler().set(FUNC(vegas_state::ethernet_interrupt)); - /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) + /* screen */ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // Screeen size and timing is re-calculated later in voodoo card - MCFG_SCREEN_REFRESH_RATE(57) - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE_DEVICE(PCI_ID_VIDEO, voodoo_pci_device, screen_update) - - /* sound hardware */ + screen.set_refresh_hz(57); + screen.set_size(640, 480); + screen.set_visarea(0, 640 - 1, 0, 480 - 1); + screen.set_screen_update(PCI_ID_VIDEO, FUNC(voodoo_pci_device::screen_update)); MACHINE_CONFIG_END @@ -2457,7 +2456,7 @@ void vegas_state::init_cartfury() /* Vegas + Vegas SIO + Voodoo 2 */ GAME( 1998, gauntleg, 0, gauntleg, gauntleg, vegas_state, init_gauntleg, ROT0, "Atari Games", "Gauntlet Legends (version 1.6)", MACHINE_SUPPORTS_SAVE ) -GAME( 1998, gauntleg12, gauntleg, gauntleg, gauntleg, vegas_state, init_gauntleg, ROT0, "Atari Games", "Gauntlet Legends (version 1.2)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1998, gauntleg12, gauntleg, gauntleg, gauntleg, vegas_state, init_gauntleg, ROT0, "Atari Games", "Gauntlet Legends (version 1.2)", MACHINE_SUPPORTS_SAVE ) GAME( 1998, tenthdeg, 0, tenthdeg, tenthdeg, vegas_state, init_tenthdeg, ROT0, "Atari Games", "Tenth Degree (prototype)", MACHINE_SUPPORTS_SAVE ) /* Durango + Vegas SIO + Voodoo 2 */ @@ -2474,16 +2473,16 @@ GAME( 1999, roadburn, 0, roadburn, roadburn, vegas_state, init_roadburn GAME( 1999, roadburn1, roadburn, roadburn, roadburn, vegas_state, init_roadburn, ROT0, "Atari Games", "Road Burners (ver 1.0)", MACHINE_SUPPORTS_SAVE ) /* Durango + DSIO? + Voodoo banshee */ -GAME( 1998, nbashowt, 0, nbashowt, nbashowt, vegas_state, init_nbashowt, ROT0, "Midway Games", "NBA Showtime: NBA on NBC (ver 2.0)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) -GAME( 1999, nbanfl, 0, nbanfl, nbashowt, vegas_state, init_nbanfl, ROT0, "Midway Games", "NBA Showtime / NFL Blitz 2000 (ver 2.1)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) -GAME( 2000, nbagold , 0, nbagold, nbashowt, vegas_state, init_nbagold, ROT0, "Midway Games", "NBA Showtime Gold / NFL Blitz 2000 (ver 3.0) (Sports Station?)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1998, nbashowt, 0, nbashowt, nbashowt, vegas_state, init_nbashowt, ROT0, "Midway Games", "NBA Showtime: NBA on NBC (ver 2.0)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // random freezes on the 3d parts +GAME( 1999, nbanfl, 0, nbanfl, nbashowt, vegas_state, init_nbanfl, ROT0, "Midway Games", "NBA Showtime / NFL Blitz 2000 (ver 2.1)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) //attempting to run blitz on either v2.1 or v3.0 wlil reset the machine +GAME( 2000, nbagold , 0, nbagold, nbashowt, vegas_state, init_nbagold, ROT0, "Midway Games", "NBA Showtime Gold / NFL Blitz 2000 (ver 3.0) (Sports Station?)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* Durango + Denver SIO + Voodoo 3 */ -GAMEL( 1999, sf2049, 0, sf2049, sf2049, vegas_state, init_sf2049, ROT0, "Atari Games", "San Francisco Rush 2049", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 ) -GAMEL( 2003, sf2049se, sf2049, sf2049se, sf2049se, vegas_state, init_sf2049se, ROT0, "Atari Games", "San Francisco Rush 2049: Special Edition", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 ) -GAMEL( 2000, sf2049te, sf2049, sf2049te, sf2049se, vegas_state, init_sf2049te, ROT0, "Atari Games", "San Francisco Rush 2049: Tournament Edition", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 ) -GAMEL( 2001, sf2049tea, sf2049, sf2049te, sf2049se, vegas_state, init_sf2049te, ROT0, "Atari Games", "San Francisco Rush 2049: Tournament Edition Unlocked", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 ) +GAMEL( 1999, sf2049, 0, sf2049, sf2049, vegas_state, init_sf2049, ROT0, "Atari Games", "San Francisco Rush 2049", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 ) +GAMEL( 2003, sf2049se, sf2049, sf2049se, sf2049se, vegas_state, init_sf2049se, ROT0, "Atari Games", "San Francisco Rush 2049: Special Edition", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 ) +GAMEL( 2000, sf2049te, sf2049, sf2049te, sf2049se, vegas_state, init_sf2049te, ROT0, "Atari Games", "San Francisco Rush 2049: Tournament Edition", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 ) +GAMEL( 2001, sf2049tea, sf2049, sf2049te, sf2049se, vegas_state, init_sf2049te, ROT0, "Atari Games", "San Francisco Rush 2049: Tournament Edition Unlocked", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 ) /* Durango + Vegas SIO + Voodoo 3 */ -GAME( 2000, cartfury, 0, cartfury, cartfury, vegas_state, init_cartfury, ROT0, "Midway Games", "Cart Fury", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 2000, cartfury, 0, cartfury, cartfury, vegas_state, init_cartfury, ROT0, "Midway Games", "Cart Fury", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/videolich.cpp b/src/mame/drivers/videolich.cpp new file mode 100644 index 00000000000..c72795d285f --- /dev/null +++ b/src/mame/drivers/videolich.cpp @@ -0,0 +1,213 @@ +// license:BSD-3-Clause +// copyright-holders:Robbbert +/**************************************************************************************** + +2018-09-15 + +Unknown b&w gambling game. + +VIDEO-GAMES - LICH/GERMANY 1017a + +NEC D8080AFC (i8080), unknown xtal, bank of 7 dips. 10x 4-bit proms, type F93453 (=82S137) +Video Ram = 7 x 2102 (bit 7 omitted). Main Ram = 2x MCM145101 (=M5101L). +The game has sound (there's a LM380N visible), looks like there's a bunch of chips +involved, and a 555. + +To Do: +- Sound +- Inputs / the correct dip settings +- CPU clock +- Name of the machine + +*******************************************************************************************/ + +#include "emu.h" +#include "cpu/i8085/i8085.h" +#include "screen.h" +#include "emupal.h" + + +class videolich_state : public driver_device +{ +public: + videolich_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this,"maincpu") + , m_p_videoram(*this, "videoram") + , m_p_chargen(*this, "chargen") + { } + + void videolich(machine_config &config); + +private: + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void mem_map(address_map &map); + void io_map(address_map &map); + required_device<cpu_device> m_maincpu; + required_shared_ptr<u8> m_p_videoram; + required_region_ptr<u8> m_p_chargen; +}; + + +uint32_t videolich_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + uint8_t y,ra,chr,gfx; + uint16_t sy=0,ma=0,x; + + for (y = 0; y < 28; y++) + { + for (ra = 0; ra < 8; ra++) + { + uint16_t *p = &bitmap.pix16(sy++); + + for (x = 0; x < 32; x++) + { + chr = m_p_videoram[x+ma] & 0x7f; + gfx = m_p_chargen[(chr<<3) | ra ]; + + /* Display a scanline of a character */ + *p++ = BIT(gfx, 7); + *p++ = BIT(gfx, 6); + *p++ = BIT(gfx, 5); + *p++ = BIT(gfx, 4); + *p++ = BIT(gfx, 3); + *p++ = BIT(gfx, 2); + *p++ = BIT(gfx, 1); + *p++ = BIT(gfx, 0); + } + } + ma+=32; + } + return 0; +} + +void videolich_state::mem_map(address_map &map) { + map(0x0000,0x0fff).rom().mirror(0x3000); + map(0xe000,0xe3ff).ram().share("videoram"); + map(0xff00,0xffff).ram(); +} + +void videolich_state::io_map(address_map &map) { + map(0x02,0x02).nopw(); // lots of unknown writes, might be some kind of dac + map(0x04,0x04); //.w unknown write + map(0x08,0x08); //.w unknown write + map(0x41,0x41).portr("IN41"); + map(0x42,0x42).portr("IN42"); + map(0x44,0x44); //.r in the code, but was never reached +} + + +static INPUT_PORTS_START( videolich ) + PORT_START("IN41") + PORT_DIPNAME( 0x01, 0x01, "41b0" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "41b1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, "41b2" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "41b3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "41b4" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, "41b5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, "41b6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "41b7" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("IN42") + PORT_DIPNAME( 0x01, 0x01, "42b0" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "42b1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, "42b2" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "42b3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "42b4" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, "42b5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, "42b6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "42b7" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) +INPUT_PORTS_END + + +static const gfx_layout videolich_charlayout = +{ + 8, 8, // 8 x 8 characters + 128, // 128 characters, but only the first 76 look useful + 1, // 1 bits per pixel + { 0 }, // no bitplanes + /* x offsets */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, + /* y offsets */ + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, + 8*8 /* every char takes 8 bytes */ +}; + +static GFXDECODE_START( gfx_videolich ) + GFXDECODE_ENTRY( "chargen", 0x0000, videolich_charlayout, 0, 1 ) +GFXDECODE_END + +MACHINE_CONFIG_START( videolich_state::videolich ) + /* basic machine hardware */ + MCFG_DEVICE_ADD("maincpu", I8080, 20.79_MHz_XTAL / 8) // crystal confirmed but divisor unknown + MCFG_DEVICE_PROGRAM_MAP(mem_map) + MCFG_DEVICE_IO_MAP(io_map) + + /* video hardware */ + MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::white()) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(250)) + MCFG_SCREEN_UPDATE_DRIVER(videolich_state, screen_update) + MCFG_SCREEN_SIZE(32*8, 28*8) + MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 28*8-1) + MCFG_SCREEN_PALETTE("palette") + + MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_videolich) + MCFG_PALETTE_ADD_MONOCHROME("palette") + + /* sound hardware */ +MACHINE_CONFIG_END + + + +ROM_START( videolich ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD_NIB_HIGH( "lich_prg.02", 0x0000, 0x0400, CRC(05585e39) SHA1(7eefb5d63b4499a303ecdcad6af5df9fe9c89205) ) + ROM_LOAD_NIB_LOW ( "lich_prg.03", 0x0000, 0x0400, CRC(b9134e96) SHA1(e7a8ff71f735add608d3c9dcc287ca37414debcb) ) + ROM_LOAD_NIB_HIGH( "lich_prg.04", 0x0400, 0x0400, CRC(8a6aa143) SHA1(16973106a95b17d8c4712db8aa7ef564751ae6d4) ) + ROM_LOAD_NIB_LOW ( "lich_prg.05", 0x0400, 0x0400, CRC(98c07d4d) SHA1(d3126b5484c67ecc7c44ddc25b48ff72ed8a734f) ) + ROM_LOAD_NIB_HIGH( "lich_prg.76", 0x0800, 0x0400, CRC(737c27f5) SHA1(55c7eb29b979d35633e5fb2c1c1ac3117901a0f0) ) + ROM_LOAD_NIB_LOW ( "lich_prg.78", 0x0800, 0x0400, CRC(c1081a2f) SHA1(24dc1d9afa4635c3114369c338903343a8b81d1a) ) + ROM_LOAD_NIB_HIGH( "lich_prg.77", 0x0c00, 0x0400, CRC(3a725b98) SHA1(efa3802025f1f99b45e56abd85dc3d1860d4734d) ) + ROM_LOAD_NIB_LOW ( "lich_prg.79", 0x0c00, 0x0400, CRC(044d1bfd) SHA1(5a57c1ab7eb7dd7ed05852e128b704c3b37a87b8) ) + + ROM_REGION( 0x0400, "chargen", 0 ) + ROM_LOAD_NIB_HIGH( "lich_gfx.29", 0x0000, 0x0400, CRC(2b70870d) SHA1(1f50a6976e1634020c78f10c1259e38f5e010a86) ) + ROM_LOAD_NIB_LOW ( "lich_gfx.43", 0x0000, 0x0400, CRC(0ecb0aab) SHA1(7f3f1b93a5d38828ae3e97e5f8ef1a6a96dc798b) ) +ROM_END + +GAME(19??, videolich, 0, videolich, videolich, videolich_state, empty_init, ROT0, "Video Games GmbH", "unnamed gambling game", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND) + diff --git a/src/mame/drivers/viper.cpp b/src/mame/drivers/viper.cpp index 4e7abd4c6ce..5e4e5ccc612 100644 --- a/src/mame/drivers/viper.cpp +++ b/src/mame/drivers/viper.cpp @@ -2388,10 +2388,10 @@ void viper_state::machine_reset() MACHINE_CONFIG_START(viper_state::viper) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", MPC8240, 166666666) // Unknown - MCFG_PPC_BUS_FREQUENCY(100000000) - MCFG_DEVICE_PROGRAM_MAP(viper_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", viper_state, viper_vblank) + MPC8240(config, m_maincpu, 166666666); // Unknown + m_maincpu->set_bus_frequency(100000000); + m_maincpu->set_addrmap(AS_PROGRAM, &viper_state::viper_map); + m_maincpu->set_vblank_int("screen", FUNC(viper_state::viper_vblank)); MCFG_PCI_BUS_LEGACY_ADD("pcibus", 0) MCFG_PCI_BUS_LEGACY_DEVICE(0, DEVICE_SELF, viper_state, mpc8240_pci_r, mpc8240_pci_w) @@ -2399,29 +2399,31 @@ MACHINE_CONFIG_START(viper_state::viper) ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, true); - MCFG_DEVICE_ADD("voodoo", VOODOO_3, STD_VOODOO_3_CLOCK) - MCFG_VOODOO_FBMEM(8) - MCFG_VOODOO_SCREEN_TAG("screen") - MCFG_VOODOO_CPU_TAG("maincpu") - MCFG_VOODOO_VBLANK_CB(WRITELINE(*this, viper_state,voodoo_vblank)) - MCFG_VOODOO_PCIINT_CB(WRITELINE(*this, viper_state, voodoo_pciint)) + VOODOO_3(config, m_voodoo, STD_VOODOO_3_CLOCK); + m_voodoo->set_fbmem(8); + m_voodoo->set_screen_tag("screen"); + m_voodoo->set_cpu_tag("maincpu"); + m_voodoo->vblank_callback().set(FUNC(viper_state::voodoo_vblank)); + m_voodoo->pciint_callback().set(FUNC(viper_state::voodoo_pciint)); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_SIZE(1024, 768) - MCFG_SCREEN_VISIBLE_AREA(0, 1023, 0, 383) - MCFG_SCREEN_UPDATE_DRIVER(viper_state, screen_update_viper) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + // Screeen size and timing is re-calculated later in voodoo card + screen.set_refresh_hz(60); + screen.set_size(1024, 768); + screen.set_visarea(0, 1024 - 1, 0, 768 - 1); + screen.set_screen_update(FUNC(viper_state::screen_update_viper)); - MCFG_PALETTE_ADD("palette", 65536) + PALETTE(config, "palette", 65536); - MCFG_TIMER_ADD_NONE("ds2430_timer2") + TIMER(config, "ds2430_timer2", 0); + //MCFG_TIMER_ADD_NONE("ds2430_timer2") /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("m48t58", M48T58, 0) + M48T58(config, "m48t58", 0); MACHINE_CONFIG_END /*****************************************************************************/ diff --git a/src/mame/drivers/vp122.cpp b/src/mame/drivers/vp122.cpp index 451551c8a9e..4f96e34bd76 100644 --- a/src/mame/drivers/vp122.cpp +++ b/src/mame/drivers/vp122.cpp @@ -22,7 +22,8 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_screen(*this, "screen") - , m_p_chargen(*this, "chargen") + , m_avdc(*this, "avdc") + , m_chargen(*this, "chargen") { } void vp122(machine_config &config); @@ -39,7 +40,8 @@ private: required_device<cpu_device> m_maincpu; required_device<screen_device> m_screen; - required_region_ptr<u8> m_p_chargen; + required_device<scn2674_device> m_avdc; + required_region_ptr<u8> m_chargen; }; @@ -87,25 +89,26 @@ void vp122_state::attr_map(address_map &map) static INPUT_PORTS_START( vp122 ) INPUT_PORTS_END -MACHINE_CONFIG_START(vp122_state::vp122) - MCFG_DEVICE_ADD("maincpu", I8085A, 8_MHz_XTAL) - MCFG_DEVICE_PROGRAM_MAP(mem_map) - MCFG_DEVICE_IO_MAP(io_map) +void vp122_state::vp122(machine_config &config) +{ + I8085A(config, m_maincpu, 8_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &vp122_state::mem_map); + m_maincpu->set_addrmap(AS_IO, &vp122_state::io_map); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // MK48Z02 - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(14.916_MHz_XTAL, 960, 0, 800, 259, 0, 240) - //MCFG_SCREEN_RAW_PARAMS(22.096_MHz_XTAL, 1422, 0, 1188, 259, 0, 240) - MCFG_SCREEN_UPDATE_DEVICE("avdc", scn2674_device, screen_update) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(14.916_MHz_XTAL, 960, 0, 800, 259, 0, 240); + //m_screen->set_raw(22.096_MHz_XTAL, 1422, 0, 1188, 259, 0, 240); + m_screen->set_screen_update("avdc", FUNC(scn2674_device::screen_update)); - MCFG_DEVICE_ADD("avdc", SCN2674, 14.916_MHz_XTAL / 10) - MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("maincpu", I8085_RST65_LINE)) - MCFG_SCN2674_CHARACTER_WIDTH(10) // 9 in 132-column modes - MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(vp122_state, draw_character) - MCFG_DEVICE_ADDRESS_MAP(0, char_map) - MCFG_DEVICE_ADDRESS_MAP(1, attr_map) - MCFG_VIDEO_SET_SCREEN("screen") + SCN2674(config, m_avdc, 14.916_MHz_XTAL / 10); + m_avdc->intr_callback().set_inputline(m_maincpu, I8085_RST65_LINE); + m_avdc->set_character_width(10); // 9 in 132-column modes + m_avdc->set_display_callback(FUNC(vp122_state::draw_character)); + m_avdc->set_addrmap(0, &vp122_state::char_map); + m_avdc->set_addrmap(1, &vp122_state::attr_map); + m_avdc->set_screen("screen"); scn2681_device &duart(SCN2681(config, "duart", 3.6864_MHz_XTAL)); duart.irq_cb().set_inputline("maincpu", I8085_RST55_LINE); @@ -113,11 +116,11 @@ MACHINE_CONFIG_START(vp122_state::vp122) duart.outport_cb().append("usart", FUNC(i8251_device::write_rxc)).bit(3); // OP7 = 0 for 80-column modes, 1 for 132-column modes - MCFG_DEVICE_ADD("usart", I8251, 8_MHz_XTAL / 2) + I8251(config, "usart", 8_MHz_XTAL / 2); - MCFG_DEVICE_ADD("pit", PIT8253, 0) + PIT8253(config, "pit", 0); // Input clocks are video-related and should differ for 80-column and 132-column modes -MACHINE_CONFIG_END +} /************************************************************************************************************** diff --git a/src/mame/drivers/wangpc.cpp b/src/mame/drivers/wangpc.cpp index 1100b867722..d77a2d3b48d 100644 --- a/src/mame/drivers/wangpc.cpp +++ b/src/mame/drivers/wangpc.cpp @@ -1319,12 +1319,12 @@ MACHINE_CONFIG_START(wangpc_state::wangpc) m_uart->dr_callback().set(FUNC(wangpc_state::uart_dr_w)); m_uart->tbre_callback().set(FUNC(wangpc_state::uart_tbre_w)); - MCFG_DEVICE_ADD(SCN2661_TAG, MC2661, 0) - MCFG_MC2661_TXD_HANDLER(WRITELINE(RS232_TAG, rs232_port_device, write_txd)) - MCFG_MC2661_RXRDY_HANDLER(WRITELINE(*this, wangpc_state, epci_irq_w)) - MCFG_MC2661_RTS_HANDLER(WRITELINE(RS232_TAG, rs232_port_device, write_rts)) - MCFG_MC2661_DTR_HANDLER(WRITELINE(RS232_TAG, rs232_port_device, write_dtr)) - MCFG_MC2661_TXEMT_DSCHG_HANDLER(WRITELINE(*this, wangpc_state, epci_irq_w)) + MC2661(config, m_epci, 0); + m_epci->txd_handler().set(RS232_TAG, FUNC(rs232_port_device::write_txd)); + m_epci->rxrdy_handler().set(FUNC(wangpc_state::epci_irq_w)); + m_epci->rts_handler().set(RS232_TAG, FUNC(rs232_port_device::write_rts)); + m_epci->dtr_handler().set(RS232_TAG, FUNC(rs232_port_device::write_dtr)); + m_epci->txemt_dschg_handler().set(FUNC(wangpc_state::epci_irq_w)); MCFG_UPD765A_ADD(UPD765_TAG, false, false) MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(*this, wangpc_state, fdc_irq)) diff --git a/src/mame/drivers/wecleman.cpp b/src/mame/drivers/wecleman.cpp index 44f8505c532..f66affd4761 100644 --- a/src/mame/drivers/wecleman.cpp +++ b/src/mame/drivers/wecleman.cpp @@ -35,6 +35,14 @@ Hardware Main Sub Sound Sound Chips ---------------------------------------------------------------------- [WEC Le Mans 24] 68000 68000 Z-80 YM2151 YM3012 1x007232 +[CPU PCB GX602 201020A] + 007640 007641 007232 007452 + +[VID PCB GX602 201023] + 003634 003635 007557 007558 007559 +(note: 003634 and 003635 chips locations are marked 007634 and 007635 on PCB) + + [Hot Chase] 68000 68000 68B09E 3x007232 [CPU PCB GX763 350861B] @@ -1147,7 +1155,7 @@ MACHINE_CONFIG_START(wecleman_state::hotchase) MCFG_SCREEN_PALETTE("palette") MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_hotchase) - MCFG_PALETTE_ADD("palette", 2048*2) + MCFG_PALETTE_ADD("palette", 8192) MCFG_VIDEO_START_OVERRIDE(wecleman_state, hotchase) diff --git a/src/mame/drivers/zn.cpp b/src/mame/drivers/zn.cpp index 5ba1a7e7dc7..b6eb60e5b30 100644 --- a/src/mame/drivers/zn.cpp +++ b/src/mame/drivers/zn.cpp @@ -29,6 +29,7 @@ #include "machine/nvram.h" #include "machine/ram.h" #include "machine/vt83c461.h" +#include "machine/watchdog.h" #include "machine/znmcu.h" #include "sound/2610intf.h" #include "sound/okim6295.h" @@ -51,7 +52,7 @@ public: zn_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_gpu(*this, "gpu"), - m_gpu_screen(*this, "gpu:screen"), + m_gpu_screen(*this, "screen"), m_sio0(*this, "maincpu:sio0"), m_cat702(*this, "cat702_%u", 1), m_znmcu(*this, "znmcu"), @@ -171,7 +172,7 @@ private: INTERRUPT_GEN_MEMBER(qsound_interrupt); void atpsx_dma_read(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ); void atpsx_dma_write(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ); - void jdredd_vblank(screen_device &screen, bool vblank_state); + DECLARE_WRITE_LINE_MEMBER(jdredd_vblank); void atlus_snd_map(address_map &map); void bam2_map(address_map &map); @@ -406,6 +407,9 @@ MACHINE_CONFIG_START(zn_state::zn1_1mb_vram) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN(m_gpu_screen) + + SCREEN(config, m_gpu_screen, SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -423,6 +427,7 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(zn_state::zn1_2mb_vram) zn1_1mb_vram(config); MCFG_PSXGPU_REPLACE( "maincpu", "gpu", CXD8561Q, 0x200000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN(m_gpu_screen) MACHINE_CONFIG_END MACHINE_CONFIG_START(zn_state::zn2) @@ -452,6 +457,9 @@ MACHINE_CONFIG_START(zn_state::zn2) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8654Q, 0x200000, XTAL(53'693'175) ) + MCFG_VIDEO_SET_SCREEN(m_gpu_screen) + + SCREEN(config, m_gpu_screen, SCREEN_TYPE_RASTER); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -1455,7 +1463,7 @@ void zn_state::coh1000w_map(address_map &map) { zn_map(map); map(0x1f000000, 0x1f1fffff).rom().region("roms", 0); - map(0x1f000000, 0x1f000003).nopw(); + map(0x1f000000, 0x1f000003).w("watchdog", FUNC(watchdog_timer_device::reset16_w)).umask16(0xffff); // ds1232s map(0x1f7e8000, 0x1f7e8003).noprw(); map(0x1f7e4000, 0x1f7e4fff).rw(FUNC(zn_state::vt83c461_16_r), FUNC(zn_state::vt83c461_16_w)); map(0x1f7f4000, 0x1f7f4fff).rw(FUNC(zn_state::vt83c461_32_r), FUNC(zn_state::vt83c461_32_w)); @@ -1468,6 +1476,8 @@ MACHINE_CONFIG_START(zn_state::coh1000w) subdevice<ram_device>("maincpu:ram")->set_default_size("8M"); + WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_msec(600)); /* 600ms Ds1232 TD floating */ + VT83C461(config, m_vt83c461).options(ata_devices, "hdd", nullptr, true); m_vt83c461->irq_handler().set("maincpu:irq", FUNC(psxirq_device::intin10)); MCFG_PSX_DMA_CHANNEL_READ( "maincpu", 5, psxdma_device::read_delegate(&zn_state::atpsx_dma_read, this ) ) @@ -2020,12 +2030,12 @@ CUSTOM_INPUT_MEMBER(zn_state::jdredd_gun_mux_read) return m_jdredd_gun_mux; } -void zn_state::jdredd_vblank(screen_device &screen, bool vblank_state) +WRITE_LINE_MEMBER(zn_state::jdredd_vblank) { int x; int y; - if( vblank_state ) + if (state) { m_jdredd_gun_mux = !m_jdredd_gun_mux; @@ -2211,8 +2221,7 @@ MACHINE_CONFIG_START(zn_state::jdredd) MCFG_DEVICE_MODIFY("maincpu") MCFG_DEVICE_PROGRAM_MAP(jdredd_map) - MCFG_DEVICE_MODIFY("gpu") - MCFG_PSXGPU_VBLANK_CALLBACK(vblank_state_delegate(&zn_state::jdredd_vblank, this)) + m_gpu_screen->screen_vblank().set(FUNC(zn_state::jdredd_vblank)); ata_interface_device &ata(ATA_INTERFACE(config, "ata").options(ata_devices, "hdd", nullptr, true)); ata.irq_handler().set("maincpu:irq", FUNC(psxirq_device::intin10)); diff --git a/src/mame/drivers/zodiack.cpp b/src/mame/drivers/zodiack.cpp index 10e379f8640..705d99273af 100644 --- a/src/mame/drivers/zodiack.cpp +++ b/src/mame/drivers/zodiack.cpp @@ -86,6 +86,13 @@ Notes: ALL ROMs 2732 ALL PROMs MMI 6331 +Bounty2: +- First 0x100 bytes of the first rom contains a screen that appears if the protection fails. +- The PCB uses a large CPU epoxy module marked "CPU PACKII". A battery can be spotted through the epoxy. +- If you copy the first 0x100 bytes from "bounty" then the game works. +- Therefore, it can be surmised that the epoxy blob contains a static ram or similar with + the first 256 bytes of the real game's rom, for as long as the battery lasts. + ***************************************************************************/ #include "emu.h" diff --git a/src/mame/drivers/zr107.cpp b/src/mame/drivers/zr107.cpp index 7038f398ceb..74328b8d75b 100644 --- a/src/mame/drivers/zr107.cpp +++ b/src/mame/drivers/zr107.cpp @@ -812,8 +812,8 @@ MACHINE_CONFIG_START(zr107_state::zr107) MCFG_K001006_GFX_REGION("gfx1") MCFG_K001006_TEX_LAYOUT(0) - MCFG_K056800_ADD("k056800", XTAL(18'432'000)) - MCFG_K056800_INT_HANDLER(INPUTLINE("audiocpu", M68K_IRQ_1)) + K056800(config, m_k056800, XTAL(18'432'000)); + m_k056800->int_callback().set_inputline(m_audiocpu, M68K_IRQ_1); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -890,8 +890,8 @@ MACHINE_CONFIG_START(zr107_state::jetwave) MCFG_K001006_GFX_REGION("gfx1") MCFG_K001006_TEX_LAYOUT(0) - MCFG_K056800_ADD("k056800", XTAL(18'432'000)) - MCFG_K056800_INT_HANDLER(INPUTLINE("audiocpu", M68K_IRQ_1)) + K056800(config, m_k056800, XTAL(18'432'000)); + m_k056800->int_callback().set_inputline(m_audiocpu, M68K_IRQ_1); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); diff --git a/src/mame/includes/imds2.h b/src/mame/includes/imds2.h deleted file mode 100644 index 94a9894cf61..00000000000 --- a/src/mame/includes/imds2.h +++ /dev/null @@ -1,158 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:F. Ulivi -// Driver for Intel Intellec MDS series-II - -#ifndef MAME_INCLUDES_IMDS2_H -#define MAME_INCLUDES_IMDS2_H - -#include "cpu/i8085/i8085.h" -#include "cpu/mcs48/mcs48.h" -#include "machine/i8257.h" -#include "video/i8275.h" -#include "sound/beep.h" -#include "machine/pit8253.h" -#include "machine/pic8259.h" -#include "machine/i8271.h" -#include "imagedev/flopdrv.h" -#include "bus/centronics/ctronics.h" -#include "machine/i8251.h" -#include "bus/rs232/rs232.h" -#include "emupal.h" - -class imds2_state : public driver_device -{ -public: - imds2_state(const machine_config &mconfig, device_type type, const char *tag); - - void imds2(machine_config &config); - -private: - DECLARE_READ8_MEMBER(ipc_mem_read); - DECLARE_WRITE8_MEMBER(ipc_mem_write); - DECLARE_WRITE8_MEMBER(imds2_ipc_control_w); - DECLARE_WRITE_LINE_MEMBER(imds2_ipc_intr); - DECLARE_READ8_MEMBER(imds2_ipcsyspic_r); - DECLARE_READ8_MEMBER(imds2_ipclocpic_r); - DECLARE_WRITE8_MEMBER(imds2_ipcsyspic_w); - DECLARE_WRITE8_MEMBER(imds2_ipclocpic_w); - DECLARE_WRITE_LINE_MEMBER(imds2_baud_clk_0_w); - DECLARE_WRITE_LINE_MEMBER(imds2_baud_clk_1_w); - - DECLARE_WRITE8_MEMBER(imds2_miscout_w); - DECLARE_READ8_MEMBER(imds2_miscin_r); - DECLARE_WRITE_LINE_MEMBER(imds2_beep_timer_w); - DECLARE_WRITE8_MEMBER(imds2_start_timer_w); - DECLARE_READ8_MEMBER(imds2_kb_read); - DECLARE_READ8_MEMBER(imds2_kb_port_p2_r); - DECLARE_WRITE8_MEMBER(imds2_kb_port_p1_w); - DECLARE_READ_LINE_MEMBER(imds2_kb_port_t0_r); - DECLARE_READ_LINE_MEMBER(imds2_kb_port_t1_r); - DECLARE_WRITE8_MEMBER(imds2_ioc_dbbout_w); - DECLARE_WRITE8_MEMBER(imds2_ioc_f0_w); - DECLARE_WRITE8_MEMBER(imds2_ioc_set_f1_w); - DECLARE_WRITE8_MEMBER(imds2_ioc_reset_f1_w); - DECLARE_READ8_MEMBER(imds2_ioc_status_r); - DECLARE_READ8_MEMBER(imds2_ioc_dbbin_r); - DECLARE_READ8_MEMBER(imds2_ipc_dbbout_r); - DECLARE_READ8_MEMBER(imds2_ipc_status_r); - DECLARE_WRITE8_MEMBER(imds2_ipc_dbbin_data_w); - DECLARE_WRITE8_MEMBER(imds2_ipc_dbbin_cmd_w); - DECLARE_WRITE_LINE_MEMBER(imds2_hrq_w); - - DECLARE_READ8_MEMBER(imds2_ioc_mem_r); - DECLARE_WRITE8_MEMBER(imds2_ioc_mem_w); - DECLARE_READ8_MEMBER(imds2_pio_port_p1_r); - DECLARE_WRITE8_MEMBER(imds2_pio_port_p1_w); - DECLARE_READ8_MEMBER(imds2_pio_port_p2_r); - DECLARE_WRITE8_MEMBER(imds2_pio_port_p2_w); - DECLARE_WRITE_LINE_MEMBER(imds2_pio_lpt_ack_w); - DECLARE_WRITE_LINE_MEMBER(imds2_pio_lpt_busy_w); - DECLARE_WRITE_LINE_MEMBER(imds2_pio_lpt_select_w); - - I8275_DRAW_CHARACTER_MEMBER(crtc_display_pixels); - - virtual void driver_start() override; - virtual void machine_start() override; - virtual void video_start() override; - virtual void machine_reset() override; - - void ioc_io_map(address_map &map); - void ioc_mem_map(address_map &map); - void ipc_io_map(address_map &map); - void ipc_mem_map(address_map &map); - - required_device<i8085a_cpu_device> m_ipccpu; - required_device<pic8259_device> m_ipcsyspic; - required_device<pic8259_device> m_ipclocpic; - required_device<pit8253_device> m_ipctimer; - required_device<i8251_device> m_ipcusart0; - required_device<i8251_device> m_ipcusart1; - required_device<rs232_port_device> m_serial0; - required_device<rs232_port_device> m_serial1; - required_device<i8080a_cpu_device> m_ioccpu; - required_device<i8257_device> m_iocdma; - required_device<i8275_device> m_ioccrtc; - required_device<beep_device> m_iocbeep; - required_device<pit8253_device> m_ioctimer; - required_device<i8271_device> m_iocfdc; - required_device<floppy_connector> m_flop0; - required_device<i8041_device> m_iocpio; - required_device<i8741_device> m_kbcpu; - required_device<palette_device> m_palette; - required_device<gfxdecode_device> m_gfxdecode; - required_device<centronics_device> m_centronics; - required_ioport m_io_key0; - required_ioport m_io_key1; - required_ioport m_io_key2; - required_ioport m_io_key3; - required_ioport m_io_key4; - required_ioport m_io_key5; - required_ioport m_io_key6; - required_ioport m_io_key7; - required_ioport m_ioc_options; - - std::vector<uint8_t> m_ipc_ram; - - bool imds2_in_ipc_rom(offs_t offset) const; - - void imds2_update_beeper(void); - void imds2_update_printer(void); - - // IPC control port - uint8_t m_ipc_control; - - // IPC ROM content - const uint8_t *m_ipc_rom; - - // Character generator - const uint8_t *m_chargen; - - // MISCOUT state - uint8_t m_miscout; - - // Beeper timer line - int m_beeper_timer; - - // Keyboard state - uint8_t m_kb_p1; - - // IPC to IOC buffer - uint8_t m_ioc_ibf; - - // IOC to IPC buffer - uint8_t m_ioc_obf; - - // IPC/IOC status - uint8_t m_ipc_ioc_status; - - // PIO port 1 - uint8_t m_pio_port1; - - // PIO port 2 - uint8_t m_pio_port2; - - // PIO device status byte - uint8_t m_device_status_byte; -}; - -#endif // MAME_INCLUDES_IMDS2_H diff --git a/src/mame/includes/itech32.h b/src/mame/includes/itech32.h index 255e64480c0..6af883e5730 100644 --- a/src/mame/includes/itech32.h +++ b/src/mame/includes/itech32.h @@ -71,7 +71,7 @@ public: protected: required_device<cpu_device> m_maincpu; required_device<cpu_device> m_soundcpu; - required_device<via6522_device> m_via; + optional_device<via6522_device> m_via; // sftm, wcbowl and gt games don't have the via required_device<es5506_device> m_ensoniq; required_device<screen_device> m_screen; required_device<palette_device> m_palette; diff --git a/src/mame/includes/namcofl.h b/src/mame/includes/namcofl.h index e59e77e0728..73fd7ec6a6f 100644 --- a/src/mame/includes/namcofl.h +++ b/src/mame/includes/namcofl.h @@ -1,8 +1,12 @@ // license:BSD-3-Clause // copyright-holders:R. Belmont, ElSemi -#include "namcos2.h" #include "machine/timer.h" +#include "screen.h" +#include "video/namco_c123tmap.h" +#include "video/namco_c116.h" +#include "video/namco_c169roz.h" +#include "video/namco_c355spr.h" #define NAMCOFL_HTOTAL (288) /* wrong */ #define NAMCOFL_HBSTART (288) @@ -19,11 +23,19 @@ #define NAMCOFL_SPRITEGFX 1 #define NAMCOFL_ROTGFX 2 -class namcofl_state : public namcos2_shared_state +class namcofl_state : public driver_device { public: namcofl_state(const machine_config &mconfig, device_type type, const char *tag) : - namcos2_shared_state(mconfig, type, tag), + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_palette(*this, "palette"), + m_c116(*this, "c116"), + m_screen(*this, "screen"), + m_c123tmap(*this, "c123tmap"), + m_c169roz(*this, "c169roz"), + m_c355spr(*this, "c355spr"), + m_mcu(*this, "mcu"), m_in0(*this, "IN0"), m_in1(*this, "IN1"), m_in2(*this, "IN2"), @@ -39,6 +51,14 @@ public: void init_finalapr(); private: + required_device<cpu_device> m_maincpu; + required_device<palette_device> m_palette; + required_device<namco_c116_device> m_c116; + required_device<screen_device> m_screen; + required_device<namco_c123tmap_device> m_c123tmap; + required_device<namco_c169roz_device> m_c169roz; + required_device<namco_c355spr_device> m_c355spr; + required_device<cpu_device> m_mcu; required_ioport m_in0; required_ioport m_in1; required_ioport m_in2; diff --git a/src/mame/includes/namconb1.h b/src/mame/includes/namconb1.h index 26d527b1cd9..00892bb7fa3 100644 --- a/src/mame/includes/namconb1.h +++ b/src/mame/includes/namconb1.h @@ -6,9 +6,13 @@ ***************************************************************************/ -#include "namcos2.h" #include "machine/eeprompar.h" #include "machine/timer.h" +#include "screen.h" +#include "video/namco_c116.h" +#include "video/namco_c355spr.h" +#include "video/namco_c123tmap.h" +#include "video/namco_c169roz.h" #define NAMCONB1_HTOTAL (288) /* wrong */ #define NAMCONB1_HBSTART (288) @@ -25,11 +29,22 @@ #define NAMCONB1_SPRITEGFX 1 #define NAMCONB1_ROTGFX 2 -class namconb1_state : public namcos2_shared_state + + +class namconb1_state : public driver_device { public: namconb1_state(const machine_config &mconfig, device_type type, const char *tag) : - namcos2_shared_state(mconfig, type, tag), + driver_device(mconfig, type, tag), + m_gametype(0), + m_maincpu(*this, "maincpu"), + m_palette(*this, "palette"), + m_c116(*this, "c116"), + m_c123tmap(*this, "c123tmap"), + m_c355spr(*this, "c355spr"), + m_c169roz(*this, "c169roz"), + m_screen(*this, "screen"), + m_mcu(*this, "mcu"), m_eeprom(*this, "eeprom"), m_p1(*this, "P1"), m_p2(*this, "P2"), @@ -62,6 +77,32 @@ public: void init_gslgr94u(); private: + int m_gametype; + enum + { + /* Namco NB1 */ + NAMCONB1_NEBULRAY = 0x2000, + NAMCONB1_GUNBULET, + NAMCONB1_GSLGR94U, + NAMCONB1_GSLGR94J, + NAMCONB1_SWS95, + NAMCONB1_SWS96, + NAMCONB1_SWS97, + NAMCONB1_VSHOOT, + + /* Namco NB2 */ + NAMCONB2_OUTFOXIES, + NAMCONB2_MACH_BREAKERS, + }; + + required_device<cpu_device> m_maincpu; + required_device<palette_device> m_palette; + required_device<namco_c116_device> m_c116; + required_device<namco_c123tmap_device> m_c123tmap; + required_device<namco_c355spr_device> m_c355spr; + optional_device<namco_c169roz_device> m_c169roz; // NB1 only, not NA1 + required_device<screen_device> m_screen; + required_device<cpu_device> m_mcu; required_device<eeprom_parallel_28xx_device> m_eeprom; required_ioport m_p1; required_ioport m_p2; diff --git a/src/mame/includes/namcos2.h b/src/mame/includes/namcos2.h index 15746f731ed..f3e3b138d4a 100644 --- a/src/mame/includes/namcos2.h +++ b/src/mame/includes/namcos2.h @@ -20,292 +20,72 @@ #include "video/namco_c116.h" #include "machine/namco65.h" #include "machine/namco68.h" - -#include "cpu/m6502/m3745x.h" +#include "video/namco_c169roz.h" +#include "video/namco_c355spr.h" +#include "video/namco_c123tmap.h" +#include "video/namcos2_sprite.h" +#include "video/namcos2_roz.h" #include "emupal.h" #include "screen.h" -/* CPU reference numbers */ - -#define CPU_MASTER 0 -#define CPU_SLAVE 1 -#define CPU_SOUND 2 -#define CPU_MCU 3 -#define CPU_GPU 5 - - /*********************************************/ /* IF GAME SPECIFIC HACKS ARE REQUIRED THEN */ /* USE THE m_gametype MEMBER TO FIND */ /* OUT WHAT GAME IS RUNNING */ /*********************************************/ -enum -{ - /* Namco System 2 */ - NAMCOS2_ASSAULT = 0x1000, - NAMCOS2_ASSAULT_JP, - NAMCOS2_ASSAULT_PLUS, - NAMCOS2_BUBBLE_TROUBLE, - NAMCOS2_BURNING_FORCE, - NAMCOS2_COSMO_GANG, - NAMCOS2_COSMO_GANG_US, - NAMCOS2_DIRT_FOX, - NAMCOS2_DIRT_FOX_JP, - NAMCOS2_DRAGON_SABER, - NAMCOS2_FINAL_LAP, - NAMCOS2_FINAL_LAP_2, - NAMCOS2_FINAL_LAP_3, - NAMCOS2_FINEST_HOUR, - NAMCOS2_FOUR_TRAX, - NAMCOS2_GOLLY_GHOST, - NAMCOS2_LUCKY_AND_WILD, - NAMCOS2_MARVEL_LAND, - NAMCOS2_METAL_HAWK, - NAMCOS2_MIRAI_NINJA, - NAMCOS2_ORDYNE, - NAMCOS2_PHELIOS, - NAMCOS2_ROLLING_THUNDER_2, - NAMCOS2_STEEL_GUNNER, - NAMCOS2_STEEL_GUNNER_2, - NAMCOS2_SUPER_WSTADIUM, - NAMCOS2_SUPER_WSTADIUM_92, - NAMCOS2_SUPER_WSTADIUM_92T, - NAMCOS2_SUPER_WSTADIUM_93, - NAMCOS2_SUZUKA_8_HOURS, - NAMCOS2_SUZUKA_8_HOURS_2, - NAMCOS2_VALKYRIE, - NAMCOS2_KYUUKAI_DOUCHUUKI, - - /* Namco System21 */ - NAMCOS21_AIRCOMBAT, - NAMCOS21_STARBLADE, - NAMCOS21_CYBERSLED, - NAMCOS21_SOLVALOU, - NAMCOS21_WINRUN91, - NAMCOS21_DRIVERS_EYES, - - /* Namco NB1 */ - NAMCONB1_NEBULRAY, - NAMCONB1_GUNBULET, - NAMCONB1_GSLGR94U, - NAMCONB1_GSLGR94J, - NAMCONB1_SWS95, - NAMCONB1_SWS96, - NAMCONB1_SWS97, - NAMCONB1_VSHOOT, - - /* Namco NB2 */ - NAMCONB2_OUTFOXIES, - NAMCONB2_MACH_BREAKERS, - - /* Namco System FL */ - NAMCOFL_SPEED_RACER, - NAMCOFL_FINAL_LAP_R -}; - -// fix me -- most of this should be devices eventually -class namcos2_shared_state : public driver_device -{ -public: - namcos2_shared_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_dspmaster(*this, "dspmaster") - , m_dspslave(*this, "dspslave") - , m_gametype(0) - , m_c140(*this, "c140") - , m_c116(*this, "c116") - , m_master_intc(*this, "master_intc") - , m_slave_intc(*this, "slave_intc") - , m_sci(*this, "sci") - , m_gpu(*this, "gpu") - , m_c169_roz_videoram(*this, "rozvideoram", 0) - , m_c169_roz_gfxbank(0) - , m_c169_roz_mask(nullptr) - , m_c355_obj_gfxbank(0) - , m_c355_obj_palxor(0) - , m_maincpu(*this, "maincpu") - , m_audiocpu(*this, "audiocpu") - , m_slave(*this, "slave") - , m_mcu(*this, "mcu") - , m_c65(*this, "c65mcu") - , m_c68new(*this, "c68mcu") - , m_gfxdecode(*this, "gfxdecode") - , m_screen(*this, "screen") - , m_palette(*this, "palette") - { } - - optional_device<cpu_device> m_dspmaster; - optional_device<cpu_device> m_dspslave; - - int m_gametype; - -protected: - optional_device<c140_device> m_c140; - optional_device<namco_c116_device> m_c116; - optional_device<namco_c148_device> m_master_intc; - optional_device<namco_c148_device> m_slave_intc; - optional_device<namco_c139_device> m_sci; - optional_device<cpu_device> m_gpu; //to be moved to namco21_state after disentangling - - // game type helpers - bool is_system21(); - - std::unique_ptr<uint8_t[]> m_eeprom; - - DECLARE_WRITE8_MEMBER(sound_reset_w); - DECLARE_WRITE8_MEMBER(system_reset_w); - void reset_all_subcpus(int state); - - TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline); - - // C123 Tilemap Emulation - // TODO: merge with namcos1.cpp implementation and convert to device - DECLARE_WRITE16_MEMBER( c123_tilemap_videoram_w ); - DECLARE_READ16_MEMBER( c123_tilemap_videoram_r ); - DECLARE_WRITE16_MEMBER( c123_tilemap_control_w ); - DECLARE_READ16_MEMBER( c123_tilemap_control_r ); - template<int Offset> TILE_GET_INFO_MEMBER( get_tile_info ); - typedef delegate<void (uint16_t, int*, int*)> c123_tilemap_delegate; - void c123_tilemap_init(int gfxbank, void *pMaskROM, c123_tilemap_delegate tilemap_cb); - void c123_tilemap_invalidate(void); - void c123_tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri); - void c123_SetTilemapVideoram(int offset, uint16_t newword); - void c123_SetTilemapControl(int offset, uint16_t newword); - - struct c123_mTilemapInfo - { - uint16_t control[0x40/2]; - /** - * [0x1] 0x02/2 tilemap#0.scrollx - * [0x3] 0x06/2 tilemap#0.scrolly - * [0x5] 0x0a/2 tilemap#1.scrollx - * [0x7] 0x0e/2 tilemap#1.scrolly - * [0x9] 0x12/2 tilemap#2.scrollx - * [0xb] 0x16/2 tilemap#2.scrolly - * [0xd] 0x1a/2 tilemap#3.scrollx - * [0xf] 0x1e/2 tilemap#3.scrolly - * 0x20/2 priority - * 0x30/2 color - */ - tilemap_t *tmap[6]; - std::unique_ptr<uint16_t[]> videoram; - int gfxbank; - uint8_t *maskBaseAddr; - c123_tilemap_delegate cb; - }; - - c123_mTilemapInfo m_c123_TilemapInfo; - - // C169 ROZ Layer Emulation - typedef delegate<void (uint16_t, int*, int*, int)> c169_tilemap_delegate; - void c169_roz_init(int gfxbank, const char *maskregion, c169_tilemap_delegate tilemap_cb); - void c169_roz_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri); - DECLARE_READ16_MEMBER( c169_roz_control_r ); - DECLARE_WRITE16_MEMBER( c169_roz_control_w ); - DECLARE_READ16_MEMBER( c169_roz_videoram_r ); - DECLARE_WRITE16_MEMBER( c169_roz_videoram_w ); - - c169_tilemap_delegate m_c169_cb; - struct roz_parameters - { - uint32_t left, top, size; - uint32_t startx, starty; - int incxx, incxy, incyx, incyy; - int color, priority; - int wrap; - }; - void c169_roz_unpack_params(const uint16_t *source, roz_parameters ¶ms); - void c169_roz_draw_helper(screen_device &screen, bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters ¶ms); - void c169_roz_draw_scanline(screen_device &screen, bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect); - void c169_roz_get_info(tile_data &tileinfo, int tile_index, int which); - template<int Which> TILE_GET_INFO_MEMBER( c169_roz_get_info ); - TILEMAP_MAPPER_MEMBER( c169_roz_mapper ); - - static const int ROZ_TILEMAP_COUNT = 2; - tilemap_t *m_c169_roz_tilemap[ROZ_TILEMAP_COUNT]; - uint16_t m_c169_roz_control[0x20/2]; - optional_shared_ptr<uint16_t> m_c169_roz_videoram; - int m_c169_roz_gfxbank; - uint8_t *m_c169_roz_mask; - - // C355 Motion Object Emulation - typedef delegate<int (int)> c355_obj_code2tile_delegate; - // for pal_xor, supply either 0x0 (normal) or 0xf (palette mapping reversed) - void c355_obj_init(int gfxbank, int pal_xor, c355_obj_code2tile_delegate code2tile); - int c355_obj_default_code2tile(int code); - void c355_obj_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri); - void c355_obj_draw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri); - DECLARE_READ16_MEMBER( c355_obj_ram_r ); - DECLARE_WRITE16_MEMBER( c355_obj_ram_w ); - DECLARE_READ16_MEMBER( c355_obj_position_r ); - DECLARE_WRITE16_MEMBER( c355_obj_position_w ); - DECLARE_MACHINE_START(namcos2); - DECLARE_MACHINE_RESET(namcos2); - - // C355 Motion Object internals - template<class _BitmapClass> - void c355_obj_draw_sprite(screen_device &screen, _BitmapClass &bitmap, const rectangle &cliprect, const uint16_t *pSource, int pri, int zpos); - template<class _BitmapClass> - void c355_obj_draw_list(screen_device &screen, _BitmapClass &bitmap, const rectangle &cliprect, int pri, const uint16_t *pSpriteList16, const uint16_t *pSpriteTable); - - c355_obj_code2tile_delegate m_c355_obj_code2tile; - int m_c355_obj_gfxbank; - int m_c355_obj_palxor; - uint16_t m_c355_obj_position[4]; - uint16_t m_c355_obj_ram[0x20000/2]; - - uint8_t m_player_mux; - inline void namcoic_get_tile_info(tile_data &tileinfo,int tile_index,uint16_t *vram); - - // general - void zdrawgfxzoom(screen_device &screen, bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos); - void zdrawgfxzoom(screen_device &screen, bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos); - - DECLARE_WRITE8_MEMBER( namcos2_68k_eeprom_w ); - DECLARE_READ8_MEMBER( namcos2_68k_eeprom_r ); - - DECLARE_WRITE8_MEMBER( namcos2_sound_bankselect_w ); - - required_device<cpu_device> m_maincpu; - optional_device<cpu_device> m_audiocpu; - optional_device<cpu_device> m_slave; - optional_device<cpu_device> m_mcu; - optional_device<namcoc65_device> m_c65; - optional_device<namcoc68_device> m_c68new; - - optional_device<gfxdecode_device> m_gfxdecode; - optional_device<screen_device> m_screen; - required_device<palette_device> m_palette; -}; - -class namcos2_state : public namcos2_shared_state +class namcos2_state : public driver_device { public: namcos2_state(const machine_config &mconfig, device_type type, const char *tag) : - namcos2_shared_state(mconfig, type, tag), + driver_device(mconfig, type, tag), + m_gametype(0), + m_maincpu(*this, "maincpu"), + m_slave(*this, "slave"), + m_audiocpu(*this, "audiocpu"), + m_c65(*this, "c65mcu"), + m_c68(*this, "c68mcu"), + m_c140(*this, "c140"), + m_c116(*this, "c116"), + m_c123tmap(*this, "c123tmap"), + m_master_intc(*this, "master_intc"), + m_slave_intc(*this, "slave_intc"), + m_sci(*this, "sci"), + m_c169roz(*this, "c169roz"), + m_c355spr(*this, "c355spr"), + m_palette(*this, "palette"), + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_audiobank(*this, "audiobank"), m_dpram(*this, "dpram"), m_spriteram(*this, "spriteram"), - m_rozram(*this, "rozram"), - m_roz_ctrl(*this, "rozctrl"), - m_c45_road(*this, "c45_road") + m_c45_road(*this, "c45_road"), + m_ns2sprite(*this, "s2sprite"), + m_ns2roz(*this, "s2roz") { } void configure_c116_standard(machine_config &config); void configure_c148_standard(machine_config &config); void configure_c65_standard(machine_config &config); void configure_c68_standard(machine_config &config); + void configure_c123tmap_standard(machine_config &config); void metlhawk(machine_config &config); void gollygho(machine_config &config); void assaultp(machine_config &config); void sgunner2(machine_config &config); void base2(machine_config &config); + void finallap_noio(machine_config &config); void finallap(machine_config &config); + void finallap_c68(machine_config &config); void finalap2(machine_config &config); + void finalap3(machine_config &config); + void suzuka8h(machine_config &config); void luckywld(machine_config &config); void base3(machine_config &config); void sgunner(machine_config &config); + void base_noio(machine_config &config); void base(machine_config &config); + void base_c68(machine_config &config); void init_cosmogng(); void init_sgunner2(); @@ -336,18 +116,86 @@ public: void init_sws93(); void init_metlhawk(); void init_sws92g(); - void init_assaultp_hack(); void init_assaultp(); void init_ordyne(); void init_marvland(); void init_rthun2(); private: + +enum + { + /* Namco System 2 */ + NAMCOS2_ASSAULT = 0x1000, + NAMCOS2_ASSAULT_JP, + NAMCOS2_ASSAULT_PLUS, + NAMCOS2_BUBBLE_TROUBLE, + NAMCOS2_BURNING_FORCE, + NAMCOS2_COSMO_GANG, + NAMCOS2_COSMO_GANG_US, + NAMCOS2_DIRT_FOX, + NAMCOS2_DIRT_FOX_JP, + NAMCOS2_DRAGON_SABER, + NAMCOS2_FINAL_LAP, + NAMCOS2_FINAL_LAP_2, + NAMCOS2_FINAL_LAP_3, + NAMCOS2_FINEST_HOUR, + NAMCOS2_FOUR_TRAX, + NAMCOS2_GOLLY_GHOST, + NAMCOS2_LUCKY_AND_WILD, + NAMCOS2_MARVEL_LAND, + NAMCOS2_METAL_HAWK, + NAMCOS2_MIRAI_NINJA, + NAMCOS2_ORDYNE, + NAMCOS2_PHELIOS, + NAMCOS2_ROLLING_THUNDER_2, + NAMCOS2_STEEL_GUNNER, + NAMCOS2_STEEL_GUNNER_2, + NAMCOS2_SUPER_WSTADIUM, + NAMCOS2_SUPER_WSTADIUM_92, + NAMCOS2_SUPER_WSTADIUM_92T, + NAMCOS2_SUPER_WSTADIUM_93, + NAMCOS2_SUZUKA_8_HOURS, + NAMCOS2_SUZUKA_8_HOURS_2, + NAMCOS2_VALKYRIE, + NAMCOS2_KYUUKAI_DOUCHUUKI, + }; + + int m_gametype; + required_device<cpu_device> m_maincpu; + optional_device<cpu_device> m_slave; + optional_device<cpu_device> m_audiocpu; + optional_device<namcoc65_device> m_c65; + optional_device<namcoc68_device> m_c68; + optional_device<c140_device> m_c140; + optional_device<namco_c116_device> m_c116; + optional_device<namco_c123tmap_device> m_c123tmap; + optional_device<namco_c148_device> m_master_intc; + optional_device<namco_c148_device> m_slave_intc; + optional_device<namco_c139_device> m_sci; + optional_device<namco_c169roz_device> m_c169roz; + optional_device<namco_c355spr_device> m_c355spr; + required_device<palette_device> m_palette; + optional_device<gfxdecode_device> m_gfxdecode; + optional_device<screen_device> m_screen; + optional_memory_bank m_audiobank; + + std::unique_ptr<uint8_t[]> m_eeprom; + DECLARE_READ16_MEMBER(dpram_word_r); DECLARE_WRITE16_MEMBER(dpram_word_w); DECLARE_READ8_MEMBER(dpram_byte_r); DECLARE_WRITE8_MEMBER(dpram_byte_w); + DECLARE_WRITE8_MEMBER( namcos2_68k_eeprom_w ); + DECLARE_READ8_MEMBER( namcos2_68k_eeprom_r ); + + DECLARE_WRITE8_MEMBER( namcos2_sound_bankselect_w ); + + DECLARE_WRITE8_MEMBER(sound_reset_w); + DECLARE_WRITE8_MEMBER(system_reset_w); + void reset_all_subcpus(int state); + virtual void video_start() override; void video_start_finallap(); void video_start_finalap2(); @@ -361,33 +209,30 @@ private: uint32_t screen_update_metlhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_sgunner(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TILE_GET_INFO_MEMBER( roz_tile_info ); - DECLARE_READ8_MEMBER( c116_r ); - DECLARE_WRITE16_MEMBER( rozram_word_w ); + DECLARE_READ16_MEMBER( gfx_ctrl_r ); DECLARE_WRITE16_MEMBER( gfx_ctrl_w ); - void draw_sprite_init(); + DECLARE_MACHINE_START(namcos2); + DECLARE_MACHINE_RESET(namcos2); + + void create_shadow_table(); void apply_clip( rectangle &clip, const rectangle &cliprect ); - void draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, int control ); - void draw_sprites_metalhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ); int get_pos_irq_scanline() { return (m_c116->get_reg(5) - 32) & 0xff; } TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline); required_shared_ptr<uint8_t> m_dpram; /* 2Kx8 */ optional_shared_ptr<uint16_t> m_spriteram; - optional_shared_ptr<uint16_t> m_rozram; - optional_shared_ptr<uint16_t> m_roz_ctrl; - tilemap_t *m_tilemap_roz; uint16_t m_gfx_ctrl; uint16_t m_serial_comms_ctrl[0x8]; unsigned m_finallap_prot_count; int m_sendval; optional_device<namco_c45_road_device> m_c45_road; + optional_device<namcos2_sprite_device> m_ns2sprite; + optional_device<namcos2_roz_device> m_ns2roz; DECLARE_READ16_MEMBER( namcos2_68k_key_r ); DECLARE_WRITE16_MEMBER( namcos2_68k_key_w ); @@ -404,11 +249,12 @@ private: void common_default_am(address_map &map); void common_finallap_am(address_map &map); - void common_luckywld_am(address_map &map); + void common_suzuka8h_am(address_map &map); void common_metlhawk_am(address_map &map); void common_sgunner_am(address_map &map); void master_default_am(address_map &map); void master_finallap_am(address_map &map); + void master_suzuka8h_am(address_map &map); void master_luckywld_am(address_map &map); void master_metlhawk_am(address_map &map); void master_sgunner_am(address_map &map); @@ -416,25 +262,13 @@ private: void namcos2_68k_default_cpu_board_am(address_map &map); void slave_default_am(address_map &map); void slave_finallap_am(address_map &map); + void slave_suzuka8h_am(address_map &map); void slave_luckywld_am(address_map &map); void slave_metlhawk_am(address_map &map); void slave_sgunner_am(address_map &map); void sound_default_am(address_map &map); }; -/*----------- defined in video/namcos2.c -----------*/ - -#define NAMCOS21_NUM_COLORS 0x8000 - -/**************************************************************/ -/* ROZ - Rotate & Zoom memory function handlers */ -/**************************************************************/ - -/*----------- defined in machine/namcos2.c -----------*/ - -extern void (*namcos2_kickstart)(running_machine &machine, int internal); - - /**************************************************************/ /* Non-shared memory custom IO device - IRQ/Inputs/Outputs */ /**************************************************************/ @@ -460,13 +294,4 @@ extern void (*namcos2_kickstart)(running_machine &machine, int internal); #define NAMCOS2_68K_SLAVE_RAM "bank4" -/**************************************************************/ -/* */ -/**************************************************************/ -#define BANKED_SOUND_ROM "bank6" - -/**************************************************************/ -/* Sound CPU support handlers - 6809 */ -/**************************************************************/ - #endif // MAME_INCLUDES_NAMCOS2_H diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h index 965241af099..5e4db1e258a 100644 --- a/src/mame/includes/namcos21.h +++ b/src/mame/includes/namcos21.h @@ -8,15 +8,28 @@ #pragma once -#include "namcos2.h" + #include "machine/namcoio_gearbox.h" #include "machine/timer.h" +#include "machine/namco_c139.h" +#include "machine/namco_c148.h" +#include "machine/timer.h" +#include "sound/c140.h" +#include "video/c45.h" +#include "machine/namco65.h" +#include "machine/namco68.h" +#include "video/namco_c355spr.h" +#include "video/namcos2_sprite.h" +#include "video/namcos2_roz.h" + #define NAMCOS21_POLY_FRAME_WIDTH 496 #define NAMCOS21_POLY_FRAME_HEIGHT 480 #define WINRUN_MAX_POLY_PARAM (1+256*3) +#define NAMCOS21_NUM_COLORS 0x8000 + #define DSP_BUF_MAX (4096*12) struct dsp_state { @@ -46,12 +59,38 @@ struct edge }; -class namcos21_state : public namcos2_shared_state +class namcos21_state : public driver_device { public: + enum + { /* Namco System21 */ + NAMCOS21_AIRCOMBAT = 0x4000, + NAMCOS21_STARBLADE, + NAMCOS21_CYBERSLED, + NAMCOS21_SOLVALOU, + NAMCOS21_WINRUN91, + NAMCOS21_DRIVERS_EYES, + }; + namcos21_state(const machine_config &mconfig, device_type type, const char *tag) : - namcos2_shared_state(mconfig, type, tag), + driver_device(mconfig, type, tag), m_master_dsp_code(*this,"master_dsp_code"), + m_gametype(0), + m_dspmaster(*this, "dspmaster"), + m_dspslave(*this, "dspslave"), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_slave(*this, "slave"), + m_c65(*this, "c65mcu"), + m_c68(*this, "c68mcu"), + m_sci(*this, "sci"), + m_master_intc(*this, "master_intc"), + m_slave_intc(*this, "slave_intc"), + m_c140(*this, "c140"), + m_c355spr(*this, "c355spr"), + m_palette(*this, "palette"), + m_screen(*this, "screen"), + m_audiobank(*this, "audiobank"), m_winrun_dspbios(*this,"winrun_dspbios"), m_winrun_polydata(*this,"winrun_polydata"), m_dspram16(*this,"dspram16"), @@ -80,7 +119,27 @@ public: void clear_poly_framebuffer(); std::unique_ptr<dsp_state> m_mpDspState; + int m_gametype; + + optional_device<cpu_device> m_dspmaster; + optional_device<cpu_device> m_dspslave; + private: + required_device<cpu_device> m_maincpu; + optional_device<cpu_device> m_audiocpu; + optional_device<cpu_device> m_slave; + optional_device<namcoc65_device> m_c65; + optional_device<namcoc68_device> m_c68; + optional_device<namco_c139_device> m_sci; + optional_device<namco_c148_device> m_master_intc; + optional_device<namco_c148_device> m_slave_intc; + optional_device<c140_device> m_c140; + optional_device<namco_c355spr_device> m_c355spr; + required_device<palette_device> m_palette; + + optional_device<screen_device> m_screen; + optional_memory_bank m_audiobank; + optional_shared_ptr<uint16_t> m_winrun_dspbios; optional_shared_ptr<uint16_t> m_winrun_polydata; optional_shared_ptr<uint16_t> m_dspram16; @@ -179,12 +238,27 @@ private: DECLARE_WRITE16_MEMBER(winrun_gpu_videoram_w); DECLARE_READ16_MEMBER(winrun_gpu_videoram_r); + DECLARE_WRITE8_MEMBER( namcos2_68k_eeprom_w ); + DECLARE_READ8_MEMBER( namcos2_68k_eeprom_r ); + + DECLARE_WRITE8_MEMBER( namcos2_sound_bankselect_w ); + + DECLARE_WRITE8_MEMBER(sound_reset_w); + DECLARE_WRITE8_MEMBER(system_reset_w); + void reset_all_subcpus(int state); + + // game type helpers + bool is_system21(); + + std::unique_ptr<uint8_t[]> m_eeprom; + TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline); uint8_t m_gearbox_state; DECLARE_CUSTOM_INPUT_MEMBER(driveyes_gearbox_r); DECLARE_MACHINE_START(namcos21); + DECLARE_MACHINE_RESET(namcos21); DECLARE_VIDEO_START(namcos21); uint32_t screen_update_namcos21(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_winrun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -205,6 +279,7 @@ private: void winrun_flush_poly(); void init(int game_type); void configure_c65_namcos21(machine_config &config); + void configure_c68_namcos21(machine_config &config); void common_map(address_map &map); void driveyes_common_map(address_map &map); void driveyes_master_map(address_map &map); diff --git a/src/mame/includes/pacland.h b/src/mame/includes/pacland.h index 7101f503801..c2ab5c5a49b 100644 --- a/src/mame/includes/pacland.h +++ b/src/mame/includes/pacland.h @@ -40,8 +40,7 @@ public: tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; bitmap_ind16 m_fg_bitmap; - bitmap_ind16 m_sprite1_bitmap; - bitmap_ind16 m_sprite2_bitmap; + bitmap_ind16 m_sprite_bitmap; std::unique_ptr<uint32_t[]> m_transmask[3]; uint16_t m_scroll0; uint16_t m_scroll1; diff --git a/src/mame/includes/sshangha.h b/src/mame/includes/sshangha.h index 2512c035a1e..611ecfa76c5 100644 --- a/src/mame/includes/sshangha.h +++ b/src/mame/includes/sshangha.h @@ -11,7 +11,7 @@ public: sshangha_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_deco146(*this, "ioprot"), - m_deco_tilegen1(*this, "tilegen1"), + m_tilegen(*this, "tilegen"), m_spriteram(*this, "spriteram"), m_spriteram2(*this, "spriteram2"), m_sound_shared_ram(*this, "sound_shared"), @@ -25,16 +25,19 @@ public: m_palette(*this, "palette") { } - void sshanghb(machine_config &config); + void sshanghab(machine_config &config); void sshangha(machine_config &config); void init_sshangha(); +protected: + virtual void video_start() override; + private: optional_device<deco146_device> m_deco146; - required_device<deco16ic_device> m_deco_tilegen1; + required_device<deco16ic_device> m_tilegen; required_shared_ptr<uint16_t> m_spriteram; - optional_shared_ptr<uint16_t> m_spriteram2; + required_shared_ptr<uint16_t> m_spriteram2; required_shared_ptr<uint16_t> m_sound_shared_ram; required_shared_ptr<uint16_t> m_pf1_rowscroll; @@ -42,8 +45,11 @@ private: optional_shared_ptr<uint16_t> m_prot_data; - optional_device<decospr_device> m_sprgen1; - optional_device<decospr_device> m_sprgen2; + required_device<decospr_device> m_sprgen1; + required_device<decospr_device> m_sprgen2; + required_device<cpu_device> m_maincpu; + required_device<cpu_device> m_audiocpu; + required_device<palette_device> m_palette; int m_video_control; DECO16IC_BANK_CB_MEMBER(bank_callback); @@ -52,26 +58,20 @@ private: DECLARE_WRITE16_MEMBER(sshangha_protection_region_8_146_w); DECLARE_READ16_MEMBER(sshangha_protection_region_d_146_r); DECLARE_WRITE16_MEMBER(sshangha_protection_region_d_146_w); + DECLARE_READ16_MEMBER(deco_71_r); + DECLARE_READ16_MEMBER(sshanghab_protection16_r); DECLARE_READ16_MEMBER(palette_r); DECLARE_WRITE16_MEMBER(palette_w); - DECLARE_READ16_MEMBER(sshanghb_protection16_r); - DECLARE_READ16_MEMBER(deco_71_r); - DECLARE_READ8_MEMBER(sshangha_sound_shared_r); - DECLARE_WRITE8_MEMBER(sshangha_sound_shared_w); - - DECLARE_WRITE16_MEMBER(sshangha_video_w); + DECLARE_READ8_MEMBER(sound_shared_r); + DECLARE_WRITE8_MEMBER(sound_shared_w); - virtual void machine_reset() override; - virtual void video_start() override; - uint32_t screen_update_sshangha(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + DECLARE_WRITE16_MEMBER(video_w); - required_device<cpu_device> m_maincpu; - required_device<cpu_device> m_audiocpu; - required_device<palette_device> m_palette; + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void sshangha_map(address_map &map); - void sshangha_sound_map(address_map &map); - void sshanghb_map(address_map &map); + void sound_map(address_map &map); + void sshanghab_map(address_map &map); }; diff --git a/src/mame/includes/thomson.h b/src/mame/includes/thomson.h index 1f84bb31d8c..c53489ce0a9 100644 --- a/src/mame/includes/thomson.h +++ b/src/mame/includes/thomson.h @@ -152,6 +152,7 @@ public: } void to9(machine_config &config); + void to7_base(machine_config &config); void to7(machine_config &config); void mo5e(machine_config &config); void to770a(machine_config &config); diff --git a/src/mame/machine/apollo.cpp b/src/mame/machine/apollo.cpp index 6dfaa6d24e6..727e19be32e 100644 --- a/src/mame/machine/apollo.cpp +++ b/src/mame/machine/apollo.cpp @@ -1100,13 +1100,13 @@ MACHINE_CONFIG_START(apollo_state::common) MCFG_DEVICE_ADD("ptmclock", CLOCK, 250000) MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, apollo_state, apollo_ptm_timer_tick)) - MCFG_DEVICE_ADD(APOLLO_RTC_TAG, MC146818, 32.768_kHz_XTAL) + MC146818(config, m_rtc, 32.768_kHz_XTAL); // FIXME: is this interrupt really only connected on DN3000? - //MCFG_MC146818_IRQ_HANDLER(WRITELINE(*this, apollo_state, apollo_rtc_irq_function)) - MCFG_MC146818_UTC(true) - MCFG_MC146818_BINARY(false) - MCFG_MC146818_24_12(false) - MCFG_MC146818_EPOCH(0) + //m_rtc->irq().set(FUNC(apollo_state::apollo_rtc_irq_function)); + m_rtc->set_use_utc(true); + m_rtc->set_binary(false); + m_rtc->set_24hrs(false); + m_rtc->set_epoch(0); MCFG_APOLLO_NI_ADD(APOLLO_NI_TAG, 0) diff --git a/src/mame/machine/at.cpp b/src/mame/machine/at.cpp index 644e380ac33..13ecf80f24f 100644 --- a/src/mame/machine/at.cpp +++ b/src/mame/machine/at.cpp @@ -126,7 +126,7 @@ MACHINE_CONFIG_START(at_mb_device::device_add_mconfig) MCFG_ISA_OUT_DRQ7_CB(WRITELINE(m_dma8237_2, am9517a_device, dreq3_w)) MC146818(config, m_mc146818, 32.768_kHz_XTAL); - m_mc146818->irq_callback().set(m_pic8259_slave, FUNC(pic8259_device::ir0_w)); + m_mc146818->irq().set(m_pic8259_slave, FUNC(pic8259_device::ir0_w)); m_mc146818->set_century_index(0x32); /* sound hardware */ diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp index dd502d13294..cea8152afd2 100644 --- a/src/mame/machine/bbc.cpp +++ b/src/mame/machine/bbc.cpp @@ -718,13 +718,13 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_porta) } if (m_b1_speech_read == 0) { - if (m_tms) m_via_system_porta = m_tms->status_r(space, 0); + if (m_tms) m_via_system_porta = m_tms->status_r(); //logerror("Doing an unsafe read to the speech chip %d \n",m_via_system_porta); } if (m_b2_speech_write == 0) { //logerror("Doing an unsafe write to the speech chip %d \n",data); - if (m_tms) m_tms->data_w(space, 0, m_via_system_porta); + if (m_tms) m_tms->data_w(m_via_system_porta); } if (m_b3_keyboard == 0) { diff --git a/src/mame/machine/decioga.cpp b/src/mame/machine/decioga.cpp index b870e728bc1..3c039a9b6e0 100644 --- a/src/mame/machine/decioga.cpp +++ b/src/mame/machine/decioga.cpp @@ -2,7 +2,7 @@ // copyright-holders:R. Belmont /****************************************************************************** * -* MIPS DECstation I/O Gate Array emulation +* MIPS DECstation and AlphaStation I/O Gate Array emulation * This IC contains some address decoding, an interrupt controller, and * a multi-channel DMA engine. */ @@ -20,12 +20,15 @@ void dec_ioga_device::map(address_map &map) } dec_ioga_device::dec_ioga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DECSTATION_IOGA, tag, owner, clock) + : device_t(mconfig, DECSTATION_IOGA, tag, owner, clock), + m_irq_out_cb(*this) { } void dec_ioga_device::device_start() { + m_irq_out_cb.resolve_safe(); + save_item(NAME(m_csr)); save_item(NAME(m_intr)); save_item(NAME(m_imsk)); @@ -58,10 +61,21 @@ READ32_MEMBER(dec_ioga_device::intr_r) { uint32_t rv = m_intr; m_intr &= ~0x20; // 5000/133 boot ROM tests that reading clears this bit - //printf("m_intr = %08x\n", m_intr); return rv; } +void dec_ioga_device::recalc_irq() +{ + if ((m_intr & m_imsk) != 0) + { + m_irq_out_cb(ASSERT_LINE); + } + else + { + m_irq_out_cb(CLEAR_LINE); + } +} + WRITE32_MEMBER(dec_ioga_device::intr_w) { m_intr &= ~data; // clear bits on write @@ -83,4 +97,44 @@ WRITE_LINE_MEMBER(dec_ioga_device::rtc_irq_w) { m_intr |= 0x20; // tested by 5000/133 boot ROM circa BFC027C8 } + recalc_irq(); +} + +WRITE_LINE_MEMBER(dec_ioga_device::lance_irq_w) +{ + if (state == ASSERT_LINE) + { + m_intr |= 0x100; + } + else + { + m_intr &= ~0x100; + } + recalc_irq(); +} + +WRITE_LINE_MEMBER(dec_ioga_device::scc0_irq_w) +{ + if (state == ASSERT_LINE) + { + m_intr |= 0x40; + } + else + { + m_intr &= ~0x40; + } + recalc_irq(); +} + +WRITE_LINE_MEMBER(dec_ioga_device::scc1_irq_w) +{ + if (state == ASSERT_LINE) + { + m_intr |= 0x80; + } + else + { + m_intr &= ~0x80; + } + recalc_irq(); } diff --git a/src/mame/machine/decioga.h b/src/mame/machine/decioga.h index 5e446f9ba2a..28e7ce53990 100644 --- a/src/mame/machine/decioga.h +++ b/src/mame/machine/decioga.h @@ -21,6 +21,12 @@ public: // irq inputs DECLARE_WRITE_LINE_MEMBER(rtc_irq_w); + DECLARE_WRITE_LINE_MEMBER(lance_irq_w); + DECLARE_WRITE_LINE_MEMBER(scc0_irq_w); + DECLARE_WRITE_LINE_MEMBER(scc1_irq_w); + + // multiplex irq output + auto irq_out() { return m_irq_out_cb.bind(); } protected: virtual void device_start() override; @@ -32,8 +38,13 @@ protected: DECLARE_WRITE32_MEMBER(intr_w); DECLARE_READ32_MEMBER(imsk_r); DECLARE_WRITE32_MEMBER(imsk_w); + private: uint32_t m_csr, m_intr, m_imsk; + + devcb_write_line m_irq_out_cb; + + void recalc_irq(); }; DECLARE_DEVICE_TYPE(DECSTATION_IOGA, dec_ioga_device) diff --git a/src/mame/machine/imds2ioc.cpp b/src/mame/machine/imds2ioc.cpp new file mode 100644 index 00000000000..8295d431e03 --- /dev/null +++ b/src/mame/machine/imds2ioc.cpp @@ -0,0 +1,690 @@ +// license:BSD-3-Clause +// copyright-holders:F. Ulivi +// I/O controller for Intel Intellec MDS series-II +// +// NOTE: +// Firmware running on PIO is NOT original because a dump is not available at the moment. +// Emulator runs a version of PIO firmware that was specifically developed by me to implement +// line printer output. +// +// TODO: +// - Find a dump of the original PIO firmware +// - Adjust speed of processors. Wait states are not accounted for yet. + +#include "emu.h" +#include "machine/imds2ioc.h" +#include "screen.h" +#include "speaker.h" + +// Main oscillator of IOC board: 22.032 MHz +#define IOC_XTAL_Y2 22.032_MHz_XTAL + +// FDC oscillator of IOC board: 8 MHz +#define IOC_XTAL_Y1 8_MHz_XTAL + +// PIO oscillator: 6 MHz +#define IOC_XTAL_Y3 6_MHz_XTAL + +// Frequency of beeper +#define IOC_BEEP_FREQ 3300 + +// device type definition +DEFINE_DEVICE_TYPE(IMDS2IOC, imds2ioc_device, "imds2ioc", "Intellec Series II Input/Output Controller") + +void imds2ioc_device::mem_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x1fff).rom(); + map(0x4000, 0x5fff).ram(); +} + +void imds2ioc_device::io_map(address_map &map) +{ + map.unmap_value_high(); + map(0x00, 0x0f).w(FUNC(imds2ioc_device::ioc_dbbout_w)); + map(0x20, 0x2f).w(FUNC(imds2ioc_device::ioc_f0_w)); + map(0x30, 0x3f).w(FUNC(imds2ioc_device::ioc_set_f1_w)); + map(0x40, 0x4f).w(FUNC(imds2ioc_device::ioc_reset_f1_w)); + map(0x50, 0x5f).w(FUNC(imds2ioc_device::start_timer_w)); + map(0x60, 0x6f).w(FUNC(imds2ioc_device::miscout_w)); + map(0x80, 0x8f).r(FUNC(imds2ioc_device::miscin_r)); + map(0x90, 0x9f).r(FUNC(imds2ioc_device::kb_read)); + map(0xa0, 0xaf).r(FUNC(imds2ioc_device::ioc_status_r)); + map(0xb0, 0xbf).r(FUNC(imds2ioc_device::ioc_dbbin_r)); + map(0xc0, 0xcf).m(m_iocfdc, FUNC(i8271_device::map)); + map(0xd0, 0xdf).rw(m_ioccrtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); + map(0xe0, 0xef).rw(m_ioctimer, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); +// DMA controller range doesn't extend to 0xff because register 0xfd needs to be read as 0xff +// This register is used by IOC firmware to detect DMA controller model (either 8237 or 8257) + map(0xf0, 0xf8).rw(m_iocdma, FUNC(i8257_device::read), FUNC(i8257_device::write)); +} + +imds2ioc_device::imds2ioc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, IMDS2IOC, tag, owner, clock), + m_ioccpu(*this, "ioccpu"), + m_iocdma(*this, "iocdma"), + m_ioccrtc(*this, "ioccrtc"), + m_iocbeep(*this, "iocbeep"), + m_ioctimer(*this, "ioctimer"), + m_iocfdc(*this, "iocfdc"), + m_flop0(*this, "iocfdc:0"), + m_iocpio(*this, "iocpio"), + m_kbcpu(*this, "kbcpu"), + m_palette(*this, "palette"), + m_gfxdecode(*this, "gfxdecode"), + m_centronics(*this, "centronics"), + m_io_key(*this, "KEY%u", 0U), + m_ioc_options(*this, "IOC_OPTS"), + m_master_intr_cb(*this), + m_parallel_int_cb(*this), + m_chargen(*this, "gfx1"), + m_device_status_byte(0xff) +{ +} + + +WRITE8_MEMBER(imds2ioc_device::miscout_w) +{ + m_miscout = data; + update_beeper(); + // Send INTR to IPC + m_master_intr_cb(BIT(m_miscout, 1)); +} + +READ8_MEMBER(imds2ioc_device::miscin_r) +{ + uint8_t res = m_ioc_options->read(); + return res | ((m_beeper_timer == 0) << 2); +} + +WRITE_LINE_MEMBER(imds2ioc_device::beep_timer_w) +{ + m_beeper_timer = state; + update_beeper(); +} + +WRITE8_MEMBER(imds2ioc_device::start_timer_w) +{ + // Trigger timer 2 of ioctimer + m_ioctimer->write_gate2(0); + m_ioctimer->write_gate2(1); +} + +READ8_MEMBER(imds2ioc_device::kb_read) +{ + return m_kbcpu->upi41_master_r(space, (offset & 2) >> 1); +} + +READ8_MEMBER(imds2ioc_device::kb_port_p2_r) +{ + if ((m_kb_p1 & 3) == 0) { + // Row selected + // Row number is encoded on bits P15..P12, they are "backwards" (P15 is LSB) and keyboard rows are encoded starting with value 2 on these bits (see A4, pg 56 of schematic) + unsigned row = (m_kb_p1 >> 2) & 0x0f; + ioport_value data; + + switch (row) { + case 4: + // Row 0 + data = m_io_key[0]->read(); + break; + + case 12: + // Row 1 + data = m_io_key[1]->read(); + break; + + case 2: + // Row 2 + data = m_io_key[2]->read(); + break; + + case 10: + // Row 3 + data = m_io_key[3]->read(); + break; + + case 6: + // Row 4 + data = m_io_key[4]->read(); + break; + + case 14: + // Row 5 + data = m_io_key[5]->read(); + break; + + case 1: + // Row 6 + data = m_io_key[6]->read(); + break; + + case 9: + // Row 7 + data = m_io_key[7]->read(); + break; + + default: + data = 0xff; + break; + } + return data & 0xff; + } else { + // No row selected + return 0xff; + } +} + +WRITE8_MEMBER(imds2ioc_device::kb_port_p1_w) +{ + m_kb_p1 = data; +} + +READ_LINE_MEMBER(imds2ioc_device::kb_port_t0_r) +{ + // T0 tied low + // It appears to be some kind of strapping option on kb hw + return 0; +} + +READ_LINE_MEMBER(imds2ioc_device::kb_port_t1_r) +{ + // T1 tied low + // It appears to be some kind of strapping option on kb hw + return 0; +} + +WRITE8_MEMBER(imds2ioc_device::ioc_dbbout_w) +{ + m_ioc_obf = ~data; + // Set/reset OBF flag (b0) + m_ipc_ioc_status = ((offset & 1) == 0) | (m_ipc_ioc_status & ~0x01); +} + +WRITE8_MEMBER(imds2ioc_device::ioc_f0_w) +{ + // Set/reset F0 flag (b2) + m_ipc_ioc_status = ((offset & 1) << 2) | (m_ipc_ioc_status & ~0x04); +} + +WRITE8_MEMBER(imds2ioc_device::ioc_set_f1_w) +{ + // Set F1 flag (b3) + m_ipc_ioc_status |= 0x08; +} + +WRITE8_MEMBER(imds2ioc_device::ioc_reset_f1_w) +{ + // Reset F1 flag (b3) + m_ipc_ioc_status &= ~0x08; +} + +READ8_MEMBER(imds2ioc_device::ioc_status_r) +{ + return ~m_ipc_ioc_status; +} + +READ8_MEMBER(imds2ioc_device::ioc_dbbin_r) +{ + // Reset IBF flag (b1) + if (!machine().side_effects_disabled()) + m_ipc_ioc_status &= ~0x02; + return ~m_ioc_ibf; +} + +READ8_MEMBER(imds2ioc_device::dbb_master_r) +{ + // Read status register + if (BIT(offset, 0)) + return m_ipc_ioc_status; + else + { + // Reset OBF flag (b0) + if (!machine().side_effects_disabled()) + m_ipc_ioc_status &= ~0x01; + + // Read output buffer + return m_ioc_obf; + } +} + +WRITE8_MEMBER(imds2ioc_device::dbb_master_w) +{ + // Set IBF flag (b1) + m_ipc_ioc_status |= 0x02; + + // Command/Data = Master A0 + if (BIT(offset, 0)) + { + // Set F1 flag (b3) + m_ipc_ioc_status |= 0x08; + } + else + { + // Reset F1 flag (b3) + m_ipc_ioc_status &= ~0x08; + } + + // Set input buffer + m_ioc_ibf = data; +} + +WRITE_LINE_MEMBER(imds2ioc_device::hrq_w) +{ + // Should be propagated to HOLD input of IOC CPU + m_iocdma->hlda_w(state); +} + +READ8_MEMBER(imds2ioc_device::ioc_mem_r) +{ + address_space& prog_space = m_ioccpu->space(AS_PROGRAM); + return prog_space.read_byte(offset); +} + +WRITE8_MEMBER(imds2ioc_device::ioc_mem_w) +{ + address_space& prog_space = m_ioccpu->space(AS_PROGRAM); + return prog_space.write_byte(offset, data); +} + +READ8_MEMBER(imds2ioc_device::pio_port_p1_r) +{ + // If STATUS ENABLE/ == 0 return inverted device status byte, else return 0xff + // STATUS ENABLE/ == 0 when P23-P20 == 12 & P24 == 0 & P25 = 1 & P26 = 1 + if ((m_pio_port2 & 0x7f) == 0x6c) { + return ~m_device_status_byte; + } else { + return 0xff; +} +} + +WRITE8_MEMBER(imds2ioc_device::pio_port_p1_w) +{ + m_pio_port1 = data; + update_printer(); +} + +READ8_MEMBER(imds2ioc_device::pio_port_p2_r) +{ + return m_pio_port2; +} + +WRITE8_MEMBER(imds2ioc_device::pio_port_p2_w) +{ + m_pio_port2 = data; + update_printer(); + // Send INTR to IPC + m_parallel_int_cb(BIT(data, 7)); +} + +WRITE_LINE_MEMBER(imds2ioc_device::pio_lpt_ack_w) +{ + if (state) { + m_device_status_byte |= 0x20; + } else { + m_device_status_byte &= ~0x20; + } +} + +WRITE_LINE_MEMBER(imds2ioc_device::pio_lpt_busy_w) +{ + // Busy is active high in centronics_device whereas it's active low in MDS + if (!state) { + m_device_status_byte |= 0x10; + } else { + m_device_status_byte &= ~0x10; + } +} + +WRITE_LINE_MEMBER(imds2ioc_device::pio_lpt_select_w) +{ + if (state) { + m_device_status_byte |= 0x40; + } else { + m_device_status_byte &= ~0x40; + } +} + +I8275_DRAW_CHARACTER_MEMBER(imds2ioc_device::crtc_display_pixels) +{ + unsigned i; + const rgb_t *palette = m_palette->palette()->entry_list_raw(); + uint8_t chargen_byte = m_chargen[ (linecount & 7) | ((unsigned)charcode << 3) ]; + uint16_t pixels; + + if (lten) { + pixels = ~0; + } else if (vsp != 0 || (linecount & 8) != 0) { + pixels = 0; // VSP is gated with LC3 + } else { + // See hardware ref. manual, pg 58 for the very peculiar way of generating character images + // Here each half-pixel is translated into a full pixel + uint16_t exp_pix_l; + uint16_t exp_pix_r; + + exp_pix_l = (uint16_t)chargen_byte; + exp_pix_l = ((exp_pix_l & 0x80) << 5) | + ((exp_pix_l & 0x40) << 4) | + ((exp_pix_l & 0x20) << 3) | + ((exp_pix_l & 0x10) << 2) | + ((exp_pix_l & 0x08) << 1) | + (exp_pix_l & 0x04); + exp_pix_l |= (exp_pix_l << 1); + exp_pix_r = exp_pix_l; + + // Layout of exp_pix_l/r: + // Bit # : F E D C B A 9 8 7 6 5 4 3 2 1 0 + // Bit of chargen_byte: 0 0 b7 b7 b6 b6 b5 b5 b4 b4 b3 b3 b2 b2 0 0 + if ((chargen_byte & 2) == 0) { + exp_pix_l >>= 1; + } + exp_pix_l &= 0x3fc0; + + if ((chargen_byte & 1) == 0) { + exp_pix_r >>= 1; + } + exp_pix_r &= 0x003e; + + pixels = exp_pix_l | exp_pix_r; + } + + if (rvv) { + pixels = ~pixels; + } + + for (i = 0; i < 14; i++) { + bitmap.pix32(y, x + i) = palette[ (pixels & (1U << (13 - i))) != 0 ]; + } +} + +READ8_MEMBER(imds2ioc_device::pio_master_r) +{ + return m_iocpio->upi41_master_r(space, offset); +} + +WRITE8_MEMBER(imds2ioc_device::pio_master_w) +{ + m_iocpio->upi41_master_w(space, offset, data); +} + +void imds2ioc_device::device_resolve_objects() +{ + m_master_intr_cb.resolve_safe(); + m_parallel_int_cb.resolve_safe(); +} + +void imds2ioc_device::device_start() +{ + m_iocfdc->set_ready_line_connected(true); +} + +void imds2ioc_device::device_reset() +{ + m_ipc_ioc_status = 0x0f; + + m_iocfdc->set_rate(500000); // The IMD images show a rate of 500kbps +} + +void imds2ioc_device::update_beeper() +{ + m_iocbeep->set_state(m_beeper_timer == 0 && BIT(m_miscout, 0) == 0); +} + +void imds2ioc_device::update_printer() +{ + // Data to printer is ~P1 when STATUS ENABLE/==1, else 0xff (assuming pull-ups on printer) + uint8_t printer_data; + if ((m_pio_port2 & 0x7f) == 0x6c) { + printer_data = 0xff; + } else { + printer_data = ~m_pio_port1; + } + m_centronics->write_data0(BIT(printer_data, 0)); + m_centronics->write_data1(BIT(printer_data, 1)); + m_centronics->write_data2(BIT(printer_data, 2)); + m_centronics->write_data3(BIT(printer_data, 3)); + m_centronics->write_data4(BIT(printer_data, 4)); + m_centronics->write_data5(BIT(printer_data, 5)); + m_centronics->write_data6(BIT(printer_data, 6)); + m_centronics->write_data7(BIT(printer_data, 7)); + + // LPT DATA STROBE/ == 0 when P23-P20 == 9 & P24 == 0 + m_centronics->write_strobe((m_pio_port2 & 0x1f) != 0x09); +} + +static INPUT_PORTS_START(imds2ioc) + // See schematic, pg 56 for key matrix layout + // See schematic, pg 57 for keyboard layout + PORT_START("KEY0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') // OK + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR('@') PORT_CHAR('`') // OK + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') // OK + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) // OK + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') // OK + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(':') PORT_CHAR('*') // OK + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') // OK + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') // OK + + PORT_START("KEY1") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') // OK + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') // OK + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') // OK + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') // OK + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') // OK + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') // OK + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') // OK + + PORT_START("KEY2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('~') // OK + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') // OK + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') // OK + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') // OK + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') // OK + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') // OK + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') // OK + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(';') PORT_CHAR('+') // OK + + PORT_START("KEY3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') // OK + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') // OK + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') // OK + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') // OK + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') // OK + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') // OK + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') // OK + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') // OK + + PORT_START("KEY4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') // OK + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') // OK + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') // OK + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') // OK + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') // OK + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') // OK + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') // OK + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') // OK + + PORT_START("KEY5") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') // OK + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') // OK + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') // OK + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') // OK + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') // OK + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') // OK + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') // OK + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') // OK + + PORT_START("KEY6") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) // BS + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME)) // OK + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('\\') PORT_CHAR('|') // OK + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) // OK + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) // OK + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) // OK + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') // OK + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) // OK + + PORT_START("KEY7") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) // OK + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) // OK + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('_') PORT_CHAR('^') // OK + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // OK + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) // OK + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) + + // Options on IOC: see schematic, pg 40 + PORT_START("IOC_OPTS") + PORT_DIPNAME(0x80, 0x80, "Keyboard present") + PORT_DIPSETTING(0x80, DEF_STR(Yes)) + PORT_DIPSETTING(0x00, DEF_STR(No)) + PORT_DIPNAME(0x28, 0x00, "IOC mode") + PORT_DIPSETTING(0x00, "On line") + PORT_DIPSETTING(0x08, "Local") + PORT_DIPSETTING(0x20, "Diagnostic") + PORT_DIPNAME(0x02, 0x00, "Floppy present") + PORT_DIPSETTING(0x02, DEF_STR(Yes)) + PORT_DIPSETTING(0x00, DEF_STR(No)) + PORT_DIPNAME(0x01, 0x01, "CRT frame frequency") + PORT_DIPSETTING(0x01, "50 Hz") + PORT_DIPSETTING(0x00, "60 Hz") +INPUT_PORTS_END + +static GFXLAYOUT_RAW(imds2_charlayout, 8, 8, 8, 64) + +static GFXDECODE_START(gfx_imds2) + GFXDECODE_ENTRY("gfx1", 0x0000, imds2_charlayout, 0, 1) +GFXDECODE_END + +static void imds2_floppies(device_slot_interface &device) +{ + device.option_add("8sssd", FLOPPY_8_SSSD); +} + +MACHINE_CONFIG_START(imds2ioc_device::device_add_mconfig) + I8080A(config, m_ioccpu, IOC_XTAL_Y2 / 18); // 2.448 MHz but running at 50% (due to wait states & DMA usage of bus) + m_ioccpu->set_addrmap(AS_PROGRAM, &imds2ioc_device::mem_map); + m_ioccpu->set_addrmap(AS_IO, &imds2ioc_device::io_map); + MCFG_QUANTUM_TIME(attotime::from_hz(100)) + + // The IOC CRT hw is a bit complex, as the character clock (CCLK) to i8275 + // is varied according to the part of the video frame being scanned and according to + // the 50/60 Hz option jumper (W8). + // The basic clock (BCLK) runs at 22.032 MHz. + // CCLK = BCLK / 14 when in the active region of video + // CCLK = BCLK / 12 when in horizontal retrace (HRTC=1) + // CCLK = BCLK / 10 when in horizontal retrace of "short scan lines" (50 Hz only) + // + // ***** 50 Hz timings ***** + // 80 chars/row, 26 chars/h. retrace, 11 scan lines/row, 25 active rows, 3 vertical retrace rows + // Scan line: 80 chars * 14 BCLK + 26 chars * 12 BCLK = 1432 BCLK (64.996 usec) + // Scan row: 11 * scan lines = 15752 BCLK (714.960 usec) + // "Short" scan line: 80 chars * 14 BCLK + 26 chars * 10 BCLK = 1380 BCLK (62.636 usec) + // Frame: 28 scan rows (8 scan lines of 27th row are short): 27 * scan row + 3 * scan line + 8 * short scan line: 440640 BCLK (20 msec) + // + // ***** 60 Hz timings ***** + // 80 chars/row, 20 chars/h. retrace, 10 scan lines/row, 25 active rows, 2 vertical retrace rows + // Scan line: 80 chars * 14 BCLK + 20 chars * 12 BCLK = 1360 BCLK (61.728 usec) + // Scan row: 10 * scan lines = 13600 BCLK (617.284 usec) + // Frame: 27 scan rows : 367200 BCLK (16.667 msec) + // + // Clock here is semi-bogus: it gives the correct frame frequency at 50 Hz (with the incorrect + // assumption that CCLK is fixed at BCLK / 14) + I8275(config, m_ioccrtc, 22853600 / 14); + m_ioccrtc->set_character_width(14); + m_ioccrtc->set_display_callback(FUNC(imds2ioc_device::crtc_display_pixels), this); + m_ioccrtc->drq_wr_callback().set(m_iocdma, FUNC(i8257_device::dreq2_w)); + m_ioccrtc->irq_wr_callback().set_inputline(m_ioccpu, I8085_INTR_LINE); + m_ioccrtc->set_screen("screen"); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_screen_update("ioccrtc", FUNC(i8275_device::screen_update)); + screen.set_refresh_hz(50); + GFXDECODE(config, "gfxdecode", "palette", gfx_imds2); + MCFG_PALETTE_ADD_MONOCHROME("palette") + + SPEAKER(config, "mono").front_center(); + BEEP(config, m_iocbeep, IOC_BEEP_FREQ).add_route(ALL_OUTPUTS, "mono", 1.00); + + I8257(config, m_iocdma, IOC_XTAL_Y2 / 9); + m_iocdma->out_hrq_cb().set(FUNC(imds2ioc_device::hrq_w)); + m_iocdma->in_memr_cb().set(FUNC(imds2ioc_device::ioc_mem_r)); + m_iocdma->out_memw_cb().set(FUNC(imds2ioc_device::ioc_mem_w)); + m_iocdma->in_ior_cb<1>().set("iocfdc", FUNC(i8271_device::data_r)); + m_iocdma->out_iow_cb<1>().set("iocfdc", FUNC(i8271_device::data_w)); + m_iocdma->out_iow_cb<2>().set(m_ioccrtc, FUNC(i8275_device::dack_w)); + + PIT8253(config, m_ioctimer, 0); + m_ioctimer->set_clk<0>(IOC_XTAL_Y1 / 4); + m_ioctimer->out_handler<0>().set(m_ioctimer, FUNC(pit8253_device::write_clk2)); + m_ioctimer->out_handler<2>().set(FUNC(imds2ioc_device::beep_timer_w)); + + I8271(config, m_iocfdc, IOC_XTAL_Y1 / 2); + m_iocfdc->drq_wr_callback().set(m_iocdma, FUNC(i8257_device::dreq1_w)); + MCFG_FLOPPY_DRIVE_ADD("iocfdc:0", imds2_floppies, "8sssd", floppy_image_device::default_floppy_formats) + MCFG_SLOT_FIXED(true) + + I8041(config, m_iocpio, IOC_XTAL_Y3); + m_iocpio->p1_in_cb().set(FUNC(imds2ioc_device::pio_port_p1_r)); + m_iocpio->p1_out_cb().set(FUNC(imds2ioc_device::pio_port_p1_w)); + m_iocpio->p2_in_cb().set(FUNC(imds2ioc_device::pio_port_p2_r)); + m_iocpio->p2_out_cb().set(FUNC(imds2ioc_device::pio_port_p2_w)); + + I8741(config, m_kbcpu, 3.579545_MHz_XTAL); + m_kbcpu->p1_out_cb().set(FUNC(imds2ioc_device::kb_port_p1_w)); + m_kbcpu->p2_in_cb().set(FUNC(imds2ioc_device::kb_port_p2_r)); + m_kbcpu->t0_in_cb().set(FUNC(imds2ioc_device::kb_port_t0_r)); + m_kbcpu->t1_in_cb().set(FUNC(imds2ioc_device::kb_port_t1_r)); + + CENTRONICS(config, m_centronics, centronics_devices, "printer"); + m_centronics->ack_handler().set(FUNC(imds2ioc_device::pio_lpt_ack_w)); + m_centronics->busy_handler().set(FUNC(imds2ioc_device::pio_lpt_busy_w)); + m_centronics->perror_handler().set(FUNC(imds2ioc_device::pio_lpt_select_w)); +MACHINE_CONFIG_END + +ROM_START(imds2ioc) + // ROM definition of IOC cpu (8080A) + ROM_REGION(0x2000, "ioccpu", 0) + ROM_DEFAULT_BIOS("v15") + ROM_SYSTEM_BIOS(0, "v15", "Series II IOC Diagnostic v1.5") // "CORP INTEL corp.1981-83" + ROMX_LOAD("ioc_a50_104692-001.bin", 0x0000, 0x0800, CRC(d9f926a1) SHA1(bd9d0f7458acc2806120a6dbaab9c48be315b060), ROM_BIOS(0)) + ROMX_LOAD("ioc_a51_104692-002.bin", 0x0800, 0x0800, CRC(6aa2f86c) SHA1(d3a5314d86e3366545b4c97b29e323dfab383d5f), ROM_BIOS(0)) + ROMX_LOAD("ioc_a52_104692-003.bin", 0x1000, 0x0800, CRC(b88a38d5) SHA1(934716a1daec852f4d1f846510f42408df0c9584), ROM_BIOS(0)) + ROMX_LOAD("ioc_a53_104692-004.bin", 0x1800, 0x0800, CRC(c8df4bb9) SHA1(2dfb921e94ae7033a7182457b2f00657674d1b77), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v14", "Series II IOC Diagnostic v1.4") // "(C) Intel Corp. 1981,1982" + ROMX_LOAD("a62_2716.bin", 0x0000, 0x0800, CRC(86a55b2f) SHA1(21033f7abb2c3e08028613e0c35ffecb703ff4f1), ROM_BIOS(1)) + ROMX_LOAD("a51_2716.bin", 0x0800, 0x0800, CRC(ee55c448) SHA1(16c2f7e3b5baeb398adcc59603943910813e6a9b), ROM_BIOS(1)) + ROMX_LOAD("a52_2716.bin", 0x1000, 0x0800, CRC(8db1b33e) SHA1(6fc5e438009636dd6d7185071b152b0491d3baeb), ROM_BIOS(1)) + ROMX_LOAD("a53_2716.bin", 0x1800, 0x0800, CRC(01690f4f) SHA1(eadef30a3797f41e08d28e7691f8de44c0f3b8ea), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "v13", "Series II IOC Diagnostic v1.3") // no copyright string; accompanying installation instructions © 1980 Intel Corporation + ROMX_LOAD("104593-001.a50", 0x0000, 0x0800, CRC(801de7ad) SHA1(291b7db8a163b970e9082bdb637d7dee436c7a62), ROM_BIOS(2)) + ROMX_LOAD("104593-002.a51", 0x0800, 0x0800, CRC(6c8e21b6) SHA1(b3e63b2846a79866eb74ab354001996424ec22a0), ROM_BIOS(2)) + ROMX_LOAD("104593-003.a52", 0x1000, 0x0800, CRC(134c8115) SHA1(cd8c566344ee7a9cda78eea5fd2efdaca5a2e540), ROM_BIOS(2)) + ROMX_LOAD("104593-004.a53", 0x1800, 0x0800, CRC(04407e2a) SHA1(ecd65e4337d2bb7f5f6fdaae95696c9207ba57ee), ROM_BIOS(2)) + + // ROM definition of PIO controller (8041A) + // For the time being a specially developed PIO firmware is used until a dump of the original PIO is + // available. + ROM_REGION(0x400, "iocpio", 0) + ROM_LOAD("pio_a72.bin", 0, 0x400, BAD_DUMP CRC(8c8e740b) SHA1(9b9333a9dc9585aa8f630721d13e551a5c87defc)) + + // ROM definition of keyboard controller (8741) + ROM_REGION(0x400, "kbcpu", 0) + ROM_LOAD("kbd_a3_104675-001.bin", 0, 0x400, CRC(ba7c4303) SHA1(19899af732d0ae1247bfc79979b1ee5f339ee5cf)) + + // ROM definition of character generator (2708, A19 on IOC) + ROM_REGION(0x400, "gfx1", 0) + ROM_LOAD("ioc_a19_101539-001.bin", 0x0000, 0x0400, CRC(47487d0f) SHA1(0ed98f9f06622949ee3cc2ffc572fb9702db0f81)) +ROM_END + +ioport_constructor imds2ioc_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(imds2ioc); +} + +const tiny_rom_entry *imds2ioc_device::device_rom_region() const +{ + return ROM_NAME(imds2ioc); +} diff --git a/src/mame/machine/imds2ioc.h b/src/mame/machine/imds2ioc.h new file mode 100644 index 00000000000..a144f2e0571 --- /dev/null +++ b/src/mame/machine/imds2ioc.h @@ -0,0 +1,131 @@ +// license:BSD-3-Clause +// copyright-holders:F. Ulivi + +#ifndef MAME_MACHINE_IMDS2IOC_H +#define MAME_MACHINE_IMDS2IOC_H + +#include "cpu/i8085/i8085.h" +#include "cpu/mcs48/mcs48.h" +#include "machine/i8257.h" +#include "video/i8275.h" +#include "sound/beep.h" +#include "machine/pit8253.h" +#include "machine/i8271.h" +#include "imagedev/flopdrv.h" +#include "bus/centronics/ctronics.h" +#include "emupal.h" + +class imds2ioc_device : public device_t +{ +public: + imds2ioc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + auto master_intr_cb() { return m_master_intr_cb.bind(); } + auto parallel_int_cb() { return m_parallel_int_cb.bind(); } + + DECLARE_READ8_MEMBER(dbb_master_r); + DECLARE_WRITE8_MEMBER(dbb_master_w); + + DECLARE_READ8_MEMBER(pio_master_r); + DECLARE_WRITE8_MEMBER(pio_master_w); + +protected: + virtual ioport_constructor device_input_ports() const override; + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual void device_resolve_objects() override; + virtual void device_start() override; + virtual void device_reset() override; + +private: + DECLARE_WRITE8_MEMBER(miscout_w); + DECLARE_READ8_MEMBER(miscin_r); + DECLARE_WRITE_LINE_MEMBER(beep_timer_w); + DECLARE_WRITE8_MEMBER(start_timer_w); + + DECLARE_READ8_MEMBER(kb_read); + DECLARE_READ8_MEMBER(kb_port_p2_r); + DECLARE_WRITE8_MEMBER(kb_port_p1_w); + DECLARE_READ_LINE_MEMBER(kb_port_t0_r); + DECLARE_READ_LINE_MEMBER(kb_port_t1_r); + + DECLARE_WRITE8_MEMBER(ioc_dbbout_w); + DECLARE_WRITE8_MEMBER(ioc_f0_w); + DECLARE_WRITE8_MEMBER(ioc_set_f1_w); + DECLARE_WRITE8_MEMBER(ioc_reset_f1_w); + DECLARE_READ8_MEMBER(ioc_status_r); + DECLARE_READ8_MEMBER(ioc_dbbin_r); + + DECLARE_WRITE_LINE_MEMBER(hrq_w); + DECLARE_READ8_MEMBER(ioc_mem_r); + DECLARE_WRITE8_MEMBER(ioc_mem_w); + + DECLARE_READ8_MEMBER(pio_port_p1_r); + DECLARE_WRITE8_MEMBER(pio_port_p1_w); + DECLARE_READ8_MEMBER(pio_port_p2_r); + DECLARE_WRITE8_MEMBER(pio_port_p2_w); + DECLARE_WRITE_LINE_MEMBER(pio_lpt_ack_w); + DECLARE_WRITE_LINE_MEMBER(pio_lpt_busy_w); + DECLARE_WRITE_LINE_MEMBER(pio_lpt_select_w); + + I8275_DRAW_CHARACTER_MEMBER(crtc_display_pixels); + + void io_map(address_map &map); + void mem_map(address_map &map); + + void update_beeper(); + void update_printer(); + + required_device<i8080a_cpu_device> m_ioccpu; + required_device<i8257_device> m_iocdma; + required_device<i8275_device> m_ioccrtc; + required_device<beep_device> m_iocbeep; + required_device<pit8253_device> m_ioctimer; + required_device<i8271_device> m_iocfdc; + required_device<floppy_connector> m_flop0; + required_device<i8041_device> m_iocpio; + required_device<i8741_device> m_kbcpu; + required_device<palette_device> m_palette; + required_device<gfxdecode_device> m_gfxdecode; + required_device<centronics_device> m_centronics; + required_ioport_array<8> m_io_key; + required_ioport m_ioc_options; + + devcb_write_line m_master_intr_cb; + devcb_write_line m_parallel_int_cb; + + // Character generator + required_region_ptr<uint8_t> m_chargen; + + // MISCOUT state + uint8_t m_miscout; + + // Beeper timer line + int m_beeper_timer; + + // Keyboard state + uint8_t m_kb_p1; + + // IPC to IOC buffer + uint8_t m_ioc_ibf; + + // IOC to IPC buffer + uint8_t m_ioc_obf; + + // IPC/IOC status + uint8_t m_ipc_ioc_status; + + // PIO port 1 + uint8_t m_pio_port1; + + // PIO port 2 + uint8_t m_pio_port2; + + // PIO device status byte + uint8_t m_device_status_byte; +}; + +DECLARE_DEVICE_TYPE(IMDS2IOC, imds2ioc_device) + +#endif // MAME_MACHINE_IMDS2IOC_H diff --git a/src/mame/machine/mhavoc.cpp b/src/mame/machine/mhavoc.cpp index 232406de97d..fe4395c8c04 100644 --- a/src/mame/machine/mhavoc.cpp +++ b/src/mame/machine/mhavoc.cpp @@ -314,7 +314,7 @@ WRITE8_MEMBER(mhavoc_state::mhavocrv_speech_data_w) WRITE8_MEMBER(mhavoc_state::mhavocrv_speech_strobe_w) { - m_tms->data_w(space, 0, m_speech_write_buffer); + m_tms->data_w(m_speech_write_buffer); } /************************************* diff --git a/src/mame/machine/namco68.cpp b/src/mame/machine/namco68.cpp index 571002f87e6..9cb340c18a1 100644 --- a/src/mame/machine/namco68.cpp +++ b/src/mame/machine/namco68.cpp @@ -2,9 +2,9 @@ // copyright-holders:David Haywood, K.Wilkins /* + TODO: -output support, Golly Ghost is currently hacking this based on DPRAM in the namcos2.cpp driver side! -some of this can likely be moved into the actual MCU core too +output support */ @@ -17,7 +17,6 @@ namcoc68_device::namcoc68_device(const machine_config &mconfig, const char *tag, device_t(mconfig, NAMCOC68, tag, owner, clock), m_mcu(*this, "mcu"), m_in_pb_cb(*this), - m_in_pb2_cb(*this), m_in_pc_cb(*this), m_in_ph_cb(*this), m_in_pdsw_cb(*this), @@ -30,14 +29,30 @@ namcoc68_device::namcoc68_device(const machine_config &mconfig, const char *tag, ROM_START( namcoc68 ) ROM_REGION( 0x8000, "mcu", 0 ) - ROM_LOAD( "c68.3d", 0x000000, 0x008000, CRC(ca64550a) SHA1(38d1ad1b1287cadef0c999aff9357927315f8e6b) ) + ROM_LOAD( "c68.bin", 0x000000, 0x008000, CRC(ca64550a) SHA1(38d1ad1b1287cadef0c999aff9357927315f8e6b) ) // usually position 3d, but device really needs a way to specify it ROM_END - +// C68 looks like a drop-in replacement for C65, so the port mappings must be scrambled in one instance, since this already has a multiplex on the port, assume here READ8_MEMBER(namcoc68_device::c68_p5_r) { - return (m_player_mux) ? m_in_pb2_cb() : m_in_pb_cb(); + uint16_t ret = (m_in_ph_cb() << 8) | m_in_pb_cb(); + + if (m_player_mux) + { + return bitswap<8>(ret, 6, 8, 10, 12, 4, 2, 0, 14); + } + else + { + return bitswap<8>(ret, 7, 9, 11, 13, 5, 3, 1, 15); + } +} + +READ8_MEMBER(namcoc68_device::mcuc_r) +{ + uint8_t ret = m_in_pc_cb(); + ret = bitswap<8>(ret, 3, 2, 1, 0, 7, 6, 5, 4); + return ret; } WRITE8_MEMBER(namcoc68_device::c68_p3_w) @@ -61,6 +76,11 @@ WRITE8_MEMBER(namcoc68_device::dpram_byte_w) m_dp_out(offset,data); } +READ8_MEMBER(namcoc68_device::unk_r) +{ + return 0x00; +} + void namcoc68_device::c68_default_am(address_map &map) { /* input ports and dips are mapped here */ @@ -79,16 +99,15 @@ void namcoc68_device::device_add_mconfig(machine_config &config) m3745x_device* device = &M37450(config, m_mcu, DERIVED_CLOCK(1, 1)); // ugly, needs modernizing MCFG_M3745X_ADC14_CALLBACKS(READ8(*this, namcoc68_device, mcuan0_r), READ8(*this, namcoc68_device, mcuan1_r), READ8(*this, namcoc68_device, mcuan2_r), READ8(*this, namcoc68_device, mcuan3_r)) MCFG_M3745X_ADC58_CALLBACKS(READ8(*this, namcoc68_device, mcuan4_r), READ8(*this, namcoc68_device, mcuan5_r), READ8(*this, namcoc68_device, mcuan6_r), READ8(*this, namcoc68_device, mcuan7_r)) - MCFG_M3745X_PORT3_CALLBACKS(READ8(*this, namcoc68_device, mcuh_r), WRITE8(*this, namcoc68_device, c68_p3_w)) // coins/test/service + MCFG_M3745X_PORT3_CALLBACKS(READ8(*this, namcoc68_device, mcuc_r), WRITE8(*this, namcoc68_device, c68_p3_w)) // coins/test/service MCFG_M3745X_PORT5_CALLBACKS(READ8(*this, namcoc68_device, c68_p5_r), NOOP) // muxed player 1/2 - MCFG_M3745X_PORT6_CALLBACKS(READ8(*this, namcoc68_device, mcuc_r), NOOP) // unused in sgunner2 + MCFG_M3745X_PORT6_CALLBACKS(READ8(*this, namcoc68_device, unk_r), NOOP) // unused in sgunner2 MCFG_DEVICE_PROGRAM_MAP(c68_default_am) } void namcoc68_device::device_resolve_objects() { m_in_pb_cb.resolve_safe(0xff); - m_in_pb2_cb.resolve_safe(0xff); m_in_pc_cb.resolve_safe(0xff); m_in_ph_cb.resolve_safe(0xff); m_in_pdsw_cb.resolve_safe(0xff); diff --git a/src/mame/machine/namco68.h b/src/mame/machine/namco68.h index 98136cc9ffb..4d976afebe9 100644 --- a/src/mame/machine/namco68.h +++ b/src/mame/machine/namco68.h @@ -18,7 +18,6 @@ public: namcoc68_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); auto in_pb_callback() { return m_in_pb_cb.bind(); } - auto in_pb2_callback() { return m_in_pb2_cb.bind(); } auto in_pc_callback() { return m_in_pc_cb.bind(); } auto in_ph_callback() { return m_in_ph_cb.bind(); } @@ -57,7 +56,6 @@ private: required_device<m37450_device> m_mcu; devcb_read8 m_in_pb_cb; - devcb_read8 m_in_pb2_cb; devcb_read8 m_in_pc_cb; devcb_read8 m_in_ph_cb; @@ -76,12 +74,9 @@ private: DECLARE_READ8_MEMBER(dpram_byte_r); DECLARE_WRITE8_MEMBER(dpram_byte_w); - DECLARE_READ8_MEMBER(mcub_r) { return m_in_pb_cb(); } - DECLARE_READ8_MEMBER(mcub2_r) { return m_in_pb2_cb(); } + DECLARE_READ8_MEMBER(unk_r); + DECLARE_READ8_MEMBER(mcuc_r); - - DECLARE_READ8_MEMBER(mcuc_r) { return m_in_pc_cb(); } - DECLARE_READ8_MEMBER(mcuh_r) { return m_in_ph_cb(); } DECLARE_READ8_MEMBER(mcudsw_r) { return m_in_pdsw_cb(); } DECLARE_READ8_MEMBER(mcudi0_r) { return m_port_dial_in_cb[0](); } diff --git a/src/mame/machine/namcoic.cpp b/src/mame/machine/namcoic.cpp deleted file mode 100644 index bfb3ea1e192..00000000000 --- a/src/mame/machine/namcoic.cpp +++ /dev/null @@ -1,1008 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Phil Stroffolino -#include "emu.h" -#include "machine/namcoic.h" - -#include "includes/namcos2.h" /* for game-specific hacks */ - - -/**************************************************************************************/ - -void namcos2_shared_state::c123_tilemap_invalidate(void) -{ - for( int i = 0; i < 6; i++ ) - { - m_c123_TilemapInfo.tmap[i]->mark_all_dirty(); - } -} /* namco_tilemap_invalidate */ - -template<int Offset> -TILE_GET_INFO_MEMBER( namcos2_shared_state::get_tile_info ) -{ - const uint16_t *vram = &m_c123_TilemapInfo.videoram[Offset]; - int tile, mask; - m_c123_TilemapInfo.cb( vram[tile_index], &tile, &mask ); - tileinfo.mask_data = m_c123_TilemapInfo.maskBaseAddr+mask*8; - SET_TILE_INFO_MEMBER(m_c123_TilemapInfo.gfxbank,tile,0,0); -} /* get_tile_info */ - -void namcos2_shared_state::c123_tilemap_init( int gfxbank, void *maskBaseAddr, c123_tilemap_delegate tilemap_cb ) -{ - m_c123_TilemapInfo.gfxbank = gfxbank; - m_c123_TilemapInfo.maskBaseAddr = (uint8_t *)maskBaseAddr; - m_c123_TilemapInfo.cb = tilemap_cb; - m_c123_TilemapInfo.videoram = std::make_unique<uint16_t[]>( 0x10000 ); - - /* four scrolling tilemaps */ - m_c123_TilemapInfo.tmap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x0000>),this),TILEMAP_SCAN_ROWS,8,8,64,64); - m_c123_TilemapInfo.tmap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x1000>),this),TILEMAP_SCAN_ROWS,8,8,64,64); - m_c123_TilemapInfo.tmap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x2000>),this),TILEMAP_SCAN_ROWS,8,8,64,64); - m_c123_TilemapInfo.tmap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x3000>),this),TILEMAP_SCAN_ROWS,8,8,64,64); - - /* two non-scrolling tilemaps */ - m_c123_TilemapInfo.tmap[4] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x4008>),this),TILEMAP_SCAN_ROWS,8,8,36,28); - m_c123_TilemapInfo.tmap[5] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x4408>),this),TILEMAP_SCAN_ROWS,8,8,36,28); - - /* define offsets for scrolling */ - for( int i = 0; i < 4; i++ ) - { - static const int adj[4] = { 4,2,1,0 }; - int dx = 44+adj[i]; - m_c123_TilemapInfo.tmap[i]->set_scrolldx( -dx, 288+dx ); - m_c123_TilemapInfo.tmap[i]->set_scrolldy( -24, 224+24 ); - } - - save_item(NAME(m_c123_TilemapInfo.control)); - save_pointer(NAME(m_c123_TilemapInfo.videoram), 0x10000); -} - -void namcos2_shared_state::c123_tilemap_draw( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) -{ - for( int i = 0; i < 6; i++ ) - { - /* note: priority is only in range 0..7, but Point Blank uses 0xf to hide a layer */ - if( (m_c123_TilemapInfo.control[0x20/2+i]&0xf) == pri ) - { - int color = m_c123_TilemapInfo.control[0x30/2+i] & 0x07; - m_c123_TilemapInfo.tmap[i]->set_palette_offset( color*256 ); - m_c123_TilemapInfo.tmap[i]->draw(screen, bitmap,cliprect,0,0); - } - } -} /* c123_tilemap_draw */ - -void namcos2_shared_state::c123_SetTilemapVideoram(int offset, uint16_t newword) -{ - m_c123_TilemapInfo.videoram[offset] = newword; - if( offset<0x4000 ) - { - m_c123_TilemapInfo.tmap[offset>>12]->mark_tile_dirty(offset&0xfff); - } - else if( offset>=0x8010/2 && offset<0x87f0/2 ) - { /* fixed plane#1 */ - offset-=0x8010/2; - m_c123_TilemapInfo.tmap[4]->mark_tile_dirty( offset ); - } - else if( offset>=0x8810/2 && offset<0x8ff0/2 ) - { /* fixed plane#2 */ - offset-=0x8810/2; - m_c123_TilemapInfo.tmap[5]->mark_tile_dirty( offset ); - } -} /* SetTilemapVideoram */ - -WRITE16_MEMBER( namcos2_shared_state::c123_tilemap_videoram_w ) -{ - uint16_t newword = m_c123_TilemapInfo.videoram[offset]; - COMBINE_DATA( &newword ); - c123_SetTilemapVideoram( offset, newword ); -} - -READ16_MEMBER( namcos2_shared_state::c123_tilemap_videoram_r ) -{ - return m_c123_TilemapInfo.videoram[offset]; -} - -void namcos2_shared_state::c123_SetTilemapControl(int offset, uint16_t newword) -{ - m_c123_TilemapInfo.control[offset] = newword; - if( offset<0x20/2 ) - { - if( offset == 0x02/2 ) - { - /* all planes are flipped X+Y from D15 of this word */ - int attrs = (newword & 0x8000)?(TILEMAP_FLIPX|TILEMAP_FLIPY):0; - int i; - for( i=0; i<=5; i++ ) - { - m_c123_TilemapInfo.tmap[i]->set_flip(attrs); - } - } - } - newword &= 0x1ff; - if( m_c123_TilemapInfo.control[0x02/2]&0x8000 ) - { - newword = -newword; - } - switch( offset ) - { - case 0x02/2: - m_c123_TilemapInfo.tmap[0]->set_scrollx( 0, newword ); - break; - case 0x06/2: - m_c123_TilemapInfo.tmap[0]->set_scrolly( 0, newword ); - break; - case 0x0a/2: - m_c123_TilemapInfo.tmap[1]->set_scrollx( 0, newword ); - break; - case 0x0e/2: - m_c123_TilemapInfo.tmap[1]->set_scrolly( 0, newword ); - break; - case 0x12/2: - m_c123_TilemapInfo.tmap[2]->set_scrollx( 0, newword ); - break; - case 0x16/2: - m_c123_TilemapInfo.tmap[2]->set_scrolly( 0, newword ); - break; - case 0x1a/2: - m_c123_TilemapInfo.tmap[3]->set_scrollx( 0, newword ); - break; - case 0x1e/2: - m_c123_TilemapInfo.tmap[3]->set_scrolly( 0, newword ); - break; - } -} /* SetTilemapControl */ - -WRITE16_MEMBER( namcos2_shared_state::c123_tilemap_control_w ) -{ - uint16_t newword = m_c123_TilemapInfo.control[offset]; - COMBINE_DATA( &newword ); - c123_SetTilemapControl( offset, newword ); -} - -READ16_MEMBER( namcos2_shared_state::c123_tilemap_control_r ) -{ - return m_c123_TilemapInfo.control[offset]; -} - - -/**************************************************************************************/ - -void namcos2_shared_state::zdrawgfxzoom( - screen_device &screen, - bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx, - uint32_t code,uint32_t color,int flipx,int flipy,int sx,int sy, - int scalex, int scaley, int zpos ) -{ - if (!scalex || !scaley) return; - if (dest_bmp.bpp() == 16) - { - if( gfx ) - { - int shadow_offset = (m_palette->shadows_enabled())?m_palette->entries():0; - const pen_t *pal = &m_palette->pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors())); - const uint8_t *source_base = gfx->get_data(code % gfx->elements()); - int sprite_screen_height = (scaley*gfx->height()+0x8000)>>16; - int sprite_screen_width = (scalex*gfx->width()+0x8000)>>16; - if (sprite_screen_width && sprite_screen_height) - { - /* compute sprite increment per screen pixel */ - int dx = (gfx->width()<<16)/sprite_screen_width; - int dy = (gfx->height()<<16)/sprite_screen_height; - - int ex = sx+sprite_screen_width; - int ey = sy+sprite_screen_height; - - int x_index_base; - int y_index; - - if( flipx ) - { - x_index_base = (sprite_screen_width-1)*dx; - dx = -dx; - } - else - { - x_index_base = 0; - } - - if( flipy ) - { - y_index = (sprite_screen_height-1)*dy; - dy = -dy; - } - else - { - y_index = 0; - } - - if( sx < clip.min_x) - { /* clip left */ - int pixels = clip.min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip.min_y ) - { /* clip top */ - int pixels = clip.min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - if( ex > clip.max_x+1 ) - { /* clip right */ - int pixels = ex-clip.max_x-1; - ex -= pixels; - } - if( ey > clip.max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip.max_y-1; - ey -= pixels; - } - - if( ex>sx ) - { /* skip if inner loop doesn't draw anything */ - int y; - bitmap_ind8 &priority_bitmap = screen.priority(); - if( priority_bitmap.valid() ) - { - for( y=sy; y<ey; y++ ) - { - const uint8_t *source = source_base + (y_index>>16) * gfx->rowbytes(); - uint16_t *dest = &dest_bmp.pix16(y); - uint8_t *pri = &priority_bitmap.pix8(y); - int x, x_index = x_index_base; - if( m_c355_obj_palxor ) - { - for( x=sx; x<ex; x++ ) - { - int c = source[x_index>>16]; - if( c != 0xff ) - { - if( pri[x]<=zpos ) - { - switch( c ) - { - case 0: - dest[x] = 0x4000|(dest[x]&0x1fff); - break; - case 1: - dest[x] = 0x6000|(dest[x]&0x1fff); - break; - default: - dest[x] = pal[c]; - break; - } - pri[x] = zpos; - } - } - x_index += dx; - } - y_index += dy; - } - else - { - for( x=sx; x<ex; x++ ) - { - int c = source[x_index>>16]; - if( c != 0xff ) - { - if( pri[x]<=zpos ) - { - if( color == 0xf && c==0xfe && shadow_offset ) - { - dest[x] |= shadow_offset; - } - else - { - dest[x] = pal[c]; - } - pri[x] = zpos; - } - } - x_index += dx; - } - y_index += dy; - } - } - } - } - } - } - } -} /* zdrawgfxzoom */ - -void namcos2_shared_state::zdrawgfxzoom( - screen_device &screen, - bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx, - uint32_t code,uint32_t color,int flipx,int flipy,int sx,int sy, - int scalex, int scaley, int zpos ) -{ - /* nop */ -} - -void namcos2_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, int control ) -{ - int offset = (control & 0x000f) * (128*4); - int loop; - if( pri==0 ) - { - screen.priority().fill(0, cliprect ); - } - for( loop=0; loop < 128; loop++ ) - { - /**************************************** - * word#0 - * Sprite Y position D00-D08 - * Sprite Size 16/32 D09 - * Sprite Size Y D10-D15 - * - * word#1 - * Sprite Quadrant D00-D01 - * Sprite Number D02-D12 - * Sprite ROM Bank select D13 - * Sprite flip X D14 - * Sprite flip Y D15 - * - * word#2 - * Sprite X position D00-D10 - * - * word#3 - * Sprite priority D00-D02 - * Sprite colour index D04-D07 - * Sprite Size X D10-D15 - */ - int word3 = m_spriteram[offset+(loop*4)+3]; - if( (word3&0xf)==pri ) - { - int word0 = m_spriteram[offset+(loop*4)+0]; - int word1 = m_spriteram[offset+(loop*4)+1]; - int offset4 = m_spriteram[offset+(loop*4)+2]; - - int sizey=((word0>>10)&0x3f)+1; - int sizex=(word3>>10)&0x3f; - - if((word0&0x0200)==0) sizex>>=1; - - if((sizey-1) && sizex ) - { - int color = (word3>>4)&0x000f; - int sprn = (word1>>2)&0x7ff; - int rgn = (word1&0x2000)?1:0; - int ypos = (0x1ff-(word0&0x01ff))-0x50+0x02; - int xpos = (offset4&0x03ff)-0x50+0x07; - int flipy = word1&0x8000; - int flipx = word1&0x4000; - int scalex = (sizex<<16)/((word0&0x0200)?0x20:0x10); - int scaley = (sizey<<16)/((word0&0x0200)?0x20:0x10); - if(scalex && scaley) - { - gfx_element *gfx = m_gfxdecode->gfx(rgn); - - if( (word0&0x0200)==0 ) - gfx->set_source_clip((word1&0x0001) ? 16 : 0, 16, (word1&0x0002) ? 16 : 0, 16); - else - gfx->set_source_clip(0, 32, 0, 32); - - zdrawgfxzoom( - screen, - bitmap, - cliprect, - gfx, - sprn, - color, - flipx,flipy, - xpos,ypos, - scalex,scaley, - loop ); - } - } - } - } -} /* namcos2_draw_sprites */ - -void namcos2_state::draw_sprites_metalhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) -{ - /** - * word#0 - * xxxxxx---------- ysize - * ------x--------- sprite tile size - * -------xxxxxxxxx screeny - * - * word#1 - * --x------------- bank - * ----xxxxxxxxxxxx tile - * - * word#2 (unused) - * - * word#3 - * xxxxxx---------- xsize - * ------xxxxxxxxxx screenx - * - * word#4 (unused) - * word#5 (unused) - * - * word#6 (orientation) - * ---------------x rot90 - * --------------x- flipx - * -------------x-- flipy - * ------------x--- tile size - * - * word#7 - * ------------xxxx priority - * --------xxxx---- color - * x--------------- unknown - */ - const uint16_t *pSource = m_spriteram; - int loop; - if( pri==0 ) - { - screen.priority().fill(0, cliprect ); - } - for( loop=0; loop < 128; loop++ ) - { - int ypos = pSource[0]; - int tile = pSource[1]; - int xpos = pSource[3]; - int flags = pSource[6]; - int attrs = pSource[7]; - int sizey = ((ypos>>10)&0x3f)+1; - int sizex = (xpos>>10)&0x3f; - int sprn = (tile>>2)&0x7ff; - - if( tile&0x2000 ) - { - sprn&=0x3ff; - } - else - { - sprn|=0x400; - } - - if( (sizey-1) && sizex && (attrs&0xf)==pri ) - { - int bBigSprite = (flags&8); - int color = (attrs>>4)&0xf; - int sx = (xpos&0x03ff)-0x50+0x07; - int sy = (0x1ff-(ypos&0x01ff))-0x50+0x02; - int flipx = flags&2; - int flipy = flags&4; - int scalex = (sizex<<16)/(0x20);//(sizex<<16)/(bBigSprite?0x20:0x10); correct formula? - int scaley = (sizey<<16)/(bBigSprite?0x20:0x10); - - /* swap xy */ - int rgn = (flags&0x01) ? 3 : 0; - - gfx_element *gfx = m_gfxdecode->gfx(rgn); - - if( bBigSprite ) - { - if( sizex < 0x20 ) - { - sx -= (0x20-sizex)/0x8; - } - if( sizey < 0x20 ) - { - sy += (0x20-sizey)/0xC; - } - gfx->set_source_clip(0, 32, 0, 32); - } - else - gfx->set_source_clip((tile&0x0001) ? 16 : 0, 16, (tile&0x0002) ? 16 : 0, 16); - - zdrawgfxzoom( - screen, - bitmap, - cliprect, - gfx, - sprn, color, - flipx,flipy, - sx,sy, - scalex, scaley, - loop ); - } - pSource += 8; - } -} /* namcos2_draw_sprites_metalhawk */ - -/**************************************************************************************/ - -WRITE16_MEMBER( namcos2_shared_state::c355_obj_position_w ) -{ - COMBINE_DATA(&m_c355_obj_position[offset]); -} -READ16_MEMBER( namcos2_shared_state::c355_obj_position_r ) -{ - return m_c355_obj_position[offset]; -} - -/**************************************************************************************************************/ - -/** - * 0x00000 sprite attr (page0) - * 0x02000 sprite list (page0) - * - * 0x02400 window attributes - * 0x04000 format - * 0x08000 tile - * 0x10000 sprite attr (page1) - * 0x14000 sprite list (page1) - */ -template<class _BitmapClass> -void namcos2_shared_state::c355_obj_draw_sprite(screen_device &screen, _BitmapClass &bitmap, const rectangle &cliprect, const uint16_t *pSource, int pri, int zpos ) -{ - uint16_t *spriteram16 = m_c355_obj_ram; - unsigned screen_height_remaining, screen_width_remaining; - unsigned source_height_remaining, source_width_remaining; - int hpos,vpos; - uint16_t hsize,vsize; - uint16_t palette; - uint16_t linkno; - uint16_t offset; - uint16_t format; - int tile_index; - int num_cols,num_rows; - int dx,dy; - int row,col; - int sx,sy,tile; - int flipx,flipy; - uint32_t zoomx, zoomy; - int tile_screen_width; - int tile_screen_height; - const uint16_t *spriteformat16 = &spriteram16[0x4000/2]; - const uint16_t *spritetile16 = &spriteram16[0x8000/2]; - int color; - const uint16_t *pWinAttr; - rectangle clip; - int xscroll, yscroll; - - /** - * ----xxxx-------- window select - * --------xxxx---- priority - * ------------xxxx palette select - */ - palette = pSource[6]; - if( pri != ((palette>>4)&0xf) ) - { - return; - } - - linkno = pSource[0]; /* LINKNO */ - offset = pSource[1]; /* OFFSET */ - hpos = pSource[2]; /* HPOS 0x000..0x7ff (signed) */ - vpos = pSource[3]; /* VPOS 0x000..0x7ff (signed) */ - hsize = pSource[4]; /* HSIZE max 0x3ff pixels */ - vsize = pSource[5]; /* VSIZE max 0x3ff pixels */ - /* pSource[6] contains priority/palette */ - /* pSource[7] is used in Lucky & Wild, possibly for sprite-road priority */ - - if( linkno*4>=0x4000/2 ) return; /* avoid garbage memory reads */ - - xscroll = (int16_t)m_c355_obj_position[1]; - yscroll = (int16_t)m_c355_obj_position[0]; - -// xscroll &= 0x3ff; if( xscroll & 0x200 ) xscroll |= ~0x3ff; - xscroll &= 0x1ff; if( xscroll & 0x100 ) xscroll |= ~0x1ff; - yscroll &= 0x1ff; if( yscroll & 0x100 ) yscroll |= ~0x1ff; - - if( bitmap.width() > 384 ) - { /* Medium Resolution: System21 adjust */ - xscroll = (int16_t)m_c355_obj_position[1]; - xscroll &= 0x3ff; if( xscroll & 0x200 ) xscroll |= ~0x3ff; - if( yscroll<0 ) - { /* solvalou */ - yscroll += 0x20; - } - yscroll += 0x10; - } - else - { - if ((m_gametype == NAMCOFL_SPEED_RACER) || (m_gametype == NAMCOFL_FINAL_LAP_R)) - { /* Namco FL: don't adjust and things line up fine */ - } - else - { /* Namco NB1, Namco System 2 */ - xscroll += 0x26; - yscroll += 0x19; - } - } - - hpos -= xscroll; - vpos -= yscroll; - pWinAttr = &spriteram16[0x2400/2+((palette>>8)&0xf)*4]; - clip.set(pWinAttr[0] - xscroll, pWinAttr[1] - xscroll, pWinAttr[2] - yscroll, pWinAttr[3] - yscroll); - clip &= cliprect; - hpos&=0x7ff; if( hpos&0x400 ) hpos |= ~0x7ff; /* sign extend */ - vpos&=0x7ff; if( vpos&0x400 ) vpos |= ~0x7ff; /* sign extend */ - - tile_index = spriteformat16[linkno*4+0]; - format = spriteformat16[linkno*4+1]; - dx = spriteformat16[linkno*4+2]; - dy = spriteformat16[linkno*4+3]; - num_cols = (format>>4)&0xf; - num_rows = (format)&0xf; - - if( num_cols == 0 ) num_cols = 0x10; - flipx = (hsize&0x8000)?1:0; - hsize &= 0x3ff;//0x1ff; - if( hsize == 0 ) return; - zoomx = (hsize<<16)/(num_cols*16); - dx = (dx*zoomx+0x8000)>>16; - if( flipx ) - { - hpos += dx; - } - else - { - hpos -= dx; - } - - if( num_rows == 0 ) num_rows = 0x10; - flipy = (vsize&0x8000)?1:0; - vsize &= 0x3ff; - if( vsize == 0 ) return; - zoomy = (vsize<<16)/(num_rows*16); - dy = (dy*zoomy+0x8000)>>16; - if( flipy ) - { - vpos += dy; - } - else - { - vpos -= dy; - } - - color = (palette&0xf)^m_c355_obj_palxor; - - source_height_remaining = num_rows*16; - screen_height_remaining = vsize; - sy = vpos; - for( row=0; row<num_rows; row++ ) - { - tile_screen_height = 16*screen_height_remaining/source_height_remaining; - zoomy = (screen_height_remaining<<16)/source_height_remaining; - if( flipy ) - { - sy -= tile_screen_height; - } - source_width_remaining = num_cols*16; - screen_width_remaining = hsize; - sx = hpos; - for( col=0; col<num_cols; col++ ) - { - tile_screen_width = 16*screen_width_remaining/source_width_remaining; - zoomx = (screen_width_remaining<<16)/source_width_remaining; - if( flipx ) - { - sx -= tile_screen_width; - } - tile = spritetile16[tile_index++]; - if( (tile&0x8000)==0 ) - { - zdrawgfxzoom( - screen, - bitmap, - clip, - m_gfxdecode->gfx(m_c355_obj_gfxbank), - m_c355_obj_code2tile(tile) + offset, - color, - flipx,flipy, - sx,sy, - zoomx, zoomy, zpos ); - } - if( !flipx ) - { - sx += tile_screen_width; - } - screen_width_remaining -= tile_screen_width; - source_width_remaining -= 16; - } /* next col */ - if( !flipy ) - { - sy += tile_screen_height; - } - screen_height_remaining -= tile_screen_height; - source_height_remaining -= 16; - } /* next row */ -} - - -int namcos2_shared_state::c355_obj_default_code2tile(int code) -{ - return code; -} - -void namcos2_shared_state::c355_obj_init(int gfxbank, int pal_xor, c355_obj_code2tile_delegate code2tile) -{ - m_c355_obj_gfxbank = gfxbank; - m_c355_obj_palxor = pal_xor; - if (!code2tile.isnull()) - m_c355_obj_code2tile = code2tile; - else - m_c355_obj_code2tile = c355_obj_code2tile_delegate(&namcos2_shared_state::c355_obj_default_code2tile, this); - - memset(m_c355_obj_ram, 0, sizeof(m_c355_obj_ram)); // needed for Nebulas Ray - memset(m_c355_obj_position, 0, sizeof(m_c355_obj_position)); - - save_item(NAME(m_c355_obj_position)); - save_item(NAME(m_c355_obj_ram)); - save_item(NAME(m_player_mux)); -} - -template<class _BitmapClass> -void namcos2_shared_state::c355_obj_draw_list(screen_device &screen, _BitmapClass &bitmap, const rectangle &cliprect, int pri, const uint16_t *pSpriteList16, const uint16_t *pSpriteTable) -{ - int i; - /* draw the sprites */ - for( i=0; i<256; i++ ) - { - uint16_t which = pSpriteList16[i]; - c355_obj_draw_sprite(screen, bitmap, cliprect, &pSpriteTable[(which&0xff)*8], pri, i ); - if( which&0x100 ) break; - } -} - -void namcos2_shared_state::c355_obj_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) -{ -// int offs = spriteram16[0x18000/2]; /* end-of-sprite-list */ - if (pri == 0) - screen.priority().fill(0, cliprect); - -// if (offs == 0) // boot - // TODO: solvalou service mode wants 0x14000/2 & 0x00000/2 - c355_obj_draw_list(screen, bitmap, cliprect, pri, &m_c355_obj_ram[0x02000/2], &m_c355_obj_ram[0x00000/2]); -// else - c355_obj_draw_list(screen, bitmap, cliprect, pri, &m_c355_obj_ram[0x14000/2], &m_c355_obj_ram[0x10000/2]); -} - -void namcos2_shared_state::c355_obj_draw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri) -{ -// int offs = spriteram16[0x18000/2]; /* end-of-sprite-list */ - if (pri == 0) - screen.priority().fill(0, cliprect); - -// if (offs == 0) // boot - c355_obj_draw_list(screen, bitmap, cliprect, pri, &m_c355_obj_ram[0x02000/2], &m_c355_obj_ram[0x00000/2]); -// else - c355_obj_draw_list(screen, bitmap, cliprect, pri, &m_c355_obj_ram[0x14000/2], &m_c355_obj_ram[0x10000/2]); -} - -WRITE16_MEMBER( namcos2_shared_state::c355_obj_ram_w ) -{ - COMBINE_DATA(&m_c355_obj_ram[offset]); -} - -READ16_MEMBER( namcos2_shared_state::c355_obj_ram_r ) -{ - return m_c355_obj_ram[offset]; -} - -/**************************************************************************************************************/ - -/** - * Advanced rotate-zoom chip manages two layers. - * Each layer uses a designated subset of a master 256x256 tile tilemap (4096x4096 pixels). - * Each layer has configurable color and tile banking. - * ROZ attributes may be specified independently for each scanline. - * - * Used by: - * Namco NB2 - The Outfoxies, Mach Breakers - * Namco System 2 - Metal Hawk, Lucky and Wild - * Namco System FL - Final Lap R, Speed Racer - */ - -/** - * Graphics ROM addressing varies across games. - */ -template<int Which> -TILE_GET_INFO_MEMBER( namcos2_shared_state::c169_roz_get_info ) -{ - int tile, mask; - m_c169_cb( m_c169_roz_videoram[tile_index] & 0x3fff, &tile, &mask, Which ); - tileinfo.mask_data = m_c169_roz_mask + 32*mask; - SET_TILE_INFO_MEMBER(m_c169_roz_gfxbank, tile, 0/*color*/, 0/*flag*/); -} - -TILEMAP_MAPPER_MEMBER( namcos2_shared_state::c169_roz_mapper ) -{ - return ((col & 0x80) << 8) | ((row & 0xff) << 7) | (col & 0x7f); -} - -void namcos2_shared_state::c169_roz_init(int gfxbank, const char *maskregion, c169_tilemap_delegate tilemap_cb) -{ - m_c169_roz_gfxbank = gfxbank; - m_c169_roz_mask = memregion(maskregion)->base(); - m_c169_cb = tilemap_cb; - - m_c169_roz_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, - tilemap_get_info_delegate(FUNC(namcos2_shared_state::c169_roz_get_info<0>), this), - tilemap_mapper_delegate(FUNC(namcos2_shared_state::c169_roz_mapper), this), - 16,16, - 256,256); - - m_c169_roz_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, - tilemap_get_info_delegate(FUNC(namcos2_shared_state::c169_roz_get_info<1>), this), - tilemap_mapper_delegate(FUNC(namcos2_shared_state::c169_roz_mapper), this), - 16,16, - 256,256); - - save_item(NAME(m_c169_roz_control)); -} - -void namcos2_shared_state::c169_roz_unpack_params(const uint16_t *source, roz_parameters ¶ms) -{ - const int xoffset = 36, yoffset = 3; - - /** - * x-------.-------- disable layer - * ----x---.-------- wrap? - * ------xx.-------- size - * --------.xxxx---- priority - * --------.----xxxx color - */ - - uint16_t temp = source[1]; - params.wrap = BIT(~temp, 11); - params.size = 512 << ((temp & 0x0300) >> 8); - if (m_gametype == NAMCOFL_SPEED_RACER || m_gametype == NAMCOFL_FINAL_LAP_R) - params.color = (temp & 0x0007) * 256; - else - params.color = (temp & 0x000f) * 256; - params.priority = (temp & 0x00f0) >> 4; - - temp = source[2]; - params.left = (temp & 0x7000) >> 3; - if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend - params.incxx = int16_t(temp); - - temp = source[3]; - params.top = (temp&0x7000)>>3; - if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend - params.incxy = int16_t(temp); - - temp = source[4]; - if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend - params.incyx = int16_t(temp); - - temp = source[5]; - if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend - params.incyy = int16_t(temp); - - params.startx = int16_t(source[6]); - params.starty = int16_t(source[7]); - params.startx <<= 4; - params.starty <<= 4; - - params.startx += xoffset * params.incxx + yoffset * params.incyx; - params.starty += xoffset * params.incxy + yoffset * params.incyy; - - // normalize - params.startx <<= 8; - params.starty <<= 8; - params.incxx <<= 8; - params.incxy <<= 8; - params.incyx <<= 8; - params.incyy <<= 8; -} - -void namcos2_shared_state::c169_roz_draw_helper(screen_device &screen, bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters ¶ms) -{ - if (m_gametype != NAMCOFL_SPEED_RACER && m_gametype != NAMCOFL_FINAL_LAP_R) -// if (m_gametype != NAMCOFL_FINAL_LAP_R) // Fix speedrcr some title animations, but broke at road scene - { - uint32_t size_mask = params.size - 1; - bitmap_ind16 &srcbitmap = tmap.pixmap(); - bitmap_ind8 &flagsbitmap = tmap.flagsmap(); - uint32_t startx = params.startx + clip.min_x * params.incxx + clip.min_y * params.incyx; - uint32_t starty = params.starty + clip.min_x * params.incxy + clip.min_y * params.incyy; - int sx = clip.min_x; - int sy = clip.min_y; - while (sy <= clip.max_y) - { - int x = sx; - uint32_t cx = startx; - uint32_t cy = starty; - uint16_t *dest = &bitmap.pix(sy, sx); - while (x <= clip.max_x) - { // TODO : Wraparound disable isn't implemented - uint32_t xpos = (((cx >> 16) & size_mask) + params.left) & 0xfff; - uint32_t ypos = (((cy >> 16) & size_mask) + params.top) & 0xfff; - if (flagsbitmap.pix(ypos, xpos) & TILEMAP_PIXEL_LAYER0) - *dest = srcbitmap.pix(ypos, xpos) + params.color; - cx += params.incxx; - cy += params.incxy; - x++; - dest++; - } - startx += params.incyx; - starty += params.incyy; - sy++; - } - } - else - { - tmap.set_palette_offset(params.color); - tmap.draw_roz( - screen, - bitmap, - clip, - params.startx, params.starty, - params.incxx, params.incxy, - params.incyx, params.incyy, - params.wrap,0,0); // wrap, flags, pri - } -} - -void namcos2_shared_state::c169_roz_draw_scanline(screen_device &screen, bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect) -{ - if (line >= cliprect.min_y && line <= cliprect.max_y) - { - int row = line / 8; - int offs = row * 0x100 + (line & 7) * 0x10 + 0xe080; - uint16_t *source = &m_c169_roz_videoram[offs / 2]; - - // if enabled - if ((source[1] & 0x8000) == 0) - { - roz_parameters params; - c169_roz_unpack_params(source, params); - - // check priority - if (pri == params.priority) - { - rectangle clip(0, bitmap.width() - 1, line, line); - clip &= cliprect; - c169_roz_draw_helper(screen, bitmap, *m_c169_roz_tilemap[which], clip, params); - } - } - } -} - -void namcos2_shared_state::c169_roz_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) -{ - int special = (m_gametype == NAMCOFL_SPEED_RACER || m_gametype == NAMCOFL_FINAL_LAP_R) ? 0 : 1; - int mode = m_c169_roz_control[0]; // 0x8000 or 0x1000 - - for (int which = 1; which >= 0; which--) - { - const uint16_t *source = &m_c169_roz_control[which * 8]; - uint16_t attrs = source[1]; - - // if enabled - if ((attrs & 0x8000) == 0) - { - // second ROZ layer is configured to use per-scanline registers - if (which == special && mode == 0x8000) - { - for (int line = cliprect.min_y; line <= cliprect.max_y; line++) - c169_roz_draw_scanline(screen, bitmap, line, which, pri, cliprect); - } - else - { - roz_parameters params; - c169_roz_unpack_params(source, params); - if (params.priority == pri) - c169_roz_draw_helper(screen, bitmap, *m_c169_roz_tilemap[which], cliprect, params); - } - } - } -} - -READ16_MEMBER( namcos2_shared_state::c169_roz_control_r ) -{ - return m_c169_roz_control[offset]; -} - -WRITE16_MEMBER( namcos2_shared_state::c169_roz_control_w ) -{ - COMBINE_DATA(&m_c169_roz_control[offset]); -} - -READ16_MEMBER( namcos2_shared_state::c169_roz_videoram_r ) -{ - return m_c169_roz_videoram[offset]; -} - -WRITE16_MEMBER( namcos2_shared_state::c169_roz_videoram_w ) -{ - COMBINE_DATA(&m_c169_roz_videoram[offset]); - for (auto & elem : m_c169_roz_tilemap) - elem->mark_tile_dirty(offset); -} diff --git a/src/mame/machine/namcoic.h b/src/mame/machine/namcoic.h deleted file mode 100644 index 8d69e541eef..00000000000 --- a/src/mame/machine/namcoic.h +++ /dev/null @@ -1,102 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Phil Stroffolino -/* namcoic.h - -Custom Chips: Final Lap Assault LuckyWld System21 NA1/2 NB1/2 - C45 Land Generator * * - C65 I/O Controller * * - C68 * * - C70 * - C95 * * - C102 ROZ:Memory Access Control * - C106 OBJ:X-Axis Zoom Control * * - C107 Land Line Buffer * - C116 Screen Waveform Generator * * * * - C121 Yamaha YM2151 Sound Gen * * * - C123 GFX:Tile Mem Decoder * * * * - C134 OBJ:Address Generator * * - C135 OBJ:Line matching * * - C137 Clock Generator IC * * * * * - C138 * - C139 Serial I/F Controller * * * * - C140 24 Channel PCM * * * - C145 GFX:Tile Memory Access * * * * - C146 OBJ:Line Buf Steering * * - C148 CPU Bus Manager * * * * - C149 Mouse/Trackball Decoder * * * * - C156 Pixel Stream Combo * * * * - C160 Control * - C165 * - C169 ROZ(B) * * - C187 * * * - C210 * - C215 * - C218 * - C219 * - C329 CPU? * - C347 GfxObj * - C352 PCM * - C355 Motion Obj(B) * * * - C373 LAND-related * - C382 * - C383 * - C384 GFX(3) * - C385 * - C390 Key Custom * - - -General Support ---------------- -C65 - This is the I/O Microcontroller, handles all input/output devices. 63705 uC, CPU4 in Namco System2. -C137 - Takes System clock and generates all sub-system clocks, doesn't need emulation, not accessed via CPU -C139 - Serial Interface Controller -C148 - Does some Memory Decode, Interrupt Handling, 3 bit PIO port, Bus Controller -C149 - Does decoding of mouse/trackball input streams for the I/O Controller. (Offset Square wave) - - -Tile Fields Static/Scrolled ---------------------------- -Combination of these two devices and associated RAM & TileGFX produces a pixel stream that is fed -into the Pixel stream decoder. - -C145 - Tile Screen Memory Access controller -C123 - Tile Memory decoder Part 1, converts X,Y,Tile into character ROM address index - - -Pixel Stream Decode -------------------- -These two devices take the pixel streams from the tilefield generator and the associated graphics board -and combine them to form an RGB data stream that is fed to the monitor. - -C156 - Pixel stream combiner -Takes tile field & graphics board streams and generates the prioritized pixel, then does the lookup to -go from palettised to 24bit RGB pixel. - -C116 - Screen Waveform Generator -Takes RGB24 pixel stream from C156 and generates the waveform signals for the monitor, also generates -the line interrupt and controls screen blanking,shift, etc. - -Object Control --------------- -C106 - Generates memory output clocks to generate X-Axis Zoom for Line Buffer Writes -C134 - Object Memory Address Generator. Sequences the sprite memory contents to the hardware. -C135 - Checks is object is displayed on Current output line. -C146 - Steers the Decode Object Pixel data to the correct line buffer A or B - -ROZ ---- -C102 - Controls CPU access to ROZ Memory Area. -*/ - -/***********************************************************************************/ - -#ifndef MAME_MACHINE_NAMCOIC_H -#define MAME_MACHINE_NAMCOIC_H - -#pragma once - - - -/***********************************************************************************/ - -#endif // MAME_MACHINE_NAMCOIC_H diff --git a/src/mame/machine/namcos1.cpp b/src/mame/machine/namcos1.cpp index db1111b8ec8..627e2a8222c 100644 --- a/src/mame/machine/namcos1.cpp +++ b/src/mame/machine/namcos1.cpp @@ -455,7 +455,8 @@ READ8_MEMBER( namcos1_state::key_type3_r ) if (op == m_key_bottom4) return (offset << 4) | (m_key[m_key_swap4_arg] & 0x0f); if (op == m_key_top4) return (offset << 4) | (m_key[m_key_swap4_arg] >> 4); - popmessage("%s: keychip read %04x", machine().describe_context(), offset); + // rompers triggers this between certain stages, check if values are used, it might still need the above mapping properly in the game init + logerror("%s: unhandled keychip read %04x", machine().describe_context(), offset); return 0; } diff --git a/src/mame/machine/namcos2.cpp b/src/mame/machine/namcos2.cpp index e743a344eb4..d2dea28aac2 100644 --- a/src/mame/machine/namcos2.cpp +++ b/src/mame/machine/namcos2.cpp @@ -18,7 +18,6 @@ Namco System II #include "machine/nvram.h" -void (*namcos2_kickstart)(running_machine &machine, int internal); READ16_MEMBER( namcos2_state::namcos2_finallap_prot_r ) @@ -69,51 +68,45 @@ READ16_MEMBER( namcos2_state::namcos2_finallap_prot_r ) /* Perform basic machine initialisation */ /*************************************************************/ -#define m_eeprom_size 0x2000 -WRITE8_MEMBER(namcos2_shared_state::sound_reset_w) +// S2 copy + +MACHINE_START_MEMBER(namcos2_state,namcos2) { - if (data & 0x01) - { - /* Resume execution */ - m_audiocpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); - m_maincpu->yield(); - } - else - { - /* Suspend execution */ - m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - } + m_eeprom = std::make_unique<uint8_t[]>(0x2000); + subdevice<nvram_device>("nvram")->set_base(m_eeprom.get(), 0x2000); - if (namcos2_kickstart != nullptr) + if (m_audiobank) { - //printf( "dspkick=0x%x\n", data ); - if (data & 0x04) - { - (*namcos2_kickstart)(machine(), 1); - } + uint32_t max = memregion("audiocpu")->bytes() / 0x4000; + for (int i = 0; i < 0x10; i++) + m_audiobank->configure_entry(i, memregion("audiocpu")->base() + (i % max) * 0x4000); + + m_audiobank->set_entry(0); } } -// TODO: -WRITE8_MEMBER(namcos2_shared_state::system_reset_w) +MACHINE_RESET_MEMBER(namcos2_state, namcos2) { - reset_all_subcpus(data & 1 ? CLEAR_LINE : ASSERT_LINE); +// address_space &space = m_maincpu->space(AS_PROGRAM); + address_space &audio_space = m_audiocpu->space(AS_PROGRAM); - if (data & 0x01) - m_maincpu->yield(); + /* Initialise the bank select in the sound CPU */ + namcos2_sound_bankselect_w(audio_space, 0, 0); /* Page in bank 0 */ + + m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE ); + + /* Place CPU2 & CPU3 into the reset condition */ + reset_all_subcpus(ASSERT_LINE); } -void namcos2_shared_state::reset_all_subcpus(int state) + +void namcos2_state::reset_all_subcpus(int state) { m_slave->set_input_line(INPUT_LINE_RESET, state); - if (m_c68new) - { - m_c68new->ext_reset(state); - } - else if (m_mcu) + if (m_c68) { - m_mcu->set_input_line(INPUT_LINE_RESET, state); + m_c68->ext_reset(state); } else if (m_c65) { @@ -123,57 +116,41 @@ void namcos2_shared_state::reset_all_subcpus(int state) { logerror("no MCU to reset?\n"); } - - switch( m_gametype ) - { - case NAMCOS21_SOLVALOU: - case NAMCOS21_STARBLADE: - case NAMCOS21_AIRCOMBAT: - case NAMCOS21_CYBERSLED: - m_dspmaster->set_input_line(INPUT_LINE_RESET, state); - m_dspslave->set_input_line(INPUT_LINE_RESET, state); - break; - -// case NAMCOS21_WINRUN91: -// case NAMCOS21_DRIVERS_EYES: - default: - break; - } } -MACHINE_START_MEMBER(namcos2_shared_state,namcos2) +WRITE8_MEMBER(namcos2_state::sound_reset_w) { - namcos2_kickstart = nullptr; - m_eeprom = std::make_unique<uint8_t[]>(m_eeprom_size); - subdevice<nvram_device>("nvram")->set_base(m_eeprom.get(), m_eeprom_size); + if (data & 0x01) + { + /* Resume execution */ + m_audiocpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + m_maincpu->yield(); + } + else + { + /* Suspend execution */ + m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + } } -MACHINE_RESET_MEMBER(namcos2_shared_state, namcos2) +WRITE8_MEMBER(namcos2_state::system_reset_w) { -// address_space &space = m_maincpu->space(AS_PROGRAM); - address_space &audio_space = m_audiocpu->space(AS_PROGRAM); - - /* Initialise the bank select in the sound CPU */ - namcos2_sound_bankselect_w(audio_space, 0, 0); /* Page in bank 0 */ - - m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE ); - - /* Place CPU2 & CPU3 into the reset condition */ - reset_all_subcpus(ASSERT_LINE); + reset_all_subcpus(data & 1 ? CLEAR_LINE : ASSERT_LINE); - m_player_mux = 0; + if (data & 0x01) + m_maincpu->yield(); } /*************************************************************/ /* EEPROM Load/Save and read/write handling */ /*************************************************************/ -WRITE8_MEMBER( namcos2_shared_state::namcos2_68k_eeprom_w ) +WRITE8_MEMBER( namcos2_state::namcos2_68k_eeprom_w ) { m_eeprom[offset] = data; } -READ8_MEMBER( namcos2_shared_state::namcos2_68k_eeprom_r ) +READ8_MEMBER( namcos2_state::namcos2_68k_eeprom_r ) { return m_eeprom[offset]; } @@ -415,31 +392,12 @@ WRITE16_MEMBER( namcos2_state::namcos2_68k_key_w ) #define LINE_LENGTH (FRAME_TIME/NO_OF_LINES) -bool namcos2_shared_state::is_system21() -{ - switch (m_gametype) - { - case NAMCOS21_AIRCOMBAT: - case NAMCOS21_STARBLADE: - case NAMCOS21_CYBERSLED: - case NAMCOS21_SOLVALOU: - case NAMCOS21_WINRUN91: - case NAMCOS21_DRIVERS_EYES: - return 1; - default: - return 0; - } -} - /**************************************************************/ /* Sound sub-system */ /**************************************************************/ -WRITE8_MEMBER( namcos2_shared_state::namcos2_sound_bankselect_w ) +WRITE8_MEMBER( namcos2_state::namcos2_sound_bankselect_w ) { - uint8_t *RAM= memregion("audiocpu")->base(); - uint32_t max = (memregion("audiocpu")->bytes() - 0x10000) / 0x4000; - int bank = ( data >> 4 ) % max; /* 991104.CAB */ - membank(BANKED_SOUND_ROM)->set_base(&RAM[ 0x10000 + ( 0x4000 * bank ) ] ); + m_audiobank->set_entry(data>>4); } diff --git a/src/mame/machine/pcshare.cpp b/src/mame/machine/pcshare.cpp index f75738b1649..0cedba2dd03 100644 --- a/src/mame/machine/pcshare.cpp +++ b/src/mame/machine/pcshare.cpp @@ -217,7 +217,7 @@ void pcat_base_state::pcat_common(machine_config &config) m_pit8254->out_handler<2>().set(FUNC(pcat_base_state::at_pit8254_out2_changed)); MC146818(config, m_mc146818, 32.768_kHz_XTAL); - m_mc146818->irq_callback().set(m_pic8259_2, FUNC(pic8259_device::ir0_w)); + m_mc146818->irq().set(m_pic8259_2, FUNC(pic8259_device::ir0_w)); m_mc146818->set_century_index(0x32); KBDC8042(config, m_kbdc, 0); diff --git a/src/mame/mame.lst b/src/mame/mame.lst index c00dd58fb92..1bd1ed68c0c 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -301,7 +301,10 @@ ac1_32 // 1984 Amateurcomputer AC1 (32 lines) ac1scch // 1984 Amateurcomputer AC1 SCCH @source:accomm.cpp -accomm // 1986 Acorn Computer +accomm // 1986 Acorn Commmunicator +accommp // 1985 Acorn Commmunicator (prototype) +accommb // 1987 Acorn Briefcase Communicator +accommi // 1988 Acorn Communicator (Italian) @source:acd.cpp acd // @@ -12298,6 +12301,7 @@ avenger // (c) 1975 Electra @source:electron.cpp electron // 1983 Acorn Electron +electront // 1983 Acorn Electron (Trial) btm2105 // 1985 BT Merlin M2105 electron64 // 1987 Acorn Electron (64K Master RAM Board) @@ -15500,9 +15504,6 @@ stellecu // (c) 1998 farmer // TVG17 (c) 1985 Sun Electronics ikki // TVG17 (c) 1985 Sun Electronics (Japan) -@source:imds.cpp -imds // intel - @source:imds2.cpp imds2 // Intellec MDS series-II @@ -21470,7 +21471,8 @@ mkit09 // mkit09a // @source:mlanding.cpp -mlanding // ??? (c) 1987 Taito America Corporation (US) +mlanding // B09 (c) 1987 Taito America Corporation (US) +mlandingj // B09 (c) 1987 Taito Corporation (US) @source:mmagic.cpp mmagic // (c) 1979 Nintendo @@ -29135,6 +29137,7 @@ finallapjb // 87.12 Final Lap finallapjc // 87.12 Final Lap finehour // (c) 1989 (Japan) fourtrax // 89.11 +fourtraxj // 89.11 fourtraxa // 89.11 gollygho // 91.7 Golly Ghost kyukaidk // (c) 1990 (Japan, new version) @@ -33306,6 +33309,7 @@ bbnny_l2 // bbnny_lu // dd_l2 // dd_p6 // +diner_f2 // diner_l1 // diner_l2 // diner_l3 // @@ -38210,6 +38214,9 @@ victory // (c) 1982 @source:vidbrain.cpp vidbrain // +@source:videolich.cpp +videolich // Videogames gmbh (unnamed) + @source:videopin.cpp solarwar // 036154-036169 1979 [6502] videopin // 034253-034267 1979/02 [6502] diff --git a/src/mame/mess.flt b/src/mame/mess.flt index c241eb2c897..294c7830685 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -308,7 +308,6 @@ icatel.cpp icebox.cpp ie15.cpp if800.cpp -imds.cpp imds2.cpp imsai.cpp indiana.cpp diff --git a/src/mame/video/deco16ic.h b/src/mame/video/deco16ic.h index 3ecd5f53f33..dd03e162cfc 100644 --- a/src/mame/video/deco16ic.h +++ b/src/mame/video/deco16ic.h @@ -35,8 +35,8 @@ public: // configuration void set_gfxdecode_tag(const char *tag) { m_gfxdecode.set_tag(tag); } // void set_palette_tag(const char *tag); - template <typename Object> void set_bank1_callback(Object &&cb) { m_bank1_cb = std::forward<Object>(cb); } - template <typename Object> void set_bank2_callback(Object &&cb) { m_bank2_cb = std::forward<Object>(cb); } + template <typename... T> void set_bank1_callback(T &&... args) { m_bank1_cb = deco16_bank_cb_delegate(std::forward<T>(args)...); } + template <typename... T> void set_bank2_callback(T &&... args) { m_bank2_cb = deco16_bank_cb_delegate(std::forward<T>(args)...); } void set_split(int split) { m_split = split; } void set_pf1_size(int size) { m_pf1_size = size; } void set_pf2_size(int size) { m_pf2_size = size; } @@ -173,10 +173,10 @@ DECLARE_DEVICE_TYPE(DECO16IC, deco16ic_device) #define MCFG_DECO16IC_SET_SCREEN MCFG_VIDEO_SET_SCREEN #define MCFG_DECO16IC_BANK1_CB(_class, _method) \ - downcast<deco16ic_device &>(*device).set_bank1_callback(deco16_bank_cb_delegate(&_class::_method, #_class "::" #_method, this)); + downcast<deco16ic_device &>(*device).set_bank1_callback(&_class::_method, #_class "::" #_method, this); #define MCFG_DECO16IC_BANK2_CB(_class, _method) \ - downcast<deco16ic_device &>(*device).set_bank2_callback(deco16_bank_cb_delegate(&_class::_method, #_class "::" #_method, this)); + downcast<deco16ic_device &>(*device).set_bank2_callback(&_class::_method, #_class "::" #_method, this); #define MCFG_DECO16IC_SPLIT(_split) \ downcast<deco16ic_device &>(*device).set_split(_split); diff --git a/src/mame/video/namco_c123tmap.cpp b/src/mame/video/namco_c123tmap.cpp new file mode 100644 index 00000000000..cf635c5cb16 --- /dev/null +++ b/src/mame/video/namco_c123tmap.cpp @@ -0,0 +1,185 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood, Phil Stroffolino + +/* + C123 Tilemaps + used by + namcos2.cpp (all games) + namcofl.cpp (all games) + namconb1.cpp (all games) + + should be used by + namcos1.cpp (all games) + + (TODO: merge with namcos1.cpp implementation) +*/ + +#include "emu.h" +#include "namco_c123tmap.h" + +DEFINE_DEVICE_TYPE(NAMCO_C123TMAP, namco_c123tmap_device, "namco_c123tmap", "Namco C123 (4x + 2x Tilemaps)") + +namco_c123tmap_device::namco_c123tmap_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, NAMCO_C123TMAP, tag, owner, clock), + m_gfxdecode(*this, finder_base::DUMMY_TAG), + m_maskregion(*this, finder_base::DUMMY_TAG) +{ +} + +void namco_c123tmap_device::device_start() +{ + m_tilemapinfo.maskBaseAddr = m_maskregion->base(); + + m_tilemapinfo.videoram = std::make_unique<uint16_t[]>(0x10000); + + /* four scrolling tilemaps */ + m_tilemapinfo.tmap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namco_c123tmap_device::get_tile_info<0x0000>), this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); + m_tilemapinfo.tmap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namco_c123tmap_device::get_tile_info<0x1000>), this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); + m_tilemapinfo.tmap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namco_c123tmap_device::get_tile_info<0x2000>), this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); + m_tilemapinfo.tmap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namco_c123tmap_device::get_tile_info<0x3000>), this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); + + /* two non-scrolling tilemaps */ + m_tilemapinfo.tmap[4] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namco_c123tmap_device::get_tile_info<0x4008>), this), TILEMAP_SCAN_ROWS, 8, 8, 36, 28); + m_tilemapinfo.tmap[5] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namco_c123tmap_device::get_tile_info<0x4408>), this), TILEMAP_SCAN_ROWS, 8, 8, 36, 28); + + /* define offsets for scrolling */ + for (int i = 0; i < 4; i++) + { + static const int adj[4] = { 4,2,1,0 }; + int dx = 44 + adj[i]; + m_tilemapinfo.tmap[i]->set_scrolldx(-dx, 288 + dx); + m_tilemapinfo.tmap[i]->set_scrolldy(-24, 224 + 24); + } + + + save_item(NAME(m_tilemapinfo.control)); + save_pointer(NAME(m_tilemapinfo.videoram), 0x10000); +} + +/**************************************************************************************/ + +void namco_c123tmap_device::mark_all_dirty(void) +{ + for (int i = 0; i < 6; i++) + { + m_tilemapinfo.tmap[i]->mark_all_dirty(); + } +} /* namco_tilemap_invalidate */ + +template<int Offset> +TILE_GET_INFO_MEMBER(namco_c123tmap_device::get_tile_info) +{ + const uint16_t *vram = &m_tilemapinfo.videoram[Offset]; + int tile, mask; + m_tilemapinfo.cb(vram[tile_index], &tile, &mask); + tileinfo.mask_data = m_tilemapinfo.maskBaseAddr + mask * 8; + SET_TILE_INFO_MEMBER(m_tilemapinfo.gfxbank, tile, 0, 0); +} /* get_tile_info */ + +void namco_c123tmap_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) +{ + for (int i = 0; i < 6; i++) + { + /* note: priority is only in range 0..7, but Point Blank uses 0xf to hide a layer */ + if ((m_tilemapinfo.control[0x20 / 2 + i] & 0xf) == pri) + { + int color = m_tilemapinfo.control[0x30 / 2 + i] & 0x07; + m_tilemapinfo.tmap[i]->set_palette_offset(color * 256); + m_tilemapinfo.tmap[i]->draw(screen, bitmap, cliprect, 0, 0); + } + } +} /* draw */ + +void namco_c123tmap_device::set_tilemap_videoram(int offset, uint16_t newword) +{ + m_tilemapinfo.videoram[offset] = newword; + if (offset < 0x4000) + { + m_tilemapinfo.tmap[offset >> 12]->mark_tile_dirty(offset & 0xfff); + } + else if (offset >= 0x8010 / 2 && offset < 0x87f0 / 2) + { /* fixed plane#1 */ + offset -= 0x8010 / 2; + m_tilemapinfo.tmap[4]->mark_tile_dirty(offset); + } + else if (offset >= 0x8810 / 2 && offset < 0x8ff0 / 2) + { /* fixed plane#2 */ + offset -= 0x8810 / 2; + m_tilemapinfo.tmap[5]->mark_tile_dirty(offset); + } +} /* SetTilemapVideoram */ + +WRITE16_MEMBER(namco_c123tmap_device::videoram_w) +{ + uint16_t newword = m_tilemapinfo.videoram[offset]; + COMBINE_DATA(&newword); + set_tilemap_videoram(offset, newword); +} + +READ16_MEMBER(namco_c123tmap_device::videoram_r) +{ + return m_tilemapinfo.videoram[offset]; +} + +void namco_c123tmap_device::set_tilemap_control(int offset, uint16_t newword) +{ + m_tilemapinfo.control[offset] = newword; + if (offset < 0x20 / 2) + { + if (offset == 0x02 / 2) + { + /* all planes are flipped X+Y from D15 of this word */ + int attrs = (newword & 0x8000) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; + int i; + for (i = 0; i <= 5; i++) + { + m_tilemapinfo.tmap[i]->set_flip(attrs); + } + } + } + newword &= 0x1ff; + if (m_tilemapinfo.control[0x02 / 2] & 0x8000) + { + newword = -newword; + } + switch (offset) + { + case 0x02 / 2: + m_tilemapinfo.tmap[0]->set_scrollx(0, newword); + break; + case 0x06 / 2: + m_tilemapinfo.tmap[0]->set_scrolly(0, newword); + break; + case 0x0a / 2: + m_tilemapinfo.tmap[1]->set_scrollx(0, newword); + break; + case 0x0e / 2: + m_tilemapinfo.tmap[1]->set_scrolly(0, newword); + break; + case 0x12 / 2: + m_tilemapinfo.tmap[2]->set_scrollx(0, newword); + break; + case 0x16 / 2: + m_tilemapinfo.tmap[2]->set_scrolly(0, newword); + break; + case 0x1a / 2: + m_tilemapinfo.tmap[3]->set_scrollx(0, newword); + break; + case 0x1e / 2: + m_tilemapinfo.tmap[3]->set_scrolly(0, newword); + break; + } +} /* SetTilemapControl */ + +WRITE16_MEMBER(namco_c123tmap_device::control_w) +{ + uint16_t newword = m_tilemapinfo.control[offset]; + COMBINE_DATA(&newword); + set_tilemap_control(offset, newword); +} + +READ16_MEMBER(namco_c123tmap_device::control_r) +{ + return m_tilemapinfo.control[offset]; +} + diff --git a/src/mame/video/namco_c123tmap.h b/src/mame/video/namco_c123tmap.h new file mode 100644 index 00000000000..b626ac09a73 --- /dev/null +++ b/src/mame/video/namco_c123tmap.h @@ -0,0 +1,74 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +#ifndef MAME_VIDEO_NAMCO_C123TMAP_H +#define MAME_VIDEO_NAMCO_C123TMAP_H + +#pragma once + +#include "screen.h" +#include "emupal.h" + +class namco_c123tmap_device : public device_t +{ +public: + // construction/destruction + namco_c123tmap_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + template <typename T> void set_gfxdecode_tag(T &&tag) { m_gfxdecode.set_tag(std::forward<T>(tag)); } + template <typename T> void set_maskregion_tag(T &&tag) { m_maskregion.set_tag(std::forward<T>(tag)); } + void set_gfxregion(int region) { m_tilemapinfo.gfxbank = region; } + + typedef delegate<void(uint16_t, int*, int*)> c123_tilemap_delegate; + void set_tile_callback(c123_tilemap_delegate tilemap_cb) { m_tilemapinfo.cb = tilemap_cb; } + + DECLARE_WRITE16_MEMBER(videoram_w); + DECLARE_READ16_MEMBER(videoram_r); + DECLARE_WRITE16_MEMBER(control_w); + DECLARE_READ16_MEMBER(control_r); + + void mark_all_dirty(void); + void draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri); + +protected: + // device-level overrides + virtual void device_start() override; + +private: + template<int Offset> TILE_GET_INFO_MEMBER(get_tile_info); + void set_tilemap_videoram(int offset, uint16_t newword); + void set_tilemap_control(int offset, uint16_t newword); + + struct info + { + uint16_t control[0x40 / 2]; + /** + * [0x1] 0x02/2 tilemap#0.scrollx + * [0x3] 0x06/2 tilemap#0.scrolly + * [0x5] 0x0a/2 tilemap#1.scrollx + * [0x7] 0x0e/2 tilemap#1.scrolly + * [0x9] 0x12/2 tilemap#2.scrollx + * [0xb] 0x16/2 tilemap#2.scrolly + * [0xd] 0x1a/2 tilemap#3.scrollx + * [0xf] 0x1e/2 tilemap#3.scrolly + * 0x20/2 priority + * 0x30/2 color + */ + tilemap_t *tmap[6]; + std::unique_ptr<uint16_t[]> videoram; + int gfxbank; + uint8_t *maskBaseAddr; + c123_tilemap_delegate cb; + }; + + info m_tilemapinfo; + + required_device<gfxdecode_device> m_gfxdecode; + required_memory_region m_maskregion; +}; + +// device type definition +DECLARE_DEVICE_TYPE(NAMCO_C123TMAP, namco_c123tmap_device) + +#endif // MAME_VIDEO_NAMCO_C123TMAP_H + diff --git a/src/mame/video/namco_c169roz.cpp b/src/mame/video/namco_c169roz.cpp new file mode 100644 index 00000000000..e298a2dd333 --- /dev/null +++ b/src/mame/video/namco_c169roz.cpp @@ -0,0 +1,264 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood, Phil Stroffolino +/****************************************************************************** + + Namco C169 (ROZ - Rotate and Zoom) + + Advanced rotate-zoom chip manages two layers. + Each layer uses a designated subset of a master 256x256 tile tilemap (4096x4096 pixels). + Each layer has configurable color and tile banking. + ROZ attributes may be specified independently for each scanline. + + Used by: + Namco NB2 - The Outfoxies, Mach Breakers + Namco System 2 - Metal Hawk, Lucky and Wild + Namco System FL - Final Lap R, Speed Racer + +******************************************************************************/ + +#include "emu.h" +#include "namco_c169roz.h" + +DEFINE_DEVICE_TYPE(NAMCO_C169ROZ, namco_c169roz_device, "namco_c169roz", "Namco C169 (ROZ)") + +namco_c169roz_device::namco_c169roz_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, NAMCO_C169ROZ, tag, owner, clock), + m_gfx_region(0), + m_mask(nullptr), + m_is_namcofl(false), + m_gfxdecode(*this, finder_base::DUMMY_TAG), + m_maskregion(*this, finder_base::DUMMY_TAG) +{ +} + +void namco_c169roz_device::device_start() +{ + m_mask = m_maskregion->base(); + + m_videoram.resize(m_ramsize); + std::fill(std::begin(m_videoram), std::end(m_videoram), 0x0000); + + m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, + tilemap_get_info_delegate(FUNC(namco_c169roz_device::get_info<0>), this), + tilemap_mapper_delegate(FUNC(namco_c169roz_device::mapper), this), + 16, 16, + 256, 256); + + m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, + tilemap_get_info_delegate(FUNC(namco_c169roz_device::get_info<1>), this), + tilemap_mapper_delegate(FUNC(namco_c169roz_device::mapper), this), + 16, 16, + 256, 256); + + save_item(NAME(m_control)); + save_item(NAME(m_videoram)); +} + + +// for bank changes +void namco_c169roz_device::mark_all_dirty() +{ + for (auto & elem : m_tilemap) + elem->mark_all_dirty(); +} + +/** + * Graphics ROM addressing varies across games. + * (mostly scrambling, which could be handled in the game inits, but NB1 also has banking) + */ +template<int Which> +TILE_GET_INFO_MEMBER(namco_c169roz_device::get_info) +{ + int tile = 0, mask = 0; + m_c169_cb(m_videoram[tile_index&(m_ramsize-1)] & 0x3fff, &tile, &mask, Which); // need to mask with ramsize because the nb1/fl games have twice as much RAM, presumably the tilemaps mirror in ns2? + + tileinfo.mask_data = m_mask + 32 * mask; + SET_TILE_INFO_MEMBER(m_gfx_region, tile, 0/*color*/, 0/*flag*/); +} + +TILEMAP_MAPPER_MEMBER( namco_c169roz_device::mapper ) +{ + return ((col & 0x80) << 8) | ((row & 0xff) << 7) | (col & 0x7f); +} + +void namco_c169roz_device::unpack_params(const uint16_t *source, roz_parameters ¶ms) +{ + const int xoffset = 36, yoffset = 3; + + /** + * x-------.-------- disable layer + * ----x---.-------- wrap? + * ------xx.-------- size + * --------.xxxx---- priority + * --------.----xxxx color + */ + + uint16_t temp = source[1]; + params.wrap = BIT(~temp, 11); + params.size = 512 << ((temp & 0x0300) >> 8); + if (m_is_namcofl) + params.color = (temp & 0x0007) * 256; + else + params.color = (temp & 0x000f) * 256; + params.priority = (temp & 0x00f0) >> 4; + + temp = source[2]; + params.left = (temp & 0x7000) >> 3; + if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend + params.incxx = int16_t(temp); + + temp = source[3]; + params.top = (temp&0x7000)>>3; + if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend + params.incxy = int16_t(temp); + + temp = source[4]; + if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend + params.incyx = int16_t(temp); + + temp = source[5]; + if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend + params.incyy = int16_t(temp); + + params.startx = int16_t(source[6]); + params.starty = int16_t(source[7]); + params.startx <<= 4; + params.starty <<= 4; + + params.startx += xoffset * params.incxx + yoffset * params.incyx; + params.starty += xoffset * params.incxy + yoffset * params.incyy; + + // normalize + params.startx <<= 8; + params.starty <<= 8; + params.incxx <<= 8; + params.incxy <<= 8; + params.incyx <<= 8; + params.incyy <<= 8; +} + +void namco_c169roz_device::draw_helper(screen_device &screen, bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters ¶ms) +{ + if (!m_is_namcofl) +// if (m_gametype != NAMCOFL_FINAL_LAP_R) // Fix speedrcr some title animations, but broke at road scene + { + uint32_t size_mask = params.size - 1; + bitmap_ind16 &srcbitmap = tmap.pixmap(); + bitmap_ind8 &flagsbitmap = tmap.flagsmap(); + uint32_t startx = params.startx + clip.min_x * params.incxx + clip.min_y * params.incyx; + uint32_t starty = params.starty + clip.min_x * params.incxy + clip.min_y * params.incyy; + int sx = clip.min_x; + int sy = clip.min_y; + while (sy <= clip.max_y) + { + int x = sx; + uint32_t cx = startx; + uint32_t cy = starty; + uint16_t *dest = &bitmap.pix(sy, sx); + while (x <= clip.max_x) + { // TODO : Wraparound disable isn't implemented + uint32_t xpos = (((cx >> 16) & size_mask) + params.left) & 0xfff; + uint32_t ypos = (((cy >> 16) & size_mask) + params.top) & 0xfff; + if (flagsbitmap.pix(ypos, xpos) & TILEMAP_PIXEL_LAYER0) + *dest = srcbitmap.pix(ypos, xpos) + params.color; + cx += params.incxx; + cy += params.incxy; + x++; + dest++; + } + startx += params.incyx; + starty += params.incyy; + sy++; + } + } + else + { + tmap.set_palette_offset(params.color); + tmap.draw_roz( + screen, + bitmap, + clip, + params.startx, params.starty, + params.incxx, params.incxy, + params.incyx, params.incyy, + params.wrap,0,0); // wrap, flags, pri + } +} + +void namco_c169roz_device::draw_scanline(screen_device &screen, bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect) +{ + if (line >= cliprect.min_y && line <= cliprect.max_y) + { + int row = line / 8; + int offs = row * 0x100 + (line & 7) * 0x10 + 0xe080; + uint16_t *source = &m_videoram[offs / 2]; + + // if enabled + if ((source[1] & 0x8000) == 0) + { + roz_parameters params; + unpack_params(source, params); + + // check priority + if (pri == params.priority) + { + rectangle clip(0, bitmap.width() - 1, line, line); + clip &= cliprect; + draw_helper(screen, bitmap, *m_tilemap[which], clip, params); + } + } + } +} + +void namco_c169roz_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) +{ + int special = (m_is_namcofl) ? 0 : 1; + int mode = m_control[0]; // 0x8000 or 0x1000 + + for (int which = 1; which >= 0; which--) + { + const uint16_t *source = &m_control[which * 8]; + uint16_t attrs = source[1]; + + // if enabled + if ((attrs & 0x8000) == 0) + { + // second ROZ layer is configured to use per-scanline registers + if (which == special && mode == 0x8000) + { + for (int line = cliprect.min_y; line <= cliprect.max_y; line++) + draw_scanline(screen, bitmap, line, which, pri, cliprect); + } + else + { + roz_parameters params; + unpack_params(source, params); + if (params.priority == pri) + draw_helper(screen, bitmap, *m_tilemap[which], cliprect, params); + } + } + } +} + +READ16_MEMBER( namco_c169roz_device::control_r ) +{ + return m_control[offset]; +} + +WRITE16_MEMBER( namco_c169roz_device::control_w ) +{ + COMBINE_DATA(&m_control[offset]); +} + +READ16_MEMBER( namco_c169roz_device::videoram_r ) +{ + return m_videoram[offset]; +} + +WRITE16_MEMBER( namco_c169roz_device::videoram_w ) +{ + COMBINE_DATA(&m_videoram[offset]); + for (auto & elem : m_tilemap) + elem->mark_tile_dirty(offset); +} + diff --git a/src/mame/video/namco_c169roz.h b/src/mame/video/namco_c169roz.h new file mode 100644 index 00000000000..b3299171c04 --- /dev/null +++ b/src/mame/video/namco_c169roz.h @@ -0,0 +1,74 @@ + +// license:BSD-3-Clause +// copyright-holders:David Haywood + +#ifndef MAME_VIDEO_NAMCO_C169ROZ_H +#define MAME_VIDEO_NAMCO_C169ROZ_H + +#pragma once + +class namco_c169roz_device : public device_t +{ +public: + // construction/destruction + namco_c169roz_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + template <typename T> void set_gfxdecode_tag(T &&tag) { m_gfxdecode.set_tag(std::forward<T>(tag)); } + void set_is_namcofl(bool state) { m_is_namcofl = state; } + void set_ram_words(uint32_t size) { m_ramsize = size; } + template <typename T> void set_maskregion_tag(T &&tag) { m_maskregion.set_tag(std::forward<T>(tag)); } + void set_gfxregion(int region) { m_gfx_region = region; } + + DECLARE_READ16_MEMBER( control_r ); + DECLARE_WRITE16_MEMBER( control_w ); + DECLARE_READ16_MEMBER( videoram_r ); + DECLARE_WRITE16_MEMBER( videoram_w ); + + typedef delegate<void (uint16_t, int*, int*, int)> c169_tilemap_delegate; + void set_tile_callback(c169_tilemap_delegate tilemap_cb) { m_c169_cb = tilemap_cb; } + + void draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri); + void mark_all_dirty(); + +protected: + // device-level overrides + virtual void device_start() override; + +private: + + c169_tilemap_delegate m_c169_cb; + struct roz_parameters + { + uint32_t left, top, size; + uint32_t startx, starty; + int incxx, incxy, incyx, incyy; + int color, priority; + int wrap; + }; + void unpack_params(const uint16_t *source, roz_parameters ¶ms); + void draw_helper(screen_device &screen, bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters ¶ms); + void draw_scanline(screen_device &screen, bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect); + void get_info(tile_data &tileinfo, int tile_index, int which); + template<int Which> TILE_GET_INFO_MEMBER( get_info ); + TILEMAP_MAPPER_MEMBER( mapper ); + + static const int ROZ_TILEMAP_COUNT = 2; + tilemap_t *m_tilemap[ROZ_TILEMAP_COUNT]; + uint16_t m_control[0x20/2]; + std::vector<uint16_t> m_videoram; + int m_gfx_region; + uint8_t *m_mask; + uint32_t m_ramsize; + + // per-game hacks + bool m_is_namcofl; + + required_device<gfxdecode_device> m_gfxdecode; + required_memory_region m_maskregion; +}; + +// device type definition +DECLARE_DEVICE_TYPE(NAMCO_C169ROZ, namco_c169roz_device) + +#endif // MAME_VIDEO_NAMCO_C169ROZ_H + diff --git a/src/mame/video/namco_c355spr.cpp b/src/mame/video/namco_c355spr.cpp new file mode 100644 index 00000000000..bc793898aeb --- /dev/null +++ b/src/mame/video/namco_c355spr.cpp @@ -0,0 +1,450 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood, Phil Stroffolino + +/* + C355 Zooming sprites + used by + namcofl.cpp (all games) + namconb1.cpp (all games) + gal3.cpp (all games) + namcos21.cpp (Driver's Eyes, Solvalou, Starblade, Air Combat, Cyber Sled) (everything except Winning Run series) + namcos2.cpp (Steel Gunner, Steel Gunner 2, Lucky & Wild, Suzuka 8 Hours, Suzuka 8 Hours 2) + +*/ + +#include "emu.h" +#include "namco_c355spr.h" + +DEFINE_DEVICE_TYPE(NAMCO_C355SPR, namco_c355spr_device, "namco_c355spr", "Namco C355 (Sprites)") + +namco_c355spr_device::namco_c355spr_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, NAMCO_C355SPR, tag, owner, clock), + m_gfx_region(0), + m_palxor(0), + m_is_namcofl(false), + m_gfxdecode(*this, finder_base::DUMMY_TAG), + m_palette(*this, finder_base::DUMMY_TAG) +{ +} + + +/**************************************************************************************/ + +void namco_c355spr_device::zdrawgfxzoom( + screen_device &screen, + bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx, + uint32_t code,uint32_t color,int flipx,int flipy,int sx,int sy, + int scalex, int scaley, int zpos ) +{ + if (!scalex || !scaley) return; + if (dest_bmp.bpp() == 16) + { + if( gfx ) + { + int shadow_offset = (m_palette->shadows_enabled())?m_palette->entries():0; + const pen_t *pal = &m_palette->pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors())); + const uint8_t *source_base = gfx->get_data(code % gfx->elements()); + int sprite_screen_height = (scaley*gfx->height()+0x8000)>>16; + int sprite_screen_width = (scalex*gfx->width()+0x8000)>>16; + if (sprite_screen_width && sprite_screen_height) + { + /* compute sprite increment per screen pixel */ + int dx = (gfx->width()<<16)/sprite_screen_width; + int dy = (gfx->height()<<16)/sprite_screen_height; + + int ex = sx+sprite_screen_width; + int ey = sy+sprite_screen_height; + + int x_index_base; + int y_index; + + if( flipx ) + { + x_index_base = (sprite_screen_width-1)*dx; + dx = -dx; + } + else + { + x_index_base = 0; + } + + if( flipy ) + { + y_index = (sprite_screen_height-1)*dy; + dy = -dy; + } + else + { + y_index = 0; + } + + if( sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < clip.min_y ) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + if( ex > clip.max_x+1 ) + { /* clip right */ + int pixels = ex-clip.max_x-1; + ex -= pixels; + } + if( ey > clip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-clip.max_y-1; + ey -= pixels; + } + + if( ex>sx ) + { /* skip if inner loop doesn't draw anything */ + int y; + bitmap_ind8 &priority_bitmap = screen.priority(); + if( priority_bitmap.valid() ) + { + for( y=sy; y<ey; y++ ) + { + const uint8_t *source = source_base + (y_index>>16) * gfx->rowbytes(); + uint16_t *dest = &dest_bmp.pix16(y); + uint8_t *pri = &priority_bitmap.pix8(y); + int x, x_index = x_index_base; + if( m_palxor ) + { + for( x=sx; x<ex; x++ ) + { + int c = source[x_index>>16]; + if( c != 0xff ) + { + if( pri[x]<=zpos ) + { + switch( c ) + { + case 0: + dest[x] = 0x4000|(dest[x]&0x1fff); + break; + case 1: + dest[x] = 0x6000|(dest[x]&0x1fff); + break; + default: + dest[x] = pal[c]; + break; + } + pri[x] = zpos; + } + } + x_index += dx; + } + y_index += dy; + } + else + { + for( x=sx; x<ex; x++ ) + { + int c = source[x_index>>16]; + if( c != 0xff ) + { + if( pri[x]<=zpos ) + { + if( color == 0xf && c==0xfe && shadow_offset ) + { + dest[x] |= shadow_offset; + } + else + { + dest[x] = pal[c]; + } + pri[x] = zpos; + } + } + x_index += dx; + } + y_index += dy; + } + } + } + } + } + } + } +} /* zdrawgfxzoom */ + +void namco_c355spr_device::zdrawgfxzoom( + screen_device &screen, + bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx, + uint32_t code,uint32_t color,int flipx,int flipy,int sx,int sy, + int scalex, int scaley, int zpos ) +{ + /* nop */ +} + +void namco_c355spr_device::device_start() +{ + //m_spriteram.resize(m_ramsize); + std::fill(std::begin(m_spriteram), std::end(m_spriteram), 0x0000); // needed for Nebulas Ray + std::fill(std::begin(m_position), std::end(m_position), 0x0000); + + save_item(NAME(m_spriteram)); + save_item(NAME(m_position)); +} + + +/**************************************************************************************/ + +WRITE16_MEMBER( namco_c355spr_device::position_w ) +{ + COMBINE_DATA(&m_position[offset]); +} +READ16_MEMBER( namco_c355spr_device::position_r ) +{ + return m_position[offset]; +} + +/**************************************************************************************************************/ + +/** + * 0x00000 sprite attr (page0) + * 0x02000 sprite list (page0) + * + * 0x02400 window attributes + * 0x04000 format + * 0x08000 tile + * 0x10000 sprite attr (page1) + * 0x14000 sprite list (page1) + */ +template<class _BitmapClass> +void namco_c355spr_device::draw_sprite(screen_device &screen, _BitmapClass &bitmap, const rectangle &cliprect, const uint16_t *pSource, int pri, int zpos ) +{ + uint16_t *spriteram16 = m_spriteram; + unsigned screen_height_remaining, screen_width_remaining; + unsigned source_height_remaining, source_width_remaining; + int hpos,vpos; + uint16_t hsize,vsize; + uint16_t palette; + uint16_t linkno; + uint16_t offset; + uint16_t format; + int tile_index; + int num_cols,num_rows; + int dx,dy; + int row,col; + int sx,sy,tile; + int flipx,flipy; + uint32_t zoomx, zoomy; + int tile_screen_width; + int tile_screen_height; + const uint16_t *spriteformat16 = &spriteram16[0x4000/2]; + const uint16_t *spritetile16 = &spriteram16[0x8000/2]; + int color; + const uint16_t *pWinAttr; + rectangle clip; + int xscroll, yscroll; + + /** + * ----xxxx-------- window select + * --------xxxx---- priority + * ------------xxxx palette select + */ + palette = pSource[6]; + if( pri != ((palette>>4)&0xf) ) + { + return; + } + + linkno = pSource[0]; /* LINKNO */ + offset = pSource[1]; /* OFFSET */ + hpos = pSource[2]; /* HPOS 0x000..0x7ff (signed) */ + vpos = pSource[3]; /* VPOS 0x000..0x7ff (signed) */ + hsize = pSource[4]; /* HSIZE max 0x3ff pixels */ + vsize = pSource[5]; /* VSIZE max 0x3ff pixels */ + /* pSource[6] contains priority/palette */ + /* pSource[7] is used in Lucky & Wild, possibly for sprite-road priority */ + + if( linkno*4>=0x4000/2 ) return; /* avoid garbage memory reads */ + + xscroll = (int16_t)m_position[1]; + yscroll = (int16_t)m_position[0]; + +// xscroll &= 0x3ff; if( xscroll & 0x200 ) xscroll |= ~0x3ff; + xscroll &= 0x1ff; if( xscroll & 0x100 ) xscroll |= ~0x1ff; + yscroll &= 0x1ff; if( yscroll & 0x100 ) yscroll |= ~0x1ff; + + if( bitmap.width() > 384 ) + { /* Medium Resolution: System21 adjust */ + xscroll = (int16_t)m_position[1]; + xscroll &= 0x3ff; if( xscroll & 0x200 ) xscroll |= ~0x3ff; + if( yscroll<0 ) + { /* solvalou */ + yscroll += 0x20; + } + yscroll += 0x10; + } + else + { + if (m_is_namcofl) + { /* Namco FL: don't adjust and things line up fine */ + } + else + { /* Namco NB1, Namco System 2 */ + xscroll += 0x26; + yscroll += 0x19; + } + } + + hpos -= xscroll; + vpos -= yscroll; + pWinAttr = &spriteram16[0x2400/2+((palette>>8)&0xf)*4]; + clip.set(pWinAttr[0] - xscroll, pWinAttr[1] - xscroll, pWinAttr[2] - yscroll, pWinAttr[3] - yscroll); + clip &= cliprect; + hpos&=0x7ff; if( hpos&0x400 ) hpos |= ~0x7ff; /* sign extend */ + vpos&=0x7ff; if( vpos&0x400 ) vpos |= ~0x7ff; /* sign extend */ + + tile_index = spriteformat16[linkno*4+0]; + format = spriteformat16[linkno*4+1]; + dx = spriteformat16[linkno*4+2]; + dy = spriteformat16[linkno*4+3]; + num_cols = (format>>4)&0xf; + num_rows = (format)&0xf; + + if( num_cols == 0 ) num_cols = 0x10; + flipx = (hsize&0x8000)?1:0; + hsize &= 0x3ff;//0x1ff; + if( hsize == 0 ) return; + zoomx = (hsize<<16)/(num_cols*16); + dx = (dx*zoomx+0x8000)>>16; + if( flipx ) + { + hpos += dx; + } + else + { + hpos -= dx; + } + + if( num_rows == 0 ) num_rows = 0x10; + flipy = (vsize&0x8000)?1:0; + vsize &= 0x3ff; + if( vsize == 0 ) return; + zoomy = (vsize<<16)/(num_rows*16); + dy = (dy*zoomy+0x8000)>>16; + if( flipy ) + { + vpos += dy; + } + else + { + vpos -= dy; + } + + color = (palette&0xf)^m_palxor; + + source_height_remaining = num_rows*16; + screen_height_remaining = vsize; + sy = vpos; + for( row=0; row<num_rows; row++ ) + { + tile_screen_height = 16*screen_height_remaining/source_height_remaining; + zoomy = (screen_height_remaining<<16)/source_height_remaining; + if( flipy ) + { + sy -= tile_screen_height; + } + source_width_remaining = num_cols*16; + screen_width_remaining = hsize; + sx = hpos; + for( col=0; col<num_cols; col++ ) + { + tile_screen_width = 16*screen_width_remaining/source_width_remaining; + zoomx = (screen_width_remaining<<16)/source_width_remaining; + if( flipx ) + { + sx -= tile_screen_width; + } + tile = spritetile16[tile_index++]; + if( (tile&0x8000)==0 ) + { + zdrawgfxzoom( + screen, + bitmap, + clip, + m_gfxdecode->gfx(m_gfx_region), + m_code2tile(tile) + offset, + color, + flipx,flipy, + sx,sy, + zoomx, zoomy, zpos ); + } + if( !flipx ) + { + sx += tile_screen_width; + } + screen_width_remaining -= tile_screen_width; + source_width_remaining -= 16; + } /* next col */ + if( !flipy ) + { + sy += tile_screen_height; + } + screen_height_remaining -= tile_screen_height; + source_height_remaining -= 16; + } /* next row */ +} + + +int namco_c355spr_device::default_code2tile(int code) +{ + return code; +} + +template<class _BitmapClass> +void namco_c355spr_device::draw_list(screen_device &screen, _BitmapClass &bitmap, const rectangle &cliprect, int pri, const uint16_t *pSpriteList16, const uint16_t *pSpriteTable) +{ + int i; + /* draw the sprites */ + for( i=0; i<256; i++ ) + { + uint16_t which = pSpriteList16[i]; + draw_sprite(screen, bitmap, cliprect, &pSpriteTable[(which&0xff)*8], pri, i ); + if( which&0x100 ) break; + } +} + +void namco_c355spr_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) +{ +// int offs = spriteram16[0x18000/2]; /* end-of-sprite-list */ + if (pri == 0) + screen.priority().fill(0, cliprect); + +// if (offs == 0) // boot + // TODO: solvalou service mode wants 0x14000/2 & 0x00000/2 + draw_list(screen, bitmap, cliprect, pri, &m_spriteram[0x02000/2], &m_spriteram[0x00000/2]); +// else + draw_list(screen, bitmap, cliprect, pri, &m_spriteram[0x14000/2], &m_spriteram[0x10000/2]); +} + +void namco_c355spr_device::draw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri) +{ +// int offs = spriteram16[0x18000/2]; /* end-of-sprite-list */ + if (pri == 0) + screen.priority().fill(0, cliprect); + +// if (offs == 0) // boot + draw_list(screen, bitmap, cliprect, pri, &m_spriteram[0x02000/2], &m_spriteram[0x00000/2]); +// else + draw_list(screen, bitmap, cliprect, pri, &m_spriteram[0x14000/2], &m_spriteram[0x10000/2]); +} + +WRITE16_MEMBER( namco_c355spr_device::spriteram_w ) +{ + COMBINE_DATA(&m_spriteram[offset]); +} + +READ16_MEMBER( namco_c355spr_device::spriteram_r ) +{ + return m_spriteram[offset]; +} + diff --git a/src/mame/video/namco_c355spr.h b/src/mame/video/namco_c355spr.h new file mode 100644 index 00000000000..c9ec0ba6d46 --- /dev/null +++ b/src/mame/video/namco_c355spr.h @@ -0,0 +1,81 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +#ifndef MAME_VIDEO_NAMCO_C355SPR_H +#define MAME_VIDEO_NAMCO_C355SPR_H + +#pragma once + +#include "screen.h" +#include "emupal.h" + +class namco_c355spr_device : public device_t +{ +public: + // construction/destruction + namco_c355spr_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + template <typename T> void set_palette_tag(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); } + template <typename T> void set_gfxdecode_tag(T &&tag) { m_gfxdecode.set_tag(std::forward<T>(tag)); } + void set_is_namcofl(bool state) { m_is_namcofl = state; } + //void set_ram_words(uint32_t size) { m_ramsize = size; } + void set_palxor(int palxor) { m_palxor = palxor; } + void set_gfxregion(int region) { m_gfx_region = region; } + + DECLARE_READ16_MEMBER( spriteram_r ); + DECLARE_WRITE16_MEMBER( spriteram_w ); + DECLARE_READ16_MEMBER( position_r ); + DECLARE_WRITE16_MEMBER( position_w ); + + typedef delegate<int (int)> c355_obj_code2tile_delegate; + void set_tile_callback(c355_obj_code2tile_delegate cb) + { + if (!cb.isnull()) + m_code2tile = cb; + else + m_code2tile = c355_obj_code2tile_delegate(&namco_c355spr_device::default_code2tile, this); + } + + void draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri); + void draw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri); + + +protected: + // device-level overrides + virtual void device_start() override; + +private: + + // general + void zdrawgfxzoom(screen_device &screen, bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos); + void zdrawgfxzoom(screen_device &screen, bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos); + + // C355 Motion Object Emulation + // for pal_xor, supply either 0x0 (normal) or 0xf (palette mapping reversed) + int default_code2tile(int code); + + // C355 Motion Object internals + template<class _BitmapClass> + void draw_sprite(screen_device &screen, _BitmapClass &bitmap, const rectangle &cliprect, const uint16_t *pSource, int pri, int zpos); + template<class _BitmapClass> + void draw_list(screen_device &screen, _BitmapClass &bitmap, const rectangle &cliprect, int pri, const uint16_t *pSpriteList16, const uint16_t *pSpriteTable); + + c355_obj_code2tile_delegate m_code2tile; + int m_gfx_region; + int m_palxor; + uint16_t m_position[4]; + uint16_t m_spriteram[0x20000/2]; + //std::vector<uint16_t> m_spriteram; + + bool m_is_namcofl; + //uint32_t m_ramsize; + + required_device<gfxdecode_device> m_gfxdecode; + required_device<palette_device> m_palette; +}; + +// device type definition +DECLARE_DEVICE_TYPE(NAMCO_C355SPR, namco_c355spr_device) + +#endif // MAME_VIDEO_NAMCO_C355SPR_H + diff --git a/src/mame/video/namcofl.cpp b/src/mame/video/namcofl.cpp index 3d2d4567ec2..0ecf77c5abd 100644 --- a/src/mame/video/namcofl.cpp +++ b/src/mame/video/namcofl.cpp @@ -5,9 +5,6 @@ #include "emu.h" #include "includes/namcofl.h" -#include "machine/namcoic.h" - - /* nth_word32 is a general-purpose utility function, which allows us to * read from 32-bit aligned memory as if it were an array of 16 bit words. */ @@ -69,10 +66,13 @@ uint32_t namcofl_state::screen_update_namcofl(screen_device &screen, bitmap_ind1 for( pri=0; pri<16; pri++ ) { - c169_roz_draw(screen, bitmap, cliprect, pri); - if((pri&1)==0) - c123_tilemap_draw( screen, bitmap, cliprect, pri>>1 ); - c355_obj_draw(screen, bitmap, cliprect, pri ); + m_c169roz->draw(screen, bitmap, cliprect, pri); + if ((pri & 1) == 0) + { + m_c123tmap->draw(screen, bitmap, cliprect, pri >> 1); + } + + m_c355spr->draw(screen, bitmap, cliprect, pri ); } return 0; @@ -96,7 +96,5 @@ int namcofl_state::FLobjcode2tile(int code) VIDEO_START_MEMBER(namcofl_state,namcofl) { - c123_tilemap_init(NAMCOFL_TILEGFX, memregion(NAMCOFL_TILEMASKREGION)->base(), namcos2_shared_state::c123_tilemap_delegate(&namcofl_state::TilemapCB, this)); - c355_obj_init(NAMCOFL_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(&namcofl_state::FLobjcode2tile, this)); - c169_roz_init(NAMCOFL_ROTGFX,NAMCOFL_ROTMASKREGION,namcos2_shared_state::c169_tilemap_delegate(&namcofl_state::RozCB, this)); } + diff --git a/src/mame/video/namconb1.cpp b/src/mame/video/namconb1.cpp index 8a43944828e..e04c49fd438 100644 --- a/src/mame/video/namconb1.cpp +++ b/src/mame/video/namconb1.cpp @@ -5,9 +5,6 @@ #include "emu.h" #include "includes/namconb1.h" -#include "machine/namcoic.h" - - /* nth_word32 is a general-purpose utility function, which allows us to * read from 32-bit aligned memory as if it were an array of 16 bit words. */ @@ -94,20 +91,20 @@ void namconb1_state::video_update_common(screen_device &screen, bitmap_ind16 &bi { for( pri=0; pri<16; pri++ ) { - c169_roz_draw(screen, bitmap, cliprect, pri); - if( (pri&1)==0 ) + m_c169roz->draw(screen, bitmap, cliprect, pri); + if ((pri & 1) == 0) { - c123_tilemap_draw( screen, bitmap, cliprect, pri/2 ); + m_c123tmap->draw( screen, bitmap, cliprect, pri/2 ); } - c355_obj_draw(screen, bitmap, cliprect, pri ); + m_c355spr->draw(screen, bitmap, cliprect, pri ); } } else { for( pri=0; pri<8; pri++ ) { - c123_tilemap_draw( screen, bitmap, cliprect, pri ); - c355_obj_draw(screen, bitmap, cliprect, pri ); + m_c123tmap->draw( screen, bitmap, cliprect, pri ); + m_c355spr->draw(screen, bitmap, cliprect, pri ); } } } /* video_update_common */ @@ -141,9 +138,6 @@ int namconb1_state::NB1objcode2tile( int code ) VIDEO_START_MEMBER(namconb1_state,namconb1) { - c123_tilemap_init(NAMCONB1_TILEGFX, memregion(NAMCONB1_TILEMASKREGION)->base(), namcos2_shared_state::c123_tilemap_delegate(&namconb1_state::NB1TilemapCB, this)); - c355_obj_init(NAMCONB1_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(&namconb1_state::NB1objcode2tile, this)); - save_item(NAME(m_tilemap_tile_bank)); } /* namconb1 */ @@ -154,8 +148,7 @@ WRITE32_MEMBER(namconb1_state::rozbank32_w) uint32_t old_data = m_rozbank32[offset]; COMBINE_DATA(&m_rozbank32[offset]); if (m_rozbank32[offset] != old_data) - for (auto & elem : m_c169_roz_tilemap) - elem->mark_all_dirty(); + m_c169roz->mark_all_dirty(); } uint32_t namconb1_state::screen_update_namconb2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -174,7 +167,7 @@ uint32_t namconb1_state::screen_update_namconb2(screen_device &screen, bitmap_in if( memcmp(m_tilemap_tile_bank,m_tilebank32,sizeof(m_tilemap_tile_bank))!=0 ) { - c123_tilemap_invalidate(); + m_c123tmap->mark_all_dirty(); memcpy(m_tilemap_tile_bank,m_tilebank32,sizeof(m_tilemap_tile_bank)); } video_update_common( screen, bitmap, clip, 1 ); @@ -199,18 +192,12 @@ int namconb1_state::NB2objcode2tile_outfxies( int code ) VIDEO_START_MEMBER(namconb1_state,machbrkr) { - c123_tilemap_init(NAMCONB1_TILEGFX, memregion(NAMCONB1_TILEMASKREGION)->base(), namcos2_shared_state::c123_tilemap_delegate(&namconb1_state::NB2TilemapCB_machbrkr, this)); - c355_obj_init(NAMCONB1_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(&namconb1_state::NB2objcode2tile_machbrkr, this)); - c169_roz_init(NAMCONB1_ROTGFX,NAMCONB1_ROTMASKREGION,namcos2_shared_state::c169_tilemap_delegate(&namconb1_state::NB2RozCB_machbrkr, this)); - save_item(NAME(m_tilemap_tile_bank)); } /* machbrkr */ VIDEO_START_MEMBER(namconb1_state,outfxies) { - c123_tilemap_init(NAMCONB1_TILEGFX, memregion(NAMCONB1_TILEMASKREGION)->base(), namcos2_shared_state::c123_tilemap_delegate(&namconb1_state::NB2TilemapCB_outfxies, this)); - c355_obj_init(NAMCONB1_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(&namconb1_state::NB2objcode2tile_outfxies, this)); - c169_roz_init(NAMCONB1_ROTGFX,NAMCONB1_ROTMASKREGION,namcos2_shared_state::c169_tilemap_delegate(&namconb1_state::NB2RozCB_outfxies, this)); - save_item(NAME(m_tilemap_tile_bank)); } /* outfxies */ + + diff --git a/src/mame/video/namcos2.cpp b/src/mame/video/namcos2.cpp index 64007cf1624..c87c8770bc6 100644 --- a/src/mame/video/namcos2.cpp +++ b/src/mame/video/namcos2.cpp @@ -29,270 +29,21 @@ void namcos2_state::TilemapCB_finalap2(uint16_t code, int *tile, int *mask) * ---- ---- xxxx ---- always zero? * ---- ---- ---- xxxx sprite bank */ -READ16_MEMBER( namcos2_state::gfx_ctrl_r ) +READ16_MEMBER(namcos2_state::gfx_ctrl_r) { return m_gfx_ctrl; } -WRITE16_MEMBER( namcos2_state::gfx_ctrl_w ) +WRITE16_MEMBER(namcos2_state::gfx_ctrl_w) { COMBINE_DATA(&m_gfx_ctrl); } -TILE_GET_INFO_MEMBER( namcos2_state::roz_tile_info ) -{ - int tile = m_rozram[tile_index]; - SET_TILE_INFO_MEMBER(3,tile,0/*color*/,0); -} - -struct roz_param -{ - uint32_t size; - uint32_t startx,starty; - int incxx,incxy,incyx,incyy; - int color; - int wrap; -}; - -static inline void -draw_roz_helper_block(const struct roz_param *rozInfo, int destx, int desty, - int srcx, int srcy, int width, int height, - bitmap_ind16 &destbitmap, bitmap_ind8 &flagsbitmap, - bitmap_ind16 &srcbitmap, uint32_t size_mask) -{ - int desty_end = desty + height; - - int end_incrx = rozInfo->incyx - (width * rozInfo->incxx); - int end_incry = rozInfo->incyy - (width * rozInfo->incxy); - - uint16_t *dest = &destbitmap.pix16(desty, destx); - int dest_rowinc = destbitmap.rowpixels() - width; - - while (desty < desty_end) - { - uint16_t *dest_end = dest + width; - while (dest < dest_end) - { - uint32_t xpos = (srcx >> 16); - uint32_t ypos = (srcy >> 16); - - if (rozInfo->wrap) - { - xpos &= size_mask; - ypos &= size_mask; - } - else if ((xpos > rozInfo->size) || (ypos >= rozInfo->size)) - { - goto L_SkipPixel; - } - - if (flagsbitmap.pix8(ypos, xpos) & TILEMAP_PIXEL_LAYER0) - { - *dest = srcbitmap.pix16(ypos, xpos) + rozInfo->color; - } - - L_SkipPixel: - - srcx += rozInfo->incxx; - srcy += rozInfo->incxy; - dest++; - } - srcx += end_incrx; - srcy += end_incry; - dest += dest_rowinc; - desty++; - } -} - -static void -draw_roz_helper( - screen_device &screen, - bitmap_ind16 &bitmap, - tilemap_t *tmap, - const rectangle &clip, - const struct roz_param *rozInfo ) -{ - tmap->set_palette_offset(rozInfo->color ); - - if( bitmap.bpp() == 16 ) - { - /* On many processors, the simple approach of an outer loop over the - rows of the destination bitmap with an inner loop over the columns - of the destination bitmap has poor performance due to the order - that memory in the source bitmap is referenced when rotation - approaches 90 or 270 degrees. The reason is that the inner loop - ends up reading pixels not sequentially in the source bitmap, but - instead at rozInfo->incxx increments, which is at its maximum at 90 - degrees of rotation. This means that only a few (or as few as - one) source pixels are in each cache line at a time. - - Instead of the above, this code iterates in NxN blocks through the - destination bitmap. This has more overhead when there is little or - no rotation, but much better performance when there is closer to 90 - degrees of rotation (as long as the chunk of the source bitmap that - corresponds to an NxN destination block fits in cache!). - - N is defined by ROZ_BLOCK_SIZE below; the best N is one that is as - big as possible but at the same time not too big to prevent all of - the source bitmap pixels from fitting into cache at the same time. - Keep in mind that the block of source pixels used can be somewhat - scattered in memory. 8x8 works well on the few processors that - were tested; 16x16 seems to work even better for more modern - processors with larger caches, but since 8x8 works well enough and - is less likely to result in cache misses on processors with smaller - caches, it is used. - */ - -#define ROZ_BLOCK_SIZE 8 - - uint32_t size_mask = rozInfo->size - 1; - bitmap_ind16 &srcbitmap = tmap->pixmap(); - bitmap_ind8 &flagsbitmap = tmap->flagsmap(); - uint32_t srcx = (rozInfo->startx + (clip.min_x * rozInfo->incxx) + - (clip.min_y * rozInfo->incyx)); - uint32_t srcy = (rozInfo->starty + (clip.min_x * rozInfo->incxy) + - (clip.min_y * rozInfo->incyy)); - int destx = clip.min_x; - int desty = clip.min_y; - - int row_count = (clip.max_y - desty) + 1; - int row_block_count = row_count / ROZ_BLOCK_SIZE; - int row_extra_count = row_count % ROZ_BLOCK_SIZE; - - int column_count = (clip.max_x - destx) + 1; - int column_block_count = column_count / ROZ_BLOCK_SIZE; - int column_extra_count = column_count % ROZ_BLOCK_SIZE; - - int row_block_size_incxx = ROZ_BLOCK_SIZE * rozInfo->incxx; - int row_block_size_incxy = ROZ_BLOCK_SIZE * rozInfo->incxy; - int row_block_size_incyx = ROZ_BLOCK_SIZE * rozInfo->incyx; - int row_block_size_incyy = ROZ_BLOCK_SIZE * rozInfo->incyy; - - int i,j; - - // Do the block rows - for (i = 0; i < row_block_count; i++) - { - int sx = srcx; - int sy = srcy; - int dx = destx; - // Do the block columns - for (j = 0; j < column_block_count; j++) - { - draw_roz_helper_block(rozInfo, dx, desty, sx, sy, ROZ_BLOCK_SIZE, - ROZ_BLOCK_SIZE, bitmap, flagsbitmap, srcbitmap, size_mask); - // Increment to the next block column - sx += row_block_size_incxx; - sy += row_block_size_incxy; - dx += ROZ_BLOCK_SIZE; - } - // Do the extra columns - if (column_extra_count) - { - draw_roz_helper_block(rozInfo, dx, desty, sx, sy, column_extra_count, - ROZ_BLOCK_SIZE, bitmap, flagsbitmap, srcbitmap, size_mask); - } - // Increment to the next row block - srcx += row_block_size_incyx; - srcy += row_block_size_incyy; - desty += ROZ_BLOCK_SIZE; - } - // Do the extra rows - if (row_extra_count) - { - // Do the block columns - for (i = 0; i < column_block_count; i++) - { - draw_roz_helper_block(rozInfo, destx, desty, srcx, srcy, ROZ_BLOCK_SIZE, - row_extra_count, bitmap, flagsbitmap, srcbitmap, size_mask); - srcx += row_block_size_incxx; - srcy += row_block_size_incxy; - destx += ROZ_BLOCK_SIZE; - } - // Do the extra columns - if (column_extra_count) - { - draw_roz_helper_block(rozInfo, destx, desty, srcx, srcy, column_extra_count, - row_extra_count, bitmap, flagsbitmap, srcbitmap, size_mask); - } - } - } - else - { - tmap->draw_roz(screen, - bitmap, clip, - rozInfo->startx, rozInfo->starty, - rozInfo->incxx, rozInfo->incxy, - rozInfo->incyx, rozInfo->incyy, - rozInfo->wrap,0,0); // wrap, flags, pri - } -} - -void namcos2_state::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - const int xoffset = 38,yoffset = 0; - struct roz_param rozParam; - - rozParam.color = (m_gfx_ctrl & 0x0f00); - rozParam.incxx = (int16_t)m_roz_ctrl[0]; - rozParam.incxy = (int16_t)m_roz_ctrl[1]; - rozParam.incyx = (int16_t)m_roz_ctrl[2]; - rozParam.incyy = (int16_t)m_roz_ctrl[3]; - rozParam.startx = (int16_t)m_roz_ctrl[4]; - rozParam.starty = (int16_t)m_roz_ctrl[5]; - rozParam.size = 2048; - rozParam.wrap = 1; - - - switch( m_roz_ctrl[7] ) - { - case 0x4400: /* (2048x2048) */ - break; - - case 0x4488: /* attract mode */ - rozParam.wrap = 0; - break; - - case 0x44cc: /* stage1 demo */ - rozParam.wrap = 0; - break; - - case 0x44ee: /* (256x256) used in Dragon Saber */ - rozParam.wrap = 0; - rozParam.size = 256; - break; - } - - rozParam.startx <<= 4; - rozParam.starty <<= 4; - rozParam.startx += xoffset * rozParam.incxx + yoffset * rozParam.incyx; - rozParam.starty += xoffset * rozParam.incxy + yoffset * rozParam.incyy; - - rozParam.startx<<=8; - rozParam.starty<<=8; - rozParam.incxx<<=8; - rozParam.incxy<<=8; - rozParam.incyx<<=8; - rozParam.incyy<<=8; - - draw_roz_helper( screen, bitmap, m_tilemap_roz, cliprect, &rozParam ); -} - -WRITE16_MEMBER( namcos2_state::rozram_word_w ) -{ - COMBINE_DATA(&m_rozram[offset]); - m_tilemap_roz->mark_tile_dirty(offset); - //if( machine().input().code_pressed(KEYCODE_Q) ) - //{ - // machine().debug_break(); - //} -} - /**************************************************************************/ -READ8_MEMBER( namcos2_state::c116_r ) +READ8_MEMBER(namcos2_state::c116_r) { - if( (offset&0x1800) == 0x1800 ) + if ((offset & 0x1800) == 0x1800) { /* palette register */ offset &= 0x180f; @@ -300,17 +51,17 @@ READ8_MEMBER( namcos2_state::c116_r ) /* registers 6,7: unmapped? */ if (offset > 0x180b) return 0xff; // fix for finallap boot } - return m_c116->read(space,offset,mem_mask); + return m_c116->read(space, offset, mem_mask); } /**************************************************************************/ -void namcos2_state::draw_sprite_init() +void namcos2_state::create_shadow_table() { /* set table for sprite color == 0x0f */ - for( int i = 0; i<16*256; i++ ) + for (int i = 0; i < 16 * 256; i++) { - m_palette->shadow_table()[i] = i+0x2000; + m_palette->shadow_table()[i] = i + 0x2000; } } @@ -318,13 +69,10 @@ void namcos2_state::draw_sprite_init() void namcos2_state::video_start() { - c123_tilemap_init(2, memregion("gfx4")->base(), namcos2_shared_state::c123_tilemap_delegate(&namcos2_state::TilemapCB, this)); - m_tilemap_roz = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_state::roz_tile_info), this), TILEMAP_SCAN_ROWS, 8,8,256,256); - m_tilemap_roz->set_transparent_pen(0xff); - draw_sprite_init(); + create_shadow_table(); } -void namcos2_state::apply_clip( rectangle &clip, const rectangle &cliprect ) +void namcos2_state::apply_clip(rectangle &clip, const rectangle &cliprect) { clip.min_x = m_c116->get_reg(0) - 0x4a; clip.max_x = m_c116->get_reg(1) - 0x4a - 1; @@ -339,23 +87,26 @@ uint32_t namcos2_state::screen_update(screen_device &screen, bitmap_ind16 &bitma rectangle clip; int pri; - bitmap.fill(m_palette->black_pen(), cliprect ); - apply_clip( clip, cliprect ); + bitmap.fill(m_palette->black_pen(), cliprect); + apply_clip(clip, cliprect); /* HACK: enable ROZ layer only if it has priority > 0 */ - m_tilemap_roz->enable((m_gfx_ctrl & 0x7000) ? 1 : 0); + bool roz_enable = ((m_gfx_ctrl & 0x7000) ? true : false); - for( pri=0; pri<16; pri++ ) + for (pri = 0; pri < 16; pri++) { - if( (pri&1)==0 ) + if ((pri & 1) == 0) { - c123_tilemap_draw( screen, bitmap, clip, pri/2 ); + m_c123tmap->draw(screen, bitmap, clip, pri / 2); - if( ((m_gfx_ctrl & 0x7000) >> 12)==pri/2 ) + if (roz_enable) { - draw_roz(screen, bitmap,clip); + if (((m_gfx_ctrl & 0x7000) >> 12) == pri / 2) + { + m_ns2roz->draw_roz(screen, bitmap, clip, m_gfx_ctrl); + } } - draw_sprites(screen, bitmap, clip, pri/2, m_gfx_ctrl ); + m_ns2sprite->draw_sprites(screen, bitmap, clip, pri / 2, m_gfx_ctrl); } } return 0; @@ -365,14 +116,12 @@ uint32_t namcos2_state::screen_update(screen_device &screen, bitmap_ind16 &bitma void namcos2_state::video_start_finallap() { - c123_tilemap_init(2,memregion("gfx4")->base(),namcos2_shared_state::c123_tilemap_delegate(&namcos2_state::TilemapCB, this)); - draw_sprite_init(); + create_shadow_table(); } void namcos2_state::video_start_finalap2() { - c123_tilemap_init(2,memregion("gfx4")->base(),namcos2_shared_state::c123_tilemap_delegate(&namcos2_state::TilemapCB_finalap2, this)); - draw_sprite_init(); + create_shadow_table(); } uint32_t namcos2_state::screen_update_finallap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -380,17 +129,17 @@ uint32_t namcos2_state::screen_update_finallap(screen_device &screen, bitmap_ind rectangle clip; int pri; - bitmap.fill(m_palette->black_pen(), cliprect ); - apply_clip( clip, cliprect ); + bitmap.fill(m_palette->black_pen(), cliprect); + apply_clip(clip, cliprect); - for( pri=0; pri<16; pri++ ) + for (pri = 0; pri < 16; pri++) { - if( (pri&1)==0 ) + if ((pri & 1) == 0) { - c123_tilemap_draw( screen, bitmap, clip, pri/2 ); + m_c123tmap->draw(screen, bitmap, clip, pri / 2); } - m_c45_road->draw(bitmap,clip,pri); - draw_sprites(screen,bitmap,clip,pri,m_gfx_ctrl ); + m_c45_road->draw(bitmap, clip, pri); + m_ns2sprite->draw_sprites(screen, bitmap, clip, pri, m_gfx_ctrl); } return 0; } @@ -404,10 +153,10 @@ void namcos2_state::RozCB_luckywld(uint16_t code, int *tile, int *mask, int whic uint16_t mangle = bitswap<11>(code & 0x31ff, 13, 12, 8, 7, 6, 5, 4, 3, 2, 1, 0); switch ((code >> 9) & 7) { - case 0x00: mangle += 0x1c00; break; // Plus, NOT OR - case 0x01: mangle |= 0x0800; break; - case 0x02: mangle |= 0x0000; break; - default: break; + case 0x00: mangle += 0x1c00; break; // Plus, NOT OR + case 0x01: mangle |= 0x0800; break; + case 0x02: mangle |= 0x0000; break; + default: break; } *tile = mangle; @@ -415,12 +164,6 @@ void namcos2_state::RozCB_luckywld(uint16_t code, int *tile, int *mask, int whic void namcos2_state::video_start_luckywld() { - c123_tilemap_init(2,memregion("gfx4")->base(),namcos2_shared_state::c123_tilemap_delegate(&namcos2_state::TilemapCB, this)); - c355_obj_init( 0, 0x0, namcos2_shared_state::c355_obj_code2tile_delegate() ); - if( m_gametype==NAMCOS2_LUCKY_AND_WILD ) - { - c169_roz_init(1, "gfx5", namcos2_shared_state::c169_tilemap_delegate(&namcos2_state::RozCB_luckywld, this)); - } } uint32_t namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -428,21 +171,21 @@ uint32_t namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind rectangle clip; int pri; - bitmap.fill(m_palette->black_pen(), cliprect ); - apply_clip( clip, cliprect ); + bitmap.fill(m_palette->black_pen(), cliprect); + apply_clip(clip, cliprect); - for( pri=0; pri<16; pri++ ) + for (pri = 0; pri < 16; pri++) { - if( (pri&1)==0 ) - { - c123_tilemap_draw( screen, bitmap, clip, pri/2 ); - } - m_c45_road->draw(bitmap,clip,pri); - if( m_gametype==NAMCOS2_LUCKY_AND_WILD ) + if ((pri & 1) == 0) { - c169_roz_draw(screen, bitmap, clip, pri); + m_c123tmap->draw(screen, bitmap, clip, pri / 2); } - c355_obj_draw(screen, bitmap, clip, pri ); + m_c45_road->draw(bitmap, clip, pri); + + if (m_c169roz) + m_c169roz->draw(screen, bitmap, clip, pri); + + m_c355spr->draw(screen, bitmap, clip, pri); } return 0; } @@ -451,8 +194,6 @@ uint32_t namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind void namcos2_state::video_start_sgunner() { - c123_tilemap_init(2,memregion("gfx4")->base(),namcos2_shared_state::c123_tilemap_delegate(&namcos2_state::TilemapCB, this)); - c355_obj_init( 0, 0x0, namcos2_shared_state::c355_obj_code2tile_delegate() ); } uint32_t namcos2_state::screen_update_sgunner(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -460,13 +201,13 @@ uint32_t namcos2_state::screen_update_sgunner(screen_device &screen, bitmap_ind1 rectangle clip; int pri; - bitmap.fill(m_palette->black_pen(), cliprect ); - apply_clip( clip, cliprect ); + bitmap.fill(m_palette->black_pen(), cliprect); + apply_clip(clip, cliprect); - for( pri=0; pri<8; pri++ ) + for (pri = 0; pri < 8; pri++) { - c123_tilemap_draw( screen, bitmap, clip, pri ); - c355_obj_draw(screen, bitmap, clip, pri ); + m_c123tmap->draw(screen, bitmap, clip, pri); + m_c355spr->draw(screen, bitmap, clip, pri); } return 0; } @@ -482,8 +223,6 @@ void namcos2_state::RozCB_metlhawk(uint16_t code, int *tile, int *mask, int whic void namcos2_state::video_start_metlhawk() { - c123_tilemap_init(2,memregion("gfx4")->base(),namcos2_shared_state::c123_tilemap_delegate(&namcos2_state::TilemapCB, this)); - c169_roz_init(1, "gfx5", namcos2_shared_state::c169_tilemap_delegate(&namcos2_state::RozCB_metlhawk, this)); } uint32_t namcos2_state::screen_update_metlhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -491,17 +230,17 @@ uint32_t namcos2_state::screen_update_metlhawk(screen_device &screen, bitmap_ind rectangle clip; int pri; - bitmap.fill(m_palette->black_pen(), cliprect ); - apply_clip( clip, cliprect ); + bitmap.fill(m_palette->black_pen(), cliprect); + apply_clip(clip, cliprect); - for( pri=0; pri<16; pri++ ) + for (pri = 0; pri < 16; pri++) { - if( (pri&1)==0 ) + if ((pri & 1) == 0) { - c123_tilemap_draw( screen, bitmap, clip, pri/2 ); + m_c123tmap->draw(screen, bitmap, clip, pri / 2); } - c169_roz_draw(screen, bitmap, clip, pri); - draw_sprites_metalhawk(screen,bitmap,clip,pri ); + m_c169roz->draw(screen, bitmap, clip, pri); + m_ns2sprite->draw_sprites_metalhawk(screen, bitmap, clip, pri); } return 0; } diff --git a/src/mame/video/namcos21.cpp b/src/mame/video/namcos21.cpp index db10b9fe6ca..620f0a01445 100644 --- a/src/mame/video/namcos21.cpp +++ b/src/mame/video/namcos21.cpp @@ -27,9 +27,6 @@ Namco System 21 Video Hardware #include "emu.h" #include "includes/namcos21.h" -#include "machine/namcoic.h" - - #define FRAMEBUFFER_SIZE_IN_BYTES (sizeof(uint16_t)*NAMCOS21_POLY_FRAME_WIDTH*NAMCOS21_POLY_FRAME_HEIGHT) READ16_MEMBER(namcos21_state::winrun_gpu_color_r) @@ -368,10 +365,6 @@ VIDEO_START_MEMBER(namcos21_state,namcos21) m_maskram = std::make_unique<uint8_t[]>(0x80000); } allocate_poly_framebuffer(); - c355_obj_init( - 0, /* gfx bank */ - 0xf, /* reverse palette mapping */ - namcos2_shared_state::c355_obj_code2tile_delegate() ); } uint32_t namcos21_state::screen_update_namcos21(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -381,22 +374,22 @@ uint32_t namcos21_state::screen_update_namcos21(screen_device &screen, bitmap_in int pri; bitmap.fill(0xff, cliprect ); - c355_obj_draw(screen, bitmap, cliprect, 2 ); - //c355_obj_draw(screen, bitmap, cliprect, 14 ); //driver's eyes + m_c355spr->draw(screen, bitmap, cliprect, 2 ); + //draw(screen, bitmap, cliprect, 14 ); //driver's eyes copy_visible_poly_framebuffer(bitmap, cliprect, 0x7fc0, 0x7ffe); - c355_obj_draw(screen, bitmap, cliprect, 0 ); - c355_obj_draw(screen, bitmap, cliprect, 1 ); + m_c355spr->draw(screen, bitmap, cliprect, 0 ); + m_c355spr->draw(screen, bitmap, cliprect, 1 ); copy_visible_poly_framebuffer(bitmap, cliprect, 0, 0x7fbf); /* draw high priority 2d sprites */ for( pri=pivot; pri<8; pri++ ) { - c355_obj_draw(screen, bitmap, cliprect, pri ); + m_c355spr->draw(screen, bitmap, cliprect, pri ); } - // c355_obj_draw(screen, bitmap, cliprect, 15 ); //driver's eyes + // draw(screen, bitmap, cliprect, 15 ); //driver's eyes return 0; } @@ -407,20 +400,22 @@ uint32_t namcos21_state::screen_update_driveyes(screen_device &screen, bitmap_in int pri; bitmap.fill(0xff, cliprect ); - c355_obj_draw(screen, bitmap, cliprect, 2 ); - c355_obj_draw(screen, bitmap, cliprect, 14 ); //driver's eyes + m_c355spr->draw(screen, bitmap, cliprect, 2 ); + m_c355spr->draw(screen, bitmap, cliprect, 14 ); //driver's eyes copy_visible_poly_framebuffer(bitmap, cliprect, 0x7fc0, 0x7ffe); - c355_obj_draw(screen, bitmap, cliprect, 0 ); - c355_obj_draw(screen, bitmap, cliprect, 1 ); + m_c355spr->draw(screen, bitmap, cliprect, 0 ); + m_c355spr->draw(screen, bitmap, cliprect, 1 ); copy_visible_poly_framebuffer(bitmap, cliprect, 0, 0x7fbf); - for( pri=pivot; pri<8; pri++ ) - c355_obj_draw(screen, bitmap, cliprect, pri ); + for (pri = pivot; pri < 8; pri++) + { + m_c355spr->draw(screen, bitmap, cliprect, pri); + } - c355_obj_draw(screen, bitmap, cliprect, 15 ); //driver's eyes + m_c355spr->draw(screen, bitmap, cliprect, 15 ); //driver's eyes return 0; diff --git a/src/mame/video/namcos2_roz.cpp b/src/mame/video/namcos2_roz.cpp new file mode 100644 index 00000000000..cd5ff202775 --- /dev/null +++ b/src/mame/video/namcos2_roz.cpp @@ -0,0 +1,282 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood, Phil Stroffolino + +/* + Namco System 2 ROZ Tilemap - found on Namco System 2 video board (standard type) + + based on namcoic.txt this probably consists of the following + C102 - Controls CPU access to ROZ Memory Area. + (anything else?) + + used by the following drivers + namcos2.cpp (all games EXCEPT Final Lap 1,2,3 , Lucky & Wild , Steel Gunner 1,2 , Suzuka 8 Hours 1,2 , Metal Hawk) + + +*/ + +#include "emu.h" +#include "namcos2_roz.h" + +DEFINE_DEVICE_TYPE(NAMCOS2_ROZ, namcos2_roz_device, "namcos2_roz", "Namco Sysem 2 ROZ (C102)") + +namcos2_roz_device::namcos2_roz_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, NAMCOS2_ROZ, tag, owner, clock), + m_rozram(*this, finder_base::DUMMY_TAG), + m_roz_ctrl(*this, finder_base::DUMMY_TAG), + m_gfxdecode(*this, finder_base::DUMMY_TAG), + m_palette(*this, finder_base::DUMMY_TAG) +{ +} + +void namcos2_roz_device::device_start() +{ + m_tilemap_roz = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_roz_device::roz_tile_info), this), TILEMAP_SCAN_ROWS, 8, 8, 256, 256); + m_tilemap_roz->set_transparent_pen(0xff); +} + + +TILE_GET_INFO_MEMBER(namcos2_roz_device::roz_tile_info) +{ + int tile = m_rozram[tile_index]; + SET_TILE_INFO_MEMBER(3, tile, 0/*color*/, 0); +} + +struct roz_param +{ + uint32_t size; + uint32_t startx, starty; + int incxx, incxy, incyx, incyy; + int color; + int wrap; +}; + +static inline void +draw_roz_helper_block(const struct roz_param *rozInfo, int destx, int desty, + int srcx, int srcy, int width, int height, + bitmap_ind16 &destbitmap, bitmap_ind8 &flagsbitmap, + bitmap_ind16 &srcbitmap, uint32_t size_mask) +{ + int desty_end = desty + height; + + int end_incrx = rozInfo->incyx - (width * rozInfo->incxx); + int end_incry = rozInfo->incyy - (width * rozInfo->incxy); + + uint16_t *dest = &destbitmap.pix16(desty, destx); + int dest_rowinc = destbitmap.rowpixels() - width; + + while (desty < desty_end) + { + uint16_t *dest_end = dest + width; + while (dest < dest_end) + { + uint32_t xpos = (srcx >> 16); + uint32_t ypos = (srcy >> 16); + + if (rozInfo->wrap) + { + xpos &= size_mask; + ypos &= size_mask; + } + else if ((xpos > rozInfo->size) || (ypos >= rozInfo->size)) + { + goto L_SkipPixel; + } + + if (flagsbitmap.pix8(ypos, xpos) & TILEMAP_PIXEL_LAYER0) + { + *dest = srcbitmap.pix16(ypos, xpos) + rozInfo->color; + } + + L_SkipPixel: + + srcx += rozInfo->incxx; + srcy += rozInfo->incxy; + dest++; + } + srcx += end_incrx; + srcy += end_incry; + dest += dest_rowinc; + desty++; + } +} + +static void +draw_roz_helper( + screen_device &screen, + bitmap_ind16 &bitmap, + tilemap_t *tmap, + const rectangle &clip, + const struct roz_param *rozInfo) +{ + tmap->set_palette_offset(rozInfo->color); + + if (bitmap.bpp() == 16) + { + /* On many processors, the simple approach of an outer loop over the + rows of the destination bitmap with an inner loop over the columns + of the destination bitmap has poor performance due to the order + that memory in the source bitmap is referenced when rotation + approaches 90 or 270 degrees. The reason is that the inner loop + ends up reading pixels not sequentially in the source bitmap, but + instead at rozInfo->incxx increments, which is at its maximum at 90 + degrees of rotation. This means that only a few (or as few as + one) source pixels are in each cache line at a time. + + Instead of the above, this code iterates in NxN blocks through the + destination bitmap. This has more overhead when there is little or + no rotation, but much better performance when there is closer to 90 + degrees of rotation (as long as the chunk of the source bitmap that + corresponds to an NxN destination block fits in cache!). + + N is defined by ROZ_BLOCK_SIZE below; the best N is one that is as + big as possible but at the same time not too big to prevent all of + the source bitmap pixels from fitting into cache at the same time. + Keep in mind that the block of source pixels used can be somewhat + scattered in memory. 8x8 works well on the few processors that + were tested; 16x16 seems to work even better for more modern + processors with larger caches, but since 8x8 works well enough and + is less likely to result in cache misses on processors with smaller + caches, it is used. + */ + +#define ROZ_BLOCK_SIZE 8 + + uint32_t size_mask = rozInfo->size - 1; + bitmap_ind16 &srcbitmap = tmap->pixmap(); + bitmap_ind8 &flagsbitmap = tmap->flagsmap(); + uint32_t srcx = (rozInfo->startx + (clip.min_x * rozInfo->incxx) + + (clip.min_y * rozInfo->incyx)); + uint32_t srcy = (rozInfo->starty + (clip.min_x * rozInfo->incxy) + + (clip.min_y * rozInfo->incyy)); + int destx = clip.min_x; + int desty = clip.min_y; + + int row_count = (clip.max_y - desty) + 1; + int row_block_count = row_count / ROZ_BLOCK_SIZE; + int row_extra_count = row_count % ROZ_BLOCK_SIZE; + + int column_count = (clip.max_x - destx) + 1; + int column_block_count = column_count / ROZ_BLOCK_SIZE; + int column_extra_count = column_count % ROZ_BLOCK_SIZE; + + int row_block_size_incxx = ROZ_BLOCK_SIZE * rozInfo->incxx; + int row_block_size_incxy = ROZ_BLOCK_SIZE * rozInfo->incxy; + int row_block_size_incyx = ROZ_BLOCK_SIZE * rozInfo->incyx; + int row_block_size_incyy = ROZ_BLOCK_SIZE * rozInfo->incyy; + + int i, j; + + // Do the block rows + for (i = 0; i < row_block_count; i++) + { + int sx = srcx; + int sy = srcy; + int dx = destx; + // Do the block columns + for (j = 0; j < column_block_count; j++) + { + draw_roz_helper_block(rozInfo, dx, desty, sx, sy, ROZ_BLOCK_SIZE, + ROZ_BLOCK_SIZE, bitmap, flagsbitmap, srcbitmap, size_mask); + // Increment to the next block column + sx += row_block_size_incxx; + sy += row_block_size_incxy; + dx += ROZ_BLOCK_SIZE; + } + // Do the extra columns + if (column_extra_count) + { + draw_roz_helper_block(rozInfo, dx, desty, sx, sy, column_extra_count, + ROZ_BLOCK_SIZE, bitmap, flagsbitmap, srcbitmap, size_mask); + } + // Increment to the next row block + srcx += row_block_size_incyx; + srcy += row_block_size_incyy; + desty += ROZ_BLOCK_SIZE; + } + // Do the extra rows + if (row_extra_count) + { + // Do the block columns + for (i = 0; i < column_block_count; i++) + { + draw_roz_helper_block(rozInfo, destx, desty, srcx, srcy, ROZ_BLOCK_SIZE, + row_extra_count, bitmap, flagsbitmap, srcbitmap, size_mask); + srcx += row_block_size_incxx; + srcy += row_block_size_incxy; + destx += ROZ_BLOCK_SIZE; + } + // Do the extra columns + if (column_extra_count) + { + draw_roz_helper_block(rozInfo, destx, desty, srcx, srcy, column_extra_count, + row_extra_count, bitmap, flagsbitmap, srcbitmap, size_mask); + } + } + } + else + { + tmap->draw_roz(screen, + bitmap, clip, + rozInfo->startx, rozInfo->starty, + rozInfo->incxx, rozInfo->incxy, + rozInfo->incyx, rozInfo->incyy, + rozInfo->wrap, 0, 0); // wrap, flags, pri + } +} + +void namcos2_roz_device::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint16_t gfx_ctrl) +{ + const int xoffset = 38, yoffset = 0; + struct roz_param rozParam; + + rozParam.color = (gfx_ctrl & 0x0f00); + rozParam.incxx = (int16_t)m_roz_ctrl[0]; + rozParam.incxy = (int16_t)m_roz_ctrl[1]; + rozParam.incyx = (int16_t)m_roz_ctrl[2]; + rozParam.incyy = (int16_t)m_roz_ctrl[3]; + rozParam.startx = (int16_t)m_roz_ctrl[4]; + rozParam.starty = (int16_t)m_roz_ctrl[5]; + rozParam.size = 2048; + rozParam.wrap = 1; + + + switch (m_roz_ctrl[7]) + { + case 0x4400: /* (2048x2048) */ + break; + + case 0x4488: /* attract mode */ + rozParam.wrap = 0; + break; + + case 0x44cc: /* stage1 demo */ + rozParam.wrap = 0; + break; + + case 0x44ee: /* (256x256) used in Dragon Saber */ + rozParam.wrap = 0; + rozParam.size = 256; + break; + } + + rozParam.startx <<= 4; + rozParam.starty <<= 4; + rozParam.startx += xoffset * rozParam.incxx + yoffset * rozParam.incyx; + rozParam.starty += xoffset * rozParam.incxy + yoffset * rozParam.incyy; + + rozParam.startx <<= 8; + rozParam.starty <<= 8; + rozParam.incxx <<= 8; + rozParam.incxy <<= 8; + rozParam.incyx <<= 8; + rozParam.incyy <<= 8; + + draw_roz_helper(screen, bitmap, m_tilemap_roz, cliprect, &rozParam); +} + +WRITE16_MEMBER(namcos2_roz_device::rozram_word_w) +{ + COMBINE_DATA(&m_rozram[offset]); + m_tilemap_roz->mark_tile_dirty(offset); +} + diff --git a/src/mame/video/namcos2_roz.h b/src/mame/video/namcos2_roz.h new file mode 100644 index 00000000000..7fcce11f708 --- /dev/null +++ b/src/mame/video/namcos2_roz.h @@ -0,0 +1,50 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +#ifndef MAME_VIDEO_NAMCOS2_ROZ_H +#define MAME_VIDEO_NAMCOS2_ROZ_H + +#pragma once + +#include "screen.h" +#include "emupal.h" + + +class namcos2_roz_device : public device_t +{ +public: + // construction/destruction + namcos2_roz_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + template <typename T> void set_rozram_tag(T &&tag) { m_rozram.set_tag(std::forward<T>(tag)); } + template <typename T> void set_rozctrl_tag(T &&tag) { m_roz_ctrl.set_tag(std::forward<T>(tag)); } + template <typename T> void set_palette_tag(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); } + template <typename T> void set_gfxdecode_tag(T &&tag) { m_gfxdecode.set_tag(std::forward<T>(tag)); } + + DECLARE_WRITE16_MEMBER( rozram_word_w ); + + void draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint16_t gfx_ctrl); + +protected: + // device-level overrides + virtual void device_start() override; + +private: + // general + void zdrawgfxzoom(screen_device &screen, bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos); + void zdrawgfxzoom(screen_device &screen, bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos); + + TILE_GET_INFO_MEMBER( roz_tile_info ); + tilemap_t *m_tilemap_roz; + + required_shared_ptr<uint16_t> m_rozram; + required_shared_ptr<uint16_t> m_roz_ctrl; + required_device<gfxdecode_device> m_gfxdecode; + required_device<palette_device> m_palette; +}; + +// device type definition +DECLARE_DEVICE_TYPE(NAMCOS2_ROZ, namcos2_roz_device) + +#endif // MAME_VIDEO_NAMCOS2_ROZ_H + diff --git a/src/mame/video/namcos2_sprite.cpp b/src/mame/video/namcos2_sprite.cpp new file mode 100644 index 00000000000..3bca708fef1 --- /dev/null +++ b/src/mame/video/namcos2_sprite.cpp @@ -0,0 +1,378 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood, Phil Stroffolino + +/* + Namco System 2 Sprites - found on Namco System 2 video board (standard type) + + based on namcoic.txt this probably consists of the following + C106 - Generates memory output clocks to generate X-Axis Zoom for Line Buffer Writes + C134 - Object Memory Address Generator. Sequences the sprite memory contents to the hardware. + C135 - Checks is object is displayed on Current output line. + C146 - Steers the Decode Object Pixel data to the correct line buffer A or B + + Metal Hawk requires a different draw function, so might use a different chip unless the hookup is just scrambled (needs checking) + + used by the following drivers + namcos2.cpp (all games EXCEPT Steel Gunner, Steel Gunner 2, Lucky & Wild, Suzuka 8 Hours, Suzuka 8 Hours 2 which use the newer Namco NB1 style sprites, see namco_c355spr.cpp) + + +*/ + +#include "emu.h" +#include "namcos2_sprite.h" + +DEFINE_DEVICE_TYPE(NAMCOS2_SPRITE, namcos2_sprite_device, "namcos2_sprite", "Namco System 2 Sprites (C106,C134,C135,C146)") + +namcos2_sprite_device::namcos2_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, NAMCOS2_SPRITE, tag, owner, clock), + m_gfxdecode(*this, finder_base::DUMMY_TAG), + m_palette(*this, finder_base::DUMMY_TAG), + m_spriteram(*this, finder_base::DUMMY_TAG) +{ +} + +void namcos2_sprite_device::device_start() +{ +} + +/**************************************************************************************/ + +/**************************************************************************************/ + +void namcos2_sprite_device::zdrawgfxzoom( + screen_device &screen, + bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx, + uint32_t code,uint32_t color,int flipx,int flipy,int sx,int sy, + int scalex, int scaley, int zpos ) +{ + if (!scalex || !scaley) return; + if (dest_bmp.bpp() == 16) + { + if( gfx ) + { + int shadow_offset = (m_palette->shadows_enabled())?m_palette->entries():0; + const pen_t *pal = &m_palette->pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors())); + const uint8_t *source_base = gfx->get_data(code % gfx->elements()); + int sprite_screen_height = (scaley*gfx->height()+0x8000)>>16; + int sprite_screen_width = (scalex*gfx->width()+0x8000)>>16; + if (sprite_screen_width && sprite_screen_height) + { + /* compute sprite increment per screen pixel */ + int dx = (gfx->width()<<16)/sprite_screen_width; + int dy = (gfx->height()<<16)/sprite_screen_height; + + int ex = sx+sprite_screen_width; + int ey = sy+sprite_screen_height; + + int x_index_base; + int y_index; + + if( flipx ) + { + x_index_base = (sprite_screen_width-1)*dx; + dx = -dx; + } + else + { + x_index_base = 0; + } + + if( flipy ) + { + y_index = (sprite_screen_height-1)*dy; + dy = -dy; + } + else + { + y_index = 0; + } + + if( sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < clip.min_y ) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + if( ex > clip.max_x+1 ) + { /* clip right */ + int pixels = ex-clip.max_x-1; + ex -= pixels; + } + if( ey > clip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-clip.max_y-1; + ey -= pixels; + } + + if( ex>sx ) + { /* skip if inner loop doesn't draw anything */ + int y; + bitmap_ind8 &priority_bitmap = screen.priority(); + if( priority_bitmap.valid() ) + { + for( y=sy; y<ey; y++ ) + { + const uint8_t *source = source_base + (y_index>>16) * gfx->rowbytes(); + uint16_t *dest = &dest_bmp.pix16(y); + uint8_t *pri = &priority_bitmap.pix8(y); + int x, x_index = x_index_base; + /* this code was previously shared with the c355 where this was needed + if( m_palxor ) + { + for( x=sx; x<ex; x++ ) + { + int c = source[x_index>>16]; + if( c != 0xff ) + { + if( pri[x]<=zpos ) + { + switch( c ) + { + case 0: + dest[x] = 0x4000|(dest[x]&0x1fff); + break; + case 1: + dest[x] = 0x6000|(dest[x]&0x1fff); + break; + default: + dest[x] = pal[c]; + break; + } + pri[x] = zpos; + } + } + x_index += dx; + } + y_index += dy; + } + else + */ + { + for( x=sx; x<ex; x++ ) + { + int c = source[x_index>>16]; + if( c != 0xff ) + { + if( pri[x]<=zpos ) + { + if( color == 0xf && c==0xfe && shadow_offset ) + { + dest[x] |= shadow_offset; + } + else + { + dest[x] = pal[c]; + } + pri[x] = zpos; + } + } + x_index += dx; + } + y_index += dy; + } + } + } + } + } + } + } +} /* zdrawgfxzoom */ + +void namcos2_sprite_device::zdrawgfxzoom( + screen_device &screen, + bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx, + uint32_t code,uint32_t color,int flipx,int flipy,int sx,int sy, + int scalex, int scaley, int zpos ) +{ + /* nop */ +} + +void namcos2_sprite_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, int control ) +{ + int offset = (control & 0x000f) * (128*4); + int loop; + if( pri==0 ) + { + screen.priority().fill(0, cliprect ); + } + for( loop=0; loop < 128; loop++ ) + { + /**************************************** + * word#0 + * Sprite Y position D00-D08 + * Sprite Size 16/32 D09 + * Sprite Size Y D10-D15 + * + * word#1 + * Sprite Quadrant D00-D01 + * Sprite Number D02-D12 + * Sprite ROM Bank select D13 + * Sprite flip X D14 + * Sprite flip Y D15 + * + * word#2 + * Sprite X position D00-D10 + * + * word#3 + * Sprite priority D00-D02 + * Sprite colour index D04-D07 + * Sprite Size X D10-D15 + */ + int word3 = m_spriteram[offset+(loop*4)+3]; + if( (word3&0xf)==pri ) + { + int word0 = m_spriteram[offset+(loop*4)+0]; + int word1 = m_spriteram[offset+(loop*4)+1]; + int offset4 = m_spriteram[offset+(loop*4)+2]; + + int sizey=((word0>>10)&0x3f)+1; + int sizex=(word3>>10)&0x3f; + + if((word0&0x0200)==0) sizex>>=1; + + if((sizey-1) && sizex ) + { + int color = (word3>>4)&0x000f; + int sprn = (word1>>2)&0x7ff; + int rgn = (word1&0x2000)?1:0; + int ypos = (0x1ff-(word0&0x01ff))-0x50+0x02; + int xpos = (offset4&0x03ff)-0x50+0x07; + int flipy = word1&0x8000; + int flipx = word1&0x4000; + int scalex = (sizex<<16)/((word0&0x0200)?0x20:0x10); + int scaley = (sizey<<16)/((word0&0x0200)?0x20:0x10); + if(scalex && scaley) + { + gfx_element *gfx = m_gfxdecode->gfx(rgn); + + if( (word0&0x0200)==0 ) + gfx->set_source_clip((word1&0x0001) ? 16 : 0, 16, (word1&0x0002) ? 16 : 0, 16); + else + gfx->set_source_clip(0, 32, 0, 32); + + zdrawgfxzoom( + screen, + bitmap, + cliprect, + gfx, + sprn, + color, + flipx,flipy, + xpos,ypos, + scalex,scaley, + loop ); + } + } + } + } +} /* namcos2_draw_sprites */ + +void namcos2_sprite_device::draw_sprites_metalhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) +{ + /** + * word#0 + * xxxxxx---------- ysize + * ------x--------- sprite tile size + * -------xxxxxxxxx screeny + * + * word#1 + * --x------------- bank + * ----xxxxxxxxxxxx tile + * + * word#2 (unused) + * + * word#3 + * xxxxxx---------- xsize + * ------xxxxxxxxxx screenx + * + * word#4 (unused) + * word#5 (unused) + * + * word#6 (orientation) + * ---------------x rot90 + * --------------x- flipx + * -------------x-- flipy + * ------------x--- tile size + * + * word#7 + * ------------xxxx priority + * --------xxxx---- color + * x--------------- unknown + */ + const uint16_t *pSource = m_spriteram; + int loop; + if( pri==0 ) + { + screen.priority().fill(0, cliprect ); + } + for( loop=0; loop < 128; loop++ ) + { + int ypos = pSource[0]; + int tile = pSource[1]; + int xpos = pSource[3]; + int flags = pSource[6]; + int attrs = pSource[7]; + int sizey = ((ypos>>10)&0x3f)+1; + int sizex = (xpos>>10)&0x3f; + int sprn = (tile>>2)&0x7ff; + + if( tile&0x2000 ) + { + sprn&=0x3ff; + } + else + { + sprn|=0x400; + } + + if( (sizey-1) && sizex && (attrs&0xf)==pri ) + { + int bBigSprite = (flags&8); + int color = (attrs>>4)&0xf; + int sx = (xpos&0x03ff)-0x50+0x07; + int sy = (0x1ff-(ypos&0x01ff))-0x50+0x02; + int flipx = flags&2; + int flipy = flags&4; + int scalex = (sizex<<16)/(0x20);//(sizex<<16)/(bBigSprite?0x20:0x10); correct formula? + int scaley = (sizey<<16)/(bBigSprite?0x20:0x10); + + /* swap xy */ + int rgn = (flags&0x01) ? 3 : 0; + + gfx_element *gfx = m_gfxdecode->gfx(rgn); + + if( bBigSprite ) + { + if( sizex < 0x20 ) + { + sx -= (0x20-sizex)/0x8; + } + if( sizey < 0x20 ) + { + sy += (0x20-sizey)/0xC; + } + gfx->set_source_clip(0, 32, 0, 32); + } + else + gfx->set_source_clip((tile&0x0001) ? 16 : 0, 16, (tile&0x0002) ? 16 : 0, 16); + + zdrawgfxzoom( + screen, + bitmap, + cliprect, + gfx, + sprn, color, + flipx,flipy, + sx,sy, + scalex, scaley, + loop ); + } + pSource += 8; + } +} /* namcos2_draw_sprites_metalhawk */ diff --git a/src/mame/video/namcos2_sprite.h b/src/mame/video/namcos2_sprite.h new file mode 100644 index 00000000000..ccbe4b1d806 --- /dev/null +++ b/src/mame/video/namcos2_sprite.h @@ -0,0 +1,44 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +#ifndef MAME_VIDEO_NAMCOS2_SPRITE_H +#define MAME_VIDEO_NAMCOS2_SPRITE_H + +#pragma once + +#include "screen.h" +#include "emupal.h" + +class namcos2_sprite_device : public device_t +{ +public: + // construction/destruction + namcos2_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + template <typename T> void set_palette_tag(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); } + template <typename T> void set_gfxdecode_tag(T &&tag) { m_gfxdecode.set_tag(std::forward<T>(tag)); } + template <typename T> void set_spriteram_tag(T &&tag) { m_spriteram.set_tag(std::forward<T>(tag)); } + + void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, int control ); + void draw_sprites_metalhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ); + +protected: + // device-level overrides + virtual void device_start() override; + +private: + // general + void zdrawgfxzoom(screen_device &screen, bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos); + void zdrawgfxzoom(screen_device &screen, bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos); + + required_device<gfxdecode_device> m_gfxdecode; + required_device<palette_device> m_palette; + + required_shared_ptr<uint16_t> m_spriteram; +}; + +// device type definition +DECLARE_DEVICE_TYPE(NAMCOS2_SPRITE, namcos2_sprite_device) + +#endif // MAME_VIDEO_NAMCOS2_SPRITE_H + diff --git a/src/mame/video/pacland.cpp b/src/mame/video/pacland.cpp index fd15ffb737a..47100e83e06 100644 --- a/src/mame/video/pacland.cpp +++ b/src/mame/video/pacland.cpp @@ -122,7 +122,7 @@ PALETTE_INIT_MEMBER(pacland_state, pacland) int palentry; /* start with no transparency */ - m_transmask[0][i] = m_transmask[1][i] = m_transmask[2][i] = 0; + m_transmask[0][i] = m_transmask[1][i] = m_transmask[2][i] = 0; /* iterate over all palette entries except the last one */ for (palentry = 0; palentry < 0x100; palentry++) @@ -189,8 +189,7 @@ TILE_GET_INFO_MEMBER(pacland_state::get_fg_tile_info) void pacland_state::video_start() { - m_screen->register_screen_bitmap(m_sprite1_bitmap); - m_screen->register_screen_bitmap(m_sprite2_bitmap); + m_screen->register_screen_bitmap(m_sprite_bitmap); m_screen->register_screen_bitmap(m_fg_bitmap); m_fg_bitmap.fill(0xffff); @@ -380,32 +379,30 @@ uint32_t pacland_state::screen_update(screen_device &screen, bitmap_ind16 &bitma draw_fg(screen, bitmap, cliprect, 0); /* draw sprites with regular transparency */ - m_sprite1_bitmap.fill(0, cliprect); - draw_sprites(screen, m_sprite1_bitmap, cliprect, flip, 1); - copybitmap_trans(bitmap, m_sprite1_bitmap, 0, 0, 0, 0, cliprect, 0); + draw_sprites(screen, bitmap, cliprect, flip, 1); - /* draw high priority fg tiles */ - draw_fg(screen, bitmap, cliprect, 1); - - /* draw sprite pixels with colortable values >= 0xf0, which have priority over all fg tiles */ - m_sprite2_bitmap.fill(0, cliprect); - draw_sprites(screen, m_sprite2_bitmap, cliprect, flip, 2); + /* draw sprite pixels in a temporary bitmap with colortable values >= 0xf0 */ + m_sprite_bitmap.fill(0, cliprect); + draw_sprites(screen, m_sprite_bitmap, cliprect, flip, 2); for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { - uint16_t *src1 = &m_sprite1_bitmap.pix16(y); - uint16_t *src2 = &m_sprite2_bitmap.pix16(y); - uint16_t *dst = &bitmap.pix16(y); - + uint16_t *spr = &m_sprite_bitmap.pix16(y); + uint16_t *bmp = &bitmap.pix16(y); for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { - /* only copy if "m_sprite1_bitmap" and "m_sprite2_bitmap" are same value, - because not redraw pixels that are not visible in "m_sprite1_bitmap" */ - uint16_t pix1 = src1[x]; - uint16_t pix2 = src2[x]; - if (pix2 != 0 && dst[x] < 0x800 && pix1 == pix2) - dst[x] = pix2; + /* clear to 0 if "m_sprite_bitmap" and "bitmap" are different, + because not redraw pixels that are not visible in "bitmap" + in this way, keep sprite-sprite priorities intact */ + if (spr[x] != 0 && spr[x] != bmp[x]) + spr[x] = 0; } } + /* draw high priority fg tiles */ + draw_fg(screen, bitmap, cliprect, 1); + + /* draw sprite pixels with colortable values >= 0xf0, which have priority over everything */ + copybitmap_trans(bitmap, m_sprite_bitmap, 0, 0, 0, 0, cliprect, 0); + return 0; } diff --git a/src/mame/video/pc8401a.cpp b/src/mame/video/pc8401a.cpp index 8a497d2e503..ec0c57d3f41 100644 --- a/src/mame/video/pc8401a.cpp +++ b/src/mame/video/pc8401a.cpp @@ -72,7 +72,9 @@ MACHINE_CONFIG_START(pc8401a_state::pc8401a_video) MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 128-1) MCFG_SCREEN_PALETTE("palette") - MCFG_SED1330_ADD(SED1330_TAG, 0, SCREEN_TAG, pc8401a_lcdc) + SED1330(config, m_lcdc, 0); + m_lcdc->set_screen(SCREEN_TAG); + m_lcdc->set_addrmap(0, &pc8401a_state::pc8401a_lcdc); MACHINE_CONFIG_END MACHINE_CONFIG_START(pc8500_state::pc8500_video) @@ -89,7 +91,9 @@ MACHINE_CONFIG_START(pc8500_state::pc8500_video) MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 200-1) MCFG_SCREEN_PALETTE("palette") - MCFG_SED1330_ADD(SED1330_TAG, 0, SCREEN_TAG, pc8500_lcdc) + SED1330(config, m_lcdc, 0); + m_lcdc->set_screen(SCREEN_TAG); + m_lcdc->set_addrmap(0, &pc8500_state::pc8500_lcdc); /* PC-8441A CRT */ MCFG_SCREEN_ADD(CRT_SCREEN_TAG, RASTER) diff --git a/src/mame/video/pcd.cpp b/src/mame/video/pcd.cpp index 288de3ae925..003ad8ca1b8 100644 --- a/src/mame/video/pcd.cpp +++ b/src/mame/video/pcd.cpp @@ -17,13 +17,13 @@ pcdx_video_device::pcdx_video_device(const machine_config &mconfig, device_type device_gfx_interface(mconfig, *this, nullptr, "palette"), m_maincpu(*this, ":maincpu"), m_mcu(*this, "graphics"), - m_crtc(*this, "crtc"), m_pic2(*this, ":pic2") { } pcd_video_device::pcd_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : pcdx_video_device(mconfig, PCD_VIDEO, tag, owner, clock), + m_crtc(*this, "crtc"), m_mouse_btn(*this, "MOUSE"), m_mouse_x(*this, "MOUSEX"), m_mouse_y(*this, "MOUSEY"), @@ -35,6 +35,7 @@ pcd_video_device::pcd_video_device(const machine_config &mconfig, const char *ta pcx_video_device::pcx_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : pcdx_video_device(mconfig, PCX_VIDEO, tag, owner, clock), device_serial_interface(mconfig, *this), + m_crtc(*this, "crtc"), m_vram(4*1024), m_charrom(*this, "char"), m_txd_handler(*this) @@ -100,25 +101,24 @@ ioport_constructor pcd_video_device::device_input_ports() const } MACHINE_CONFIG_START(pcd_video_device::device_add_mconfig) - MCFG_DEVICE_ADD("graphics", I8741, XTAL(16'000'000)/2) + MCFG_DEVICE_ADD("graphics", I8741, 16_MHz_XTAL / 2) MCFG_MCS48_PORT_P1_IN_CB(READ8(*this, pcd_video_device, p1_r)) MCFG_MCS48_PORT_P2_OUT_CB(WRITE8(*this, pcd_video_device, p2_w)) MCFG_MCS48_PORT_T1_IN_CB(READLINE(*this, pcd_video_device, t1_r)) // video hardware - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_SIZE(640, 350) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 349) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_UPDATE_DEVICE("crtc", scn2674_device, screen_update) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(16_MHz_XTAL, 832, 0, 640, 381, 0, 350); + screen.set_screen_update("crtc", FUNC(scn2674_device::screen_update)); MCFG_PALETTE_ADD("palette", 3) MCFG_PALETTE_INIT_OWNER(pcdx_video_device, pcdx) - MCFG_DEVICE_ADD("crtc", SCN2674, 0) - MCFG_SCN2674_CHARACTER_WIDTH(16) - MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(pcd_video_device, display_pixels) - MCFG_VIDEO_SET_SCREEN("screen") + SCN2674(config, m_crtc, 16_MHz_XTAL / 16); + m_crtc->set_character_width(16); + m_crtc->set_display_callback(FUNC(pcd_video_device::display_pixels)); + m_crtc->set_screen("screen"); + MCFG_TIMER_DRIVER_ADD_PERIODIC("mouse_timer", pcd_video_device, mouse_timer, attotime::from_hz(15000)) // guess MACHINE_CONFIG_END @@ -129,7 +129,7 @@ void pcx_video_device::pcx_vid_map(address_map &map) void pcx_video_device::pcx_vid_io(address_map &map) { - map(0x8000, 0x8007).rw("crtc", FUNC(scn2674_device::read), FUNC(scn2674_device::write)); + map(0x8000, 0x8007).rw("crtc", FUNC(scn2672_device::read), FUNC(scn2672_device::write)); map(0x8008, 0x8008).r(FUNC(pcx_video_device::unk_r)); map(0xa000, 0xa001).rw(FUNC(pcx_video_device::vram_latch_r), FUNC(pcx_video_device::vram_latch_w)); map(0xa002, 0xa003).rw(FUNC(pcx_video_device::term_mcu_r), FUNC(pcx_video_device::term_mcu_w)); @@ -142,7 +142,7 @@ void pcx_video_device::pcx_vram(address_map &map) } MACHINE_CONFIG_START(pcx_video_device::device_add_mconfig) - MCFG_DEVICE_ADD("graphics", I8031, XTAL(24'000'000)/2) + MCFG_DEVICE_ADD("graphics", I8031, 24_MHz_XTAL / 2) MCFG_DEVICE_PROGRAM_MAP(pcx_vid_map) MCFG_DEVICE_IO_MAP(pcx_vid_io) MCFG_MCS51_PORT_P1_OUT_CB(WRITE8(*this, pcx_video_device, p1_w)) @@ -150,20 +150,18 @@ MACHINE_CONFIG_START(pcx_video_device::device_add_mconfig) MCFG_MCS51_SERIAL_RX_CB(READ8(*this, pcx_video_device, rx_callback)) // video hardware - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_SIZE(640, 350) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 349) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_UPDATE_DEVICE("crtc", scn2674_device, screen_update) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(24_MHz_XTAL, 1272, 0, 960, 381, 0, 350); + screen.set_screen_update("crtc", FUNC(scn2672_device::screen_update)); MCFG_PALETTE_ADD_MONOCHROME("palette") - MCFG_DEVICE_ADD("crtc", SCN2674, 0) - MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("graphics", MCS51_INT0_LINE)) - MCFG_SCN2674_CHARACTER_WIDTH(16) - MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(pcx_video_device, display_pixels) - MCFG_VIDEO_SET_SCREEN("screen") - MCFG_DEVICE_ADDRESS_MAP(0, pcx_vram) + SCN2672(config, m_crtc, 24_MHz_XTAL / 12); // used with SCB2673B + m_crtc->intr_callback().set_inputline("graphics", MCS51_INT0_LINE); + m_crtc->set_character_width(12); + m_crtc->set_display_callback(FUNC(pcx_video_device::display_pixels)); + m_crtc->set_screen("screen"); + m_crtc->set_addrmap(0, &pcx_video_device::pcx_vram); MACHINE_CONFIG_END @@ -211,7 +209,7 @@ SCN2674_DRAW_CHARACTER_MEMBER(pcd_video_device::display_pixels) } } -SCN2674_DRAW_CHARACTER_MEMBER(pcx_video_device::display_pixels) +SCN2672_DRAW_CHARACTER_MEMBER(pcx_video_device::display_pixels) { uint8_t data; address <<= 1; diff --git a/src/mame/video/pcd.h b/src/mame/video/pcd.h index 8d874d5cbf8..1c92a66512b 100644 --- a/src/mame/video/pcd.h +++ b/src/mame/video/pcd.h @@ -30,7 +30,6 @@ protected: required_device<cpu_device> m_maincpu; required_device<cpu_device> m_mcu; - required_device<scn2674_device> m_crtc; required_device<pic8259_device> m_pic2; }; @@ -52,6 +51,7 @@ protected: virtual ioport_constructor device_input_ports() const override; private: + required_device<scn2674_device> m_crtc; required_ioport m_mouse_btn; required_ioport m_mouse_x; required_ioport m_mouse_y; @@ -113,6 +113,8 @@ protected: void rcv_complete() override; private: + required_device<scn2672_device> m_crtc; + std::vector<uint8_t> m_vram; required_region_ptr<uint8_t> m_charrom; devcb_write_line m_txd_handler; @@ -121,7 +123,7 @@ private: DECLARE_READ8_MEMBER(rx_callback); DECLARE_WRITE8_MEMBER(tx_callback); - SCN2674_DRAW_CHARACTER_MEMBER(display_pixels); + SCN2672_DRAW_CHARACTER_MEMBER(display_pixels); }; DECLARE_DEVICE_TYPE(PCD_VIDEO, pcd_video_device) diff --git a/src/mame/video/powervr2.cpp b/src/mame/video/powervr2.cpp index beb8e3f6857..1cbb9409d05 100644 --- a/src/mame/video/powervr2.cpp +++ b/src/mame/video/powervr2.cpp @@ -1446,7 +1446,7 @@ WRITE32_MEMBER( powervr2_device::ta_list_init_w ) tafifo_pos=0; tafifo_mask=7; tafifo_vertexwords=8; - tafifo_listtype= -1; + tafifo_listtype= DISPLAY_LIST_NONE; #if DEBUG_PVRTA logerror("%s: list init ol=(%08x, %08x) isp=(%08x, %08x), alloc=%08x obp=%08x\n", tag(), ta_ol_base, ta_ol_limit, ta_isp_base, ta_isp_limit, ta_alloc_ctrl, ta_next_opb_init); @@ -1492,7 +1492,9 @@ WRITE32_MEMBER( powervr2_device::ta_list_init_w ) grab[grabsel].busy=0; grab[grabsel].valid=1; grab[grabsel].verts_size=0; - grab[grabsel].strips_size=0; + for (int group = 0; group < DISPLAY_LIST_COUNT; group++) { + grab[grabsel].groups[group].strips_size=0; + } g_profiler.stop(); } @@ -1547,7 +1549,7 @@ WRITE32_MEMBER( powervr2_device::ta_yuv_tex_cnt_w ) WRITE32_MEMBER( powervr2_device::ta_list_cont_w ) { if(data & 0x80000000) { - tafifo_listtype= -1; // no list being received + tafifo_listtype= DISPLAY_LIST_NONE; // no list being received listtype_used |= (1+4); } } @@ -1801,8 +1803,12 @@ void powervr2_device::process_ta_fifo() // decide number of words per vertex if (paratype == 7) { - if ((global_paratype == 5) || (tafifo_listtype == 1) || (tafifo_listtype == 3)) + if ((global_paratype == 5) || + (tafifo_listtype == DISPLAY_LIST_OPAQUE_MOD) || + (tafifo_listtype == DISPLAY_LIST_TRANS_MOD)) + { tafifo_vertexwords = 16; + } if (tafifo_vertexwords == 16) { tafifo_mask = 15; @@ -1873,13 +1879,13 @@ void powervr2_device::process_ta_fifo() //printf("%d %d\n",tafifo_listtype,screen().vpos()); switch (tafifo_listtype) { - case 0: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_opaque_list_irq), this)); break; - case 1: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_opaque_modifier_volume_list_irq), this)); break; - case 2: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_translucent_list_irq), this)); break; - case 3: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_translucent_modifier_volume_list_irq), this)); break; - case 4: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_punch_through_list_irq), this)); break; + case DISPLAY_LIST_OPAQUE: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_opaque_list_irq), this)); break; + case DISPLAY_LIST_OPAQUE_MOD: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_opaque_modifier_volume_list_irq), this)); break; + case DISPLAY_LIST_TRANS: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_translucent_list_irq), this)); break; + case DISPLAY_LIST_TRANS_MOD: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_translucent_modifier_volume_list_irq), this)); break; + case DISPLAY_LIST_PUNCH_THROUGH: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_punch_through_list_irq), this)); break; } - tafifo_listtype= -1; // no list being received + tafifo_listtype= DISPLAY_LIST_NONE; // no list being received listtype_used |= (2+8); } else if (paratype == 1) @@ -1963,7 +1969,8 @@ void powervr2_device::process_ta_fifo() } if (paratype == 4) { // polygon or mv - if ((tafifo_listtype == 1) || (tafifo_listtype == 3)) + if ((tafifo_listtype == DISPLAY_LIST_OPAQUE_MOD) || + (tafifo_listtype == DISPLAY_LIST_TRANS_MOD)) { #if DEBUG_PVRDLIST osd_printf_verbose(" Modifier Volume\n"); @@ -1986,7 +1993,13 @@ void powervr2_device::process_ta_fifo() if (paratype == 7) { // vertex - if ((tafifo_listtype == 1) || (tafifo_listtype == 3)) + if (tafifo_listtype < 0 || tafifo_listtype >= DISPLAY_LIST_COUNT) { + logerror("PowerVR2 unrecognized list type %d\n", tafifo_listtype); + return; + } + struct poly_group *grp = rd->groups + tafifo_listtype; + if ((tafifo_listtype == DISPLAY_LIST_OPAQUE_MOD) || + (tafifo_listtype == DISPLAY_LIST_TRANS_MOD)) { #if DEBUG_PVRDLIST osd_printf_verbose(" Vertex modifier volume"); @@ -2007,7 +2020,7 @@ void powervr2_device::process_ta_fifo() #endif if (texture == 1) { - if (rd->verts_size <= 65530) + if (rd->verts_size <= (MAX_VERTS - 6) && grp->strips_size < MAX_STRIPS) { strip *ts; vert *tv = &rd->verts[rd->verts_size]; @@ -2040,7 +2053,7 @@ void powervr2_device::process_ta_fifo() sizeof(tv[idx].o)); } - ts = &rd->strips[rd->strips_size++]; + ts = &grp->strips[grp->strips_size++]; tex_get_info(&ts->ti); ts->svert = rd->verts_size; ts->evert = rd->verts_size + 3; @@ -2056,7 +2069,7 @@ void powervr2_device::process_ta_fifo() osd_printf_verbose(" V(%f,%f,%f) T(%f,%f)", u2f(tafifo_buff[1]), u2f(tafifo_buff[2]), u2f(tafifo_buff[3]), u2f(tafifo_buff[4]), u2f(tafifo_buff[5])); osd_printf_verbose("\n"); #endif - if (rd->verts_size <= 65530) + if (rd->verts_size <= (MAX_VERTS - 6)) { float vert_offset_color[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; float vert_base_color[4]; @@ -2121,16 +2134,17 @@ void powervr2_device::process_ta_fifo() memcpy(tv->b, vert_base_color, sizeof(tv->b)); memcpy(tv->o, vert_offset_color, sizeof(tv->o)); - if((!rd->strips_size) || - rd->strips[rd->strips_size-1].evert != -1) + if(grp->strips_size < MAX_STRIPS && + ((!grp->strips_size) || + grp->strips[grp->strips_size-1].evert != -1)) { - strip *ts = &rd->strips[rd->strips_size++]; + strip *ts = &grp->strips[grp->strips_size++]; tex_get_info(&ts->ti); ts->svert = rd->verts_size; ts->evert = -1; } if(endofstrip) - rd->strips[rd->strips_size-1].evert = rd->verts_size; + grp->strips[grp->strips_size-1].evert = rd->verts_size; rd->verts_size++; } } @@ -2347,7 +2361,7 @@ inline uint32_t powervr2_device::sample_textured(texinfo *ti, float u, float v, return c; } -template <powervr2_device::pix_sample_fn sample_fn> +template <powervr2_device::pix_sample_fn sample_fn, int group_no> inline void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int y, float xl, float xr, float ul, float ur, float vl, float vr, float wl, float wr, float const bl_in[4], float const br_in[4], float const offl_in[4], float const offr_in[4]) { int idx; @@ -2417,9 +2431,14 @@ inline void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int uint32_t offset_color = float_argb_to_packed_argb(offl); uint32_t base_color = float_argb_to_packed_argb(bl); c = (this->*sample_fn)(ti, u, v, offset_color, base_color); - if(c & 0xff000000) { + if (group_no == DISPLAY_LIST_OPAQUE) { + *tdata = c; *wbufline = wl; - *tdata = ti->blend(c, *tdata); + } else { + if(c & 0xff000000) { + *wbufline = wl; + *tdata = ti->blend(c, *tdata); + } } } wbufline++; @@ -2436,7 +2455,7 @@ inline void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int } } -template <powervr2_device::pix_sample_fn sample_fn> +template <powervr2_device::pix_sample_fn sample_fn, int group_no> inline void powervr2_device::render_span(bitmap_rgb32 &bitmap, texinfo *ti, float y0, float y1, float xl, float xr, @@ -2515,7 +2534,7 @@ inline void powervr2_device::render_span(bitmap_rgb32 &bitmap, texinfo *ti, } while(yy0 < yy1) { - render_hline<sample_fn>(bitmap, ti, yy0, xl, xr, ul, ur, vl, vr, wl, wr, bl, br, offl, offr); + render_hline<sample_fn, group_no>(bitmap, ti, yy0, xl, xr, ul, ur, vl, vr, wl, wr, bl, br, offl, offr); xl += dxldy; xr += dxrdy; @@ -2567,7 +2586,7 @@ void powervr2_device::sort_vertices(const vert *v, int *i0, int *i1, int *i2) } -template <powervr2_device::pix_sample_fn sample_fn> +template <powervr2_device::pix_sample_fn sample_fn, int group_no> inline void powervr2_device::render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v0, const vert *v1, const vert *v2) { float dy01, dy02, dy12; @@ -2686,15 +2705,15 @@ inline void powervr2_device::render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti return; if(v1->x > v0->x) - render_span<sample_fn>(bitmap, ti, v1->y, v2->y, v0->x, v1->x, v0->u, v1->u, v0->v, v1->v, v0->w, v1->w, v0->b, v1->b, v0->o, v1->o, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy, db02dy, db12dy, do02dy, do12dy); + render_span<sample_fn, group_no>(bitmap, ti, v1->y, v2->y, v0->x, v1->x, v0->u, v1->u, v0->v, v1->v, v0->w, v1->w, v0->b, v1->b, v0->o, v1->o, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy, db02dy, db12dy, do02dy, do12dy); else - render_span<sample_fn>(bitmap, ti, v1->y, v2->y, v1->x, v0->x, v1->u, v0->u, v1->v, v0->v, v1->w, v0->w, v1->b, v0->b, v1->o, v0->o, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy, db12dy, db02dy, do12dy, do02dy); + render_span<sample_fn, group_no>(bitmap, ti, v1->y, v2->y, v1->x, v0->x, v1->u, v0->u, v1->v, v0->v, v1->w, v0->w, v1->b, v0->b, v1->o, v0->o, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy, db12dy, db02dy, do12dy, do02dy); } else if(!dy12) { if(v2->x > v1->x) - render_span<sample_fn>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy, db01dy, db02dy, do01dy, do02dy); + render_span<sample_fn, group_no>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy, db01dy, db02dy, do01dy, do02dy); else - render_span<sample_fn>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy, db02dy, db01dy, do02dy, do01dy); + render_span<sample_fn, group_no>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy, db02dy, db01dy, do02dy, do01dy); } else { float idk_b[4] = { @@ -2710,23 +2729,24 @@ inline void powervr2_device::render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti v0->o[3] + do02dy[3] * dy01 }; if(dx01dy < dx02dy) { - render_span<sample_fn>(bitmap, ti, v0->y, v1->y, + render_span<sample_fn, group_no>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy, db01dy, db02dy, do01dy, do02dy); - render_span<sample_fn>(bitmap, ti, v1->y, v2->y, + render_span<sample_fn, group_no>(bitmap, ti, v1->y, v2->y, v1->x, v0->x + dx02dy*dy01, v1->u, v0->u + du02dy*dy01, v1->v, v0->v + dv02dy*dy01, v1->w, v0->w + dw02dy*dy01, v1->b, idk_b, v1->o, idk_o, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy, db12dy, db02dy, do12dy, do02dy); } else { - render_span<sample_fn>(bitmap, ti, v0->y, v1->y, + render_span<sample_fn, group_no>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy, db02dy, db01dy, do02dy, do01dy); - render_span<sample_fn>(bitmap, ti, v1->y, v2->y, + render_span<sample_fn, group_no>(bitmap, ti, v1->y, v2->y, v0->x + dx02dy*dy01, v1->x, v0->u + du02dy*dy01, v1->u, v0->v + dv02dy*dy01, v1->v, v0->w + dw02dy*dy01, v1->w, idk_b, v1->b, idk_o, v1->o, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy, db02dy, db12dy, do02dy, do12dy); } } } +template <int group_no> void powervr2_device::render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v) { int i0, i1, i2; @@ -2740,16 +2760,16 @@ void powervr2_device::render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert * if (bilinear) { switch (ti->tsinstruction) { case 0: - render_tri_sorted<&powervr2_device::sample_textured<0,true>>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_textured<0,true>, group_no>(bitmap, ti, v+i0, v+i1, v+i2); break; case 1: - render_tri_sorted<&powervr2_device::sample_textured<1,true>>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_textured<1,true>, group_no>(bitmap, ti, v+i0, v+i1, v+i2); break; case 2: - render_tri_sorted<&powervr2_device::sample_textured<2,true>>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_textured<2,true>, group_no>(bitmap, ti, v+i0, v+i1, v+i2); break; case 3: - render_tri_sorted<&powervr2_device::sample_textured<3,true>>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_textured<3,true>, group_no>(bitmap, ti, v+i0, v+i1, v+i2); break; default: /* @@ -2757,21 +2777,21 @@ void powervr2_device::render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert * * AND'd with 3 */ logerror("%s - tsinstruction is 0x%08x\n", (unsigned)ti->tsinstruction); - render_tri_sorted<&powervr2_device::sample_nontextured>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_nontextured, group_no>(bitmap, ti, v+i0, v+i1, v+i2); } } else { switch (ti->tsinstruction) { case 0: - render_tri_sorted<&powervr2_device::sample_textured<0,false>>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_textured<0,false>, group_no>(bitmap, ti, v+i0, v+i1, v+i2); break; case 1: - render_tri_sorted<&powervr2_device::sample_textured<1,false>>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_textured<1,false>, group_no>(bitmap, ti, v+i0, v+i1, v+i2); break; case 2: - render_tri_sorted<&powervr2_device::sample_textured<2,false>>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_textured<2,false>, group_no>(bitmap, ti, v+i0, v+i1, v+i2); break; case 3: - render_tri_sorted<&powervr2_device::sample_textured<3,false>>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_textured<3,false>, group_no>(bitmap, ti, v+i0, v+i1, v+i2); break; default: /* @@ -2779,18 +2799,17 @@ void powervr2_device::render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert * * AND'd with 3 */ logerror("%s - tsinstruction is 0x%08x\n", (unsigned)ti->tsinstruction); - render_tri_sorted<&powervr2_device::sample_nontextured>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_nontextured, group_no>(bitmap, ti, v+i0, v+i1, v+i2); } } } else { - render_tri_sorted<&powervr2_device::sample_nontextured>(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted<&powervr2_device::sample_nontextured, group_no>(bitmap, ti, v+i0, v+i1, v+i2); } } -void powervr2_device::render_to_accumulation_buffer(bitmap_rgb32 &bitmap,const rectangle &cliprect) +template <int group_no> +void powervr2_device::render_group_to_accumulation_buffer(bitmap_rgb32 &bitmap,const rectangle &cliprect) { - dc_state *state = machine().driver_data<dc_state>(); - address_space &space = state->m_maincpu->space(AS_PROGRAM); #if 0 int stride; uint16_t *bmpaddr16; @@ -2804,17 +2823,14 @@ void powervr2_device::render_to_accumulation_buffer(bitmap_rgb32 &bitmap,const r //printf("drawtest!\n"); int rs=renderselect; - uint32_t c=space.read_dword(0x05000000+((isp_backgnd_t & 0xfffff8)>>1)+(3+3)*4); - bitmap.fill(c, cliprect); + struct poly_group *grp = grab[rs].groups + group_no; - int ns=grab[rs].strips_size; - if(ns) - memset(wbuffer, 0x00, sizeof(wbuffer)); + int ns=grp->strips_size; for (int cs=0;cs < ns;cs++) { - strip *ts = &grab[rs].strips[cs]; + strip *ts = &grp->strips[cs]; int sv = ts->svert; int ev = ts->evert; int i; @@ -2831,11 +2847,29 @@ void powervr2_device::render_to_accumulation_buffer(bitmap_rgb32 &bitmap,const r for(i=sv; i <= ev-2; i++) { if (!(debug_dip_status&0x2)) - render_tri(bitmap, &ts->ti, grab[rs].verts + i); + render_tri<group_no>(bitmap, &ts->ti, grab[rs].verts + i); } } - grab[rs].busy=0; +} + +void powervr2_device::render_to_accumulation_buffer(bitmap_rgb32 &bitmap, const rectangle &cliprect) { + if (renderselect < 0) + return; + + memset(wbuffer, 0x00, sizeof(wbuffer)); + + dc_state *state = machine().driver_data<dc_state>(); + address_space &space = state->m_maincpu->space(AS_PROGRAM); + uint32_t c=space.read_dword(0x05000000+((isp_backgnd_t & 0xfffff8)>>1)+(3+3)*4); + bitmap.fill(c, cliprect); + + // TODO: modifier volumes + render_group_to_accumulation_buffer<DISPLAY_LIST_OPAQUE>(bitmap, cliprect); + render_group_to_accumulation_buffer<DISPLAY_LIST_TRANS>(bitmap, cliprect); + render_group_to_accumulation_buffer<DISPLAY_LIST_PUNCH_THROUGH>(bitmap, cliprect); + + grab[renderselect].busy=0; } // copies the accumulation buffer into the framebuffer, converting to the specified format @@ -4125,7 +4159,7 @@ void powervr2_device::device_reset() tafifo_pos=0; tafifo_mask=7; tafifo_vertexwords=8; - tafifo_listtype= -1; + tafifo_listtype= DISPLAY_LIST_NONE; start_render_received=0; renderselect= -1; grabsel=0; diff --git a/src/mame/video/powervr2.h b/src/mame/video/powervr2.h index 0fe9c2beb67..ce402e07302 100644 --- a/src/mame/video/powervr2.h +++ b/src/mame/video/powervr2.h @@ -112,16 +112,48 @@ public: texinfo ti; }; - struct receiveddata { - vert verts[65536]; - strip strips[65536]; + static const unsigned MAX_VERTS = 65536; + static const unsigned MAX_STRIPS = 65536; + + /* + * There are five polygon lists: + * + * Opaque + * Punch-through polygon + * Opaque/punch-through modifier volume + * Translucent + * Translucent modifier volume + * + * They are rendered in that order. List indices are are three bits, so + * technically there are 8 polygon lists, but only the first 5 are valid. + */ + enum { + DISPLAY_LIST_OPAQUE, + DISPLAY_LIST_OPAQUE_MOD, + DISPLAY_LIST_TRANS, + DISPLAY_LIST_TRANS_MOD, + DISPLAY_LIST_PUNCH_THROUGH, + DISPLAY_LIST_LAST, + + DISPLAY_LIST_COUNT, - int verts_size, strips_size; + DISPLAY_LIST_NONE = -1 + }; + + struct poly_group { + strip strips[MAX_STRIPS]; + int strips_size; + }; + + struct receiveddata { + vert verts[MAX_VERTS]; + struct poly_group groups[DISPLAY_LIST_COUNT]; uint32_t ispbase; uint32_t fbwsof1; uint32_t fbwsof2; int busy; int valid; + int verts_size; }; enum { @@ -469,7 +501,7 @@ private: uint32_t tex_r_default(texinfo *t, float x, float y); void tex_get_info(texinfo *t); - template <pix_sample_fn sample_fn> + template <pix_sample_fn sample_fn, int group_no> inline void render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int y, float xl, float xr, float ul, float ur, float vl, float vr, @@ -477,7 +509,7 @@ private: float const bl[4], float const br[4], float const offl[4], float const offr[4]); - template <pix_sample_fn sample_fn> + template <pix_sample_fn sample_fn, int group_no> inline void render_span(bitmap_rgb32 &bitmap, texinfo *ti, float y0, float y1, float xl, float xr, @@ -493,13 +525,18 @@ private: float const dbldy[4], float const dbrdy[4], float const doldy[4], float const dordy[4]); - template <pix_sample_fn sample_fn> + template <pix_sample_fn sample_fn, int group_no> inline void render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v0, const vert *v1, const vert *v2); + template <int group_no> + void render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v); + + template <int group_no> + void render_group_to_accumulation_buffer(bitmap_rgb32 &bitmap, const rectangle &cliprect); + void sort_vertices(const vert *v, int *i0, int *i1, int *i2); - void render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v); void render_to_accumulation_buffer(bitmap_rgb32 &bitmap, const rectangle &cliprect); void pvr_accumulationbuffer_to_framebuffer(address_space &space, int x, int y); void pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &cliprect); diff --git a/src/mame/video/sshangha.cpp b/src/mame/video/sshangha.cpp index 270727bb0f4..789ba128820 100644 --- a/src/mame/video/sshangha.cpp +++ b/src/mame/video/sshangha.cpp @@ -13,11 +13,11 @@ /******************************************************************************/ -WRITE16_MEMBER(sshangha_state::sshangha_video_w) +WRITE16_MEMBER(sshangha_state::video_w) { /* 0x4: Special video mode, other bits unknown */ - m_video_control=data; -// popmessage("%04x",data); + m_video_control = data; +// popmessage("%04x", data); } /******************************************************************************/ @@ -26,17 +26,19 @@ void sshangha_state::video_start() { m_sprgen1->alloc_sprite_bitmap(); m_sprgen2->alloc_sprite_bitmap(); + + save_item(NAME(m_video_control)); } /******************************************************************************/ -uint32_t sshangha_state::screen_update_sshangha(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +uint32_t sshangha_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { const bool combine_tilemaps = (m_video_control&4) ? false : true; // sprites are flipped relative to tilemaps address_space &space = machine().dummy_space(); - uint16_t flip = m_deco_tilegen1->pf_control_r(space, 0, 0xffff); + uint16_t flip = m_tilegen->pf_control_r(space, 0, 0xffff); flip_screen_set(BIT(flip, 7)); m_sprgen1->set_flip_screen(!BIT(flip, 7)); m_sprgen2->set_flip_screen(!BIT(flip, 7)); @@ -48,23 +50,23 @@ uint32_t sshangha_state::screen_update_sshangha(screen_device &screen, bitmap_rg // draw / mix bitmap.fill(m_palette->black_pen(), cliprect); - m_deco_tilegen1->pf_update(m_pf1_rowscroll, m_pf2_rowscroll); + m_tilegen->pf_update(m_pf1_rowscroll, m_pf2_rowscroll); // TODO: fully verify draw order / priorities /* the tilemap 4bpp + 4bpp = 8bpp mixing actually seems external to the tilemap, note video_control is not part of the tilemap chip */ if (combine_tilemaps) { - m_deco_tilegen1->tilemap_12_combine_draw(screen, bitmap, cliprect, 0, 0, 1); + m_tilegen->tilemap_12_combine_draw(screen, bitmap, cliprect, 0, 0, 1); } else { - m_deco_tilegen1->tilemap_2_draw(screen, bitmap, cliprect, 0, 0); + m_tilegen->tilemap_2_draw(screen, bitmap, cliprect, 0, 0); } // pri, primask,palbase,palmask m_sprgen1->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x000, 0x000, 0x000, 0x0ff); // low+high pri spr1 (definitely needs to be below low pri spr2 - game tiles & definitely needs to be below tilemap1 - lightning on win screen in traditional mode) m_sprgen2->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x200, 0x200, 0x100, 0x0ff); // low pri spr2 (definitely needs to be below tilemap1 - 2nd level failure screen etc.) if (!combine_tilemaps) - m_deco_tilegen1->tilemap_1_draw(screen, bitmap, cliprect, 0, 0); + m_tilegen->tilemap_1_draw(screen, bitmap, cliprect, 0, 0); // pri, primask,palbase,palmask m_sprgen2->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x000, 0x200, 0x100, 0x0ff); // high pri spr2 (definitely needs to be above tilemap1 - title logo) diff --git a/src/mame/video/tc0180vcu.cpp b/src/mame/video/tc0180vcu.cpp index c6d2d339787..7c0f5827070 100644 --- a/src/mame/video/tc0180vcu.cpp +++ b/src/mame/video/tc0180vcu.cpp @@ -152,6 +152,8 @@ void tc0180vcu_device::vblank_callback(screen_device &screen, bool state) if (state) { + vblank_update(); + m_inth_callback(ASSERT_LINE); m_intl_timer->adjust(screen.time_until_pos(screen.vpos() + 8)); } @@ -618,19 +620,13 @@ g_profiler.start(PROFILER_USER1); g_profiler.stop(); } -WRITE_LINE_MEMBER(tc0180vcu_device::screen_vblank) +void tc0180vcu_device::vblank_update() { - // rising edge - if (state) - { - if (~m_video_control & 0x01) - m_framebuffer[m_framebuffer_page]->fill(0, screen().visible_area()); + if (~m_video_control & 0x01) + m_framebuffer[m_framebuffer_page]->fill(0, screen().visible_area()); - if (~m_video_control & 0x80) - { - m_framebuffer_page ^= 1; - } + if (~m_video_control & 0x80) + m_framebuffer_page ^= 1; - draw_sprites(*m_framebuffer[m_framebuffer_page], screen().visible_area()); - } + draw_sprites(*m_framebuffer[m_framebuffer_page], screen().visible_area()); } diff --git a/src/mame/video/tc0180vcu.h b/src/mame/video/tc0180vcu.h index f8c31c75dea..93eb3d877c0 100644 --- a/src/mame/video/tc0180vcu.h +++ b/src/mame/video/tc0180vcu.h @@ -31,7 +31,6 @@ public: void tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int tmap_num, int plane); void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ); void draw_framebuffer( bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ); - DECLARE_WRITE_LINE_MEMBER(screen_vblank); void tc0180vcu_memrw(address_map &map); protected: @@ -47,6 +46,7 @@ private: }; void vblank_callback(screen_device &screen, bool state); + void vblank_update(); // internal state diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc index beba1f1743f..4aa3719c0ab 100644 --- a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc +++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc @@ -13,19 +13,11 @@ uniform vec4 u_swap_xy; uniform vec4 u_source_dims; // size of the guest machine uniform vec4 u_target_dims; uniform vec4 u_target_scale; -uniform vec4 u_quad_dims; uniform vec4 u_screen_scale; uniform vec4 u_screen_offset; // uniform vec4 u_back_color; // TODO // User-supplied -uniform vec4 u_scanline_alpha; -uniform vec4 u_scanline_scale; -uniform vec4 u_scanline_bright_scale; -uniform vec4 u_scanline_bright_offset; -uniform vec4 u_scanline_jitter; -uniform vec4 u_scanline_height; -uniform vec4 u_scanline_variation; uniform vec4 u_shadow_tile_mode; uniform vec4 u_shadow_alpha; uniform vec4 u_shadow_count; @@ -38,14 +30,13 @@ uniform vec4 u_floor; // Parametric uniform vec4 u_time; // milliseconds -uniform vec4 u_jitter_amount; // Samplers SAMPLER2D(s_tex, 0); SAMPLER2D(s_shadow, 1); //----------------------------------------------------------------------------- -// Scanline & Shadowmask Pixel Shader +// Shadowmask Pixel Shader //----------------------------------------------------------------------------- vec2 GetAdjustedCoords(vec2 coord) @@ -148,34 +139,6 @@ void main() BaseColor.g = pow(BaseColor.g, u_power.g); BaseColor.b = pow(BaseColor.b, u_power.b); - // Scanline Simulation - if (u_scanline_alpha.x > 0.0f) - { - float BrightnessOffset = (u_scanline_bright_offset.x * u_scanline_alpha.x); - float BrightnessScale = (u_scanline_bright_scale.x * u_scanline_alpha.x) + (1.0 - u_scanline_alpha.x); - - float ColorBrightness = 0.299 * BaseColor.r + 0.587 * BaseColor.g + 0.114 * BaseColor.b; - - float ScanCoord = BaseCoord.y; - ScanCoord += u_swap_xy.x > 0.0 - ? u_quad_dims.x <= u_source_dims.x * 2.0 - ? 0.5 / u_quad_dims.x // uncenter scanlines if the quad is less than twice the size of the source - : 0.0 - : u_quad_dims.y <= u_source_dims.y * 2.0 - ? 0.5 / u_quad_dims.y // uncenter scanlines if the quad is less than twice the size of the source - : 0.0; - - ScanCoord *= u_source_dims.y * u_scanline_scale.x * 3.1415927; // PI - - float ScanCoordJitter = u_scanline_jitter.x * u_jitter_amount.x * 1.5707963; // half PI - float ScanSine = sin(ScanCoord + ScanCoordJitter); - float ScanlineWide = u_scanline_height.x + u_scanline_variation.x * max(1.0, u_scanline_height.x) * (1.0 - ColorBrightness); - float ScanSineScaled = pow(ScanSine * ScanSine, ScanlineWide); - float ScanBrightness = ScanSineScaled * BrightnessScale + BrightnessOffset * BrightnessScale; - - BaseColor.rgb *= mix(vec3(1.0, 1.0, 1.0), vec3(ScanBrightness, ScanBrightness, ScanBrightness), u_scanline_alpha.xxx); - } - // Hum Bar Simulation if (u_humbar_alpha.x > 0.0f) { diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc new file mode 100644 index 00000000000..5942c75bab6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc @@ -0,0 +1,101 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz,ImJezze +//----------------------------------------------------------------------------- +// Scanline Effect +//----------------------------------------------------------------------------- + +#include "common.sh" + +// Autos +uniform vec4 u_swap_xy; +uniform vec4 u_source_dims; // size of the guest machine +uniform vec4 u_target_dims; +uniform vec4 u_quad_dims; +uniform vec4 u_screen_scale; +uniform vec4 u_screen_offset; + +// User-supplied +uniform vec4 u_scanline_alpha; +uniform vec4 u_scanline_scale; +uniform vec4 u_scanline_bright_scale; +uniform vec4 u_scanline_bright_offset; +uniform vec4 u_scanline_jitter; +uniform vec4 u_scanline_height; +uniform vec4 u_scanline_variation; + +// Parametric +uniform vec4 u_time; // milliseconds +uniform vec4 u_jitter_amount; + +// Samplers +SAMPLER2D(s_tex, 0); +SAMPLER2D(s_shadow, 1); + +//----------------------------------------------------------------------------- +// Scanline Pixel Shader +//----------------------------------------------------------------------------- + +vec2 GetAdjustedCoords(vec2 coord) +{ + // center coordinates + coord -= 0.5; + + // apply screen scale + coord *= u_screen_scale.xy; + + // un-center coordinates + coord += 0.5; + + // apply screen offset + coord += u_screen_offset.xy; + + return coord; +} + +void main() +{ + vec2 BaseCoord = GetAdjustedCoords(v_texcoord0); + + // Color + vec4 BaseColor = texture2D(s_tex, BaseCoord); + + // Clamp + if (BaseCoord.x < 0.0 || BaseCoord.y < 0.0 || BaseCoord.x > 1.0 || BaseCoord.y > 1.0) + { + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); + } + else + { + // Scanline Simulation + if (u_scanline_alpha.x > 0.0f) + { + float BrightnessOffset = (u_scanline_bright_offset.x * u_scanline_alpha.x); + float BrightnessScale = (u_scanline_bright_scale.x * u_scanline_alpha.x) + (1.0 - u_scanline_alpha.x); + + float ColorBrightness = 0.299 * BaseColor.r + 0.587 * BaseColor.g + 0.114 * BaseColor.b; + + float ScanCoord = BaseCoord.y; + ScanCoord += u_swap_xy.x > 0.0 + ? u_quad_dims.x <= u_source_dims.x * 2.0 + ? 0.5 / u_quad_dims.x // uncenter scanlines if the quad is less than twice the size of the source + : 0.0 + : u_quad_dims.y <= u_source_dims.y * 2.0 + ? 0.5 / u_quad_dims.y // uncenter scanlines if the quad is less than twice the size of the source + : 0.0; + + ScanCoord *= u_source_dims.y * u_scanline_scale.x * 3.1415927; // PI + + float ScanCoordJitter = u_scanline_jitter.x * u_jitter_amount.x * 1.5707963; // half PI + float ScanSine = sin(ScanCoord + ScanCoordJitter); + float ScanlineWide = u_scanline_height.x + u_scanline_variation.x * max(1.0, u_scanline_height.x) * (1.0 - ColorBrightness); + float ScanSineScaled = pow(ScanSine * ScanSine, ScanlineWide); + float ScanBrightness = ScanSineScaled * BrightnessScale + BrightnessOffset * BrightnessScale; + + BaseColor.rgb *= mix(vec3(1.0, 1.0, 1.0), vec3(ScanBrightness, ScanBrightness, ScanBrightness), u_scanline_alpha.xxx); + } + + gl_FragColor = vec4(BaseColor.rgb * v_color0.rgb, BaseColor.a); + } +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc @@ -0,0 +1,14 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_color0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + v_color0 = a_color0; +} diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index 54f52625b6d..df5e2febea2 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -161,15 +161,46 @@ private: //============================================================ shaders::shaders() : - d3dintf(nullptr), machine(nullptr), d3d(nullptr), post_fx_enable(false), oversampling_enable(false), - num_screens(0), curr_screen(0), acc_t(0), delta_t(0), shadow_texture(nullptr), options(nullptr), - black_surface(nullptr), black_texture(nullptr), recording_movie(false), render_snap(false), - snap_copy_target(nullptr), snap_copy_texture(nullptr), snap_target(nullptr), snap_texture(nullptr), - snap_width(0), snap_height(0), initialized(false), backbuffer(nullptr), curr_effect(nullptr), - default_effect(nullptr), prescale_effect(nullptr), post_effect(nullptr), distortion_effect(nullptr), - focus_effect(nullptr), phosphor_effect(nullptr), deconverge_effect(nullptr), color_effect(nullptr), - ntsc_effect(nullptr), bloom_effect(nullptr), downsample_effect(nullptr), vector_effect(nullptr), - curr_texture(nullptr), curr_render_target(nullptr), curr_poly(nullptr), + d3dintf(nullptr), + machine(nullptr), + d3d(nullptr), + post_fx_enable(false), + oversampling_enable(false), + num_screens(0), + curr_screen(0), + acc_t(0), + delta_t(0), + shadow_texture(nullptr), + options(nullptr), + black_surface(nullptr), + black_texture(nullptr), + recording_movie(false), + render_snap(false), + snap_copy_target(nullptr), + snap_copy_texture(nullptr), + snap_target(nullptr), + snap_texture(nullptr), + snap_width(0), + snap_height(0), + initialized(false), + backbuffer(nullptr), + curr_effect(nullptr), + default_effect(nullptr), + prescale_effect(nullptr), + post_effect(nullptr), + distortion_effect(nullptr), + scanline_effect(nullptr), + focus_effect(nullptr), + phosphor_effect(nullptr), + deconverge_effect(nullptr), + color_effect(nullptr), + ntsc_effect(nullptr), + bloom_effect(nullptr), + downsample_effect(nullptr), + vector_effect(nullptr), + curr_texture(nullptr), + curr_render_target(nullptr), + curr_poly(nullptr), d3dx_create_effect_from_file_ptr(nullptr) { } @@ -705,6 +736,7 @@ int shaders::create_resources() prescale_effect = new effect(this, d3d->get_device(), "prescale.fx", fx_dir); phosphor_effect = new effect(this, d3d->get_device(), "phosphor.fx", fx_dir); focus_effect = new effect(this, d3d->get_device(), "focus.fx", fx_dir); + scanline_effect = new effect(this, d3d->get_device(), "scanline.fx", fx_dir); deconverge_effect = new effect(this, d3d->get_device(), "deconverge.fx", fx_dir); color_effect = new effect(this, d3d->get_device(), "color.fx", fx_dir); ntsc_effect = new effect(this, d3d->get_device(), "ntsc.fx", fx_dir); @@ -718,6 +750,7 @@ int shaders::create_resources() !prescale_effect->is_valid() || !phosphor_effect->is_valid() || !focus_effect->is_valid() || + !scanline_effect->is_valid() || !deconverge_effect->is_valid() || !color_effect->is_valid() || !ntsc_effect->is_valid() || @@ -728,13 +761,16 @@ int shaders::create_resources() return 1; } - effect *effects[13] = { + const int EFFECT_COUNT = 14; + + effect *effects[EFFECT_COUNT] = { default_effect, post_effect, distortion_effect, prescale_effect, phosphor_effect, focus_effect, + scanline_effect, deconverge_effect, color_effect, ntsc_effect, @@ -779,21 +815,22 @@ int shaders::create_resources() deconverge_effect->add_uniform("RadialConvergeX", uniform::UT_VEC3, uniform::CU_CONVERGE_RADIAL_X); deconverge_effect->add_uniform("RadialConvergeY", uniform::UT_VEC3, uniform::CU_CONVERGE_RADIAL_Y); + scanline_effect->add_uniform("ScanlineAlpha", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_ALPHA); + scanline_effect->add_uniform("ScanlineScale", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_SCALE); + scanline_effect->add_uniform("ScanlineHeight", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_HEIGHT); + scanline_effect->add_uniform("ScanlineVariation", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_VARIATION); + scanline_effect->add_uniform("ScanlineBrightScale", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_BRIGHT_SCALE); + scanline_effect->add_uniform("ScanlineBrightOffset", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_BRIGHT_OFFSET); + focus_effect->add_uniform("Defocus", uniform::UT_VEC2, uniform::CU_FOCUS_SIZE); phosphor_effect->add_uniform("Phosphor", uniform::UT_VEC3, uniform::CU_PHOSPHOR_LIFE); - post_effect->add_uniform("ShadowAlpha", uniform::UT_FLOAT, uniform::CU_POST_SHADOW_ALPHA); + post_effect->add_uniform("ShadowAlpha", uniform::UT_FLOAT, uniform::CU_POST_SHADOW_ALPHA); post_effect->add_uniform("ShadowCount", uniform::UT_VEC2, uniform::CU_POST_SHADOW_COUNT); post_effect->add_uniform("ShadowUV", uniform::UT_VEC2, uniform::CU_POST_SHADOW_UV); post_effect->add_uniform("ShadowUVOffset", uniform::UT_VEC2, uniform::CU_POST_SHADOW_UV_OFFSET); - post_effect->add_uniform("ShadowDims", uniform::UT_VEC2, uniform::CU_POST_SHADOW_DIMS); - post_effect->add_uniform("ScanlineAlpha", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_ALPHA); - post_effect->add_uniform("ScanlineScale", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_SCALE); - post_effect->add_uniform("ScanlineHeight", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_HEIGHT); - post_effect->add_uniform("ScanlineVariation", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_VARIATION); - post_effect->add_uniform("ScanlineBrightScale", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_BRIGHT_SCALE); - post_effect->add_uniform("ScanlineBrightOffset", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_BRIGHT_OFFSET); + post_effect->add_uniform("ShadowDims", uniform::UT_VEC2, uniform::CU_POST_SHADOW_DIMS); post_effect->add_uniform("Power", uniform::UT_VEC3, uniform::CU_POST_POWER); post_effect->add_uniform("Floor", uniform::UT_VEC3, uniform::CU_POST_FLOOR); @@ -835,6 +872,7 @@ void shaders::begin_draw() prescale_effect->set_technique("DefaultTechnique"); phosphor_effect->set_technique("DefaultTechnique"); focus_effect->set_technique("DefaultTechnique"); + scanline_effect->set_technique("DefaultTechnique"); deconverge_effect->set_technique("DefaultTechnique"); color_effect->set_technique("DefaultTechnique"); ntsc_effect->set_technique("DefaultTechnique"); @@ -1040,6 +1078,38 @@ int shaders::deconverge_pass(d3d_render_target *rt, int source_index, poly_info return next_index; } +int shaders::scanline_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum) +{ + int next_index = source_index; + + // skip scanline if alpha is 0 + if (options->scanline_alpha == 0.0f) + return next_index; + + auto win = d3d->assert_window(); + screen_device_iterator screen_iterator(machine->root_device()); + screen_device *screen = screen_iterator.byindex(curr_screen); + render_container &screen_container = screen->container(); + float xscale = 1.0f / screen_container.xscale(); + float yscale = 1.0f / screen_container.yscale(); + float xoffset = -screen_container.xoffset(); + float yoffset = -screen_container.yoffset(); + float screen_scale[] = { xscale, yscale }; + float screen_offset[] = { xoffset, yoffset }; + + curr_effect = scanline_effect; + curr_effect->update_uniforms(); + curr_effect->set_texture("Diffuse", rt->target_texture[next_index]); + curr_effect->set_vector("ScreenScale", 2, screen_scale); + curr_effect->set_vector("ScreenOffset", 2, screen_offset); + curr_effect->set_float("ScanlineOffset", + curr_texture->get_cur_frame() == 0 ? + 0.0f : options->scanline_jitter); + next_index = rt->next_index(next_index); + blit(rt->target_surface[next_index], false, D3DPT_TRIANGLELIST, 0, 2); + return next_index; +} + int shaders::defocus_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum) { int next_index = source_index; @@ -1353,10 +1423,11 @@ void shaders::render_quad(poly_info *poly, int vertnum) int next_index = 0; - next_index = ntsc_pass(rt, next_index, poly, vertnum); // handled in bgfx - next_index = color_convolution_pass(rt, next_index, poly, vertnum); // handled in bgfx - next_index = prescale_pass(rt, next_index, poly, vertnum); // handled in bgfx - next_index = deconverge_pass(rt, next_index, poly, vertnum); // handled in bgfx + next_index = ntsc_pass(rt, next_index, poly, vertnum); + next_index = color_convolution_pass(rt, next_index, poly, vertnum); + next_index = prescale_pass(rt, next_index, poly, vertnum); + next_index = deconverge_pass(rt, next_index, poly, vertnum); + next_index = scanline_pass(rt, next_index, poly, vertnum); next_index = defocus_pass(rt, next_index, poly, vertnum); next_index = phosphor_pass(rt, next_index, poly, vertnum); @@ -1735,6 +1806,11 @@ void shaders::delete_resources() delete focus_effect; focus_effect = nullptr; } + if (scanline_effect != nullptr) + { + delete scanline_effect; + scanline_effect = nullptr; + } if (deconverge_effect != nullptr) { delete deconverge_effect; diff --git a/src/osd/modules/render/d3d/d3dhlsl.h b/src/osd/modules/render/d3d/d3dhlsl.h index ff4c7527a52..eae92ee5b3d 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.h +++ b/src/osd/modules/render/d3d/d3dhlsl.h @@ -332,6 +332,7 @@ private: int color_convolution_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum); int prescale_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum); int deconverge_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum); + int scanline_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum); int defocus_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum); int phosphor_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum); int post_pass(d3d_render_target *rt, int source_index, poly_info *poly, int vertnum, bool prepare_bloom); @@ -381,6 +382,7 @@ private: effect * prescale_effect; // pointer to the prescale-effect object effect * post_effect; // pointer to the post-effect object effect * distortion_effect; // pointer to the distortion-effect object + effect * scanline_effect; effect * focus_effect; // pointer to the focus-effect object effect * phosphor_effect; // pointer to the phosphor-effect object effect * deconverge_effect; // pointer to the deconvergence-effect object |