diff options
Diffstat (limited to 'src/mame/drivers/univac.cpp')
-rw-r--r-- | src/mame/drivers/univac.cpp | 687 |
1 files changed, 0 insertions, 687 deletions
diff --git a/src/mame/drivers/univac.cpp b/src/mame/drivers/univac.cpp deleted file mode 100644 index 63c90b8ef46..00000000000 --- a/src/mame/drivers/univac.cpp +++ /dev/null @@ -1,687 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Robbbert,Vas Crabb -/*************************************************************************** - -Univac Terminals - -2009-05-25 Skeleton driver - -The terminals are models UTS10, UTS20, UTS30, UTS40, UTS50 and SVT1120. - -There were other terminals (Uniscope 100/200/300/400) and UTS60, but -they had different hardware. Uniscope models are believed to use the i8080, -and the UTS60 was a colour graphics terminal with a MC68000 and 2 floppy drives. - -The terminal has 2 screens selectable by the operator with the Fn + 1-2 -buttons. Thus the user can have two sessions open at once, to different -mainframes or applications. The keyboard connected to the terminal with -a coiled cord and a 9-pin D-connector. - -Sound is a beeper. - -This driver is all guesswork; Unisys never released technical info -to customers. All parts on the PCBs have internal Unisys part numbers -instead of the manufacturer's numbers. - -Notes: -* Port $C6 probably controls serial loopback - - at a guess, bit 0 enables loopback on both channels -* The NVRAM is 4 bits wide on the LSBs, but (0x81) & 0x10 does something - - NVRAM nybbles are read/written on the LSBs of 64 ports 0x80 to 0xb4 - - Nybbles are packed/unpacked into 32 bytes starting at 0xd7d7 - - On boot it reads (0x81) & 0x10, and if set preserves 0xd831 to 0xd863 - - This has to be some kind of warm boot detection, but how does it work? - -You can use a debug trick to get UTS10 to boot: -- When it loops at @0B33, pc = B35 and g - -How to create a FCC (field control code): -- Move the cursor to where you want the FCC to be -- Press FCC GEN -- Now you enter a sequence of 4 bytes -- 1. Video Attribute -- - Spacebar or N: Normal -- - L: Low intensity -- - O: Off -- - B: Blink (low-half) -- - 1: Rev-video/Normal -- - 2: Rev-video/half-intensity -- - 3: Rev-video/blink: normal-half -- - 4: Rev-video/blink: low -- 2. Tab-stop -- - Spacebar or S: No tab-stop -- - T: Tab-stop -- - 6: Tab-stop protected -- - 7: No tab protected -- 3. Data-entry control -- - Spacebar or U: Unprotected -- - P: Protected -- - A: Alpha only -- - N: Numeric only -- 4. Justified -- - Spacebar: Normal -- - R: Right-justified -- Press Spacebar to enable the new FCC and exit back to normal. - -Control-page parameters. These vary depending on the terminal and feature set. Press FCTN and CTRL PAGE keys together. -You get a protected area covering the first 2 lines where you can configure the terminal. Settings are saved in the NVRAM. -Depending on the setting, it may take effect immediately (after exiting the control page), or after a reboot. -Entries may be in upper or lower case. -UC/NO : Upper and lower case can be entered -UC/YS : Lower case is automatically folded to upper case. -AB/LI : Alternate brightness is Low Intensity -AB/RV : Alternate brightness is Reverse Video -AB/NI : Alternate brightness is Normal Intensity -IL/RV : Indicator Line is Reverse Video -IL/NI : Indicator Line is Normal Intensity -KK/ON : Keyclick on -KK/OF : Keyclick off -SP/NS : Non-destructive spacebar (works like right-arrow) -SP/DS : Destructive spacebar -VO/01 : Video off after 1 minute (a blank screen saver) -VO/04 : Video off after 4 minutes -VO/16 : Video off after 16 minutes -VO/64 : Video off after 64 minutes -CC/ON : Control characters show -CC/OF : Control characters off (look like a space) -CS/LO : Cursor repeat slow -CS/HI : Cursor repeat fast -RI/xx : Set the RID (generally 21-2F) -SI/xx : Set the SID (generally 51-7F) -After entering the characters, press FCTN and CTRL PAGE keys again to save the setting. - - -****************************************************************************/ - -#include "emu.h" -#include "bus/rs232/rs232.h" -#include "bus/uts_kbd/uts_kbd.h" -#include "cpu/z80/z80.h" -#include "machine/74259.h" -#include "machine/z80daisy.h" -#include "machine/clock.h" -#include "machine/nvram.h" -#include "machine/z80ctc.h" -#include "machine/z80sio.h" -#include "sound/spkrdev.h" -#include "video/dp8350.h" -#include "emupal.h" -#include "screen.h" -#include "speaker.h" - -#define LOG_GENERAL (1U << 0) -#define LOG_PARITY (1U << 1) -#define LOG_NVRAM (1U << 2) - -//#define VERBOSE (LOG_GENERAL | LOG_PARITY | LOG_NVRAM) -#include "logmacro.h" - -#define LOGPARITY(...) LOGMASKED(LOG_PARITY, __VA_ARGS__) -#define LOGNVRAM(...) LOGMASKED(LOG_NVRAM, __VA_ARGS__) - - -namespace { - -class univac_state : public driver_device -{ -public: - univac_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_nvram(*this, "nvram") - , m_ctc(*this, "ctc") - , m_keybclk(*this, "keybclk") - , m_sio(*this, "sio") - , m_alarm(*this, "alarm") - , m_screen(*this, "screen") - , m_palette(*this, "palette") - , m_keyboard(*this, "keyboard") - , m_printer(*this, "printer") - , m_p_chargen(*this, "chargen") - , m_p_videoram(*this, "videoram") - , m_p_nvram(*this, "nvram") - , m_bank_mask(0) - , m_parity_poison(false) - , m_display_enable(false) - , m_framecnt(0) - , m_nvram_protect(false) - , m_alarm_enable(false) - , m_alarm_toggle(false) - , m_loopback_control(false) - , m_comm_rxd(true) - , m_sio_txda(true) - , m_aux_rxd(true) - , m_sio_txdb(true) - , m_sio_rtsb(true) - , m_aux_dsr(true) - , m_sio_wrdyb(true) - { } - - void uts10(machine_config &config); - void uts20(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - u8 ram_r(offs_t offset); - u8 bank_r(offs_t offset); - void ram_w(offs_t offset, u8 data); - void bank_w(offs_t offset, u8 data); - void nvram_w(offs_t offset, u8 data); - - DECLARE_WRITE_LINE_MEMBER(nvram_protect_w); - DECLARE_WRITE_LINE_MEMBER(select_disp_w); - DECLARE_WRITE_LINE_MEMBER(ram_control_w); - DECLARE_WRITE_LINE_MEMBER(parity_poison_w); - DECLARE_WRITE_LINE_MEMBER(display_enable_w); - DECLARE_WRITE_LINE_MEMBER(alarm_enable_w); - DECLARE_WRITE_LINE_MEMBER(sio_loopback_w); - DECLARE_WRITE_LINE_MEMBER(sio_txda_w); - DECLARE_WRITE_LINE_MEMBER(sio_txdb_w); - DECLARE_WRITE_LINE_MEMBER(aux_rxd_w); - DECLARE_WRITE_LINE_MEMBER(sio_rtsb_w); - DECLARE_WRITE_LINE_MEMBER(sio_wrdyb_w); - DECLARE_WRITE_LINE_MEMBER(aux_dsr_w); - DECLARE_WRITE_LINE_MEMBER(loopback_rxcb_w); - DECLARE_WRITE_LINE_MEMBER(porte6_w); - - u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - - void io_map(address_map &map); - void mem_map(address_map &map); - void uts10_io_map(address_map &map); - void uts10_map(address_map &map); - - required_device<z80_device> m_maincpu; - required_device<nvram_device> m_nvram; - required_device<z80ctc_device> m_ctc; - optional_device<clock_device> m_keybclk; - required_device<z80sio_device> m_sio; - required_device<speaker_sound_device> m_alarm; - required_device<screen_device> m_screen; - required_device<palette_device> m_palette; - - required_device<uts_keyboard_port_device> m_keyboard; - required_device<rs232_port_device> m_printer; - - required_region_ptr<u8> m_p_chargen; - required_shared_ptr<u8> m_p_videoram; - required_shared_ptr<u8> m_p_nvram; - std::unique_ptr<u8 []> m_p_parity; - - u16 m_disp_mask; - u16 m_bank_mask; - bool m_parity_poison; - bool m_display_enable; - u8 m_framecnt; - bool m_nvram_protect; - - bool m_alarm_enable; - bool m_alarm_toggle; - - bool m_loopback_control; - bool m_comm_rxd; - bool m_sio_txda; - bool m_aux_rxd; - bool m_sio_txdb; - bool m_sio_rtsb; - bool m_aux_dsr; - bool m_sio_wrdyb; -}; - - - -u8 univac_state::ram_r(offs_t offset) -{ - if (BIT(m_p_parity[offset >> 3], offset & 0x07) && !machine().side_effects_disabled()) - { - LOGPARITY("parity check failed offset = %04X\n", offset); - m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); - } - return m_p_videoram[offset]; -} - -u8 univac_state::bank_r(offs_t offset) -{ - return ram_r(offset ^ m_bank_mask); -} - -void univac_state::ram_w(offs_t offset, u8 data) -{ - if (m_parity_poison) - { - LOGPARITY("poison parity offset = %04X\n", offset); - m_p_parity[offset >> 3] |= u8(1) << (offset & 0x07); - } - else - { - m_p_parity[offset >> 3] &= ~(u8(1) << (offset & 0x07)); - } - m_p_videoram[offset] = data; -} - -void univac_state::bank_w(offs_t offset, u8 data) -{ - ram_w(offset ^ m_bank_mask, data); -} - -void univac_state::nvram_w(offs_t offset, u8 data) -{ - // NVRAM is four bits wide, accessed in the low nybble - // It's simplest to hack it when writing to make the upper bits read back high on the open bus - // (But is it all open bus? Bit 4 is specifically tested in a few places...) - if (m_nvram_protect) - LOGNVRAM("%s: NVRAM write suppressed (address %02X, data %02X)\n", machine().describe_context(), offset + 0x80, data); - else - m_p_nvram[offset] = data | 0xf0; -} - -WRITE_LINE_MEMBER(univac_state::nvram_protect_w) -{ - // There seems to be some timing-based write protection related to the CTC's TRG0 input. - // The present implementation is a crude approximation of a wild guess. - if (state) - { - m_nvram_protect = m_screen->vpos() < 10; - - if (m_alarm_enable) - { - m_alarm_toggle = !m_alarm_toggle; - m_alarm->level_w(m_alarm_toggle); - } - } -} - -WRITE_LINE_MEMBER(univac_state::select_disp_w) -{ - m_disp_mask = state ? 0x2000 : 0x0000; -} - -WRITE_LINE_MEMBER(univac_state::ram_control_w) -{ - m_bank_mask = state ? 0x2000 : 0x0000; -} - -WRITE_LINE_MEMBER(univac_state::parity_poison_w) -{ - m_parity_poison = state; -} - -WRITE_LINE_MEMBER(univac_state::display_enable_w) -{ - m_display_enable = state; -} - -WRITE_LINE_MEMBER(univac_state::alarm_enable_w) -{ - m_alarm_enable = state; - if (!state) - { - m_alarm_toggle = false; - m_alarm->level_w(0); - } -} - -WRITE_LINE_MEMBER(univac_state::sio_loopback_w) -{ - if (state) - { - m_sio->rxa_w(m_sio_txda); - m_sio->rxb_w(m_sio_txdb); - m_sio->dcdb_w(m_sio_wrdyb); - m_sio->ctsb_w(m_sio_wrdyb); - m_sio->syncb_w(!m_sio_rtsb); - m_printer->write_txd(1); - m_printer->write_rts(1); - m_keyboard->ready_w(0); - if (m_keybclk.found()) - m_keybclk->set_clock_scale(0.0); - } - else - { - m_sio->rxa_w(m_comm_rxd); - m_sio->rxb_w(m_aux_rxd); - m_sio->dcdb_w(m_aux_dsr); - m_sio->ctsb_w(m_aux_dsr); // likely ignored - m_sio->syncb_w(1); - m_printer->write_txd(m_sio_txdb); - m_printer->write_rts(m_sio_rtsb); - m_keyboard->ready_w(m_sio_wrdyb); - if (m_keybclk.found()) - m_keybclk->set_clock_scale(1.0); - } - - m_loopback_control = state; -} - -WRITE_LINE_MEMBER(univac_state::sio_txda_w) -{ - m_sio_txda = state; - if (m_loopback_control) - m_sio->rxa_w(state); -} - -WRITE_LINE_MEMBER(univac_state::sio_txdb_w) -{ - m_sio_txdb = state; - if (m_loopback_control) - m_sio->rxb_w(state); - else - m_printer->write_txd(state); -} - -WRITE_LINE_MEMBER(univac_state::aux_rxd_w) -{ - m_aux_rxd = state; - if (!m_loopback_control) - m_sio->rxb_w(state); -} - -WRITE_LINE_MEMBER(univac_state::sio_rtsb_w) -{ - m_sio_rtsb = state; - if (m_loopback_control) - m_sio->syncb_w(!state); - else - m_printer->write_rts(state); -} - -WRITE_LINE_MEMBER(univac_state::sio_wrdyb_w) -{ - m_sio_wrdyb = state; - if (m_loopback_control) - { - m_sio->dcdb_w(state); - m_sio->ctsb_w(state); - } - else - m_keyboard->ready_w(state); -} - -WRITE_LINE_MEMBER(univac_state::aux_dsr_w) -{ - m_aux_dsr = state; - if (!m_loopback_control) - { - m_sio->dcdb_w(state); - m_sio->ctsb_w(state); - } -} - -WRITE_LINE_MEMBER(univac_state::loopback_rxcb_w) -{ - if (m_loopback_control) - m_sio->rxcb_w(state); -} - -WRITE_LINE_MEMBER(univac_state::porte6_w) -{ - //m_beep->set_state(state); // not sure what belongs here, but it isn't the beeper -} - - -void univac_state::mem_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x4fff).rom().region("roms", 0); - map(0x8000, 0xbfff).rw(FUNC(univac_state::bank_r), FUNC(univac_state::bank_w)); - map(0xc000, 0xffff).rw(FUNC(univac_state::ram_r), FUNC(univac_state::ram_w)).share("videoram"); -} - -void univac_state::uts10_map(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x4fff).rom().region("roms", 0); - map(0x8000, 0x9fff).mirror(0x2000).rw(FUNC(univac_state::bank_r), FUNC(univac_state::bank_w)); - map(0xc000, 0xffff).rw(FUNC(univac_state::ram_r), FUNC(univac_state::ram_w)).share("videoram"); -} - -void univac_state::uts10_io_map(address_map &map) -{ - map.global_mask(0xff); - map.unmap_value_high(); - map(0x00, 0x03).rw(m_sio, FUNC(z80sio_device::cd_ba_r), FUNC(z80sio_device::cd_ba_w)); - map(0x20, 0x23).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); - map(0x60, 0x60).nopw(); // values written here may or may not matter - map(0x80, 0xbf).ram().w(FUNC(univac_state::nvram_w)).share("nvram"); - map(0xc0, 0xc7).w("latch_c0", FUNC(ls259_device::write_d0)); - map(0xe0, 0xe7).w("latch_e0", FUNC(ls259_device::write_d0)); -} - -void univac_state::io_map(address_map &map) -{ - uts10_io_map(map); - map(0x40, 0x40).nopr(); // read only once, during self-test; result is discarded - map(0x40, 0x47).w("latch_40", FUNC(ls259_device::write_d0)); -} - -/* Input ports */ -static INPUT_PORTS_START( uts20 ) -INPUT_PORTS_END - - -void univac_state::machine_start() -{ - // D7DC and D7DD are checked for valid RID and SID (usually 21 and 51) if not valid then NVRAM gets initialised. - - std::size_t const parity_bytes = (m_p_videoram.bytes() + 7) / 8; - m_p_parity.reset(new u8[parity_bytes]); - std::fill_n(m_p_parity.get(), parity_bytes, 0); - - save_pointer(NAME(m_p_parity), parity_bytes); - save_item(NAME(m_bank_mask)); - save_item(NAME(m_parity_poison)); - save_item(NAME(m_display_enable)); - save_item(NAME(m_framecnt)); - save_item(NAME(m_nvram_protect)); - save_item(NAME(m_alarm_enable)); - save_item(NAME(m_alarm_toggle)); - save_item(NAME(m_loopback_control)); - save_item(NAME(m_comm_rxd)); - save_item(NAME(m_sio_txda)); - save_item(NAME(m_aux_rxd)); - save_item(NAME(m_sio_txdb)); - save_item(NAME(m_sio_rtsb)); - save_item(NAME(m_aux_dsr)); - save_item(NAME(m_sio_wrdyb)); - save_item(NAME(m_disp_mask)); - - m_disp_mask = 0; -} - -uint32_t univac_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - if (!m_display_enable) - { - bitmap.fill(0, cliprect); - return 0; - } - - const pen_t *pen = m_palette->pens(); - - uint16_t sy=0,ma=0; - - m_framecnt++; - - for (u8 y = 0; y < 25; y++) - { - for (u8 ra = 0; ra < 14; ra++) - { - uint32_t *p = &bitmap.pix(sy++); - - for (uint16_t x = ma; x < ma + 80; x++) - { - u8 chr = ram_r(x ^ m_disp_mask); // bit 7 = rv attribute (or dim, depending on control-page setting) - - uint16_t gfx = m_p_chargen[((chr & 0x7f)<<4) | ra]; - - // chars 1C, 1D, 1F need special handling - if ((chr >= 0x1c) && (chr <= 0x1f) && BIT(gfx, 7)) - { - gfx &= 0x7f; - if (m_framecnt & 16) // They also blink - gfx = 0; - } - - // reverse-video attribute - if (BIT(chr, 7)) - gfx = ~gfx; - - /* Display a scanline of a character */ - for (int bit = 8; bit >= 0; bit--) - { - *p++ = pen[BIT(gfx, bit)]; - } - } - } - ma += 80; - } - return 0; -} - -/* F4 Character Displayer */ -static const gfx_layout charlayout = -{ - 8, 14, /* 8 x 14 characters */ - 128, /* 128 characters */ - 1, /* 1 bits per pixel */ - { 0 }, /* no bitplanes */ - /* x offsets */ - { 0, 1, 2, 3, 4, 5, 6, 7 }, - /* y offsets */ - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8 }, - 8*16 /* every char takes 16 bytes */ -}; - -static GFXDECODE_START( gfx_uts ) - GFXDECODE_ENTRY( "chargen", 0x0000, charlayout, 0, 1 ) -GFXDECODE_END - -static const z80_daisy_config daisy_chain[] = -{ - { "sio" }, - { "ctc" }, - { nullptr } -}; - -// All frequencies confirmed -void univac_state::uts20(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 18.432_MHz_XTAL / 6); // 3.072 MHz - m_maincpu->set_addrmap(AS_PROGRAM, &univac_state::mem_map); - m_maincpu->set_addrmap(AS_IO, &univac_state::io_map); - m_maincpu->set_daisy_config(daisy_chain); - - ls259_device &latch_40(LS259(config, "latch_40")); // actual type and location unknown - latch_40.q_out_cb<1>().set(FUNC(univac_state::select_disp_w)); - latch_40.q_out_cb<3>().set(FUNC(univac_state::ram_control_w)); - - ls259_device &latch_c0(LS259(config, "latch_c0")); // actual type and location unknown - latch_c0.q_out_cb<0>().set(FUNC(univac_state::alarm_enable_w)); - latch_c0.q_out_cb<3>().set(FUNC(univac_state::display_enable_w)); - latch_c0.q_out_cb<4>().set(FUNC(univac_state::parity_poison_w)); - latch_c0.q_out_cb<6>().set(FUNC(univac_state::sio_loopback_w)); - - ls259_device &latch_e0(LS259(config, "latch_e0")); // actual type and location unknown - //latch_e0.q_out_cb<2>().set(FUNC(univac_state::reverse_video_w)); - latch_e0.q_out_cb<5>().set("crtc", FUNC(dp835x_device::refresh_control)).invert(); - latch_e0.q_out_cb<6>().set(FUNC(univac_state::porte6_w)); - - /* video hardware */ - SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green()); - m_screen->set_screen_update(FUNC(univac_state::screen_update)); - PALETTE(config, m_palette, palette_device::MONOCHROME); - GFXDECODE(config, "gfxdecode", m_palette, gfx_uts); - - dp835x_device &crtc(DP835X_A(config, "crtc", 19'980'000)); - crtc.set_screen("screen"); - crtc.vblank_callback().set(m_ctc, FUNC(z80ctc_device::trg0)); - crtc.vblank_callback().append(m_ctc, FUNC(z80ctc_device::trg3)); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); - - Z80CTC(config, m_ctc, 18.432_MHz_XTAL / 6); - m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); - m_ctc->set_clk<1>(18.432_MHz_XTAL / 12); - m_ctc->set_clk<2>(18.432_MHz_XTAL / 12); - m_ctc->zc_callback<0>().set(FUNC(univac_state::nvram_protect_w)); - m_ctc->zc_callback<1>().set(m_sio, FUNC(z80sio_device::txca_w)); - m_ctc->zc_callback<1>().append(m_sio, FUNC(z80sio_device::rxca_w)); - m_ctc->zc_callback<2>().set(m_sio, FUNC(z80sio_device::txcb_w)); - m_ctc->zc_callback<2>().append(FUNC(univac_state::loopback_rxcb_w)); - - CLOCK(config, m_keybclk, 18.432_MHz_XTAL / 60); - m_keybclk->signal_handler().set(m_sio, FUNC(z80sio_device::rxcb_w)); - - Z80SIO(config, m_sio, 18.432_MHz_XTAL / 6); - m_sio->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); - m_sio->out_txda_callback().set(FUNC(univac_state::sio_txda_w)); - m_sio->out_txdb_callback().set(FUNC(univac_state::sio_txdb_w)); - m_sio->out_rtsb_callback().set(FUNC(univac_state::sio_rtsb_w)); - m_sio->out_wrdyb_callback().set(FUNC(univac_state::sio_wrdyb_w)); - - /* Sound */ - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_alarm).add_route(ALL_OUTPUTS, "mono", 0.05); - - UTS_KEYBOARD(config, m_keyboard, uts20_keyboards, "extw"); - m_keyboard->rxd_callback().set(FUNC(univac_state::aux_rxd_w)); - - RS232_PORT(config, m_printer, default_rs232_devices, nullptr); - m_printer->dcd_handler().set(FUNC(univac_state::aux_dsr_w)); -} - -void univac_state::uts10(machine_config &config) -{ - uts20(config); - m_maincpu->set_addrmap(AS_PROGRAM, &univac_state::uts10_map); - m_maincpu->set_addrmap(AS_IO, &univac_state::uts10_io_map); - - config.device_remove("keybclk"); - m_ctc->zc_callback<2>().set(m_sio, FUNC(z80sio_device::rxtxcb_w)); - - config.device_remove("latch_40"); - subdevice<ls259_device>("latch_c0")->q_out_cb<6>().set_nop(); - subdevice<ls259_device>("latch_e0")->q_out_cb<7>().set(FUNC(univac_state::sio_loopback_w)).invert(); - - UTS_KEYBOARD(config.replace(), m_keyboard, uts10_keyboards, "extw"); - m_keyboard->rxd_callback().set(FUNC(univac_state::aux_rxd_w)); -} - - -/* ROM definition */ -ROM_START( uts10 ) - ROM_REGION( 0x5000, "roms", ROMREGION_ERASEFF ) - ROM_LOAD( "f3577_1.bin", 0x0000, 0x0800, CRC(f7d47484) SHA1(84c01d054df19e8da44c242a67d97f643bdabc4c) ) - ROM_LOAD( "f3577_2.bin", 0x0800, 0x0800, CRC(7c1045f0) SHA1(732e8c111a346476c59bcfda73f0f826cdcd7eb3) ) - ROM_LOAD( "f3577_3.bin", 0x1000, 0x0800, CRC(10f47af2) SHA1(a61b693af264bfa6565c43b4fe473833f8aba046) ) - ROM_LOAD( "f3577_4.bin", 0x1800, 0x0800, CRC(bed8924c) SHA1(1fe3e118cc1c17f4c8b9c0025257822b99fcde38) ) - ROM_LOAD( "f3577_5.bin", 0x2000, 0x0800, CRC(38d671b5) SHA1(3fb3feaaddb08af5ba50a9c08511cbb3949a7985) ) - ROM_LOAD( "f3577_6.bin", 0x2800, 0x0800, CRC(6dbe9c4a) SHA1(11bc4b7c99811bd26423a15b33d02a86fa0bfd17) ) - - ROM_REGION( 0x0800, "chargen", 0 ) // possibly some bitrot, see h,m,n in F4 displayer - ROM_LOAD( "chr_5565.bin", 0x0000, 0x0800, CRC(7d99744f) SHA1(2db330ca94a91f7b2ac2ac088ae9255f5bb0a7b4) ) -ROM_END - -ROM_START( uts20 ) - ROM_REGION( 0x5000, "roms", ROMREGION_ERASEFF ) - ROM_LOAD( "uts20a.rom", 0x0000, 0x1000, CRC(1a7b4b4e) SHA1(c3732e25b4b7c7a80172e3fe55c77b923cf511eb) ) - ROM_LOAD( "uts20b.rom", 0x1000, 0x1000, CRC(7f8de87b) SHA1(a85f404ad9d560df831cc3e651a4b45e4ed30130) ) - ROM_LOAD( "uts20c.rom", 0x2000, 0x1000, CRC(4e334705) SHA1(ff1a730551b42f29d20af8ecc4495fd30567d35b) ) - ROM_LOAD( "uts20d.rom", 0x3000, 0x1000, CRC(76757cf7) SHA1(b0509d9a35366b21955f83ec3685163844c4dbf1) ) - ROM_LOAD( "uts20e.rom", 0x4000, 0x1000, CRC(0dfc8062) SHA1(cd681020bfb4829d4cebaf1b5bf618e67b55bda3) ) - - // character generator not dumped, using the one from 'UTS10' for now - ROM_REGION( 0x0800, "chargen", 0 ) - ROM_LOAD( "chr_5565.bin", 0x0000, 0x0800, BAD_DUMP CRC(7d99744f) SHA1(2db330ca94a91f7b2ac2ac088ae9255f5bb0a7b4) ) -ROM_END - -} // Anonymous namespace - -/* Driver */ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1981, uts10, uts20, 0, uts10, uts20, univac_state, empty_init, "Sperry Univac", "UTS-10", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) -COMP( 1980, uts20, 0, 0, uts20, uts20, univac_state, empty_init, "Sperry Univac", "UTS-20", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) |