summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/vicdual.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/vicdual.c')
-rw-r--r--src/mame/video/vicdual.c151
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;
+}