trunk/src/mess/drivers/pc9801.c
r24762 | r24763 | |
378 | 378 | #include "machine/pc9801_cbus.h" |
379 | 379 | #include "machine/pc9801_kbd.h" |
380 | 380 | |
| 381 | #include "machine/idectrl.h" |
381 | 382 | |
| 383 | |
382 | 384 | #define UPD1990A_TAG "upd1990a" |
383 | 385 | #define UPD8251_TAG "upd8251" |
384 | 386 | #define SASIBUS_TAG "sasi" |
r24762 | r24763 | |
400 | 402 | m_hgdc1(*this, "upd7220_chr"), |
401 | 403 | m_hgdc2(*this, "upd7220_btm"), |
402 | 404 | m_sasibus(*this, SASIBUS_TAG ":host"), |
| 405 | m_ide(*this, "ide"), |
403 | 406 | m_video_ram_1(*this, "video_ram_1"), |
404 | 407 | m_video_ram_2(*this, "video_ram_2"), |
405 | 408 | m_beeper(*this, "beeper"), |
r24762 | r24763 | |
417 | 420 | required_device<upd7220_device> m_hgdc1; |
418 | 421 | required_device<upd7220_device> m_hgdc2; |
419 | 422 | optional_device<scsicb_device> m_sasibus; |
| 423 | optional_device<ide_controller_device> m_ide; |
420 | 424 | required_shared_ptr<UINT8> m_video_ram_1; |
421 | 425 | required_shared_ptr<UINT8> m_video_ram_2; |
422 | 426 | required_device<beep_device> m_beeper; |
r24762 | r24763 | |
582 | 586 | DECLARE_WRITE8_MEMBER(pic_w); |
583 | 587 | |
584 | 588 | DECLARE_READ8_MEMBER(pc9801rs_ide_io_0_r); |
585 | | DECLARE_READ8_MEMBER(pc9801rs_ide_io_1_r); |
586 | | DECLARE_READ8_MEMBER(pc9801rs_ide_io_2_r); |
| 589 | DECLARE_READ16_MEMBER(pc9801rs_ide_io_1_r); |
| 590 | DECLARE_READ16_MEMBER(pc9801rs_ide_io_2_r); |
587 | 591 | DECLARE_WRITE8_MEMBER(pc9801rs_ide_io_0_w); |
588 | | DECLARE_WRITE8_MEMBER(pc9801rs_ide_io_1_w); |
589 | | DECLARE_WRITE8_MEMBER(pc9801rs_ide_io_2_w); |
| 592 | DECLARE_WRITE16_MEMBER(pc9801rs_ide_io_1_w); |
| 593 | DECLARE_WRITE16_MEMBER(pc9801rs_ide_io_2_w); |
590 | 594 | |
591 | 595 | DECLARE_READ8_MEMBER(sdip_0_r); |
592 | 596 | DECLARE_READ8_MEMBER(sdip_1_r); |
r24762 | r24763 | |
2230 | 2234 | |
2231 | 2235 | READ8_MEMBER(pc9801_state::pc9801rs_ide_io_0_r) |
2232 | 2236 | { |
| 2237 | printf("IDE r %02x\n",offset); |
2233 | 2238 | return 0; |
2234 | 2239 | } |
2235 | 2240 | |
2236 | 2241 | WRITE8_MEMBER(pc9801_state::pc9801rs_ide_io_0_w) |
2237 | 2242 | { |
| 2243 | /* |
| 2244 | [0x430] |
| 2245 | [Read/write] |
| 2246 | bit 7-0: unknown |
| 2247 | 00 h = IDE Bank # 1 |
| 2248 | 01 h = IDE Bank # 2 |
| 2249 | |
| 2250 | [0x432] |
| 2251 | bit 7-0: Bank select |
| 2252 | 80 h = readout for dummy (only [WRITE]) |
| 2253 | 00 h = IDE Bank # 1 choice |
| 2254 | 01 h = IDE Bank # 2 selection |
| 2255 | */ |
| 2256 | |
| 2257 | printf("IDE w %02x %02x\n",offset,data); |
| 2258 | |
2238 | 2259 | // ... |
2239 | 2260 | } |
2240 | 2261 | |
2241 | | READ8_MEMBER(pc9801_state::pc9801rs_ide_io_1_r) |
| 2262 | /* TODO: is mapping correct? */ |
| 2263 | READ16_MEMBER(pc9801_state::pc9801rs_ide_io_1_r) |
2242 | 2264 | { |
2243 | | if(offset == 0xe/2) |
2244 | | return 0x50; |
2245 | | |
2246 | | return 0xff; |
| 2265 | return m_ide->read_cs0(space, offset >> 1, offset & 1 ? 0xff00 : 0x00ff); |
2247 | 2266 | } |
2248 | 2267 | |
2249 | | WRITE8_MEMBER(pc9801_state::pc9801rs_ide_io_1_w) |
| 2268 | WRITE16_MEMBER(pc9801_state::pc9801rs_ide_io_1_w) |
2250 | 2269 | { |
2251 | | // ... |
| 2270 | m_ide->write_cs0(space, offset >> 1, offset & 1 ? 0xff00 : 0x00ff); |
2252 | 2271 | } |
2253 | 2272 | |
2254 | | READ8_MEMBER(pc9801_state::pc9801rs_ide_io_2_r) |
| 2273 | READ16_MEMBER(pc9801_state::pc9801rs_ide_io_2_r) |
2255 | 2274 | { |
2256 | | return 0x50; // status |
| 2275 | return m_ide->read_cs1(space, ((offset+6) >> 1), offset & 1 ? 0xff00 : 0x00ff); |
2257 | 2276 | } |
2258 | 2277 | |
2259 | | WRITE8_MEMBER(pc9801_state::pc9801rs_ide_io_2_w) |
| 2278 | WRITE16_MEMBER(pc9801_state::pc9801rs_ide_io_2_w) |
2260 | 2279 | { |
2261 | | // ... |
| 2280 | m_ide->write_cs1(space, ((offset+6) >> 1), offset & 1 ? 0xff00 : 0x00ff); |
2262 | 2281 | } |
2263 | 2282 | |
2264 | 2283 | static ADDRESS_MAP_START( pc9801rs_map, AS_PROGRAM, 32, pc9801_state ) |
r24762 | r24763 | |
2290 | 2309 | AM_RANGE(0x0438, 0x043b) AM_READWRITE8(pc9801rs_access_ctrl_r,pc9801rs_access_ctrl_w,0xffffffff) |
2291 | 2310 | AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w, 0xffffffff) //ROM/RAM bank |
2292 | 2311 | |
2293 | | AM_RANGE(0x0640, 0x064f) AM_READWRITE8(pc9801rs_ide_io_1_r, pc9801rs_ide_io_1_w,0x00ff00ff) |
2294 | | AM_RANGE(0x074c, 0x074f) AM_READWRITE8(pc9801rs_ide_io_2_r, pc9801rs_ide_io_2_w,0x00ff00ff) |
| 2312 | AM_RANGE(0x0640, 0x064f) AM_READWRITE16(pc9801rs_ide_io_1_r, pc9801rs_ide_io_1_w,0xffffffff) |
| 2313 | AM_RANGE(0x074c, 0x074f) AM_READWRITE16(pc9801rs_ide_io_2_r, pc9801rs_ide_io_2_w,0xffffffff) |
2295 | 2314 | |
2296 | 2315 | AM_RANGE(0x3fd8, 0x3fdf) AM_READWRITE8(pc9801rs_pit_mirror_r, pc9801rs_pit_mirror_w, 0xffffffff) // <undefined> / pit mirror ports |
2297 | 2316 | AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r, pc9801_mouse_w, 0xffffffff) // <undefined> / mouse ppi8255 ports |
r24762 | r24763 | |
2662 | 2681 | AM_RANGE(0x0460, 0x0463) AM_READWRITE8(pc9821_window_bank_r,pc9821_window_bank_w, 0xffffffff) |
2663 | 2682 | // AM_RANGE(0x04a0, 0x04af) EGC |
2664 | 2683 | // AM_RANGE(0x04be, 0x04be) FDC "RPM" register |
2665 | | AM_RANGE(0x0640, 0x064f) AM_READWRITE8(pc9801rs_ide_io_1_r, pc9801rs_ide_io_1_w,0x00ff00ff) // IDE registers / <undefined> |
2666 | | AM_RANGE(0x074c, 0x074f) AM_READWRITE8(pc9801rs_ide_io_2_r, pc9801rs_ide_io_2_w,0x00ff00ff) // IDE status (r) - IDE control registers (w) / <undefined> |
| 2684 | AM_RANGE(0x0640, 0x064f) AM_READWRITE16(pc9801rs_ide_io_1_r, pc9801rs_ide_io_1_w,0xffffffff) // IDE registers / <undefined> |
| 2685 | AM_RANGE(0x074c, 0x074f) AM_READWRITE16(pc9801rs_ide_io_2_r, pc9801rs_ide_io_2_w,0xffffffff) // IDE status (r) - IDE control registers (w) / <undefined> |
2667 | 2686 | // AM_RANGE(0x08e0, 0x08ea) <undefined> / EMM SIO registers |
2668 | 2687 | AM_RANGE(0x09a0, 0x09a3) AM_READWRITE8(pc9821_ext2_video_ff_r, pc9821_ext2_video_ff_w, 0xffffffff) // GDC extended register r/w |
2669 | 2688 | // AM_RANGE(0x09a8, 0x09a8) GDC 31KHz register r/w |
r24762 | r24763 | |
2968 | 2987 | |
2969 | 2988 | 8259 slave: |
2970 | 2989 | ir0 printer |
2971 | | ir1 |
| 2990 | ir1 IDE? |
2972 | 2991 | ir2 2dd floppy irq |
2973 | 2992 | ir3 2hd floppy irq |
2974 | 2993 | ir4 opn |
r24762 | r24763 | |
3617 | 3636 | MCFG_SCSICB_IO_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, pc9801_state, sasi_io_w)) |
3618 | 3637 | MACHINE_CONFIG_END |
3619 | 3638 | |
| 3639 | |
| 3640 | static MACHINE_CONFIG_FRAGMENT( pc9801_ide ) |
| 3641 | MCFG_IDE_CONTROLLER_ADD("ide", ata_devices, "hdd", NULL, false) |
| 3642 | MCFG_ATA_INTERFACE_IRQ_HANDLER(DEVWRITELINE("pic8259_slave", pic8259_device, ir1_w)) |
| 3643 | MACHINE_CONFIG_END |
| 3644 | |
| 3645 | |
3620 | 3646 | static MACHINE_CONFIG_START( pc9801, pc9801_state ) |
3621 | 3647 | MCFG_CPU_ADD("maincpu", I8086, 5000000) //unknown clock |
3622 | 3648 | MCFG_CPU_PROGRAM_MAP(pc9801_map) |
r24762 | r24763 | |
3704 | 3730 | MCFG_I8255_ADD( "ppi8255_fdd", ppi_fdd_intf ) |
3705 | 3731 | MCFG_FRAGMENT_ADD(pc9801_keyboard) |
3706 | 3732 | MCFG_FRAGMENT_ADD(pc9801_mouse) |
| 3733 | MCFG_FRAGMENT_ADD(pc9801_ide) |
3707 | 3734 | MCFG_UPD1990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL) |
3708 | 3735 | MCFG_I8251_ADD(UPD8251_TAG, pc9801_uart_interface) |
3709 | 3736 | |
r24762 | r24763 | |
3781 | 3808 | MCFG_I8255_ADD( "ppi8255_fdd", ppi_fdd_intf ) |
3782 | 3809 | MCFG_FRAGMENT_ADD(pc9801_keyboard) |
3783 | 3810 | MCFG_FRAGMENT_ADD(pc9801_mouse) |
| 3811 | MCFG_FRAGMENT_ADD(pc9801_ide) |
3784 | 3812 | MCFG_UPD1990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL) |
3785 | 3813 | MCFG_I8251_ADD(UPD8251_TAG, pc9801_uart_interface) |
3786 | 3814 | |