diff options
author | 2016-07-06 16:22:36 -0500 | |
---|---|---|
committer | 2016-07-06 16:22:36 -0500 | |
commit | 33c89ccdfb1a5dd9d32af7aa34334bb1026638c9 (patch) | |
tree | 91ddb243dd0ac950851e26021049981c59341edb /src | |
parent | b300c33d349bc512fbd48b0359e002b5ce94089b (diff) |
vt240: WIP (nw)
Diffstat (limited to 'src')
-rw-r--r-- | src/mame/drivers/vt240.cpp | 103 |
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 ) |