diff options
Diffstat (limited to 'src/mame/video/vicdual.c')
-rw-r--r-- | src/mame/video/vicdual.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/mame/video/vicdual.c b/src/mame/video/vicdual.c new file mode 100644 index 00000000000..249627700b1 --- /dev/null +++ b/src/mame/video/vicdual.c @@ -0,0 +1,151 @@ +/*************************************************************************** + + VIC Dual Game board + +****************************************************************************/ + +#include "driver.h" +#include "includes/vicdual.h" + + +static UINT8 palette_bank; + + +static pen_t pens_from_color_prom[] = +{ + RGB_BLACK, + MAKE_RGB(0x00, 0xff, 0x00), + MAKE_RGB(0x00, 0x00, 0xff), + MAKE_RGB(0x00, 0xff, 0xff), + MAKE_RGB(0xff, 0x00, 0x00), + MAKE_RGB(0xff, 0xff, 0x00), + MAKE_RGB(0xff, 0x00, 0xff), + RGB_WHITE +}; + + +WRITE8_HANDLER( vicdual_palette_bank_w ) +{ + video_screen_update_partial(0, video_screen_get_vpos(0)); + + palette_bank = data & 3; +} + + +VIDEO_UPDATE( vicdual_bw ) +{ + UINT8 x = 0; + UINT8 y = cliprect->min_y; + UINT8 video_data = 0; + + while (1) + { + pen_t pen; + + if ((x & 0x07) == 0) + { + offs_t offs; + UINT8 char_code; + + /* read the character code */ + offs = (y >> 3 << 5) | (x >> 3); + char_code = vicdual_videoram_r(offs); + + /* read the appropriate line of the character ram */ + offs = (char_code << 3) | (y & 0x07); + video_data = vicdual_characterram_r(offs); + } + + /* plot the current pixel */ + pen = (video_data & 0x80) ? RGB_WHITE : RGB_BLACK; + *BITMAP_ADDR32(bitmap, y, x) = pen; + + /* next pixel */ + video_data = video_data << 1; + x = x + 1; + + /* end of line? */ + if (x == 0) + { + /* end of region to update? */ + if (y == cliprect->max_y) + { + break; + } + + /* next row */ + y = y + 1; + } + } + + return 0; +} + + +VIDEO_UPDATE( vicdual_color ) +{ + UINT8 *color_prom = (UINT8 *)memory_region(REGION_PROMS); + UINT8 x = 0; + UINT8 y = cliprect->min_y; + UINT8 video_data = 0; + pen_t back_pen = 0; + pen_t fore_pen = 0; + + while (1) + { + pen_t pen; + + if ((x & 0x07) == 0) + { + offs_t offs; + UINT8 char_code; + + /* read the character code */ + offs = (y >> 3 << 5) | (x >> 3); + char_code = vicdual_videoram_r(offs); + + /* read the appropriate line of the character ram */ + offs = (char_code << 3) | (y & 0x07); + video_data = vicdual_characterram_r(offs); + + /* get the foreground and background colors from the PROM */ + offs = (char_code >> 5) | (palette_bank << 3); + back_pen = pens_from_color_prom[(color_prom[offs] >> 1) & 0x07]; + fore_pen = pens_from_color_prom[(color_prom[offs] >> 5) & 0x07]; + } + + /* plot the current pixel */ + pen = (video_data & 0x80) ? fore_pen : back_pen; + *BITMAP_ADDR32(bitmap, y, x) = pen; + + /* next pixel */ + video_data = video_data << 1; + x = x + 1; + + /* end of line? */ + if (x == 0) + { + /* end of region to update? */ + if (y == cliprect->max_y) + { + break; + } + + /* next row */ + y = y + 1; + } + } + + return 0; +} + + +VIDEO_UPDATE( vicdual_bw_or_color ) +{ + if (vicdual_is_cabinet_color()) + video_update_vicdual_color(machine, screen, bitmap, cliprect); + else + video_update_vicdual_bw(machine, screen, bitmap, cliprect); + + return 0; +} |