diff options
-rw-r--r-- | src/mame/drivers/adp.c | 98 | ||||
-rw-r--r-- | src/mame/drivers/albazc.c | 49 | ||||
-rw-r--r-- | src/mame/drivers/arabian.c | 80 | ||||
-rw-r--r-- | src/mame/includes/arabian.h | 28 | ||||
-rw-r--r-- | src/mame/video/arabian.c | 79 |
5 files changed, 201 insertions, 133 deletions
diff --git a/src/mame/drivers/adp.c b/src/mame/drivers/adp.c index 1378c5e751c..7f1ebb07a6d 100644 --- a/src/mame/drivers/adp.c +++ b/src/mame/drivers/adp.c @@ -150,13 +150,17 @@ Video board has additional chips: #include "machine/microtch.h" #include "machine/68681.h" -static UINT8 register_active; -static UINT8 mux_data; - -static struct +typedef struct _adp_state adp_state; +struct _adp_state { - const device_config *duart68681; -} skattv_devices; + /* misc */ + UINT8 mux_data; + UINT8 register_active; + + /* devices */ + const device_config *duart; +}; + /*************************************************************************** @@ -164,38 +168,47 @@ static struct ***************************************************************************/ -static void duart_irq_handler(const device_config *device, UINT8 vector) +static void duart_irq_handler( const device_config *device, UINT8 vector ) { cputag_set_input_line_and_vector(device->machine, "maincpu", 4, HOLD_LINE, vector); }; -static void duart_tx(const device_config *device, int channel, UINT8 data) +static void duart_tx( const device_config *device, int channel, UINT8 data ) { - if ( channel == 0 ) + if (channel == 0) { microtouch_rx(1, &data); } }; -static void microtouch_tx(running_machine *machine, UINT8 data) +static void microtouch_tx( running_machine *machine, UINT8 data ) { - duart68681_rx_data(skattv_devices.duart68681, 0, data); + adp_state *state = (adp_state *)machine->driver_data; + duart68681_rx_data(state->duart, 0, data); } -static UINT8 duart_input(const device_config *device) +static UINT8 duart_input( const device_config *device ) { return input_port_read(device->machine, "DSW1"); } static MACHINE_START( skattv ) { + adp_state *state = (adp_state *)machine->driver_data; microtouch_init(machine, microtouch_tx, 0); + + state->duart = devtag_get_device(machine, "duart68681"); + + state_save_register_global(machine, state->mux_data); + state_save_register_global(machine, state->register_active); } static MACHINE_RESET( skattv ) { - skattv_devices.duart68681 = devtag_get_device( machine, "duart68681" ); - mux_data = 0; + adp_state *state = (adp_state *)machine->driver_data; + + state->mux_data = 0; + state->register_active = 0; } static const duart68681_config skattv_duart68681_config = @@ -210,10 +223,9 @@ static PALETTE_INIT( adp ) { int i; - - for (i = 0;i < machine->config->total_colors;i++) + for (i = 0; i < machine->config->total_colors; i++) { - int bit0,bit1,bit2,r,g,b; + int bit0, bit1, bit2, r, g, b; // red component @@ -232,7 +244,7 @@ static PALETTE_INIT( adp ) bit2 = (i >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(machine,i,MAKE_RGB(r,g,b)); + palette_set_color(machine, i, MAKE_RGB(r,g,b)); } } @@ -250,7 +262,7 @@ static VIDEO_START(adp) static VIDEO_UPDATE(adp) { - int x,y,b; + int x, y, b; b = ((HD63484_reg[0xcc/2] & 0x000f) << 16) + HD63484_reg[0xce/2]; #if 0 @@ -321,11 +333,12 @@ if (!input_code_pressed(screen->machine, KEYCODE_O)) return 0; } -static READ16_HANDLER(test_r) +static READ16_HANDLER( test_r ) { + adp_state *state = (adp_state *)space->machine->driver_data; int value = 0xffff; - switch(mux_data) + switch (state->mux_data) { case 0x00: value = input_port_read(space->machine, "x0"); break; case 0x01: value = input_port_read(space->machine, "x1snd"); break; @@ -344,8 +357,9 @@ static READ16_HANDLER(test_r) case 0x0e: value = input_port_read(space->machine, "x14"); break; case 0x0f: value = input_port_read(space->machine, "x15"); break; } - mux_data++; - mux_data&=0xf; + + state->mux_data++; + state->mux_data &= 0xf; return value; } @@ -353,22 +367,23 @@ static READ16_HANDLER(test_r) /*???*/ static WRITE16_HANDLER(wh2_w) { - register_active = data; + adp_state *state = (adp_state *)space->machine->driver_data; + state->register_active = data; } static READ16_HANDLER(t2_r) { - static UINT16 vblank = 0,hblank = 0; + static UINT16 vblank = 0, hblank = 0; - vblank ^=0x40; - hblank ^=0x20; + vblank ^=0x40; + hblank ^=0x20; - return mame_rand(space->machine) & 0x00f0; + return mame_rand(space->machine) & 0x00f0; // FIXME: this code is never executed // popmessage("%08x",cpu_get_pc(space->cpu)); // return 0x0000; - return 0xff9f | vblank | hblank; + return 0xff9f | vblank | hblank; } static ADDRESS_MAP_START( skattv_mem, ADDRESS_SPACE_PROGRAM, 16 ) @@ -514,6 +529,10 @@ static INTERRUPT_GEN( adp_int ) } */ static MACHINE_DRIVER_START( quickjac ) + + /* driver data */ + MDRV_DRIVER_DATA(adp_state) + MDRV_CPU_ADD("maincpu", M68000, 8000000) MDRV_CPU_PROGRAM_MAP(quickjac_mem) // MDRV_CPU_VBLANK_INT("screen", adp_int) @@ -542,6 +561,10 @@ static MACHINE_DRIVER_START( quickjac ) MACHINE_DRIVER_END static MACHINE_DRIVER_START( skattv ) + + /* driver data */ + MDRV_DRIVER_DATA(adp_state) + MDRV_CPU_ADD("maincpu", M68000, 8000000) MDRV_CPU_PROGRAM_MAP(skattv_mem) // MDRV_CPU_VBLANK_INT("screen", adp_int) @@ -570,6 +593,10 @@ static MACHINE_DRIVER_START( skattv ) MACHINE_DRIVER_END static MACHINE_DRIVER_START( backgamn ) + + /* driver data */ + MDRV_DRIVER_DATA(adp_state) + MDRV_CPU_ADD("maincpu", M68000, 8000000) MDRV_CPU_PROGRAM_MAP(backgamn_mem) @@ -662,10 +689,9 @@ ROM_START( funlddlx ) ROM_LOAD16_BYTE( "flv_f1_ii.bin", 0x00001, 0x80000, CRC(2aa904e6) SHA1(864530b136dd488d619cc95f48e7dce8d93d88e0) ) ROM_END -GAME( 1990, backgamn, 0, backgamn, adp, 0, ROT0, "ADP", "Backgammon", GAME_NOT_WORKING ) -GAME( 1993, quickjac, 0, quickjac, skattv, 0, ROT0, "ADP", "Quick Jack", GAME_NOT_WORKING ) -GAME( 1994, skattv, 0, skattv, skattv, 0, ROT0, "ADP", "Skat TV", GAME_NOT_WORKING ) -GAME( 1995, skattva, skattv, skattv, skattv, 0, ROT0, "ADP", "Skat TV (version TS3)", GAME_NOT_WORKING ) -GAME( 1997, fashiong, 0, skattv, skattv, 0, ROT0, "ADP", "Fashion Gambler", GAME_NOT_WORKING ) -GAME( 1999, funlddlx, 0, funland, skattv, 0, ROT0, "Stella", "Funny Land de Luxe", GAME_NOT_WORKING ) - +GAME( 1990, backgamn, 0, backgamn, adp, 0, ROT0, "ADP", "Backgammon", GAME_NOT_WORKING ) +GAME( 1993, quickjac, 0, quickjac, skattv, 0, ROT0, "ADP", "Quick Jack", GAME_NOT_WORKING ) +GAME( 1994, skattv, 0, skattv, skattv, 0, ROT0, "ADP", "Skat TV", GAME_NOT_WORKING ) +GAME( 1995, skattva, skattv, skattv, skattv, 0, ROT0, "ADP", "Skat TV (version TS3)", GAME_NOT_WORKING ) +GAME( 1997, fashiong, 0, skattv, skattv, 0, ROT0, "ADP", "Fashion Gambler", GAME_NOT_WORKING ) +GAME( 1999, funlddlx, 0, funland, skattv, 0, ROT0, "Stella", "Funny Land de Luxe", GAME_NOT_WORKING ) diff --git a/src/mame/drivers/albazc.c b/src/mame/drivers/albazc.c index aaf5b3864bc..e6df79645d0 100644 --- a/src/mame/drivers/albazc.c +++ b/src/mame/drivers/albazc.c @@ -14,45 +14,52 @@ TODO: #include "cpu/z80/z80.h" #include "sound/ay8910.h" -/* video */ +typedef struct _albazc_state albazc_state; +struct _albazc_state +{ + /* video-related */ + UINT8 * spriteram1; + UINT8 * spriteram2; + UINT8 * spriteram3; +}; -static UINT8 *hanaroku_spriteram1; -static UINT8 *hanaroku_spriteram2; -static UINT8 *hanaroku_spriteram3; +/* video */ + static PALETTE_INIT( hanaroku ) { int i; - int r,g,b; + int r, g, b; for (i = 0; i < 0x200; i++) { - b = (color_prom[i*2+1] & 0x1f); - g = ((color_prom[i*2+1] & 0xe0) | ( (color_prom[i*2+0]& 0x03) <<8) ) >> 5; - r = (color_prom[i*2+0]&0x7c) >> 2; + b = (color_prom[i * 2 + 1] & 0x1f); + g = ((color_prom[i * 2 + 1] & 0xe0) | ((color_prom[i * 2 + 0]& 0x03) <<8)) >> 5; + r = (color_prom[i * 2 + 0] & 0x7c) >> 2; - palette_set_color_rgb(machine,i,pal5bit(r),pal5bit(g),pal5bit(b)); + palette_set_color_rgb(machine, i, pal5bit(r), pal5bit(g), pal5bit(b)); } } -static VIDEO_START(hanaroku) +static VIDEO_START( hanaroku ) { } -static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) { + albazc_state *state = (albazc_state *)machine->driver_data; int i; for (i = 511; i >= 0; i--) { - int code = hanaroku_spriteram1[i] | (hanaroku_spriteram2[i] << 8); - int color = (hanaroku_spriteram2[i + 0x200] & 0xf8) >> 3; + int code = state->spriteram1[i] | (state->spriteram2[i] << 8); + int color = (state->spriteram2[i + 0x200] & 0xf8) >> 3; int flipx = 0; int flipy = 0; - int sx = hanaroku_spriteram1[i + 0x200] | ((hanaroku_spriteram2[i + 0x200] & 0x07) << 8); - int sy = 242 - hanaroku_spriteram3[i]; + int sx = state->spriteram1[i + 0x200] | ((state->spriteram2[i + 0x200] & 0x07) << 8); + int sy = 242 - state->spriteram3[i]; if (flip_screen_get(machine)) { @@ -120,9 +127,9 @@ static WRITE8_HANDLER( hanaroku_out_2_w ) static ADDRESS_MAP_START( hanaroku_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0x8000, 0x87ff) AM_RAM AM_BASE(&hanaroku_spriteram1) - AM_RANGE(0x9000, 0x97ff) AM_RAM AM_BASE(&hanaroku_spriteram2) - AM_RANGE(0xa000, 0xa1ff) AM_RAM AM_BASE(&hanaroku_spriteram3) + AM_RANGE(0x8000, 0x87ff) AM_RAM AM_BASE_MEMBER(albazc_state, spriteram1) + AM_RANGE(0x9000, 0x97ff) AM_RAM AM_BASE_MEMBER(albazc_state, spriteram2) + AM_RANGE(0xa000, 0xa1ff) AM_RAM AM_BASE_MEMBER(albazc_state, spriteram3) AM_RANGE(0xa200, 0xa2ff) AM_WRITENOP // ??? written once during P.O.S.T. AM_RANGE(0xa300, 0xa304) AM_WRITENOP // ??? AM_RANGE(0xb000, 0xb000) AM_WRITENOP // ??? always 0x40 @@ -227,6 +234,10 @@ static const ay8910_interface ay8910_config = static MACHINE_DRIVER_START( hanaroku ) + + /* driver data */ + MDRV_DRIVER_DATA(albazc_state) + MDRV_CPU_ADD("maincpu", Z80,6000000) /* ? MHz */ MDRV_CPU_PROGRAM_MAP(hanaroku_map) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) @@ -271,4 +282,4 @@ ROM_START( hanaroku ) ROM_END -GAME( 1988, hanaroku, 0, hanaroku, hanaroku, 0, ROT0, "Alba", "Hanaroku", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS ) +GAME( 1988, hanaroku, 0, hanaroku, hanaroku, 0, ROT0, "Alba", "Hanaroku", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/arabian.c b/src/mame/drivers/arabian.c index 4b5ab49a2ea..4fedab47ba8 100644 --- a/src/mame/drivers/arabian.c +++ b/src/mame/drivers/arabian.c @@ -71,18 +71,10 @@ #include "arabian.h" #include "sound/ay8910.h" - /* constants */ #define MAIN_OSC 12000000 -/* local variables */ -static UINT8 custom_cpu_reset; -static UINT8 custom_cpu_busy; -static UINT8 *custom_cpu_ram; - - - /************************************* * * Audio chip output ports @@ -91,6 +83,8 @@ static UINT8 *custom_cpu_ram; static WRITE8_DEVICE_HANDLER( ay8910_porta_w ) { + arabian_state *state = (arabian_state *)device->machine->driver_data; + /* bit 7 = ENA bit 6 = ENB @@ -98,12 +92,14 @@ static WRITE8_DEVICE_HANDLER( ay8910_porta_w ) bit 4 = /AGHF bit 3 = /ARHF */ - arabian_video_control = data; + state->video_control = data; } static WRITE8_DEVICE_HANDLER( ay8910_portb_w ) { + arabian_state *state = (arabian_state *)device->machine->driver_data; + /* bit 5 = /IREQ to custom CPU bit 4 = /SRES to custom CPU @@ -112,7 +108,7 @@ static WRITE8_DEVICE_HANDLER( ay8910_portb_w ) */ /* track the custom CPU reset */ - custom_cpu_reset = ~data & 0x10; + state->custom_cpu_reset = ~data & 0x10; /* clock the coin counters */ coin_counter_w(1, ~data & 0x02); @@ -129,6 +125,8 @@ static WRITE8_DEVICE_HANDLER( ay8910_portb_w ) static READ8_HANDLER( custom_cpu_r ) { + arabian_state *state = (arabian_state *)space->machine->driver_data; + /* since we don't have a simulator for the Fujitsu 8841 4-bit microprocessor */ /* we have to simulate its behavior; it looks like Arabian reads out of the */ /* alternate CPU's RAM space while the CPU is running. If the CPU is not */ @@ -137,8 +135,8 @@ static READ8_HANDLER( custom_cpu_r ) static const char *const comnames[] = { "COM0", "COM1", "COM2", "COM3", "COM4", "COM5" }; /* if the CPU reset line is being held down, just return RAM */ - if (custom_cpu_reset) - return custom_cpu_ram[0x7f0 + offset]; + if (state->custom_cpu_reset) + return state->custom_cpu_ram[0x7f0 + offset]; /* otherwise, assume the custom CPU is live */ switch (offset) @@ -157,28 +155,32 @@ static READ8_HANDLER( custom_cpu_r ) /* it wants. There appears to be a number of different ways to make */ /* the custom turn this on. */ case 6: - return custom_cpu_busy ^= 1; + return state->custom_cpu_busy ^= 1; /* handshake read; the main CPU writes to the previous memory location */ /* and waits for the custom to copy that value here */ case 8: - return custom_cpu_ram[0x7f0 + offset - 1]; + return state->custom_cpu_ram[0x7f0 + offset - 1]; /* error cases */ default: - logerror("Input Port %04X read. PC=%04X\n", offset+0xd7f0, cpu_get_pc(space->cpu)); + logerror("Input Port %04X read. PC = %04X\n", offset + 0xd7f0, cpu_get_pc(space->cpu)); } return 0; } static WRITE8_HANDLER( custom_cpu_w ) { - custom_cpu_ram[0x7f0 + offset] = data; + arabian_state *state = (arabian_state *)space->machine->driver_data; + + state->custom_cpu_ram[0x7f0 + offset] = data; } -static void update_flip_state(void) +static void update_flip_state( running_machine *machine ) { + arabian_state *state = (arabian_state *)machine->driver_data; + /* the custom CPU also controls the video flip control line; unfortunately, */ /* it appears that the custom is smart enough to flip the screen itself, based */ /* on the information stored at $d400 and $d401. The value at $d400 specifies */ @@ -187,25 +189,29 @@ static void update_flip_state(void) /* state. */ /* initial state is based on the flip screen flag */ - arabian_flip_screen = custom_cpu_ram[0x34b]; + state->flip_screen = state->custom_cpu_ram[0x34b]; /* flip if not player 1 and cocktail mode */ - if (custom_cpu_ram[0x400] != 0 && !(custom_cpu_ram[0x401] & 0x02)) - arabian_flip_screen = !arabian_flip_screen; + if (state->custom_cpu_ram[0x400] != 0 && !(state->custom_cpu_ram[0x401] & 0x02)) + state->flip_screen = !state->flip_screen; } static WRITE8_HANDLER( custom_flip_w ) { - custom_cpu_ram[0x34b + offset] = data; - update_flip_state(); + arabian_state *state = (arabian_state *)space->machine->driver_data; + + state->custom_cpu_ram[0x34b + offset] = data; + update_flip_state(space->machine); } static WRITE8_HANDLER( custom_cocktail_w ) { - custom_cpu_ram[0x400 + offset] = data; - update_flip_state(); + arabian_state *state = (arabian_state *)space->machine->driver_data; + + state->custom_cpu_ram[0x400 + offset] = data; + update_flip_state(space->machine); } @@ -221,9 +227,9 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x8000, 0xbfff) AM_WRITE(arabian_videoram_w) AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x01ff) AM_READ_PORT("IN0") AM_RANGE(0xc200, 0xc200) AM_MIRROR(0x01ff) AM_READ_PORT("DSW1") - AM_RANGE(0xd000, 0xd7ef) AM_RAM AM_BASE(&custom_cpu_ram) + AM_RANGE(0xd000, 0xd7ef) AM_RAM AM_BASE_MEMBER(arabian_state, custom_cpu_ram) AM_RANGE(0xd7f0, 0xd7ff) AM_READWRITE(custom_cpu_r, custom_cpu_w) - AM_RANGE(0xe000, 0xe007) AM_MIRROR(0x0ff8) AM_WRITE(arabian_blitter_w) AM_BASE(&arabian_blitter) + AM_RANGE(0xe000, 0xe007) AM_MIRROR(0x0ff8) AM_WRITE(arabian_blitter_w) AM_BASE_MEMBER(arabian_state, blitter) ADDRESS_MAP_END @@ -368,19 +374,35 @@ static const ay8910_interface ay8910_config = static MACHINE_START( arabian ) { - state_save_register_global(machine, custom_cpu_reset); - state_save_register_global(machine, custom_cpu_busy); + arabian_state *state = (arabian_state *)machine->driver_data; + + state_save_register_global(machine, state->custom_cpu_reset); + state_save_register_global(machine, state->custom_cpu_busy); +} + +static MACHINE_RESET( arabian ) +{ + arabian_state *state = (arabian_state *)machine->driver_data; + + state->custom_cpu_reset = 0; + state->custom_cpu_busy = 0; + state->video_control = 0; + state->flip_screen = 0; } static MACHINE_DRIVER_START( arabian ) + /* driver data */ + MDRV_DRIVER_DATA(arabian_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80, MAIN_OSC/4) MDRV_CPU_PROGRAM_MAP(main_map) MDRV_CPU_IO_MAP(main_io_map) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) - MDRV_MACHINE_START(arabian) + MDRV_MACHINE_START(arabian) + MDRV_MACHINE_RESET(arabian) /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) diff --git a/src/mame/includes/arabian.h b/src/mame/includes/arabian.h index 0ef1eeb9bb6..797c8c349f7 100644 --- a/src/mame/includes/arabian.h +++ b/src/mame/includes/arabian.h @@ -6,15 +6,31 @@ ***************************************************************************/ +typedef struct _arabian_state arabian_state; +struct _arabian_state +{ + /* memory pointers */ + UINT8 * blitter; + UINT8 * custom_cpu_ram; + + UINT8 * main_bitmap; + UINT8 * converted_gfx; + + /* video-related */ + UINT8 video_control; + UINT8 flip_screen; + + /* misc */ + UINT8 custom_cpu_reset; + UINT8 custom_cpu_busy; +}; + + /*----------- defined in video/arabian.c -----------*/ -extern UINT8 *arabian_blitter; -extern UINT8 arabian_video_control; -extern UINT8 arabian_flip_screen; +WRITE8_HANDLER( arabian_blitter_w ); +WRITE8_HANDLER( arabian_videoram_w ); PALETTE_INIT( arabian ); VIDEO_START( arabian ); VIDEO_UPDATE( arabian ); - -WRITE8_HANDLER( arabian_blitter_w ); -WRITE8_HANDLER( arabian_videoram_w ); diff --git a/src/mame/video/arabian.c b/src/mame/video/arabian.c index 55177631cd1..92a8cc028de 100644 --- a/src/mame/video/arabian.c +++ b/src/mame/video/arabian.c @@ -9,24 +9,11 @@ #include "driver.h" #include "arabian.h" - /* Constants */ #define BITMAP_WIDTH 256 #define BITMAP_HEIGHT 256 -/* Local variables */ -static UINT8 *main_bitmap; -static UINT8 *converted_gfx; - - -/* Globals */ -UINT8 *arabian_blitter; -UINT8 arabian_video_control; -UINT8 arabian_flip_screen; - - - /************************************* * * Color PROM conversion @@ -166,16 +153,17 @@ PALETTE_INIT( arabian ) VIDEO_START( arabian ) { + arabian_state *state = (arabian_state *)machine->driver_data; UINT8 *gfxbase = memory_region(machine, "gfx1"); int offs; /* allocate a common bitmap to use for both planes */ /* plane A (top plane with motion objects) is in the upper 4 bits */ /* plane B (bottom plane with playfield) is in the lower 4 bits */ - main_bitmap = auto_alloc_array(machine, UINT8, BITMAP_WIDTH * BITMAP_HEIGHT); + state->main_bitmap = auto_alloc_array(machine, UINT8, BITMAP_WIDTH * BITMAP_HEIGHT); /* allocate memory for the converted graphics data */ - converted_gfx = auto_alloc_array(machine, UINT8, 0x8000 * 2); + state->converted_gfx = auto_alloc_array(machine, UINT8, 0x8000 * 2); /*-------------------------------------------------- transform graphics data into more usable format @@ -212,16 +200,16 @@ VIDEO_START( arabian ) v2 >>= 1; p4 = (v1 & 0x01) | ((v1 & 0x10) >> 3) | ((v2 & 0x01) << 2) | ((v2 & 0x10) >> 1); - converted_gfx[offs * 4 + 3] = p1; - converted_gfx[offs * 4 + 2] = p2; - converted_gfx[offs * 4 + 1] = p3; - converted_gfx[offs * 4 + 0] = p4; + state->converted_gfx[offs * 4 + 3] = p1; + state->converted_gfx[offs * 4 + 2] = p2; + state->converted_gfx[offs * 4 + 1] = p3; + state->converted_gfx[offs * 4 + 0] = p4; } - state_save_register_global_pointer(machine, main_bitmap, BITMAP_WIDTH * BITMAP_HEIGHT); - state_save_register_global_pointer(machine, converted_gfx, 0x8000 * 2); - state_save_register_global(machine, arabian_video_control); - state_save_register_global(machine, arabian_flip_screen); + state_save_register_global_pointer(machine, state->main_bitmap, BITMAP_WIDTH * BITMAP_HEIGHT); + state_save_register_global_pointer(machine, state->converted_gfx, 0x8000 * 2); + state_save_register_global(machine, state->video_control); + state_save_register_global(machine, state->flip_screen); } @@ -232,9 +220,10 @@ VIDEO_START( arabian ) * *************************************/ -static void blit_area(UINT8 plane, UINT16 src, UINT8 x, UINT8 y, UINT8 sx, UINT8 sy) +static void blit_area( running_machine *machine, UINT8 plane, UINT16 src, UINT8 x, UINT8 y, UINT8 sx, UINT8 sy ) { - UINT8 *srcdata = &converted_gfx[src * 4]; + arabian_state *state = (arabian_state *)machine->driver_data; + UINT8 *srcdata = &state->converted_gfx[src * 4]; int i,j; /* loop over X, then Y */ @@ -248,7 +237,7 @@ static void blit_area(UINT8 plane, UINT16 src, UINT8 x, UINT8 y, UINT8 sx, UINT8 UINT8 *base; /* get a pointer to the bitmap */ - base = &main_bitmap[((y + j) & 0xff) * BITMAP_WIDTH + (x & 0xff)]; + base = &state->main_bitmap[((y + j) & 0xff) * BITMAP_WIDTH + (x & 0xff)]; /* bit 0 means write to upper plane (upper 4 bits of our bitmap) */ if (plane & 0x01) @@ -280,22 +269,24 @@ static void blit_area(UINT8 plane, UINT16 src, UINT8 x, UINT8 y, UINT8 sx, UINT8 WRITE8_HANDLER( arabian_blitter_w ) { + arabian_state *state = (arabian_state *)space->machine->driver_data; + /* write the data */ - arabian_blitter[offset] = data; + state->blitter[offset] = data; /* watch for a write to offset 6 -- that triggers the blit */ if (offset == 6) { /* extract the data */ - int plane = arabian_blitter[0]; - int src = arabian_blitter[1] | (arabian_blitter[2] << 8); - int x = arabian_blitter[4] << 2; - int y = arabian_blitter[3]; - int sx = arabian_blitter[6]; - int sy = arabian_blitter[5]; + int plane = state->blitter[0]; + int src = state->blitter[1] | (state->blitter[2] << 8); + int x = state->blitter[4] << 2; + int y = state->blitter[3]; + int sx = state->blitter[6]; + int sy = state->blitter[5]; /* blit it */ - blit_area(plane, src, x, y, sx, sy); + blit_area(space->machine, plane, src, x, y, sx, sy); } } @@ -309,6 +300,7 @@ WRITE8_HANDLER( arabian_blitter_w ) WRITE8_HANDLER( arabian_videoram_w ) { + arabian_state *state = (arabian_state *)space->machine->driver_data; UINT8 *base; UINT8 x, y; @@ -317,7 +309,7 @@ WRITE8_HANDLER( arabian_videoram_w ) y = offset & 0xff; /* get a pointer to the pixels */ - base = &main_bitmap[y * BITMAP_WIDTH + x]; + base = &state->main_bitmap[y * BITMAP_WIDTH + x]; /* the data is written as 4 2-bit values, as follows: @@ -332,7 +324,7 @@ WRITE8_HANDLER( arabian_videoram_w ) */ /* enable writes to AZ/AR */ - if (arabian_blitter[0] & 0x08) + if (state->blitter[0] & 0x08) { base[0] = (base[0] & ~0x03) | ((data & 0x10) >> 3) | ((data & 0x01) >> 0); base[1] = (base[1] & ~0x03) | ((data & 0x20) >> 4) | ((data & 0x02) >> 1); @@ -341,7 +333,7 @@ WRITE8_HANDLER( arabian_videoram_w ) } /* enable writes to AG/AB */ - if (arabian_blitter[0] & 0x04) + if (state->blitter[0] & 0x04) { base[0] = (base[0] & ~0x0c) | ((data & 0x10) >> 1) | ((data & 0x01) << 2); base[1] = (base[1] & ~0x0c) | ((data & 0x20) >> 2) | ((data & 0x02) << 1); @@ -350,7 +342,7 @@ WRITE8_HANDLER( arabian_videoram_w ) } /* enable writes to BZ/BR */ - if (arabian_blitter[0] & 0x02) + if (state->blitter[0] & 0x02) { base[0] = (base[0] & ~0x30) | ((data & 0x10) << 1) | ((data & 0x01) << 4); base[1] = (base[1] & ~0x30) | ((data & 0x20) << 0) | ((data & 0x02) << 3); @@ -359,7 +351,7 @@ WRITE8_HANDLER( arabian_videoram_w ) } /* enable writes to BG/BB */ - if (arabian_blitter[0] & 0x01) + if (state->blitter[0] & 0x01) { base[0] = (base[0] & ~0xc0) | ((data & 0x10) << 3) | ((data & 0x01) << 6); base[1] = (base[1] & ~0xc0) | ((data & 0x20) << 2) | ((data & 0x02) << 5); @@ -378,15 +370,16 @@ WRITE8_HANDLER( arabian_videoram_w ) VIDEO_UPDATE( arabian ) { - const pen_t *pens = &screen->machine->pens[(arabian_video_control >> 3) << 8]; + arabian_state *state = (arabian_state *)screen->machine->driver_data; + const pen_t *pens = &screen->machine->pens[(state->video_control >> 3) << 8]; int y; /* render the screen from the bitmap */ for (y = 0; y < BITMAP_HEIGHT; y++) { /* non-flipped case */ - if (!arabian_flip_screen) - draw_scanline8(bitmap, 0, y, BITMAP_WIDTH, &main_bitmap[y * BITMAP_WIDTH], pens); + if (!state->flip_screen) + draw_scanline8(bitmap, 0, y, BITMAP_WIDTH, &state->main_bitmap[y * BITMAP_WIDTH], pens); /* flipped case */ else @@ -394,7 +387,7 @@ VIDEO_UPDATE( arabian ) UINT8 scanline[BITMAP_WIDTH]; int x; for (x = 0; x < BITMAP_WIDTH; x++) - scanline[BITMAP_WIDTH - 1 - x] = main_bitmap[y * BITMAP_WIDTH + x]; + scanline[BITMAP_WIDTH - 1 - x] = state->main_bitmap[y * BITMAP_WIDTH + x]; draw_scanline8(bitmap, 0, BITMAP_HEIGHT - 1 - y, BITMAP_WIDTH, scanline, pens); } } |