summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2010-06-13 14:18:50 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2010-06-13 14:18:50 +0000
commit014a8b425e3fd9997483bdc2a93472ab5e576097 (patch)
tree26c82af0526700f3d27c6e21d072420ba2cf1851
parent1b391a86174c01afe03b13785c47fe39cb60b03b (diff)
Dumped internal ROM for Pinkiri 8 [Charles MacDonald]
-rw-r--r--src/mame/drivers/pinkiri8.c106
1 files changed, 100 insertions, 6 deletions
diff --git a/src/mame/drivers/pinkiri8.c b/src/mame/drivers/pinkiri8.c
index febda2753ea..53b43223200 100644
--- a/src/mame/drivers/pinkiri8.c
+++ b/src/mame/drivers/pinkiri8.c
@@ -2,13 +2,16 @@
Pinkiri 8 skeleton driver
-- Missing internal ROM, can't do much at the current time
+- current blocker is the video emulation i/o ports, it looks somewhat exotic.
***************************************************************************/
#include "emu.h"
#include "cpu/z180/z180.h"
+static UINT32 vram_addr;
+static UINT8 vram_bank;
+
static VIDEO_START( pinkiri8 )
{
@@ -16,11 +19,98 @@ static VIDEO_START( pinkiri8 )
static VIDEO_UPDATE( pinkiri8 )
{
+ static UINT8 *vram = memory_region(screen->machine, "vram");
+ const gfx_element *gfx = screen->machine->gfx[0];
+
+ bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
+
+ {
+ UINT8 x,y;
+ UINT16 spr_offs,i;
+
+ for(i=0x00000;i<0x4000;i+=4)
+ {
+ spr_offs = ((vram[i+0+0x30000] & 0xff) | (vram[i+1+0x30000]<<16)) & 0x0fff;
+ x = vram[i+3+0x30000];
+ y = vram[i+2+0x30000];
+
+ drawgfx_transpen(bitmap,cliprect,gfx,spr_offs, 0,0,0,x+0,y,0);
+ drawgfx_transpen(bitmap,cliprect,gfx,spr_offs+1,0,0,0,x+8,y,0);
+ drawgfx_transpen(bitmap,cliprect,gfx,spr_offs+2,0,0,0,x+16,y,0);
+ drawgfx_transpen(bitmap,cliprect,gfx,spr_offs+3,0,0,0,x+24,y,0);
+
+ }
+ }
+
return 0;
}
static ADDRESS_MAP_START( pinkiri8_map, ADDRESS_SPACE_PROGRAM, 8 )
- AM_RANGE(0x000000, 0x01ffff) AM_ROM
+ AM_RANGE(0x00000, 0x0bfff) AM_ROM
+ AM_RANGE(0x0c000, 0x0dfff) AM_RAM
+ AM_RANGE(0x10000, 0x1ffff) AM_ROM
+ADDRESS_MAP_END
+
+static READ8_HANDLER( unk_r )
+{
+ return 0xff;//mame_rand(space->machine);
+}
+
+static WRITE8_HANDLER( output_regs_w )
+{
+ if(data & 0x40)
+ cputag_set_input_line(space->machine, "maincpu", INPUT_LINE_NMI, CLEAR_LINE);
+ //data & 0x80 is probably NMI mask
+}
+
+static WRITE8_HANDLER( pinkiri8_vram_w )
+{
+ static UINT8 *vram = memory_region(space->machine, "vram");
+
+ switch(offset)
+ {
+ case 0: vram_addr = (data & 0xff) | (vram_addr & 0xff00); break;
+ case 1: vram_addr = (data << 8) | (vram_addr & 0x00ff); break;
+ case 2:
+ vram_bank = (data ^ 0x07) & 0x07; //unknown purpose
+ //printf("%02x\n",vram_bank);
+ break;
+ case 3:
+ vram_addr++;
+ vram_addr&=0xffff;
+ if(vram_bank < 3)
+ vram[vram_addr] = data;
+ if(vram_addr <= 0x3fff)
+ {
+ static UINT16 datax,pal_offs;
+ static UINT8 r,g,b;
+
+ pal_offs = vram_addr;
+
+ datax = (vram[pal_offs & 0x1fff]) + (vram[(pal_offs & 0x1fff) | (0x2000)]<<8);
+
+ r = ((datax)&0x001f)>>0;
+ g = ((datax)&0x03e0)>>5;
+ b = ((datax)&0x7c00)>>10;
+
+ palette_set_color_rgb(space->machine, pal_offs & 0x1fff, pal5bit(r), pal5bit(g), pal5bit(b));
+ }
+ break;
+ }
+}
+
+static ADDRESS_MAP_START( pinkiri8_io, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0x00, 0x3f) AM_RAM //Z180 internal I/O
+ AM_RANGE(0x60, 0x60) AM_WRITE(output_regs_w)
+ AM_RANGE(0x80, 0x83) AM_WRITE(pinkiri8_vram_w)
+ AM_RANGE(0xb0, 0xb0) AM_WRITENOP //mux
+ AM_RANGE(0xb0, 0xb1) AM_READ(unk_r) // mux inputs
+ AM_RANGE(0xb2, 0xb2) AM_READ(unk_r) //bit 0 causes a reset inside the NMI routine
+ AM_RANGE(0xf8, 0xf8) AM_READ(unk_r) //test bit 0
+ AM_RANGE(0xf9, 0xf9) AM_READ(unk_r)
+ AM_RANGE(0xfa, 0xfa) AM_READ(unk_r) //test bit 7
+ AM_RANGE(0xfb, 0xfb) AM_READ(unk_r)
ADDRESS_MAP_END
static INPUT_PORTS_START( pinkiri8 )
@@ -31,20 +121,21 @@ static const gfx_layout charlayout =
8,8,
RGN_FRAC(1,5),
5,
- { RGN_FRAC(0,5),RGN_FRAC(1,5),RGN_FRAC(2,5),RGN_FRAC(3,5),RGN_FRAC(4,5) },
+ { RGN_FRAC(4,5),RGN_FRAC(3,5),RGN_FRAC(2,5),RGN_FRAC(1,5),RGN_FRAC(0,5) },
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
8*8
};
static GFXDECODE_START( pinkiri8 )
- GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 8 )
+ GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 0x100 )
GFXDECODE_END
static MACHINE_DRIVER_START( pinkiri8 )
MDRV_CPU_ADD("maincpu",Z180,16000000)
MDRV_CPU_PROGRAM_MAP(pinkiri8_map)
-// MDRV_CPU_VBLANK_INT_HACK(irq0_line_hold,4)
+ MDRV_CPU_IO_MAP(pinkiri8_io)
+ MDRV_CPU_VBLANK_INT("screen",nmi_line_assert)
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
@@ -53,7 +144,7 @@ static MACHINE_DRIVER_START( pinkiri8 )
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MDRV_GFXDECODE(pinkiri8)
- MDRV_PALETTE_LENGTH(512)
+ MDRV_PALETTE_LENGTH(0x2000)
MDRV_VIDEO_START(pinkiri8)
MDRV_VIDEO_UPDATE(pinkiri8)
@@ -73,6 +164,7 @@ MACHINE_DRIVER_END
ROM_START( pinkiri8 )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "pinkiri8-ver.1.02.l1", 0x0000, 0x20000, CRC(f2df5b12) SHA1(e374e184a6a1e932550516011ec09a5accec9b03) )
+ ROM_LOAD( "bios.rom", 0x0000, 0x4000, CRC(399df1ee) SHA1(8251f3aa7da4c7899c8e739c10b61260f4471311) ) //overlapped internal ROM
ROM_REGION( 0x20000*5, "gfx1", 0 )
ROM_LOAD( "pinkiri8-chr-01.a1", 0x00000, 0x20000, CRC(8ec73662) SHA1(9098348e519ce753dd7f38f0d855181bfc65aa42) )
@@ -80,6 +172,8 @@ ROM_START( pinkiri8 )
ROM_LOAD( "pinkiri8-chr-03.d1", 0x40000, 0x20000, CRC(bd5f269a) SHA1(7dfd039227551f0f0ed4afaafc76ca64a39a9b83) )
ROM_LOAD( "pinkiri8-chr-04.ef1", 0x60000, 0x20000, CRC(4d0e5005) SHA1(4b90119c359c4de576131fd0e28d2fe1482ce74f) )
ROM_LOAD( "pinkiri8-chr-05.h1", 0x80000, 0x20000, CRC(036ca165) SHA1(c4a2d6e394bbabcae1413d8a2916a19c90687edf) )
+
+ ROM_REGION( 0x80000, "vram", ROMREGION_ERASE00)
ROM_END
GAME( 2005?, pinkiri8, 0, pinkiri8, pinkiri8, 0, ROT0, "<unknown>", "Pinkiri 8", GAME_NOT_WORKING| GAME_NO_SOUND )