mame/src/mame/drivers/astrocorp.c
Fabio Priuli 1a309ff78b Cleaned up many driver data structs to obtain two results:
* drop almost completely the use of generic sizes with struct members 
* reduce as much as possible accesses to cputag calls during emulation (they are now mainly concentrated at MACHINE_START & DRIVER_INIT)

unfortunately I had been away for half a day and I have found only now rev 7446 (which could have been used in many of these cases). too late to use the new macro, sorry (almost 3AM here)
2009-11-29 01:49:13 +00:00

475 lines
16 KiB
C

/***************************************************************************
-= Astro Corp. Hardware =-
driver by Luca Elia (l.elia@tin.it)
CPU: 68000
GFX: ASTRO V01 0005 (512 sprites, each made of N x M tiles. Tiles are 16x16x8)
SOUND: OKI M6295 (AD-65)
OTHER: ASTRO 0001B, EEPROM
***************************************************************************/
#include "driver.h"
#include "cpu/m68000/m68000.h"
#include "machine/eepromdev.h"
#include "sound/okim6295.h"
typedef struct _astrocrp_state astrocrp_state;
struct _astrocrp_state
{
/* memory pointers */
UINT16 * spriteram;
UINT16 * paletteram;
size_t spriteram_size;
/* video-related */
UINT16 screen_enable;
};
/***************************************************************************
Sprites Format
Offset: Bits: Value:
0.w f--- ---- ---- ---- Show This Sprite
-edc ba98 7654 3210 X
1.w Code
2.w f--- ---- ---- ---- -
-edc ba98 7654 3210 Y
3.w fedc ba98 ---- ---- X Size
---- ---- 7654 3210 Y Size
***************************************************************************/
static void draw_sprites( running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect )
{
astrocrp_state *state = (astrocrp_state *)machine->driver_data;
UINT16 *source = state->spriteram;
UINT16 *finish = state->spriteram + state->spriteram_size / 2;
for ( ; source < finish; source += 8 / 2 )
{
int x, y;
int sx = source[ 0x0/2 ];
int code = source[ 0x2/2 ];
int sy = source[ 0x4/2 ];
int attr = source[ 0x6/2 ];
int dimx = (attr >> 8) & 0xff;
int dimy = (attr >> 0) & 0xff;
if (!dimx && !dimy)
return;
if (!(sx & 0x8000))
continue;
sx = (sx & 0x3fff) - (sx & 0x4000);
sy = (sy & 0x3fff) - (sy & 0x4000);
for (y = 0 ; y < dimy ; y++)
{
for (x = 0 ; x < dimx ; x++)
{
drawgfx_transpen(bitmap,cliprect, machine->gfx[0],
code++, 0,
0, 0,
sx + x * 16, sy + y * 16, 0xff);
}
}
}
}
static VIDEO_UPDATE(astrocorp)
{
astrocrp_state *state = (astrocrp_state *)screen->machine->driver_data;
if (state->screen_enable & 1)
{
bitmap_fill(bitmap,cliprect,screen->machine->pens[0xff]);
draw_sprites(screen->machine, bitmap, cliprect);
}
else
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
return 0;
}
/***************************************************************************
Memory Maps
***************************************************************************/
static WRITE16_HANDLER( astrocorp_eeprom_w )
{
if (ACCESSING_BITS_0_7)
{
input_port_write(space->machine, "EEPROMOUT", data, 0xff);
}
}
static WRITE16_DEVICE_HANDLER( astrocorp_sound_bank_w )
{
if (ACCESSING_BITS_8_15)
{
okim6295_set_bank_base(device, 0x40000 * ((data >> 8) & 1));
// logerror("CPU #0 PC %06X: OKI bank %08X\n", cpu_get_pc(space->cpu), data);
}
}
static WRITE16_HANDLER( astrocorp_outputs_w )
{
if (ACCESSING_BITS_0_7)
{
coin_counter_w(space->machine, 0, (data & 0x0004)); // coin counter
set_led_status(space->machine, 0, (data & 0x0008)); // you win
if ((data & 0x0010)) increment_dispensed_tickets(space->machine, 1); // coin out
set_led_status(space->machine, 1, (data & 0x0020)); // coin/hopper jam
}
if (ACCESSING_BITS_8_15)
{
set_led_status(space->machine, 2, (data & 0x0100)); // bet
set_led_status(space->machine, 3, (data & 0x0800)); // start
set_led_status(space->machine, 4, (data & 0x1000)); // ? select/choose
set_led_status(space->machine, 5, (data & 0x2000)); // ? select/choose
set_led_status(space->machine, 6, (data & 0x4000)); // look
}
// popmessage("%04X",data);
}
static WRITE16_HANDLER( astrocorp_enable_w )
{
astrocrp_state *state = (astrocrp_state *)space->machine->driver_data;
COMBINE_DATA(&state->screen_enable);
// popmessage("%04X",data);
if (data & (~1))
logerror("CPU #0 PC %06X: screen enable = %04X\n", cpu_get_pc(space->cpu), data);
}
static READ16_HANDLER( astrocorp_unk_r )
{
return 0xffff; // bit 3?
}
// 5-6-5 Palette: BBBBB-GGGGGG-RRRRR
static WRITE16_HANDLER( astrocorp_palette_w )
{
astrocrp_state *state = (astrocrp_state *)space->machine->driver_data;
COMBINE_DATA(&state->paletteram[offset]);
palette_set_color_rgb(space->machine, offset,
pal5bit((state->paletteram[offset] >> 0) & 0x1f),
pal6bit((state->paletteram[offset] >> 5) & 0x3f),
pal5bit((state->paletteram[offset] >> 11) & 0x1f)
);
}
static ADDRESS_MAP_START( showhand_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE( 0x000000, 0x01ffff ) AM_ROM
AM_RANGE( 0x050000, 0x050fff ) AM_RAM AM_BASE_MEMBER(astrocrp_state, spriteram) AM_SIZE_MEMBER(astrocrp_state, spriteram_size)
AM_RANGE( 0x052000, 0x052001 ) AM_WRITENOP
AM_RANGE( 0x054000, 0x054001 ) AM_READ_PORT("INPUTS")
AM_RANGE( 0x058000, 0x058001 ) AM_WRITE(astrocorp_eeprom_w)
AM_RANGE( 0x05a000, 0x05a001 ) AM_WRITE(astrocorp_outputs_w)
AM_RANGE( 0x05e000, 0x05e001 ) AM_READ_PORT("EEPROMIN")
AM_RANGE( 0x060000, 0x0601ff ) AM_RAM_WRITE(astrocorp_palette_w) AM_BASE_MEMBER(astrocrp_state, paletteram)
AM_RANGE( 0x070000, 0x073fff ) AM_RAM
AM_RANGE( 0x080000, 0x080001 ) AM_DEVWRITE("oki", astrocorp_sound_bank_w)
AM_RANGE( 0x0a0000, 0x0a0001 ) AM_WRITE(astrocorp_enable_w)
AM_RANGE( 0x0d0000, 0x0d0001 ) AM_READ(astrocorp_unk_r) AM_DEVWRITE8("oki", okim6295_w, 0xff00)
ADDRESS_MAP_END
static ADDRESS_MAP_START( showhanc_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE( 0x000000, 0x01ffff ) AM_ROM
AM_RANGE( 0x060000, 0x0601ff ) AM_RAM_WRITE(astrocorp_palette_w) AM_BASE_MEMBER(astrocrp_state, paletteram)
AM_RANGE( 0x070000, 0x070001 ) AM_DEVWRITE("oki", astrocorp_sound_bank_w)
AM_RANGE( 0x080000, 0x080fff ) AM_RAM AM_BASE_MEMBER(astrocrp_state, spriteram) AM_SIZE_MEMBER(astrocrp_state, spriteram_size)
AM_RANGE( 0x082000, 0x082001 ) AM_WRITENOP
AM_RANGE( 0x084000, 0x084001 ) AM_READ_PORT("INPUTS")
AM_RANGE( 0x088000, 0x088001 ) AM_WRITE(astrocorp_eeprom_w)
AM_RANGE( 0x08a000, 0x08a001 ) AM_WRITE(astrocorp_outputs_w)
AM_RANGE( 0x08e000, 0x08e001 ) AM_READ_PORT("EEPROMIN")
AM_RANGE( 0x090000, 0x093fff ) AM_RAM
AM_RANGE( 0x0a0000, 0x0a0001 ) AM_WRITE(astrocorp_enable_w)
AM_RANGE( 0x0e0000, 0x0e0001 ) AM_READ(astrocorp_unk_r) AM_DEVWRITE8("oki", okim6295_w, 0xff00)
ADDRESS_MAP_END
/***************************************************************************
Input Ports
***************************************************************************/
static INPUT_PORTS_START( showhand )
PORT_START("INPUTS") // 54000
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) // coin
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Payout") PORT_CODE(KEYCODE_F1) // payout (must be 0 on startup)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Bet / Double")
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Look / Small")
PORT_SERVICE_NO_TOGGLE( 0x0020, IP_ACTIVE_LOW ) // settings
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_SPECIAL ) // coin sensor
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Yes / Big")
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Hold1") // HOLD1 in test mode
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Select")
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Start / Take")
PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Reset Settings") // when 1 in test mode: reset settings (must be 0 on startup)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_COIN2 ) // key in
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_SPECIAL ) // coin sensor
PORT_START( "EEPROMIN" )
PORT_BIT( 0xfff7, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_READ_LINE_DEVICE("eeprom", eepromdev_read_bit)
PORT_START( "EEPROMOUT" )
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE("eeprom", eepromdev_write_bit)
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE("eeprom", eepromdev_set_clock_line)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE("eeprom", eepromdev_set_cs_line)
INPUT_PORTS_END
static INPUT_PORTS_START( showhanc )
PORT_START("INPUTS") // 84000
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) // coin
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Payout") PORT_CODE(KEYCODE_F1) // payout (must be 0 on startup)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Bet / Double")
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Select")
PORT_SERVICE_NO_TOGGLE( 0x0020, IP_ACTIVE_LOW ) // settings
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Start / Take") // HOLD1 in test mode
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Look / Small / Exit") // HOLD5 in test mode
PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Hold2") // HOLD2 in test mode
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Yes / Big") // HOLD4 in test mode
PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Reset Settings") // when 1 in test mode: reset settings (must be 0 on startup)
PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_SPECIAL ) // must be 0 for inputs to work
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) // key in (shows an error)
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START( "EEPROMIN" )
PORT_BIT( 0xfff7, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_READ_LINE_DEVICE("eeprom", eepromdev_read_bit)
PORT_START( "EEPROMOUT" )
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE("eeprom", eepromdev_write_bit)
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE("eeprom", eepromdev_set_clock_line)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE("eeprom", eepromdev_set_cs_line)
INPUT_PORTS_END
/***************************************************************************
Graphics Layout
***************************************************************************/
static const gfx_layout layout_16x16x8 =
{
16, 16,
RGN_FRAC(1, 1),
8,
{ STEP8(0,1) },
{ STEP16(0,8) },
{ STEP16(0,16*8) },
16*16*8
};
static GFXDECODE_START( astrocorp )
GFXDECODE_ENTRY("sprites", 0, layout_16x16x8, 0, 1)
GFXDECODE_END
/***************************************************************************
Machine Drivers
***************************************************************************/
static MACHINE_START( showhand )
{
astrocrp_state *state = (astrocrp_state *)machine->driver_data;
state_save_register_global(machine, state->screen_enable);
}
static MACHINE_RESET( showhand )
{
astrocrp_state *state = (astrocrp_state *)machine->driver_data;
state->screen_enable = 0;
}
static const UINT16 showhand_default_eeprom[0x0f] = {0x0001,0x0007,0x000a,0x0003,0x0000,0x0009,0x0003,0x0000,0x0002,0x0001,0x0000,0x0000,0x0000,0x0000,0x0000};
static MACHINE_DRIVER_START( showhand )
/* driver data */
MDRV_DRIVER_DATA(astrocrp_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, XTAL_20MHz / 2)
MDRV_CPU_PROGRAM_MAP(showhand_map)
MDRV_CPU_VBLANK_INT("screen", irq4_line_hold)
MDRV_MACHINE_START(showhand)
MDRV_MACHINE_RESET(showhand)
MDRV_EEPROM_93C46_ADD("eeprom", sizeof(showhand_default_eeprom), showhand_default_eeprom)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(58.846) // measured on pcb
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(320, 240)
MDRV_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1)
MDRV_GFXDECODE(astrocorp)
MDRV_PALETTE_LENGTH(0x100)
MDRV_VIDEO_UPDATE(astrocorp)
/* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD("oki", OKIM6295, XTAL_20MHz/20)
MDRV_SOUND_CONFIG(okim6295_interface_pin7high)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( showhanc )
MDRV_IMPORT_FROM( showhand )
MDRV_CPU_MODIFY("maincpu")
MDRV_CPU_PROGRAM_MAP(showhanc_map)
MACHINE_DRIVER_END
/***************************************************************************
ROMs Loading
***************************************************************************/
/***************************************************************************
Show Hand
(C) 1999? Astro Corp.
PCB CHE-B50-4002A 88 94V-0 0002
CPU 1x MC68HC000FN12 (main)
1x pLSI1016-60LJ (main)
1x ASTRO V01 0005 (custom)
1x AD-65 (equivalent to OKI6295)(sound)
1x ASTRO 0001B (custom)
1x oscillator 20.000MHz
1x oscillator 25.601712MHz
ROMs 2x 27C512 (1,2)
2x M27C801 (3,4)
1x M27C4001 (5)
1x 93C46 (not dumped)
Note 1x 28x2 JAMMA edge connector
1x 18x2 edge connector
1x 10x2 edge connector
1x pushbutton
1x trimmer (volume)
1x 2x2 switches dip
Hardware info by f205v
***************************************************************************/
ROM_START( showhand )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD16_BYTE( "1-8.even.u16", 0x00000, 0x10000, CRC(cf34bf0d) SHA1(72ad7ca63ef89451b2572d64cccfa764b9d9b353) )
ROM_LOAD16_BYTE( "2-8.odd.u17", 0x00001, 0x10000, CRC(dd031c36) SHA1(198d0e685dd2d824a04c787f8a17c173efa272d9) )
ROM_REGION( 0x200000, "sprites", 0 )
ROM_LOAD16_BYTE( "4.even.u26", 0x000000, 0x100000, CRC(8a706e42) SHA1(989688ee3a5e4fc11fb502e43c9d6012488982ee) )
ROM_LOAD16_BYTE( "3.odd.u26", 0x000001, 0x100000, CRC(a624b750) SHA1(fc5b09f8a10cba5fb2474e1edd62a0400177a5ad) )
ROM_REGION( 0x80000, "oki", 0 )
ROM_LOAD( "5", 0x00000, 0x80000, CRC(e6987122) SHA1(fb3e7c2399057c64b5c496a393f6f22a1e54c844) )
ROM_END
/***************************************************************************
Show Hand
Astro Corp, 199?
PCB Layout
----------
CHE-B50-4002A
|----------------------------------------|
| LATTICE JAMMA SW VOL UPC1242|
| PLSI1016 U26 |
| 6264 U43|
| U25 M6295 |
| 68000 |
| U17 |-----| |
| |ASTRO| |
| U16 |V01 | |
| |-----|MDT2020AP/3V
| 6264 20MHz |
|DSW(2) 26.601712MHz|
|93C46 6116 6116 KM681000 |
|BATTERY 6116 6116 KM681000 |
|----------------------------------------|
Notes:
68000 clock - 10.000MHz [20/2]
M6295 clock - 1.000MHz [20/20], pin 7 HIGH
VSync - 58.846Hz
HSync - 15.354kHz
Hardware info by Guru
***************************************************************************/
ROM_START( showhanc )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD16_BYTE( "1even.u16", 0x00000, 0x10000, CRC(d1295bdb) SHA1(bb035ee89b21368fb11c3b9cd23164b68feb84bd) )
ROM_LOAD16_BYTE( "2odd.u17", 0x00001, 0x10000, CRC(bbca78e7) SHA1(a163569acad8d6b8821602ce24013fc46887aba9) )
ROM_REGION( 0x200000, "sprites", 0 )
ROM_LOAD16_BYTE( "4even.u26", 0x00000, 0x100000, CRC(285375e0) SHA1(63b47105f0751c65e528139074f5b342450495ba) )
ROM_LOAD16_BYTE( "3odd.u25", 0x00001, 0x100000, CRC(b93e3a91) SHA1(5192375c32518532e08bddfe000efdee587e1ecc) )
ROM_REGION( 0x80000, "oki", 0 )
ROM_LOAD( "5.u43", 0x00000, 0x80000, CRC(d6b70f02) SHA1(5a94680594c1f06196fe3bcf7faf56e2ed576f01) )
ROM_END
static DRIVER_INIT( showhand )
{
#if 0
UINT16 *rom = (UINT16*)memory_region(machine, "maincpu");
rom[0x0a1a/2] = 0x6000; // hopper jam
rom[0x1494/2] = 0x4e71; // enable full test mode
rom[0x1496/2] = 0x4e71; // ""
rom[0x1498/2] = 0x4e71; // ""
rom[0x12f6/2] = 0x6000; // rom error
rom[0x4916/2] = 0x6000; // rom error
#endif
}
static DRIVER_INIT( showhanc )
{
#if 0
UINT16 *rom = (UINT16*)memory_region(machine, "maincpu");
rom[0x14d4/2] = 0x4e71; // enable full test mode
rom[0x14d6/2] = 0x4e71; // ""
rom[0x14d8/2] = 0x4e71; // ""
rom[0x139c/2] = 0x6000; // rom error
#endif
}
GAME( 1999?, showhand, 0, showhand, showhand, showhand, ROT0, "Astro Corp.", "Show Hand (Italy)", GAME_SUPPORTS_SAVE )
GAME( 1999?, showhanc, showhand, showhanc, showhanc, showhanc, ROT0, "Astro Corp.", "Wang Pai Dui Jue", GAME_SUPPORTS_SAVE )