|
|
| version 1.1, 2004/03/19 03:36:52 | version 1.3, 2004/03/23 13:32:50 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| // winでidentifyまでは取得に行くんだけどな…ってAnex86も同じか | |
| #if defined(SUPPORT_IDEIO) | #if defined(SUPPORT_IDEIO) |
| #include "dosio.h" | #include "dosio.h" |
| Line 9 | Line 11 |
| #include "ideio.h" | #include "ideio.h" |
| #include "atapicmd.h" | #include "atapicmd.h" |
| #include "sxsi.h" | #include "sxsi.h" |
| #include "idebios.res" | |
| IDEIO ideio; | IDEIO ideio; |
| Line 16 | Line 19 |
| static IDEDEV getidedev(void) { | static IDEDEV getidedev(void) { |
| IDEDEV ret; | UINT bank; |
| ret = ideio.dev + (ideio.bank[1] & 1); | bank = ideio.bank[1] & 0x7f; |
| return(ret); | if (bank < 2) { |
| return(ideio.dev + bank); | |
| } | |
| else { | |
| return(NULL); | |
| } | |
| } | } |
| static IDEDRV getidedrv(void) { | static IDEDRV getidedrv(void) { |
| IDEDEV dev; | IDEDEV dev; |
| dev = ideio.dev + (ideio.bank[1] & 1); | dev = getidedev(); |
| return(dev->drv + dev->drivesel); | 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) { | static BOOL setidentify(IDEDRV drv) { |
| SXSIDEV sxsi; | SXSIDEV sxsi; |
| UINT16 tmp[256]; | UINT16 tmp[256]; |
| BYTE *p; | BYTE *p; |
| UINT i; | UINT i; |
| UINT32 size; | |
| sxsi = sxsi_getptr(drv->sxsidrv); | sxsi = sxsi_getptr(drv->sxsidrv); |
| if ((sxsi == NULL) || (sxsi->fname[0] == '\0')) { | if ((sxsi == NULL) || (sxsi->fname[0] == '\0')) { |
| Line 44 static BOOL setidentify(IDEDRV drv) { | Line 62 static BOOL setidentify(IDEDRV drv) { |
| ZeroMemory(tmp, sizeof(tmp)); | ZeroMemory(tmp, sizeof(tmp)); |
| // とりあえず使ってる部分だけ | // とりあえず使ってる部分だけ |
| tmp[0] = 0x045a; | |
| tmp[1] = sxsi->cylinders; | tmp[1] = sxsi->cylinders; |
| tmp[3] = sxsi->surfaces; | tmp[3] = sxsi->surfaces; |
| tmp[4] = sxsi->sectors * 512; | |
| // tmp[5] = 0; // ??? | |
| tmp[6] = sxsi->sectors; | 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; | p = drv->buf; |
| for (i=0; i<256; i++) { | for (i=0; i<256; i++) { |
| Line 54 static BOOL setidentify(IDEDRV drv) { | Line 106 static BOOL setidentify(IDEDRV drv) { |
| p[1] = (BYTE)(tmp[i] >> 8); | p[1] = (BYTE)(tmp[i] >> 8); |
| p += 2; | p += 2; |
| } | } |
| drv->bufdir = IDEDIR_IN; | |
| drv->bufpos = 0; | drv->bufpos = 0; |
| drv->bufsize = 512; | drv->bufsize = 512; |
| return(SUCCESS); | return(SUCCESS); |
| Line 73 static void cmdabort(IDEDRV drv) { | Line 126 static void cmdabort(IDEDRV drv) { |
| pic_setirq(IDE_IRQ); | 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); | |
| } | |
| // ---- | // ---- |
| static void incsec(IDEDRV drv) { | static void incsec(IDEDRV drv) { |
| if (drv->dr & IDEDEV_LBA) { | if (!(drv->dr & IDEDEV_LBA)) { |
| TRACEOUT(("ideio: incsec() LBA mode?")); | drv->sn++; |
| return; | if (drv->sn <= drv->sectors) { |
| } | return; |
| drv->sn++; | } |
| if (drv->sn <= drv->sectors) { | drv->sn = 1; |
| return; | drv->hd++; |
| if (drv->hd < drv->surfaces) { | |
| return; | |
| } | |
| drv->hd = 0; | |
| drv->cy++; | |
| } | } |
| drv->sn = 1; | else { |
| drv->hd++; | TRACEOUT(("ideio: incsec() LBA mode?")); |
| if (drv->hd < drv->surfaces) { | drv->sn++; |
| return; | if (drv->sn) { |
| return; | |
| } | |
| drv->cy++; | |
| if (drv->cy) { | |
| return; | |
| } | |
| drv->hd++; | |
| } | } |
| drv->hd = 0; | |
| drv->cy++; | |
| } | } |
| static long getcursec(const _IDEDRV *drv) { | static long getcursec(const _IDEDRV *drv) { |
| long ret; | long ret; |
| if (drv->dr & IDEDEV_LBA) { | if (!(drv->dr & IDEDEV_LBA)) { |
| ret = drv->cy; | |
| ret *= drv->surfaces; | |
| ret += drv->hd; | |
| ret *= drv->sectors; | |
| ret += (drv->sn - 1); | |
| } | |
| else { | |
| TRACEOUT(("ideio: getcursec() LBA mode?")); | TRACEOUT(("ideio: getcursec() LBA mode?")); |
| return(-1); | ret = drv->sn; |
| ret |= (drv->cy << 8); | |
| ret |= (drv->hd << 24); | |
| } | } |
| ret = drv->cy; | |
| ret *= drv->surfaces; | |
| ret += drv->hd; | |
| ret *= drv->sectors; | |
| ret += (drv->sn - 1); | |
| return(ret); | return(ret); |
| } | } |
| Line 121 static void readsec(IDEDRV drv) { | Line 201 static void readsec(IDEDRV drv) { |
| sec = getcursec(drv); | sec = getcursec(drv); |
| TRACEOUT(("readsec->drv %d sec %x", drv->sxsidrv, sec)); | TRACEOUT(("readsec->drv %d sec %x", drv->sxsidrv, sec)); |
| if (sxsi_read(drv->sxsidrv, sec, drv->buf, 512)) { | if (sxsi_read(drv->sxsidrv, sec, drv->buf, 512)) { |
| TRACEOUT(("readerror!")); | TRACEOUT(("read error!")); |
| goto read_err; | goto read_err; |
| } | } |
| drv->bufdir = IDEDIR_IN; | drv->bufdir = IDEDIR_IN; |
| Line 142 read_err: | Line 222 read_err: |
| static void IOOUTCALL ideio_o430(UINT port, REG8 dat) { | static void IOOUTCALL ideio_o430(UINT port, REG8 dat) { |
| TRACEOUT(("ideio setbank%d %.2x [%.4x:%.4x]", | TRACEOUT(("ideio setbank%d %.2x [%.4x:%.8x]", |
| (port >> 1) & 1, dat, CPU_CS, CPU_IP)); | (port >> 1) & 1, dat, CPU_CS, CPU_EIP)); |
| if ((dat == 0) || (dat == 1)) { | if (!(dat & 0x80)) { |
| ideio.bank[(port >> 1) & 1] = dat; | ideio.bank[(port >> 1) & 1] = dat; |
| } | } |
| } | } |
| Line 157 static REG8 IOINPCALL ideio_i430(UINT po | Line 237 static REG8 IOINPCALL ideio_i430(UINT po |
| bank = (port >> 1) & 1; | bank = (port >> 1) & 1; |
| ret = ideio.bank[bank]; | ret = ideio.bank[bank]; |
| ideio.bank[bank] = ret & (~0x80); | ideio.bank[bank] = ret & (~0x80); |
| TRACEOUT(("ideio getbank%d %.2x [%.4x:%.4x]", | TRACEOUT(("ideio getbank%d %.2x [%.4x:%.8x]", |
| (port >> 1) & 1, ret, CPU_CS, CPU_IP)); | (port >> 1) & 1, ret, CPU_CS, CPU_EIP)); |
| return(ret); | return(ret & 0x81); |
| } | } |
| Line 170 static void IOOUTCALL ideio_o642(UINT po | Line 250 static void IOOUTCALL ideio_o642(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| drv->wp = dat; | if (drv) { |
| TRACEOUT(("ideio set WP %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); | drv->wp = dat; |
| TRACEOUT(("ideio set WP %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); | |
| } | |
| } | } |
| static void IOOUTCALL ideio_o644(UINT port, REG8 dat) { | static void IOOUTCALL ideio_o644(UINT port, REG8 dat) { |
| Line 179 static void IOOUTCALL ideio_o644(UINT po | Line 261 static void IOOUTCALL ideio_o644(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| drv->sc = dat; | if (drv) { |
| TRACEOUT(("ideio set SC %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); | drv->sc = dat; |
| TRACEOUT(("ideio set SC %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); | |
| } | |
| } | } |
| static void IOOUTCALL ideio_o646(UINT port, REG8 dat) { | static void IOOUTCALL ideio_o646(UINT port, REG8 dat) { |
| Line 188 static void IOOUTCALL ideio_o646(UINT po | Line 272 static void IOOUTCALL ideio_o646(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| drv->sn = dat; | if (drv) { |
| TRACEOUT(("ideio set SN %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); | drv->sn = dat; |
| TRACEOUT(("ideio set SN %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); | |
| } | |
| } | } |
| static void IOOUTCALL ideio_o648(UINT port, REG8 dat) { | static void IOOUTCALL ideio_o648(UINT port, REG8 dat) { |
| Line 197 static void IOOUTCALL ideio_o648(UINT po | Line 283 static void IOOUTCALL ideio_o648(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| drv->cy &= 0xff00; | if (drv) { |
| drv->cy |= dat; | drv->cy &= 0xff00; |
| TRACEOUT(("ideio set CYL %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); | drv->cy |= dat; |
| TRACEOUT(("ideio set CYL %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); | |
| } | |
| } | } |
| static void IOOUTCALL ideio_o64a(UINT port, REG8 dat) { | static void IOOUTCALL ideio_o64a(UINT port, REG8 dat) { |
| Line 207 static void IOOUTCALL ideio_o64a(UINT po | Line 295 static void IOOUTCALL ideio_o64a(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| drv->cy &= 0x00ff; | if (drv) { |
| drv->cy |= dat << 8; | drv->cy &= 0x00ff; |
| TRACEOUT(("ideio set CYH %.2x [%.4x:%.4x]", dat, CPU_CS, CPU_IP)); | 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) { | static void IOOUTCALL ideio_o64c(UINT port, REG8 dat) { |
| Line 217 static void IOOUTCALL ideio_o64c(UINT po | Line 307 static void IOOUTCALL ideio_o64c(UINT po |
| IDEDEV dev; | IDEDEV dev; |
| UINT drvnum; | UINT drvnum; |
| dev = getidedev(); | |
| if (dev == NULL) { | |
| return; | |
| } | |
| #if defined(TRACE) | #if defined(TRACE) |
| if ((dat & 0xf0) != 0xa0) { | if ((dat & 0xf0) != 0xa0) { |
| TRACEOUT(("ideio set SDH illegal param? (%.2x)", dat)); | TRACEOUT(("ideio set SDH illegal param? (%.2x)", dat)); |
| } | } |
| #endif | #endif |
| drvnum = (dat >> 4) & 1; | drvnum = (dat >> 4) & 1; |
| dev = getidedev(); | |
| dev->drivesel = drvnum; | dev->drivesel = drvnum; |
| dev->drv[drvnum].dr = dat & 0xf0; | dev->drv[drvnum].dr = dat & 0xf0; |
| dev->drv[drvnum].hd = dat & 0x0f; | 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) { | static void IOOUTCALL ideio_o64e(UINT port, REG8 dat) { |
| Line 235 static void IOOUTCALL ideio_o64e(UINT po | Line 328 static void IOOUTCALL ideio_o64e(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| if (drv == NULL) { | |
| return; | |
| } | |
| drv->cmd = dat; | 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) { | switch(dat) { |
| case 0x08: // atapi reset | case 0x08: // atapi reset |
| if (drv->device == IDETYPE_CDROM) { | if (drv->device == IDETYPE_CDROM) { |
| Line 298 static void IOOUTCALL ideio_o64e(UINT po | Line 394 static void IOOUTCALL ideio_o64e(UINT po |
| } | } |
| break; | break; |
| case 0xec: // indentify | case 0xa1: // identify |
| TRACEOUT(("ideio: indentify")); | case 0xec: // identify |
| TRACEOUT(("ideio: identify")); | |
| if (setidentify(drv) == SUCCESS) { | if (setidentify(drv) == SUCCESS) { |
| drv->status = IDESTAT_DRDY | IDESTAT_DSC | IDESTAT_DRQ; | drv->status = IDESTAT_DRDY | IDESTAT_DSC | IDESTAT_DRQ; |
| drv->error = 0; | drv->error = 0; |
| Line 311 static void IOOUTCALL ideio_o64e(UINT po | Line 408 static void IOOUTCALL ideio_o64e(UINT po |
| break; | break; |
| default: | default: |
| panic("command:%.2x", dat); | |
| break; | break; |
| } | } |
| } | } |
| Line 321 static void IOOUTCALL ideio_o74c(UINT po | Line 419 static void IOOUTCALL ideio_o74c(UINT po |
| REG8 modify; | REG8 modify; |
| dev = getidedev(); | dev = getidedev(); |
| if (dev == NULL) { | |
| return; | |
| } | |
| modify = dev->drv[0].ctrl ^ dat; | modify = dev->drv[0].ctrl ^ dat; |
| dev->drv[0].ctrl = dat; | dev->drv[0].ctrl = dat; |
| dev->drv[1].ctrl = dat; | dev->drv[1].ctrl = dat; |
| Line 342 static void IOOUTCALL ideio_o74c(UINT po | Line 443 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) { | 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)); |
| } | } |
| Line 358 static REG8 IOINPCALL ideio_i642(UINT po | Line 459 static REG8 IOINPCALL ideio_i642(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| drv->status &= ~IDESTAT_ERR; | if (drv) { |
| TRACEOUT(("ideio get error %.2x [%.4x:%.4x]", drv->error, CPU_CS, CPU_IP)); | drv->status &= ~IDESTAT_ERR; |
| return(drv->error); | 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) { | static REG8 IOINPCALL ideio_i644(UINT port) { |
| Line 368 static REG8 IOINPCALL ideio_i644(UINT po | Line 475 static REG8 IOINPCALL ideio_i644(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| TRACEOUT(("ideio get SC %.2x [%.4x:%.4x]", drv->sc, CPU_CS, CPU_IP)); | if (drv) { |
| return(drv->sc); | 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) { | static REG8 IOINPCALL ideio_i646(UINT port) { |
| Line 377 static REG8 IOINPCALL ideio_i646(UINT po | Line 489 static REG8 IOINPCALL ideio_i646(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| TRACEOUT(("ideio get SN %.2x [%.4x:%.4x]", drv->sn, CPU_CS, CPU_IP)); | if (drv) { |
| return(drv->sn); | 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) { | static REG8 IOINPCALL ideio_i648(UINT port) { |
| Line 386 static REG8 IOINPCALL ideio_i648(UINT po | Line 503 static REG8 IOINPCALL ideio_i648(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| TRACEOUT(("ideio get CYL %.4x [%.4x:%.4x]", drv->cy, CPU_CS, CPU_IP)); | if (drv) { |
| return((UINT8)drv->cy); | 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) { | static REG8 IOINPCALL ideio_i64a(UINT port) { |
| Line 395 static REG8 IOINPCALL ideio_i64a(UINT po | Line 517 static REG8 IOINPCALL ideio_i64a(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| TRACEOUT(("ideio get CYH %.4x [%.4x:%.4x]", drv->cy, CPU_CS, CPU_IP)); | if (drv) { |
| return((REG8)(drv->cy >> 8)); | 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) { | static REG8 IOINPCALL ideio_i64c(UINT port) { |
| Line 405 static REG8 IOINPCALL ideio_i64c(UINT po | Line 532 static REG8 IOINPCALL ideio_i64c(UINT po |
| REG8 ret; | REG8 ret; |
| drv = getidedrv(); | drv = getidedrv(); |
| ret = drv->dr | drv->hd; | if (drv) { |
| TRACEOUT(("ideio get DRHD %.2x [%.4x:%.4x]", ret, CPU_CS, CPU_IP)); | ret = drv->dr | drv->hd; |
| return(ret); | TRACEOUT(("ideio get DRHD %.2x [%.4x:%.8x]", ret, CPU_CS, CPU_EIP)); |
| return(ret); | |
| } | |
| else { | |
| return(0xff); | |
| } | |
| } | } |
| static REG8 IOINPCALL ideio_i64e(UINT port) { | static REG8 IOINPCALL ideio_i64e(UINT port) { |
| Line 415 static REG8 IOINPCALL ideio_i64e(UINT po | Line 547 static REG8 IOINPCALL ideio_i64e(UINT po |
| IDEDRV drv; | IDEDRV drv; |
| drv = getidedrv(); | drv = getidedrv(); |
| TRACEOUT(("ideio status %.2x [%.4x:%.4x]", drv->status, CPU_CS, CPU_IP)); | if (drv) { |
| return(drv->status); | 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) { | 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); | return(0xff); |
| } | } |
| Line 434 void IOOUTCALL ideio_w16(UINT port, REG1 | Line 572 void IOOUTCALL ideio_w16(UINT port, REG1 |
| BYTE *p; | BYTE *p; |
| drv = getidedrv(); | 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 = drv->buf + drv->bufpos; |
| p[0] = (BYTE)value; | p[0] = (BYTE)value; |
| p[1] = (BYTE)(value >> 8); | p[1] = (BYTE)(value >> 8); |
| TRACEOUT(("ide-data send %4x (%.4x) [%.4x:%.4x]", | TRACEOUT(("ide-data send %4x (%.4x) [%.4x:%.8x]", |
| value, drv->bufpos, CPU_CS, CPU_IP)); | value, drv->bufpos, CPU_CS, CPU_EIP)); |
| drv->bufpos += 2; | drv->bufpos += 2; |
| if (drv->bufpos >= drv->bufsize) { | if (drv->bufpos >= drv->bufsize) { |
| drv->status &= ~IDESTAT_DRQ; | drv->status &= ~IDESTAT_DRQ; |
| Line 454 void IOOUTCALL ideio_w16(UINT port, REG1 | Line 593 void IOOUTCALL ideio_w16(UINT port, REG1 |
| REG16 IOOUTCALL ideio_r16(UINT port) { | REG16 IOOUTCALL ideio_r16(UINT port) { |
| REG16 ret; | |
| IDEDRV drv; | IDEDRV drv; |
| REG16 ret; | |
| BYTE *p; | BYTE *p; |
| ret = 0; | |
| drv = getidedrv(); | drv = getidedrv(); |
| if (drv == NULL) { | |
| return(0xff); | |
| } | |
| ret = 0; | |
| if ((drv->status & IDESTAT_DRQ) && (drv->bufdir == IDEDIR_IN)) { | if ((drv->status & IDESTAT_DRQ) && (drv->bufdir == IDEDIR_IN)) { |
| p = drv->buf + drv->bufpos; | p = drv->buf + drv->bufpos; |
| ret = p[0] + (p[1] << 8); | ret = p[0] + (p[1] << 8); |
| TRACEOUT(("ide-data recv %4x (%.4x) [%.4x:%.4x]", | TRACEOUT(("ide-data recv %4x (%.4x) [%.4x:%.8x]", |
| ret, drv->bufpos, CPU_CS, CPU_IP)); | ret, drv->bufpos, CPU_CS, CPU_EIP)); |
| drv->bufpos += 2; | drv->bufpos += 2; |
| if (drv->bufpos >= drv->bufsize) { | if (drv->bufpos >= drv->bufsize) { |
| drv->status &= ~IDESTAT_DRQ; | drv->status &= ~IDESTAT_DRQ; |
| Line 525 void ideio_reset(void) { | Line 667 void ideio_reset(void) { |
| devinit(drv, i); | devinit(drv, i); |
| } | } |
| #if 1 // CD-ROM test | #if 0 // CD-ROM test |
| drv = ideio.dev[1].drv; | drv = ideio.dev[1].drv; |
| drv->hd = 0; | drv->hd = 0; |
| drv->sc = 1; | drv->sc = 1; |
| Line 547 void ideio_reset(void) { | Line 689 void ideio_reset(void) { |
| ideio.dev[1].drv[0].sxsidrv = 0x02; | ideio.dev[1].drv[0].sxsidrv = 0x02; |
| ideio.dev[1].drv[1].sxsidrv = 0x03; | ideio.dev[1].drv[1].sxsidrv = 0x03; |
| #endif | #endif |
| CopyMemory(mem + 0xd0000, idebios, sizeof(idebios)); | |
| TRACEOUT(("use simulate ide.rom")); | |
| } | } |
| void ideio_bind(void) { | void ideio_bind(void) { |