mastboy.cpp : Minor cleanup, Move banked ram handler into address_map_bank_device, Fix RAMM err., Add notes, Replace gfx*/user* -> saner ROM areas (#3323)

This commit is contained in:
cam900 2018-03-14 04:42:33 +09:00 committed by Vas Crabb
parent d81e9378ee
commit 199db54ed8

View File

@ -441,25 +441,30 @@
#include "sound/saa1099.h"
#include "sound/msm5205.h"
#include "machine/74259.h"
#include "machine/bankdev.h"
#include "machine/eeprompar.h"
#include "screen.h"
#include "speaker.h"
#include <algorithm>
class mastboy_state : public driver_device
{
public:
mastboy_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_msm(*this, "msm"),
m_outlatch(*this, "outlatch"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_earom(*this, "earom") ,
m_workram(*this, "workram"),
m_tileram(*this, "tileram"),
m_colram(*this, "colram") { }
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_msm(*this, "msm")
, m_outlatch(*this, "outlatch")
, m_gfxdecode(*this, "gfxdecode")
, m_palette(*this, "palette")
, m_earom(*this, "earom")
, m_bank_c000(*this, "bank_c000")
, m_workram(*this, "workram")
, m_tileram(*this, "tileram")
, m_colram(*this, "colram")
, m_vram(*this, "vram")
{ }
required_device<cpu_device> m_maincpu;
required_device<msm5205_device> m_msm;
@ -467,19 +472,19 @@ public:
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<eeprom_parallel_28xx_device> m_earom;
required_device<address_map_bank_device> m_bank_c000;
required_shared_ptr<uint8_t> m_workram;
required_shared_ptr<uint8_t> m_tileram;
required_shared_ptr<uint8_t> m_colram;
required_shared_ptr<uint8_t> m_vram;
uint8_t* m_vram;
uint8_t m_bank;
int m_irq0_ack;
int m_m5205_next;
int m_m5205_part;
DECLARE_READ8_MEMBER(banked_ram_r);
DECLARE_WRITE8_MEMBER(banked_ram_w);
DECLARE_READ8_MEMBER(vram_r);
DECLARE_WRITE8_MEMBER(vram_w);
DECLARE_WRITE8_MEMBER(bank_w);
DECLARE_WRITE8_MEMBER(msm5205_data_w);
DECLARE_WRITE_LINE_MEMBER(irq0_ack_w);
@ -495,6 +500,7 @@ public:
INTERRUPT_GEN_MEMBER(interrupt);
void mastboy(machine_config &config);
void bank_c000_map(address_map &map);
void mastboy_io_map(address_map &map);
void mastboy_map(address_map &map);
};
@ -504,9 +510,6 @@ public:
void mastboy_state::video_start()
{
m_gfxdecode->gfx(0)->set_source(m_vram);
save_pointer(NAME(m_vram), 0x10000);
}
uint32_t mastboy_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@ -555,74 +558,25 @@ uint32_t mastboy_state::screen_update(screen_device &screen, bitmap_ind16 &bitma
/* Access to Banked RAM */
READ8_MEMBER(mastboy_state::banked_ram_r)
READ8_MEMBER(mastboy_state::vram_r)
{
if ((m_bank&0x80) == 0x00)
{
int bank;
bank = m_bank & 0x07;
//if (m_bank&0xf8) printf("invalid bank bits in vram/vrom read\n");
if (bank>0x3) // ROM access
{
uint8_t *src = memregion( "gfx1" )->base();
bank &=0x3;
return src[offset+(bank*0x4000)];
}
else
{
bank &=0x3;
/* we have to invert the data for the GFX decode */
return m_vram[offset+(bank*0x4000)]^0xff;
}
}
else
{
uint8_t *src;
int bank;
bank = m_bank & 0x7f;
src = memregion ( "user1" )->base() + bank * 0x4000;
return src[offset];
}
/* we have to invert the data for the GFX decode */
return m_vram[offset]^0xff;
}
WRITE8_MEMBER(mastboy_state::banked_ram_w)
WRITE8_MEMBER(mastboy_state::vram_w)
{
if ((m_bank&0x80) == 0x00)
{
int bank;
bank = m_bank & 0x07;
//if (data&0xf8) printf("invalid bank bits in vram/vrom write\n");
/* we have to invert the data for the GFX decode */
m_vram[offset] = data^0xff;
if (bank>0x3) // ROM access
{
logerror("Attempting to WRITE to VROM\n");
}
else
{
/* write to the RAM based tile data */
int offs;
bank &=0x3;
offs = offset+(bank*0x4000);
/* we have to invert the data for the GFX decode */
m_vram[offs] = data^0xff;
/* Decode the new tile */
m_gfxdecode->gfx(0)->mark_dirty(offs/32);
}
}
else
{
logerror("attempt to write %02x to banked area with BANKED ROM selected\n",data);
}
/* Decode the new tile */
m_gfxdecode->gfx(0)->mark_dirty(offset/32);
}
WRITE8_MEMBER(mastboy_state::bank_w)
{
// controls access to banked ram / rom
m_bank = data;
m_bank_c000->set_bank(data);
}
/* MSM5205 Related */
@ -670,7 +624,7 @@ ADDRESS_MAP_START(mastboy_state::mastboy_map)
AM_RANGE(0x9000, 0x9fff) AM_RAM AM_SHARE("tileram")// tilemap ram
AM_RANGE(0xa000, 0xa1ff) AM_RAM AM_SHARE("colram") AM_MIRROR(0x0e00) // colour ram
AM_RANGE(0xc000, 0xffff) AM_READWRITE(banked_ram_r,banked_ram_w) // mastboy bank area read / write
AM_RANGE(0xc000, 0xffff) AM_DEVICE("bank_c000", address_map_bank_device, amap8)
AM_RANGE(0xff000, 0xff7ff) AM_DEVREADWRITE("earom", eeprom_parallel_28xx_device, read, write)
@ -687,6 +641,13 @@ ADDRESS_MAP_START(mastboy_state::mastboy_map)
AM_RANGE(0xffc00, 0xfffff) AM_RAM // Internal RAM
ADDRESS_MAP_END
// TODO : banked map is mirrored?
ADDRESS_MAP_START(mastboy_state::bank_c000_map)
AM_RANGE(0x000000, 0x00ffff) AM_MIRROR(0x1e0000) AM_READWRITE(vram_r, vram_w) AM_SHARE("vram")
AM_RANGE(0x010000, 0x01ffff) AM_MIRROR(0x1e0000) AM_ROM AM_REGION("vrom", 0)
AM_RANGE(0x200000, 0x3fffff) AM_ROM AM_REGION("bankedrom", 0)
ADDRESS_MAP_END
/* Ports */
READ8_MEMBER(mastboy_state::port_38_read)
@ -816,17 +777,14 @@ static const gfx_layout tiles8x8_layout_2 =
static GFXDECODE_START( mastboy )
GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, tiles8x8_layout_2, 0, 16 )
GFXDECODE_RAM( "vram", 0, tiles8x8_layout, 0, 16 )
GFXDECODE_ENTRY( "vrom", 0, tiles8x8_layout_2, 0, 16 )
GFXDECODE_END
/* Machine Functions / Driver */
void mastboy_state::machine_start()
{
m_vram = memregion( "gfx1" )->base(); // makes decoding the RAM based tiles easier this way
save_item(NAME(m_bank));
save_item(NAME(m_irq0_ack));
save_item(NAME(m_m5205_next));
save_item(NAME(m_m5205_part));
@ -835,10 +793,10 @@ void mastboy_state::machine_start()
void mastboy_state::machine_reset()
{
/* clear some ram */
memset( m_workram, 0x00, 0x01000);
memset( m_tileram, 0x00, 0x01000);
memset( m_colram, 0x00, 0x00200);
memset( m_vram, 0x00, 0x10000);
std::fill(&m_workram[0], &m_workram[m_workram.bytes()], 0);
std::fill(&m_tileram[0], &m_tileram[m_tileram.bytes()], 0);
std::fill(&m_colram[0], &m_colram[m_colram.bytes()], 0);
std::fill(&m_vram[0], &m_vram[m_vram.bytes()], 0);
}
@ -858,6 +816,13 @@ MACHINE_CONFIG_START(mastboy_state::mastboy)
MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(DEVWRITELINE("msm", msm5205_device, reset_w))
MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(DEVWRITELINE("earom", eeprom_parallel_28xx_device, oe_w))
MCFG_DEVICE_ADD("bank_c000", ADDRESS_MAP_BANK, 0)
MCFG_DEVICE_PROGRAM_MAP(bank_c000_map)
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8)
MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(22)
MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(6000000.0f / 384.0f / 282.0f)
@ -870,7 +835,6 @@ MACHINE_CONFIG_START(mastboy_state::mastboy)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", mastboy)
MCFG_PALETTE_ADD("palette", 0x100)
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SAA1099_ADD("saa", 6000000 )
@ -892,13 +856,10 @@ ROM_START( mastboy )
ROM_CONTINUE( 0x04000, 0x4000 )
ROM_CONTINUE( 0x04000, 0x4000 ) // only the last 16kb matters
ROM_REGION( 0x10000, "gfx1", ROMREGION_ERASE00 ) /* RAM accessed by the video chip */
/* 0x00000 - 0x0ffff = banked ram */
ROM_REGION( 0x10000, "gfx2", ROMREGION_INVERT ) /* ROM accessed by the video chip */
ROM_REGION( 0x10000, "vrom", ROMREGION_INVERT ) /* ROM accessed by the video chip */
ROM_LOAD( "04.bin", 0x00000, 0x10000, CRC(565932f4) SHA1(4b184aa445b5671072031ad4a2ccb13868d6d3a4) )
ROM_REGION( 0x200000, "user1", 0 ) /* banked data - 8 banks, 6 'question' slots */
ROM_REGION( 0x200000, "bankedrom", 0 ) /* banked data - 8 banks, 6 'question' slots */
ROM_LOAD( "01.bin", 0x000000, 0x040000, CRC(36755831) SHA1(706fba5fc765502774643bfef8a3c9d2c01eb01b) ) // 99% gfx
ROM_LOAD( "02.bin", 0x040000, 0x020000, CRC(69cf6b7c) SHA1(a7bdc62051d09636dcd54db102706a9b42465e63) ) // data
ROM_RELOAD( 0x060000, 0x020000) // 128kb roms are mirrored
@ -932,13 +893,10 @@ ROM_START( mastboya )
ROM_CONTINUE( 0x04000, 0x4000 )
ROM_CONTINUE( 0x04000, 0x4000 ) // only the last 16kb matters
ROM_REGION( 0x10000, "gfx1", ROMREGION_ERASE00 ) /* RAM accessed by the video chip */
/* 0x00000 - 0x0ffff = banked ram */
ROM_REGION( 0x10000, "gfx2", ROMREGION_INVERT ) /* ROM accessed by the video chip */
ROM_REGION( 0x10000, "vrom", ROMREGION_INVERT ) /* ROM accessed by the video chip */
ROM_LOAD( "04.bin", 0x00000, 0x10000, CRC(565932f4) SHA1(4b184aa445b5671072031ad4a2ccb13868d6d3a4) )
ROM_REGION( 0x200000, "user1", 0 ) /* banked data - 8 banks, 6 'question' slots */
ROM_REGION( 0x200000, "bankedrom", 0 ) /* banked data - 8 banks, 6 'question' slots */
ROM_LOAD( "01.bin", 0x000000, 0x040000, CRC(36755831) SHA1(706fba5fc765502774643bfef8a3c9d2c01eb01b) ) // 99% gfx
ROM_LOAD( "02.bin", 0x040000, 0x020000, CRC(69cf6b7c) SHA1(a7bdc62051d09636dcd54db102706a9b42465e63) ) // data
ROM_RELOAD( 0x060000, 0x020000) // 128kb roms are mirrored
@ -972,13 +930,10 @@ ROM_START( mastboyi )
ROM_CONTINUE( 0x04000, 0x4000 )
ROM_CONTINUE( 0x04000, 0x4000 ) // only the last 16kb matters
ROM_REGION( 0x10000, "gfx1", ROMREGION_ERASE00 ) /* RAM accessed by the video chip */
/* 0x00000 - 0x0ffff = banked ram */
ROM_REGION( 0x10000, "gfx2", ROMREGION_INVERT ) /* ROM accessed by the video chip */
ROM_REGION( 0x10000, "vrom", ROMREGION_INVERT ) /* ROM accessed by the video chip */
ROM_LOAD( "4.ic91", 0x00000, 0x10000, CRC(858d7b27) SHA1(b0ddf49df5665003f3616d67f7fc27408433483b) )
ROM_REGION( 0x200000, "user1", 0 ) /* question data - 6 sockets */
ROM_REGION( 0x200000, "bankedrom", 0 ) /* question data - 6 sockets */
ROM_LOAD( "1-mem-c.ic75", 0x000000, 0x040000, CRC(7c7b1cc5) SHA1(73ad7bdb61d1f99ce09ef3a5a3ae0f1e72364eee) ) // 99% gfx
ROM_LOAD( "2-mem-b.ic76", 0x040000, 0x020000, CRC(87015c18) SHA1(a16bf2707ce847da0923662796195b75719a6d77) ) // data
ROM_RELOAD( 0x060000, 0x020000) // 128kb roms are mirrored
@ -1010,13 +965,10 @@ ROM_START( mastboyia )
ROM_CONTINUE( 0x04000, 0x4000 )
ROM_CONTINUE( 0x04000, 0x4000 ) // only the last 16kb matters
ROM_REGION( 0x10000, "gfx1", ROMREGION_ERASE00 ) /* RAM accessed by the video chip */
/* 0x00000 - 0x0ffff = banked ram */
ROM_REGION( 0x10000, "vrom", ROMREGION_INVERT ) /* ROM accessed by the video chip */
ROM_LOAD( "4.ic91", 0x00000, 0x10000, BAD_DUMP CRC(858d7b27) SHA1(b0ddf49df5665003f3616d67f7fc27408433483b) ) // RAMM err.
ROM_REGION( 0x10000, "gfx2", ROMREGION_INVERT ) /* ROM accessed by the video chip */
ROM_LOAD( "4.ic91", 0x00000, 0x10000, CRC(858d7b27) SHA1(b0ddf49df5665003f3616d67f7fc27408433483b) )
ROM_REGION( 0x200000, "user1", 0 ) /* question data - 6 sockets */
ROM_REGION( 0x200000, "bankedrom", 0 ) /* question data - 6 sockets */
ROM_LOAD( "1-mem-c.ic75", 0x000000, 0x040000, CRC(7c7b1cc5) SHA1(73ad7bdb61d1f99ce09ef3a5a3ae0f1e72364eee) ) // 99% gfx
ROM_LOAD( "2-mem-b.ic76", 0x040000, 0x020000, CRC(87015c18) SHA1(a16bf2707ce847da0923662796195b75719a6d77) ) // data
ROM_RELOAD( 0x060000, 0x020000) // 128kb roms are mirrored