--- np2/cbus/ideio.c 2004/03/19 03:36:52 1.1 +++ np2/cbus/ideio.c 2004/03/22 05:38:47 1.2 @@ -1,5 +1,7 @@ #include "compiler.h" +// winでidentifyまでは取得に行くんだけどな… + #if defined(SUPPORT_IDEIO) #include "dosio.h" @@ -9,6 +11,7 @@ #include "ideio.h" #include "atapicmd.h" #include "sxsi.h" +#include "idebios.res" IDEIO ideio; @@ -16,26 +19,41 @@ static IDEDEV getidedev(void) { - IDEDEV ret; + UINT bank; - ret = ideio.dev + (ideio.bank[1] & 1); - return(ret); + bank = ideio.bank[1] & 0x7f; + if (bank < 2) { + return(ideio.dev + bank); + } + else { + return(NULL); + } } static IDEDRV getidedrv(void) { IDEDEV dev; - dev = ideio.dev + (ideio.bank[1] & 1); - return(dev->drv + dev->drivesel); + dev = getidedev(); + if (dev) { + return(dev->drv + dev->drivesel); + } + else { + return(NULL); + } } +static const char serial[] = "824919341192 "; +static const char firm[] = "A5U.1200"; +static const char model[] = "QUANTUM FIREBALL CR "; + static BOOL setidentify(IDEDRV drv) { SXSIDEV sxsi; UINT16 tmp[256]; BYTE *p; UINT i; + UINT32 size; sxsi = sxsi_getptr(drv->sxsidrv); if ((sxsi == NULL) || (sxsi->fname[0] == '\0')) { @@ -44,9 +62,43 @@ static BOOL setidentify(IDEDRV drv) { ZeroMemory(tmp, sizeof(tmp)); // とりあえず使ってる部分だけ + tmp[0] = 0x045a; tmp[1] = sxsi->cylinders; tmp[3] = sxsi->surfaces; + tmp[4] = sxsi->sectors * 512; +// tmp[5] = 0; // ??? tmp[6] = sxsi->sectors; + for (i=0; i<10; i++) { + tmp[10+i] = (serial[i*2] << 8) + serial[i*2+1]; + } + tmp[20] = 3; + tmp[21] = 16; + tmp[22] = 4; + for (i=0; i<4; i++) { + tmp[23+i] = (firm[i*2] << 8) + firm[i*2+1]; + } + for (i=0; i<20; i++) { + tmp[27+i] = (model[i*2] << 8) + model[i*2+1]; + } +// tmp[47] = 0; // multiple + tmp[49] = 0x0f00; + tmp[50] = 0x4000; + tmp[51] = 0x0200; + tmp[52] = 0x0200; + tmp[53] = 0x0007; + tmp[54] = sxsi->cylinders; + tmp[55] = sxsi->surfaces; + tmp[56] = sxsi->sectors; + size = sxsi->cylinders * sxsi->surfaces * sxsi->sectors; + tmp[57] = (UINT16)size; + tmp[58] = (UINT16)(size >> 16); +// tmp[59] = 0; + tmp[60] = (UINT16)size; + tmp[61] = (UINT16)(size >> 16); + tmp[63] = 0x0407; + + tmp[80] = 0x001e; + tmp[81] = 0x0011; p = drv->buf; for (i=0; i<256; i++) { @@ -73,6 +125,19 @@ static void cmdabort(IDEDRV drv) { pic_setirq(IDE_IRQ); } +static void panic(const char *str, ...) { + + char buf[2048]; + va_list ap; + + va_start(ap, str); + vsnprintf(buf, sizeof(buf), str, ap); + va_end(ap); + + msgbox("ide_panic", buf); + exit(1); +} + // ---- @@ -142,9 +207,9 @@ read_err: static void IOOUTCALL ideio_o430(UINT port, REG8 dat) { - TRACEOUT(("ideio setbank%d %.2x [%.4x:%.4x]", - (port >> 1) & 1, dat, CPU_CS, CPU_IP)); - if ((dat == 0) || (dat == 1)) { + TRACEOUT(("ideio setbank%d %.2x [%.4x:%.8x]", + (port >> 1) & 1, dat, CPU_CS, CPU_EIP)); + if (!(dat & 0x80)) { ideio.bank[(port >> 1) & 1] = dat; } } @@ -157,9 +222,9 @@ static REG8 IOINPCALL ideio_i430(UINT po bank = (port >> 1) & 1; ret = ideio.bank[bank]; ideio.bank[bank] = ret & (~0x80); - TRACEOUT(("ideio getbank%d %.2x [%.4x:%.4x]", - (port >> 1) & 1, ret, CPU_CS, CPU_IP)); - return(ret); + TRACEOUT(("ideio getbank%d %.2x [%.4x:%.8x]", + (port >> 1) & 1, ret, CPU_CS, CPU_EIP)); + return(ret & 0x81); } @@ -170,8 +235,10 @@ static void IOOUTCALL ideio_o642(UINT po IDEDRV drv; drv = getidedrv(); - drv->wp = dat; - TRACEOUT(("ideio set WP %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); + if (drv) { + drv->wp = dat; + TRACEOUT(("ideio set WP %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); + } } static void IOOUTCALL ideio_o644(UINT port, REG8 dat) { @@ -179,8 +246,10 @@ static void IOOUTCALL ideio_o644(UINT po IDEDRV drv; drv = getidedrv(); - drv->sc = dat; - TRACEOUT(("ideio set SC %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); + if (drv) { + drv->sc = dat; + TRACEOUT(("ideio set SC %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); + } } static void IOOUTCALL ideio_o646(UINT port, REG8 dat) { @@ -188,8 +257,10 @@ static void IOOUTCALL ideio_o646(UINT po IDEDRV drv; drv = getidedrv(); - drv->sn = dat; - TRACEOUT(("ideio set SN %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); + if (drv) { + drv->sn = dat; + TRACEOUT(("ideio set SN %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); + } } static void IOOUTCALL ideio_o648(UINT port, REG8 dat) { @@ -197,9 +268,11 @@ static void IOOUTCALL ideio_o648(UINT po IDEDRV drv; drv = getidedrv(); - drv->cy &= 0xff00; - drv->cy |= dat; - TRACEOUT(("ideio set CYL %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); + if (drv) { + drv->cy &= 0xff00; + drv->cy |= dat; + TRACEOUT(("ideio set CYL %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); + } } static void IOOUTCALL ideio_o64a(UINT port, REG8 dat) { @@ -207,9 +280,11 @@ static void IOOUTCALL ideio_o64a(UINT po IDEDRV drv; drv = getidedrv(); - drv->cy &= 0x00ff; - drv->cy |= dat << 8; - TRACEOUT(("ideio set CYH %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); + if (drv) { + drv->cy &= 0x00ff; + drv->cy |= dat << 8; + TRACEOUT(("ideio set CYH %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); + } } static void IOOUTCALL ideio_o64c(UINT port, REG8 dat) { @@ -217,17 +292,20 @@ static void IOOUTCALL ideio_o64c(UINT po IDEDEV dev; UINT drvnum; + dev = getidedev(); + if (dev == NULL) { + return; + } #if defined(TRACE) if ((dat & 0xf0) != 0xa0) { TRACEOUT(("ideio set SDH illegal param? (%.2x)", dat)); } #endif drvnum = (dat >> 4) & 1; - dev = getidedev(); dev->drivesel = drvnum; dev->drv[drvnum].dr = dat & 0xf0; dev->drv[drvnum].hd = dat & 0x0f; - TRACEOUT(("ideio set DRHD %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); + TRACEOUT(("ideio set DRHD %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); } static void IOOUTCALL ideio_o64e(UINT port, REG8 dat) { @@ -235,8 +313,11 @@ static void IOOUTCALL ideio_o64e(UINT po IDEDRV drv; drv = getidedrv(); + if (drv == NULL) { + return; + } drv->cmd = dat; - TRACEOUT(("ideio set cmd %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); + TRACEOUT(("ideio set cmd %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); switch(dat) { case 0x08: // atapi reset if (drv->device == IDETYPE_CDROM) { @@ -298,8 +379,8 @@ static void IOOUTCALL ideio_o64e(UINT po } break; - case 0xec: // indentify - TRACEOUT(("ideio: indentify")); + case 0xec: // identify + TRACEOUT(("ideio: identify")); if (setidentify(drv) == SUCCESS) { drv->status = IDESTAT_DRDY | IDESTAT_DSC | IDESTAT_DRQ; drv->error = 0; @@ -311,6 +392,7 @@ static void IOOUTCALL ideio_o64e(UINT po break; default: + panic("command:%.2x", dat); break; } } @@ -321,6 +403,9 @@ static void IOOUTCALL ideio_o74c(UINT po REG8 modify; dev = getidedev(); + if (dev == NULL) { + return; + } modify = dev->drv[0].ctrl ^ dat; dev->drv[0].ctrl = dat; dev->drv[1].ctrl = dat; @@ -342,12 +427,12 @@ static void IOOUTCALL ideio_o74c(UINT po } } } - TRACEOUT(("ideio %.4x,%.2x [%.4x:%.4x]", port, dat, CPU_CS, CPU_IP)); + TRACEOUT(("ideio %.4x,%.2x [%.4x:%.8x]", port, dat, CPU_CS, CPU_EIP)); } static void IOOUTCALL ideio_o74e(UINT port, REG8 dat) { - TRACEOUT(("ideio %.4x,%.2x [%.4x:%.4x]", port, dat, CPU_CS, CPU_IP)); + TRACEOUT(("ideio %.4x,%.2x [%.4x:%.8x]", port, dat, CPU_CS, CPU_EIP)); } @@ -358,9 +443,15 @@ static REG8 IOINPCALL ideio_i642(UINT po IDEDRV drv; drv = getidedrv(); - drv->status &= ~IDESTAT_ERR; - TRACEOUT(("ideio get error %.2x [%.4x:%.4x]", drv->error, CPU_CS, CPU_IP)); - return(drv->error); + if (drv) { + drv->status &= ~IDESTAT_ERR; + TRACEOUT(("ideio get error %.2x [%.4x:%.8x]", + drv->error, CPU_CS, CPU_EIP)); + return(drv->error); + } + else { + return(0xff); + } } static REG8 IOINPCALL ideio_i644(UINT port) { @@ -368,8 +459,13 @@ static REG8 IOINPCALL ideio_i644(UINT po IDEDRV drv; drv = getidedrv(); - TRACEOUT(("ideio get SC %.2x [%.4x:%.4x]", drv->sc, CPU_CS, CPU_IP)); - return(drv->sc); + if (drv) { + TRACEOUT(("ideio get SC %.2x [%.4x:%.8x]", drv->sc, CPU_CS, CPU_EIP)); + return(drv->sc); + } + else { + return(0xff); + } } static REG8 IOINPCALL ideio_i646(UINT port) { @@ -377,8 +473,13 @@ static REG8 IOINPCALL ideio_i646(UINT po IDEDRV drv; drv = getidedrv(); - TRACEOUT(("ideio get SN %.2x [%.4x:%.4x]", drv->sn, CPU_CS, CPU_IP)); - return(drv->sn); + if (drv) { + TRACEOUT(("ideio get SN %.2x [%.4x:%.8x]", drv->sn, CPU_CS, CPU_EIP)); + return(drv->sn); + } + else { + return(0xff); + } } static REG8 IOINPCALL ideio_i648(UINT port) { @@ -386,8 +487,13 @@ static REG8 IOINPCALL ideio_i648(UINT po IDEDRV drv; drv = getidedrv(); - TRACEOUT(("ideio get CYL %.4x [%.4x:%.4x]", drv->cy, CPU_CS, CPU_IP)); - return((UINT8)drv->cy); + if (drv) { + TRACEOUT(("ideio get CYL %.4x [%.4x:%.8x]", drv->cy, CPU_CS, CPU_EIP)); + return((UINT8)drv->cy); + } + else { + return(0xff); + } } static REG8 IOINPCALL ideio_i64a(UINT port) { @@ -395,8 +501,13 @@ static REG8 IOINPCALL ideio_i64a(UINT po IDEDRV drv; drv = getidedrv(); - TRACEOUT(("ideio get CYH %.4x [%.4x:%.4x]", drv->cy, CPU_CS, CPU_IP)); - return((REG8)(drv->cy >> 8)); + if (drv) { + TRACEOUT(("ideio get CYH %.4x [%.4x:%.8x]", drv->cy, CPU_CS, CPU_EIP)); + return((REG8)(drv->cy >> 8)); + } + else { + return(0xff); + } } static REG8 IOINPCALL ideio_i64c(UINT port) { @@ -405,9 +516,14 @@ static REG8 IOINPCALL ideio_i64c(UINT po REG8 ret; drv = getidedrv(); - ret = drv->dr | drv->hd; - TRACEOUT(("ideio get DRHD %.2x [%.4x:%.4x]", ret, CPU_CS, CPU_IP)); - return(ret); + if (drv) { + ret = drv->dr | drv->hd; + TRACEOUT(("ideio get DRHD %.2x [%.4x:%.8x]", ret, CPU_CS, CPU_EIP)); + return(ret); + } + else { + return(0xff); + } } static REG8 IOINPCALL ideio_i64e(UINT port) { @@ -415,13 +531,19 @@ static REG8 IOINPCALL ideio_i64e(UINT po IDEDRV drv; drv = getidedrv(); - TRACEOUT(("ideio status %.2x [%.4x:%.4x]", drv->status, CPU_CS, CPU_IP)); - return(drv->status); + if (drv) { + TRACEOUT(("ideio status %.2x [%.4x:%.8x]", + drv->status, CPU_CS, CPU_EIP)); + return(drv->status); + } + else { + return(0xff); + } } static REG8 IOINPCALL ideio_i74c(UINT port) { - TRACEOUT(("ideio %.4x [%.4x:%.4x]", port, CPU_CS, CPU_IP)); + TRACEOUT(("ideio %.4x [%.4x:%.8x]", port, CPU_CS, CPU_EIP)); return(0xff); } @@ -434,12 +556,13 @@ void IOOUTCALL ideio_w16(UINT port, REG1 BYTE *p; drv = getidedrv(); - if ((drv->status & IDESTAT_DRQ) && (drv->bufdir == IDEDIR_OUT)) { + if ((drv != NULL) && + (drv->status & IDESTAT_DRQ) && (drv->bufdir == IDEDIR_OUT)) { p = drv->buf + drv->bufpos; p[0] = (BYTE)value; p[1] = (BYTE)(value >> 8); - TRACEOUT(("ide-data send %4x (%.4x) [%.4x:%.4x]", - value, drv->bufpos, CPU_CS, CPU_IP)); + TRACEOUT(("ide-data send %4x (%.4x) [%.4x:%.8x]", + value, drv->bufpos, CPU_CS, CPU_EIP)); drv->bufpos += 2; if (drv->bufpos >= drv->bufsize) { drv->status &= ~IDESTAT_DRQ; @@ -454,17 +577,20 @@ void IOOUTCALL ideio_w16(UINT port, REG1 REG16 IOOUTCALL ideio_r16(UINT port) { - REG16 ret; IDEDRV drv; + REG16 ret; BYTE *p; - ret = 0; drv = getidedrv(); + if (drv == NULL) { + return(0xff); + } + ret = 0; if ((drv->status & IDESTAT_DRQ) && (drv->bufdir == IDEDIR_IN)) { p = drv->buf + drv->bufpos; ret = p[0] + (p[1] << 8); - TRACEOUT(("ide-data recv %4x (%.4x) [%.4x:%.4x]", - ret, drv->bufpos, CPU_CS, CPU_IP)); + TRACEOUT(("ide-data recv %4x (%.4x) [%.4x:%.8x]", + ret, drv->bufpos, CPU_CS, CPU_EIP)); drv->bufpos += 2; if (drv->bufpos >= drv->bufsize) { drv->status &= ~IDESTAT_DRQ; @@ -525,7 +651,7 @@ void ideio_reset(void) { devinit(drv, i); } -#if 1 // CD-ROM test +#if 0 // CD-ROM test drv = ideio.dev[1].drv; drv->hd = 0; drv->sc = 1; @@ -547,6 +673,9 @@ void ideio_reset(void) { ideio.dev[1].drv[0].sxsidrv = 0x02; ideio.dev[1].drv[1].sxsidrv = 0x03; #endif + + CopyMemory(mem + 0xd0000, idebios, sizeof(idebios)); + TRACEOUT(("use simulate ide.rom")); } void ideio_bind(void) {