seek head/play CD audio/read data sectors */
| 1046 | |
| 1047 | /* seek head/play CD audio/read data sectors */ |
| 1048 | static int cdrom_command_multi (void) |
| 1049 | { |
| 1050 | int seekpos = msf2lsn (fromlongbcd (cdrom_command_buffer + 1)); |
| 1051 | int endpos = msf2lsn (fromlongbcd (cdrom_command_buffer + 4)); |
| 1052 | |
| 1053 | if (cdrom_playing) |
| 1054 | cdaudiostop (); |
| 1055 | cdrom_paused = 0; |
| 1056 | cdrom_speed = (cdrom_command_buffer[8] & 0x40) ? 2 : 1; |
| 1057 | cdrom_result_buffer[0] = cdrom_command; |
| 1058 | cdrom_result_buffer[1] = 0; |
| 1059 | if (!cdrom_disk) { |
| 1060 | cdrom_result_buffer[1] = 1; // no disk |
| 1061 | return 2; |
| 1062 | } |
| 1063 | |
| 1064 | if (cdrom_command_buffer[7] & 0x80) { /* data read */ |
| 1065 | #if AKIKO_DEBUG_IO_CMD |
| 1066 | int cdrom_data_offset_end = endpos; |
| 1067 | #endif |
| 1068 | cdrom_data_offset = seekpos; |
| 1069 | cdrom_seek_delay = abs (cdrom_current_sector - cdrom_data_offset); |
| 1070 | if (cdrom_seek_delay < 100 || currprefs.cd_speed == 0) { |
| 1071 | cdrom_seek_delay = 1; |
| 1072 | } else { |
| 1073 | cdrom_seek_delay /= 1000; |
| 1074 | cdrom_seek_delay += 10; |
| 1075 | if (cdrom_seek_delay > 100) |
| 1076 | cdrom_seek_delay = 100; |
| 1077 | } |
| 1078 | #if AKIKO_DEBUG_IO_CMD |
| 1079 | if (log_cd32 > 0) |
| 1080 | write_log (_T("CD32: READ DATA %06X (%d) - %06X (%d) SPD=%dx PC=%08X\n"), |
| 1081 | seekpos, cdrom_data_offset, endpos, cdrom_data_offset_end, cdrom_speed, M68K_GETPC); |
| 1082 | #endif |
| 1083 | cdrom_result_buffer[1] |= 0x02; |
| 1084 | } else { /* play audio */ |
| 1085 | #if AKIKO_DEBUG_IO_CMD |
| 1086 | int scan = 0; |
| 1087 | if (cdrom_command_buffer[7] & 0x04) |
| 1088 | scan = 1; |
| 1089 | else if (cdrom_command_buffer[7] & 0x08) |
| 1090 | scan = -1; |
| 1091 | if (log_cd32 > 0) |
| 1092 | write_log (_T("CD32: PLAY FROM %06X (%d) to %06X (%d) SCAN=%d\n"), |
| 1093 | lsn2msf(seekpos), seekpos, lsn2msf(endpos), endpos, scan); |
| 1094 | #endif |
| 1095 | // offset 10, bit 2 set: don't send subchannel data |
| 1096 | if (seekpos < 0) { |
| 1097 | cdrom_toc_counter = 0; |
| 1098 | } else { |
| 1099 | cdrom_toc_counter = -1; |
| 1100 | cdrom_result_buffer[1] = 0x42; // play command starting? |
| 1101 | cdrom_playing = 1; |
| 1102 | if (!cd_play_audio (seekpos, endpos, 0)) { |
| 1103 | // play didn't start, report it in next status packet |
| 1104 | cdrom_audiotimeout = -3; |
| 1105 | } |
no test coverage detected