tiki100: Used PROM for memory mapping. [Curt Coder]

This commit is contained in:
Curt Coder 2015-10-09 22:14:43 +03:00
parent c18820c99d
commit 93d9d28df9
2 changed files with 63 additions and 82 deletions

View File

@ -30,67 +30,55 @@
/* Memory Banking */
READ8_MEMBER( tiki100_state::gfxram_r )
READ8_MEMBER( tiki100_state::read )
{
UINT16 addr = (offset + (m_scroll << 7)) & TIKI100_VIDEORAM_MASK;
int mdis = 1;
offs_t prom_addr = mdis << 5 | m_vire << 4 | m_rome << 3 | (offset >> 13);
UINT8 prom = m_prom->base()[prom_addr] ^ 0xff;
return m_video_ram[addr];
}
UINT8 data = 0xff;
WRITE8_MEMBER( tiki100_state::gfxram_w )
{
UINT16 addr = (offset + (m_scroll << 7)) & TIKI100_VIDEORAM_MASK;
m_video_ram[addr] = data;
}
void tiki100_state::bankswitch()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
if (m_vire)
if (prom & ROM0)
{
if (!m_rome)
{
/* reserved */
program.unmap_readwrite(0x0000, 0xffff);
}
else
{
/* GFXRAM, GFXRAM, RAM */
program.install_readwrite_handler(0x0000, 0x7fff, READ8_DELEGATE(tiki100_state, gfxram_r), WRITE8_DELEGATE(tiki100_state, gfxram_w));
program.install_readwrite_bank(0x8000, 0xffff, "bank3");
membank("bank1")->set_entry(BANK_VIDEO_RAM);
membank("bank2")->set_entry(BANK_VIDEO_RAM);
membank("bank3")->set_entry(BANK_RAM);
}
data = m_rom->base()[offset & 0x3fff];
}
else
if (prom & ROM1)
{
if (!m_rome)
{
/* ROM, RAM, RAM */
program.install_read_bank(0x0000, 0x3fff, "bank1");
program.unmap_write(0x0000, 0x3fff);
program.install_readwrite_bank(0x4000, 0x7fff, "bank2");
program.install_readwrite_bank(0x8000, 0xffff, "bank3");
data = m_rom->base()[0x2000 | (offset & 0x3fff)];
}
membank("bank1")->set_entry(BANK_ROM);
membank("bank2")->set_entry(BANK_RAM);
membank("bank3")->set_entry(BANK_RAM);
}
else
{
/* RAM, RAM, RAM */
program.install_readwrite_bank(0x0000, 0x3fff, "bank1");
program.install_readwrite_bank(0x4000, 0x7fff, "bank2");
program.install_readwrite_bank(0x8000, 0xffff, "bank3");
if (prom & VIR)
{
UINT16 addr = (offset + (m_scroll << 7)) & TIKI100_VIDEORAM_MASK;
membank("bank1")->set_entry(BANK_RAM);
membank("bank2")->set_entry(BANK_RAM);
membank("bank3")->set_entry(BANK_RAM);
}
data = m_video_ram[addr];
}
if (prom & RAM)
{
data = m_ram->pointer()[offset];
}
return data;
}
WRITE8_MEMBER( tiki100_state::write )
{
int mdis = 1;
offs_t prom_addr = mdis << 5 | m_vire << 4 | m_rome << 3 | (offset >> 13);
UINT8 prom = m_prom->base()[prom_addr] ^ 0xff;
if (prom & VIR)
{
UINT16 addr = (offset + (m_scroll << 7)) & TIKI100_VIDEORAM_MASK;
m_video_ram[addr] = data;
}
if (prom & RAM)
{
m_ram->pointer()[offset] = data;
}
}
@ -215,17 +203,13 @@ WRITE8_MEMBER( tiki100_state::system_w )
/* bankswitch */
m_rome = BIT(data, 2);
m_vire = BIT(data, 3);
bankswitch();
}
/* Memory Maps */
static ADDRESS_MAP_START( tiki100_mem, AS_PROGRAM, 8, tiki100_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0x3fff) AM_RAMBANK("bank1")
AM_RANGE(0x4000, 0x7fff) AM_RAMBANK("bank2")
AM_RANGE(0x8000, 0xffff) AM_RAMBANK("bank3")
AM_RANGE(0x0000, 0xffff) AM_READWRITE(read, write)
ADDRESS_MAP_END
static ADDRESS_MAP_START( tiki100_io, AS_IO, 8, tiki100_state )
@ -601,20 +585,6 @@ void tiki100_state::machine_start()
/* allocate video RAM */
m_video_ram.allocate(TIKI100_VIDEORAM_SIZE);
/* setup memory banking */
UINT8 *ram = m_ram->pointer();
membank("bank1")->configure_entry(BANK_ROM, m_rom->base());
membank("bank1")->configure_entry(BANK_RAM, ram);
membank("bank1")->configure_entry(BANK_VIDEO_RAM, m_video_ram);
membank("bank2")->configure_entry(BANK_RAM, ram + 0x4000);
membank("bank2")->configure_entry(BANK_VIDEO_RAM, m_video_ram + 0x4000);
membank("bank3")->configure_entry(BANK_RAM, ram + 0x8000);
bankswitch();
/* register for state saving */
save_item(NAME(m_rome));
save_item(NAME(m_vire));
@ -718,15 +688,15 @@ MACHINE_CONFIG_END
/* ROMs */
ROM_START( kontiki )
ROM_REGION( 0x10000, Z80_TAG, ROMREGION_ERASEFF )
ROM_REGION( 0x4000, Z80_TAG, ROMREGION_ERASEFF )
ROM_LOAD( "tikirom-1.30.u10", 0x0000, 0x2000, CRC(c482dcaf) SHA1(d140706bb7fc8b1fbb37180d98921f5bdda73cf9) )
ROM_REGION( 0x100, "proms", 0 )
ROM_REGION( 0x100, "u4", 0 )
ROM_LOAD( "53ls140.u4", 0x000, 0x100, CRC(894b756f) SHA1(429e10de0e0e749246895801b18186ff514c12bc) )
ROM_END
ROM_START( tiki100 )
ROM_REGION( 0x10000, Z80_TAG, ROMREGION_ERASEFF )
ROM_REGION( 0x4000, Z80_TAG, ROMREGION_ERASEFF )
ROM_DEFAULT_BIOS( "v203w" )
ROM_SYSTEM_BIOS( 0, "v135", "TIKI ROM v1.35" )
@ -734,7 +704,7 @@ ROM_START( tiki100 )
ROM_SYSTEM_BIOS( 1, "v203w", "TIKI ROM v2.03 W" )
ROMX_LOAD( "tikirom-2.03w.u10", 0x0000, 0x2000, CRC(79662476) SHA1(96336633ecaf1b2190c36c43295ac9f785d1f83a), ROM_BIOS(2) )
ROM_REGION( 0x100, "proms", 0 )
ROM_REGION( 0x100, "u4", 0 )
ROM_LOAD( "53ls140.u4", 0x000, 0x100, CRC(894b756f) SHA1(429e10de0e0e749246895801b18186ff514c12bc) )
ROM_REGION( 0x1000, "8088", 0 )

View File

@ -41,8 +41,8 @@
class tiki100_state : public driver_device
{
public:
tiki100_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
tiki100_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, Z80_TAG),
m_ctc(*this, Z80CTC_TAG),
m_fdc(*this, FD1797_TAG),
@ -54,6 +54,7 @@ public:
m_cassette(*this, CASSETTE_TAG),
m_centronics(*this, CENTRONICS_TAG),
m_rom(*this, Z80_TAG),
m_prom(*this, "u4"),
m_video_ram(*this, "video_ram"),
m_y1(*this, "Y1"),
m_y2(*this, "Y2"),
@ -67,7 +68,9 @@ public:
m_y10(*this, "Y10"),
m_y11(*this, "Y11"),
m_y12(*this, "Y12"),
m_palette(*this, "palette")
m_palette(*this, "palette"),
m_rome(1),
m_vire(1)
{ }
required_device<cpu_device> m_maincpu;
@ -81,6 +84,7 @@ public:
required_device<cassette_image_device> m_cassette;
required_device<centronics_device> m_centronics;
required_memory_region m_rom;
required_memory_region m_prom;
optional_shared_ptr<UINT8> m_video_ram;
required_ioport m_y1;
required_ioport m_y2;
@ -101,8 +105,9 @@ public:
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_READ8_MEMBER( gfxram_r );
DECLARE_WRITE8_MEMBER( gfxram_w );
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_READ8_MEMBER( keyboard_r );
DECLARE_WRITE8_MEMBER( keyboard_w );
DECLARE_WRITE8_MEMBER( video_mode_w );
@ -117,7 +122,13 @@ public:
DECLARE_FLOPPY_FORMATS( floppy_formats );
void bankswitch();
enum
{
ROM0 = 0x01,
ROM1 = 0x02,
VIR = 0x04,
RAM = 0x08
};
/* memory state */
int m_rome;