Apache 3 improvements [Phil Bennett/Guru]:

* Experimental road layer emulation (currently disabled).
* Fixed text layer alignment.
* Corrected CPU clock frequencies.
* Fixed YM-2151 volume.
* Added road stripe PROM.

New clones added
----------------
Apache 3 (Kana Corporation license) [Guru]
This commit is contained in:
Phil Bennett 2009-02-20 19:31:25 +00:00
parent ae827b4d0a
commit f1ac70a279
5 changed files with 241 additions and 78 deletions

View File

@ -146,7 +146,7 @@
#include "sound/okim6295.h"
static UINT16 *cyclwarr_cpua_ram, *cyclwarr_cpub_ram;
static UINT16 *tatsumi_c_ram, *apache3_g_ram;
UINT16 *apache3_g_ram;
UINT16 *roundup5_d0000_ram, *roundup5_e0000_ram;
UINT8 *tatsumi_rom_sprite_lookup1, *tatsumi_rom_sprite_lookup2;
UINT8 *tatsumi_rom_clut0, *tatsumi_rom_clut1;
@ -155,7 +155,6 @@ static UINT16 bigfight_a20000[8];
UINT16 bigfight_a40000[2];
static UINT16 bigfight_a60000[2];
extern UINT16 bigfight_bank;
static UINT8 *apache3_bg_ram;
/***************************************************************************/
@ -189,7 +188,8 @@ static WRITE16_HANDLER(cyclwarr_sound_w)
/***************************************************************************/
static ADDRESS_MAP_START( apache3_v30_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x00000, 0x07fff) AM_RAM
AM_RANGE(0x00000, 0x03fff) AM_RAM
AM_RANGE(0x04000, 0x07fff) AM_RAM AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size)
AM_RANGE(0x08000, 0x08fff) AM_RAM_WRITE(apache3_palette_w) AM_BASE(&paletteram16)
AM_RANGE(0x0c000, 0x0dfff) AM_RAM_WRITE(roundup5_text_w) AM_BASE(&videoram16)
AM_RANGE(0x0e800, 0x0e803) AM_WRITE(SMH_NOP) // CRT
@ -206,10 +206,10 @@ static ADDRESS_MAP_START( apache3_68000_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x80000, 0x83fff) AM_RAM AM_BASE(&tatsumi_68k_ram)
AM_RANGE(0x90000, 0x93fff) AM_RAM AM_BASE(&spriteram16)
AM_RANGE(0x9a000, 0x9a1ff) AM_WRITE(tatsumi_sprite_control_w) AM_BASE(&tatsumi_sprite_control_ram)
AM_RANGE(0xa0000, 0xa0001) AM_WRITE(apache3_a0000_w)
AM_RANGE(0xb0000, 0xb0001) AM_WRITE(apache3_irq_ack_w) //todo - z80 reset?
AM_RANGE(0xc0000, 0xc0001) AM_WRITE(SMH_RAM) AM_BASE(&tatsumi_c_ram)
AM_RANGE(0xd0000, 0xdffff) AM_RAM AM_BASE(&apache3_g_ram)
AM_RANGE(0xa0000, 0xa0001) AM_WRITE(apache3_rotate_w) // /BNKCS
AM_RANGE(0xb0000, 0xb0001) AM_WRITE(apache3_z80_ctrl_w)
AM_RANGE(0xc0000, 0xc0001) AM_WRITE(apache3_road_z_w) // /LINCS
AM_RANGE(0xd0000, 0xdffff) AM_RAM AM_BASE(&apache3_g_ram) // /GRDCS
AM_RANGE(0xe0000, 0xe7fff) AM_READWRITE(apache3_z80_r, apache3_z80_w)
ADDRESS_MAP_END
@ -224,8 +224,8 @@ static ADDRESS_MAP_START( apache3_v20_map, ADDRESS_SPACE_PROGRAM, 8 )
ADDRESS_MAP_END
static ADDRESS_MAP_START( apache3_z80_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x00000, 0x1fff) AM_RAM AM_BASE(&apache3_z80_ram)
AM_RANGE(0x08000, 0x83ff) AM_RAM AM_BASE(&apache3_bg_ram)
AM_RANGE(0x0000, 0x1fff) AM_RAM AM_BASE(&apache3_z80_ram)
AM_RANGE(0x8000, 0xffff) AM_WRITE(apache3_road_x_w)
ADDRESS_MAP_END
/*****************************************************************/
@ -382,12 +382,18 @@ static INPUT_PORTS_START( apache3 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Missile" )
PORT_START("STICKX")
PORT_START("STICK_X")
PORT_BIT( 0xff, 0x7f, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)
PORT_START("STICKY")
PORT_START("STICK_Y")
PORT_BIT( 0xff, 0x7f, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)
PORT_START("THROTTLE")
PORT_BIT( 0xff, 0x7f, IPT_AD_STICK_Z ) PORT_SENSITIVITY(25) PORT_KEYDELTA(79)
PORT_START("VR1")
PORT_ADJUSTER(100, "VR1")
PORT_START("DSW")
PORT_DIPNAME( 0x0003, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x0000, "3" )
@ -830,31 +836,45 @@ static INTERRUPT_GEN( roundup5_interrupt )
cpu_set_input_line_and_vector(device, 0, HOLD_LINE, 0xc8/4); /* VBL */
}
static void apache3_68000_reset(const device_config *device)
{
cpu_set_input_line(device->machine->cpu[3], INPUT_LINE_RESET, PULSE_LINE);
}
static MACHINE_RESET( apache3 )
{
cpu_set_input_line(machine->cpu[3], INPUT_LINE_RESET, ASSERT_LINE); // TODO
/* Hook the RESET line, which resets the Z80 */
device_set_info_fct(machine->cpu[1], CPUINFO_FCT_M68K_RESET_CALLBACK, (genf *)apache3_68000_reset);
}
static MACHINE_DRIVER_START( apache3 )
/* basic machine hardware */
MDRV_CPU_ADD("main", V30,20000000 / 2) /* NEC V30 CPU, 20MHz / 2 */
MDRV_CPU_ADD("main", V30,20000000 / 2)
MDRV_CPU_PROGRAM_MAP(apache3_v30_map,0)
MDRV_CPU_VBLANK_INT("main", roundup5_interrupt)
MDRV_CPU_ADD("sub", M68000,20000000 / 2) /* 68000 CPU, 20MHz / 2 */
MDRV_CPU_ADD("sub", M68000,20000000 / 2)
MDRV_CPU_PROGRAM_MAP(apache3_68000_map,0)
MDRV_CPU_VBLANK_INT("main", irq4_line_hold)
MDRV_CPU_ADD("audio", V20, 8000000) //???
MDRV_CPU_ADD("audio", V20, 16000000 / 2)
MDRV_CPU_PROGRAM_MAP(apache3_v20_map,0)
MDRV_CPU_ADD("sub2", Z80, 8000000) //???
MDRV_CPU_ADD("sub2", Z80, 6250000)
MDRV_CPU_PROGRAM_MAP(apache3_z80_map,0)
MDRV_CPU_VBLANK_INT("main", irq0_line_hold)
MDRV_QUANTUM_TIME(HZ(6000))
MDRV_NVRAM_HANDLER(generic_0fill)
MDRV_MACHINE_RESET(apache3)
/* video hardware */
MDRV_SCREEN_ADD("main", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
MDRV_SCREEN_SIZE(40*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1)
MDRV_SCREEN_RAW_PARAMS(6000000, 400, 0, 320, 280, 0, 240) // TODO: Hook up CRTC
MDRV_GFXDECODE(apache3)
MDRV_PALETTE_LENGTH(1024 + 4096) /* 1024 real colours, and 4096 arranged as series of cluts */
@ -1056,6 +1076,61 @@ ROM_START( apache3 )
ROM_REGION( 0x30000, "oki", 0 ) /* ADPCM samples */
ROM_LOAD( "ap-28c.171", 0x000000, 0x20000, CRC(b349f0c2) SHA1(cb1ff1c0e784f669c87ab1eccd3b358950761b74) )
ROM_LOAD( "ap-29c.176", 0x020000, 0x10000, CRC(b38fced3) SHA1(72f61a719f393957bcccf14687bfbb2e7a5f7aee) )
ROM_REGION( 0x200, "proms", 0 ) /* Road stripe PROM */
ROM_LOAD( "am27s29.ic41", 0x000, 0x200, CRC(c981f1e0) SHA1(7d8492d9f4033ab3734c09ee23016a0b210648b5) )
ROM_END
ROM_START( apache3a )
ROM_REGION( 0x100000, "main", 0 ) /* v30 main cpu */
ROM_LOAD16_BYTE( "ap-25c.125", 0x0a0001, 0x10000, CRC(7bc496a6) SHA1(5491d06181d729407e975b85a8715fdc3b489c67) )
ROM_LOAD16_BYTE( "ap-26c.133", 0x0a0000, 0x10000, CRC(9393a470) SHA1(00376f7a545629a83eb5a90b9d1685a68430e4ce) )
ROM_LOAD16_BYTE( "ap-23g.110", 0x0e0001, 0x10000, CRC(0ab485e4) SHA1(d8d0695312732c31cedcb1c298810a6793835e80) )
ROM_LOAD16_BYTE( "ap-24g.118", 0x0e0000, 0x10000, CRC(6348e196) SHA1(6be537491a56a28b62981cae6db8dfc4eb2fece2) )
ROM_REGION( 0x80000, "sub", 0 ) /* 68000 sub cpu */
ROM_LOAD16_BYTE( "ap-19c.80", 0x000001, 0x10000, CRC(0908e468) SHA1(a2d725993bd4cd5425468736154fd3dd9dd7b060) )
ROM_LOAD16_BYTE( "ap-21c.97", 0x000000, 0x10000, CRC(38a056fb) SHA1(67c8ae58670cebde0771854e1fb5fc2eb2543ecc) )
ROM_LOAD16_BYTE( "ap-20a.89", 0x040001, 0x20000, CRC(92d24b5e) SHA1(1ea270d46a607e47b7e0961b532316aa05dc8f4e) )
ROM_LOAD16_BYTE( "ap-22a.105", 0x040000, 0x20000, CRC(a8458a92) SHA1(43674731c2e9962c2bfbb73a85484cf03d6be223) )
ROM_REGION( 0x100000, "audio", 0 ) /* 64k code for sound V20 */
ROM_LOAD( "ap-27d.151", 0x0f0000, 0x10000, CRC(294b4d79) SHA1(2b03418a12a2aaf3919b98161d8d0ce6ae29a2bb) )
ROM_REGION( 0x200000, "gfx1", ROMREGION_DISPOSE )
/* Filled in by both regions below */
ROM_REGION( 0x100000, "gfx2", 0)
ROM_LOAD32_BYTE( "ap-00c.15", 0x000000, 0x20000, CRC(ad1ddc2b) SHA1(81f64663c4892ab5fb0e2dc99513dbfee73f15b8) )
ROM_LOAD32_BYTE( "ap-01c.22", 0x000001, 0x20000, CRC(6286ff00) SHA1(920da4a3a441dbf54ad86c0f4fb6f47a867e9cda) )
ROM_LOAD32_BYTE( "ap-04c.58", 0x000002, 0x20000, CRC(dc6d55e4) SHA1(9f48f8d6aa1a329a71913139a8d5a50d95a9b9e5) )
ROM_LOAD32_BYTE( "ap-05c.65", 0x000003, 0x20000, CRC(2e6e495f) SHA1(af610f265da53735b20ddc6df1bda47fc54ee0c3) )
ROM_LOAD32_BYTE( "ap-02c.34", 0x080000, 0x20000, CRC(af4ee7cb) SHA1(4fe2361b7431971b07671f145abf1ea5861d01db) )
ROM_LOAD32_BYTE( "ap-03c.46", 0x080001, 0x20000, CRC(60ab495c) SHA1(18340d4fba550495b1e52f8023a0a2ec6349dfeb) )
ROM_LOAD32_BYTE( "ap-06c.71", 0x080002, 0x20000, CRC(0ea90e55) SHA1(b16d6b8be4853797507d3e5c933a9dd1d451308e) )
ROM_LOAD32_BYTE( "ap-07c.75", 0x080003, 0x20000, CRC(ba685543) SHA1(140a2b708d4e4de4d207fc2c4a96a5cab8639988) )
ROM_REGION( 0x100000, "gfx3", 0)
ROM_LOAD32_BYTE( "ap-08c.14", 0x000000, 0x20000, CRC(6437b580) SHA1(2b2ba42add18bbec04fbcf53645a8d44b972e26a) )
ROM_LOAD32_BYTE( "ap-09c.21", 0x000001, 0x20000, CRC(54d18ef9) SHA1(40ebc6ea49b2a501fe843d60bec8c32d07f2d25d) )
ROM_LOAD32_BYTE( "ap-12c.57", 0x000002, 0x20000, CRC(f95cf5cf) SHA1(ce373c648cbf3e4863bbc3a1175efe065c75eb13) )
ROM_LOAD32_BYTE( "ap-13c.64", 0x000003, 0x20000, CRC(67a248c3) SHA1(cc945f7cfecaaab5075c1a3d202369b070d4c656) )
ROM_LOAD32_BYTE( "ap-10c.33", 0x080000, 0x20000, CRC(74418df4) SHA1(cc1206b10afc2de919b2fb9899486122d27290a4) )
ROM_LOAD32_BYTE( "ap-11c.45", 0x080001, 0x20000, CRC(195bf78e) SHA1(c3c472f3c4244545b89491b6ebec4f838a6bbb73) )
ROM_LOAD32_BYTE( "ap-14c.70", 0x080002, 0x20000, CRC(58f7fe16) SHA1(a5b87b42b85808c226df0d2a7b7cdde12d474a41) )
ROM_LOAD32_BYTE( "ap-15c.74", 0x080003, 0x20000, CRC(1ffd5496) SHA1(25efb568957fc9441a40a7d64cc6afe1a14b392b) )
ROM_REGION( 0x18000, "gfx4", ROMREGION_DISPOSE )
ROM_LOAD( "ap-18e.73", 0x000000, 0x10000, CRC(d7861a26) SHA1(b1a1e089a293a5536d342c9edafbea303f4f128c) )
ROM_LOAD( "ap-16e.63", 0x008000, 0x10000, CRC(d3251965) SHA1(aef4f58a6f773060434abda9d7f5f003693577bf) )
ROM_LOAD( "ap-17e.68", 0x008000, 0x08000, CRC(4509c2ed) SHA1(97a6a6710e83aca212ce43d06c3f26c35f9782b8) )
ROM_REGION( 0x30000, "oki", 0 ) /* ADPCM samples */
ROM_LOAD( "ap-28c.171", 0x000000, 0x20000, CRC(b349f0c2) SHA1(cb1ff1c0e784f669c87ab1eccd3b358950761b74) )
ROM_LOAD( "ap-29c.176", 0x020000, 0x10000, CRC(b38fced3) SHA1(72f61a719f393957bcccf14687bfbb2e7a5f7aee) )
ROM_REGION( 0x200, "proms", 0 ) /* Road stripe PROM */
ROM_LOAD( "am27s29.ic41", 0x000, 0x200, CRC(c981f1e0) SHA1(7d8492d9f4033ab3734c09ee23016a0b210648b5) )
ROM_END
ROM_START( roundup5 )
@ -1202,8 +1277,6 @@ static DRIVER_INIT( apache3 )
UINT8 *src2 = memory_region(machine, "gfx3");
int i;
cpu_set_input_line(machine->cpu[3], INPUT_LINE_HALT, ASSERT_LINE); // ?
for (i=0; i<0x100000; i+=32) {
memcpy(dst,src1,32);
src1+=32;
@ -1220,6 +1293,8 @@ static DRIVER_INIT( apache3 )
tatsumi_rom_clut1 = memory_region(machine, "gfx3")+ 0x100000 - 0x800;
tatsumi_reset(machine);
// TODO: ym2151_set_port_write_handler for CT1/CT2 outputs
}
static DRIVER_INIT( roundup5 )
@ -1287,6 +1362,7 @@ static DRIVER_INIT( cyclwarr )
/* 1987 Gray Out */
GAME( 1988, apache3, 0, apache3, apache3, apache3, ROT0, "Tatsumi", "Apache 3", GAME_IMPERFECT_GRAPHICS )
GAME( 1988, apache3a, apache3, apache3, apache3, apache3, ROT0, "Tatsumi", "Apache 3 (Kana Corporation license)", GAME_IMPERFECT_GRAPHICS )
GAME( 1989, roundup5, 0, roundup5, roundup5, roundup5, ROT0, "Tatsumi", "Round Up 5 - Super Delta Force", GAME_IMPERFECT_GRAPHICS )
GAME( 1991, cyclwarr, 0, cyclwarr, cyclwarr, cyclwarr, ROT0, "Tatsumi", "Cycle Warriors", GAME_IMPERFECT_GRAPHICS)
GAME( 1992, bigfight, 0, bigfight, bigfight, cyclwarr, ROT0, "Tatsumi", "Big Fight - Big Trouble In The Atlantic Ocean", GAME_IMPERFECT_GRAPHICS)

View File

@ -14,7 +14,7 @@ extern UINT16 *roundup5_unknown0, *roundup5_unknown1, *roundup5_unknown2;
READ16_HANDLER( apache3_bank_r );
WRITE16_HANDLER( apache3_bank_w );
WRITE16_HANDLER( apache3_irq_ack_w );
WRITE16_HANDLER( apache3_z80_ctrl_w );
READ16_HANDLER( apache3_v30_v20_r );
WRITE16_HANDLER( apache3_v30_v20_w );
READ16_HANDLER( roundup_v30_z80_r );
@ -25,10 +25,10 @@ READ16_HANDLER(apache3_z80_r);
WRITE16_HANDLER( apache3_z80_w );
READ8_HANDLER( apache3_adc_r );
WRITE8_HANDLER( apache3_adc_w );
WRITE16_HANDLER( apache3_rotate_w );
WRITE16_HANDLER( cyclwarr_control_w );
READ16_HANDLER( cyclwarr_control_r );
WRITE16_HANDLER( roundup5_control_w );
WRITE16_HANDLER( apache3_a0000_w );
WRITE16_HANDLER( roundup5_d0000_w );
WRITE16_HANDLER( roundup5_e0000_w );
@ -38,7 +38,8 @@ READ8_DEVICE_HANDLER(tatsumi_hack_oki_r);
extern UINT16 *tatsumi_68k_ram;
extern UINT8 *apache3_z80_ram;
extern UINT16 tatsumi_control_word;
extern UINT16 apache3_a0000[16];
extern UINT16 apache3_rotate_ctrl[12];
extern UINT16 *apache3_g_ram;
void tatsumi_reset(running_machine *machine);
@ -55,6 +56,8 @@ WRITE16_HANDLER( cyclwarr_videoram1_w );
READ16_HANDLER( roundup5_vram_r );
WRITE16_HANDLER( roundup5_vram_w );
WRITE16_HANDLER( apache3_palette_w );
WRITE8_HANDLER( apache3_road_x_w );
WRITE16_HANDLER( apache3_road_z_w );
extern UINT16* tatsumi_sprite_control_ram;
extern UINT16 *cyclwarr_videoram0, *cyclwarr_videoram1;

View File

@ -5,8 +5,10 @@
UINT16 tatsumi_control_word=0;
static UINT16 tatsumi_last_control=0;
static UINT16 tatsumi_last_irq=0;
static UINT8 apache3_adc;
UINT16 apache3_rotate_ctrl[12];
static int apache3_rot_idx;
UINT16 *tatsumi_68k_ram;
UINT8 *apache3_z80_ram;
@ -15,12 +17,11 @@ UINT8 *apache3_z80_ram;
void tatsumi_reset(running_machine *machine)
{
tatsumi_last_irq=0;
tatsumi_last_control = 0;
tatsumi_control_word = 0;
apache3_adc = 0;
apache3_rot_idx = 0;
state_save_register_global(machine, tatsumi_last_irq);
state_save_register_global(machine, tatsumi_last_control);
state_save_register_global(machine, tatsumi_control_word);
state_save_register_global(machine, apache3_adc);
@ -50,8 +51,6 @@ WRITE16_HANDLER( apache3_bank_w )
logerror("Unknown control Word: %04x\n",tatsumi_control_word);
cpu_set_input_line(space->machine->cpu[3], INPUT_LINE_HALT, CLEAR_LINE); // ?
}
if ((tatsumi_control_word&0x8)==0 && !(tatsumi_last_control&0x8))
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_IRQ4, ASSERT_LINE);
if (tatsumi_control_word&0x10)
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_HALT, ASSERT_LINE);
@ -66,22 +65,11 @@ WRITE16_HANDLER( apache3_bank_w )
tatsumi_last_control=tatsumi_control_word;
}
WRITE16_HANDLER( apache3_irq_ack_w )
// D1 = /ZBREQ - Z80 bus request
// D0 = /GRDACC - Allow 68000 access to road pattern RAM
WRITE16_HANDLER( apache3_z80_ctrl_w )
{
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_IRQ4, CLEAR_LINE);
if ((data&2) && (tatsumi_last_irq&2)==0)
{
cpu_set_input_line(space->machine->cpu[3], INPUT_LINE_HALT, ASSERT_LINE);
}
if ((tatsumi_last_irq&2) && (data&2)==0)
{
cpu_set_input_line(space->machine->cpu[3], INPUT_LINE_HALT, CLEAR_LINE);
cpu_set_input_line_and_vector(space->machine->cpu[3], 0, HOLD_LINE, 0xc7 | 0x10);
}
tatsumi_last_irq=data;
cpu_set_input_line(space->machine->cpu[3], INPUT_LINE_HALT, data & 2 ? ASSERT_LINE : CLEAR_LINE);
}
READ16_HANDLER( apache3_v30_v20_r )
@ -126,9 +114,19 @@ WRITE16_HANDLER(apache3_z80_w)
READ8_HANDLER( apache3_adc_r )
{
if (apache3_adc==0)
return input_port_read(space->machine, "STICKX");
return input_port_read(space->machine, "STICKY");
switch (apache3_adc)
{
case 0: return input_port_read(space->machine, "STICK_X");
case 1: return input_port_read(space->machine, "STICK_Y");
case 2: return 0; // VSP1
case 3: return 0;
case 4: return (UINT8)((255./100) * (100 - input_port_read(space->machine, "VR1")));
case 5: return input_port_read(space->machine, "THROTTLE");
case 6: return 0; // RPSNC
case 7: return 0; // LPSNC
}
return 0;
}
WRITE8_HANDLER( apache3_adc_w )
@ -136,14 +134,16 @@ WRITE8_HANDLER( apache3_adc_w )
apache3_adc = offset;
}
UINT16 apache3_a0000[16]; // TODO
static int a3counter=0; // TODO
WRITE16_HANDLER( apache3_a0000_w )
/* Ground/sky rotation control
*
* There are 12 16-bit values that are
* presumably loaded into the 8 TZ2213 custom
* accumulators and counters.
*/
WRITE16_HANDLER( apache3_rotate_w )
{
if (a3counter>15) // TODO
return;
apache3_a0000[a3counter++]=data;
apache3_rotate_ctrl[apache3_rot_idx] = data;
apache3_rot_idx = (apache3_rot_idx + 1) % 12;
}
/******************************************************************************/

View File

@ -7705,9 +7705,11 @@ Other Sun games
DRIVER( buggybjr ) /* (c) 1986 Tatsumi */
DRIVER( lockon ) /* (c) 1986 Tatsumi */
DRIVER( lockonc ) /* (c) 1986 Tatsumi */
/* Gray Out */ /* (c) 1987 Tatsumi */
/* Gray-Out */ /* (c) 1987 Tatsumi */
DRIVER( apache3 ) /* (c) 1988 Tatsumi */
DRIVER( apache3a ) /* (c) 1988 Tatsumi + Kana Corporation license */
DRIVER( roundup5 ) /* (c) 1989 Tatsumi */
/* Round Up 5 cockpit */
DRIVER( cyclwarr ) /* (c) 1991 Tatsumi */
DRIVER( bigfight ) /* (c) 1992 Tatsumi */
/* Life */ /* (c) 1997 Tatsumi */

View File

@ -6,6 +6,9 @@ static tilemap *layer0, *layer1, *layer2, *layer3;
static bitmap_t *temp_bitmap;
static UINT8 *apache3_road_x_ram;
static UINT8 apache3_road_z;
UINT16 *roundup_r_ram, *roundup_p_ram, *roundup_l_ram;
UINT16 *cyclwarr_videoram0, *cyclwarr_videoram1;
UINT16* tatsumi_sprite_control_ram;
@ -31,6 +34,17 @@ WRITE16_HANDLER(tatsumi_sprite_control_w)
/******************************************************************************/
WRITE16_HANDLER( apache3_road_z_w )
{
apache3_road_z = data & 0xff;
}
WRITE8_HANDLER( apache3_road_x_w )
{
// Note: Double buffered. Yes, this is correct :)
apache3_road_x_ram[data] = offset;
}
READ16_HANDLER( roundup5_vram_r )
{
offset+=((tatsumi_control_word&0x0c00)>>10) * 0xc000;
@ -194,6 +208,7 @@ VIDEO_START( apache3 )
tx_layer = tilemap_create(machine, get_text_tile_info,tilemap_scan_rows,8,8,64,64);
shadow_pen_array = auto_malloc(8192);
temp_bitmap = auto_bitmap_alloc(512, 512, BITMAP_FORMAT_RGB32);
apache3_road_x_ram = auto_malloc(512 * sizeof(UINT16));
memset(shadow_pen_array, 0, 8192);
tilemap_set_transparent_pen(tx_layer,0);
@ -997,14 +1012,81 @@ static void draw_bg(running_machine *machine, bitmap_t *dst, tilemap *src, const
}
}
/* Draw the sky and ground, applying rotation (eventually). Experimental! */
#if 0
static void draw_ground(running_machine *machine, bitmap_t *dst, const rectangle *cliprect)
{
int x, y;
const UINT8 *lut = memory_region(machine, "proms");
UINT16 gva = 0x180; // TODO
UINT8 sky_val = apache3_rotate_ctrl[1] & 0xff;
for (y = cliprect->min_y; y <= cliprect->max_y; ++y)
{
UINT16 rgdb = 0;//apache3_road_x_ram[gva & 0xff];
UINT16 gha = 0xf60; // test
int ln = (((lut[gva & 0x7f] & 0x7f) + (apache3_road_z & 0x7f)) >> 5) & 3;
if (gva & 0x100)
{
/* Sky */
for (x = cliprect->min_x; x <= cliprect->max_x; ++x)
{
*BITMAP_ADDR32(dst, y, x) = machine->pens[0x100 + (sky_val & 0x7f)];
/* Update horizontal counter? */
gha = (gha + 1) & 0xfff;
}
}
else
{
/* Ground */
for (x = cliprect->min_x; x <= cliprect->max_x; ++x)
{
UINT8 colour;
UINT16 hval;
UINT8 pixels;
int pix_sel;
hval = (rgdb + gha) & 0xfff; // Not quite
if (hval & 0x800)
hval ^= 0x1ff; // TEST
else
hval = hval;
pixels = apache3_g_ram[(((gva & 0xff) << 7) | ((hval >> 2) & 0x7f))];
pix_sel = hval & 3;
colour = (pixels >> (pix_sel << 1)) & 3;
colour = (BIT(hval, 11) << 4) | (colour << 2) | ln;
/* Draw the pixel */
*BITMAP_ADDR32(dst, y, x) = machine->pens[0x200 + colour];
/* Update horizontal counter */
gha = (gha + 1) & 0xfff;
}
}
/* Update sky counter */
sky_val++;
gva = (gva + 1) & 0x1ff;
}
}
#endif
/**********************************************************************/
VIDEO_UPDATE( apache3 )
{
update_cluts(screen->machine, 1024, 0, 2048);
tilemap_set_scrollx(tx_layer,0,24);
bitmap_fill(bitmap,cliprect,screen->machine->pens[0]);
draw_sky(screen->machine, bitmap, cliprect, 256, apache3_a0000[1]);
draw_sky(screen->machine, bitmap, cliprect, 256, apache3_rotate_ctrl[1]);
// draw_ground(screen->machine, bitmap, cliprect);
draw_sprites(screen->machine, bitmap,cliprect,0, (tatsumi_sprite_control_ram[0x20]&0x1000) ? 0x1000 : 0);
tilemap_draw(bitmap,cliprect,tx_layer,0,0);
return 0;