trunk/src/mame/drivers/fruitpc.c
r22878 | r22879 | |
12 | 12 | |
13 | 13 | #include "emu.h" |
14 | 14 | #include "cpu/i386/i386.h" |
15 | | #include "machine/8237dma.h" |
| 15 | #include "machine/am9517a.h" |
16 | 16 | #include "machine/pic8259.h" |
17 | 17 | #include "machine/pit8253.h" |
18 | 18 | #include "machine/mc146818.h" |
r22878 | r22879 | |
28 | 28 | public: |
29 | 29 | fruitpc_state(const machine_config &mconfig, device_type type, const char *tag) |
30 | 30 | : driver_device(mconfig, type, tag), |
31 | | m_maincpu(*this, "maincpu") |
| 31 | m_pit8254(*this,"pit8254"), |
| 32 | m_pic8259_1(*this,"pic8259_1"), |
| 33 | m_pic8259_2(*this,"pic8259_2"), |
| 34 | m_dma8237_1(*this,"dma8237_1") , |
| 35 | m_dma8237_2(*this,"dma8237_2") , |
| 36 | m_maincpu(*this, "maincpu"), |
| 37 | m_ide(*this, "ide"), |
| 38 | m_inp1(*this, "INP1"), |
| 39 | m_inp2(*this, "INP2"), |
| 40 | m_inp3(*this, "INP3"), |
| 41 | m_inp4(*this, "INP4") |
32 | 42 | { } |
33 | 43 | |
34 | 44 | int m_dma_channel; |
35 | 45 | UINT8 m_dma_offset[2][4]; |
36 | 46 | UINT8 m_at_pages[0x10]; |
37 | 47 | |
38 | | device_t *m_pit8254; |
39 | | pic8259_device *m_pic8259_1; |
40 | | pic8259_device *m_pic8259_2; |
41 | | i8237_device *m_dma8237_1; |
42 | | i8237_device *m_dma8237_2; |
| 48 | required_device<pit8254_device> m_pit8254; |
| 49 | required_device<pic8259_device> m_pic8259_1; |
| 50 | required_device<pic8259_device> m_pic8259_2; |
| 51 | required_device<am9517a_device> m_dma8237_1; |
| 52 | required_device<am9517a_device> m_dma8237_2; |
| 53 | required_device<cpu_device> m_maincpu; |
| 54 | required_device<ide_controller_device> m_ide; |
43 | 55 | |
44 | | required_device<cpu_device> m_maincpu; |
| 56 | required_ioport m_inp1; |
| 57 | required_ioport m_inp2; |
| 58 | required_ioport m_inp3; |
| 59 | required_ioport m_inp4; |
| 60 | |
45 | 61 | DECLARE_READ8_MEMBER(at_page8_r); |
46 | 62 | DECLARE_WRITE8_MEMBER(at_page8_w); |
47 | 63 | DECLARE_READ8_MEMBER(pc_dma_read_byte); |
r22878 | r22879 | |
61 | 77 | DECLARE_READ8_MEMBER(get_slave_ack); |
62 | 78 | DECLARE_DRIVER_INIT(fruitpc); |
63 | 79 | DECLARE_READ8_MEMBER(get_out2); |
| 80 | DECLARE_READ8_MEMBER(fruit_inp_r); |
64 | 81 | virtual void machine_start(); |
65 | 82 | virtual void machine_reset(); |
66 | 83 | IRQ_CALLBACK_MEMBER(irq_callback); |
r22878 | r22879 | |
71 | 88 | |
72 | 89 | READ8_MEMBER(fruitpc_state::at_dma8237_2_r) |
73 | 90 | { |
74 | | return m_dma8237_2->i8237_r(space, offset / 2); |
| 91 | return m_dma8237_2->read(space, offset / 2); |
75 | 92 | } |
76 | 93 | |
77 | 94 | WRITE8_MEMBER(fruitpc_state::at_dma8237_2_w) |
78 | 95 | { |
79 | | m_dma8237_2->i8237_w(space, offset / 2, data); |
| 96 | m_dma8237_2->write(space, offset / 2, data); |
80 | 97 | } |
81 | 98 | |
82 | 99 | READ8_MEMBER(fruitpc_state::at_page8_r) |
r22878 | r22879 | |
127 | 144 | m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); |
128 | 145 | |
129 | 146 | /* Assert HLDA */ |
130 | | m_dma8237_1->i8237_hlda_w(state); |
| 147 | m_dma8237_1->hack_w(state); |
131 | 148 | } |
132 | 149 | |
133 | 150 | |
r22878 | r22879 | |
183 | 200 | |
184 | 201 | READ32_MEMBER(fruitpc_state::ide_r) |
185 | 202 | { |
186 | | device_t *device = machine().device("ide"); |
187 | | return ide_controller32_r(device, space, 0x1f0/4 + offset, mem_mask); |
| 203 | return ide_controller32_r(m_ide, space, 0x1f0/4 + offset, mem_mask); |
188 | 204 | } |
189 | 205 | |
190 | 206 | WRITE32_MEMBER(fruitpc_state::ide_w) |
191 | 207 | { |
192 | | device_t *device = machine().device("ide"); |
193 | | ide_controller32_w(device, space, 0x1f0/4 + offset, data, mem_mask); |
| 208 | ide_controller32_w(m_ide, space, 0x1f0/4 + offset, data, mem_mask); |
194 | 209 | } |
195 | 210 | |
196 | 211 | READ32_MEMBER(fruitpc_state::fdc_r) |
197 | 212 | { |
198 | | device_t *device = machine().device("ide"); |
199 | | return ide_controller32_r(device, space, 0x3f0/4 + offset, mem_mask); |
| 213 | return ide_controller32_r(m_ide, space, 0x3f0/4 + offset, mem_mask); |
200 | 214 | } |
201 | 215 | |
202 | 216 | WRITE32_MEMBER(fruitpc_state::fdc_w) |
203 | 217 | { |
204 | | device_t *device = machine().device("ide"); |
205 | 218 | //mame_printf_debug("FDC: write %08X, %08X, %08X\n", data, offset, mem_mask); |
206 | | ide_controller32_w(device, space, 0x3f0/4 + offset, data, mem_mask); |
| 219 | ide_controller32_w(m_ide, space, 0x3f0/4 + offset, data, mem_mask); |
207 | 220 | } |
208 | 221 | |
| 222 | READ8_MEMBER(fruitpc_state::fruit_inp_r) |
| 223 | { |
| 224 | switch(offset) |
| 225 | { |
| 226 | case 0: |
| 227 | return m_inp1->read(); |
| 228 | case 1: |
| 229 | return m_inp2->read(); |
| 230 | case 2: |
| 231 | return m_inp3->read(); |
| 232 | case 3: |
| 233 | return m_inp4->read(); |
| 234 | } |
| 235 | return 0; |
| 236 | } |
| 237 | |
209 | 238 | static ADDRESS_MAP_START( fruitpc_map, AS_PROGRAM, 32, fruitpc_state ) |
210 | 239 | AM_RANGE(0x00000000, 0x0009ffff) AM_RAM |
211 | 240 | AM_RANGE(0x000a0000, 0x000bffff) AM_DEVREADWRITE8("vga", vga_device, mem_r, mem_w, 0xffffffff) // VGA VRAM |
r22878 | r22879 | |
217 | 246 | ADDRESS_MAP_END |
218 | 247 | |
219 | 248 | static ADDRESS_MAP_START( fruitpc_io, AS_IO, 32, fruitpc_state ) |
220 | | AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("dma8237_1", i8237_device, i8237_r, i8237_w, 0xffffffff) |
| 249 | AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("dma8237_1", am9517a_device, read, write, 0xffffffff) |
221 | 250 | AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8("pic8259_1", pic8259_device, read, write, 0xffffffff) |
222 | 251 | AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, 0xffffffff) |
223 | 252 | AM_RANGE(0x0060, 0x006f) AM_DEVREADWRITE8("kbdc", kbdc8042_device, data_r, data_w, 0xffffffff) |
r22878 | r22879 | |
238 | 267 | AM_RANGE(0x02e0, 0x02ef) AM_NOP //To debug |
239 | 268 | AM_RANGE(0x0278, 0x02ff) AM_NOP //To debug |
240 | 269 | AM_RANGE(0x02f8, 0x02ff) AM_NOP //To debug |
| 270 | AM_RANGE(0x0310, 0x0313) AM_READ8(fruit_inp_r, 0xffffffff) |
241 | 271 | AM_RANGE(0x0320, 0x038f) AM_NOP //To debug |
242 | 272 | AM_RANGE(0x03a0, 0x03a7) AM_NOP //To debug |
243 | 273 | AM_RANGE(0x03b0, 0x03bf) AM_DEVREADWRITE8("vga", vga_device, port_03b0_r, port_03b0_w, 0xffffffff) |
r22878 | r22879 | |
300 | 330 | |
301 | 331 | PORT_START("pc_keyboard_7") |
302 | 332 | |
| 333 | PORT_START("INP1") |
| 334 | PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) |
| 335 | PORT_BIT( 0x00fe, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 336 | PORT_START("INP2") |
| 337 | PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 ) |
| 338 | PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 339 | PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) |
| 340 | PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) |
| 341 | PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) |
| 342 | PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) |
| 343 | PORT_BIT( 0x00c0, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 344 | PORT_START("INP3") |
| 345 | PORT_BIT( 0x0003, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 346 | PORT_DIPNAME( 0x0004, 0x0004, "CONFIGURATION" ) |
| 347 | PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) |
| 348 | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
| 349 | PORT_DIPNAME( 0x0008, 0x0008, "STATISTICHE" ) |
| 350 | PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) |
| 351 | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
| 352 | PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 353 | PORT_START("INP4") |
| 354 | PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 355 | /* |
303 | 356 | PORT_START("IOCARD1") |
304 | 357 | PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) |
305 | 358 | PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) |
r22878 | r22879 | |
438 | 491 | PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) |
439 | 492 | PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) |
440 | 493 | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
| 494 | */ |
441 | 495 | INPUT_PORTS_END |
442 | 496 | #endif |
443 | 497 | |
r22878 | r22879 | |
449 | 503 | void fruitpc_state::machine_start() |
450 | 504 | { |
451 | 505 | m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(fruitpc_state::irq_callback),this)); |
452 | | |
453 | | m_pit8254 = machine().device( "pit8254" ); |
454 | | m_pic8259_1 = machine().device<pic8259_device>( "pic8259_1" ); |
455 | | m_pic8259_2 = machine().device<pic8259_device>( "pic8259_2" ); |
456 | | m_dma8237_1 = machine().device<i8237_device>( "dma8237_1" ); |
457 | | m_dma8237_2 = machine().device<i8237_device>( "dma8237_2" ); |
458 | 506 | } |
459 | 507 | |
460 | 508 | /************************************************************* |
r22878 | r22879 | |
463 | 511 | * |
464 | 512 | *************************************************************/ |
465 | 513 | |
466 | | WRITE_LINE_MEMBER(fruitpc_state::fruitpc_pic8259_1_set_int_line) |
467 | | { |
468 | | m_maincpu->set_input_line(0, state ? HOLD_LINE : CLEAR_LINE); |
469 | | } |
470 | | |
471 | 514 | READ8_MEMBER(fruitpc_state::get_slave_ack) |
472 | 515 | { |
473 | 516 | if (offset==2) { |
r22878 | r22879 | |
531 | 574 | MCFG_PIT8254_ADD( "pit8254", fruitpc_pit8254_config ) |
532 | 575 | MCFG_I8237_ADD( "dma8237_1", XTAL_14_31818MHz/3, dma8237_1_config ) |
533 | 576 | MCFG_I8237_ADD( "dma8237_2", XTAL_14_31818MHz/3, dma8237_2_config ) |
534 | | MCFG_PIC8259_ADD( "pic8259_1", WRITELINE(fruitpc_state,fruitpc_pic8259_1_set_int_line), VCC, READ8(fruitpc_state,get_slave_ack) ) |
| 577 | MCFG_PIC8259_ADD( "pic8259_1", INPUTLINE("maincpu", 0), VCC, READ8(fruitpc_state,get_slave_ack) ) |
535 | 578 | MCFG_PIC8259_ADD( "pic8259_2", DEVWRITELINE("pic8259_1", pic8259_device, ir2_w), GND, NULL ) |
536 | 579 | MCFG_IDE_CONTROLLER_ADD("ide", ide_devices, "hdd", NULL, true) |
537 | 580 | MCFG_IDE_CONTROLLER_IRQ_HANDLER(DEVWRITELINE("pic8259_2", pic8259_device, ir6_w)) |