|
|
| version 1.7, 2005/04/05 13:48:09 | version 1.9, 2005/04/06 16:46:07 |
|---|---|
| Line 117 static void atapi_cmd_mode_select(IDEDRV | Line 117 static void atapi_cmd_mode_select(IDEDRV |
| static void atapi_cmd_mode_sense(IDEDRV drv); | static void atapi_cmd_mode_sense(IDEDRV drv); |
| static void atapi_cmd_readsubch(IDEDRV drv); | static void atapi_cmd_readsubch(IDEDRV drv); |
| static void atapi_cmd_readtoc(IDEDRV drv); | static void atapi_cmd_readtoc(IDEDRV drv); |
| static void atapi_cmd_playaudiomsf(IDEDRV drv); | |
| static void atapi_cmd_pauseresume(IDEDRV drv); | |
| void atapicmd_a0(IDEDRV drv) { | void atapicmd_a0(IDEDRV drv) { |
| Line 205 void atapicmd_a0(IDEDRV drv) { | Line 207 void atapicmd_a0(IDEDRV drv) { |
| atapi_cmd_readtoc(drv); | atapi_cmd_readtoc(drv); |
| break; | break; |
| case 0x47: // Play Audio MSF | |
| TRACEOUT(("atapicmd: Play Audio MSF")); | |
| atapi_cmd_playaudiomsf(drv); | |
| break; | |
| case 0x4b: | |
| TRACEOUT(("atapicmd: pause resume")); | |
| atapi_cmd_pauseresume(drv); | |
| break; | |
| default: | default: |
| TRACEOUT(("atapicmd: unknown command = %.2x", cmd)); | TRACEOUT(("atapicmd: unknown command = %.2x", cmd)); |
| sendabort(drv); | sendabort(drv); |
| Line 509 length_exceeded: | Line 521 length_exceeded: |
| } | } |
| // ---- Audio | |
| static void storemsf(UINT8 *ptr, UINT32 pos) { | |
| UINT f; | |
| UINT m; | |
| f = pos % 75; | |
| pos = pos / 75; | |
| m = pos % 60; | |
| pos = pos / 60; | |
| ptr[0] = 0; | |
| ptr[1] = (UINT8)pos; | |
| ptr[2] = (UINT8)m; | |
| ptr[3] = (UINT8)f; | |
| } | |
| // 0x43: READ SUB CHANNEL | |
| static void atapi_cmd_readsubch(IDEDRV drv) { | static void atapi_cmd_readsubch(IDEDRV drv) { |
| SXSIDEV sxsi; | SXSIDEV sxsi; |
| UINT leng; | UINT leng; |
| CDTRK trk; | |
| UINT tracks; | |
| UINT r; | |
| UINT32 pos; | |
| sxsi = sxsi_getptr(drv->sxsidrv); | sxsi = sxsi_getptr(drv->sxsidrv); |
| if ((sxsi == NULL) || (sxsi->devtype != SXSIDEV_CDROM) || | if ((sxsi == NULL) || (sxsi->devtype != SXSIDEV_CDROM) || |
| Line 520 static void atapi_cmd_readsubch(IDEDRV d | Line 555 static void atapi_cmd_readsubch(IDEDRV d |
| senderror(drv); | senderror(drv); |
| return; | return; |
| } | } |
| 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]) { | switch(drv->buf[3]) { |
| case 0x01: // CD-ROM current pos | case 0x01: // CD-ROM current pos |
| ZeroMemory(drv->buf, 16); | ZeroMemory(drv->buf, 16); |
| drv->buf[4] = 0x01; | drv->buf[4] = 0x01; |
| pos = drv->dacurpos; | |
| if (drv->daflag & 2) { | |
| pos += (rand() & 7); | |
| } | |
| 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); | |
| senddata(drv, 16, leng); | senddata(drv, 16, leng); |
| break; | break; |
| Line 534 static void atapi_cmd_readsubch(IDEDRV d | Line 586 static void atapi_cmd_readsubch(IDEDRV d |
| } | } |
| } | } |
| // 0x43: READ TOC | |
| static void atapi_cmd_readtoc(IDEDRV drv) { | static void atapi_cmd_readtoc(IDEDRV drv) { |
| SXSIDEV sxsi; | SXSIDEV sxsi; |
| UINT leng; | UINT leng; |
| UINT format; | UINT format; |
| CDTRK trk; | |
| UINT tracks; | |
| UINT datasize; | UINT datasize; |
| UINT8 *ptr; | |
| UINT i; | |
| sxsi = sxsi_getptr(drv->sxsidrv); | sxsi = sxsi_getptr(drv->sxsidrv); |
| if ((sxsi == NULL) || (sxsi->devtype != SXSIDEV_CDROM) || | if ((sxsi == NULL) || (sxsi->devtype != SXSIDEV_CDROM) || |
| Line 547 static void atapi_cmd_readtoc(IDEDRV drv | Line 604 static void atapi_cmd_readtoc(IDEDRV drv |
| senderror(drv); | senderror(drv); |
| return; | return; |
| } | } |
| trk = sxsicd_gettrk(sxsi, &tracks); | |
| leng = (drv->buf[7] << 8) + drv->buf[8]; | leng = (drv->buf[7] << 8) + drv->buf[8]; |
| format = (drv->buf[9] >> 6); | format = (drv->buf[9] >> 6); |
| Line 554 static void atapi_cmd_readtoc(IDEDRV drv | Line 612 static void atapi_cmd_readtoc(IDEDRV drv |
| switch (format) { | switch (format) { |
| case 0: // track info | case 0: // track info |
| datasize = sxsicd_gettocinfo(sxsi, drv->buf + 2); | datasize = (tracks * 8) + 10; |
| drv->buf[0] = (UINT8)(datasize >> 8); | drv->buf[0] = (UINT8)(datasize >> 8); |
| drv->buf[1] = (UINT8)(datasize >> 0); | drv->buf[1] = (UINT8)(datasize >> 0); |
| senddata(drv, datasize + 2, leng); | drv->buf[2] = 1; |
| drv->buf[3] = (UINT8)tracks; | |
| ptr = drv->buf + 4; | |
| for (i=0; i<=tracks; i++) { | |
| ptr[0] = 0; | |
| ptr[1] = trk[i].type; | |
| ptr[2] = trk[i].track; | |
| ptr[3] = 0; | |
| storemsf(ptr + 4, trk[i].pos + 150); | |
| ptr += 8; | |
| } | |
| senddata(drv, (tracks * 8) + 12, leng); | |
| break; | break; |
| case 1: // multi session | case 1: // multi session |
| Line 577 static void atapi_cmd_readtoc(IDEDRV drv | Line 646 static void atapi_cmd_readtoc(IDEDRV drv |
| } | } |
| } | } |
| // 0x47: Play Audio MSF | |
| static void atapi_cmd_playaudiomsf(IDEDRV drv) { | |
| UINT32 pos; | |
| UINT32 leng; | |
| 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) { | |
| pos -= 150; | |
| } | |
| else { | |
| pos = 0; | |
| } | |
| ideio.daplaying |= 1 << (drv->sxsidrv & 3); | |
| drv->daflag = 1; | |
| drv->dacurpos = pos; | |
| drv->dalength = leng; | |
| drv->dabufrem = 0; | |
| cmddone(drv); | |
| } | |
| // 0x4B: PAUSE RESUME | |
| static void atapi_cmd_pauseresume(IDEDRV drv) { | |
| cmddone(drv); | |
| } | |
| #endif /* SUPPORT_IDEIO */ | #endif /* SUPPORT_IDEIO */ |