| version 1.1.1.1, 2003/10/16 17:57:56 | version 1.9, 2004/01/07 08:33:00 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
 | #include        "strres.h" | #include        "strres.h" | 
 | #include        "taskmng.h" | #include        "taskmng.h" | 
| #include        "i286.h" | #include        "cpucore.h" | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 | #include        "iocore.h" | #include        "iocore.h" | 
 |  | #include        "bios.h" | 
 |  | #include        "sxsi.h" | 
 | // #include     "hostdrv.h" | // #include     "hostdrv.h" | 
 | // #include     "hostdir.h" |  | 
 |  |  | 
 |  |  | 
| #define         NP2SYSP_VER                     "B" | #define         NP2SYSP_VER                     "C" | 
 | // #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 32 | 
 |  |  | 
 | 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 43  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 (!(CPUTYPE & 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, (pc.realclock + 500000) / 1000000); | 
 | np2sysp.outpos = 0; | np2sysp.outpos = 0; | 
| Line 86  static void np2sysp_clock(const void *ar | Line 83  static void np2sysp_clock(const void *ar | 
 | (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, pc.multiple); | 
 | np2sysp.outpos = 0; | np2sysp.outpos = 0; | 
| Line 94  static void np2sysp_mul(const void *arg1 | Line 91  static void np2sysp_mul(const void *arg1 | 
 | (void)arg2; | (void)arg2; | 
 | } | } | 
 |  |  | 
 |  |  | 
 |  | // ---- SXSI BIOS | 
 |  |  | 
 |  | typedef struct { | 
 |  | BYTE    r_ax[2]; | 
 |  | BYTE    r_bx[2]; | 
 |  | 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; | 
 |  |  | 
 |  | case 0x80: | 
 |  | 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 0 | #if 0 | 
| static void np2sysp_hostdrv(const void *arg1, const void *arg2) { | // ---- hostdrv | 
|  |  | 
|  | enum { | 
|  | OPEN_HOSTDRV    = 0, | 
|  | CLOSE_HOSTDRV   = 1, | 
|  | INTR_HOSTDRV    = 2 | 
|  | }; | 
 |  |  | 
| switch((DWORD)arg1) { | static void cmd_hostdrv(const void *arg1, long arg2) { | 
|  |  | 
|  | switch(arg2) { | 
 | case OPEN_HOSTDRV: | case OPEN_HOSTDRV: | 
| if(open_hostdrv()) | if (hostdrv_mount() == SUCCESS) { | 
| np2sysp_outstr("ok", NULL); | cmd_outstr("ok", 0); | 
| else | } | 
| np2sysp_outstr("ng", NULL); | else { | 
|  | cmd_outstr("ng", 0); | 
|  | } | 
 | break; | break; | 
 |  |  | 
| case INTR_HOSTDRV: | case CLOSE_HOSTDRV: | 
| intr_hostdrv(); | hostdrv_unmount(); | 
 | break; | break; | 
 |  |  | 
| case CLOSE_HOSTDRV: | case INTR_HOSTDRV: | 
| close_hostdrv(); | hostdrv_intr(); | 
 | break; | break; | 
 | } | } | 
 | } | } | 
 | #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"; | 
 | static const char str_credit[] = "credit"; | static const char str_credit[] = "credit"; | 
| static const char str_cpu[] = "credit"; | 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 232  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}, | 
|  |  | 
|  | // version:C | 
|  | {str_sxsibios,  cmd_sxsibios,   NULL,                   0}, | 
 |  |  | 
 | #if 0 | #if 0 | 
| // hostdrv | // extension | 
| {"check_hostdrv",       np2sysp_outstr,         "supported", | {str_hdrvcheck, cmd_outstr,             "supported",    0}, | 
| NULL}, | {str_hdrvopen,  cmd_hostdrv,    NULL,                   OPEN_HOSTDRV}, | 
| {"open_hostdrv",        np2sysp_hostdrv,        (void *)OPEN_HOSTDRV, | {str_hdrvclose, cmd_hostdrv,    NULL,                   CLOSE_HOSTDRV}, | 
| NULL}, | {str_hdrvintr,  cmd_hostdrv,    NULL,                   INTR_HOSTDRV}, | 
| {"intr_hostdrv",        np2sysp_hostdrv,        (void *)INTR_HOSTDRV, |  | 
| NULL}, |  | 
| {"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 277  static BOOL np2syspcmp(const char *p) { | 
 | return(FALSE); | return(FALSE); | 
 | } | } | 
 |  |  | 
| static void IOOUTCALL np2sysp_o7bf(UINT port, BYTE dat) { | static void IOOUTCALL np2sysp_o7ed(UINT port, REG8 dat) { | 
 |  |  | 
| UINT    i; | np2sysp.outval = (dat << 24) + (np2sysp.outval >> 8); | 
|  | (void)port; | 
|  | } | 
|  |  | 
|  | static void IOOUTCALL np2sysp_o7ef(UINT port, REG8 dat) { | 
|  |  | 
|  | const SYSPCMD   *cmd; | 
|  | const SYSPCMD   *cmdterm; | 
 |  |  | 
| np2sysp.substr[np2sysp.strpos] = dat; | np2sysp.substr[np2sysp.strpos] = (char)dat; | 
| for (i=0; i<(sizeof(np2spcmd)/sizeof(SYSPCMD)); i++) { | cmd = np2spcmd; | 
| if (!np2syspcmp(np2spcmd[i].key)) { | cmdterm = cmd + (sizeof(np2spcmd) / sizeof(SYSPCMD)); | 
| np2spcmd[i].func(np2spcmd[i].arg1, np2spcmd[i].arg2); | while(cmd < cmdterm) { | 
|  | if (!np2syspcmp(cmd->key)) { | 
|  | cmd->func(cmd->arg1, cmd->arg2); | 
 | break; | break; | 
 | } | } | 
 |  | cmd++; | 
 | } | } | 
 | np2sysp.strpos++; | np2sysp.strpos++; | 
 | np2sysp.strpos &= NP2SYSP_MASK; | np2sysp.strpos &= NP2SYSP_MASK; | 
 | (void)port; | (void)port; | 
 | } | } | 
 |  |  | 
| static BYTE IOINPCALL np2sysp_i7bf(UINT 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) { | 
 |  |  | 
| BYTE    ret; | REG8    ret; | 
 |  |  | 
| ret = np2sysp.outstr[np2sysp.outpos]; | ret = (UINT8)np2sysp.outstr[np2sysp.outpos]; | 
 | if (ret) { | if (ret) { | 
 | np2sysp.outpos++; | np2sysp.outpos++; | 
 | np2sysp.outpos &= NP2SYSP_MASK; | np2sysp.outpos &= NP2SYSP_MASK; | 
| Line 229  void np2sysp_reset(void) { | Line 336  void np2sysp_reset(void) { | 
 |  |  | 
 | void np2sysp_bind(void) { | void np2sysp_bind(void) { | 
 |  |  | 
| iocore_attachout(0x07bf, np2sysp_o7bf); | iocore_attachout(0x07ef, np2sysp_o7ed); | 
| iocore_attachinp(0x07bf, np2sysp_i7bf); | iocore_attachout(0x07ef, np2sysp_o7ef); | 
|  | iocore_attachinp(0x07ef, np2sysp_i7ed); | 
|  | iocore_attachinp(0x07ef, np2sysp_i7ef); | 
 | } | } | 
 |  |  |