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