diff options
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 |
commit | 6379e9c903f6463057fc4c7f22a821f979ab9663 (patch) | |
tree | d88bea43e974f51c06b33015aceffc3fa7cb36c7 /src/mame | |
parent | 792adf6a07658d6c4d6c28e60d04d494b5144150 (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.c | 174 | ||||
-rw-r--r-- | src/mame/includes/bwing.h | 50 | ||||
-rw-r--r-- | src/mame/video/bwing.c | 245 |
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; } -//**************************************************************************** |