summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Yasuhiro Ogawa <wd40yasu@users.noreply.github.com>2009-03-28 16:26:45 +0000
committer Yasuhiro Ogawa <wd40yasu@users.noreply.github.com>2009-03-28 16:26:45 +0000
commitd15c4e0d3f54f4351bde7188cd8f35e7c67ec660 (patch)
tree01be0360ff07d0db38ceefdd119b898640189a5e
parentdc169055da79a616267dba3a6001304234ad3e4c (diff)
fix hyprduel to boot [Hau]
-rw-r--r--src/mame/drivers/hyprduel.c58
-rw-r--r--src/mame/includes/hyprduel.h10
-rw-r--r--src/mame/video/hyprduel.c240
3 files changed, 155 insertions, 153 deletions
diff --git a/src/mame/drivers/hyprduel.c b/src/mame/drivers/hyprduel.c
index 8da447a154c..a87b5300dac 100644
--- a/src/mame/drivers/hyprduel.c
+++ b/src/mame/drivers/hyprduel.c
@@ -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);
diff --git a/src/mame/includes/hyprduel.h b/src/mame/includes/hyprduel.h
index c706da544a1..ecd1b5414d7 100644
--- a/src/mame/includes/hyprduel.h
+++ b/src/mame/includes/hyprduel.h
@@ -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 );
+
diff --git a/src/mame/video/hyprduel.c b/src/mame/video/hyprduel.c
index b81f7fdc40e..40034018c10 100644
--- a/src/mame/video/hyprduel.c
+++ b/src/mame/video/hyprduel.c
@@ -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;
+
+ if (!(hyprduel_videoregs[0x02/2] & 0x8000))
+ {
+ src = spriteram16 + (sprites - 1) * (8/2);
+ inc = -(8/2);
+ } else {
+ src = spriteram16;
+ inc = (8/2);
+ }
- for ( ; src >= end; src -= 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,54 +563,61 @@ 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;
}