summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/pcd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/drivers/pcd.c')
-rw-r--r--src/mess/drivers/pcd.c198
1 files changed, 163 insertions, 35 deletions
diff --git a/src/mess/drivers/pcd.c b/src/mess/drivers/pcd.c
index 0aa0322358e..ea291b161f6 100644
--- a/src/mess/drivers/pcd.c
+++ b/src/mess/drivers/pcd.c
@@ -15,12 +15,13 @@
#include "machine/nvram.h"
#include "machine/pic8259.h"
#include "machine/mc2661.h"
-#include "machine/omti5100.h"
#include "machine/wd_fdc.h"
#include "machine/mc146818.h"
+#include "machine/pcd_kbd.h"
#include "sound/speaker.h"
#include "video/scn2674.h"
#include "formats/pc_dsk.h"
+#include "bus/scsi/omti5100.h"
//**************************************************************************
// TYPE DEFINITIONS
@@ -35,12 +36,14 @@ public:
m_pic1(*this, "pic1"),
m_pic2(*this, "pic2"),
m_speaker(*this, "speaker"),
- m_sasi(*this, "sasi"),
m_fdc(*this, "fdc"),
m_rtc(*this, "rtc"),
m_crtc(*this, "crtc"),
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"),
+ m_scsi(*this, "scsi"),
+ m_scsi_data_out(*this, "scsi_data_out"),
+ m_scsi_data_in(*this, "scsi_data_in"),
m_vram(*this, "vram"),
m_charram(8*1024)
{ }
@@ -59,35 +62,47 @@ public:
DECLARE_WRITE8_MEMBER( led_w );
DECLARE_READ8_MEMBER( detect_r );
DECLARE_WRITE8_MEMBER( detect_w );
- DECLARE_READ8_MEMBER( dskctl_r );
- DECLARE_WRITE8_MEMBER( dskctl_w );
+ DECLARE_READ16_MEMBER( dskctl_r );
+ DECLARE_WRITE16_MEMBER( dskctl_w );
DECLARE_READ8_MEMBER( mcu_r );
DECLARE_WRITE8_MEMBER( mcu_w );
+ DECLARE_READ8_MEMBER( scsi_r );
+ DECLARE_WRITE8_MEMBER( scsi_w );
DECLARE_WRITE8_MEMBER( vram_sw_w );
- DECLARE_READ16_MEMBER( vram_r );
DECLARE_WRITE16_MEMBER( vram_w );
SCN2674_DRAW_CHARACTER_MEMBER(display_pixels);
DECLARE_FLOPPY_FORMATS( floppy_formats );
+ DECLARE_WRITE_LINE_MEMBER(write_scsi_bsy);
+ DECLARE_WRITE_LINE_MEMBER(write_scsi_cd);
+ DECLARE_WRITE_LINE_MEMBER(write_scsi_io);
+ DECLARE_WRITE_LINE_MEMBER(write_scsi_msg);
+ DECLARE_WRITE_LINE_MEMBER(write_scsi_req);
protected:
// driver_device overrides
virtual void machine_start();
virtual void machine_reset();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
required_device<i80186_cpu_device> m_maincpu;
required_device<pic8259_device> m_pic1;
required_device<pic8259_device> m_pic2;
required_device<speaker_sound_device> m_speaker;
- required_device<omti5100_device> m_sasi;
required_device<wd2793_t> m_fdc;
required_device<mc146818_device> m_rtc;
required_device<scn2674_device> m_crtc;
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
+ 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;
required_shared_ptr<UINT16> m_vram;
dynamic_buffer m_charram;
- UINT8 m_stat, m_led, m_dskctl, m_vram_sw;
+ UINT8 m_stat, m_led, m_vram_sw;
+ int m_msg, m_bsy, m_io, m_cd, m_req, m_rst;
+ emu_timer *m_req_hack;
+ UINT16 m_dskctl;
};
@@ -107,9 +122,18 @@ static const gfx_layout pcd_charlayout =
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8 },
8*16
};
+
+void pcd_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ // TODO: remove this hack
+ if(m_req)
+ m_maincpu->drq0_w(1);
+}
+
void pcd_state::machine_start()
{
m_gfxdecode->set_gfx(0, global_alloc(gfx_element(machine().device<palette_device>("palette"), pcd_charlayout, m_charram, 0, 1, 0)));
+ m_req_hack = timer_alloc();
}
void pcd_state::machine_reset()
@@ -118,6 +142,7 @@ void pcd_state::machine_reset()
m_led = 0;
m_dskctl = 0;
m_vram_sw = 1;
+ m_rst = 0;
}
READ8_MEMBER( pcd_state::irq_callback )
@@ -136,11 +161,6 @@ WRITE_LINE_MEMBER( pcd_state::i186_timer1_w )
m_speaker->level_w(state);
}
-READ16_MEMBER( pcd_state::vram_r )
-{
- return m_vram[offset];
-}
-
WRITE16_MEMBER( pcd_state::vram_w )
{
if(m_vram_sw)
@@ -216,30 +236,31 @@ WRITE8_MEMBER( pcd_state::mcu_w )
{
}
-READ8_MEMBER( pcd_state::dskctl_r )
+READ16_MEMBER( pcd_state::dskctl_r )
{
return m_dskctl;
}
-WRITE8_MEMBER( pcd_state::dskctl_w )
+WRITE16_MEMBER( pcd_state::dskctl_w )
{
floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
- if((data & 1) && floppy0)
+ COMBINE_DATA(&m_dskctl);
+
+ if((m_dskctl & 1) && floppy0)
m_fdc->set_floppy(floppy0);
if(floppy0)
{
- floppy0->mon_w(!(data & 4));
- floppy0->ss_w((data & 8) != 0);
+ floppy0->mon_w(!(m_dskctl & 4));
+ floppy0->ss_w((m_dskctl & 8) != 0);
}
if(floppy1)
{
- floppy1->mon_w(!(data & 4));
- floppy1->ss_w((data & 8) != 0);
+ floppy1->mon_w(!(m_dskctl & 4));
+ floppy1->ss_w((m_dskctl & 8) != 0);
}
- m_dskctl = data;
}
READ8_MEMBER( pcd_state::led_r )
@@ -266,23 +287,118 @@ SCN2674_DRAW_CHARACTER_MEMBER(pcd_state::display_pixels)
UINT16 data = m_vram[address];
data = (data >> 8) | (data << 8);
for(int i = 0; i < 16; i++)
- bitmap.pix32(y, x + i) = m_palette->pen((data & (1 << (16 - i))) ? 1 : 0);
+ bitmap.pix32(y, x + i) = m_palette->pen((data & (1 << (15 - i))) ? 1 : 0);
}
else
{
UINT8 data = m_charram[(m_vram[address] & 0xff) * 16 + linecount];
for(int i = 0; i < 8; i++)
- bitmap.pix32(y, x + i) = m_palette->pen((data & (1 << (8 - i))) ? 1 : 0);
+ bitmap.pix32(y, x + i) = m_palette->pen((data & (1 << (7 - i))) ? 1 : 0);
+ }
+}
+
+READ8_MEMBER(pcd_state::scsi_r)
+{
+ UINT8 ret = 0;
+
+ switch(offset)
+ {
+ case 0:
+ case 2:
+ ret = m_scsi_data_in->read();
+ m_scsi->write_ack(1);
+ if(!offset)
+ m_maincpu->drq0_w(0);
+ break;
+
+ case 1:
+ ret = (m_cd << 7) | (m_req << 5) | (m_bsy << 4);
+ break;
+ }
+
+ return ret;
+}
+
+WRITE8_MEMBER(pcd_state::scsi_w)
+{
+ switch(offset)
+ {
+ case 0:
+ m_scsi_data_out->write(data);
+ m_scsi->write_ack(1);
+ if(m_cd)
+ {
+ m_maincpu->drq0_w(0);
+ m_req_hack->adjust(attotime::never);
+ }
+ break;
+ case 1:
+ if(data & 4)
+ {
+ m_rst = 1;
+ m_scsi->write_rst(1);
+ break;
+ }
+ if(m_rst)
+ {
+ m_rst = 0;
+ m_scsi->write_rst(0);
+ break;
+ }
+
+ if(!m_bsy)
+ {
+ m_scsi_data_out->write(0);
+ m_scsi->write_sel(1);
+ }
+ break;
}
}
+WRITE_LINE_MEMBER(pcd_state::write_scsi_bsy)
+{
+ m_bsy = state ? 1 : 0;
+ m_scsi->write_sel(0);
+}
+WRITE_LINE_MEMBER(pcd_state::write_scsi_cd)
+{
+ m_cd = state ? 1 : 0;
+}
+WRITE_LINE_MEMBER(pcd_state::write_scsi_io)
+{
+ m_io = state ? 1 : 0;
+}
+WRITE_LINE_MEMBER(pcd_state::write_scsi_msg)
+{
+ m_msg = state ? 1 : 0;
+}
+
+WRITE_LINE_MEMBER(pcd_state::write_scsi_req)
+{
+ m_req = state ? 1 : 0;
+ if(state)
+ {
+ if(!m_cd)
+ {
+ m_maincpu->drq0_w(1);
+ m_req_hack->adjust(attotime::from_msec(10)); // poke the dmac
+ }
+ else if(m_msg)
+ {
+ m_scsi_data_in->read();
+ m_scsi->write_ack(1);
+ }
+ }
+ else
+ m_scsi->write_ack(0);
+}
//**************************************************************************
// ADDRESS MAPS
//**************************************************************************
static ADDRESS_MAP_START( pcd_map, AS_PROGRAM, 16, pcd_state )
AM_RANGE(0x00000, 0x3ffff) AM_RAM // fixed 256k for now
- AM_RANGE(0xf0000, 0xf7fff) AM_READWRITE(vram_r, vram_w) AM_SHARE("vram")
+ AM_RANGE(0xf0000, 0xf7fff) AM_READONLY AM_WRITE(vram_w) AM_SHARE("vram")
AM_RANGE(0xfc000, 0xfffff) AM_ROM AM_REGION("bios", 0)
AM_RANGE(0x00000, 0xfffff) AM_READWRITE8(nmi_io_r, nmi_io_w, 0xffff)
ADDRESS_MAP_END
@@ -297,8 +413,8 @@ static ADDRESS_MAP_START( pcd_io, AS_IO, 16, pcd_state )
AM_RANGE(0xf840, 0xf841) AM_READWRITE8(led_r, led_w, 0xff00)
AM_RANGE(0xf880, 0xf8bf) AM_READWRITE8(rtc_r, rtc_w, 0xffff)
AM_RANGE(0xf900, 0xf903) AM_DEVREADWRITE8("fdc", wd2793_t, read, write, 0xffff)
- AM_RANGE(0xf904, 0xf905) AM_READWRITE8(dskctl_r, dskctl_w, 0x00ff)
- //AM_RANGE(0xf940, 0xf943) scsi
+ AM_RANGE(0xf904, 0xf905) AM_READWRITE(dskctl_r, dskctl_w)
+ AM_RANGE(0xf940, 0xf943) AM_READWRITE8(scsi_r, scsi_w, 0xffff)
AM_RANGE(0xf980, 0xf98f) AM_DEVWRITE8("crtc", scn2674_device, write, 0x00ff)
AM_RANGE(0xf980, 0xf98f) AM_DEVREAD8("crtc", scn2674_device, read, 0xff00)
AM_RANGE(0xf9a0, 0xf9a1) AM_WRITE8(vram_sw_w, 0x00ff)
@@ -347,9 +463,6 @@ static MACHINE_CONFIG_START( pcd, pcd_state )
// nvram
MCFG_NVRAM_ADD_1FILL("nvram")
- // sasi controller
- MCFG_OMTI5100_ADD("sasi")
-
// floppy disk controller
MCFG_WD2793x_ADD("fdc", XTAL_16MHz/8/2)
MCFG_WD_FDC_INTRQ_CALLBACK(DEVWRITELINE("pic1", pic8259_device, ir6_w))
@@ -361,11 +474,15 @@ static MACHINE_CONFIG_START( pcd, pcd_state )
// usart
MCFG_DEVICE_ADD("usart1", MC2661, XTAL_4_9152MHz)
- MCFG_MC2661_TXEMT_DSCHG_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir2_w))
+ MCFG_MC2661_RXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir3_w))
+ MCFG_MC2661_TXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir3_w))
MCFG_DEVICE_ADD("usart2", MC2661, XTAL_4_9152MHz)
- MCFG_MC2661_TXEMT_DSCHG_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir3_w))
+ 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
+ MCFG_MC2661_TXD_HANDLER(DEVWRITELINE("keyboard", pcd_keyboard_device, t0_w))
MCFG_DEVICE_ADD("usart3", MC2661, XTAL_4_9152MHz)
- MCFG_MC2661_TXEMT_DSCHG_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir4_w))
+ MCFG_MC2661_RXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir4_w))
+ MCFG_MC2661_TXRDY_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir4_w))
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -390,6 +507,21 @@ static MACHINE_CONFIG_START( pcd, pcd_state )
// rtc
MCFG_MC146818_ADD("rtc", XTAL_32_768kHz)
MCFG_MC146818_IRQ_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir7_w))
+
+ MCFG_DEVICE_ADD("keyboard", PCD_KEYBOARD, 0)
+ MCFG_PCD_KEYBOARD_OUT_TX_HANDLER(DEVWRITELINE("usart2", mc2661_device, rx_w))
+
+ MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0)
+ MCFG_SCSI_DATA_INPUT_BUFFER("scsi_data_in")
+ MCFG_SCSI_MSG_HANDLER(WRITELINE(pcd_state, write_scsi_msg))
+ MCFG_SCSI_BSY_HANDLER(WRITELINE(pcd_state, write_scsi_bsy))
+ MCFG_SCSI_IO_HANDLER(WRITELINE(pcd_state, write_scsi_io))
+ MCFG_SCSI_CD_HANDLER(WRITELINE(pcd_state, write_scsi_cd))
+ MCFG_SCSI_REQ_HANDLER(WRITELINE(pcd_state, write_scsi_req))
+
+ MCFG_SCSI_OUTPUT_LATCH_ADD("scsi_data_out", "scsi")
+ MCFG_DEVICE_ADD("scsi_data_in", INPUT_BUFFER, 0)
+ MCFG_SCSIDEV_ADD("scsi:1", "harddisk", OMTI5100, SCSI_ID_0)
MACHINE_CONFIG_END
@@ -411,10 +543,6 @@ ROM_START( pcd )
// gfx card (scn2674 with 8741), to be moved
ROM_REGION(0x400, "graphics", 0)
ROM_LOAD("s36361-d321-v1.bin", 0x000, 0x400, CRC(69baeb2a) SHA1(98b9cd0f38c51b4988a3aed0efcf004bedd115ff))
-
- // keyboard (8035), to be moved
- ROM_REGION(0x1000, "keyboard", 0)
- ROM_LOAD("pcd_keyboard.bin", 0x0000, 0x1000, CRC(d227d6cb) SHA1(3d6140764d3d043428c941826370ebf1597c63bd))
ROM_END