|
|
| version 1.1.1.1, 2003/10/16 17:57:56 | version 1.20, 2005/03/02 04:28:17 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "strres.h" | #include "strres.h" |
| #if defined(OSLANG_UCS2) | |
| #include "oemtext.h" | |
| #endif | |
| #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 "hostdrv.h" | #include "sxsibios.h" |
| // #include "hostdir.h" | #if defined(SUPPORT_HOSTDRV) |
| #include "hostdrv.h" | |
| #endif | |
| #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 36 |
| 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 OEMCHAR str_80286[] = OEMTEXT("80286"); |
| static const char str_v30[] = "V30"; | static const OEMCHAR str_v30[] = OEMTEXT("V30"); |
| static const char str_pentium[] = "PENTIUM"; | static const OEMCHAR str_pentium[] = OEMTEXT("PENTIUM"); |
| static const char str_mhz[] = "%uMHz"; | 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; | np2sysp.outpos = 0; |
| } | |
| void np2sysp_outstr(const void *arg1, long arg2) { | |
| setoutstr((OEMCHAR *)arg1); | |
| (void)arg2; | (void)arg2; |
| } | } |
| static void np2sysp_pwroff(const void *arg1, const void *arg2) { | static void np2sysp_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 np2sysp_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); | setoutstr(str_80286); |
| } | } |
| else { | else { |
| np2sysp_outstr(str_v30, NULL); | setoutstr(str_v30); |
| } | } |
| #else | #else |
| // 386機以降の場合 V30モードはエミュレーションだから固定(?) | // 386機以降の場合 V30モードはエミュレーションだから固定(?) |
| np2sysp_outstr(str_pentium, NULL); | setoutstr(str_pentium); |
| #endif | #endif |
| (void)arg1; | (void)arg1; |
| (void)arg2; | (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); | OEMCHAR str[16]; |
| np2sysp.outpos = 0; | |
| OEMSPRINTF(str, str_mhz, (pccore.realclock + 500000) / 1000000); | |
| setoutstr(str); | |
| (void)arg1; | (void)arg1; |
| (void)arg2; | (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); | OEMCHAR str[16]; |
| np2sysp.outpos = 0; | |
| OEMSPRINTF(str, str_u, pccore.multiple); | |
| setoutstr(str); | |
| (void)arg1; | (void)arg1; |
| (void)arg2; | (void)arg2; |
| } | } |
| #if 0 | static void np2sysp_hwreset(const void *arg1, long arg2) { |
| static void np2sysp_hostdrv(const void *arg1, const void *arg2) { | |
| switch((DWORD)arg1) { | hardwarereset = TRUE; |
| case OPEN_HOSTDRV: | (void)arg1; |
| if(open_hostdrv()) | (void)arg2; |
| np2sysp_outstr("ok", NULL); | } |
| else | |
| np2sysp_outstr("ng", NULL); | |
| break; | |
| case INTR_HOSTDRV: | |
| intr_hostdrv(); | |
| break; | |
| case CLOSE_HOSTDRV: | // ---- |
| close_hostdrv(); | |
| break; | |
| } | |
| } | |
| #endif | |
| static const char cmd_np2[] = "NP2"; | |
| static const OEMCHAR rep_np2[] = OEMTEXT("NP2"); | |
| static const char str_np2[] = "NP2"; | static const char cmd_ver[] = "ver"; |
| static const char str_ver[] = "ver"; | static const char cmd_poweroff[] = "poweroff"; |
| static const char str_poweroff[] = "poweroff"; | static const char cmd_credit[] = "credit"; |
| static const char str_credit[] = "credit"; | static const char cmd_cpu[] = "cpu"; |
| static const char str_cpu[] = "credit"; | static const char cmd_clock[] = "clock"; |
| static const char str_clock[] = "clock"; | static const char cmd_multiple[] = "multiple"; |
| static const char str_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"; | |
| static const OEMCHAR rep_hdrvcheck[] = OEMTEXT("0.74"); | |
| #endif | |
| #if defined(NP2SYSP_VER) | #if defined(NP2SYSP_VER) |
| static const char str_syspver[] = NP2SYSP_VER; | static const OEMCHAR str_syspver[] = OEMTEXT(NP2SYSP_VER); |
| #else | #else |
| #define str_syspver str_null | #define str_syspver str_null |
| #endif | #endif |
| #if defined(NP2SYSP_CREDIT) | #if defined(NP2SYSP_CREDIT) |
| static const char str_syspcredit[] = NP2SYSP_CREDIT; | static const OEMCHAR str_syspcredit[] = OEMTEXT(NP2SYSP_CREDIT); |
| #else | #else |
| #define str_syspcredit str_null | #define str_syspcredit str_null |
| #endif | #endif |
| static const SYSPCMD np2spcmd[] = { | static const SYSPCMD np2spcmd[] = { |
| {str_np2, np2sysp_outstr, str_np2, NULL}, | {cmd_np2, np2sysp_outstr, rep_np2, 0}, |
| {str_ver, np2sysp_outstr, str_syspver, NULL}, | {cmd_ver, np2sysp_outstr, str_syspver, 0}, |
| // version:A | // version:A |
| {str_poweroff, np2sysp_pwroff, NULL, NULL}, | {cmd_poweroff, np2sysp_poweroff, NULL, 0}, |
| // version:B | // version:B |
| {str_credit, np2sysp_outstr, str_syspcredit, NULL}, | {cmd_credit, np2sysp_outstr, str_syspcredit, 0}, |
| {str_cpu, np2sysp_cpu, NULL, NULL}, | {cmd_cpu, np2sysp_cpu, NULL, 0}, |
| {str_clock, np2sysp_clock, NULL, NULL}, | {cmd_clock, np2sysp_clock, NULL, 0}, |
| {str_multiple, np2sysp_mul, NULL, NULL}, | {cmd_multiple, np2sysp_multiple, NULL, 0}, |
| #if 0 | // version:C |
| // hostdrv | {cmd_hwreset, np2sysp_hwreset, NULL, 0}, |
| {"check_hostdrv", np2sysp_outstr, "supported", | |
| NULL}, | // extension |
| {"open_hostdrv", np2sysp_hostdrv, (void *)OPEN_HOSTDRV, | #if defined(SUPPORT_IDEIO) || defined(SUPPORT_SASI) |
| NULL}, | {cmd_sasibios, np2sysp_sasi, NULL, 0}, |
| {"intr_hostdrv", np2sysp_hostdrv, (void *)INTR_HOSTDRV, | #endif |
| NULL}, | #if defined(SUPPORT_SCSI) |
| {"close_hostdrv", np2sysp_hostdrv, (void *)CLOSE_HOSTDRV, | {cmd_scsibios, np2sysp_scsi, NULL, 0}, |
| NULL}, | {cmd_scsidev, np2sysp_scsidev, NULL, 0}, |
| #endif | |
| {hostdir_check, np2sysp_outstr, hostdir_check, NULL}, | |
| {"hostdir_reset", hostdir_reset, NULL, NULL}, | #if defined(SUPPORT_HOSTDRV) |
| {"hostdir_band", hostdir_band, NULL, NULL}, | {cmd_hdrvcheck, np2sysp_outstr, rep_hdrvcheck, 0}, |
| {"hostdir_int", hostdir_int, NULL, NULL}, | {cmd_hdrvopen, hostdrv_mount, NULL, 0}, |
| {cmd_hdrvclose, hostdrv_unmount, NULL, 0}, | |
| {cmd_hdrvintr, hostdrv_intr, NULL, 0}, | |
| #endif | #endif |
| }; | }; |
| static BOOL np2syspcmp(const char *p) { | static BRESULT np2syspcmp(const char *p) { |
| int len; | int len; |
| int pos; | int pos; |
| len = strlen(p); | len = STRLEN(p); |
| if (!len) { | if (!len) { |
| return(TRUE); | return(FAILURE); |
| } | } |
| pos = np2sysp.strpos; | pos = np2sysp.strpos; |
| while(len--) { | while(len--) { |
| if (p[len] != np2sysp.substr[pos]) { | if (p[len] != np2sysp.substr[pos]) { |
| return(TRUE); | return(FAILURE); |
| } | } |
| pos--; | pos--; |
| pos &= NP2SYSP_MASK; | pos &= NP2SYSP_MASK; |
| } | } |
| return(FALSE); | return(SUCCESS); |
| } | } |
| 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 + NELEMENTS(np2spcmd); |
| 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 219 static BYTE IOINPCALL np2sysp_i7bf(UINT | Line 259 static BYTE IOINPCALL np2sysp_i7bf(UINT |
| return(ret); | return(ret); |
| } | } |
| #if defined(NP2APPDEV) | |
| static void IOOUTCALL np2sysp_o0e9(UINT port, REG8 dat) { | |
| APPDEVOUT(dat); | |
| (void)port; | |
| } | |
| #endif | |
| // ---- I/F | // ---- I/F |
| Line 229 void np2sysp_reset(void) { | Line 277 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); | |
| #if defined(NP2APPDEV) | |
| iocore_attachout(0x00e9, np2sysp_o0e9); | |
| #endif | |
| } | } |