trunk/src/mess/drivers/pc9801.c
| r19316 | r19317 | |
| 342 | 342 | UINT8 m_rom_bank; |
| 343 | 343 | UINT8 m_fdc_ctrl; |
| 344 | 344 | UINT32 m_ram_size; |
| 345 | | UINT8 m_ex_video_ff[4]; |
| 345 | UINT8 m_ex_video_ff[128]; |
| 346 | 346 | struct { |
| 347 | 347 | UINT8 pal_entry; |
| 348 | 348 | UINT8 r[16],g[16],b[16]; |
| 349 | 349 | }m_analog16; |
| 350 | struct { |
| 351 | UINT8 mode; |
| 352 | UINT8 tile[4], tile_index; |
| 353 | }m_grcg; |
| 350 | 354 | |
| 351 | 355 | /* PC9821 specific */ |
| 352 | 356 | UINT8 m_analog256,m_analog256e; |
| r19316 | r19317 | |
| 377 | 381 | DECLARE_WRITE8_MEMBER(pc9801_video_ff_w); |
| 378 | 382 | DECLARE_READ8_MEMBER(pc9801_70_r); |
| 379 | 383 | DECLARE_WRITE8_MEMBER(pc9801_70_w); |
| 384 | DECLARE_READ8_MEMBER(pc9801rs_70_r); |
| 385 | DECLARE_WRITE8_MEMBER(pc9801rs_70_w); |
| 380 | 386 | DECLARE_READ8_MEMBER(pc9801_sasi_r); |
| 381 | 387 | DECLARE_WRITE8_MEMBER(pc9801_sasi_w); |
| 382 | 388 | DECLARE_READ8_MEMBER(pc9801_a0_r); |
| r19316 | r19317 | |
| 391 | 397 | DECLARE_WRITE8_MEMBER(pc9801_gvram_w); |
| 392 | 398 | DECLARE_READ8_MEMBER(pc9801_mouse_r); |
| 393 | 399 | DECLARE_WRITE8_MEMBER(pc9801_mouse_w); |
| 394 | | // DECLARE_READ8_MEMBER(pc9801rs_gvram_r); |
| 395 | | DECLARE_WRITE8_MEMBER(pc9801rs_gvram_w); |
| 400 | DECLARE_READ8_MEMBER(pc9801rs_grcg_r); |
| 401 | DECLARE_WRITE8_MEMBER(pc9801rs_grcg_w); |
| 396 | 402 | DECLARE_READ8_MEMBER(pc9801_opn_r); |
| 397 | 403 | DECLARE_WRITE8_MEMBER(pc9801_opn_w); |
| 398 | 404 | DECLARE_READ8_MEMBER(pc9801rs_wram_r); |
| r19316 | r19317 | |
| 533 | 539 | // DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_irq); |
| 534 | 540 | |
| 535 | 541 | void pc9801_fdc_2hd_update_ready(floppy_image_device *, int); |
| 542 | inline UINT32 m_calc_grcg_addr(int i,UINT32 offset); |
| 536 | 543 | }; |
| 537 | 544 | |
| 538 | 545 | |
| r19316 | r19317 | |
| 1059 | 1066 | |
| 1060 | 1067 | WRITE8_MEMBER(pc9801_state::pc9801_70_w) |
| 1061 | 1068 | { |
| 1062 | | |
| 1063 | 1069 | if((offset & 1) == 0) |
| 1064 | 1070 | { |
| 1065 | 1071 | printf("Write to display register [%02x] %02x\n",offset+0x70,data); |
| r19316 | r19317 | |
| 1370 | 1376 | m_video_ram_2[offset+0x08000+m_vram_bank*0x20000] = data; |
| 1371 | 1377 | } |
| 1372 | 1378 | |
| 1373 | | WRITE8_MEMBER(pc9801_state::pc9801rs_gvram_w) |
| 1379 | inline UINT32 pc9801_state::m_calc_grcg_addr(int i,UINT32 offset) |
| 1374 | 1380 | { |
| 1375 | | m_video_ram_2[offset+0+m_vram_bank*0x20000] = data; |
| 1381 | return (offset) + (((i+1)*0x8000) & 0x1ffff) + (m_vram_bank*0x20000); |
| 1376 | 1382 | } |
| 1377 | 1383 | |
| 1384 | READ8_MEMBER(pc9801_state::pc9801rs_grcg_r) |
| 1385 | { |
| 1386 | UINT8 res; |
| 1378 | 1387 | |
| 1388 | if((m_grcg.mode & 0x80) == 0 || (m_grcg.mode & 0x40)) |
| 1389 | res = m_video_ram_2[offset+0+m_vram_bank*0x20000]; |
| 1390 | else |
| 1391 | { |
| 1392 | int i; |
| 1393 | |
| 1394 | res = 0; |
| 1395 | for(i=0;i<4;i++) |
| 1396 | { |
| 1397 | if((m_grcg.mode & 1 << i) == 0) |
| 1398 | res |= (m_video_ram_2[m_calc_grcg_addr(i,offset)] ^ m_grcg.tile[i]); |
| 1399 | } |
| 1400 | |
| 1401 | res ^= 0xff; |
| 1402 | } |
| 1403 | |
| 1404 | return res; |
| 1405 | } |
| 1406 | |
| 1407 | WRITE8_MEMBER(pc9801_state::pc9801rs_grcg_w) |
| 1408 | { |
| 1409 | if((m_grcg.mode & 0x80) == 0) |
| 1410 | m_video_ram_2[offset+0+m_vram_bank*0x20000] = data; |
| 1411 | else |
| 1412 | { |
| 1413 | int i; |
| 1414 | |
| 1415 | if(m_grcg.mode & 0x40) // RMW |
| 1416 | { |
| 1417 | for(i=0;i<4;i++) |
| 1418 | { |
| 1419 | if((m_grcg.mode & 1 << i) == 0) |
| 1420 | { |
| 1421 | m_video_ram_2[m_calc_grcg_addr(i,offset)] &= ~data; |
| 1422 | m_video_ram_2[m_calc_grcg_addr(i,offset)] |= m_grcg.tile[i] & data; |
| 1423 | } |
| 1424 | } |
| 1425 | } |
| 1426 | else // TDW |
| 1427 | { |
| 1428 | for(i=0;i<4;i++) |
| 1429 | { |
| 1430 | if((m_grcg.mode & 1 << i) == 0) |
| 1431 | m_video_ram_2[m_calc_grcg_addr(i,offset)] = m_grcg.tile[i]; |
| 1432 | } |
| 1433 | } |
| 1434 | } |
| 1435 | } |
| 1436 | |
| 1437 | |
| 1379 | 1438 | READ8_MEMBER(pc9801_state::pc9801_opn_r) |
| 1380 | 1439 | { |
| 1381 | 1440 | if((offset & 1) == 0) |
| r19316 | r19317 | |
| 1542 | 1601 | return pc9801_30_r(space,offset); |
| 1543 | 1602 | } |
| 1544 | 1603 | |
| 1604 | READ8_MEMBER(pc9801_state::pc9801rs_70_r) |
| 1605 | { |
| 1606 | if(offset == 0xc) |
| 1607 | { |
| 1608 | printf("GRCG mode R\n"); |
| 1609 | return 0xff; |
| 1610 | } |
| 1611 | else if(offset == 0x0e) |
| 1612 | { |
| 1613 | printf("GRCG tile R\n"); |
| 1614 | return 0xff; |
| 1615 | } |
| 1616 | |
| 1617 | return pc9801_70_r(space,offset);; |
| 1618 | } |
| 1619 | |
| 1620 | WRITE8_MEMBER(pc9801_state::pc9801rs_70_w) |
| 1621 | { |
| 1622 | if(offset == 0xc) |
| 1623 | { |
| 1624 | // printf("%02x GRCG MODE\n",data); |
| 1625 | m_grcg.mode = data; |
| 1626 | m_grcg.tile_index = 0; |
| 1627 | return; |
| 1628 | } |
| 1629 | else if(offset == 0x0e) |
| 1630 | { |
| 1631 | // printf("%02x GRCG TILE %02x\n",data,m_grcg.tile_index); |
| 1632 | m_grcg.tile[m_grcg.tile_index] = data; |
| 1633 | m_grcg.tile_index ++; |
| 1634 | m_grcg.tile_index &= 3; |
| 1635 | return; |
| 1636 | } |
| 1637 | |
| 1638 | pc9801_70_w(space,offset,data); |
| 1639 | } |
| 1640 | |
| 1545 | 1641 | READ8_MEMBER(pc9801_state::pc9801rs_memory_r) |
| 1546 | 1642 | { |
| 1547 | 1643 | if(m_gate_a20 == 0) |
| r19316 | r19317 | |
| 1551 | 1647 | else if(offset >= 0x000a0000 && offset <= 0x000a3fff) { return pc9801_tvram_r(space,offset-0xa0000); } |
| 1552 | 1648 | else if(offset >= 0x000a4000 && offset <= 0x000a4fff) { return pc9801rs_knjram_r(space,offset & 0xfff); } |
| 1553 | 1649 | else if(offset >= 0x000a8000 && offset <= 0x000bffff) { return pc9801_gvram_r(space,offset-0xa8000); } |
| 1650 | else if(offset >= 0x000e0000 && offset <= 0x000e7fff) { return pc9801rs_grcg_r(space,offset & 0x7fff); } |
| 1554 | 1651 | else if(offset >= 0x000e0000 && offset <= 0x000fffff) { return pc9801rs_ipl_r(space,offset & 0x1ffff); } |
| 1555 | 1652 | else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1) { return pc9801rs_ex_wram_r(space,offset-0x00100000); } |
| 1556 | 1653 | else if(offset >= 0xfffe0000 && offset <= 0xffffffff) { return pc9801rs_ipl_r(space,offset & 0x1ffff); } |
| r19316 | r19317 | |
| 1569 | 1666 | else if(offset >= 0x000a0000 && offset <= 0x000a3fff) { pc9801_tvram_w(space,offset-0xa0000,data); } |
| 1570 | 1667 | else if(offset >= 0x000a4000 && offset <= 0x000a4fff) { pc9801rs_knjram_w(space,offset & 0xfff,data); } |
| 1571 | 1668 | else if(offset >= 0x000a8000 && offset <= 0x000bffff) { pc9801_gvram_w(space,offset-0xa8000,data); } |
| 1572 | | else if(offset >= 0x000e0000 && offset <= 0x000e7fff) { pc9801rs_gvram_w(space,offset & 0x7fff,data); } |
| 1669 | else if(offset >= 0x000e0000 && offset <= 0x000e7fff) { pc9801rs_grcg_w(space,offset & 0x7fff,data); } |
| 1573 | 1670 | else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1) { pc9801rs_ex_wram_w(space,offset-0x00100000,data); } |
| 1574 | 1671 | //else |
| 1575 | 1672 | // printf("%08x %08x\n",offset,data); |
| r19316 | r19317 | |
| 1686 | 1783 | |
| 1687 | 1784 | if(offset == 2) |
| 1688 | 1785 | { |
| 1689 | | if((data & 0xf8) == 0) |
| 1786 | m_ex_video_ff[(data & 0xfe) >> 1] = data & 1; |
| 1787 | |
| 1788 | if(0) |
| 1690 | 1789 | { |
| 1691 | | m_ex_video_ff[(data & 0x6) >> 1] = data & 1; |
| 1692 | | |
| 1693 | | if(1) |
| 1790 | static const char *const ex_video_ff_regnames[] = |
| 1694 | 1791 | { |
| 1695 | | static const char *const ex_video_ff_regnames[] = |
| 1696 | | { |
| 1697 | | "16 colors mode", // 0 |
| 1698 | | "<unknown>", // 1 |
| 1699 | | "EGC related", // 2 |
| 1700 | | "<unknown>" // 3 |
| 1701 | | }; |
| 1792 | "16 colors mode", // 0 |
| 1793 | "<unknown>", // 1 |
| 1794 | "EGC related", // 2 |
| 1795 | "<unknown>" // 3 |
| 1796 | }; |
| 1702 | 1797 | |
| 1703 | | printf("Write to extend video FF register %s -> %02x\n",ex_video_ff_regnames[(data & 0x06) >> 1],data & 1); |
| 1704 | | } |
| 1705 | | else |
| 1706 | | printf("Write to extend video FF register %02x\n",data); |
| 1798 | printf("Write to extend video FF register %s -> %02x\n",ex_video_ff_regnames[(data & 0x06) >> 1],data & 1); |
| 1707 | 1799 | } |
| 1800 | //else |
| 1801 | // printf("Write to extend video FF register %02x\n",data); |
| 1802 | |
| 1708 | 1803 | return; |
| 1709 | 1804 | } |
| 1710 | 1805 | |
| r19316 | r19317 | |
| 1760 | 1855 | AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r, pc9801_60_w, 0xffffffff) //upd7220 character ports / <undefined> |
| 1761 | 1856 | AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff) |
| 1762 | 1857 | AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0xffffffff) //mode FF / <undefined> |
| 1763 | | AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r, pc9801_70_w, 0xffffffff) //display registers "GRCG" / i8253 pit |
| 1858 | AM_RANGE(0x0070, 0x007f) AM_READWRITE8(pc9801rs_70_r, pc9801rs_70_w, 0xffffffff) //display registers "GRCG" / i8253 pit |
| 1764 | 1859 | AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r, pc9801_sasi_w, 0xffffffff) //HDD SASI interface / <undefined> |
| 1765 | 1860 | AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffffffff) |
| 1766 | 1861 | AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r, pc9801rs_a0_w, 0xffffffff) //upd7220 bitmap ports / display registers |
| r19316 | r19317 | |
| 1818 | 1913 | AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r, pc9801_60_w, 0xffff) //upd7220 character ports / <undefined> |
| 1819 | 1914 | AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffff) |
| 1820 | 1915 | AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0xffff) //mode FF / <undefined> |
| 1821 | | AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r, pc9801_70_w, 0xffff) //display registers "GRCG" / i8253 pit |
| 1916 | AM_RANGE(0x0070, 0x007f) AM_READWRITE8(pc9801rs_70_r, pc9801rs_70_w, 0xffff) //display registers "GRCG" / i8253 pit |
| 1822 | 1917 | AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffff) |
| 1823 | 1918 | AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r, pc9801rs_a0_w, 0xffff) //upd7220 bitmap ports / display registers |
| 1824 | 1919 | AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffff) |
| r19316 | r19317 | |
| 2089 | 2184 | AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r, pc9801_60_w, 0xffffffff) //upd7220 character ports / <undefined> |
| 2090 | 2185 | AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff) |
| 2091 | 2186 | AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9821_video_ff_w, 0xffffffff) //mode FF / <undefined> |
| 2092 | | AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r, pc9801_70_w, 0xffffffff) //display registers "GRCG" / i8253 pit |
| 2187 | AM_RANGE(0x0070, 0x007f) AM_READWRITE8(pc9801rs_70_r, pc9801rs_70_w, 0xffffffff) //display registers "GRCG" / i8253 pit |
| 2093 | 2188 | // AM_RANGE(0x0080, 0x0083) SASI interface / <undefined> |
| 2094 | 2189 | AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r, pc9801rs_2hd_w, 0xffffffff) |
| 2095 | 2190 | AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9821_a0_r, pc9821_a0_w, 0xffffffff) //upd7220 bitmap ports / display registers |