diff --git a/src/mame/mess.lst b/src/mame/mess.lst index 376d5adddda..49cc3abe249 100644 --- a/src/mame/mess.lst +++ b/src/mame/mess.lst @@ -750,6 +750,7 @@ ssam88s // Non-PC msdos pcd // Siemens PC-D +pcx // Siemens PC-X slicer // 1983 Slicer Computers olypeopl // Olympia People PC diff --git a/src/mess/drivers/pcd.c b/src/mess/drivers/pcd.c index a17e509b3ee..8d53ff2ae7a 100644 --- a/src/mess/drivers/pcd.c +++ b/src/mess/drivers/pcd.c @@ -17,10 +17,12 @@ #include "machine/wd_fdc.h" #include "machine/mc146818.h" #include "machine/pcd_kbd.h" +#include "machine/terminal.h" #include "sound/speaker.h" #include "video/scn2674.h" #include "formats/pc_dsk.h" #include "bus/scsi/omti5100.h" +#include "bus/rs232/rs232.h" //************************************************************************** // TYPE DEFINITIONS @@ -43,6 +45,7 @@ public: m_scsi(*this, "scsi"), m_scsi_data_out(*this, "scsi_data_out"), m_scsi_data_in(*this, "scsi_data_in"), + m_terminal(*this, "terminal"), m_ram(*this, "ram"), m_vram(*this, "vram"), m_charram(8*1024) @@ -74,6 +77,9 @@ public: DECLARE_WRITE16_MEMBER( mmu_w ); DECLARE_READ16_MEMBER( mem_r ); DECLARE_WRITE16_MEMBER( mem_w ); + DECLARE_READ8_MEMBER( exp_r ); + DECLARE_WRITE8_MEMBER( exp_w ); + DECLARE_WRITE8_MEMBER( term_key_w ); SCN2674_DRAW_CHARACTER_MEMBER(display_pixels); DECLARE_FLOPPY_FORMATS( floppy_formats ); DECLARE_WRITE_LINE_MEMBER(write_scsi_bsy); @@ -101,10 +107,11 @@ private: required_device m_scsi; required_device m_scsi_data_out; required_device m_scsi_data_in; + optional_device m_terminal; required_device m_ram; required_shared_ptr m_vram; dynamic_buffer m_charram; - UINT8 m_stat, m_led, m_vram_sw; + UINT8 m_stat, m_led, m_vram_sw, m_term_key; int m_msg, m_bsy, m_io, m_cd, m_req, m_rst; emu_timer *m_req_hack; UINT16 m_dskctl; @@ -159,6 +166,7 @@ void pcd_state::machine_reset() m_mmu.ctl = 0; m_mmu.sc = false; m_mmu.type = ioport("mmu")->read(); + m_term_key = 0; } READ8_MEMBER( pcd_state::irq_callback ) @@ -486,6 +494,50 @@ READ16_MEMBER(pcd_state::mem_r) } return ram[offset]; } + +// The PC-X treats the graphics board as a serial port. Maybe the 8031 (instead of 8047) can +// write directly to the video ram and there's a char ROM instead of RAM? +READ8_MEMBER(pcd_state::exp_r) +{ + if(m_dskctl & 0x40) + { + if(!offset) + { + UINT8 data = m_term_key; + m_term_key = 0; + return data; + } + else + { + m_pic2->ir0_w(CLEAR_LINE); + return (m_term_key ? 1 : 0); + } + } + else if(offset & 1) + return m_crtc->read(space, offset/2); + return 0xff; +} + +WRITE8_MEMBER(pcd_state::exp_w) +{ + if(m_dskctl & 0x40) + { + if(!offset) + { + m_pic2->ir0_w(ASSERT_LINE); + m_terminal->write(space, 0, data); + } + } + else if(!(offset & 1)) + return m_crtc->write(space, offset/2, data); +} + +WRITE8_MEMBER(pcd_state::term_key_w) +{ + m_pic2->ir0_w(ASSERT_LINE); + m_term_key = data; +} + //************************************************************************** // ADDRESS MAPS //************************************************************************** @@ -522,6 +574,11 @@ static ADDRESS_MAP_START( pcd_io, AS_IO, 16, pcd_state ) AM_RANGE(0xfb00, 0xffff) AM_READWRITE8(nmi_io_r, nmi_io_w, 0xffff) ADDRESS_MAP_END +static ADDRESS_MAP_START( pcx_io, AS_IO, 16, pcd_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0xf980, 0xf98f) AM_READWRITE8(exp_r, exp_w, 0xffff) + AM_IMPORT_FROM(pcd_io) +ADDRESS_MAP_END //************************************************************************** // MACHINE DRIVERS @@ -579,6 +636,7 @@ static MACHINE_CONFIG_START( pcd, pcd_state ) MCFG_DEVICE_ADD("usart1", MC2661, XTAL_4_9152MHz) MCFG_MC2661_RXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir3_w)) MCFG_MC2661_TXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir3_w)) + MCFG_MC2661_TXD_HANDLER(DEVWRITELINE("rs232_1", rs232_port_device, write_txd)) MCFG_DEVICE_ADD("usart2", MC2661, XTAL_4_9152MHz) MCFG_MC2661_RXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir2_w)) //MCFG_MC2661_TXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir2_w)) // this gets stuck high causing the keyboard to not work @@ -586,6 +644,12 @@ static MACHINE_CONFIG_START( pcd, pcd_state ) MCFG_DEVICE_ADD("usart3", MC2661, XTAL_4_9152MHz) MCFG_MC2661_RXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir4_w)) MCFG_MC2661_TXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir4_w)) + MCFG_MC2661_TXD_HANDLER(DEVWRITELINE("rs232_2", rs232_port_device, write_txd)) + + MCFG_RS232_PORT_ADD("rs232_1", default_rs232_devices, NULL) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("usart1", mc2661_device, rx_w)) + MCFG_RS232_PORT_ADD("rs232_2", default_rs232_devices, NULL) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("usart3", mc2661_device, rx_w)) // sound hardware MCFG_SPEAKER_STANDARD_MONO("mono") @@ -606,6 +670,7 @@ static MACHINE_CONFIG_START( pcd, pcd_state ) MCFG_SCN2674_TEXT_CHARACTER_WIDTH(8) MCFG_SCN2674_GFX_CHARACTER_WIDTH(16) MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(pcd_state, display_pixels) + MCFG_VIDEO_SET_SCREEN("screen") // rtc MCFG_MC146818_ADD("rtc", XTAL_32_768kHz) @@ -627,6 +692,16 @@ static MACHINE_CONFIG_START( pcd, pcd_state ) MCFG_SCSIDEV_ADD("scsi:1", "harddisk", OMTI5100, SCSI_ID_0) MACHINE_CONFIG_END +MACHINE_CONFIG_DERIVED(pcx, pcd) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_IO_MAP(pcx_io) + + // FIXME: temporary workaround + MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0) + MCFG_GENERIC_TERMINAL_KEYBOARD_CB(WRITE8(pcd_state, term_key_w)) + + MCFG_DEVICE_REMOVE("graphics") +MACHINE_CONFIG_END //************************************************************************** // ROM DEFINITIONS @@ -646,9 +721,19 @@ ROM_START( pcd ) ROM_LOAD("s36361-d321-v1.bin", 0x000, 0x400, CRC(69baeb2a) SHA1(98b9cd0f38c51b4988a3aed0efcf004bedd115ff)) ROM_END +ROM_START( pcx ) + ROM_REGION(0x4000, "bios", 0) + ROM_SYSTEM_BIOS(0, "v2", "V2 GS") // from mainboard SYBAC S26361-D359 V2 GS + ROMX_LOAD("s26361-d359.d42", 0x0001, 0x2000, CRC(e20244dd) SHA1(0ebc5ddb93baacd9106f1917380de58aac64fe73), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("s26361-d359.d43", 0x0000, 0x2000, CRC(e03db2ec) SHA1(fcae8b0c9e7543706817b0a53872826633361fda), ROM_SKIP(1) | ROM_BIOS(1)) + ROM_SYSTEM_BIOS(1, "v3", "V3 GS4") // from mainboard SYBAC S26361-D359 V3 GS4 + ROMX_LOAD("361d0359.d42", 0x0001, 0x2000, CRC(5b4461e4) SHA1(db6756aeabb2e6d3921dc7571a5bed3497b964bf), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD("361d0359.d43", 0x0000, 0x2000, CRC(71c3189d) SHA1(e8dd6c632bfc833074d3a833ea7f59bb5460f313), ROM_SKIP(1) | ROM_BIOS(2)) +ROM_END //************************************************************************** // GAME DRIVERS //************************************************************************** COMP( 1984, pcd, 0, 0, pcd, pcd, driver_device, 0, "Siemens", "PC-D", MACHINE_NOT_WORKING ) +COMP( 1984, pcx, pcd, 0, pcx, pcd, driver_device, 0, "Siemens", "PC-X", MACHINE_NOT_WORKING )