mirror of
https://github.com/mamedev/mame.git
synced 2024-11-16 07:48:32 +01:00
(mess) pc9801: make sasi partially work (nw)
scsi: sync rest of lines with input buffer (nw) --- The 9801f will read the hdd but appears to not like disks without 256 byte sectors. The ux and rs don't even attempt to access the sasi controller and seem to have no driver in their firmwares, are they supposed to have an external rom?
This commit is contained in:
parent
41d627253c
commit
c5e24175a1
6 changed files with 100 additions and 8 deletions
2
.gitattributes
vendored
2
.gitattributes
vendored
|
@ -1477,6 +1477,8 @@ src/emu/bus/scsi/cdu76s.c svneol=native#text/plain
|
||||||
src/emu/bus/scsi/cdu76s.h svneol=native#text/plain
|
src/emu/bus/scsi/cdu76s.h svneol=native#text/plain
|
||||||
src/emu/bus/scsi/d9060hd.c svneol=native#text/plain
|
src/emu/bus/scsi/d9060hd.c svneol=native#text/plain
|
||||||
src/emu/bus/scsi/d9060hd.h svneol=native#text/plain
|
src/emu/bus/scsi/d9060hd.h svneol=native#text/plain
|
||||||
|
src/emu/bus/scsi/pc9801_sasi.c svneol=native#text/plain
|
||||||
|
src/emu/bus/scsi/pc9801_sasi.h svneol=native#text/plain
|
||||||
src/emu/bus/scsi/s1410.c svneol=native#text/plain
|
src/emu/bus/scsi/s1410.c svneol=native#text/plain
|
||||||
src/emu/bus/scsi/s1410.h svneol=native#text/plain
|
src/emu/bus/scsi/s1410.h svneol=native#text/plain
|
||||||
src/emu/bus/scsi/sa1403d.c svneol=native#text/plain
|
src/emu/bus/scsi/sa1403d.c svneol=native#text/plain
|
||||||
|
|
|
@ -1218,6 +1218,7 @@ BUSOBJS += $(BUSOBJ)/scsi/acb4070.o
|
||||||
BUSOBJS += $(BUSOBJ)/scsi/d9060hd.o
|
BUSOBJS += $(BUSOBJ)/scsi/d9060hd.o
|
||||||
BUSOBJS += $(BUSOBJ)/scsi/sa1403d.o
|
BUSOBJS += $(BUSOBJ)/scsi/sa1403d.o
|
||||||
BUSOBJS += $(BUSOBJ)/scsi/s1410.o
|
BUSOBJS += $(BUSOBJ)/scsi/s1410.o
|
||||||
|
BUSOBJS += $(BUSOBJ)/scsi/pc9801_sasi.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#-------------------------------------------------
|
#-------------------------------------------------
|
||||||
|
|
26
src/emu/bus/scsi/pc9801_sasi.c
Normal file
26
src/emu/bus/scsi/pc9801_sasi.c
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#include "pc9801_sasi.h"
|
||||||
|
|
||||||
|
#define SASI_CMD_SPECIFY 0xc2 // according to x68k_hdc.c
|
||||||
|
|
||||||
|
const device_type PC9801_SASI = &device_creator<pc9801_sasi_device>;
|
||||||
|
|
||||||
|
pc9801_sasi_device::pc9801_sasi_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||||
|
: scsihd_device(mconfig, PC9801_SASI, "PC-9801 SASI Controller", tag, owner, clock, "pc9801_sasi", __FILE__)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void pc9801_sasi_device::ExecCommand()
|
||||||
|
{
|
||||||
|
switch(command[0])
|
||||||
|
{
|
||||||
|
case SASI_CMD_SPECIFY:
|
||||||
|
m_phase = SCSI_PHASE_DATAOUT;
|
||||||
|
m_status_code = SCSI_STATUS_CODE_GOOD;
|
||||||
|
m_transfer_length = 10;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
scsihd_device::ExecCommand();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
18
src/emu/bus/scsi/pc9801_sasi.h
Normal file
18
src/emu/bus/scsi/pc9801_sasi.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef PC9801_SASI_H_
|
||||||
|
#define PC9801_SASI_H_
|
||||||
|
|
||||||
|
#include "scsihd.h"
|
||||||
|
|
||||||
|
class pc9801_sasi_device : public scsihd_device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
pc9801_sasi_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
|
virtual void ExecCommand();
|
||||||
|
};
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
extern const device_type PC9801_SASI;
|
||||||
|
|
||||||
|
#endif /* PC9801_SASI_H_ */
|
|
@ -122,6 +122,16 @@ void SCSI_PORT_DEVICE::device_start()
|
||||||
m_data5_handler(0);
|
m_data5_handler(0);
|
||||||
m_data6_handler(0);
|
m_data6_handler(0);
|
||||||
m_data7_handler(0);
|
m_data7_handler(0);
|
||||||
|
|
||||||
|
m_bsy_handler(0);
|
||||||
|
m_sel_handler(0);
|
||||||
|
m_cd_handler(0);
|
||||||
|
m_io_handler(0);
|
||||||
|
m_msg_handler(0);
|
||||||
|
m_req_handler(0);
|
||||||
|
m_ack_handler(0);
|
||||||
|
m_atn_handler(0);
|
||||||
|
m_rst_handler(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SCSI_PORT_DEVICE::update_bsy()
|
void SCSI_PORT_DEVICE::update_bsy()
|
||||||
|
|
|
@ -402,7 +402,7 @@ Keyboard TX commands:
|
||||||
#include "machine/upd1990a.h"
|
#include "machine/upd1990a.h"
|
||||||
#include "machine/i8251.h"
|
#include "machine/i8251.h"
|
||||||
|
|
||||||
#include "bus/scsi/s1410.h"
|
#include "bus/scsi/pc9801_sasi.h"
|
||||||
#include "bus/scsi/scsi.h"
|
#include "bus/scsi/scsi.h"
|
||||||
#include "bus/scsi/scsihd.h"
|
#include "bus/scsi/scsihd.h"
|
||||||
#include "machine/buffer.h"
|
#include "machine/buffer.h"
|
||||||
|
@ -600,7 +600,9 @@ public:
|
||||||
UINT32 pc9801_286_a20(bool state);
|
UINT32 pc9801_286_a20(bool state);
|
||||||
|
|
||||||
DECLARE_WRITE8_MEMBER(sasi_data_w);
|
DECLARE_WRITE8_MEMBER(sasi_data_w);
|
||||||
|
DECLARE_READ8_MEMBER(sasi_data_r);
|
||||||
DECLARE_WRITE_LINE_MEMBER(write_sasi_io);
|
DECLARE_WRITE_LINE_MEMBER(write_sasi_io);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(write_sasi_req);
|
||||||
DECLARE_READ8_MEMBER(sasi_status_r);
|
DECLARE_READ8_MEMBER(sasi_status_r);
|
||||||
DECLARE_WRITE8_MEMBER(sasi_ctrl_w);
|
DECLARE_WRITE8_MEMBER(sasi_ctrl_w);
|
||||||
|
|
||||||
|
@ -1730,6 +1732,15 @@ WRITE8_MEMBER(pc9801_state::pc9801_mouse_w)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
READ8_MEMBER( pc9801_state::sasi_data_r )
|
||||||
|
{
|
||||||
|
UINT8 data = m_sasi_data_in->read();
|
||||||
|
|
||||||
|
if(m_sasi_ctrl_in->read() & 0x80)
|
||||||
|
m_sasibus->write_ack(1);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER( pc9801_state::sasi_data_w )
|
WRITE8_MEMBER( pc9801_state::sasi_data_w )
|
||||||
{
|
{
|
||||||
m_sasi_data = data;
|
m_sasi_data = data;
|
||||||
|
@ -1737,6 +1748,8 @@ WRITE8_MEMBER( pc9801_state::sasi_data_w )
|
||||||
if (m_sasi_data_enable)
|
if (m_sasi_data_enable)
|
||||||
{
|
{
|
||||||
m_sasi_data_out->write(m_sasi_data);
|
m_sasi_data_out->write(m_sasi_data);
|
||||||
|
if(m_sasi_ctrl_in->read() & 0x80)
|
||||||
|
m_sasibus->write_ack(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1754,6 +1767,25 @@ WRITE_LINE_MEMBER( pc9801_state::write_sasi_io )
|
||||||
{
|
{
|
||||||
m_sasi_data_out->write(0);
|
m_sasi_data_out->write(0);
|
||||||
}
|
}
|
||||||
|
if((m_sasi_ctrl_in->read() & 0x9C) == 0x8C)
|
||||||
|
m_pic2->ir1_w(m_sasi_ctrl & 1);
|
||||||
|
else
|
||||||
|
m_pic2->ir1_w(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER( pc9801_state::write_sasi_req )
|
||||||
|
{
|
||||||
|
m_sasi_ctrl_in->write_bit7(state);
|
||||||
|
|
||||||
|
if (!state)
|
||||||
|
m_sasibus->write_ack(0);
|
||||||
|
|
||||||
|
if((m_sasi_ctrl_in->read() & 0x9C) == 0x8C)
|
||||||
|
m_pic2->ir1_w(m_sasi_ctrl & 1);
|
||||||
|
else
|
||||||
|
m_pic2->ir1_w(0);
|
||||||
|
|
||||||
|
m_dmac->dreq0_w(!(state && !(m_sasi_ctrl_in->read() & 8) && (m_sasi_ctrl & 2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
@ -1765,7 +1797,7 @@ READ8_MEMBER( pc9801_state::sasi_status_r )
|
||||||
if(m_sasi_ctrl & 0x40) // read status
|
if(m_sasi_ctrl & 0x40) // read status
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
x--- -.-- REQ
|
x--- ---- REQ
|
||||||
-x-- ---- ACK
|
-x-- ---- ACK
|
||||||
--x- ---- BSY
|
--x- ---- BSY
|
||||||
---x ---- MSG
|
---x ---- MSG
|
||||||
|
@ -1782,10 +1814,9 @@ READ8_MEMBER( pc9801_state::sasi_status_r )
|
||||||
--xx x--- SASI-1 media type
|
--xx x--- SASI-1 media type
|
||||||
---- -xxx SASI-2 media type
|
---- -xxx SASI-2 media type
|
||||||
*/
|
*/
|
||||||
res |= 7 << 3; // read mediatype SASI-1
|
//res |= 7 << 3; // read mediatype SASI-1
|
||||||
res |= 7; // read mediatype SASI-2
|
//res |= 7; // read mediatype SASI-2
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1839,7 +1870,7 @@ static ADDRESS_MAP_START( pc9801_io, AS_IO, 16, pc9801_state )
|
||||||
// AM_RANGE(0x006c, 0x006f) border color / <undefined>
|
// AM_RANGE(0x006c, 0x006f) border color / <undefined>
|
||||||
AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r,pc9801_70_w,0xffff) //display registers / i8253 pit
|
AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r,pc9801_70_w,0xffff) //display registers / i8253 pit
|
||||||
// AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r,pc9801_sasi_w,0xffff) //HDD SASI interface / <undefined>
|
// AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r,pc9801_sasi_w,0xffff) //HDD SASI interface / <undefined>
|
||||||
AM_RANGE(0x0080, 0x0081) AM_DEVREAD8("sasi_data_in", input_buffer_device, read, 0x00ff) AM_WRITE8(sasi_data_w, 0x00ff)
|
AM_RANGE(0x0080, 0x0081) AM_READWRITE8(sasi_data_r, sasi_data_w, 0x00ff)
|
||||||
AM_RANGE(0x0082, 0x0083) AM_READWRITE8(sasi_status_r, sasi_ctrl_w,0x00ff)
|
AM_RANGE(0x0082, 0x0083) AM_READWRITE8(sasi_status_r, sasi_ctrl_w,0x00ff)
|
||||||
AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801_fdc_2hd_r,pc9801_fdc_2hd_w,0xffff) //upd765a 2hd / cmt
|
AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801_fdc_2hd_r,pc9801_fdc_2hd_w,0xffff) //upd765a 2hd / cmt
|
||||||
AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,pc9801_a0_w,0xffff) //upd7220 bitmap ports / display registers
|
AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,pc9801_a0_w,0xffff) //upd7220 bitmap ports / display registers
|
||||||
|
@ -3542,13 +3573,17 @@ static MACHINE_CONFIG_FRAGMENT( pc9801_sasi )
|
||||||
MCFG_SCSI_MSG_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit4))
|
MCFG_SCSI_MSG_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit4))
|
||||||
MCFG_SCSI_BSY_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit5))
|
MCFG_SCSI_BSY_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit5))
|
||||||
MCFG_SCSI_ACK_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit6))
|
MCFG_SCSI_ACK_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit6))
|
||||||
MCFG_SCSI_REQ_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit7))
|
MCFG_SCSI_REQ_HANDLER(WRITELINE(pc9801_state, write_sasi_req))
|
||||||
|
|
||||||
MCFG_SCSIDEV_ADD(SASIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", S1410, SCSI_ID_0) // TODO: correct one, perhaps ttl
|
MCFG_SCSIDEV_ADD(SASIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", PC9801_SASI, SCSI_ID_0)
|
||||||
|
|
||||||
MCFG_SCSI_OUTPUT_LATCH_ADD("sasi_data_out", SASIBUS_TAG)
|
MCFG_SCSI_OUTPUT_LATCH_ADD("sasi_data_out", SASIBUS_TAG)
|
||||||
MCFG_DEVICE_ADD("sasi_data_in", INPUT_BUFFER, 0)
|
MCFG_DEVICE_ADD("sasi_data_in", INPUT_BUFFER, 0)
|
||||||
MCFG_DEVICE_ADD("sasi_ctrl_in", INPUT_BUFFER, 0)
|
MCFG_DEVICE_ADD("sasi_ctrl_in", INPUT_BUFFER, 0)
|
||||||
|
|
||||||
|
MCFG_DEVICE_MODIFY("i8237")
|
||||||
|
MCFG_I8237_IN_IOR_0_CB(READ8(pc9801_state, sasi_data_r))
|
||||||
|
MCFG_I8237_OUT_IOW_0_CB(WRITE8(pc9801_state, sasi_data_w))
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue