(MESS) sdk86: Added serial terminal. [Curt Coder]

This commit is contained in:
Curt Coder 2013-05-21 13:35:33 +00:00
parent 6f908511ca
commit dd4763f134
2 changed files with 65 additions and 12 deletions

View File

@ -21,28 +21,39 @@ Download the User Manual to get the operating procedures.
ToDo: ToDo:
- Artwork - Artwork
- Add INTR and RESET keys - Add INTR and RESET keys
- Add terminal interface and option to enable it.
****************************************************************************/ ****************************************************************************/
#include "emu.h" #include "emu.h"
#include "cpu/i86/i86.h" #include "cpu/i86/i86.h"
#include "machine/i8251.h"
#include "machine/i8279.h" #include "machine/i8279.h"
#include "machine/serial.h"
#include "sdk86.lh" #include "sdk86.lh"
#define I8251_TAG "i8251"
#define RS232_TAG "rs232"
class sdk86_state : public driver_device class sdk86_state : public driver_device
{ {
public: public:
sdk86_state(const machine_config &mconfig, device_type type, const char *tag) sdk86_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) , : driver_device(mconfig, type, tag) ,
m_maincpu(*this, "maincpu") { } m_maincpu(*this, "maincpu"),
m_usart(*this, I8251_TAG)
{ }
required_device<cpu_device> m_maincpu;
required_device<i8251_device> m_usart;
DECLARE_WRITE8_MEMBER(scanlines_w); DECLARE_WRITE8_MEMBER(scanlines_w);
DECLARE_WRITE8_MEMBER(digit_w); DECLARE_WRITE8_MEMBER(digit_w);
DECLARE_READ8_MEMBER(kbd_r); DECLARE_READ8_MEMBER(kbd_r);
TIMER_DEVICE_CALLBACK_MEMBER( serial_tick );
UINT8 m_digit; UINT8 m_digit;
required_device<cpu_device> m_maincpu;
}; };
static ADDRESS_MAP_START(sdk86_mem, AS_PROGRAM, 16, sdk86_state) static ADDRESS_MAP_START(sdk86_mem, AS_PROGRAM, 16, sdk86_state)
@ -52,14 +63,12 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START(sdk86_io, AS_IO, 16, sdk86_state) static ADDRESS_MAP_START(sdk86_io, AS_IO, 16, sdk86_state)
ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0xfff0, 0xfff1) AM_MIRROR(4) AM_DEVREADWRITE8(I8251_TAG, i8251_device, data_r, data_w, 0xff)
AM_RANGE(0xfff2, 0xfff3) AM_MIRROR(4) AM_DEVREADWRITE8(I8251_TAG, i8251_device, status_r, control_w, 0xff)
AM_RANGE(0xffe8, 0xffe9) AM_MIRROR(4) AM_DEVREADWRITE8("i8279", i8279_device, data_r, data_w, 0xff) AM_RANGE(0xffe8, 0xffe9) AM_MIRROR(4) AM_DEVREADWRITE8("i8279", i8279_device, data_r, data_w, 0xff)
AM_RANGE(0xffea, 0xffeb) AM_MIRROR(4) AM_DEVREADWRITE8("i8279", i8279_device, status_r, cmd_w, 0xff) AM_RANGE(0xffea, 0xffeb) AM_MIRROR(4) AM_DEVREADWRITE8("i8279", i8279_device, status_r, cmd_w, 0xff)
// FFF0-FFF3 = 8251 serial chip (even -> data, control) AM_MIRROR(4)
// FFF8-FFFF = 2 x 8255A i/o chips. chip 1 uses the odd addresses, chip 2 uses the even addresses. // FFF8-FFFF = 2 x 8255A i/o chips. chip 1 uses the odd addresses, chip 2 uses the even addresses.
// ports are A,B,C,control in that order. // ports are A,B,C,control in that order.
ADDRESS_MAP_END ADDRESS_MAP_END
/* Input ports */ /* Input ports */
@ -119,6 +128,25 @@ READ8_MEMBER( sdk86_state::kbd_r )
return data; return data;
} }
TIMER_DEVICE_CALLBACK_MEMBER( sdk86_state::serial_tick )
{
m_usart->receive_clock();
m_usart->transmit_clock();
}
static const i8251_interface usart_intf =
{
DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, rx),
DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, tx),
DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, rs232_port_device, dsr_r),
DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, rs232_port_device, dtr_w),
DEVCB_NULL, // connected to CTS
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static I8279_INTERFACE( sdk86_intf ) static I8279_INTERFACE( sdk86_intf )
{ {
DEVCB_NULL, // irq DEVCB_NULL, // irq
@ -130,6 +158,20 @@ static I8279_INTERFACE( sdk86_intf )
DEVCB_LINE_GND DEVCB_LINE_GND
}; };
static DEVICE_INPUT_DEFAULTS_START( terminal )
DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x0f, 0x05 ) // 4800
DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x30, 0x20 ) // 8N2
DEVICE_INPUT_DEFAULTS_END
static const rs232_port_interface rs232_intf =
{
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static MACHINE_CONFIG_START( sdk86, sdk86_state ) static MACHINE_CONFIG_START( sdk86, sdk86_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8086, XTAL_14_7456MHz/3) /* divided down by i8284 clock generator; jumper selection allows it to be slowed to 2.5MHz, hence changing divider from 3 to 6 */ MCFG_CPU_ADD("maincpu", I8086, XTAL_14_7456MHz/3) /* divided down by i8284 clock generator; jumper selection allows it to be slowed to 2.5MHz, hence changing divider from 3 to 6 */
@ -140,19 +182,24 @@ static MACHINE_CONFIG_START( sdk86, sdk86_state )
MCFG_DEFAULT_LAYOUT(layout_sdk86) MCFG_DEFAULT_LAYOUT(layout_sdk86)
/* Devices */ /* Devices */
MCFG_I8251_ADD(I8251_TAG, usart_intf)
MCFG_I8279_ADD("i8279", 2500000, sdk86_intf) // based on divider MCFG_I8279_ADD("i8279", 2500000, sdk86_intf) // based on divider
MCFG_RS232_PORT_ADD(RS232_TAG, rs232_intf, default_rs232_devices, "serial_terminal", terminal)
MCFG_TIMER_DRIVER_ADD_PERIODIC("serial", sdk86_state, serial_tick, attotime::from_hz(307200))
MACHINE_CONFIG_END MACHINE_CONFIG_END
/* ROM definition */ /* ROM definition */
ROM_START( sdk86 ) ROM_START( sdk86 )
ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF ) // all are Intel D2616 ?eproms with the windows painted over? (factory programmed eproms? this would match the 'i8642' marking on the factory programmed eprom version of the AT keyboard mcu...) ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF ) // all are Intel D2616 ?eproms with the windows painted over? (factory programmed eproms? this would match the 'i8642' marking on the factory programmed eprom version of the AT keyboard mcu...)
// Note that the rom pairs at FE000-FEFFF and FF000-FFFFF are interchangeable; the ones at FF000-FFFFF are the ones which start on bootup, and the other ones live at FE000-FEFFF and can be switched in by the user. One pair is the Serial RS232 Monitor and the other is the Keypad/front panel monitor. On the SDK-86 I (LN) dumped, the Keypad monitor was primary, but the other SDK-86 I know of has the roms in the opposite arrangement (Serial primary). // Note that the rom pairs at FE000-FEFFF and FF000-FFFFF are interchangeable; the ones at FF000-FFFFF are the ones which start on bootup, and the other ones live at FE000-FEFFF and can be switched in by the user. One pair is the Serial RS232 Monitor and the other is the Keypad/front panel monitor. On the SDK-86 I (LN) dumped, the Keypad monitor was primary, but the other SDK-86 I know of has the roms in the opposite arrangement (Serial primary).
// Serial Monitor Version 1.2 (says " 86 1.2" on LED display at startup, and sends a data prompt over serial)
ROM_LOAD16_BYTE( "0456_104531-001.a36", 0xfe000, 0x0800, CRC(f9c4a809) SHA1(aea324c3f52dd393f1eed2b856ba11f050a35b93)) /* Label: "iD2616 // T142099WS // (C)INTEL '77 // 0456 // 104531-001" */
ROM_LOAD16_BYTE( "0457_104532-001.a37", 0xfe001, 0x0800, CRC(a245ba5c) SHA1(7f67277f866fca5377cb123e9cc405b5fdfe61d3)) /* Label: "iD2616 // T145054WS // (C)INTEL '77 // 0457 // 104532-001" */
// Keypad Monitor Version 1.1 (says "- 86 1.1" on LED display at startup) // Keypad Monitor Version 1.1 (says "- 86 1.1" on LED display at startup)
ROM_LOAD16_BYTE( "0169_102042-001.a27", 0xff000, 0x0800, CRC(3f46311a) SHA1(a97e6861b736f26230b9adbf5cd2576a9f60d626)) /* Label: "iD2616 // T142094WS // (C)INTEL '77 // 0169 // 102042-001" */ ROM_SYSTEM_BIOS( 0, "keypad", "Keypad Monitor" )
ROM_LOAD16_BYTE( "0170_102043-001.a30", 0xff001, 0x0800, CRC(65924471) SHA1(5d258695bf585f89179dfa0a113a0eeeabd5ee2b)) /* Label: "iD2616 // T145056WS // (C)INTEL '77 // 0170 // 102043-001" */ ROMX_LOAD( "0169_102042-001.a27", 0xff000, 0x0800, CRC(3f46311a) SHA1(a97e6861b736f26230b9adbf5cd2576a9f60d626), ROM_SKIP(1) | ROM_BIOS(1) ) /* Label: "iD2616 // T142094WS // (C)INTEL '77 // 0169 // 102042-001" */
ROMX_LOAD( "0170_102043-001.a30", 0xff001, 0x0800, CRC(65924471) SHA1(5d258695bf585f89179dfa0a113a0eeeabd5ee2b), ROM_SKIP(1) | ROM_BIOS(1) ) /* Label: "iD2616 // T145056WS // (C)INTEL '77 // 0170 // 102043-001" */
// Serial Monitor Version 1.2 (says " 86 1.2" on LED display at startup, and sends a data prompt over serial)
ROM_SYSTEM_BIOS( 1, "serial", "Serial Monitor" )
ROMX_LOAD( "0456_104531-001.a36", 0xff000, 0x0800, CRC(f9c4a809) SHA1(aea324c3f52dd393f1eed2b856ba11f050a35b93), ROM_SKIP(1) | ROM_BIOS(2) ) /* Label: "iD2616 // T142099WS // (C)INTEL '77 // 0456 // 104531-001" */
ROMX_LOAD( "0457_104532-001.a37", 0xff001, 0x0800, CRC(a245ba5c) SHA1(7f67277f866fca5377cb123e9cc405b5fdfe61d3), ROM_SKIP(1) | ROM_BIOS(2) ) /* Label: "iD2616 // T145054WS // (C)INTEL '77 // 0457 // 104532-001" */
/* proms: /* proms:
* dumped 11/21/09 through 11/29/09 by LN * dumped 11/21/09 through 11/29/09 by LN

View File

@ -52,4 +52,10 @@
</view> </view>
<view name="Terminal">
<screen index="0">
<bounds left="0" top="0" right="4" bottom="3" />
</screen>
</view>
</mamelayout> </mamelayout>