trunk/src/mess/drivers/isbc.c
| r26104 | r26105 | |
| 22 | 22 | #include "machine/i8251.h" |
| 23 | 23 | #include "machine/z80dart.h" |
| 24 | 24 | #include "machine/serial.h" |
| 25 | #include "bus/centronics/ctronics.h" |
| 26 | #include "bus/isbx/isbx.h" |
| 25 | 27 | |
| 26 | 28 | class isbc_state : public driver_device |
| 27 | 29 | { |
| r26104 | r26105 | |
| 32 | 34 | m_terminal(*this, "terminal"), |
| 33 | 35 | m_uart8251(*this, "uart8251"), |
| 34 | 36 | m_uart8274(*this, "uart8274"), |
| 35 | | m_pic_1(*this, "pic_1") |
| 37 | m_pic_1(*this, "pic_1"), |
| 38 | m_centronics(*this, "centronics") |
| 36 | 39 | { } |
| 37 | 40 | |
| 38 | 41 | required_device<cpu_device> m_maincpu; |
| r26104 | r26105 | |
| 40 | 43 | optional_device<i8251_device> m_uart8251; |
| 41 | 44 | optional_device<i8274_device> m_uart8274; |
| 42 | 45 | optional_device<pic8259_device> m_pic_1; |
| 46 | optional_device<centronics_device> m_centronics; |
| 43 | 47 | |
| 48 | DECLARE_WRITE_LINE_MEMBER(lpt_ack); |
| 44 | 49 | DECLARE_WRITE_LINE_MEMBER(isbc86_tmr2_w); |
| 45 | 50 | DECLARE_WRITE_LINE_MEMBER(isbc286_tmr2_w); |
| 46 | 51 | DECLARE_READ8_MEMBER(get_slave_ack); |
| 52 | DECLARE_READ8_MEMBER(ppi_b_r); |
| 53 | DECLARE_WRITE8_MEMBER(ppi_c_w); |
| 47 | 54 | }; |
| 48 | 55 | |
| 49 | 56 | static ADDRESS_MAP_START(rpc86_mem, AS_PROGRAM, 16, isbc_state) |
| r26104 | r26105 | |
| 76 | 83 | |
| 77 | 84 | static ADDRESS_MAP_START(isbc286_io, AS_IO, 16, isbc_state) |
| 78 | 85 | ADDRESS_MAP_UNMAP_HIGH |
| 86 | AM_RANGE(0x0080, 0x008f) AM_DEVREADWRITE8("sbx1", isbx_slot_device, mcs0_r, mcs0_w, 0x00ff) |
| 87 | AM_RANGE(0x0080, 0x008f) AM_DEVREADWRITE8("sbx1", isbx_slot_device, mcs0_r, mcs0_w, 0xff00) |
| 88 | AM_RANGE(0x0090, 0x009f) AM_DEVREADWRITE8("sbx1", isbx_slot_device, mcs1_r, mcs1_w, 0x00ff) |
| 89 | AM_RANGE(0x0090, 0x009f) AM_DEVREADWRITE8("sbx1", isbx_slot_device, mcs1_r, mcs1_w, 0xff00) |
| 90 | AM_RANGE(0x00a0, 0x00af) AM_DEVREADWRITE8("sbx2", isbx_slot_device, mcs0_r, mcs0_w, 0x00ff) |
| 91 | AM_RANGE(0x00a0, 0x00af) AM_DEVREADWRITE8("sbx2", isbx_slot_device, mcs0_r, mcs0_w, 0xff00) |
| 92 | AM_RANGE(0x00b0, 0x00bf) AM_DEVREADWRITE8("sbx2", isbx_slot_device, mcs1_r, mcs1_w, 0x00ff) |
| 93 | AM_RANGE(0x00b0, 0x00bf) AM_DEVREADWRITE8("sbx2", isbx_slot_device, mcs1_r, mcs1_w, 0xff00) |
| 79 | 94 | AM_RANGE(0x00c0, 0x00c3) AM_DEVREADWRITE8("pic_0", pic8259_device, read, write, 0x00ff) |
| 80 | 95 | AM_RANGE(0x00c4, 0x00c7) AM_DEVREADWRITE8("pic_1", pic8259_device, read, write, 0x00ff) |
| 81 | 96 | AM_RANGE(0x00c8, 0x00cf) AM_DEVREADWRITE8("ppi", i8255_device, read, write, 0x00ff) |
| r26104 | r26105 | |
| 166 | 181 | m_uart8274->txca_w(state); |
| 167 | 182 | } |
| 168 | 183 | |
| 169 | | static const i8255_interface isbc_ppi_interface = |
| 184 | static const i8255_interface isbc86_ppi_interface = |
| 170 | 185 | { |
| 171 | 186 | DEVCB_NULL, |
| 172 | 187 | DEVCB_NULL, |
| r26104 | r26105 | |
| 176 | 191 | DEVCB_NULL |
| 177 | 192 | }; |
| 178 | 193 | |
| 194 | static const i8255_interface isbc286_ppi_interface = |
| 195 | { |
| 196 | DEVCB_NULL, |
| 197 | DEVCB_DEVICE_MEMBER("centronics", centronics_device, write), |
| 198 | DEVCB_DRIVER_MEMBER(isbc_state, ppi_b_r), |
| 199 | DEVCB_NULL, |
| 200 | DEVCB_NULL, |
| 201 | DEVCB_DRIVER_MEMBER(isbc_state, ppi_c_w), |
| 202 | }; |
| 203 | |
| 204 | READ8_MEMBER( isbc_state::ppi_b_r ) |
| 205 | { |
| 206 | UINT8 data = 0; |
| 207 | data |= m_centronics->ack_r() ? 0x10 : 0; |
| 208 | data |= m_centronics->fault_r() ? 0x40 : 0; |
| 209 | data |= m_centronics->busy_r() ? 0x80 : 0; |
| 210 | return data; |
| 211 | } |
| 212 | |
| 213 | WRITE8_MEMBER( isbc_state::ppi_c_w ) |
| 214 | { |
| 215 | m_centronics->strobe_w(data & 1); |
| 216 | |
| 217 | if(data & 0x80) |
| 218 | m_pic_1->ir7_w(0); |
| 219 | } |
| 220 | |
| 179 | 221 | static I8274_INTERFACE(isbc_uart8274_interface) |
| 180 | 222 | { |
| 181 | 223 | 0, 0, 0, 0, |
| r26104 | r26105 | |
| 227 | 269 | return 0x00; |
| 228 | 270 | } |
| 229 | 271 | |
| 272 | static const centronics_interface isbc_centronics = |
| 273 | { |
| 274 | DEVCB_DRIVER_LINE_MEMBER(isbc_state, lpt_ack), |
| 275 | DEVCB_NULL, |
| 276 | DEVCB_NULL |
| 277 | }; |
| 278 | |
| 279 | WRITE_LINE_MEMBER( isbc_state::lpt_ack ) |
| 280 | { |
| 281 | if(state) |
| 282 | m_pic_1->ir7_w(1); |
| 283 | } |
| 284 | |
| 230 | 285 | static MACHINE_CONFIG_START( isbc86, isbc_state ) |
| 231 | 286 | /* basic machine hardware */ |
| 232 | 287 | MCFG_CPU_ADD("maincpu", I8086, XTAL_5MHz) |
| r26104 | r26105 | |
| 234 | 289 | MCFG_CPU_IO_MAP(isbc_io) |
| 235 | 290 | MCFG_PIC8259_ADD("pic_0", INPUTLINE(":maincpu", 0), VCC, NULL) |
| 236 | 291 | MCFG_PIT8253_ADD("pit", isbc86_pit_config) |
| 237 | | MCFG_I8255A_ADD("ppi", isbc_ppi_interface) |
| 292 | MCFG_I8255A_ADD("ppi", isbc86_ppi_interface) |
| 238 | 293 | MCFG_I8251_ADD("uart8251", isbc_uart8251_interface) |
| 239 | 294 | |
| 240 | 295 | /* video hardware */ |
| r26104 | r26105 | |
| 254 | 309 | |
| 255 | 310 | static MACHINE_CONFIG_START( isbc286, isbc_state ) |
| 256 | 311 | /* basic machine hardware */ |
| 257 | | MCFG_CPU_ADD("maincpu", I80286, XTAL_8MHz) |
| 312 | MCFG_CPU_ADD("maincpu", I80286, XTAL_16MHz/2) |
| 258 | 313 | MCFG_CPU_PROGRAM_MAP(isbc286_mem) |
| 259 | 314 | MCFG_CPU_IO_MAP(isbc286_io) |
| 260 | 315 | MCFG_PIC8259_ADD("pic_0", INPUTLINE(":maincpu", 0), VCC, READ8(isbc_state, get_slave_ack)) |
| 261 | 316 | MCFG_PIC8259_ADD("pic_1", DEVWRITELINE("pic_0", pic8259_device, ir7_w), GND, NULL) |
| 262 | 317 | MCFG_PIT8254_ADD("pit", isbc286_pit_config) |
| 263 | | MCFG_I8255A_ADD("ppi", isbc_ppi_interface) |
| 318 | MCFG_I8255A_ADD("ppi", isbc286_ppi_interface) |
| 319 | MCFG_CENTRONICS_PRINTER_ADD("centronics", isbc_centronics) |
| 264 | 320 | MCFG_I8274_ADD("uart8274", XTAL_16MHz/4, isbc_uart8274_interface) |
| 265 | 321 | MCFG_RS232_PORT_ADD("rs232", rs232_intf, default_rs232_devices, NULL) |
| 266 | 322 | |
| 323 | MCFG_ISBX_SLOT_ADD("sbx1", 0, isbx_cards, "fdc") |
| 324 | MCFG_ISBX_SLOT_MINTR0_CALLBACK(DEVWRITELINE("pic_1", pic8259_device, ir3_w)) |
| 325 | MCFG_ISBX_SLOT_MINTR1_CALLBACK(DEVWRITELINE("pic_1", pic8259_device, ir4_w)) |
| 326 | MCFG_ISBX_SLOT_ADD("sbx2", 0, isbx_cards, NULL) |
| 327 | MCFG_ISBX_SLOT_MINTR0_CALLBACK(DEVWRITELINE("pic_1", pic8259_device, ir5_w)) |
| 328 | MCFG_ISBX_SLOT_MINTR1_CALLBACK(DEVWRITELINE("pic_1", pic8259_device, ir6_w)) |
| 329 | |
| 267 | 330 | /* video hardware */ |
| 268 | 331 | MCFG_SERIAL_TERMINAL_ADD("terminal", terminal_intf, 9600) |
| 269 | 332 | MCFG_DEVICE_INPUT_DEFAULTS(isbc286_terminal) |
| r26104 | r26105 | |
| 313 | 376 | COMP( 19??, rpc86, 0, 0, rpc86, isbc, driver_device, 0, "Intel", "RPC 86",GAME_NOT_WORKING | GAME_NO_SOUND) |
| 314 | 377 | COMP( 1978, isbc86, 0, 0, isbc86, isbc, driver_device, 0, "Intel", "iSBC 86/12A",GAME_NOT_WORKING | GAME_NO_SOUND) |
| 315 | 378 | COMP( 19??, isbc286, 0, 0, isbc286, isbc, driver_device, 0, "Intel", "iSBC 286",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) |
| 379 | COMP( 1983, isbc2861, 0, 0, isbc2861, isbc, driver_device, 0, "Intel", "iSBC 286/10",GAME_NOT_WORKING | GAME_NO_SOUND) |