diff options
Diffstat (limited to 'src/mame/video/cloak.c')
-rw-r--r-- | src/mame/video/cloak.c | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/src/mame/video/cloak.c b/src/mame/video/cloak.c new file mode 100644 index 00000000000..29e7c66d5af --- /dev/null +++ b/src/mame/video/cloak.c @@ -0,0 +1,231 @@ +/*************************************************************************** + + Atari Cloak & Dagger hardware + +***************************************************************************/ + +#include "driver.h" +#include "cloak.h" + +static mame_bitmap *tmpbitmap2; +static UINT8 x,y,bmap; +static UINT8 *tmpvideoram,*tmpvideoram2; + +static tilemap *bg_tilemap; + +/*************************************************************************** + + CLOAK & DAGGER uses RAM to dynamically + create the palette. The resolution is 9 bit (3 bits per gun). The palette + contains 64 entries, but it is accessed through a memory windows 128 bytes + long: writing to the first 64 bytes sets the msb of the red component to 0, + while writing to the last 64 bytes sets it to 1. + + Colors 0-15 Character mapped graphics + Colors 16-31 Bitmapped graphics (maybe 8 colors per bitmap?) + Colors 32-47 Sprites + Colors 48-63 not used + + These are the exact resistor values from the schematics: + + bit 8 -- diode |< -- pullup 1 kohm -- 2.2 kohm resistor -- pulldown 100 pf -- RED + -- diode |< -- pullup 1 kohm -- 4.7 kohm resistor -- pulldown 100 pf -- RED + -- diode |< -- pullup 1 kohm -- 10 kohm resistor -- pulldown 100 pf -- RED + -- diode |< -- pullup 1 kohm -- 2.2 kohm resistor -- pulldown 100 pf -- GREEN + -- diode |< -- pullup 1 kohm -- 4.7 kohm resistor -- pulldown 100 pf -- GREEN + -- diode |< -- pullup 1 kohm -- 10 kohm resistor -- pulldown 100 pf -- GREEN + -- diode |< -- pullup 1 kohm -- 2.2 kohm resistor -- pulldown 100 pf -- BLUE + -- diode |< -- pullup 1 kohm -- 4.7 kohm resistor -- pulldown 100 pf -- BLUE + bit 0 -- diode |< -- pullup 1 kohm -- 10 kohm resistor -- pulldown 100 pf -- BLUE + +***************************************************************************/ +WRITE8_HANDLER( cloak_paletteram_w ) +{ + int r,g,b; + int bit0,bit1,bit2; + + /* a write to offset 64-127 means to set the msb of the red component */ + int color = data | ((offset & 0x40) << 2); + + r = (~color & 0x1c0) >> 6; + g = (~color & 0x038) >> 3; + b = (~color & 0x007); + + // the following is WRONG! fix it + + bit0 = (r >> 0) & 0x01; + bit1 = (r >> 1) & 0x01; + bit2 = (r >> 2) & 0x01; + r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (g >> 0) & 0x01; + bit1 = (g >> 1) & 0x01; + bit2 = (g >> 2) & 0x01; + g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (b >> 0) & 0x01; + bit1 = (b >> 1) & 0x01; + bit2 = (b >> 2) & 0x01; + b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + palette_set_color(Machine,offset & 0x3f,MAKE_RGB(r,g,b)); +} + +WRITE8_HANDLER( cloak_clearbmp_w ) +{ + bmap = data & 0x01; + + if (data & 0x02) /* clear */ + { + if (bmap) + { + fillbitmap(tmpbitmap, Machine->pens[16], &Machine->screen[0].visarea); + memset(tmpvideoram, 0, 256*256); + } + else + { + fillbitmap(tmpbitmap2, Machine->pens[16], &Machine->screen[0].visarea); + memset(tmpvideoram2, 0, 256*256); + } + } +} + +static void adjust_xy(int offset) +{ + switch(offset) + { + case 0x00: x--; y++; break; + case 0x01: y--; break; + case 0x02: x--; break; + case 0x04: x++; y++; break; + case 0x05: y++; break; + case 0x06: x++; break; + } +} + +READ8_HANDLER( graph_processor_r ) +{ + int ret; + + if (bmap) + { + ret = tmpvideoram2[y * 256 + x]; + } + else + { + ret = tmpvideoram[y * 256 + x]; + } + + adjust_xy(offset); + + return ret; +} + +WRITE8_HANDLER( graph_processor_w ) +{ + int color; + + switch (offset) + { + case 0x03: x = data; break; + case 0x07: y = data; break; + default: + color = data & 0x07; + + if (bmap) + { + *BITMAP_ADDR16(tmpbitmap, y, (x-6)&0xff) = Machine->pens[16 + color]; + tmpvideoram[y*256+x] = color; + } + else + { + *BITMAP_ADDR16(tmpbitmap2, y, (x-6)&0xff) = Machine->pens[16 + color]; + tmpvideoram2[y*256+x] = color; + } + + adjust_xy(offset); + break; + } +} + +WRITE8_HANDLER( cloak_videoram_w ) +{ + videoram[offset] = data; + tilemap_mark_tile_dirty(bg_tilemap, offset); +} + +WRITE8_HANDLER( cloak_flipscreen_w ) +{ + flip_screen_set(data & 0x80); +} + +static TILE_GET_INFO( get_bg_tile_info ) +{ + int code = videoram[tile_index]; + + SET_TILE_INFO(0, code, 0, 0); +} + +static void refresh_bitmaps(void) +{ + int lx,ly; + + for (ly = 0; ly < 256; ly++) + { + for (lx = 0; lx < 256; lx++) + { + *BITMAP_ADDR16(tmpbitmap, ly, (lx-6)&0xff) = Machine->pens[16 + tmpvideoram[ly*256+lx]]; + *BITMAP_ADDR16(tmpbitmap2, ly, (lx-6)&0xff) = Machine->pens[16 + tmpvideoram2[ly*256+lx]]; + } + } +} + +VIDEO_START( cloak ) +{ + bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows, + TILEMAP_TYPE_PEN, 8, 8, 32, 32); + + tmpbitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format); + tmpbitmap2 = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format); + + tmpvideoram = auto_malloc(256*256); + tmpvideoram2 = auto_malloc(256*256); + + state_save_register_global(x); + state_save_register_global(y); + state_save_register_global(bmap); + state_save_register_global_pointer(tmpvideoram, 256*256); + state_save_register_global_pointer(tmpvideoram2, 256*256); + state_save_register_func_postload(refresh_bitmaps); +} + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) +{ + int offs; + + for (offs = (spriteram_size / 4) - 1; offs >= 0; offs--) + { + int code = spriteram[offs + 64] & 0x7f; + int flipx = spriteram[offs + 64] & 0x80; + int flipy = 0; + int sx = spriteram[offs + 192]; + int sy = 240 - spriteram[offs]; + + if (flip_screen) + { + sx -= 9; + sy = 240 - sy; + flipx = !flipx; + flipy = !flipy; + } + + drawgfx(bitmap, machine->gfx[1], code, 0, flipx, flipy, + sx, sy, cliprect, TRANSPARENCY_PEN, 0); + } +} + +VIDEO_UPDATE( cloak ) +{ + tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); + copybitmap(bitmap, (bmap ? tmpbitmap2 : tmpbitmap),flip_screen,flip_screen,0,0,cliprect,TRANSPARENCY_COLOR,16); + draw_sprites(machine, bitmap, cliprect); + return 0; +} |