From a081b6f24a4f9b1f877348532444d8fec73c4ecf Mon Sep 17 00:00:00 2001 From: David Haywood Date: Wed, 19 Jul 2017 18:28:29 +0100 Subject: [PATCH] gaelco / ds5002fp changes: - made ds5002fp store internal ram and sfr registers to nvram as they're battery backed - this includes the 'configuration' details which are actually programmable, so don't belong in the 'MACHINE_CONFIG' section but rather as part of the default NVRAM - as the exact format of the NVRAM storage is not known, and as not to break compatibility with the 'wrally' set Gaelco offer these bytes are now configured in the ROM LOADING like default NVRAM. Slightly awkward, but probably the best way. - made the SRAM (external to DS5002FP, but still powered by the same battery) also save content, some games actually use it to store scores etc. as well as the game code. - cleaned up the Touch and Go Dallas dump, and added some preconfigured internal RAM so that it actually loads the score data from the SRAM properly - prepared all other drivers for the adding of the SRAM dumps, removing old 'never going to work' simulation code in the process. To do this a wrapper / interface device for the Gaelco Dallas + SRAM box was created. out of whatsnew Alligator Hunt was dumped and works, but not yet added, want to verify on a 2nd PCB first as the process does corrupt some bytes and a couple had to be handfixed, so the only way to know for sure is multiple dumps. --- scripts/target/mame/arcade.lua | 2 + src/devices/cpu/mcs51/mcs51.cpp | 84 ++++++++---- src/devices/cpu/mcs51/mcs51.h | 29 +++-- src/mame/drivers/gaelco2.cpp | 184 ++++++++++++--------------- src/mame/drivers/glass.cpp | 130 ++++--------------- src/mame/drivers/targeth.cpp | 25 +++- src/mame/drivers/thoop2.cpp | 55 ++------ src/mame/drivers/wrally.cpp | 62 +++++---- src/mame/includes/gaelco2.h | 14 +- src/mame/includes/glass.h | 7 +- src/mame/includes/thoop2.h | 11 +- src/mame/machine/gaelco_ds5002fp.cpp | 100 +++++++++++++++ src/mame/machine/gaelco_ds5002fp.h | 56 ++++++++ 13 files changed, 417 insertions(+), 342 deletions(-) create mode 100644 src/mame/machine/gaelco_ds5002fp.cpp create mode 100644 src/mame/machine/gaelco_ds5002fp.h diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index daf1ededa1f..712bdb4a618 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -1848,6 +1848,8 @@ files { MAME_DIR .. "src/mame/drivers/xorworld.cpp", MAME_DIR .. "src/mame/includes/xorworld.h", MAME_DIR .. "src/mame/video/xorworld.cpp", + MAME_DIR .. "src/mame/machine/gaelco_ds5002fp.cpp", + MAME_DIR .. "src/mame/machine/gaelco_ds5002fp.h", } createMAMEProjects(_target, _subtarget, "gameplan") diff --git a/src/devices/cpu/mcs51/mcs51.cpp b/src/devices/cpu/mcs51/mcs51.cpp index 46087800aab..917fc7a7786 100644 --- a/src/devices/cpu/mcs51/mcs51.cpp +++ b/src/devices/cpu/mcs51/mcs51.cpp @@ -250,16 +250,17 @@ static ADDRESS_MAP_START(program_13bit, AS_PROGRAM, 8, mcs51_cpu_device) ADDRESS_MAP_END static ADDRESS_MAP_START(data_7bit, AS_DATA, 8, mcs51_cpu_device) - AM_RANGE(0x0000, 0x007f) AM_RAM - AM_RANGE(0x0100, 0x01ff) AM_RAM /* SFR */ + AM_RANGE(0x0000, 0x007f) AM_RAM AM_SHARE("scratchpad") + AM_RANGE(0x0100, 0x01ff) AM_RAM AM_SHARE("sfr_ram") /* SFR */ ADDRESS_MAP_END static ADDRESS_MAP_START(data_8bit, AS_DATA, 8, mcs51_cpu_device) - AM_RANGE(0x0000, 0x00ff) AM_RAM - AM_RANGE(0x0100, 0x01ff) AM_RAM /* SFR */ + AM_RANGE(0x0000, 0x00ff) AM_RAM AM_SHARE("scratchpad") + AM_RANGE(0x0100, 0x01ff) AM_RAM AM_SHARE("sfr_ram") /* SFR */ ADDRESS_MAP_END + mcs51_cpu_device::mcs51_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int program_width, int data_width, uint8_t features) : cpu_device(mconfig, type, tag, owner, clock) , m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0, @@ -271,6 +272,8 @@ mcs51_cpu_device::mcs51_cpu_device(const machine_config &mconfig, device_type ty , m_features(features) , m_ram_mask( (data_width == 8) ? 0xFF : 0x7F ) , m_num_interrupts(5) + , m_sfr_ram(*this, "sfr_ram") + , m_scratchpad(*this, "scratchpad") , m_serial_tx_cb(*this) , m_serial_rx_cb(*this) , m_rtemp(0) @@ -369,8 +372,11 @@ at89c4051_device::at89c4051_device(const machine_config &mconfig, const char *ta { } +/* program width field is set to 0 because technically the SRAM isn't internal */ ds5002fp_device::ds5002fp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mcs51_cpu_device(mconfig, DS5002FP, tag, owner, clock, 12, 7, FEATURE_DS5002FP | FEATURE_CMOS) + : mcs51_cpu_device(mconfig, DS5002FP, tag, owner, clock, 0, 7, FEATURE_DS5002FP | FEATURE_CMOS) + , device_nvram_interface(mconfig, *this) + , m_region(*this, "internal") { } @@ -463,7 +469,7 @@ void mcs51_cpu_device::iram_iwrite(offs_t a, uint8_t d) { if (a <= m_ram_mask) m #define B SFR_A(ADDR_B) #define SBUF SFR_A(ADDR_SBUF) -#define R_REG(r) m_internal_ram[(r) | (PSW & 0x18)] +#define R_REG(r) m_scratchpad[(r) | (PSW & 0x18)] #define DPTR ((DPH<<8) | DPL) /* 8052 Only registers */ @@ -522,7 +528,7 @@ void mcs51_cpu_device::iram_iwrite(offs_t a, uint8_t d) { if (a <= m_ram_mask) m #define SET_SBUF(v) SET_SFR_A(ADDR_SBUF, v) /* No actions triggered on write */ -#define SET_REG(r, v) do { m_internal_ram[(r) | (PSW & 0x18)] = (v); } while (0) +#define SET_REG(r, v) do { m_scratchpad[(r) | (PSW & 0x18)] = (v); } while (0) #define SET_DPTR(n) do { DPH = ((n) >> 8) & 0xff; DPL = (n) & 0xff; } while (0) @@ -740,12 +746,6 @@ uint8_t mcs51_cpu_device::r_acc() { return SFR_A(ADDR_ACC); } uint8_t mcs51_cpu_device::r_psw() { return SFR_A(ADDR_PSW); } -void mcs51_cpu_device::update_ptrs() -{ - m_internal_ram = (uint8_t *)m_data->get_write_ptr(0x00); - m_sfr_ram = (uint8_t *)m_data->get_write_ptr(0x100); -} - /* Generate an external ram address for read/writing using indirect addressing mode */ @@ -1958,8 +1958,6 @@ void mcs51_cpu_device::execute_run() { uint8_t op; - update_ptrs(); - /* external interrupts may have been set since we last checked */ m_inst_cycles = 0; check_irqs(); @@ -2107,9 +2105,6 @@ void mcs51_cpu_device::device_start() m_data = &space(AS_DATA); m_io = &space(AS_IO); - /* ensure these pointers are set before get_info is called */ - update_ptrs(); - m_serial_rx_cb.resolve_safe(0); m_serial_tx_cb.resolve_safe(); @@ -2232,8 +2227,6 @@ void mcs51_cpu_device::state_string_export(const device_state_entry &entry, std: /* Reset registers to the initial values */ void mcs51_cpu_device::device_reset() { - update_ptrs(); - m_last_line_state = 0; m_t0_cnt = 0; m_t1_cnt = 0; @@ -2292,11 +2285,11 @@ void mcs51_cpu_device::device_reset() { // set initial values (some of them are set using the bootstrap loader) PCON = 0; - MCON = m_ds5002fp.mcon & 0xfb; - RPCTL = m_ds5002fp.rpctl & 0x01; + MCON = m_sfr_ram[ADDR_MCON-0x80]; + RPCTL = m_sfr_ram[ADDR_RPCTL-0x80]; RPS = 0; RNR = 0; - CRCR = m_ds5002fp.crc & 0xf0; + CRCR = m_sfr_ram[ADDR_CRCR-0x80]; CRCL = 0; CRCH = 0; TA = 0; @@ -2469,6 +2462,51 @@ uint8_t ds5002fp_device::sfr_read(size_t offset) return m_data->read_byte((size_t) offset | 0x100); } +/* +Documentation states that having the battery connected "maintains the internal scratchpad RAM" and "certain SFRs" +(although it isn't clear exactly which SFRs except for those explicitly mentioned) +*/ + +void ds5002fp_device::nvram_default() +{ + memset( m_scratchpad, 0, 0x80 ); + memset( m_sfr_ram, 0, 0x80 ); + + int expected_bytes = 0x80 + 0x80; + + if (!m_region.found()) + { + logerror( "ds5002fp_device(%s) region not found\n", tag() ); + } + else if( m_region->bytes() != expected_bytes ) + { + logerror( "ds5002fp_device(%s) region length 0x%x expected 0x%x\n", tag(), m_region->bytes(), expected_bytes ); + } + else + { + uint8_t *region = m_region->base(); + + memcpy( m_scratchpad, region, 0x80 ); region += 0x80; + memcpy( m_sfr_ram, region, 0x80 ); region += 0x80; + /* does anything else need storing? any registers that aren't in sfr ram? + It isn't clear if the various initial MCON registers etc. are just stored in sfr ram + or if the DS5002FP stores them elsewhere and the bootstrap copies them */ + } +} + +void ds5002fp_device::nvram_read( emu_file &file ) +{ + file.read( m_scratchpad, 0x80 ); + file.read( m_sfr_ram, 0x80 ); +} + +void ds5002fp_device::nvram_write( emu_file &file ) +{ + file.write( m_scratchpad, 0x80 ); + file.write( m_sfr_ram, 0x80 ); +} + + offs_t mcs51_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) { diff --git a/src/devices/cpu/mcs51/mcs51.h b/src/devices/cpu/mcs51/mcs51.h index 9651b7e77fd..13f19d3fd28 100644 --- a/src/devices/cpu/mcs51/mcs51.h +++ b/src/devices/cpu/mcs51/mcs51.h @@ -159,8 +159,8 @@ protected: } m_uart; /* internal uart */ /* Internal Ram */ - uint8_t *m_internal_ram; /* 128 RAM (8031/51) + 128 RAM in second bank (8032/52) */ - uint8_t *m_sfr_ram; /* 128 SFR - these are in 0x80 - 0xFF */ + required_shared_ptr m_sfr_ram; /* 128 SFR - these are in 0x80 - 0xFF */ + required_shared_ptr m_scratchpad; /* 128 RAM (8031/51) + 128 RAM in second bank (8032/52) */ /* SFR Callbacks */ virtual void sfr_write(size_t offset, uint8_t data); @@ -197,7 +197,6 @@ protected: void clear_current_irq(); uint8_t r_acc(); uint8_t r_psw(); - void update_ptrs(); offs_t external_ram_iaddr(offs_t offset, offs_t mem_mask); uint8_t iram_read(size_t offset); void iram_write(size_t offset, uint8_t data); @@ -496,12 +495,18 @@ public: * Internal ram 128k and security features */ -#define MCFG_DS5002FP_CONFIG(_mcon, _rpctl, _crc) \ - ds5002fp_device::set_mcon(*device, _mcon); \ - ds5002fp_device::set_rpctl(*device, _rpctl); \ - ds5002fp_device::set_crc(*device, _crc); +/* these allow the default state of RAM to be set from a region */ +#define DS5002FP_SET_MON( _mcon) \ + ROM_FILL( 0xc6, 1, _mcon) -class ds5002fp_device : public mcs51_cpu_device +#define DS5002FP_SET_RPCTL( _rpctl) \ + ROM_FILL( 0xd8, 1, _rpctl) + +#define DS5002FP_SET_CRCR( _crcr) \ + ROM_FILL( 0xc1, 1, _crcr) + + +class ds5002fp_device : public mcs51_cpu_device, public device_nvram_interface { public: // construction/destruction @@ -511,12 +516,20 @@ public: static void set_rpctl(device_t &device, uint8_t rpctl) { downcast(device).m_ds5002fp.rpctl = rpctl; } static void set_crc(device_t &device, uint8_t crc) { downcast(device).m_ds5002fp.crc = crc; } + // device_nvram_interface overrides + virtual void nvram_default() override; + virtual void nvram_read( emu_file &file ) override; + virtual void nvram_write( emu_file &file ) override; + protected: virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; /* SFR Callbacks */ virtual void sfr_write(size_t offset, uint8_t data) override; virtual uint8_t sfr_read(size_t offset) override; + +private: + optional_memory_region m_region; }; diff --git a/src/mame/drivers/gaelco2.cpp b/src/mame/drivers/gaelco2.cpp index 5b5168b77d7..f028803636b 100644 --- a/src/mame/drivers/gaelco2.cpp +++ b/src/mame/drivers/gaelco2.cpp @@ -32,7 +32,7 @@ #include "machine/eepromser.h" #include "sound/gaelco.h" -#include "cpu/mcs51/mcs51.h" +#include "machine/gaelco_ds5002fp.h" #include "rendlay.h" #include "screen.h" @@ -63,41 +63,6 @@ GFXDECODEINFO(0x0200000, 128) TILELAYOUT16(0x0400000) GFXDECODEINFO(0x0400000, 128) -/*============================================================================ - DS5002FP - ============================================================================*/ - -READ8_MEMBER(gaelco2_state::dallas_share_r) -{ - uint8_t *shareram = (uint8_t *)m_shareram.target(); - return shareram[BYTE_XOR_BE(offset)]; -} - -WRITE8_MEMBER(gaelco2_state::dallas_share_w) -{ - uint8_t *shareram = (uint8_t *)m_shareram.target(); - shareram[BYTE_XOR_BE(offset)] = data; -} - -READ8_MEMBER(gaelco2_state::dallas_ram_r) -{ - return m_mcu_ram[offset]; -} - -WRITE8_MEMBER(gaelco2_state::dallas_ram_w) -{ - m_mcu_ram[offset] = data; -} - -static ADDRESS_MAP_START( dallas_rom, AS_PROGRAM, 8, gaelco2_state ) - AM_RANGE(0x0000, 0x7fff) AM_READWRITE(dallas_ram_r, dallas_ram_w) /* Code in NVRAM */ -ADDRESS_MAP_END - -static ADDRESS_MAP_START( dallas_ram, AS_IO, 8, gaelco2_state ) - AM_RANGE(0x08000, 0x0ffff) AM_READWRITE(dallas_share_r, dallas_share_w) /* confirmed that 0x8000 - 0xffff is a window into 68k shared RAM */ - AM_RANGE(0x10000, 0x17fff) AM_READWRITE(dallas_ram_r, dallas_ram_w) /* yes, the games access it as data and use it for temporary storage!! */ -ADDRESS_MAP_END - /*============================================================================ MANIAC SQUARE (FINAL) ============================================================================*/ @@ -113,8 +78,8 @@ static ADDRESS_MAP_START( maniacsq_map, AS_PROGRAM, 16, gaelco2_state ) AM_RANGE(0x30004a, 0x30004b) AM_WRITENOP /* Sound muting? */ AM_RANGE(0x320000, 0x320001) AM_READ_PORT("COIN") /* COINSW + SERVICESW */ AM_RANGE(0x500000, 0x500001) AM_WRITE(gaelco2_coin_w) /* Coin lockout + counters */ - AM_RANGE(0xfe0000, 0xfebfff) AM_RAM /* Work RAM */ - AM_RANGE(0xfec000, 0xfeffff) AM_RAM AM_SHARE("shareram") /* Work RAM */ + AM_RANGE(0xfe0000, 0xfe7fff) AM_RAM /* Work RAM */ + AM_RANGE(0xfe8000, 0xfeffff) AM_RAM AM_SHARE("shareram") /* Work RAM */ ADDRESS_MAP_END @@ -229,6 +194,9 @@ static MACHINE_CONFIG_START( maniacsq ) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( maniacsq_d5002fp, maniacsq ) + MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL_24MHz / 2) /* ? */ +MACHINE_CONFIG_END ROM_START( maniacsq ) ROM_REGION( 0x040000, "maincpu", 0 ) /* 68000 code */ @@ -250,9 +218,14 @@ ROM_START( maniacsqa ) // REF 940411 ROM_LOAD16_BYTE( "MS_U_45.U45", 0x000000, 0x020000, CRC(98f4fdc0) SHA1(1e4d5b0a8a432de885c96319c21280d304b38db0) ) ROM_LOAD16_BYTE( "MS_U_44.U44", 0x000001, 0x020000, CRC(1785dd41) SHA1(5c6a65c00248971ce54c8185858393f2c52cc583) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "ms_ds5002fp.bin", 0x00000, 0x8000, NO_DUMP ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + //DS5002FP_SET_MON( x ) + //DS5002FP_SET_RPCTL( x ) + //DS5002FP_SET_CRCR( x ) + ROM_REGION( 0x0280000, "gfx1", 0 ) /* GFX + Sound */ // all 4 roms on a sub-board, no IC positions marked ROM_LOAD( "MS1", 0x0000000, 0x0080000, CRC(d8551b2f) SHA1(78b5b07112bd89fed18055180e7cc64f8e0bd0b1) ) /* GFX + Sound */ @@ -487,7 +460,8 @@ static ADDRESS_MAP_START( alighunt_map, AS_PROGRAM, 16, gaelco2_state ) AM_RANGE(0x320000, 0x320001) AM_READ_PORT("COIN") /* COINSW + SERVICESW */ AM_RANGE(0x500000, 0x500001) AM_WRITE(gaelco2_coin_w) /* Coin lockout + counters */ AM_RANGE(0x500006, 0x500007) AM_WRITENOP /* ??? */ - AM_RANGE(0xfe0000, 0xfeffff) AM_RAM /* Work RAM */ + AM_RANGE(0xfe0000, 0xfe7fff) AM_RAM /* Work RAM */ + AM_RANGE(0xfe8000, 0xfeffff) AM_RAM AM_SHARE("shareram") /* Work RAM (shared with D5002FP) */ ADDRESS_MAP_END @@ -601,6 +575,9 @@ static MACHINE_CONFIG_START( alighunt ) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( alighunt_d5002fp, alighunt ) + MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL_24MHz / 2) /* ? */ +MACHINE_CONFIG_END /* PCB Layout: @@ -643,8 +620,14 @@ ROM_START( aligator ) ROM_LOAD16_BYTE( "u45", 0x000000, 0x080000, CRC(61c47c56) SHA1(6dd3fc6fdab252e0fb43c0793eef70203c888d7f) ) ROM_LOAD16_BYTE( "u44", 0x000001, 0x080000, CRC(f0be007a) SHA1(2112b2e5f020028b50c8f2c72c83c9fee7a78224) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ - ROM_LOAD( "aligator_ds5002fp.bin", 0x00000, 0x8000, NO_DUMP ) + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ + ROM_LOAD( "touchgo_ds5002fp.bin", 0x00000, 0x8000, NO_DUMP ) + + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + /* these are the default states stored in NVRAM */ + DS5002FP_SET_MON( 0x19 ) + DS5002FP_SET_RPCTL( 0x00 ) + DS5002FP_SET_CRCR( 0x80 ) ROM_REGION( 0x1400000, "gfx1", 0 ) /* GFX + Sound */ /* 0x0000000-0x0ffffff filled in in the DRIVER_INIT */ @@ -849,12 +832,7 @@ static MACHINE_CONFIG_START( touchgo ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( touchgo_d5002fp, touchgo ) - MCFG_CPU_ADD("mcu", DS5002FP, XTAL_24MHz/2) /* ? */ - MCFG_DS5002FP_CONFIG( 0x19, 0x00, 0x80 ) /* default config verified on chip */ - MCFG_CPU_PROGRAM_MAP(dallas_rom) - MCFG_CPU_IO_MAP(dallas_ram) - - MCFG_QUANTUM_PERFECT_CPU("mcu") + MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL_24MHz / 2) /* ? */ MACHINE_CONFIG_END /* @@ -905,8 +883,16 @@ ROM_START( touchgo ) /* REF: 950906 */ ROM_LOAD16_BYTE( "tg_56", 0x000000, 0x080000, CRC(8ab065f3) SHA1(7664abd7e5f66ffca4a2865bba56ac36bd04f4e9) ) ROM_LOAD16_BYTE( "tg_57", 0x000001, 0x080000, CRC(0dfd3f65) SHA1(afb2ce8988c84f211ac71b84928ce4c421de7fee) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ - ROM_LOAD( "touchgo_ds5002fp.bin", 0x00000, 0x8000, BAD_DUMP CRC(e977d2db) SHA1(d6a4ef74eb776d9e898f25a70f0302f3199b4fa1) ) /* marked as BAD_DUMP until a 2nd board is used to verify */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ + ROM_LOAD( "touchgo_ds5002fp.bin", 0x00000, 0x8000, BAD_DUMP CRC(a497e1af) SHA1(68ee1f87631183541adadf927fb18ed4422d5bb6) ) /* marked as BAD_DUMP until a 2nd board is used to verify */ + + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + /* touchgo requires some valids in scratchram to be initialized or it won't copy the high score table when it boots */ + ROM_LOAD( "touchgo_scratch", 0x00, 0x80, CRC(f9ca54ff) SHA1(416f7bd89442dc1f736efe457b0f9a7f4f9f0bd5) ) + /* these are the default states stored in NVRAM */ + DS5002FP_SET_MON( 0x19 ) + DS5002FP_SET_RPCTL( 0x00 ) + DS5002FP_SET_CRCR( 0x80 ) ROM_REGION( 0x1400000, "gfx1", 0 ) /* GFX + Sound */ /* 0x0000000-0x0ffffff filled in in the DRIVER_INIT */ @@ -924,9 +910,17 @@ ROM_START( touchgon ) /* REF 950906, no plug-in daughterboard, Non North America ROM_LOAD16_BYTE( "tg56.bin", 0x000000, 0x080000, CRC(fd3b4642) SHA1(3cab42aecad5ee641711763c6047b56784c2bcf3) ) ROM_LOAD16_BYTE( "tg57.bin", 0x000001, 0x080000, CRC(ee891835) SHA1(9f8c60e5e3696b70f756c3521e10313005053cc7) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "touchgo_ds5002fp.bin", 0x00000, 0x8000, BAD_DUMP CRC(e977d2db) SHA1(d6a4ef74eb776d9e898f25a70f0302f3199b4fa1) ) /* marked as BAD_DUMP until a 2nd board is used to verify */ + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + /* touchgo requires some valids in scratchram to be initialized or it won't copy the high score table when it boots */ + ROM_LOAD( "touchgo_scratch", 0x00, 0x80, CRC(f9ca54ff) SHA1(416f7bd89442dc1f736efe457b0f9a7f4f9f0bd5) ) + /* these are the default states stored in NVRAM */ + DS5002FP_SET_MON( 0x19 ) + DS5002FP_SET_RPCTL( 0x00 ) + DS5002FP_SET_CRCR( 0x80 ) + ROM_REGION( 0x1400000, "gfx1", 0 ) /* GFX + Sound */ /* 0x0000000-0x0ffffff filled in in the DRIVER_INIT */ ROM_LOAD( "ic69", 0x1000000, 0x0200000, CRC(18bb12d4) SHA1(ee6e7a63b86c56d71e62db0ae5892ab3ab94b0a0) ) /* GFX only */ @@ -943,9 +937,17 @@ ROM_START( touchgoe ) /* REF: 950510-1 */ ROM_LOAD16_BYTE( "tg56", 0x000000, 0x080000, CRC(6d0f5c65) SHA1(00db7a7da3ec1676169aa78fe4f08a7746c3accf) ) ROM_LOAD16_BYTE( "tg57", 0x000001, 0x080000, CRC(845787b5) SHA1(27c9910cd9f38328326ecb5cd093dfeb6d4f6244) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "touchgo_ds5002fp.bin", 0x00000, 0x8000, BAD_DUMP CRC(e977d2db) SHA1(d6a4ef74eb776d9e898f25a70f0302f3199b4fa1) ) /* marked as BAD_DUMP until a 2nd board is used to verify */ + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + /* touchgo requires some valids in scratchram to be initialized or it won't copy the high score table when it boots */ + ROM_LOAD( "touchgo_scratch", 0x00, 0x80, CRC(f9ca54ff) SHA1(416f7bd89442dc1f736efe457b0f9a7f4f9f0bd5) ) + /* these are the default states stored in NVRAM */ + DS5002FP_SET_MON( 0x19 ) + DS5002FP_SET_RPCTL( 0x00 ) + DS5002FP_SET_CRCR( 0x80 ) + ROM_REGION( 0x1400000, "gfx1", 0 ) /* GFX + Sound */ /* 0x0000000-0x0ffffff filled in in the DRIVER_INIT */ ROM_LOAD( "ic69", 0x1000000, 0x0200000, CRC(18bb12d4) SHA1(ee6e7a63b86c56d71e62db0ae5892ab3ab94b0a0) ) /* GFX only */ @@ -1272,12 +1274,7 @@ static MACHINE_CONFIG_START( wrally2 ) MCFG_CPU_PROGRAM_MAP(wrally2_map) MCFG_CPU_VBLANK_INT_DRIVER("lscreen", gaelco2_state, irq6_line_hold) - MCFG_CPU_ADD("mcu", DS5002FP, XTAL_24MHz/2) /* ? */ - MCFG_DS5002FP_CONFIG( 0x69, 0x00, 0x80 ) /* default config verified on chip */ - MCFG_CPU_PROGRAM_MAP(dallas_rom) - MCFG_CPU_IO_MAP(dallas_ram) - - MCFG_QUANTUM_PERFECT_CPU("mcu") + MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL_24MHz / 2) MCFG_EEPROM_SERIAL_93C66_ADD("eeprom") @@ -1425,8 +1422,8 @@ ROM_START( wrally2 ) ROM_LOAD16_BYTE( "wr2.64", 0x000000, 0x080000, CRC(4cdf4e1e) SHA1(a3b3ff4a70336b61c7bba5d518527bf4bd901867) ) ROM_LOAD16_BYTE( "wr2.63", 0x000001, 0x080000, CRC(94887c9f) SHA1(ad09f1fbeff4c3ba47f72346d261b22fa6a51457) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ - /* This SRAM has been dumped from 2 PCBs. The first had unused space filled as 0x00, the 2nd space was filled as 0xff. + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ + /* This SRAM has been dumped from 2 PCBs. The first had unused space filled as 0xff, the 2nd space was filled as 0x00. In addition, the first had 2 bad bytes, one of which was identified at the time, the other not. For reference the one that was not is "1938: 18 <-> 9B" (part of a data table) @@ -1452,9 +1449,14 @@ ROM_START( wrally2 ) either way the 2nd dump is in much better state, so we're using that. */ - ROM_LOAD( "wr2_dallas.bin", 0x00000, 0x8000, CRC(4c532e9e) SHA1(d0aad72b204d4abd3b8d7d5bbaf8d2d2f78edaa6) ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + /* these are the default states stored in NVRAM */ + DS5002FP_SET_MON( 0x69 ) + DS5002FP_SET_RPCTL( 0x00 ) + DS5002FP_SET_CRCR( 0x80 ) + ROM_REGION( 0x0a00000, "gfx1", 0 ) /* GFX + Sound */ ROM_LOAD( "wr2.16d", 0x0000000, 0x0080000, CRC(ad26086b) SHA1(487ffaaca57c9d030fc486b8cae6735ee40a0ac3) ) /* GFX only */ ROM_LOAD( "wr2.17d", 0x0080000, 0x0080000, CRC(c1ec0745) SHA1(a6c3ce9c889e6a53f4155f54d6655825af34a35b) ) /* GFX only */ @@ -1507,6 +1509,9 @@ Title is uncertain. A string at 27e00 says: "Play 2000 v5.01 (c) 1999", but there are also some gfxs that says "Gran Tesoro" all over the place. I don't know what's the correct title for this one... +see +http://web.archive.org/web/20001206204300/http://luckysunshine.com/products/gameboards/play2000.html + */ ROM_START( grtesoro ) @@ -1515,9 +1520,14 @@ ROM_START( grtesoro ) ROM_LOAD16_BYTE( "2.u39", 0x000000, 0x020000, BAD_DUMP CRC(9939299e) SHA1(55303a2adf199f4b5a60f57be7480b0e119f8624) ) ROM_LOAD16_BYTE( "1.u40", 0x000001, 0x020000, BAD_DUMP CRC(311c2f94) SHA1(963d6b5f479598145146fcb8b7c6ce77fbc92b07) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "ds5002fp.bin", 0x00000, 0x8000, NO_DUMP ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + //DS5002FP_SET_MON( x ) + //DS5002FP_SET_RPCTL( x ) + //DS5002FP_SET_CRCR( x ) + ROM_REGION( 0x0300000, "gfx1", 0 ) /* GFX + Sound */ ROM_LOAD( "3.u54", 0x0000000, 0x0080000, CRC(085008ed) SHA1(06eb4f972d79eab13b1b3b6829ef280e079abdb6) ) ROM_LOAD( "4.u53", 0x0080000, 0x0080000, CRC(94dc37a7) SHA1(28f9832b61541b292682a6e2d2264abccd138a2e) ) @@ -1534,9 +1544,14 @@ ROM_START( grtesoro4 ) /* there are version 4.0 and version 1.0 strings in this, ROM_LOAD16_BYTE( "2.u39_v4", 0x000000, 0x020000, CRC(fff16141) SHA1(8493c3e58a231c03b152b336f43422a9a2d2618c) ) ROM_LOAD16_BYTE( "1.u40_v4", 0x000001, 0x020000, CRC(39f9d58e) SHA1(1cbdae2adc570f2a2e10a707075312ef717e2643) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "ds5002fp.bin", 0x00000, 0x8000, NO_DUMP ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + //DS5002FP_SET_MON( x ) + //DS5002FP_SET_RPCTL( x ) + //DS5002FP_SET_CRCR( x ) + ROM_REGION( 0x0300000, "gfx1", 0 ) /* GFX + Sound */ ROM_LOAD( "3.u54", 0x0000000, 0x0080000, CRC(085008ed) SHA1(06eb4f972d79eab13b1b3b6829ef280e079abdb6) ) ROM_LOAD( "4.u53", 0x0080000, 0x0080000, CRC(94dc37a7) SHA1(28f9832b61541b292682a6e2d2264abccd138a2e) ) @@ -1549,44 +1564,9 @@ ROM_START( grtesoro4 ) /* there are version 4.0 and version 1.0 strings in this, ROM_END -READ16_MEMBER(gaelco2_state::maniacsqa_prot_r) -{ - int pc = space.device().safe_pc(); - // if -1 is returned at any point on these checks the game instantly reports 'power failure' - // these are generally done right before the other checks - if (pc == 0x3dbc) return 0x0000; // must not be -1 - if (pc == 0x5ce4) return 0x0000; // must not be -1 - if (pc == 0x5d08) return 0x0000; // must not be -1 (stores 5 here just before) - if (pc == 0xaa90) return 0x0000; // must not be -1 - if (pc == 0xaab2) return 0x0000; // must not be -1 - if (pc == 0x9f10) return 0x0000; // must not be -1 - if (pc == 0x3b86) return 0x0000; // must not be -1 - - if (pc == 0x3dce) return 0x0000; // must be 0 - - if (pc == 0x25c2) return 0x0000; // writes 0 to 0xfe45fa then expects this to be 0 - - if (pc == 0x5cf6) return 0x0000; // must be 0 - if (pc == 0x5d1a) return 0x0000; // must be 0 - if (pc == 0xaaa0) return 0x0000; // must be 0? - - if (pc == 0xaac4) return 0x0000; // checks for 0, 2 possible code paths after - happens when piece is dropped - if (pc == 0xaad0) return 0x0a00; // if above ISN'T 0 this must be 0x0a00 (but code then dies, probably wants some data filled?) - // other code path just results in no more pieces dropping? maybe the MCU does the matching algorithm? - - printf("read at PC %08x\n", pc); - return m_shareram[(0xfedaa2 - 0xfec000) / 2]; - -} - -DRIVER_INIT_MEMBER(gaelco2_state,maniacsqa) -{ - m_maincpu->space(AS_PROGRAM).install_read_handler(0xfedaa2, 0xfedaa3, read16_delegate(FUNC(gaelco2_state::maniacsqa_prot_r), this) ); -} - -GAME( 1994, aligator, 0, alighunt, alighunt, gaelco2_state, alighunt, ROT0, "Gaelco", "Alligator Hunt", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) -GAME( 1994, aligatorun,aligator,alighunt, alighunt, gaelco2_state, alighunt, ROT0, "Gaelco", "Alligator Hunt (unprotected)", 0 ) +GAME( 1994, aligator, 0, alighunt_d5002fp, alighunt, gaelco2_state, alighunt, ROT0, "Gaelco", "Alligator Hunt", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) +GAME( 1994, aligatorun,aligator,alighunt, alighunt, gaelco2_state, alighunt, ROT0, "Gaelco", "Alligator Hunt (unprotected)", 0 ) GAME( 1995, touchgo, 0, touchgo_d5002fp, touchgo, gaelco2_state, touchgo, ROT0, "Gaelco", "Touch & Go (World)", MACHINE_IMPERFECT_SOUND ) GAME( 1995, touchgon, touchgo, touchgo_d5002fp, touchgo, gaelco2_state, touchgo, ROT0, "Gaelco", "Touch & Go (Non North America)", MACHINE_IMPERFECT_SOUND ) @@ -1595,8 +1575,8 @@ GAME( 1995, touchgok, touchgo, touchgo, touchgo, gaelco2_state, touch GAME( 1995, wrally2, 0, wrally2, wrally2, wrally2_state, 0, ROT0, "Gaelco", "World Rally 2: Twin Racing", 0 ) -GAME( 1996, maniacsq, 0, maniacsq, maniacsq, gaelco2_state, 0, ROT0, "Gaelco", "Maniac Square (unprotected)", 0 ) -GAME( 1996, maniacsqa,maniacsq, maniacsq, maniacsq, gaelco2_state, maniacsqa,ROT0, "Gaelco", "Maniac Square (protected)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) +GAME( 1996, maniacsq, 0, maniacsq, maniacsq, gaelco2_state, 0, ROT0, "Gaelco", "Maniac Square (unprotected)", 0 ) +GAME( 1996, maniacsqa,maniacsq, maniacsq_d5002fp, maniacsq, gaelco2_state, 0, ROT0, "Gaelco", "Maniac Square (protected)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) GAME( 1996, snowboar, 0, snowboar, snowboar, gaelco2_state, 0, ROT0, "Gaelco", "Snow Board Championship (Version 2.1)", 0 ) GAME( 1996, snowboara,snowboar, snowboar, snowboar, gaelco2_state, snowboar, ROT0, "Gaelco", "Snow Board Championship (Version 2.0)", 0 ) diff --git a/src/mame/drivers/glass.cpp b/src/mame/drivers/glass.cpp index 7ff320ec5f8..cacd1364dcc 100644 --- a/src/mame/drivers/glass.cpp +++ b/src/mame/drivers/glass.cpp @@ -14,6 +14,7 @@ except for the Promat licensed Korean version which is unprotected. #include "emu.h" #include "includes/glass.h" +#include "machine/gaelco_ds5002fp.h" #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" #include "screen.h" @@ -96,7 +97,7 @@ static ADDRESS_MAP_START( glass_map, AS_PROGRAM, 16, glass_state ) AM_RANGE(0x70000c, 0x70000d) AM_WRITE(OKIM6295_bankswitch_w) /* OKI6295 bankswitch */ AM_RANGE(0x70000e, 0x70000f) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff) /* OKI6295 status register */ AM_RANGE(0x70000a, 0x70004b) AM_WRITE(coin_w) /* Coin Counters/Lockout */ - AM_RANGE(0xfec000, 0xfeffff) AM_RAM AM_SHARE("mainram") /* Work RAM (partially shared with DS5002FP) */ + AM_RANGE(0xfec000, 0xfeffff) AM_RAM AM_SHARE("shareram") /* Work RAM (partially shared with DS5002FP) */ ADDRESS_MAP_END @@ -206,7 +207,6 @@ static MACHINE_CONFIG_START( glass ) MCFG_CPU_PROGRAM_MAP(glass_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", glass_state, interrupt) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -228,14 +228,23 @@ static MACHINE_CONFIG_START( glass ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( glass_ds5002fp, glass ) + MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP_WRALLY, XTAL_24MHz / 2) /* verified on pcb */ +MACHINE_CONFIG_END + ROM_START( glass ) /* Version 1.1 */ ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "1.c23", 0x000000, 0x040000, CRC(aeebd4ed) SHA1(04759dc146dff0fc74b78d70e79dfaebe68328f9) ) ROM_LOAD16_BYTE( "2.c22", 0x000001, 0x040000, CRC(165e2e01) SHA1(180a2e2b5151f2321d85ac23eff7fbc9f52023a5) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "glass_ds5002fp.bin", 0x00000, 0x8000, NO_DUMP ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + //DS5002FP_SET_MON( 0x88 ) + //DS5002FP_SET_RPCTL( 0x00 ) + //DS5002FP_SET_CRCR( 0x80 ) + ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 ) /* Graphics */ /* 0x000000-0x3fffff filled in later in the DRIVER_INIT */ @@ -256,9 +265,14 @@ ROM_START( glass10 ) /* Version 1.0 */ ROM_LOAD16_BYTE( "c23.bin", 0x000000, 0x040000, CRC(688cdf33) SHA1(b59dcc3fc15f72037692b745927b110e97d8282e) ) ROM_LOAD16_BYTE( "c22.bin", 0x000001, 0x040000, CRC(ab17c992) SHA1(1509b5b4bbfb4e022e0ab6fbbc0ffc070adfa531) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "glass_ds5002fp.bin", 0x00000, 0x8000, NO_DUMP ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + //DS5002FP_SET_MON( x ) + //DS5002FP_SET_RPCTL( x ) + //DS5002FP_SET_CRCR( x ) + ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 ) /* Graphics */ /* 0x000000-0x3fffff filled in later in the DRIVER_INIT */ @@ -279,9 +293,14 @@ ROM_START( glass10a ) /* Title screen shows "GLASS" and under that "Break Editio ROM_LOAD16_BYTE( "spl-c23.bin", 0x000000, 0x040000, CRC(c1393bea) SHA1(a5f877ba38305a7b49fa3c96b9344cbf71e8c9ef) ) ROM_LOAD16_BYTE( "spl-c22.bin", 0x000001, 0x040000, CRC(0d6fa33e) SHA1(37e9258ef7e108d034c80abc8e5e5ab6dacf0a61) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "glass_ds5002fp.bin", 0x00000, 0x8000, NO_DUMP ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + //DS5002FP_SET_MON( x ) + //DS5002FP_SET_RPCTL( x ) + //DS5002FP_SET_CRCR( x ) + ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 ) /* Graphics */ /* 0x000000-0x3fffff filled in later in the DRIVER_INIT */ @@ -341,91 +360,6 @@ void glass_state::ROM16_split_gfx( const char *src_reg, const char *dst_reg, int } } -/* How does the protection work? - - We know in World Rally it shares the whole of main RAM with the Dallas, with subtle reads and writes / values being checked.. so I guess this will be similar at least - and thus very hard to figure out if done properly - - */ - -READ16_MEMBER( glass_state::mainram_r ) -{ - uint16_t ret = m_mainram[offset]; - int pc = space.device().safe_pc(); - - if (offset == (0xfede96 - 0xfec000)>>1) - { - // this address seems important, the game will abort with 'power failure' depending on some reads, presumably referring to the power to the battery - - // there are also various code segments like the one below - /* - start: - tst.b this address - bne end - tst.b $fede1d.l - nop << why? - bne start - end: - */ - return 0x0000; - //printf("%06x read %06x - %04x %04x\n", pc , (offset*2 + 0xfec000), ret, mem_mask); - } - else if (offset == (0xfede1c - 0xfec000)>>1) - { - // related to above, could also be some command ack? - logerror("%06x read %06x - %04x %04x\n", pc, (offset*2 + 0xfec000), ret, mem_mask); - } - else if (offset == (0xfede26 - 0xfec000)>>1) - { - logerror("%06x read %06x - %04x %04x\n", pc, (offset*2 + 0xfec000), ret, mem_mask); - } - return ret; -} - -WRITE16_MEMBER( glass_state::mainram_w ) -{ - int pc = space.device().safe_pc(); - - COMBINE_DATA(&m_mainram[offset]); - - if (offset == (0xfede02 - 0xfec000)>>1) - { -// printf("%06x write %06x - %04x %04x\n", pc, (offset*2 + 0xfec000), data, mem_mask); - // several checks write here then expect it to appear mirrored, might be some kind of command + command ack - if (ACCESSING_BITS_8_15) // sometimes mask 0xff00, but not in cases which poll for change - { - mem_mask = 0x00ff; - data >>=8; - COMBINE_DATA(&m_mainram[offset]); - } - return; - } - else if (offset == (0xfede1c - 0xfec000)>>1) - { - // see notes about 0xfede96 in read, this address seems important - logerror("%06x write %06x - %04x %04x\n", pc, (offset*2 + 0xfec000), data, mem_mask); - if (mem_mask == 0x00ff) - { - int realdata = data; - - // don't store the bits written, game checks they get cleared? - data &= 0xff00; - COMBINE_DATA(&m_mainram[offset]); - - // a command? - if (realdata == 0x0002) - { - // there is a check on address 0xfede26 just after writing 0002 here.. - offset = (0xfede26 - 0xfec000) >> 1; - data = 0xff00; - mem_mask = 0xff00; - COMBINE_DATA(&m_mainram[offset]); - } - } - return; - } - -} DRIVER_INIT_MEMBER(glass_state, glass) { @@ -450,21 +384,13 @@ DRIVER_INIT_MEMBER(glass_state, glass) } -DRIVER_INIT_MEMBER(glass_state,glassp) -{ - DRIVER_INIT_CALL(glass); - - /* install custom handler over RAM for protection */ - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xfec000, 0xfeffff, read16_delegate(FUNC(glass_state::mainram_r), this), write16_delegate(FUNC(glass_state::mainram_w),this)); - -} // ALL versions of Glass contain the 'Break Edition' string (it just seems to be part of the title?) // The 2 version 1.0 releases are very similar code, it was thought that one was a break edition and the other wasn't, but as both contain the string this seems unlikely. // Version 1.1 releases also show Version 1994 on the title screen. These versions do not have skulls in the playfield (at least not on early stages) // The unprotected version appears to be a Korean set, is censored, and has different girl pictures. -GAME( 1994, glass, 0, glass, glass, glass_state, glassp, ROT0, "OMK / Gaelco", "Glass (Ver 1.1, Break Edition, Version 1994)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) -GAME( 1994, glasskr, glass, glass, glass, glass_state, glass, ROT0, "OMK / Gaelco (Promat license)", "Glass (Ver 1.1, Break Edition, Version 1994) (censored, unprotected)", MACHINE_SUPPORTS_SAVE ) // promat stickers on program roms -GAME( 1993, glass10, glass, glass, glass, glass_state, glassp, ROT0, "OMK / Gaelco", "Glass (Ver 1.0, Break Edition) (set 1)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) -GAME( 1993, glass10a, glass, glass, glass, glass_state, glassp, ROT0, "OMK / Gaelco", "Glass (Ver 1.0, Break Edition) (set 2)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1994, glass, 0, glass_ds5002fp, glass, glass_state, glass, ROT0, "OMK / Gaelco", "Glass (Ver 1.1, Break Edition, Version 1994)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1994, glasskr, glass, glass, glass, glass_state, glass, ROT0, "OMK / Gaelco (Promat license)", "Glass (Ver 1.1, Break Edition, Version 1994) (censored, unprotected)", MACHINE_SUPPORTS_SAVE ) // promat stickers on program roms +GAME( 1993, glass10, glass, glass_ds5002fp, glass, glass_state, glass, ROT0, "OMK / Gaelco", "Glass (Ver 1.0, Break Edition) (set 1)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, glass10a, glass, glass_ds5002fp, glass, glass_state, glass, ROT0, "OMK / Gaelco", "Glass (Ver 1.0, Break Edition) (set 2)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/targeth.cpp b/src/mame/drivers/targeth.cpp index 2da6b711d3e..bbbf81ee882 100644 --- a/src/mame/drivers/targeth.cpp +++ b/src/mame/drivers/targeth.cpp @@ -52,6 +52,7 @@ Sound: OKI M6295 #include "emu.h" #include "includes/targeth.h" +#include "machine/gaelco_ds5002fp.h" #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" #include "screen.h" @@ -125,7 +126,8 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, targeth_state ) AM_RANGE(0x70000e, 0x70000f) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff) /* OKI6295 status register */ AM_RANGE(0x700010, 0x70001b) AM_WRITENOP /* ??? Guns reload related? */ AM_RANGE(0x70002a, 0x70003b) AM_WRITE(coin_counter_w) /* Coin counters */ - AM_RANGE(0xfe0000, 0xfeffff) AM_RAM /* Work RAM (partially shared with DS5002FP) */ + AM_RANGE(0xfe0000, 0xfe7fff) AM_RAM /* Work RAM */ + AM_RANGE(0xfe8000, 0xfeffff) AM_RAM AM_SHARE("shareram") /* Work RAM (shared with D5002FP) */ ADDRESS_MAP_END @@ -134,6 +136,10 @@ static ADDRESS_MAP_START( oki_map, 0, 8, targeth_state ) AM_RANGE(0x30000, 0x3ffff) AM_ROMBANK("okibank") ADDRESS_MAP_END +void targeth_state::machine_start() +{ + membank("okibank")->configure_entries(0, 16, memregion("oki")->base(), 0x10000); +} static INPUT_PORTS_START( targeth ) PORT_START("GUNX1") @@ -227,6 +233,8 @@ static MACHINE_CONFIG_START( targeth ) MCFG_CPU_PROGRAM_MAP(main_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", targeth_state, interrupt, "screen", 0, 1) + MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL_24MHz / 2) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -253,9 +261,15 @@ ROM_START( targeth ) ROM_LOAD16_BYTE( "th2_b_c_23.c23", 0x000000, 0x040000, CRC(840887d6) SHA1(9a36b346608d531a62a2e0704ea44f12e07f9d91) ) // The "B" was hand written ROM_LOAD16_BYTE( "th2_b_c_22.c22", 0x000001, 0x040000, CRC(d2435eb8) SHA1(ce75a115dad8019c8e66a1c3b3e15f54781f65ae) ) // The "B" was hand written - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "targeth_ds5002fp.bin", 0x00000, 0x8000, NO_DUMP ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + //DS5002FP_SET_MON( x ) + //DS5002FP_SET_RPCTL( x ) + //DS5002FP_SET_CRCR( x ) + + ROM_REGION( 0x200000, "gfx1", 0 ) /* Graphics */ ROM_LOAD( "targeth.i13", 0x000000, 0x080000, CRC(b892be24) SHA1(9cccaaacf20e77c7358f0ceac60b8a1012f1216c) ) ROM_LOAD( "targeth.i11", 0x080000, 0x080000, CRC(6797faf9) SHA1(112cffe72f91cb46c262e19a47b0cab3237dd60f) ) @@ -273,9 +287,14 @@ ROM_START( targetha ) ROM_LOAD16_BYTE( "c23.bin", 0x000000, 0x040000, CRC(e38a54e2) SHA1(239bfa6f1c0fc8aa0ad7de9be237bef55b384007) ) ROM_LOAD16_BYTE( "c22.bin", 0x000001, 0x040000, CRC(24fe3efb) SHA1(8f48f08a6db28966c9263be119883c9179e349ed) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "targeth_ds5002fp.bin", 0x00000, 0x8000, NO_DUMP ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + //DS5002FP_SET_MON( x ) + //DS5002FP_SET_RPCTL( x ) + //DS5002FP_SET_CRCR( x ) + ROM_REGION( 0x200000, "gfx1", 0 ) /* Graphics */ ROM_LOAD( "targeth.i13", 0x000000, 0x080000, CRC(b892be24) SHA1(9cccaaacf20e77c7358f0ceac60b8a1012f1216c) ) ROM_LOAD( "targeth.i11", 0x080000, 0x080000, CRC(6797faf9) SHA1(112cffe72f91cb46c262e19a47b0cab3237dd60f) ) diff --git a/src/mame/drivers/thoop2.cpp b/src/mame/drivers/thoop2.cpp index a45f8a92c42..8bdac670a66 100644 --- a/src/mame/drivers/thoop2.cpp +++ b/src/mame/drivers/thoop2.cpp @@ -15,9 +15,8 @@ maybe bad dump of DS5002FP rom, maybe CPU bugs #include "emu.h" #include "includes/thoop2.h" - +#include "machine/gaelco_ds5002fp.h" #include "cpu/m68000/m68000.h" -#include "cpu/mcs51/mcs51.h" #include "machine/watchdog.h" #include "sound/okim6295.h" #include "screen.h" @@ -55,40 +54,6 @@ WRITE16_MEMBER(thoop2_state::coin_w) /* 05b unknown */ } -/*============================================================================ - DS5002FP - ============================================================================*/ - -READ8_MEMBER(thoop2_state::dallas_share_r) -{ - uint8_t *shareram = (uint8_t *)m_shareram.target(); - return shareram[BYTE_XOR_BE(offset)]; -} - -WRITE8_MEMBER(thoop2_state::dallas_share_w) -{ - uint8_t *shareram = (uint8_t *)m_shareram.target(); - shareram[BYTE_XOR_BE(offset)] = data; -} - -READ8_MEMBER(thoop2_state::dallas_ram_r) -{ - return m_mcu_ram[offset]; -} - -WRITE8_MEMBER(thoop2_state::dallas_ram_w) -{ - m_mcu_ram[offset] = data; -} - -static ADDRESS_MAP_START( dallas_rom, AS_PROGRAM, 8, thoop2_state ) - AM_RANGE(0x0000, 0x7fff) AM_READWRITE(dallas_ram_r, dallas_ram_w) /* Code in NVRAM */ -ADDRESS_MAP_END - -static ADDRESS_MAP_START( dallas_ram, AS_IO, 8, thoop2_state ) - AM_RANGE(0x08000, 0x0ffff) AM_READWRITE(dallas_share_r, dallas_share_w) /* confirmed that 0x8000 - 0xffff is a window into 68k shared RAM */ - AM_RANGE(0x10000, 0x17fff) AM_READWRITE(dallas_ram_r, dallas_ram_w) /* yes, the games access it as data and use it for temporary storage!! */ -ADDRESS_MAP_END static ADDRESS_MAP_START( thoop2_map, AS_PROGRAM, 16, thoop2_state ) @@ -232,16 +197,11 @@ GFXDECODE_END static MACHINE_CONFIG_START( thoop2 ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M68000,24000000/2) /* 12 MHz */ + MCFG_CPU_ADD("maincpu", M68000,XTAL_24MHz/2) /* 12 MHz */ MCFG_CPU_PROGRAM_MAP(thoop2_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", thoop2_state, irq6_line_hold) - MCFG_CPU_ADD("mcu", DS5002FP, XTAL_24MHz/2) /* ? */ - MCFG_DS5002FP_CONFIG( 0x79, 0x00, 0x80 ) /* default config verified on chip */ - MCFG_CPU_PROGRAM_MAP(dallas_rom) - MCFG_CPU_IO_MAP(dallas_ram) - - MCFG_QUANTUM_PERFECT_CPU("mcu") + MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL_24MHz / 2) MCFG_WATCHDOG_ADD("watchdog") @@ -267,14 +227,21 @@ static MACHINE_CONFIG_START( thoop2 ) MACHINE_CONFIG_END + ROM_START( thoop2 ) ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "th2c23.040", 0x000000, 0x080000, CRC(3e465753) SHA1(1ea1173b9fe5d652e7b5fafb822e2535cecbc198) ) ROM_LOAD16_BYTE( "th2c22.040", 0x000001, 0x080000, CRC(837205b7) SHA1(f78b90c2be0b4dddaba26f074ea00eff863cfdb2) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "thoop2_ds5002fp.bin", 0x00000, 0x8000, BAD_DUMP CRC(67cbf579) SHA1(40a543b9d0f57d374ceccb720be20b9e42ecc91a) ) /* marked as BAD_DUMP until a 2nd board is used to verify, also because game currently crashes */ + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + /* these are the default states stored in NVRAM */ + DS5002FP_SET_MON( 0x79 ) + DS5002FP_SET_RPCTL( 0x00 ) + DS5002FP_SET_CRCR( 0x80 ) + ROM_REGION( 0x800000, "gfx1", 0 ) ROM_LOAD( "th2-h8.32m", 0x000000, 0x400000, CRC(60328a11) SHA1(fcdb374d2fc7ef5351a4181c471d192199dc2081) ) ROM_LOAD( "th2-h12.32m", 0x400000, 0x400000, CRC(b25c2d3e) SHA1(d70f3e4e2432d80c2ac87cd81208ada303bac04a) ) diff --git a/src/mame/drivers/wrally.cpp b/src/mame/drivers/wrally.cpp index 60401759c04..bc5e5c00187 100644 --- a/src/mame/drivers/wrally.cpp +++ b/src/mame/drivers/wrally.cpp @@ -128,7 +128,7 @@ The PCB has a layout that can either use the 4 rom set of I7, I9, I11 & I13 or l #include "includes/wrally.h" #include "cpu/m68000/m68000.h" -#include "cpu/mcs51/mcs51.h" +#include "machine/gaelco_ds5002fp.h" #include "sound/okim6295.h" #include "screen.h" #include "speaker.h" @@ -155,27 +155,7 @@ static ADDRESS_MAP_START( wrally_map, AS_PROGRAM, 16, wrally_state ) AM_RANGE(0xfec000, 0xfeffff) AM_RAM AM_SHARE("shareram") /* Work RAM (shared with DS5002FP) */ ADDRESS_MAP_END -READ8_MEMBER(wrally_state::dallas_share_r) -{ - uint8_t *shareram = (uint8_t *)m_shareram.target(); - return shareram[BYTE_XOR_BE(offset)]; -} - -WRITE8_MEMBER(wrally_state::dallas_share_w) -{ - uint8_t *shareram = (uint8_t *)m_shareram.target(); - - shareram[BYTE_XOR_BE(offset)] = data; -} - -static ADDRESS_MAP_START( dallas_rom, AS_PROGRAM, 8, wrally_state ) - AM_RANGE(0x0000, 0x7fff) AM_ROM /* Code in NVRAM */ -ADDRESS_MAP_END - -static ADDRESS_MAP_START( dallas_ram, AS_IO, 8, wrally_state ) - AM_RANGE(0x0000, 0xffff) AM_READWRITE(dallas_share_r, dallas_share_w) AM_MASK(0x3fff) /* Shared RAM with the main CPU */ -ADDRESS_MAP_END static ADDRESS_MAP_START( oki_map, 0, 8, wrally_state ) AM_RANGE(0x00000, 0x2ffff) AM_ROM @@ -280,12 +260,7 @@ static MACHINE_CONFIG_START( wrally ) MCFG_CPU_PROGRAM_MAP(wrally_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", wrally_state, irq6_line_hold) - MCFG_CPU_ADD("mcu", DS5002FP, XTAL_24MHz/2) /* verified on pcb */ - MCFG_DS5002FP_CONFIG( 0x88, 0x00, 0x80 ) - MCFG_CPU_PROGRAM_MAP(dallas_rom) - MCFG_CPU_IO_MAP(dallas_ram) - - MCFG_QUANTUM_TIME(attotime::from_hz(38400)) /* heavy sync */ + MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP_WRALLY, XTAL_24MHz / 2) /* verified on pcb */ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -300,7 +275,6 @@ static MACHINE_CONFIG_START( wrally ) MCFG_PALETTE_ADD("palette", 1024*8) MCFG_PALETTE_FORMAT(xxxxBBBBRRRRGGGG) - /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -315,9 +289,15 @@ ROM_START( wrally ) ROM_LOAD16_BYTE( "worldr17.c23", 0x000000, 0x080000, CRC(050f5629) SHA1(74fc2cd5114f3bc4b2429f1d8d7eeb1658f9f179) ) /* Only difference compared to set 2 is how the Dallas DS5002FP */ ROM_LOAD16_BYTE( "worldr16.c22", 0x000001, 0x080000, CRC(9e0d126c) SHA1(369360b7ec2c3497af3bf62b4eba24c3d9f94675) ) /* power failure shows on screen, IE: "Tension baja " */ - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "wrdallas.bin", 0x00000, 0x8000, CRC(547d1768) SHA1(c58d1edd072d796be0663fb265f4739ec006b688) ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + /* these are the default states stored in NVRAM */ + DS5002FP_SET_MON( 0x88 ) + DS5002FP_SET_RPCTL( 0x00 ) + DS5002FP_SET_CRCR( 0x80 ) + ROM_REGION( 0x200000, "gfx1", 0 ) ROM_LOAD16_BYTE( "worldr21.i13", 0x000000, 0x080000, CRC(b7fddb12) SHA1(619a75daac8cbba7e85c97ca19733e2196d66d5c) ) ROM_LOAD16_BYTE( "worldr20.i11", 0x000001, 0x080000, CRC(58b2809a) SHA1(8741ec544c54e2a2f5d17ac2f8400ee2ce382e83) ) @@ -342,9 +322,15 @@ ROM_START( wrallya ) ROM_LOAD16_BYTE( "c23.bin", 0x000000, 0x080000, CRC(8b7d93c3) SHA1(ce4163eebc5d4a0c1266d650523b1ffc702d1b87) ) /* Only difference compared to set 1 is how the Dallas DS5002FP */ ROM_LOAD16_BYTE( "c22.bin", 0x000001, 0x080000, CRC(56da43b6) SHA1(02db8f969ed5e7f5e5356c45c0312faf5f000335) ) /* power failure shows on screen, IE: "Power Failure" */ - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "wrdallas.bin", 0x00000, 0x8000, CRC(547d1768) SHA1(c58d1edd072d796be0663fb265f4739ec006b688) ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + /* these are the default states stored in NVRAM */ + DS5002FP_SET_MON( 0x88 ) + DS5002FP_SET_RPCTL( 0x00 ) + DS5002FP_SET_CRCR( 0x80 ) + ROM_REGION( 0x200000, "gfx1", 0 ) ROM_LOAD16_BYTE( "worldr21.i13", 0x000000, 0x080000, CRC(b7fddb12) SHA1(619a75daac8cbba7e85c97ca19733e2196d66d5c) ) ROM_LOAD16_BYTE( "worldr20.i11", 0x000001, 0x080000, CRC(58b2809a) SHA1(8741ec544c54e2a2f5d17ac2f8400ee2ce382e83) ) @@ -369,9 +355,15 @@ ROM_START( wrallyb ) ROM_LOAD16_BYTE( "rally_c23.c23", 0x000000, 0x080000, CRC(ddd6f833) SHA1(f12f82c412fa93f46020d50c2620974ae2fb502b) ) ROM_LOAD16_BYTE( "rally_c22.c22", 0x000001, 0x080000, CRC(59a0d35c) SHA1(7c6f376a53c1e6d793cbfb16861ee3298ee013a1) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "wrdallas.bin", 0x00000, 0x8000, CRC(547d1768) SHA1(c58d1edd072d796be0663fb265f4739ec006b688) ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + /* these are the default states stored in NVRAM */ + DS5002FP_SET_MON( 0x88 ) + DS5002FP_SET_RPCTL( 0x00 ) + DS5002FP_SET_CRCR( 0x80 ) + ROM_REGION( 0x200000, "gfx1", 0 ) ROM_LOAD( "rally h-12.h12", 0x000000, 0x100000, CRC(3353dc00) SHA1(db3b1686751dcaa231d66c08b5be81fcfe299ad9) ) /* Same data, different layout */ ROM_LOAD( "rally h-8.h8", 0x100000, 0x100000, CRC(58dcd024) SHA1(384ff296d3c7c8e0c4469231d1940de3cea89fc2) ) @@ -392,9 +384,15 @@ ROM_START( wrallyat ) /* Board Marked 930217, Atari License */ ROM_LOAD16_BYTE( "rally.c23", 0x000000, 0x080000, CRC(366595ad) SHA1(e16341ed9eacf9b729c28184268150ea9b62f185) ) /* North & South America only... */ ROM_LOAD16_BYTE( "rally.c22", 0x000001, 0x080000, CRC(0ad4ec6f) SHA1(991557cf25fe960b1c586e990e6019befe5a11d0) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* DS5002FP code */ + ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */ ROM_LOAD( "wrdallas.bin", 0x00000, 0x8000, CRC(547d1768) SHA1(c58d1edd072d796be0663fb265f4739ec006b688) ) + ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 ) + /* these are the default states stored in NVRAM */ + DS5002FP_SET_MON( 0x88 ) + DS5002FP_SET_RPCTL( 0x00 ) + DS5002FP_SET_CRCR( 0x80 ) + ROM_REGION( 0x200000, "gfx1", 0 ) ROM_LOAD( "rally h-12.h12", 0x000000, 0x100000, CRC(3353dc00) SHA1(db3b1686751dcaa231d66c08b5be81fcfe299ad9) ) /* Same data, different layout */ ROM_LOAD( "rally h-8.h8", 0x100000, 0x100000, CRC(58dcd024) SHA1(384ff296d3c7c8e0c4469231d1940de3cea89fc2) ) diff --git a/src/mame/includes/gaelco2.h b/src/mame/includes/gaelco2.h index 60c46381ab7..d4657749af3 100644 --- a/src/mame/includes/gaelco2.h +++ b/src/mame/includes/gaelco2.h @@ -17,18 +17,9 @@ public: m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), m_generic_paletteram_16(*this, "paletteram"), - m_shareram(*this, "shareram"), - m_mcu_ram(*this, "mcu") + m_shareram(*this, "shareram") { } - - DECLARE_READ16_MEMBER(maniacsqa_prot_r); - - DECLARE_READ8_MEMBER(dallas_ram_r); - DECLARE_WRITE8_MEMBER(dallas_ram_w); - DECLARE_READ8_MEMBER(dallas_share_r); - DECLARE_WRITE8_MEMBER(dallas_share_w); - DECLARE_WRITE16_MEMBER(gaelco2_coin_w); DECLARE_WRITE16_MEMBER(gaelco2_coin2_w); DECLARE_WRITE16_MEMBER(touchgo_coin_w); @@ -39,7 +30,6 @@ public: DECLARE_DRIVER_INIT(touchgo); DECLARE_DRIVER_INIT(snowboar); DECLARE_DRIVER_INIT(alighunt); - DECLARE_DRIVER_INIT(maniacsqa); TILE_GET_INFO_MEMBER(get_tile_info_gaelco2_screen0); TILE_GET_INFO_MEMBER(get_tile_info_gaelco2_screen1); TILE_GET_INFO_MEMBER(get_tile_info_gaelco2_screen0_dual); @@ -74,8 +64,6 @@ private: required_device m_palette; required_shared_ptr m_generic_paletteram_16; optional_shared_ptr m_shareram; - optional_region_ptr m_mcu_ram; - }; diff --git a/src/mame/includes/glass.h b/src/mame/includes/glass.h index a0af86de946..dabe0bb901d 100644 --- a/src/mame/includes/glass.h +++ b/src/mame/includes/glass.h @@ -17,7 +17,7 @@ public: m_videoram(*this, "videoram"), m_vregs(*this, "vregs"), m_spriteram(*this, "spriteram"), - m_mainram(*this, "mainram") { } + m_shareram(*this, "shareram") { } /* devices */ @@ -29,7 +29,7 @@ public: required_shared_ptr m_videoram; required_shared_ptr m_vregs; required_shared_ptr m_spriteram; - required_shared_ptr m_mainram; + required_shared_ptr m_shareram; /* video-related */ tilemap_t *m_pant[2]; @@ -46,11 +46,8 @@ public: DECLARE_WRITE16_MEMBER(coin_w); DECLARE_WRITE16_MEMBER(blitter_w); DECLARE_WRITE16_MEMBER(vram_w); - DECLARE_READ16_MEMBER(mainram_r); - DECLARE_WRITE16_MEMBER(mainram_w); DECLARE_DRIVER_INIT(glass); - DECLARE_DRIVER_INIT(glassp); virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; diff --git a/src/mame/includes/thoop2.h b/src/mame/includes/thoop2.h index 389f0154862..34ac8d40a23 100644 --- a/src/mame/includes/thoop2.h +++ b/src/mame/includes/thoop2.h @@ -10,20 +10,13 @@ public: m_palette(*this, "palette"), m_videoram(*this, "videoram"), m_vregs(*this, "vregs"), - m_spriteram(*this, "spriteram"), - m_shareram(*this, "shareram"), - m_mcu_ram(*this, "mcu") + m_spriteram(*this, "spriteram") { } DECLARE_WRITE16_MEMBER(OKIM6295_bankswitch_w); DECLARE_WRITE16_MEMBER(coin_w); DECLARE_WRITE16_MEMBER(vram_w); - DECLARE_READ8_MEMBER(dallas_ram_r); - DECLARE_WRITE8_MEMBER(dallas_ram_w); - DECLARE_READ8_MEMBER(dallas_share_r); - DECLARE_WRITE8_MEMBER(dallas_share_w); - virtual void machine_start() override; virtual void video_start() override; @@ -45,6 +38,4 @@ private: required_shared_ptr m_videoram; required_shared_ptr m_vregs; required_shared_ptr m_spriteram; - required_shared_ptr m_shareram; - required_region_ptr m_mcu_ram; }; diff --git a/src/mame/machine/gaelco_ds5002fp.cpp b/src/mame/machine/gaelco_ds5002fp.cpp new file mode 100644 index 00000000000..ae0ebb57399 --- /dev/null +++ b/src/mame/machine/gaelco_ds5002fp.cpp @@ -0,0 +1,100 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +#include "emu.h" +#include "machine/gaelco_ds5002fp.h" + +DEFINE_DEVICE_TYPE(GAELCO_DS5002FP, gaelco_ds5002fp_device, "gaelco_ds5002fp", "Gaelco DS5002FP") +DEFINE_DEVICE_TYPE(GAELCO_DS5002FP_WRALLY, gaelco_ds5002fp_wrally_device, "gaelco_ds5002fp_wr", "Gaelco DS5002FP (World Rally)") + +gaelco_ds5002fp_device_base::gaelco_ds5002fp_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock), + m_shareram(*this, ":shareram"), + m_mcu_ram(*this, "sram") +{ +} + +READ8_MEMBER(gaelco_ds5002fp_device_base::dallas_share_r) +{ + uint8_t *shareram = (uint8_t *)m_shareram.target(); + return shareram[BYTE_XOR_BE(offset)]; +} + +WRITE8_MEMBER(gaelco_ds5002fp_device_base::dallas_share_w) +{ + uint8_t *shareram = (uint8_t *)m_shareram.target(); + shareram[BYTE_XOR_BE(offset)] = data; +} + +READ8_MEMBER(gaelco_ds5002fp_device_base::dallas_ram_r) +{ + return m_mcu_ram[offset]; +} + +WRITE8_MEMBER(gaelco_ds5002fp_device_base::dallas_ram_w) +{ + m_mcu_ram[offset] = data; +} + +void gaelco_ds5002fp_device_base::device_start() +{ +} + +void gaelco_ds5002fp_device_base::device_reset() +{ +} + +gaelco_ds5002fp_device::gaelco_ds5002fp_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : gaelco_ds5002fp_device(mconfig, GAELCO_DS5002FP, tag, owner, clock) +{ +} + +gaelco_ds5002fp_device::gaelco_ds5002fp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : gaelco_ds5002fp_device_base(mconfig, type, tag, owner, clock) +{ +} + +static ADDRESS_MAP_START( dallas_rom, AS_PROGRAM, 8, gaelco_ds5002fp_device ) + AM_RANGE(0x00000, 0x07fff) AM_READ(dallas_ram_r) /* Code in NVRAM */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( dallas_ram, AS_IO, 8, gaelco_ds5002fp_device ) + AM_RANGE(0x08000, 0x0ffff) AM_READWRITE(dallas_share_r, dallas_share_w) /* confirmed that 0x8000 - 0xffff is a window into 68k shared RAM */ + AM_RANGE(0x10000, 0x17fff) AM_RAM AM_SHARE("sram") /* yes, the games access it as data and use it for temporary storage!! */ +ADDRESS_MAP_END + +MACHINE_CONFIG_MEMBER(gaelco_ds5002fp_device::device_add_mconfig) + MCFG_CPU_ADD("mcu", DS5002FP, DERIVED_CLOCK(1, 1)) + MCFG_CPU_PROGRAM_MAP(dallas_rom) + MCFG_CPU_IO_MAP(dallas_ram) + + MCFG_QUANTUM_PERFECT_CPU("mcu") + + MCFG_NVRAM_ADD_0FILL("sram") +MACHINE_CONFIG_END + + + +gaelco_ds5002fp_wrally_device::gaelco_ds5002fp_wrally_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : gaelco_ds5002fp_device(mconfig, GAELCO_DS5002FP_WRALLY, tag, owner, clock) +{ +} + +static ADDRESS_MAP_START( dallas_rom_wr, AS_PROGRAM, 8, gaelco_ds5002fp_wrally_device ) + AM_RANGE(0x00000, 0x07fff) AM_READ(dallas_ram_r) /* Code in NVRAM */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( dallas_ram_wr, AS_IO, 8, gaelco_ds5002fp_wrally_device ) + AM_RANGE(0x00000, 0x0ffff) AM_READWRITE(dallas_share_r, dallas_share_w) AM_MASK(0x3fff) /* Shared RAM with the main CPU */ + AM_RANGE(0x10000, 0x17fff) AM_RAM AM_SHARE("sram") /*don't think World Rally actually uses it for storage tho */ +ADDRESS_MAP_END + +MACHINE_CONFIG_MEMBER(gaelco_ds5002fp_wrally_device::device_add_mconfig) + MCFG_CPU_ADD("mcu", DS5002FP, DERIVED_CLOCK(1, 1)) + MCFG_CPU_PROGRAM_MAP(dallas_rom_wr) + MCFG_CPU_IO_MAP(dallas_ram_wr) + + MCFG_QUANTUM_PERFECT_CPU("mcu") + + MCFG_NVRAM_ADD_0FILL("sram") +MACHINE_CONFIG_END + diff --git a/src/mame/machine/gaelco_ds5002fp.h b/src/mame/machine/gaelco_ds5002fp.h new file mode 100644 index 00000000000..d702a22d22c --- /dev/null +++ b/src/mame/machine/gaelco_ds5002fp.h @@ -0,0 +1,56 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +#ifndef MAME_MACHINE_GAELCODS5002FP_H +#define MAME_MACHINE_GAELCODS5002FP_H + +#pragma once + +#include "cpu/mcs51/mcs51.h" +#include "machine/nvram.h" + +DECLARE_DEVICE_TYPE(GAELCO_DS5002FP, gaelco_ds5002fp_device) +DECLARE_DEVICE_TYPE(GAELCO_DS5002FP_WRALLY, gaelco_ds5002fp_wrally_device) + +class gaelco_ds5002fp_device_base : public device_t +{ +public: + required_shared_ptr m_shareram; + required_region_ptr m_mcu_ram; + + DECLARE_READ8_MEMBER(dallas_ram_r); + DECLARE_WRITE8_MEMBER(dallas_ram_w); + DECLARE_READ8_MEMBER(dallas_share_r); + DECLARE_WRITE8_MEMBER(dallas_share_w); + +protected: + gaelco_ds5002fp_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock); + + virtual void device_start() override; + virtual void device_reset() override; + +private: + +}; + + +class gaelco_ds5002fp_device : public gaelco_ds5002fp_device_base +{ +public: + gaelco_ds5002fp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual void device_add_mconfig(machine_config &config) override; + +protected: + gaelco_ds5002fp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); +}; + + +class gaelco_ds5002fp_wrally_device : public gaelco_ds5002fp_device +{ +public: + gaelco_ds5002fp_wrally_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + virtual void device_add_mconfig(machine_config &config) override; + +protected: +}; + +#endif // MAME_MACHINE_GAELCODS5002FP_H