From bdaad5598e3d3187cb2b379ea4280069506d8fb7 Mon Sep 17 00:00:00 2001 From: joakim Date: Mon, 2 Apr 2018 21:44:32 +0200 Subject: [PATCH] NEW non working ISA16 card: Ericsson Information Systems IBM3270/5250 terminal adapter card --- scripts/src/bus.lua | 2 + src/devices/bus/isa/eis_sad8852.cpp | 240 ++++++++++++++++++++++++++++ src/devices/bus/isa/eis_sad8852.h | 47 ++++++ src/devices/bus/isa/isa_cards.cpp | 2 + 4 files changed, 291 insertions(+) create mode 100644 src/devices/bus/isa/eis_sad8852.cpp create mode 100644 src/devices/bus/isa/eis_sad8852.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 95761c42aef..5b91701440d 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1128,6 +1128,8 @@ if (BUSES["ISA"]~=null) then MAME_DIR .. "src/devices/bus/isa/myb3k_com.h", MAME_DIR .. "src/devices/bus/isa/myb3k_fdc.cpp", MAME_DIR .. "src/devices/bus/isa/myb3k_fdc.h", + MAME_DIR .. "src/devices/bus/isa/eis_sad8852.cpp", + MAME_DIR .. "src/devices/bus/isa/eis_sad8852.h", } end diff --git a/src/devices/bus/isa/eis_sad8852.cpp b/src/devices/bus/isa/eis_sad8852.cpp new file mode 100644 index 00000000000..1c6a6bb4162 --- /dev/null +++ b/src/devices/bus/isa/eis_sad8852.cpp @@ -0,0 +1,240 @@ +// license:BSD-3-Clause +// copyright-holders:Joakim Larsson Edström +/*********************************************************************************************************** + * + * Ericsson Information Systems/Nokia Data/ICL, SAD 8852 IBM 3270/5250 terminal emulation adapter + * + * This board is a terminal adapter for AT class PC machines to be connected as a terminal to + * IBM mainframes. There are two on board connectors, a BNC connector to act as a 3270 terminal + * and a twinax connector for the older 5250 terminal. + * + * The original design was probably done by the Alfaskop division at Ericsson Information Systems (EIS) + * The Alfaskop division was aquired by Ericsson from Datasaab AB in 1980 who was very successful selling + * IBM compatible terminals at strict 10% below IBM list price, whatever that was, usually quite high. + * The Ericsson PC AT WS286, their first 16 bit PC, was introduced 1986 and as the SAD8852 card is a 16 bit + * ISA card it is likelly to have been designed for the launch as Ericsson targeted the office market only. + * EIS was aquired by the Nokia Data division in 1988 which in turn was aquired by ICL 1991 and the terminal + * division by Wyse 1996. Firmware confirms 1987 as copyrigt date which fits the WS286 time line well. + * + * TODO: + * - Hook up 8274 and the rest of the local memory map + * - Hook up ISA IRQ:s + * - Find suitable software package to analyze control protocol between main cpu and the board cpu + * - Add bitbanger device and hook it up to an (emulated?!) IBM mainframe + * + ************************************************************************************************************/ +/* + Links: + ------ + https://www.ibm.com/support/knowledgecenter/en/SSEQ5Y_5.9.0/com.ibm.pcomm.doc/books/html/admin_guide11.htm + http://www.ebay.fr/itm/iCL-94V0-SAD-8852-ROA-1195296-R4B-Card-Expansion-Card/222825926815?hash=item33e175d09f:g:zAUAAOSwe7laPCr8 + https://www.sweclockers.com/forum/trad/1392179-intel-80188-16-bit-isa-expansionskort-vad-ar-detta (in swedish) + http://www.veteranklubbenalfa.se/veteran/litt/jub97v3_4.pdf (PDF about the computer industry of Sweden, in swedish) + + PCB layouts and assembly years from online pictures and physical unit. + Ericsson - marked TVK 119 5211 R3, rev date xxxx, assembled in 1987 indicated by chip dates + Nokia Data - marked TVK 119 5211 R3, rev date 9127, assembled in 1991 indicated by chip dates + ICL - marked TVK 119 5211 R3, rev date 9343, assembled in 1993 indicated by chip dates + +--------------------------------------------------------------------------------------+ ___ + | IC18 IC24 +----------+ || + | IC1 IC9 |IC31 EPROM| +--------------+ IC44 || + | IC19 IC25 |27128 | | IC35 i8274 | IC51 || + | IC2 IC10 +----------+ | MPSC serial | IC45 || + | +--------------+ +--------+ || + | IC3 IC11 IC17 IC32 SW1 1-10 IC57 || + | +----------+ IC23 IC40 IC46 +--------+ || + | IC4 IC12 IC36 | | IC52 IC58 IC63 o-| + | IC20 | IC33 | IC37 IC41 IC47 || + | IC5 IC13 IC26 | i80188 | IC53 XTAL IC59 || + | IC21 | CPU | IC38 IC42 IC48 19.17MHz || + | IC6 IC14 IC27 | | IC54 IC62 || + | +----------+ J3 J2 ||--- + | IC7 IC15 XTAL IC39 IC43 IC49 I IC55 IC60 || |= Twinax (5250) + | IC28 12Mhz R J1 ||--- + | IC8 IC16 IC50 Q IC56 IC61 o-| + | IC22 IC29 IC30 IC34 +--------------------------------------------+|--- + +-----------------------------------------+ ||||||||| ||||||||||||||||||||||||| | |- BNC (3270) + |--- + | + IC's + ------------------------------------------------------------------------------ + IC1- IC40- + IC16 41256-12 256Kbits DRAM => 512KB IC42 74ALS273 + IC17 PAL20L8ACNS '1020045 R2A' IC43 74F138 + IC18 74F109 IC44 ROP101506 kS09240CB012Y- custom Philips chip? + IC19- IC45 74ALS540 + IC20 74F00 IC46- + IC21- IC47 74ALS684 + IC22 74ALS153 IC48 74ALS521 + IC23 74LS139 IC49 74F257 + IC24 74F74 IC50 74ALS541 + IC25 74LS258 IC51 LM339 - quad voltage comparator + IC26 74F32 IC52 74ALS74 + IC27- IC53 XTAL 19.170MHz SCC oscillator + IC28 74ALS153 IC54 74ALS38 + IC29 74F175 IC55 74F138 + IC30 74F08 IC56 74ALS541 + IC31 EPROM 'RON 1020044/R2A D500 IC31' IC57 SN75452BP - dual very-fast NAND + IC32 74ALS573 IC58 74F109 + IC33 i80188 CPU IC59 74F10 + IC34 74F00 IC60 74ALS573 + IC35 i8274 MPSC serial controller IC61 74ALS541 + IC36 74ALS573 IC62 74F32 + IC37 74F10 IC63 74F175 + IC38 74ALS245 + IC39 74F00 + + General description + ------------------- + The PCB has a 10 bit DIP switch and three jumper fields + + SW1 has 10 positions labeled '1' to '10', left to right, default bit value is off (down) and only bit '10' is on (up) + J1 has 2 positions labeled 'AT' and 'PC' top to bottom, 'AT' is default + J2 has 2 positions labeled 'AT' and 'PC' top to bottom, 'AT' is default + J3 has 7 positions labeled 'IRQ2', IRQ3', 'IRQ4', 'IRQ10', 'IRQ11, 'IRQ12' and 'IRQ15' top to bottom, 'IRQ11' is default + + */ + +#include "emu.h" +#include "eis_sad8852.h" +#include "cpu/i86/i186.h" +#include "machine/z80sio.h" + +#define LOG_READ (1U << 1) + +//#define VERBOSE (LOG_GENERAL) +//#define LOG_OUTPUT_STREAM std::cout + +#include "logmacro.h" + +#define LOGR(...) LOGMASKED(LOG_READ, __VA_ARGS__) + +#ifdef _MSC_VER +#define FUNCNAME __func__ +#else +#define FUNCNAME __PRETTY_FUNCTION__ +#endif + +DEFINE_DEVICE_TYPE(ISA16_SAD8852, isa16_sad8852_device, "sad8852", "SAD8852 IBM mainframe terminal adapter") + +#define I80188_TAG "ic33" + +//------------------------------------------------- +// Access methods from ISA bus +//------------------------------------------------- +READ8_MEMBER( isa16_sad8852_device::sad8852_r ) +{ + LOG("%s sad8852_r(): offset=%d\n", FUNCNAME, offset); + return 0xff; +} + +WRITE8_MEMBER( isa16_sad8852_device::sad8852_w ) +{ + LOG("%s : offset=%d data=0x%02x\n", FUNCNAME, offset, data); +} + +//------------------------------------------------- +// ROM( sad8852 ) +//------------------------------------------------- +ROM_START( sad8852 ) + ROM_REGION( 0x4000, I80188_TAG, 0 ) + ROM_LOAD( "ron_1020044_r2a_d500_ic31.bin", 0x0000, 0x4000, CRC(cbdd042a) SHA1(7a3d43e6b1f6fcd4402c54aaacf169ac74141cd2) ) +ROM_END + +const tiny_rom_entry *isa16_sad8852_device::device_rom_region() const +{ + return ROM_NAME( sad8852 ); +} + +//------------------------------------------------- +// ADDRESS maps +//------------------------------------------------- +ADDRESS_MAP_START(isa16_sad8852_device::sad8852_mem) + AM_RANGE(0x00000, 0x80000) AM_RAM + AM_RANGE(0xfc000, 0xfffff) AM_ROM AM_REGION(I80188_TAG, 0) +ADDRESS_MAP_END + +ADDRESS_MAP_START(isa16_sad8852_device::sad8852_io) +ADDRESS_MAP_END + +//---------------------------------------------------------- +// UI I/O +// - TODO: Figure out function of SW1, J1 and J2 +// SW1 bits 1-8 are gated to data bus through IC45 +//---------------------------------------------------------- +static INPUT_PORTS_START( sad8852_ports ) + PORT_START("SW1") + PORT_DIPNAME( 0x3ff, 0x001, "Unknown" ) + PORT_DIPSETTING( 0x00, "None" ) + PORT_DIPSETTING( 0x01, "Default" ) + + PORT_START("J1") + PORT_CONFNAME( 0x01, 0x01, "PC - AT") + PORT_CONFSETTING( 0x00, "PC") + PORT_CONFSETTING( 0x01, "AT") + + PORT_START("J2") + PORT_CONFNAME( 0x01, 0x01, "PC - AT") + PORT_CONFSETTING( 0x00, "PC") + PORT_CONFSETTING( 0x01, "AT") + + PORT_START("J3") + PORT_CONFNAME( 0x07, 0x04, "ISA IRQ") + PORT_CONFSETTING( 0x00, "IRQ2") + PORT_CONFSETTING( 0x01, "IRQ3") + PORT_CONFSETTING( 0x02, "IRQ4") + PORT_CONFSETTING( 0x03, "IRQ10") + PORT_CONFSETTING( 0x04, "IRQ11") + PORT_CONFSETTING( 0x05, "IRQ12") + PORT_CONFSETTING( 0x06, "IRQ15") +INPUT_PORTS_END + +ioport_constructor isa16_sad8852_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( sad8852_ports ); +} + +//------------------------------------------------- +// Board configuration +//------------------------------------------------- +MACHINE_CONFIG_START(isa16_sad8852_device::device_add_mconfig) + MCFG_CPU_ADD(I80188_TAG, I80188, XTAL(12'000'000) / 2) // Chip revision is 6 MHz + MCFG_CPU_PROGRAM_MAP( sad8852_mem ) + MCFG_CPU_IO_MAP(sad8852_io) + + MCFG_DEVICE_ADD("terminal", I8274_NEW, XTAL(12'000'000) / 3) // Needs verification +MACHINE_CONFIG_END + +isa16_sad8852_device::isa16_sad8852_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, ISA16_SAD8852, tag, owner, clock) + , device_isa16_card_interface(mconfig, *this) + , m_sw1(*this, "SW1") + , m_j1(*this, "J1") + , m_j2(*this, "J2") + , m_isairq(*this, "J3") + , m_installed(false) + , m_irq(4) +{ +} + +//------------------------------------------------- +// Overloading methods +//------------------------------------------------- +void isa16_sad8852_device::device_start() +{ + set_isa_device(); + m_installed = false; +} + + +void isa16_sad8852_device::device_reset() +{ + if (!m_installed) + { + m_isa->install_device(0x378, 0x378, // Wrong, need to find real i/o addresses + read8_delegate(FUNC( isa16_sad8852_device::sad8852_r ), this), + write8_delegate(FUNC( isa16_sad8852_device::sad8852_w ), this) ); + m_irq = m_isairq->read(); + m_installed = true; + } +} diff --git a/src/devices/bus/isa/eis_sad8852.h b/src/devices/bus/isa/eis_sad8852.h new file mode 100644 index 00000000000..1e2b79be092 --- /dev/null +++ b/src/devices/bus/isa/eis_sad8852.h @@ -0,0 +1,47 @@ +// license:BSD-3-Clause +// copyright-holders: Joakim Larsson Edstrom +#ifndef MAME_BUS_ISA_EIS_SAD8852_H +#define MAME_BUS_ISA_EIS_SAD8852_H + +#pragma once + +#include "isa.h" + +class isa16_sad8852_device : + public device_t, + public device_isa16_card_interface +{ +public: + // construction/destruction + isa16_sad8852_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + DECLARE_READ8_MEMBER(sad8852_r); + DECLARE_WRITE8_MEMBER(sad8852_w); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // address maps + void sad8852_mem(address_map &map); + void sad8852_io(address_map &map); + + // optional information overrides + virtual const tiny_rom_entry *device_rom_region() const override; + virtual void device_add_mconfig(machine_config &config) override; + virtual ioport_constructor device_input_ports() const override; + + // helpers + required_ioport m_sw1; + required_ioport m_j1; + required_ioport m_j2; + required_ioport m_isairq; + bool m_installed; + int m_irq; +}; + +// device type definition +DECLARE_DEVICE_TYPE(ISA16_SAD8852, isa16_sad8852_device) + +#endif // MAME_BUS_ISA_EIS_SAD8852_H diff --git a/src/devices/bus/isa/isa_cards.cpp b/src/devices/bus/isa/isa_cards.cpp index 5f1e5243fd1..5701350db46 100644 --- a/src/devices/bus/isa/isa_cards.cpp +++ b/src/devices/bus/isa/isa_cards.cpp @@ -52,6 +52,7 @@ #include "ne1000.h" #include "ne2000.h" #include "3c505.h" +#include "eis_sad8852.h" // communication ports #include "lpt.h" @@ -159,4 +160,5 @@ SLOT_INTERFACE_START( pc_isa16_cards ) SLOT_INTERFACE("mach64", ISA16_SVGA_MACH64) SLOT_INTERFACE("sb16_lle", ISA16_SB16) SLOT_INTERFACE("mcd", ISA16_MCD) + SLOT_INTERFACE("sad8852", ISA16_SAD8852) SLOT_INTERFACE_END