From e30ba781a424b194a43eca7885ccec1da178d4ce Mon Sep 17 00:00:00 2001 From: Robbbert Date: Thu, 2 Nov 2017 00:39:41 +1100 Subject: [PATCH] (nw) uts20 : more guesswork, added sound. --- src/mame/drivers/univac.cpp | 96 ++++++++++++++++++++++++------------- 1 file changed, 63 insertions(+), 33 deletions(-) diff --git a/src/mame/drivers/univac.cpp b/src/mame/drivers/univac.cpp index 6386475511d..1055248b75b 100644 --- a/src/mame/drivers/univac.cpp +++ b/src/mame/drivers/univac.cpp @@ -2,22 +2,33 @@ // copyright-holders:Robbbert /*************************************************************************** - Univac Terminals +Univac Terminals - The terminals are models UTS20, UTS30, UTS40, UTS50 and SVT1120, - however only the UTS20 is dumped (program roms only). +The terminals are models UTS20, UTS30, UTS40, UTS50 and SVT1120, +however only the UTS20 is dumped (program roms only). - 25/05/2009 Skeleton driver +2009-05-25 Skeleton driver - 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 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. +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 on failures in power-on test: +* Test 2 checks RAM parity. Patched out +* Test 5 tests ROM checksum. It seems one or more roms is a bad dump. +* Test 7 tests SIO ch B. The SIO should cause 9 interrupts. The CTC is + programmed as a time-out. But SIO only does first interrupt then hangs. + CTC then fires causing the failure message. It's unknown which CTC + channel drives Ch B, none seem to work. CTC trigger frequencies are + all guesswork too, but the present setup allows Tests 3 and 6 to pass. - 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. ****************************************************************************/ @@ -26,9 +37,11 @@ #include "cpu/z80/z80daisy.h" #include "machine/nvram.h" #include "machine/z80ctc.h" -#include "machine/z80dart.h" +#include "machine/z80sio.h" #include "machine/clock.h" #include "screen.h" +#include "sound/beep.h" +#include "speaker.h" class univac_state : public driver_device @@ -40,13 +53,15 @@ public: , m_p_videoram(*this, "videoram") , m_nvram(*this, "nvram") , m_ctc(*this, "ctc") - , m_dart(*this, "dart") + , m_uart(*this, "uart") , m_p_chargen(*this, "chargen") + , m_beep(*this, "beeper") { } DECLARE_READ8_MEMBER(vram_r); DECLARE_WRITE8_MEMBER(vram_w); DECLARE_WRITE8_MEMBER(port43_w); + DECLARE_WRITE8_MEMBER(porte6_w); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); private: @@ -58,12 +73,18 @@ private: required_shared_ptr m_p_videoram; required_device m_nvram; required_device m_ctc; - required_device m_dart; + required_device m_uart; required_region_ptr m_p_chargen; + required_device m_beep; }; +WRITE8_MEMBER( univac_state::porte6_w ) +{ + m_beep->set_state(BIT(data, 0)); +} + WRITE8_MEMBER( univac_state::port43_w ) { m_screen_num = BIT(data, 0); @@ -92,10 +113,11 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( uts20_io, AS_IO, 8, univac_state) ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("dart", z80dart_device, cd_ba_r, cd_ba_w) + AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("uart", z80sio_device, cd_ba_r, cd_ba_w) AM_RANGE(0x20, 0x23) AM_DEVREADWRITE("ctc", z80ctc_device, read, write) AM_RANGE(0x43, 0x43) AM_WRITE(port43_w) AM_RANGE(0x80, 0xbf) AM_RAM AM_SHARE("nvram") + AM_RANGE(0xe6, 0xe6) AM_WRITE(porte6_w) ADDRESS_MAP_END /* Input ports */ @@ -111,17 +133,11 @@ void univac_state::machine_start() void univac_state::machine_reset() { m_screen_num = 0; + m_beep->set_state(0); } uint32_t univac_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - // this is used to get the ctc to pass the test - bool state = BIT(m_framecnt,0); - m_ctc->trg0(state); - m_ctc->trg1(state); - m_ctc->trg2(state); - m_ctc->trg3(state); - uint8_t y,ra,chr,gfx; uint16_t sy=0,ma=0,x; uint8_t *videoram = m_p_videoram;//+(m_screen_num ? 0x2000 : 0); @@ -162,7 +178,7 @@ uint32_t univac_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap static const z80_daisy_config daisy_chain[] = { - { "dart" }, + { "uart" }, { "ctc" }, { nullptr } }; @@ -186,16 +202,29 @@ static MACHINE_CONFIG_START( uts20 ) MCFG_NVRAM_ADD_1FILL("nvram") - MCFG_DEVICE_ADD("uart_clock", CLOCK, 153600) - MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("dart", z80dart_device, txca_w)) - MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("dart", z80dart_device, rxca_w)) - MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("dart", z80dart_device, txcb_w)) - MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("dart", z80dart_device, rxcb_w)) + MCFG_DEVICE_ADD("ctc_clock", CLOCK, 2000000) + MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("ctc", z80ctc_device, trg0)) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("ctc", z80ctc_device, trg1)) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("ctc", z80ctc_device, trg2)) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("ctc", z80ctc_device, trg3)) + + //MCFG_DEVICE_ADD("uart_clock", CLOCK, 307200) + //MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("uart", z80sio_device, txcb_w)) + //MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("uart", z80sio_device, rxcb_w)) MCFG_DEVICE_ADD("ctc", Z80CTC, XTAL_4MHz) MCFG_Z80CTC_INTR_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) - MCFG_DEVICE_ADD("dart", Z80DART, XTAL_4MHz) - MCFG_Z80DART_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) + MCFG_Z80CTC_ZC1_CB(DEVWRITELINE("uart", z80sio_device, txca_w)) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("uart", z80sio_device, rxca_w)) + MCFG_Z80CTC_ZC2_CB(DEVWRITELINE("uart", z80sio_device, rxtxcb_w)) + + MCFG_DEVICE_ADD("uart", Z80SIO, XTAL_4MHz) + MCFG_Z80SIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) + + /* Sound */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("beeper", BEEP, 950) // guess + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.10) MACHINE_CONFIG_END @@ -207,9 +236,10 @@ ROM_START( uts20 ) 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) ) + // Patches, see notes at top. ROM_FILL(0x2bd,1,0xaf) // test 2 - ROM_FILL(0x3c1,2,0xaf) // test 5 - ROM_FILL(0x928,1,0x00) + ROM_FILL(0x48f1,1,0xa3) // test 5, patch unused byte to fix checksum + ROM_FILL(0x928,1,0x00) // upon failure keep going /* character generator not dumped, using the one from 'c10' for now */ ROM_REGION( 0x2000, "chargen", 0 ) @@ -219,4 +249,4 @@ ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1980, uts20, 0, 0, uts20, uts20, univac_state, 0, "Sperry Univac", "UTS-20", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +COMP( 1980, uts20, 0, 0, uts20, uts20, univac_state, 0, "Sperry Univac", "UTS-20", MACHINE_NOT_WORKING )