| 705 | /* read qcode */ |
| 706 | static int last_play_pos; |
| 707 | static int cd_qcode (uae_u8 *d) |
| 708 | { |
| 709 | uae_u8 *buf, *s, as; |
| 710 | |
| 711 | if (d) |
| 712 | memset (d, 0, 11); |
| 713 | last_play_pos = 0; |
| 714 | buf = qcode_buf; |
| 715 | as = buf[1]; |
| 716 | buf[2] = 0x80; |
| 717 | if (!qcode_valid) |
| 718 | return 0; |
| 719 | if (cdrom_audiostatus != AUDIO_STATUS_IN_PROGRESS && cdrom_audiostatus != AUDIO_STATUS_PAUSED) |
| 720 | return 0; |
| 721 | s = buf + 4; |
| 722 | last_play_pos = msf2lsn (fromlongbcd (s + 7)); |
| 723 | if (!d) |
| 724 | return 0; |
| 725 | buf[2] = 0; |
| 726 | /* ??? */ |
| 727 | d[0] = 0; |
| 728 | /* CtlAdr */ |
| 729 | d[1] = s[0]; |
| 730 | /* Track */ |
| 731 | d[2] = s[1]; |
| 732 | /* Index */ |
| 733 | d[3] = s[2]; |
| 734 | /* TrackPos */ |
| 735 | d[4] = s[3]; |
| 736 | d[5] = s[4]; |
| 737 | d[6] = s[5]; |
| 738 | /* DiskPos */ |
| 739 | d[7] = 0; |
| 740 | d[8] = s[7]; |
| 741 | d[9] = s[8]; |
| 742 | d[10] = s[9]; |
| 743 | if (as == AUDIO_STATUS_IN_PROGRESS) { |
| 744 | /* Make sure end of disc position is not missed. |
| 745 | */ |
| 746 | if (last_play_pos >= cdrom_toc_cd_buffer.lastaddress || cdrom_toc_cd_buffer.lastaddress - last_play_pos < 10) { |
| 747 | int msf = lsn2msf (cdrom_toc_cd_buffer.lastaddress); |
| 748 | d[8] = tobcd ((uae_u8)(msf >> 16)); |
| 749 | d[9] = tobcd ((uae_u8)(msf >> 8)); |
| 750 | d[10] = tobcd ((uae_u8)(msf >> 0)); |
| 751 | } |
| 752 | } |
| 753 | // write_log (_T("%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X\n"), |
| 754 | // d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], d[11]); |
| 755 | return 0; |
| 756 | } |
| 757 | |
| 758 | /* read toc */ |
| 759 | static int get_cdrom_toc (void) |
no test coverage detected