pcd: make sinix boot with pcx driver (nw)

This commit is contained in:
cracyc 2015-08-19 21:57:40 -05:00
parent 8f47435daa
commit 17962a4baf
2 changed files with 87 additions and 1 deletions

View File

@ -750,6 +750,7 @@ ssam88s
// Non-PC msdos
pcd // Siemens PC-D
pcx // Siemens PC-X
slicer // 1983 Slicer Computers
olypeopl // Olympia People PC

View File

@ -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<SCSI_PORT_DEVICE> m_scsi;
required_device<output_latch_device> m_scsi_data_out;
required_device<input_buffer_device> m_scsi_data_in;
optional_device<generic_terminal_device> m_terminal;
required_device<ram_device> m_ram;
required_shared_ptr<UINT16> 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 )