Mercurial > repos > blastem
comparison cdimage.c @ 2116:cd057d6fe030
Initial stab at subcode emulation
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Mar 2022 22:03:52 -0800 |
parents | 2449c88cea36 |
children | bb478feccca2 |
comparison
equal
deleted
inserted
replaced
2115:e93ced356a21 | 2116:cd057d6fe030 |
---|---|
104 fprintf(stderr, "bin_seek to sector %u, adjusted lba %u, track %u\n", sector, lba, track); | 104 fprintf(stderr, "bin_seek to sector %u, adjusted lba %u, track %u\n", sector, lba, track); |
105 media->cur_track = track; | 105 media->cur_track = track; |
106 if (!media->in_fake_pregap) { | 106 if (!media->in_fake_pregap) { |
107 if (track) { | 107 if (track) { |
108 lba -= media->tracks[track - 1].end_lba; | 108 lba -= media->tracks[track - 1].end_lba; |
109 } | |
110 if (media->tracks[track].has_subcodes) { | |
111 if (!media->tmp_buffer) { | |
112 media->tmp_buffer = calloc(1, 96); | |
113 } | |
114 fseek(media->tracks[track].f, media->tracks[track].file_offset + (lba + 1) * media->tracks[track].sector_bytes - 96, SEEK_SET); | |
115 int bytes = fread(media->tmp_buffer, 1, 96, media->tracks[track].f); | |
116 if (bytes != 96) { | |
117 fprintf(stderr, "Only read %d subcode bytes\n", bytes); | |
118 } | |
109 } | 119 } |
110 fseek(media->tracks[track].f, media->tracks[track].file_offset + lba * media->tracks[track].sector_bytes, SEEK_SET); | 120 fseek(media->tracks[track].f, media->tracks[track].file_offset + lba * media->tracks[track].sector_bytes, SEEK_SET); |
111 } | 121 } |
112 } | 122 } |
113 return track; | 123 return track; |
149 } | 159 } |
150 media->byte_storage = fgetc(media->tracks[media->cur_track].f); | 160 media->byte_storage = fgetc(media->tracks[media->cur_track].f); |
151 } | 161 } |
152 return fgetc(media->tracks[media->cur_track].f); | 162 return fgetc(media->tracks[media->cur_track].f); |
153 } | 163 } |
164 } | |
165 | |
166 static uint8_t bin_subcode_read(system_media *media, uint32_t offset) | |
167 { | |
168 if (media->in_fake_pregap || !media->tracks[media->cur_track].has_subcodes) { | |
169 //TODO: Fake PQ subcodes | |
170 return 0; | |
171 } | |
172 //TODO: Translate "cooked" subcodes back to raw format | |
173 return media->tmp_buffer[offset]; | |
154 } | 174 } |
155 | 175 |
156 uint8_t parse_cue(system_media *media) | 176 uint8_t parse_cue(system_media *media) |
157 { | 177 { |
158 char *line = media->buffer; | 178 char *line = media->buffer; |
316 } | 336 } |
317 } else if (!tracks[0].start_lba && !tracks[0].fake_pregap) { | 337 } else if (!tracks[0].start_lba && !tracks[0].fake_pregap) { |
318 tracks[0].fake_pregap = 2 * 75; | 338 tracks[0].fake_pregap = 2 * 75; |
319 } | 339 } |
320 | 340 |
321 fseek(tracks[0].f, tracks[0].sector_bytes == 2352 ? 16 : 0, SEEK_SET); | 341 fseek(tracks[0].f, tracks[0].sector_bytes >= 2352 ? 16 : 0, SEEK_SET); |
322 media->size = fread(media->buffer, 1, 2048, tracks[0].f); | 342 media->size = fread(media->buffer, 1, 2048, tracks[0].f); |
323 media->seek = bin_seek; | 343 media->seek = bin_seek; |
324 media->read = bin_read; | 344 media->read = bin_read; |
345 media->read_subcodes = bin_subcode_read; | |
325 } | 346 } |
326 uint8_t valid = media->num_tracks > 0 && media->tracks[0].f != NULL; | 347 uint8_t valid = media->num_tracks > 0 && media->tracks[0].f != NULL; |
327 media->type = valid ? MEDIA_CDROM : MEDIA_CART; | 348 media->type = valid ? MEDIA_CDROM : MEDIA_CART; |
328 return valid; | 349 return valid; |
329 } | 350 } |
377 cmd = cmd_start_sameline(cmd); | 398 cmd = cmd_start_sameline(cmd); |
378 if (*cmd && *cmd != '\n') { | 399 if (*cmd && *cmd != '\n') { |
379 //TODO: record whether subcode is in raw format or not | 400 //TODO: record whether subcode is in raw format or not |
380 if (startswith(cmd, "RW_RAW")) { | 401 if (startswith(cmd, "RW_RAW")) { |
381 tracks[track].sector_bytes += 96; | 402 tracks[track].sector_bytes += 96; |
403 tracks[track].has_subcodes = SUBCODES_RAW; | |
382 } else if (startswith(cmd, "RW")) { | 404 } else if (startswith(cmd, "RW")) { |
383 tracks[track].sector_bytes += 96; | 405 tracks[track].sector_bytes += 96; |
406 tracks[track].has_subcodes = SUBCODES_COOKED; | |
384 } | 407 } |
385 } | 408 } |
386 } | 409 } |
387 if (track) { | 410 if (track) { |
388 tracks[track].start_lba = tracks[track].pregap_lba = tracks[track].end_lba = tracks[track-1].end_lba; | 411 tracks[track].start_lba = tracks[track].pregap_lba = tracks[track].end_lba = tracks[track-1].end_lba; |
483 | 506 |
484 fseek(tracks[0].f, tracks[0].sector_bytes == 2352 ? 16 : 0, SEEK_SET); | 507 fseek(tracks[0].f, tracks[0].sector_bytes == 2352 ? 16 : 0, SEEK_SET); |
485 media->size = fread(media->buffer, 1, 2048, tracks[0].f); | 508 media->size = fread(media->buffer, 1, 2048, tracks[0].f); |
486 media->seek = bin_seek; | 509 media->seek = bin_seek; |
487 media->read = bin_read; | 510 media->read = bin_read; |
511 media->read_subcodes = bin_subcode_read; | |
488 } | 512 } |
489 uint8_t valid = media->num_tracks > 0 && media->tracks[0].f != NULL; | 513 uint8_t valid = media->num_tracks > 0 && media->tracks[0].f != NULL; |
490 media->type = valid ? MEDIA_CDROM : MEDIA_CART; | 514 media->type = valid ? MEDIA_CDROM : MEDIA_CART; |
491 return valid; | 515 return valid; |
492 } | 516 } |
506 .file_offset = 0, | 530 .file_offset = 0, |
507 .fake_pregap = 2 * 75, | 531 .fake_pregap = 2 * 75, |
508 .start_lba = 0, | 532 .start_lba = 0, |
509 .end_lba = file_size(f), | 533 .end_lba = file_size(f), |
510 .sector_bytes = 2048, | 534 .sector_bytes = 2048, |
535 .has_subcodes = SUBCODES_NONE, | |
511 .need_swap = 0, | 536 .need_swap = 0, |
512 .type = TRACK_DATA | 537 .type = TRACK_DATA |
513 }; | 538 }; |
514 media->type = MEDIA_CDROM; | 539 media->type = MEDIA_CDROM; |
515 media->seek = bin_seek; | 540 media->seek = bin_seek; |
516 media->read = bin_read; | 541 media->read = bin_read; |
542 media->read_subcodes = bin_subcode_read; | |
517 return media->size; | 543 return media->size; |
518 } | 544 } |