fix hyprduel to boot [Hau]

This commit is contained in:
Yasuhiro Ogawa 2009-03-28 16:26:45 +00:00
parent dc169055da
commit d15c4e0d3f
3 changed files with 155 additions and 153 deletions

View File

@ -23,7 +23,7 @@ Imagetek Inc 14220 071
--
Written by Hau
03/27/2009
03/28/2009
based on driver from drivers/metro.c by Luca Elia
spthx to kikur,Cha,teioh,kokkyu,teruchu,aya,sgo
---
@ -43,7 +43,6 @@ fix comms so it boots, it's a bit of a hack for hyperduel at the moment ;-)
#include "includes/hyprduel.h"
int rastersplit;
static int blitter_bit;
static int requested_int;
static UINT16 *hypr_irq_enable;
@ -81,10 +80,8 @@ static INTERRUPT_GEN( hyprduel_interrupt )
cpu_set_input_line(device->machine->cpu[1], 1, HOLD_LINE);
/* the duration is a guess */
timer_set(device->machine, ATTOTIME_IN_USEC(2500), NULL, 0x20, vblank_end_callback);
rastersplit = 0;
} else {
requested_int |= 0x12; /* hsync */
rastersplit = line + 1;
}
update_irq_state(device->machine);
@ -165,14 +162,12 @@ static UINT16 *hyprduel_rombank;
static READ16_HANDLER( hyprduel_bankedrom_r )
{
const char *region = "gfx1";
UINT8 *ROM = memory_region( space->machine, region );
size_t len = memory_region_length( space->machine, region );
UINT8 *ROM = memory_region( space->machine, "gfx1" );
size_t len = memory_region_length( space->machine, "gfx1" );
offset = offset * 2 + 0x10000 * (*hyprduel_rombank);
if ( offset < len ) return ((ROM[offset+0]<<8)+ROM[offset+1])^0xffff;
if ( offset < len ) return ((ROM[offset+0]<<8)+ROM[offset+1]);
else return 0xffff;
}
@ -230,7 +225,7 @@ static TIMER_CALLBACK( hyprduel_blit_done )
INLINE int blt_read(const UINT8 *ROM, const int offs)
{
return ROM[offs] ^ 0xff;
return ROM[offs];
}
INLINE void blt_write(const address_space *space, const int tmap, const offs_t offs, const UINT16 data, const UINT16 mask)
@ -251,10 +246,8 @@ static WRITE16_HANDLER( hyprduel_blitter_w )
if (offset == 0xC/2)
{
const char *region = "gfx1";
UINT8 *src = memory_region(space->machine, region);
size_t src_len = memory_region_length(space->machine, region);
UINT8 *src = memory_region(space->machine, "gfx1");
size_t src_len = memory_region_length(space->machine, "gfx1");
UINT32 tmap = (hyprduel_blitter_regs[ 0x00 / 2 ] << 16 ) +
hyprduel_blitter_regs[ 0x02 / 2 ];
@ -264,7 +257,7 @@ static WRITE16_HANDLER( hyprduel_blitter_w )
hyprduel_blitter_regs[ 0x0a / 2 ];
int shift = (dst_offs & 0x80) ? 0 : 8;
UINT16 mask = (dst_offs & 0x80) ? 0xff00 : 0x00ff;
UINT16 mask = (dst_offs & 0x80) ? 0x00ff : 0xff00;
// logerror("CPU #0 PC %06X : Blitter regs %08X, %08X, %08X\n",cpu_get_pc(space->cpu),tmap,src_offs,dst_offs);
@ -395,8 +388,8 @@ static ADDRESS_MAP_START( hyprduel_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x478000, 0x4787ff) AM_RAM AM_BASE(&hyprduel_tiletable) AM_SIZE(&hyprduel_tiletable_size) /* Tiles Set */
AM_RANGE(0x478840, 0x47884d) AM_WRITE(hyprduel_blitter_w) AM_BASE(&hyprduel_blitter_regs) /* Tiles Blitter */
AM_RANGE(0x478860, 0x47886b) AM_WRITE(hyprduel_window_w) AM_BASE(&hyprduel_window) /* Tilemap Window */
AM_RANGE(0x478870, 0x47887b) AM_WRITE(hypr_scrollreg_w) /* Scroll Regs */
AM_RANGE(0x47887c, 0x47887d) AM_WRITE(hypr_scrollreg_init_w)
AM_RANGE(0x478870, 0x47887b) AM_RAM_WRITE(hyprduel_scrollreg_w) AM_BASE(&hyprduel_scroll) /* Scroll Regs */
AM_RANGE(0x47887c, 0x47887d) AM_WRITE(hyprduel_scrollreg_init_w)
AM_RANGE(0x478880, 0x478881) AM_WRITENOP
AM_RANGE(0x478890, 0x478891) AM_WRITENOP
AM_RANGE(0x4788a0, 0x4788a1) AM_WRITENOP
@ -442,8 +435,8 @@ static ADDRESS_MAP_START( magerror_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE(&hyprduel_tiletable) AM_SIZE(&hyprduel_tiletable_size) /* Tiles Set */
AM_RANGE(0x878840, 0x87884d) AM_WRITE(hyprduel_blitter_w) AM_BASE(&hyprduel_blitter_regs) /* Tiles Blitter */
AM_RANGE(0x878860, 0x87886b) AM_WRITE(hyprduel_window_w) AM_BASE(&hyprduel_window) /* Tilemap Window */
AM_RANGE(0x878870, 0x87887b) AM_WRITE(hypr_scrollreg_w) /* Scroll Regs */
AM_RANGE(0x87887c, 0x87887d) AM_WRITE(hypr_scrollreg_init_w)
AM_RANGE(0x878870, 0x87887b) AM_RAM_WRITE(hyprduel_scrollreg_w) AM_BASE(&hyprduel_scroll) /* Scroll Regs */
AM_RANGE(0x87887c, 0x87887d) AM_WRITE(hyprduel_scrollreg_init_w)
AM_RANGE(0x878880, 0x878881) AM_WRITENOP
AM_RANGE(0x878890, 0x878891) AM_WRITENOP
AM_RANGE(0x8788a0, 0x8788a1) AM_WRITENOP
@ -598,11 +591,15 @@ static MACHINE_RESET( hyprduel )
/* start with cpu2 halted */
cpu_set_input_line(machine->cpu[1], INPUT_LINE_RESET, ASSERT_LINE);
subcpu_resetline = 1;
requested_int = 0x00;
blitter_bit = 2;
*hypr_irq_enable = 0xff;
}
static MACHINE_START( magerror )
{
timer_adjust_periodic(magerror_irq_timer, attotime_zero, 0, ATTOTIME_IN_HZ(896)); /* ? */
timer_adjust_periodic(magerror_irq_timer, attotime_zero, 0, ATTOTIME_IN_HZ(968)); /* ? */
}
static MACHINE_DRIVER_START( hyprduel )
@ -618,6 +615,8 @@ static MACHINE_DRIVER_START( hyprduel )
MDRV_MACHINE_RESET(hyprduel)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE)
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
@ -660,6 +659,8 @@ static MACHINE_DRIVER_START( magerror )
MDRV_MACHINE_RESET(hyprduel)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE)
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
@ -738,28 +739,11 @@ ROM_END
static DRIVER_INIT( hyprduel )
{
int i, len = memory_region_length(machine, "gfx1");
UINT8 *ROM = memory_region(machine, "gfx1");
/*
Tiles can be either 4-bit or 8-bit, and both depths can be used at the same
time. The transparent pen is the last one, that is 15 or 255. To make
tilemap.c handle that, we invert gfx data so the transparent pen becomes 0
for both tile depths.
*/
for (i=0; i<len; i++)
ROM[i] ^= 0xff;
requested_int = 0x00;
blitter_bit = 2;
*hypr_irq_enable = 0xff;
int_num = 0x02;
memory_install_read16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xc00408, 0xc0040b, 0, 0, hypr_cpusync_r);
/* Set up save state */
state_save_register_global(machine, rastersplit);
state_save_register_global(machine, blitter_bit);
state_save_register_global(machine, requested_int);
state_save_register_global(machine, subcpu_resetline);

View File

@ -2,10 +2,6 @@
#define FIRST_VISIBLE_LINE 0
#define LAST_VISIBLE_LINE 223
/*----------- defined in drivers/hyprduel.c -----------*/
extern int rastersplit;
/*----------- defined in video/hyprduel.c -----------*/
extern UINT16 *hyprduel_videoregs;
@ -14,13 +10,15 @@ extern UINT16 *hyprduel_tiletable;
extern size_t hyprduel_tiletable_size;
extern UINT16 *hyprduel_vram_0, *hyprduel_vram_1, *hyprduel_vram_2;
extern UINT16 *hyprduel_window;
extern UINT16 *hyprduel_scroll;
WRITE16_HANDLER( hyprduel_paletteram_w );
WRITE16_HANDLER( hyprduel_window_w );
WRITE16_HANDLER( hyprduel_vram_0_w );
WRITE16_HANDLER( hyprduel_vram_1_w );
WRITE16_HANDLER( hyprduel_vram_2_w );
WRITE16_HANDLER( hypr_scrollreg_w );
WRITE16_HANDLER( hypr_scrollreg_init_w );
WRITE16_HANDLER( hyprduel_scrollreg_w );
WRITE16_HANDLER( hyprduel_scrollreg_init_w );
VIDEO_START( hyprduel_14220 );
VIDEO_UPDATE( hyprduel );

View File

@ -65,15 +65,14 @@ UINT16 *hyprduel_tiletable;
size_t hyprduel_tiletable_size;
UINT16 *hyprduel_vram_0,*hyprduel_vram_1,*hyprduel_vram_2;
UINT16 *hyprduel_window;
UINT16 *hyprduel_scroll;
static UINT16 hyprduel_scrollx[3][RASTER_LINES+1];
static UINT16 hyprduel_scrolly[3][RASTER_LINES+1];
static UINT16 *hypr_tiletable_old;
static UINT16 *hyprduel_tiletable_old;
static UINT8 *dirtyindex;
static int hyprduel_sprite_xoffs;
static int hyprduel_sprite_yoffs;
static int hyprduel_sprite_yoffs_magerror;
static int hyprduel_sprite_yoffs_sub;
/***************************************************************************
Palette GGGGGRRRRRBBBBBx
@ -82,8 +81,7 @@ static int hyprduel_sprite_yoffs_magerror;
WRITE16_HANDLER( hyprduel_paletteram_w )
{
data = COMBINE_DATA(&paletteram16[offset]);
/* We need the ^0xff because we had to invert the pens in the gfx */
palette_set_color_rgb(space->machine,offset^0xff,pal5bit(data >> 6),pal5bit(data >> 11),pal5bit(data >> 1));
palette_set_color_rgb(space->machine,offset,pal5bit(data >> 6),pal5bit(data >> 11),pal5bit(data >> 1));
}
@ -125,7 +123,6 @@ static UINT8 *empty_tiles;
/* 8x8x4 tiles only */
#ifdef UNUSED_FUNCTION
INLINE void get_tile_info(running_machine *machine,tile_data *tileinfo,int tile_index,int layer,UINT16 *vram)
{
UINT16 code;
@ -148,17 +145,20 @@ INLINE void get_tile_info(running_machine *machine,tile_data *tileinfo,int tile_
{
int _code = code & 0x000f;
tileinfo->pen_data = empty_tiles + _code*16*16;
tileinfo->palette_base = ((code & 0x0ff0) ^ 0x0f0) + 0x1000;
tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000;
tileinfo->flags = 0;
tileinfo->group = 0;
}
else
{
tileinfo->group = 0;
SET_TILE_INFO(
0,
(tile & 0xfffff) + (code & 0xf),
(((tile & 0x0ff00000) >> 20) ^ 0x0f) + 0x100,
(((tile & 0x0ff00000) >> 20)) + 0x100,
TILE_FLIPXY((code & 0x6000) >> 13));
}
#endif
}
/* 8x8x4 or 8x8x8 tiles. It's the tile's color that decides: if its low 4
bits are high ($f,$1f,$2f etc) the tile is 8bpp, otherwise it's 4bpp */
@ -184,26 +184,32 @@ INLINE void get_tile_info_8bit(running_machine *machine,tile_data *tileinfo,int
{
int _code = code & 0x000f;
tileinfo->pen_data = empty_tiles + _code*16*16;
tileinfo->palette_base = ((code & 0x0ff0) ^ 0x0f0) + 0x1000;
tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000;
tileinfo->flags = 0;
tileinfo->group = 0;
}
else if ((tile & 0x00f00000)==0x00f00000) /* draw tile as 8bpp */
{
tileinfo->group = 1;
SET_TILE_INFO(
1,
(tile & 0xfffff) + 2*(code & 0xf),
((tile & 0x0f000000) >> 24) + 0x10,
TILE_FLIPXY((code & 0x6000) >> 13));
}
else
{
tileinfo->group = 0;
SET_TILE_INFO(
0,
(tile & 0xfffff) + (code & 0xf),
(((tile & 0x0ff00000) >> 20) ^ 0x0f) + 0x100,
(((tile & 0x0ff00000) >> 20)) + 0x100,
TILE_FLIPXY((code & 0x6000) >> 13));
}
}
/* 16x16x4 or 16x16x8 tiles. It's the tile's color that decides: if its low 4
bits are high ($f,$1f,$2f etc) the tile is 8bpp, otherwise it's 4bpp */
#ifdef UNUSED_FUNCTION
INLINE void get_tile_info_16x16_8bit(running_machine *machine,tile_data *tileinfo,int tile_index,int layer,UINT16 *vram)
{
UINT16 code;
@ -226,28 +232,34 @@ INLINE void get_tile_info_16x16_8bit(running_machine *machine,tile_data *tileinf
{
int _code = code & 0x000f;
tileinfo->pen_data = empty_tiles + _code*16*16;
tileinfo->palette_base = ((code & 0x0ff0) ^ 0x0f0) + 0x1000;
tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000;
tileinfo->flags = 0;
tileinfo->group = 0;
}
else if ((tile & 0x00f00000)==0x00f00000) /* draw tile as 8bpp */
{
tileinfo->group = 1;
SET_TILE_INFO(
3,
(tile & 0xfffff) + 8*(code & 0xf),
((tile & 0x0f000000) >> 24) + 0x10,
TILE_FLIPXY((code & 0x6000) >> 13));
}
else
{
tileinfo->group = 0;
SET_TILE_INFO(
2,
(tile & 0xfffff) + 4*(code & 0xf),
(((tile & 0x0ff00000) >> 20) ^ 0x0f) + 0x100,
(((tile & 0x0ff00000) >> 20)) + 0x100,
TILE_FLIPXY((code & 0x6000) >> 13));
}
}
#endif
INLINE void hyprduel_vram_w(offs_t offset,UINT16 data,UINT16 mem_mask,int layer,UINT16 *vram)
{
COMBINE_DATA(&vram[offset]);
{
/* Account for the window */
int col = (offset % BIG_NX) - ((hyprduel_window[layer * 2 + 1] / 8) % BIG_NX);
@ -285,7 +297,6 @@ WRITE16_HANDLER( hyprduel_window_w )
}
}
/***************************************************************************
Video Init Routines
***************************************************************************/
@ -306,42 +317,60 @@ static void alloc_empty_tiles(void)
for (code = 0;code < 0x10;code++)
for (i = 0;i < 16*16;i++)
empty_tiles[16*16*code + i] = code ^ 0x0f;
empty_tiles[16*16*code + i] = code;
}
static STATE_POSTLOAD( hyprduel_postload )
{
int i;
for (i=0; i<3; i++)
{
UINT16 wx = hyprduel_window[i * 2 + 1];
UINT16 wy = hyprduel_window[i * 2 + 0];
tilemap_set_scrollx(bg_tilemap[i], 0, hyprduel_scroll[i * 2 + 1] - wx - (wx & 7));
tilemap_set_scrolly(bg_tilemap[i], 0, hyprduel_scroll[i * 2 + 0] - wy - (wy & 7));
tilemap_mark_all_tiles_dirty(bg_tilemap[i]);
}
}
VIDEO_START( hyprduel_14220 )
{
alloc_empty_tiles();
hypr_tiletable_old = auto_malloc(hyprduel_tiletable_size);
hyprduel_tiletable_old = auto_malloc(hyprduel_tiletable_size);
dirtyindex = auto_malloc(hyprduel_tiletable_size/4);
bg_tilemap[0] = tilemap_create(machine, get_tile_info_0_8bit,tilemap_scan_rows,8,8,WIN_NX,WIN_NY);
bg_tilemap[1] = tilemap_create(machine, get_tile_info_1_8bit,tilemap_scan_rows,8,8,WIN_NX,WIN_NY);
bg_tilemap[2] = tilemap_create(machine, get_tile_info_2_8bit,tilemap_scan_rows,8,8,WIN_NX,WIN_NY);
tilemap_set_transparent_pen(bg_tilemap[0],0);
tilemap_set_transparent_pen(bg_tilemap[1],0);
tilemap_set_transparent_pen(bg_tilemap[2],0);
tilemap_map_pen_to_layer(bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
tilemap_map_pen_to_layer(bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
tilemap_map_pen_to_layer(bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
tilemap_map_pen_to_layer(bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
tilemap_map_pen_to_layer(bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
tilemap_map_pen_to_layer(bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
tilemap_set_scrolldx(bg_tilemap[0], 0, 0);
tilemap_set_scrolldx(bg_tilemap[1], 0, 0);
tilemap_set_scrolldx(bg_tilemap[2], 0, 0);
if (!strcmp(machine->gamedrv->name, "magerror"))
hyprduel_sprite_yoffs_magerror = 2;
hyprduel_sprite_yoffs_sub = 0;
else
hyprduel_sprite_yoffs_magerror = 0;
hyprduel_sprite_yoffs_sub = 2;
/* Set up save state */
state_save_register_global_array(machine, hyprduel_scrollx[0]);
state_save_register_global_array(machine, hyprduel_scrollx[1]);
state_save_register_global_array(machine, hyprduel_scrollx[2]);
state_save_register_global_array(machine, hyprduel_scrolly[0]);
state_save_register_global_array(machine, hyprduel_scrolly[1]);
state_save_register_global_array(machine, hyprduel_scrolly[2]);
state_save_register_global(machine, hyprduel_sprite_xoffs);
state_save_register_global(machine, hyprduel_sprite_yoffs);
state_save_register_global(machine, hyprduel_sprite_yoffs_magerror);
state_save_register_global(machine, hyprduel_sprite_yoffs_sub);
state_save_register_postload(machine, hyprduel_postload, NULL);
}
/***************************************************************************
@ -373,35 +402,6 @@ VIDEO_START( hyprduel_14220 )
***************************************************************************/
WRITE16_HANDLER( hypr_scrollreg_w )
{
int i;
if (offset & 0x01)
{
for (i = rastersplit; i < RASTER_LINES; i++)
hyprduel_scrollx[offset>>1][i] = data;
} else {
for (i = rastersplit; i < RASTER_LINES; i++)
hyprduel_scrolly[offset>>1][i] = data;
}
}
WRITE16_HANDLER( hypr_scrollreg_init_w )
{
int i;
for (i = 0; i < RASTER_LINES; i++)
{
hyprduel_scrollx[0][i] = data;
hyprduel_scrollx[1][i] = data;
hyprduel_scrollx[2][i] = data;
hyprduel_scrolly[0][i] = data;
hyprduel_scrolly[1][i] = data;
hyprduel_scrolly[2][i] = data;
}
}
/***************************************************************************
Sprites Drawing
@ -430,12 +430,10 @@ WRITE16_HANDLER( hypr_scrollreg_init_w )
/* Draw sprites */
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
{
const char * region = "gfx1";
UINT8 *base_gfx = memory_region(machine, region);
UINT8 *gfx_max = base_gfx + memory_region_length(machine, region);
UINT8 *base_gfx = memory_region(machine, "gfx1");
UINT8 *gfx_max = base_gfx + memory_region_length(machine, "gfx1");
int max_x = video_screen_get_width(machine->primary_screen);
int max_y = video_screen_get_height(machine->primary_screen);
@ -445,18 +443,31 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
int color_start = ((hyprduel_videoregs[0x08/2] & 0xf) << 4 ) + 0x100;
int i, pri;
int i, j, pri;
static const int primask[4] = { 0x0000, 0xff00, 0xff00|0xf0f0, 0xff00|0xf0f0|0xcccc };
UINT16 *src;
int inc;
if (sprites == 0)
return;
for (i=0; i<0x20; i++)
{
UINT16 *src = spriteram16 + (sprites - 1) * (8/2);
UINT16 *end = spriteram16;
gfx_element gfx;
for ( ; src >= end; src -= 8/2 )
if (!(hyprduel_videoregs[0x02/2] & 0x8000))
{
src = spriteram16 + (sprites - 1) * (8/2);
inc = -(8/2);
} else {
src = spriteram16;
inc = (8/2);
}
for (j=0; j<sprites; j++)
{
int x,y, attr,code,color,flipx,flipy, zoom, curr_pri,width,height;
gfx_element gfx;
UINT8 *gfxdata;
/* Exponential zoom table extracted from daitoride */
@ -472,7 +483,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
x = src[ 0 ];
curr_pri = (x & 0xf800) >> 11;
if ((curr_pri == 0x1f) || (curr_pri != i)) continue;
if ((curr_pri == 0x1f) || (curr_pri != i))
{
src += inc;
continue;
}
pri = (hyprduel_videoregs[0x02/2] & 0x0300) >> 8;
@ -493,7 +509,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
zoom = zoomtable[(y & 0xfc00) >> 10] << (16-8);
x = (x & 0x07ff) - hyprduel_sprite_xoffs;
y = (y & 0x03ff) - hyprduel_sprite_yoffs +2;
y = (y & 0x03ff) - hyprduel_sprite_yoffs;
width = (( (attr >> 11) & 0x7 ) + 1 ) * 8;
height = (( (attr >> 8) & 0x7 ) + 1 ) * 8;
@ -519,7 +535,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
color_start >> 4,
flipx, flipy,
x, y,
cliprect, TRANSPARENCY_PEN, 0,
cliprect, TRANSPARENCY_PEN, 255,
zoom, zoom,
primask[pri]);
}
@ -533,10 +549,10 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
pdrawgfxzoom( bitmap,&gfx,
0,
(color ^ 0x0f) + color_start,
color + color_start,
flipx, flipy,
x, y,
cliprect, TRANSPARENCY_PEN, 0,
cliprect, TRANSPARENCY_PEN, 15,
zoom, zoom,
primask[pri]);
}
@ -547,53 +563,60 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
ui_draw_text(buf, x, y);
}
#endif
src += inc;
}
}
}
/***************************************************************************
Screen Drawing
***************************************************************************/
/* Draw all the layers that match the given priority */
WRITE16_HANDLER( hyprduel_scrollreg_w )
{
UINT16 window = hyprduel_window[offset];
COMBINE_DATA(&hyprduel_scroll[offset]);
if (offset & 0x01)
tilemap_set_scrollx(bg_tilemap[offset / 2], 0, hyprduel_scroll[offset] - window - (window & 7));
else
tilemap_set_scrolly(bg_tilemap[offset / 2], 0, hyprduel_scroll[offset] - window - (window & 7));
}
WRITE16_HANDLER( hyprduel_scrollreg_init_w )
{
int i;
for (i=0; i<3; i++)
{
UINT16 wx = hyprduel_window[i * 2 + 1];
UINT16 wy = hyprduel_window[i * 2 + 0];
hyprduel_scroll[i * 2 + 1] = data;
hyprduel_scroll[i * 2 + 0] = data;
tilemap_set_scrollx(bg_tilemap[i], 0, data - wx - (wx & 7));
tilemap_set_scrolly(bg_tilemap[i], 0, data - wy - (wy & 7));
}
}
static void draw_layers(bitmap_t *bitmap, const rectangle *cliprect, int pri, int layers_ctrl)
{
UINT16 layers_pri = hyprduel_videoregs[0x10/2];
int layer;
int offs;
rectangle clip;
clip.min_x = 0;
clip.max_x = 319;
/* Draw all the layers with priority == pri */
for (layer = 2; layer >= 0; layer--) // tilemap[2] below?
{
if ( pri == ((layers_pri >> (layer*2)) & 3) )
{
/* Scroll and Window values */
UINT16 wx = hyprduel_window[layer * 2 + 1];
UINT16 wy = hyprduel_window[layer * 2 + 0];
wx = wx - (wx & 7);
wy = wy - (wy & 7);
if (layers_ctrl & (1<<layer))
{
for (offs = cliprect->min_y; offs <= cliprect->max_y; offs++)
{
clip.min_y = offs;
clip.max_y = offs;
tilemap_set_scrollx(bg_tilemap[layer], 0, hyprduel_scrollx[layer][offs+RASTER_LINES-(LAST_VISIBLE_LINE+1)] - wx);
tilemap_set_scrolly(bg_tilemap[layer], 0, hyprduel_scrolly[layer][offs+RASTER_LINES-(LAST_VISIBLE_LINE+1)] - wy);
tilemap_draw(bitmap,&clip,bg_tilemap[layer], 0, 1<<(3-pri));
if (layers_ctrl & (1<<layer)) // for debug
tilemap_draw(bitmap,cliprect,bg_tilemap[layer], 0, 1<<(3-pri));
}
}
}
}
}
/* Dirty tilemaps when the tiles set changes */
static void dirty_tiles(int layer,UINT16 *vram)
@ -627,7 +650,7 @@ VIDEO_UPDATE( hyprduel )
for (i = 0;i < hyprduel_tiletable_size/4;i++)
{
UINT32 tile_new = (hyprduel_tiletable[2*i + 0] << 16 ) + hyprduel_tiletable[2*i + 1];
UINT32 tile_old = (hypr_tiletable_old[2*i + 0] << 16 ) + hypr_tiletable_old[2*i + 1];
UINT32 tile_old = (hyprduel_tiletable_old[2*i + 0] << 16 ) + hyprduel_tiletable_old[2*i + 1];
if ((tile_new ^ tile_old) & 0x0fffffff)
{
@ -635,7 +658,7 @@ VIDEO_UPDATE( hyprduel )
dirty = 1;
}
}
memcpy(hypr_tiletable_old,hyprduel_tiletable,hyprduel_tiletable_size);
memcpy(hyprduel_tiletable_old,hyprduel_tiletable,hyprduel_tiletable_size);
if (dirty)
{
@ -646,11 +669,11 @@ VIDEO_UPDATE( hyprduel )
}
hyprduel_sprite_xoffs = hyprduel_videoregs[0x06/2] - video_screen_get_width(screen) / 2;
hyprduel_sprite_yoffs = hyprduel_videoregs[0x04/2] - video_screen_get_height(screen) / 2 + hyprduel_sprite_yoffs_magerror;
hyprduel_sprite_yoffs = hyprduel_videoregs[0x04/2] - video_screen_get_height(screen) / 2 - hyprduel_sprite_yoffs_sub;
/* The background color is selected by a register */
bitmap_fill(priority_bitmap,cliprect,0);
bitmap_fill(bitmap,cliprect,((hyprduel_videoregs[0x12/2] & 0x0fff) ^ 0x0ff) + 0x1000);
bitmap_fill(bitmap,cliprect,((hyprduel_videoregs[0x12/2] & 0x0fff)) + 0x1000);
/* Screen Control Register:
@ -666,10 +689,6 @@ VIDEO_UPDATE( hyprduel )
if (screenctrl & 2) return 0;
flip_screen_set(screen->machine, screenctrl & 1);
/* If the game supports 16x16 tiles, make sure that the
16x16 and 8x8 tilemaps of a given layer are not simultaneously
enabled! */
#if 0
if (input_code_pressed(KEYCODE_Z))
{ int msk = 0;
@ -692,5 +711,6 @@ if (input_code_pressed(KEYCODE_Z))
if (layers_ctrl & 0x08)
draw_sprites(screen->machine,bitmap,cliprect);
return 0;
}