trunk/src/mess/drivers/isbc.c
| r26081 | r26082 | |
| 16 | 16 | #include "cpu/i86/i86.h" |
| 17 | 17 | #include "cpu/i86/i286.h" |
| 18 | 18 | #include "machine/terminal.h" |
| 19 | #include "machine/pic8259.h" |
| 20 | #include "machine/pit8253.h" |
| 21 | #include "machine/i8255.h" |
| 22 | #include "machine/i8251.h" |
| 23 | #include "machine/z80dart.h" |
| 24 | #include "machine/serial.h" |
| 19 | 25 | |
| 20 | | |
| 21 | 26 | class isbc_state : public driver_device |
| 22 | 27 | { |
| 23 | 28 | public: |
| 24 | 29 | isbc_state(const machine_config &mconfig, device_type type, const char *tag) |
| 25 | 30 | : driver_device(mconfig, type, tag), |
| 26 | 31 | m_maincpu(*this, "maincpu"), |
| 27 | | m_terminal(*this, TERMINAL_TAG) |
| 32 | m_terminal(*this, "terminal"), |
| 33 | m_uart8251(*this, "uart8251"), |
| 34 | m_uart8274(*this, "uart8274"), |
| 35 | m_pic_1(*this, "pic_1") |
| 28 | 36 | { } |
| 29 | 37 | |
| 30 | 38 | required_device<cpu_device> m_maincpu; |
| 31 | | required_device<generic_terminal_device> m_terminal; |
| 32 | | DECLARE_READ16_MEMBER(isbc_terminal_status_r); |
| 33 | | DECLARE_READ16_MEMBER(isbc_terminal_r); |
| 34 | | DECLARE_WRITE8_MEMBER(kbd_put); |
| 35 | | UINT8 m_term_data; |
| 36 | | virtual void machine_reset(); |
| 39 | required_device<serial_terminal_device> m_terminal; |
| 40 | optional_device<i8251_device> m_uart8251; |
| 41 | optional_device<i8274_device> m_uart8274; |
| 42 | optional_device<pic8259_device> m_pic_1; |
| 43 | |
| 44 | DECLARE_WRITE_LINE_MEMBER(isbc86_tmr2_w); |
| 45 | DECLARE_WRITE_LINE_MEMBER(isbc286_tmr2_w); |
| 46 | DECLARE_READ8_MEMBER(get_slave_ack); |
| 37 | 47 | }; |
| 38 | 48 | |
| 39 | | |
| 40 | | |
| 41 | | READ16_MEMBER( isbc_state::isbc_terminal_status_r ) |
| 42 | | { |
| 43 | | return (m_term_data) ? 3 : 1; |
| 44 | | } |
| 45 | | |
| 46 | | READ16_MEMBER( isbc_state::isbc_terminal_r ) |
| 47 | | { |
| 48 | | UINT8 ret = m_term_data; |
| 49 | | m_term_data = 0; |
| 50 | | return ret; |
| 51 | | } |
| 52 | | |
| 53 | 49 | static ADDRESS_MAP_START(rpc86_mem, AS_PROGRAM, 16, isbc_state) |
| 54 | 50 | ADDRESS_MAP_UNMAP_HIGH |
| 55 | 51 | AM_RANGE(0x00000, 0x0ffff) AM_RAM |
| r26081 | r26082 | |
| 66 | 62 | AM_RANGE(0xfc000, 0xfffff) AM_ROM AM_REGION("user1",0) |
| 67 | 63 | ADDRESS_MAP_END |
| 68 | 64 | |
| 69 | | static ADDRESS_MAP_START(isbc86_io, AS_IO, 16, isbc_state) |
| 65 | static ADDRESS_MAP_START(isbc_io, AS_IO, 16, isbc_state) |
| 70 | 66 | ADDRESS_MAP_UNMAP_HIGH |
| 71 | | AM_RANGE(0x00d8, 0x00d9) AM_READ(isbc_terminal_r) AM_DEVWRITE8(TERMINAL_TAG, generic_terminal_device, write, 0xff) |
| 72 | | AM_RANGE(0x00da, 0x00db) AM_READ(isbc_terminal_status_r) |
| 67 | AM_RANGE(0x00c0, 0x00c3) AM_DEVREADWRITE8("pic_0", pic8259_device, read, write, 0x00ff) |
| 68 | AM_RANGE(0x00c4, 0x00c7) AM_DEVREADWRITE8("pic_0", pic8259_device, read, write, 0x00ff) |
| 69 | AM_RANGE(0x00c8, 0x00cf) AM_DEVREADWRITE8("ppi", i8255_device, read, write, 0x00ff) |
| 70 | AM_RANGE(0x00d0, 0x00d7) AM_DEVREADWRITE8("pit", pit8253_device, read, write, 0x00ff) |
| 71 | AM_RANGE(0x00d8, 0x00d9) AM_DEVREADWRITE8("uart8251", i8251_device, data_r, data_w, 0x00ff) |
| 72 | AM_RANGE(0x00da, 0x00db) AM_DEVREADWRITE8("uart8251", i8251_device, status_r, control_w, 0x00ff) |
| 73 | AM_RANGE(0x00dc, 0x00dd) AM_DEVREADWRITE8("uart8251", i8251_device, data_r, data_w, 0x00ff) |
| 74 | AM_RANGE(0x00de, 0x00df) AM_DEVREADWRITE8("uart8251", i8251_device, status_r, control_w, 0x00ff) |
| 73 | 75 | ADDRESS_MAP_END |
| 74 | 76 | |
| 77 | static ADDRESS_MAP_START(isbc286_io, AS_IO, 16, isbc_state) |
| 78 | ADDRESS_MAP_UNMAP_HIGH |
| 79 | AM_RANGE(0x00c0, 0x00c3) AM_DEVREADWRITE8("pic_0", pic8259_device, read, write, 0x00ff) |
| 80 | AM_RANGE(0x00c4, 0x00c7) AM_DEVREADWRITE8("pic_1", pic8259_device, read, write, 0x00ff) |
| 81 | AM_RANGE(0x00c8, 0x00cf) AM_DEVREADWRITE8("ppi", i8255_device, read, write, 0x00ff) |
| 82 | AM_RANGE(0x00d0, 0x00d7) AM_DEVREADWRITE8("pit", pit8254_device, read, write, 0x00ff) |
| 83 | AM_RANGE(0x00d8, 0x00df) AM_DEVREADWRITE8("uart8274", i8274_device, cd_ba_r, cd_ba_w, 0x00ff) |
| 84 | ADDRESS_MAP_END |
| 85 | |
| 75 | 86 | static ADDRESS_MAP_START(isbc286_mem, AS_PROGRAM, 16, isbc_state) |
| 76 | 87 | ADDRESS_MAP_UNMAP_HIGH |
| 77 | 88 | AM_RANGE(0x00000, 0xdffff) AM_RAM |
| r26081 | r26082 | |
| 79 | 90 | AM_RANGE(0xfe0000, 0xffffff) AM_ROM AM_REGION("user1",0) |
| 80 | 91 | ADDRESS_MAP_END |
| 81 | 92 | |
| 82 | | static ADDRESS_MAP_START(isbc286_io, AS_IO, 16, isbc_state) |
| 83 | | ADDRESS_MAP_UNMAP_HIGH |
| 84 | | ADDRESS_MAP_END |
| 85 | | |
| 86 | 93 | static ADDRESS_MAP_START(isbc2861_mem, AS_PROGRAM, 16, isbc_state) |
| 87 | 94 | ADDRESS_MAP_UNMAP_HIGH |
| 88 | | AM_RANGE(0x00000, 0xeffff) AM_RAM |
| 95 | AM_RANGE(0x00000, 0xdffff) AM_RAM |
| 89 | 96 | AM_RANGE(0xf0000, 0xfffff) AM_ROM AM_REGION("user1",0) |
| 90 | 97 | AM_RANGE(0xff0000, 0xffffff) AM_ROM AM_REGION("user1",0) |
| 91 | 98 | ADDRESS_MAP_END |
| 92 | 99 | |
| 93 | | static ADDRESS_MAP_START(isbc2861_io, AS_IO, 16, isbc_state) |
| 94 | | ADDRESS_MAP_UNMAP_HIGH |
| 95 | | ADDRESS_MAP_END |
| 96 | | |
| 97 | 100 | /* Input ports */ |
| 98 | 101 | static INPUT_PORTS_START( isbc ) |
| 99 | 102 | INPUT_PORTS_END |
| 100 | 103 | |
| 104 | static DEVICE_INPUT_DEFAULTS_START( isbc86_terminal ) |
| 105 | DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x0f, 0x01 ) // 300 |
| 106 | DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x30, 0x20 ) // 8N2 |
| 107 | DEVICE_INPUT_DEFAULTS_END |
| 101 | 108 | |
| 102 | | void isbc_state::machine_reset() |
| 109 | static DEVICE_INPUT_DEFAULTS_START( isbc286_terminal ) |
| 110 | DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x0f, 0x06 ) // 9600 |
| 111 | DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x30, 0x00 ) // 8N1 |
| 112 | DEVICE_INPUT_DEFAULTS_END |
| 113 | |
| 114 | static const serial_terminal_interface terminal_intf = |
| 103 | 115 | { |
| 104 | | m_term_data = 0; |
| 116 | DEVCB_NULL |
| 117 | }; |
| 118 | |
| 119 | static const struct pit8253_interface isbc86_pit_config = |
| 120 | { |
| 121 | { |
| 122 | { |
| 123 | XTAL_22_1184MHz/18, |
| 124 | DEVCB_NULL, |
| 125 | DEVCB_DEVICE_LINE_MEMBER("pic_0", pic8259_device, ir0_w) |
| 126 | }, { |
| 127 | XTAL_22_1184MHz/18, |
| 128 | DEVCB_NULL, |
| 129 | DEVCB_NULL |
| 130 | }, { |
| 131 | XTAL_22_1184MHz/18, |
| 132 | DEVCB_NULL, |
| 133 | DEVCB_DRIVER_LINE_MEMBER(isbc_state, isbc86_tmr2_w) |
| 134 | } |
| 135 | } |
| 136 | }; |
| 137 | |
| 138 | WRITE_LINE_MEMBER( isbc_state::isbc86_tmr2_w ) |
| 139 | { |
| 140 | m_uart8251->rxc_w(state); |
| 141 | m_uart8251->txc_w(state); |
| 105 | 142 | } |
| 106 | 143 | |
| 107 | | WRITE8_MEMBER( isbc_state::kbd_put ) |
| 144 | static const struct pit8253_interface isbc286_pit_config = |
| 108 | 145 | { |
| 109 | | m_term_data = data; |
| 146 | { |
| 147 | { |
| 148 | XTAL_22_1184MHz/18, |
| 149 | DEVCB_NULL, |
| 150 | DEVCB_DEVICE_LINE_MEMBER("pic_0", pic8259_device, ir0_w) |
| 151 | }, { |
| 152 | XTAL_22_1184MHz/18, |
| 153 | DEVCB_NULL, |
| 154 | DEVCB_DEVICE_LINE_MEMBER("uart8274", z80dart_device, rxtxcb_w) |
| 155 | }, { |
| 156 | XTAL_22_1184MHz/18, |
| 157 | DEVCB_NULL, |
| 158 | DEVCB_DRIVER_LINE_MEMBER(isbc_state, isbc286_tmr2_w) |
| 159 | } |
| 160 | } |
| 161 | }; |
| 162 | |
| 163 | WRITE_LINE_MEMBER( isbc_state::isbc286_tmr2_w ) |
| 164 | { |
| 165 | m_uart8274->rxca_w(state); |
| 166 | m_uart8274->txca_w(state); |
| 110 | 167 | } |
| 111 | 168 | |
| 112 | | static GENERIC_TERMINAL_INTERFACE( terminal_intf ) |
| 169 | static const i8255_interface isbc_ppi_interface = |
| 113 | 170 | { |
| 114 | | DEVCB_DRIVER_MEMBER(isbc_state, kbd_put) |
| 171 | DEVCB_NULL, |
| 172 | DEVCB_NULL, |
| 173 | DEVCB_NULL, |
| 174 | DEVCB_NULL, |
| 175 | DEVCB_NULL, |
| 176 | DEVCB_NULL |
| 115 | 177 | }; |
| 116 | 178 | |
| 179 | static I8274_INTERFACE(isbc_uart8274_interface) |
| 180 | { |
| 181 | 0, 0, 0, 0, |
| 182 | |
| 183 | DEVCB_DEVICE_LINE_MEMBER("rs232", serial_port_device, rx), |
| 184 | DEVCB_DEVICE_LINE_MEMBER("rs232", serial_port_device, tx), |
| 185 | DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, dtr_w), |
| 186 | DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, rts_w), |
| 187 | DEVCB_NULL, |
| 188 | DEVCB_NULL, |
| 189 | |
| 190 | DEVCB_DEVICE_LINE_MEMBER("terminal", serial_terminal_device, tx_r), |
| 191 | DEVCB_DEVICE_LINE_MEMBER("terminal", serial_terminal_device, rx_w), |
| 192 | DEVCB_NULL, |
| 193 | DEVCB_NULL, |
| 194 | DEVCB_NULL, |
| 195 | DEVCB_NULL, |
| 196 | |
| 197 | DEVCB_DEVICE_LINE_MEMBER("pic_0", pic8259_device, ir6_w) |
| 198 | }; |
| 199 | |
| 200 | static const i8251_interface isbc_uart8251_interface = |
| 201 | { |
| 202 | DEVCB_DEVICE_LINE_MEMBER("terminal", serial_terminal_device, tx_r), |
| 203 | DEVCB_DEVICE_LINE_MEMBER("terminal", serial_terminal_device, rx_w), |
| 204 | DEVCB_NULL, |
| 205 | DEVCB_NULL, |
| 206 | DEVCB_NULL, |
| 207 | DEVCB_DEVICE_LINE_MEMBER("pic_0", pic8259_device, ir6_w), |
| 208 | DEVCB_NULL, |
| 209 | DEVCB_NULL, |
| 210 | DEVCB_NULL |
| 211 | }; |
| 212 | |
| 213 | static const rs232_port_interface rs232_intf = |
| 214 | { |
| 215 | DEVCB_NULL, |
| 216 | DEVCB_DEVICE_LINE_MEMBER("uart8274", z80dart_device, dcda_w), |
| 217 | DEVCB_NULL, |
| 218 | DEVCB_NULL, |
| 219 | DEVCB_DEVICE_LINE_MEMBER("uart8274", z80dart_device, ctsa_w) |
| 220 | }; |
| 221 | |
| 222 | READ8_MEMBER( isbc_state::get_slave_ack ) |
| 223 | { |
| 224 | if (offset == 7) |
| 225 | return m_pic_1->inta_r(); |
| 226 | |
| 227 | return 0x00; |
| 228 | } |
| 229 | |
| 117 | 230 | static MACHINE_CONFIG_START( isbc86, isbc_state ) |
| 118 | 231 | /* basic machine hardware */ |
| 119 | | MCFG_CPU_ADD("maincpu", I8086, XTAL_9_8304MHz) |
| 232 | MCFG_CPU_ADD("maincpu", I8086, XTAL_5MHz) |
| 120 | 233 | MCFG_CPU_PROGRAM_MAP(isbc86_mem) |
| 121 | | MCFG_CPU_IO_MAP(isbc86_io) |
| 234 | MCFG_CPU_IO_MAP(isbc_io) |
| 235 | MCFG_PIC8259_ADD("pic_0", INPUTLINE(":maincpu", 0), VCC, NULL) |
| 236 | MCFG_PIT8253_ADD("pit", isbc86_pit_config) |
| 237 | MCFG_I8255A_ADD("ppi", isbc_ppi_interface) |
| 238 | MCFG_I8251_ADD("uart8251", isbc_uart8251_interface) |
| 122 | 239 | |
| 123 | 240 | /* video hardware */ |
| 124 | | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) |
| 241 | MCFG_SERIAL_TERMINAL_ADD("terminal", terminal_intf, 300) |
| 242 | MCFG_DEVICE_INPUT_DEFAULTS(isbc86_terminal) |
| 125 | 243 | MACHINE_CONFIG_END |
| 126 | 244 | |
| 127 | 245 | static MACHINE_CONFIG_START( rpc86, isbc_state ) |
| 128 | 246 | /* basic machine hardware */ |
| 129 | | MCFG_CPU_ADD("maincpu", I8086, XTAL_9_8304MHz) |
| 247 | MCFG_CPU_ADD("maincpu", I8086, XTAL_5MHz) |
| 130 | 248 | MCFG_CPU_PROGRAM_MAP(rpc86_mem) |
| 131 | 249 | MCFG_CPU_IO_MAP(rpc86_io) |
| 132 | 250 | |
| 133 | 251 | /* video hardware */ |
| 134 | | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) |
| 252 | MCFG_SERIAL_TERMINAL_ADD("terminal", terminal_intf, 300) |
| 135 | 253 | MACHINE_CONFIG_END |
| 136 | 254 | |
| 137 | 255 | static MACHINE_CONFIG_START( isbc286, isbc_state ) |
| 138 | 256 | /* basic machine hardware */ |
| 139 | | MCFG_CPU_ADD("maincpu", I80286, XTAL_9_8304MHz) |
| 257 | MCFG_CPU_ADD("maincpu", I80286, XTAL_8MHz) |
| 140 | 258 | MCFG_CPU_PROGRAM_MAP(isbc286_mem) |
| 141 | 259 | MCFG_CPU_IO_MAP(isbc286_io) |
| 260 | MCFG_PIC8259_ADD("pic_0", INPUTLINE(":maincpu", 0), VCC, READ8(isbc_state, get_slave_ack)) |
| 261 | MCFG_PIC8259_ADD("pic_1", DEVWRITELINE("pic_0", pic8259_device, ir7_w), GND, NULL) |
| 262 | MCFG_PIT8254_ADD("pit", isbc286_pit_config) |
| 263 | MCFG_I8255A_ADD("ppi", isbc_ppi_interface) |
| 264 | MCFG_I8274_ADD("uart8274", XTAL_16MHz/4, isbc_uart8274_interface) |
| 265 | MCFG_RS232_PORT_ADD("rs232", rs232_intf, default_rs232_devices, NULL) |
| 142 | 266 | |
| 143 | 267 | /* video hardware */ |
| 144 | | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) |
| 268 | MCFG_SERIAL_TERMINAL_ADD("terminal", terminal_intf, 9600) |
| 269 | MCFG_DEVICE_INPUT_DEFAULTS(isbc286_terminal) |
| 145 | 270 | MACHINE_CONFIG_END |
| 146 | 271 | |
| 147 | | static MACHINE_CONFIG_START( isbc2861, isbc_state ) |
| 148 | | /* basic machine hardware */ |
| 149 | | MCFG_CPU_ADD("maincpu", I80286, XTAL_9_8304MHz) |
| 272 | static MACHINE_CONFIG_DERIVED( isbc2861, isbc286 ) |
| 273 | MCFG_CPU_MODIFY("maincpu") |
| 150 | 274 | MCFG_CPU_PROGRAM_MAP(isbc2861_mem) |
| 151 | | MCFG_CPU_IO_MAP(isbc2861_io) |
| 152 | | |
| 153 | | /* video hardware */ |
| 154 | | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) |
| 155 | 275 | MACHINE_CONFIG_END |
| 156 | 276 | |
| 157 | 277 | /* ROM definition */ |
| r26081 | r26082 | |
| 191 | 311 | |
| 192 | 312 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 193 | 313 | COMP( 19??, rpc86, 0, 0, rpc86, isbc, driver_device, 0, "Intel", "RPC 86",GAME_NOT_WORKING | GAME_NO_SOUND) |
| 194 | | COMP( 19??, isbc86, 0, 0, isbc86, isbc, driver_device, 0, "Intel", "iSBC 86/12A",GAME_NOT_WORKING | GAME_NO_SOUND) |
| 314 | COMP( 1978, isbc86, 0, 0, isbc86, isbc, driver_device, 0, "Intel", "iSBC 86/12A",GAME_NOT_WORKING | GAME_NO_SOUND) |
| 195 | 315 | COMP( 19??, isbc286, 0, 0, isbc286, isbc, driver_device, 0, "Intel", "iSBC 286",GAME_NOT_WORKING | GAME_NO_SOUND) |
| 196 | | COMP( 19??, isbc2861, 0, 0, isbc2861, isbc, driver_device, 0, "Intel", "iSBC 286-10",GAME_NOT_WORKING | GAME_NO_SOUND) |
| 316 | COMP( 1985, isbc2861, 0, 0, isbc2861, isbc, driver_device, 0, "Intel", "iSBC 286-10",GAME_NOT_WORKING | GAME_NO_SOUND) |