taitotz: preliminary text layer hookup [Ville Linde]

This commit is contained in:
R. Belmont 2011-10-12 13:39:47 +00:00
parent 6c007e2a22
commit b4c595c0d9

View File

@ -1,7 +1,7 @@
/*
Taito Type-Zero hardware
Skeleton driver. Requires TLCS-900 CPU core to make progress.
Skeleton driver.
Landing High Japan PCB info
===========================
@ -70,6 +70,18 @@ IC7 Panasonic MN1020819DA E68-01
#include "emu.h"
#include "cpu/powerpc/ppc.h"
#include "cpu/tlcs900/tlcs900.h"
// Interesting mem areas
// 0x40080400...0x400807fc: PPC Interrupt handler table for TLCS900 interrupts (called from 0x4002ea80)
// 0x40080440 (0x10): 0x4003b274 (0xfc06f7 on TLCS sets 0x1000)
// 0x400804c0 (0x30): 0x4003f1e4 (INT1 handler on TLCS sets 0x3010) (comms?)
// 0x40080500 (0x40): 0x4002ed94 (debug/trace?)
// 0x40080504 (0x41): 0x4002ede4 (debug/trace?)
// 0x40080540 (0x50): 0x4003c21c
// 0x40080740 (0xd0): 0x4002ecc0 (INT3 handler on TLCS sets 0xd000)
// 0x400807c0 (0xf0): 0x4002eae4 (0xfc0a44 on TLCS sets 0xf001)
class taitotz_state : public driver_device
@ -78,53 +90,347 @@ public:
taitotz_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) { }
UINT32 video_char_ram[0x4000];
UINT32 video_tile_ram[0x20000];
UINT32 video_screen_ram[0x40000];
UINT32 video_reg;
UINT32 *video_ram;
UINT32 video_ram_ptr;
bitmap_t *framebuffer;
};
static VIDEO_START( taitotz )
{
taitotz_state *state = machine.driver_data<taitotz_state>();
state->framebuffer = machine.primary_screen->alloc_compatible_bitmap();
}
static SCREEN_UPDATE( taitotz )
{
/*
{
UINT16 *s = (UINT16*)video_char_ram;
int x,y,t,u;
for (u=0; u < 16; u++)
{
for (t=0; t < 16; t++)
{
UINT32 tile = (u*16)+t;
tile &= 0xff;
for (y=0; y < FONT_HEIGHT; y++)
{
UINT32 *fb = BITMAP_ADDR32(bitmap, y+(u*FONT_WIDTH), 0);
for (x=0; x < FONT_WIDTH; x++)
{
UINT32 p = s[((tile*(FONT_WIDTH*FONT_HEIGHT*2)) + ((y*FONT_WIDTH)+x)) ^ 1];
if (p) p = 0xffffffff;
fb[x+(t*FONT_HEIGHT)] = p;
}
}
}
}
}
*/
/*
{
UINT16 *s = (UINT16*)video_char_ram;
int t,u;
for (u=0; u < 256; u++)
{
UINT32 *fb = BITMAP_ADDR32(bitmap, u, 0);
for (t=0; t < 512; t++)
{
UINT32 p = s[((u*512)+t) ^ 1];
if (p) p = 0xffffffff;
fb[t] = p;
}
}
}
*/
taitotz_state *state = screen->machine().driver_data<taitotz_state>();
bitmap_fill(bitmap, cliprect, 0);
copybitmap_trans(bitmap, state->framebuffer, 0, 0, 0, 0, cliprect, 0);
return 0;
}
static void draw_tile(running_machine &machine, UINT32 pos, UINT32 tile)
{
taitotz_state *state = machine.driver_data<taitotz_state>();
int tileu = (tile & 0x1f) * 16;
int tilev = ((tile >> 5) & 0x1f) * 16;
int tilex = (pos & 0x1f) * 16;
int tiley = ((pos >> 5) & 0x1f) * 16;
UINT16 *src_tile = (UINT16*)state->video_char_ram;
int v = tilev;
for (int j=tiley; j < (tiley+16); j++)
{
int u = tileu;
UINT32 *fb = BITMAP_ADDR32(state->framebuffer, j, 0);
for (int i=tilex; i < (tilex+16); i++)
{
UINT32 p = src_tile[((v*512) + u) ^ 1];
fb[i] = p ? 0xffffffff : 0;
u++;
}
v++;
}
}
static void video_reg_w(running_machine &machine, UINT32 reg, UINT32 data)
{
taitotz_state *state = machine.driver_data<taitotz_state>();
switch ((reg >> 28) & 0xf)
{
case 0x1: // Register write?
{
logerror("video_reg_w: r: %08X d: %08X\n", reg, data);
break;
}
case 0x3: // Tile write?
{
UINT32 pos = (data >> 12) & 0xfff;
UINT32 tile = data & 0xfff;
draw_tile(machine, pos, tile);
break;
}
case 0xb: // RAM write?
{
state->video_ram[state->video_ram_ptr++] = data;
break;
}
default:
{
logerror("video_reg_w: r: %08X d: %08X\n", reg, data);
break;
}
}
}
// Video chip RAM commands?
// 0xB0800000, size 0x200000 : screen RAM
// 0xB0980000, size 0x4000? : char RAM?
// 0xB09C0000, size 0x20000 : tile RAM?
// 0xB1800000, size 0x80000 : frame RAM
// 0xB1000000, size 0x800000 : texture RAM
static WRITE64_HANDLER(video_chip_w)
{
taitotz_state *state = space->machine().driver_data<taitotz_state>();
//printf("unk_w: %08X, %08X%08X, %08X%08X at %08X\n", offset, (UINT32)(data >> 32), (UINT32)(data), (UINT32)(mem_mask >> 32), (UINT32)(mem_mask), cpu_get_pc(space->cpu));
UINT32 reg = offset * 8;
UINT32 regdata;
if (ACCESSING_BITS_0_31)
{
reg += 4;
regdata = (UINT32)(data);
}
else
{
regdata = (UINT32)(data >> 32);
}
switch (reg)
{
case 0:
{
video_reg_w(space->machine(), state->video_reg, regdata);
break;
}
case 0x8:
{
state->video_reg = regdata;
if ((state->video_reg & 0xf0000000) == 0xb0000000)
{
state->video_ram_ptr = 0;
switch (state->video_reg & 0x0fffffff)
{
case 0x0980000: state->video_ram = state->video_char_ram; break;
case 0x09c0000: state->video_ram = state->video_tile_ram; break;
case 0x1800000: state->video_ram = state->video_screen_ram; break;
default:
{
fatalerror("video_chip_ram sel %08X\n", state->video_reg & 0x0fffffff);
break;
}
}
}
break;
}
case 0xc:
{
logerror("video_chip_w: port 0xc: %08X\n", regdata);
break;
}
}
}
static READ64_HANDLER(ppc_common_r)
{
if (offset == 0x7ff)
{
return U64(0x0000d00000000000);
}
if (offset == 1)
{
return U64(0x0000455200005200);
}
return 0;
}
static WRITE64_HANDLER(ppc_common_w)
{
if (offset == 0x7ff)
{
cputag_set_input_line(space->machine(), "maincpu", INPUT_LINE_IRQ0, CLEAR_LINE);
}
}
// BAT Config:
// IBAT0 U: 0xf0001fff L: 0xf0000023 (0xf0000000...0xffffffff)
// IBAT1 U: 0xe0001fff L: 0xe0000023 (0xe0000000...0xefffffff)
// IBAT2 U: 0x40001fff L: 0x40000003 (0x40000000...0x4fffffff)
// IBAT3 U: 0xa0001fff L: 0xa0000023 (0xa0000000...0xafffffff)
// DBAT0 U: 0x00001fff L: 0x00000022 (0x00000000...0x0fffffff)
// DBAT1 U: 0x10001fff L: 0x10000002 (0x10000000...0x1fffffff)
// DBAT2 U: 0x40001fff L: 0x40000002 (0x40000000...0x4fffffff)
// DBAT3 U: 0xa0001fff L: 0xa0000022 (0xa0000000...0xafffffff)
// 0x10000000...0x1000001f: texture FIFO?
// 0x40000000...0x400fffff: BIOS Work RAM
// 0x40100000...0x40ffffff: User Work RAM
static ADDRESS_MAP_START( ppc603e_mem, AS_PROGRAM, 64)
AM_RANGE(0x00000000, 0x00000007) AM_RAM // Register/RAM access port? - Written 128k+256k times on boot
AM_RANGE(0x00000008, 0x0000000f) AM_RAM // Register/RAM address port?
//AM_RANGE(0x00000000, 0x00000007) AM_RAM // Register/RAM access port? - Written 128k+256k times on boot
//AM_RANGE(0x00000008, 0x0000000f) AM_RAM // Register/RAM address port?
AM_RANGE(0x00000000, 0x0000000f) AM_WRITE(video_chip_w)
AM_RANGE(0x40000000, 0x400fffff) AM_RAM // Work RAM
AM_RANGE(0xa8000000, 0xa8001fff) AM_RAM // Common RAM (with TLCS-900)
AM_RANGE(0xa8003ff8, 0xa8003fff) AM_RAM // TLCS-900 related?
AM_RANGE(0xa8000000, 0xa8003fff) AM_READWRITE(ppc_common_r, ppc_common_w) // Common RAM (with TLCS-900)
//AM_RANGE(0xa8003ff8, 0xa8003fff) AM_RAM // TLCS-900 related?
AM_RANGE(0xac000000, 0xac0fffff) AM_ROM AM_REGION("user1", 0)
AM_RANGE(0xfff00000, 0xffffffff) AM_ROM AM_REGION("user1", 0)
ADDRESS_MAP_END
// TLCS900 interrupt vectors
// 0xfc0150: reset
// 0xfc0120: SWI1-7, NMI, INTWD, INTT0, INTT2-7, INTTR8-A, INTAD, INTTC0-3
// 0xfc0122: INT0
// 0xfc0137: INT1
// 0xfc013c: INT2
// 0xfc0141: INT3
// 0xfc0146: INT4
// 0xfc0147: INT5
// 0xfc0148: INT6
// 0xfc0149: INT7
// 0xfc014a: INT8
// 0xfc0467: INTT1
// 0xfc0d1d: INTRX0
// 0xfc0ca5: INTTX0
// 0xfc0d55: INTRX1
// 0xfc0ce1: INTTX1
static ADDRESS_MAP_START( tlcs900h_mem, AS_PROGRAM, 8)
AM_RANGE(0x010000, 0x02ffff) AM_RAM // Work RAM
AM_RANGE(0xfc0000, 0xffffff) AM_ROM AM_REGION("io_cpu", 0)
ADDRESS_MAP_END
static WRITE8_DEVICE_HANDLER( taitotz_tlcs900_to1 )
{
}
static WRITE8_DEVICE_HANDLER( taitotz_tlcs900_to3 )
{
}
static INPUT_PORTS_START( taitotz )
INPUT_PORTS_END
static MACHINE_RESET( taitotz )
{
//cputag_set_input_line(machine, "iocpu", INPUT_LINE_RESET, ASSERT_LINE);
}
static MACHINE_START( taitotz )
{
/*
UINT32 *rom = (UINT32*)machine->region("user1")->base();
rom[(0x228b0^4)/4] = 0x60000000;
rom[(0x22900^4)/4] = 0x60000000;
rom[(0x2293c^4)/4] = 0x60000000;
*/
}
static INTERRUPT_GEN( taitotz_vbi )
{
}
static const powerpc_config ppc603e_config =
{
XTAL_66_6667MHz /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */
};
static const tlcs900_interface taitotz_tlcs900_interface =
{
DEVCB_HANDLER( taitotz_tlcs900_to1 ),
DEVCB_HANDLER( taitotz_tlcs900_to3 )
};
static MACHINE_CONFIG_START( taitotz, taitotz_state )
MCFG_CPU_ADD("maincpu", PPC603E, 100000000)
MCFG_CPU_ADD("maincpu", PPC603E, 10000000)
MCFG_CPU_CONFIG(ppc603e_config)
MCFG_CPU_PROGRAM_MAP(ppc603e_mem)
MCFG_CPU_VBLANK_INT("screen", taitotz_vbi)
/* TMP95C063F I/O CPU */
MCFG_CPU_ADD("iocpu", TLCS900H, 25000000)
MCFG_CPU_CONFIG(taitotz_tlcs900_interface)
MCFG_CPU_PROGRAM_MAP(tlcs900h_mem)
/* MN1020819DA sound CPU */
MCFG_MACHINE_START( taitotz )
MCFG_MACHINE_RESET( taitotz )
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(512, 384)
MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383)
MCFG_SCREEN_SIZE(640, 512)
MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 511)
MCFG_SCREEN_UPDATE(taitotz)
MCFG_VIDEO_START(taitotz)
@ -139,6 +445,7 @@ ROM_START( taitotz )
ROM_REGION64_BE( 0x100000, "user1", 0 )
TAITOTZ_BIOS
ROM_REGION( 0x40000, "io_cpu", ROMREGION_ERASE00 )
ROM_REGION( 0x10000, "sound_cpu", ROMREGION_ERASE00 ) /* Internal ROM :( */
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
DISK_REGION( "ide" )
@ -169,8 +476,8 @@ ROM_START( batlgear )
TAITOTZ_BIOS
ROM_REGION( 0x40000, "io_cpu", 0 )
ROM_LOAD16_BYTE( "e68-07.ic14", 0x000000, 0x020000, CRC(554c6fd7) SHA1(9f203dead81c7ccf73d7fd462cab147cd17f890f) )
ROM_LOAD16_BYTE( "e68-08.ic15", 0x000001, 0x020000, CRC(f1932380) SHA1(64d12e858af15a9ba8254917da13863ac7c9c050) )
ROM_LOAD16_BYTE( "e68-07.ic14", 0x000000, 0x020000, CRC(554c6fd7) SHA1(9f203dead81c7ccf73d7fd462cab147cd17f890f) )
ROM_LOAD16_BYTE( "e68-08.ic15", 0x000001, 0x020000, CRC(f1932380) SHA1(64d12e858af15a9ba8254917da13863ac7c9c050) )
ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */
ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP )
@ -184,8 +491,8 @@ ROM_START( batlgr2 )
TAITOTZ_BIOS
ROM_REGION( 0x40000, "io_cpu", 0 )
ROM_LOAD16_BYTE( "e87-03.ic14", 0x000000, 0x020000, CRC(49ae7cd0) SHA1(15f07a6bb2044a85a2139481f1dc95a44520c929) )
ROM_LOAD16_BYTE( "e87-04.ic15", 0x000001, 0x020000, CRC(59f8f75f) SHA1(f5595751b10c0033f460114c43f5e2c192fe61f1) )
ROM_LOAD16_BYTE( "e87-03.ic14", 0x000000, 0x020000, CRC(49ae7cd0) SHA1(15f07a6bb2044a85a2139481f1dc95a44520c929) )
ROM_LOAD16_BYTE( "e87-04.ic15", 0x000001, 0x020000, CRC(59f8f75f) SHA1(f5595751b10c0033f460114c43f5e2c192fe61f1) )
ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */
ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP )