Mercurial > repos > blastem
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; |