diff options
Diffstat (limited to 'src/mame/video/skyraid.c')
-rw-r--r-- | src/mame/video/skyraid.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/src/mame/video/skyraid.c b/src/mame/video/skyraid.c new file mode 100644 index 00000000000..22cda7c4570 --- /dev/null +++ b/src/mame/video/skyraid.c @@ -0,0 +1,159 @@ +/*************************************************************************** + +Atari Sky Raider video emulation + +***************************************************************************/ + +#include "driver.h" + +int skyraid_scroll; + +UINT8* skyraid_alpha_num_ram; +UINT8* skyraid_pos_ram; +UINT8* skyraid_obj_ram; + +static mame_bitmap *helper; + + +VIDEO_START( skyraid ) +{ + helper = auto_bitmap_alloc(128, 240, machine->screen[0].format); +} + + +static void draw_text(running_machine *machine, mame_bitmap* bitmap, const rectangle* cliprect) +{ + const UINT8* p = skyraid_alpha_num_ram; + + int i; + + for (i = 0; i < 4; i++) + { + int x; + int y; + + y = 136 + 16 * (i ^ 1); + + for (x = 0; x < bitmap->width; x += 16) + { + drawgfx(bitmap, machine->gfx[0], *p++, 0, 0, 0, + x, y, cliprect, TRANSPARENCY_PEN, 0); + } + } +} + + +static void draw_terrain(running_machine *machine, mame_bitmap* bitmap, const rectangle *cliprect) +{ + const UINT8* p = memory_region(REGION_USER1); + + int x; + int y; + + for (y = 0; y < bitmap->height; y++) + { + int offset = (16 * skyraid_scroll + 16 * ((y + 1) / 2)) & 0x7FF; + + x = 0; + + while (x < bitmap->width) + { + UINT8 val = p[offset++]; + + int color = val / 32; + int count = val % 32; + + rectangle r; + + r.min_y = y; + r.min_x = x; + r.max_y = y + 1; + r.max_x = x + 31 - count; + + fillbitmap(bitmap, machine->pens[color], &r); + + x += 32 - count; + } + } +} + + +static void draw_sprites(running_machine *machine, mame_bitmap* bitmap, const rectangle* cliprect) +{ + int i; + + for (i = 0; i < 4; i++) + { + int code = skyraid_obj_ram[8 + 2 * i + 0] & 15; + int flag = skyraid_obj_ram[8 + 2 * i + 1] & 15; + int vert = skyraid_pos_ram[8 + 2 * i + 0]; + int horz = skyraid_pos_ram[8 + 2 * i + 1]; + + vert -= 31; + + if (flag & 1) + { + drawgfx(bitmap, machine->gfx[1], + code ^ 15, code >> 3, 0, 0, + horz / 2, vert, cliprect, TRANSPARENCY_PEN, 2); + } + } +} + + +static void draw_missiles(running_machine *machine, mame_bitmap* bitmap, const rectangle* cliprect) +{ + int i; + + /* hardware is restricted to one sprite per scanline */ + + for (i = 0; i < 4; i++) + { + int code = skyraid_obj_ram[2 * i + 0] & 15; + int vert = skyraid_pos_ram[2 * i + 0]; + int horz = skyraid_pos_ram[2 * i + 1]; + + vert -= 15; + horz -= 31; + + drawgfx(bitmap, machine->gfx[2], + code ^ 15, 0, 0, 0, + horz / 2, vert, cliprect, TRANSPARENCY_PEN, 0); + } +} + + +static void draw_trapezoid(mame_bitmap* dst, mame_bitmap* src) +{ + const UINT8* p = memory_region(REGION_USER2); + + int x; + int y; + + for (y = 0; y < dst->height; y++) + { + UINT16* pSrc = BITMAP_ADDR16(src, y, 0); + UINT16* pDst = BITMAP_ADDR16(dst, y, 0); + + int x1 = 0x000 + p[(y & ~1) + 0]; + int x2 = 0x100 + p[(y & ~1) + 1]; + + for (x = x1; x < x2; x++) + { + pDst[x] = pSrc[128 * (x - x1) / (x2 - x1)]; + } + } +} + + +VIDEO_UPDATE( skyraid ) +{ + fillbitmap(bitmap, machine->pens[0], cliprect); + + draw_terrain(machine, helper, cliprect); + draw_sprites(machine, helper, cliprect); + draw_missiles(machine, helper, cliprect); + draw_trapezoid(bitmap, helper); + draw_text(machine, bitmap, cliprect); + return 0; +} |