| 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 */ | 
 |  |  |