Diff for /xmil/pccore.c between versions 1.9 and 1.37

version 1.9, 2004/08/05 11:30:12 version 1.37, 2008/05/19 13:24:19
Line 1 Line 1
   
   // #define      SINGLESTEPONLY
   // #define      IPTRACE                 (1 << 14)
   // #define      NEVENT_COUNTER
   // #define      PCCOUNTER
   // #define      IOCOUNTER
   // #define      CTCCOUNTER
   
 #include        "compiler.h"  #include        "compiler.h"
   #if defined(TRACE) && IPTRACE
 #include        "dosio.h"  #include        "dosio.h"
   #endif
   #if defined(SUPPORT_TURBOZ)
 #include        "scrnmng.h"  #include        "scrnmng.h"
   #endif
   #if !defined(DISABLE_SOUND)
 #include        "soundmng.h"  #include        "soundmng.h"
   #endif
 #include        "sysmng.h"  #include        "sysmng.h"
 #include        "timemng.h"  #include        "timemng.h"
   #include        "xmilver.h"
 #include        "z80core.h"  #include        "z80core.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
 #include        "draw.h"  #include        "nevent.h"
   #include        "ievent.h"
   #include        "timing.h"
   #include        "calendar.h"
   #include        "keystat.h"
   #include        "palettes.h"
   #include        "makescrn.h"
 #include        "sound.h"  #include        "sound.h"
 #include        "sndctrl.h"  #include        "sndctrl.h"
 #include        "menu.h"  
 #include        "font.h"  #include        "font.h"
 #include        "xmilver.h"  
 #include        "fddfile.h"  #include        "fddfile.h"
 #include        "calendar.h"  
 #include        "timing.h"  
 #include        "defrom.res"  
 #include        "keystat.h"  
   
   
 const OEMCHAR xmilversion[] = OEMTEXT(XMILVER_CORE);  const OEMCHAR xmilversion[] = OEMTEXT(XMILVER_CORE);
   
         XMILCFG         xmilcfg = {     0, 0, 1, 0, 1, 2, 0, 1,          XMILCFG         xmilcfg = { 2, 1, 0x03,
                                                         22050, 1000, 0, 80,                                                          1, 0, 0, 0,
                                                         0, 0,  #if !defined(DISABLE_SOUND)
                                                         0, 0,                                                          22050, 500,
                                                         0, 0, 0,  #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
                                                         1,                                                          0, 64,
                                                         1, 0};  #endif
                                                           64, 0, 80,
         PCCORE          pccore = {250, 0, 1, 0};  #endif
         BYTE            mMAIN[0x10000];                                                          0, 0, 0, 0};
         BYTE            mBIOS[0x8000];  
         BYTE            mBANK[16][0x8000];  
         WORD            v_cnt;  
         int                     s_cnt;  
   
         BYTE            *RAM0r;  
         BYTE            *RAM0w;  
         DWORD           h_cntbase;  
         BRESULT         soundrenewal;  
   
   
   
 /***********************************************************************  
         IPL-ROM LOAD  
 ***********************************************************************/  
   
 void ipl_load(void) {  
   
         FILEH   hdl;  
   
         ZeroMemory(mBIOS, sizeof(mBIOS));  
         CopyMemory(mBIOS, DEFROM, sizeof(DEFROM));  
   
         if (pccore.ROM_TYPE >= 2) {  
                 if ((hdl = file_open_c(OEMTEXT("IPLROM.X1T"))) != FILEH_INVALID) {  
                         file_read(hdl, mBIOS, 0x8000);  
                         file_close(hdl);  
                 }  
         }  
         else if (pccore.ROM_TYPE == 1) {  
                 if ((hdl = file_open_c(OEMTEXT("IPLROM.X1"))) != FILEH_INVALID) {  
                         file_read(hdl, mBIOS, 0x8000);  
                         file_close(hdl);  
                 }  
         }  
 }  
   
   
 /***********************************************************************  
         初期化  
 ***********************************************************************/  
   
 BYTE reset_x1(BYTE ROM_TYPE, BYTE SOUND_SW, BYTE DIP_SW) {  
   
         pccore.HSYNC_CLK = 250;  
         pccore.ROM_TYPE = ROM_TYPE;  
         pccore.SOUND_SW = SOUND_SW;  
         pccore.DIP_SW = DIP_SW;  
   
         // スクリーンモードの変更...  
         if (pccore.ROM_TYPE >= 3) {  
                 if (scrnmng_setcolormode(TRUE) != SUCCESS) {  
                         pccore.ROM_TYPE = 2;  
                 }  
         }  
         else {  
                 scrnmng_setcolormode(FALSE);  
         }  
   
         textdrawproc_renewal();  
         ipl_load();  
   
         Z80_RESET();  
         iocore_reset();  
   
         RAM0r = mBIOS;  
         RAM0w = mMAIN;  
         h_cntbase = 0;  
         sysmng_cpureset();  
   
         calendar_initialize();  
   
         cgrom_reset();  
         cmt_reset();  
         crtc_reset();  
         ctc_reset();  
         dmac_reset();  
         fdc_reset();  
         memio_reset();  
         pcg_reset();  
         ppi_reset();  
         sio_reset();  
         sndboard_reset();  
         subcpu_reset();  
         vramio_reset();  
   
         timing_reset();  
         return(SUCCESS);  
 }  
   
   
           PCCORE          pccore;
           CORESTAT        corestat;
   
 /***********************************************************************  
         実行/終了  
 ***********************************************************************/  
   
 static  BYTE    keyintcnt = 0;  // ----
   
 void pccore_initialize(void) {  void pccore_initialize(void) {
   
           Z80_INITIALIZE();
           fddfile_initialize();
         sndctrl_initialize();          sndctrl_initialize();
           makescrn_initialize();
   
         init_draw();  
         font_load(NULL, TRUE);          font_load(NULL, TRUE);
   
         crtc_initialize();          crtc_initialize();
         pcg_initialize();          pcg_initialize();
         ppi_initialize();          ppi_initialize();
   }
   
   void pccore_deinitialize(void) {
   
         reset_x1(xmilcfg.ROM_TYPE, xmilcfg.SOUND_SW, xmilcfg.DIP_SW);          sndctrl_deinitialize();
   
 //      keystat_initialize();          fddfile_eject(0);
 //      keystat_reset();          fddfile_eject(1);
           fddfile_eject(2);
           fddfile_eject(3);
 }  }
   
   #if 0
   void neitem_dummy(UINT id) {
   
           nevent_repeat(id);
   }
   #endif
   
 void pccore_reset(void) {  void pccore_reset(void) {
   
   #if !defined(DISABLE_SOUND)
         soundmng_stop();          soundmng_stop();
         if (soundrenewal) {          if (corestat.soundrenewal) {
                 soundrenewal = 0;                  corestat.soundrenewal = 0;
                 sndctrl_deinitialize();                  sndctrl_deinitialize();
                 sndctrl_initialize();                  sndctrl_initialize();
         }          }
         reset_x1(xmilcfg.ROM_TYPE, xmilcfg.SOUND_SW, xmilcfg.DIP_SW);  #endif
         soundmng_play();  
 }  
   
 void pccore_deinitialize(void) {  #if !defined(FIX_Z80A)
           pccore.baseclock = 2000000;
           pccore.multiple = 2;
           pccore.realclock = pccore.baseclock * pccore.multiple;
   #endif
   
         sndctrl_deinitialize();          pccore.ROM_TYPE = xmilcfg.ROM_TYPE;
   #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
           if (xmilcfg.ROM_TYPE >= 3) {
                   pccore.SOUND_SW = 1;                                    // 無条件で搭載
           }
           else {
                   pccore.SOUND_SW = xmilcfg.SOUND_SW;
           }
   #endif
           pccore.DIP_SW = xmilcfg.DIP_SW;
   
 //      keyboard_term();          // スクリーンモードの変更...
   #if defined(SUPPORT_TURBOZ)
           if (pccore.ROM_TYPE >= 3) {
                   if (scrnmng_setcolormode(TRUE) != SUCCESS) {
                           pccore.ROM_TYPE = 2;
                   }
           }
           else {
                   scrnmng_setcolormode(FALSE);
           }
   #endif
   
           sysmng_cpureset();
   
           sound_changeclock();
           sound_reset();
   
           Z80_RESET();
           nevent_allreset();
           ievent_reset();
           calendar_reset();
           iocore_reset();
   //      nevent_set(15, 4000000 / (60 * 50), neitem_dummy, NEVENT_RELATIVE);
   
           pal_reset();
           makescrn_reset();
           timing_reset();
   
         fdd_eject(0);  #if !defined(DISABLE_SOUND)
         fdd_eject(1);          soundmng_play();
         fdd_eject(2);  #endif
         fdd_eject(3);  
 }  }
   
   
 // ----  // ----
   
 // #define      IPTRACE                 (1 << 14)  
   
 #if defined(TRACE) && IPTRACE  #if defined(TRACE) && IPTRACE
 static  UINT    trpos = 0;  static  UINT    trpos = 0;
 static  UINT16  treip[IPTRACE];  static  UINT16  treip[IPTRACE];
Line 206  void iptrace_out(void) { Line 179  void iptrace_out(void) {
 #endif  #endif
   
   
   #if !defined(MAINFRAMES_OLD)
   void neitem_mainframes(UINT id) {
   
           SINT32  clock;
           REG8    ppib;
           SINT32  next;
   
           clock = CPU_CLOCKCOUNT - iocore.e.framestartclock;
           ppib = iocore.s.ppib & (~0x84);
           do {
                   next = iocore.e.dispclock;
                   if (clock < next) {
                           ppib |= 0x80;
                           break;
                   }
                   next = iocore.e.dispclock;
                   if (clock < next) {
                           if (xmilcfg.DISPSYNC & 1) {
                                   scrnupdate();
                           }
                           break;
                   }
                   next = iocore.e.vsyncend;
                   if (clock < next) {
                           ppib |= 0x04;
                           break;
                   }
                   next = corestat.framebaseclock;
                   if (clock >= next) {
                           corestat.vsync = 2;
                           return;
                   }
           } while(0);
           iocore.s.ppib = ppib;
           nevent_set(NEVENT_FRAMES,
                                                           next - clock, neitem_mainframes, NEVENT_ABSOLUTE);
   }
   #else
   void neitem_disp(UINT id) {
   
           corestat.vsync = 1;
           if (xmilcfg.DISPSYNC & 1) {
                   scrnupdate();
           }
           nevent_set(id, corestat.syncclock, neitem_vsync, NEVENT_RELATIVE);
   }
   
   void neitem_vsync(UINT id) {
   
           corestat.vsync = 2;
           (void)id;
   }
   #endif
   
   
   // ----
   
 void x1r_exec(void) {  #if defined(TRACE) && defined(IOCOUNTER)
   static  UINT    iocounter = 0;
                   UINT    icounter[0x2008];
                   UINT    ocounter[0x2008];
   #endif
   #if defined(TRACE) && defined(CTCCOUNTER)
                   UINT    ctccnt;
   #endif
   #if defined(TRACE) && defined(PCCOUNTER)
                   UINT    pccnt;
                   UINT    pccnt2;
                   UINT    pccnt3;
                   UINT    lastpc;
   #endif
   
         REG8    inttiming;  void pccore_exec(BRESULT draw) {
   
           SINT32  frameclock;
   #if defined(MAINFRAMES_OLD)
           SINT32  dispclock;
   #endif
   #if defined(TRACE) && defined(NEVENT_COUNTER)
           UINT    ncounter = 0;
   #endif
   
           corestat.drawframe = draw;
           pal_eventclear();
   #if !defined(DISABLE_SOUND)
           soundmng_sync();
   #endif
   
           frameclock = crtc.e.frameclock;
           if (corestat.framebaseclock != frameclock) {
                   corestat.framebaseclock = frameclock;
                   timing_setrate(frameclock);
           }
           corestat.vsync = 0;
   
           iocore.e.framestartclock = CPU_CLOCKCOUNT;
   
   #if !defined(MAINFRAMES_OLD)
           neitem_mainframes(NEVENT_FRAMES);
   #else
   #if !defined(FIX_Z80A)
           frameclock = frameclock * pccore.multiple / 2;
   #endif
           dispclock = min(frameclock, iocore.e.dispclock);
   //      corestat.dispclock = dispclock;
           corestat.syncclock = frameclock - dispclock;
           nevent_set(NEVENT_FRAMES, dispclock, neitem_disp, NEVENT_RELATIVE);
   #endif
   
         v_cnt = 0;          do {
         s_cnt = 0;  #if defined(TRACE) && defined(NEVENT_COUNTER)
         xmilcfg.DISPSYNC &= 1;                  ncounter++;
         inttiming = xmilcfg.CPU8MHz & 1;  #endif
   #if !defined(SINGLESTEPONLY)
         while(s_cnt < 266) {                  if (CPU_REMCLOCK > 0) {
                 while(h_cnt < pccore.HSYNC_CLK) {                          Z80_EXECUTE();
 #if IPTRACE                  }
   #else
                   while(CPU_REMCLOCK > 0) {
                   //      TRACEOUT(("%.4x", Z80_PC));
   #if defined(TRACE) && IPTRACE
                         treip[trpos & (IPTRACE - 1)] = Z80_PC;                          treip[trpos & (IPTRACE - 1)] = Z80_PC;
                         trpos++;                          trpos++;
 #endif  #endif
                         Z80_EXECUTE();                          Z80_STEP();
                         z80dmap();  
                 }                  }
                 h_cnt -= pccore.HSYNC_CLK;  #endif
                 h_cntbase += pccore.HSYNC_CLK;                  nevent_progress();
                 inttiming ^= 2;                  ievent_progress();
                 if (inttiming != 3) {          } while(corestat.vsync < 2);
                         if (xmilcfg.SOUNDPLY) {  
                                 sound_makesample(pcmbufsize[s_cnt]);          scrnupdate();
 //                              juliet2_exec();          sound_sync();
                         }          fdc_callback();
                         s_cnt++;  
                         x1_ctc_int();  #if defined(TRACE) && defined(NEVENT_COUNTER)
                         if (!((++keyintcnt) & 15)) {          TRACEOUT(("loop = %d", ncounter));
                                 x1_sub_int();  #endif
                                 if (xmilcfg.MOUSE_SW) {  #if defined(TRACE) && defined(CTCCOUNTER)
                                         sio_int();          TRACEOUT(("ctc = %d", ctccnt));
           ctccnt = 0;
   #endif
   #if defined(TRACE) && defined(PCCOUNTER)
           TRACEOUT(("pccnt = %d %d %d", pccnt, pccnt2, pccnt3));
           pccnt = 0;
           pccnt2 = 0;
           pccnt3 = 0;
   #endif
   #if defined(TRACE) && defined(IOCOUNTER)
           iocounter++;
           if (iocounter >= 60) {
                   UINT i, j, cnt, pos;
                   iocounter = 0;
                   for (i=0; i<10; i++) {
                           cnt = 0;
                           pos = 0;
                           for (j=0; j<0x2004; j++) {
                                   if (cnt < ocounter[j]) {
                                           cnt = ocounter[j];
                                           pos = j;
                                 }                                  }
                         }                          }
                           ocounter[pos] = 0;
                           TRACEOUT(("o%2d - %.4x %8dtimes", i, pos, cnt));
                 }                  }
                 v_cnt++;                  for (i=0; i<10; i++) {
                 if (crtc.s.CRT_YL == v_cnt) {                          cnt = 0;
 //                      TRACEOUT(("--->sync"));                          pos = 0;
                         pcg.r.vsync = 1;                          for (j=0; j<0x2004; j++) {
                         if (xmilcfg.DISPSYNC == 1) {                                  if (cnt < icounter[j]) {
                                 xmilcfg.DISPSYNC |= 0x80;                                          cnt = icounter[j];
                                 scrnupdate();                                          pos = j;
                                   }
                         }                          }
                           icounter[pos] = 0;
                           TRACEOUT(("i%2d - %.4x %8dtimes", i, pos, cnt));
                 }                  }
         }          }
         calendar_inc();  #endif
         if (!xmilcfg.SOUNDPLY) {  
                 sound_makesample(framesoundcnt);  
         }  
         if (!(xmilcfg.DISPSYNC & 0x80)) {  
                 scrnupdate();  
         }  
 }  }
   

Removed from v.1.9  
changed lines
  Added in v.1.37


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