Diff for /np2/io/np2sysp.c between versions 1.4 and 1.11

version 1.4, 2003/12/10 15:25:29 version 1.11, 2004/01/13 05:30:58
Line 4 Line 4
 #include        "cpucore.h"  #include        "cpucore.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
 // #include     "hostdrv.h"  #include        "bios.h"
 // #include     "hostdir.h"  #include        "sxsi.h"
   #if defined(SUPPORT_HOSTDRV)
   #include        "hostdrv.h"
   #endif
   
   
 #define         NP2SYSP_VER                     "B"  #define         NP2SYSP_VER                     "B"
 // #define      NP2SYSP_CREDIT          ""                                      // 要るなら・・・  // #define      NP2SYSP_CREDIT          ""                                      // 要るなら・・・
   
 #define         OPEN_HOSTDRV            0  
 #define         INTR_HOSTDRV            1  
 #define         CLOSE_HOSTDRV           2  
   
 // NP2依存ポート  // NP2依存ポート
 // port:07edh   reserved  // port:07edh   np2 value comm
 // port:07efh   np2 string comm  // port:07efh   np2 string comm
   
 // 基本的に STRINGでやり取りする  // 基本的に STRINGでやり取りする
Line 35 Line 34
   
 typedef struct {  typedef struct {
 const char      *key;  const char      *key;
         void    (*func)(const void *arg1, const void *arg2);          void    (*func)(const void *arg1, long arg2);
 const void      *arg1;  const void      *arg1;
 const void      *arg2;          long    arg2;
 } SYSPCMD;  } SYSPCMD;
   
 static const char str_80286[] = "80286";  static const char str_80286[] = "80286";
Line 46  static const char str_pentium[] = "PENTI Line 45  static const char str_pentium[] = "PENTI
 static const char str_mhz[] = "%uMHz";  static const char str_mhz[] = "%uMHz";
   
   
 static void np2sysp_outstr(const void *arg1, const void *arg2) {  static void cmd_outstr(const void *arg1, long arg2) {
   
         milstr_ncpy(np2sysp.outstr, (char *)arg1, sizeof(np2sysp.outstr));          milstr_ncpy(np2sysp.outstr, (char *)arg1, sizeof(np2sysp.outstr));
         np2sysp.outpos = 0;          np2sysp.outpos = 0;
         (void)arg2;          (void)arg2;
 }  }
   
 static void np2sysp_pwroff(const void *arg1, const void *arg2) {  static void cmd_poweroff(const void *arg1, long arg2) {
   
         taskmng_exit();          taskmng_exit();
         (void)arg1;          (void)arg1;
         (void)arg2;          (void)arg2;
 }  }
   
 static void np2sysp_cpu(const void *arg1, const void *arg2) {  static void cmd_cpu(const void *arg1, long arg2) {
   
         // CPUを返す          // CPUを返す
 #if 1                                                                                   // 80286 or V30  #if 1                                                                                   // 80286 or V30
         if (!(CPU_TYPE & CPUTYPE_V30)) {          if (!(CPU_TYPE & CPUTYPE_V30)) {
                 np2sysp_outstr(str_80286, NULL);                  cmd_outstr(str_80286, 0);
         }          }
         else {          else {
                 np2sysp_outstr(str_v30, NULL);                  cmd_outstr(str_v30, 0);
         }          }
 #else  #else
         // 386機以降の場合 V30モードはエミュレーションだから固定(?)          // 386機以降の場合 V30モードはエミュレーションだから固定(?)
         np2sysp_outstr(str_pentium, NULL);          cmd_outstr(str_pentium, 0);
 #endif  #endif
         (void)arg1;          (void)arg1;
         (void)arg2;          (void)arg2;
 }  }
   
 static void np2sysp_clock(const void *arg1, const void *arg2) {  static void cmd_clock(const void *arg1, long arg2) {
   
         SPRINTF(np2sysp.outstr, str_mhz, (pc.realclock + 500000) / 1000000);          SPRINTF(np2sysp.outstr, str_mhz, (pccore.realclock + 500000) / 1000000);
         np2sysp.outpos = 0;          np2sysp.outpos = 0;
         (void)arg1;          (void)arg1;
         (void)arg2;          (void)arg2;
 }  }
   
 static void np2sysp_mul(const void *arg1, const void *arg2) {  static void cmd_multiple(const void *arg1, long arg2) {
   
         SPRINTF(np2sysp.outstr, str_u, pc.multiple);          SPRINTF(np2sysp.outstr, str_u, pccore.multiple);
         np2sysp.outpos = 0;          np2sysp.outpos = 0;
         (void)arg1;          (void)arg1;
         (void)arg2;          (void)arg2;
 }  }
   
 #if 0  
 static void np2sysp_hostdrv(const void *arg1, const void *arg2) {  
   
         switch((DWORD)arg1) {  // ---- SXSI BIOS
                 case OPEN_HOSTDRV:  
                         if(open_hostdrv())  typedef struct {
                                 np2sysp_outstr("ok", NULL);          BYTE    r_ax[2];
                         else          BYTE    r_bx[2];
                                 np2sysp_outstr("ng", NULL);          BYTE    r_cx[2];
           BYTE    r_dx[2];
           BYTE    r_bp[2];
           BYTE    r_es[2];
   } B1BREG;
   
   static void cmd_sxsibios(const void *arg1, long arg2) {
   
           UINT16  org_ax, org_cx, org_dx, org_bx, org_bp, org_es;
           UINT32  org_esbase;
           B1BREG  r;
           REG16   tmp;
           UINT8   ret;
           REG8    flag;
   
           org_ax = CPU_AX;
           org_cx = CPU_CX;
           org_dx = CPU_DX;
           org_bx = CPU_BX;
           org_bp = CPU_BP;
           org_es = CPU_ES;
           org_esbase = ES_BASE;
   
           i286_memstr_read(CPU_SS, CPU_SP, &r, sizeof(r));
           CPU_AX = LOADINTELWORD(r.r_ax);
           CPU_BX = LOADINTELWORD(r.r_bx);
           CPU_CX = LOADINTELWORD(r.r_cx);
           CPU_DX = LOADINTELWORD(r.r_dx);
           CPU_BP = LOADINTELWORD(r.r_bp);
           tmp = LOADINTELWORD(r.r_es);
           CPU_ES = tmp;
           ES_BASE = tmp << 4;
           switch(CPU_AX & 0xf0) {
                   case 0x00:
                   case 0x20:
                           ret = sxsi_operate(HDDTYPE_SASI);
                         break;                          break;
   
                 case INTR_HOSTDRV:                  case 0x80:
                         intr_hostdrv();                  case 0xa0:
                           ret = sxsi_operate(HDDTYPE_SCSI);
                           break;
   
                   default:
                           ret = 0x40;
                           break;
           }
           r.r_ax[0] = CPU_AL;
           r.r_ax[1] = ret;
           STOREINTELWORD(r.r_bx, CPU_BX);
           STOREINTELWORD(r.r_cx, CPU_CX);
           STOREINTELWORD(r.r_dx, CPU_DX);
           i286_memstr_write(CPU_SS, CPU_SP, &r, 8);
           flag = i286_membyte_read(CPU_SS, CPU_SP + 0x16) & 0xfe;
           if (ret >= 0x20) {
                   flag += 1;
           }
           i286_membyte_write(CPU_SS, CPU_SP + 0x16, flag);
   
           CPU_AX = org_ax;
           CPU_CX = org_cx;
           CPU_DX = org_dx;
           CPU_BX = org_bx;
           CPU_BP = org_bp;
           CPU_ES = org_es;
           ES_BASE = org_esbase;
   
           (void)arg1;
           (void)arg2;
   }
   
   
   #if defined(SUPPORT_HOSTDRV)
   // ---- hostdrv
   
   enum {
           OPEN_HOSTDRV    = 0,
           CLOSE_HOSTDRV   = 1,
           INTR_HOSTDRV    = 2
   };
   
   static void cmd_hostdrv(const void *arg1, long arg2) {
   
           switch(arg2) {
                   case OPEN_HOSTDRV:
                           if (hostdrv_mount() == SUCCESS) {
                                   cmd_outstr("ok", 0);
                           }
                           else {
                                   cmd_outstr("ng", 0);
                           }
                         break;                          break;
   
                 case CLOSE_HOSTDRV:                  case CLOSE_HOSTDRV:
                         close_hostdrv();                          hostdrv_unmount();
                           break;
   
                   case INTR_HOSTDRV:
                           hostdrv_intr();
                         break;                          break;
         }          }
           (void)arg1;
 }  }
 #endif  #endif
   
   
   // ----
   
 static const char str_np2[] = "NP2";  static const char str_np2[] = "NP2";
 static const char str_ver[] = "ver";  static const char str_ver[] = "ver";
 static const char str_poweroff[] = "poweroff";  static const char str_poweroff[] = "poweroff";
Line 124  static const char str_credit[] = "credit Line 214  static const char str_credit[] = "credit
 static const char str_cpu[] = "cpu";  static const char str_cpu[] = "cpu";
 static const char str_clock[] = "clock";  static const char str_clock[] = "clock";
 static const char str_multiple[] = "multiple";  static const char str_multiple[] = "multiple";
   static const char str_sxsibios[] = "sxsibios";
   static const char str_hdrvcheck[] = "check_hostdrv";
   static const char str_hdrvopen[] = "open_hostdrv";
   static const char str_hdrvclose[] = "close_hostdrv";
   static const char str_hdrvintr[] = "intr_hostdrv";
   
   
 #if defined(NP2SYSP_VER)  #if defined(NP2SYSP_VER)
 static const char str_syspver[] = NP2SYSP_VER;  static const char str_syspver[] = NP2SYSP_VER;
Line 139  static const char str_syspcredit[] = NP2 Line 235  static const char str_syspcredit[] = NP2
   
   
 static const SYSPCMD np2spcmd[] = {  static const SYSPCMD np2spcmd[] = {
                         {str_np2,               np2sysp_outstr, str_np2,                NULL},                          {str_np2,               cmd_outstr,             str_np2,                0},
                         {str_ver,               np2sysp_outstr, str_syspver,    NULL},                          {str_ver,               cmd_outstr,             str_syspver,    0},
   
 // version:A  // version:A
                         {str_poweroff,  np2sysp_pwroff, NULL,                   NULL},                          {str_poweroff,  cmd_poweroff,   NULL,                   0},
   
 // version:B  // version:B
                         {str_credit,    np2sysp_outstr, str_syspcredit, NULL},                          {str_credit,    cmd_outstr,             str_syspcredit, 0},
                         {str_cpu,               np2sysp_cpu,    NULL,                   NULL},                          {str_cpu,               cmd_cpu,                NULL,                   0},
                         {str_clock,             np2sysp_clock,  NULL,                   NULL},                          {str_clock,             cmd_clock,              NULL,                   0},
                         {str_multiple,  np2sysp_mul,    NULL,                   NULL},                          {str_multiple,  cmd_multiple,   NULL,                   0},
   
 #if 0  
 // hostdrv  // extension
                         {"check_hostdrv",       np2sysp_outstr,         "supported",                          {str_sxsibios,  cmd_sxsibios,   NULL,                   0},
                                                                                                                                 NULL},  #if defined(SUPPORT_HOSTDRV)
                         {"open_hostdrv",        np2sysp_hostdrv,        (void *)OPEN_HOSTDRV,                          {str_hdrvcheck, cmd_outstr,             "supported",    0},
                                                                                                                                 NULL},                          {str_hdrvopen,  cmd_hostdrv,    NULL,                   OPEN_HOSTDRV},
                         {"intr_hostdrv",        np2sysp_hostdrv,        (void *)INTR_HOSTDRV,                          {str_hdrvclose, cmd_hostdrv,    NULL,                   CLOSE_HOSTDRV},
                                                                                                                                 NULL},                          {str_hdrvintr,  cmd_hostdrv,    NULL,                   INTR_HOSTDRV},
                         {"close_hostdrv",       np2sysp_hostdrv,        (void *)CLOSE_HOSTDRV,  
                                                                                                                                 NULL},  
   
                         {hostdir_check,         np2sysp_outstr, hostdir_check,  NULL},  
                         {"hostdir_reset",       hostdir_reset,  NULL,                   NULL},  
                         {"hostdir_band",        hostdir_band,   NULL,                   NULL},  
                         {"hostdir_int",         hostdir_int,    NULL,                   NULL},  
 #endif  #endif
 };  };
   
Line 190  static BOOL np2syspcmp(const char *p) { Line 279  static BOOL np2syspcmp(const char *p) {
         return(FALSE);          return(FALSE);
 }  }
   
   static void IOOUTCALL np2sysp_o7ed(UINT port, REG8 dat) {
   
           np2sysp.outval = (dat << 24) + (np2sysp.outval >> 8);
           (void)port;
   }
   
 static void IOOUTCALL np2sysp_o7ef(UINT port, REG8 dat) {  static void IOOUTCALL np2sysp_o7ef(UINT port, REG8 dat) {
   
 const SYSPCMD   *cmd;  const SYSPCMD   *cmd;
Line 210  const SYSPCMD *cmdterm; Line 305  const SYSPCMD *cmdterm;
         (void)port;          (void)port;
 }  }
   
   static REG8 IOINPCALL np2sysp_i7ed(UINT port) {
   
           REG8    ret;
   
           ret = (REG8)(np2sysp.inpval & 0xff);
           np2sysp.inpval = (ret << 24) + (np2sysp.inpval >> 8);
           (void)port;
           return(ret);
   }
   
 static REG8 IOINPCALL np2sysp_i7ef(UINT port) {  static REG8 IOINPCALL np2sysp_i7ef(UINT port) {
   
         REG8    ret;          REG8    ret;
Line 233  void np2sysp_reset(void) { Line 338  void np2sysp_reset(void) {
   
 void np2sysp_bind(void) {  void np2sysp_bind(void) {
   
           iocore_attachout(0x07ef, np2sysp_o7ed);
         iocore_attachout(0x07ef, np2sysp_o7ef);          iocore_attachout(0x07ef, np2sysp_o7ef);
           iocore_attachinp(0x07ef, np2sysp_i7ed);
         iocore_attachinp(0x07ef, np2sysp_i7ef);          iocore_attachinp(0x07ef, np2sysp_i7ef);
 }  }
   

Removed from v.1.4  
changed lines
  Added in v.1.11


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