summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/duet16.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/duet16.cpp')
-rw-r--r--src/mame/drivers/duet16.cpp74
1 files changed, 53 insertions, 21 deletions
diff --git a/src/mame/drivers/duet16.cpp b/src/mame/drivers/duet16.cpp
index f988d6169dc..a4ec54110a1 100644
--- a/src/mame/drivers/duet16.cpp
+++ b/src/mame/drivers/duet16.cpp
@@ -31,8 +31,10 @@ public:
m_fd(*this, "fdc:%u", 0),
m_pal(*this, "palette"),
m_rtc(*this, "rtc"),
+ m_screen(*this, "screen"),
m_chrrom(*this, "char"),
- m_vram(*this, "vram")
+ m_cvram(*this, "cvram"),
+ m_gvram(*this, "gvram")
{ }
void duet16(machine_config &config);
@@ -53,6 +55,7 @@ private:
DECLARE_WRITE8_MEMBER(rtc_w);
DECLARE_READ8_MEMBER(rtc_stat_r);
DECLARE_WRITE8_MEMBER(rtc_addr_w);
+ DECLARE_READ16_MEMBER(sysstat_r);
DECLARE_WRITE_LINE_MEMBER(rtc_d0_w);
DECLARE_WRITE_LINE_MEMBER(rtc_d1_w);
DECLARE_WRITE_LINE_MEMBER(rtc_d2_w);
@@ -69,8 +72,10 @@ private:
required_device_array<floppy_connector, 2> m_fd;
required_device<palette_device> m_pal;
required_device<msm58321_device> m_rtc;
+ required_device<screen_device> m_screen;
required_memory_region m_chrrom;
- required_shared_ptr<u16> m_vram;
+ required_shared_ptr<u16> m_cvram;
+ required_shared_ptr<u16> m_gvram;
u8 m_dmapg, m_dispctrl;
u8 m_rtc_d;
bool m_rtc_busy, m_rtc_irq, m_itm_irq;
@@ -131,10 +136,15 @@ WRITE_LINE_MEMBER(duet16_state::hrq_w)
m_dmac->hack_w(state);
}
+READ16_MEMBER(duet16_state::sysstat_r)
+{
+ return 0xb484;
+}
+
ADDRESS_MAP_START(duet16_state::duet16_mem)
- AM_RANGE(0x00000, 0x9ffff) AM_RAM
- AM_RANGE(0xb8000, 0xbffff) AM_RAM
- AM_RANGE(0xc0000, 0xc0fff) AM_RAM AM_SHARE("vram")
+ AM_RANGE(0x00000, 0x8ffff) AM_RAM
+ AM_RANGE(0xa8000, 0xbffff) AM_RAM AM_SHARE("gvram")
+ AM_RANGE(0xc0000, 0xc0fff) AM_RAM AM_SHARE("cvram")
AM_RANGE(0xf8000, 0xf801f) AM_READWRITE8(dmapg_r, dmapg_w, 0x00ff)
AM_RANGE(0xf8000, 0xf801f) AM_DEVREADWRITE8("dmac", am9517a_device, read, write, 0xff00)
AM_RANGE(0xf8020, 0xf8023) AM_READWRITE8(pic_r, pic_w, 0x00ff)
@@ -149,6 +159,7 @@ ADDRESS_MAP_START(duet16_state::duet16_mem)
AM_RANGE(0xf8100, 0xf8103) AM_DEVICE8("fdc", upd765a_device, map, 0x00ff)
AM_RANGE(0xf8120, 0xf8121) AM_READWRITE8(rtc_r, rtc_w, 0x00ff)
AM_RANGE(0xf8160, 0xf819f) AM_WRITE8(pal_w, 0xffff)
+ AM_RANGE(0xf8200, 0xf8201) AM_READ(sysstat_r)
AM_RANGE(0xf8220, 0xf8221) AM_WRITE8(fdcctrl_w, 0x00ff)
AM_RANGE(0xf8260, 0xf8261) AM_WRITE8(rtc_addr_w, 0x00ff)
AM_RANGE(0xf8280, 0xf8281) AM_READ8(rtc_stat_r, 0x00ff)
@@ -173,25 +184,46 @@ WRITE8_MEMBER(duet16_state::dispctrl_w)
MC6845_UPDATE_ROW(duet16_state::crtc_update_row)
{
- const rgb_t bg = 0;
- u32 *p = &bitmap.pix32(y);
-
+ u8 *gvram = (u8 *)&m_gvram[0];
for(int i = 0; i < x_count; i++)
{
- u16 offset = (ma + i) & 0x1fff;
- u8 chr = m_vram[offset] & 0xff;
- u8 attr = m_vram[offset] >> 8;
+ u16 coffset = (ma + i) & 0x07ff;
+ u16 goffset = ((coffset * 16) + ra) & 0x7fff;
+ u8 g2 = gvram[goffset];
+ u8 g1 = gvram[goffset + 0x08000];
+ u8 g0 = gvram[goffset + 0x10000];
+ u8 chr = m_cvram[coffset] & 0xff;
+ u8 attr = m_cvram[coffset] >> 8;
u8 data = m_chrrom->base()[(chr * 16) + ra + (BIT(m_dispctrl, 3) * 0x1000)];
- rgb_t fg = m_pal->pen_color(attr & 7);
-
- *p = (data & 0x80) ? fg : bg; p++;
- *p = (data & 0x40) ? fg : bg; p++;
- *p = (data & 0x20) ? fg : bg; p++;
- *p = (data & 0x10) ? fg : bg; p++;
- *p = (data & 0x08) ? fg : bg; p++;
- *p = (data & 0x04) ? fg : bg; p++;
- *p = (data & 0x02) ? fg : bg; p++;
- *p = (data & 0x01) ? fg : bg; p++;
+ if(BIT(attr, 6))
+ {
+ if(!(i & 1))
+ data = bitswap<8>(data, 7, 7, 6, 6, 5, 5, 4, 4);
+ else
+ data = bitswap<8>(data, 3, 3, 2, 2, 1, 1, 0, 0);
+ }
+ if(BIT(attr, 3))
+ data ^= 0xff;
+ if((i == cursor_x) && (m_screen->frame_number() & 32)) // blink rate?
+ data = 0xff;
+ if(BIT(attr, 5) && (ra > 12)) // underline start?
+ data = 0xff;
+ if(BIT(attr, 4) && (m_screen->frame_number() & 32)) // blink rate?
+ data = 0;
+
+ rgb_t fg = rgb_t(pal1bit(BIT(attr, 1)), pal1bit(BIT(attr, 2)), pal1bit(BIT(attr, 0)));
+
+ for(int xi = 0; xi < 8; xi++)
+ {
+ rgb_t color;
+ if(data & (0x80 >> xi) && BIT(m_dispctrl, 1))
+ color = fg;
+ else if(BIT(m_dispctrl, 0))
+ color = m_pal->pen_color((BIT(g2, xi) << 2) | (BIT(g1, xi) << 1) | BIT(g0, xi));
+ else
+ color = 0;
+ bitmap.pix32(y, (i * 8) + xi) = color;
+ }
}
}