--- np2/io/np2sysp.c 2003/11/08 17:06:01 1.2 +++ np2/io/np2sysp.c 2004/01/05 05:04:54 1.6 @@ -1,9 +1,11 @@ #include "compiler.h" #include "strres.h" #include "taskmng.h" -#include "i286.h" +#include "cpucore.h" #include "pccore.h" #include "iocore.h" +#include "bios.h" +#include "sxsi.h" // #include "hostdrv.h" // #include "hostdir.h" @@ -16,7 +18,7 @@ #define CLOSE_HOSTDRV 2 // NP2依存ポート -// port:07edh reserved +// port:07edh np2 value comm // port:07efh np2 string comm // 基本的に STRINGでやり取りする @@ -64,7 +66,7 @@ static void np2sysp_cpu(const void *arg1 // CPUを返す #if 1 // 80286 or V30 - if (!(CPUTYPE & CPUTYPE_V30)) { + if (!(CPU_TYPE & CPUTYPE_V30)) { np2sysp_outstr(str_80286, NULL); } else { @@ -94,6 +96,74 @@ static void np2sysp_mul(const 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; + + 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); + + 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) { @@ -121,9 +191,10 @@ 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[] = "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; @@ -151,6 +222,9 @@ static const SYSPCMD np2spcmd[] = { {str_clock, np2sysp_clock, NULL, NULL}, {str_multiple, np2sysp_mul, NULL, NULL}, +// version:C + {str_sxsibios, np2sysp_sxsi, NULL, NULL}, + #if 0 // hostdrv {"check_hostdrv", np2sysp_outstr, "supported", @@ -190,27 +264,45 @@ static BOOL np2syspcmp(const char *p) { return(FALSE); } -static void IOOUTCALL np2sysp_o7ef(UINT port, BYTE dat) { +static void IOOUTCALL np2sysp_o7ed(UINT port, REG8 dat) { + + np2sysp.outval = (dat << 24) + (np2sysp.outval >> 8); +} + +static void IOOUTCALL np2sysp_o7ef(UINT port, REG8 dat) { - UINT i; +const SYSPCMD *cmd; +const SYSPCMD *cmdterm; - np2sysp.substr[np2sysp.strpos] = dat; - for (i=0; i<(sizeof(np2spcmd)/sizeof(SYSPCMD)); i++) { - if (!np2syspcmp(np2spcmd[i].key)) { - np2spcmd[i].func(np2spcmd[i].arg1, np2spcmd[i].arg2); + np2sysp.substr[np2sysp.strpos] = (char)dat; + cmd = np2spcmd; + cmdterm = cmd + (sizeof(np2spcmd) / sizeof(SYSPCMD)); + while(cmd < cmdterm) { + if (!np2syspcmp(cmd->key)) { + cmd->func(cmd->arg1, cmd->arg2); break; } + cmd++; } np2sysp.strpos++; np2sysp.strpos &= NP2SYSP_MASK; (void)port; } -static BYTE IOINPCALL np2sysp_i7ef(UINT port) { +static REG8 IOINPCALL np2sysp_i7ed(UINT port) { + + REG8 ret; + + ret = (REG8)(np2sysp.inpval & 0xff); + np2sysp.inpval = (ret << 24) + (np2sysp.inpval >> 8); + 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) { np2sysp.outpos++; np2sysp.outpos &= NP2SYSP_MASK; @@ -229,7 +321,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); }