--- np2/io/np2sysp.c 2003/12/28 14:33:34 1.5 +++ np2/io/np2sysp.c 2005/02/14 06:25:31 1.17 @@ -1,24 +1,23 @@ #include "compiler.h" #include "strres.h" +#if defined(OSLANG_UCS2) +#include "oemtext.h" +#endif #include "taskmng.h" #include "cpucore.h" #include "pccore.h" #include "iocore.h" -#include "bios.h" -#include "sxsi.h" -// #include "hostdrv.h" -// #include "hostdir.h" +#include "sxsibios.h" +#if defined(SUPPORT_HOSTDRV) +#include "hostdrv.h" +#endif -#define NP2SYSP_VER "B" +#define NP2SYSP_VER "C" // #define NP2SYSP_CREDIT "" // 要るなら・・・ -#define OPEN_HOSTDRV 0 -#define INTR_HOSTDRV 1 -#define CLOSE_HOSTDRV 2 - // NP2依存ポート -// port:07edh reserved +// port:07edh np2 value comm // port:07efh np2 string comm // 基本的に STRINGでやり取りする @@ -37,209 +36,153 @@ typedef struct { const char *key; - void (*func)(const void *arg1, const void *arg2); + void (*func)(const void *arg1, long arg2); const void *arg1; -const void *arg2; + long arg2; } SYSPCMD; -static const char str_80286[] = "80286"; -static const char str_v30[] = "V30"; -static const char str_pentium[] = "PENTIUM"; -static const char str_mhz[] = "%uMHz"; +static const OEMCHAR str_80286[] = OEMTEXT("80286"); +static const OEMCHAR str_v30[] = OEMTEXT("V30"); +static const OEMCHAR str_pentium[] = OEMTEXT("PENTIUM"); +static const OEMCHAR str_mhz[] = OEMTEXT("%uMHz"); -static void np2sysp_outstr(const void *arg1, const void *arg2) { +static void setoutstr(const OEMCHAR *str) { - milstr_ncpy(np2sysp.outstr, (char *)arg1, sizeof(np2sysp.outstr)); +#if defined(OSLANG_UCS2) + oemtext_oemtosjis(np2sysp.outstr, sizeof(np2sysp.outstr), str, -1); +#else + milstr_ncpy(np2sysp.outstr, str, sizeof(np2sysp.outstr)); +#endif np2sysp.outpos = 0; +} + +void np2sysp_outstr(const void *arg1, long arg2) { + + setoutstr((OEMCHAR *)arg1); (void)arg2; } -static void np2sysp_pwroff(const void *arg1, const void *arg2) { +static void np2sysp_poweroff(const void *arg1, long arg2) { taskmng_exit(); (void)arg1; (void)arg2; } -static void np2sysp_cpu(const void *arg1, const void *arg2) { +static void np2sysp_cpu(const void *arg1, long arg2) { // CPUを返す #if 1 // 80286 or V30 if (!(CPU_TYPE & CPUTYPE_V30)) { - np2sysp_outstr(str_80286, NULL); + setoutstr(str_80286); } else { - np2sysp_outstr(str_v30, NULL); + setoutstr(str_v30); } #else // 386機以降の場合 V30モードはエミュレーションだから固定(?) - np2sysp_outstr(str_pentium, NULL); + setoutstr(str_pentium); #endif (void)arg1; (void)arg2; } -static void np2sysp_clock(const void *arg1, const void *arg2) { +static void np2sysp_clock(const void *arg1, long arg2) { - SPRINTF(np2sysp.outstr, str_mhz, (pc.realclock + 500000) / 1000000); - np2sysp.outpos = 0; + OEMCHAR str[16]; + + OEMSPRINTF(str, str_mhz, (pccore.realclock + 500000) / 1000000); + setoutstr(str); (void)arg1; (void)arg2; } -static void np2sysp_mul(const void *arg1, const void *arg2) { +static void np2sysp_multiple(const void *arg1, long arg2) { - SPRINTF(np2sysp.outstr, str_u, pc.multiple); - np2sysp.outpos = 0; + OEMCHAR str[16]; + + OEMSPRINTF(str, str_u, pccore.multiple); + setoutstr(str); (void)arg1; (void)arg2; } -typedef struct { - UINT16 r_ax; - UINT16 r_bx; - UINT16 r_cx; - UINT16 r_dx; - UINT16 r_bp; - UINT16 r_es; -} B1BREG; - -static void np2sysp_sxsi(const void *arg1, const void *arg2) { - - B1BREG org; - UINT32 esbase_org; - B1BREG r; - UINT8 ret; - REG8 flag; - - org.r_ax = CPU_AX; - org.r_cx = CPU_CX; - org.r_dx = CPU_DX; - org.r_bx = CPU_BX; - org.r_bp = CPU_BP; - org.r_es = CPU_ES; - esbase_org = ES_BASE; - - i286_memstr_read(CPU_SS, CPU_SP, &r, sizeof(r)); - CPU_AX = r.r_ax; - CPU_BX = r.r_bx; - CPU_CX = r.r_cx; - CPU_DX = r.r_dx; - CPU_BP = r.r_bp; - CPU_ES = r.r_es; - ES_BASE = r.r_es << 4; - switch(r.r_ax & 0xf0) { - case 0x00: - case 0x20: - ret = sxsi_operate(HDDTYPE_SASI); - break; - - case 0x80: - case 0xa0: - ret = sxsi_operate(HDDTYPE_SCSI); - break; +static void np2sysp_hwreset(const void *arg1, long arg2) { - default: - ret = 0x40; - break; - } - r.r_ax = CPU_AL + (ret << 8); - r.r_bx = CPU_BX; - r.r_cx = CPU_CX; - 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); + hardwarereset = TRUE; + (void)arg1; + (void)arg2; +} - CPU_AX = org.r_ax; - CPU_CX = org.r_cx; - CPU_DX = org.r_dx; - CPU_BX = org.r_bx; - CPU_BP = org.r_bp; - CPU_ES = org.r_es; - ES_BASE = esbase_org; -} - -#if 0 -static void np2sysp_hostdrv(const void *arg1, const void *arg2) { - - switch((DWORD)arg1) { - case OPEN_HOSTDRV: - if(open_hostdrv()) - np2sysp_outstr("ok", NULL); - else - np2sysp_outstr("ng", NULL); - break; - case INTR_HOSTDRV: - intr_hostdrv(); - break; +// ---- - case CLOSE_HOSTDRV: - close_hostdrv(); - break; - } -} +static const char cmd_np2[] = "NP2"; +static const char cmd_ver[] = "ver"; +static const char cmd_poweroff[] = "poweroff"; +static const char cmd_credit[] = "credit"; +static const char cmd_cpu[] = "cpu"; +static const char cmd_clock[] = "clock"; +static const char cmd_multiple[] = "multiple"; +static const char cmd_hwreset[] = "hardwarereset"; +#if defined(SUPPORT_IDEIO) || defined(SUPPORT_SASI) +static const char cmd_sasibios[] = "sasibios"; +#endif +#if defined(SUPPORT_SCSI) +static const char cmd_scsibios[] = "scsibios"; +static const char cmd_scsidev[] = "scsi_dev"; +#endif +#if defined(SUPPORT_HOSTDRV) +static const char cmd_hdrvcheck[] = "check_hostdrv"; +static const char cmd_hdrvopen[] = "open_hostdrv"; +static const char cmd_hdrvclose[] = "close_hostdrv"; +static const char cmd_hdrvintr[] = "intr_hostdrv"; #endif - - -static const char str_np2[] = "NP2"; -static const char str_ver[] = "ver"; -static const char str_poweroff[] = "poweroff"; -static const char str_credit[] = "credit"; -static const char str_cpu[] = "cpu"; -static const char str_clock[] = "clock"; -static const char str_multiple[] = "multiple"; -static const char str_sxsibios[] = "sxsibios"; #if defined(NP2SYSP_VER) -static const char str_syspver[] = NP2SYSP_VER; +static const OEMCHAR str_syspver[] = OEMTEXT(NP2SYSP_VER); #else #define str_syspver str_null #endif #if defined(NP2SYSP_CREDIT) -static const char str_syspcredit[] = NP2SYSP_CREDIT; +static const OEMCHAR str_syspcredit[] = OEMTEXT(NP2SYSP_CREDIT); #else #define str_syspcredit str_null #endif static const SYSPCMD np2spcmd[] = { - {str_np2, np2sysp_outstr, str_np2, NULL}, - {str_ver, np2sysp_outstr, str_syspver, NULL}, + {cmd_np2, np2sysp_outstr, str_np2, 0}, + {cmd_ver, np2sysp_outstr, str_syspver, 0}, // version:A - {str_poweroff, np2sysp_pwroff, NULL, NULL}, + {cmd_poweroff, np2sysp_poweroff, NULL, 0}, // version:B - {str_credit, np2sysp_outstr, str_syspcredit, NULL}, - {str_cpu, np2sysp_cpu, NULL, NULL}, - {str_clock, np2sysp_clock, NULL, NULL}, - {str_multiple, np2sysp_mul, NULL, NULL}, + {cmd_credit, np2sysp_outstr, str_syspcredit, 0}, + {cmd_cpu, np2sysp_cpu, NULL, 0}, + {cmd_clock, np2sysp_clock, NULL, 0}, + {cmd_multiple, np2sysp_multiple, NULL, 0}, // version:C - {str_sxsibios, np2sysp_sxsi, NULL, NULL}, + {cmd_hwreset, np2sysp_hwreset, NULL, 0}, + +// extension +#if defined(SUPPORT_IDEIO) || defined(SUPPORT_SASI) + {cmd_sasibios, np2sysp_sasi, NULL, 0}, +#endif +#if defined(SUPPORT_SCSI) + {cmd_scsibios, np2sysp_scsi, NULL, 0}, + {cmd_scsidev, np2sysp_scsidev, NULL, 0}, +#endif -#if 0 -// hostdrv - {"check_hostdrv", np2sysp_outstr, "supported", - NULL}, - {"open_hostdrv", np2sysp_hostdrv, (void *)OPEN_HOSTDRV, - NULL}, - {"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}, +#if defined(SUPPORT_HOSTDRV) + {cmd_hdrvcheck, np2sysp_outstr, OEMTEXT("0.74"),0}, + {cmd_hdrvopen, hostdrv_mount, NULL, 0}, + {cmd_hdrvclose, hostdrv_unmount, NULL, 0}, + {cmd_hdrvintr, hostdrv_intr, NULL, 0}, #endif }; @@ -264,6 +207,12 @@ static BOOL np2syspcmp(const char *p) { 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) { const SYSPCMD *cmd; @@ -271,7 +220,7 @@ const SYSPCMD *cmdterm; np2sysp.substr[np2sysp.strpos] = (char)dat; cmd = np2spcmd; - cmdterm = cmd + (sizeof(np2spcmd) / sizeof(SYSPCMD)); + cmdterm = cmd + NELEMENTS(np2spcmd); while(cmd < cmdterm) { if (!np2syspcmp(cmd->key)) { cmd->func(cmd->arg1, cmd->arg2); @@ -284,6 +233,16 @@ const SYSPCMD *cmdterm; (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) { REG8 ret; @@ -307,7 +266,9 @@ void np2sysp_reset(void) { void np2sysp_bind(void) { + iocore_attachout(0x07ef, np2sysp_o7ed); iocore_attachout(0x07ef, np2sysp_o7ef); + iocore_attachinp(0x07ef, np2sysp_i7ed); iocore_attachinp(0x07ef, np2sysp_i7ef); }