Previous 199869 Revisions Next

r33275 Friday 7th November, 2014 at 21:47:35 UTC by Carl
(mess) pc9801: cleanup and refactor(nw)
[src/mess/drivers]pc9801.c

trunk/src/mess/drivers/pc9801.c
r241786r241787
1818    - some later SWs put "Invalid command byte 05" (Absolutely Mahjong on Epson logo)
1919    - Basic games are mostly untested, but I think that upd7220 fails on those (Adventureland, Xevious)
2020    - investigate on POR bit
21    - PC-9801RS+ should support uPD4990 RTC
21    - 2dd bios tries to use dma channel 2
2222
2323    TODO (PC-9801RS):
2424    - extra features;
r241786r241787
2929    - fix CPU for some clones;
3030    - "cache error"
3131    - undumped IDE ROM, kludged to work
32    - slave PIC never enables floppy IRQ (PC=0xffd08)
3332    - Compatibility is untested;
3433
3534    TODO: (PC-486MU)
r241786r241787
460459      m_beeper(*this, "beeper"),
461460      m_ram(*this, RAM_TAG),
462461      m_gfxdecode(*this, "gfxdecode"),
463      m_palette(*this, "palette")
462      m_palette(*this, "palette"),
463      m_screen(*this, "screen")
464464   {
465465   }
466466
r241786r241787
487487   optional_device<ram_device> m_ram;
488488   required_device<gfxdecode_device> m_gfxdecode;
489489   required_device<palette_device> m_palette;
490   required_device<screen_device> m_screen;
490491
491492   virtual void video_start();
492493   UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
r241786r241787
554555   UINT8 m_ext2_ff;
555556   UINT8 m_sys_type;
556557
557   DECLARE_WRITE_LINE_MEMBER( keyboard_irq );
558558   DECLARE_WRITE_LINE_MEMBER( write_uart_clock );
559   DECLARE_READ8_MEMBER(pc9801_xx_r);
560   DECLARE_WRITE8_MEMBER(pc9801_xx_w);
561   DECLARE_READ8_MEMBER(pc9801_00_r);
562   DECLARE_WRITE8_MEMBER(pc9801_00_w);
563   DECLARE_READ8_MEMBER(pc9801_20_r);
564   DECLARE_WRITE8_MEMBER(pc9801_20_w);
565   DECLARE_READ8_MEMBER(pc9801_30_r);
566   DECLARE_WRITE8_MEMBER(pc9801_30_w);
567   DECLARE_READ8_MEMBER(pc9801_40_r);
568   DECLARE_WRITE8_MEMBER(pc9801_40_w);
569   DECLARE_READ8_MEMBER(pc9801_50_r);
570   DECLARE_WRITE8_MEMBER(pc9801_50_w);
571   DECLARE_READ8_MEMBER(pc9801_60_r);
572   DECLARE_WRITE8_MEMBER(pc9801_60_w);
559   DECLARE_WRITE8_MEMBER(rtc_dmapg_w);
560   DECLARE_WRITE8_MEMBER(nmi_ctrl_w);
573561   DECLARE_WRITE8_MEMBER(pc9801_vrtc_mask_w);
574562   DECLARE_WRITE8_MEMBER(pc9801_video_ff_w);
575   DECLARE_READ8_MEMBER(pc9801_70_r);
576   DECLARE_WRITE8_MEMBER(pc9801_70_w);
577   DECLARE_READ8_MEMBER(pc9801rs_70_r);
578   DECLARE_WRITE8_MEMBER(pc9801rs_70_w);
579   DECLARE_READ8_MEMBER(pc9801_sasi_r);
580   DECLARE_WRITE8_MEMBER(pc9801_sasi_w);
563   DECLARE_READ8_MEMBER(txt_scrl_r);
564   DECLARE_WRITE8_MEMBER(txt_scrl_w);
565   DECLARE_READ8_MEMBER(grcg_r);
566   DECLARE_WRITE8_MEMBER(grcg_w);
581567   DECLARE_READ8_MEMBER(pc9801_a0_r);
582568   DECLARE_WRITE8_MEMBER(pc9801_a0_w);
583569   DECLARE_READ8_MEMBER(pc9801_fdc_2hd_r);
r241786r241787
588574   DECLARE_WRITE8_MEMBER(pc9801_tvram_w);
589575   DECLARE_READ8_MEMBER(pc9801_gvram_r);
590576   DECLARE_WRITE8_MEMBER(pc9801_gvram_w);
591   DECLARE_READ8_MEMBER(pc9801_mouse_r);
592   DECLARE_WRITE8_MEMBER(pc9801_mouse_w);
593577   DECLARE_WRITE8_MEMBER(pc9801rs_mouse_freq_w);
594578   inline UINT8 m_pc9801rs_grcg_r(UINT32 offset,int vbank,int vrambank);
595579   inline UINT8 m_pc9801rs_grcg_r(UINT32 offset,int vbank) { return m_pc9801rs_grcg_r(offset, vbank, m_vram_bank); }
r241786r241787
626610   DECLARE_WRITE8_MEMBER(pc9801rs_bank_w);
627611   DECLARE_READ8_MEMBER(pc9801rs_f0_r);
628612   DECLARE_WRITE8_MEMBER(pc9801rs_f0_w);
629   DECLARE_READ8_MEMBER(pc9801rs_30_r);
630613   DECLARE_READ8_MEMBER(pc9801rs_memory_r);
631614   DECLARE_WRITE8_MEMBER(pc9801rs_memory_w);
632615   DECLARE_READ8_MEMBER(pc9801rs_soundrom_r);
r241786r241787
642625   DECLARE_WRITE8_MEMBER(pc9821_video_ff_w);
643626   DECLARE_READ8_MEMBER(pc9821_a0_r);
644627   DECLARE_WRITE8_MEMBER(pc9821_a0_w);
645   DECLARE_READ8_MEMBER(pc9801rs_pit_mirror_r);
646   DECLARE_WRITE8_MEMBER(pc9801rs_pit_mirror_w);
647628   DECLARE_READ8_MEMBER(pc9801rs_access_ctrl_r);
648629   DECLARE_WRITE8_MEMBER(pc9801rs_access_ctrl_w);
649630   DECLARE_WRITE8_MEMBER(pc9801rs_nmi_w);
r241786r241787
688669   DECLARE_WRITE8_MEMBER(pc9821_ext_gvram_w);
689670   DECLARE_READ8_MEMBER(pc9821_window_bank_r);
690671   DECLARE_WRITE8_MEMBER(pc9821_window_bank_w);
691   DECLARE_READ32_MEMBER(pc9821_timestamp_r);
672   DECLARE_READ16_MEMBER(pc9821_timestamp_r);
692673   DECLARE_READ8_MEMBER(pc9821_ext2_video_ff_r);
693674   DECLARE_WRITE8_MEMBER(pc9821_ext2_video_ff_w);
694675
r241786r241787
706687   DECLARE_MACHINE_START(pc9801bx2);
707688   DECLARE_MACHINE_START(pc9821);
708689   DECLARE_MACHINE_START(pc9821ap2);
709
710690   DECLARE_MACHINE_RESET(pc9801_common);
711691   DECLARE_MACHINE_RESET(pc9801f);
712692   DECLARE_MACHINE_RESET(pc9801rs);
r241786r241787
714694
715695   DECLARE_PALETTE_INIT(pc9801);
716696   INTERRUPT_GEN_MEMBER(pc9801_vrtc_irq);
717//  DECLARE_INPUT_CHANGED_MEMBER(key_stroke);
718//  DECLARE_INPUT_CHANGED_MEMBER(shift_stroke);
719697   DECLARE_READ8_MEMBER(get_slave_ack);
720698   DECLARE_WRITE_LINE_MEMBER(pc9801_dma_hrq_changed);
721699   DECLARE_WRITE_LINE_MEMBER(pc9801_tc_w);
r241786r241787
725703   DECLARE_WRITE_LINE_MEMBER(pc9801_dack1_w);
726704   DECLARE_WRITE_LINE_MEMBER(pc9801_dack2_w);
727705   DECLARE_WRITE_LINE_MEMBER(pc9801_dack3_w);
728   DECLARE_READ8_MEMBER(fdc_2hd_r);
729   DECLARE_WRITE8_MEMBER(fdc_2hd_w);
730   DECLARE_READ8_MEMBER(fdc_2dd_r);
731   DECLARE_WRITE8_MEMBER(fdc_2dd_w);
732706   DECLARE_READ8_MEMBER(ppi_sys_portc_r);
733707   DECLARE_WRITE8_MEMBER(ppi_sys_portc_w);
734708   DECLARE_READ8_MEMBER(ppi_fdd_porta_r);
r241786r241787
753727   }m_mouse;
754728   TIMER_DEVICE_CALLBACK_MEMBER( mouse_irq_cb );
755729
756   void pc9801_fdc_2hd_update_ready(floppy_image_device *, int);
757730   inline UINT32 m_calc_grcg_addr(int i,UINT32 offset,int vrambank);
758731
759732   DECLARE_DRIVER_INIT(pc9801_kanji);
r241786r241787
818791         res_x = x + xi;
819792         res_y = y;
820793
821         if(!machine().first_screen()->visible_area().contains(res_x, res_y*2+0))
794         if(!m_screen->visible_area().contains(res_x, res_y*2+0))
822795            return;
823796
824797         pen = m_ext_gvram[(address*8+xi)+(m_vram_disp*0x40000)];
r241786r241787
843816
844817         if(interlace_on)
845818         {
846            if(machine().first_screen()->visible_area().contains(res_x, res_y*2+0))
819            if(m_screen->visible_area().contains(res_x, res_y*2+0))
847820               bitmap.pix32(res_y*2+0, res_x) = palette[pen + colors16_mode];
848821            /* TODO: it looks like that PC-98xx can only display even lines ... */
849            if(machine().first_screen()->visible_area().contains(res_x, res_y*2+1))
822            if(m_screen->visible_area().contains(res_x, res_y*2+1))
850823               bitmap.pix32(res_y*2+1, res_x) = palette[pen + colors16_mode];
851824         }
852825         else
r241786r241787
932905               res_x = ((x+kanji_lr)*8+xi) * (m_video_ff[WIDTH40_REG]+1);
933906               res_y = y+yi - (m_txt_scroll_reg[3] & 0xf);
934907
935               if(!machine().first_screen()->visible_area().contains(res_x, res_y))
908               if(!m_screen->visible_area().contains(res_x, res_y))
936909                  continue;
937910
938911               tile_data = 0;
r241786r241787
973946               if(v_line)  { tile_data|=8; }
974947
975948               /* TODO: proper blink rate for these two */
976               if(cursor_on && cursor_addr == tile_addr && machine().first_screen()->frame_number() & 0x10)
949               if(cursor_on && cursor_addr == tile_addr && m_screen->frame_number() & 0x10)
977950                  tile_data^=0xff;
978951
979               if(blink && machine().first_screen()->frame_number() & 0x10)
952               if(blink && m_screen->frame_number() & 0x10)
980953                  tile_data^=0xff;
981954
982955               if(yi >= char_size)
r241786r241787
989962
990963               if(m_video_ff[WIDTH40_REG])
991964               {
992                  if(!machine().first_screen()->visible_area().contains(res_x+1, res_y))
965                  if(!m_screen->visible_area().contains(res_x+1, res_y))
993966                     continue;
994967
995968                  if(pen != -1)
r241786r241787
1002975}
1003976
1004977
1005#if 0
1006READ8_MEMBER(pc9801_state::pc9801_xx_r)
978WRITE8_MEMBER(pc9801_state::rtc_dmapg_w)
1007979{
1008980   if((offset & 1) == 0)
1009981   {
1010      printf("Read to undefined port [%02x]\n",offset+0xxx);
1011      return 0xff;
1012   }
1013   else // odd
1014   {
1015      printf("Read to undefined port [%02x]\n",offset+0xxx);
1016      return 0xff;
1017   }
1018}
1019
1020WRITE8_MEMBER(pc9801_state::pc9801_xx_w)
1021{
1022   if((offset & 1) == 0)
1023   {
1024      printf("Write to undefined port [%02x] <- %02x\n",offset+0xxx,data);
1025   }
1026   else // odd
1027   {
1028      printf("Write to undefined port [%02x] <- %02x\n",offset+0xxx,data);
1029   }
1030}
1031
1032#endif
1033
1034READ8_MEMBER(pc9801_state::pc9801_00_r)
1035{
1036   if((offset & 1) == 0)
1037   {
1038      if(offset & 0x14)
1039         printf("Read to undefined port [%02x]\n",offset+0x00);
1040      else
1041         return ((offset & 8) ? m_pic2 : m_pic1)->read(space, (offset & 2) >> 1);
1042   }
1043   else // odd
1044   {
1045      return m_dmac->read(space, (offset & 0x1e) >> 1, 0xff);
1046   }
1047
1048   return 0xff;
1049}
1050
1051WRITE8_MEMBER(pc9801_state::pc9801_00_w)
1052{
1053   if((offset & 1) == 0)
1054   {
1055      if(offset & 0x14)
1056         printf("Write to undefined port [%02x] <- %02x\n",offset+0x00,data);
1057      else
1058         ((offset & 8) ? m_pic2 : m_pic1)->write(space, (offset & 2) >> 1, data);
1059   }
1060   else // odd
1061   {
1062      m_dmac->write(space, (offset & 0x1e) >> 1, data, 0xff);
1063   }
1064}
1065
1066READ8_MEMBER(pc9801_state::pc9801_20_r)
1067{
1068   if((offset & 1) == 0)
1069   {
1070982      if(offset == 0)
1071         printf("Read to RTC port [%02x]\n",offset+0x20);
1072      else
1073         printf("Read to undefined port [%02x]\n",offset+0x20);
1074
1075      return 0xff;
1076   }
1077   else // odd
1078   {
1079      printf("Read to undefined port [%02x]\n",offset+0x20);
1080      return 0xff;
1081   }
1082}
1083
1084WRITE8_MEMBER(pc9801_state::pc9801_20_w)
1085{
1086   if((offset & 1) == 0)
1087   {
1088      if(offset == 0)
1089983      {
1090984         m_rtc->c0_w((data & 0x01) >> 0);
1091985         m_rtc->c1_w((data & 0x02) >> 1);
r241786r241787
1094988         m_rtc->clk_w((data & 0x10) >> 4);
1095989         m_rtc->data_in_w(((data & 0x20) >> 5));
1096990         if(data & 0xc0)
1097            printf("RTC write to undefined bits %02x\n",data & 0xc0);
991            logerror("RTC write to undefined bits %02x\n",data & 0xc0);
1098992      }
1099993      else
1100         printf("Write to undefined port [%02x] <- %02x\n",offset+0x20,data);
994         logerror("Write to undefined port [%02x] <- %02x\n",offset+0x20,data);
1101995   }
1102996   else // odd
1103997   {
1104//      printf("Write to DMA bank register %d %02x\n",((offset >> 1)+1) & 3,data);
998//      logerror("Write to DMA bank register %d %02x\n",((offset >> 1)+1) & 3,data);
1105999      m_dma_offset[((offset >> 1)+1) & 3] = data & 0x0f;
11061000   }
11071001}
11081002
1109READ8_MEMBER(pc9801_state::pc9801_30_r)
1003WRITE8_MEMBER(pc9801_state::nmi_ctrl_w)
11101004{
1111   if((offset & 1) == 0)
1112   {
1113      if(offset & 4)
1114         printf("Read to undefined port [%02x]\n",offset+0x30);
1115      else
1116         printf("Read to RS-232c port [%02x]\n",offset+0x30);
1117
1118      return 0xff;
1119   }
1120   else // odd
1121   {
1122      return machine().device<i8255_device>("ppi8255_sys")->read(space, (offset & 6) >> 1);
1123   }
1005   m_nmi_ff = (offset & 2) >> 1;
11241006}
11251007
1126WRITE8_MEMBER(pc9801_state::pc9801_30_w)
1127{
1128   if((offset & 1) == 0)
1129   {
1130      if(offset & 4)
1131         printf("Write to undefined port [%02x] %02x\n",offset+0x30,data);
1132      else
1133         printf("Write to RS-232c port [%02x] %02x\n",offset+0x30,data);
1134   }
1135   else // odd
1136   {
1137      machine().device<i8255_device>("ppi8255_sys")->write(space, (offset & 6) >> 1,data);
1138   }
1139}
1140
1141READ8_MEMBER(pc9801_state::pc9801_40_r)
1142{
1143   if((offset & 1) == 0)
1144   {
1145      return machine().device<i8255_device>("ppi8255_prn")->read(space, (offset & 6) >> 1);
1146   }
1147   else // odd
1148   {
1149      if(offset & 4)
1150         printf("Read to undefined port [%02x]\n",offset+0x40);
1151      else
1152      {
1153         //printf("Read to 8251 kbd port [%02x] %08x\n",offset+0x40,m_maincpu->pc());
1154         if(offset == 1)
1155         {
1156            return m_keyb->rx_r(space,0);
1157         }
1158
1159         return 1 | 4 | 2;
1160      }
1161   }
1162
1163   return 0xff;
1164}
1165
1166WRITE8_MEMBER(pc9801_state::pc9801_40_w)
1167{
1168   if((offset & 1) == 0)
1169   {
1170      machine().device<i8255_device>("ppi8255_prn")->write(space, (offset & 6) >> 1,data);
1171   }
1172   else // odd
1173   {
1174      if(offset & 4)
1175         printf("Write to undefined port [%02x] <- %02x\n",offset+0x40,data);
1176      else
1177      {
1178         if(offset == 1)
1179         {
1180            m_keyb->tx_w(space,0,data);
1181            return;
1182         }
1183         //printf("Write to 8251 kbd port [%02x] <- %02x\n",offset+0x40,data);
1184      }
1185   }
1186}
1187
1188READ8_MEMBER(pc9801_state::pc9801_50_r)
1189{
1190   if((offset & 1) == 0)
1191   {
1192      if(offset & 4)
1193         printf("Read to undefined port [%02x]\n",offset+0x50);
1194      else
1195         printf("Read to NMI FF port [%02x]\n",offset+0x50);
1196
1197      return 0xff;
1198   }
1199   else // odd
1200   {
1201      return machine().device<i8255_device>("ppi8255_fdd")->read(space, (offset & 6) >> 1);
1202   }
1203}
1204
1205WRITE8_MEMBER(pc9801_state::pc9801_50_w)
1206{
1207   if((offset & 1) == 0)
1208   {
1209      if(offset & 4)
1210         printf("Write to undefined port [%02x] %02x\n",offset+0x50,data);
1211      else
1212         m_nmi_ff = (offset & 2) >> 1;
1213
1214   }
1215   else // odd
1216   {
1217      machine().device<i8255_device>("ppi8255_fdd")->write(space, (offset & 6) >> 1,data);
1218   }
1219}
1220
1221READ8_MEMBER(pc9801_state::pc9801_60_r)
1222{
1223   if((offset & 1) == 0)
1224   {
1225      return m_hgdc1->read(space, (offset & 2) >> 1); // upd7220 character port
1226   }
1227   else // odd
1228   {
1229      printf("Read to undefined port [%02x]\n",offset+0x60);
1230      return 0xff;
1231   }
1232}
1233
1234WRITE8_MEMBER(pc9801_state::pc9801_60_w)
1235{
1236   if((offset & 1) == 0)
1237   {
1238      m_hgdc1->write(space, (offset & 2) >> 1,data); // upd7220 character port
1239   }
1240   else // odd
1241   {
1242      printf("Write to undefined port [%02x] <- %02x\n",offset+0x60,data);
1243   }
1244}
1245
12461008WRITE8_MEMBER(pc9801_state::pc9801_vrtc_mask_w)
12471009{
12481010   if((offset & 1) == 0)
r241786r241787
12511013   }
12521014   else // odd
12531015   {
1254      printf("Write to undefined port [%02x] <- %02x\n",offset+0x64,data);
1016      logerror("Write to undefined port [%02x] <- %02x\n",offset+0x64,data);
12551017   }
12561018}
12571019
r241786r241787
12721034         case 1:
12731035            m_gfx_ff = 1;
12741036            if(data & 1)
1275               printf("Graphic f/f actually enabled!\n");
1037               logerror("Graphic f/f actually enabled!\n");
12761038               break;
12771039         case 4:
12781040            if(m_gfx_ff)
r241786r241787
12981060            "Display ON"        // 7
12991061         };
13001062
1301         printf("Write to video FF register %s -> %02x\n",video_ff_regnames[(data & 0x0e) >> 1],data & 1);
1063         logerror("Write to video FF register %s -> %02x\n",video_ff_regnames[(data & 0x0e) >> 1],data & 1);
13021064      }
13031065   }
13041066   else // odd
13051067   {
1306      //printf("Write to undefined port [%02x] <- %02x\n",offset+0x68,data);
1068      //logerror("Write to undefined port [%02x] <- %02x\n",offset+0x68,data);
13071069   }
13081070}
13091071
13101072
1311READ8_MEMBER(pc9801_state::pc9801_70_r)
1073READ8_MEMBER(pc9801_state::txt_scrl_r)
13121074{
1313   if((offset & 1) == 0)
1314   {
1315      //printf("Read to display register [%02x]\n",offset+0x70);
1316      /* TODO: ok? */
1317      return m_txt_scroll_reg[offset >> 1];
1318   }
1319   else // odd
1320   {
1321      if(offset & 0x08)
1322         printf("Read to undefined port [%02x]\n",offset+0x70);
1323      else
1324         return m_pit8253->read(space, (offset & 6) >> 1);
1325   }
1326
1327   return 0xff;
1075   //logerror("Read to display register [%02x]\n",offset+0x70);
1076   /* TODO: ok? */
1077   return m_txt_scroll_reg[offset >> 1];
13281078}
13291079
1330WRITE8_MEMBER(pc9801_state::pc9801_70_w)
1080WRITE8_MEMBER(pc9801_state::txt_scrl_w)
13311081{
1332   if((offset & 1) == 0)
1333   {
1334//      printf("Write to display register [%02x] %02x\n",offset+0x70,data);
1335      m_txt_scroll_reg[offset >> 1] = data;
1082   //logerror("Write to display register [%02x] %02x\n",offset+0x70,data);
1083   m_txt_scroll_reg[offset >> 1] = data;
13361084
1337      //popmessage("%02x %02x %02x %02x",m_txt_scroll_reg[0],m_txt_scroll_reg[1],m_txt_scroll_reg[2],m_txt_scroll_reg[3]);
1338   }
1339   else // odd
1340   {
1341      if(offset < 0x08)
1342         m_pit8253->write(space, (offset & 6) >> 1, data);
1343      //else
1344      //  printf("Write to undefined port [%02x] <- %02x\n",offset+0x70,data);
1345   }
1085   //popmessage("%02x %02x %02x %02x",m_txt_scroll_reg[0],m_txt_scroll_reg[1],m_txt_scroll_reg[2],m_txt_scroll_reg[3]);
13461086}
13471087
1348READ8_MEMBER(pc9801_state::pc9801_sasi_r)
1349{
1350   if((offset & 1) == 0)
1351   {
1352      //printf("Read to SASI port [%02x]\n",offset+0x80);
1353      return 0x20;
1354   }
1355   else // odd
1356   {
1357      printf("Read to undefined port [%02x]\n",offset+0x80);
1358      return 0xff;
1359   }
1360}
1361
1362WRITE8_MEMBER(pc9801_state::pc9801_sasi_w)
1363{
1364   if((offset & 1) == 0)
1365   {
1366      //printf("Write to SASI port [%02x] <- %02x\n",offset+0x80,data);
1367   }
1368   else // odd
1369   {
1370      //printf("Write to undefined port [%02x] <- %02x\n",offset+0xxx,data);
1371   }
1372}
1373
1374
13751088READ8_MEMBER(pc9801_state::pc9801_a0_r)
13761089{
13771090   if((offset & 1) == 0)
r241786r241787
14121125         }
14131126      }
14141127
1415      printf("Read to undefined port [%02x]\n",offset+0xa0);
1128      logerror("Read to undefined port [%02x]\n",offset+0xa0);
14161129      return 0xff;
14171130   }
14181131}
r241786r241787
14521165            return;
14531166         }
14541167         default:
1455            printf("Write to undefined port [%02x] <- %02x\n",offset+0xa0,data);
1168            logerror("Write to undefined port [%02x] <- %02x\n",offset+0xa0,data);
14561169            return;
14571170      }
14581171   }
r241786r241787
14671180            m_font_addr = ((data & 0x7f) << 8) | (m_font_addr & 0xff);
14681181            return;
14691182         case 0x05:
1470            //printf("%02x\n",data);
1183            //logerror("%02x\n",data);
14711184            m_font_line = ((data & 0x0f) << 1);
14721185            m_font_lr = ((data & 0x20) >> 5) ^ 1;
14731186            return;
r241786r241787
14781191            pcg_offset = m_font_addr << 5;
14791192            pcg_offset|= m_font_line;
14801193            pcg_offset|= m_font_lr;
1481            //printf("%04x %02x %02x %08x\n",m_font_addr,m_font_line,m_font_lr,pcg_offset);
1194            //logerror("%04x %02x %02x %08x\n",m_font_addr,m_font_line,m_font_lr,pcg_offset);
14821195            if((m_font_addr & 0xff00) == 0x5600 || (m_font_addr & 0xff00) == 0x5700)
14831196            {
14841197               m_kanji_rom[pcg_offset] = data;
r241786r241787
14881201         }
14891202      }
14901203
1491      //printf("Write to undefined port [%02x) <- %02x\n",offset+0xa0,data);
1204      //logerror("Write to undefined port [%02x) <- %02x\n",offset+0xa0,data);
14921205   }
14931206}
14941207
r241786r241787
15041217   {
15051218      switch(offset & 6)
15061219      {
1507         case 0: return machine().device<upd765a_device>("upd765_2hd")->msr_r(space, 0, 0xff);
1508         case 2: return machine().device<upd765a_device>("upd765_2hd")->fifo_r(space, 0, 0xff);
1220         case 0: return m_fdc_2hd->msr_r(space, 0, 0xff);
1221         case 2: return m_fdc_2hd->fifo_r(space, 0, 0xff);
15091222         case 4: return 0x5f; //unknown port meaning
15101223      }
15111224   }
r241786r241787
15161229         case 1: return m_sio->data_r(space, 0);
15171230         case 3: return m_sio->status_r(space, 0);
15181231      }
1519      printf("Read to undefined port [%02x]\n",offset+0x90);
1232      logerror("Read to undefined port [%02x]\n",offset+0x90);
15201233      return 0xff;
15211234   }
15221235
15231236   return 0xff;
15241237}
15251238
1526void pc9801_state::pc9801_fdc_2hd_update_ready(floppy_image_device *, int)
1527{
1528   bool ready = m_fdc_2hd_ctrl & 0x40;
1529   floppy_image_device *floppy;
1530   floppy = machine().device<floppy_connector>("upd765_2hd:0")->get_device();
1531   if(floppy && ready)
1532      ready = floppy->ready_r();
1533   floppy = machine().device<floppy_connector>("upd765_2hd:1")->get_device();
1534   if(floppy && ready)
1535      ready = floppy->ready_r();
1536
1537   m_fdc_2hd->ready_w(ready);
1538}
1539
15401239WRITE8_MEMBER(pc9801_state::pc9801_fdc_2hd_w)
15411240{
15421241   if((offset & 1) == 0)
15431242   {
15441243      switch(offset & 6)
15451244      {
1546         case 0: printf("Write to undefined port [%02x] <- %02x\n",offset+0x90,data); return;
1547         case 2: machine().device<upd765a_device>("upd765_2hd")->fifo_w(space, 0, data, 0xff); return;
1245         case 0: logerror("Write to undefined port [%02x] <- %02x\n",offset+0x90,data); return;
1246         case 2: m_fdc_2hd->fifo_w(space, 0, data, 0xff); return;
15481247         case 4:
1549            printf("%02x ctrl\n",data);
1248            //logerror("%02x ctrl\n",data);
15501249            if(((m_fdc_2hd_ctrl & 0x80) == 0) && (data & 0x80))
1551               machine().device<upd765a_device>("upd765_2hd")->reset();
1250               m_fdc_2hd->soft_reset();
15521251
15531252            m_fdc_2hd_ctrl = data;
1554            pc9801_fdc_2hd_update_ready(NULL, 0);
15551253
1556            machine().device<floppy_connector>("upd765_2hd:0")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE);
1557            machine().device<floppy_connector>("upd765_2hd:1")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE);
1254            if(data & 0x40)
1255            {
1256               m_fdc_2hd->set_ready_line_connected(0);
1257               m_fdc_2hd->ready_w(0);
1258            }
1259            else
1260               m_fdc_2hd->set_ready_line_connected(1);
1261
1262            // TODO: is the motor control bit really inverted relative to the other fdcs?
1263            m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? ASSERT_LINE : CLEAR_LINE);
1264            m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? ASSERT_LINE : CLEAR_LINE);
15581265            break;
15591266      }
15601267   }
r241786r241787
15651272         case 1: m_sio->data_w(space, 0, data); return;
15661273         case 3: m_sio->control_w(space, 0, data); return;
15671274      }
1568      printf("Write to undefined port [%02x] <- %02x\n",offset+0x90,data);
1275      logerror("Write to undefined port [%02x] <- %02x\n",offset+0x90,data);
15691276   }
15701277}
15711278
r241786r241787
15761283   {
15771284      switch(offset & 6)
15781285      {
1579         case 0: return machine().device<upd765a_device>("upd765_2dd")->msr_r(space, 0, 0xff);
1580         case 2: return machine().device<upd765a_device>("upd765_2dd")->fifo_r(space, 0, 0xff);
1581         case 4: return 0x40; //unknown port meaning, might be 0x70
1286         case 0: return m_fdc_2dd->msr_r(space, 0, 0xff);
1287         case 2: return m_fdc_2dd->fifo_r(space, 0, 0xff);
1288         case 4:
1289         {
1290            int ret = (!m_fdc_2dd->subdevice<floppy_connector>("0")->get_device()->ready_r()) ? 0x10 : 0;
1291            ret |= (m_fdc_2dd->subdevice<floppy_connector>("1")->get_device()->ready_r()) ? 0x10 : 0;
1292            return ret | 0x40; //unknown port meaning, might be 0x70
1293         }
15821294      }
15831295   }
15841296   else
15851297   {
1586      printf("Read to undefined port [%02x]\n",offset+0xc8);
1298      logerror("Read to undefined port [%02x]\n",offset+0xc8);
15871299      return 0xff;
15881300   }
15891301
r241786r241787
15961308   {
15971309      switch(offset & 6)
15981310      {
1599         case 0: printf("Write to undefined port [%02x] <- %02x\n",offset+0xc8,data); return;
1600         case 2: machine().device<upd765a_device>("upd765_2dd")->fifo_w(space, 0, data, 0xff); return;
1311         case 0: logerror("Write to undefined port [%02x] <- %02x\n",offset+0xc8,data); return;
1312         case 2: m_fdc_2dd->fifo_w(space, 0, data, 0xff); return;
16011313         case 4:
1602            printf("%02x ctrl\n",data);
1314            logerror("%02x ctrl\n",data);
16031315            if(((m_fdc_2dd_ctrl & 0x80) == 0) && (data & 0x80))
1604               machine().device<upd765a_device>("upd765_2dd")->reset();
1316               m_fdc_2dd->soft_reset();
16051317
16061318            m_fdc_2dd_ctrl = data;
1607            machine().device<floppy_connector>("upd765_2dd:0")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE);
1608            machine().device<floppy_connector>("upd765_2dd:1")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE);
1319            m_fdc_2dd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
1320            m_fdc_2dd->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
16091321            break;
16101322      }
16111323   }
16121324   else
16131325   {
1614      printf("Write to undefined port [%02x] <- %02x\n",offset+0xc8,data);
1326      logerror("Write to undefined port [%02x] <- %02x\n",offset+0xc8,data);
16151327   }
16161328}
16171329
r241786r241787
17191431   m_pc9801rs_grcg_w(offset & 0x7fff, (offset >> 15) & 3, offset >> 17, data);
17201432}
17211433
1722READ8_MEMBER(pc9801_state::pc9801_mouse_r)
1723{
1724   if((offset & 1) == 0)
1725      return 0xff;
1726   else
1727   {
1728      return machine().device<i8255_device>("ppi8255_mouse")->read(space, (offset & 6) >> 1);
1729   }
1730}
1731
1732WRITE8_MEMBER(pc9801_state::pc9801_mouse_w)
1733{
1734   if((offset & 1) == 0)
1735   {
1736      //return 0xff;
1737   }
1738   else
1739   {
1740      machine().device<i8255_device>("ppi8255_mouse")->write(space, (offset & 6) >> 1,data);
1741   }
1742}
1743
17441434READ8_MEMBER(pc9801_state::ide_hack_r)
17451435{
17461436   // 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
r241786r241787
18751565/* first device is even offsets, second one is odd offsets */
18761566static ADDRESS_MAP_START( pc9801_io, AS_IO, 16, pc9801_state )
18771567   ADDRESS_MAP_UNMAP_HIGH
1878   AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r,pc9801_00_w,0xffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
1879   AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r,pc9801_20_w,0xffff) // RTC / DMA registers (LS244)
1880   AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801_30_r,pc9801_30_w,0xffff) //i8251 RS232c / i8255 system port
1881   AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r,pc9801_40_w,0xffff) //i8255 printer port / i8251 keyboard
1882   AM_RANGE(0x0050, 0x0057) AM_READWRITE8(pc9801_50_r,pc9801_50_w,0xffff) // NMI FF / i8255 floppy port (2d?)
1883   AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r,pc9801_60_w,0xffff) //upd7220 character ports / <undefined>
1568   AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("i8237", am9517a_device, read, write, 0xff00)
1569   AM_RANGE(0x0000, 0x000f) AM_READWRITE8(pic_r, pic_w, 0x00ff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
1570   AM_RANGE(0x0020, 0x0027) AM_WRITE8(rtc_dmapg_w,0xffff) // RTC / DMA registers (LS244)
1571   AM_RANGE(0x0030, 0x0037) AM_DEVREADWRITE8("ppi8255_sys", i8255_device, read, write, 0xff00) //i8251 RS232c / i8255 system port
1572   AM_RANGE(0x0040, 0x0047) AM_DEVREADWRITE8("ppi8255_prn", i8255_device, read, write, 0x00ff)
1573   AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("keyb", pc9801_kbd_device, rx_r, tx_w, 0xff00) //i8255 printer port / i8251 keyboard
1574   AM_RANGE(0x0050, 0x0057) AM_DEVREADWRITE8("ppi8255_fdd", i8255_device, read, write, 0xff00)
1575   AM_RANGE(0x0050, 0x0053) AM_WRITE8(nmi_ctrl_w,0x00ff) // NMI FF / i8255 floppy port (2d?)
1576   AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("upd7220_chr", upd7220_device, read, write, 0x00ff) //upd7220 character ports / <undefined>
18841577   AM_RANGE(0x0064, 0x0065) AM_WRITE8(pc9801_vrtc_mask_w,0xffff)
18851578   AM_RANGE(0x0068, 0x0069) AM_WRITE8(pc9801_video_ff_w,0xffff) //mode FF / <undefined>
18861579//  AM_RANGE(0x006c, 0x006f) border color / <undefined>
1887   AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r,pc9801_70_w,0xffff) //display registers / i8253 pit
1888//  AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r,pc9801_sasi_w,0xffff) //HDD SASI interface / <undefined>
1580   AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00)
1581   AM_RANGE(0x0070, 0x007b) AM_READWRITE8(txt_scrl_r,txt_scrl_w,0x00ff) //display registers / i8253 pit
18891582   AM_RANGE(0x0080, 0x0081) AM_READWRITE8(sasi_data_r, sasi_data_w, 0x00ff)
18901583   AM_RANGE(0x0082, 0x0083) AM_READWRITE8(sasi_status_r, sasi_ctrl_w,0x00ff)
18911584   AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801_fdc_2hd_r,pc9801_fdc_2hd_w,0xffff) //upd765a 2hd / cmt
18921585   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,pc9801_a0_w,0xffff) //upd7220 bitmap ports / display registers
18931586   AM_RANGE(0x00c8, 0x00cd) AM_READWRITE8(pc9801_fdc_2dd_r,pc9801_fdc_2dd_w,0xffff) //upd765a 2dd / <undefined>
18941587//  AM_RANGE(0x0188, 0x018b) AM_READWRITE8(pc9801_opn_r,pc9801_opn_w,0xffff) //ym2203 opn / <undefined>
1895   AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r,pc9801_mouse_w,0xffff) // <undefined> / mouse ppi8255 ports
1588   AM_RANGE(0x7fd8, 0x7fdf) AM_DEVREADWRITE8("ppi8255_mouse", i8255_device, read, write, 0xff00)
18961589ADDRESS_MAP_END
18971590
18981591/*************************************
r241786r241787
19671660         }
19681661      }
19691662
1970      printf("Unknown EMS ROM setting %02x\n",data);
1663      logerror("Unknown EMS ROM setting %02x\n",data);
19711664   }
19721665   if(offset == 3)
19731666   {
r241786r241787
19751668         m_vram_bank = (data & 2) >> 1;
19761669      else
19771670      {
1978         printf("Unknown EMS RAM setting %02x\n",data);
1671         logerror("Unknown EMS RAM setting %02x\n",data);
19791672      }
19801673   }
19811674}
r241786r241787
20161709   m_maincpu->set_input_line(INPUT_LINE_A20, m_gate_a20);
20171710}
20181711
2019READ8_MEMBER(pc9801_state::pc9801rs_30_r)
1712READ8_MEMBER(pc9801_state::grcg_r)
20201713{
2021   return pc9801_30_r(space,offset);
2022}
2023
2024READ8_MEMBER(pc9801_state::pc9801rs_70_r)
2025{
2026   if(offset == 0xc)
1714   if(offset == 6)
20271715   {
2028      printf("GRCG mode R\n");
1716      logerror("GRCG mode R\n");
20291717      return 0xff;
20301718   }
2031   else if(offset == 0x0e)
1719   else if(offset == 7)
20321720   {
2033      printf("GRCG tile R\n");
1721      logerror("GRCG tile R\n");
20341722      return 0xff;
20351723   }
2036
2037   return  pc9801_70_r(space,offset);;
1724   return txt_scrl_r(space,offset);
20381725}
20391726
2040WRITE8_MEMBER(pc9801_state::pc9801rs_70_w)
1727WRITE8_MEMBER(pc9801_state::grcg_w)
20411728{
2042   if(offset == 0xc)
1729   if(offset == 6)
20431730   {
2044//      printf("%02x GRCG MODE\n",data);
1731//      logerror("%02x GRCG MODE\n",data);
20451732      m_grcg.mode = data;
20461733      m_grcg.tile_index = 0;
20471734      return;
20481735   }
2049   else if(offset == 0x0e)
1736   else if(offset == 7)
20501737   {
2051//      printf("%02x GRCG TILE %02x\n",data,m_grcg.tile_index);
1738//      logerror("%02x GRCG TILE %02x\n",data,m_grcg.tile_index);
20521739      m_grcg.tile[m_grcg.tile_index] = data;
20531740      m_grcg.tile_index ++;
20541741      m_grcg.tile_index &= 3;
20551742      return;
20561743   }
20571744
2058   pc9801_70_w(space,offset,data);
1745   txt_scrl_w(space,offset,data);
20591746}
20601747
20611748READ8_MEMBER(pc9801_state::pc9801rs_soundrom_r)
r241786r241787
20821769   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1)      { return pc9801rs_ex_wram_r(space,offset-0x00100000); }
20831770   else if(offset >= 0xfffe0000 && offset <= 0xffffffff)                   { return pc9801rs_ipl_r(space,offset & 0x1ffff);      }
20841771
2085//  printf("%08x\n",offset);
1772//  logerror("%08x\n",offset);
20861773   return 0x00;
20871774}
20881775
r241786r241787
21021789   else if(offset >= 0x000e0000 && offset <= 0x000e7fff)                   { m_pc9801rs_grcg_w(offset & 0x7fff,0,data);        }
21031790   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1)      { pc9801rs_ex_wram_w(space,offset-0x00100000,data);    }
21041791   //else
2105   //  printf("%08x %08x\n",offset,data);
1792   //  logerror("%08x %08x\n",offset,data);
21061793}
21071794
21081795READ8_MEMBER(pc9801_state::pc9810rs_fdc_ctrl_r)
r241786r241787
21181805   ---- ---x select irq
21191806   */
21201807
2121   machine().device<floppy_connector>("upd765_2hd:0")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
2122   machine().device<floppy_connector>("upd765_2hd:1")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
1808   m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
1809   m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
21231810
2124   machine().device<upd765a_device>("upd765_2hd")->set_rate(data & 0x02 ? 500000 : 250000);
1811   m_fdc_2hd->set_rate(data & 0x02 ? 500000 : 250000);
21251812
21261813   m_fdc_ctrl = data;
21271814   //if(data & 0xfc)
2128   //  printf("FDC ctrl called with %02x\n",data);
1815   //  logerror("FDC ctrl called with %02x\n",data);
21291816}
21301817
21311818READ8_MEMBER(pc9801_state::pc9801rs_2hd_r)
r241786r241787
21341821   {
21351822      switch(offset & 6)
21361823      {
2137         case 0: return machine().device<upd765a_device>("upd765_2hd")->msr_r(space, 0, 0xff);
2138         case 2: return machine().device<upd765a_device>("upd765_2hd")->fifo_r(space, 0, 0xff);
1824         case 0: return m_fdc_2hd->msr_r(space, 0, 0xff);
1825         case 2: return m_fdc_2hd->fifo_r(space, 0, 0xff);
21391826         case 4: return 0x44; //2hd flag
21401827      }
21411828   }
21421829
2143   printf("Read to undefined port [%02x]\n",offset+0x90);
1830   logerror("Read to undefined port [%02x]\n",offset+0x90);
21441831
21451832   return 0xff;
21461833}
r241786r241787
21511838   {
21521839      switch(offset & 6)
21531840      {
2154         case 2: machine().device<upd765a_device>("upd765_2hd")->fifo_w(space, 0, data, 0xff); return;
1841         case 2: m_fdc_2hd->fifo_w(space, 0, data, 0xff); return;
21551842         case 4:
21561843            if(data & 0x80)
2157               machine().device<upd765a_device>("upd765_2hd")->reset();
1844               m_fdc_2hd->soft_reset();
21581845
2159            pc9801_fdc_2hd_update_ready(NULL, 0);
1846            if(data & 0x40)
1847            {
1848               m_fdc_2hd->set_ready_line_connected(0);
1849               m_fdc_2hd->ready_w(0);
1850            }
1851            else
1852               m_fdc_2hd->set_ready_line_connected(1);
21601853
2161            machine().device<floppy_connector>("upd765_2hd:0")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE);
2162            machine().device<floppy_connector>("upd765_2hd:1")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE);
2163
2164//              machine().device<floppy_connector>("upd765_2hd:0")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE);
2165//              machine().device<floppy_connector>("upd765_2hd:1")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE);
1854            //TODO: verify
1855            if(!(m_fdc_ctrl & 4))
1856            {
1857               m_fdc_2hd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
1858               m_fdc_2hd->subdevice<floppy_connector>("1")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
1859            }
21661860            return;
21671861      }
21681862   }
21691863
2170   printf("Write to undefined port [%02x] %02x\n",offset+0x90,data);
1864   logerror("Write to undefined port [%02x] %02x\n",offset+0x90,data);
21711865}
21721866
21731867#if 0
r241786r241787
21861880      }
21871881   }
21881882
2189   printf("Read to undefined port [%02x]\n",offset+0x90);
1883   logerror("Read to undefined port [%02x]\n",offset+0x90);
21901884
21911885   return 0xff;
21921886}
r241786r241787
22011895      switch(offset & 6)
22021896      {
22031897         case 2: machine().device<upd765a_device>("upd765_2hd")->fifo_w(space, 0, data, 0xff); return;
2204         case 4: printf("%02x 2DD FDC ctrl\n",data); return;
1898         case 4: logerror("%02x 2DD FDC ctrl\n",data); return;
22051899      }
22061900   }
22071901
2208   printf("Write to undefined port [%02x] %02x\n",offset+0x90,data);
1902   logerror("Write to undefined port [%02x] %02x\n",offset+0x90,data);
22091903}
22101904#endif
22111905
r241786r241787
22261920            "<unknown>"         // 3
22271921         };
22281922
2229         printf("Write to extended video FF register %s -> %02x\n",ex_video_ff_regnames[(data & 0x06) >> 1],data & 1);
1923         logerror("Write to extended video FF register %s -> %02x\n",ex_video_ff_regnames[(data & 0x06) >> 1],data & 1);
22301924      }
22311925      //else
2232      //  printf("Write to extended video FF register %02x\n",data);
1926      //  logerror("Write to extended video FF register %02x\n",data);
22331927
22341928      return;
22351929   }
r241786r241787
22991993   return 0xff;
23001994}
23011995
2302READ8_MEMBER(pc9801_state::pc9801rs_pit_mirror_r)
2303{
2304   if((offset & 1) == 0)
2305   {
2306      printf("Read to undefined port [%04x]\n",offset+0x3fd8);
2307      return 0xff;
2308   }
2309   else // odd
2310   {
2311      if(offset & 0x08)
2312         printf("Read to undefined port [%02x]\n",offset+0x3fd8);
2313      else
2314         return m_pit8253->read(space, (offset & 6) >> 1);
2315   }
2316
2317   return 0xff;
2318}
2319
2320WRITE8_MEMBER(pc9801_state::pc9801rs_pit_mirror_w)
2321{
2322   if((offset & 1) == 0)
2323   {
2324      printf("Write to undefined port [%04x] <- %02x\n",offset+0x3fd8,data);
2325   }
2326   else // odd
2327   {
2328      if(offset < 0x08)
2329         m_pit8253->write(space, (offset & 6) >> 1, data);
2330      else
2331         printf("Write to undefined port [%04x] <- %02x\n",offset+0x3fd8,data);
2332   }
2333}
2334
2335static ADDRESS_MAP_START( pc9801rs_map, AS_PROGRAM, 32, pc9801_state )
2336   AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE8(pc9801rs_memory_r,pc9801rs_memory_w,0xffffffff)
2337ADDRESS_MAP_END
2338
2339static ADDRESS_MAP_START( pc9801rs_io, AS_IO, 32, pc9801_state )
2340   ADDRESS_MAP_UNMAP_HIGH
2341   AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r,        pc9801_00_w,        0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
2342   AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r,        pc9801_20_w,        0xffffffff) // RTC / DMA registers (LS244)
2343   AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r,      pc9801_30_w,        0xffffffff) //i8251 RS232c / i8255 system port
2344   AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r,        pc9801_40_w,        0xffffffff) //i8255 printer port / i8251 keyboard
2345   AM_RANGE(0x0050, 0x0053) AM_WRITE8(pc9801rs_nmi_w, 0xffffffff)
2346   AM_RANGE(0x005c, 0x005f) AM_READ(pc9821_timestamp_r) AM_WRITENOP // artic
2347   AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r,        pc9801_60_w,        0xffffffff) //upd7220 character ports / <undefined>
2348   AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff)
2349   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0xffffffff) //mode FF / <undefined>
2350   AM_RANGE(0x0070, 0x007f) AM_READWRITE8(pc9801rs_70_r,      pc9801rs_70_w,      0xffffffff) //display registers "GRCG" / i8253 pit
2351   AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r,      pc9801_sasi_w,      0xffffffff) //HDD SASI interface / <undefined>
2352   AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffffffff)
2353   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,        pc9801rs_a0_w,      0xffffffff) //upd7220 bitmap ports / display registers
2354   AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffffffff)
2355   AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffffffff)
2356//  AM_RANGE(0x00ec, 0x00ef) PC-9801-86 sound board
2357   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r,      pc9801rs_f0_w,      0xffffffff)
2358//  AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r,       pc9801_opn_w,       0xffffffff) //ym2203 opn / <undefined>
2359   AM_RANGE(0x0430, 0x0433) AM_READ8(ide_hack_r, 0x000000ff)
2360
2361   AM_RANGE(0x0438, 0x043b) AM_READWRITE8(pc9801rs_access_ctrl_r,pc9801rs_access_ctrl_w,0xffffffff)
2362   AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w,    0xffffffff) //ROM/RAM bank
2363
2364   AM_RANGE(0x0640, 0x064f) AM_DEVREADWRITE16("ide", ata_interface_device, read_cs0, write_cs0, 0xffffffff)
2365   AM_RANGE(0x0740, 0x074f) AM_DEVREADWRITE16("ide", ata_interface_device, read_cs1, write_cs1, 0xffffffff)
2366
2367   AM_RANGE(0x3fd8, 0x3fdf) AM_READWRITE8(pc9801rs_pit_mirror_r,        pc9801rs_pit_mirror_w,        0xffffffff) // <undefined> / pit mirror ports
2368   AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r,     pc9801_mouse_w,     0xffffffff) // <undefined> / mouse ppi8255 ports
2369//  AM_RANGE(0xa460, 0xa463) AM_READWRITE8(pc9801_ext_opna_r,  pc9801_ext_opna_w,  0xffffffff)
2370   AM_RANGE(0xbfd8, 0xbfdf) AM_WRITE8(pc9801rs_mouse_freq_w, 0xffffffff)
2371   AM_RANGE(0xe0d0, 0xe0d3) AM_READ8(pc9801rs_midi_r, 0xffffffff)
2372ADDRESS_MAP_END
2373
23741996READ8_MEMBER(pc9801_state::pic_r)
23751997{
23761998   return ((offset >= 4) ? m_pic2 : m_pic1)->read(space, offset & 3);
r241786r241787
24122034
24132035static ADDRESS_MAP_START( pc9801ux_io, AS_IO, 16, pc9801_state )
24142036   ADDRESS_MAP_UNMAP_HIGH
2415
2416   AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("i8237", am9517a_device, read, write, 0xff00)
2417   AM_RANGE(0x0000, 0x000f) AM_READWRITE8(pic_r, pic_w, 0x00ff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
2418   AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r,        pc9801_20_w,        0xffff) // RTC / DMA registers (LS244)
2419   AM_RANGE(0x0030, 0x0037) AM_DEVREADWRITE8("ppi8255_sys", i8255_device, read, write, 0xff00)
2420   AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r,      pc9801_30_w,        0xffff) //i8251 RS232c / i8255 system port
2421   AM_RANGE(0x0040, 0x0047) AM_DEVREADWRITE8("ppi8255_prn", i8255_device, read, write, 0x00ff)
2422   AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("keyb", pc9801_kbd_device, rx_r, tx_w, 0xff00) //i8255 printer port / i8251 keyboard
2423   AM_RANGE(0x005c, 0x005f) AM_WRITENOP // time-stamp?
2424   AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("upd7220_chr", upd7220_device, read, write, 0x00ff) //upd7220 character ports / <undefined>
2425   AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffff)
2037   AM_RANGE(0x0050, 0x0057) AM_NOP // 2dd ppi?
2038   AM_RANGE(0x005c, 0x005f) AM_READ(pc9821_timestamp_r) AM_WRITENOP // artic
24262039   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0xffff) //mode FF / <undefined>
2427   AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00)
2428   AM_RANGE(0x0070, 0x007f) AM_READWRITE8(pc9801rs_70_r,      pc9801rs_70_w,      0xffff) //display registers "GRCG" / i8253 pit
2040   AM_RANGE(0x0070, 0x007f) AM_READWRITE8(grcg_r,      grcg_w,      0x00ff) //display registers "GRCG" / i8253 pit
24292041   AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffff)
24302042   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,        pc9801rs_a0_w,      0xffff) //upd7220 bitmap ports / display registers
24312043   AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffff)
24322044   AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffff)
24332045   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r,      pc9801rs_f0_w,      0xffff)
2434//  AM_RANGE(0x0188, 0x018f) AM_READWRITE8(pc9801_opn_r,       pc9801_opn_w,       0xffff) //ym2203 opn / <undefined>
24352046   AM_RANGE(0x0438, 0x043b) AM_READWRITE8(pc9801rs_access_ctrl_r,pc9801rs_access_ctrl_w,0xffff)
24362047   AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w,    0xffff) //ROM/RAM bank
24372048   AM_RANGE(0x3fd8, 0x3fdf) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00)
2438   AM_RANGE(0x7fd8, 0x7fdf) AM_DEVREADWRITE8("ppi8255_mouse", i8255_device, read, write, 0xff00)
24392049//  AM_RANGE(0xa460, 0xa463) AM_READWRITE8(pc9801_ext_opna_r,  pc9801_ext_opna_w,  0xffff)
2050   AM_IMPORT_FROM(pc9801_io)
2051ADDRESS_MAP_END
24402052
2053static ADDRESS_MAP_START( pc9801rs_map, AS_PROGRAM, 16, pc9801_state )
2054   AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE8(pc9801rs_memory_r,pc9801rs_memory_w,0xffff)
24412055ADDRESS_MAP_END
24422056
2443static ADDRESS_MAP_START( pc9801bx2_io, AS_IO, 32, pc9801_state )
2444   AM_IMPORT_FROM(pc9801rs_io)
2445
2446   AM_RANGE(0x841c, 0x841f) AM_READWRITE8(sdip_0_r,sdip_0_w,0xffffffff)
2447   AM_RANGE(0x851c, 0x851f) AM_READWRITE8(sdip_1_r,sdip_1_w,0xffffffff)
2448   AM_RANGE(0x861c, 0x861f) AM_READWRITE8(sdip_2_r,sdip_2_w,0xffffffff)
2449   AM_RANGE(0x871c, 0x871f) AM_READWRITE8(sdip_3_r,sdip_3_w,0xffffffff)
2450   AM_RANGE(0x881c, 0x881f) AM_READWRITE8(sdip_4_r,sdip_4_w,0xffffffff)
2451   AM_RANGE(0x891c, 0x891f) AM_READWRITE8(sdip_5_r,sdip_5_w,0xffffffff)
2452   AM_RANGE(0x8a1c, 0x8a1f) AM_READWRITE8(sdip_6_r,sdip_6_w,0xffffffff)
2453   AM_RANGE(0x8b1c, 0x8b1f) AM_READWRITE8(sdip_7_r,sdip_7_w,0xffffffff)
2454   AM_RANGE(0x8c1c, 0x8c1f) AM_READWRITE8(sdip_8_r,sdip_8_w,0xffffffff)
2455   AM_RANGE(0x8d1c, 0x8d1f) AM_READWRITE8(sdip_9_r,sdip_9_w,0xffffffff)
2456   AM_RANGE(0x8e1c, 0x8e1f) AM_READWRITE8(sdip_a_r,sdip_a_w,0xffffffff)
2457   AM_RANGE(0x8f1c, 0x8f1f) AM_READWRITE8(sdip_b_r,sdip_b_w,0xffffffff)
2057static ADDRESS_MAP_START( pc9801rs_io, AS_IO, 16, pc9801_state )
2058   ADDRESS_MAP_UNMAP_HIGH
2059   AM_RANGE(0x0050, 0x0053) AM_WRITE8(pc9801rs_nmi_w, 0xffff)
2060   AM_RANGE(0x0430, 0x0433) AM_READ8(ide_hack_r, 0x00ff)
2061   AM_RANGE(0x0640, 0x064f) AM_DEVREADWRITE("ide", ata_interface_device, read_cs0, write_cs0)
2062   AM_RANGE(0x0740, 0x074f) AM_DEVREADWRITE("ide", ata_interface_device, read_cs1, write_cs1)
2063   AM_RANGE(0xbfd8, 0xbfdf) AM_WRITE8(pc9801rs_mouse_freq_w, 0xffff)
2064   AM_RANGE(0xe0d0, 0xe0d3) AM_READ8(pc9801rs_midi_r, 0xffff)
2065   AM_IMPORT_FROM(pc9801ux_io)
24582066ADDRESS_MAP_END
24592067
24602068/*************************************
r241786r241787
24972105   else if(offset >= 0x00f00000 && offset <= 0x00f9ffff)                   { return pc9821_ext_gvram_r(space,offset-0x00f00000); }
24982106   else if(offset >= 0xfffe0000 && offset <= 0xffffffff)                   { return pc9801rs_ipl_r(space,offset & 0x1ffff);      }
24992107
2500   //printf("%08x\n",offset);
2108   //logerror("%08x\n",offset);
25012109   return 0x00;
25022110}
25032111
r241786r241787
25272135   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1)      { pc9801rs_ex_wram_w(space,offset-0x00100000,data);    }
25282136   else if(offset >= 0x00f00000 && offset <= 0x00f9ffff)                   { pc9821_ext_gvram_w(space,offset-0x00f00000,data);    }
25292137   //else
2530   //  printf("%08x %08x\n",offset,data);
2138   //  logerror("%08x %08x\n",offset,data);
25312139
25322140}
25332141
r241786r241787
25382146      m_ex_video_ff[(data & 0xfe) >> 1] = data & 1;
25392147
25402148      //if((data & 0xfe) == 0x20)
2541      //  printf("%02x\n",data & 1);
2149      //  logerror("%02x\n",data & 1);
25422150   }
25432151
25442152   /* Intentional fall-through */
r241786r241787
25512159   {
25522160      if(m_ex_video_ff[ANALOG_256_MODE])
25532161      {
2554         printf("256 color mode [%02x] R\n",offset);
2162         logerror("256 color mode [%02x] R\n",offset);
25552163         return 0;
25562164      }
25572165      else if(m_ex_video_ff[ANALOG_16_MODE]) //16 color mode, readback possible there
r241786r241787
26082216   if(offset == 1)
26092217      m_pc9821_window_bank = data & 0xfe;
26102218   else
2611      printf("PC-9821 $f0000 window bank %02x\n",data);
2219      logerror("PC-9821 $f0000 window bank %02x\n",data);
26122220}
26132221
26142222UINT8 pc9801_state::m_sdip_read(UINT16 port, UINT8 sdip_offset)
r241786r241787
26162224   if(port == 2)
26172225      return m_sdip[sdip_offset];
26182226
2619   printf("Warning: read from unknown SDIP area %02x %04x\n",port,0x841c + port + (sdip_offset % 12)*0x100);
2227   logerror("Warning: read from unknown SDIP area %02x %04x\n",port,0x841c + port + (sdip_offset % 12)*0x100);
26202228   return 0xff;
26212229}
26222230
r241786r241787
26282236      return;
26292237   }
26302238
2631   printf("Warning: write from unknown SDIP area %02x %04x %02x\n",port,0x841c + port + (sdip_offset % 12)*0x100,data);
2239   logerror("Warning: write from unknown SDIP area %02x %04x %02x\n",port,0x841c + port + (sdip_offset % 12)*0x100,data);
26322240}
26332241
26342242READ8_MEMBER(pc9801_state::sdip_0_r) { return m_sdip_read(offset, 0+m_sdip_bank*12); }
r241786r241787
26642272      m_sdip_write(offset,11+m_sdip_bank*12,data);
26652273
26662274   if((offset & 2) == 0)
2667      printf("SDIP area B write %02x %02x\n",offset,data);
2275      logerror("SDIP area B write %02x %02x\n",offset,data);
26682276}
26692277
2670READ32_MEMBER(pc9801_state::pc9821_timestamp_r)
2278READ16_MEMBER(pc9801_state::pc9821_timestamp_r)
26712279{
2672   return m_maincpu->total_cycles();
2280   return (m_maincpu->total_cycles() >> (16 * offset));
26732281}
26742282
26752283/* basically a read-back of various registers */
r241786r241787
26862294   {
26872295      case 3: res = m_video_ff[DISPLAY_REG]; break; // display reg
26882296      default:
2689         printf("PC-9821: read ext2 f/f with value %02x\n",m_ext2_ff);
2297         logerror("PC-9821: read ext2 f/f with value %02x\n",m_ext2_ff);
26902298   }
26912299
26922300   return res;
r241786r241787
27042312
27052313static ADDRESS_MAP_START( pc9821_io, AS_IO, 32, pc9801_state )
27062314//  ADDRESS_MAP_UNMAP_HIGH // TODO: a read to somewhere makes this to fail at POST
2707   AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r,        pc9801_00_w,        0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
2708   AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r,        pc9801_20_w,        0xffffffff) // RTC / DMA registers (LS244)
2709   AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r,      pc9801_30_w,        0xffffffff) //i8251 RS232c / i8255 system port
2710   AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r,        pc9801_40_w,        0xffffffff) //i8255 printer port / i8251 keyboard
2315   AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("i8237", am9517a_device, read, write, 0xff00ff00)
2316   AM_RANGE(0x0000, 0x000f) AM_READWRITE8(pic_r, pic_w, 0x00ff00ff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
2317   AM_RANGE(0x0020, 0x0027) AM_WRITE8(rtc_dmapg_w,        0xffffffff) // RTC / DMA registers (LS244)
2318   AM_RANGE(0x0030, 0x0037) AM_DEVREADWRITE8("ppi8255_sys", i8255_device, read, write, 0xff00ff00) //i8251 RS232c / i8255 system port
2319   AM_RANGE(0x0040, 0x0047) AM_DEVREADWRITE8("ppi8255_prn", i8255_device, read, write, 0x00ff00ff)
2320   AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8("keyb", pc9801_kbd_device, rx_r, tx_w, 0xff00ff00) //i8255 printer port / i8251 keyboard
27112321   AM_RANGE(0x0050, 0x0053) AM_WRITE8(pc9801rs_nmi_w, 0xffffffff)
2712   AM_RANGE(0x005c, 0x005f) AM_READ(pc9821_timestamp_r) AM_WRITENOP // artic
2713   AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r,        pc9801_60_w,        0xffffffff) //upd7220 character ports / <undefined>
2322   AM_RANGE(0x005c, 0x005f) AM_READ16(pc9821_timestamp_r,0xffffffff) AM_WRITENOP // artic
2323   AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("upd7220_chr", upd7220_device, read, write, 0x00ff00ff) //upd7220 character ports / <undefined>
27142324   AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff)
27152325   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9821_video_ff_w,  0xffffffff) //mode FF / <undefined>
2716   AM_RANGE(0x0070, 0x007f) AM_READWRITE8(pc9801rs_70_r,      pc9801rs_70_w,    0xffffffff) //display registers "GRCG" / i8253 pit
2717   AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r,      pc9801_sasi_w,      0xffffffff) //HDD SASI interface / <undefined>
2326   AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00ff00)
2327   AM_RANGE(0x0070, 0x007f) AM_READWRITE8(grcg_r,      grcg_w,      0x00ff00ff) //display registers "GRCG" / i8253 pit
27182328   AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffffffff)
27192329   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9821_a0_r,        pc9821_a0_w,        0xffffffff) //upd7220 bitmap ports / display registers
27202330//  AM_RANGE(0x00b0, 0x00b3) PC9861k (serial port?)
r241786r241787
27462356//  AM_RANGE(0x0c2d, 0x0c2d) cs4231 PCM board hi byte control
27472357//  AM_RANGE(0x0cc0, 0x0cc7) SCSI interface / <undefined>
27482358//  AM_RANGE(0x0cfc, 0x0cff) PCI bus
2749   AM_RANGE(0x3fd8, 0x3fdf) AM_READWRITE8(pc9801rs_pit_mirror_r,        pc9801rs_pit_mirror_w,        0xffffffff) // <undefined> / pit mirror ports
2750   AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r,      pc9801_mouse_w,      0xffffffff) // <undefined> / mouse ppi8255 ports
2359   AM_RANGE(0x3fd8, 0x3fdf) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0xff00ff00) // <undefined> / pit mirror ports
2360   AM_RANGE(0x7fd8, 0x7fdf) AM_DEVREADWRITE8("ppi8255_mouse", i8255_device, read, write, 0xff00ff00)
27512361   AM_RANGE(0x841c, 0x841f) AM_READWRITE8(sdip_0_r,sdip_0_w,0xffffffff)
27522362   AM_RANGE(0x851c, 0x851f) AM_READWRITE8(sdip_1_r,sdip_1_w,0xffffffff)
27532363   AM_RANGE(0x861c, 0x861f) AM_READWRITE8(sdip_2_r,sdip_2_w,0xffffffff)
r241786r241787
30862696
30872697   m_dmac->hack_w(state);
30882698
3089//  printf("%02x HLDA\n",state);
2699//  logerror("%02x HLDA\n",state);
30902700}
30912701
30922702WRITE_LINE_MEMBER(pc9801_state::pc9801_tc_w )
r241786r241787
30952705   m_fdc_2hd->tc_w(state);
30962706   // TODO: 2dd?
30972707
3098//  printf("TC %02x\n",state);
2708//  logerror("TC %02x\n",state);
30992709}
31002710
31012711READ8_MEMBER(pc9801_state::pc9801_dma_read_byte)
r241786r241787
31032713   address_space &program = m_maincpu->space(AS_PROGRAM);
31042714   offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
31052715
3106//  printf("%08x\n",addr);
2716//  logerror("%08x\n",addr);
31072717
31082718   return program.read_byte(addr);
31092719}
r241786r241787
31142724   address_space &program = m_maincpu->space(AS_PROGRAM);
31152725   offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
31162726
3117//  printf("%08x %02x\n",addr,data);
2727//  logerror("%08x %02x\n",addr,data);
31182728
31192729   program.write_byte(addr, data);
31202730}
r241786r241787
31242734   if (!state) m_dack = channel;
31252735}
31262736
3127WRITE_LINE_MEMBER(pc9801_state::pc9801_dack0_w){ /*printf("%02x 0\n",state);*/ set_dma_channel(0, state); }
3128WRITE_LINE_MEMBER(pc9801_state::pc9801_dack1_w){ /*printf("%02x 1\n",state);*/ set_dma_channel(1, state); }
3129WRITE_LINE_MEMBER(pc9801_state::pc9801_dack2_w){ /*printf("%02x 2\n",state);*/ set_dma_channel(2, state); }
3130WRITE_LINE_MEMBER(pc9801_state::pc9801_dack3_w){ /*printf("%02x 3\n",state);*/ set_dma_channel(3, state); }
2737WRITE_LINE_MEMBER(pc9801_state::pc9801_dack0_w){ /*logerror("%02x 0\n",state);*/ set_dma_channel(0, state); }
2738WRITE_LINE_MEMBER(pc9801_state::pc9801_dack1_w){ /*logerror("%02x 1\n",state);*/ set_dma_channel(1, state); }
2739WRITE_LINE_MEMBER(pc9801_state::pc9801_dack2_w){ /*logerror("%02x 2\n",state);*/ set_dma_channel(2, state); }
2740WRITE_LINE_MEMBER(pc9801_state::pc9801_dack3_w){ /*logerror("%02x 3\n",state);*/ set_dma_channel(3, state); }
31312741
3132READ8_MEMBER(pc9801_state::fdc_2hd_r)
3133{
3134   return m_fdc_2hd->dma_r();
3135}
3136
3137WRITE8_MEMBER(pc9801_state::fdc_2hd_w)
3138{
3139   m_fdc_2hd->dma_w(data);
3140}
3141
3142READ8_MEMBER(pc9801_state::fdc_2dd_r)
3143{
3144   return m_fdc_2dd->dma_r();
3145}
3146
3147WRITE8_MEMBER(pc9801_state::fdc_2dd_w)
3148{
3149   m_fdc_2dd->dma_w(data);
3150}
3151
31522742/*
31532743ch1 cs-4231a
31542744ch2 FDC
r241786r241787
32102800         res |= (m_mouse.lx >> isporthi) & 0xf;
32112801   }
32122802
3213//  printf("A\n");
2803//  logerror("A\n");
32142804   return res;
32152805}
32162806
32172807WRITE8_MEMBER(pc9801_state::ppi_mouse_porta_w)
32182808{
3219//  printf("A %02x\n",data);
2809//  logerror("A %02x\n",data);
32202810}
32212811
32222812WRITE8_MEMBER(pc9801_state::ppi_mouse_portb_w)
32232813{
3224//  printf("B %02x\n",data);
2814//  logerror("B %02x\n",data);
32252815}
32262816
32272817WRITE8_MEMBER(pc9801_state::ppi_mouse_portc_w)
r241786r241787
32422832****************************************/
32432833
32442834static SLOT_INTERFACE_START( pc9801_floppies )
2835   SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
32452836   SLOT_INTERFACE( "525hd", FLOPPY_525_HD )
32462837   SLOT_INTERFACE( "35hd", FLOPPY_35_HD )
32472838SLOT_INTERFACE_END
r241786r241787
32632854
32642855WRITE_LINE_MEMBER( pc9801_state::fdc_2dd_irq )
32652856{
3266   printf("IRQ 2DD %d\n",state);
2857   logerror("IRQ 2DD %d\n",state);
32672858
32682859   if(m_fdc_2dd_ctrl & 8)
32692860   {
r241786r241787
32752866{
32762867   /* 0xffaf8 */
32772868
3278   //printf("%02x %d\n",m_fdc_ctrl,state);
2869   //logerror("%02x %d\n",m_fdc_ctrl,state);
32792870
32802871   if(m_fdc_ctrl & 1)
32812872      m_pic2->ir3_w(state);
r241786r241787
32852876
32862877WRITE_LINE_MEMBER( pc9801_state::pc9801rs_fdc_drq )
32872878{
3288//  printf("DRQ %d\n",state);
3289
32902879   if(m_fdc_ctrl & 1)
32912880      m_dmac->dreq2_w(state ^ 1);
32922881   else
3293      printf("DRQ %02x %d\n",m_fdc_ctrl,state);
2882      m_dmac->dreq3_w(state ^ 1);
32942883}
32952884
32962885UINT32 pc9801_state::pc9801_286_a20(bool state)
r241786r241787
33322921{
33332922   MACHINE_START_CALL_MEMBER(pc9801_common);
33342923
3335   upd765a_device *fdc;
3336   fdc = machine().device<upd765a_device>(":upd765_2hd");
3337   if (fdc)
3338   {
3339      floppy_image_device *floppy;
3340      floppy = machine().device<floppy_connector>("upd765_2hd:0")->get_device();
3341      if(floppy)
3342         floppy->setup_ready_cb(floppy_image_device::ready_cb(FUNC(pc9801_state::pc9801_fdc_2hd_update_ready), this));
3343
3344      floppy = machine().device<floppy_connector>("upd765_2hd:1")->get_device();
3345      if(floppy)
3346         floppy->setup_ready_cb(floppy_image_device::ready_cb(FUNC(pc9801_state::pc9801_fdc_2hd_update_ready), this));
3347   }
3348
33492924   m_fdc_2hd->set_rate(500000);
33502925   m_fdc_2dd->set_rate(250000);
33512926   m_sys_type = 0x00 >> 6;
r241786r241787
34122987      int i;
34132988      static const UINT8 default_memsw_data[0x10] =
34142989      {
3415         // set high nibble of byte 9 to 0xa and comment ROM_FILL below to boot from hdd
34162990         0xe1, 0x48, 0xe1, 0x05, 0xe1, 0x04, 0xe1, 0x00, 0xe1, 0x01, 0xe1, 0x00, 0xe1, 0x00, 0xe1, 0x6e
34172991//          0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe1, 0xff
34182992      };
r241786r241787
34343008{
34353009   MACHINE_RESET_CALL_MEMBER(pc9801_common);
34363010
3437   /* 2dd interface ready line is ON by default */
3438   floppy_image_device *floppy;
3439   floppy = machine().device<floppy_connector>(":upd765_2hd:0")->get_device();
3440   if (floppy)
3441      floppy->mon_w(CLEAR_LINE);
3442   floppy = machine().device<floppy_connector>(":upd765_2hd:1")->get_device();
3443   if (floppy)
3444      floppy->mon_w(CLEAR_LINE);
3011   UINT8 op_mode;
3012   UINT8 *ROM;
3013   UINT8 *PRG = memregion("fdc_data")->base();
3014   int i;
34453015
3446   {
3447      UINT8 op_mode;
3448      UINT8 *ROM;
3449      UINT8 *PRG = memregion("fdc_data")->base();
3450      int i;
3016   ROM = memregion("fdc_bios_2dd")->base();
3017   op_mode = (ioport("ROM_LOAD")->read() & 2) >> 1;
34513018
3452      ROM = memregion("fdc_bios_2dd")->base();
3453      op_mode = (ioport("ROM_LOAD")->read() & 2) >> 1;
3019   for(i=0;i<0x1000;i++)
3020      ROM[i] = PRG[i+op_mode*0x8000];
34543021
3455      for(i=0;i<0x1000;i++)
3456         ROM[i] = PRG[i+op_mode*0x8000];
3022   ROM = memregion("fdc_bios_2hd")->base();
3023   op_mode = ioport("ROM_LOAD")->read() & 1;
34573024
3458      ROM = memregion("fdc_bios_2hd")->base();
3459      op_mode = ioport("ROM_LOAD")->read() & 1;
3460
3461      for(i=0;i<0x1000;i++)
3462         ROM[i] = PRG[i+op_mode*0x8000+0x10000];
3463   }
3025   for(i=0;i<0x1000;i++)
3026      ROM[i] = PRG[i+op_mode*0x8000+0x10000];
34643027}
34653028
34663029MACHINE_RESET_MEMBER(pc9801_state,pc9801rs)
r241786r241787
35163079   {
35173080      m_mouse.freq_index ++;
35183081
3519//      printf("%02x\n",m_mouse.freq_index);
3082//      logerror("%02x\n",m_mouse.freq_index);
35203083      if(m_mouse.freq_index > m_mouse.freq_reg)
35213084      {
3522//          printf("irq %02x\n",m_mouse.freq_reg);
3085//          logerror("irq %02x\n",m_mouse.freq_reg);
35233086         m_mouse.freq_index = 0;
35243087         m_pic2->ir5_w(0);
35253088         m_pic2->ir5_w(1);
r241786r241787
35273090   }
35283091}
35293092
3530WRITE_LINE_MEMBER( pc9801_state::keyboard_irq )
3531{
3532   m_pic1->ir1_w(state);
3533}
3534
35353093static MACHINE_CONFIG_FRAGMENT( pc9801_keyboard )
35363094   MCFG_DEVICE_ADD("keyb", PC9801_KBD, 53)
3537   MCFG_PC9801_KBD_IRQ_CALLBACK(WRITELINE(pc9801_state, keyboard_irq))
3095   MCFG_PC9801_KBD_IRQ_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir1_w))
35383096MACHINE_CONFIG_END
35393097
35403098static MACHINE_CONFIG_FRAGMENT( pc9801_mouse )
r241786r241787
35823140   MCFG_ATA_INTERFACE_IRQ_HANDLER(DEVWRITELINE("pic8259_slave", pic8259_device, ir1_w))
35833141MACHINE_CONFIG_END
35843142
3585
3586static MACHINE_CONFIG_START( pc9801, pc9801_state )
3587   MCFG_CPU_ADD("maincpu", I8086, 5000000) //unknown clock
3588   MCFG_CPU_PROGRAM_MAP(pc9801_map)
3589   MCFG_CPU_IO_MAP(pc9801_io)
3590   MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
3591   MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
3592
3593   MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9801f)
3594   MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801f)
3595
3143static MACHINE_CONFIG_FRAGMENT( pc9801_common )
35963144   MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
35973145   MCFG_PIT8253_CLK0(MAIN_CLOCK_X1) /* heartbeat IRQ */
35983146   MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259_master", pic8259_device, ir0_w))
r241786r241787
36053153   MCFG_I8237_OUT_EOP_CB(WRITELINE(pc9801_state, pc9801_tc_w))
36063154   MCFG_I8237_IN_MEMR_CB(READ8(pc9801_state, pc9801_dma_read_byte))
36073155   MCFG_I8237_OUT_MEMW_CB(WRITE8(pc9801_state, pc9801_dma_write_byte))
3608   MCFG_I8237_IN_IOR_2_CB(READ8(pc9801_state, fdc_2hd_r))
3609   MCFG_I8237_IN_IOR_3_CB(READ8(pc9801_state, fdc_2dd_r))
3610   MCFG_I8237_OUT_IOW_2_CB(WRITE8(pc9801_state, fdc_2hd_w))
3611   MCFG_I8237_OUT_IOW_3_CB(WRITE8(pc9801_state, fdc_2dd_w))
3156   MCFG_I8237_IN_IOR_2_CB(DEVREAD8("upd765_2hd", upd765a_device, mdma_r))
3157   MCFG_I8237_OUT_IOW_2_CB(DEVWRITE8("upd765_2hd", upd765a_device, mdma_w))
36123158   MCFG_I8237_OUT_DACK_0_CB(WRITELINE(pc9801_state, pc9801_dack0_w))
36133159   MCFG_I8237_OUT_DACK_1_CB(WRITELINE(pc9801_state, pc9801_dack1_w))
36143160   MCFG_I8237_OUT_DACK_2_CB(WRITELINE(pc9801_state, pc9801_dack2_w))
r241786r241787
36263172   /* TODO: check this one */
36273173   MCFG_I8255_IN_PORTB_CB(IOPORT("DSW5"))
36283174
3629   MCFG_DEVICE_ADD("ppi8255_fdd", I8255, 0)
3630   MCFG_I8255_IN_PORTA_CB(READ8(pc9801_state, ppi_fdd_porta_r))
3631   MCFG_I8255_IN_PORTB_CB(READ8(pc9801_state, ppi_fdd_portb_r))
3632   MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_fdd_portc_r))
3633   MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_fdd_portc_w))
3634
36353175   MCFG_FRAGMENT_ADD(pc9801_keyboard)
36363176   MCFG_FRAGMENT_ADD(pc9801_mouse)
36373177   MCFG_FRAGMENT_ADD(pc9801_cbus)
3638   MCFG_FRAGMENT_ADD(pc9801_sasi)
3639   MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, NULL, NULL)
36403178
36413179   MCFG_DEVICE_ADD(UPD8251_TAG, I8251, 0)
36423180
3643   MCFG_UPD765A_ADD("upd765_2hd", false, true)
3181   MCFG_UPD765A_ADD("upd765_2hd", true, true)
36443182   MCFG_UPD765_INTRQ_CALLBACK(DEVWRITELINE("pic8259_slave", pic8259_device, ir3_w))
36453183   MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("i8237", am9517a_device, dreq2_w)) MCFG_DEVCB_INVERT
3646   MCFG_UPD765A_ADD("upd765_2dd", false, true)
3647   MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(pc9801_state, fdc_2dd_irq))
3648   MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("i8237", am9517a_device, dreq3_w)) MCFG_DEVCB_INVERT
36493184   MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
36503185   MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
3651   MCFG_FLOPPY_DRIVE_ADD("upd765_2dd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
3652   MCFG_FLOPPY_DRIVE_ADD("upd765_2dd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
36533186
3187   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))
3192
36543193   MCFG_SOFTWARE_LIST_ADD("disk_list","pc98")
36553194
3656
3657   #if 0
3658   MCFG_RAM_ADD(RAM_TAG)
3659   MCFG_RAM_DEFAULT_SIZE("128K")
3660   MCFG_RAM_EXTRA_OPTIONS("256K,384K,512K,640K")
3661   #endif
3662
36633195   /* video hardware */
36643196   MCFG_SCREEN_ADD("screen", RASTER)
36653197   MCFG_SCREEN_REFRESH_RATE(60)
3666   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
36673198   MCFG_SCREEN_UPDATE_DRIVER(pc9801_state, screen_update)
36683199   MCFG_SCREEN_SIZE(640, 480)
36693200   MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
r241786r241787
36773208   MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_2_map)
36783209   MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels)
36793210
3680   MCFG_PALETTE_ADD("palette", 16)
3681   MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
3682   MCFG_GFXDECODE_ADD("gfxdecode", "palette", pc9801)
3683
36843211   MCFG_SPEAKER_STANDARD_MONO("mono")
36853212
36863213   MCFG_SOUND_ADD("beeper", BEEP, 0)
36873214   MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.15)
3215   MCFG_GFXDECODE_ADD("gfxdecode", "palette", pc9801)
36883216MACHINE_CONFIG_END
36893217
3218static MACHINE_CONFIG_START( pc9801, pc9801_state )
3219   MCFG_CPU_ADD("maincpu", I8086, 5000000) //unknown clock
3220   MCFG_CPU_PROGRAM_MAP(pc9801_map)
3221   MCFG_CPU_IO_MAP(pc9801_io)
3222   MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
3223   MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
3224
3225   MCFG_FRAGMENT_ADD(pc9801_common)
3226
3227   MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9801f)
3228   MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801f)
36903229#if 0
3230   MCFG_RAM_ADD(RAM_TAG)
3231   MCFG_RAM_DEFAULT_SIZE("128K")
3232   MCFG_RAM_EXTRA_OPTIONS("256K,384K,512K,640K")
3233#endif
3234
3235   MCFG_UPD765A_ADD("upd765_2dd", false, true)
3236   MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(pc9801_state, fdc_2dd_irq))
3237   MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("i8237", am9517a_device, dreq3_w)) MCFG_DEVCB_INVERT
3238   MCFG_FLOPPY_DRIVE_ADD("upd765_2dd:0", pc9801_floppies, "525dd", pc9801_state::floppy_formats)
3239   MCFG_FLOPPY_DRIVE_ADD("upd765_2dd:1", pc9801_floppies, "525dd", pc9801_state::floppy_formats)
3240
3241   MCFG_FRAGMENT_ADD(pc9801_sasi)
3242   MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, NULL, NULL)
3243
3244   MCFG_DEVICE_MODIFY("i8237")
3245   MCFG_I8237_IN_IOR_3_CB(DEVREAD8("upd765_2dd", upd765a_device, mdma_r))
3246   MCFG_I8237_OUT_IOW_3_CB(DEVWRITE8("upd765_2dd", upd765a_device, mdma_w))
3247
3248   MCFG_PALETTE_ADD("palette", 16)
3249   MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
3250MACHINE_CONFIG_END
3251
3252#if 0
36913253static MACHINE_CONFIG_DERIVED( pc9801vm, pc9801 )
36923254   MCFG_CPU_REPLACE("maincpu",V30,10000000)
36933255   MCFG_CPU_PROGRAM_MAP(pc9801_map)
r241786r241787
36973259#endif
36983260
36993261static MACHINE_CONFIG_START( pc9801rs, pc9801_state )
3700   MCFG_CPU_ADD("maincpu", I386, MAIN_CLOCK_X1*8) // unknown clock.
3262   MCFG_CPU_ADD("maincpu", I386SX, MAIN_CLOCK_X1*8) // unknown clock.
37013263   MCFG_CPU_PROGRAM_MAP(pc9801rs_map)
37023264   MCFG_CPU_IO_MAP(pc9801rs_io)
37033265   MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
37043266   MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
37053267
3268   MCFG_FRAGMENT_ADD(pc9801_common)
3269
37063270   MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9801rs)
37073271   MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801rs)
37083272
3709   MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
3710   MCFG_PIT8253_CLK0(MAIN_CLOCK_X1) /* heartbeat IRQ */
3711   MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259_master", pic8259_device, ir0_w))
3712   MCFG_PIT8253_CLK1(MAIN_CLOCK_X1) /* Memory Refresh */
3713   MCFG_PIT8253_CLK2(MAIN_CLOCK_X1) /* RS-232c */
3714   MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pc9801_state, write_uart_clock))
3273   MCFG_DEVICE_MODIFY("i8237")
3274   MCFG_DEVICE_CLOCK(MAIN_CLOCK_X1*8); // unknown clock
37153275
3716   MCFG_DEVICE_ADD("i8237", AM9517A, MAIN_CLOCK_X1*8) // unknown clock
3717   MCFG_I8237_OUT_HREQ_CB(WRITELINE(pc9801_state, pc9801_dma_hrq_changed))
3718   MCFG_I8237_OUT_EOP_CB(WRITELINE(pc9801_state, pc9801_tc_w))
3719   MCFG_I8237_IN_MEMR_CB(READ8(pc9801_state, pc9801_dma_read_byte))
3720   MCFG_I8237_OUT_MEMW_CB(WRITE8(pc9801_state, pc9801_dma_write_byte))
3721   MCFG_I8237_IN_IOR_2_CB(READ8(pc9801_state, fdc_2hd_r))
3722   MCFG_I8237_OUT_IOW_2_CB(WRITE8(pc9801_state, fdc_2hd_w))
3723   MCFG_I8237_OUT_DACK_0_CB(WRITELINE(pc9801_state, pc9801_dack0_w))
3724   MCFG_I8237_OUT_DACK_1_CB(WRITELINE(pc9801_state, pc9801_dack1_w))
3725   MCFG_I8237_OUT_DACK_2_CB(WRITELINE(pc9801_state, pc9801_dack2_w))
3726   MCFG_I8237_OUT_DACK_3_CB(WRITELINE(pc9801_state, pc9801_dack3_w))
3727   MCFG_PIC8259_ADD( "pic8259_master", INPUTLINE("maincpu", 0), VCC, READ8(pc9801_state,get_slave_ack) )
3728   MCFG_PIC8259_ADD( "pic8259_slave", DEVWRITELINE("pic8259_master", pic8259_device, ir7_w), GND, NULL ) // TODO: Check ir7_w
3729
3730   MCFG_DEVICE_ADD("ppi8255_sys", I8255, 0)
3731   MCFG_I8255_IN_PORTA_CB(IOPORT("DSW2"))
3732   MCFG_I8255_IN_PORTB_CB(IOPORT("DSW1"))
3733   MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_sys_portc_r))
3734   MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_sys_portc_w))
3735
3736   MCFG_DEVICE_ADD("ppi8255_prn", I8255, 0)
3737   /* TODO: check this one */
3738   MCFG_I8255_IN_PORTB_CB(IOPORT("DSW5"))
3739
3740   MCFG_DEVICE_ADD("ppi8255_fdd", I8255, 0)
3741   MCFG_I8255_IN_PORTA_CB(READ8(pc9801_state, ppi_fdd_porta_r))
3742   MCFG_I8255_IN_PORTB_CB(READ8(pc9801_state, ppi_fdd_portb_r))
3743   MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_fdd_portc_r))
3744   MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_fdd_portc_w))
3745
3746   MCFG_FRAGMENT_ADD(pc9801_keyboard)
3747   MCFG_FRAGMENT_ADD(pc9801_mouse)
37483276   MCFG_FRAGMENT_ADD(pc9801_ide)
37493277   MCFG_UPD4990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL)
3750   MCFG_DEVICE_ADD(UPD8251_TAG, I8251, 0)
37513278
3752   MCFG_UPD765A_ADD("upd765_2hd", true, true)
3753   MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(pc9801_state, pc9801rs_fdc_irq))
3754   MCFG_UPD765_DRQ_CALLBACK(WRITELINE(pc9801_state, pc9801rs_fdc_drq))
3755   //"upd765_2dd"
3756   MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
3757   MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
3758
3759   MCFG_SOFTWARE_LIST_ADD("disk_list","pc98")
3760
3761   MCFG_FRAGMENT_ADD(pc9801_cbus)
3762
37633279   MCFG_RAM_ADD(RAM_TAG)
37643280   MCFG_RAM_DEFAULT_SIZE("1664K")
37653281   MCFG_RAM_EXTRA_OPTIONS("640K,3712K,7808K")
37663282
3767   MCFG_SCREEN_ADD("screen", RASTER)
3768   MCFG_SCREEN_REFRESH_RATE(60)
3769   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
3770   MCFG_SCREEN_UPDATE_DRIVER(pc9801_state, screen_update)
3771   MCFG_SCREEN_SIZE(640, 480)
3772   MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
3773
3774   MCFG_DEVICE_ADD("upd7220_chr", UPD7220, 5000000/2)
3775   MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map)
3776   MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(pc9801_state, hgdc_draw_text)
3777   MCFG_UPD7220_VSYNC_CALLBACK(DEVWRITELINE("upd7220_btm", upd7220_device, ext_sync_w))
3778
3779   MCFG_DEVICE_ADD("upd7220_btm", UPD7220, 5000000/2)
3283   MCFG_DEVICE_MODIFY("upd7220_btm")
37803284   MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_grcg_2_map)
3781   MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels)
37823285
37833286   MCFG_PALETTE_ADD("palette", 16+16)
37843287   MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
3785   MCFG_GFXDECODE_ADD("gfxdecode", "palette", pc9801)
3786
3787   MCFG_SPEAKER_STANDARD_MONO("mono")
3788
3789//  MCFG_SOUND_ADD("opna", YM2608, MAIN_CLOCK_X1*4) // unknown clock / divider
3790//  MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
3791
3792   MCFG_SOUND_ADD("beeper", BEEP, 0)
3793   MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.15)
37943288MACHINE_CONFIG_END
37953289
37963290static MACHINE_CONFIG_DERIVED( pc9801ux, pc9801rs )
r241786r241787
38053299
38063300static MACHINE_CONFIG_DERIVED( pc9801bx2, pc9801rs )
38073301   MCFG_CPU_REPLACE("maincpu",I486,25000000)
3808   MCFG_CPU_PROGRAM_MAP(pc9801rs_map)
3809   MCFG_CPU_IO_MAP(pc9801bx2_io)
3302   MCFG_CPU_PROGRAM_MAP(pc9821_map)
3303   MCFG_CPU_IO_MAP(pc9821_io)
38103304   MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
38113305   MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
38123306
38133307   MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9801bx2)
38143308MACHINE_CONFIG_END
38153309
3816static MACHINE_CONFIG_START( pc9821, pc9801_state )
3817   MCFG_CPU_ADD("maincpu", I486, 16000000) // unknown clock
3310static MACHINE_CONFIG_DERIVED( pc9821, pc9801rs )
3311   MCFG_CPU_REPLACE("maincpu", I486, 16000000) // unknown clock
38183312   MCFG_CPU_PROGRAM_MAP(pc9821_map)
38193313   MCFG_CPU_IO_MAP(pc9821_io)
38203314   MCFG_CPU_VBLANK_INT_DRIVER("screen", pc9801_state, pc9801_vrtc_irq)
38213315   MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
38223316
3317   MCFG_DEVICE_MODIFY("pit8253")
3318   MCFG_PIT8253_CLK0(MAIN_CLOCK_X2)
3319   MCFG_PIT8253_CLK1(MAIN_CLOCK_X2)
3320   MCFG_PIT8253_CLK2(MAIN_CLOCK_X2)
3321
38233322   MCFG_MACHINE_START_OVERRIDE(pc9801_state,pc9821)
38243323   MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9821)
38253324
3826   MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
3827   MCFG_PIT8253_CLK0(MAIN_CLOCK_X2) /* heartbeat IRQ */
3828   MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259_master", pic8259_device, ir0_w))
3829   MCFG_PIT8253_CLK1(MAIN_CLOCK_X2) /* Memory Refresh */
3830   MCFG_PIT8253_CLK2(MAIN_CLOCK_X2) /* RS-232c */
3831   MCFG_PIT8253_OUT2_HANDLER(WRITELINE(pc9801_state, write_uart_clock))
3325   MCFG_DEVICE_MODIFY("i8237")
3326   MCFG_DEVICE_CLOCK(16000000); // unknown clock
38323327
3833   MCFG_DEVICE_ADD("i8237", AM9517A, 16000000) // unknown clock
3834   MCFG_I8237_OUT_HREQ_CB(WRITELINE(pc9801_state, pc9801_dma_hrq_changed))
3835   MCFG_I8237_OUT_EOP_CB(WRITELINE(pc9801_state, pc9801_tc_w))
3836   MCFG_I8237_IN_MEMR_CB(READ8(pc9801_state, pc9801_dma_read_byte))
3837   MCFG_I8237_OUT_MEMW_CB(WRITE8(pc9801_state, pc9801_dma_write_byte))
3838   MCFG_I8237_IN_IOR_2_CB(READ8(pc9801_state, fdc_2hd_r))
3839   MCFG_I8237_OUT_IOW_2_CB(WRITE8(pc9801_state, fdc_2hd_w))
3840   MCFG_I8237_OUT_DACK_0_CB(WRITELINE(pc9801_state, pc9801_dack0_w))
3841   MCFG_I8237_OUT_DACK_1_CB(WRITELINE(pc9801_state, pc9801_dack1_w))
3842   MCFG_I8237_OUT_DACK_2_CB(WRITELINE(pc9801_state, pc9801_dack2_w))
3843   MCFG_I8237_OUT_DACK_3_CB(WRITELINE(pc9801_state, pc9801_dack3_w))
3844   MCFG_PIC8259_ADD( "pic8259_master", INPUTLINE("maincpu", 0), VCC, READ8(pc9801_state,get_slave_ack) )
3845   MCFG_PIC8259_ADD( "pic8259_slave", DEVWRITELINE("pic8259_master", pic8259_device, ir7_w), GND, NULL ) // TODO: Check ir7_w
3846
3847   MCFG_DEVICE_ADD("ppi8255_sys", I8255, 0)
3848   MCFG_I8255_IN_PORTA_CB(IOPORT("DSW2"))
3849   MCFG_I8255_IN_PORTB_CB(IOPORT("DSW1"))
3850   MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_sys_portc_r))
3851   MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_sys_portc_w))
3852
3853   MCFG_DEVICE_ADD("ppi8255_prn", I8255, 0)
3854   /* TODO: check this one */
3855   MCFG_I8255_IN_PORTB_CB(IOPORT("DSW5"))
3856
3857   MCFG_DEVICE_ADD("ppi8255_fdd", I8255, 0)
3858   MCFG_I8255_IN_PORTA_CB(READ8(pc9801_state, ppi_fdd_porta_r))
3859   MCFG_I8255_IN_PORTB_CB(READ8(pc9801_state, ppi_fdd_portb_r))
3860   MCFG_I8255_IN_PORTC_CB(READ8(pc9801_state, ppi_fdd_portc_r))
3861   MCFG_I8255_OUT_PORTC_CB(WRITE8(pc9801_state, ppi_fdd_portc_w))
3862
3863   MCFG_FRAGMENT_ADD(pc9801_keyboard)
3864   MCFG_FRAGMENT_ADD(pc9801_mouse)
3865   MCFG_FRAGMENT_ADD(pc9801_ide)
3866   MCFG_UPD4990A_ADD("upd1990a", XTAL_32_768kHz, NULL, NULL)
3867   MCFG_DEVICE_ADD(UPD8251_TAG, I8251, 0)
3868
3869   MCFG_UPD765A_ADD("upd765_2hd", false, true)
3870   MCFG_UPD765_INTRQ_CALLBACK(DEVWRITELINE("pic8259_slave", pic8259_device, ir3_w))
3871   MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("i8237", am9517a_device, dreq2_w)) MCFG_DEVCB_INVERT
3872   //"upd765_2dd"
3873   MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:0", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
3874   MCFG_FLOPPY_DRIVE_ADD("upd765_2hd:1", pc9801_floppies, "525hd", pc9801_state::floppy_formats)
3875
3876   MCFG_SOFTWARE_LIST_ADD("disk_list","pc98")
3877
3878   MCFG_FRAGMENT_ADD(pc9801_cbus)
3879
3880   MCFG_RAM_ADD(RAM_TAG)
3881   MCFG_RAM_DEFAULT_SIZE("1664K")
3882   MCFG_RAM_EXTRA_OPTIONS("3712K,7808K")
3883
3884   MCFG_SCREEN_ADD("screen", RASTER)
3885   MCFG_SCREEN_REFRESH_RATE(60)
3886   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
3887   MCFG_SCREEN_UPDATE_DRIVER(pc9801_state, screen_update)
3888   MCFG_SCREEN_SIZE(640, 480)
3889   MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
3890
3891   MCFG_DEVICE_ADD("upd7220_chr", UPD7220, 5000000/2)
3892   MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map)
3893   MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(pc9801_state, hgdc_draw_text)
3894   MCFG_UPD7220_VSYNC_CALLBACK(DEVWRITELINE("upd7220_btm", upd7220_device, ext_sync_w))
3895
3896   MCFG_DEVICE_ADD("upd7220_btm", UPD7220, 5000000/2)
3897   MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_grcg_2_map)
3898   MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels)
3899
3328   MCFG_DEVICE_REMOVE("palette")
39003329   MCFG_PALETTE_ADD("palette", 16+16+256)
39013330   MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
3902   MCFG_GFXDECODE_ADD("gfxdecode", "palette", pc9801)
3903
3904   MCFG_SPEAKER_STANDARD_MONO("mono")
3905
3906//  MCFG_SOUND_ADD("opna", YM2608, MAIN_CLOCK_X1*4) // unknown clock / divider
3907//  MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
3908
3909   MCFG_SOUND_ADD("beeper", BEEP, 0)
3910   MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.15)
39113331MACHINE_CONFIG_END
39123332
39133333static MACHINE_CONFIG_DERIVED( pc9821ap2, pc9821)


Previous 199869 Revisions Next


© 1997-2024 The MAME Team