summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame
diff options
context:
space:
mode:
author Fabio Priuli <etabeta78@users.noreply.github.com>2009-11-27 00:42:04 +0000
committer Fabio Priuli <etabeta78@users.noreply.github.com>2009-11-27 00:42:04 +0000
commit6379e9c903f6463057fc4c7f22a821f979ab9663 (patch)
treed88bea43e974f51c06b33015aceffc3fa7cb36c7 /src/mame
parent792adf6a07658d6c4d6c28e60d04d494b5144150 (diff)
Added driver data struct to bwing.c and slightly simplified the video code (by removing a couple of redundant variables).
More work would be needed to fully clean it up, but I'm not expert enough right now.
Diffstat (limited to 'src/mame')
-rw-r--r--src/mame/drivers/bwing.c174
-rw-r--r--src/mame/includes/bwing.h50
-rw-r--r--src/mame/video/bwing.c245
3 files changed, 305 insertions, 164 deletions
diff --git a/src/mame/drivers/bwing.c b/src/mame/drivers/bwing.c
index a1016545ade..6bff7178287 100644
--- a/src/mame/drivers/bwing.c
+++ b/src/mame/drivers/bwing.c
@@ -28,50 +28,25 @@ Known issues:
#include "cpu/m6502/m6502.h"
#include "sound/ay8910.h"
#include "sound/dac.h"
+#include "bwing.h"
-#define BW_DEBUG 0
-
-#define MAX_SOUNDS 16
-
-//****************************************************************************
-// Imports
-
-extern const gfx_layout bwing_tilelayout;
-
-extern WRITE8_HANDLER( bwing_paletteram_w );
-extern WRITE8_HANDLER( bwing_videoram_w );
-extern WRITE8_HANDLER( bwing_spriteram_w );
-extern WRITE8_HANDLER( bwing_scrollreg_w );
-extern WRITE8_HANDLER( bwing_scrollram_w );
-extern READ8_HANDLER( bwing_scrollram_r );
-extern VIDEO_START( bwing );
-extern VIDEO_UPDATE( bwing );
-
-//****************************************************************************
-// Local Vars
-
-static UINT8 sound_fifo[MAX_SOUNDS];
-static UINT8 *bwp123_membase[3], *bwp3_rombase;
-static UINT8 *bwp1_sharedram1, *bwp2_sharedram1;
-static size_t bwp3_romsize;
-static int bwp3_nmimask, bwp3_u8F_d, ffcount, ffhead, fftail;
//****************************************************************************
// Interrupt Handlers
static INTERRUPT_GEN ( bwp1_interrupt )
{
- static int coin = 0;
+ bwing_state *state = (bwing_state *)device->machine->driver_data;
UINT8 latch_data;
switch (cpu_getiloops(device))
{
case 0:
- if (ffcount)
+ if (state->ffcount)
{
- ffcount--;
- latch_data = sound_fifo[fftail];
- fftail = (fftail + 1) & (MAX_SOUNDS - 1);
+ state->ffcount--;
+ latch_data = state->sound_fifo[state->fftail];
+ state->fftail = (state->fftail + 1) & (MAX_SOUNDS - 1);
soundlatch_w(cpu_get_address_space(device, ADDRESS_SPACE_PROGRAM), 0, latch_data);
cputag_set_input_line(device->machine, "audiocpu", DECO16_IRQ_LINE, HOLD_LINE); // SNDREQ
}
@@ -79,43 +54,75 @@ static INTERRUPT_GEN ( bwp1_interrupt )
case 1:
if (~input_port_read(device->machine, "IN2") & 0x03)
- { if (!coin) { coin = 1; cpu_set_input_line(device, INPUT_LINE_NMI, ASSERT_LINE); } }
+ {
+ if (!state->coin)
+ {
+ state->coin = 1;
+ cpu_set_input_line(device, INPUT_LINE_NMI, ASSERT_LINE);
+ }
+ }
else
- coin = 0;
+ state->coin = 0;
break;
case 2:
- if (input_port_read(device->machine, "IN3")) cpu_set_input_line(device, M6809_FIRQ_LINE, ASSERT_LINE);
+ if (input_port_read(device->machine, "IN3"))
+ cpu_set_input_line(device, M6809_FIRQ_LINE, ASSERT_LINE);
break;
}
}
-static INTERRUPT_GEN ( bwp3_interrupt ) { if (!bwp3_nmimask) cpu_set_input_line(device, INPUT_LINE_NMI, ASSERT_LINE); }
+static INTERRUPT_GEN ( bwp3_interrupt )
+{
+ bwing_state *state = (bwing_state *)device->machine->driver_data;
+
+ if (!state->bwp3_nmimask)
+ cpu_set_input_line(device, INPUT_LINE_NMI, ASSERT_LINE);
+}
//****************************************************************************
// Memory and I/O Handlers
-static WRITE8_HANDLER( bwp12_sharedram1_w ) { bwp1_sharedram1[offset] = bwp2_sharedram1[offset] = data; }
-static WRITE8_HANDLER( bwp3_u8F_w ) { bwp3_u8F_d = data; } // prepares custom chip for various operations
+static WRITE8_HANDLER( bwp12_sharedram1_w )
+{
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+ state->bwp1_sharedram1[offset] = state->bwp2_sharedram1[offset] = data;
+}
+
+static WRITE8_HANDLER( bwp3_u8F_w )
+{
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+ state->bwp3_u8F_d = data; // prepares custom chip for various operations
+}
+
+static WRITE8_HANDLER( bwp3_nmimask_w )
+{
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+ state->bwp3_nmimask = data & 0x80;
+}
+
static WRITE8_HANDLER( bwp3_nmiack_w ) { cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, CLEAR_LINE); }
-static WRITE8_HANDLER( bwp3_nmimask_w ) { bwp3_nmimask = data & 0x80; }
static READ8_HANDLER( bwp1_io_r )
{
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+
if (offset == 0) return(input_port_read(space->machine, "DSW0"));
if (offset == 1) return(input_port_read(space->machine, "DSW1"));
if (offset == 2) return(input_port_read(space->machine, "IN0"));
if (offset == 3) return(input_port_read(space->machine, "IN1"));
if (offset == 4) return(input_port_read(space->machine, "IN2"));
- return((bwp123_membase[0])[0x1b00 + offset]);
+ return((state->bwp123_membase[0])[0x1b00 + offset]);
}
static WRITE8_HANDLER( bwp1_ctrl_w )
{
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+
switch (offset)
{
// MSSTB
@@ -137,12 +144,11 @@ static WRITE8_HANDLER( bwp1_ctrl_w )
case 5:
if (data == 0x80) // protection trick to screw CPU1 & 3
cputag_set_input_line(space->machine, "sub", INPUT_LINE_NMI, ASSERT_LINE); // SNMI
- else
- if (ffcount < MAX_SOUNDS)
+ else if (state->ffcount < MAX_SOUNDS)
{
- ffcount++;
- sound_fifo[ffhead] = data;
- ffhead = (ffhead + 1) & (MAX_SOUNDS - 1);
+ state->ffcount++;
+ state->sound_fifo[state->ffhead] = data;
+ state->ffhead = (state->ffhead + 1) & (MAX_SOUNDS - 1);
}
break;
@@ -154,7 +160,7 @@ static WRITE8_HANDLER( bwp1_ctrl_w )
}
#if BW_DEBUG
- (bwp123_membase[0])[0x1c00 + offset] = data;
+ (state->bwp123_membase[0])[0x1c00 + offset] = data;
#endif
}
@@ -173,7 +179,10 @@ static WRITE8_HANDLER( bwp2_ctrl_w )
}
#if BW_DEBUG
- (bwp123_membase[1])[0x1800 + offset] = data;
+ {
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+ (state->bwp123_membase[1])[0x1800 + offset] = data;
+ }
#endif
}
@@ -183,12 +192,12 @@ static WRITE8_HANDLER( bwp2_ctrl_w )
// Main CPU
static ADDRESS_MAP_START( bwp1_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x1b00, 0x1b07) AM_READ(bwp1_io_r)
- AM_RANGE(0x0000, 0x07ff) AM_RAM_WRITE(bwp12_sharedram1_w) AM_BASE(&bwp1_sharedram1)
+ AM_RANGE(0x0000, 0x07ff) AM_RAM_WRITE(bwp12_sharedram1_w) AM_BASE_MEMBER(bwing_state, bwp1_sharedram1)
AM_RANGE(0x0800, 0x0fff) AM_RAM
- AM_RANGE(0x1000, 0x13ff) AM_RAM_WRITE(bwing_videoram_w) AM_BASE(&videoram)
+ AM_RANGE(0x1000, 0x13ff) AM_RAM_WRITE(bwing_videoram_w) AM_BASE_MEMBER(bwing_state, videoram)
AM_RANGE(0x1400, 0x17ff) AM_RAM
AM_RANGE(0x1800, 0x19ff) AM_RAM_WRITE(bwing_spriteram_w) AM_BASE(&buffered_spriteram)
- AM_RANGE(0x1a00, 0x1aff) AM_RAM_WRITE(bwing_paletteram_w) AM_BASE(&paletteram)
+ AM_RANGE(0x1a00, 0x1aff) AM_RAM_WRITE(bwing_paletteram_w) AM_BASE_MEMBER(bwing_state, paletteram)
AM_RANGE(0x1b00, 0x1b07) AM_RAM_WRITE(bwing_scrollreg_w)
AM_RANGE(0x1c00, 0x1c07) AM_RAM_WRITE(bwp1_ctrl_w)
AM_RANGE(0x2000, 0x3fff) AM_READWRITE(bwing_scrollram_r, bwing_scrollram_w)
@@ -198,7 +207,7 @@ ADDRESS_MAP_END
// Sub CPU
static ADDRESS_MAP_START( bwp2_map, ADDRESS_SPACE_PROGRAM, 8 )
- AM_RANGE(0x0000, 0x07ff) AM_RAM_WRITE(bwp12_sharedram1_w) AM_BASE(&bwp2_sharedram1)
+ AM_RANGE(0x0000, 0x07ff) AM_RAM_WRITE(bwp12_sharedram1_w) AM_BASE_MEMBER(bwing_state, bwp2_sharedram1)
AM_RANGE(0x0800, 0x0fff) AM_RAM
AM_RANGE(0x1800, 0x1803) AM_WRITE(bwp2_ctrl_w)
AM_RANGE(0xa000, 0xffff) AM_ROM
@@ -216,7 +225,7 @@ static ADDRESS_MAP_START( bwp3_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x8000, 0x8000) AM_DEVWRITE("ay2", ay8910_address_w)
AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_r)
AM_RANGE(0xd000, 0xd000) AM_WRITE(bwp3_nmimask_w)
- AM_RANGE(0xe000, 0xffff) AM_ROM AM_BASE(&bwp3_rombase) AM_SIZE(&bwp3_romsize)
+ AM_RANGE(0xe000, 0xffff) AM_ROM AM_BASE_MEMBER(bwing_state, bwp3_rombase) AM_SIZE_MEMBER(bwing_state, bwp3_romsize)
ADDRESS_MAP_END
@@ -359,16 +368,49 @@ GFXDECODE_END
//****************************************************************************
// Hardware Definitions
-static MACHINE_RESET( bwing )
+static MACHINE_START( bwing )
{
- bwp3_nmimask = 0;
- fftail = ffhead = ffcount = 0;
+ bwing_state *state = (bwing_state *)machine->driver_data;
+
+ state_save_register_global(machine, state->coin);
+ state_save_register_global(machine, state->palatch);
+ state_save_register_global(machine, state->srbank);
+ state_save_register_global(machine, state->mapmask);
+ state_save_register_global(machine, state->mapflip);
+ state_save_register_global(machine, state->bwp3_nmimask);
+ state_save_register_global(machine, state->bwp3_u8F_d);
+ state_save_register_global(machine, state->ffcount);
+ state_save_register_global(machine, state->ffhead);
+ state_save_register_global(machine, state->fftail);
+
+ state_save_register_global_array(machine, state->sreg);
+ state_save_register_global_array(machine, state->sound_fifo);
}
+static MACHINE_RESET( bwing )
+{
+ bwing_state *state = (bwing_state *)machine->driver_data;
+ int i;
+ state->coin = 0;
+ state->palatch = 0;
+ state->srbank = 0;
+ state->mapmask = 0;
+ state->mapflip = 0;
+
+ for (i = 0; i < MAX_SOUNDS; i++)
+ state->sound_fifo[i] = 0;
+
+ state->bwp3_nmimask = 0;
+ state->bwp3_u8F_d = 0;
+ state->fftail = state->ffhead = state->ffcount = 0;
+}
static MACHINE_DRIVER_START( bwing )
+ /* driver data */
+ MDRV_DRIVER_DATA(bwing_state)
+
// basic machine hardware
MDRV_CPU_ADD("maincpu", M6809, 2000000)
MDRV_CPU_PROGRAM_MAP(bwp1_map)
@@ -385,6 +427,7 @@ static MACHINE_DRIVER_START( bwing )
MDRV_QUANTUM_TIME(HZ(18000)) // high enough?
+ MDRV_MACHINE_START(bwing)
MDRV_MACHINE_RESET(bwing)
// video hardware
@@ -576,28 +619,31 @@ ROM_END
//****************************************************************************
// Initializations
-static void fix_bwp3(void)
+static void fix_bwp3( running_machine *machine )
{
- UINT8 *rom = bwp3_rombase;
- int i, j = bwp3_romsize;
+ bwing_state *state = (bwing_state *)machine->driver_data;
+ UINT8 *rom = state->bwp3_rombase;
+ int i, j = state->bwp3_romsize;
UINT8 ah, al;
// swap nibbles
- for (i=0; i<j; i++) { ah = al = rom[i]; rom[i] = (ah >> 4) | (al << 4); }
+ for (i = 0; i < j; i++) { ah = al = rom[i]; rom[i] = (ah >> 4) | (al << 4); }
// relocate vectors
- rom[j-(0x10-0x4)] = rom[j-(0x10-0xb)] = rom[j-(0x10-0x6)];
- rom[j-(0x10-0x5)] = rom[j-(0x10-0xa)] = rom[j-(0x10-0x7)];
+ rom[j - (0x10 - 0x4)] = rom[j - (0x10 - 0xb)] = rom[j - (0x10 - 0x6)];
+ rom[j - (0x10 - 0x5)] = rom[j - (0x10 - 0xa)] = rom[j - (0x10 - 0x7)];
}
static DRIVER_INIT( bwing )
{
- bwp123_membase[0] = memory_region(machine, "maincpu");
- bwp123_membase[1] = memory_region(machine, "sub");
- bwp123_membase[2] = memory_region(machine, "audiocpu");
+ bwing_state *state = (bwing_state *)machine->driver_data;
+
+ state->bwp123_membase[0] = memory_region(machine, "maincpu");
+ state->bwp123_membase[1] = memory_region(machine, "sub");
+ state->bwp123_membase[2] = memory_region(machine, "audiocpu");
- fix_bwp3();
+ fix_bwp3(machine);
}
//****************************************************************************
diff --git a/src/mame/includes/bwing.h b/src/mame/includes/bwing.h
new file mode 100644
index 00000000000..c98aebf3868
--- /dev/null
+++ b/src/mame/includes/bwing.h
@@ -0,0 +1,50 @@
+/***************************************************************************
+
+ B-Wings
+
+***************************************************************************/
+
+#define BW_DEBUG 0
+#define MAX_SOUNDS 16
+
+typedef struct _bwing_state bwing_state;
+struct _bwing_state
+{
+ /* memory pointers */
+ UINT8 * videoram;
+ UINT8 * spriteram;
+ UINT8 * paletteram;
+ UINT8 * bwp1_sharedram1;
+ UINT8 * bwp2_sharedram1;
+ UINT8 * bwp3_rombase;
+ size_t bwp3_romsize;
+
+ /* video-related */
+ tilemap *charmap, *fgmap, *bgmap;
+ UINT8 *srbase[4], *fgdata, *bgdata;
+ int *srxlat;
+ unsigned sreg[8], palatch, srbank, mapmask, mapflip;
+
+ /* sound-related */
+ UINT8 sound_fifo[MAX_SOUNDS];
+ int bwp3_nmimask, bwp3_u8F_d, ffcount, ffhead, fftail;
+
+ /* misc */
+ UINT8 *bwp123_membase[3];
+ int coin;
+};
+
+
+/*----------- defined in video/bwing.c -----------*/
+
+extern const gfx_layout bwing_tilelayout;
+
+WRITE8_HANDLER( bwing_paletteram_w );
+WRITE8_HANDLER( bwing_videoram_w );
+WRITE8_HANDLER( bwing_spriteram_w );
+WRITE8_HANDLER( bwing_scrollreg_w );
+WRITE8_HANDLER( bwing_scrollram_w );
+READ8_HANDLER( bwing_scrollram_r );
+
+VIDEO_START( bwing );
+VIDEO_UPDATE( bwing );
diff --git a/src/mame/video/bwing.c b/src/mame/video/bwing.c
index 1a900bd80a2..07238508365 100644
--- a/src/mame/video/bwing.c
+++ b/src/mame/video/bwing.c
@@ -9,38 +9,32 @@ drivers by Acho A. Tang
// Directives
#include "driver.h"
+#include "bwing.h"
-#define BW_DEBUG 0
-#define BW_NTILES_L2 7
-#define BW_NTILES (1<<BW_NTILES_L2)
+#define BW_DEBUG 0
-//****************************************************************************
-// Local Vars
+#define BW_NTILES_L2 7
+#define BW_NTILES (1<<BW_NTILES_L2)
-static tilemap *scrollmap[2], *charmap, *fgmap, *bgmap;
-static gfx_element *fgfx, *bgfx;
-static UINT8 *srbase[4], *fgdata, *bgdata;
-static int *srxlat;
-static unsigned sreg[8], palatch=0, srbank=0, mapmask=0, mapflip=0;
//****************************************************************************
// Local Functions
-static void fill_srxlat(int *xlat)
+static void fill_srxlat( int *xlat )
{
unsigned base, offset, i;
- for(base=0; base<0x2000; base+=0x400)
+ for (base = 0; base < 0x2000; base += 0x400)
{
- for(i=0; i<0x100; i++)
+ for(i = 0; i < 0x100; i++)
{
offset = base + (i<<2 & ~0x3f) + (i & 0x0f);
- xlat[base+i] = offset;
- xlat[base+i+0x100] = offset + 0x10;
- xlat[base+i+0x200] = offset + 0x20;
- xlat[base+i+0x300] = offset + 0x30;
+ xlat[base + i] = offset;
+ xlat[base + i + 0x100] = offset + 0x10;
+ xlat[base + i + 0x200] = offset + 0x20;
+ xlat[base + i + 0x300] = offset + 0x30;
}
}
}
@@ -48,7 +42,6 @@ static void fill_srxlat(int *xlat)
//****************************************************************************
// Exports
-extern const gfx_layout bwing_tilelayout;
const gfx_layout bwing_tilelayout =
{
16, 16,
@@ -62,53 +55,75 @@ const gfx_layout bwing_tilelayout =
};
-WRITE8_HANDLER( bwing_spriteram_w ) { buffered_spriteram[offset] = data; }
-WRITE8_HANDLER( bwing_videoram_w ) { videoram[offset] = data; tilemap_mark_tile_dirty(charmap, offset); }
+WRITE8_HANDLER( bwing_spriteram_w )
+{
+ buffered_spriteram[offset] = data;
+}
+
+WRITE8_HANDLER( bwing_videoram_w )
+{
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+ state->videoram[offset] = data;
+ tilemap_mark_tile_dirty(state->charmap, offset);
+}
READ8_HANDLER ( bwing_scrollram_r )
{
- if (!srbank) offset = srxlat[offset];
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+ int offs;
- return((srbase[srbank])[offset]);
+ if (!state->srbank)
+ offs = state->srxlat[offset];
+ else
+ offs = offset;
+
+ return ((state->srbase[state->srbank])[offs]);
}
WRITE8_HANDLER( bwing_scrollram_w )
{
- if (!srbank)
- {
- offset = srxlat[offset];
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+ int offs;
- tilemap_mark_tile_dirty(scrollmap[offset>>12], offset & 0xfff);
+ if (!state->srbank)
+ {
+ offs = state->srxlat[offset];
+ if (offs >> 12)
+ tilemap_mark_tile_dirty(state->bgmap, offs & 0xfff);
+ else
+ tilemap_mark_tile_dirty(state->fgmap, offs & 0xfff);
}
else
{
+ offs = offset;
if (offset < 0x1000)
- gfx_element_mark_dirty(fgfx, offset/32);
+ gfx_element_mark_dirty(space->machine->gfx[2], offset / 32);
else
- gfx_element_mark_dirty(bgfx, offset/32);
+ gfx_element_mark_dirty(space->machine->gfx[3], offset / 32);
}
- (srbase[srbank])[offset] = data;
+ (state->srbase[state->srbank])[offs] = data;
}
WRITE8_HANDLER( bwing_scrollreg_w )
{
- sreg[offset] = data;
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+ state->sreg[offset] = data;
switch (offset)
{
- case 6: palatch = data; break; // one of the palette components is latched through I/O(yike)
+ case 6: state->palatch = data; break; // one of the palette components is latched through I/O(yike)
case 7:
// tile graphics are decoded in RAM on the fly and tile codes are banked + interleaved(ouch)
- mapmask = data;
- srbank = data >> 6;
+ state->mapmask = data;
+ state->srbank = data >> 6;
#if BW_DEBUG
- logerror("(%s)%04x: w=%02x a=%04x f=%d\n", space->cpu->tag, cpu_get_pc(space->cpu),data,0x1b00+offset,video_screen_get_frame_number(space->machine->primary_screen));
+ logerror("(%s)%04x: w=%02x a=%04x f=%d\n", space->cpu->tag, cpu_get_pc(space->cpu), data, 0x1b00 + offset, video_screen_get_frame_number(space->machine->primary_screen));
#endif
break;
}
@@ -121,18 +136,22 @@ WRITE8_HANDLER( bwing_scrollreg_w )
WRITE8_HANDLER( bwing_paletteram_w )
{
- static const float rgb[4][3]={{0.85f,0.95f,1.00f},{0.90f,1.00f,1.00f},{0.80f,1.00f,1.00f},{0.75f,0.90f,1.10f}};
+ bwing_state *state = (bwing_state *)space->machine->driver_data;
+ static const float rgb[4][3] = {{0.85f, 0.95f, 1.00f},
+ {0.90f, 1.00f, 1.00f},
+ {0.80f, 1.00f, 1.00f},
+ {0.75f, 0.90f, 1.10f}};
int r, g, b, i;
- paletteram[offset] = data;
+ state->paletteram[offset] = data;
r = ~data & 7;
- g = ~data>>4 & 7;
- b = ~palatch & 7;
+ g = ~(data >> 4) & 7;
+ b = ~state->palatch & 7;
- r = ((r<<5) + (r<<2) + (r>>1));
- g = ((g<<5) + (g<<2) + (g>>1));
- b = ((b<<5) + (b<<2) + (b>>1));
+ r = ((r << 5) + (r << 2) + (r >> 1));
+ g = ((g << 5) + (g << 2) + (g >> 1));
+ b = ((b << 5) + (b << 2) + (b >> 1));
if ((i = input_port_read(space->machine, "EXTRA")) < 4)
{
@@ -147,96 +166,116 @@ WRITE8_HANDLER( bwing_paletteram_w )
palette_set_color(space->machine, offset, MAKE_RGB(r, g, b));
#if BW_DEBUG
- paletteram[offset+0x40] = palatch;
+ state->paletteram[offset + 0x40] = state->palatch;
#endif
}
//****************************************************************************
// Initializations
-#define BW_SET_TILE_INFO(GFX, CODE, COLOR) { \
- tileinfo->pen_data = gfx_element_get_data(GFX, CODE); \
- tileinfo->palette_base = GFX->color_base + ((COLOR) << 3); \
- }
-
static TILE_GET_INFO( get_fgtileinfo )
{
- unsigned code = fgdata[tile_index];
- BW_SET_TILE_INFO(fgfx, code & (BW_NTILES-1), code >> 7);
+ bwing_state *state = (bwing_state *)machine->driver_data;
+ tileinfo->pen_data = gfx_element_get_data(machine->gfx[2], state->fgdata[tile_index] & (BW_NTILES - 1));
+ tileinfo->palette_base = machine->gfx[2]->color_base + ((state->fgdata[tile_index] >> 7) << 3);
}
static TILE_GET_INFO( get_bgtileinfo )
{
- unsigned code = bgdata[tile_index];
- BW_SET_TILE_INFO(bgfx, code & (BW_NTILES-1), code >> 7);
+ bwing_state *state = (bwing_state *)machine->driver_data;
+ tileinfo->pen_data = gfx_element_get_data(machine->gfx[3], state->bgdata[tile_index] & (BW_NTILES - 1));
+ tileinfo->palette_base = machine->gfx[3]->color_base + ((state->bgdata[tile_index] >> 7) << 3);
}
static TILE_GET_INFO( get_charinfo )
{
- SET_TILE_INFO(0, videoram[tile_index], 0, 0);
+ bwing_state *state = (bwing_state *)machine->driver_data;
+ SET_TILE_INFO(0, state->videoram[tile_index], 0, 0);
}
static TILEMAP_MAPPER( bwing_scan_cols )
{
- return((col<<6) + row);
+ return ((col << 6) + row);
}
VIDEO_START( bwing )
{
+ bwing_state *state = (bwing_state *)machine->driver_data;
UINT32 *dwptr;
int i;
- charmap = tilemap_create(machine, get_charinfo,tilemap_scan_cols, 8, 8,32,32);
- fgmap = tilemap_create(machine, get_fgtileinfo,bwing_scan_cols,16,16,64,64);
- bgmap = tilemap_create(machine, get_bgtileinfo,bwing_scan_cols,16,16,64,64);
- srxlat = auto_alloc_array(machine, int, 0x2000);
+ state->charmap = tilemap_create(machine, get_charinfo, tilemap_scan_cols, 8, 8, 32, 32);
+ state->fgmap = tilemap_create(machine, get_fgtileinfo, bwing_scan_cols, 16, 16, 64, 64);
+ state->bgmap = tilemap_create(machine, get_bgtileinfo, bwing_scan_cols, 16, 16, 64, 64);
+
+ tilemap_set_transparent_pen(state->charmap, 0);
+ tilemap_set_transparent_pen(state->fgmap, 0);
+
+ state->srxlat = auto_alloc_array(machine, int, 0x2000);
+ state_save_register_global_pointer(machine, state->srxlat, 0x2000);
- scrollmap[0] = fgmap;
- scrollmap[1] = bgmap;
- tilemap_set_transparent_pen(charmap, 0);
- tilemap_set_transparent_pen(fgmap, 0);
+ fill_srxlat(state->srxlat);
- fill_srxlat(srxlat);
+ state->fgdata = memory_region(machine, "gpu");
+ state->bgdata = state->fgdata + 0x1000;
- fgdata = memory_region(machine, "gpu");
- bgdata = fgdata + 0x1000;
+ for (i = 0; i < 4; i++)
+ state->srbase[i] = state->fgdata + i * 0x2000;
- for (i=0; i<4; i++) srbase[i] = fgdata + i * 0x2000;
- for (i=0; i<8; i++) sreg[i] = 0;
+ for (i = 0; i < 8; i++)
+ state->sreg[i] = 0;
- fgfx = machine->gfx[2];
- gfx_element_set_source(fgfx, srbase[1]);
- bgfx = machine->gfx[3];
- gfx_element_set_source(bgfx, srbase[1] + 0x1000);
+// state->fgfx = machine->gfx[2];
+ gfx_element_set_source(machine->gfx[2], state->srbase[1]);
- dwptr = fgfx->pen_usage;
+// state->bgfx = machine->gfx[3];
+ gfx_element_set_source(machine->gfx[3], state->srbase[1] + 0x1000);
+
+ dwptr = machine->gfx[2]->pen_usage;
if (dwptr)
{
dwptr[0] = 0;
- for(i=1; i<BW_NTILES; i++) dwptr[i] = -1;
+ for(i = 1; i < BW_NTILES; i++)
+ dwptr[i] = -1;
}
}
//****************************************************************************
// Realtime
-static void draw_sprites(running_machine *machine, bitmap_t *bmp, const rectangle *clip, UINT8 *ram, int pri)
+static void draw_sprites( running_machine *machine, bitmap_t *bmp, const rectangle *clip, UINT8 *ram, int pri )
{
+ bwing_state *state = (bwing_state *)machine->driver_data;
int attrib, fx, fy, code, x, y, color, i;
gfx_element *gfx = machine->gfx[1];
- for (i=0; i<0x200; i+=4)
+ for (i = 0; i < 0x200; i += 4)
{
- attrib = ram[i]; if (!(attrib & 1) || (color = attrib>>3 & 1) != pri) continue;
- code = ram[i+1]; code += attrib<<3 & 0x100;
- y = ram[i+2]; y -= attrib<<1 & 0x100;
- x = ram[i+3]; x -= attrib<<2 & 0x100;
+ attrib = ram[i];
+ code = ram[i + 1];
+ y = ram[i + 2];
+ x = ram[i + 3];
+ color = (attrib >> 3) & 1;
+
+ if (!(attrib & 1) || color != pri)
+ continue;
+
+ code += (attrib << 3) & 0x100;
+ y -= (attrib << 1) & 0x100;
+ x -= (attrib << 2) & 0x100;
+
fx = attrib & 0x04;
fy = ~attrib & 0x02;
// normal/cocktail
- if (mapmask & 0x20) { fx = !fx; fy = !fy; x = 240 - x; y = 240 - y; }
+ if (state->mapmask & 0x20)
+ {
+ fx = !fx;
+ fy = !fy;
+ x = 240 - x;
+ y = 240 - y;
+ }
// single/double
if (!(attrib & 0x10))
@@ -249,22 +288,29 @@ static void draw_sprites(running_machine *machine, bitmap_t *bmp, const rectangl
VIDEO_UPDATE( bwing )
{
+ bwing_state *state = (bwing_state *)screen->machine->driver_data;
unsigned x, y, shiftx;
- if (mapmask & 0x20)
- { mapflip = TILEMAP_FLIPX; shiftx = -8; }
+ if (state->mapmask & 0x20)
+ {
+ state->mapflip = TILEMAP_FLIPX;
+ shiftx = -8;
+ }
else
- { mapflip = TILEMAP_FLIPY; shiftx = 8; }
+ {
+ state->mapflip = TILEMAP_FLIPY;
+ shiftx = 8;
+ }
// draw background
- if (!(mapmask & 1))
+ if (!(state->mapmask & 1))
{
- tilemap_set_flip(bgmap, mapflip);
- x = ((sreg[1]<<2 & 0x300) + sreg[2] + shiftx) & 0x3ff;
- tilemap_set_scrollx(bgmap, 0, x);
- y = (sreg[1]<<4 & 0x300) + sreg[3];
- tilemap_set_scrolly(bgmap, 0, y);
- tilemap_draw(bitmap, cliprect, bgmap, 0, 0);
+ tilemap_set_flip(state->bgmap, state->mapflip);
+ x = ((state->sreg[1]<<2 & 0x300) + state->sreg[2] + shiftx) & 0x3ff;
+ tilemap_set_scrollx(state->bgmap, 0, x);
+ y = (state->sreg[1]<<4 & 0x300) + state->sreg[3];
+ tilemap_set_scrolly(state->bgmap, 0, y);
+ tilemap_draw(bitmap, cliprect, state->bgmap, 0, 0);
}
else
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
@@ -273,26 +319,25 @@ VIDEO_UPDATE( bwing )
draw_sprites(screen->machine, bitmap, cliprect, buffered_spriteram, 0);
// draw foreground
- if (!(mapmask & 2))
+ if (!(state->mapmask & 2))
{
- tilemap_set_flip(fgmap, mapflip);
- x = ((sreg[1]<<6 & 0x300) + sreg[4] + shiftx) & 0x3ff;
- tilemap_set_scrollx(fgmap, 0, x);
- y = (sreg[1]<<8 & 0x300) + sreg[5];
- tilemap_set_scrolly(fgmap, 0, y);
- tilemap_draw(bitmap, cliprect, fgmap, 0, 0);
+ tilemap_set_flip(state->fgmap, state->mapflip);
+ x = ((state->sreg[1] << 6 & 0x300) + state->sreg[4] + shiftx) & 0x3ff;
+ tilemap_set_scrollx(state->fgmap, 0, x);
+ y = (state->sreg[1] << 8 & 0x300) + state->sreg[5];
+ tilemap_set_scrolly(state->fgmap, 0, y);
+ tilemap_draw(bitmap, cliprect, state->fgmap, 0, 0);
}
// draw high priority sprites
draw_sprites(screen->machine, bitmap, cliprect, buffered_spriteram, 1);
// draw text layer
-// if (mapmask & 4)
+// if (state->mapmask & 4)
{
- tilemap_set_flip(charmap, mapflip);
- tilemap_draw(bitmap, cliprect, charmap, 0, 0);
+ tilemap_set_flip(state->charmap, state->mapflip);
+ tilemap_draw(bitmap, cliprect, state->charmap, 0, 0);
}
return 0;
}
-//****************************************************************************