Diff for /np2/pccore.c between versions 1.20 and 1.43

version 1.20, 2003/11/22 12:49:48 version 1.43, 2004/01/09 07:27:15
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
   #include        "strres.h"
   #include        "dosio.h"
 #include        "soundmng.h"  #include        "soundmng.h"
 #include        "sysmng.h"  #include        "sysmng.h"
 #include        "timemng.h"  #include        "timemng.h"
 #include        "i286.h"  #include        "cpucore.h"
 #include        "memory.h"  
 #include        "np2ver.h"  #include        "np2ver.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
Line 22 Line 23
 #include        "sound.h"  #include        "sound.h"
 #include        "fmboard.h"  #include        "fmboard.h"
 #include        "beep.h"  #include        "beep.h"
   #include        "s98.h"
 #include        "font.h"  #include        "font.h"
 #include        "diskdrv.h"  #include        "diskdrv.h"
 #include        "fddfile.h"  #include        "fddfile.h"
Line 29 Line 31
 #include        "sxsi.h"  #include        "sxsi.h"
 #include        "calendar.h"  #include        "calendar.h"
 #include        "timing.h"  #include        "timing.h"
 //#include      "hostdrv.h"  
 #include        "debugsub.h"  #include        "debugsub.h"
 #include        "dosio.h"  #if defined(SUPPORT_HOSTDRV)
   #include        "hostdrv.h"
   #endif
   
   
         const char      np2version[] = NP2VER_CORE;          const char      np2version[] = NP2VER_CORE;
Line 50 Line 53
                                 3, {0x0c, 0x0c, 0x08, 0x06, 0x03, 0x0c}, 64, 64, 64, 64, 64,                                  3, {0x0c, 0x0c, 0x08, 0x06, 0x03, 0x0c}, 64, 64, 64, 64, 64,
                                 1, 0x82,                                  1, 0x82,
                                 0, {0x17, 0x04, 0x1f}, {0x0c, 0x0c, 0x02, 0x10, 0x3f, 0x3f},                                  0, {0x17, 0x04, 0x1f}, {0x0c, 0x0c, 0x02, 0x10, 0x3f, 0x3f},
                                 1, 80, 0,                                  1, 80, 0, 0,
                                 {"", ""}, ""};                                  {"", ""}, "", "", ""};
   
         PCCORE  pc = {  PCBASECLOCK25,          PCCORE  pc = {  PCBASECLOCK25,
                                         4,                                          4,
Line 75  static const BYTE msw_default[8] = Line 78  static const BYTE msw_default[8] =
         BOOL    drawframe;          BOOL    drawframe;
         UINT    drawcount = 0;          UINT    drawcount = 0;
   
         BYTE    mem[0x200000];  
   
   
 // ---------------------------------------------------------------------------  // ---------------------------------------------------------------------------
   
   void getbiospath(char *path, const char *fname, int maxlen) {
   
   const char      *p;
   
           p = np2cfg.biospath;
           if (p[0]) {
                   file_cpyname(path, p, maxlen);
                   file_setseparator(path, maxlen);
                   file_catname(path, fname, maxlen);
           }
           else {
                   file_cpyname(path, file_getcd(fname), maxlen);
           }
   }
   
   
   // ----
   
 static void setvsyncclock(void) {  static void setvsyncclock(void) {
   
         UINT    vfp;          UINT    vfp;
Line 117  static void setvsyncclock(void) { Line 136  static void setvsyncclock(void) {
         pc.vsyncclock = cnt - pc.dispclock;          pc.vsyncclock = cnt - pc.dispclock;
 }  }
   
 static void setpcclock(UINT base, UINT multiple) {  static void setpcclock(const char *modelstr, UINT base, UINT multiple) {
   
         pc.model = PCMODEL_VX;          UINT8   model;
   
           model = PCMODEL_VX;
           if (!milstr_cmp(modelstr, str_VM)) {
                   model = PCMODEL_VM;
           }
           else if (!milstr_cmp(modelstr, str_EPSON)) {
                   model = PCMODEL_EPSON | PCMODEL_VM;
           }
           pc.model = model;
   
         if (base >= ((PCBASECLOCK25 + PCBASECLOCK20) / 2)) {          if (base >= ((PCBASECLOCK25 + PCBASECLOCK20) / 2)) {
                 pc.baseclock = PCBASECLOCK25;                   // 2.5MHz                  pc.baseclock = PCBASECLOCK25;                   // 2.5MHz
Line 159  static void sound_init(void) { Line 187  static void sound_init(void) {
                 rate = 0;                  rate = 0;
         }          }
         sound_create(rate, np2cfg.delayms);          sound_create(rate, np2cfg.delayms);
   #if defined(SUPPORT_WAVEMIX)
           wavemix_initialize(rate);
   #endif
         beep_initialize(rate);          beep_initialize(rate);
         beep_setvol(np2cfg.BEEP_VOL);          beep_setvol(np2cfg.BEEP_VOL);
         tms3631_initialize(rate);          tms3631_initialize(rate);
Line 173  static void sound_init(void) { Line 204  static void sound_init(void) {
         adpcm_setvol(np2cfg.vol_adpcm);          adpcm_setvol(np2cfg.vol_adpcm);
         pcm86gen_initialize(rate);          pcm86gen_initialize(rate);
         pcm86gen_setvol(np2cfg.vol_pcm);          pcm86gen_setvol(np2cfg.vol_pcm);
           cs4231_initialize(rate);
 }  }
   
 static void sound_term(void) {  static void sound_term(void) {
   
         soundmng_stop();          soundmng_stop();
   #if defined(SUPPORT_WAVEMIX)
           wavemix_deinitialize();
   #endif
         rhythm_deinitialize();          rhythm_deinitialize();
         sound_destroy();          sound_destroy();
 }  }
   
 void pccore_init(void) {  void pccore_init(void) {
   
           CPU_INITIALIZE();
   
         pal_initlcdtable();          pal_initlcdtable();
         pal_makelcdpal();          pal_makelcdpal();
         pal_makeskiptable();          pal_makeskiptable();
Line 204  void pccore_init(void) { Line 241  void pccore_init(void) {
         pc9861k_construct();          pc9861k_construct();
   
         iocore_create();          iocore_create();
   
   #if defined(SUPPORT_HOSTDRV)
           hostdrv_initialize();
   #endif
 }  }
   
 void pccore_term(void) {  void pccore_term(void) {
   
   #if defined(SUPPORT_HOSTDRV)
           hostdrv_deinitialize();
   #endif
   
         sound_term();          sound_term();
   
         fdd_eject(0);          fdd_eject(0);
Line 248  void pccore_reset(void) { Line 293  void pccore_reset(void) {
   
         int             i;          int             i;
   
 //      reset_hostdrv();  
   
         ZeroMemory(mem, 0x10fff0);                                                                      // ver0.28          ZeroMemory(mem, 0x10fff0);                                                                      // ver0.28
         ZeroMemory(mem + VRAM1_B, 0x18000);          ZeroMemory(mem + VRAM1_B, 0x18000);
         ZeroMemory(mem + VRAM1_E, 0x08000);          ZeroMemory(mem + VRAM1_E, 0x08000);
         ZeroMemory(mem + FONT_ADRS, 0x08000);          ZeroMemory(mem + FONT_ADRS, 0x08000);
   
         i286_reset();          CPU_RESET();
         CPUTYPE = 0;          CPU_TYPE = 0;
         if (np2cfg.dipsw[2] & 0x80) {          if (np2cfg.dipsw[2] & 0x80) {
                 CPUTYPE = CPUTYPE_V30;                  CPU_TYPE = CPUTYPE_V30;
         }          }
   
         //メモリスイッチ          //メモリスイッチ
Line 276  void pccore_reset(void) { Line 319  void pccore_reset(void) {
                 sound_init();                  sound_init();
         }          }
   
         setpcclock(np2cfg.baseclock, np2cfg.multiple);          setpcclock(np2cfg.model, np2cfg.baseclock, np2cfg.multiple);
         sound_changeclock();          sound_changeclock();
         beep_changeclock();          beep_changeclock();
         nevent_init();          nevent_init();
   
         sound_reset();          sound_reset();
   #if defined(SUPPORT_WAVEMIX)
           wavemix_bind();
   #endif
   
           if (pc.model & PCMODEL_EPSON) {                         // RAM ctrl
                   CPU_RAM_D000 = 0xffff;
           }
   
         iocore_reset();                                                         // サウンドでpicを呼ぶので…          iocore_reset();                                                         // サウンドでpicを呼ぶので…
         cbuscore_reset();          cbuscore_reset();
         fmboard_reset(np2cfg.SOUND_SW);          fmboard_reset(np2cfg.SOUND_SW);
   
           i286_memorymap((pc.model & PCMODEL_EPSON)?1:0);
         iocore_build();          iocore_build();
         iocore_bind();          iocore_bind();
         cbuscore_bind();          cbuscore_bind();
Line 304  void pccore_reset(void) { Line 355  void pccore_reset(void) {
   
         if (np2cfg.ITF_WORK) {          if (np2cfg.ITF_WORK) {
                 CS_BASE = 0xf0000;                  CS_BASE = 0xf0000;
                 I286_CS = 0xf000;                  CPU_CS = 0xf000;
                 I286_IP = 0xfff0;                  CPU_IP = 0xfff0;
         }          }
         else {          else {
                 for (i=0; i<8; i++) {                  for (i=0; i<8; i++) {
                         mem[0xa3fe2 + i*4] = msw_default[i];                          mem[0xa3fe2 + i*4] = msw_default[i];
                 }                  }
                 CS_BASE = 0xfd800;                  CS_BASE = 0xfd800;
                 I286_CS = 0xfd80;                  CPU_CS = 0xfd80;
                 I286_IP = 0x0002;                  CPU_IP = 0x0002;
         }          }
         i286_resetprefetch();          CPU_CLEARPREFETCH();
         sysmng_cpureset();          sysmng_cpureset();
   
         soundmng_play();          soundmng_play();
   
   #if defined(SUPPORT_HOSTDRV)
           hostdrv_reset();
   #endif
 }  }
   
 static void drawscreen(void) {  static void drawscreen(void) {
Line 470  void screendisp(NEVENTITEM item) { Line 525  void screendisp(NEVENTITEM item) {
   
 void screenvsync(NEVENTITEM item) {  void screenvsync(NEVENTITEM item) {
   
         vramop.tramwait = np2cfg.wait[1];          MEMWAIT_TRAM = np2cfg.wait[1];
         vramop.vramwait = np2cfg.wait[3];          MEMWAIT_VRAM = np2cfg.wait[3];
         vramop.grcgwait = np2cfg.wait[5];          MEMWAIT_GRCG = np2cfg.wait[5];
         gdc_work(GDCWORK_MASTER);          gdc_work(GDCWORK_MASTER);
         gdc.vsync = 0x20;          gdc.vsync = 0x20;
         if (gdc.vsyncint) {          if (gdc.vsyncint) {
Line 488  void screenvsync(NEVENTITEM item) { Line 543  void screenvsync(NEVENTITEM item) {
         (void)item;          (void)item;
 }  }
   
   
 // ---------------------------------------------------------------------------  // ---------------------------------------------------------------------------
   
   #if defined(TRACE)
   static int resetcnt = 0;
   static int execcnt = 0;
   int piccnt = 0;
   #endif
   
 void pccore_exec(BOOL draw) {  void pccore_exec(BOOL draw) {
   
         drawframe = draw;          drawframe = draw;
Line 500  void pccore_exec(BOOL draw) { Line 562  void pccore_exec(BOOL draw) {
   
         gdc.vsync = 0;          gdc.vsync = 0;
         screendispflag = 1;          screendispflag = 1;
         vramop.tramwait = np2cfg.wait[0];          MEMWAIT_TRAM = np2cfg.wait[0];
         vramop.vramwait = np2cfg.wait[2];          MEMWAIT_VRAM = np2cfg.wait[2];
         vramop.grcgwait = np2cfg.wait[4];          MEMWAIT_GRCG = np2cfg.wait[4];
         nevent_set(NEVENT_FLAMES, pc.dispclock, screenvsync, NEVENT_RELATIVE);          nevent_set(NEVENT_FLAMES, pc.dispclock, screenvsync, NEVENT_RELATIVE);
   
 //      nevent_get1stevent();  //      nevent_get1stevent();
   
         while(screendispflag) {          while(screendispflag) {
   #if defined(TRACE)
           resetcnt++;
   #endif
                 pic_irq();                  pic_irq();
                 if (cpuio.reset_req) {                  if (CPU_RESETREQ) {
                         cpuio.reset_req = 0;                          CPU_RESETREQ = 0;
                         I286_CS = 0xf000;  #if 1
                           CPU_SHUT();
   #else
                           CPU_CS = 0xf000;
                         CS_BASE = 0xf0000;                          CS_BASE = 0xf0000;
                         I286_IP = 0xfff0;                          CPU_IP = 0xfff0;
 #ifdef CPU386                                                                                   // defineを変えてね  #if defined(CPUCORE_IA32)
                         I286_DX = 0x0300;                          CPU_DX = 0x0300;
   #endif
                           CPU_CLEARPREFETCH();
 #endif  #endif
                         i286_resetprefetch();  
                 }                  }
   
 #ifndef TRACE  #if 1 // ndef TRACE
                 if (I286_REMCLOCK > 0) {                  if (CPU_REMCLOCK > 0) {
                         if (!(CPUTYPE & CPUTYPE_V30)) {                          if (!(CPU_TYPE & CPUTYPE_V30)) {
                                 i286();                                  CPU_EXEC();
                         }                          }
                         else {                          else {
                                 v30();                                  CPU_EXECV30();
                         }                          }
                 }                  }
 #else  #else
                 while(I286_REMCLOCK > 0) {                  while(CPU_REMCLOCK > 0) {
                         i286_step();                          TRACEOUT(("%.4x:%.4x", CPU_CS, CPU_IP));
                           i286x_step();
                 }                  }
 #endif  #endif
                 nevent_progress();                  nevent_progress();
Line 540  void pccore_exec(BOOL draw) { Line 610  void pccore_exec(BOOL draw) {
         mpu98ii_callback();          mpu98ii_callback();
         diskdrv_callback();          diskdrv_callback();
         calendar_inc();          calendar_inc();
           S98_sync();
         sound_sync();                                                                                                   // happy!          sound_sync();                                                                                                   // happy!
   
   #if defined(TRACE)
           execcnt++;
           if (execcnt >= 60) {
   //              TRACEOUT(("resetcnt = %d / pic %d", resetcnt, piccnt));
                   execcnt = 0;
                   resetcnt = 0;
                   piccnt = 0;
           }
   #endif
 }  }
   

Removed from v.1.20  
changed lines
  Added in v.1.43


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