Diff for /np2/pccore.c between versions 1.58 and 1.75

version 1.58, 2004/01/29 23:42:02 version 1.75, 2004/02/21 04:48:35
Line 7 Line 7
 #include        "cpucore.h"  #include        "cpucore.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
   #include        "gdc_sub.h"
 #include        "cbuscore.h"  #include        "cbuscore.h"
 #include        "pc9861k.h"  #include        "pc9861k.h"
 #include        "mpu98ii.h"  #include        "mpu98ii.h"
   #include        "amd98.h"
 #include        "bios.h"  #include        "bios.h"
 #include        "biosmem.h"  #include        "biosmem.h"
 #include        "vram.h"  #include        "vram.h"
Line 34 Line 36
 #include        "np2ver.h"  #include        "np2ver.h"
 #include        "calendar.h"  #include        "calendar.h"
 #include        "timing.h"  #include        "timing.h"
   #include        "keystat.h"
 #include        "debugsub.h"  #include        "debugsub.h"
   
   
Line 42 Line 45
         NP2CFG  np2cfg = {          NP2CFG  np2cfg = {
                                 0, 1, 0, 32, 0, 0, 0x40,                                  0, 1, 0, 32, 0, 0, 0x40,
                                 0, 0, 0, 0,                                  0, 0, 0, 0,
                                 {0x3e, 0x63, 0x7a}, 0,                                  {0x3e, 0x73, 0x7b}, 0,
                                 0, 0, {1, 1, 6, 1, 8, 1},                                  0, 0, {1, 1, 6, 1, 8, 1},
   
                                 "VX", PCBASECLOCK25, 4,                                  "VX", PCBASECLOCK25, 4,
Line 54 Line 57
                                 1, 0x82,                                  1, 0x82,
                                 0, {0x17, 0x04, 0x1f}, {0x0c, 0x0c, 0x02, 0x10, 0x3f, 0x3f},                                  0, {0x17, 0x04, 0x1f}, {0x0c, 0x0c, 0x02, 0x10, 0x3f, 0x3f},
                                 3, 1, 80, 0, 0,                                  3, 1, 80, 0, 0,
                                 {"", ""}, {"", "", "", ""}, "", "", ""};                                  {"", ""},
   #if defined(SUPPORT_SCSI)
                                   {"", "", "", ""},
   #endif
                                   "", "", ""};
   
         PCCORE  pccore = {      PCBASECLOCK25, 4,          PCCORE  pccore = {      PCBASECLOCK25, 4,
                                                 0, PCMODEL_VX, 0, 0,                                                  0, PCMODEL_VX, 0, 0, {0x3e, 0x73, 0x7b}, 0,
                                                 0, {0, 0, 0},  
                                                 0, 0,                                                  0, 0,
                                                 4 * PCBASECLOCK25,                                                  4 * PCBASECLOCK25};
                                                 4 * PCBASECLOCK25 * 50 / 3104,  
                                                 4 * PCBASECLOCK25 * 5 / 3104,  
                                                 4 * PCBASECLOCK25 / 1920,  
                                                 4 * PCBASECLOCK25 / 3125,  
                                                 100, 20};  
   
                                                                         // on=0, off=1  
 //      BYTE    dip_default[3] = {0x3e, 0x63, 0x7a};  
 static const BYTE msw_default[8] =  static const BYTE msw_default[8] =
                                                         {0x48, 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x6e};                                                          {0x48, 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x6e};
   
Line 100  const char *p; Line 99  const char *p;
   
 // ----  // ----
   
 static void setvsyncclock(void) {  
   
         UINT    vfp;  
         UINT    vbp;  
         UINT    lf;  
         UINT    disp;  
         UINT    vs;  
         UINT    maxy;  
         UINT    cnt;  
   
         vfp = gdc.m.para[GDC_SYNC + 5] & 0x3f;  
         if (!vfp) {  
                 vfp = 1;  
         }  
         vbp = gdc.m.para[GDC_SYNC + 7] >> 2;  
         if (!vbp) {  
                 vbp = 1;  
         }  
         lf = LOADINTELWORD(gdc.m.para + GDC_SYNC + 6);  
         lf &= 0x3ff;  
         if (!lf) {  
                 lf = 1024;  
         }  
         disp = vfp + vbp + lf;  
         vs = LOADINTELWORD(gdc.m.para + GDC_SYNC + 4);  
         vs = (vs >> 5) & 0x1f;  
         if (!vs) {  
                 vs = 1;  
         }  
         maxy = disp + vs;  
         cnt = (pccore.realclock * 5) / 282;  
         pccore.raster = cnt / maxy;  
         pccore.hsync = (pccore.raster * 4) / 5;  
         pccore.dispclock = pccore.raster * disp;  
         pccore.vsyncclock = cnt - pccore.dispclock;  
 }  
   
 static void pccore_set(void) {  static void pccore_set(void) {
   
         UINT8   model;          UINT8   model;
Line 159  static void pccore_set(void) { Line 121  static void pccore_set(void) {
         }          }
         else {          else {
                 pccore.baseclock = PCBASECLOCK20;                       // 2.0MHz                  pccore.baseclock = PCBASECLOCK20;                       // 2.0MHz
                 pccore.cpumode = CPUMODE_8MHz;                  pccore.cpumode = CPUMODE_8MHZ;
         }          }
         multiple = np2cfg.multiple;          multiple = np2cfg.multiple;
         if (multiple == 0) {          if (multiple == 0) {
Line 170  static void pccore_set(void) { Line 132  static void pccore_set(void) {
         }          }
         pccore.multiple = multiple;          pccore.multiple = multiple;
         pccore.realclock = pccore.baseclock * multiple;          pccore.realclock = pccore.baseclock * multiple;
         pccore.raster = pccore.realclock / 24816;  
         pccore.hsync = (pccore.raster * 4) / 5;          // HDDの接続 (I/Oの使用状態が変わるので..
         pccore.dispclock = pccore.realclock * 50 / 3102;          if (np2cfg.dipsw[1] & 0x20) {
         pccore.vsyncclock = pccore.realclock * 5 / 3102;                  pccore.hddif |= PCHDD_IDE;
         pccore.keyboardclock = pccore.realclock / 1920;          }
         pccore.midiclock = pccore.realclock / 3125;  
   
         // 拡張メモリ          // 拡張メモリ
         extsize = 0;          extsize = 0;
Line 183  static void pccore_set(void) { Line 144  static void pccore_set(void) {
                 extsize = min(np2cfg.EXTMEM, 13);                  extsize = min(np2cfg.EXTMEM, 13);
         }          }
         pccore.extmem = extsize;          pccore.extmem = extsize;
           CopyMemory(pccore.dipsw, np2cfg.dipsw, 3);
         // HDDの接続 (I/Oの使用状態が変わるので..  
         if (np2cfg.dipsw[1] & 0x20) {  
                 pccore.hddif |= PCHDD_IDE;  
         }  
   
         // サウンドボードの接続          // サウンドボードの接続
         pccore.sound = np2cfg.SOUND_SW;          pccore.sound = np2cfg.SOUND_SW;
Line 214  static void sound_init(void) { Line 171  static void sound_init(void) {
                 rate = 0;                  rate = 0;
         }          }
         sound_create(rate, np2cfg.delayms);          sound_create(rate, np2cfg.delayms);
 #if defined(SUPPORT_WAVEMIX)          fddmtrsnd_initialize(rate);
         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 232  static void sound_init(void) { Line 187  static void sound_init(void) {
         pcm86gen_initialize(rate);          pcm86gen_initialize(rate);
         pcm86gen_setvol(np2cfg.vol_pcm);          pcm86gen_setvol(np2cfg.vol_pcm);
         cs4231_initialize(rate);          cs4231_initialize(rate);
           amd98_initialize(rate);
 }  }
   
 static void sound_term(void) {  static void sound_term(void) {
   
         soundmng_stop();          soundmng_stop();
 #if defined(SUPPORT_WAVEMIX)          amd98_deinitialize();
         wavemix_deinitialize();  
 #endif  
         rhythm_deinitialize();          rhythm_deinitialize();
           fddmtrsnd_deinitialize();
         sound_destroy();          sound_destroy();
 }  }
   
Line 251  void pccore_init(void) { Line 206  void pccore_init(void) {
         pal_initlcdtable();          pal_initlcdtable();
         pal_makelcdpal();          pal_makelcdpal();
         pal_makeskiptable();          pal_makeskiptable();
         dispsync_init();          dispsync_initialize();
         sxsi_initialize();          sxsi_initialize();
   
         font_init();          font_initialize();
         font_load(np2cfg.fontfile, TRUE);          font_load(np2cfg.fontfile, TRUE);
         maketext_init();          maketext_initialize();
         makegrph_init();          makegrph_initialize();
         gdcsub_init();          gdcsub_initialize();
         fddfile_init();          fddfile_initialize();
   
         sound_init();          sound_init();
   
         mpu98ii_construct();  
         rs232c_construct();          rs232c_construct();
         pc9861k_construct();          mpu98ii_construct();
           pc9861k_initialize();
   
         iocore_create();          iocore_create();
   
Line 289  void pccore_term(void) { Line 244  void pccore_term(void) {
   
         iocore_destroy();          iocore_destroy();
   
         pc9861k_destruct();          pc9861k_deinitialize();
         rs232c_destruct();  
         mpu98ii_destruct();          mpu98ii_destruct();
           rs232c_destruct();
   
         sxsi_trash();          sxsi_trash();
   
Line 327  void pccore_reset(void) { Line 282  void pccore_reset(void) {
                 sound_init();                  sound_init();
         }          }
   
         ZeroMemory(mem, 0x110000);                                                                      // ver0.28          ZeroMemory(mem, 0x110000);
         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);
Line 338  void pccore_reset(void) { Line 293  void pccore_reset(void) {
         }          }
   
         pccore_set();          pccore_set();
         nevent_init();          nevent_allreset();
   
         CPU_RESET();          CPU_RESET();
         CPU_SETEXTSIZE((UINT32)pccore.extmem);          CPU_SETEXTSIZE((UINT32)pccore.extmem);
Line 370  void pccore_reset(void) { Line 325  void pccore_reset(void) {
         sound_changeclock();          sound_changeclock();
         beep_changeclock();          beep_changeclock();
         sound_reset();          sound_reset();
 #if defined(SUPPORT_WAVEMIX)          fddmtrsnd_bind();
         wavemix_bind();  
 #endif  
   
         fddfile_reset2dmode();          fddfile_reset2dmode();
         bios0x18_16(0x20, 0xe1);          bios0x18_16(0x20, 0xe1);
Line 387  void pccore_reset(void) { Line 340  void pccore_reset(void) {
         cbuscore_bind();          cbuscore_bind();
         fmboard_bind();          fmboard_bind();
   
         fddmtr_init();          fddmtr_initialize();
         calendar_init();          calendar_initialize();
         vram_init();          vram_initialize();
   
         pal_change(1);          pal_change(1);
   
         bios_init();          bios_initialize();
   
         if (np2cfg.ITF_WORK) {          if (np2cfg.ITF_WORK) {
                 CS_BASE = 0xf0000;                  CS_BASE = 0xf0000;
Line 435  static void drawscreen(void) { Line 388  static void drawscreen(void) {
                 tramflag.renewal |= 1;                  tramflag.renewal |= 1;
         }          }
   
         if ((gdcs.textdisp & GDCSCRN_EXT) ||                                            // ver0.28          if (gdcs.textdisp & GDCSCRN_EXT) {
                 (gdcs.grphdisp & GDCSCRN_EXT)) {                  gdc_updateclock();
                 setvsyncclock();  
         }          }
   
         if (drawframe) {          if (drawframe) {
                 if ((gdcs.textdisp & GDCSCRN_EXT) ||                                    // ver0.26                  if ((gdcs.textdisp & GDCSCRN_EXT) ||
                         (gdcs.grphdisp & GDCSCRN_EXT)) {                          (gdcs.grphdisp & GDCSCRN_EXT)) {
                         if (dispsync_renewalvertical()) {                          if (dispsync_renewalvertical()) {
                                 gdcs.textdisp |= GDCSCRN_ALLDRAW2;                                  gdcs.textdisp |= GDCSCRN_ALLDRAW2;
                                 gdcs.grphdisp |= GDCSCRN_ALLDRAW2;                                  gdcs.grphdisp |= GDCSCRN_ALLDRAW2;
                         }                          }
                 }                  }
                                                                                                                                 // ver0.28/pr4  
                 if (gdcs.textdisp & GDCSCRN_EXT) {                  if (gdcs.textdisp & GDCSCRN_EXT) {
                         gdcs.textdisp &= ~GDCSCRN_EXT;                          gdcs.textdisp &= ~GDCSCRN_EXT;
                         dispsync_renewalhorizontal();                          dispsync_renewalhorizontal();
Line 457  static void drawscreen(void) { Line 408  static void drawscreen(void) {
                                 screenupdate |= 2;                                  screenupdate |= 2;
                         }                          }
                 }                  }
                                                                                                                                 // ver0.28/pr4                  if (gdcs.palchange) {
                 if (gdcs.palchange) {                                                                   // grphを先に  
                         gdcs.palchange = 0;                          gdcs.palchange = 0;
                         pal_change(0);                          pal_change(0);
                         screenupdate |= 1;                          screenupdate |= 1;
Line 555  void screendisp(NEVENTITEM item) { Line 505  void screendisp(NEVENTITEM item) {
         gdc_work(GDCWORK_SLAVE);          gdc_work(GDCWORK_SLAVE);
         gdc.vsync = 0;          gdc.vsync = 0;
         screendispflag = 0;          screendispflag = 0;
         if (!np2cfg.DISPSYNC) {                                                                                 // ver0.29          if (!np2cfg.DISPSYNC) {
                 drawscreen();                  drawscreen();
         }          }
         pi = &pic.pi[0];          pi = &pic.pi[0];
Line 577  void screenvsync(NEVENTITEM item) { Line 527  void screenvsync(NEVENTITEM item) {
                 gdc.vsyncint = 0;                  gdc.vsyncint = 0;
                 pic_setirq(2);                  pic_setirq(2);
         }          }
         nevent_set(NEVENT_FLAMES, pccore.vsyncclock, screendisp, NEVENT_RELATIVE);          nevent_set(NEVENT_FLAMES, gdc.vsyncclock, screendisp, NEVENT_RELATIVE);
   
         // drawscreenで pccore.vsyncclockが変更される可能性があります          // drawscreenで pccore.vsyncclockが変更される可能性があります
         if (np2cfg.DISPSYNC) {                                                                                  // ver0.29          if (np2cfg.DISPSYNC) {
                 drawscreen();                  drawscreen();
         }          }
         (void)item;          (void)item;
Line 589  void screenvsync(NEVENTITEM item) { Line 539  void screenvsync(NEVENTITEM item) {
   
 // ---------------------------------------------------------------------------  // ---------------------------------------------------------------------------
   
 // #define      IPTRACE                 (1 << 12)  #define IPTRACE                 (1 << 12)
   
 #if defined(TRACE) && IPTRACE  #if defined(TRACE) && IPTRACE
 static UINT             trpos = 0;  static UINT             trpos = 0;
Line 633  UINT cflg; Line 583  UINT cflg;
 void pccore_exec(BOOL draw) {  void pccore_exec(BOOL draw) {
   
         drawframe = draw;          drawframe = draw;
         keyext_flash();          keystat_sync();
         soundmng_sync();          soundmng_sync();
         mouseif_sync();          mouseif_sync();
         pal_eventclear();          pal_eventclear();
Line 643  void pccore_exec(BOOL draw) { Line 593  void pccore_exec(BOOL draw) {
         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];
         nevent_set(NEVENT_FLAMES, pccore.dispclock, screenvsync, NEVENT_RELATIVE);          nevent_set(NEVENT_FLAMES, gdc.dispclock, screenvsync, NEVENT_RELATIVE);
   
 //      nevent_get1stevent();  //      nevent_get1stevent();
   
Line 682  void pccore_exec(BOOL draw) { Line 632  void pccore_exec(BOOL draw) {
                         treip[trpos & (IPTRACE - 1)] = (CPU_CS << 16) + CPU_IP;                          treip[trpos & (IPTRACE - 1)] = (CPU_CS << 16) + CPU_IP;
                         trpos++;                          trpos++;
 #endif  #endif
 #if 1  #if 0
                         if ((CPU_CS == 0xf800) && (CPU_IP == 0x0B5B)) {                          if ((CPU_CS == 0xf800) && (CPU_IP == 0x0B5B)) {
                                 TRACEOUT(("%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",                                  TRACEOUT(("%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",
                                                         mem[0x9000], mem[0x9001],                                                          mem[0x9000], mem[0x9001],
Line 696  void pccore_exec(BOOL draw) { Line 646  void pccore_exec(BOOL draw) {
                                                                         CPU_DX, CPU_DS, CPU_DI, mem[0xa3fe0]));                                                                          CPU_DX, CPU_DS, CPU_DI, mem[0xa3fe0]));
                         }                          }
 #endif  #endif
 #if 0  //                      if ((CPU_CS == 0x2516) && (CPU_IP == 0x97B0)) {
                         if ((tr & 2) && (mem[0x0471e] == '\\')) {  //                              TRACEOUT(("DS = %.4x", CPU_DS));
                                 TRACEOUT(("DTA BREAK %.4x:%.4x", CPU_CS, CPU_IP));  //                      }
                                 TRACEOUT(("0471:000e %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",  //                      i286x_step();
         mem[0x0471e+0], mem[0x0471e+1], mem[0x0471e+2], mem[0x0471e+3],                          i286c_step();
         mem[0x0471e+4], mem[0x0471e+5], mem[0x0471e+6], mem[0x0471e+7]));  
                                 tr -= 2;  
                         }  
                         // DOS6  
                         if (CPU_CS == 0xffd0) {  
                                 if (CPU_IP == 0xc4c2) {  
                                         TRACEOUT(("DS:DX = %.4x:%.4x / CX = %.4x", CPU_DS, CPU_DX, CPU_CX));  
                                 }  
                                 else if (CPU_IP == 0xc21d) {  
                                         TRACEOUT(("-> DS:BX = %.4x:%.4x", CPU_DS, CPU_BX));  
                                 }  
                         }  
 #endif  
 #if 0  
                         if ((CPU_CS == 0x0620) || (CPU_CS == 0x08a0)) {  
                                 TRACEOUT(("%.4x:%.4x", CPU_CS, CPU_IP));  
                         }  
 #endif  
                         i286x_step();  
 //                      i286c_step();  
                 }                  }
 #endif  #endif
                 nevent_progress();                  nevent_progress();

Removed from v.1.58  
changed lines
  Added in v.1.75


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