trunk/src/mess/drivers/pc9801.c
| r19636 | r19637 | |
| 54 | 54 | - Beast (keeps reading command sense) |
| 55 | 55 | - Beast 2 |
| 56 | 56 | - Bells Avenue (disk swap?) |
| 57 | - Bible Master 2 (at new game loading) |
| 58 | - Birdy World |
| 57 | 59 | |
| 58 | 60 | - Bokosuka Wars |
| 59 | 61 | - Dokkin Minako Sensei (2dd image) |
| r19636 | r19637 | |
| 82 | 84 | - Bakasuka Wars: drawing seems busted (either mouse or upd7220) |
| 83 | 85 | - Band-Kun: (how to run this without installing?) |
| 84 | 86 | - Battle Chess: wants some dip-switches to be on in DSW4, too slow during IA thinking? |
| 87 | - Bishoujo Audition: Moans with a "(program) ended. remove the floppy disk and turn off the poewr." |
| 88 | - Bishoujo Hunter ZX: Doesn't color cycle at intro (seems stuck?), doesn't clear text selection at new game screen; |
| 89 | - Bishoujo Shanshinkan: has white rectangles all over the place; |
| 85 | 90 | |
| 86 | 91 | - Dragon Buster: slight issue with window masking; |
| 87 | 92 | - Far Side Moon: doesn't detect sound board (tied to 0x00ec ports) |
| r19636 | r19637 | |
| 318 | 323 | #include "machine/i8251.h" |
| 319 | 324 | #include "sound/beep.h" |
| 320 | 325 | #include "sound/speaker.h" |
| 321 | | #include "sound/2203intf.h" |
| 322 | 326 | #include "sound/2608intf.h" |
| 323 | 327 | #include "video/upd7220.h" |
| 324 | 328 | #include "machine/ram.h" |
| 325 | 329 | #include "formats/pc98fdi_dsk.h" |
| 330 | #include "machine/pc9801_26.h" |
| 331 | #include "machine/pc9801_slot.h" |
| 326 | 332 | |
| 333 | |
| 327 | 334 | #define UPD1990A_TAG "upd1990a" |
| 328 | 335 | #define UPD8251_TAG "upd8251" |
| 329 | 336 | |
| r19636 | r19637 | |
| 340 | 347 | m_sio(*this, UPD8251_TAG), |
| 341 | 348 | m_hgdc1(*this, "upd7220_chr"), |
| 342 | 349 | m_hgdc2(*this, "upd7220_btm"), |
| 343 | | m_opn(*this, "opn"), |
| 350 | // m_opn(*this, "opn"), |
| 344 | 351 | // m_opna(*this, "opna"), |
| 345 | 352 | m_video_ram_1(*this, "video_ram_1"), |
| 346 | 353 | m_video_ram_2(*this, "video_ram_2"){ } |
| r19636 | r19637 | |
| 353 | 360 | required_device<i8251_device> m_sio; |
| 354 | 361 | required_device<upd7220_device> m_hgdc1; |
| 355 | 362 | required_device<upd7220_device> m_hgdc2; |
| 356 | | required_device<ym2203_device> m_opn; |
| 363 | // required_device<ym2203_device> m_opn; |
| 357 | 364 | // optional_device<ym2608_device> m_opna; |
| 358 | 365 | |
| 359 | 366 | required_shared_ptr<UINT8> m_video_ram_1; |
| r19636 | r19637 | |
| 412 | 419 | UINT8 mode; |
| 413 | 420 | UINT8 tile[4], tile_index; |
| 414 | 421 | }m_grcg; |
| 415 | | UINT8 m_has_opna; |
| 416 | 422 | |
| 417 | 423 | /* PC9821 specific */ |
| 418 | 424 | UINT8 m_sdip[24], m_sdip_bank; |
| r19636 | r19637 | |
| 1591 | 1597 | } |
| 1592 | 1598 | |
| 1593 | 1599 | |
| 1594 | | READ8_MEMBER(pc9801_state::pc9801_opn_r) |
| 1595 | | { |
| 1596 | | if((offset & 1) == 0) |
| 1597 | | { |
| 1598 | | //if(m_has_opna) |
| 1599 | | // return ym2608_r(m_opna, space, offset >> 1); |
| 1600 | | |
| 1601 | | return offset & 4 ? 0xff : ym2203_r(m_opn,space, offset >> 1); |
| 1602 | | } |
| 1603 | | else // odd |
| 1604 | | { |
| 1605 | | printf("Read to undefined port [%02x]\n",offset+0x188); |
| 1606 | | return 0xff; |
| 1607 | | } |
| 1608 | | } |
| 1609 | | |
| 1610 | | WRITE8_MEMBER(pc9801_state::pc9801_opn_w) |
| 1611 | | { |
| 1612 | | if((offset & 1) == 0) |
| 1613 | | { |
| 1614 | | /*if(m_has_opna) |
| 1615 | | ym2608_w(m_opna,space, offset >> 1,data); |
| 1616 | | else */ |
| 1617 | | if((offset & 4) == 0) |
| 1618 | | ym2203_w(m_opn,space, offset >> 1,data); |
| 1619 | | } |
| 1620 | | else // odd |
| 1621 | | { |
| 1622 | | printf("Write to undefined port [%02x] %02x\n",offset+0x188,data); |
| 1623 | | } |
| 1624 | | } |
| 1625 | | |
| 1626 | 1600 | READ8_MEMBER(pc9801_state::pc9801_mouse_r) |
| 1627 | 1601 | { |
| 1628 | 1602 | if((offset & 1) == 0) |
| r19636 | r19637 | |
| 1658 | 1632 | |
| 1659 | 1633 | /* first device is even offsets, second one is odd offsets */ |
| 1660 | 1634 | static ADDRESS_MAP_START( pc9801_io, AS_IO, 16, pc9801_state ) |
| 1635 | ADDRESS_MAP_UNMAP_HIGH |
| 1661 | 1636 | AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r,pc9801_00_w,0xffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA |
| 1662 | 1637 | AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r,pc9801_20_w,0xffff) // RTC / DMA registers (LS244) |
| 1663 | 1638 | AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801_30_r,pc9801_30_w,0xffff) //i8251 RS232c / i8255 system port |
| r19636 | r19637 | |
| 1672 | 1647 | AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801_fdc_2hd_r,pc9801_fdc_2hd_w,0xffff) //upd765a 2hd / cmt |
| 1673 | 1648 | AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,pc9801_a0_w,0xffff) //upd7220 bitmap ports / display registers |
| 1674 | 1649 | AM_RANGE(0x00c8, 0x00cd) AM_READWRITE8(pc9801_fdc_2dd_r,pc9801_fdc_2dd_w,0xffff) //upd765a 2dd / <undefined> |
| 1675 | | AM_RANGE(0x0188, 0x018b) AM_READWRITE8(pc9801_opn_r,pc9801_opn_w,0xffff) //ym2203 opn / <undefined> |
| 1650 | // AM_RANGE(0x0188, 0x018b) AM_READWRITE8(pc9801_opn_r,pc9801_opn_w,0xffff) //ym2203 opn / <undefined> |
| 1676 | 1651 | AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r,pc9801_mouse_w,0xffff) // <undefined> / mouse ppi8255 ports |
| 1677 | 1652 | ADDRESS_MAP_END |
| 1678 | 1653 | |
| r19636 | r19637 | |
| 2097 | 2072 | ADDRESS_MAP_END |
| 2098 | 2073 | |
| 2099 | 2074 | static ADDRESS_MAP_START( pc9801rs_io, AS_IO, 32, pc9801_state ) |
| 2075 | ADDRESS_MAP_UNMAP_HIGH |
| 2100 | 2076 | AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r, pc9801_00_w, 0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA |
| 2101 | 2077 | AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r, pc9801_20_w, 0xffffffff) // RTC / DMA registers (LS244) |
| 2102 | 2078 | AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r, pc9801_30_w, 0xffffffff) //i8251 RS232c / i8255 system port |
| r19636 | r19637 | |
| 2114 | 2090 | AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffffffff) |
| 2115 | 2091 | // AM_RANGE(0x00ec, 0x00ef) PC-9801-86 sound board |
| 2116 | 2092 | AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r, pc9801rs_f0_w, 0xffffffff) |
| 2117 | | AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r, pc9801_opn_w, 0xffffffff) //ym2203 opn / <undefined> |
| 2093 | // AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r, pc9801_opn_w, 0xffffffff) //ym2203 opn / <undefined> |
| 2118 | 2094 | AM_RANGE(0x0438, 0x043b) AM_READWRITE8(pc9801rs_access_ctrl_r,pc9801rs_access_ctrl_w,0xffffffff) |
| 2119 | 2095 | AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w, 0xffffffff) //ROM/RAM bank |
| 2120 | 2096 | AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r, pc9801_mouse_w, 0xffffffff) // <undefined> / mouse ppi8255 ports |
| r19636 | r19637 | |
| 2162 | 2138 | ADDRESS_MAP_END |
| 2163 | 2139 | |
| 2164 | 2140 | static ADDRESS_MAP_START( pc9801ux_io, AS_IO, 16, pc9801_state ) |
| 2141 | ADDRESS_MAP_UNMAP_HIGH |
| 2165 | 2142 | AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r, pc9801_00_w, 0xffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA |
| 2166 | 2143 | AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r, pc9801_20_w, 0xffff) // RTC / DMA registers (LS244) |
| 2167 | 2144 | AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r, pc9801_30_w, 0xffff) //i8251 RS232c / i8255 system port |
| r19636 | r19637 | |
| 2176 | 2153 | AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffff) |
| 2177 | 2154 | AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffff) |
| 2178 | 2155 | AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r, pc9801rs_f0_w, 0xffff) |
| 2179 | | AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r, pc9801_opn_w, 0xffff) //ym2203 opn / <undefined> |
| 2156 | // AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r, pc9801_opn_w, 0xffff) //ym2203 opn / <undefined> |
| 2180 | 2157 | AM_RANGE(0x0438, 0x043b) AM_READWRITE8(pc9801rs_access_ctrl_r,pc9801rs_access_ctrl_w,0xffff) |
| 2181 | 2158 | AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w, 0xffff) //ROM/RAM bank |
| 2182 | 2159 | AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r, pc9801_mouse_w, 0xffff) // <undefined> / mouse ppi8255 ports |
| r19636 | r19637 | |
| 2462 | 2439 | ADDRESS_MAP_END |
| 2463 | 2440 | |
| 2464 | 2441 | static ADDRESS_MAP_START( pc9821_io, AS_IO, 32, pc9801_state ) |
| 2442 | ADDRESS_MAP_UNMAP_HIGH |
| 2465 | 2443 | AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r, pc9801_00_w, 0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA |
| 2466 | 2444 | AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r, pc9801_20_w, 0xffffffff) // RTC / DMA registers (LS244) |
| 2467 | 2445 | AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r, pc9801_30_w, 0xffffffff) //i8251 RS232c / i8255 system port |
| r19636 | r19637 | |
| 2482 | 2460 | AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffffffff) |
| 2483 | 2461 | // AM_RANGE(0x00d8, 0x00df) AMD98 (sound?) board |
| 2484 | 2462 | AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r, pc9801rs_f0_w, 0xffffffff) |
| 2485 | | AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r, pc9801_opn_w, 0xffffffff) //ym2203 opn / <undefined> |
| 2463 | // AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r, pc9801_opn_w, 0xffffffff) //ym2203 opn / <undefined> |
| 2486 | 2464 | // AM_RANGE(0x018c, 0x018f) YM2203 OPN extended ports / <undefined> |
| 2487 | 2465 | // AM_RANGE(0x0430, 0x0430) IDE bank register |
| 2488 | 2466 | // AM_RANGE(0x0432, 0x0432) IDE bank register (mirror) |
| r19636 | r19637 | |
| 2866 | 2844 | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 2867 | 2845 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 2868 | 2846 | |
| 2869 | | PORT_START("OPN_PA1") |
| 2870 | | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) |
| 2871 | | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) |
| 2872 | | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) |
| 2873 | | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) |
| 2874 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Joystick Button 1") |
| 2875 | | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Joystick Button 2") |
| 2876 | | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 2877 | | |
| 2878 | | PORT_START("OPN_PA2") |
| 2879 | | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) |
| 2880 | | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) |
| 2881 | | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) |
| 2882 | | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) |
| 2883 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Joystick Button 1") |
| 2884 | | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Joystick Button 2") |
| 2885 | | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 2886 | | |
| 2887 | 2847 | PORT_START("MOUSE_X") |
| 2888 | 2848 | PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_RESET PORT_SENSITIVITY(30) PORT_KEYDELTA(30) |
| 2889 | 2849 | |
| r19636 | r19637 | |
| 3338 | 3298 | SLOT_INTERFACE( "525hd", FLOPPY_525_HD ) |
| 3339 | 3299 | SLOT_INTERFACE_END |
| 3340 | 3300 | |
| 3301 | static SLOT_INTERFACE_START( pc9801_sound ) |
| 3302 | // PC-9801-14 |
| 3303 | SLOT_INTERFACE( "pc9801_26", PC9801_26 ) |
| 3304 | // PC-9801-86 |
| 3305 | // PC-9801-26 + PC-9801-86 (?) |
| 3306 | // PC-9801-86 + Chibi-Oto |
| 3307 | // PC-9801-118 |
| 3308 | // Speak Board |
| 3309 | // Spark Board |
| 3310 | // AMD-98 (AmuseMent boarD) |
| 3311 | SLOT_INTERFACE_END |
| 3312 | |
| 3313 | // Jast Sound, could be put independently |
| 3314 | |
| 3341 | 3315 | void pc9801_state::fdc_2hd_irq(bool state) |
| 3342 | 3316 | { |
| 3343 | 3317 | // printf("IRQ 2HD %d\n",state); |
| r19636 | r19637 | |
| 3593 | 3567 | // pic8259_ir2_w(machine().device("pic8259_master"), 0); |
| 3594 | 3568 | } |
| 3595 | 3569 | |
| 3596 | | static void pc9801_sound_irq( device_t *device, int irq ) |
| 3597 | | { |
| 3598 | | // pc9801_state *state = device->machine().driver_data<pc9801_state>(); |
| 3599 | | |
| 3600 | | /* TODO: seems to die very often */ |
| 3601 | | pic8259_ir4_w(device->machine().device("pic8259_slave"), irq); |
| 3602 | | } |
| 3603 | | |
| 3604 | | READ8_MEMBER(pc9801_state::opn_porta_r) |
| 3605 | | { |
| 3606 | | if(m_joy_sel == 0x80) |
| 3607 | | return machine().root_device().ioport("OPN_PA1")->read(); |
| 3608 | | |
| 3609 | | if(m_joy_sel == 0xc0) |
| 3610 | | return machine().root_device().ioport("OPN_PA2")->read(); |
| 3611 | | |
| 3612 | | // 0x81? |
| 3613 | | // printf("%02x\n",m_joy_sel); |
| 3614 | | return 0xff; |
| 3615 | | } |
| 3616 | | |
| 3617 | | WRITE8_MEMBER(pc9801_state::opn_portb_w){ m_joy_sel = data; } |
| 3618 | | |
| 3619 | | |
| 3620 | | static const ym2203_interface pc98_ym2203_intf = |
| 3621 | | { |
| 3622 | | { |
| 3623 | | AY8910_LEGACY_OUTPUT, |
| 3624 | | AY8910_DEFAULT_LOADS, |
| 3625 | | DEVCB_DRIVER_MEMBER(pc9801_state,opn_porta_r), |
| 3626 | | DEVCB_NULL,//(pc9801_state,opn_portb_r), |
| 3627 | | DEVCB_NULL,//(pc9801_state,opn_porta_w), |
| 3628 | | DEVCB_DRIVER_MEMBER(pc9801_state,opn_portb_w), |
| 3629 | | }, |
| 3630 | | DEVCB_LINE(pc9801_sound_irq) |
| 3631 | | }; |
| 3632 | | |
| 3633 | 3570 | #if 0 |
| 3634 | 3571 | static const ym2608_interface pc98_ym2608_intf = |
| 3635 | 3572 | { |
| r19636 | r19637 | |
| 3702 | 3639 | |
| 3703 | 3640 | MCFG_SOFTWARE_LIST_ADD("disk_list","pc98") |
| 3704 | 3641 | |
| 3642 | MCFG_PC9801BUS_SLOT_ADD("sound_bus", pc9801_sound, NULL, NULL) |
| 3643 | |
| 3705 | 3644 | #if 0 |
| 3706 | 3645 | MCFG_RAM_ADD(RAM_TAG) |
| 3707 | 3646 | MCFG_RAM_DEFAULT_SIZE("128K") |
| r19636 | r19637 | |
| 3725 | 3664 | |
| 3726 | 3665 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 3727 | 3666 | |
| 3728 | | MCFG_SOUND_ADD("opn", YM2203, MAIN_CLOCK_X1*2) // unknown clock / divider |
| 3729 | | MCFG_SOUND_CONFIG(pc98_ym2203_intf) |
| 3730 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 3731 | | |
| 3732 | 3667 | MCFG_SOUND_ADD(BEEPER_TAG, BEEP, 0) |
| 3733 | 3668 | MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.15) |
| 3734 | 3669 | MACHINE_CONFIG_END |
| r19636 | r19637 | |
| 3767 | 3702 | MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:0", pc9801_floppies, "525hd", 0, pc9801_state::floppy_formats) |
| 3768 | 3703 | MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:1", pc9801_floppies, "525hd", 0, pc9801_state::floppy_formats) |
| 3769 | 3704 | |
| 3705 | MCFG_PC9801BUS_SLOT_ADD("sound_bus", pc9801_sound, NULL, NULL) |
| 3706 | |
| 3770 | 3707 | MCFG_RAM_ADD(RAM_TAG) |
| 3771 | 3708 | MCFG_RAM_DEFAULT_SIZE("1664K") |
| 3772 | 3709 | MCFG_RAM_EXTRA_OPTIONS("640K,3712K,7808K") |
| r19636 | r19637 | |
| 3787 | 3724 | |
| 3788 | 3725 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 3789 | 3726 | |
| 3790 | | MCFG_SOUND_ADD("opn", YM2203, MAIN_CLOCK_X1*2) // unknown clock / divider |
| 3791 | | MCFG_SOUND_CONFIG(pc98_ym2203_intf) |
| 3792 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 3793 | | |
| 3794 | 3727 | // MCFG_SOUND_ADD("opna", YM2608, MAIN_CLOCK_X1*4) // unknown clock / divider |
| 3795 | 3728 | // MCFG_SOUND_CONFIG(pc98_ym2608_intf) |
| 3796 | 3729 | // MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| r19636 | r19637 | |
| 3834 | 3767 | MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:0", pc9801_floppies, "525hd", 0, pc9801_state::floppy_formats) |
| 3835 | 3768 | MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:1", pc9801_floppies, "525hd", 0, pc9801_state::floppy_formats) |
| 3836 | 3769 | |
| 3770 | MCFG_PC9801BUS_SLOT_ADD("sound_bus", pc9801_sound, NULL, NULL) |
| 3771 | |
| 3837 | 3772 | MCFG_RAM_ADD(RAM_TAG) |
| 3838 | 3773 | MCFG_RAM_DEFAULT_SIZE("1664K") |
| 3839 | 3774 | MCFG_RAM_EXTRA_OPTIONS("3712K,7808K") |
| r19636 | r19637 | |
| 3854 | 3789 | |
| 3855 | 3790 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 3856 | 3791 | |
| 3857 | | MCFG_SOUND_ADD("opn", YM2203, MAIN_CLOCK_X1*2) // unknown clock / divider |
| 3858 | | MCFG_SOUND_CONFIG(pc98_ym2203_intf) |
| 3859 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 3860 | | |
| 3861 | 3792 | // MCFG_SOUND_ADD("opna", YM2608, MAIN_CLOCK_X1*4) // unknown clock / divider |
| 3862 | 3793 | // MCFG_SOUND_CONFIG(pc98_ym2608_intf) |
| 3863 | 3794 | // MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
trunk/src/mess/machine/pc9801_26.c
| r0 | r19637 | |
| 1 | /*************************************************************************** |
| 2 | |
| 3 | NEC PC-9801-26 sound card |
| 4 | |
| 5 | The legacy sound card, composed by a single YM2203 |
| 6 | |
| 7 | ***************************************************************************/ |
| 8 | |
| 9 | #include "emu.h" |
| 10 | #include "machine/pc9801_26.h" |
| 11 | #include "machine/pic8259.h" |
| 12 | #include "sound/2203intf.h" |
| 13 | |
| 14 | #define MAIN_CLOCK_X1 XTAL_1_9968MHz |
| 15 | |
| 16 | //************************************************************************** |
| 17 | // GLOBAL VARIABLES |
| 18 | //************************************************************************** |
| 19 | |
| 20 | // device type definition |
| 21 | const device_type PC9801_26 = &device_creator<pc9801_26_device>; |
| 22 | |
| 23 | |
| 24 | READ8_MEMBER(pc9801_26_device::opn_porta_r) |
| 25 | { |
| 26 | if(m_joy_sel == 0x80) |
| 27 | return ioport("OPN_PA1")->read(); |
| 28 | |
| 29 | if(m_joy_sel == 0xc0) |
| 30 | return ioport("OPN_PA2")->read(); |
| 31 | |
| 32 | // 0x81? |
| 33 | // printf("%02x\n",m_joy_sel); |
| 34 | return 0xff; |
| 35 | } |
| 36 | |
| 37 | WRITE8_MEMBER(pc9801_26_device::opn_portb_w){ m_joy_sel = data; } |
| 38 | |
| 39 | static void pc9801_sound_irq( device_t *device, int irq ) |
| 40 | { |
| 41 | // pc9801_state *state = device->machine().driver_data<pc9801_state>(); |
| 42 | |
| 43 | /* TODO: seems to die very often */ |
| 44 | pic8259_ir4_w(device->machine().device("pic8259_slave"), irq); |
| 45 | } |
| 46 | |
| 47 | static const ym2203_interface pc98_ym2203_intf = |
| 48 | { |
| 49 | { |
| 50 | AY8910_LEGACY_OUTPUT, |
| 51 | AY8910_DEFAULT_LOADS, |
| 52 | DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pc9801_26_device,opn_porta_r), |
| 53 | DEVCB_NULL,//(pc9801_state,opn_portb_r), |
| 54 | DEVCB_NULL,//(pc9801_state,opn_porta_w), |
| 55 | DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pc9801_26_device,opn_portb_w), |
| 56 | }, |
| 57 | DEVCB_LINE(pc9801_sound_irq) |
| 58 | }; |
| 59 | |
| 60 | static MACHINE_CONFIG_FRAGMENT( pc9801_26_config ) |
| 61 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 62 | MCFG_SOUND_ADD("opn", YM2203, MAIN_CLOCK_X1*2) // unknown clock / divider |
| 63 | MCFG_SOUND_CONFIG(pc98_ym2203_intf) |
| 64 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 65 | MACHINE_CONFIG_END |
| 66 | |
| 67 | //------------------------------------------------- |
| 68 | // machine_config_additions - device-specific |
| 69 | // machine configurations |
| 70 | //------------------------------------------------- |
| 71 | |
| 72 | machine_config_constructor pc9801_26_device::device_mconfig_additions() const |
| 73 | { |
| 74 | return MACHINE_CONFIG_NAME( pc9801_26_config ); |
| 75 | } |
| 76 | |
| 77 | |
| 78 | //------------------------------------------------- |
| 79 | // input_ports - device-specific input ports |
| 80 | //------------------------------------------------- |
| 81 | |
| 82 | static INPUT_PORTS_START( pc9801_26 ) |
| 83 | PORT_START("OPN_PA1") |
| 84 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("P1 Joystick Up") |
| 85 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("P1 Joystick Down") |
| 86 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("P1 Joystick Left") |
| 87 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("P1 Joystick Right") |
| 88 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Joystick Button 1") |
| 89 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Joystick Button 2") |
| 90 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 91 | |
| 92 | PORT_START("OPN_PA2") |
| 93 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) PORT_NAME("P2 Joystick Up") |
| 94 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) PORT_NAME("P2 Joystick Down") |
| 95 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) PORT_NAME("P2 Joystick Left") |
| 96 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) PORT_NAME("P2 Joystick Right") |
| 97 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Joystick Button 1") |
| 98 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Joystick Button 2") |
| 99 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 100 | INPUT_PORTS_END |
| 101 | |
| 102 | ioport_constructor pc9801_26_device::device_input_ports() const |
| 103 | { |
| 104 | return INPUT_PORTS_NAME( pc9801_26 ); |
| 105 | } |
| 106 | |
| 107 | //************************************************************************** |
| 108 | // LIVE DEVICE |
| 109 | //************************************************************************** |
| 110 | |
| 111 | //------------------------------------------------- |
| 112 | // pc9801_26_device - constructor |
| 113 | //------------------------------------------------- |
| 114 | |
| 115 | pc9801_26_device::pc9801_26_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 116 | : device_t(mconfig, PC9801_26, "pc9801_26", tag, owner, clock), |
| 117 | // m_maincpu(*owner, "maincpu"), |
| 118 | m_opn(*this, "opn") |
| 119 | { |
| 120 | |
| 121 | } |
| 122 | |
| 123 | |
| 124 | //------------------------------------------------- |
| 125 | // device_validity_check - perform validity checks |
| 126 | // on this device |
| 127 | //------------------------------------------------- |
| 128 | |
| 129 | void pc9801_26_device::device_validity_check(validity_checker &valid) const |
| 130 | { |
| 131 | } |
| 132 | |
| 133 | //------------------------------------------------- |
| 134 | // device_start - device-specific startup |
| 135 | //------------------------------------------------- |
| 136 | |
| 137 | void pc9801_26_device::install_device(offs_t start, offs_t end, offs_t mask, offs_t mirror, read8_delegate rhandler, write8_delegate whandler) |
| 138 | { |
| 139 | int buswidth = machine().firstcpu->space_config(AS_IO)->m_databus_width; |
| 140 | switch(buswidth) |
| 141 | { |
| 142 | case 8: |
| 143 | machine().firstcpu->space(AS_IO).install_readwrite_handler(start, end, mask, mirror, rhandler, whandler, 0); |
| 144 | break; |
| 145 | case 16: |
| 146 | machine().firstcpu->space(AS_IO).install_readwrite_handler(start, end, mask, mirror, rhandler, whandler, 0xffff); |
| 147 | break; |
| 148 | case 32: |
| 149 | machine().firstcpu->space(AS_IO).install_readwrite_handler(start, end, mask, mirror, rhandler, whandler, 0xffffffff); |
| 150 | break; |
| 151 | default: |
| 152 | fatalerror("IBM5160_MOTHERBOARD: Bus width %d not supported\n", buswidth); |
| 153 | break; |
| 154 | } |
| 155 | } |
| 156 | |
| 157 | |
| 158 | void pc9801_26_device::device_start() |
| 159 | { |
| 160 | install_device(0x0188, 0x018b, 0, 0, read8_delegate(FUNC(pc9801_26_device::pc9801_26_r), this), write8_delegate(FUNC(pc9801_26_device::pc9801_26_w), this) ); |
| 161 | } |
| 162 | |
| 163 | |
| 164 | //------------------------------------------------- |
| 165 | // device_reset - device-specific reset |
| 166 | //------------------------------------------------- |
| 167 | |
| 168 | void pc9801_26_device::device_reset() |
| 169 | { |
| 170 | } |
| 171 | |
| 172 | |
| 173 | //************************************************************************** |
| 174 | // READ/WRITE HANDLERS |
| 175 | //************************************************************************** |
| 176 | |
| 177 | |
| 178 | READ8_MEMBER(pc9801_26_device::pc9801_26_r) |
| 179 | { |
| 180 | if((offset & 1) == 0) |
| 181 | { |
| 182 | //if(m_has_opna) |
| 183 | // return ym2608_r(m_opna, space, offset >> 1); |
| 184 | |
| 185 | return offset & 4 ? 0xff : ym2203_r(m_opn,space, offset >> 1); |
| 186 | } |
| 187 | else // odd |
| 188 | { |
| 189 | printf("Read to undefined port [%02x]\n",offset+0x188); |
| 190 | return 0xff; |
| 191 | } |
| 192 | } |
| 193 | |
| 194 | |
| 195 | WRITE8_MEMBER(pc9801_26_device::pc9801_26_w) |
| 196 | { |
| 197 | if((offset & 1) == 0) |
| 198 | { |
| 199 | /*if(m_has_opna) |
| 200 | ym2608_w(m_opna,space, offset >> 1,data); |
| 201 | else */ |
| 202 | if((offset & 4) == 0) |
| 203 | ym2203_w(m_opn,space, offset >> 1,data); |
| 204 | } |
| 205 | else // odd |
| 206 | { |
| 207 | printf("PC9801-26: Write to undefined port [%02x] %02x\n",offset+0x188,data); |
| 208 | } |
| 209 | } |
| | No newline at end of file |