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 }