comparison cdd_mcu.c @ 2516:69c28808b49a

Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
author Michael Pavone <pavone@retrodev.com>
date Sat, 05 Oct 2024 01:03:57 -0700
parents bcfa5e272f5e
children
comparison
equal deleted inserted replaced
2515:0775f5e0c468 2516:69c28808b49a
219 context->head_pba++; 219 context->head_pba++;
220 if (context->media && context->media->type == MEDIA_CDROM && context->media->num_tracks) { 220 if (context->media && context->media->type == MEDIA_CDROM && context->media->num_tracks) {
221 if (context->head_pba > 3*(context->media->num_tracks + 2)) { 221 if (context->head_pba > 3*(context->media->num_tracks + 2)) {
222 context->toc_valid = 1; 222 context->toc_valid = 1;
223 context->seeking = 1; 223 context->seeking = 1;
224 context->seek_pba = LEADIN_SECTORS + context->media->tracks[0].start_lba + context->media->tracks[0].fake_pregap; 224 context->seek_pba = LEADIN_SECTORS + context->media->tracks[0].start_lba;
225 context->status = DS_PAUSE; 225 context->status = DS_PAUSE;
226 } 226 }
227 227
228 } else { 228 } else {
229 context->status = DS_NO_DISC; 229 context->status = DS_NO_DISC;
265 if (context->toc_valid && context->head_pba >= LEADIN_SECTORS) { 265 if (context->toc_valid && context->head_pba >= LEADIN_SECTORS) {
266 uint32_t lba =context->head_pba - LEADIN_SECTORS; 266 uint32_t lba =context->head_pba - LEADIN_SECTORS;
267 for (uint32_t i = 0; i < context->media->num_tracks; i++) 267 for (uint32_t i = 0; i < context->media->num_tracks; i++)
268 { 268 {
269 if (lba < context->media->tracks[i].end_lba) { 269 if (lba < context->media->tracks[i].end_lba) {
270 if (context->media->tracks[i].fake_pregap) {
271 if (lba > context->media->tracks[i].fake_pregap) {
272 lba -= context->media->tracks[i].fake_pregap;
273 } else {
274 //relative time counts down to 0 in pregap
275 lba = context->media->tracks[i].fake_pregap - lba;
276 break;
277 }
278 }
279 if (lba < context->media->tracks[i].start_lba) { 270 if (lba < context->media->tracks[i].start_lba) {
280 //relative time counts down to 0 in pregap 271 //relative time counts down to 0 in pregap
281 lba = context->media->tracks[i].start_lba - lba; 272 lba = context->media->tracks[i].start_lba - lba;
282 } else { 273 } else {
283 lba -= context->media->tracks[i].start_lba; 274 lba -= context->media->tracks[i].start_lba;
284 } 275 }
285 break; 276 break;
286 } else if (context->media->tracks[i].fake_pregap) {
287 lba -= context->media->tracks[i].fake_pregap;
288 } 277 }
289 } 278 }
290 lba_to_status(context, lba); 279 lba_to_status(context, lba);
291 context->status_buffer.format = SF_RELATIVE; 280 context->status_buffer.format = SF_RELATIVE;
292 } else { 281 } else {
298 uint32_t lba =context->head_pba - LEADIN_SECTORS; 287 uint32_t lba =context->head_pba - LEADIN_SECTORS;
299 uint32_t i; 288 uint32_t i;
300 for (i = 0; i < context->media->num_tracks; i++) 289 for (i = 0; i < context->media->num_tracks; i++)
301 { 290 {
302 if (lba < context->media->tracks[i].end_lba) { 291 if (lba < context->media->tracks[i].end_lba) {
303 if (context->media->tracks[i].fake_pregap) {
304 if (lba > context->media->tracks[i].fake_pregap) {
305 lba -= context->media->tracks[i].fake_pregap;
306 } else {
307 //relative time counts down to 0 in pregap
308 lba = context->media->tracks[i].fake_pregap - lba;
309 break;
310 }
311 }
312 if (lba < context->media->tracks[i].start_lba) {
313 //relative time counts down to 0 in pregap
314 lba = context->media->tracks[i].start_lba - lba;
315 } else {
316 lba -= context->media->tracks[i].start_lba;
317 }
318 break; 292 break;
319 } else if (context->media->tracks[i].fake_pregap) {
320 lba -= context->media->tracks[i].fake_pregap;
321 } 293 }
322 } 294 }
323 context->status_buffer.b.track.track_high = (i + 1) / 10; 295 context->status_buffer.b.track.track_high = (i + 1) / 10;
324 context->status_buffer.b.track.track_low = (i + 1) % 10; 296 context->status_buffer.b.track.track_low = (i + 1) % 10;
325 if (context->media->tracks[i].type == TRACK_DATA) { 297 if (context->media->tracks[i].type == TRACK_DATA) {
335 context->status_buffer.format = SF_NOTREADY; 307 context->status_buffer.format = SF_NOTREADY;
336 } 308 }
337 break; 309 break;
338 case SF_TOCO: 310 case SF_TOCO:
339 if (context->toc_valid) { 311 if (context->toc_valid) {
340 uint32_t total_fake_pregap = 0; 312 lba_to_status(context, context->media->tracks[context->media->num_tracks - 1].end_lba);
341 for (uint32_t i = 0; i < context->media->num_tracks; i++)
342 {
343 total_fake_pregap += context->media->tracks[i].fake_pregap;
344 }
345 lba_to_status(context, context->media->tracks[context->media->num_tracks - 1].end_lba + total_fake_pregap);
346 context->status_buffer.format = SF_TOCO; 313 context->status_buffer.format = SF_TOCO;
347 } else { 314 } else {
348 context->status_buffer.format = SF_NOTREADY; 315 context->status_buffer.format = SF_NOTREADY;
349 } 316 }
350 break; 317 break;
365 if (context->requested_track > context->media->num_tracks) { 332 if (context->requested_track > context->media->num_tracks) {
366 printf("track number %d is bad\n", context->requested_track); 333 printf("track number %d is bad\n", context->requested_track);
367 exit(0); 334 exit(0);
368 } 335 }
369 uint32_t lba = context->media->tracks[context->requested_track - 1].start_lba; 336 uint32_t lba = context->media->tracks[context->requested_track - 1].start_lba;
370 for (uint32_t i = 0; i < context->requested_track; i++) {
371 lba += context->media->tracks[i].fake_pregap;
372 }
373 lba_to_status(context, lba); 337 lba_to_status(context, lba);
374 if (context->media->tracks[context->requested_track - 1].type == TRACK_DATA) { 338 if (context->media->tracks[context->requested_track - 1].type == TRACK_DATA) {
375 context->status_buffer.b.tocn.frame_high |= 0x8; 339 context->status_buffer.b.tocn.frame_high |= 0x8;
376 } 340 }
377 context->status_buffer.b.tocn.track_low = context->requested_track % 10; 341 context->status_buffer.b.tocn.track_low = context->requested_track % 10;
460 context->cmd_buffer.cmd_type == CMD_READ ? "READ" : "SEEK", lba, 424 context->cmd_buffer.cmd_type == CMD_READ ? "READ" : "SEEK", lba,
461 context->cmd_buffer.b.time.min_high, context->cmd_buffer.b.time.min_low, 425 context->cmd_buffer.b.time.min_high, context->cmd_buffer.b.time.min_low,
462 context->cmd_buffer.b.time.sec_high, context->cmd_buffer.b.time.sec_low, 426 context->cmd_buffer.b.time.sec_high, context->cmd_buffer.b.time.sec_low,
463 context->cmd_buffer.b.time.frame_high, context->cmd_buffer.b.time.frame_low 427 context->cmd_buffer.b.time.frame_high, context->cmd_buffer.b.time.frame_low
464 ); 428 );
465 if (lba >= context->media->tracks[0].fake_pregap + context->media->tracks[context->media->num_tracks - 1].end_lba) { 429 if (lba >= context->media->tracks[context->media->num_tracks - 1].end_lba) {
466 context->error_status = DS_CMD_ERROR; 430 context->error_status = DS_CMD_ERROR;
467 break; 431 break;
468 } 432 }
469 context->seek_pba = lba + LEADIN_SECTORS - 3; 433 context->seek_pba = lba + LEADIN_SECTORS - 3;
470 if (context->cmd_buffer.cmd_type == CMD_SEEK) { 434 if (context->cmd_buffer.cmd_type == CMD_SEEK) {
532 context->error_status = DS_CMD_ERROR; 496 context->error_status = DS_CMD_ERROR;
533 break; 497 break;
534 } 498 }
535 if (context->status == DS_STOP) { 499 if (context->status == DS_STOP) {
536 context->seeking = 1; 500 context->seeking = 1;
537 context->seek_pba = LEADIN_SECTORS + context->media->tracks[0].fake_pregap + context->media->tracks[0].start_lba; 501 context->seek_pba = LEADIN_SECTORS + context->media->tracks[0].start_lba;
538 printf("CDD CMD: PAUSE, seeking to %u\n", context->seek_pba); 502 printf("CDD CMD: PAUSE, seeking to %u\n", context->seek_pba);
539 } else { 503 } else {
540 uint32_t lba = context->head_pba - LEADIN_SECTORS; 504 uint32_t lba = context->head_pba - LEADIN_SECTORS;
541 uint32_t seconds = lba / 75; 505 uint32_t seconds = lba / 75;
542 uint32_t frames = lba % 75; 506 uint32_t frames = lba % 75;
570 context->error_status = DS_CMD_ERROR; 534 context->error_status = DS_CMD_ERROR;
571 break; 535 break;
572 } 536 }
573 if (context->status == DS_STOP || context->status == DS_TOC_READ) { 537 if (context->status == DS_STOP || context->status == DS_TOC_READ) {
574 context->seeking = 1; 538 context->seeking = 1;
575 context->seek_pba = LEADIN_SECTORS + context->media->tracks[0].fake_pregap + context->media->tracks[0].start_lba - 4; 539 context->seek_pba = LEADIN_SECTORS + context->media->tracks[0].start_lba - 4;
576 printf("CDD CMD: PLAY, seeking to %u\n", context->seek_pba); 540 printf("CDD CMD: PLAY, seeking to %u\n", context->seek_pba);
577 } else { 541 } else {
578 puts("CDD CMD: PLAY"); 542 puts("CDD CMD: PLAY");
579 } 543 }
580 context->status = DS_PLAY; 544 context->status = DS_PLAY;