MCPcopy Create free account
hub / github.com/BlitterStudio/amiberry / cdrom_command_multi

Function cdrom_command_multi

src/akiko.cpp:1048–1109  ·  view source on GitHub ↗

seek head/play CD audio/read data sectors */

Source from the content-addressed store, hash-verified

1046
1047/* seek head/play CD audio/read data sectors */
1048static 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 }

Callers 1

cdrom_run_command_runFunction · 0.85

Calls 6

msf2lsnFunction · 0.85
fromlongbcdFunction · 0.85
lsn2msfFunction · 0.85
cd_play_audioFunction · 0.85
cdaudiostopFunction · 0.70
write_logFunction · 0.70

Tested by

no test coverage detected