trunk/src/mess/drivers/pc9801.c
r32440 | r32441 | |
402 | 402 | #include "machine/upd1990a.h" |
403 | 403 | #include "machine/i8251.h" |
404 | 404 | |
405 | | #include "bus/scsi/s1410.h" |
| 405 | #include "bus/scsi/pc9801_sasi.h" |
406 | 406 | #include "bus/scsi/scsi.h" |
407 | 407 | #include "bus/scsi/scsihd.h" |
408 | 408 | #include "machine/buffer.h" |
r32440 | r32441 | |
600 | 600 | UINT32 pc9801_286_a20(bool state); |
601 | 601 | |
602 | 602 | DECLARE_WRITE8_MEMBER(sasi_data_w); |
| 603 | DECLARE_READ8_MEMBER(sasi_data_r); |
603 | 604 | DECLARE_WRITE_LINE_MEMBER(write_sasi_io); |
| 605 | DECLARE_WRITE_LINE_MEMBER(write_sasi_req); |
604 | 606 | DECLARE_READ8_MEMBER(sasi_status_r); |
605 | 607 | DECLARE_WRITE8_MEMBER(sasi_ctrl_w); |
606 | 608 | |
r32440 | r32441 | |
1730 | 1732 | } |
1731 | 1733 | } |
1732 | 1734 | |
| 1735 | READ8_MEMBER( pc9801_state::sasi_data_r ) |
| 1736 | { |
| 1737 | UINT8 data = m_sasi_data_in->read(); |
| 1738 | |
| 1739 | if(m_sasi_ctrl_in->read() & 0x80) |
| 1740 | m_sasibus->write_ack(1); |
| 1741 | return data; |
| 1742 | } |
| 1743 | |
1733 | 1744 | WRITE8_MEMBER( pc9801_state::sasi_data_w ) |
1734 | 1745 | { |
1735 | 1746 | m_sasi_data = data; |
r32440 | r32441 | |
1737 | 1748 | if (m_sasi_data_enable) |
1738 | 1749 | { |
1739 | 1750 | m_sasi_data_out->write(m_sasi_data); |
| 1751 | if(m_sasi_ctrl_in->read() & 0x80) |
| 1752 | m_sasibus->write_ack(1); |
1740 | 1753 | } |
1741 | 1754 | } |
1742 | 1755 | |
r32440 | r32441 | |
1754 | 1767 | { |
1755 | 1768 | m_sasi_data_out->write(0); |
1756 | 1769 | } |
| 1770 | if((m_sasi_ctrl_in->read() & 0x9C) == 0x8C) |
| 1771 | m_pic2->ir1_w(m_sasi_ctrl & 1); |
| 1772 | else |
| 1773 | m_pic2->ir1_w(0); |
1757 | 1774 | } |
1758 | 1775 | |
| 1776 | WRITE_LINE_MEMBER( pc9801_state::write_sasi_req ) |
| 1777 | { |
| 1778 | m_sasi_ctrl_in->write_bit7(state); |
| 1779 | |
| 1780 | if (!state) |
| 1781 | m_sasibus->write_ack(0); |
| 1782 | |
| 1783 | if((m_sasi_ctrl_in->read() & 0x9C) == 0x8C) |
| 1784 | m_pic2->ir1_w(m_sasi_ctrl & 1); |
| 1785 | else |
| 1786 | m_pic2->ir1_w(0); |
| 1787 | |
| 1788 | m_dmac->dreq0_w(!(state && !(m_sasi_ctrl_in->read() & 8) && (m_sasi_ctrl & 2))); |
| 1789 | } |
| 1790 | |
1759 | 1791 | #include "debugger.h" |
1760 | 1792 | |
1761 | 1793 | READ8_MEMBER( pc9801_state::sasi_status_r ) |
r32440 | r32441 | |
1765 | 1797 | if(m_sasi_ctrl & 0x40) // read status |
1766 | 1798 | { |
1767 | 1799 | /* |
1768 | | x--- -.-- REQ |
| 1800 | x--- ---- REQ |
1769 | 1801 | -x-- ---- ACK |
1770 | 1802 | --x- ---- BSY |
1771 | 1803 | ---x ---- MSG |
r32440 | r32441 | |
1782 | 1814 | --xx x--- SASI-1 media type |
1783 | 1815 | ---- -xxx SASI-2 media type |
1784 | 1816 | */ |
1785 | | res |= 7 << 3; // read mediatype SASI-1 |
1786 | | res |= 7; // read mediatype SASI-2 |
| 1817 | //res |= 7 << 3; // read mediatype SASI-1 |
| 1818 | //res |= 7; // read mediatype SASI-2 |
1787 | 1819 | } |
1788 | | |
1789 | 1820 | return res; |
1790 | 1821 | } |
1791 | 1822 | |
r32440 | r32441 | |
1839 | 1870 | // AM_RANGE(0x006c, 0x006f) border color / <undefined> |
1840 | 1871 | AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r,pc9801_70_w,0xffff) //display registers / i8253 pit |
1841 | 1872 | // AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r,pc9801_sasi_w,0xffff) //HDD SASI interface / <undefined> |
1842 | | AM_RANGE(0x0080, 0x0081) AM_DEVREAD8("sasi_data_in", input_buffer_device, read, 0x00ff) AM_WRITE8(sasi_data_w, 0x00ff) |
| 1873 | AM_RANGE(0x0080, 0x0081) AM_READWRITE8(sasi_data_r, sasi_data_w, 0x00ff) |
1843 | 1874 | AM_RANGE(0x0082, 0x0083) AM_READWRITE8(sasi_status_r, sasi_ctrl_w,0x00ff) |
1844 | 1875 | AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801_fdc_2hd_r,pc9801_fdc_2hd_w,0xffff) //upd765a 2hd / cmt |
1845 | 1876 | AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,pc9801_a0_w,0xffff) //upd7220 bitmap ports / display registers |
r32440 | r32441 | |
3542 | 3573 | MCFG_SCSI_MSG_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit4)) |
3543 | 3574 | MCFG_SCSI_BSY_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit5)) |
3544 | 3575 | MCFG_SCSI_ACK_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit6)) |
3545 | | MCFG_SCSI_REQ_HANDLER(DEVWRITELINE("sasi_ctrl_in", input_buffer_device, write_bit7)) |
| 3576 | MCFG_SCSI_REQ_HANDLER(WRITELINE(pc9801_state, write_sasi_req)) |
3546 | 3577 | |
3547 | | MCFG_SCSIDEV_ADD(SASIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", S1410, SCSI_ID_0) // TODO: correct one, perhaps ttl |
| 3578 | MCFG_SCSIDEV_ADD(SASIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", PC9801_SASI, SCSI_ID_0) |
3548 | 3579 | |
3549 | 3580 | MCFG_SCSI_OUTPUT_LATCH_ADD("sasi_data_out", SASIBUS_TAG) |
3550 | 3581 | MCFG_DEVICE_ADD("sasi_data_in", INPUT_BUFFER, 0) |
3551 | 3582 | MCFG_DEVICE_ADD("sasi_ctrl_in", INPUT_BUFFER, 0) |
| 3583 | |
| 3584 | MCFG_DEVICE_MODIFY("i8237") |
| 3585 | MCFG_I8237_IN_IOR_0_CB(READ8(pc9801_state, sasi_data_r)) |
| 3586 | MCFG_I8237_OUT_IOW_0_CB(WRITE8(pc9801_state, sasi_data_w)) |
3552 | 3587 | MACHINE_CONFIG_END |
3553 | 3588 | |
3554 | 3589 | |