mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
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:
parent
d81e9378ee
commit
199db54ed8
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user