mirror of
https://github.com/holub/mame
synced 2025-10-06 09:00:04 +03:00
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.
This commit is contained in:
parent
792adf6a07
commit
6379e9c903
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -2361,6 +2361,7 @@ src/mame/includes/btime.h svneol=native#text/plain
|
||||
src/mame/includes/btoads.h svneol=native#text/plain
|
||||
src/mame/includes/bublbobl.h svneol=native#text/plain
|
||||
src/mame/includes/buggychl.h svneol=native#text/plain
|
||||
src/mame/includes/bwing.h svneol=native#text/plain
|
||||
src/mame/includes/bzone.h svneol=native#text/plain
|
||||
src/mame/includes/canyon.h svneol=native#text/plain
|
||||
src/mame/includes/capbowl.h svneol=native#text/plain
|
||||
|
@ -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;
|
||||
|
||||
fix_bwp3();
|
||||
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(machine);
|
||||
}
|
||||
|
||||
//****************************************************************************
|
||||
|
50
src/mame/includes/bwing.h
Normal file
50
src/mame/includes/bwing.h
Normal file
@ -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 );
|
@ -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_NTILES_L2 7
|
||||
#define BW_NTILES (1<<BW_NTILES_L2)
|
||||
|
||||
//****************************************************************************
|
||||
// Local Vars
|
||||
|
||||
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);
|
||||
|
||||
scrollmap[0] = fgmap;
|
||||
scrollmap[1] = bgmap;
|
||||
tilemap_set_transparent_pen(charmap, 0);
|
||||
tilemap_set_transparent_pen(fgmap, 0);
|
||||
tilemap_set_transparent_pen(state->charmap, 0);
|
||||
tilemap_set_transparent_pen(state->fgmap, 0);
|
||||
|
||||
fill_srxlat(srxlat);
|
||||
state->srxlat = auto_alloc_array(machine, int, 0x2000);
|
||||
state_save_register_global_pointer(machine, state->srxlat, 0x2000);
|
||||
|
||||
fgdata = memory_region(machine, "gpu");
|
||||
bgdata = fgdata + 0x1000;
|
||||
fill_srxlat(state->srxlat);
|
||||
|
||||
for (i=0; i<4; i++) srbase[i] = fgdata + i * 0x2000;
|
||||
for (i=0; i<8; i++) sreg[i] = 0;
|
||||
state->fgdata = memory_region(machine, "gpu");
|
||||
state->bgdata = state->fgdata + 0x1000;
|
||||
|
||||
fgfx = machine->gfx[2];
|
||||
gfx_element_set_source(fgfx, srbase[1]);
|
||||
bgfx = machine->gfx[3];
|
||||
gfx_element_set_source(bgfx, srbase[1] + 0x1000);
|
||||
for (i = 0; i < 4; i++)
|
||||
state->srbase[i] = state->fgdata + i * 0x2000;
|
||||
|
||||
dwptr = fgfx->pen_usage;
|
||||
for (i = 0; i < 8; i++)
|
||||
state->sreg[i] = 0;
|
||||
|
||||
// state->fgfx = machine->gfx[2];
|
||||
gfx_element_set_source(machine->gfx[2], state->srbase[1]);
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
//****************************************************************************
|
||||
|
Loading…
Reference in New Issue
Block a user