mirror of
https://github.com/holub/mame
synced 2025-04-19 15:11:37 +03:00
sigmab98.cpp: Sammy medal game updates
- Eliminate hack to force starting PC - Switch gocowboy over to KL5C80A12 CPU device with proper MMU emulation
This commit is contained in:
parent
658b1a47f8
commit
c3a77b9d73
@ -113,6 +113,7 @@ Notes:
|
||||
*************************************************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/z80/kl5c80a12.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/74165.h"
|
||||
#include "machine/eepromser.h"
|
||||
@ -218,14 +219,6 @@ protected:
|
||||
void sammymdl_hopper_w(uint8_t data);
|
||||
uint8_t sammymdl_coin_hopper_r();
|
||||
|
||||
void gocowboy_rombank_w(offs_t offset, uint8_t data);
|
||||
uint8_t gocowboy_rombank_r(offs_t offset);
|
||||
void gocowboy_rambank_w(offs_t offset, uint8_t data);
|
||||
uint8_t gocowboy_rambank_r(offs_t offset);
|
||||
void gocowboy_4400_w(offs_t offset, uint8_t data);
|
||||
uint8_t gocowboy_4400_r(offs_t offset);
|
||||
void gocowboy_dc00_w(offs_t offset, uint8_t data);
|
||||
uint8_t gocowboy_dc00_r(offs_t offset);
|
||||
void gocowboy_leds_w(uint8_t data);
|
||||
|
||||
void haekaka_rombank_w(offs_t offset, uint8_t data);
|
||||
@ -260,7 +253,6 @@ protected:
|
||||
void sammymdl_eeprom_w(uint8_t data);
|
||||
|
||||
DECLARE_MACHINE_RESET(sigmab98);
|
||||
DECLARE_MACHINE_RESET(sammymdl);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(screen_vblank_sammymdl);
|
||||
INTERRUPT_GEN_MEMBER(sigmab98_vblank_interrupt);
|
||||
@ -1483,7 +1475,8 @@ uint8_t sigmab98_state::sammymdl_coin_hopper_r()
|
||||
|
||||
void sigmab98_state::animalc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x3fff).rom();
|
||||
map(0x0000, 0x03ff).rom().region("mainbios", 0);
|
||||
map(0x0400, 0x3fff).rom();
|
||||
map(0x4000, 0x7fff).bankr("rombank");
|
||||
map(0x8000, 0x8fff).bankrw("rambank").share("nvram");
|
||||
|
||||
@ -1524,263 +1517,15 @@ void sigmab98_state::animalc_io(address_map &map)
|
||||
Go Go Cowboy
|
||||
***************************************************************************/
|
||||
|
||||
// rombank
|
||||
void sigmab98_state::gocowboy_rombank_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (offset == 0)
|
||||
{
|
||||
m_reg = data;
|
||||
return;
|
||||
}
|
||||
|
||||
switch ( m_reg )
|
||||
{
|
||||
case 0x50: // 4400
|
||||
m_rombank = data;
|
||||
switch (data)
|
||||
{
|
||||
case 0x13: // (17800) ROM
|
||||
case 0x15: // (19800) ROM
|
||||
break;
|
||||
default:
|
||||
logerror("%s: unknown rom bank = %02x, reg = %02x\n", machine().describe_context(), data, m_reg);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x90: // 4400
|
||||
m_rombank = data;
|
||||
switch (data)
|
||||
{
|
||||
case 0x0f: // (13c00) ROM
|
||||
break;
|
||||
case 0x17: // (1bc00) ROM
|
||||
break;
|
||||
default:
|
||||
logerror("%s: unknown rom bank = %02x, reg = %02x\n", machine().describe_context(), data, m_reg);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xd0: // 4400
|
||||
m_rombank = data;
|
||||
switch (data)
|
||||
{
|
||||
case 0x0f: // (14000) ROM
|
||||
break;
|
||||
|
||||
case 0x5b: // (60000) clears 4400-c3ff
|
||||
break;
|
||||
|
||||
case 0x5d: // (62000) copies 1404 bytes: 4400 <-> e6c6
|
||||
break;
|
||||
|
||||
case 0x6b: // (70000) SPRITERAM + (72000) PALETTERAM + (72800) VTABLE + (73000) VREGS
|
||||
break;
|
||||
|
||||
default:
|
||||
logerror("%s: unknown rom bank = %02x, reg = %02x\n", machine().describe_context(), data, m_reg);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
logerror("%s: unknown reg written: %02x = %02x\n", machine().describe_context(), m_reg, data);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t sigmab98_state::gocowboy_rombank_r(offs_t offset)
|
||||
{
|
||||
if (offset == 0)
|
||||
return m_reg;
|
||||
|
||||
switch ( m_reg )
|
||||
{
|
||||
case 0x50:
|
||||
case 0x90:
|
||||
case 0xd0:
|
||||
return m_rombank;
|
||||
|
||||
default:
|
||||
logerror("%s: unknown reg read: %02x\n", machine().describe_context(), m_reg);
|
||||
return 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t sigmab98_state::gocowboy_4400_r(offs_t offset)
|
||||
{
|
||||
switch (m_rombank)
|
||||
{
|
||||
// ROM
|
||||
case 0x0f:
|
||||
return memregion("maincpu")->base()[offset + 0x3800 + (m_reg >> 6) * 0x400];
|
||||
break;
|
||||
|
||||
case 0x13:
|
||||
return memregion("maincpu")->base()[offset + 0x7c00];
|
||||
break;
|
||||
|
||||
case 0x15:
|
||||
return memregion("maincpu")->base()[offset + 0x9c00];
|
||||
break;
|
||||
|
||||
case 0x17:
|
||||
return memregion("maincpu")->base()[offset + 0xc000];
|
||||
break;
|
||||
|
||||
case 0x5b: // (60000) clears 4400-c3ff
|
||||
return m_nvram[offset];
|
||||
break;
|
||||
|
||||
case 0x5d: // (62000) copies 1404 bytes: 4400 <-> e6c6
|
||||
if (offset + 0x2000 < 0x80000)
|
||||
return m_nvram[offset + 0x2000];
|
||||
break;
|
||||
|
||||
case 0x6b: // (70000) SPRITERAM + (72000) PALETTERAM + (72800) VTABLE + (73000) VREGS
|
||||
if (offset < 0x1000)
|
||||
return m_spriteram[offset];
|
||||
else if ((offset >= 0x2000) && (offset < 0x2200))
|
||||
return m_paletteram[offset - 0x2000];
|
||||
else if ((offset >= 0x2800) && (offset < 0x2880))
|
||||
return m_vtable[offset - 0x2800];
|
||||
else if (offset >= 0x3000 && offset <= 0x3021)
|
||||
return vregs_r(offset - 0x3000);
|
||||
break;
|
||||
}
|
||||
|
||||
logerror("%s: unknown read from %02x with rombank = %02x\n", machine().describe_context(), offset+0x4400, m_rombank);
|
||||
return 0x00;
|
||||
}
|
||||
|
||||
void sigmab98_state::gocowboy_4400_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
switch (m_rombank)
|
||||
{
|
||||
case 0x5b: // (60000) clears 4400-c3ff
|
||||
m_nvram[offset] = data;
|
||||
return;
|
||||
|
||||
case 0x5d: // (62000) copies 1404 bytes: 4400 <-> e6c6
|
||||
if (offset + 0x2000 < 0x80000)
|
||||
{
|
||||
m_nvram[offset + 0x2000] = data;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x6b: // (70000) SPRITERAM + (72000) PALETTERAM + (72800) VTABLE + (73000) VREGS
|
||||
if (offset < 0x1000)
|
||||
{
|
||||
m_spriteram[offset] = data;
|
||||
return;
|
||||
}
|
||||
else if ((offset >= 0x2000) && (offset < 0x2200))
|
||||
{
|
||||
m_palette->write8(offset-0x2000, data);
|
||||
return;
|
||||
}
|
||||
else if ((offset >= 0x2800) && (offset < 0x2880))
|
||||
{
|
||||
m_vtable[offset-0x2800] = data;
|
||||
return;
|
||||
}
|
||||
else if (offset >= 0x3000 && offset <= 0x3021)
|
||||
{
|
||||
vregs_w(offset - 0x3000, data);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
logerror("%s: unknown write to %02x = %02x with rombank = %02x\n", machine().describe_context(), offset + 0x4400, data, m_rombank);
|
||||
}
|
||||
|
||||
// rambank
|
||||
void sigmab98_state::gocowboy_rambank_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (offset == 0)
|
||||
{
|
||||
m_reg2 = data;
|
||||
return;
|
||||
}
|
||||
|
||||
switch ( m_reg2 )
|
||||
{
|
||||
case 0x76: // dc00
|
||||
m_rambank = data;
|
||||
switch (data)
|
||||
{
|
||||
case 0x52: // (60000) NVRAM
|
||||
break;
|
||||
|
||||
case 0x64: // (72000) PALETTERAM
|
||||
break;
|
||||
|
||||
default:
|
||||
logerror("%s: unknown ram bank = %02x, reg2 = %02x\n", machine().describe_context(), data, m_reg2);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
logerror("%s: unknown reg2 written: %02x = %02x\n", machine().describe_context(), m_reg2, data);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t sigmab98_state::gocowboy_rambank_r(offs_t offset)
|
||||
{
|
||||
if (offset == 0)
|
||||
return m_reg2;
|
||||
|
||||
switch ( m_reg2 )
|
||||
{
|
||||
case 0x76:
|
||||
return m_rambank;
|
||||
|
||||
default:
|
||||
logerror("%s: unknown reg2 read: %02x\n", machine().describe_context(), m_reg2);
|
||||
return 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t sigmab98_state::gocowboy_dc00_r(offs_t offset)
|
||||
{
|
||||
switch (m_rambank)
|
||||
{
|
||||
case 0x52: // (60000) NVRAM
|
||||
return m_nvram[offset];
|
||||
|
||||
case 0x64: // (72000) PALETTERAM
|
||||
return m_paletteram[offset];
|
||||
}
|
||||
|
||||
logerror("%s: unknown read from %02x with rombank = %02x\n", machine().describe_context(), offset + 0xdc00, m_rambank);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sigmab98_state::gocowboy_dc00_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
switch (m_rambank)
|
||||
{
|
||||
case 0x52: // (60000) NVRAM
|
||||
m_nvram[offset] = data;
|
||||
return;
|
||||
|
||||
case 0x64: // (72000) PALETTERAM
|
||||
m_palette->write8(offset, data);
|
||||
return;
|
||||
}
|
||||
|
||||
logerror("%s: unknown write to %02x = %02x with rambank = %02x\n", machine().describe_context(), offset + 0xdc00, data, m_rambank);
|
||||
}
|
||||
|
||||
void sigmab98_state::gocowboy_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x43ff).rom();
|
||||
|
||||
map(0x4400, 0xdbff).rw(FUNC(sigmab98_state::gocowboy_4400_r), FUNC(sigmab98_state::gocowboy_4400_w)); // SPRITERAM + PALETTERAM + VTABLE + VREGS | NVRAM
|
||||
|
||||
map(0xdc00, 0xfbff).rw(FUNC(sigmab98_state::gocowboy_dc00_r), FUNC(sigmab98_state::gocowboy_dc00_w)).share("nvram"); // PALETTERAM | NVRAM
|
||||
|
||||
map(0xfe00, 0xffff).ram(); // High speed internal RAM
|
||||
map(0x00000, 0x3ffff).rom().region("mainbios", 0);
|
||||
map(0x60000, 0x67fff).ram().share("nvram");
|
||||
map(0x70000, 0x70fff).ram().share("spriteram");
|
||||
map(0x72000, 0x721ff).ram().share("palette").w(m_palette, FUNC(palette_device::write8));
|
||||
map(0x72800, 0x7287f).ram().share("vtable");
|
||||
map(0x73000, 0x73021).ram().share("vregs").w(FUNC(sigmab98_state::vregs_w));
|
||||
map(0xffe00, 0xfffff).ram(); // High speed internal RAM
|
||||
}
|
||||
|
||||
|
||||
@ -1803,9 +1548,6 @@ void sigmab98_state::gocowboy_leds_w(uint8_t data)
|
||||
void sigmab98_state::gocowboy_io(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
map(0x02, 0x03).rw(FUNC(sigmab98_state::gocowboy_rombank_r), FUNC(sigmab98_state::gocowboy_rombank_w));
|
||||
map(0x04, 0x05).rw(FUNC(sigmab98_state::gocowboy_rambank_r), FUNC(sigmab98_state::gocowboy_rambank_w));
|
||||
|
||||
map(0x2c, 0x2c).rw(FUNC(sigmab98_state::sammymdl_eeprom_r), FUNC(sigmab98_state::sammymdl_eeprom_w));
|
||||
map(0x2e, 0x2e).r(FUNC(sigmab98_state::sammymdl_coin_hopper_r));
|
||||
map(0x30, 0x30).portr("BUTTON");
|
||||
@ -2040,7 +1782,8 @@ void sigmab98_state::haekaka_coin_counter_w(uint8_t data)
|
||||
|
||||
void sigmab98_state::haekaka_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x7fff).rom();
|
||||
map(0x0000, 0x03ff).rom().region("mainbios", 0);
|
||||
map(0x0400, 0x7fff).rom();
|
||||
map(0xb000, 0xcfff).rw(FUNC(sigmab98_state::haekaka_b000_r), FUNC(sigmab98_state::haekaka_b000_w));
|
||||
map(0xd000, 0xefff).ram().share("nvram");
|
||||
map(0xfe00, 0xffff).ram(); // High speed internal RAM
|
||||
@ -2280,7 +2023,8 @@ uint8_t sigmab98_state::itazuram_palette_r(offs_t offset)
|
||||
|
||||
void sigmab98_state::itazuram_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x37ff).rom();
|
||||
map(0x0000, 0x03ff).rom().region("mainbios", 0);
|
||||
map(0x0400, 0x37ff).rom();
|
||||
map(0x3800, 0x47ff).bankr("rombank0").bankw("sprbank0");
|
||||
map(0x4800, 0x57ff).bankr("rombank1").bankw("sprbank1");
|
||||
|
||||
@ -2521,7 +2265,8 @@ void sigmab98_state::tdoboon_c000_w(offs_t offset, uint8_t data)
|
||||
|
||||
void sigmab98_state::tdoboon_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0xbfff).rom();
|
||||
map(0x0000, 0x03ff).rom().region("mainbios", 0);
|
||||
map(0x0400, 0xbfff).rom();
|
||||
map(0xc000, 0xcfff).rw(FUNC(sigmab98_state::tdoboon_c000_r), FUNC(sigmab98_state::tdoboon_c000_w));
|
||||
map(0xd000, 0xefff).ram().share("nvram");
|
||||
map(0xfe00, 0xffff).ram(); // High speed internal RAM
|
||||
@ -2980,11 +2725,6 @@ void lufykzku_state::lufykzku(machine_config &config)
|
||||
Sammy Medal Games
|
||||
***************************************************************************/
|
||||
|
||||
MACHINE_RESET_MEMBER(sigmab98_state,sammymdl)
|
||||
{
|
||||
m_maincpu->set_state_int(Z80_PC, 0x400); // code starts at 400 ??? (000 = cart header)
|
||||
}
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(sigmab98_state::sammymdl_irq)
|
||||
{
|
||||
int scanline = param;
|
||||
@ -3007,8 +2747,6 @@ void sigmab98_state::sammymdl(machine_config &config)
|
||||
|
||||
TIMER(config, "scantimer").configure_scanline(FUNC(sigmab98_state::sammymdl_irq), "screen", 0, 1);
|
||||
|
||||
MCFG_MACHINE_RESET_OVERRIDE(sigmab98_state, sammymdl )
|
||||
|
||||
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // battery backed RAM
|
||||
EEPROM_93C46_8BIT(config, "eeprom");
|
||||
|
||||
@ -3053,6 +2791,7 @@ void sigmab98_state::gocowboy(machine_config &config)
|
||||
{
|
||||
sammymdl(config);
|
||||
|
||||
KL5C80A12(config.replace(), m_maincpu, XTAL(20'000'000) / 2);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::gocowboy_map);
|
||||
m_maincpu->set_addrmap(AS_IO, &sigmab98_state::gocowboy_io);
|
||||
|
||||
@ -3633,9 +3372,6 @@ ROM_START( gocowboy )
|
||||
ROM_REGION( 0x1000000, "oki", ROMREGION_ERASEFF )
|
||||
ROM_LOAD( "em702l01.u021", 0x000000, 0x200000, CRC(4c4289fe) SHA1(517b5a1e9d91e7ed322b4792d863e7abda835d4a) )
|
||||
|
||||
ROM_REGION( 0x40000, "maincpu", 0 )
|
||||
ROM_COPY( "mainbios", 0x00fc00, 0x00000, 0x40000 )
|
||||
|
||||
ROM_REGION( 0x200000, "sprites", 0 )
|
||||
ROM_LOAD( "em701l01.u016", 0x000000, 0x200000, CRC(c1f07320) SHA1(734717140e66ddcf0bded1489156c51cdaf1b50c) )
|
||||
|
||||
@ -3648,27 +3384,6 @@ ROM_END
|
||||
|
||||
void sigmab98_state::init_gocowboy()
|
||||
{
|
||||
// RAM banks
|
||||
m_paletteram.resize(0x200);
|
||||
memset(&m_paletteram[0], 0, 0x200);
|
||||
m_palette->basemem().set(m_paletteram, ENDIANNESS_BIG, 2);
|
||||
|
||||
m_nvram.allocate(0x8000);
|
||||
memset(m_nvram, 0, 0x8000);
|
||||
m_nvramdev->set_base(m_nvram, 0x8000);
|
||||
|
||||
m_spriteram.allocate(0x1000);
|
||||
memset(m_spriteram, 0, 0x1000);
|
||||
|
||||
m_vregs.allocate(0x22);
|
||||
memset(m_vregs, 0, 0x22);
|
||||
|
||||
m_vtable.allocate(0x80);
|
||||
memset(m_vtable, 0, 0x80);
|
||||
|
||||
m_rombank = 0x6b;
|
||||
m_rambank = 0x52;
|
||||
|
||||
m_vblank_vector = 0x00;
|
||||
m_timer0_vector = 0x02;
|
||||
m_timer1_vector = 0x16;
|
||||
@ -3863,4 +3578,4 @@ GAME( 2000, itazuram, sammymdl, itazuram, sammymdl, sigmab98_state, init_itazura
|
||||
GAME( 2000, pyenaget, sammymdl, pyenaget, sammymdl, sigmab98_state, init_haekaka, ROT0, "Sammy", "Pye-nage Taikai", 0 )
|
||||
GAME( 2000, tdoboon, sammymdl, tdoboon, haekaka, sigmab98_state, init_haekaka, ROT0, "Sammy", "Taihou de Doboon", 0 )
|
||||
GAME( 2001, haekaka, sammymdl, haekaka, haekaka, sigmab98_state, init_haekaka, ROT0, "Sammy", "Hae Hae Ka Ka Ka", 0 )
|
||||
GAME( 2003, gocowboy, sammymdl, gocowboy, gocowboy, sigmab98_state, init_gocowboy, ROT0, "Sammy", "Go Go Cowboy (English, prize)", 0 )
|
||||
GAME( 2003, gocowboy, 0, gocowboy, gocowboy, sigmab98_state, init_gocowboy, ROT0, "Sammy", "Go Go Cowboy (English, prize)", 0 )
|
||||
|
Loading…
Reference in New Issue
Block a user