summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2016-07-06 16:22:36 -0500
committer cracyc <cracyc@users.noreply.github.com>2016-07-06 16:22:36 -0500
commit33c89ccdfb1a5dd9d32af7aa34334bb1026638c9 (patch)
tree91ddb243dd0ac950851e26021049981c59341edb /src
parentb300c33d349bc512fbd48b0359e002b5ce94089b (diff)
vt240: WIP (nw)
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/vt240.cpp103
1 files changed, 70 insertions, 33 deletions
diff --git a/src/mame/drivers/vt240.cpp b/src/mame/drivers/vt240.cpp
index 69c3e5c4a36..cf50d554abb 100644
--- a/src/mame/drivers/vt240.cpp
+++ b/src/mame/drivers/vt240.cpp
@@ -60,6 +60,7 @@ public:
m_palette(*this, "palette"),
m_rom(*this, "maincpu"),
m_video_ram(*this, "vram"),
+ m_monitor(*this, "monitor"),
m_lk201(*this, "lk201"){ }
required_device<cpu_device> m_maincpu;
@@ -72,6 +73,7 @@ public:
required_device<palette_device> m_palette;
required_region_ptr<UINT16> m_rom;
required_shared_ptr<UINT16> m_video_ram;
+ required_ioport m_monitor;
optional_device<lk201_device> m_lk201;
DECLARE_WRITE_LINE_MEMBER(write_keyboard_clock);
@@ -144,7 +146,7 @@ WRITE_LINE_MEMBER(vt240_state::i8085_rdy_w)
READ_LINE_MEMBER(vt240_state::i8085_sid_r)
{
- return !m_t11;
+ return m_t11 ? CLEAR_LINE : ASSERT_LINE;
}
UPD7220_DISPLAY_PIXELS_MEMBER( vt240_state::hgdc_draw )
@@ -152,7 +154,7 @@ UPD7220_DISPLAY_PIXELS_MEMBER( vt240_state::hgdc_draw )
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int xi, gfx1, gfx2;
- UINT8 pen;
+ UINT8 vom;
if(!BIT(m_reg0, 7))
{
@@ -163,10 +165,11 @@ UPD7220_DISPLAY_PIXELS_MEMBER( vt240_state::hgdc_draw )
gfx1 = m_video_ram[(address & 0x7fff) >> 1];
gfx2 = m_video_ram[((address & 0x7fff) + 0x8000) >> 1];
+ bool color = m_monitor->read() ? true : false;
for(xi=0;xi<16;xi++)
{
- pen = ((gfx1 >> xi) & 1) + ((gfx2 >> xi) & 1);
- bitmap.pix32(y, x + xi) = palette[pen];
+ vom = BIT(gfx1, xi) | (BIT(gfx2, xi) << 1) | ((m_reg0 & 3) << 2);
+ bitmap.pix32(y, x + xi) = palette[color ? (vom + 16) : vom];
}
}
@@ -188,6 +191,11 @@ READ8_MEMBER(vt240_state::i8085_comm_r)
{
case 0:
return m_i8085_out;
+ case 2:
+ m_i8085->set_input_line(I8085_RST65_LINE, CLEAR_LINE);
+ m_i8085->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
+ m_t11 = 1;
+ break;
}
return 0xff;
}
@@ -202,9 +210,9 @@ WRITE8_MEMBER(vt240_state::i8085_comm_w)
m_i8085->set_input_line(I8085_RST65_LINE, ASSERT_LINE);
break;
case 2:
+ m_i8085->set_input_line(I8085_RST65_LINE, CLEAR_LINE);
m_i8085->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
m_t11 = 1;
- m_i8085->set_input_line(I8085_RST65_LINE, CLEAR_LINE);
break;
}
}
@@ -220,7 +228,7 @@ WRITE8_MEMBER(vt240_state::mem_map_cs_w)
READ8_MEMBER(vt240_state::ctrl_r)
{
- return m_mem_map_sel | (m_i8085_rdy << 6) | (m_t11 << 7);
+ return m_mem_map_sel | ((m_lb ? 0 : 1) << 3) | (m_i8085_rdy << 6) | (m_t11 << 7);
}
WRITE8_MEMBER(vt240_state::mem_map_sel_w)
@@ -267,32 +275,37 @@ WRITE8_MEMBER(vt240_state::patmult_w)
WRITE8_MEMBER(vt240_state::vpat_w)
{
- m_vpat = BITSWAP8(data, 0, 1, 2, 3, 4, 5, 6, 7);
+ m_vpat = data;
m_patcnt = m_patmult;
- m_patidx = 0;
+ m_patidx = 7;
}
READ8_MEMBER(vt240_state::vom_r)
{
- return m_vom[offset];
+ if(!BIT(m_reg0, 2))
+ return m_vom[offset];
+ return 0;
}
WRITE8_MEMBER(vt240_state::vom_w)
{
- m_vom[offset] = data;
+ if(!BIT(m_reg0, 2))
+ {
+ m_vom[offset] = data;
+ data = ~BITSWAP8(data, 0, 1, 2, 3, 4, 5, 6, 7);
+ m_palette->set_pen_color(offset, pal2bit(data >> 6), pal2bit(data >> 6), pal2bit(data >> 6));
+ m_palette->set_pen_color((offset + 16), pal2bit(data >> 0), pal2bit(data >> 2), pal2bit(data >> 4));
+ }
}
READ16_MEMBER(vt240_state::vram_r)
{
- UINT8 *video_ram = (UINT8 *)(&m_video_ram[0]);
if(space.debugger_access())
- return m_video_ram[offset & 0x7fff];
+ return m_video_ram[offset & 0x3fff];
if(!BIT(m_reg0, 3))
{
- offset <<= 1;
- offset = ((offset & 0x30000) >> 1) | (offset & 0xffff);
- offset = BIT(offset, 16) | (offset & 0xfffe);
- return video_ram[offset & 0xffff] & m_mask;
+ offset = ((offset & 0x18000) >> 1) | (offset & 0x3fff);
+ return m_video_ram[offset & 0x3fff];
}
return 0;
}
@@ -314,23 +327,21 @@ WRITE16_MEMBER(vt240_state::vram_w)
else
data &= 0xff;
}
+ offset &= 0xffff;
UINT8 chr = data;
if(BIT(m_reg1, 2))
- chr = video_ram[offset & 0xffff];
+ chr = video_ram[offset];
else if(BIT(m_reg0, 4))
{
if(BIT(m_reg0, 6))
{
- if(!BIT(m_reg0, 7))
- chr = 0;
- else
- chr = BITSWAP8(m_vpat, m_patidx, m_patidx, m_patidx, m_patidx, m_patidx, m_patidx, m_patidx, m_patidx);
+ chr = BITSWAP8(m_vpat, m_patidx, m_patidx, m_patidx, m_patidx, m_patidx, m_patidx, m_patidx, m_patidx);
if(m_patcnt-- == 0)
{
m_patcnt = m_patmult;
- if(++m_patidx > 7)
- m_patidx = 0;
+ if(m_patidx-- == 0)
+ m_patidx = 7;
}
}
else
@@ -341,21 +352,40 @@ WRITE16_MEMBER(vt240_state::vram_w)
int ps = ~m_lu & 3;
for(int i = 0; i <= (ps >> 1); i++)
{
- if(ps == 2)
+ if(ps == 0)
i++;
+ UINT8 mem = video_ram[(offset & 0x7fff) + (0x8000 * i)];
+ switch(m_lu >> 6)
+ {
+ case 0:
+ break;
+ case 1:
+ chr |= mem;
+ break;
+ case 2:
+ logerror("invalid logic unit mode 2\n");
+ break;
+ case 3:
+ chr ^= mem;
+ break;
+ }
+ UINT8 out = 0, ifore = BIT(m_lu, (i ? 5 : 4)), iback = BIT(m_lu, (i ? 3 : 2));
+ for(int j = 0; j < 8; j++)
+ out |= BIT(chr, j) ? (ifore << j) : (iback << j);
+ logerror("%x %x %x %x %x\n", chr, out, data, ifore, iback);
if(!BIT(m_reg0, 3))
- data = (chr & ~m_mask) | (video_ram[(offset & 0x7fff) + (0x8000 * i)] & m_mask);
+ out = (out & ~m_mask) | (mem & m_mask);
else
- data = (chr & data) | (video_ram[(offset & 0x7fff) + (0x8000 * i)] & ~data);
- video_ram[(offset & 0x7fff) + (0x8000 * i)] = data;
+ out = (out & data) | (mem & ~data);
+ video_ram[(offset & 0x7fff) + (0x8000 * i)] = out;
}
return;
}
if(!BIT(m_reg0, 3))
- data = (chr & ~m_mask) | (video_ram[offset & 0xffff] & m_mask);
+ data = (chr & ~m_mask) | (video_ram[offset] & m_mask);
else
- data = (chr & ~data) | (video_ram[offset & 0xffff] & data);
- video_ram[offset & 0xffff] = data;
+ data = (chr & data) | (video_ram[offset] & ~data);
+ video_ram[offset] = data;
}
WRITE8_MEMBER(vt240_state::mask_w)
@@ -475,6 +505,13 @@ static GFXDECODE_START( vt240 )
GFXDECODE_ENTRY( "charcpu", 0x338*10-3, vt240_chars_8x10, 0, 8 )
GFXDECODE_END
+static INPUT_PORTS_START( vt240 )
+ PORT_START("monitor")
+ PORT_CONFNAME(0x01, 0x01, "Monitor Type")
+ PORT_CONFSETTING(0x00, "Monochrome")
+ PORT_CONFSETTING(0x01, "Color")
+INPUT_PORTS_END
+
static MACHINE_CONFIG_START( vt240, vt240_state )
MCFG_CPU_ADD("maincpu", T11, XTAL_7_3728MHz) // confirm
MCFG_CPU_PROGRAM_MAP(vt240_mem)
@@ -498,7 +535,7 @@ static MACHINE_CONFIG_START( vt240, vt240_state )
MCFG_SCREEN_SIZE(640, 480)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
MCFG_SCREEN_UPDATE_DEVICE("upd7220", upd7220_device, screen_update)
- MCFG_PALETTE_ADD_MONOCHROME_HIGHLIGHT("palette")
+ MCFG_PALETTE_ADD("palette", 32)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", vt240)
MCFG_DEVICE_ADD("upd7220", UPD7220, XTAL_4MHz / 4)
@@ -605,7 +642,7 @@ ROM_START( vt240 )
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP( 1983, vt240, 0, 0, vt240, 0, driver_device, 0, "Digital Equipment Corporation", "VT240", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
+COMP( 1983, vt240, 0, 0, vt240, vt240, driver_device, 0, "Digital Equipment Corporation", "VT240", MACHINE_NOT_WORKING )
//COMP( 1983, vt241, 0, 0, vt220, vt220, driver_device, 0, "Digital Equipment Corporation", "VT241", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
// NOTE: the only difference between VT240 and VT241 is the latter comes with a VR241 Color monitor, while the former comes with a mono display; the ROMs and operation are identical.
-COMP( 1983, mc7105, 0, 0, mc7105, 0, driver_device, 0, "Elektronika", "MC7105", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
+COMP( 1983, mc7105, 0, 0, mc7105, vt240, driver_device, 0, "Elektronika", "MC7105", MACHINE_NOT_WORKING )