diff options
Diffstat (limited to 'src/mame/video/8080bw.c')
-rw-r--r-- | src/mame/video/8080bw.c | 478 |
1 files changed, 478 insertions, 0 deletions
diff --git a/src/mame/video/8080bw.c b/src/mame/video/8080bw.c new file mode 100644 index 00000000000..54b7dc78056 --- /dev/null +++ b/src/mame/video/8080bw.c @@ -0,0 +1,478 @@ +/*************************************************************************** + + video.c + + Functions to emulate the video hardware of the machine. + +***************************************************************************/ + +#include "driver.h" +#include "8080bw.h" +#include "mw8080bw.h" + + +#define NUM_PENS (8) + + +UINT8 *c8080bw_colorram; + +static UINT8 c8080bw_flip_screen; +static UINT8 color_map; +static UINT8 screen_red; +static UINT8 schaser_background_disable; +static UINT8 schaser_background_select; + + + +void c8080bw_flip_screen_w(int data) +{ + color_map = data; + c8080bw_flip_screen = data && (readinputportbytag(CABINET_PORT_TAG) & 0x01); +} + + +void c8080bw_screen_red_w(int data) +{ + screen_red = data; +} + + +void schaser_background_control_w(int data) +{ + schaser_background_disable = (data >> 3) & 0x01; + schaser_background_select = (data >> 4) & 0x01; +} + + +static void invadpt2_get_pens(pen_t *pens) +{ + offs_t i; + + for (i = 0; i < NUM_PENS; i++) + { + pens[i] = MAKE_RGB(pal1bit(i >> 0), pal1bit(i >> 2), pal1bit(i >> 1)); + } +} + + +static void sflush_get_pens(pen_t *pens) +{ + offs_t i; + + pens[0] = MAKE_RGB(0x80, 0x80, 0xff); + + for (i = 1; i < NUM_PENS; i++) + { + pens[i] = MAKE_RGB(pal1bit(i >> 0), pal1bit(i >> 2), pal1bit(i >> 1)); + } +} + + +static void cosmo_get_pens(pen_t *pens) +{ + offs_t i; + + for (i = 0; i < NUM_PENS; i++) + { + pens[i] = MAKE_RGB(pal1bit(i >> 0), pal1bit(i >> 1), pal1bit(i >> 2)); + } +} + + +INLINE void set_pixel(mame_bitmap *bitmap, UINT8 y, UINT8 x, pen_t *pens, UINT8 color) +{ + if (y >= MW8080BW_VCOUNTER_START_NO_VBLANK) + { + if (c8080bw_flip_screen) + *BITMAP_ADDR32(bitmap, MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - x) = pens[color]; + else + *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pens[color]; + } +} + + +INLINE void set_8_pixels(mame_bitmap *bitmap, UINT8 y, UINT8 x, UINT8 data, + pen_t *pens, UINT8 fore_color, UINT8 back_color) +{ + int i; + + for (i = 0; i < 8; i++) + { + set_pixel(bitmap, y, x, pens, (data & 0x01) ? fore_color : back_color); + + x = x + 1; + data = data >> 1; + } +} + + +/* this is needed as this driver doesn't emulate the shift register like mw8080bw does */ +static void clear_extra_columns(mame_bitmap *bitmap, pen_t *pens, UINT8 color) +{ + UINT8 x; + + for (x = 0; x < 4; x++) + { + UINT8 y; + + for (y = MW8080BW_VCOUNTER_START_NO_VBLANK; y != 0; y++) + { + if (c8080bw_flip_screen) + *BITMAP_ADDR32(bitmap, MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - (256 + x)) = pens[color]; + else + *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + x) = pens[color]; + } + } +} + + +VIDEO_UPDATE( invadpt2 ) +{ + pen_t pens[NUM_PENS]; + offs_t offs; + UINT8 *color_map_base; + + invadpt2_get_pens(pens); + + color_map_base = color_map ? &memory_region(REGION_PROMS)[0x0400] : memory_region(REGION_PROMS); + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + offs_t color_address = (offs >> 8 << 5) | (offs & 0x1f); + + UINT8 data = mw8080bw_ram[offs]; + UINT8 fore_color = screen_red ? 1 : color_map_base[color_address] & 0x07; + + set_8_pixels(bitmap, y, x, data, pens, fore_color, 0); + } + + clear_extra_columns(bitmap, pens, 0); + + return 0; +} + + +VIDEO_UPDATE( ballbomb ) +{ + pen_t pens[NUM_PENS]; + offs_t offs; + UINT8 *color_map_base; + + invadpt2_get_pens(pens); + + color_map_base = color_map ? &memory_region(REGION_PROMS)[0x0400] : memory_region(REGION_PROMS); + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + offs_t color_address = (offs >> 8 << 5) | (offs & 0x1f); + + UINT8 data = mw8080bw_ram[offs]; + UINT8 fore_color = screen_red ? 1 : color_map_base[color_address] & 0x07; + + /* blue background */ + set_8_pixels(bitmap, y, x, data, pens, fore_color, 2); + } + + clear_extra_columns(bitmap, pens, 2); + + return 0; +} + + +VIDEO_UPDATE( schaser ) +{ + pen_t pens[NUM_PENS]; + offs_t offs; + UINT8 *background_map_base; + + invadpt2_get_pens(pens); + + background_map_base = memory_region(REGION_PROMS); + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + UINT8 back_color = 0; + + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + UINT8 data = mw8080bw_ram[offs]; + UINT8 fore_color = c8080bw_colorram[offs & 0x1f1f] & 0x07; + + if (!schaser_background_disable) + { + offs_t back_address = (offs >> 8 << 5) | (offs & 0x1f); + + UINT8 back_data = background_map_base[back_address]; + + /* the equations derived from the schematics don't appear to produce + the right colors, but this one does, at least for this PROM */ + back_color = (((back_data & 0x0c) == 0x0c) && schaser_background_select) ? 4 : 2; + } + + set_8_pixels(bitmap, y, x, data, pens, fore_color, back_color); + } + + clear_extra_columns(bitmap, pens, schaser_background_disable ? 0 : 2); + + return 0; +} + + +VIDEO_UPDATE( schasrcv ) +{ + pen_t pens[NUM_PENS]; + offs_t offs; + + invadpt2_get_pens(pens); + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + UINT8 data = mw8080bw_ram[offs]; + UINT8 fore_color = c8080bw_colorram[offs & 0x1f1f] & 0x07; + + /* blue background */ + set_8_pixels(bitmap, y, x, data, pens, fore_color, 2); + } + + clear_extra_columns(bitmap, pens, 2); + + return 0; +} + + +VIDEO_UPDATE( rollingc ) +{ + pen_t pens[NUM_PENS]; + offs_t offs; + + invadpt2_get_pens(pens); + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + UINT8 data = mw8080bw_ram[offs]; + UINT8 fore_color = c8080bw_colorram[offs & 0x1f1f] & 0x07; + + set_8_pixels(bitmap, y, x, data, pens, fore_color, 0); + } + + clear_extra_columns(bitmap, pens, 0); + + return 0; +} + + +VIDEO_UPDATE( polaris ) +{ + pen_t pens[NUM_PENS]; + offs_t offs; + UINT8 *color_map_base; + UINT8 *cloud_gfx; + + invadpt2_get_pens(pens); + + color_map_base = memory_region(REGION_PROMS); + cloud_gfx = memory_region(REGION_USER1); + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + UINT8 data = mw8080bw_ram[offs]; + + offs_t color_address = (offs >> 8 << 5) | (offs & 0x1f); + + /* for the background color, bit 0 of the map PROM is connected to green gun. + red is 0 and blue is 1, giving cyan and blue for the background. This + is different from what the schematics shows, but it's supported + by screenshots. Bit 3 is connected to cloud enable, while + bits 1 and 2 are marked 'not use' (sic) */ + + UINT8 back_color = (color_map_base[color_address] & 0x01) ? 6 : 2; + UINT8 fore_color = ~c8080bw_colorram[offs & 0x1f1f] & 0x07; + + UINT8 cloud_y = y - polaris_get_cloud_pos(); + + if ((color_map_base[color_address] & 0x08) || (cloud_y >= 64)) + { + set_8_pixels(bitmap, y, x, data, pens, fore_color, back_color); + } + else + { + /* cloud appears in this part of the screen */ + int i; + + for (i = 0; i < 8; i++) + { + UINT8 color; + + if (data & 0x01) + { + color = fore_color; + } + else + { + int bit = 1 << (~x & 0x03); + offs_t cloud_gfx_offs = ((x >> 2) & 0x03) | ((~cloud_y & 0x3f) << 2); + + color = (cloud_gfx[cloud_gfx_offs] & bit) ? 7 : back_color; + } + + set_pixel(bitmap, y, x, pens, color); + + x = x + 1; + data = data >> 1; + } + } + } + + clear_extra_columns(bitmap, pens, 6); + + return 0; +} + + +VIDEO_UPDATE( lupin3 ) +{ + pen_t pens[NUM_PENS]; + offs_t offs; + + invadpt2_get_pens(pens); + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + UINT8 data = mw8080bw_ram[offs]; + UINT8 fore_color = ~c8080bw_colorram[offs & 0x1f1f] & 0x07; + + set_8_pixels(bitmap, y, x, data, pens, fore_color, 0); + } + + clear_extra_columns(bitmap, pens, 0); + + return 0; +} + + +VIDEO_UPDATE( cosmo ) +{ + pen_t pens[NUM_PENS]; + offs_t offs; + + cosmo_get_pens(pens); + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + offs_t color_address = (offs >> 8 << 5) | (offs & 0x1f); + + UINT8 data = mw8080bw_ram[offs]; + UINT8 fore_color = c8080bw_colorram[color_address] & 0x07; + + set_8_pixels(bitmap, y, x, data, pens, fore_color, 0); + } + + clear_extra_columns(bitmap, pens, 0); + + return 0; +} + + +VIDEO_UPDATE( indianbt ) +{ + pen_t pens[NUM_PENS]; + offs_t offs; + UINT8 *color_map_base; + + cosmo_get_pens(pens); + + color_map_base = color_map ? &memory_region(REGION_PROMS)[0x0400] : memory_region(REGION_PROMS); + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + offs_t color_address = (offs >> 8 << 5) | (offs & 0x1f); + + UINT8 data = mw8080bw_ram[offs]; + UINT8 fore_color = color_map_base[color_address] & 0x07; + + set_8_pixels(bitmap, y, x, data, pens, fore_color, 0); + } + + clear_extra_columns(bitmap, pens, 0); + + return 0; +} + + +VIDEO_UPDATE( shuttlei ) +{ + pen_t pens[2] = { RGB_BLACK, RGB_WHITE }; + offs_t offs; + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + int i; + + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + UINT8 data = mw8080bw_ram[offs]; + + for (i = 0; i < 8; i++) + { + pen_t pen = (data & 0x80) ? RGB_WHITE : RGB_BLACK; + *BITMAP_ADDR32(bitmap, y, x) = pen; + + x = x + 1; + data = data << 1; + } + } + + clear_extra_columns(bitmap, pens, 0); + + return 0; +} + + +VIDEO_UPDATE( sflush ) +{ + pen_t pens[NUM_PENS]; + offs_t offs; + + sflush_get_pens(pens); + + for (offs = 0; offs < mw8080bw_ram_size; offs++) + { + UINT8 y = offs >> 5; + UINT8 x = offs << 3; + + UINT8 data = mw8080bw_ram[offs]; + UINT8 fore_color = c8080bw_colorram[offs & 0x1f1f] & 0x07; + + set_8_pixels(bitmap, y, x, data, pens, fore_color, 0); + } + + clear_extra_columns(bitmap, pens, 0); + + return 0; +} |