trunk/src/mess/drivers/pc9801.c
| r241759 | r241760 | |
| 591 | 591 | DECLARE_READ8_MEMBER(pc9801_mouse_r); |
| 592 | 592 | DECLARE_WRITE8_MEMBER(pc9801_mouse_w); |
| 593 | 593 | DECLARE_WRITE8_MEMBER(pc9801rs_mouse_freq_w); |
| 594 | | inline UINT8 m_pc9801rs_grcg_r(UINT32 offset,int vbank); |
| 595 | | inline void m_pc9801rs_grcg_w(UINT32 offset,int vbank,UINT8 data); |
| 594 | inline UINT8 m_pc9801rs_grcg_r(UINT32 offset,int vbank,int vrambank); |
| 595 | inline UINT8 m_pc9801rs_grcg_r(UINT32 offset,int vbank) { return m_pc9801rs_grcg_r(offset, vbank, m_vram_bank); } |
| 596 | inline void m_pc9801rs_grcg_w(UINT32 offset,int vbank,int vrambank,UINT8 data); |
| 597 | inline void m_pc9801rs_grcg_w(UINT32 offset,int vbank,UINT8 data) { m_pc9801rs_grcg_w(offset, vbank, m_vram_bank, data); } |
| 596 | 598 | DECLARE_CUSTOM_INPUT_MEMBER(system_type_r); |
| 597 | 599 | DECLARE_READ8_MEMBER(pc9801ux_gvram_r); |
| 598 | 600 | DECLARE_WRITE8_MEMBER(pc9801ux_gvram_w); |
| 599 | 601 | DECLARE_READ8_MEMBER(pc9801ux_gvram0_r); |
| 600 | 602 | DECLARE_WRITE8_MEMBER(pc9801ux_gvram0_w); |
| 603 | DECLARE_READ8_MEMBER(upd7220_grcg_r); |
| 604 | DECLARE_WRITE8_MEMBER(upd7220_grcg_w); |
| 601 | 605 | UINT32 pc9801_286_a20(bool state); |
| 602 | 606 | |
| 603 | 607 | DECLARE_READ8_MEMBER(ide_hack_r); |
| r241759 | r241760 | |
| 750 | 754 | TIMER_DEVICE_CALLBACK_MEMBER( mouse_irq_cb ); |
| 751 | 755 | |
| 752 | 756 | void pc9801_fdc_2hd_update_ready(floppy_image_device *, int); |
| 753 | | inline UINT32 m_calc_grcg_addr(int i,UINT32 offset); |
| 757 | inline UINT32 m_calc_grcg_addr(int i,UINT32 offset,int vrambank); |
| 754 | 758 | |
| 755 | 759 | DECLARE_DRIVER_INIT(pc9801_kanji); |
| 756 | 760 | inline void set_dma_channel(int channel, int state); |
| r241759 | r241760 | |
| 1645 | 1649 | m_video_ram_2[offset+0x08000+m_vram_bank*0x20000] = data; |
| 1646 | 1650 | } |
| 1647 | 1651 | |
| 1648 | | inline UINT32 pc9801_state::m_calc_grcg_addr(int i,UINT32 offset) |
| 1652 | inline UINT32 pc9801_state::m_calc_grcg_addr(int i,UINT32 offset,int vrambank) |
| 1649 | 1653 | { |
| 1650 | | return (offset) + (((i+1)*0x8000) & 0x1ffff) + (m_vram_bank*0x20000); |
| 1654 | return (offset) + (((i+1)*0x8000) & 0x1ffff) + (vrambank*0x20000); |
| 1651 | 1655 | } |
| 1652 | 1656 | |
| 1653 | | inline UINT8 pc9801_state::m_pc9801rs_grcg_r(UINT32 offset,int vbank) |
| 1657 | inline UINT8 pc9801_state::m_pc9801rs_grcg_r(UINT32 offset,int vbank,int vrambank) |
| 1654 | 1658 | { |
| 1655 | | UINT8 res; |
| 1659 | UINT8 res = 0; |
| 1656 | 1660 | |
| 1657 | | if((m_grcg.mode & 0x80) == 0 || (m_grcg.mode & 0x40)) |
| 1658 | | res = m_video_ram_2[offset+vbank*0x8000+m_vram_bank*0x20000]; |
| 1659 | | else |
| 1661 | if(!(m_grcg.mode & 0x80)) |
| 1662 | res = m_video_ram_2[offset+vbank*0x8000+vrambank*0x20000]; |
| 1663 | else if(!(m_grcg.mode & 0x40)) |
| 1660 | 1664 | { |
| 1661 | 1665 | int i; |
| 1662 | 1666 | |
| r241759 | r241760 | |
| 1664 | 1668 | for(i=0;i<4;i++) |
| 1665 | 1669 | { |
| 1666 | 1670 | if((m_grcg.mode & (1 << i)) == 0) |
| 1667 | | res |= (m_video_ram_2[m_calc_grcg_addr(i,offset)] ^ m_grcg.tile[i]); |
| 1671 | res |= (m_video_ram_2[m_calc_grcg_addr(i,offset,vrambank)] ^ m_grcg.tile[i]); |
| 1668 | 1672 | } |
| 1669 | 1673 | |
| 1670 | 1674 | res ^= 0xff; |
| r241759 | r241760 | |
| 1673 | 1677 | return res; |
| 1674 | 1678 | } |
| 1675 | 1679 | |
| 1676 | | inline void pc9801_state::m_pc9801rs_grcg_w(UINT32 offset,int vbank,UINT8 data) |
| 1680 | inline void pc9801_state::m_pc9801rs_grcg_w(UINT32 offset,int vbank,int vrambank,UINT8 data) |
| 1677 | 1681 | { |
| 1678 | 1682 | if((m_grcg.mode & 0x80) == 0) |
| 1679 | | m_video_ram_2[offset+vbank*0x8000+m_vram_bank*0x20000] = data; |
| 1683 | m_video_ram_2[offset+vbank*0x8000+vrambank*0x20000] = data; |
| 1680 | 1684 | else |
| 1681 | 1685 | { |
| 1682 | 1686 | int i; |
| r241759 | r241760 | |
| 1687 | 1691 | { |
| 1688 | 1692 | if((m_grcg.mode & (1 << i)) == 0) |
| 1689 | 1693 | { |
| 1690 | | m_video_ram_2[m_calc_grcg_addr(i,offset)] &= ~data; |
| 1691 | | m_video_ram_2[m_calc_grcg_addr(i,offset)] |= m_grcg.tile[i] & data; |
| 1694 | m_video_ram_2[m_calc_grcg_addr(i,offset,vrambank)] &= ~data; |
| 1695 | m_video_ram_2[m_calc_grcg_addr(i,offset,vrambank)] |= m_grcg.tile[i] & data; |
| 1692 | 1696 | } |
| 1693 | 1697 | } |
| 1694 | 1698 | } |
| r241759 | r241760 | |
| 1698 | 1702 | { |
| 1699 | 1703 | if((m_grcg.mode & (1 << i)) == 0) |
| 1700 | 1704 | { |
| 1701 | | m_video_ram_2[m_calc_grcg_addr(i,offset)] = m_grcg.tile[i]; |
| 1705 | m_video_ram_2[m_calc_grcg_addr(i,offset,vrambank)] = m_grcg.tile[i]; |
| 1702 | 1706 | } |
| 1703 | 1707 | } |
| 1704 | 1708 | } |
| 1705 | 1709 | } |
| 1706 | 1710 | } |
| 1707 | 1711 | |
| 1712 | READ8_MEMBER(pc9801_state::upd7220_grcg_r) |
| 1713 | { |
| 1714 | return m_pc9801rs_grcg_r(offset & 0x7fff, (offset >> 15) & 3, offset >> 17); |
| 1715 | } |
| 1708 | 1716 | |
| 1717 | WRITE8_MEMBER(pc9801_state::upd7220_grcg_w) |
| 1718 | { |
| 1719 | m_pc9801rs_grcg_w(offset & 0x7fff, (offset >> 15) & 3, offset >> 17, data); |
| 1720 | } |
| 1721 | |
| 1709 | 1722 | READ8_MEMBER(pc9801_state::pc9801_mouse_r) |
| 1710 | 1723 | { |
| 1711 | 1724 | if((offset & 1) == 0) |
| r241759 | r241760 | |
| 2776 | 2789 | AM_RANGE(0x00000, 0x3ffff) AM_RAM AM_SHARE("video_ram_2") |
| 2777 | 2790 | ADDRESS_MAP_END |
| 2778 | 2791 | |
| 2792 | static ADDRESS_MAP_START( upd7220_grcg_2_map, AS_0, 8, pc9801_state ) |
| 2793 | AM_RANGE(0x00000, 0x3ffff) AM_READWRITE(upd7220_grcg_r, upd7220_grcg_w) AM_SHARE("video_ram_2") |
| 2794 | ADDRESS_MAP_END |
| 2779 | 2795 | |
| 2780 | 2796 | CUSTOM_INPUT_MEMBER(pc9801_state::system_type_r) |
| 2781 | 2797 | { |
| r241759 | r241760 | |
| 3730 | 3746 | MCFG_FRAGMENT_ADD(pc9801_keyboard) |
| 3731 | 3747 | MCFG_FRAGMENT_ADD(pc9801_mouse) |
| 3732 | 3748 | MCFG_FRAGMENT_ADD(pc9801_ide) |
| 3733 | | MCFG_UPD1990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL) |
| 3749 | MCFG_UPD4990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL) |
| 3734 | 3750 | MCFG_DEVICE_ADD(UPD8251_TAG, I8251, 0) |
| 3735 | 3751 | |
| 3736 | | MCFG_UPD765A_ADD("upd765_2hd", false, true) |
| 3752 | MCFG_UPD765A_ADD("upd765_2hd", true, true) |
| 3737 | 3753 | MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(pc9801_state, pc9801rs_fdc_irq)) |
| 3738 | 3754 | MCFG_UPD765_DRQ_CALLBACK(WRITELINE(pc9801_state, pc9801rs_fdc_drq)) |
| 3739 | 3755 | //"upd765_2dd" |
| r241759 | r241760 | |
| 3761 | 3777 | MCFG_UPD7220_VSYNC_CALLBACK(DEVWRITELINE("upd7220_btm", upd7220_device, ext_sync_w)) |
| 3762 | 3778 | |
| 3763 | 3779 | MCFG_DEVICE_ADD("upd7220_btm", UPD7220, 5000000/2) |
| 3764 | | MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_2_map) |
| 3780 | MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_grcg_2_map) |
| 3765 | 3781 | MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels) |
| 3766 | 3782 | |
| 3767 | 3783 | MCFG_PALETTE_ADD("palette", 16+16) |
| r241759 | r241760 | |
| 3847 | 3863 | MCFG_FRAGMENT_ADD(pc9801_keyboard) |
| 3848 | 3864 | MCFG_FRAGMENT_ADD(pc9801_mouse) |
| 3849 | 3865 | MCFG_FRAGMENT_ADD(pc9801_ide) |
| 3850 | | MCFG_UPD1990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL) |
| 3866 | MCFG_UPD4990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL) |
| 3851 | 3867 | MCFG_DEVICE_ADD(UPD8251_TAG, I8251, 0) |
| 3852 | 3868 | |
| 3853 | 3869 | MCFG_UPD765A_ADD("upd765_2hd", false, true) |
| r241759 | r241760 | |
| 3878 | 3894 | MCFG_UPD7220_VSYNC_CALLBACK(DEVWRITELINE("upd7220_btm", upd7220_device, ext_sync_w)) |
| 3879 | 3895 | |
| 3880 | 3896 | MCFG_DEVICE_ADD("upd7220_btm", UPD7220, 5000000/2) |
| 3881 | | MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_2_map) |
| 3897 | MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_grcg_2_map) |
| 3882 | 3898 | MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels) |
| 3883 | 3899 | |
| 3884 | 3900 | MCFG_PALETTE_ADD("palette", 16+16+256) |