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 | |