diff options
36 files changed, 1786 insertions, 476 deletions
diff --git a/hash/vsmile_cart.xml b/hash/vsmile_cart.xml index 29d7b297e99..18db915c932 100644 --- a/hash/vsmile_cart.xml +++ b/hash/vsmile_cart.xml @@ -45,7 +45,7 @@ Addons (w/ yellow Smartridges) | | 80-067022(SP) | V.Smile Estudio de Arte (orange) | | | 80-067033(NO) | V.Smile Tegnestudio | | | 80-067057(SP) | V.Smile Estudio de Arte (pink) | -| | (CN) | 智乐学习通小画室 | +| | (CN) | 智乐学习通小画室 | +========+===================+============================================================================+ | | 80-091320(US) | V.Smile Jamming Gym Class | | | 80-091322(NL) | V.Smile Muziek en Leer Mat | @@ -180,7 +180,7 @@ Game cartridges | XX | 80-092094(SE) | Musse Pigg - Musses magiska äventyr | | | (NO) | Mickey | | | (FI) | Mickey | -| | (CN) | 米奇魔幻历险记 | +| | (CN) | 米奇魔幻历险记 | +========+===================+==========================================================================================================================================================+ | XX | 80-092100(US) | The Lion King - Simba's Big Adventure | | XX | 80-092101(IT) | Il Re Leone - La Grande Avventura di Simba | @@ -194,7 +194,7 @@ Game cartridges | XX | 80-092114(SE) | Lejonkungen - Simbas stora äventyr | | | (NO) | Løvenes konge - Simbas store eventyr | | | (FI) | Leijona kuningas - Simban suuri seikkailu | -| | (CN) | 狮子王辛巴成长历险记 | +| | (CN) | 狮子王辛巴成长历险记 | +========+===================+==========================================================================================================================================================+ | | 80-092120(US) | The Little Mermaid - Ariel's Majestic Journey | | XX | 80-092121(IT) | La sirenetta - Ariel e la crociera magica | @@ -208,7 +208,7 @@ Game cartridges | XX | 80-092134(SE) | Den Lilla Sjöjungfrun - Ariels majestätiska resa! | | | (NO) | Den Lille Havfruen - Ariels majestetiske reise! | | | (FI) | Pieni Merenneito - Arielin majesteettinen matka | -| | (CN) | 美人鱼梦幻之旅 | +| | (CN) | 美人鱼梦幻之旅 | +========+===================+==========================================================================================================================================================+ | | 80-092140(US) | Spider-Man & Friends - Secret Missions | | XX | 80-092140-101(US) | Spider-Man & Friends - Secret Missions (ALT) | @@ -268,7 +268,7 @@ Game cartridges | XX | 80-092234(SE) | Toy Story 2 - Operation: Rädda Woody! | | | (NO) | Toy Story 2 - Operasjon: Redd Woody! | | | (FI) | Toy Story 2 | -| | (CN) | 玩具总动员2 - 营救胡迪 | +| | (CN) | 玩具总动员2 - 营救胡迪 | +========+===================+==========================================================================================================================================================+ | XX | 80-092240(US) | Cinderella - Cinderella's Magic Wishes | | XX | 80-092241(IT) | Cenerentola - I desideri magici di Cenerentola (cart says 52-92251 Ita) | @@ -277,9 +277,9 @@ Game cartridges | XX | 80-092243(UK) | Cinderella - Cinderella's Magic Wishes | | | 80-092243-103(UK) | Cinderella - Cinderella's Magic Wishes (2007) | | | 80-092243-203(UK) | Cinderella - Cinderella's Magic Wishes (2008) | -| XX | 80-092244(GE) | Cinderella - Lernen im Maerchenland (2005) | -| XX | 80-092244-104(GE) | Cinderella - Lernen im Maerchenland (2007) | -| | 80-092244-204(GE) | Cinderella - Lernen im Maerchenland (2007) | +| XX | 80-092244(GE) | Cinderella - Lernen im Märchenland (2005) | +| XX | 80-092244-104(GE) | Cinderella - Lernen im Märchenland (2007) | +| XX | 80-092244-204(GE) | Cinderella - Lernen im Märchenland (2008) (52-092244-205(GER) on back label, white sticker: "827 ○○○○") | | XX | 80-092245(FR) | Cendrillon - Le rêve enchanté de Cendrillon | | | 80-092245-105(FR) | Cendrillon - Le rêve enchanté de Cendrillon | | | 80-092245-205(FR) | Cendrillon - Le reve enchante de Cendrillon | @@ -290,7 +290,7 @@ Game cartridges | XX | 80-092254(SE) | Cinderella - Askungens magiska önskningar | | | 80-092255(NO) | Cinderella - Askepotts magiske ønsker | | | (FI) | Cinderella - Tuhkimon Taikatoiveet | -| | (CN) | 仙蒂 | +| | (CN) | 仙蒂 | +========+===================+==========================================================================================================================================================+ | | 80-092260(US) | Elmo's World - Elmo's Big Discoveries | | XX | 80-092264(GE) | Elmos großes Abenteuer | @@ -353,7 +353,7 @@ Game cartridges | XX | 80-092364(GE) | Zayzoos Lernall | | XX | 80-092365(FR) | Zézou - Notre Ami Venu d'Ailleurs | | XX | 80-092367(SP) | Zayzoo - Mi Amiga del Espacio (52-92367(SP) on back label, green sticker: "531 ○○○○") | -| | (CN) | 我的外星人同学 | +| | (CN) | 我的外星人同学 | +========+===================+==========================================================================================================================================================+ | | 80-092380(US) | Barney - The Land of Make Believe | | | 80-092383(UK) | Barney - The Land of Make Believe | @@ -364,7 +364,7 @@ Game cartridges | XX | 80-092420(US) | Finding Nemo - Nemo's Ocean Discoveries | | XX | 80-092422(NL) | Finding Nemo - De wonderwereld van Nemo | | | 80-092423(UK) | Finding Nemo - Nemo's Ocean Discoveries | -| | 80-092424(GE) | Findet Nemo - Nemos Unterwasserabenteuer | +| XX | 50-092424(GE) | Findet Nemo - Nemos Unterwasserabenteuer (52-92424(GER) on back label, blue sticker: "P ○○○○", "VT8321" silscreened on the cart) | | | 80-092425(FR) | Le Monde de Nemo - Nemo à la découverte de l'océan | | | 80-092426(PT) | Nemo - A descoberta do Oceano (Cart#92436) | | XX | 80-092427(SP) | Buscando a Nemo - Los Descubrimientos de Nemo (52-92427(SP) on back label, green sticker: "542 ○○○●") | @@ -390,7 +390,7 @@ Game cartridges | | 80-092484(GE) | The Batman - Rettung von Gotham City | | | 80-092485(FR) | The Batman - Panique a Gotham City | | | 80-092487(SP) | The Batman - Rescate en Gotham City | -| | (CN) | 蝙蝠侠 - 拯救城市 | +| | (CN) | 蝙蝠侠 - 拯救城市 | +========+===================+==========================================================================================================================================================+ | | 80-092500(US) | Whiz Kid Wheels (note to self.. no rider in this blue car) | | | 80-092502(NL) | Truckie's Rekenrace | @@ -1207,8 +1207,25 @@ Game cartridges </part> </software> + <software name="cinderlagr204" cloneof="cinderla" supported="yes"> + <description>Disney's Princess Cinderella - Lernen im Märchenland (Germany, Rev. 204)</description> + <year>2008</year> + <publisher>VTech</publisher> + <info name="serial" value="80-092244-104(GE)" /> + <part name="cart" interface="vsmile_cart"> + <feature name="slot" value="vsmile_rom" /> + <feature name="pcb" value="708201" /> + <feature name="pcb_model" value="708201-4" /> + <feature name="cart_type" value="lilac" /> + <feature name="u1" value="" /> <!-- EPOXY BLOB ROM --> + <dataarea name="rom" size="8388608"> + <rom name="50-092244-204 - Cinderella - Lernen im Marchenland (GER).bin" size="8388608" crc="778c4f0e" sha1="fde2e7f898408b84c3fb9c43c0abfac088ce81df" /> + </dataarea> + </part> + </software> + <software name="cinderlagr104" cloneof="cinderla" supported="yes"> - <description>Disney Princess Cinderella - Lernen im Märchenland (Germany, Rev. 104)</description> + <description>Disney's Princess Cinderella - Lernen im Märchenland (Germany, Rev. 104)</description> <year>2007?</year> <publisher>VTech</publisher> <info name="serial" value="80-092244-104(GE)" /> @@ -1225,7 +1242,7 @@ Game cartridges </software> <software name="cinderlag" cloneof="cinderla" supported="yes"> - <description>Disney Princess Cinderella - Lernen im Märchenland (Germany)</description> + <description>Disney's Princess Cinderella - Lernen im Märchenland (Germany)</description> <year>2005?</year> <publisher>VTech</publisher> <info name="serial" value="80-092244(GE)" /> @@ -1412,6 +1429,23 @@ Game cartridges </part> </software> + <software name="findnemog" cloneof="findnemo" supported="yes"> + <description>Disney/Pixar Findet Nemo - Nemos Unterwasserabenteuer (Germany)</description> + <year>2005</year> + <publisher>VTech</publisher> + <info name="serial" value="50-092424(GER)" /> + <part name="cart" interface="vsmile_cart"> + <feature name="slot" value="vsmile_rom" /> + <feature name="pcb" value="707180" /> + <feature name="pcb_model" value="707180-3" /> + <feature name="cart_type" value="lilac" /> + <feature name="u1" value="" /> <!-- EPOXY BLOB ROM --> + <dataarea name="rom" size="8388608"> + <rom name="50-092424 - Findet Nemo - Nemos Unterwasserabenteuer (GER).bin" size="8388608" crc="71518458" sha1="a20f59c29391fc2b3ece92b599e42c98d846fdfe" /> + </dataarea> + </part> + </software> + <software name="findnemonl" cloneof="findnemo" supported="yes"> <description>Disney/Pixar Finding Nemo - De Wonderwereld Van Nemo (Netherlands)</description> <year>2005?</year> diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 7d56c201172..69af8c860ee 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -2160,6 +2160,10 @@ if (BUSES["NSCSI"]~=null) then files { MAME_DIR .. "src/devices/bus/nscsi/cd.cpp", MAME_DIR .. "src/devices/bus/nscsi/cd.h", + MAME_DIR .. "src/devices/bus/nscsi/cdd2000.cpp", + MAME_DIR .. "src/devices/bus/nscsi/cdd2000.h", + MAME_DIR .. "src/devices/bus/nscsi/cdrn820s.cpp", + MAME_DIR .. "src/devices/bus/nscsi/cdrn820s.h", MAME_DIR .. "src/devices/bus/nscsi/cw7501.cpp", MAME_DIR .. "src/devices/bus/nscsi/cw7501.h", MAME_DIR .. "src/devices/bus/nscsi/devices.cpp", diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 867c1ef0ab2..325283f6f92 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -1851,6 +1851,7 @@ createMESSProjects(_target, _subtarget, "cccp") files { MAME_DIR .. "src/mame/drivers/argo.cpp", MAME_DIR .. "src/mame/drivers/cm1800.cpp", + MAME_DIR .. "src/mame/drivers/debut.cpp", MAME_DIR .. "src/mame/drivers/intellect02.cpp", MAME_DIR .. "src/mame/drivers/lviv.cpp", MAME_DIR .. "src/mame/includes/lviv.h", diff --git a/src/devices/bus/nscsi/cdd2000.cpp b/src/devices/bus/nscsi/cdd2000.cpp new file mode 100644 index 00000000000..36f6a7df82c --- /dev/null +++ b/src/devices/bus/nscsi/cdd2000.cpp @@ -0,0 +1,54 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/******************************************************************************* + + Skeleton device for Philips CDD2000/HP4020 CD-R. + +*******************************************************************************/ + +#include "emu.h" +#include "bus/nscsi/cdd2000.h" +#include "cpu/mc68hc11/mc68hc11.h" +#include "machine/ncr5390.h" + +DEFINE_DEVICE_TYPE(CDD2000, cdd2000_device, "cdd2000", "Philips CDD2000 CD-R") + +cdd2000_device::cdd2000_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, CDD2000, tag, owner, clock) + , nscsi_slot_card_interface(mconfig, *this, "scsic") + , m_cdcpu(*this, "cdcpu") +{ +} + +void cdd2000_device::device_start() +{ +} + +void cdd2000_device::mem_map(address_map &map) +{ + map(0x0400, 0x040f).m("scsic", FUNC(ncr53cf94_device::map)); + // 0x0800, 0x080f is another device + map(0x1000, 0xffff).rom().region("flash", 0x31000); // TODO: banking + map(0x2000, 0x3fff).ram(); +} + +void cdd2000_device::device_add_mconfig(machine_config &config) +{ + MC68HC11(config, m_cdcpu, 8'000'000); // type and clock are total guesses + m_cdcpu->set_addrmap(AS_PROGRAM, &cdd2000_device::mem_map); + + NCR53CF94(config, "scsic", 25'000'000); // type and clock guessed +} + +ROM_START(cdd2000) + ROM_REGION(0x40000, "flash", 0) + ROM_SYSTEM_BIOS(0, "v126", "Firmware v1.26") + ROMX_LOAD("cdd2_126.bin", 0x00000, 0x40000, CRC(8a9f0f85) SHA1(efc6c696b12af7d29fcc37c641bc5879517d6fd8), ROM_BIOS(0)) // 9F9E checksum + ROM_SYSTEM_BIOS(1, "v125", "Firmware v1.25") + ROMX_LOAD("cdd2_125.bin", 0x00000, 0x40000, CRC(17f1c04a) SHA1(882be4ed5daf70a686929fffcb66fa95b431bbe2), ROM_BIOS(1)) // A29B checksum +ROM_END + +const tiny_rom_entry *cdd2000_device::device_rom_region() const +{ + return ROM_NAME(cdd2000); +} diff --git a/src/devices/bus/nscsi/cdd2000.h b/src/devices/bus/nscsi/cdd2000.h new file mode 100644 index 00000000000..e69c65f4548 --- /dev/null +++ b/src/devices/bus/nscsi/cdd2000.h @@ -0,0 +1,31 @@ +// license:BSD-3-Clause +// copyright-holders:AJR + +#ifndef MAME_BUS_NSCSI_CDD2000_H +#define MAME_BUS_NSCSI_CDD2000_H 1 + +#pragma once + +#include "machine/nscsi_bus.h" + +class cdd2000_device : public device_t, public nscsi_slot_card_interface +{ +public: + cdd2000_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + static constexpr feature_type unemulated_features() { return feature::DISK; } + +protected: + virtual void device_start() override; + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + +private: + void mem_map(address_map &map); + + required_device<cpu_device> m_cdcpu; +}; + +DECLARE_DEVICE_TYPE(CDD2000, cdd2000_device) + +#endif // MAME_BUS_NSCSI_CDD2000_H diff --git a/src/devices/bus/nscsi/cdrn820s.cpp b/src/devices/bus/nscsi/cdrn820s.cpp new file mode 100644 index 00000000000..5b3b1b87dbb --- /dev/null +++ b/src/devices/bus/nscsi/cdrn820s.cpp @@ -0,0 +1,53 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/******************************************************************************* + + Skeleton device for Sanyo/Caravalle CDR-N820s. + +*******************************************************************************/ + +#include "emu.h" +#include "bus/nscsi/cdrn820s.h" +#include "machine/wd33c9x.h" + +DEFINE_DEVICE_TYPE(CDRN820S, cdrn820s_device, "cdrn820s", "Caravalle CDR-N820s") + +cdrn820s_device::cdrn820s_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) + , nscsi_slot_card_interface(mconfig, *this, "scsic") + , m_h8(*this, "h8") +{ +} + +cdrn820s_device::cdrn820s_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : cdrn820s_device(mconfig, CDRN820S, tag, owner, clock) +{ +} + +void cdrn820s_device::device_start() +{ +} + +void cdrn820s_device::mem_map(address_map &map) +{ + map(0x00000, 0x1ffff).rom().region("program", 0); +} + +void cdrn820s_device::device_add_mconfig(machine_config &config) +{ + H83048(config, m_h8, 8'000'000); // type and clock unknown + m_h8->set_addrmap(AS_PROGRAM, &cdrn820s_device::mem_map); + m_h8->set_mode_a20(); + + WD33C93A(config, "scsic", 10'000'000); // type and clock unknown +} + +ROM_START(cdrn820s) + ROM_REGION(0x40000, "program", 0) + ROM_LOAD16_WORD_SWAP("cdr_120.bin", 0x00000, 0x20000, CRC(8cac6862) SHA1(e498dcd9006d257ced6cd0b50c76608e9a8023f7)) // Caravelle CDR-N820S 1.20 +ROM_END + +const tiny_rom_entry *cdrn820s_device::device_rom_region() const +{ + return ROM_NAME(cdrn820s); +} diff --git a/src/devices/bus/nscsi/cdrn820s.h b/src/devices/bus/nscsi/cdrn820s.h new file mode 100644 index 00000000000..1f5a273e0bc --- /dev/null +++ b/src/devices/bus/nscsi/cdrn820s.h @@ -0,0 +1,34 @@ +// license:BSD-3-Clause +// copyright-holders:AJR + +#ifndef MAME_BUS_NSCSI_CDRN820S_H +#define MAME_BUS_NSCSI_CDRN820S_H 1 + +#pragma once + +#include "cpu/h8/h83048.h" +#include "machine/nscsi_bus.h" + +class cdrn820s_device : public device_t, public nscsi_slot_card_interface +{ +public: + cdrn820s_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + static constexpr feature_type unemulated_features() { return feature::DISK; } + +protected: + cdrn820s_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + + virtual void device_start() override; + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + +private: + void mem_map(address_map &map); + + required_device<h83048_device> m_h8; +}; + +DECLARE_DEVICE_TYPE(CDRN820S, cdrn820s_device) + +#endif // MAME_BUS_NSCSI_CDRN820S_H diff --git a/src/devices/bus/nscsi/devices.cpp b/src/devices/bus/nscsi/devices.cpp index 6702493313a..c8f45a0d84a 100644 --- a/src/devices/bus/nscsi/devices.cpp +++ b/src/devices/bus/nscsi/devices.cpp @@ -4,6 +4,8 @@ #include "emu.h" #include "bus/nscsi/cd.h" +#include "bus/nscsi/cdd2000.h" +#include "bus/nscsi/cdrn820s.h" #include "bus/nscsi/cw7501.h" #include "bus/nscsi/hd.h" #include "bus/nscsi/s1410.h" @@ -15,4 +17,6 @@ void default_scsi_devices(device_slot_interface &device) device.option_add("s1410", NSCSI_S1410); device.option_add("cw7501", CW7501); device.option_add("cdr4210", CDR4210); + device.option_add("cdrn820s", CDRN820S); + device.option_add("cdd2000", CDD2000); }; diff --git a/src/devices/cpu/h8/h83048.cpp b/src/devices/cpu/h8/h83048.cpp index 4fda46422bc..d90f690a4b6 100644 --- a/src/devices/cpu/h8/h83048.cpp +++ b/src/devices/cpu/h8/h83048.cpp @@ -32,7 +32,6 @@ h83048_device::h83048_device(const machine_config &mconfig, device_type type, co sci0(*this, "sci0"), sci1(*this, "sci1"), watchdog(*this, "watchdog"), - mode_a20(false), ram_start(start), syscr(0) { diff --git a/src/devices/cpu/h8/h83048.h b/src/devices/cpu/h8/h83048.h index 7dac092064e..6876a909c2d 100644 --- a/src/devices/cpu/h8/h83048.h +++ b/src/devices/cpu/h8/h83048.h @@ -66,8 +66,6 @@ protected: required_device<h8_sci_device> sci1; required_device<h8_watchdog_device> watchdog; - bool mode_a20; - uint32_t ram_start; uint8_t syscr; diff --git a/src/devices/machine/scc68070.cpp b/src/devices/machine/scc68070.cpp index 35ec484f1f5..4ccd51d78a6 100644 --- a/src/devices/machine/scc68070.cpp +++ b/src/devices/machine/scc68070.cpp @@ -24,34 +24,25 @@ TODO: #include "emu.h" #include "machine/scc68070.h" -/*----------- debug defines -----------*/ +#define LOG_I2C (1 << 0) +#define LOG_UART (1 << 1) +#define LOG_TIMERS (1 << 2) +#define LOG_TIMERS_HF (1 << 3) +#define LOG_DMA (1 << 4) +#define LOG_MMU (1 << 5) +#define LOG_IRQS (1 << 6) +#define LOG_UNKNOWN (1 << 7) +#define LOG_ALL (LOG_I2C | LOG_UART | LOG_TIMERS | LOG_DMA | LOG_MMU | LOG_IRQS | LOG_UNKNOWN) -#define VERBOSE_LEVEL (1) +#define VERBOSE (LOG_UART) -#define ENABLE_VERBOSE_LOG (0) +#include "logmacro.h" #define ENABLE_UART_PRINTING (0) // device type definition DEFINE_DEVICE_TYPE(SCC68070, scc68070_device, "scc68070", "Philips SCC68070") -#if ENABLE_VERBOSE_LOG -static inline void ATTR_PRINTF(3,4) verboselog(device_t& device, int n_level, const char *s_fmt, ...) -{ - if ( VERBOSE_LEVEL >= n_level ) - { - va_list v; - char buf[ 32768 ]; - va_start( v, s_fmt ); - vsprintf( buf, s_fmt, v ); - va_end( v ); - device.logerror("%s: %s", device.machine().describe_context(), buf ); - } -} -#else -#define verboselog(x,y,z, ...) -#endif - //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -76,6 +67,7 @@ scc68070_device::scc68070_device(const machine_config &mconfig, const char *tag, , m_iack4_callback(*this) , m_iack5_callback(*this) , m_iack7_callback(*this) + , m_uart_tx_callback(*this) , m_ipl(0) , m_in2_line(CLEAR_LINE) , m_in4_line(CLEAR_LINE) @@ -101,6 +93,7 @@ void scc68070_device::device_resolve_objects() m_iack4_callback.resolve_safe(autovector(4)); m_iack5_callback.resolve_safe(autovector(5)); m_iack7_callback.resolve_safe(autovector(7)); + m_uart_tx_callback.resolve_safe(); } //------------------------------------------------- @@ -275,11 +268,6 @@ void scc68070_device::device_reset() m_mmu.desc[index].base = 0; } - memset(m_seeds, 0, 10 * sizeof(uint16_t)); - memset(m_state, 0, 8 * sizeof(uint8_t)); - m_mcu_value = 0; - m_mcu_ack = 0; - update_ipl(); } @@ -443,16 +431,6 @@ void scc68070_device::set_timer_callback(int channel) } } -void scc68070_device::set_quizard_mcu_ack(uint8_t ack) -{ - m_mcu_ack = ack; -} - -void scc68070_device::set_quizard_mcu_value(uint16_t value) -{ - m_mcu_value = value; -} - TIMER_CALLBACK_MEMBER( scc68070_device::timer0_callback ) { m_timers.timer0 = m_timers.reload_register; @@ -536,7 +514,7 @@ TIMER_CALLBACK_MEMBER( scc68070_device::rx_callback ) if (m_uart.receive_pointer > -1) { - verboselog(*this, 2, "scc68070_rx_callback: Receiving %02x\n", m_uart.receive_holding_register); + LOGMASKED(LOG_UART, "scc68070_rx_callback: Receiving %02x\n", m_uart.receive_holding_register); m_uart_rx_int = true; update_ipl(); @@ -558,173 +536,6 @@ TIMER_CALLBACK_MEMBER( scc68070_device::rx_callback ) uart_rx_check(); } -void scc68070_device::quizard_rx(uint8_t data) -{ - uart_rx(0x5a); - uart_rx(data); -} - -void scc68070_device::quizard_set_seeds(uint8_t *rx) -{ - m_seeds[0] = (rx[1] << 8) | rx[0]; - m_seeds[1] = (rx[3] << 8) | rx[2]; - m_seeds[2] = (rx[5] << 8) | rx[4]; - m_seeds[3] = (rx[7] << 8) | rx[6]; - m_seeds[4] = (rx[9] << 8) | rx[8]; - m_seeds[5] = (rx[11] << 8) | rx[10]; - m_seeds[6] = (rx[13] << 8) | rx[12]; - m_seeds[7] = (rx[15] << 8) | rx[14]; - m_seeds[8] = (rx[17] << 8) | rx[16]; - m_seeds[9] = (rx[19] << 8) | rx[18]; -} - -void scc68070_device::quizard_calculate_state() -{ - //const uint16_t desired_bitfield = mcu_value; - const uint16_t field0 = 0x00ff; - const uint16_t field1 = m_mcu_value ^ 0x00ff; - - uint16_t total0 = 0; - uint16_t total1 = 0; - - for(int index = 0; index < 10; index++) - { - if (field0 & (1 << index)) - { - total0 += m_seeds[index]; - } - if (field1 & (1 << index)) - { - total1 += m_seeds[index]; - } - } - - uint16_t hi0 = (total0 >> 8) + 0x40; - m_state[2] = hi0 / 2; - m_state[3] = hi0 - m_state[2]; - - uint16_t lo0 = (total0 & 0x00ff) + 0x40; - m_state[0] = lo0 / 2; - m_state[1] = lo0 - m_state[0]; - - uint16_t hi1 = (total1 >> 8) + 0x40; - m_state[6] = hi1 / 2; - m_state[7] = hi1 - m_state[6]; - - uint16_t lo1 = (total1 & 0x00ff) + 0x40; - m_state[4] = lo1 / 2; - m_state[5] = lo1 - m_state[4]; -} - -void scc68070_device::mcu_frame() -{ - if (0)//mcu_active) - { - quizard_calculate_state(); - uart_rx(0x5a); - for(auto & elem : m_state) - { - uart_rx(elem); - } - } -} - -void scc68070_device::quizard_handle_byte_tx() -{ - static int state = 0; - static uint8_t rx[0x100]; - static uint8_t rx_ptr = 0xff; - uint8_t tx = m_uart.transmit_holding_register; - - switch (state) - { - case 0: // Waiting for a leadoff byte - if (tx == m_mcu_ack) // Sequence end - { - //scc68070_uart_rx(machine, scc68070, 0x5a); - //scc68070_uart_rx(machine, scc68070, 0x42); - } - else - { - switch (tx) - { - case 0x44: // DATABASEPATH = **_DATABASE/ - rx[0] = 0x44; - rx_ptr = 1; - state = 3; - break; - case 0x2e: // Unknown; ignored - break; - case 0x56: // Seed start - rx_ptr = 0; - state = 1; - break; - default: - //printf("Unknown leadoff byte: %02x\n", tx); - break; - } - } - break; - - case 1: // Receiving the seed - rx[rx_ptr] = tx; - rx_ptr++; - if (rx_ptr == 20) - { - //printf("Calculating seeds\n"); - quizard_set_seeds(rx); - quizard_calculate_state(); - state = 2; - } - break; - - case 2: // Receiving the seed acknowledge - case 4: - if (tx == m_mcu_ack) - { - if (state == 2) - { - state = 4; - } - else - { - state = 0; - } - //printf("Sending seed ack\n"); - uart_rx(0x5a); - uart_rx(m_state[0]); - uart_rx(m_state[1]); - uart_rx(m_state[2]); - uart_rx(m_state[3]); - uart_rx(m_state[4]); - uart_rx(m_state[5]); - uart_rx(m_state[6]); - uart_rx(m_state[7]); - } - break; - - case 3: // Receiving the database path - rx[rx_ptr] = tx; - rx_ptr++; - if (tx == 0x0a) - { - /*rx[rx_ptr] = 0; - //printf("Database path: %s\n", rx); - scc68070_uart_rx(machine, scc68070, 0x5a); - scc68070_uart_rx(machine, scc68070, g_state[0]); - scc68070_uart_rx(machine, scc68070, g_state[1]); - scc68070_uart_rx(machine, scc68070, g_state[2]); - scc68070_uart_rx(machine, scc68070, g_state[3]); - scc68070_uart_rx(machine, scc68070, g_state[4]); - scc68070_uart_rx(machine, scc68070, g_state[5]); - scc68070_uart_rx(machine, scc68070, g_state[6]); - scc68070_uart_rx(machine, scc68070, g_state[7]);*/ - state = 0; - } - break; - } -} - TIMER_CALLBACK_MEMBER( scc68070_device::tx_callback ) { if (((m_uart.command_register >> 2) & 3) == 1) @@ -735,9 +546,9 @@ TIMER_CALLBACK_MEMBER( scc68070_device::tx_callback ) if (m_uart.transmit_pointer > -1) { m_uart.transmit_holding_register = m_uart.transmit_buffer[0]; - quizard_handle_byte_tx(); + m_uart_tx_callback(m_uart.transmit_holding_register); - verboselog(*this, 2, "tx_callback: Transmitting %02x\n", m_uart.transmit_holding_register); + LOGMASKED(LOG_UART, "tx_callback: Transmitting %02x\n", machine().describe_context(), m_uart.transmit_holding_register); for(int index = 0; index < m_uart.transmit_pointer; index++) { m_uart.transmit_buffer[index] = m_uart.transmit_buffer[index+1]; @@ -772,31 +583,31 @@ READ16_MEMBER( scc68070_device::periphs_r ) case 0x2000/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: I2C Data Register: %04x & %04x\n", m_i2c.data_register, mem_mask); + LOGMASKED(LOG_I2C, "%s: I2C Data Register Read: %04x & %04x\n", machine().describe_context(), m_i2c.data_register, mem_mask); } return m_i2c.data_register; case 0x2002/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: I2C Address Register: %04x & %04x\n", m_i2c.address_register, mem_mask); + LOGMASKED(LOG_I2C, "%s: I2C Address Register Read: %04x & %04x\n", machine().describe_context(), m_i2c.address_register, mem_mask); } return m_i2c.address_register; case 0x2004/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: I2C Status Register: %04x & %04x\n", m_i2c.status_register, mem_mask); + LOGMASKED(LOG_I2C, "%s: I2C Status Register Read: %04x & %04x\n", machine().describe_context(), m_i2c.status_register, mem_mask); } return m_i2c.status_register & 0xef; // hack for magicard case 0x2006/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: I2C Control Register: %04x & %04x\n", m_i2c.control_register, mem_mask); + LOGMASKED(LOG_I2C, "%s: I2C Control Register Read: %04x & %04x\n", machine().describe_context(), m_i2c.control_register, mem_mask); } return m_i2c.control_register; case 0x2008/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: I2C Clock Control Register: %04x & %04x\n", m_i2c.clock_control_register, mem_mask); + LOGMASKED(LOG_I2C, "%s: I2C Clock Control Register Read: %04x & %04x\n", machine().describe_context(), m_i2c.clock_control_register, mem_mask); } return m_i2c.clock_control_register; @@ -804,22 +615,22 @@ READ16_MEMBER( scc68070_device::periphs_r ) case 0x2010/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: UART Mode Register: %04x & %04x\n", m_uart.mode_register, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Mode Register Read: %04x & %04x\n", machine().describe_context(), m_uart.mode_register, mem_mask); } else { - verboselog(*this, 0, "periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Read: %04x & %04x\n", machine().describe_context(), offset * 2, mem_mask); } return m_uart.mode_register | 0x20; case 0x2012/2: m_uart.status_register |= (1 << 1); if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: UART Status Register: %04x & %04x\n", m_uart.status_register, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Status Register Read: %04x & %04x\n", machine().describe_context(), m_uart.status_register, mem_mask); } else { - verboselog(*this, 0, "periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Read: %04x & %04x\n", machine().describe_context(), offset * 2, mem_mask); } return m_uart.status_register | 0x08; // hack for magicard @@ -827,41 +638,41 @@ READ16_MEMBER( scc68070_device::periphs_r ) case 0x2014/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: UART Clock Select: %04x & %04x\n", m_uart.clock_select, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Clock Select Read: %04x & %04x\n", machine().describe_context(), m_uart.clock_select, mem_mask); } else { - verboselog(*this, 0, "periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Read: %04x & %04x\n", machine().describe_context(), offset * 2, mem_mask); } return m_uart.clock_select | 0x08; case 0x2016/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: UART Command Register: %02x & %04x\n", m_uart.command_register, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Command Register Read: %02x & %04x\n", machine().describe_context(), m_uart.command_register, mem_mask); } else { - verboselog(*this, 0, "periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Read: %04x & %04x\n", machine().describe_context(), offset * 2, mem_mask); } return m_uart.command_register | 0x80; case 0x2018/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: UART Transmit Holding Register: %02x & %04x\n", m_uart.transmit_holding_register, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Transmit Holding Register Read: %02x & %04x\n", machine().describe_context(), m_uart.transmit_holding_register, mem_mask); } else { - verboselog(*this, 0, "periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Read: %04x & %04x\n", machine().describe_context(), offset * 2, mem_mask); } return m_uart.transmit_holding_register; case 0x201a/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: UART Receive Holding Register: %02x & %04x\n", m_uart.receive_holding_register, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Receive Holding Register Read: %02x & %04x\n", machine().describe_context(), m_uart.receive_holding_register, mem_mask); } else { - verboselog(*this, 0, "periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Read: %04x & %04x\n", machine().describe_context(), offset * 2, mem_mask); } if (m_uart_rx_int) { @@ -878,38 +689,37 @@ READ16_MEMBER( scc68070_device::periphs_r ) } m_uart.receive_pointer--; } - //printf("R: %02x\n", m_uart.receive_holding_register); return m_uart.receive_holding_register; // Timers: 80002020 to 80002029 case 0x2020/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: Timer Control Register: %02x & %04x\n", m_timers.timer_control_register, mem_mask); + LOGMASKED(LOG_TIMERS, "%s: Timer Control Register Read: %02x & %04x\n", machine().describe_context(), m_timers.timer_control_register, mem_mask); } if (ACCESSING_BITS_8_15) { - verboselog(*this, 12, "periphs_r: Timer Status Register: %02x & %04x\n", m_timers.timer_status_register, mem_mask); + LOGMASKED(LOG_TIMERS_HF, "%s: Timer Status Register Read: %02x & %04x\n", machine().describe_context(), m_timers.timer_status_register, mem_mask); } return (m_timers.timer_status_register << 8) | m_timers.timer_control_register; case 0x2022/2: - verboselog(*this, 2, "periphs_r: Timer Reload Register: %04x & %04x\n", m_timers.reload_register, mem_mask); + LOGMASKED(LOG_TIMERS, "%s: Timer Reload Register Read: %04x & %04x\n", machine().describe_context(), m_timers.reload_register, mem_mask); return m_timers.reload_register; case 0x2024/2: - verboselog(*this, 2, "periphs_r: Timer 0: %04x & %04x\n", m_timers.timer0, mem_mask); + LOGMASKED(LOG_TIMERS, "%s: Timer 0 Read: %04x & %04x\n", machine().describe_context(), m_timers.timer0, mem_mask); return m_timers.timer0; case 0x2026/2: - verboselog(*this, 2, "periphs_r: Timer 1: %04x & %04x\n", m_timers.timer1, mem_mask); + LOGMASKED(LOG_TIMERS, "%s: Timer 1 Read: %04x & %04x\n", machine().describe_context(), m_timers.timer1, mem_mask); return m_timers.timer1; case 0x2028/2: - verboselog(*this, 2, "periphs_r: Timer 2: %04x & %04x\n", m_timers.timer2, mem_mask); + LOGMASKED(LOG_TIMERS, "%s: Timer 2 Read: %04x & %04x\n", machine().describe_context(), m_timers.timer2, mem_mask); return m_timers.timer2; // PICR1: 80002045 case 0x2044/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: Peripheral Interrupt Control Register 1: %02x & %04x\n", m_picr1, mem_mask); + LOGMASKED(LOG_IRQS, "%s: Peripheral Interrupt Control Register 1 Read: %02x & %04x\n", machine().describe_context(), m_picr1, mem_mask); } return m_picr1 & 0x77; @@ -917,7 +727,7 @@ READ16_MEMBER( scc68070_device::periphs_r ) case 0x2046/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: Peripheral Interrupt Control Register 2: %02x & %04x\n", m_picr2, mem_mask); + LOGMASKED(LOG_IRQS, "%s: Peripheral Interrupt Control Register 2 Read: %02x & %04x\n", machine().describe_context(), m_picr2, mem_mask); } return m_picr2 & 0x77; @@ -926,65 +736,65 @@ READ16_MEMBER( scc68070_device::periphs_r ) case 0x4040/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: DMA(%d) Error Register: %04x & %04x\n", (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].channel_error, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Error Register Read: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].channel_error, mem_mask); } if (ACCESSING_BITS_8_15) { - verboselog(*this, 2, "periphs_r: DMA(%d) Status Register: %04x & %04x\n", (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].channel_status, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Status Register Read: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].channel_status, mem_mask); } return (m_dma.channel[(offset - 0x2000) / 32].channel_status << 8) | m_dma.channel[(offset - 0x2000) / 32].channel_error; case 0x4004/2: case 0x4044/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: DMA(%d) Operation Control Register: %02x & %04x\n", (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].operation_control, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Operation Control Register Read: %02x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].operation_control, mem_mask); } if (ACCESSING_BITS_8_15) { - verboselog(*this, 2, "periphs_r: DMA(%d) Device Control Register: %02x & %04x\n", (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].device_control, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Device Control Register Read: %02x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].device_control, mem_mask); } return (m_dma.channel[(offset - 0x2000) / 32].device_control << 8) | m_dma.channel[(offset - 0x2000) / 32].operation_control; case 0x4006/2: case 0x4046/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: DMA(%d) Channel Control Register: %02x & %04x\n", (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].channel_control, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Channel Control Register Read: %02x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].channel_control, mem_mask); } if (ACCESSING_BITS_8_15) { - verboselog(*this, 2, "periphs_r: DMA(%d) Sequence Control Register: %02x & %04x\n", (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].sequence_control, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Sequence Control Register Read: %02x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].sequence_control, mem_mask); } return (m_dma.channel[(offset - 0x2000) / 32].sequence_control << 8) | m_dma.channel[(offset - 0x2000) / 32].channel_control; case 0x400a/2: - verboselog(*this, 2, "periphs_r: DMA(%d) Memory Transfer Counter: %04x & %04x\n", (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].transfer_counter, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Memory Transfer Counter Read: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].transfer_counter, mem_mask); return m_dma.channel[(offset - 0x2000) / 32].transfer_counter; case 0x400c/2: case 0x404c/2: - verboselog(*this, 2, "periphs_r: DMA(%d) Memory Address Counter (High Word): %04x & %04x\n", (offset - 0x2000) / 32, (m_dma.channel[(offset - 0x2000) / 32].memory_address_counter >> 16), mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Memory Address Counter (High Word) Read: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, (m_dma.channel[(offset - 0x2000) / 32].memory_address_counter >> 16), mem_mask); return (m_dma.channel[(offset - 0x2000) / 32].memory_address_counter >> 16); case 0x400e/2: case 0x404e/2: - verboselog(*this, 2, "periphs_r: DMA(%d) Memory Address Counter (Low Word): %04x & %04x\n", (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].memory_address_counter, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Memory Address Counter (Low Word) Read: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].memory_address_counter, mem_mask); return m_dma.channel[(offset - 0x2000) / 32].memory_address_counter; case 0x4014/2: case 0x4054/2: - verboselog(*this, 2, "periphs_r: DMA(%d) Device Address Counter (High Word): %04x & %04x\n", (offset - 0x2000) / 32, (m_dma.channel[(offset - 0x2000) / 32].device_address_counter >> 16), mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Device Address Counter (High Word) Read: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, (m_dma.channel[(offset - 0x2000) / 32].device_address_counter >> 16), mem_mask); return (m_dma.channel[(offset - 0x2000) / 32].device_address_counter >> 16); case 0x4016/2: case 0x4056/2: - verboselog(*this, 2, "periphs_r: DMA(%d) Device Address Counter (Low Word): %04x & %04x\n", (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].device_address_counter, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Device Address Counter (Low Word) Read: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, m_dma.channel[(offset - 0x2000) / 32].device_address_counter, mem_mask); return m_dma.channel[(offset - 0x2000) / 32].device_address_counter; // MMU: 80008000 to 8000807f case 0x8000/2: // Status / Control register if (ACCESSING_BITS_0_7) { // Control - verboselog(*this, 2, "periphs_r: MMU Control: %02x & %04x\n", m_mmu.control, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU Control Read: %02x & %04x\n", machine().describe_context(), m_mmu.control, mem_mask); return m_mmu.control; } // Status else { - verboselog(*this, 2, "periphs_r: MMU Status: %02x & %04x\n", m_mmu.status, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU Status Read: %02x & %04x\n", machine().describe_context(), m_mmu.status, mem_mask); return m_mmu.status; } case 0x8040/2: @@ -995,7 +805,7 @@ READ16_MEMBER( scc68070_device::periphs_r ) case 0x8068/2: case 0x8070/2: case 0x8078/2: // Attributes (SD0-7) - verboselog(*this, 2, "periphs_r: MMU descriptor %d attributes: %04x & %04x\n", (offset - 0x4020) / 4, m_mmu.desc[(offset - 0x4020) / 4].attr, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU descriptor %d attributes Read: %04x & %04x\n", machine().describe_context(), (offset - 0x4020) / 4, m_mmu.desc[(offset - 0x4020) / 4].attr, mem_mask); return m_mmu.desc[(offset - 0x4020) / 4].attr; case 0x8042/2: case 0x804a/2: @@ -1005,7 +815,7 @@ READ16_MEMBER( scc68070_device::periphs_r ) case 0x806a/2: case 0x8072/2: case 0x807a/2: // Segment Length (SD0-7) - verboselog(*this, 2, "periphs_r: MMU descriptor %d length: %04x & %04x\n", (offset - 0x4020) / 4, m_mmu.desc[(offset - 0x4020) / 4].length, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU descriptor %d length Read: %04x & %04x\n", machine().describe_context(), (offset - 0x4020) / 4, m_mmu.desc[(offset - 0x4020) / 4].length, mem_mask); return m_mmu.desc[(offset - 0x4020) / 4].length; case 0x8044/2: case 0x804c/2: @@ -1017,7 +827,7 @@ READ16_MEMBER( scc68070_device::periphs_r ) case 0x807c/2: // Segment Number (SD0-7, A0=1 only) if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_r: MMU descriptor %d segment: %02x & %04x\n", (offset - 0x4020) / 4, m_mmu.desc[(offset - 0x4020) / 4].segment, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU descriptor %d segment Read: %02x & %04x\n", machine().describe_context(), (offset - 0x4020) / 4, m_mmu.desc[(offset - 0x4020) / 4].segment, mem_mask); return m_mmu.desc[(offset - 0x4020) / 4].segment; } break; @@ -1029,10 +839,10 @@ READ16_MEMBER( scc68070_device::periphs_r ) case 0x806e/2: case 0x8076/2: case 0x807e/2: // Base Address (SD0-7) - verboselog(*this, 2, "periphs_r: MMU descriptor %d base: %04x & %04x\n", (offset - 0x4020) / 4, m_mmu.desc[(offset - 0x4020) / 4].base, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU descriptor %d base Read: %04x & %04x\n", machine().describe_context(), (offset - 0x4020) / 4, m_mmu.desc[(offset - 0x4020) / 4].base, mem_mask); return m_mmu.desc[(offset - 0x4020) / 4].base; default: - verboselog(*this, 0, "periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Read: %04x & %04x\n", machine().describe_context(), offset * 2, mem_mask); break; } @@ -1045,7 +855,7 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) { // Interrupts: 80001001 case 0x1000/2: // LIR priority level - verboselog(*this, 2, "periphs_w: LIR: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_IRQS, "%s: LIR Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); COMBINE_DATA(&m_lir); break; @@ -1053,35 +863,35 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x2000/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: I2C Data Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_I2C, "%s: I2C Data Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_i2c.data_register = data & 0x00ff; } break; case 0x2002/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: I2C Address Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_I2C, "%s: I2C Address Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_i2c.address_register = data & 0x00ff; } break; case 0x2004/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: I2C Status Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_I2C, "%s: I2C Status Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_i2c.status_register = data & 0x00ff; } break; case 0x2006/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: I2C Control Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_I2C, "%s: I2C Control Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_i2c.control_register = data & 0x00ff; } break; case 0x2008/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: I2C Clock Control Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_I2C, "%s: I2C Clock Control Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_i2c.clock_control_register = data & 0x00ff; } break; @@ -1090,70 +900,70 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x2010/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: UART Mode Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Mode Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_uart.mode_register = data & 0x00ff; } else { - verboselog(*this, 0, "periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Write: %04x = %04x & %04x\n", machine().describe_context(), offset * 2, data, mem_mask); } break; case 0x2012/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: UART Status Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Status Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_uart.status_register = data & 0x00ff; } else { - verboselog(*this, 0, "periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Write: %04x = %04x & %04x\n", machine().describe_context(), offset * 2, data, mem_mask); } break; case 0x2014/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: UART Clock Select: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Clock Select Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_uart.clock_select = data & 0x00ff; } else { - verboselog(*this, 0, "periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Write: %04x = %04x & %04x\n", machine().describe_context(), offset * 2, data, mem_mask); } break; case 0x2016/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: UART Command Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Command Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_uart.command_register = data & 0x00ff; uart_rx_check(); uart_tx_check(); } else { - verboselog(*this, 0, "periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Write: %04x = %04x & %04x\n", machine().describe_context(), offset * 2, data, mem_mask); } break; case 0x2018/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: UART Transmit Holding Register: %04x & %04x: %c\n", data, mem_mask, (data >= 0x20 && data < 0x7f) ? (data & 0x00ff) : ' '); + LOGMASKED(LOG_UART, "%s: UART Transmit Holding Register Write: %04x & %04x: %c\n", machine().describe_context(), data, mem_mask, (data >= 0x20 && data < 0x7f) ? (data & 0x00ff) : ' '); uart_tx(data & 0x00ff); m_uart.transmit_holding_register = data & 0x00ff; } else { - verboselog(*this, 0, "periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Write: %04x = %04x & %04x\n", machine().describe_context(), offset * 2, data, mem_mask); } break; case 0x201a/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: UART Receive Holding Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_UART, "%s: UART Receive Holding Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_uart.receive_holding_register = data & 0x00ff; } else { - verboselog(*this, 0, "periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Write: %04x = %04x & %04x\n", machine().describe_context(), offset * 2, data, mem_mask); } break; @@ -1161,30 +971,30 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x2020/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: Timer Control Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_TIMERS, "%s: Timer Control Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_timers.timer_control_register = data & 0x00ff; } if (ACCESSING_BITS_8_15) { - verboselog(*this, 12, "periphs_w: Timer Status Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_TIMERS_HF, "%s: Timer Status Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_timers.timer_status_register &= ~(data >> 8); } break; case 0x2022/2: - verboselog(*this, 2, "periphs_w: Timer Reload Register: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_TIMERS, "%s: Timer Reload Register Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); COMBINE_DATA(&m_timers.reload_register); break; case 0x2024/2: - verboselog(*this, 2, "periphs_w: Timer 0: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_TIMERS, "%s: Timer 0 Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); COMBINE_DATA(&m_timers.timer0); set_timer_callback(0); break; case 0x2026/2: - verboselog(*this, 2, "periphs_w: Timer 1: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_TIMERS, "%s: Timer 1 Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); COMBINE_DATA(&m_timers.timer1); break; case 0x2028/2: - verboselog(*this, 2, "periphs_w: Timer 2: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_TIMERS, "%s: Timer 2 Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); COMBINE_DATA(&m_timers.timer2); break; @@ -1192,7 +1002,7 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x2044/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: Peripheral Interrupt Control Register 1: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_IRQS, "%s: Peripheral Interrupt Control Register 1 Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_picr1 = data & 0x0077; switch (data & 0x0088) { @@ -1228,7 +1038,7 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x2046/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: Peripheral Interrupt Control Register 2: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_IRQS, "%s: Peripheral Interrupt Control Register 2 Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_picr2 = data & 0x0077; switch (data & 0x0088) { @@ -1265,11 +1075,11 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x4040/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: DMA(%d) Error (invalid): %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Error (invalid) Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); } if (ACCESSING_BITS_8_15) { - verboselog(*this, 2, "periphs_w: DMA(%d) Status: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Status Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); m_dma.channel[(offset - 0x2000) / 32].channel_status &= ~((data >> 8) & 0xb0); update_ipl(); } @@ -1278,12 +1088,12 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x4044/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: DMA(%d) Operation Control Register: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Operation Control Register Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); m_dma.channel[(offset - 0x2000) / 32].operation_control = data & 0x00ff; } if (ACCESSING_BITS_8_15) { - verboselog(*this, 2, "periphs_w: DMA(%d) Device Control Register: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Device Control Register Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); m_dma.channel[(offset - 0x2000) / 32].device_control = data >> 8; } break; @@ -1291,7 +1101,7 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x4046/2: if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: DMA(%d) Channel Control Register: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Channel Control Register Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); m_dma.channel[(offset - 0x2000) / 32].channel_control = data & 0x007f; if (data & CCR_SO) { @@ -1301,35 +1111,35 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) } if (ACCESSING_BITS_8_15) { - verboselog(*this, 2, "periphs_w: DMA(%d) Sequence Control Register: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Sequence Control Register Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); m_dma.channel[(offset - 0x2000) / 32].sequence_control = data >> 8; } break; case 0x400a/2: - verboselog(*this, 2, "periphs_w: DMA(%d) Memory Transfer Counter: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Memory Transfer Counter Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); COMBINE_DATA(&m_dma.channel[(offset - 0x2000) / 32].transfer_counter); break; case 0x400c/2: case 0x404c/2: - verboselog(*this, 2, "periphs_w: DMA(%d) Memory Address Counter (High Word): %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Memory Address Counter (High Word) Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); m_dma.channel[(offset - 0x2000) / 32].memory_address_counter &= ~(mem_mask << 16); m_dma.channel[(offset - 0x2000) / 32].memory_address_counter |= data << 16; break; case 0x400e/2: case 0x404e/2: - verboselog(*this, 2, "periphs_w: DMA(%d) Memory Address Counter (Low Word): %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Memory Address Counter (Low Word) Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); m_dma.channel[(offset - 0x2000) / 32].memory_address_counter &= ~mem_mask; m_dma.channel[(offset - 0x2000) / 32].memory_address_counter |= data; break; case 0x4014/2: case 0x4054/2: - verboselog(*this, 2, "periphs_w: DMA(%d) Device Address Counter (High Word): %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Device Address Counter (High Word) Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); m_dma.channel[(offset - 0x2000) / 32].device_address_counter &= ~(mem_mask << 16); m_dma.channel[(offset - 0x2000) / 32].device_address_counter |= data << 16; break; case 0x4016/2: case 0x4056/2: - verboselog(*this, 2, "periphs_w: DMA(%d) Device Address Counter (Low Word): %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); + LOGMASKED(LOG_DMA, "%s: DMA(%d) Device Address Counter (Low Word) Write: %04x & %04x\n", machine().describe_context(), (offset - 0x2000) / 32, data, mem_mask); m_dma.channel[(offset - 0x2000) / 32].device_address_counter &= ~mem_mask; m_dma.channel[(offset - 0x2000) / 32].device_address_counter |= data; break; @@ -1338,12 +1148,12 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x8000/2: // Status / Control register if (ACCESSING_BITS_0_7) { // Control - verboselog(*this, 2, "periphs_w: MMU Control: %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU Control Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); m_mmu.control = data & 0x00ff; } // Status else { - verboselog(*this, 0, "periphs_w: MMU Status (invalid): %04x & %04x\n", data, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU Status (invalid) Write: %04x & %04x\n", machine().describe_context(), data, mem_mask); } break; case 0x8040/2: @@ -1354,7 +1164,7 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x8068/2: case 0x8070/2: case 0x8078/2: // Attributes (SD0-7) - verboselog(*this, 2, "periphs_w: MMU descriptor %d attributes: %04x & %04x\n", (offset - 0x4020) / 4, data, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU descriptor %d attributes Write: %04x & %04x\n", machine().describe_context(), (offset - 0x4020) / 4, data, mem_mask); COMBINE_DATA(&m_mmu.desc[(offset - 0x4020) / 4].attr); break; case 0x8042/2: @@ -1365,7 +1175,7 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x806a/2: case 0x8072/2: case 0x807a/2: // Segment Length (SD0-7) - verboselog(*this, 2, "periphs_w: MMU descriptor %d length: %04x & %04x\n", (offset - 0x4020) / 4, data, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU descriptor %d length Write: %04x & %04x\n", machine().describe_context(), (offset - 0x4020) / 4, data, mem_mask); COMBINE_DATA(&m_mmu.desc[(offset - 0x4020) / 4].length); break; case 0x8044/2: @@ -1378,7 +1188,7 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x807c/2: // Segment Number (SD0-7, A0=1 only) if (ACCESSING_BITS_0_7) { - verboselog(*this, 2, "periphs_w: MMU descriptor %d segment: %04x & %04x\n", (offset - 0x4020) / 4, data, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU descriptor %d segment Write: %04x & %04x\n", machine().describe_context(), (offset - 0x4020) / 4, data, mem_mask); m_mmu.desc[(offset - 0x4020) / 4].segment = data & 0x00ff; } break; @@ -1390,11 +1200,11 @@ WRITE16_MEMBER( scc68070_device::periphs_w ) case 0x806e/2: case 0x8076/2: case 0x807e/2: // Base Address (SD0-7) - verboselog(*this, 2, "periphs_w: MMU descriptor %d base: %04x & %04x\n", (offset - 0x4020) / 4, data, mem_mask); + LOGMASKED(LOG_MMU, "%s: MMU descriptor %d base Write: %04x & %04x\n", machine().describe_context(), (offset - 0x4020) / 4, data, mem_mask); COMBINE_DATA(&m_mmu.desc[(offset - 0x4020) / 4].base); break; default: - verboselog(*this, 0, "periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); + LOGMASKED(LOG_UNKNOWN, "%s: Unknown Register Write: %04x = %04x & %04x\n", machine().describe_context(), offset * 2, data, mem_mask); break; } } diff --git a/src/devices/machine/scc68070.h b/src/devices/machine/scc68070.h index c910a7d7970..0a785f25695 100644 --- a/src/devices/machine/scc68070.h +++ b/src/devices/machine/scc68070.h @@ -139,6 +139,7 @@ public: auto iack4_callback() { return m_iack4_callback.bind(); } auto iack5_callback() { return m_iack5_callback.bind(); } auto iack7_callback() { return m_iack7_callback.bind(); } + auto uart_tx_callback() { return m_uart_tx_callback.bind(); } DECLARE_WRITE_LINE_MEMBER(in2_w); DECLARE_WRITE_LINE_MEMBER(in4_w); @@ -149,14 +150,6 @@ public: // external callbacks void uart_rx(uint8_t data); - void uart_tx(uint8_t data); - - // UART Access for Quizard - void set_quizard_mcu_value(uint16_t value); - void set_quizard_mcu_ack(uint8_t ack); - void quizard_rx(uint8_t data); - - void mcu_frame(); TIMER_CALLBACK_MEMBER( timer0_callback ); TIMER_CALLBACK_MEMBER( rx_callback ); @@ -285,6 +278,7 @@ private: void uart_rx_check(); void uart_tx_check(); + void uart_tx(uint8_t data); void set_timer_callback(int channel); // callbacks @@ -292,14 +286,9 @@ private: devcb_read8 m_iack4_callback; devcb_read8 m_iack5_callback; devcb_read8 m_iack7_callback; + devcb_write8 m_uart_tx_callback; // internal state - uint16_t m_seeds[10]; - uint8_t m_state[8]; - - uint16_t m_mcu_value; - uint8_t m_mcu_ack; - uint8_t m_ipl; int m_in2_line; int m_in4_line; @@ -321,11 +310,6 @@ private: timer_regs_t m_timers; dma_regs_t m_dma; mmu_regs_t m_mmu; - - // non-static internal members - void quizard_calculate_state(); - void quizard_set_seeds(uint8_t *rx); - void quizard_handle_byte_tx(); }; // device type definition diff --git a/src/emu/profiler.cpp b/src/emu/profiler.cpp index 8678c917447..c3c0ea05608 100644 --- a/src/emu/profiler.cpp +++ b/src/emu/profiler.cpp @@ -159,6 +159,7 @@ void real_profiler_state::update_text(running_machine &machine) { PROFILER_INPUT, "Input Processing" }, { PROFILER_MOVIE_REC, "Movie Recording" }, { PROFILER_LOGERROR, "Error Logging" }, + { PROFILER_LUA, "LUA" }, { PROFILER_EXTRA, "Unaccounted/Overhead" }, { PROFILER_USER1, "User 1" }, { PROFILER_USER2, "User 2" }, diff --git a/src/emu/profiler.h b/src/emu/profiler.h index 8000840af9a..99712afe029 100644 --- a/src/emu/profiler.h +++ b/src/emu/profiler.h @@ -48,9 +48,10 @@ enum profile_type PROFILER_BLIT, PROFILER_SOUND, PROFILER_TIMER_CALLBACK, - PROFILER_INPUT, // input.c and inptport.c + PROFILER_INPUT, // input.cpp and inptport.cpp PROFILER_MOVIE_REC, // movie recording PROFILER_LOGERROR, // logerror + PROFILER_LUA, // LUA PROFILER_EXTRA, // everything else // the USER types are available to driver writers to profile diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp index dcd2434881d..77345cc53f2 100644 --- a/src/frontend/mame/luaengine.cpp +++ b/src/frontend/mame/luaengine.cpp @@ -592,7 +592,7 @@ sol::object lua_engine::call_plugin(const std::string &name, sol::object in) sol::object obj = sol().registry()[field]; if(obj.is<sol::protected_function>()) { - auto res = (obj.as<sol::protected_function>())(in); + auto res = invoke(obj.as<sol::protected_function>(), in); if(!res.valid()) { sol::error err = res; @@ -610,7 +610,7 @@ void lua_engine::menu_populate(const std::string &menu, std::vector<std::tuple<s sol::object obj = sol().registry()[field]; if(obj.is<sol::protected_function>()) { - auto res = (obj.as<sol::protected_function>())(); + auto res = invoke(obj.as<sol::protected_function>()); if(!res.valid()) { sol::error err = res; @@ -638,7 +638,7 @@ bool lua_engine::menu_callback(const std::string &menu, int index, const std::st sol::object obj = sol().registry()[field]; if(obj.is<sol::protected_function>()) { - auto res = (obj.as<sol::protected_function>())(index, event); + auto res = invoke(obj.as<sol::protected_function>(), index, event); if(!res.valid()) { sol::error err = res; @@ -659,7 +659,7 @@ bool lua_engine::execute_function(const char *id) { if(func.second.is<sol::protected_function>()) { - auto ret = (func.second.as<sol::protected_function>())(); + auto ret = invoke(func.second.as<sol::protected_function>()); if(!ret.valid()) { sol::error err = ret; @@ -2567,7 +2567,7 @@ void lua_engine::run(sol::load_result res) { if(res.valid()) { - auto ret = (res.get<sol::protected_function>())(); + auto ret = invoke(res.get<sol::protected_function>()); if(!ret.valid()) { sol::error err = ret; @@ -2595,3 +2595,16 @@ void lua_engine::load_string(const char *value) { run(sol().load(value)); } + +//------------------------------------------------- +// invoke - invokes a function, wrapping profiler +//------------------------------------------------- + +template<typename TFunc, typename... TArgs> +sol::protected_function_result lua_engine::invoke(TFunc &&func, TArgs&&... args) +{ + g_profiler.start(PROFILER_LUA); + sol::protected_function_result result = func(std::forward<TArgs>(args)...); + g_profiler.stop(); + return result; +} diff --git a/src/frontend/mame/luaengine.h b/src/frontend/mame/luaengine.h index c8189f82083..2937b723b74 100644 --- a/src/frontend/mame/luaengine.h +++ b/src/frontend/mame/luaengine.h @@ -166,6 +166,9 @@ private: bool busy; bool yield; }; + + template<typename TFunc, typename... TArgs> + sol::protected_function_result invoke(TFunc &&func, TArgs&&... args); }; #endif // MAME_FRONTEND_MAME_LUAENGINE_H diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp index d82baad071e..25545afdc79 100644 --- a/src/mame/drivers/cdi.cpp +++ b/src/mame/drivers/cdi.cpp @@ -178,7 +178,7 @@ INPUT_CHANGED_MEMBER(cdi_state::mcu_input) if(send) { uint8_t data = (uint8_t)((uintptr_t)param & 0x000000ff); - m_maincpu->quizard_rx(data); + quizard_rx(data); } } @@ -264,10 +264,9 @@ static INPUT_PORTS_START( quizard ) INPUT_PORTS_END -INTERRUPT_GEN_MEMBER( cdi_state::mcu_frame ) -{ - m_maincpu->mcu_frame(); -} +/*************************** +* Machine Initialization * +***************************/ MACHINE_RESET_MEMBER( cdi_state, cdimono1 ) { @@ -276,6 +275,12 @@ MACHINE_RESET_MEMBER( cdi_state, cdimono1 ) memcpy(dst, src, 0x8); memset(m_servo_io_regs, 0, 0x20); memset(m_slave_io_regs, 0, 0x20); + + // Quizard Protection HLE data + memset(m_seeds, 0, 10 * sizeof(uint16_t)); + memset(m_state, 0, 8 * sizeof(uint8_t)); + m_mcu_value = 0; + m_mcu_ack = 0; } MACHINE_RESET_MEMBER( cdi_state, cdimono2 ) @@ -291,8 +296,8 @@ MACHINE_RESET_MEMBER( cdi_state, quizard1 ) { MACHINE_RESET_CALL_MEMBER( cdimono1 ); - m_maincpu->set_quizard_mcu_value(0x021f); - m_maincpu->set_quizard_mcu_ack(0x5a); + set_quizard_mcu_value(0x021f); + set_quizard_mcu_ack(0x5a); } MACHINE_RESET_MEMBER( cdi_state, quizard2 ) @@ -303,29 +308,193 @@ MACHINE_RESET_MEMBER( cdi_state, quizard2 ) // 0x001: French // 0x188: German - m_maincpu->set_quizard_mcu_value(0x188); - m_maincpu->set_quizard_mcu_ack(0x59); + set_quizard_mcu_value(0x188); + set_quizard_mcu_ack(0x59); } - - MACHINE_RESET_MEMBER( cdi_state, quizard3 ) { MACHINE_RESET_CALL_MEMBER( cdimono1 ); - m_maincpu->set_quizard_mcu_value(0x00ae); - m_maincpu->set_quizard_mcu_ack(0x58); + set_quizard_mcu_value(0x00ae); + set_quizard_mcu_ack(0x58); } MACHINE_RESET_MEMBER( cdi_state, quizard4 ) { MACHINE_RESET_CALL_MEMBER( cdimono1 ); - //m_maincpu->set_quizard_mcu_value(0x0139); - m_maincpu->set_quizard_mcu_value(0x011f); - m_maincpu->set_quizard_mcu_ack(0x57); + set_quizard_mcu_value(0x011f); + set_quizard_mcu_ack(0x57); +} + + +/*************************** +* Quizard Protection HLE * +***************************/ + +void cdi_state::set_quizard_mcu_ack(uint8_t ack) +{ + m_mcu_ack = ack; +} + +void cdi_state::set_quizard_mcu_value(uint16_t value) +{ + m_mcu_value = value; +} + +void cdi_state::quizard_rx(uint8_t data) +{ + m_maincpu->uart_rx(0x5a); + m_maincpu->uart_rx(data); +} + +void cdi_state::quizard_set_seeds(uint8_t *rx) +{ + m_seeds[0] = (rx[1] << 8) | rx[0]; + m_seeds[1] = (rx[3] << 8) | rx[2]; + m_seeds[2] = (rx[5] << 8) | rx[4]; + m_seeds[3] = (rx[7] << 8) | rx[6]; + m_seeds[4] = (rx[9] << 8) | rx[8]; + m_seeds[5] = (rx[11] << 8) | rx[10]; + m_seeds[6] = (rx[13] << 8) | rx[12]; + m_seeds[7] = (rx[15] << 8) | rx[14]; + m_seeds[8] = (rx[17] << 8) | rx[16]; + m_seeds[9] = (rx[19] << 8) | rx[18]; +} + +void cdi_state::quizard_calculate_state() +{ + //const uint16_t desired_bitfield = mcu_value; + const uint16_t field0 = 0x00ff; + const uint16_t field1 = m_mcu_value ^ 0x00ff; + + uint16_t total0 = 0; + uint16_t total1 = 0; + + for(int index = 0; index < 10; index++) + { + if (field0 & (1 << index)) + { + total0 += m_seeds[index]; + } + if (field1 & (1 << index)) + { + total1 += m_seeds[index]; + } + } + + uint16_t hi0 = (total0 >> 8) + 0x40; + m_state[2] = hi0 / 2; + m_state[3] = hi0 - m_state[2]; + + uint16_t lo0 = (total0 & 0x00ff) + 0x40; + m_state[0] = lo0 / 2; + m_state[1] = lo0 - m_state[0]; + + uint16_t hi1 = (total1 >> 8) + 0x40; + m_state[6] = hi1 / 2; + m_state[7] = hi1 - m_state[6]; + + uint16_t lo1 = (total1 & 0x00ff) + 0x40; + m_state[4] = lo1 / 2; + m_state[5] = lo1 - m_state[4]; } +void cdi_state::quizard_handle_byte_tx(uint8_t data) +{ + static int state = 0; + static uint8_t rx[0x100]; + static uint8_t rx_ptr = 0xff; + + switch (state) + { + case 0: // Waiting for a leadoff byte + if (data == m_mcu_ack) // Sequence end + { + //scc68070_uart_rx(machine, scc68070, 0x5a); + //scc68070_uart_rx(machine, scc68070, 0x42); + } + else + { + switch (data) + { + case 0x44: // DATABASEPATH = **_DATABASE/ + rx[0] = 0x44; + rx_ptr = 1; + state = 3; + break; + case 0x2e: // Unknown; ignored + break; + case 0x56: // Seed start + rx_ptr = 0; + state = 1; + break; + default: + //printf("Unknown leadoff byte: %02x\n", data); + break; + } + } + break; + + case 1: // Receiving the seed + rx[rx_ptr] = data; + rx_ptr++; + if (rx_ptr == 20) + { + //printf("Calculating seeds\n"); + quizard_set_seeds(rx); + quizard_calculate_state(); + state = 2; + } + break; + + case 2: // Receiving the seed acknowledge + case 4: + if (data == m_mcu_ack) + { + if (state == 2) + { + state = 4; + } + else + { + state = 0; + } + //printf("Sending seed ack\n"); + m_maincpu->uart_rx(0x5a); + m_maincpu->uart_rx(m_state[0]); + m_maincpu->uart_rx(m_state[1]); + m_maincpu->uart_rx(m_state[2]); + m_maincpu->uart_rx(m_state[3]); + m_maincpu->uart_rx(m_state[4]); + m_maincpu->uart_rx(m_state[5]); + m_maincpu->uart_rx(m_state[6]); + m_maincpu->uart_rx(m_state[7]); + } + break; + + case 3: // Receiving the database path + rx[rx_ptr] = data; + rx_ptr++; + if (data == 0x0a) + { + /*rx[rx_ptr] = 0; + //printf("Database path: %s\n", rx); + scc68070_uart_rx(machine, scc68070, 0x5a); + scc68070_uart_rx(machine, scc68070, g_state[0]); + scc68070_uart_rx(machine, scc68070, g_state[1]); + scc68070_uart_rx(machine, scc68070, g_state[2]); + scc68070_uart_rx(machine, scc68070, g_state[3]); + scc68070_uart_rx(machine, scc68070, g_state[4]); + scc68070_uart_rx(machine, scc68070, g_state[5]); + scc68070_uart_rx(machine, scc68070, g_state[6]); + scc68070_uart_rx(machine, scc68070, g_state[7]);*/ + state = 0; + } + break; + } +} /************************** @@ -981,13 +1150,14 @@ void cdi_state::quizard(machine_config &config) { cdimono1_base(config); m_maincpu->set_addrmap(AS_PROGRAM, &cdi_state::cdimono1_mem); - m_maincpu->set_vblank_int("screen", FUNC(cdi_state::mcu_frame)); + m_maincpu->uart_tx_callback().set(FUNC(cdi_state::quizard_handle_byte_tx)); } READ8_MEMBER( cdi_state::quizard_mcu_p1_r ) { - return machine().rand(); + LOG("%s: MCU Port 1 Read\n", machine().describe_context()); + return 0; } void cdi_state::quizard1(machine_config &config) diff --git a/src/mame/drivers/debut.cpp b/src/mame/drivers/debut.cpp new file mode 100644 index 00000000000..20e87429000 --- /dev/null +++ b/src/mame/drivers/debut.cpp @@ -0,0 +1,276 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/****************************************************************************** + +Дебют / Дебют-М (Debut) Chess Computer + +Released in 1994 in Russian Federation by ЭНЕРГОПРИБОР (Energopribor), Moscow. +It's running the Mirage chess engine by Vladimir Rybinkin, originally made for MS-DOS. + +TODO: +- where is lcd segments common active state? (see m_lcd_data), current implementation + is wrong, it will occasionally display wrong (inverted) digits +- where does the interrupt come from? +- Debut-M is an updated version? Or is it the same program as Debut with a redesigned case? + +******************************************************************************* + +Hardware notes: +- КР1810ВМ86 (i8086 clone), 16200K XTAL +- КР1810ГФ84 (i8284 clock divider /3) +- 2*КР537РУ10 (2KB*8 RAM), 2*8KB ROM +- lcd panel (4 7seg digits), 64 chessboard buttons, 16 leds + +A bit more detailed, list of other Soviet standard TTL chips used and their equivalents: +- 2*КР580ИР82 = Intel 8282, aka 74573 +- 2*К555ЛЛ1 = 7432 +- К555ИЛ7 = 74138 +- К555ИД10В = 74145 +- КМ555КЛ15 = 74251 +- К561ЛЕ5А = CD4001 +- PC74HC259P = the odd one out + +keypad legend: + +АН - анализ (analysis, switches view info) +ХОД - ходи (force move) +ИНТ - интерактивность (interactivity, switches 1P vs CPU, or 2P) +ПОЗ - позиция (position mode) +ВФ - выбор фигуры (select piece) +ВП - возврат (take back 2 plies) +УР - уровень игры (level) +ВВ - ввод позиции (enter position) +СБ - сброс / новая игра (reset / new game) + +******************************************************************************/ + +#include "emu.h" +#include "cpu/i86/i86.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "sound/volt_reg.h" +#include "video/pwm.h" +#include "speaker.h" + +// internal artwork +#include "debutm.lh" // clickable + + +namespace { + +class debut_state : public driver_device +{ +public: + debut_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_display(*this, "display"), + m_dac(*this, "dac"), + m_out_digit(*this, "digit%u", 0U), + m_inputs(*this, "IN.0") + { } + + // assume that RESET button is tied to CPU RESET pin + DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); } + + // machine drivers + void debutm(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device<cpu_device> m_maincpu; + required_device<sensorboard_device> m_board; + required_device<pwm_display_device> m_display; + required_device<dac_bit_interface> m_dac; + output_finder<4> m_out_digit; + required_ioport m_inputs; + + // address maps + void main_map(address_map &map); + void main_io(address_map &map); + + // I/O handlers + INTERRUPT_GEN_MEMBER(interrupt); + DECLARE_READ8_MEMBER(input_r); + DECLARE_WRITE8_MEMBER(control_w); + + u8 m_select; + u8 m_dac_data; + u8 m_lcd_data; + u8 m_digit_data[4]; +}; + +void debut_state::machine_start() +{ + // resolve handlers + m_out_digit.resolve(); + + // zerofill + m_select = 0; + m_dac_data = 0; + m_lcd_data = 0; + memset(m_digit_data, 0, sizeof(m_digit_data)); + + // register for savestates + save_item(NAME(m_select)); + save_item(NAME(m_dac_data)); + save_item(NAME(m_lcd_data)); + save_item(NAME(m_digit_data)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +INTERRUPT_GEN_MEMBER(debut_state::interrupt) +{ + m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // I8086 +} + +READ8_MEMBER(debut_state::input_r) +{ + u8 data = 0; + u8 sel = m_select & 0xf; + + // a1-a3,d0: multiplexed inputs + // read keypad + if (sel == 0) + data = BIT(m_inputs->read(), offset); + + // read chessboard sensors + else if (sel < 9) + data = BIT(m_board->read_rank(sel - 1), offset); + + return ~data; +} + +WRITE8_MEMBER(debut_state::control_w) +{ + u8 mask = 1 << offset; + u8 prev = m_select; + + // a1-a3,d0: 74259 + m_select = (m_select & ~mask) | ((data & 1) ? mask : 0); + + // 74259 q0-q3: input mux/led select + // 74259 q4,q5: led data + m_display->matrix(~m_select >> 4 & 3, 1 << (m_select & 0xf)); + + // 74259 q7: toggle speaker + if (~m_select & prev & 0x80) + { + m_dac_data ^= 1; + m_dac->write(m_dac_data); + } + + // a1-a3,d1-d4 go to lcd panel + // clock lcd digit segments + for (int i = 0; i < 4; i++) + { + if (BIT(~data, i + 1)) + m_digit_data[i] = (m_digit_data[i] & ~mask) | (m_lcd_data << offset); + + m_out_digit[i] = bitswap<8>(m_digit_data[i],0,7,4,3,2,1,6,5); + } + + // where is lcd common state? + if (offset == 0) + m_lcd_data = BIT(~data, 4); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void debut_state::main_map(address_map &map) +{ + map.global_mask(0x7fff); + map(0x0000, 0x0fff).mirror(0x3000).ram(); + map(0x4000, 0x7fff).rom(); +} + +void debut_state::main_io(address_map &map) +{ + map(0x00, 0x0f).rw(FUNC(debut_state::input_r), FUNC(debut_state::control_w)).umask16(0x00ff); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( debutm ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("АН (Analysis)") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("ХОД (Force Move)") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("ИНТ (Switch 1P/2P)") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("ПОЗ (Position Mode)") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ВФ (Select Piece)") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("ВП (Take Back)") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("УР (Level)") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("ВВ (Enter Position)") + + PORT_START("RESET") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, debut_state, reset_button, nullptr) PORT_NAME("СБ (Reset)") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void debut_state::debutm(machine_config &config) +{ + /* basic machine hardware */ + I8086(config, m_maincpu, 16.2_MHz_XTAL / 3); + m_maincpu->set_periodic_int(FUNC(debut_state::interrupt), attotime::from_hz(400)); + m_maincpu->set_addrmap(AS_PROGRAM, &debut_state::main_map); + m_maincpu->set_addrmap(AS_IO, &debut_state::main_io); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(2, 9); + m_display->set_bri_maximum(0.5); + config.set_default_layout(layout_debutm); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( debutm ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD16_BYTE("dd12", 0x4000, 0x2000, CRC(0f64ebab) SHA1(e069c387ec01e8786e4fb720630196ac27fac449) ) // no ROM labels, PCB ICs location = "DDxx" + ROM_LOAD16_BYTE("dd13", 0x4001, 0x2000, CRC(c171f5ac) SHA1(62dc030e3d60172f31f0d14944437b0fd4b53a2a) ) // " +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1994, debutm, 0, 0, debutm, debutm, debut_state, empty_init, "Energopribor", "Debut-M", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/drivers/intellect02.cpp b/src/mame/drivers/intellect02.cpp index dc75a6ebf5d..bca6af48a0b 100644 --- a/src/mame/drivers/intellect02.cpp +++ b/src/mame/drivers/intellect02.cpp @@ -200,27 +200,27 @@ void intel02_state::main_io(address_map &map) static INPUT_PORTS_START( intel02 ) PORT_START("IN.0") PORT_BIT(0x0007, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("View Position") PORT_CODE(KEYCODE_V) - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Game Level") PORT_CODE(KEYCODE_L) - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("ПП (View Position)") + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("УИ (Game Level)") + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) PORT_NAME("H8") + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) PORT_NAME("G7") + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) PORT_NAME("F6") + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) PORT_NAME("E5") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) PORT_NAME("D4") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) PORT_NAME("C3") + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) PORT_NAME("B2") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) PORT_NAME("A1") + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") PORT_START("IN.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Input") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Game Select") PORT_CODE(KEYCODE_S) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Erase") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("ВВ (Input)") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ВИ (Game Select)") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("СТ (Erase)") PORT_START("RESET") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Reset") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, intel02_state, reset_button, nullptr) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, intel02_state, reset_button, nullptr) PORT_NAME("СБ (Reset)") INPUT_PORTS_END diff --git a/src/mame/drivers/legionna.cpp b/src/mame/drivers/legionna.cpp index 5c1a8971a52..9e8a16dd923 100644 --- a/src/mame/drivers/legionna.cpp +++ b/src/mame/drivers/legionna.cpp @@ -105,12 +105,17 @@ u8 legionna_state::denjinmk_sound_comms_r(offs_t offset) void legionna_state::legionna_cop_map(address_map &map) { - map(0x100400, 0x100401).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_param_lo_w)); // grainbow - map(0x100402, 0x100403).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_param_hi_w)); // grainbow - map(0x10040c, 0x10040d).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_size_w)); // grainbow - map(0x100410, 0x100411).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_inc_w)); // grainbow - map(0x100412, 0x100413).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_src_hi_w)); // grainbow - map(0x100414, 0x100415).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_src_lo_w)); // grainbow + // grainbow sprite DMA + // the three NOP writes are initied before every sprite DMA + map(0x100400, 0x100401).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_param_lo_w)); + map(0x100402, 0x100403).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_param_hi_w)); + map(0x100404, 0x100405).nopw(); // $0002 + map(0x10040a, 0x10040b).nopw(); // $ffff + map(0x10040c, 0x10040d).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_size_w)); + map(0x10040e, 0x10040f).nopw(); // $0023 + map(0x100410, 0x100411).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_inc_w)); + map(0x100412, 0x100413).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_src_hi_w)); + map(0x100414, 0x100415).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_src_lo_w)); map(0x10041c, 0x10041d).w(m_raiden2cop, FUNC(raiden2cop_device::cop_angle_target_w)); // angle target (for 0x6200 COP macro) map(0x10041e, 0x10041f).w(m_raiden2cop, FUNC(raiden2cop_device::cop_angle_step_w)); // angle step (for 0x6200 COP macro) @@ -153,6 +158,8 @@ void legionna_state::legionna_cop_map(address_map &map) map(0x10047c, 0x10047d).w(m_raiden2cop, FUNC(raiden2cop_device::cop_dma_dst_w)); map(0x10047e, 0x10047f).rw(m_raiden2cop, FUNC(raiden2cop_device::cop_dma_mode_r), FUNC(raiden2cop_device::cop_dma_mode_w)); +// map(0x100488, 0x100489).nopw(); grainbow $0010 +// map(0x10048a, 0x10048b).nopw(); grainbow $0000 map(0x10048c, 0x10048d).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_abs_y_w)); // 68k map(0x10048e, 0x10048f).w(m_raiden2cop, FUNC(raiden2cop_device::cop_sprite_dma_abs_x_w)); // 68k @@ -780,9 +787,9 @@ static INPUT_PORTS_START( grainbow ) PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Flip_Screen ) ) PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) // Dead code? - PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( No ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Yes ) ) PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) diff --git a/src/mame/drivers/mpu5.hxx b/src/mame/drivers/mpu5.hxx index 6ee80c3cd60..bc0b7f19bd2 100644 --- a/src/mame/drivers/mpu5.hxx +++ b/src/mame/drivers/mpu5.hxx @@ -2611,8 +2611,8 @@ ROM_START( m5gstriks ) ROM_REGION( 0x000800, "nvram", 0 ) // RTC ROM_LOAD( "bilso_b-14_gold_strike_v1.00_cvb_0200a_11-1562.p7a", 0x000000, 0x000800, CRC(8942fba8) SHA1(e9264a386bd2f3fbb3c53434b94314d29c32b6f9) ) // ST M48T02-150PC1 dumped as DS1642 - ROM_REGION( 0x200, "pic", 0 ) // Protected - ROM_LOAD( "105_rgsg_pic16c54c.ic1", 0x000000, 0x200, NO_DUMP ) + ROM_REGION( 0x407, "pic", 0 ) // Decapped + ROM_LOAD( "105_rgsg_pic16c54c.ic1", 0x000000, 0x407, CRC(2f910e58) SHA1(1d4857f25ec7db7da5ab29bc8be2f45aaacfca45)) ROM_END ROM_START( m5gstrik11 ) diff --git a/src/mame/drivers/nycaptor.cpp b/src/mame/drivers/nycaptor.cpp index c522d0aead7..7a55bf8bd4d 100644 --- a/src/mame/drivers/nycaptor.cpp +++ b/src/mame/drivers/nycaptor.cpp @@ -810,6 +810,7 @@ void nycaptor_state::cyclshtg(machine_config &config) Z80(config, m_subcpu, 8000000/2); m_subcpu->set_addrmap(AS_PROGRAM, &nycaptor_state::cyclshtg_slave_map); + m_subcpu->set_addrmap(AS_IO, &nycaptor_state::bronx_slave_io_map); m_subcpu->set_vblank_int("screen", FUNC(nycaptor_state::irq0_line_hold)); Z80(config, m_audiocpu, 8000000/2); @@ -973,17 +974,20 @@ ROM_START( nycaptor ) ROM_LOAD( "a50_14", 0x1c000, 0x4000, CRC(24b2f1bf) SHA1(4757aec2e4b99ce33d993ce1e19ee46a4eb76e86) ) ROM_END +// note, a mix of a80 and a97 codes, are there multiple versions of this game? the a97 gfx ROM doesn't match the bronx bootleg, so maybe the bootleg is based off the a80 version? ROM_START( cyclshtg ) - ROM_REGION( 0x18000, "maincpu", 0 ) + ROM_REGION( 0x20000, "maincpu", 0 ) ROM_LOAD( "a97_01.i17", 0x00000, 0x4000, CRC(686fac1a) SHA1(46d17cb98f064413bb76c5d869f8061d2771cda0) ) ROM_LOAD( "a97_02.i16", 0x04000, 0x4000, CRC(48a812f9) SHA1(8ab18cb8d6a8b7ce1ed1a4009f5435ce4b0937b4) ) - ROM_LOAD( "a97_03.u15", 0x10000, 0x4000, CRC(67ad3067) SHA1(2e355653e91c093abe7db0a3d55d5a3f95c4a2e3) ) - ROM_LOAD( "a97_04.u14", 0x14000, 0x4000, CRC(804e6445) SHA1(5b6771c5729faf62d5002d090c0b9c5ca5cb9ad6) ) + ROM_LOAD( "a97_03.u15", 0x10000, 0x4000, BAD_DUMP CRC(67ad3067) SHA1(2e355653e91c093abe7db0a3d55d5a3f95c4a2e3) ) // first half of data is missing compared to bronx (rest not 100% identical when decrypted, so can't use bootleg data) + ROM_LOAD( "a97_04.u14", 0x14000, 0x4000, BAD_DUMP CRC(804e6445) SHA1(5b6771c5729faf62d5002d090c0b9c5ca5cb9ad6) ) // ^ ROM_REGION( 0x10000, "sub", 0 ) ROM_LOAD( "a97_05.u22", 0x0000, 0x4000, CRC(fdc36c4f) SHA1(cae2d3f07c5bd6de9d40ff7d385b999e7dc9ce82) ) ROM_LOAD( "a80_06.u23", 0x4000, 0x4000, CRC(2769c5ab) SHA1(b8f5a4a8c70c8d37d5e92b37faa0e25b287b3fb2) ) - ROM_LOAD( "a97_06.i24", 0x8000, 0x4000, CRC(c0473a54) SHA1(06fa7345a44a72995146e973c2cd7a14499f4310) ) + + ROM_REGION( 0x08000, "user1", 0 ) + ROM_LOAD( "a97_06.i24", 0x4000, 0x4000, BAD_DUMP CRC(c0473a54) SHA1(06fa7345a44a72995146e973c2cd7a14499f4310) ) // see above ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "a80_16.i26", 0x0000, 0x4000, CRC(ce171a48) SHA1(e5ae9bb22f58c8857737bc6f5317866819a4e4d1) ) @@ -1243,9 +1247,9 @@ ROM_START( colt ) ROM_LOAD( "04.bin", 0x00000, 0x4000, CRC(dc61fdb2) SHA1(94fdd95082936b2445008aee60381ebe35385b4a) ) ROM_LOAD( "03.bin", 0x04000, 0x4000, CRC(5835b8b1) SHA1(25a48660f8fb166f996133fb9113d1566dbae281) ) ROM_LOAD( "02.bin", 0x10000, 0x4000, CRC(89c99a28) SHA1(1a4fdb5c13569699dfbf2bde0aeeb5e7fcc22ef9) ) + ROM_RELOAD( 0x14000, 0x4000) ROM_LOAD( "01.bin", 0x18000, 0x4000, CRC(9b0948f3) SHA1(a55e09243640ec56aa22e4b6d47165b02b880eb7) ) - ROM_COPY( "maincpu", 0x10000, 0x014000, 0x04000 ) - ROM_COPY( "maincpu", 0x18000, 0x01c000, 0x04000 ) + ROM_RELOAD( 0x1c000, 0x4000) ROM_REGION( 0x10000, "sub", 0 ) ROM_LOAD( "05.bin", 0x0000, 0x4000, CRC(2b6e017a) SHA1(60715e1c6fbcdd2c0e114035c342ba587dfc1b4b) ) @@ -1299,7 +1303,7 @@ void nycaptor_state::init_colt() } GAME( 1985, nycaptor, 0, nycaptor, nycaptor, nycaptor_state, init_nycaptor, ROT0, "Taito", "N.Y. Captor", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1986, colt, nycaptor, bronx, colt, nycaptor_state, init_colt, ROT0, "bootleg", "Colt", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) + GAME( 1986, cyclshtg, 0, cyclshtg, cyclshtg, nycaptor_state, init_cyclshtg, ROT90, "Taito", "Cycle Shooting", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) -/* bootlegs */ GAME( 1986, bronx, cyclshtg, bronx, bronx, nycaptor_state, init_bronx, ROT90, "bootleg", "Bronx", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1986, colt, nycaptor, bronx, colt, nycaptor_state, init_colt, ROT0, "bootleg", "Colt", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/saitek_corona.cpp b/src/mame/drivers/saitek_corona.cpp index 10bd5eb3293..2c7c6118fb6 100644 --- a/src/mame/drivers/saitek_corona.cpp +++ b/src/mame/drivers/saitek_corona.cpp @@ -1,5 +1,6 @@ // license:BSD-3-Clause // copyright-holders:hap +// thanks-to:Berger /*************************************************************************** Saitek Corona. Please refer to saitek_stratos.cpp for driver notes. diff --git a/src/mame/drivers/saitek_stratos.cpp b/src/mame/drivers/saitek_stratos.cpp index 94ab80bd05a..a0b08af41bd 100644 --- a/src/mame/drivers/saitek_stratos.cpp +++ b/src/mame/drivers/saitek_stratos.cpp @@ -1,5 +1,6 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert, hap +// thanks-to:Berger /*************************************************************************** SciSys/Saitek Stratos chesscomputer family (1987-1990) @@ -342,8 +343,11 @@ READ8_MEMBER(stratos_state::control_r) { // d5: lcd status flag? if (m_lcd_ready) + { data |= 0x20; - m_lcd_ready = false; + if (!machine().side_effects_disabled()) + m_lcd_ready = false; + } // d7: battery low data |= m_inputs[8]->read(); @@ -379,7 +383,9 @@ WRITE8_MEMBER(stratos_state::control_w) READ8_MEMBER(stratos_state::lcd_data_r) { // reset lcd? - lcd_reset_w(); + if (!machine().side_effects_disabled()) + lcd_reset_w(); + return 0; } diff --git a/src/mame/drivers/wyvernf0.cpp b/src/mame/drivers/wyvernf0.cpp index 964209360fd..09761cf9fde 100644 --- a/src/mame/drivers/wyvernf0.cpp +++ b/src/mame/drivers/wyvernf0.cpp @@ -34,6 +34,7 @@ TODO: #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/m6805/m6805.h" +#include "machine/taito68705interface.h" #include "machine/gen_latch.h" #include "sound/ay8910.h" #include "sound/msm5232.h" @@ -55,7 +56,7 @@ public: m_spriteram(*this,"spriteram"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), - m_mcu(*this, "mcu"), + m_bmcu(*this, "bmcu"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), m_soundlatch(*this, "soundlatch") @@ -100,17 +101,12 @@ private: DECLARE_WRITE8_MEMBER(nmi_enable_w); TIMER_CALLBACK_MEMBER(nmi_callback); - // MCU - uint8_t m_mcu_val, m_mcu_ready; - - DECLARE_READ8_MEMBER(fake_mcu_r); - DECLARE_WRITE8_MEMBER(fake_mcu_w); - DECLARE_READ8_MEMBER(fake_status_r); + DECLARE_READ8_MEMBER(mcu_status_r); // devices required_device<cpu_device> m_maincpu; required_device<cpu_device> m_audiocpu; - optional_device<cpu_device> m_mcu; + required_device<taito68705_mcu_device> m_bmcu; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; required_device<generic_latch_8_device> m_soundlatch; @@ -302,26 +298,13 @@ if (machine().input().code_pressed(KEYCODE_Z)) ***************************************************************************/ -READ8_MEMBER(wyvernf0_state::fake_mcu_r) -{ - int result = 0; - - if ((m_mcu_val & 0x73) == 0x73) - result = 0x42; // at boot - - return result; -} - -WRITE8_MEMBER(wyvernf0_state::fake_mcu_w) -{ - m_mcu_val = data; -} - -READ8_MEMBER(wyvernf0_state::fake_status_r) +READ8_MEMBER(wyvernf0_state::mcu_status_r) { - // bit 0 = ok to write - // bit 1 = ok to read - return 0x03; + // bit 0 = when 1, MCU is ready to receive data from main CPU + // bit 1 = when 1, MCU has sent data to the main CPU + return + ((CLEAR_LINE == m_bmcu->host_semaphore_r()) ? 0x01 : 0x00) | + ((CLEAR_LINE != m_bmcu->mcu_semaphore_r()) ? 0x02 : 0x00); } @@ -410,8 +393,8 @@ void wyvernf0_state::wyvernf0_map(address_map &map) map(0xd300, 0xd303).ram().share("scrollram"); - map(0xd400, 0xd400).rw(FUNC(wyvernf0_state::fake_mcu_r), FUNC(wyvernf0_state::fake_mcu_w)); - map(0xd401, 0xd401).r(FUNC(wyvernf0_state::fake_status_r)); + map(0xd400, 0xd400).rw(m_bmcu, FUNC(taito68705_mcu_device::data_r), FUNC(taito68705_mcu_device::data_w)); + map(0xd401, 0xd401).r(FUNC(wyvernf0_state::mcu_status_r)); map(0xd500, 0xd5ff).ram().share("spriteram"); @@ -634,8 +617,6 @@ void wyvernf0_state::machine_start() save_item(NAME(m_pending_nmi)); save_item(NAME(m_rombank)); save_item(NAME(m_rambank)); - save_item(NAME(m_mcu_val)); - save_item(NAME(m_mcu_ready)); } void wyvernf0_state::machine_reset() @@ -644,8 +625,6 @@ void wyvernf0_state::machine_reset() m_pending_nmi = 0; m_rombank = 0; m_rambank = 0; - m_mcu_val = 0; - m_mcu_ready = 0; } void wyvernf0_state::wyvernf0(machine_config &config) @@ -659,9 +638,10 @@ void wyvernf0_state::wyvernf0(machine_config &config) m_audiocpu->set_addrmap(AS_PROGRAM, &wyvernf0_state::sound_map); m_audiocpu->set_periodic_int(FUNC(wyvernf0_state::irq0_line_hold), attotime::from_hz(60*2)); // IRQ generated by ??? (drives music tempo), NMI by main cpu -// M68705P5(config, "mcu", 48_MHz_XTAL/12); // 4MHz - Clock not verified + TAITO68705_MCU(config, m_bmcu, 48_MHz_XTAL/12); // 4MHz - Clock not verified -// config.m_minimum_quantum = attotime::from_hz(6000); // 100 CPU slices per second to synchronize between the MCU and the main CPU + /* 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs */ + config.m_minimum_quantum = attotime::from_hz(6000); // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -729,8 +709,8 @@ ROM_START( wyvernf0 ) ROM_LOAD( "a39_16.ic26", 0x0000, 0x4000, CRC(5a681fb4) SHA1(e31e751a54fa9853acb462ce22dd2ff5286808f0) ) ROM_FILL( 0xe000, 0x2000, 0xff ) // diagnostics ROM - ROM_REGION( 0x0800, "mcu", 0 ) // protected 68705P5 MCU - ROM_LOAD( "a39_mcu.ic23", 0x0000, 0x0800, NO_DUMP ) + ROM_REGION( 0x0800, "bmcu:mcu", 0 ) // 68705P5 MCU + ROM_LOAD( "a39_mc68705p5s.ic23", 0x0000, 0x0800, CRC(14bff574) SHA1(c91446540e7628b3e62135e2f560a118f7e0dad4) ) /* from other set, appears to be correct */ ROM_REGION( 0x10000, "sprites", 0 ) // sprites ROM_LOAD( "a39_11.ic99", 0x0000, 0x4000, CRC(af70e1dc) SHA1(98dba673750cdfdf25c119c24da10428eff6591b) ) @@ -760,8 +740,8 @@ ROM_START( wyvernf0a ) /* Possibly the first version or even an earlier developm ROM_LOAD( "sound_4182.ic26", 0x0000, 0x4000, CRC(5a681fb4) SHA1(e31e751a54fa9853acb462ce22dd2ff5286808f0) ) /* == a39_16.ic26 */ ROM_FILL( 0xe000, 0x2000, 0xff ) // diagnostics ROM - ROM_REGION( 0x0800, "mcu", 0 ) // protected 68705P5 MCU - ROM_LOAD( "mc68705p5s.ic23", 0x0000, 0x0800, NO_DUMP ) /* hand written label P5 5/1 */ + ROM_REGION( 0x0800, "bmcu:mcu", 0 ) // 68705P5 MCU + ROM_LOAD( "a39_mc68705p5s.ic23", 0x0000, 0x0800, CRC(14bff574) SHA1(c91446540e7628b3e62135e2f560a118f7e0dad4) ) /* hand written label P5 5/1 - part was unprotected */ ROM_REGION( 0x10000, "sprites", 0 ) // sprites - These 4 ROMs had hand written labels ROM_LOAD( "obj4_d779.ic99", 0x0000, 0x4000, CRC(af70e1dc) SHA1(98dba673750cdfdf25c119c24da10428eff6591b) ) /* == a39_11.ic99 */ diff --git a/src/mame/includes/cdi.h b/src/mame/includes/cdi.h index 66c6526d3ba..aafc7839d56 100644 --- a/src/mame/includes/cdi.h +++ b/src/mame/includes/cdi.h @@ -113,6 +113,7 @@ public: void draw_lcd(int y); uint32_t screen_update_cdimono1_lcd(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void cdimono1(machine_config &config); void cdimono2(machine_config &config); void quizard4(machine_config &config); @@ -122,12 +123,27 @@ public: void quizard3(machine_config &config); void quizard1(machine_config &config); void quizard(machine_config &config); + void cdi910_mem(address_map &map); void cdimono1_mem(address_map &map); void cdimono2_mem(address_map &map); void cdimono2_servo_mem(address_map &map); void cdimono2_slave_mem(address_map &map); void cdi070_cpuspace(address_map &map); + + // Quizard Protection HLE + void set_quizard_mcu_value(uint16_t value); + void set_quizard_mcu_ack(uint8_t ack); + void quizard_rx(uint8_t data); + void quizard_calculate_state(); + void quizard_set_seeds(uint8_t *rx); + void quizard_handle_byte_tx(uint8_t data); + + uint16_t m_seeds[10]; + uint8_t m_state[8]; + + uint16_t m_mcu_value; + uint8_t m_mcu_ack; }; #endif // MAME_INCLUDES_CDI_H diff --git a/src/mame/layout/debutm.lay b/src/mame/layout/debutm.lay new file mode 100644 index 00000000000..bcabfdeaddb --- /dev/null +++ b/src/mame/layout/debutm.lay @@ -0,0 +1,594 @@ +<?xml version="1.0"?> +<mamelayout version="2"> + +<!-- define elements --> + + <element name="blackb"><rect><color red="0" green="0" blue="0" /></rect></element> + <element name="gray"><rect><color red="0.5" green="0.54" blue="0.52" /></rect></element> + + <!-- our digit element is bright-on-dark, this means the lcd panel is the wrong colour here --> + + <element name="digit" defstate="0"> + <led7seg><color red="1.0" green="1.0" blue="1.0" /></led7seg> + </element> + + <element name="led" defstate="0"> + <rect state="1"><color red="1.0" green="0.15" blue="0.2" /></rect> + <rect state="0"><color red="0.3" green="0.25" blue="0.25" /></rect> + </element> + + <element name="but" defstate="0"> + <rect state="1"><color red="0.35" green="0.33" blue="0.33" /></rect> + <rect state="0"><color red="0.17" green="0.15" blue="0.15" /></rect> + </element> + + <element name="text_1"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="1" align="1"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_2"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="2" align="1"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_3"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="3" align="1"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_4"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="4" align="1"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_5"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="5" align="1"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_6"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="6" align="1"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_7"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="7" align="1"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_8"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="8" align="1"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + + <element name="text_a"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="A"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_b"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="B"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_c"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="C"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_d"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="D"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_e"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="E"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_f"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="F"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_g"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="G"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_h"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="H"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + + <element name="text_b1"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="АН"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_b2"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="ХОД"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_b3"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="ИНТ"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_b4"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="ПОЗ"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_b5"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="ВФ"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_b6"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="ВП"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_b7"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="УР"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_b8"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="ВВ"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_b9"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="СБ"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + + <element name="text_tb1"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="ANALYSIS"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb2a"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="FORCE"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb2b"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="MOVE"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb3"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="1P/2P"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb4a"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="POS."><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb4b"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="MODE"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb5a"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="SELECT"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb5b"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="PIECE"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb6a"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="TAKE"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb6b"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="BACK"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb7"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="LEVEL"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb8a"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="ENTER"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb8b"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="POS."><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_tb9"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="RESET"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + + +<!-- sb board --> + + <element name="cblack"><rect><color red="0.41" green="0.4" blue="0.39" /></rect></element> + <element name="cwhite"><rect><color red="0.88" green="0.84" blue="0.65" /></rect></element> + + <element name="hlbb" defstate="0"> + <text string=" "><bounds x="0" y="0" width="1" height="1" /></text> + <disk state="1"> + <bounds x="0.12" y="0.12" width="0.76" height="0.76" /> + <color red="0" green="0" blue="0" /> + </disk> + </element> + + <element name="piece" defstate="0"> + <image file="chess/wp.png" state="1"/> + <image file="chess/wn.png" state="2"/> + <image file="chess/wb.png" state="3"/> + <image file="chess/wr.png" state="4"/> + <image file="chess/wq.png" state="5"/> + <image file="chess/wk.png" state="6"/> + + <image file="chess/bp.png" state="7"/> + <image file="chess/bn.png" state="8"/> + <image file="chess/bb.png" state="9"/> + <image file="chess/br.png" state="10"/> + <image file="chess/bq.png" state="11"/> + <image file="chess/bk.png" state="12"/> + + <!-- selected pieces --> + <image file="chess/wp.png" state="13"><color alpha="0.5" /></image> + <image file="chess/wn.png" state="14"><color alpha="0.5" /></image> + <image file="chess/wb.png" state="15"><color alpha="0.5" /></image> + <image file="chess/wr.png" state="16"><color alpha="0.5" /></image> + <image file="chess/wq.png" state="17"><color alpha="0.5" /></image> + <image file="chess/wk.png" state="18"><color alpha="0.5" /></image> + + <image file="chess/bp.png" state="19"><color alpha="0.5" /></image> + <image file="chess/bn.png" state="20"><color alpha="0.5" /></image> + <image file="chess/bb.png" state="21"><color alpha="0.5" /></image> + <image file="chess/br.png" state="22"><color alpha="0.5" /></image> + <image file="chess/bq.png" state="23"><color alpha="0.5" /></image> + <image file="chess/bk.png" state="24"><color alpha="0.5" /></image> + </element> + + <group name="sb_board"> + <bounds x="0" y="0" width="80" height="80" /> + + <!-- squares (avoid seams) --> + <bezel element="cwhite"><bounds x="0" y="0" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="10" y="0" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="20" y="0" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="30" y="0" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="40" y="0" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="50" y="0" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="60" y="0" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="70" y="0" width="10" height="11" /></bezel> + + <bezel element="cblack"><bounds x="0" y="10" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="10" y="10" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="20" y="10" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="30" y="10" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="40" y="10" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="50" y="10" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="60" y="10" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="70" y="10" width="10" height="11" /></bezel> + + <bezel element="cwhite"><bounds x="0" y="20" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="10" y="20" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="20" y="20" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="30" y="20" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="40" y="20" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="50" y="20" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="60" y="20" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="70" y="20" width="10" height="11" /></bezel> + + <bezel element="cblack"><bounds x="0" y="30" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="10" y="30" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="20" y="30" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="30" y="30" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="40" y="30" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="50" y="30" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="60" y="30" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="70" y="30" width="10" height="11" /></bezel> + + <bezel element="cwhite"><bounds x="0" y="40" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="10" y="40" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="20" y="40" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="30" y="40" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="40" y="40" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="50" y="40" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="60" y="40" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="70" y="40" width="10" height="11" /></bezel> + + <bezel element="cblack"><bounds x="0" y="50" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="10" y="50" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="20" y="50" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="30" y="50" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="40" y="50" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="50" y="50" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="60" y="50" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="70" y="50" width="10" height="11" /></bezel> + + <bezel element="cwhite"><bounds x="0" y="60" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="10" y="60" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="20" y="60" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="30" y="60" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="40" y="60" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="50" y="60" width="11" height="11" /></bezel> + <bezel element="cwhite"><bounds x="60" y="60" width="11" height="11" /></bezel> + <bezel element="cblack"><bounds x="70" y="60" width="10" height="11" /></bezel> + + <bezel element="cblack"><bounds x="0" y="70" width="11" height="10" /></bezel> + <bezel element="cwhite"><bounds x="10" y="70" width="11" height="10" /></bezel> + <bezel element="cblack"><bounds x="20" y="70" width="11" height="10" /></bezel> + <bezel element="cwhite"><bounds x="30" y="70" width="11" height="10" /></bezel> + <bezel element="cblack"><bounds x="40" y="70" width="11" height="10" /></bezel> + <bezel element="cwhite"><bounds x="50" y="70" width="11" height="10" /></bezel> + <bezel element="cblack"><bounds x="60" y="70" width="11" height="10" /></bezel> + <bezel element="cwhite"><bounds x="70" y="70" width="10" height="10" /></bezel> + + <!-- sensors, pieces --> + <repeat count="8"> + <param name="y" start="0" increment="10" /> + <param name="i" start="8" increment="-1" /> + + <bezel element="hlbb" inputtag="board:RANK.~i~" inputmask="0x01"><bounds x="0" y="~y~" width="10" height="10" /><color alpha="0.04" /></bezel> + <bezel element="hlbb" inputtag="board:RANK.~i~" inputmask="0x02"><bounds x="10" y="~y~" width="10" height="10" /><color alpha="0.04" /></bezel> + <bezel element="hlbb" inputtag="board:RANK.~i~" inputmask="0x04"><bounds x="20" y="~y~" width="10" height="10" /><color alpha="0.04" /></bezel> + <bezel element="hlbb" inputtag="board:RANK.~i~" inputmask="0x08"><bounds x="30" y="~y~" width="10" height="10" /><color alpha="0.04" /></bezel> + <bezel element="hlbb" inputtag="board:RANK.~i~" inputmask="0x10"><bounds x="40" y="~y~" width="10" height="10" /><color alpha="0.04" /></bezel> + <bezel element="hlbb" inputtag="board:RANK.~i~" inputmask="0x20"><bounds x="50" y="~y~" width="10" height="10" /><color alpha="0.04" /></bezel> + <bezel element="hlbb" inputtag="board:RANK.~i~" inputmask="0x40"><bounds x="60" y="~y~" width="10" height="10" /><color alpha="0.04" /></bezel> + <bezel element="hlbb" inputtag="board:RANK.~i~" inputmask="0x80"><bounds x="70" y="~y~" width="10" height="10" /><color alpha="0.04" /></bezel> + + <bezel name="piece_a~i~" element="piece"><bounds x="0" y="~y~" width="10" height="10" /></bezel> + <bezel name="piece_b~i~" element="piece"><bounds x="10" y="~y~" width="10" height="10" /></bezel> + <bezel name="piece_c~i~" element="piece"><bounds x="20" y="~y~" width="10" height="10" /></bezel> + <bezel name="piece_d~i~" element="piece"><bounds x="30" y="~y~" width="10" height="10" /></bezel> + <bezel name="piece_e~i~" element="piece"><bounds x="40" y="~y~" width="10" height="10" /></bezel> + <bezel name="piece_f~i~" element="piece"><bounds x="50" y="~y~" width="10" height="10" /></bezel> + <bezel name="piece_g~i~" element="piece"><bounds x="60" y="~y~" width="10" height="10" /></bezel> + <bezel name="piece_h~i~" element="piece"><bounds x="70" y="~y~" width="10" height="10" /></bezel> + </repeat> + </group> + + +<!-- sb ui --> + + <element name="hlub" defstate="0"> + <rect state="1"><color red="0" green="0" blue="0" /></rect> + </element> + + <element name="text_uit1"><text string="S.BOARD"><color red="0.81" green="0.8" blue="0.79" /></text></element> + <element name="text_uit2"><text string="INTERFACE"><color red="0.81" green="0.8" blue="0.79" /></text></element> + <element name="text_uib1"><text string="BOARD:"><color red="0.81" green="0.8" blue="0.79" /></text></element> + <element name="text_uib2"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="RESET"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_uib3"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="CLEAR"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_uis1"><text string="SPAWN:"><color red="0.81" green="0.8" blue="0.79" /></text></element> + <element name="text_uih1"><text string="HAND:"><color red="0.81" green="0.8" blue="0.79" /></text></element> + <element name="text_uih2"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string="REMOVE"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_uiu1"><text string="UNDO:"><color red="0.81" green="0.8" blue="0.79" /></text></element> + <element name="text_uiu2a"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string=" <<"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_uiu2b"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string=" < "><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_uiu2c"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string=" >"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_uiu2d"> + <rect><color red="0.88" green="0.84" blue="0.65" /></rect> + <text string=" >>"><color red="0.01" green="0.01" blue="0.01" /></text> + </element> + <element name="text_uiu3a" defstate="0"> + <simplecounter maxstate="999" digits="1" align="2"> + <color red="0.81" green="0.8" blue="0.79" /> + </simplecounter> + </element> + <element name="text_uiu3b"><text string="/"><color red="0.81" green="0.8" blue="0.79" /></text></element> + <element name="text_uiu3c" defstate="0"> + <simplecounter maxstate="999" digits="1" align="1"> + <color red="0.81" green="0.8" blue="0.79" /> + </simplecounter> + </element> + + <group name="sb_ui"> + <bounds x="0" y="0" width="10" height="80" /> + <bezel element="cblack"><bounds x="0" y="0" width="10" height="1" /></bezel> + <bezel element="cblack"><bounds x="0" y="7" width="10" height="1" /></bezel> + <bezel element="cblack"><bounds x="0" y="79" width="10" height="1" /></bezel> + <bezel element="text_uit1"><bounds x="0" y="2" width="10" height="2" /></bezel> + <bezel element="text_uit2"><bounds x="0" y="4" width="10" height="2" /></bezel> + + <!-- board --> + <bezel element="text_uib1"><bounds x="0" y="9" width="10" height="2" /></bezel> + <bezel element="cwhite"><bounds x="1" y="11.5" width="8" height="2.5" /></bezel> + <bezel element="cwhite"><bounds x="1" y="15" width="8" height="2.5" /></bezel> + + <bezel element="text_uib2"><bounds x="1.5" y="11.75" width="7" height="2" /></bezel> + <bezel element="text_uib3"><bounds x="1.5" y="15.25" width="7" height="2" /></bezel> + + <bezel element="hlub" inputtag="board:UI" inputmask="0x200"><bounds x="1" y="11.5" width="8" height="2.5" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:UI" inputmask="0x100"><bounds x="1" y="15" width="8" height="2.5" /><color alpha="0.25" /></bezel> + + <!-- spawn --> + <bezel element="text_uis1"><bounds x="0" y="20.5" width="10" height="2" /></bezel> + <bezel element="cwhite"><bounds x="1" y="23" width="8" height="12" /></bezel> + <bezel element="cwhite"><bounds x="1" y="36" width="8" height="12" /></bezel> + + <bezel name="piece_ui1" element="piece"><bounds x="1" y="23" width="4" height="4" /></bezel> + <bezel name="piece_ui2" element="piece"><bounds x="1" y="27" width="4" height="4" /></bezel> + <bezel name="piece_ui3" element="piece"><bounds x="1" y="31" width="4" height="4" /></bezel> + <bezel name="piece_ui4" element="piece"><bounds x="5" y="23" width="4" height="4" /></bezel> + <bezel name="piece_ui5" element="piece"><bounds x="5" y="27" width="4" height="4" /></bezel> + <bezel name="piece_ui6" element="piece"><bounds x="5" y="31" width="4" height="4" /></bezel> + <bezel name="piece_ui7" element="piece"><bounds x="1" y="36" width="4" height="4" /></bezel> + <bezel name="piece_ui8" element="piece"><bounds x="1" y="40" width="4" height="4" /></bezel> + <bezel name="piece_ui9" element="piece"><bounds x="1" y="44" width="4" height="4" /></bezel> + <bezel name="piece_ui10" element="piece"><bounds x="5" y="36" width="4" height="4" /></bezel> + <bezel name="piece_ui11" element="piece"><bounds x="5" y="40" width="4" height="4" /></bezel> + <bezel name="piece_ui12" element="piece"><bounds x="5" y="44" width="4" height="4" /></bezel> + + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0001"><bounds x="1" y="23" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0002"><bounds x="1" y="27" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0004"><bounds x="1" y="31" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0008"><bounds x="5" y="23" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0010"><bounds x="5" y="27" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0020"><bounds x="5" y="31" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0040"><bounds x="1" y="36" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0080"><bounds x="1" y="40" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0100"><bounds x="1" y="44" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0200"><bounds x="5" y="36" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0400"><bounds x="5" y="40" width="4" height="4" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:SPAWN" inputmask="0x0800"><bounds x="5" y="44" width="4" height="4" /><color alpha="0.25" /></bezel> + + <!-- hand --> + <bezel element="text_uih1"><bounds x="0" y="51" width="10" height="2" /></bezel> + <bezel element="cblack"><bounds x="1" y="53.5" width="8" height="6" /></bezel> + <bezel name="piece_ui0" element="piece"><bounds x="2" y="53.5" width="6" height="6" /></bezel> + + <bezel element="cwhite"><bounds x="1" y="60.5" width="8" height="2.5" /></bezel> + <bezel element="text_uih2"><bounds x="1.5" y="60.75" width="7" height="2" /></bezel> + <bezel element="hlub" inputtag="board:UI" inputmask="0x08"><bounds x="1" y="60.5" width="8" height="2.5" /><color alpha="0.25" /></bezel> + + <!-- undo --> + <bezel element="text_uiu1"><bounds x="0" y="66" width="10" height="2" /></bezel> + <bezel element="cwhite"><bounds x="1" y="68.5" width="1.7" height="6" /></bezel> + <bezel element="cwhite"><bounds x="3.1" y="68.5" width="1.7" height="6" /></bezel> + <bezel element="cwhite"><bounds x="5.2" y="68.5" width="1.7" height="6" /></bezel> + <bezel element="cwhite"><bounds x="7.3" y="68.5" width="1.7" height="6" /></bezel> + <bezel element="text_uiu2a"><bounds x="1" y="69.5" width="1.7" height="4" /></bezel> + <bezel element="text_uiu2b"><bounds x="3.1" y="69.5" width="1.7" height="4" /></bezel> + <bezel element="text_uiu2c"><bounds x="5.2" y="69.5" width="1.7" height="4" /></bezel> + <bezel element="text_uiu2d"><bounds x="7.3" y="69.5" width="1.7" height="4" /></bezel> + + <bezel element="hlub" inputtag="board:UI" inputmask="0x10"><bounds x="1" y="68.5" width="1.7" height="6" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:UI" inputmask="0x20"><bounds x="3.1" y="68.5" width="1.7" height="6" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:UI" inputmask="0x40"><bounds x="5.2" y="68.5" width="1.7" height="6" /><color alpha="0.25" /></bezel> + <bezel element="hlub" inputtag="board:UI" inputmask="0x80"><bounds x="7.3" y="68.5" width="1.7" height="6" /><color alpha="0.25" /></bezel> + + <bezel name="count_ui0" element="text_uiu3a"><bounds x="0" y="75" width="4" height="2" /></bezel> + <bezel name="count_ui1" element="text_uiu3c"><bounds x="6" y="75" width="4" height="2" /></bezel> + <bezel element="text_uiu3b"><bounds x="4" y="75" width="2" height="2" /></bezel> + </group> + + +<!-- shared view --> + + <group name="shared"> + <bounds x="-0.5" y="6.5" width="83" height="94.9" /> + + <bezel element="gray"><bounds x="3" y="89.4" width="27" height="12" /></bezel> + <bezel element="blackb"><bounds x="5" y="91.4" width="23" height="8" /></bezel> + <bezel name="digit0" element="digit"><bounds x="7" y="92.4" width="4" height="6" /></bezel> + <bezel name="digit1" element="digit"><bounds x="12" y="92.4" width="4" height="6" /></bezel> + <bezel name="digit2" element="digit"><bounds x="17" y="92.4" width="4" height="6" /></bezel> + <bezel name="digit3" element="digit"><bounds x="22" y="92.4" width="4" height="6" /></bezel> + + <bezel element="text_8"><bounds x="-0.5" y="6.5" width="3" height="3" /></bezel> + <bezel element="text_7"><bounds x="-0.5" y="16.5" width="3" height="3" /></bezel> + <bezel element="text_6"><bounds x="-0.5" y="26.5" width="3" height="3" /></bezel> + <bezel element="text_5"><bounds x="-0.5" y="36.5" width="3" height="3" /></bezel> + <bezel element="text_4"><bounds x="-0.5" y="46.5" width="3" height="3" /></bezel> + <bezel element="text_3"><bounds x="-0.5" y="56.5" width="3" height="3" /></bezel> + <bezel element="text_2"><bounds x="-0.5" y="66.5" width="3" height="3" /></bezel> + <bezel element="text_1"><bounds x="-0.5" y="76.5" width="3" height="3" /></bezel> + + <bezel element="text_a"><bounds x="7" y="85.5" width="3" height="3" /></bezel> + <bezel element="text_b"><bounds x="17" y="85.5" width="3" height="3" /></bezel> + <bezel element="text_c"><bounds x="27" y="85.5" width="3" height="3" /></bezel> + <bezel element="text_d"><bounds x="37" y="85.5" width="3" height="3" /></bezel> + <bezel element="text_e"><bounds x="47" y="85.5" width="3" height="3" /></bezel> + <bezel element="text_f"><bounds x="57" y="85.5" width="3" height="3" /></bezel> + <bezel element="text_g"><bounds x="67" y="85.5" width="3" height="3" /></bezel> + <bezel element="text_h"><bounds x="77" y="85.5" width="3" height="3" /></bezel> + + <bezel element="blackb"><bounds x="1.1" y="6.7" width="1.6" height="2.6" /></bezel> + <bezel element="blackb"><bounds x="1.1" y="16.7" width="1.6" height="2.6" /></bezel> + <bezel element="blackb"><bounds x="1.1" y="26.7" width="1.6" height="2.6" /></bezel> + <bezel element="blackb"><bounds x="1.1" y="36.7" width="1.6" height="2.6" /></bezel> + <bezel element="blackb"><bounds x="1.1" y="46.7" width="1.6" height="2.6" /></bezel> + <bezel element="blackb"><bounds x="1.1" y="56.7" width="1.6" height="2.6" /></bezel> + <bezel element="blackb"><bounds x="1.1" y="66.7" width="1.6" height="2.6" /></bezel> + <bezel element="blackb"><bounds x="1.1" y="76.7" width="1.6" height="2.6" /></bezel> + + <bezel name="0.8" element="led"><bounds x="1.4" y="7" width="1" height="2" /></bezel> + <bezel name="0.7" element="led"><bounds x="1.4" y="17" width="1" height="2" /></bezel> + <bezel name="0.6" element="led"><bounds x="1.4" y="27" width="1" height="2" /></bezel> + <bezel name="0.5" element="led"><bounds x="1.4" y="37" width="1" height="2" /></bezel> + <bezel name="0.4" element="led"><bounds x="1.4" y="47" width="1" height="2" /></bezel> + <bezel name="0.3" element="led"><bounds x="1.4" y="57" width="1" height="2" /></bezel> + <bezel name="0.2" element="led"><bounds x="1.4" y="67" width="1" height="2" /></bezel> + <bezel name="0.1" element="led"><bounds x="1.4" y="77" width="1" height="2" /></bezel> + + <bezel element="blackb"><bounds x="7.2" y="83.8" width="2.6" height="1.6" /></bezel> + <bezel element="blackb"><bounds x="17.2" y="83.8" width="2.6" height="1.6" /></bezel> + <bezel element="blackb"><bounds x="27.2" y="83.8" width="2.6" height="1.6" /></bezel> + <bezel element="blackb"><bounds x="37.2" y="83.8" width="2.6" height="1.6" /></bezel> + <bezel element="blackb"><bounds x="47.2" y="83.8" width="2.6" height="1.6" /></bezel> + <bezel element="blackb"><bounds x="57.2" y="83.8" width="2.6" height="1.6" /></bezel> + <bezel element="blackb"><bounds x="67.2" y="83.8" width="2.6" height="1.6" /></bezel> + <bezel element="blackb"><bounds x="77.2" y="83.8" width="2.6" height="1.6" /></bezel> + + <bezel name="1.1" element="led"><bounds x="7.5" y="84.1" width="2" height="1" /></bezel> + <bezel name="1.2" element="led"><bounds x="17.5" y="84.1" width="2" height="1" /></bezel> + <bezel name="1.3" element="led"><bounds x="27.5" y="84.1" width="2" height="1" /></bezel> + <bezel name="1.4" element="led"><bounds x="37.5" y="84.1" width="2" height="1" /></bezel> + <bezel name="1.5" element="led"><bounds x="47.5" y="84.1" width="2" height="1" /></bezel> + <bezel name="1.6" element="led"><bounds x="57.5" y="84.1" width="2" height="1" /></bezel> + <bezel name="1.7" element="led"><bounds x="67.5" y="84.1" width="2" height="1" /></bezel> + <bezel name="1.8" element="led"><bounds x="77.5" y="84.1" width="2" height="1" /></bezel> + + <bezel element="but" inputtag="IN.0" inputmask="0x01"><bounds x="33.5" y="93" width="4.2" height="6.4" /></bezel> + <bezel element="but" inputtag="IN.0" inputmask="0x02"><bounds x="39.0" y="93" width="4.2" height="6.4" /></bezel> + <bezel element="but" inputtag="IN.0" inputmask="0x04"><bounds x="44.5" y="93" width="4.2" height="6.4" /></bezel> + <bezel element="but" inputtag="IN.0" inputmask="0x08"><bounds x="50.0" y="93" width="4.2" height="6.4" /></bezel> + <bezel element="but" inputtag="IN.0" inputmask="0x10"><bounds x="55.5" y="93" width="4.2" height="6.4" /></bezel> + <bezel element="but" inputtag="IN.0" inputmask="0x20"><bounds x="61.0" y="93" width="4.2" height="6.4" /></bezel> + <bezel element="but" inputtag="IN.0" inputmask="0x40"><bounds x="66.5" y="93" width="4.2" height="6.4" /></bezel> + <bezel element="but" inputtag="IN.0" inputmask="0x80"><bounds x="72.0" y="93" width="4.2" height="6.4" /></bezel> + <bezel element="but" inputtag="RESET" inputmask="0x01"><bounds x="79.3" y="93" width="4.2" height="6.4" /></bezel> + </group> + + +<!-- build screen --> + + <view name="Internal Layout (Russian)"> <!-- original --> + <bounds left="-14" right="88" top="-1.5" bottom="103.5" /> + + <bezel element="cwhite"><bounds x="-1" y="-1.5" width="89" height="105" /></bezel> + <bezel element="cblack"><bounds x="3" y="2.5" width="81" height="81" /></bezel> + + <group ref="sb_board"><bounds x="3.5" y="3" width="80" height="80" /></group> + <group ref="sb_ui"><bounds x="-12.5" y="3" width="10" height="80" /></group> + + <bezel element="text_b1"><bounds x="33.0" y="90" width="5.2" height="2.5" /></bezel> + <bezel element="text_b2"><bounds x="38.5" y="90" width="5.2" height="2.5" /></bezel> + <bezel element="text_b3"><bounds x="44.0" y="90" width="5.2" height="2.5" /></bezel> + <bezel element="text_b4"><bounds x="49.5" y="90" width="5.2" height="2.5" /></bezel> + <bezel element="text_b5"><bounds x="55.0" y="90" width="5.2" height="2.5" /></bezel> + <bezel element="text_b6"><bounds x="60.5" y="90" width="5.2" height="2.5" /></bezel> + <bezel element="text_b7"><bounds x="66.0" y="90" width="5.2" height="2.5" /></bezel> + <bezel element="text_b8"><bounds x="71.5" y="90" width="5.2" height="2.5" /></bezel> + <bezel element="text_b9"><bounds x="78.8" y="90" width="5.2" height="2.5" /></bezel> + + <group ref="shared"><bounds x="-0.5" y="6.5" width="83" height="94.9" /></group> + </view> + + <view name="Internal Layout (English)"> <!-- translated --> + <bounds left="-14" right="88" top="-1.5" bottom="103.5" /> + + <bezel element="cwhite"><bounds x="-1" y="-1.5" width="89" height="105" /></bezel> + <bezel element="cblack"><bounds x="3" y="2.5" width="81" height="81" /></bezel> + + <group ref="sb_board"><bounds x="3.5" y="3" width="80" height="80" /></group> + <group ref="sb_ui"><bounds x="-12.5" y="3" width="10" height="80" /></group> + + <bezel element="text_tb1"><bounds x="32.0" y="90.7" width="7.2" height="1.8" /></bezel> + <bezel element="text_tb2a"><bounds x="38.5" y="89.0" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb2b"><bounds x="38.5" y="90.7" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb3"><bounds x="44.0" y="90.7" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb4a"><bounds x="49.5" y="89.0" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb4b"><bounds x="49.5" y="90.7" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb5a"><bounds x="55.0" y="89.0" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb5b"><bounds x="55.0" y="90.7" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb6a"><bounds x="60.5" y="89.0" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb6b"><bounds x="60.5" y="90.7" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb7"><bounds x="66.0" y="90.7" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb8a"><bounds x="71.5" y="89.0" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb8b"><bounds x="71.5" y="90.7" width="5.2" height="1.8" /></bezel> + <bezel element="text_tb9"><bounds x="78.8" y="90.7" width="5.2" height="1.8" /></bezel> + + <group ref="shared"><bounds x="-0.5" y="6.5" width="83" height="94.9" /></group> + </view> + +</mamelayout> diff --git a/src/mame/layout/intellect02.lay b/src/mame/layout/intellect02.lay index 4f23cb0bc5c..d39de00ea30 100644 --- a/src/mame/layout/intellect02.lay +++ b/src/mame/layout/intellect02.lay @@ -1,7 +1,7 @@ <?xml version="1.0"?> <mamelayout version="2"> -<!-- NOTE: no chesspieces simulation here, Intellect-2 is a multiple boardgame console, not just chess --> +<!-- NOTE: no chesspieces simulation here, Intellect-02 is a multiple boardgame console, not just chess --> <!-- define elements --> @@ -22,64 +22,62 @@ <disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk> </element> - <element name="text_l1"><text string="PROGRESS INDICATOR" align="1"><color red="0.2" green="0.2" blue="0.2" /></text></element> - <element name="text_l2"><text string="YOU WIN" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element> - <element name="text_l3"><text string="YOU LOSE" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_l1"><text string="ИНДИКАЦИЯ ХОДА" align="1"><color red="0.2" green="0.2" blue="0.2" /></text></element> + <element name="text_l2"><text string="ВЫ ВЫИГРАЛИ" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_l3"><text string="ВЫ ПРОИГРАЛИ" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element> - <element name="text_b1"><text string="RESET"><color red="0.8" green="0.8" blue="0.8" /></text></element> - <element name="text_b2"><text string="SELECT"><color red="0.8" green="0.8" blue="0.8" /></text></element> - <element name="text_b3"><text string="V. POS."><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_b1"><text string="СБ"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_b2"><text string="ВИ"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_b3"><text string="ПП"><color red="0.8" green="0.8" blue="0.8" /></text></element> <element name="text_b4"><text string="A1"><color red="0.8" green="0.8" blue="0.8" /></text></element> <element name="text_b5"><text string="B2"><color red="0.8" green="0.8" blue="0.8" /></text></element> <element name="text_b6"><text string="C3"><color red="0.8" green="0.8" blue="0.8" /></text></element> <element name="text_b7"><text string="D4"><color red="0.8" green="0.8" blue="0.8" /></text></element> <element name="text_b8"><text string="E5"><color red="0.8" green="0.8" blue="0.8" /></text></element> - <element name="text_b9"><text string="INPUT"><color red="0.8" green="0.8" blue="0.8" /></text></element> - <element name="text_b10"><text string="ERASE"><color red="0.8" green="0.8" blue="0.8" /></text></element> - <element name="text_b11"><text string="LEVEL"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_b9"><text string="ВВ"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_b10"><text string="СТ"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_b11"><text string="УИ"><color red="0.8" green="0.8" blue="0.8" /></text></element> <element name="text_b12"><text string="F6"><color red="0.8" green="0.8" blue="0.8" /></text></element> <element name="text_b13"><text string="G7"><color red="0.8" green="0.8" blue="0.8" /></text></element> <element name="text_b14"><text string="H8"><color red="0.8" green="0.8" blue="0.8" /></text></element> <element name="text_b15"><text string="9"><color red="0.8" green="0.8" blue="0.8" /></text></element> <element name="text_b16"><text string="0"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_tl1"><text string="PROGRESS INDICATOR" align="1"><color red="0.2" green="0.2" blue="0.2" /></text></element> + <element name="text_tl2"><text string="YOU WIN" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_tl3"><text string="YOU LOSE" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element> + + <element name="text_tb1"><text string="RESET"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_tb2"><text string="SELECT"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_tb3"><text string="V. POS."><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_tb9"><text string="INPUT"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_tb10"><text string="ERASE"><color red="0.8" green="0.8" blue="0.8" /></text></element> + <element name="text_tb11"><text string="LEVEL"><color red="0.8" green="0.8" blue="0.8" /></text></element> -<!-- build screen --> - <view name="Internal Layout"> - <bounds left="7.5" right="43" top="7" bottom="30.2" /> +<!-- shared view --> - <!-- display --> + <group name="shared"> + <bounds x="7.5" y="7.6" width="26" height="21.6" /> + <!-- display --> <bezel element="static_black2"><bounds x="8.5" y="8" width="33.5" height="11.5" /></bezel> <bezel element="static_black"><bounds x="8.1" y="7.6" width="33.5" height="11.5" /></bezel> - <bezel element="text_l1"><bounds x="21" y="7.9" width="20" height="1.5" /></bezel> - <bezel element="text_l2"><bounds x="8.5" y="7.9" width="8" height="1.5" /></bezel> - <bezel element="text_l3"><bounds x="8.5" y="16.4" width="8" height="1.5" /></bezel> - - <bezel name="5.a" element="led"><bounds x="16" y="8" width="1.5" height="1.5" /></bezel> - <bezel name="4.a" element="led"><bounds x="16" y="16.5" width="1.5" height="1.5" /></bezel> + <bezel name="5.a" element="led"><bounds x="16.5" y="8" width="1.5" height="1.5" /></bezel> + <bezel name="4.a" element="led"><bounds x="16.5" y="16.5" width="1.5" height="1.5" /></bezel> <bezel name="digit0" element="digit"><bounds x="20" y="10" width="4" height="6" /></bezel> <bezel name="digit1" element="digit"><bounds x="24" y="10" width="4" height="6" /></bezel> <bezel name="digit2" element="digit"><bounds x="32" y="10" width="4" height="6" /></bezel> <bezel name="digit3" element="digit"><bounds x="36" y="10" width="4" height="6" /></bezel> - <!-- buttons --> - - <bezel element="text_b1"><bounds x="7.5" y="20.7" width="5" height="1.2" /></bezel> - <bezel element="text_b2"><bounds x="11.86" y="20.7" width="5" height="1.2" /></bezel> - <bezel element="text_b3"><bounds x="16.21" y="20.7" width="5" height="1.2" /></bezel> + <!-- buttons --> <bezel element="text_b4"><bounds x="20.57" y="20.7" width="5" height="1.2" /></bezel> <bezel element="text_b5"><bounds x="24.93" y="20.7" width="5" height="1.2" /></bezel> <bezel element="text_b6"><bounds x="29.27" y="20.7" width="5" height="1.2" /></bezel> <bezel element="text_b7"><bounds x="33.64" y="20.7" width="5" height="1.2" /></bezel> <bezel element="text_b8"><bounds x="38" y="20.7" width="5" height="1.2" /></bezel> - - <bezel element="text_b9"><bounds x="7.5" y="25.4" width="5" height="1.2" /></bezel> - <bezel element="text_b10"><bounds x="11.86" y="25.4" width="5" height="1.2" /></bezel> - <bezel element="text_b11"><bounds x="16.21" y="25.4" width="5" height="1.2" /></bezel> <bezel element="text_b12"><bounds x="20.57" y="25.4" width="5" height="1.2" /></bezel> <bezel element="text_b13"><bounds x="24.93" y="25.4" width="5" height="1.2" /></bezel> <bezel element="text_b14"><bounds x="29.27" y="25.4" width="5" height="1.2" /></bezel> @@ -103,6 +101,41 @@ <bezel element="button" inputtag="IN.0" inputmask="0x0040"><bounds x="30.27" y="26.7" width="3" height="2.5" /></bezel> <bezel element="button" inputtag="IN.0" inputmask="0x0020"><bounds x="34.64" y="26.7" width="3" height="2.5" /></bezel> <bezel element="button" inputtag="IN.0" inputmask="0x4000"><bounds x="39" y="26.7" width="3" height="2.5" /></bezel> + </group> + + +<!-- build screen --> + <view name="Internal Layout (Russian)"> <!-- original --> + <bounds x="7.5" y="7" width="35.5" height="23.2" /> + <group ref="shared"><bounds x="7.5" y="7.6" width="26" height="21.6" /></group> + + <bezel element="text_l1"><bounds x="21" y="8.05" width="20" height="1.2" /></bezel> + <bezel element="text_l2"><bounds x="8.5" y="8.05" width="8" height="1.2" /></bezel> + <bezel element="text_l3"><bounds x="8.5" y="16.55" width="8" height="1.2" /></bezel> + + <bezel element="text_b1"><bounds x="7.5" y="20.7" width="5" height="1.2" /></bezel> + <bezel element="text_b2"><bounds x="11.86" y="20.7" width="5" height="1.2" /></bezel> + <bezel element="text_b3"><bounds x="16.21" y="20.7" width="5" height="1.2" /></bezel> + <bezel element="text_b9"><bounds x="7.5" y="25.4" width="5" height="1.2" /></bezel> + <bezel element="text_b10"><bounds x="11.86" y="25.4" width="5" height="1.2" /></bezel> + <bezel element="text_b11"><bounds x="16.21" y="25.4" width="5" height="1.2" /></bezel> + </view> + + <view name="Internal Layout (English)"> <!-- translated --> + <bounds x="7.5" y="7" width="35.5" height="23.2" /> + <group ref="shared"><bounds x="7.5" y="7.6" width="26" height="21.6" /></group> + + <bezel element="text_tl1"><bounds x="21" y="8.05" width="20" height="1.2" /></bezel> + <bezel element="text_tl2"><bounds x="11" y="8.05" width="8" height="1.2" /></bezel> + <bezel element="text_tl3"><bounds x="11" y="16.55" width="8" height="1.2" /></bezel> + + <bezel element="text_tb1"><bounds x="7.5" y="20.7" width="5" height="1.2" /></bezel> + <bezel element="text_tb2"><bounds x="11.86" y="20.7" width="5" height="1.2" /></bezel> + <bezel element="text_tb3"><bounds x="16.21" y="20.7" width="5" height="1.2" /></bezel> + <bezel element="text_tb9"><bounds x="7.5" y="25.4" width="5" height="1.2" /></bezel> + <bezel element="text_tb10"><bounds x="11.86" y="25.4" width="5" height="1.2" /></bezel> + <bezel element="text_tb11"><bounds x="16.21" y="25.4" width="5" height="1.2" /></bezel> </view> + </mamelayout> diff --git a/src/mame/layout/saitek_corona.lay b/src/mame/layout/saitek_corona.lay index 40c9d96618c..83b6cae4983 100644 --- a/src/mame/layout/saitek_corona.lay +++ b/src/mame/layout/saitek_corona.lay @@ -497,7 +497,7 @@ <!-- lcd panel --> <group name="lcd1"> - <bounds x="15.5" y="0" width="22.5" height="14" /> + <bounds x="15" y="0" width="23" height="14" /> <bezel name="digit0" element="digit"><bounds x="15" y="0" width="4" height="6" /></bezel> <bezel name="digit1" element="digit"><bounds x="20" y="0" width="4" height="6" /></bezel> @@ -586,7 +586,7 @@ <group ref="sb_board"><bounds x="10" y="10" width="80" height="80" /></group> <group ref="sb_ui"><bounds x="-1.5" y="10" width="10" height="80" /></group> - <group ref="lcd1"><bounds x="26.64" y="92" width="12.86" height="8" /></group> + <group ref="lcd1"><bounds x="26.36" y="92" width="13.14" height="8" /></group> <group ref="lcd2"><bounds x="25.14" y="96.5714" width="3.42857" height="3.42857" /></group> <bezel element="whitew"><bounds x="24.64" y="91.5" width="15.36" height="9" /><color alpha="0.125" /></bezel> diff --git a/src/mame/layout/saitek_stratos.lay b/src/mame/layout/saitek_stratos.lay index 0cf489d7928..f5d60655d05 100644 --- a/src/mame/layout/saitek_stratos.lay +++ b/src/mame/layout/saitek_stratos.lay @@ -476,7 +476,7 @@ <!-- lcd panel --> <group name="lcd1"> - <bounds x="15.5" y="0" width="22.5" height="14" /> + <bounds x="15" y="0" width="23" height="14" /> <bezel name="digit0" element="digit"><bounds x="15" y="0" width="4" height="6" /></bezel> <bezel name="digit1" element="digit"><bounds x="20" y="0" width="4" height="6" /></bezel> @@ -565,7 +565,7 @@ <group ref="sb_board"><bounds x="10" y="10" width="80" height="80" /></group> <group ref="sb_ui"><bounds x="-3" y="10" width="10" height="80" /></group> - <group ref="lcd1"><bounds x="26.64" y="93" width="12.86" height="8" /></group> + <group ref="lcd1"><bounds x="26.36" y="93" width="13.14" height="8" /></group> <group ref="lcd2"><bounds x="25.14" y="97.5714" width="3.42857" height="3.42857" /></group> <bezel element="whitew"><bounds x="24.64" y="92.5" width="15.36" height="9" /><color alpha="0.125" /></bezel> diff --git a/src/mame/layout/sc2.lay b/src/mame/layout/sc2.lay index 86f280ebce2..b1638a7b728 100644 --- a/src/mame/layout/sc2.lay +++ b/src/mame/layout/sc2.lay @@ -398,6 +398,7 @@ <group name="sb_ui"> <bounds x="0" y="0" width="10" height="80" /> + <bezel element="cblack"><bounds x="0" y="0" width="10" height="1" /></bezel> <bezel element="cblack"><bounds x="0" y="7" width="10" height="1" /></bezel> <bezel element="cblack"><bounds x="0" y="79" width="10" height="1" /></bezel> @@ -480,7 +481,7 @@ <!-- display, buttons --> <group name="panel"> - <bounds x="0" y="5" width="270" height="390" /> + <bounds x="5" y="15" width="270" height="370" /> <bezel name="digit0" element="digit"><bounds x="10" y="15" width="50" height="75" /></bezel> <bezel name="digit1" element="digit"><bounds x="70" y="15" width="50" height="75" /></bezel> @@ -555,9 +556,9 @@ <!-- build screen --> <view name="Internal Layout (Full)"> - <bounds left="-13" right="131.8" top="-1.5" bottom="87.5" /> + <bounds left="-13" right="131.14" top="-1.5" bottom="87.5" /> - <group ref="panel"><bounds x="91" y="29.4" width="38.0769" height="55" /></group> + <group ref="panel"><bounds x="91.297" y="31" width="37.946" height="52" /></group> <bezel element="white"><bounds x="-1" y="-1.5" width="89" height="89" /></bezel> <bezel element="black2"><bounds x="3" y="2.5" width="81" height="81" /></bezel> @@ -587,7 +588,7 @@ <view name="Internal Layout (Buttons)"> <bounds left="0" right="270" top="0" bottom="390" /> - <group ref="panel"><bounds x="0" y="0" width="270" height="390" /></group> + <group ref="panel"><bounds x="5" y="10" width="270" height="370" /></group> </view> </mamelayout> diff --git a/src/mame/machine/seibucop/seibucop.h b/src/mame/machine/seibucop/seibucop.h index 9aa725d0fa3..940f6cea362 100644 --- a/src/mame/machine/seibucop/seibucop.h +++ b/src/mame/machine/seibucop/seibucop.h @@ -186,6 +186,7 @@ public: DECLARE_WRITE16_MEMBER(cop_rom_addr_hi_w); int m_cop_sprite_dma_abs_x,m_cop_sprite_dma_abs_y; + int m_sprite_dma_rel_x, m_sprite_dma_rel_y; DECLARE_WRITE16_MEMBER(cop_sprite_dma_abs_y_w); DECLARE_WRITE16_MEMBER(cop_sprite_dma_abs_x_w); diff --git a/src/mame/machine/seibucop/seibucop_cmd.hxx b/src/mame/machine/seibucop/seibucop_cmd.hxx index c80b0e23f58..91c653331ca 100644 --- a/src/mame/machine/seibucop/seibucop_cmd.hxx +++ b/src/mame/machine/seibucop/seibucop_cmd.hxx @@ -381,24 +381,30 @@ void raiden2cop_device::LEGACY_execute_6200(int offset, uint16_t data) // this i void raiden2cop_device::LEGACY_execute_6980(int offset, uint16_t data) { uint8_t offs; - int abs_x, abs_y, rel_xy; +// int abs_x, abs_y, rel_xy; + int rel_xy; offs = (offset & 3) * 4; /* TODO: I really suspect that following two are actually taken from the 0xa180 macro command then internally loaded */ - abs_x = m_host_space->read_word(cop_regs[0] + 8) - m_cop_sprite_dma_abs_x; - abs_y = m_host_space->read_word(cop_regs[0] + 4) - m_cop_sprite_dma_abs_y; +// abs_x = m_host_space->read_word(cop_regs[0] + 8) - m_cop_sprite_dma_abs_x; +// abs_y = m_host_space->read_word(cop_regs[0] + 4) - m_cop_sprite_dma_abs_y; rel_xy = m_host_space->read_word(m_cop_sprite_dma_src + 4 + offs); //if(rel_xy & 0x0706) // printf("sprite rel_xy = %04x\n",rel_xy); - if (rel_xy & 1) - m_host_space->write_word(cop_regs[4] + offs + 4, 0xc0 + abs_x - (rel_xy & 0xf8)); - else - m_host_space->write_word(cop_regs[4] + offs + 4, (((rel_xy & 0x78) + (abs_x)-((rel_xy & 0x80) ? 0x80 : 0)))); + m_sprite_dma_rel_x = (rel_xy & 0xff); + m_sprite_dma_rel_y = ((rel_xy & 0xff00) >> 8); +// m_sprite_dma_rel_x = (rel_xy & 0x78) + (abs_x)-((rel_xy & 0x80) ? 0x80 : 0); +// m_sprite_dma_rel_y = ((rel_xy & 0x7800) >> 8) + (abs_y)-((rel_xy & 0x8000) ? 0x80 : 0); + +// if (rel_xy & 1) +// m_host_space->write_word(cop_regs[4] + offs + 4, 0xc0 + abs_x - (rel_xy & 0xf8)); +// else +// m_host_space->write_word(cop_regs[4] + offs + 4, (((rel_xy & 0x78) + (abs_x)-((rel_xy & 0x80) ? 0x80 : 0)))); - m_host_space->write_word(cop_regs[4] + offs + 6, (((rel_xy & 0x7800) >> 8) + (abs_y)-((rel_xy & 0x8000) ? 0x80 : 0))); +// m_host_space->write_word(cop_regs[4] + offs + 6, (((rel_xy & 0x7800) >> 8) + (abs_y)-((rel_xy & 0x8000) ? 0x80 : 0))); } /* @@ -526,15 +532,51 @@ void raiden2cop_device::execute_b900(int offset, uint16_t data) 18 - 7c80 ( 0f) ( 480) : (080, 882, 000, 000, 000, 000, 000, 000) a ff00 (zeroteam, xsedae) */ +// SD Gundam single step sprite DMA +// Notes of interest: +// - bit 0 of rel_x is enabled at stage 2 boss for the flipped ray but seems left-over; +// - stage 3 midboss has some garbage sprites, that's because game incorrectly sets up a size of 8 for one transfer, prolly more left-over; void raiden2cop_device::LEGACY_execute_c480(int offset, uint16_t data) { uint8_t offs; + uint16_t sprite_info; + uint16_t sprite_x, sprite_y; + int abs_x, abs_y; offs = (offset & 3) * 4; - m_host_space->write_word(cop_regs[4] + offs + 0, m_host_space->read_word(m_cop_sprite_dma_src + offs) + (m_cop_sprite_dma_param & 0x3f)); - //m_host_space->write_word(cop_regs[4] + offs + 2,m_host_space->read_word(m_cop_sprite_dma_src+2 + offs)); + // TODO: upper bits of DMA params seems to go into sprite priority? + sprite_info = m_host_space->read_word(m_cop_sprite_dma_src + offs) + (m_cop_sprite_dma_param & 0x3f); + m_host_space->write_word(cop_regs[4] + offs + 0, sprite_info); + + abs_x = m_host_space->read_word(cop_regs[0] + 8) - m_cop_sprite_dma_abs_x; + abs_y = m_host_space->read_word(cop_regs[0] + 4) - m_cop_sprite_dma_abs_y; + + const u8 fx = (sprite_info & 0x4000) >> 14; + const u8 fy = (sprite_info & 0x2000) >> 13; + const u8 dx = ((sprite_info & 0x1c00) >> 10) + 1; + //const u8 dy = ((sprite_info & 0x0380) >> 7) + 1; + + if (fx) + { + sprite_x = (0x100 - (dx*16)); + sprite_x += (abs_x)-(m_sprite_dma_rel_x & 0x78); + if (m_sprite_dma_rel_x & 0x80) + sprite_x -= 0x80; + else + sprite_x -= 0x100; + } + else + sprite_x = (m_sprite_dma_rel_x & 0x78) + (abs_x)-((m_sprite_dma_rel_x & 0x80) ? 0x80 : 0); + if (fy) + sprite_y = (abs_y)+((m_sprite_dma_rel_y & 0x80) ? 0x80 : 0)-(m_sprite_dma_rel_y & 0x78); + else + sprite_y = (m_sprite_dma_rel_y & 0x78) + (abs_y)-((m_sprite_dma_rel_y & 0x80) ? 0x80 : 0); + + //m_host_space->write_word(cop_regs[4] + offs + 2,m_host_space->read_word(m_cop_sprite_dma_src+2 + offs)); + m_host_space->write_word(cop_regs[4] + offs + 4, sprite_x); + m_host_space->write_word(cop_regs[4] + offs + 6, sprite_y); } /* diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 777fc9b18c8..7671bb4df34 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -11410,6 +11410,9 @@ leadang // (c) 1988 Seibu Kaihatsu popnrun // (c) 1987 Seibu Kaihatsu + Yukai Tsukai popnruna // (c) 1987 Seibu Kaihatsu + Yukai Tsukai +@source:debut.cpp +debutm + @source:dec0.cpp automat // bootleg baddudes // EI (c) 1988 Data East USA (US) diff --git a/src/mame/mess.flt b/src/mame/mess.flt index f3566081cb3..0276d5c4545 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -185,6 +185,7 @@ datum.cpp dbox.cpp dccons.cpp dct11em.cpp +debut.cpp decstation.cpp dectalk.cpp decwritr.cpp diff --git a/src/osd/osdcore.h b/src/osd/osdcore.h index ac1571f2dd2..aababe47a19 100644 --- a/src/osd/osdcore.h +++ b/src/osd/osdcore.h @@ -864,6 +864,157 @@ enum osd_output_channel OSD_OUTPUT_CHANNEL_COUNT }; +class osd_gpu +{ +public: + osd_gpu() { } + virtual ~osd_gpu() { } + + typedef uint64_t handle_t; + + class vertex_decl + { + public: + enum attr_type : uint32_t + { + FLOAT32, + FLOAT16, + UINT32, + UINT16, + UINT8, + + MAX_TYPES + }; + + static constexpr size_t TYPE_SIZES[MAX_TYPES] = { 4, 2, 4, 2, 1 }; + + static constexpr uint32_t MAX_COLORS = 2; + static constexpr uint32_t MAX_TEXCOORDS = 8; + + enum attr_usage : uint32_t + { + POSITION, + COLOR, + TEXCOORD = COLOR + MAX_COLORS, + NORMAL = TEXCOORD + MAX_TEXCOORDS, + BINORMAL, + TANGENT, + + MAX_ATTRS + }; + + class attr_entry + { + public: + attr_entry() : m_usage(POSITION), m_type(FLOAT32), m_count(3), m_size(12) { } + attr_entry(attr_usage usage, attr_type type, size_t count) : m_usage(usage), m_type(type), m_count(count), m_size(TYPE_SIZES[type] * count) { } + + attr_usage usage() const { return m_usage; } + attr_type type() const { return m_type; } + size_t count() const { return m_count; } + size_t size() const { return m_size; } + + private: + attr_usage m_usage; + attr_type m_type; + size_t m_count; + size_t m_size; + }; + + vertex_decl() + : m_entry_count(0) + , m_size(0) + { + } + + vertex_decl & add_attr(attr_usage usage, attr_type type, size_t count) + { + m_entries[m_entry_count] = attr_entry(usage, type, count); + m_size += m_entries[m_entry_count].size(); + m_entry_count++; + return *this; + } + + size_t entry_count() const { return m_entry_count; } + size_t size() const { return m_size; } + const attr_entry &entry(const uint32_t index) const { return m_entries[index]; } + + protected: + attr_entry m_entries[MAX_ATTRS]; + size_t m_entry_count; + size_t m_size; + }; + + class vertex_buffer_interface + { + public: + vertex_buffer_interface(vertex_decl &decl, uint32_t flags) + : m_decl(decl) + , m_flags(flags) + { + } + virtual ~vertex_buffer_interface() {} + + const vertex_decl &decl() const { return m_decl; } + uint32_t flags() const { return m_flags; } + handle_t handle() { return m_handle; } + + virtual size_t count() const = 0; + virtual size_t size() const = 0; + virtual void upload() = 0; + + protected: + const vertex_decl &m_decl; + const uint32_t m_flags; + handle_t m_handle; + }; + + class static_vertex_buffer_interface : public vertex_buffer_interface + { + public: + enum vertex_buffer_flags : uint32_t + { + RETAIN_ON_CPU = 0x00000001 + }; + + static_vertex_buffer_interface(vertex_decl &decl, size_t count, uint32_t flags) + : vertex_buffer_interface(decl, flags) + , m_count(count) + , m_size(decl.size() * count) + { + } + + virtual ~static_vertex_buffer_interface() + { + if (m_data) + delete [] m_data; + } + + size_t count() const override { return m_count; } + size_t size() const override { return m_size; } + + void set_data(void *data) + { + allocate_if_needed(); + memcpy(m_data, data, m_size); + } + + protected: + void allocate_if_needed() + { + if ((m_flags & RETAIN_ON_CPU) != 0 && m_data == nullptr) + m_data = new uint8_t[m_size]; + } + + const size_t m_count; + const size_t m_size; + uint8_t *m_data; + }; + + virtual void bind_buffer(vertex_buffer_interface *vb) = 0; + virtual void unbind_buffer(vertex_buffer_interface *vb) = 0; +}; + class osd_output { public: |