Previous 199869 Revisions Next

r33282 Saturday 8th November, 2014 at 16:50:49 UTC by Carl
(mess) pc9801: bit more (nw)
[src/mess/drivers]pc9801.c

trunk/src/mess/drivers/pc9801.c
r241793r241794
560560   DECLARE_WRITE8_MEMBER(pc9801_fdc_2hd_w);
561561   DECLARE_READ8_MEMBER(pc9801_fdc_2dd_r);
562562   DECLARE_WRITE8_MEMBER(pc9801_fdc_2dd_w);
563   DECLARE_READ8_MEMBER(pc9801_tvram_r);
564   DECLARE_WRITE8_MEMBER(pc9801_tvram_w);
565   DECLARE_READ8_MEMBER(pc9801_gvram_r);
566   DECLARE_WRITE8_MEMBER(pc9801_gvram_w);
563   DECLARE_READ8_MEMBER(tvram_r);
564   DECLARE_WRITE8_MEMBER(tvram_w);
565   DECLARE_READ8_MEMBER(gvram_r);
566   DECLARE_WRITE8_MEMBER(gvram_w);
567567   DECLARE_WRITE8_MEMBER(pc9801rs_mouse_freq_w);
568   inline UINT8 m_pc9801rs_grcg_r(UINT32 offset,int vbank,int vrambank);
569   inline UINT8 m_pc9801rs_grcg_r(UINT32 offset,int vbank) { return m_pc9801rs_grcg_r(offset, vbank, m_vram_bank); }
570   inline void m_pc9801rs_grcg_w(UINT32 offset,int vbank,int vrambank,UINT8 data);
571   inline void m_pc9801rs_grcg_w(UINT32 offset,int vbank,UINT8 data) { m_pc9801rs_grcg_w(offset, vbank, m_vram_bank, data); }
572568   DECLARE_CUSTOM_INPUT_MEMBER(system_type_r);
573569   DECLARE_READ8_MEMBER(grcg_gvram_r);
574570   DECLARE_WRITE8_MEMBER(grcg_gvram_w);
r241793r241794
594590   DECLARE_READ8_MEMBER(pc9801rs_knjram_r);
595591   DECLARE_WRITE8_MEMBER(pc9801rs_knjram_w);
596592   DECLARE_WRITE8_MEMBER(pc9801rs_bank_w);
597   DECLARE_READ8_MEMBER(pc9801rs_f0_r);
598   DECLARE_WRITE8_MEMBER(pc9801rs_f0_w);
599   DECLARE_READ8_MEMBER(pc9801rs_memory_r);
600   DECLARE_WRITE8_MEMBER(pc9801rs_memory_w);
593   DECLARE_READ8_MEMBER(a20_ctrl_r);
594   DECLARE_WRITE8_MEMBER(a20_ctrl_w);
601595   DECLARE_READ8_MEMBER(pc9810rs_fdc_ctrl_r);
602596   DECLARE_WRITE8_MEMBER(pc9810rs_fdc_ctrl_w);
603597   DECLARE_READ8_MEMBER(pc9801rs_2hd_r);
r241793r241794
674668   DECLARE_PALETTE_INIT(pc9801);
675669   INTERRUPT_GEN_MEMBER(pc9801_vrtc_irq);
676670   DECLARE_READ8_MEMBER(get_slave_ack);
677   DECLARE_WRITE_LINE_MEMBER(pc9801_dma_hrq_changed);
678   DECLARE_WRITE_LINE_MEMBER(pc9801_tc_w);
679   DECLARE_READ8_MEMBER(pc9801_dma_read_byte);
680   DECLARE_WRITE8_MEMBER(pc9801_dma_write_byte);
681   DECLARE_WRITE_LINE_MEMBER(pc9801_dack0_w);
682   DECLARE_WRITE_LINE_MEMBER(pc9801_dack1_w);
683   DECLARE_WRITE_LINE_MEMBER(pc9801_dack2_w);
684   DECLARE_WRITE_LINE_MEMBER(pc9801_dack3_w);
671   DECLARE_WRITE_LINE_MEMBER(dma_hrq_changed);
672   DECLARE_WRITE_LINE_MEMBER(tc_w);
673   DECLARE_READ8_MEMBER(dma_read_byte);
674   DECLARE_WRITE8_MEMBER(dma_write_byte);
675   DECLARE_WRITE_LINE_MEMBER(dack0_w);
676   DECLARE_WRITE_LINE_MEMBER(dack1_w);
677   DECLARE_WRITE_LINE_MEMBER(dack2_w);
678   DECLARE_WRITE_LINE_MEMBER(dack3_w);
685679   DECLARE_WRITE8_MEMBER(ppi_sys_portc_w);
686680
687681   DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq);
r241793r241794
701695   }m_mouse;
702696   TIMER_DEVICE_CALLBACK_MEMBER( mouse_irq_cb );
703697
704   inline UINT32 m_calc_grcg_addr(int i,UINT32 offset,int vrambank);
705
706698   DECLARE_DRIVER_INIT(pc9801_kanji);
707699   inline void set_dma_channel(int channel, int state);
708700   virtual void device_reset_after_children();
r241793r241794
984976
985977WRITE8_MEMBER(pc9801_state::pc9801_video_ff_w)
986978{
987   if((offset & 1) == 0)
988   {
989      /*
990      TODO: this is my best bet so far. Register 4 is annoying, the pattern seems to be:
991      Write to video FF register Graphic -> 00
992      Write to video FF register 200 lines -> 0x
993      Write to video FF register 200 lines -> 00
979   /*
980   TODO: this is my best bet so far. Register 4 is annoying, the pattern seems to be:
981   Write to video FF register Graphic -> 00
982   Write to video FF register 200 lines -> 0x
983   Write to video FF register 200 lines -> 00
994984
995      where x is the current mode.
996      */
997      switch((data & 0x0e) >> 1)
998      {
999         case 1:
1000            m_gfx_ff = 1;
1001            if(data & 1)
1002               logerror("Graphic f/f actually enabled!\n");
1003               break;
1004         case 4:
1005            if(m_gfx_ff)
1006            {
1007               m_video_ff[(data & 0x0e) >> 1] = data &1;
1008               m_gfx_ff = 0;
1009            }
985   where x is the current mode.
986   */
987   switch((data & 0x0e) >> 1)
988   {
989      case 1:
990         m_gfx_ff = 1;
991         if(data & 1)
992            logerror("Graphic f/f actually enabled!\n");
1010993            break;
1011         default: m_video_ff[(data & 0x0e) >> 1] = data & 1; break;
1012      }
994      case 4:
995         if(m_gfx_ff)
996         {
997            m_video_ff[(data & 0x0e) >> 1] = data &1;
998            m_gfx_ff = 0;
999         }
1000         break;
1001      default: m_video_ff[(data & 0x0e) >> 1] = data & 1; break;
1002   }
10131003
1014      if(0)
1004   if(0)
1005   {
1006      static const char *const video_ff_regnames[] =
10151007      {
1016         static const char *const video_ff_regnames[] =
1017         {
1018            "Attribute Select", // 0
1019            "Graphic",          // 1
1020            "Column",           // 2
1021            "Font Select",      // 3
1022            "200 lines",        // 4
1023            "KAC?",             // 5
1024            "Memory Switch",    // 6
1025            "Display ON"        // 7
1026         };
1008         "Attribute Select", // 0
1009         "Graphic",          // 1
1010         "Column",           // 2
1011         "Font Select",      // 3
1012         "200 lines",        // 4
1013         "KAC?",             // 5
1014         "Memory Switch",    // 6
1015         "Display ON"        // 7
1016      };
10271017
1028         logerror("Write to video FF register %s -> %02x\n",video_ff_regnames[(data & 0x0e) >> 1],data & 1);
1029      }
1018      logerror("Write to video FF register %s -> %02x\n",video_ff_regnames[(data & 0x0e) >> 1],data & 1);
10301019   }
1031   else // odd
1032   {
1033      //logerror("Write to undefined port [%02x] <- %02x\n",offset+0x68,data);
1034   }
10351020}
10361021
10371022
r241793r241794
12941279
12951280
12961281/* TODO: banking? */
1297READ8_MEMBER(pc9801_state::pc9801_tvram_r)
1282READ8_MEMBER(pc9801_state::tvram_r)
12981283{
12991284   UINT8 res;
13001285
13011286   if((offset & 0x2000) && offset & 1)
13021287      return 0xff;
13031288
1304   //res = upd7220_vram_r(machine().device("upd7220_chr"),offset);
13051289   res = m_tvram[offset];
13061290
13071291   return res;
13081292}
13091293
1310WRITE8_MEMBER(pc9801_state::pc9801_tvram_w)
1294WRITE8_MEMBER(pc9801_state::tvram_w)
13111295{
13121296   if(offset < (0x3fe2) || m_video_ff[MEMSW_REG])
13131297      m_tvram[offset] = data;
r241793r241794
13161300}
13171301
13181302/* +0x8000 is trusted (bank 0 is actually used by 16 colors mode) */
1319READ8_MEMBER(pc9801_state::pc9801_gvram_r)
1303READ8_MEMBER(pc9801_state::gvram_r)
13201304{
13211305   return m_video_ram_2[offset+0x08000+m_vram_bank*0x20000];
13221306}
13231307
1324WRITE8_MEMBER(pc9801_state::pc9801_gvram_w)
1308WRITE8_MEMBER(pc9801_state::gvram_w)
13251309{
13261310   m_video_ram_2[offset+0x08000+m_vram_bank*0x20000] = data;
13271311}
13281312
1329inline UINT32 pc9801_state::m_calc_grcg_addr(int i,UINT32 offset,int vrambank)
1313READ8_MEMBER(pc9801_state::upd7220_grcg_r)
13301314{
1331   return (offset) + (((i+1)*0x8000) & 0x1ffff) + (vrambank*0x20000);
1332}
1333
1334inline UINT8 pc9801_state::m_pc9801rs_grcg_r(UINT32 offset,int vbank,int vrambank)
1335{
13361315   UINT8 res = 0;
13371316
13381317   if(!(m_grcg.mode & 0x80))
1339      res = m_video_ram_2[offset+vbank*0x8000+vrambank*0x20000];
1318      res = m_video_ram_2[offset];
13401319   else if(!(m_grcg.mode & 0x40))
13411320   {
13421321      int i;
13431322
1323      offset &= ~(3 << 15);
13441324      res = 0;
13451325      for(i=0;i<4;i++)
13461326      {
13471327         if((m_grcg.mode & (1 << i)) == 0)
1348            res |= (m_video_ram_2[m_calc_grcg_addr(i,offset,vrambank)] ^ m_grcg.tile[i]);
1328            res |= m_video_ram_2[offset | (((i + 1) & 3) * 0x8000)] ^ m_grcg.tile[i];
13491329      }
13501330
13511331      res ^= 0xff;
r241793r241794
13541334   return res;
13551335}
13561336
1357inline void pc9801_state::m_pc9801rs_grcg_w(UINT32 offset,int vbank,int vrambank,UINT8 data)
1337WRITE8_MEMBER(pc9801_state::upd7220_grcg_w)
13581338{
13591339   if((m_grcg.mode & 0x80) == 0)
1360      m_video_ram_2[offset+vbank*0x8000+vrambank*0x20000] = data;
1340      m_video_ram_2[offset] = data;
13611341   else
13621342   {
13631343      int i;
1344      offset &= ~(3 << 15);
13641345
13651346      if(m_grcg.mode & 0x40) // RMW
13661347      {
r241793r241794
13681349         {
13691350            if((m_grcg.mode & (1 << i)) == 0)
13701351            {
1371               m_video_ram_2[m_calc_grcg_addr(i,offset,vrambank)] &= ~data;
1372               m_video_ram_2[m_calc_grcg_addr(i,offset,vrambank)] |= m_grcg.tile[i] & data;
1352               m_video_ram_2[offset | (((i + 1) & 3) * 0x8000)] &= ~data;
1353               m_video_ram_2[offset | (((i + 1) & 3) * 0x8000)] |= m_grcg.tile[i] & data;
13731354            }
13741355         }
13751356      }
r241793r241794
13791360         {
13801361            if((m_grcg.mode & (1 << i)) == 0)
13811362            {
1382               m_video_ram_2[m_calc_grcg_addr(i,offset,vrambank)] = m_grcg.tile[i];
1363               m_video_ram_2[offset | (((i + 1) & 3) * 0x8000)] = m_grcg.tile[i];
13831364            }
13841365         }
13851366      }
13861367   }
13871368}
13881369
1389READ8_MEMBER(pc9801_state::upd7220_grcg_r)
1390{
1391   return m_pc9801rs_grcg_r(offset & 0x7fff, (offset >> 15) & 3, offset >> 17);
1392}
1393
1394WRITE8_MEMBER(pc9801_state::upd7220_grcg_w)
1395{
1396   m_pc9801rs_grcg_w(offset & 0x7fff, (offset >> 15) & 3, offset >> 17, data);
1397}
1398
13991370READ8_MEMBER(pc9801_state::ide_hack_r)
14001371{
14011372   address_space &ram = m_maincpu->space(AS_PROGRAM);
r241793r241794
15201491
15211492static ADDRESS_MAP_START( pc9801_map, AS_PROGRAM, 16, pc9801_state )
15221493   AM_RANGE(0x00000, 0x9ffff) AM_RAM //work RAM
1523   AM_RANGE(0xa0000, 0xa3fff) AM_READWRITE8(pc9801_tvram_r,pc9801_tvram_w,0xffff) //TVRAM
1524   AM_RANGE(0xa8000, 0xbffff) AM_READWRITE8(pc9801_gvram_r,pc9801_gvram_w,0xffff) //bitmap VRAM
1494   AM_RANGE(0xa0000, 0xa3fff) AM_READWRITE8(tvram_r,tvram_w,0xffff) //TVRAM
1495   AM_RANGE(0xa8000, 0xbffff) AM_READWRITE8(gvram_r,gvram_w,0xffff) //bitmap VRAM
15251496   AM_RANGE(0xcc000, 0xcdfff) AM_ROM AM_REGION("sound_bios",0) //sound BIOS
15261497   AM_RANGE(0xd6000, 0xd6fff) AM_ROM AM_REGION("fdc_bios_2dd",0) //floppy BIOS 2dd
15271498   AM_RANGE(0xd7000, 0xd7fff) AM_ROM AM_REGION("fdc_bios_2hd",0) //floppy BIOS 2hd
r241793r241794
15411512   AM_RANGE(0x0050, 0x0053) AM_WRITE8(nmi_ctrl_w,0x00ff) // NMI FF / i8255 floppy port (2d?)
15421513   AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("upd7220_chr", upd7220_device, read, write, 0x00ff) //upd7220 character ports / <undefined>
15431514   AM_RANGE(0x0064, 0x0065) AM_WRITE8(vrtc_mask_w,0x00ff)
1544   AM_RANGE(0x0068, 0x0069) AM_WRITE8(pc9801_video_ff_w,0xffff) //mode FF / <undefined>
1515   AM_RANGE(0x0068, 0x0069) AM_WRITE8(pc9801_video_ff_w,0x00ff) //mode FF / <undefined>
15451516//  AM_RANGE(0x006c, 0x006f) border color / <undefined>
15461517   AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00)
15471518   AM_RANGE(0x0070, 0x007b) AM_READWRITE8(txt_scrl_r,txt_scrl_w,0x00ff) //display registers / i8253 pit
r241793r241794
16311602   }
16321603}
16331604
1634READ8_MEMBER(pc9801_state::pc9801rs_f0_r)
1605READ8_MEMBER(pc9801_state::a20_ctrl_r)
16351606{
1636   if(offset == 0x02)
1607   if(offset == 0x01)
16371608      return (m_gate_a20 ^ 1) | 0xfe;
1638   else if(offset == 0x06)
1609   else if(offset == 0x03)
16391610      return (m_gate_a20 ^ 1) | (m_nmi_enable << 1);
16401611
16411612   return 0x00;
16421613}
16431614
1644WRITE8_MEMBER(pc9801_state::pc9801rs_f0_w)
1615WRITE8_MEMBER(pc9801_state::a20_ctrl_w)
16451616{
16461617   if(offset == 0x00)
16471618   {
r241793r241794
16541625      m_gate_a20 = 0;
16551626   }
16561627
1657   if(offset == 0x02)
1628   if(offset == 0x01)
16581629      m_gate_a20 = 1;
16591630
1660   if(offset == 0x06)
1631   if(offset == 0x03)
16611632   {
16621633      if(data == 0x02)
16631634         m_gate_a20 = 1;
r241793r241794
18161787
18171788WRITE8_MEMBER(pc9801_state::pc9801rs_video_ff_w)
18181789{
1819   if(offset == 2)
1790   if(offset == 1)
18201791   {
18211792      if((data & 0xf0) == 0) /* disable any PC-9821 specific HW regs */
18221793         m_ex_video_ff[(data & 0xfe) >> 1] = data & 1;
r241793r241794
19161887
19171888READ8_MEMBER(pc9801_state::grcg_gvram_r)
19181889{
1919   return m_pc9801rs_grcg_r(offset & 0x7fff,(offset>>15)+1);
1890   return upd7220_grcg_r(space, (offset + 0x8000) | (m_vram_bank << 17), mem_mask);
19201891}
19211892
19221893WRITE8_MEMBER(pc9801_state::grcg_gvram_w)
19231894{
1924   m_pc9801rs_grcg_w(offset & 0x7fff,(offset>>15)+1,data);
1895   upd7220_grcg_w(space, (offset + 0x8000) | (m_vram_bank << 17), data, mem_mask);
19251896}
19261897
19271898READ8_MEMBER(pc9801_state::grcg_gvram0_r)
19281899{
1929   return m_pc9801rs_grcg_r(offset & 0x7fff,0);
1900   return upd7220_grcg_r(space, offset | (m_vram_bank << 17), mem_mask);
19301901}
19311902
19321903WRITE8_MEMBER(pc9801_state::grcg_gvram0_w)
19331904{
1934   m_pc9801rs_grcg_w(offset & 0x7fff,0,data);
1905   upd7220_grcg_w(space, offset | (m_vram_bank << 17), data, mem_mask);
19351906}
19361907
19371908static ADDRESS_MAP_START( pc9801ux_map, AS_PROGRAM, 16, pc9801_state )
19381909   AM_RANGE(0x000000, 0x09ffff) AM_RAMBANK("wram")
1939   AM_RANGE(0x0a0000, 0x0a3fff) AM_READWRITE8(pc9801_tvram_r, pc9801_tvram_w, 0xffff)
1910   AM_RANGE(0x0a0000, 0x0a3fff) AM_READWRITE8(tvram_r, tvram_w, 0xffff)
19401911   AM_RANGE(0x0a4000, 0x0a4fff) AM_READWRITE8(pc9801rs_knjram_r, pc9801rs_knjram_w, 0xffff)
19411912   AM_RANGE(0x0a8000, 0x0bffff) AM_READWRITE8(grcg_gvram_r, grcg_gvram_w, 0xffff)
19421913   AM_RANGE(0x0e0000, 0x0e7fff) AM_READWRITE8(grcg_gvram0_r,grcg_gvram0_w, 0xffff)
r241793r241794
19471918   ADDRESS_MAP_UNMAP_HIGH
19481919   AM_RANGE(0x0050, 0x0057) AM_NOP // 2dd ppi?
19491920   AM_RANGE(0x005c, 0x005f) AM_READ(pc9821_timestamp_r) AM_WRITENOP // artic
1950   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0xffff) //mode FF / <undefined>
1921   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0x00ff) //mode FF / <undefined>
19511922   AM_RANGE(0x0070, 0x007f) AM_READWRITE8(grcg_r,      grcg_w,      0x00ff) //display registers "GRCG" / i8253 pit
19521923   AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffff)
19531924   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,        pc9801rs_a0_w,      0xffff) //upd7220 bitmap ports / display registers
19541925   AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffff)
19551926   AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffff)
1956   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r,      pc9801rs_f0_w,      0xffff)
1927   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(a20_ctrl_r,      a20_ctrl_w,      0x00ff)
19571928   AM_RANGE(0x0438, 0x043b) AM_READWRITE8(pc9801rs_access_ctrl_r,pc9801rs_access_ctrl_w,0xffff)
19581929   AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w,    0xffff) //ROM/RAM bank
19591930   AM_RANGE(0x3fd8, 0x3fdf) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00)
r241793r241794
19881959
19891960WRITE8_MEMBER(pc9801_state::pc9821_video_ff_w)
19901961{
1991   if(offset == 2)
1962   if(offset == 1)
19921963   {
19931964      m_ex_video_ff[(data & 0xfe) >> 1] = data & 1;
19941965
r241793r241794
21322103{
21332104   UINT8 res;
21342105
2135   if(offset)
2136      return 0xff;
2137
21382106   res = 0;
21392107
21402108   switch(m_ext2_ff)
r241793r241794
21492117
21502118WRITE8_MEMBER(pc9801_state::pc9821_ext2_video_ff_w)
21512119{
2152   if(offset == 0)
2153      m_ext2_ff = data;
2120   m_ext2_ff = data;
21542121}
21552122
21562123/*READ8_MEMBER(pc9801_state::winram_r)
r241793r241794
21682135static ADDRESS_MAP_START( pc9821_map, AS_PROGRAM, 32, pc9801_state )
21692136   AM_RANGE(0x00000000, 0x0009ffff) AM_RAMBANK("wram")
21702137   //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)
2138   AM_RANGE(0x000a0000, 0x000a3fff) AM_READWRITE8(tvram_r, tvram_w, 0xffffffff)
21722139   AM_RANGE(0x000a4000, 0x000a4fff) AM_READWRITE8(pc9801rs_knjram_r, pc9801rs_knjram_w, 0xffffffff)
21732140   AM_RANGE(0x000a8000, 0x000bffff) AM_READWRITE8(grcg_gvram_r, grcg_gvram_w, 0xffffffff)
21742141   AM_RANGE(0x000cc000, 0x000cdfff) AM_ROM AM_REGION("sound_bios",0) //sound BIOS
r241793r241794
21932160   AM_RANGE(0x005c, 0x005f) AM_READ16(pc9821_timestamp_r,0xffffffff) AM_WRITENOP // artic
21942161   AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("upd7220_chr", upd7220_device, read, write, 0x00ff00ff) //upd7220 character ports / <undefined>
21952162   AM_RANGE(0x0064, 0x0067) AM_WRITE8(vrtc_mask_w, 0x000000ff)
2196   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9821_video_ff_w,  0xffffffff) //mode FF / <undefined>
2163   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9821_video_ff_w,  0x00ff00ff) //mode FF / <undefined>
21972164   AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00ff00)
21982165   AM_RANGE(0x0070, 0x007f) AM_READWRITE8(grcg_r,      grcg_w,      0x00ff00ff) //display registers "GRCG" / i8253 pit
21992166   AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffffffff)
r241793r241794
22042171   AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffffffff)
22052172   AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffffffff)
22062173//  AM_RANGE(0x00d8, 0x00df) AMD98 (sound?) board
2207   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r,      pc9801rs_f0_w,      0xffffffff)
2174   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(a20_ctrl_r,      a20_ctrl_w,      0x00ff00ff)
22082175//  AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r,       pc9801_opn_w,       0xffffffff) //ym2203 opn / <undefined>
22092176//  AM_RANGE(0x018c, 0x018f) YM2203 OPN extended ports / <undefined>
22102177   AM_RANGE(0x0430, 0x0433) AM_READ8(ide_hack_r, 0x000000ff)
r241793r241794
22172184   AM_RANGE(0x0640, 0x064f) AM_DEVREADWRITE16("ide", ata_interface_device, read_cs0, write_cs0, 0xffffffff)
22182185   AM_RANGE(0x0740, 0x074f) AM_DEVREADWRITE16("ide", ata_interface_device, read_cs1, write_cs1, 0xffffffff)
22192186//  AM_RANGE(0x08e0, 0x08ea) <undefined> / EMM SIO registers
2220   AM_RANGE(0x09a0, 0x09a3) AM_READWRITE8(pc9821_ext2_video_ff_r, pc9821_ext2_video_ff_w, 0xffffffff) // GDC extended register r/w
2187   AM_RANGE(0x09a0, 0x09a3) AM_READWRITE8(pc9821_ext2_video_ff_r, pc9821_ext2_video_ff_w, 0x000000ff) // GDC extended register r/w
22212188//  AM_RANGE(0x09a8, 0x09a8) GDC 31KHz register r/w
22222189//  AM_RANGE(0x0c07, 0x0c07) EPSON register w
22232190//  AM_RANGE(0x0c03, 0x0c03) EPSON register 0 r
r241793r241794
25612528*
25622529****************************************/
25632530
2564WRITE_LINE_MEMBER(pc9801_state::pc9801_dma_hrq_changed)
2531WRITE_LINE_MEMBER(pc9801_state::dma_hrq_changed)
25652532{
25662533   m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
25672534
r241793r241794
25702537//  logerror("%02x HLDA\n",state);
25712538}
25722539
2573WRITE_LINE_MEMBER(pc9801_state::pc9801_tc_w )
2540WRITE_LINE_MEMBER(pc9801_state::tc_w )
25742541{
25752542   /* floppy terminal count */
25762543   m_fdc_2hd->tc_w(state);
r241793r241794
25802547//  logerror("TC %02x\n",state);
25812548}
25822549
2583READ8_MEMBER(pc9801_state::pc9801_dma_read_byte)
2550READ8_MEMBER(pc9801_state::dma_read_byte)
25842551{
25852552   address_space &program = m_maincpu->space(AS_PROGRAM);
25862553   offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
r241793r241794
25912558}
25922559
25932560
2594WRITE8_MEMBER(pc9801_state::pc9801_dma_write_byte)
2561WRITE8_MEMBER(pc9801_state::dma_write_byte)
25952562{
25962563   address_space &program = m_maincpu->space(AS_PROGRAM);
25972564   offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
r241793r241794
26062573   if (!state) m_dack = channel;
26072574}
26082575
2609WRITE_LINE_MEMBER(pc9801_state::pc9801_dack0_w){ /*logerror("%02x 0\n",state);*/ set_dma_channel(0, state); }
2610WRITE_LINE_MEMBER(pc9801_state::pc9801_dack1_w){ /*logerror("%02x 1\n",state);*/ set_dma_channel(1, state); }
2611WRITE_LINE_MEMBER(pc9801_state::pc9801_dack2_w){ /*logerror("%02x 2\n",state);*/ set_dma_channel(2, state); }
2612WRITE_LINE_MEMBER(pc9801_state::pc9801_dack3_w){ /*logerror("%02x 3\n",state);*/ set_dma_channel(3, state); }
2576WRITE_LINE_MEMBER(pc9801_state::dack0_w){ /*logerror("%02x 0\n",state);*/ set_dma_channel(0, state); }
2577WRITE_LINE_MEMBER(pc9801_state::dack1_w){ /*logerror("%02x 1\n",state);*/ set_dma_channel(1, state); }
2578WRITE_LINE_MEMBER(pc9801_state::dack2_w){ /*logerror("%02x 2\n",state);*/ set_dma_channel(2, state); }
2579WRITE_LINE_MEMBER(pc9801_state::dack3_w){ /*logerror("%02x 3\n",state);*/ set_dma_channel(3, state); }
26132580
26142581/*
26152582ch1 cs-4231a
r241793r241794
29812948   MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pc9801_state, write_uart_clock))
29822949
29832950   MCFG_DEVICE_ADD("i8237", AM9517A, 5000000) // unknown clock, TODO: check channels 0 - 1
2984   MCFG_I8237_OUT_HREQ_CB(WRITELINE(pc9801_state, pc9801_dma_hrq_changed))
2985   MCFG_I8237_OUT_EOP_CB(WRITELINE(pc9801_state, pc9801_tc_w))
2986   MCFG_I8237_IN_MEMR_CB(READ8(pc9801_state, pc9801_dma_read_byte))
2987   MCFG_I8237_OUT_MEMW_CB(WRITE8(pc9801_state, pc9801_dma_write_byte))
2951   MCFG_I8237_OUT_HREQ_CB(WRITELINE(pc9801_state, dma_hrq_changed))
2952   MCFG_I8237_OUT_EOP_CB(WRITELINE(pc9801_state, tc_w))
2953   MCFG_I8237_IN_MEMR_CB(READ8(pc9801_state, dma_read_byte))
2954   MCFG_I8237_OUT_MEMW_CB(WRITE8(pc9801_state, dma_write_byte))
29882955   MCFG_I8237_IN_IOR_2_CB(DEVREAD8("upd765_2hd", upd765a_device, mdma_r))
29892956   MCFG_I8237_OUT_IOW_2_CB(DEVWRITE8("upd765_2hd", upd765a_device, mdma_w))
2990   MCFG_I8237_OUT_DACK_0_CB(WRITELINE(pc9801_state, pc9801_dack0_w))
2991   MCFG_I8237_OUT_DACK_1_CB(WRITELINE(pc9801_state, pc9801_dack1_w))
2992   MCFG_I8237_OUT_DACK_2_CB(WRITELINE(pc9801_state, pc9801_dack2_w))
2993   MCFG_I8237_OUT_DACK_3_CB(WRITELINE(pc9801_state, pc9801_dack3_w))
2957   MCFG_I8237_OUT_DACK_0_CB(WRITELINE(pc9801_state, dack0_w))
2958   MCFG_I8237_OUT_DACK_1_CB(WRITELINE(pc9801_state, dack1_w))
2959   MCFG_I8237_OUT_DACK_2_CB(WRITELINE(pc9801_state, dack2_w))
2960   MCFG_I8237_OUT_DACK_3_CB(WRITELINE(pc9801_state, dack3_w))
29942961   MCFG_PIC8259_ADD( "pic8259_master", INPUTLINE("maincpu", 0), VCC, READ8(pc9801_state,get_slave_ack) )
29952962   MCFG_PIC8259_ADD( "pic8259_slave", DEVWRITELINE("pic8259_master", pic8259_device, ir7_w), GND, NULL ) // TODO: Check ir7_w
29962963
r241793r241794
32613228/*
32623229RX - 80286 12 (no V30?)
32633230
3264IPL is from ux
3231The bios is from a 386 model not an RX
32653232*/
32663233
32673234ROM_START( pc9801rx )
32683235   ROM_REGION( 0x60000, "ipl", ROMREGION_ERASEFF )
3269   ROM_LOAD( "itf_ux.rom",  0x18000, 0x08000, BAD_DUMP CRC(c7942563) SHA1(61bb210d64c7264be939b11df1e9cd14ffeee3c9) )
3236   ROM_LOAD( "itf_rs.rom",  0x18000, 0x08000, BAD_DUMP CRC(c1815325) SHA1(a2fb11c000ed7c976520622cfb7940ed6ddc904e) )
32703237   ROM_LOAD( "bios_rx.rom", 0x28000, 0x018000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
3238   // fix csum
3239   ROM_FILL(0x3fffe, 1, 0x0d)
32713240
32723241   ROM_REGION( 0x10000, "sound_bios", 0 )
32733242   ROM_LOAD( "sound_rx.rom",    0x000000, 0x004000, CRC(fe9f57f2) SHA1(d5dbc4fea3b8367024d363f5351baecd6adcd8ef) )
r241793r241794
32763245   ROM_LOAD( "font_rx.rom",     0x000000, 0x046800, CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff) )
32773246
32783247   LOAD_KANJI_ROMS
3279//   LOAD_IDE_ROM
3248   LOAD_IDE_ROM
32803249ROM_END
32813250
32823251/*
r241793r241794
36113580COMP( 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
36123581COMP( 1985, pc9801vm,  pc9801ux,0,     pc9801vm, pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801VM", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
36133582COMP( 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)
3583COMP( 1988, pc9801rx,  pc9801rs,0,     pc9801rs, pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801RX", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
36153584COMP( 1993, pc9801bx2, pc9801rs,0,     pc9801bx2,pc9801rs, pc9801_state, pc9801_kanji, "Nippon Electronic Company",   "PC-9801BX2/U2", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND)
36163585COMP( 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
36173586COMP( 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