summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2010-01-17 17:46:14 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2010-01-17 17:46:14 +0000
commit4230eb97cdbd8c59566156299415457de84aa635 (patch)
tree562ac61700540adc05b4499175ea5c8fb38b0d16 /src
parent51f56f0eb69dfc8cdb5b8f09b4d0ab0bc9bb966d (diff)
Implemented preliminary zooming
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/cybertnk.c50
1 files changed, 32 insertions, 18 deletions
diff --git a/src/mame/drivers/cybertnk.c b/src/mame/drivers/cybertnk.c
index 6609ba8cd66..cef82738f6c 100644
--- a/src/mame/drivers/cybertnk.c
+++ b/src/mame/drivers/cybertnk.c
@@ -7,11 +7,10 @@ preliminary driver by Angelo Salese
Maybe it has some correlation with WEC Le Mans HW? (supposely that was originally done by Coreland too)
TODO:
-- sprite ram (very likely that it can do zooming);
+- sprite emulation (very likely that it can do zooming);
- road emulation;
-- tilemap video registers;
-- color banking for the tilemaps;
-- ROM "SS5" is missing? Or it's a sound chip that's labelled SS5?
+- tilemap scrolling /-color banking;
+- inputs doesn't work in-game?
- dual screen output.
============================================================================================
@@ -210,7 +209,6 @@ static VIDEO_UPDATE( cybertnk )
{
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
- //popmessage("%04x",test);
{
int count,x,y;
const gfx_element *gfx = screen->machine->gfx[2];
@@ -257,33 +255,43 @@ static VIDEO_UPDATE( cybertnk )
if(1)
{
const UINT8 *blit_ram = memory_region(screen->machine,"spr_gfx");
- int offs,x,y,z,xsize,ysize,yi,xi,col_bank,fx;
+ int offs,x,y,z,xsize,ysize,yi,xi,col_bank,fx,zoom;
UINT32 spr_offs;
+ int xf,yf,xz,yz;
for(offs=0;offs<0x1000/2;offs+=8)
{
z = (spr_ram[offs+(0x6/2)] & 0xffff);
if(z == 0xffff || spr_ram[offs+(0x0/2)] == 0x0000) //TODO: check the correct bit
continue;
- x = (spr_ram[offs+(0xa/2)] & 0x1ff);
+ x = (spr_ram[offs+(0xa/2)] & 0x3ff);
y = (spr_ram[offs+(0x4/2)] & 0xff);
if(spr_ram[offs+(0x4/2)] & 0x100)
y = 0x100 - y;
spr_offs = (((spr_ram[offs+(0x0/2)] & 7) << 16) | (spr_ram[offs+(0x2/2)])) << 2;
- xsize = ((spr_ram[offs+(0xc/2)] & 0x000f)+1) << 3; //obviously wrong!
+ xsize = ((spr_ram[offs+(0xc/2)] & 0x000f)+1) << 3;
ysize = (spr_ram[offs+(0x8/2)] & 0x00ff)+1;
fx = (spr_ram[offs+(0xa/2)] & 0x8000) >> 15;
+ zoom = (spr_ram[offs+(0xc/2)] & 0xff00) >> 8;
col_bank = (spr_ram[offs+(0x0/2)] & 0xff00) >> 8;
+ xf = 0;
+ yf = 0;
+ xz = 0;
+ yz = 0;
+
+ if(zoom > 0x80)
+ continue;
+
for(yi = 0;yi < ysize;yi++)
{
+ xf = xz = 0;
for(xi=0;xi < xsize;xi+=8)
{
UINT32 color;
UINT16 dot;
- int shift_pen;
- int x_dec; //helpers
+ int shift_pen, x_dec; //helpers
color = ((blit_ram[spr_offs+0] & 0xff) << 24);
color|= ((blit_ram[spr_offs+1] & 0xff) << 16);
@@ -301,17 +309,19 @@ static VIDEO_UPDATE( cybertnk )
dot|= col_bank<<4;
if(fx)
{
- if(((x+xsize-(x_dec+xi)) < video_screen_get_visible_area(screen)->max_x) && ((y+yi) < video_screen_get_visible_area(screen)->max_y))
- *BITMAP_ADDR16(bitmap, y+yi, x+xsize-(x_dec+xi)) = screen->machine->pens[dot];
+ if(((x+xsize-(xz)) < video_screen_get_visible_area(screen)->max_x) && ((y+yi) < video_screen_get_visible_area(screen)->max_y))
+ *BITMAP_ADDR16(bitmap, y+yz, x+xsize-(xz)) = screen->machine->pens[dot];
}
else
{
- if(((x+x_dec+xi) < video_screen_get_visible_area(screen)->max_x) && ((y+yi) < video_screen_get_visible_area(screen)->max_y))
- *BITMAP_ADDR16(bitmap, y+yi, x+x_dec+xi) = screen->machine->pens[dot];
+ if(((x+xz) < video_screen_get_visible_area(screen)->max_x) && ((y+yi) < video_screen_get_visible_area(screen)->max_y))
+ *BITMAP_ADDR16(bitmap, y+yz, x+xz) = screen->machine->pens[dot];
}
}
shift_pen -= 8;
x_dec++;
+ xf+=zoom;
+ if(xf >= 0x80) { xz++; xf-=0x80; }
}
shift_pen = 24;
@@ -325,21 +335,25 @@ static VIDEO_UPDATE( cybertnk )
dot|= col_bank<<4;
if(fx)
{
- if(((x+xsize-(x_dec+xi)) < video_screen_get_visible_area(screen)->max_x) && ((y+yi) < video_screen_get_visible_area(screen)->max_y))
- *BITMAP_ADDR16(bitmap, y+yi, x+xsize-(x_dec+xi)) = screen->machine->pens[dot];
+ if(((x+xsize-(xz)) < video_screen_get_visible_area(screen)->max_x) && ((y+yi) < video_screen_get_visible_area(screen)->max_y))
+ *BITMAP_ADDR16(bitmap, y+yz, x+xsize-(xz)) = screen->machine->pens[dot];
}
else
{
if(((x+x_dec+xi) < video_screen_get_visible_area(screen)->max_x) && ((y+yi) < video_screen_get_visible_area(screen)->max_y))
- *BITMAP_ADDR16(bitmap, y+yi, x+x_dec+xi) = screen->machine->pens[dot];
+ *BITMAP_ADDR16(bitmap, y+yz, x+xz) = screen->machine->pens[dot];
}
}
shift_pen -= 8;
x_dec++;
+ xf+=zoom;
+ if(xf >= 0x80) { xz++; xf-=0x80; }
}
spr_offs+=4;
}
+ yf+=zoom;
+ if(yf >= 0x80) { yz++; yf-=0x80; }
}
}
}
@@ -608,7 +622,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( slave_mem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x01ffff) AM_ROM
AM_RANGE(0x080000, 0x083fff) AM_RAM /*Work RAM*/
- AM_RANGE(0x0c0000, 0x0c3fff) AM_RAM
+ AM_RANGE(0x0c0000, 0x0c0fff) AM_RAM
AM_RANGE(0x100000, 0x100fff) AM_RAM AM_SHARE("sharedram")
AM_RANGE(0x140000, 0x140003) AM_NOP /*Watchdog? Written during loops and interrupts*/
ADDRESS_MAP_END