summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/mz80.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/mz80.c')
-rw-r--r--src/mame/video/mz80.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/mame/video/mz80.c b/src/mame/video/mz80.c
new file mode 100644
index 00000000000..d6bfa015c9c
--- /dev/null
+++ b/src/mame/video/mz80.c
@@ -0,0 +1,143 @@
+// license:BSD-3-Clause
+// copyright-holders:Miodrag Milanovic
+/***************************************************************************
+
+ MZ80 driver by Miodrag Milanovic
+
+ 22/11/2008 Preliminary driver.
+
+****************************************************************************/
+
+#include "includes/mz80.h"
+
+const gfx_layout mz80k_charlayout =
+{
+ 8, 8, /* 8x8 characters */
+ 256, /* 256 characters */
+ 1, /* 1 bits per pixel */
+ {0}, /* no bitplanes; 1 bit per pixel */
+ {0, 1, 2, 3, 4, 5, 6, 7},
+ {0 * 8, 1 * 8, 2 * 8, 3 * 8, 4 * 8, 5 * 8, 6 * 8, 7 * 8},
+ 8*8 /* size of one char */
+};
+
+const gfx_layout mz80kj_charlayout =
+{
+ 8, 8, /* 8x8 characters */
+ 256, /* 256 characters + 256 blanks */
+ 1, /* 1 bits per pixel */
+ {0}, /* no bitplanes; 1 bit per pixel */
+ {7, 6, 5, 4, 3, 2, 1, 0},
+ {0 * 8, 1 * 8, 2 * 8, 3 * 8, 4 * 8, 5 * 8, 6 * 8, 7 * 8},
+ 8*8 /* size of one char */
+};
+
+/* Video hardware */
+void mz80_state::video_start()
+{
+ m_p_chargen = memregion("chargen")->base();
+}
+
+UINT32 mz80_state::screen_update_mz80k(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ m_mz80k_vertical ^= 1;
+ m_mz80k_cursor_cnt++;
+ UINT8 y,ra,chr,gfx;
+ UINT16 x,sy=0,ma=0;
+
+ for(y = 0; y < 25; y++ )
+ {
+ for (ra = 0; ra < 8; ra++)
+ {
+ UINT16 *p = &bitmap.pix16(sy++);
+
+ for (x = ma; x < ma + 40; x++)
+ {
+ chr = m_p_videoram[x];
+ gfx = m_p_chargen[(chr<<3) | ra];
+
+ /* Display a scanline of a character */
+ *p++ = BIT(gfx, 7);
+ *p++ = BIT(gfx, 6);
+ *p++ = BIT(gfx, 5);
+ *p++ = BIT(gfx, 4);
+ *p++ = BIT(gfx, 3);
+ *p++ = BIT(gfx, 2);
+ *p++ = BIT(gfx, 1);
+ *p++ = BIT(gfx, 0);
+ }
+ }
+ ma+=40;
+ }
+ return 0;
+}
+
+// same as above except bits are in reverse order
+UINT32 mz80_state::screen_update_mz80kj(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ m_mz80k_vertical ^= 1;
+ m_mz80k_cursor_cnt++;
+ UINT8 y,ra,chr,gfx;
+ UINT16 x,sy=0,ma=0;
+
+ for(y = 0; y < 25; y++ )
+ {
+ for (ra = 0; ra < 8; ra++)
+ {
+ UINT16 *p = &bitmap.pix16(sy++);
+
+ for (x = ma; x < ma + 40; x++)
+ {
+ chr = m_p_videoram[x];
+ gfx = m_p_chargen[(chr<<3) | ra];
+
+ /* Display a scanline of a character */
+ *p++ = BIT(gfx, 0);
+ *p++ = BIT(gfx, 1);
+ *p++ = BIT(gfx, 2);
+ *p++ = BIT(gfx, 3);
+ *p++ = BIT(gfx, 4);
+ *p++ = BIT(gfx, 5);
+ *p++ = BIT(gfx, 6);
+ *p++ = BIT(gfx, 7);
+ }
+ }
+ ma+=40;
+ }
+ return 0;
+}
+
+// has twice as much video ram and uses a scroll register
+UINT32 mz80_state::screen_update_mz80a(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ m_mz80k_vertical ^= 1;
+ m_mz80k_cursor_cnt++;
+ UINT8 y,ra,chr,gfx;
+ UINT16 x,sy=0, ma=m_p_ram[0x17d] | (m_p_ram[0x17e] << 8);
+
+ for(y = 0; y < 25; y++ )
+ {
+ for (ra = 0; ra < 8; ra++)
+ {
+ UINT16 *p = &bitmap.pix16(sy++);
+
+ for (x = ma; x < ma + 40; x++)
+ {
+ chr = m_p_videoram[x&0x7ff];
+ gfx = m_p_chargen[(chr<<3) | ra];
+
+ /* Display a scanline of a character */
+ *p++ = BIT(gfx, 7);
+ *p++ = BIT(gfx, 6);
+ *p++ = BIT(gfx, 5);
+ *p++ = BIT(gfx, 4);
+ *p++ = BIT(gfx, 3);
+ *p++ = BIT(gfx, 2);
+ *p++ = BIT(gfx, 1);
+ *p++ = BIT(gfx, 0);
+ }
+ }
+ ma+=40;
+ }
+ return 0;
+}