Diff for /np2/pccore.c between versions 1.106 and 1.111

version 1.106, 2005/05/20 13:59:45 version 1.111, 2011/02/23 10:11:44
Line 1 Line 1
   /**
    * @file        pccore.c
    * @brief       emluration core
    *
    * @author      $Author$
    * @date        $Date$
    */
   
 #include        "compiler.h"  #include        "compiler.h"
 #include        "strres.h"  #include        "strres.h"
 #include        "dosio.h"  #include        "dosio.h"
Line 75  const OEMCHAR np2version[] = OEMTEXT(NP2 Line 83  const OEMCHAR np2version[] = OEMTEXT(NP2
                                                 0, PCMODEL_VX, 0, 0, {0x3e, 0x73, 0x7b}, 0,                                                  0, PCMODEL_VX, 0, 0, {0x3e, 0x73, 0x7b}, 0,
                                                 0, 0,                                                  0, 0,
                                                 PCBASECLOCK25 * PCBASEMULTIPLE};                                                  PCBASECLOCK25 * PCBASEMULTIPLE};
           PCSTAT  pcstat = {3, TRUE, FALSE, FALSE};
   
         UINT8   screenupdate = 3;  //      UINT8   screenupdate = 3;
         int             screendispflag = 1;  //      int             screendispflag = 1;
         int             soundrenewal = 0;          UINT8   soundrenewal = 0;
         BOOL    drawframe;  //      BOOL    drawframe;
         UINT    drawcount = 0;          UINT    drawcount = 0;
         BOOL    hardwarereset = FALSE;  //      BOOL    hardwarereset = FALSE;
   
   
 // ---------------------------------------------------------------------------  // ---------------------------------------------------------------------------
Line 104  const OEMCHAR *p; Line 113  const OEMCHAR *p;
   
 // ----  // ----
   
 static void pccore_set(void) {  static void pccore_set(const NP2CFG *pConfig)
   {
         UINT8   model;          UINT8   model;
         UINT32  multiple;          UINT32  multiple;
         UINT8   extsize;          UINT8   extsize;
   
         ZeroMemory(&pccore, sizeof(pccore));          ZeroMemory(&pccore, sizeof(pccore));
         model = PCMODEL_VX;          model = PCMODEL_VX;
         if (!milstr_cmp(np2cfg.model, str_VM)) {          if (!milstr_cmp(pConfig->model, str_VM)) {
                 model = PCMODEL_VM;                  model = PCMODEL_VM;
         }          }
         else if (!milstr_cmp(np2cfg.model, str_EPSON)) {          else if (!milstr_cmp(pConfig->model, str_EPSON)) {
                 model = PCMODEL_EPSON | PCMODEL_VM;                  model = PCMODEL_EPSON | PCMODEL_VM;
         }          }
         pccore.model = model;          pccore.model = model;
   
         if (np2cfg.baseclock >= ((PCBASECLOCK25 + PCBASECLOCK20) / 2)) {          if (np2cfg.baseclock >= ((PCBASECLOCK25 + PCBASECLOCK20) / 2))
           {
                 pccore.baseclock = PCBASECLOCK25;                       // 2.5MHz                  pccore.baseclock = PCBASECLOCK25;                       // 2.5MHz
                 pccore.cpumode = 0;                  pccore.cpumode = 0;
         }          }
         else {          else
           {
                 pccore.baseclock = PCBASECLOCK20;                       // 2.0MHz                  pccore.baseclock = PCBASECLOCK20;                       // 2.0MHz
                 pccore.cpumode = CPUMODE_8MHZ;                  pccore.cpumode = CPUMODE_8MHZ;
         }          }
         multiple = np2cfg.multiple;          multiple = pConfig->multiple;
         if (multiple == 0) {          if (multiple == 0)
           {
                 multiple = 1;                  multiple = 1;
         }          }
         else if (multiple > 32) {          else if (multiple > 32)
           {
                 multiple = 32;                  multiple = 32;
         }          }
         pccore.multiple = multiple;          pccore.multiple = multiple;
         pccore.realclock = pccore.baseclock * multiple;          pccore.realclock = pccore.baseclock * multiple;
   
         // HDDの接続 (I/Oの使用状態が変わるので..          // HDDの接続 (I/Oの使用状態が変わるので..
         if (np2cfg.dipsw[1] & 0x20) {          if (pConfig->dipsw[1] & 0x20)
           {
                 pccore.hddif |= PCHDD_IDE;                  pccore.hddif |= PCHDD_IDE;
 #if defined(SUPPORT_IDEIO)  #if defined(SUPPORT_IDEIO)
                 sxsi_setdevtype(0x02, SXSIDEV_CDROM);                  sxsi_setdevtype(0x02, SXSIDEV_CDROM);
 #endif  #endif
         }          }
         else {          else
           {
                 sxsi_setdevtype(0x02, SXSIDEV_NC);                  sxsi_setdevtype(0x02, SXSIDEV_NC);
         }          }
   
         // 拡張メモリ          // 拡張メモリ
         extsize = 0;          extsize = 0;
         if (!(np2cfg.dipsw[2] & 0x80)) {          if (!(pConfig->dipsw[2] & 0x80))
           {
                 extsize = np2cfg.EXTMEM;                  extsize = np2cfg.EXTMEM;
 #if defined(CPUCORE_IA32)  #if defined(CPUCORE_IA32)
                 extsize = min(extsize, 63);                  extsize = min(extsize, 63);
Line 160  static void pccore_set(void) { Line 176  static void pccore_set(void) {
 #endif  #endif
         }          }
         pccore.extmem = extsize;          pccore.extmem = extsize;
         CopyMemory(pccore.dipsw, np2cfg.dipsw, 3);          CopyMemory(pccore.dipsw, pConfig->dipsw, 3);
   
         // サウンドボードの接続          // サウンドボードの接続
         pccore.sound = np2cfg.SOUND_SW;          pccore.sound = pConfig->SOUND_SW;
   
         // その他CBUSの接続          // その他CBUSの接続
         pccore.device = 0;          pccore.device = 0;
         if (np2cfg.pc9861enable) {          if (pConfig->pc9861enable)
           {
                 pccore.device |= PCCBUS_PC9861K;                  pccore.device |= PCCBUS_PC9861K;
         }          }
         if (np2cfg.mpuenable) {          if (pConfig->mpuenable)
           {
                 pccore.device |= PCCBUS_MPU98;                  pccore.device |= PCCBUS_MPU98;
         }          }
 }  }
Line 179  static void pccore_set(void) { Line 197  static void pccore_set(void) {
 // --------------------------------------------------------------------------  // --------------------------------------------------------------------------
   
 #if !defined(DISABLE_SOUND)  #if !defined(DISABLE_SOUND)
 static void sound_init(void) {  static void sound_init(void)
   {
         UINT    rate;          UINT    rate;
   
         rate = np2cfg.samplingrate;          rate = np2cfg.samplingrate;
         if ((rate != 11025) && (rate != 22050) && (rate != 44100)) {          if ((rate != 11025) && (rate != 22050) && (rate != 44100))
           {
                 rate = 0;                  rate = 0;
         }          }
         sound_create(rate, np2cfg.delayms);          sound_create(rate, np2cfg.delayms);
Line 283  void pccore_cfgupdate(void) { Line 302  void pccore_cfgupdate(void) {
         int             i;          int             i;
   
         renewal = FALSE;          renewal = FALSE;
         for (i=0; i<8; i++) {          for (i=0; i<8; i++)
                 if (np2cfg.memsw[i] != mem[MEMX_MSW + i*4]) {          {
                   if (np2cfg.memsw[i] != mem[MEMX_MSW + i*4])
                   {
                         np2cfg.memsw[i] = mem[MEMX_MSW + i*4];                          np2cfg.memsw[i] = mem[MEMX_MSW + i*4];
                         renewal = TRUE;                          renewal = TRUE;
                 }                  }
         }          }
           for (i=0; i<3; i++)
           {
                   if (np2cfg.dipsw[i] != pccore.dipsw[i])
                   {
                           np2cfg.dipsw[i] = pccore.dipsw[i];
                           renewal = TRUE;
                   }
           }
         if (renewal) {          if (renewal) {
                 sysmng_update(SYS_UPDATECFG);                  sysmng_update(SYS_UPDATECFG);
         }          }
 }  }
   
   /**
    * Reset the virtual machine
    */
 void pccore_reset(void) {  void pccore_reset(void) {
   
         int             i;          int             i;
           BOOL    epson;
   
         soundmng_stop();          soundmng_stop();
 #if !defined(DISABLE_SOUND)  #if !defined(DISABLE_SOUND)
Line 312  void pccore_reset(void) { Line 345  void pccore_reset(void) {
         ZeroMemory(mem + FONT_ADRS, 0x08000);          ZeroMemory(mem + FONT_ADRS, 0x08000);
   
         //メモリスイッチ          //メモリスイッチ
         for (i=0; i<8; i++) {          for (i=0; i<8; i++)
           {
                 mem[0xa3fe2 + i*4] = np2cfg.memsw[i];                  mem[0xa3fe2 + i*4] = np2cfg.memsw[i];
         }          }
   
         pccore_set();          pccore_set(&np2cfg);
         nevent_allreset();          nevent_allreset();
   
         CPU_RESET();          CPU_RESET();
         CPU_SETEXTSIZE((UINT32)pccore.extmem);          CPU_SETEXTSIZE((UINT32)pccore.extmem);
   
         CPU_TYPE = 0;          CPU_TYPE = 0;
         if (np2cfg.dipsw[2] & 0x80) {          if (pccore.dipsw[2] & 0x80) {
                 CPU_TYPE = CPUTYPE_V30;                  CPU_TYPE = CPUTYPE_V30;
         }          }
         if (pccore.model & PCMODEL_EPSON) {                     // RAM ctrl  
           epson = (pccore.model & PCMODEL_EPSON) ? TRUE : FALSE;
           if (epson) {
                   /* enable RAM (D0000-DFFFF) */
                 CPU_RAM_D000 = 0xffff;                  CPU_RAM_D000 = 0xffff;
         }          }
           font_setchargraph(epson);
   
         // HDDセット          // HDDセット
         diskdrv_hddbind();          diskdrv_hddbind();
Line 355  void pccore_reset(void) { Line 393  void pccore_reset(void) {
         fddfile_reset2dmode();          fddfile_reset2dmode();
         bios0x18_16(0x20, 0xe1);          bios0x18_16(0x20, 0xe1);
   
         iocore_reset();                                                         // サウンドでpicを呼ぶので…          iocore_reset(&np2cfg);                                                          // サウンドでpicを呼ぶので…
         cbuscore_reset();          cbuscore_reset(&np2cfg);
         fmboard_reset(pccore.sound);          fmboard_reset(&np2cfg, pccore.sound);
   
         MEMM_ARCH((pccore.model & PCMODEL_EPSON)?1:0);          MEMM_ARCH((epson) ? 1 : 0);
         iocore_build();          iocore_build();
         iocore_bind();          iocore_bind();
         cbuscore_bind();          cbuscore_bind();
Line 414  static void drawscreen(void) { Line 452  static void drawscreen(void) {
                 gdc_updateclock();                  gdc_updateclock();
         }          }
   
         if (!drawframe) {          if (!pcstat.drawframe) {
                 return;                  return;
         }          }
         if ((gdcs.textdisp & GDCSCRN_EXT) || (gdcs.grphdisp & GDCSCRN_EXT)) {          if ((gdcs.textdisp & GDCSCRN_EXT) || (gdcs.grphdisp & GDCSCRN_EXT)) {
Line 428  static void drawscreen(void) { Line 466  static void drawscreen(void) {
                 dispsync_renewalhorizontal();                  dispsync_renewalhorizontal();
                 tramflag.renewal |= 1;                  tramflag.renewal |= 1;
                 if (dispsync_renewalmode()) {                  if (dispsync_renewalmode()) {
                         screenupdate |= 2;                          pcstat.screenupdate |= 2;
                 }                  }
         }          }
         if (gdcs.palchange) {          if (gdcs.palchange) {
                 gdcs.palchange = 0;                  gdcs.palchange = 0;
                 pal_change(0);                  pal_change(0);
                 screenupdate |= 1;                  pcstat.screenupdate |= 1;
         }          }
         if (gdcs.grphdisp & GDCSCRN_EXT) {          if (gdcs.grphdisp & GDCSCRN_EXT) {
                 gdcs.grphdisp &= ~GDCSCRN_EXT;                  gdcs.grphdisp &= ~GDCSCRN_EXT;
Line 462  static void drawscreen(void) { Line 500  static void drawscreen(void) {
                         if (gdcs.grphdisp & bit) {                          if (gdcs.grphdisp & bit) {
                                 (*grphfn)(gdcs.disp, gdcs.grphdisp & bit & GDCSCRN_ALLDRAW2);                                  (*grphfn)(gdcs.disp, gdcs.grphdisp & bit & GDCSCRN_ALLDRAW2);
                                 gdcs.grphdisp &= ~bit;                                  gdcs.grphdisp &= ~bit;
                                 screenupdate |= 1;                                  pcstat.screenupdate |= 1;
                         }                          }
                 }                  }
                 else if (gdcs.textdisp & GDCSCRN_ENABLE) {                  else if (gdcs.textdisp & GDCSCRN_ENABLE) {
Line 478  static void drawscreen(void) { Line 516  static void drawscreen(void) {
                                                                 gdcs.grphdisp & GDCSCRN_ALLDRAW);                                                                  gdcs.grphdisp & GDCSCRN_ALLDRAW);
                                         }                                          }
                                         gdcs.grphdisp &= ~GDCSCRN_MAKE;                                          gdcs.grphdisp &= ~GDCSCRN_MAKE;
                                         screenupdate |= 1;                                          pcstat.screenupdate |= 1;
                                 }                                  }
                         }                          }
                         else {                          else {
Line 493  static void drawscreen(void) { Line 531  static void drawscreen(void) {
                                                                 gdcs.grphdisp & (GDCSCRN_ALLDRAW << 1));                                                                  gdcs.grphdisp & (GDCSCRN_ALLDRAW << 1));
                                         }                                          }
                                         gdcs.grphdisp &= ~(GDCSCRN_MAKE << 1);                                          gdcs.grphdisp &= ~(GDCSCRN_MAKE << 1);
                                         screenupdate |= 1;                                          pcstat.screenupdate |= 1;
                                 }                                  }
                         }                          }
                 }                  }
Line 514  static void drawscreen(void) { Line 552  static void drawscreen(void) {
                                 maketext40(gdcs.textdisp & GDCSCRN_ALLDRAW);                                  maketext40(gdcs.textdisp & GDCSCRN_ALLDRAW);
                         }                          }
                         gdcs.textdisp &= ~GDCSCRN_MAKE;                          gdcs.textdisp &= ~GDCSCRN_MAKE;
                         screenupdate |= 1;                          pcstat.screenupdate |= 1;
                 }                  }
         }          }
         if (screenupdate) {          if (pcstat.screenupdate) {
                 screenupdate = scrndraw_draw((UINT8)(screenupdate & 2));                  pcstat.screenupdate = scrndraw_draw((UINT8)(pcstat.screenupdate & 2));
                 drawcount++;                  drawcount++;
         }          }
 }  }
Line 529  void screendisp(NEVENTITEM item) { Line 567  void screendisp(NEVENTITEM item) {
   
         gdc_work(GDCWORK_SLAVE);          gdc_work(GDCWORK_SLAVE);
         gdc.vsync = 0;          gdc.vsync = 0;
         screendispflag = 0;          pcstat.screendispflag = 0;
         if (!np2cfg.DISPSYNC) {          if (!np2cfg.DISPSYNC) {
                 drawscreen();                  drawscreen();
         }          }
Line 580  void pccore_postevent(UINT32 event) { // Line 618  void pccore_postevent(UINT32 event) { //
   
 void pccore_exec(BOOL draw) {  void pccore_exec(BOOL draw) {
   
         drawframe = draw;          pcstat.drawframe = (UINT8)draw;
 //      keystat_sync();  //      keystat_sync();
         soundmng_sync();          soundmng_sync();
         mouseif_sync();          mouseif_sync();
         pal_eventclear();          pal_eventclear();
   
         gdc.vsync = 0;          gdc.vsync = 0;
         screendispflag = 1;          pcstat.screendispflag = 1;
         MEMWAIT_TRAM = np2cfg.wait[0];          MEMWAIT_TRAM = np2cfg.wait[0];
         MEMWAIT_VRAM = np2cfg.wait[2];          MEMWAIT_VRAM = np2cfg.wait[2];
         MEMWAIT_GRCG = np2cfg.wait[4];          MEMWAIT_GRCG = np2cfg.wait[4];
Line 595  void pccore_exec(BOOL draw) { Line 633  void pccore_exec(BOOL draw) {
   
 //      nevent_get1stevent();  //      nevent_get1stevent();
   
         while(screendispflag) {          while(pcstat.screendispflag) {
 #if defined(TRACE)  #if defined(TRACE)
                 resetcnt++;                  resetcnt++;
 #endif  #endif
Line 625  void pccore_exec(BOOL draw) { Line 663  void pccore_exec(BOOL draw) {
         diskdrv_callback();          diskdrv_callback();
         calendar_inc();          calendar_inc();
         S98_sync();          S98_sync();
         sound_sync();                                                                                                   // happy!          sound_sync();
   
         if (hardwarereset) {          if (pcstat.hardwarereset) {
                 hardwarereset = FALSE;                  pcstat.hardwarereset = FALSE;
                 pccore_cfgupdate();                  pccore_cfgupdate();
                 pccore_reset();                  pccore_reset();
         }          }

Removed from v.1.106  
changed lines
  Added in v.1.111


RetroPC.NET-CVS <cvs@retropc.net>