|
|
| version 1.8, 2005/04/05 20:37:07 | version 1.10, 2005/04/06 17:44:09 |
|---|---|
| Line 539 static void storemsf(UINT8 *ptr, UINT32 | Line 539 static void storemsf(UINT8 *ptr, UINT32 |
| } | } |
| // 0x43: READ SUB CHANNEL | // 0x42: READ SUB CHANNEL |
| static void atapi_cmd_readsubch(IDEDRV drv) { | static void atapi_cmd_readsubch(IDEDRV drv) { |
| SXSIDEV sxsi; | SXSIDEV sxsi; |
| UINT subq; | |
| UINT cmd; | |
| UINT leng; | UINT leng; |
| CDTRK trk; | CDTRK trk; |
| UINT tracks; | UINT tracks; |
| Line 557 static void atapi_cmd_readsubch(IDEDRV d | Line 559 static void atapi_cmd_readsubch(IDEDRV d |
| } | } |
| trk = sxsicd_gettrk(sxsi, &tracks); | trk = sxsicd_gettrk(sxsi, &tracks); |
| leng = (drv->buf[7] << 8) + drv->buf[8]; | leng = (drv->buf[7] << 8) + drv->buf[8]; |
| switch(drv->buf[3]) { | subq = drv->buf[2] & 0x40; |
| cmd = drv->buf[3]; | |
| drv->buf[0] = 0; | |
| drv->buf[1] = (UINT8)drv->daflag; | |
| drv->buf[2] = 0; | |
| drv->buf[3] = 0; | |
| if (!subq) { | |
| senddata(drv, 4, leng); | |
| return; | |
| } | |
| switch(cmd) { | |
| case 0x01: // CD-ROM current pos | case 0x01: // CD-ROM current pos |
| ZeroMemory(drv->buf, 16); | ZeroMemory(drv->buf + 4, 12); |
| drv->buf[3] = 0x12; | |
| drv->buf[4] = 0x01; | drv->buf[4] = 0x01; |
| pos = drv->dacurpos + (rand() & 7); | if (drv->daflag != 0x15) { |
| r = tracks; | pos = drv->dacurpos; |
| while(r) { | if ((drv->daflag == 0x12) || (drv->daflag == 0x13)) { |
| r--; | pos += (rand() & 7); |
| if (trk[r].pos <= pos) { | |
| break; | |
| } | } |
| r = tracks; | |
| while(r) { | |
| r--; | |
| if (trk[r].pos <= pos) { | |
| break; | |
| } | |
| } | |
| drv->buf[5] = trk[r].type; | |
| drv->buf[6] = trk[r].track; | |
| drv->buf[7] = 1; | |
| storemsf(drv->buf + 8, pos + 150); | |
| storemsf(drv->buf + 12, pos - trk[r].pos); | |
| } | } |
| drv->buf[5] = trk[r].type; | |
| drv->buf[6] = trk[r].track; | |
| drv->buf[7] = 1; | |
| storemsf(drv->buf + 8, pos + 150); | |
| storemsf(drv->buf + 12, pos - trk[r].pos); | |
| senddata(drv, 16, leng); | senddata(drv, 16, leng); |
| break; | break; |
| Line 647 static void atapi_cmd_readtoc(IDEDRV drv | Line 666 static void atapi_cmd_readtoc(IDEDRV drv |
| static void atapi_cmd_playaudiomsf(IDEDRV drv) { | static void atapi_cmd_playaudiomsf(IDEDRV drv) { |
| UINT32 pos; | UINT32 pos; |
| UINT32 leng; | |
| pos = (((drv->buf[6] * 60) + drv->buf[7]) * 75) + drv->buf[8]; | pos = (((drv->buf[3] * 60) + drv->buf[4]) * 75) + drv->buf[5]; |
| leng = (((drv->buf[6] * 60) + drv->buf[7]) * 75) + drv->buf[8]; | |
| if (leng > pos) { | |
| leng -= pos; | |
| } | |
| else { | |
| leng = 0; | |
| } | |
| if (pos >= 150) { | if (pos >= 150) { |
| pos -= 150; | pos -= 150; |
| } | } |
| else { | else { |
| pos = 0; | pos = 0; |
| } | } |
| drv->daendpos = pos; | ideio.daplaying |= 1 << (drv->sxsidrv & 3); |
| drv->dacurpos = pos; // 終了したことにする。 | drv->daflag = 0x11; |
| drv->dacurpos = pos; | |
| drv->dalength = leng; | |
| drv->dabufrem = 0; | |
| cmddone(drv); | cmddone(drv); |
| } | } |
| // 0x4B: PAUSE RESUME | // 0x4B: PAUSE RESUME |
| static void atapi_cmd_pauseresume(IDEDRV drv) { | static void atapi_cmd_pauseresume(IDEDRV drv) { |
| if (drv->buf[8] & 1) { | |
| // resume | |
| if (drv->daflag == 0x12) { | |
| ideio.daplaying |= 1 << (drv->sxsidrv & 3); | |
| drv->daflag = 0x11; | |
| } | |
| } | |
| else { | |
| // pause | |
| if (drv->daflag == 0x11) { | |
| ideio.daplaying &= ~(1 << (drv->sxsidrv & 3)); | |
| drv->daflag = 0x12; | |
| } | |
| } | |
| cmddone(drv); | cmddone(drv); |
| } | } |