annotate cue.c @ 2080:bafb757e1cd2

Implement CD audio
author Michael Pavone <pavone@retrodev.com>
date Wed, 02 Feb 2022 01:10:07 -0800
parents 5a2b759f6b2d
children 0db3af42dd72
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2059
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include <ctype.h>
2074
c5323c02dde4 Fix windows build error
Michael Pavone <pavone@retrodev.com>
parents: 2062
diff changeset
2 #include <string.h>
2059
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include "system.h"
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #include "util.h"
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 static char* cmd_start(char *cur)
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 while (*cur && isblank(*cur))
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 cur++;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 return cur;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 static char* next_line(char *cur)
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 while (*cur && *cur != '\n')
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 cur++;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 if (*cur) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 return cur + 1;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 return NULL;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 static uint32_t timecode_to_lba(char *timecode)
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 char *end;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 int seconds = 0, frames = 0;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 int minutes = strtol(timecode, &end, 10);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 if (end) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 timecode = end + 1;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 seconds = strtol(timecode, &end, 10);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 if (end) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 timecode = end + 1;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 frames = strtol(timecode, NULL, 10);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 seconds += minutes * 60;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 return seconds * 75 + frames;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
46 enum {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
47 FAKE_DATA = 1,
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
48 FAKE_AUDIO,
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
49 };
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
50
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
51 static uint8_t bin_seek(system_media *media, uint32_t sector)
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
52 {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
53 media->cur_sector = sector;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
54 uint32_t lba = sector;
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
55 uint8_t track;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
56 for (track = 0; track < media->num_tracks; track++)
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
57 {
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
58 if (lba < media->tracks[track].fake_pregap) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
59 media->in_fake_pregap = media->tracks[track].type == TRACK_DATA ? FAKE_DATA : FAKE_AUDIO;
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
60 break;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
61 }
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
62 lba -= media->tracks[track].fake_pregap;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
63 if (lba < media->tracks[track].start_lba) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
64 media->in_fake_pregap = media->tracks[track].type == TRACK_DATA ? FAKE_DATA : FAKE_AUDIO;
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
65 break;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
66 }
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
67 if (lba < media->tracks[track].end_lba) {
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
68 media->in_fake_pregap = 0;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
69 break;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
70 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
71 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
72 if (!media->in_fake_pregap) {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
73 fseek(media->f, lba * 2352, SEEK_SET);
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
74 }
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
75 return track;
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
76 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
77
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
78 static uint8_t fake_read(uint32_t sector, uint32_t offset)
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
79 {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
80 if (!offset || (offset >= 16)) {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
81 return 0;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
82 //TODO: error detection and correction bytes
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
83 } else if (offset < 12) {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
84 return 0xFF;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
85 } else if (offset == 12) {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
86 uint32_t minute = (sector / 75) / 60;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
87 return (minute % 10) | ((minute / 10 ) << 4);
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
88 } else if (offset == 13) {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
89 uint32_t seconds = (sector / 75) % 60;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
90 return (seconds % 10) | ((seconds / 10 ) << 4);
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
91 } else if (offset == 14) {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
92 uint32_t frames = sector % 75;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
93 return (frames % 10) | ((frames / 10 ) << 4);
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
94 } else {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
95 return 1;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
96 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
97 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
98
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
99 static uint8_t bin_read(system_media *media, uint32_t offset)
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
100 {
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
101 if (media->in_fake_pregap == FAKE_DATA) {
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
102 return fake_read(media->cur_sector, offset);
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
103 } else if (media->in_fake_pregap == FAKE_AUDIO) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
104 return 0;
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
105 } else {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
106 return fgetc(media->f);
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
107 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
108 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
109
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
110 static uint8_t iso_seek(system_media *media, uint32_t sector)
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
111 {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
112 media->cur_sector = sector;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
113 if (sector < (2 * 75)) {
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
114 media->in_fake_pregap = FAKE_DATA;
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
115 } else {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
116 media->in_fake_pregap = 0;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
117 fseek(media->f, (sector - 2 * 75) * 2048, SEEK_SET);
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
118 }
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents: 2079
diff changeset
119 return 0;
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
120 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
121
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
122 static uint8_t iso_read(system_media *media, uint32_t offset)
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
123 {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
124 if (media->in_fake_pregap || offset < 16 || offset > (2048 + 16)) {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
125 return fake_read(media->cur_sector, offset);
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
126 } else {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
127 return fgetc(media->f);
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
128 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
129 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
130
2059
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 uint8_t parse_cue(system_media *media)
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 char *line = media->buffer;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 media->num_tracks = 0;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 do {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 char *cmd = cmd_start(line);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 if (cmd) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 if (startswith(cmd, "TRACK ")) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 media->num_tracks++;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 line = next_line(cmd);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 } else {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 line = NULL;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 } while (line);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 track_info *tracks = calloc(sizeof(track_info), media->num_tracks);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 media->tracks = tracks;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 line = media->buffer;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 int track = -1;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 do {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 char *cmd = cmd_start(line);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 if (cmd) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 if (startswith(cmd, "TRACK ")) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 track++;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 cmd += 6;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 char *end;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 int file_track = strtol(cmd, &end, 10);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 if (file_track != (track + 1)) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 warning("Expected track %d, but found track %d in CUE sheet\n", track + 1, file_track);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 cmd = cmd_start(end);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 if (cmd) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 tracks[track].type = startswith(cmd, "AUDIO") ? TRACK_AUDIO : TRACK_DATA;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 } else if (startswith(cmd, "FILE ")) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 if (media->f) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 warning("CUE sheets with multiple FILE commands are not supported\n");
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 } else {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 cmd += 5;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 cmd = strchr(cmd, '"');
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 if (cmd) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 cmd++;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 char *end = strchr(cmd, '"');
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 if (end) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 char *fname;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 //TODO: zipped BIN/CUE support
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 if (is_absolute_path(cmd)) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 fname = malloc(end-cmd + 1);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 memcpy(fname, cmd, end-cmd);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 fname[end-cmd] = 0;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 } else {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 size_t dirlen = strlen(media->dir);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 fname = malloc(dirlen + 1 + (end-cmd) + 1);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 memcpy(fname, media->dir, dirlen);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 fname[dirlen] = PATH_SEP[0];
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 memcpy(fname + dirlen + 1, cmd, end-cmd);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 fname[dirlen + 1 + (end-cmd)] = 0;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189 media->f = fopen(fname, "rb");
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
190 if (!media->f) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
191 fatal_error("Failed to open %s specified by FILE command in CUE sheet %s.%s\n", fname, media->name, media->extension);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
192 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 free(fname);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197 } else if (track >= 0) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
198 if (startswith(cmd, "PREGAP ")) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 tracks[track].fake_pregap = timecode_to_lba(cmd + 7);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 } else if (startswith(cmd, "INDEX ")) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 char *after;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202 int index = strtol(cmd + 6, &after, 10);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 if (!index) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204 tracks[track].pregap_lba = timecode_to_lba(after);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 } else if (index == 1) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 tracks[track].start_lba = timecode_to_lba(after);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 if (cmd) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211 line = next_line(cmd);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212 } else {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 line = NULL;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 } else {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 line = NULL;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 } while (line);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 for (uint32_t i = 0; i < (media->num_tracks - 1); i++)
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221 uint32_t next = i + 1;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 tracks[i].end_lba = tracks[next].pregap_lba ? tracks[next].pregap_lba : tracks[next].start_lba;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223 }
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 if (media->f) {
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 //end of last track is implicitly defined by file size
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226 tracks[media->num_tracks-1].end_lba = file_size(media->f) / 2352;
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 //replace cue sheet with first sector
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 free(media->buffer);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 media->buffer = calloc(2048, 1);
2062
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
230 if (tracks[0].type = TRACK_DATA) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
231 // if the first track is a data track, don't trust the CUE sheet and look at the MM:SS:FF from first sector
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
232 uint8_t msf[3];
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
233 fseek(media->f, 12, SEEK_SET);
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
234 if (sizeof(msf) == fread(msf, 1, sizeof(msf), media->f)) {
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
235 tracks[0].fake_pregap = msf[2] + (msf[0] * 60 + msf[1]) * 75;
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
236 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
237 }
07ed42bd7b4c Some progress on CDC and CDD emulation. Now passes first 3 "CDC INIT" tests in mcd-verificator
Michael Pavone <pavone@retrodev.com>
parents: 2061
diff changeset
238
2059
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 fseek(media->f, 16, SEEK_SET);
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 media->size = fread(media->buffer, 1, 2048, media->f);
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
241 media->seek = bin_seek;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
242 media->read = bin_read;
2059
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 }
2061
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents: 2059
diff changeset
244 uint8_t valid = tracks > 0 && media->f != NULL;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents: 2059
diff changeset
245 media->type = valid ? MEDIA_CDROM : MEDIA_CART;
7c1760b5b3e5 Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents: 2059
diff changeset
246 return valid;
2059
6399a776e981 Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
247 }
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
248
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
249 uint32_t make_iso_media(system_media *media, const char *filename)
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
250 {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
251 media->f = fopen(filename, "rb");
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
252 if (!media->f) {
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
253 return 0;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
254 }
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
255 media->buffer = calloc(2048, 1);
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
256 media->size = fread(media->buffer, 1, 2048, media->f);
2079
5a2b759f6b2d BIOS doesn't like it if TOC read happens too quickly
Michael Pavone <pavone@retrodev.com>
parents: 2076
diff changeset
257 media->num_tracks = 1;
5a2b759f6b2d BIOS doesn't like it if TOC read happens too quickly
Michael Pavone <pavone@retrodev.com>
parents: 2076
diff changeset
258 media->tracks = calloc(sizeof(track_info), 1);
2076
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
259 media->tracks[0] = (track_info){
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
260 .fake_pregap = 2 * 75,
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
261 .start_lba = 0,
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
262 .end_lba = file_size(media->f),
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
263 .type = TRACK_DATA
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
264 };
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
265 media->type = MEDIA_CDROM;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
266 media->seek = iso_seek;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
267 media->read = iso_read;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
268 return media->size;
3f29e2726522 Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents: 2074
diff changeset
269 }