added 32bit rom accesses to generic slot and converted pockstat and

casloopy to use the slot code. nw.
This commit is contained in:
Fabio Priuli 2014-09-21 07:43:38 +00:00
parent b6e9d10294
commit 6ce39d0260
6 changed files with 145 additions and 96 deletions

View File

@ -10,7 +10,6 @@
TODO:
- possibly support linear mapping when non-power of 2 ROMs are mapped
- add support for 32bit ROM access
***********************************************************************************************************/
@ -64,6 +63,15 @@ READ16_MEMBER(generic_rom_plain_device::read16_rom)
return 0xffff;
}
READ32_MEMBER(generic_rom_plain_device::read32_rom)
{
UINT32 *ROM = (UINT32 *)m_rom;
if (offset < m_rom_size/4)
return ROM[offset];
else
return 0xffffffff;
}
READ8_MEMBER(generic_rom_linear_device::read_rom)
{
@ -76,3 +84,9 @@ READ16_MEMBER(generic_rom_linear_device::read16_rom)
return ROM[offset % (m_rom_size/2)];
}
READ32_MEMBER(generic_rom_linear_device::read32_rom)
{
UINT32 *ROM = (UINT32 *)m_rom;
return ROM[offset % (m_rom_size/4)];
}

View File

@ -29,6 +29,7 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
virtual DECLARE_READ16_MEMBER(read16_rom);
virtual DECLARE_READ32_MEMBER(read32_rom);
};
@ -43,6 +44,7 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
virtual DECLARE_READ16_MEMBER(read16_rom);
virtual DECLARE_READ32_MEMBER(read32_rom);
};

View File

@ -245,6 +245,18 @@ READ16_MEMBER(generic_slot_device::read16_rom)
return 0xffff;
}
/*-------------------------------------------------
read32_rom
-------------------------------------------------*/
READ32_MEMBER(generic_slot_device::read32_rom)
{
if (m_cart)
return m_cart->read32_rom(space, offset, mem_mask);
else
return 0xffffffff;
}
/*-------------------------------------------------
read_ram
-------------------------------------------------*/

View File

@ -18,6 +18,7 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; }
virtual DECLARE_READ16_MEMBER(read16_rom) { return 0xffff; }
virtual DECLARE_READ32_MEMBER(read32_rom) { return 0xffffffff; }
virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; }
virtual DECLARE_WRITE8_MEMBER(write_ram) {};
@ -41,7 +42,8 @@ public:
enum
{
GENERIC_ROM8_WIDTH = 1,
GENERIC_ROM16_WIDTH
GENERIC_ROM16_WIDTH = 2,
GENERIC_ROM32_WIDTH = 4
};
#define GENERIC_ROM_REGION_TAG ":cart:rom"
@ -120,6 +122,7 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
virtual DECLARE_READ16_MEMBER(read16_rom);
virtual DECLARE_READ32_MEMBER(read32_rom);
virtual DECLARE_READ8_MEMBER(read_ram);
virtual DECLARE_WRITE8_MEMBER(write_ram);

View File

@ -150,7 +150,8 @@ PCB 'Z545-1 A240570-1'
#include "emu.h"
#include "cpu/sh2/sh2.h"
//#include "cpu/v60/v60.h"
#include "imagedev/cartslot.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
class casloopy_state : public driver_device
@ -161,11 +162,17 @@ public:
m_bios_rom(*this, "bios_rom"),
m_vregs(*this, "vregs"),
m_maincpu(*this, "maincpu"),
m_cart(*this, "cartslot"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette") { }
required_shared_ptr<UINT32> m_bios_rom;
required_shared_ptr<UINT32> m_vregs;
required_device<cpu_device> m_maincpu;
required_device<generic_slot_device> m_cart;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
UINT16 *m_paletteram;
UINT8 *m_vram;
UINT8 *m_bitmap_vram;
@ -176,19 +183,18 @@ public:
virtual void machine_reset();
virtual void video_start();
UINT32 screen_update_casloopy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_READ16_MEMBER(casloopy_vregs_r);
DECLARE_WRITE16_MEMBER(casloopy_vregs_w);
DECLARE_READ16_MEMBER(casloopy_pal_r);
DECLARE_WRITE16_MEMBER(casloopy_pal_w);
DECLARE_READ8_MEMBER(casloopy_vram_r);
DECLARE_WRITE8_MEMBER(casloopy_vram_w);
DECLARE_READ16_MEMBER(vregs_r);
DECLARE_WRITE16_MEMBER(vregs_w);
DECLARE_READ16_MEMBER(pal_r);
DECLARE_WRITE16_MEMBER(pal_w);
DECLARE_READ8_MEMBER(vram_r);
DECLARE_WRITE8_MEMBER(vram_w);
DECLARE_READ32_MEMBER(cart_r);
DECLARE_READ16_MEMBER(sh7021_r);
DECLARE_WRITE16_MEMBER(sh7021_w);
DECLARE_READ8_MEMBER(casloopy_bitmap_r);
DECLARE_WRITE8_MEMBER(casloopy_bitmap_w);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
DECLARE_READ8_MEMBER(bitmap_r);
DECLARE_WRITE8_MEMBER(bitmap_w);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(loopy_cart);
};
@ -292,7 +298,7 @@ UINT32 casloopy_state::screen_update_casloopy(screen_device &screen, bitmap_ind1
return 0;
}
READ16_MEMBER(casloopy_state::casloopy_vregs_r)
READ16_MEMBER(casloopy_state::vregs_r)
{
if(offset == 4/2)
{
@ -310,18 +316,18 @@ READ16_MEMBER(casloopy_state::casloopy_vregs_r)
return 0xffff;
}
WRITE16_MEMBER(casloopy_state::casloopy_vregs_w)
WRITE16_MEMBER(casloopy_state::vregs_w)
{
if(offset != 6/2)
printf("%08x %08x\n",offset*2,data);
}
READ16_MEMBER(casloopy_state::casloopy_pal_r)
READ16_MEMBER(casloopy_state::pal_r)
{
return m_paletteram[offset];
}
WRITE16_MEMBER(casloopy_state::casloopy_pal_w)
WRITE16_MEMBER(casloopy_state::pal_w)
{
int r,g,b;
COMBINE_DATA(&m_paletteram[offset]);
@ -333,12 +339,12 @@ WRITE16_MEMBER(casloopy_state::casloopy_pal_w)
m_palette->set_pen_color(offset, pal5bit(r), pal5bit(g), pal5bit(b));
}
READ8_MEMBER(casloopy_state::casloopy_vram_r)
READ8_MEMBER(casloopy_state::vram_r)
{
return m_vram[offset];
}
WRITE8_MEMBER(casloopy_state::casloopy_vram_w)
WRITE8_MEMBER(casloopy_state::vram_w)
{
m_vram[offset] = data;
@ -387,31 +393,37 @@ WRITE16_MEMBER(casloopy_state::sh7021_w)
// printf("%08x %04x\n",sh7021_regs[offset],0x05ffff00+offset*2);
}
READ8_MEMBER(casloopy_state::casloopy_bitmap_r)
READ8_MEMBER(casloopy_state::bitmap_r)
{
return m_bitmap_vram[offset];
}
WRITE8_MEMBER(casloopy_state::casloopy_bitmap_w)
WRITE8_MEMBER(casloopy_state::bitmap_w)
{
m_bitmap_vram[offset] = data;
}
READ32_MEMBER(casloopy_state::cart_r)
{
return m_cart->read32_rom(space, offset, mem_mask);
}
static ADDRESS_MAP_START( casloopy_map, AS_PROGRAM, 32, casloopy_state )
AM_RANGE(0x00000000, 0x00007fff) AM_RAM AM_SHARE("bios_rom")
AM_RANGE(0x01000000, 0x0107ffff) AM_RAM AM_SHARE("wram")// stack pointer points here
AM_RANGE(0x04000000, 0x0401ffff) AM_READWRITE8(casloopy_bitmap_r,casloopy_bitmap_w,0xffffffff)
AM_RANGE(0x04040000, 0x0404ffff) AM_READWRITE8(casloopy_vram_r,casloopy_vram_w,0xffffffff) // tilemap + PCG
AM_RANGE(0x04000000, 0x0401ffff) AM_READWRITE8(bitmap_r, bitmap_w, 0xffffffff)
AM_RANGE(0x04040000, 0x0404ffff) AM_READWRITE8(vram_r, vram_w, 0xffffffff) // tilemap + PCG
AM_RANGE(0x04050000, 0x040503ff) AM_RAM // ???
AM_RANGE(0x04051000, 0x040511ff) AM_READWRITE16(casloopy_pal_r,casloopy_pal_w,0xffffffff)
AM_RANGE(0x04058000, 0x04058007) AM_READWRITE16(casloopy_vregs_r,casloopy_vregs_w,0xffffffff)
AM_RANGE(0x04051000, 0x040511ff) AM_READWRITE16(pal_r, pal_w, 0xffffffff)
AM_RANGE(0x04058000, 0x04058007) AM_READWRITE16(vregs_r, vregs_w, 0xffffffff)
AM_RANGE(0x0405b000, 0x0405b00f) AM_RAM AM_SHARE("vregs") // RGB555 brightness control plus scrolling
AM_RANGE(0x05ffff00, 0x05ffffff) AM_READWRITE16(sh7021_r,sh7021_w,0xffffffff)
AM_RANGE(0x05ffff00, 0x05ffffff) AM_READWRITE16(sh7021_r, sh7021_w, 0xffffffff)
// AM_RANGE(0x05ffff00, 0x05ffffff) - SH7021 internal i/o
AM_RANGE(0x06000000, 0x061fffff) AM_ROM AM_REGION("rom_cart",0)
AM_RANGE(0x06000000, 0x061fffff) AM_READ(cart_r)
AM_RANGE(0x07000000, 0x070003ff) AM_RAM AM_SHARE("oram")// on-chip RAM, actually at 0xf000000 (1 kb)
AM_RANGE(0x09000000, 0x0907ffff) AM_RAM AM_SHARE("wram")
AM_RANGE(0x0e000000, 0x0e1fffff) AM_ROM AM_REGION("rom_cart",0)
AM_RANGE(0x0e000000, 0x0e1fffff) AM_READ(cart_r)
AM_RANGE(0x0f000000, 0x0f0003ff) AM_RAM AM_SHARE("oram")
ADDRESS_MAP_END
@ -424,22 +436,8 @@ ADDRESS_MAP_END
static INPUT_PORTS_START( casloopy )
INPUT_PORTS_END
/* TODO: move this into DEVICE_IMAGE_LOAD_MEMBER */
void casloopy_state::machine_start()
{
UINT8 *SRC = memregion("cart")->base();
UINT8 *DST = memregion("rom_cart")->base();
// fix endianness
for (int i=0;i<0x200000;i+=4)
{
UINT8 tempa = SRC[i+0];
UINT8 tempb = SRC[i+1];
DST[i+0] = SRC[i+2];
DST[i+1] = SRC[i+3];
DST[i+2] = tempa;
DST[i+3] = tempb;
}
}
void casloopy_state::machine_reset()
@ -474,7 +472,32 @@ static const gfx_layout casloopy_8bpp_layoutROM =
#endif
DEVICE_IMAGE_LOAD_MEMBER( casloopy_state, loopy_cart )
{
UINT32 size = m_cart->common_get_size("rom");
UINT8 *SRC, *DST;
dynamic_buffer temp;
temp.resize(0x200000);
m_cart->rom_alloc(size, GENERIC_ROM32_WIDTH);
SRC = temp;
DST = m_cart->get_rom_base();
m_cart->common_load_rom(temp, size, "rom");
// fix endianness
for (int i = 0; i < 0x200000; i += 4)
{
UINT8 tempa = SRC[i + 0];
UINT8 tempb = SRC[i + 1];
DST[i + 0] = SRC[i + 2];
DST[i + 1] = SRC[i + 3];
DST[i + 2] = tempa;
DST[i + 3] = tempb;
}
return IMAGE_INIT_PASS;
}
static MACHINE_CONFIG_START( casloopy, casloopy_state )
@ -500,10 +523,10 @@ static MACHINE_CONFIG_START( casloopy, casloopy_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", empty)
MCFG_CARTSLOT_ADD("cart")
MCFG_CARTSLOT_EXTENSION_LIST("ic1,bin")
MCFG_CARTSLOT_MANDATORY
MCFG_CARTSLOT_INTERFACE("loopy_cart")
MCFG_GENERIC_CARTSLOT_ADD("cartslot", GENERIC_ROM32_WIDTH, generic_plain_slot, "loopy_cart")
MCFG_GENERIC_EXTENSIONS("bin,ic1")
MCFG_GENERIC_MANDATORY
MCFG_GENERIC_LOAD(casloopy_state, loopy_cart)
/* software lists */
MCFG_SOFTWARE_LIST_ADD("cart_list","casloopy")
@ -524,11 +547,6 @@ ROM_START( casloopy )
ROM_REGION( 0x80000, "subcpu", 0) //NEC CDT-109
ROM_LOAD( "bios2.lsi352", 0x0000, 0x80000, CRC(8f51fa17) SHA1(99f50be06b083fdb07e08f30b0b26d9037afc869) )
ROM_REGION( 0x200000, "cart", 0 )
ROM_CART_LOAD("cart", 0x00000, 0x200000, ROM_NOMIRROR)
ROM_REGION( 0x200000, "rom_cart", ROMREGION_ERASE00 )
ROM_END
DRIVER_INIT_MEMBER(casloopy_state,casloopy)

View File

@ -41,9 +41,11 @@ If you do nothing for about 20 secs, it turns itself off (screen goes white).
#include "emu.h"
#include "cpu/arm7/arm7.h"
#include "cpu/arm7/arm7core.h"
#include "imagedev/cartslot.h"
#include "sound/dac.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
#define MAX_PS_TIMERS 3
struct ps_ftlb_regs_t
@ -104,9 +106,16 @@ public:
: driver_device(mconfig, type, tag),
m_lcd_buffer(*this, "lcd_buffer"),
m_maincpu(*this, "maincpu"),
m_dac(*this, "dac") { }
m_dac(*this, "dac"),
m_cart(*this, "cartslot")
{ }
required_shared_ptr<UINT32> m_lcd_buffer;
required_device<cpu_device> m_maincpu;
required_device<dac_device> m_dac;
required_device<generic_slot_device> m_cart;
memory_region *m_cart_rom;
ps_ftlb_regs_t m_ftlb_regs;
ps_intc_regs_t m_intc_regs;
ps_timer_regs_t m_timer_regs;
@ -128,6 +137,7 @@ public:
DECLARE_READ32_MEMBER(ps_lcd_r);
DECLARE_WRITE32_MEMBER(ps_lcd_w);
DECLARE_READ32_MEMBER(ps_rombank_r);
DECLARE_READ32_MEMBER(ps_flash_r);
DECLARE_WRITE32_MEMBER(ps_flash_w);
DECLARE_READ32_MEMBER(ps_audio_r);
DECLARE_WRITE32_MEMBER(ps_audio_w);
@ -143,8 +153,6 @@ public:
UINT32 ps_intc_get_interrupt_line(UINT32 line);
void ps_intc_set_interrupt_line(UINT32 line, int state);
void ps_timer_start(int index);
required_device<cpu_device> m_maincpu;
required_device<dac_device> m_dac;
};
@ -773,19 +781,18 @@ INPUT_CHANGED_MEMBER(pockstat_state::input_update)
READ32_MEMBER(pockstat_state::ps_rombank_r)
{
INT32 bank = (offset >> 11) & 0x0f;
int index = 0;
for(index = 0; index < 32; index++)
for (int index = 0; index < 32; index++)
{
if(m_ftlb_regs.valid & (1 << index))
if (m_ftlb_regs.valid & (1 << index))
{
if(m_ftlb_regs.entry[index] == bank)
if (m_ftlb_regs.entry[index] == bank)
{
//printf( "Address %08x is assigned to %08x in entry %d\n", 0x02000000 + (offset << 2), index * 0x2000 + ((offset << 2) & 0x1fff), index );
return memregion("flash")->u32(index * (0x2000/4) + (offset & (0x1fff/4)));
return m_cart->read32_rom(space, index * (0x2000/4) + (offset & (0x1fff/4)), mem_mask);
}
}
}
return memregion("flash")->u32(offset & 0x7fff);
return m_cart->read32_rom(space, offset & 0x7fff, mem_mask);
}
@ -811,10 +818,15 @@ WRITE32_MEMBER(pockstat_state::ps_flash_w)
if(m_ps_flash_write_count)
{
m_ps_flash_write_count--;
COMBINE_DATA(&((UINT32*)(*memregion("flash")))[offset]);
COMBINE_DATA(&((UINT32*)(m_cart_rom->base()))[offset]);
}
}
READ32_MEMBER(pockstat_state::ps_flash_r)
{
return m_cart->read32_rom(space, offset, mem_mask);
}
READ32_MEMBER(pockstat_state::ps_audio_r)
{
verboselog(0, "ps_audio_r: Unknown Read: %08x = %08x & %08x\n", 0xd800000 + (offset << 2), 0x10, mem_mask);
@ -836,7 +848,7 @@ static ADDRESS_MAP_START(pockstat_mem, AS_PROGRAM, 32, pockstat_state )
AM_RANGE(0x02000000, 0x02ffffff) AM_READ(ps_rombank_r)
AM_RANGE(0x04000000, 0x04003fff) AM_ROM AM_REGION("maincpu", 0)
AM_RANGE(0x06000000, 0x06000307) AM_READWRITE(ps_ftlb_r, ps_ftlb_w)
AM_RANGE(0x08000000, 0x0801ffff) AM_ROM AM_WRITE(ps_flash_w) AM_REGION("flash", 0)
AM_RANGE(0x08000000, 0x0801ffff) AM_READWRITE(ps_flash_r, ps_flash_w)
AM_RANGE(0x0a000000, 0x0a000013) AM_READWRITE(ps_intc_r, ps_intc_w)
AM_RANGE(0x0a800000, 0x0a80002b) AM_READWRITE(ps_timer_r, ps_timer_w)
AM_RANGE(0x0b000000, 0x0b000007) AM_READWRITE(ps_clock_r, ps_clock_w)
@ -861,7 +873,7 @@ INPUT_PORTS_END
void pockstat_state::machine_start()
{
int index = 0;
for(index = 0; index < 3; index++)
for (index = 0; index < 3; index++)
{
m_timer_regs.timer[index].timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pockstat_state::timer_tick),this));
m_timer_regs.timer[index].timer->adjust(attotime::never, index);
@ -873,6 +885,9 @@ void pockstat_state::machine_start()
m_rtc_regs.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pockstat_state::rtc_tick),this));
m_rtc_regs.timer->adjust(attotime::from_hz(1), index);
astring region_tag;
m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG));
save_item(NAME(m_ftlb_regs.control));
save_item(NAME(m_ftlb_regs.stat));
save_item(NAME(m_ftlb_regs.valid));
@ -919,28 +934,20 @@ void pockstat_state::machine_reset()
UINT32 pockstat_state::screen_update_pockstat(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int x = 0;
int y = 0;
for(y = 0; y < 32; y++)
for (int y = 0; y < 32; y++)
{
UINT32 *scanline = &bitmap.pix32(y);
for(x = 0; x < 32; x++)
for (int x = 0; x < 32; x++)
{
if(m_lcd_control != 0) // Hack
if (m_lcd_control != 0) // Hack
{
if(m_lcd_buffer[y] & (1 << x))
{
if (m_lcd_buffer[y] & (1 << x))
scanline[x] = 0x00000000;
}
else
{
scanline[x] = 0x00ffffff;
}
}
else
{
scanline[x] = 0x00ffffff;
}
}
}
return 0;
@ -948,26 +955,23 @@ UINT32 pockstat_state::screen_update_pockstat(screen_device &screen, bitmap_rgb3
DEVICE_IMAGE_LOAD_MEMBER( pockstat_state, pockstat_flash )
{
int i, length;
UINT8 *cart = memregion("flash")->base();
static const char *gme_id = "123-456-STD";
char cart_id[0xf40];
UINT32 size = image.length();
length = image.fread( cart, 0x20f40);
if(length != 0x20f40)
{
if (size != 0x20f40)
return IMAGE_INIT_FAIL;
}
image.fread(cart_id, 0xf40);
for(i = 0; i < strlen(gme_id); i++)
for (int i = 0; i < strlen(gme_id); i++)
{
if(cart[i] != gme_id[i])
{
if (cart_id[i] != gme_id[i])
return IMAGE_INIT_FAIL;
}
}
memcpy(cart, cart + 0xf40, 0x20000);
m_cart->rom_alloc(0x20000, GENERIC_ROM32_WIDTH);
image.fread(m_cart->get_rom_base(), 0x20000);
return IMAGE_INIT_PASS;
}
@ -977,7 +981,6 @@ static MACHINE_CONFIG_START( pockstat, pockstat_state )
MCFG_CPU_ADD("maincpu", ARM7, DEFAULT_CLOCK)
MCFG_CPU_PROGRAM_MAP(pockstat_mem)
/* video hardware */
MCFG_SCREEN_ADD("screen", LCD)
MCFG_SCREEN_REFRESH_RATE(50)
@ -993,18 +996,15 @@ static MACHINE_CONFIG_START( pockstat, pockstat_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
/* cartridge */
MCFG_CARTSLOT_ADD("cart")
MCFG_CARTSLOT_EXTENSION_LIST("gme")
MCFG_CARTSLOT_NOT_MANDATORY
MCFG_CARTSLOT_LOAD(pockstat_state, pockstat_flash)
MCFG_GENERIC_CARTSLOT_ADD("cartslot", GENERIC_ROM32_WIDTH, generic_plain_slot, "pockstat_cart")
MCFG_GENERIC_EXTENSIONS("gme")
MCFG_GENERIC_LOAD(pockstat_state, pockstat_flash)
MACHINE_CONFIG_END
/* ROM definition */
ROM_START( pockstat )
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD( "kernel.bin", 0x0000, 0x4000, CRC(5fb47dd8) SHA1(6ae880493ddde880827d1e9f08e9cb2c38f9f2ec) )
ROM_REGION( 0x20f40, "flash", ROMREGION_ERASEFF )
ROM_END
/* Driver */