diff options
author | couriersud <couriersud@arcor.de> | 2015-05-05 21:43:45 +0200 |
---|---|---|
committer | couriersud <couriersud@arcor.de> | 2015-05-05 21:43:45 +0200 |
commit | 9f157b47c4cc452c6dda601b1506fb6b67d80acd (patch) | |
tree | 6b3b4586fa12d4d3f864b21ec69bb8d993012af9 | |
parent | 1dd58681aa0ee817568c0cac7e033b13dbe8a8ea (diff) | |
parent | 0c705c7c6f43112bb057410fa4ad3ab006d9b480 (diff) |
Merge branch 'master' of https://github.com/mamedev/mame.git
-rw-r--r-- | scripts/src/cpu.lua | 16 | ||||
-rw-r--r-- | scripts/target/mame/mame.lua | 7 | ||||
-rw-r--r-- | scripts/target/mess/mess.lua | 3 | ||||
-rw-r--r-- | src/emu/cpu/amis2000/amis2000.h | 2 | ||||
-rw-r--r-- | src/emu/cpu/e0c6200/e0c6200.c | 104 | ||||
-rw-r--r-- | src/emu/cpu/e0c6200/e0c6200.h | 73 | ||||
-rw-r--r-- | src/emu/cpu/e0c6200/e0c6200d.c | 18 | ||||
-rw-r--r-- | src/emu/cpu/e0c6200/e0c6200op.inc | 1 | ||||
-rw-r--r-- | src/emu/cpu/hmcs40/hmcs40.h | 2 | ||||
-rw-r--r-- | src/emu/cpu/tms0980/tms0980.h | 2 | ||||
-rw-r--r-- | src/emu/cpu/tms34010/tms34010.c | 7 | ||||
-rw-r--r-- | src/emu/cpu/tms34010/tms34010.h | 5 | ||||
-rw-r--r-- | src/emu/cpu/ucom4/ucom4.h | 2 | ||||
-rw-r--r-- | src/emu/inpttype.h | 2 | ||||
-rw-r--r-- | src/mame/drivers/harddriv.c | 2 | ||||
-rw-r--r-- | src/mame/drivers/ramtek.c | 13 | ||||
-rw-r--r-- | src/mame/video/chihiro.c | 4 | ||||
-rw-r--r-- | src/mess/drivers/hh_hmcs40.c | 330 | ||||
-rw-r--r-- | src/mess/drivers/hh_tms1k.c | 8 | ||||
-rw-r--r-- | src/mess/mess.lst | 2 |
20 files changed, 566 insertions, 37 deletions
diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index 515c55a222c..cb80c5403f4 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -360,6 +360,22 @@ if (CPUS["ESRIP"]~=null or _OPTIONS["with-tools"]) then end -------------------------------------------------- +-- Seiko Epson E0C6200 series +---@src/emu/cpu/e0c6200/e0c6200.h,CPUS += E0C6200 +-------------------------------------------------- + +if (CPUS["E0C6200"]~=null) then + files { + MAME_DIR .. "src/emu/cpu/e0c6200/e0c6200.c", + MAME_DIR .. "src/emu/cpu/e0c6200/e0c6200.h", + } +end + +if (CPUS["E0C6200"]~=null or _OPTIONS["with-tools"]) then + table.insert(disasm_files , MAME_DIR .. "src/emu/cpu/e0c6200/e0c6200d.c") +end + +-------------------------------------------------- -- RCA COSMAC ---@src/emu/cpu/cosmac/cosmac.h,CPUS += COSMAC -------------------------------------------------- diff --git a/scripts/target/mame/mame.lua b/scripts/target/mame/mame.lua index 44120517e4b..b8959dc8c63 100644 --- a/scripts/target/mame/mame.lua +++ b/scripts/target/mame/mame.lua @@ -100,7 +100,7 @@ CPUS["SM8500"] = true CPUS["MINX"] = true CPUS["SSEM"] = true CPUS["AVR8"] = true -CPUS["TMS0980"] = true +--CPUS["TMS0980"] = true CPUS["I4004"] = true CPUS["SUPERFX"] = true CPUS["Z8"] = true @@ -123,9 +123,10 @@ CPUS["ALTO2"] = true --CPUS["W65816"] = true CPUS["ARC"] = true CPUS["ARCOMPACT"] = true -CPUS["AMIS2000"] = true -CPUS["UCOM4"] = true +--CPUS["AMIS2000"] = true +--CPUS["UCOM4"] = true CPUS["HMCS40"] = true +--CPUS["E0C6200"] = true -------------------------------------------------- -- specify available sound cores diff --git a/scripts/target/mess/mess.lua b/scripts/target/mess/mess.lua index c60b8f16d09..5c1c1a7e3f5 100644 --- a/scripts/target/mess/mess.lua +++ b/scripts/target/mess/mess.lua @@ -103,7 +103,7 @@ CPUS["SUPERFX"] = true CPUS["Z8"] = true CPUS["I8008"] = true CPUS["SCMP"] = true -CPUS["MN10200"] = true +--CPUS["MN10200"] = true CPUS["COSMAC"] = true CPUS["UNSP"] = true CPUS["HCD62121"] = true @@ -123,6 +123,7 @@ CPUS["ARCOMPACT"] = true CPUS["AMIS2000"] = true CPUS["UCOM4"] = true CPUS["HMCS40"] = true +CPUS["E0C6200"] = true -------------------------------------------------- -- specify available sound cores; some of these are diff --git a/src/emu/cpu/amis2000/amis2000.h b/src/emu/cpu/amis2000/amis2000.h index ba565205b21..d04127eec16 100644 --- a/src/emu/cpu/amis2000/amis2000.h +++ b/src/emu/cpu/amis2000/amis2000.h @@ -83,7 +83,7 @@ protected: virtual void execute_run(); // device_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return(spacenum == AS_PROGRAM) ? &m_program_config :((spacenum == AS_DATA) ? &m_data_config : NULL); } + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : NULL); } // device_disasm_interface overrides virtual UINT32 disasm_min_opcode_bytes() const { return 1; } diff --git a/src/emu/cpu/e0c6200/e0c6200.c b/src/emu/cpu/e0c6200/e0c6200.c new file mode 100644 index 00000000000..4674aa3d01e --- /dev/null +++ b/src/emu/cpu/e0c6200/e0c6200.c @@ -0,0 +1,104 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Seiko Epson E0C6200 CPU core and E0C62 MCU family + + References: + - 1998 MF297-06a E0C6200/E0C6200A Core CPU Manual + - 1998 MF1049-01a E0C6S46 Technical Manual + + TODO: + - niks + +*/ + +#include "e0c6200.h" +#include "debugger.h" + +#include "e0c6200op.inc" + + +const device_type EPSON_E0C6S46 = &device_creator<e0c6s46_device>; + + +// internal memory maps +static ADDRESS_MAP_START(program_1k, AS_PROGRAM, 16, e0c6200_cpu_device) + AM_RANGE(0x0000, 0x03ff) AM_ROM +ADDRESS_MAP_END + + +static ADDRESS_MAP_START(data_64x4, AS_DATA, 8, e0c6200_cpu_device) + AM_RANGE(0x00, 0x3f) AM_RAM +ADDRESS_MAP_END + + +// device definitions +e0c6s46_device::e0c6s46_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : e0c6200_cpu_device(mconfig, EPSON_E0C6S46, "E0C6S46", tag, owner, clock, 10, ADDRESS_MAP_NAME(program_1k), 6, ADDRESS_MAP_NAME(data_64x4), "e0c6s46", __FILE__) +{ } + + +// disasm +void e0c6200_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) +{ + switch (entry.index()) + { + case STATE_GENFLAGS: + break; + + default: break; + } +} + +offs_t e0c6200_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) +{ + extern CPU_DISASSEMBLE(e0c6200); + return CPU_DISASSEMBLE_NAME(e0c6200)(this, buffer, pc, oprom, opram, options); +} + + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void e0c6200_cpu_device::device_start() +{ + m_program = &space(AS_PROGRAM); + m_data = &space(AS_DATA); + m_prgmask = (1 << m_prgwidth) - 1; + m_datamask = (1 << m_datawidth) - 1; + + // zerofill + + // register for savestates + + // register state for debugger + + m_icountptr = &m_icount; +} + + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void e0c6200_cpu_device::device_reset() +{ +} + + + +//------------------------------------------------- +// execute +//------------------------------------------------- + +void e0c6200_cpu_device::execute_run() +{ + while (m_icount > 0) + { + m_icount--; + } +} diff --git a/src/emu/cpu/e0c6200/e0c6200.h b/src/emu/cpu/e0c6200/e0c6200.h new file mode 100644 index 00000000000..c4bd04b2254 --- /dev/null +++ b/src/emu/cpu/e0c6200/e0c6200.h @@ -0,0 +1,73 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Seiko Epson E0C6200 CPU core and E0C62 MCU family + +*/ + +#ifndef _E06200_H_ +#define _E06200_H_ + +#include "emu.h" + + +class e0c6200_cpu_device : public cpu_device +{ +public: + // construction/destruction + e0c6200_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source) + : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source) + , m_program_config("program", ENDIANNESS_LITTLE, 16, prgwidth, 0, program) + , m_data_config("data", ENDIANNESS_LITTLE, 8, datawidth, 0, data) + , m_prgwidth(prgwidth) + , m_datawidth(datawidth) + { } + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + + // device_execute_interface overrides + virtual UINT32 execute_min_cycles() const { return 5; } + virtual UINT32 execute_max_cycles() const { return 12; } + virtual UINT32 execute_input_lines() const { return 1; } + virtual void execute_run(); + + // device_memory_interface overrides + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : NULL); } + + // device_disasm_interface overrides + virtual UINT32 disasm_min_opcode_bytes() const { return 2; } + virtual UINT32 disasm_max_opcode_bytes() const { return 2; } + virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options); + + void state_string_export(const device_state_entry &entry, std::string &str); + + address_space_config m_program_config; + address_space_config m_data_config; + address_space *m_program; + address_space *m_data; + + int m_prgwidth; + int m_datawidth; + int m_prgmask; + int m_datamask; + + int m_icount; +}; + + +class e0c6s46_device : public e0c6200_cpu_device +{ +public: + e0c6s46_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + + + +extern const device_type EPSON_E0C6S46; + + +#endif /* _E06200_H_ */ diff --git a/src/emu/cpu/e0c6200/e0c6200d.c b/src/emu/cpu/e0c6200/e0c6200d.c new file mode 100644 index 00000000000..def8eb9bee7 --- /dev/null +++ b/src/emu/cpu/e0c6200/e0c6200d.c @@ -0,0 +1,18 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Seiko Epson E0C6200 disassembler + +*/ + +#include "emu.h" +#include "debugger.h" +#include "e0c6200.h" + + + +CPU_DISASSEMBLE(e0c6200) +{ + return 2; +} diff --git a/src/emu/cpu/e0c6200/e0c6200op.inc b/src/emu/cpu/e0c6200/e0c6200op.inc new file mode 100644 index 00000000000..946fdf6a4d5 --- /dev/null +++ b/src/emu/cpu/e0c6200/e0c6200op.inc @@ -0,0 +1 @@ +// E0C6200 opcode handlers diff --git a/src/emu/cpu/hmcs40/hmcs40.h b/src/emu/cpu/hmcs40/hmcs40.h index b5967a4d640..9e722f595a6 100644 --- a/src/emu/cpu/hmcs40/hmcs40.h +++ b/src/emu/cpu/hmcs40/hmcs40.h @@ -153,7 +153,7 @@ protected: virtual void execute_run(); // device_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return(spacenum == AS_PROGRAM) ? &m_program_config :((spacenum == AS_DATA) ? &m_data_config : NULL); } + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : NULL); } // device_disasm_interface overrides virtual UINT32 disasm_min_opcode_bytes() const { return 2; } diff --git a/src/emu/cpu/tms0980/tms0980.h b/src/emu/cpu/tms0980/tms0980.h index a291c95de92..15caeedeedb 100644 --- a/src/emu/cpu/tms0980/tms0980.h +++ b/src/emu/cpu/tms0980/tms0980.h @@ -90,7 +90,7 @@ protected: virtual void execute_run(); // device_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return(spacenum == AS_PROGRAM) ? &m_program_config :((spacenum == AS_DATA) ? &m_data_config : NULL); } + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : NULL); } // device_disasm_interface overrides virtual UINT32 disasm_min_opcode_bytes() const { return 1; } diff --git a/src/emu/cpu/tms34010/tms34010.c b/src/emu/cpu/tms34010/tms34010.c index 53882e3a59e..54084f631f8 100644 --- a/src/emu/cpu/tms34010/tms34010.c +++ b/src/emu/cpu/tms34010/tms34010.c @@ -35,7 +35,7 @@ tms340x0_device::tms340x0_device(const machine_config &mconfig, device_type type : cpu_device(mconfig, type, name, tag, owner, clock, shortname, __FILE__) , device_video_interface(mconfig, *this) , m_program_config("program", ENDIANNESS_LITTLE, 16, 32, 3) - , m_reset_deferred(FALSE) + , m_halt_on_reset(FALSE) , m_pixclock(0) , m_pixperclock(0) , m_output_int_cb(*this) @@ -648,6 +648,8 @@ void tms340x0_device::device_reset() /* HALT the CPU if requested, and remember to re-read the starting PC */ /* the first time we are run */ + m_reset_deferred = m_halt_on_reset; + if (m_reset_deferred) { io_register_w(*m_program, REG_HSTCTLH, 0x8000, 0xffff); @@ -714,11 +716,10 @@ void tms340x0_device::execute_run() m_icount = 0; return; } - /* if the CPU's reset was deferred, do it now */ if (m_reset_deferred) { - m_reset_deferred = 0; + m_reset_deferred = FALSE; m_pc = RLONG(0xffffffe0); } diff --git a/src/emu/cpu/tms34010/tms34010.h b/src/emu/cpu/tms34010/tms34010.h index b9420def0ae..e46fbe29783 100644 --- a/src/emu/cpu/tms34010/tms34010.h +++ b/src/emu/cpu/tms34010/tms34010.h @@ -240,7 +240,7 @@ public: // construction/destruction tms340x0_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname); - static void set_halt_on_reset(device_t &device, bool reset_deferred) { downcast<tms340x0_device &>(device).m_reset_deferred = reset_deferred; } + static void set_halt_on_reset(device_t &device, bool halt_on_reset) { downcast<tms340x0_device &>(device).m_halt_on_reset = halt_on_reset; } static void set_pixel_clock(device_t &device, UINT32 pixclock) { downcast<tms340x0_device &>(device).m_pixclock = pixclock; } static void set_pixels_per_clock(device_t &device, int pixperclock) { downcast<tms340x0_device &>(device).m_pixperclock = pixperclock; } static void set_scanline_ind16_callback(device_t &device, scanline_ind16_cb_delegate callback) { downcast<tms340x0_device &>(device).m_scanline_ind16_cb = callback; } @@ -327,7 +327,8 @@ protected: INT32 m_gfxcycles; UINT8 m_pixelshift; UINT8 m_is_34020; - bool m_reset_deferred; /* /HCS pin, which determines HALT state after reset */ + bool m_reset_deferred; + bool m_halt_on_reset; /* /HCS pin, which determines HALT state after reset */ UINT8 m_hblank_stable; UINT8 m_external_host_access; UINT8 m_executing; diff --git a/src/emu/cpu/ucom4/ucom4.h b/src/emu/cpu/ucom4/ucom4.h index 5c4cd18eac4..5e2bff9a62c 100644 --- a/src/emu/cpu/ucom4/ucom4.h +++ b/src/emu/cpu/ucom4/ucom4.h @@ -144,7 +144,7 @@ protected: virtual void execute_run(); // device_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return(spacenum == AS_PROGRAM) ? &m_program_config :((spacenum == AS_DATA) ? &m_data_config : NULL); } + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : NULL); } // device_disasm_interface overrides virtual UINT32 disasm_min_opcode_bytes() const { return 1; } diff --git a/src/emu/inpttype.h b/src/emu/inpttype.h index c581b4b6de2..09751221393 100644 --- a/src/emu/inpttype.h +++ b/src/emu/inpttype.h @@ -20,7 +20,7 @@ typelist.append(*global_alloc(input_type_entry(IPT_##_type, IPG_##_group, (_player == 0) ? _player : (_player) - 1, (_player == 0) ? #_type : ("P" #_player "_" #_type), _name, _seq, _decseq, _incseq))); /* These input port macros expand to a great deal of code and break compilers */ -#if defined(__GNUC__) && __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) || (__GNUC__ == 4 && __GNUC_MINOR__ == 4 && __GNUC_PATCHLEVEL__ >= 4) +#if defined(__GNUC__) && __GNUC__ == 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) || (__GNUC__ == 4 && __GNUC_MINOR__ == 4 && __GNUC_PATCHLEVEL__ >= 4) #pragma GCC optimize ("O1") #endif #ifdef _MSC_VER diff --git a/src/mame/drivers/harddriv.c b/src/mame/drivers/harddriv.c index 596a4930ea8..8df43358f10 100644 --- a/src/mame/drivers/harddriv.c +++ b/src/mame/drivers/harddriv.c @@ -5289,7 +5289,7 @@ GAME( 1990, racedrivcg4, racedriv, racedrivc_machine, racedrivc, driver_device, GAME( 1990, racedrivc2, racedriv, racedrivc1_machine, racedrivc, driver_device, 0,ROT0, "Atari Games", "Race Drivin' (compact, rev 2)", 0 ) GAME( 1990, racedrivc1, racedriv, racedrivc1_machine, racedrivc, driver_device, 0,ROT0, "Atari Games", "Race Drivin' (compact, rev 1)", 0 ) -GAMEL( 1990, racedrivpan, racedriv, racedriv_panorama_machine, racedriv_pan, driver_device, 0, ROT0, "Atari Games", "Race Drivin' Panorama (prototype, rev 2.1)", GAME_NOT_WORKING, layout_racedrivpan ) // picking roadster crashes the side monitors? +GAMEL( 1990, racedrivpan, racedriv, racedriv_panorama_machine, racedriv_pan, driver_device, 0, ROT0, "Atari Games", "Race Drivin' Panorama (prototype, rev 2.1)", 0, layout_racedrivpan ) GAME( 1991, steeltal, 0, steeltal_machine, steeltal, driver_device, 0, ROT0, "Atari Games", "Steel Talons (rev 2)", 0 ) GAME( 1991, steeltalg, steeltal, steeltal_machine, steeltal, driver_device, 0, ROT0, "Atari Games", "Steel Talons (German, rev 2)", 0 ) diff --git a/src/mame/drivers/ramtek.c b/src/mame/drivers/ramtek.c index 1acc131ed9a..db56a739839 100644 --- a/src/mame/drivers/ramtek.c +++ b/src/mame/drivers/ramtek.c @@ -9,7 +9,7 @@ Deluxe Baseball (1975/06) YES 550188 Hockey (1973/11) YES 500699 500629 Horoscope (1976) UNKNOWN - Knock Out (1974/09)? UNKNOWN + Knock Out (1974/09) YES 550300 Lie Detector (1976) UNKNOWN Unreleased Unreleased Sea Battle (1976/04) UNKNOWN Soccer (1973/11) YES 500880 500889 @@ -22,10 +22,10 @@ Game Name Clone Of --------------------------------------------------------------------------------- - Batter Up (1974/??) Deluxe Baseball (Ramtek, 1975/06) + Batter Up (1974/??) Baseball (1974/10) Crossfire (1974/01) (registered trademark?) Knock Out (Ramtek, 1974/09)? Countdown (1974/02) Wipe Out (Ramtek, 1974/01) - Elimination (1973/12?) (registered trademark?) unknown + Elimination (1973/12?) (registered trademark?) unused name for Countdown (1974/02) Flip-Out (1974/05?) Clean Sweep (Ramtek, 1974/06) Hockey (1973/??) Hockey (Ramtek, 1973/11) Hockey (Cocktail) (1973/??) Soccer (Ramtek, 1973/11) @@ -162,6 +162,13 @@ ROM_START( cleanswp ) ROM_LOAD( "501074.k3", 0x0000, 0x0020, CRC(515a34ba) SHA1(471ca9d99851591ff11a87d18b88871edd7fd268) ) // number character generation ROM_END +// Knockout - believed to be Knockout - XTAL is 10.733 MHz +/* contains 4 proms (soldered in) labelled : +5H - 55030604 +9C - 500399 +4B - 550306-02 +3B - 550306-03 +2B - 550306-01 */ ROM_START( ramtek3 ) // maybe Hockey? ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) diff --git a/src/mame/video/chihiro.c b/src/mame/video/chihiro.c index c9f11aaeb1a..3cc9175d0d7 100644 --- a/src/mame/video/chihiro.c +++ b/src/mame/video/chihiro.c @@ -494,8 +494,8 @@ int vertex_program_simulator::step() { int p1, p2; float tmp[3 * 4]; - float tmpv[4]; - float tmps[4]; + float tmpv[4] = { 0, 0, 0, 0}; + float tmps[4] = { 0, 0, 0, 0}; instruction::decoded *d; #if 0 // useful while debugging to see what instrucion is being executed diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index ec8755a8319..ff43e57257f 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -40,8 +40,8 @@ @29 HD38820A 1981, Coleco Pac-Man (ver 2) *32 HD38820A 198?, Gakken Super Cobra *38 HD38820A 1982, Entex Crazy Climber - *42 HD38820A 1982, Entex Stargate (have dump, +COP411 for audio) - *43 HD38820A 1982, Entex Turtles (have dump, +COP411 for audio) + @42 HD38820A 1982, Entex Stargate + @43 HD38820A 1982, Entex Turtles @45 HD38820A 1982, Coleco Donkey Kong @49 HD38820A 1983, Bandai Zackman @61 HD38820A 1983, Coleco Ms. Pac-Man @@ -69,6 +69,7 @@ #include "emu.h" #include "cpu/hmcs40/hmcs40.h" +#include "cpu/cop400/cop400.h" #include "sound/speaker.h" #include "hh_hmcs40_test.lh" // common test-layout - use external artwork @@ -1875,7 +1876,7 @@ WRITE16_MEMBER(egalaxn2_state::grid_w) m_inp_mux = data >> 1 & 0xf; // D1-D15: vfd matrix grid - m_grid = data >> 1; + m_grid = data >> 1 & 0x7fff; prepare_display(); } @@ -1967,7 +1968,7 @@ MACHINE_CONFIG_END NOTE!: MESS external artwork is recommended ***************************************************************************/ - +#if 0 class epacman2_state : public egalaxn2_state { public: @@ -1975,7 +1976,7 @@ public: : egalaxn2_state(mconfig, type, tag) { } }; - +#endif // handlers are identical to Galaxian 2, so we can use those // config @@ -2010,18 +2011,295 @@ static INPUT_PORTS_START( epacman2 ) PORT_CONFSETTING( 0x00, "2" ) INPUT_PORTS_END -static MACHINE_CONFIG_START( epacman2, epacman2_state ) + + + + +/*************************************************************************** + + Entex Turtles (manufactured in Japan) + * PCB label 560359 + * Hitachi QFP HD38820A43 MCU + * COP411L sub MCU, labeled COP411L-KED/N + * cyan/red/green VFD display NEC FIP15BM32T + + NOTE!: MESS external artwork is recommended + +***************************************************************************/ + +class eturtles_state : public hh_hmcs40_state +{ +public: + eturtles_state(const machine_config &mconfig, device_type type, const char *tag) + : hh_hmcs40_state(mconfig, type, tag), + m_cop_irq(0) + { } + + virtual void prepare_display(); + DECLARE_WRITE8_MEMBER(plate_w); + DECLARE_WRITE16_MEMBER(grid_w); + + UINT8 m_cop_irq; + DECLARE_WRITE_LINE_MEMBER(speaker_w); + DECLARE_WRITE8_MEMBER(cop_irq_w); + DECLARE_READ8_MEMBER(cop_latch_r); + DECLARE_READ8_MEMBER(cop_ack_r); + + void update_int(); + DECLARE_INPUT_CHANGED_MEMBER(input_changed); + +protected: + virtual void machine_start(); +}; + +// handlers (maincpu side first) + +void eturtles_state::prepare_display() +{ + UINT16 grid = BITSWAP16(m_grid,15,1,14,13,12,11,10,9,8,7,6,5,4,3,2,0); + UINT32 plate = BITSWAP32(m_plate,31,30,11,12,18,19,16,17,22,15,20,21,27,26,23,25,24,2,3,1,0,6,4,5,10,9,2,8,7,14,1,13); + display_matrix(30, 15, plate | (grid >> 5 & 8), grid); // grid 8 also forces plate 3 high +} + +WRITE8_MEMBER(eturtles_state::plate_w) +{ + m_r[offset] = data; + + // R0x-R6x: vfd matrix plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + prepare_display(); +} + +WRITE16_MEMBER(eturtles_state::grid_w) +{ + m_d = data; + + // D1-D6: input mux + UINT8 inp_mux = data >> 1 & 0x3f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int(); + } + + // D1-D15: vfd matrix grid + m_grid = data >> 1 & 0x7fff; + prepare_display(); +} + +void eturtles_state::update_int() +{ + // INT0/1 on multiplexed inputs, and from COP D0 + UINT8 inp = read_inputs(6); + set_interrupt(0, (inp & 1) | m_cop_irq); + set_interrupt(1, inp & 2); +} + + +// COP side + +WRITE_LINE_MEMBER(eturtles_state::speaker_w) +{ + // SK: speaker out + m_speaker->level_w(!state); +} + +WRITE8_MEMBER(eturtles_state::cop_irq_w) +{ + // D0: maincpu INT0 (active low) + m_cop_irq = ~data & 1; + update_int(); +} + +READ8_MEMBER(eturtles_state::cop_latch_r) +{ + // L0-L3: soundlatch from maincpu R0x + return m_r[0]; +} + +READ8_MEMBER(eturtles_state::cop_ack_r) +{ + // G0: ack from maincpu D0 + return m_d & 1; +} + + +// config + +static INPUT_PORTS_START( eturtles ) + PORT_START("IN.0") // D1 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + + PORT_START("IN.1") // D2 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + + PORT_START("IN.2") // D3 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + + PORT_START("IN.3") // D4 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + + PORT_START("IN.4") // D5 INT0/1 + PORT_CONFNAME( 0x01, 0x01, "Skill Level" ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + + PORT_START("IN.5") // D6 INT0/1 + PORT_CONFNAME( 0x03, 0x00, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + PORT_CONFSETTING( 0x02, "0 (Demo)" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) +INPUT_PORTS_END + +INPUT_CHANGED_MEMBER(eturtles_state::input_changed) +{ + update_int(); +} + + +void eturtles_state::machine_start() +{ + hh_hmcs40_state::machine_start(); + + // register for savestates + save_item(NAME(m_cop_irq)); +} + +static MACHINE_CONFIG_START( eturtles, eturtles_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", HD38820, 400000) // approximation - MCFG_HMCS40_READ_R_CB(0, READ8(egalaxn2_state, input_r)) - MCFG_HMCS40_WRITE_R_CB(1, WRITE8(egalaxn2_state, plate_w)) - MCFG_HMCS40_WRITE_R_CB(2, WRITE8(egalaxn2_state, plate_w)) - MCFG_HMCS40_WRITE_R_CB(3, WRITE8(egalaxn2_state, plate_w)) - MCFG_HMCS40_WRITE_R_CB(4, WRITE8(egalaxn2_state, plate_w)) - MCFG_HMCS40_WRITE_R_CB(5, WRITE8(egalaxn2_state, plate_w)) - MCFG_HMCS40_WRITE_R_CB(6, WRITE8(egalaxn2_state, plate_w)) - MCFG_HMCS40_WRITE_D_CB(WRITE16(egalaxn2_state, grid_w)) + MCFG_HMCS40_WRITE_R_CB(0, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(1, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(2, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(3, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(4, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(5, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(6, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_D_CB(WRITE16(eturtles_state, grid_w)) + + MCFG_CPU_ADD("audiocpu", COP411, 215000) // approximation + MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, COP400_MICROBUS_DISABLED) // guessed + MCFG_COP400_WRITE_SK_CB(WRITELINE(eturtles_state, speaker_w)) + MCFG_COP400_WRITE_D_CB(WRITE8(eturtles_state, cop_irq_w)) + MCFG_COP400_READ_L_CB(READ8(eturtles_state, cop_latch_r)) + MCFG_COP400_READ_G_CB(READ8(eturtles_state, cop_ack_r)) + + MCFG_QUANTUM_PERFECT_CPU("maincpu") + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_hh_hmcs40_test) + + /* no video! */ + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + + +/*************************************************************************** + + Entex Stargate (manufactured in Japan) + * PCB label 5603521/31 + * Hitachi QFP HD38820A42 MCU + * COP411L sub MCU, labeled ~/B8236 COP411L-KEC/N + * cyan/red/green VFD display NEC FIP15AM32T (EL628-003) no. 2-421, with partial color overlay + + NOTE!: MESS external artwork is recommended + +***************************************************************************/ + +class estargte_state : public eturtles_state +{ +public: + estargte_state(const machine_config &mconfig, device_type type, const char *tag) + : eturtles_state(mconfig, type, tag) + { } + + virtual void prepare_display(); + DECLARE_READ8_MEMBER(cop_data_r); +}; + +// handlers (most of it is handled in eturtles_state above) + +void estargte_state::prepare_display() +{ + UINT16 grid = BITSWAP16(m_grid,15,0,14,13,12,11,10,9,8,7,6,5,4,3,2,1); + UINT32 plate = BITSWAP32(m_plate,31,30,29,15,17,19,21,23,25,27,26,24,3,22,20,18,16,14,12,10,8,6,4,2,0,1,3,5,7,9,11,13); + display_matrix(29, 14, plate, grid); +} + +READ8_MEMBER(estargte_state::cop_data_r) +{ + // L0-L3: soundlatch from maincpu R0x + // L7: ack from maincpu D0 + return m_r[0] | (m_d << 7 & 0x80); +} + + +// config + +static INPUT_PORTS_START( estargte ) + PORT_START("IN.0") // D1 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) PORT_NAME("Inviso") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) PORT_NAME("Smart Bomb") + + PORT_START("IN.1") // D2 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) PORT_NAME("Fire") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) PORT_NAME("Change Direction") + + PORT_START("IN.2") // D3 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + + PORT_START("IN.3") // D4 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) PORT_NAME("Thrust") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // D5 INT0/1 + PORT_CONFNAME( 0x01, 0x00, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + PORT_CONFSETTING( 0x00, "0 (Demo)" ) // yes, same value as 1-player, hold the Inviso button at boot to enter demo mode + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_CONFNAME( 0x02, 0x02, "Skill Level" ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, NULL) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + + PORT_START("IN.5") // D6 INT0/1 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +static MACHINE_CONFIG_START( estargte, estargte_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", HD38820, 400000) // approximation + MCFG_HMCS40_WRITE_R_CB(0, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(1, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(2, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(3, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(4, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(5, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_R_CB(6, WRITE8(eturtles_state, plate_w)) + MCFG_HMCS40_WRITE_D_CB(WRITE16(eturtles_state, grid_w)) + + MCFG_CPU_ADD("audiocpu", COP411, 190000) // approximation + MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, COP400_MICROBUS_DISABLED) // guessed + MCFG_COP400_WRITE_SK_CB(WRITELINE(eturtles_state, speaker_w)) + MCFG_COP400_WRITE_D_CB(WRITE8(eturtles_state, cop_irq_w)) + MCFG_COP400_READ_L_CB(READ8(estargte_state, cop_data_r)) + + MCFG_QUANTUM_PERFECT_CPU("maincpu") MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_hh_hmcs40_test) @@ -3104,6 +3382,26 @@ ROM_START( epacman2 ) ROM_END +ROM_START( estargte ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a42", 0x0000, 0x1000, CRC(5f6d55a6) SHA1(0da32149790fa5f16097338fc80536b462169e0c) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 0x0200, "audiocpu", 0 ) + ROM_LOAD( "cop411l-kec_n", 0x0000, 0x0200, CRC(fbd3c2d3) SHA1(65b8b24d38678c3fa970bfd639e9449a75a28927) ) +ROM_END + + +ROM_START( eturtles ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a43", 0x0000, 0x1000, CRC(446aa4e2) SHA1(d1c0fb14ea7081def53b1174964b39eed1e5d5e6) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 0x0200, "audiocpu", 0 ) + ROM_LOAD( "cop411l-ked_n", 0x0000, 0x0200, CRC(503d26e9) SHA1(a53d24d62195bfbceff2e4a43199846e0950aef6) ) +ROM_END + + ROM_START( ghalien ) ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "hd38800a04", 0x0000, 0x1000, CRC(019c3328) SHA1(9f1029c5c479f78350952c4f18747341ba5ea7a0) ) @@ -3180,7 +3478,9 @@ CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, driver_device, 0, "Colec CONS( 1983, cmspacmn, 0, 0, cmspacmn, cmspacmn, driver_device, 0, "Coleco", "Ms. Pac-Man (Coleco)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, driver_device, 0, "Entex", "Galaxian 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) -CONS( 1981, epacman2, 0, 0, epacman2, epacman2, driver_device, 0, "Entex", "Pac Man 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) +CONS( 1981, epacman2, 0, 0, egalaxn2, epacman2, driver_device, 0, "Entex", "Pac Man 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) +CONS( 1982, estargte, 0, 0, estargte, estargte, driver_device, 0, "Entex", "Stargate (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) +CONS( 1982, eturtles, 0, 0, eturtles, eturtles, driver_device, 0, "Entex", "Turtles (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1980, ghalien, 0, 0, ghalien, ghalien, driver_device, 0, "Gakken", "Heiankyo Alien (Gakken)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1982, gckong, 0, 0, gckong, gckong, driver_device, 0, "Gakken", "Crazy Kong (Gakken)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 0bf1bfcebc4..a966d3f93c8 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -24,6 +24,7 @@ *MP1296 TMS1100? 1982, Entex Black Knight *MP1312 TMS1100 198?, Tandy/RadioShack Science Fair Microcomputer Trainer @MP1525 TMS1170 1980, Coleco Head to Head Baseball + *MP1604 ? 1981, Hanzawa Twinvader III/Tandy Cosmic Fire Away 3000 @MP2105 TMS1370 1979, Gakken Poker *MP2139 TMS1370? 1982, Gakken Galaxy Invader 1000 *MP2788 ? 1980, Bandai Flight Time (? note: VFD-capable) @@ -31,6 +32,7 @@ @MP3226 TMS1000 1978, Milton Bradley Simon (model 4850) @MP3301A TMS1000 1979, Milton Bradley Big Trak *MP3320A TMS1000 1979, Coleco Head to Head Basketball + *M32001 TMS1000 1981, Coleco Quiz Wiz Challenger (note: MP3398, MP3399, M3200x?) MP3403 TMS1100 1978, Marx Electronic Bowling -> elecbowl.c @MP3404 TMS1100 1978, Parker Brothers Merlin @MP3405 TMS1100 1979, Coleco Amaze-A-Tron @@ -45,10 +47,12 @@ @MP3476 TMS1100 1979, Milton Bradley Super Simon MP3479 TMS1100 1980, MicroVision cartridge: Baseball MP3481 TMS1100 1979, MicroVision cartridge: Connect Four + *MP3491 TMS1100 1980, Mattel Horserace Analyzer MP3496 TMS1100 1980, MicroVision cartridge: Sea Duel - M34009 TMS1100 1981, MicroVision cartridge: Alien Raiders (note: MP3498, MP3499, M34000, ..) + M34009 TMS1100 1981, MicroVision cartridge: Alien Raiders (note: MP3498, MP3499, M3400x..) M34017 TMS1100 1981, MicroVision cartridge: Cosmic Hunter M34047 TMS1100 1982, MicroVision cartridge: Super Blockbuster + *M34078A TMS1100 1983, Milton Bradley Arcade Mania @MP6100A TMS0980 1979, Ideal Electronic Detective @MP6101B TMS0980 1979, Parker Brothers Stop Thief *MP6361 ? 1983, Defender Strikes (? note: VFD-capable) @@ -894,7 +898,7 @@ MACHINE_CONFIG_END This is a head to head electronic tabletop LED-display sports console. One cartridge(Football) was included with the console, the other three were - sold separately. Gameplay has emphasis on strategy, read the official manual + sold in a pack. Gameplay has emphasis on strategy, read the official manual on how to play. Remember that you can rotate the view in MESS: rotate left for Home(P1) orientation, rotate right for Visitor(P2) orientation. diff --git a/src/mess/mess.lst b/src/mess/mess.lst index f7c729c90af..7f0831a93db 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2203,6 +2203,8 @@ cpacmanr1 // Coleco (rev 1) cmspacmn // Coleco egalaxn2 // Entex epacman2 // Entex +estargte // Entex +eturtles // Entex ghalien // Gakken gckong // Gakken gdigdug // Gakken |