Previous 199869 Revisions Next

r33277 Saturday 8th November, 2014 at 05:36:56 UTC by Carl
(mess) pc9801: more refactor (nw)
[src/mess/drivers]pc9801.c

trunk/src/mess/drivers/pc9801.c
r241788r241789
1616    - EGC
1717    - rewrite using slot devices
1818    - some later SWs put "Invalid command byte 05" (Absolutely Mahjong on Epson logo)
19    - Basic games are mostly untested, but I think that upd7220 fails on those (Adventureland, Xevious)
2019    - investigate on POR bit
21    - 2dd bios tries to use dma channel 2
20   - test 2dd more
2221
2322    TODO (PC-9801RS):
2423    - extra features;
r241788r241789
456455      m_ide(*this, "ide"),
457456      m_video_ram_1(*this, "video_ram_1"),
458457      m_video_ram_2(*this, "video_ram_2"),
458      m_ext_gvram(*this, "ext_gvram"),
459459      m_beeper(*this, "beeper"),
460460      m_ram(*this, RAM_TAG),
461461      m_gfxdecode(*this, "gfxdecode"),
r241788r241789
483483   optional_device<ata_interface_device> m_ide;
484484   required_shared_ptr<UINT8> m_video_ram_1;
485485   required_shared_ptr<UINT8> m_video_ram_2;
486   optional_shared_ptr<UINT8> m_ext_gvram;
486487   required_device<beep_device> m_beeper;
487488   optional_device<ram_device> m_ram;
488489   required_device<gfxdecode_device> m_gfxdecode;
r241788r241789
493494   UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
494495
495496   UINT8 *m_ipl_rom;
496   UINT8 *m_sound_bios;
497   UINT8 *m_work_ram;
498   UINT8 *m_ext_work_ram;
499497   UINT8 *m_char_rom;
500498   UINT8 *m_kanji_rom;
501   UINT8 *m_ide_rom;
502   UINT8 m_ide_bank[2];
503499
504   UINT8 m_portb_tmp;
505500   UINT8 m_dma_offset[4];
506501   int m_dack;
507502
r241788r241789
530525   UINT8 m_access_ctrl; // DMA related
531526   UINT8 m_rom_bank;
532527   UINT8 m_fdc_ctrl;
533   UINT32 m_ram_size;
534528   UINT8 m_ex_video_ff[128];
535529   struct {
536530      UINT8 pal_entry;
r241788r241789
547541
548542   /* PC9821 specific */
549543   UINT8 m_sdip[24], m_sdip_bank;
550   UINT8 *m_ide_ram;
551   UINT8 *m_unk_rom;
552   UINT8 *m_ext_gvram;
553544   UINT8 m_pc9821_window_bank;
554   UINT8 m_joy_sel;
555545   UINT8 m_ext2_ff;
556546   UINT8 m_sys_type;
557547
558548   DECLARE_WRITE_LINE_MEMBER( write_uart_clock );
559549   DECLARE_WRITE8_MEMBER(rtc_dmapg_w);
560550   DECLARE_WRITE8_MEMBER(nmi_ctrl_w);
561   DECLARE_WRITE8_MEMBER(pc9801_vrtc_mask_w);
551   DECLARE_WRITE8_MEMBER(vrtc_mask_w);
562552   DECLARE_WRITE8_MEMBER(pc9801_video_ff_w);
563553   DECLARE_READ8_MEMBER(txt_scrl_r);
564554   DECLARE_WRITE8_MEMBER(txt_scrl_w);
r241788r241789
580570   inline void m_pc9801rs_grcg_w(UINT32 offset,int vbank,int vrambank,UINT8 data);
581571   inline void m_pc9801rs_grcg_w(UINT32 offset,int vbank,UINT8 data) { m_pc9801rs_grcg_w(offset, vbank, m_vram_bank, data); }
582572   DECLARE_CUSTOM_INPUT_MEMBER(system_type_r);
583   DECLARE_READ8_MEMBER(pc9801ux_gvram_r);
584   DECLARE_WRITE8_MEMBER(pc9801ux_gvram_w);
585   DECLARE_READ8_MEMBER(pc9801ux_gvram0_r);
586   DECLARE_WRITE8_MEMBER(pc9801ux_gvram0_w);
573   DECLARE_READ8_MEMBER(grcg_gvram_r);
574   DECLARE_WRITE8_MEMBER(grcg_gvram_w);
575   DECLARE_READ8_MEMBER(grcg_gvram0_r);
576   DECLARE_WRITE8_MEMBER(grcg_gvram0_w);
587577   DECLARE_READ8_MEMBER(upd7220_grcg_r);
588578   DECLARE_WRITE8_MEMBER(upd7220_grcg_w);
589579   UINT32 pc9801_286_a20(bool state);
r241788r241789
600590   int m_sasi_data_enable;
601591   UINT8 m_sasi_ctrl;
602592
603   DECLARE_READ8_MEMBER(pc9801rs_wram_r);
604   DECLARE_WRITE8_MEMBER(pc9801rs_wram_w);
605   DECLARE_READ8_MEMBER(pc9801rs_ex_wram_r);
606   DECLARE_WRITE8_MEMBER(pc9801rs_ex_wram_w);
607593   DECLARE_READ8_MEMBER(pc9801rs_ipl_r);
608594   DECLARE_READ8_MEMBER(pc9801rs_knjram_r);
609595   DECLARE_WRITE8_MEMBER(pc9801rs_knjram_w);
r241788r241789
612598   DECLARE_WRITE8_MEMBER(pc9801rs_f0_w);
613599   DECLARE_READ8_MEMBER(pc9801rs_memory_r);
614600   DECLARE_WRITE8_MEMBER(pc9801rs_memory_w);
615   DECLARE_READ8_MEMBER(pc9801rs_soundrom_r);
616   DECLARE_READ8_MEMBER(pc9801rs_scsirom_r);
617601   DECLARE_READ8_MEMBER(pc9810rs_fdc_ctrl_r);
618602   DECLARE_WRITE8_MEMBER(pc9810rs_fdc_ctrl_w);
619603   DECLARE_READ8_MEMBER(pc9801rs_2hd_r);
r241788r241789
629613   DECLARE_WRITE8_MEMBER(pc9801rs_access_ctrl_w);
630614   DECLARE_WRITE8_MEMBER(pc9801rs_nmi_w);
631615   DECLARE_READ8_MEMBER(pc9801rs_midi_r);
632   DECLARE_READ8_MEMBER(pc9821_memory_r);
633   DECLARE_WRITE8_MEMBER(pc9821_memory_w);
616//   DECLARE_READ8_MEMBER(winram_r);
617//   DECLARE_WRITE8_MEMBER(winram_w);
634618//  DECLARE_READ8_MEMBER(pc9801_ext_opna_r);
635619//  DECLARE_WRITE8_MEMBER(pc9801_ext_opna_w);
636620   DECLARE_READ8_MEMBER(pic_r);
r241788r241789
662646   DECLARE_WRITE8_MEMBER(sdip_a_w);
663647   DECLARE_WRITE8_MEMBER(sdip_b_w);
664648
665   DECLARE_READ8_MEMBER(pc9801rs_ide_r);
666   DECLARE_READ8_MEMBER(pc9821_ideram_r);
667   DECLARE_WRITE8_MEMBER(pc9821_ideram_w);
668   DECLARE_READ8_MEMBER(pc9821_ext_gvram_r);
669   DECLARE_WRITE8_MEMBER(pc9821_ext_gvram_w);
670649   DECLARE_READ8_MEMBER(pc9821_window_bank_r);
671650   DECLARE_WRITE8_MEMBER(pc9821_window_bank_w);
672651   DECLARE_READ16_MEMBER(pc9821_timestamp_r);
r241788r241789
703682   DECLARE_WRITE_LINE_MEMBER(pc9801_dack1_w);
704683   DECLARE_WRITE_LINE_MEMBER(pc9801_dack2_w);
705684   DECLARE_WRITE_LINE_MEMBER(pc9801_dack3_w);
706   DECLARE_READ8_MEMBER(ppi_sys_portc_r);
707685   DECLARE_WRITE8_MEMBER(ppi_sys_portc_w);
708   DECLARE_READ8_MEMBER(ppi_fdd_porta_r);
709   DECLARE_READ8_MEMBER(ppi_fdd_portb_r);
710   DECLARE_READ8_MEMBER(ppi_fdd_portc_r);
711   DECLARE_WRITE8_MEMBER(ppi_fdd_portc_w);
712686
713687   DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq);
714688   DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_irq);
r241788r241789
748722
749723void pc9801_state::video_start()
750724{
751   //pc9801_state *state = machine.driver_data<pc9801_state>();
752
753725   m_tvram = auto_alloc_array(machine(), UINT8, 0x4000);
754726
755727   // find memory regions
r241788r241789
797769         pen = m_ext_gvram[(address*8+xi)+(m_vram_disp*0x40000)];
798770
799771         bitmap.pix32(res_y*2+0, res_x) = palette[pen + 0x20];
800         if(machine().first_screen()->visible_area().contains(res_x, res_y*2+1))
772         if(m_screen->visible_area().contains(res_x, res_y*2+1))
801773            bitmap.pix32(res_y*2+1, res_x) = palette[pen + 0x20];
802774      }
803775   }
r241788r241789
1005977   m_nmi_ff = (offset & 2) >> 1;
1006978}
1007979
1008WRITE8_MEMBER(pc9801_state::pc9801_vrtc_mask_w)
980WRITE8_MEMBER(pc9801_state::vrtc_mask_w)
1009981{
1010   if((offset & 1) == 0)
1011   {
1012      m_vrtc_irq_mask = 1;
1013   }
1014   else // odd
1015   {
1016      logerror("Write to undefined port [%02x] <- %02x\n",offset+0x64,data);
1017   }
982   m_vrtc_irq_mask = 1;
1018983}
1019984
1020985WRITE8_MEMBER(pc9801_state::pc9801_video_ff_w)
r241788r241789
14331398
14341399READ8_MEMBER(pc9801_state::ide_hack_r)
14351400{
1401   address_space &ram = m_maincpu->space(AS_PROGRAM);
14361402   // this makes the ide driver not do 512 to 256 byte sector translation, the 9821 looks for bit 6 of offset 0xac403 of the kanji ram to set this, the rs unknown
1437   m_work_ram[0x457] |= 0xc0;
1403   ram.write_byte(0x457, ram.read_byte(0x457) | 0xc0);
14381404   return 0xff;
14391405}
14401406
r241788r241789
15741540   AM_RANGE(0x0050, 0x0057) AM_DEVREADWRITE8("ppi8255_fdd", i8255_device, read, write, 0xff00)
15751541   AM_RANGE(0x0050, 0x0053) AM_WRITE8(nmi_ctrl_w,0x00ff) // NMI FF / i8255 floppy port (2d?)
15761542   AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("upd7220_chr", upd7220_device, read, write, 0x00ff) //upd7220 character ports / <undefined>
1577   AM_RANGE(0x0064, 0x0065) AM_WRITE8(pc9801_vrtc_mask_w,0xffff)
1543   AM_RANGE(0x0064, 0x0065) AM_WRITE8(vrtc_mask_w,0x00ff)
15781544   AM_RANGE(0x0068, 0x0069) AM_WRITE8(pc9801_video_ff_w,0xffff) //mode FF / <undefined>
15791545//  AM_RANGE(0x006c, 0x006f) border color / <undefined>
15801546   AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00)
r241788r241789
15941560 *
15951561 ************************************/
15961562
1597READ8_MEMBER(pc9801_state::pc9801rs_ide_r) { return m_ide_rom[offset]; }
1598
1599READ8_MEMBER(pc9801_state::pc9801rs_wram_r) { return m_work_ram[offset]; }
1600WRITE8_MEMBER(pc9801_state::pc9801rs_wram_w) { m_work_ram[offset] = data; }
1601
1602READ8_MEMBER(pc9801_state::pc9801rs_ex_wram_r) { return m_ext_work_ram[offset]; }
1603WRITE8_MEMBER(pc9801_state::pc9801rs_ex_wram_w) { m_ext_work_ram[offset] = data; }
1604
16051563READ8_MEMBER(pc9801_state::pc9801rs_ipl_r) { return m_ipl_rom[(offset & 0x1ffff)+(m_rom_bank*0x20000)]; }
16061564
16071565/* TODO: it's possible that the offset calculation is actually linear. */
r241788r241789
17451703   txt_scrl_w(space,offset,data);
17461704}
17471705
1748READ8_MEMBER(pc9801_state::pc9801rs_soundrom_r)
1749{
1750   return m_sound_bios[offset];
1751}
1752
1753READ8_MEMBER(pc9801_state::pc9801rs_memory_r)
1754{
1755   if(m_gate_a20 == 0)
1756      offset &= 0xfffff;
1757
1758   if     (                        offset <= 0x0009ffff)                   { return pc9801rs_wram_r(space,offset);               }
1759   else if(offset >= 0x000a0000 && offset <= 0x000a3fff)                   { return pc9801_tvram_r(space,offset-0xa0000);        }
1760   else if(offset >= 0x000a4000 && offset <= 0x000a4fff)                   { return pc9801rs_knjram_r(space,offset & 0xfff);     }
1761   else if(offset >= 0x000a8000 && offset <= 0x000affff)                   { return m_pc9801rs_grcg_r(offset & 0x7fff,1);        }
1762   else if(offset >= 0x000b0000 && offset <= 0x000b7fff)                   { return m_pc9801rs_grcg_r(offset & 0x7fff,2);        }
1763   else if(offset >= 0x000b8000 && offset <= 0x000bffff)                   { return m_pc9801rs_grcg_r(offset & 0x7fff,3);        }
1764   else if(offset >= 0x000cc000 && offset <= 0x000cffff)                   { return pc9801rs_soundrom_r(space,offset & 0x3fff);}
1765   else if(offset >= 0x000d8000 && offset <= 0x000d9fff)                   { return pc9801rs_ide_r(space,offset & 0x1fff);         }
1766   else if(offset >= 0x000da000 && offset <= 0x000dbfff)                   { return pc9821_ideram_r(space,offset & 0x1fff);      }
1767   else if(offset >= 0x000e0000 && offset <= 0x000e7fff)                   { return m_pc9801rs_grcg_r(offset & 0x7fff,0);        }
1768   else if(offset >= 0x000e0000 && offset <= 0x000fffff)                   { return pc9801rs_ipl_r(space,offset & 0x1ffff);      }
1769   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1)      { return pc9801rs_ex_wram_r(space,offset-0x00100000); }
1770   else if(offset >= 0xfffe0000 && offset <= 0xffffffff)                   { return pc9801rs_ipl_r(space,offset & 0x1ffff);      }
1771
1772//  logerror("%08x\n",offset);
1773   return 0x00;
1774}
1775
1776
1777WRITE8_MEMBER(pc9801_state::pc9801rs_memory_w)
1778{
1779   if(m_gate_a20 == 0)
1780      offset &= 0xfffff;
1781
1782   if     (                        offset <= 0x0009ffff)                   { pc9801rs_wram_w(space,offset,data);                  }
1783   else if(offset >= 0x000a0000 && offset <= 0x000a3fff)                   { pc9801_tvram_w(space,offset-0xa0000,data);           }
1784   else if(offset >= 0x000a4000 && offset <= 0x000a4fff)                   { pc9801rs_knjram_w(space,offset & 0xfff,data);        }
1785   else if(offset >= 0x000a8000 && offset <= 0x000affff)                   { m_pc9801rs_grcg_w(offset & 0x7fff,1,data);        }
1786   else if(offset >= 0x000b0000 && offset <= 0x000b7fff)                   { m_pc9801rs_grcg_w(offset & 0x7fff,2,data);        }
1787   else if(offset >= 0x000b8000 && offset <= 0x000bffff)                   { m_pc9801rs_grcg_w(offset & 0x7fff,3,data);        }
1788   else if(offset >= 0x000da000 && offset <= 0x000dbfff)                   { pc9821_ideram_w(space,offset & 0x1fff,data);         }
1789   else if(offset >= 0x000e0000 && offset <= 0x000e7fff)                   { m_pc9801rs_grcg_w(offset & 0x7fff,0,data);        }
1790   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1)      { pc9801rs_ex_wram_w(space,offset-0x00100000,data);    }
1791   //else
1792   //  logerror("%08x %08x\n",offset,data);
1793}
1794
17951706READ8_MEMBER(pc9801_state::pc9810rs_fdc_ctrl_r)
17961707{
17971708   return (m_fdc_ctrl & 3) | 0xf0 | 8 | 4;
r241788r241789
20031914   ((offset >= 4) ? m_pic2 : m_pic1)->write(space, offset & 3, data);
20041915}
20051916
2006READ8_MEMBER(pc9801_state::pc9801ux_gvram_r)
1917READ8_MEMBER(pc9801_state::grcg_gvram_r)
20071918{
20081919   return m_pc9801rs_grcg_r(offset & 0x7fff,(offset>>15)+1);
20091920}
20101921
2011WRITE8_MEMBER(pc9801_state::pc9801ux_gvram_w)
1922WRITE8_MEMBER(pc9801_state::grcg_gvram_w)
20121923{
20131924   m_pc9801rs_grcg_w(offset & 0x7fff,(offset>>15)+1,data);
20141925}
20151926
2016READ8_MEMBER(pc9801_state::pc9801ux_gvram0_r)
1927READ8_MEMBER(pc9801_state::grcg_gvram0_r)
20171928{
20181929   return m_pc9801rs_grcg_r(offset & 0x7fff,0);
20191930}
20201931
2021WRITE8_MEMBER(pc9801_state::pc9801ux_gvram0_w)
1932WRITE8_MEMBER(pc9801_state::grcg_gvram0_w)
20221933{
20231934   m_pc9801rs_grcg_w(offset & 0x7fff,0,data);
20241935}
r241788r241789
20271938   AM_RANGE(0x000000, 0x09ffff) AM_RAMBANK("wram")
20281939   AM_RANGE(0x0a0000, 0x0a3fff) AM_READWRITE8(pc9801_tvram_r, pc9801_tvram_w, 0xffff)
20291940   AM_RANGE(0x0a4000, 0x0a4fff) AM_READWRITE8(pc9801rs_knjram_r, pc9801rs_knjram_w, 0xffff)
2030   AM_RANGE(0x0a8000, 0x0bffff) AM_READWRITE8(pc9801ux_gvram_r, pc9801ux_gvram_w, 0xffff)
2031   AM_RANGE(0x0e0000, 0x0e7fff) AM_READWRITE8(pc9801ux_gvram0_r,pc9801ux_gvram0_w, 0xffff)
1941   AM_RANGE(0x0a8000, 0x0bffff) AM_READWRITE8(grcg_gvram_r, grcg_gvram_w, 0xffff)
1942   AM_RANGE(0x0e0000, 0x0e7fff) AM_READWRITE8(grcg_gvram0_r,grcg_gvram0_w, 0xffff)
20321943   AM_RANGE(0x0e0000, 0x0fffff) AM_READ8(pc9801rs_ipl_r, 0xffff)
20331944ADDRESS_MAP_END
20341945
r241788r241789
20511962ADDRESS_MAP_END
20521963
20531964static ADDRESS_MAP_START( pc9801rs_map, AS_PROGRAM, 16, pc9801_state )
2054   AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE8(pc9801rs_memory_r,pc9801rs_memory_w,0xffff)
1965   AM_RANGE(0x0d8000, 0x0d9fff) AM_ROM AM_REGION("ide",0)
1966   AM_RANGE(0x0da000, 0x0dbfff) AM_RAM // ide ram
1967   AM_RANGE(0xee0000, 0xefffff) AM_READ8(pc9801rs_ipl_r, 0xffff)
1968   AM_RANGE(0xfe0000, 0xffffff) AM_READ8(pc9801rs_ipl_r, 0xffff)
1969   AM_IMPORT_FROM(pc9801ux_map)
20551970ADDRESS_MAP_END
20561971
20571972static ADDRESS_MAP_START( pc9801rs_io, AS_IO, 16, pc9801_state )
r241788r241789
20711986 *
20721987 ************************************/
20731988
2074/* Note: not hooking this up causes "MEMORY ERROR" at POST */
2075READ8_MEMBER(pc9801_state::pc9821_ideram_r) { return m_ide_ram[offset]; }
2076WRITE8_MEMBER(pc9801_state::pc9821_ideram_w) { m_ide_ram[offset] = data; }
2077
2078READ8_MEMBER(pc9801_state::pc9821_ext_gvram_r) { return m_ext_gvram[offset]; }
2079WRITE8_MEMBER(pc9801_state::pc9821_ext_gvram_w) { m_ext_gvram[offset] = data; }
2080
2081
2082READ8_MEMBER(pc9801_state::pc9821_memory_r)
2083{
2084   if(m_gate_a20 == 0)
2085      offset &= 0xfffff;
2086
2087   if(offset >= 0x00080000 && offset <= 0x0009ffff)
2088      offset = (offset & 0x1ffff) | (m_pc9821_window_bank & 0xfe) * 0x10000;
2089
2090   /* TODO: window bank at 0xa0000 - 0xbffff */
2091
2092   if     (                        offset <= 0x0009ffff)                   { return pc9801rs_wram_r(space,offset);               }
2093//  else if(offset >= 0x00080000 && offset <= 0x0009ffff)                   { return pc9821_winram_r(space,offset & 0x1ffff);     }
2094   else if(offset >= 0x000a0000 && offset <= 0x000a3fff)                   { return pc9801_tvram_r(space,offset-0xa0000);        }
2095   else if(offset >= 0x000a4000 && offset <= 0x000a4fff)                   { return pc9801rs_knjram_r(space,offset & 0xfff);     }
2096   else if(offset >= 0x000a8000 && offset <= 0x000affff)                   { return m_pc9801rs_grcg_r(offset & 0x7fff,1);        }
2097   else if(offset >= 0x000b0000 && offset <= 0x000b7fff)                   { return m_pc9801rs_grcg_r(offset & 0x7fff,2);        }
2098   else if(offset >= 0x000b8000 && offset <= 0x000bffff)                   { return m_pc9801rs_grcg_r(offset & 0x7fff,3);        }
2099   else if(offset >= 0x000cc000 && offset <= 0x000cffff)                   { return pc9801rs_soundrom_r(space,offset & 0x3fff);}
2100   else if(offset >= 0x000d8000 && offset <= 0x000d9fff)                   { return pc9801rs_ide_r(space,offset & 0x1fff);         }
2101   else if(offset >= 0x000da000 && offset <= 0x000dbfff)                   { return pc9821_ideram_r(space,offset & 0x1fff);      }
2102   else if(offset >= 0x000e0000 && offset <= 0x000e7fff)                   { return m_pc9801rs_grcg_r(offset & 0x7fff,0);        }
2103   else if(offset >= 0x000e0000 && offset <= 0x000fffff)                   { return pc9801rs_ipl_r(space,offset & 0x1ffff);      }
2104   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1)      { return pc9801rs_ex_wram_r(space,offset-0x00100000); }
2105   else if(offset >= 0x00f00000 && offset <= 0x00f9ffff)                   { return pc9821_ext_gvram_r(space,offset-0x00f00000); }
2106   else if(offset >= 0xfffe0000 && offset <= 0xffffffff)                   { return pc9801rs_ipl_r(space,offset & 0x1ffff);      }
2107
2108   //logerror("%08x\n",offset);
2109   return 0x00;
2110}
2111
2112
2113WRITE8_MEMBER(pc9801_state::pc9821_memory_w)
2114{
2115   if(m_gate_a20 == 0)
2116      offset &= 0xfffff;
2117
2118   if(offset >= 0x00080000 && offset <= 0x0009ffff)
2119      offset = (offset & 0x1ffff) | (m_pc9821_window_bank & 0xfe) * 0x10000;
2120
2121   /* TODO: window bank at 0xa0000 - 0xbffff */
2122
2123   if     (                        offset <= 0x0009ffff)                   { pc9801rs_wram_w(space,offset,data);                  }
2124//  else if(offset >= 0x00080000 && offset <= 0x0009ffff)                   { pc9821_winram_w(space,offset & 0x1ffff,data);        }
2125   else if(offset >= 0x000a0000 && offset <= 0x000a3fff)                   { pc9801_tvram_w(space,offset-0xa0000,data);           }
2126   else if(offset >= 0x000a4000 && offset <= 0x000a4fff)                   { pc9801rs_knjram_w(space,offset & 0xfff,data);        }
2127   else if(offset >= 0x000a8000 && offset <= 0x000affff)                   { m_pc9801rs_grcg_w(offset & 0x7fff,1,data);        }
2128   else if(offset >= 0x000b0000 && offset <= 0x000b7fff)                   { m_pc9801rs_grcg_w(offset & 0x7fff,2,data);        }
2129   else if(offset >= 0x000b8000 && offset <= 0x000bffff)                   { m_pc9801rs_grcg_w(offset & 0x7fff,3,data);        }
2130   else if(offset >= 0x000cc000 && offset <= 0x000cffff)                   { /* TODO: shadow ROM */                               }
2131   else if(offset >= 0x000d8000 && offset <= 0x000d9fff)                   { /* TODO: shadow ROM */                               }
2132   else if(offset >= 0x000da000 && offset <= 0x000dbfff)                   { pc9821_ideram_w(space,offset & 0x1fff,data);         }
2133   else if(offset >= 0x000e0000 && offset <= 0x000e7fff)                   { m_pc9801rs_grcg_w(offset & 0x7fff,0,data);        }
2134   else if(offset >= 0x000e8000 && offset <= 0x000fffff)                   { /* TODO: shadow ROM */                               }
2135   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1)      { pc9801rs_ex_wram_w(space,offset-0x00100000,data);    }
2136   else if(offset >= 0x00f00000 && offset <= 0x00f9ffff)                   { pc9821_ext_gvram_w(space,offset-0x00f00000,data);    }
2137   //else
2138   //  logerror("%08x %08x\n",offset,data);
2139
2140}
2141
21421989WRITE8_MEMBER(pc9801_state::pc9821_video_ff_w)
21431990{
21441991   if(offset == 2)
r241788r241789
23062153      m_ext2_ff = data;
23072154}
23082155
2156/*READ8_MEMBER(pc9801_state::winram_r)
2157{
2158   offset = (offset & 0x1ffff) | (m_pc9821_window_bank & 0xfe) * 0x10000;
2159   return
2160}
2161
2162
2163WRITE8_MEMBER(pc9801_state::winram_w)
2164{
2165   offset = (offset & 0x1ffff) | (m_pc9821_window_bank & 0xfe) * 0x10000;
2166}*/
2167
23092168static ADDRESS_MAP_START( pc9821_map, AS_PROGRAM, 32, pc9801_state )
2310   AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE8(pc9821_memory_r,pc9821_memory_w,0xffffffff)
2169   AM_RANGE(0x00000000, 0x0009ffff) AM_RAMBANK("wram")
2170   //AM_RANGE(0x00080000, 0x0009ffff) AM_READWRITE8(winram_r, winram_w, 0xffffffff)
2171   AM_RANGE(0x000a0000, 0x000a3fff) AM_READWRITE8(pc9801_tvram_r, pc9801_tvram_w, 0xffffffff)
2172   AM_RANGE(0x000a4000, 0x000a4fff) AM_READWRITE8(pc9801rs_knjram_r, pc9801rs_knjram_w, 0xffffffff)
2173   AM_RANGE(0x000a8000, 0x000bffff) AM_READWRITE8(grcg_gvram_r, grcg_gvram_w, 0xffffffff)
2174   AM_RANGE(0x000cc000, 0x000cdfff) AM_ROM AM_REGION("sound_bios",0) //sound BIOS
2175   AM_RANGE(0x000d8000, 0x000d9fff) AM_ROM AM_REGION("ide",0)
2176   AM_RANGE(0x000da000, 0x000dbfff) AM_RAM // ide ram
2177   AM_RANGE(0x000e0000, 0x000e7fff) AM_READWRITE8(grcg_gvram0_r,grcg_gvram0_w, 0xffffffff)
2178   AM_RANGE(0x000e0000, 0x000fffff) AM_READ8(pc9801rs_ipl_r, 0xffffffff)
2179   AM_RANGE(0x00f00000, 0x00f9ffff) AM_RAM AM_SHARE("ext_gvram")
2180   AM_RANGE(0xffee0000, 0xffefffff) AM_READ8(pc9801rs_ipl_r, 0xffffffff)
2181   AM_RANGE(0xfffe0000, 0xffffffff) AM_READ8(pc9801rs_ipl_r, 0xffffffff)
23112182ADDRESS_MAP_END
23122183
23132184static ADDRESS_MAP_START( pc9821_io, AS_IO, 32, pc9801_state )
r241788r241789
23212192   AM_RANGE(0x0050, 0x0053) AM_WRITE8(pc9801rs_nmi_w, 0xffffffff)
23222193   AM_RANGE(0x005c, 0x005f) AM_READ16(pc9821_timestamp_r,0xffffffff) AM_WRITENOP // artic
23232194   AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("upd7220_chr", upd7220_device, read, write, 0x00ff00ff) //upd7220 character ports / <undefined>
2324   AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff)
2195   AM_RANGE(0x0064, 0x0067) AM_WRITE8(vrtc_mask_w, 0x000000ff)
23252196   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9821_video_ff_w,  0xffffffff) //mode FF / <undefined>
23262197   AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00ff00)
23272198   AM_RANGE(0x0070, 0x007f) AM_READWRITE8(grcg_r,      grcg_w,      0x00ff00ff) //display registers "GRCG" / i8253 pit
r241788r241789
27032574{
27042575   /* floppy terminal count */
27052576   m_fdc_2hd->tc_w(state);
2706   // TODO: 2dd?
2577   if(m_fdc_2dd)
2578      m_fdc_2dd->tc_w(state);
27072579
27082580//  logerror("TC %02x\n",state);
27092581}
r241788r241789
27562628   m_beeper->set_state(!(data & 0x08));
27572629}
27582630
2759READ8_MEMBER(pc9801_state::ppi_sys_portc_r)
2760{
2761   return 0xa0; // 0x80 cpu triple fault reset flag?
2762}
2763
2764READ8_MEMBER(pc9801_state::ppi_fdd_porta_r)
2765{
2766   return 0xff;
2767}
2768
2769READ8_MEMBER(pc9801_state::ppi_fdd_portb_r)
2770{
2771   return 0xff; //upd765_status_r(machine().device("upd765_2dd"),space, 0);
2772}
2773
2774READ8_MEMBER(pc9801_state::ppi_fdd_portc_r)
2775{
2776   return 0xff; //upd765_data_r(machine().device("upd765_2dd"),space, 0);
2777}
2778
2779WRITE8_MEMBER(pc9801_state::ppi_fdd_portc_w)
2780{
2781   //upd765_data_w(machine().device("upd765_2dd"),space, 0,data);
2782}
2783
27842631READ8_MEMBER(pc9801_state::ppi_mouse_porta_r)
27852632{
27862633   UINT8 res;
r241788r241789
29102757   m_rtc->oe_w(1);
29112758
29122759   m_ipl_rom = memregion("ipl")->base();
2913   m_sound_bios = memregion("sound_bios")->base();
29142760
29152761   save_item(NAME(m_sasi_data));
29162762   save_item(NAME(m_sasi_data_enable));
r241788r241789
29302776{
29312777   MACHINE_START_CALL_MEMBER(pc9801_common);
29322778
2933   m_work_ram = m_ram->pointer();
2934   m_ext_work_ram = m_ram->pointer() + 0xa0000;
2779   int ram_size = m_ram->size() - 0xa0000;
29352780
2936   m_ram_size = m_ram->size() - 0xa0000;
2937
2938   // TODO: rs and 9821 also
2939   if(!strncmp(machine().system().name, "pc9801ux", 8))
2781   address_space& space = m_maincpu->space(AS_PROGRAM);
2782   membank("wram")->set_base(m_ram->pointer());
2783   if(ram_size)
29402784   {
2941      address_space& space = m_maincpu->space(AS_PROGRAM);
2942      membank("wram")->set_base(m_ram->pointer());
2943      if(m_ram_size)
2944      {
2945         space.install_read_bank(0x100000,  0x100000 + m_ram_size - 1, "ext_wram");
2946         space.install_write_bank(0x100000,  0x100000 + m_ram_size - 1, "ext_wram");
2947         membank("ext_wram")->set_base(m_ram->pointer() + 0xa0000);
2948      }
2785      space.install_read_bank(0x100000,  0x100000 + ram_size - 1, "ext_wram");
2786      space.install_write_bank(0x100000,  0x100000 + ram_size - 1, "ext_wram");
2787      membank("ext_wram")->set_base(m_ram->pointer() + 0xa0000);
29492788   }
29502789
2951   m_ide_rom = memregion("ide")->base();
2952   m_ide_ram = auto_alloc_array(machine(), UINT8, 0x2000);
29532790   m_sys_type = 0x80 >> 6;
2954   save_pointer(NAME(m_ide_ram), 0x2000);
29552791}
29562792
29572793MACHINE_START_MEMBER(pc9801_state,pc9801bx2)
r241788r241789
29662802{
29672803   MACHINE_START_CALL_MEMBER(pc9801rs);
29682804
2969   m_ext_gvram = auto_alloc_array(machine(), UINT8, 0xa0000);
2970
29712805   save_pointer(NAME(m_sdip), 24);
2972   save_pointer(NAME(m_ext_gvram), 0xa0000);
29732806}
29742807
29752808MACHINE_START_MEMBER(pc9801_state,pc9821ap2)
r241788r241789
30362869   m_access_ctrl = 0;
30372870   m_keyb_press = 0xff; // temp kludge, for PC-9821 booting
30382871//  m_has_opna = ioport("SOUND_CONFIG")->read() & 1;
3039   memset(m_work_ram, 0, sizeof(UINT8) * 0xa0000);
30402872   m_maincpu->set_input_line(INPUT_LINE_A20, m_gate_a20);
30412873}
30422874
r241788r241789
31652997   MCFG_DEVICE_ADD("ppi8255_sys", I8255, 0)
31662998   MCFG_I8255_IN_PORTA_CB(IOPORT("DSW2"))
31672999   MCFG_I8255_IN_PORTB_CB(IOPORT("DSW1"))
3168   MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_sys_portc_r))
3000   MCFG_I8255_IN_PORTC_CB(CONSTANT(0xa0)) // 0x80 cpu triple fault reset flag?
31693001   MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_sys_portc_w))
31703002
31713003   MCFG_DEVICE_ADD("ppi8255_prn", I8255, 0)
r241788r241789
31853017   MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
31863018
31873019   MCFG_DEVICE_ADD("ppi8255_fdd", I8255, 0)
3188   MCFG_I8255_IN_PORTA_CB(READ8(pc9801_state, ppi_fdd_porta_r))
3189   MCFG_I8255_IN_PORTB_CB(READ8(pc9801_state, ppi_fdd_portb_r))
3190   MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_fdd_portc_r))
3191   MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_fdd_portc_w))
3020   MCFG_I8255_IN_PORTA_CB(CONSTANT(0xff))
3021   MCFG_I8255_IN_PORTB_CB(CONSTANT(0xff)) //upd765_status_r(machine().device("upd765_2dd"),space, 0);
3022   MCFG_I8255_IN_PORTC_CB(CONSTANT(0xff)) //upd765_data_r(machine().device("upd765_2dd"),space, 0);
3023   //MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_fdd_portc_w)) //upd765_data_w(machine().device("upd765_2dd"),space, 0,data);
31923024
31933025   MCFG_SOFTWARE_LIST_ADD("disk_list","pc98")
31943026
r241788r241789
32493081   MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
32503082MACHINE_CONFIG_END
32513083
3252#if 0
32533084static MACHINE_CONFIG_DERIVED( pc9801vm, pc9801 )
32543085   MCFG_CPU_REPLACE("maincpu",V30,10000000)
3255   MCFG_CPU_PROGRAM_MAP(pc9801_map)
3256   MCFG_CPU_IO_MAP(pc9801_io)
3086   MCFG_CPU_PROGRAM_MAP(pc9801ux_map)
3087   MCFG_CPU_IO_MAP(pc9801ux_io)
32573088   MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
3089
3090   MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9801_common)
3091   MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801_common)
32583092MACHINE_CONFIG_END
3259#endif
32603093
32613094static MACHINE_CONFIG_START( pc9801rs, pc9801_state )
32623095   MCFG_CPU_ADD("maincpu", I386SX, MAIN_CLOCK_X1*8) // unknown clock.
r241788r241789
34223255   ROM_LOAD( "font_ux.rom",     0x000000, 0x046800, BAD_DUMP CRC(19a76eeb) SHA1(96a006e8515157a624599c2b53a581ae0dd560fd) )
34233256
34243257   LOAD_KANJI_ROMS
3425   LOAD_IDE_ROM
3258//   LOAD_IDE_ROM
34263259ROM_END
34273260
34283261/*
34293262RX - 80286 12 (no V30?)
34303263
3431IPL is for a 386 model, is same as RS below
3264IPL is from ux
34323265*/
34333266
34343267ROM_START( pc9801rx )
34353268   ROM_REGION( 0x60000, "ipl", ROMREGION_ERASEFF )
3436   ROM_LOAD( "itf_rs.rom",  0x18000, 0x08000, BAD_DUMP CRC(c1815325) SHA1(a2fb11c000ed7c976520622cfb7940ed6ddc904e) )
3269   ROM_LOAD( "itf_ux.rom",  0x18000, 0x08000, BAD_DUMP CRC(c7942563) SHA1(61bb210d64c7264be939b11df1e9cd14ffeee3c9) )
34373270   ROM_LOAD( "bios_rx.rom", 0x28000, 0x018000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
34383271
34393272   ROM_REGION( 0x10000, "sound_bios", 0 )
r241788r241789
34433276   ROM_LOAD( "font_rx.rom",     0x000000, 0x046800, CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff) )
34443277
34453278   LOAD_KANJI_ROMS
3446   LOAD_IDE_ROM
3279//   LOAD_IDE_ROM
34473280ROM_END
34483281
34493282/*
r241788r241789
35133346
35143347ROM_START( pc9801vm )
35153348   ROM_REGION( 0x60000, "ipl", ROMREGION_ERASEFF )
3516   ROM_LOAD( "itf_rs.rom",  0x18000, 0x08000, CRC(c1815325) SHA1(a2fb11c000ed7c976520622cfb7940ed6ddc904e) )
3349   ROM_LOAD( "itf_ux.rom",  0x18000, 0x08000, BAD_DUMP CRC(c7942563) SHA1(61bb210d64c7264be939b11df1e9cd14ffeee3c9) )
35173350   ROM_LOAD( "bios_vm.rom", 0x28000, 0x018000, CRC(2e2d7cee) SHA1(159549f845dc70bf61955f9469d2281a0131b47f) )
35183351
35193352   ROM_REGION( 0x10000, "sound_bios", 0 )
r241788r241789
35233356   ROM_LOAD( "font_vm.rom",     0x000000, 0x046800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff) )
35243357
35253358   LOAD_KANJI_ROMS
3526   LOAD_IDE_ROM
3359//   LOAD_IDE_ROM
35273360ROM_END
35283361
35293362/*
r241788r241789
36613494   ROM_LOAD( "itf.rom",  0x18000, 0x08000, BAD_DUMP CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
36623495   ROM_LOAD( "bios_xs.rom",     0x28000, 0x018000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
36633496
3664   ROM_REGION( 0x10000, "soundcpu", 0 )
3497   ROM_REGION( 0x10000, "sound_bios", 0 )
36653498   ROM_LOAD( "sound_xs.rom",    0x000000, 0x004000, CRC(80eabfde) SHA1(e09c54152c8093e1724842c711aed6417169db23) )
36663499
36673500   ROM_REGION( 0x80000, "chargen", 0 )
r241788r241789
37753608COMP( 1983, pc9801f,   0,       0,     pc9801,   pc9801,   pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801F",  GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
37763609
37773610/* TODO: ANYTHING below there needs REDUMPING! */
3778COMP( 1989, pc9801rs,  0,       0,     pc9801rs, pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801RS", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND) //TODO: not sure about the exact model
3779COMP( 1985, pc9801vm,  pc9801rs,0,     pc9801rs, pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801VM", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
3780COMP( 1987, pc9801ux,  pc9801rs,0,     pc9801ux, pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801UX", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
3781COMP( 1988, pc9801rx,  pc9801rs,0,     pc9801ux, pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801RX", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
3611COMP( 1989, pc9801rs,  0       ,0,     pc9801rs, pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801RS", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND) //TODO: not sure about the exact model
3612COMP( 1985, pc9801vm,  pc9801ux,0,     pc9801vm, pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801VM", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
3613COMP( 1987, pc9801ux,  0       ,0,     pc9801ux, pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801UX", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
3614COMP( 1988, pc9801rx,  pc9801ux,0,     pc9801ux, pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801RX", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
37823615COMP( 1993, pc9801bx2, pc9801rs,0,     pc9801bx2,pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801BX2/U2", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
37833616COMP( 1994, pc9821,    0,       0,     pc9821,   pc9821,   pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9821 (98MATE)",  GAME_NOT_WORKING | GAME_IMPERFECT_SOUND) //TODO: not sure about the exact model
37843617COMP( 1993, pc9821as,  pc9821,  0,     pc9821,   pc9821,   pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9821 (98MATE A)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)


Previous 199869 Revisions Next


© 1997-2024 The MAME Team