Mercurial > repos > blastem
annotate cdimage.c @ 2688:b42f00a3a937 default tip
Fix default target. Ensure m68k.h and z80.h are built before anything else when no dep info is available
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 31 Mar 2025 21:06:18 -0700 |
parents | 1fdf7acc5165 |
children |
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> |
2215
a8af8d898a7c
Fix windows build for real
Michael Pavone <pavone@retrodev.com>
parents:
2149
diff
changeset
|
3 #include <stdlib.h> |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 #include "system.h" |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 #include "util.h" |
2288
efc75ea79164
Support WAVE files in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
7 #include "wave.h" |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
9 uint8_t cdrom_scramble(uint16_t *lsfr, uint8_t data) |
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
10 { |
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
11 data ^= *lsfr; |
2352
76dfad6a53b5
Fix bug in CD-ROM scrambling algorithm
Michael Pavone <pavone@retrodev.com>
parents:
2342
diff
changeset
|
12 for (int i = 0; i < 8; i++) |
76dfad6a53b5
Fix bug in CD-ROM scrambling algorithm
Michael Pavone <pavone@retrodev.com>
parents:
2342
diff
changeset
|
13 { |
76dfad6a53b5
Fix bug in CD-ROM scrambling algorithm
Michael Pavone <pavone@retrodev.com>
parents:
2342
diff
changeset
|
14 uint16_t new_bit = *lsfr; |
76dfad6a53b5
Fix bug in CD-ROM scrambling algorithm
Michael Pavone <pavone@retrodev.com>
parents:
2342
diff
changeset
|
15 *lsfr >>= 1; |
76dfad6a53b5
Fix bug in CD-ROM scrambling algorithm
Michael Pavone <pavone@retrodev.com>
parents:
2342
diff
changeset
|
16 new_bit = (new_bit ^ *lsfr) & 1; |
76dfad6a53b5
Fix bug in CD-ROM scrambling algorithm
Michael Pavone <pavone@retrodev.com>
parents:
2342
diff
changeset
|
17 *lsfr |= new_bit << 14; |
76dfad6a53b5
Fix bug in CD-ROM scrambling algorithm
Michael Pavone <pavone@retrodev.com>
parents:
2342
diff
changeset
|
18 } |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
19 return data; |
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
20 } |
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
21 |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 static char* cmd_start(char *cur) |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 while (*cur && isblank(*cur)) |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 cur++; |
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 return cur; |
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 |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
31 static char* cmd_start_sameline(char *cur) |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
32 { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
33 while (*cur && isblank(*cur) && *cur != '\n') |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
34 { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
35 cur++; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
36 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
37 return cur; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
38 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
39 |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
40 static char* word_end(char *cur) |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
41 { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
42 while (*cur && !isblank(*cur)) |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
43 { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
44 cur++; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
45 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
46 return cur; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
47 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
48 |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 static char* next_line(char *cur) |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 while (*cur && *cur != '\n') |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 cur++; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 if (*cur) { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 return cur + 1; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 return NULL; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
61 static char* next_blank(char *cur) |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
62 { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
63 while (*cur && !isblank(*cur)) |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
64 { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
65 cur++; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
66 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
67 return cur; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
68 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
69 |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 static uint32_t timecode_to_lba(char *timecode) |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 char *end; |
2149
9209858b2f74
Fix a couple of bugs in the TOC file parser
Michael Pavone <pavone@retrodev.com>
parents:
2143
diff
changeset
|
73 int seconds = 0, minutes = 0; |
9209858b2f74
Fix a couple of bugs in the TOC file parser
Michael Pavone <pavone@retrodev.com>
parents:
2143
diff
changeset
|
74 int frames = strtol(timecode, &end, 10); |
9209858b2f74
Fix a couple of bugs in the TOC file parser
Michael Pavone <pavone@retrodev.com>
parents:
2143
diff
changeset
|
75 if (end && *end == ':') { |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 timecode = end + 1; |
2149
9209858b2f74
Fix a couple of bugs in the TOC file parser
Michael Pavone <pavone@retrodev.com>
parents:
2143
diff
changeset
|
77 seconds = frames; |
9209858b2f74
Fix a couple of bugs in the TOC file parser
Michael Pavone <pavone@retrodev.com>
parents:
2143
diff
changeset
|
78 frames = strtol(timecode, &end, 10); |
9209858b2f74
Fix a couple of bugs in the TOC file parser
Michael Pavone <pavone@retrodev.com>
parents:
2143
diff
changeset
|
79 if (end && *end == ':') { |
9209858b2f74
Fix a couple of bugs in the TOC file parser
Michael Pavone <pavone@retrodev.com>
parents:
2143
diff
changeset
|
80 minutes = seconds; |
9209858b2f74
Fix a couple of bugs in the TOC file parser
Michael Pavone <pavone@retrodev.com>
parents:
2143
diff
changeset
|
81 seconds = frames; |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 timecode = end + 1; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 frames = strtol(timecode, NULL, 10); |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 seconds += minutes * 60; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 return seconds * 75 + frames; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 |
2080 | 91 enum { |
92 FAKE_DATA = 1, | |
93 FAKE_AUDIO, | |
94 }; | |
95 | |
96 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
|
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 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
|
99 uint32_t lba = sector; |
2089
0db3af42dd72
Fix some byte order stuff for audio tracks
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
100 uint32_t track; |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
101 uint32_t rel; |
2080 | 102 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
|
103 { |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
104 rel = lba - media->tracks[track].pregap_lba; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
105 if (rel < media->tracks[track].fake_pregap) { |
2080 | 106 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
|
107 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
|
108 } |
2080 | 109 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
|
110 media->in_fake_pregap = 0; |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
111 rel -= media->tracks[track].fake_pregap; |
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
|
112 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
|
113 } |
3f29e2726522
Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents:
2074
diff
changeset
|
114 } |
2089
0db3af42dd72
Fix some byte order stuff for audio tracks
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
115 if (track < media->num_tracks) { |
0db3af42dd72
Fix some byte order stuff for audio tracks
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
116 media->cur_track = track; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
117 if (!media->in_fake_pregap) { |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
118 if (media->tracks[track].flac) { |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
119 flac_seek(media->tracks[track].flac, (media->tracks[track].file_offset + rel * media->tracks[track].sector_bytes) / 4); |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
120 } else { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
121 if (media->tracks[track].has_subcodes) { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
122 if (!media->tmp_buffer) { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
123 media->tmp_buffer = calloc(1, 96); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
124 } |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
125 fseek(media->tracks[track].f, media->tracks[track].file_offset + (rel + 1) * media->tracks[track].sector_bytes - 96, SEEK_SET); |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
126 int bytes = fread(media->tmp_buffer, 1, 96, media->tracks[track].f); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
127 if (bytes != 96) { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
128 fprintf(stderr, "Only read %d subcode bytes\n", bytes); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
129 } |
2116
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
130 } |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
131 fseek(media->tracks[track].f, media->tracks[track].file_offset + rel * media->tracks[track].sector_bytes, SEEK_SET); |
2116
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
132 } |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
133 } |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
134 if (media->tracks[track].type == TRACK_DATA) { |
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
135 media->cdrom_scramble_lsfr = 1; |
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
136 } |
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
|
137 } |
2080 | 138 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
|
139 } |
3f29e2726522
Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents:
2074
diff
changeset
|
140 |
3f29e2726522
Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents:
2074
diff
changeset
|
141 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
|
142 { |
2142
d9151d0894c7
Fix some CD-ROM emulation issues
Michael Pavone <pavone@retrodev.com>
parents:
2140
diff
changeset
|
143 if (!offset || offset == 11 || (offset >= 16)) { |
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
|
144 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
|
145 //TODO: error detection and correction bytes |
2142
d9151d0894c7
Fix some CD-ROM emulation issues
Michael Pavone <pavone@retrodev.com>
parents:
2140
diff
changeset
|
146 } else if (offset < 11) { |
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
|
147 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
|
148 } 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
|
149 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
|
150 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
|
151 } 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
|
152 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
|
153 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
|
154 } 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
|
155 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
|
156 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
|
157 } 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
|
158 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
|
159 } |
3f29e2726522
Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents:
2074
diff
changeset
|
160 } |
3f29e2726522
Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents:
2074
diff
changeset
|
161 |
3f29e2726522
Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents:
2074
diff
changeset
|
162 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
|
163 { |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
164 uint8_t retval; |
2080 | 165 if (media->in_fake_pregap == FAKE_DATA) { |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
166 retval = fake_read(media->cur_sector, offset); |
2080 | 167 } else if (media->in_fake_pregap == FAKE_AUDIO) { |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
168 retval = 0; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
169 } else if ((media->tracks[media->cur_track].sector_bytes < 2352 && offset < 16) || offset > (media->tracks[media->cur_track].sector_bytes + 16)) { |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
170 retval = fake_read(media->cur_sector, offset); |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
171 } else if (media->tracks[media->cur_track].flac) { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
172 if (offset & 3) { |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
173 retval = media->byte_storage[(offset & 3) - 1]; |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
174 } else { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
175 int16_t samples[2]; |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
176 flac_get_sample(media->tracks[media->cur_track].flac, samples, 2); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
177 media->byte_storage[0] = samples[0] >> 8; |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
178 media->byte_storage[1] = samples[1]; |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
179 media->byte_storage[2] = samples[1] >> 8; |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
180 retval = samples[0]; |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
181 } |
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
|
182 } else { |
2089
0db3af42dd72
Fix some byte order stuff for audio tracks
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
183 if (media->tracks[media->cur_track].need_swap) { |
0db3af42dd72
Fix some byte order stuff for audio tracks
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
184 if (offset & 1) { |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
185 retval = media->byte_storage[0]; |
2089
0db3af42dd72
Fix some byte order stuff for audio tracks
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
186 } |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
187 media->byte_storage[0] = fgetc(media->tracks[media->cur_track].f); |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
188 } else { |
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
189 retval = fgetc(media->tracks[media->cur_track].f); |
2089
0db3af42dd72
Fix some byte order stuff for audio tracks
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
190 } |
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
|
191 } |
2342
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
192 if (offset >= 12 && media->tracks[media->cur_track].type == TRACK_DATA) { |
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
193 retval = cdrom_scramble(&media->cdrom_scramble_lsfr, retval); |
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
194 } |
9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
Michael Pavone <pavone@retrodev.com>
parents:
2298
diff
changeset
|
195 return retval; |
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
|
196 } |
3f29e2726522
Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents:
2074
diff
changeset
|
197 |
2116
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
198 static uint8_t bin_subcode_read(system_media *media, uint32_t offset) |
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
199 { |
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
200 if (media->in_fake_pregap || !media->tracks[media->cur_track].has_subcodes) { |
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
201 //TODO: Fake PQ subcodes |
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
202 return 0; |
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
203 } |
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
204 //TODO: Translate "cooked" subcodes back to raw format |
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
205 return media->tmp_buffer[offset]; |
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
206 } |
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
207 |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
208 static void print_toc(system_media *media) |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
209 { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
210 track_info * tracks = media->tracks; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
211 for (uint32_t i = 0; i < media->num_tracks; i++) |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
212 { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
213 uint32_t m,s,f; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
214 f = tracks[i].pregap_lba % 75; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
215 s = tracks[i].pregap_lba / 75; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
216 m = s / 60; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
217 s = s % 60; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
218 printf("Track %02u - Index 0 %02u:%02u:%02u, Index 1 ", i + 1, m, s, f); |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
219 f = tracks[i].start_lba % 75; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
220 s = tracks[i].start_lba / 75; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
221 m = s / 60; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
222 s = s % 60; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
223 printf("%02u:%02u:%02u, Fake Pregap: %u\n", m, s, f, tracks[i].fake_pregap); |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
224 } |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
225 } |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
226 |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
227 uint8_t parse_cue(system_media *media) |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
228 { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
229 char *line = media->buffer; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
230 media->num_tracks = 0; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
231 do { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
232 char *cmd = cmd_start(line); |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
233 if (cmd) { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
234 if (startswith(cmd, "TRACK ")) { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
235 media->num_tracks++; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
236 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
237 line = next_line(cmd); |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
238 } else { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
239 line = NULL; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
240 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
241 } while (line); |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
242 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
|
243 media->tracks = tracks; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
244 line = media->buffer; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
245 int track = -1; |
2089
0db3af42dd72
Fix some byte order stuff for audio tracks
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
246 uint8_t audio_byte_swap = 0; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
247 FILE *f = NULL; |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
248 flac_file *flac = NULL; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
249 int track_of_file = -1; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
250 uint8_t has_index_0 = 0; |
2288
efc75ea79164
Support WAVE files in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
251 uint32_t extra_offset = 0; |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
252 do { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
253 char *cmd = cmd_start(line); |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
254 if (*cmd) { |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
255 if (startswith(cmd, "TRACK ")) { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
256 track++; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
257 track_of_file++; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
258 has_index_0 = 0; |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
259 cmd += 6; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
260 char *end; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
261 int file_track = strtol(cmd, &end, 10); |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
262 if (file_track != (track + 1)) { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
263 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
|
264 } |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
265 tracks[track].f = f; |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
266 tracks[track].flac = flac; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
267 |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
268 cmd = cmd_start(end); |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
269 if (*cmd) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
270 if (startswith(cmd, "AUDIO")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
271 tracks[track].type = TRACK_AUDIO; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
272 tracks[track].need_swap = audio_byte_swap; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
273 tracks[track].sector_bytes = 2352; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
274 } else { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
275 tracks[track].type = TRACK_DATA; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
276 tracks[track].need_swap = 0; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
277 tracks[track].sector_bytes = 0; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
278 char *slash = strchr(cmd, '/'); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
279 if (slash) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
280 tracks[track].sector_bytes = atoi(slash+1); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
281 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
282 if (!tracks[track].sector_bytes) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
283 warning("Missing sector size for data track %d in cue", track + 1); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
284 tracks[track].sector_bytes = 2352; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
285 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
286 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
287 |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
288 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
289 } else if (startswith(cmd, "FILE ")) { |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
290 cmd += 5; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
291 cmd = strchr(cmd, '"'); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
292 if (cmd) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
293 cmd++; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
294 char *end = strchr(cmd, '"'); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
295 if (end) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
296 char *fname; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
297 //TODO: zipped BIN/CUE support |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
298 if (is_absolute_path(cmd)) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
299 fname = malloc(end-cmd + 1); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
300 memcpy(fname, cmd, end-cmd); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
301 fname[end-cmd] = 0; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
302 } else { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
303 size_t dirlen = strlen(media->dir); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
304 fname = malloc(dirlen + 1 + (end-cmd) + 1); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
305 memcpy(fname, media->dir, dirlen); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
306 fname[dirlen] = PATH_SEP[0]; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
307 memcpy(fname + dirlen + 1, cmd, end-cmd); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
308 fname[dirlen + 1 + (end-cmd)] = 0; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
309 } |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
310 |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
311 if (track_of_file >= 0) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
312 long track_size = 0; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
313 if (flac) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
314 track_size = flac->total_samples * 4; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
315 } else if (f) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
316 track_size = file_size(f); |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
317 } |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
318 track_size -= tracks[track].file_offset; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
319 tracks[track].end_lba = tracks[track].pregap_lba + tracks[track].fake_pregap + track_size / tracks[track].sector_bytes; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
320 } |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
321 flac = NULL; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
322 f = fopen(fname, "rb"); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
323 if (!f) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
324 fatal_error("Failed to open %s specified by FILE command in CUE sheet %s.%s\n", fname, media->name, media->extension); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
325 } |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
326 |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
327 track_of_file = -1; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
328 for (end++; *end && *end != '\n' && *end != '\r'; end++) |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
329 { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
330 if (!isspace(*end)) { |
2288
efc75ea79164
Support WAVE files in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
331 extra_offset = 0; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
332 if (startswith(end, "BINARY")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
333 audio_byte_swap = 0; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
334 } else if (startswith(end, "MOTOROLA")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
335 audio_byte_swap = 1; |
2288
efc75ea79164
Support WAVE files in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
336 } else if (startswith(end, "WAVE")) { |
efc75ea79164
Support WAVE files in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
337 audio_byte_swap = 0; |
efc75ea79164
Support WAVE files in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
338 wave_header wave; |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
339 if (wave_read_header(f, &wave)) { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
340 if (wave.audio_format != 1 || wave.num_channels != 2 || wave.sample_rate != 44100 || wave.bits_per_sample != 16) { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
341 warning("BlastEm only suports WAVE tracks in 16-bit stereo PCM format at 44100 hz, file %s does not match\n", fname); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
342 } |
2613
1fdf7acc5165
Fix handling of wave files with additional RIFF chunks before the data chunk
Michael Pavone <pavone@retrodev.com>
parents:
2516
diff
changeset
|
343 extra_offset = wave.data_offset; |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
344 } else { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
345 fseek(f, 0, SEEK_SET); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
346 flac = flac_file_from_file(f); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
347 if (!flac) { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
348 fatal_error("WAVE file %s in cue sheet %s.%s is neither a valid WAVE nor a valid FLAC file\n", fname, media->name, media->extension); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
349 } |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
350 if (flac->sample_rate != 44100 || flac->bits_per_sample != 16 || flac->channels != 2) { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
351 warning("FLAC files in a CUE sheet should match CD audio specs, %s does not\n", fname); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
352 } |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
353 |
2288
efc75ea79164
Support WAVE files in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
354 } |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
355 } else { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
356 warning("Unsupported FILE type in CUE sheet. Only BINARY and MOTOROLA are supported\n"); |
2089
0db3af42dd72
Fix some byte order stuff for audio tracks
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
357 } |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
358 break; |
2089
0db3af42dd72
Fix some byte order stuff for audio tracks
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
359 } |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
360 } |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
361 free(fname); |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
362 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
363 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
364 } else if (track >= 0) { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
365 if (startswith(cmd, "PREGAP ")) { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
366 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
|
367 } else if (startswith(cmd, "INDEX ")) { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
368 char *after; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
369 int index = strtol(cmd + 6, &after, 10); |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
370 uint8_t has_start_lba = 0; |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
371 uint32_t start_lba = timecode_to_lba(after); |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
372 if (!index) { |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
373 tracks[track].file_offset = start_lba * tracks[track].sector_bytes + extra_offset; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
374 if (track > 0) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
375 if (track_of_file > 0) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
376 //Previous track end is implicit based on this index position |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
377 uint32_t last_track_size = tracks[track].file_offset - tracks[track-1].file_offset; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
378 last_track_size /= tracks[track-1].sector_bytes; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
379 tracks[track-1].end_lba = tracks[track-1].pregap_lba + tracks[track-1].fake_pregap + last_track_size; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
380 } |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
381 tracks[track].pregap_lba = tracks[track-1].end_lba; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
382 } else { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
383 tracks[track].pregap_lba = 0; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
384 } |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
385 has_index_0 = 1; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
386 has_start_lba = 1; |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
387 } else if (index == 1) { |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
388 if (has_index_0) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
389 uint32_t real_pregap_size = start_lba * tracks[track].sector_bytes + extra_offset - tracks[track].file_offset; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
390 real_pregap_size /= tracks[track].sector_bytes; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
391 tracks[track].start_lba = tracks[track].pregap_lba + tracks[track].fake_pregap + real_pregap_size; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
392 } else { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
393 tracks[track].file_offset = start_lba * tracks[track].sector_bytes + extra_offset; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
394 if (track > 0) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
395 if (track_of_file > 0) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
396 //Previous track end is implicit based on this index position |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
397 uint32_t last_track_size = tracks[track].file_offset - tracks[track-1].file_offset; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
398 last_track_size /= tracks[track-1].sector_bytes; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
399 tracks[track-1].end_lba = tracks[track-1].pregap_lba + tracks[track-1].fake_pregap + last_track_size; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
400 } |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
401 tracks[track].pregap_lba = tracks[track-1].end_lba; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
402 tracks[track].start_lba = tracks[track].pregap_lba + tracks[track].fake_pregap; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
403 } else { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
404 tracks[track].pregap_lba = 0; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
405 if (!tracks[track].fake_pregap) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
406 if (tracks[track].type == TRACK_DATA && tracks[track].sector_bytes == 2352) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
407 //Infer pregap from position in sector header |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
408 fseek(f, start_lba + 12, SEEK_SET); |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
409 uint8_t timecode[3]; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
410 if (sizeof(timecode) == fread(timecode, 1, sizeof(timecode), f)) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
411 tracks[track].fake_pregap = (timecode[0] >> 4) * 600; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
412 tracks[track].fake_pregap += (timecode[0] & 0xF) * 60; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
413 tracks[track].fake_pregap += (timecode[1] >> 4) * 10; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
414 tracks[track].fake_pregap += timecode[1] & 0xF; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
415 tracks[track].fake_pregap *= 75; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
416 tracks[track].fake_pregap += (timecode[2] >> 4) * 10; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
417 tracks[track].fake_pregap += timecode[2] & 0xF; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
418 } else { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
419 fatal_error("Failed to read from CD image"); |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
420 } |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
421 } else { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
422 //Just assume a 2-second pre-gap for first track |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
423 tracks[track].fake_pregap = 2 * 75; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
424 } |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
425 } |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
426 tracks[track].start_lba = tracks[track].fake_pregap; |
2250
646d1797f20d
Fix bug in CUE parser that caused regression in Bill Walsh College Football
Michael Pavone <pavone@retrodev.com>
parents:
2215
diff
changeset
|
427 } |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
428 } |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
429 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
430 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
431 } |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
432 if (cmd && *cmd) { |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
433 line = next_line(cmd); |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
434 } else { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
435 line = NULL; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
436 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
437 } else { |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
438 line = NULL; |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
439 } |
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
440 } while (line); |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
441 if (media->num_tracks > 0 && media->tracks[0].f) { |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
442 //end of last track in a file is implictly based on file size |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
443 long track_size = 0; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
444 if (flac) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
445 track_size = flac->total_samples * 4; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
446 } else if (f) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
447 track_size = file_size(f); |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
448 } |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
449 track_size -= tracks[track].file_offset; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
450 tracks[track].end_lba = tracks[track].pregap_lba + tracks[track].fake_pregap + track_size / tracks[track].sector_bytes; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
451 |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
452 if (tracks[0].type == TRACK_DATA) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
453 //replace cue sheet with first sector |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
454 free(media->buffer); |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
455 media->buffer = calloc(2048, 1); |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
456 fseek(tracks[0].f, tracks[0].sector_bytes >= 2352 ? 16 : 0, SEEK_SET); |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
457 media->size = fread(media->buffer, 1, 2048, tracks[0].f); |
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
|
458 } |
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
|
459 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
|
460 media->read = bin_read; |
2116
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
461 media->read_subcodes = bin_subcode_read; |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
462 } |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
463 print_toc(media); |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
464 uint8_t valid = media->num_tracks > 0 && media->tracks[0].f != NULL; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
465 media->type = valid ? MEDIA_CDROM : MEDIA_CART; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
466 return valid; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
467 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
468 |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
469 uint8_t parse_toc(system_media *media) |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
470 { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
471 char *line = media->buffer; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
472 media->num_tracks = 0; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
473 do { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
474 char *cmd = cmd_start(line); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
475 if (cmd) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
476 if (startswith(cmd, "TRACK ")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
477 media->num_tracks++; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
478 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
479 line = next_line(cmd); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
480 } else { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
481 line = NULL; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
482 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
483 } while (line); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
484 track_info *tracks = calloc(sizeof(track_info), media->num_tracks); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
485 media->tracks = tracks; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
486 line = media->buffer; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
487 char *last_file_name = NULL; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
488 FILE *f = NULL; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
489 int track = -1; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
490 do { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
491 char *cmd = cmd_start(line); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
492 if (*cmd) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
493 if (startswith(cmd, "TRACK ")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
494 track++; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
495 cmd = cmd_start(cmd + 6); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
496 if (startswith(cmd, "AUDIO")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
497 tracks[track].type = TRACK_AUDIO; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
498 tracks[track].sector_bytes = 2352; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
499 tracks[track].need_swap = 1; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
500 } else { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
501 tracks[track].type = TRACK_DATA; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
502 tracks[track].need_swap = 0; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
503 if (startswith(cmd, "MODE1_RAW") || startswith(cmd, "MODE2_RAW")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
504 tracks[track].sector_bytes = 2352; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
505 } else if (startswith(cmd, "MODE2_FORM2")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
506 tracks[track].sector_bytes = 2324; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
507 } else if (startswith(cmd, "MODE1") || startswith(cmd, "MODE2_FORM1")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
508 tracks[track].sector_bytes = 2048; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
509 } else if (startswith(cmd, "MODE2")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
510 tracks[track].sector_bytes = 2336; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
511 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
512 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
513 cmd = word_end(cmd); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
514 if (*cmd && *cmd != '\n') { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
515 cmd = cmd_start_sameline(cmd); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
516 if (*cmd && *cmd != '\n') { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
517 //TODO: record whether subcode is in raw format or not |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
518 if (startswith(cmd, "RW_RAW")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
519 tracks[track].sector_bytes += 96; |
2116
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
520 tracks[track].has_subcodes = SUBCODES_RAW; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
521 } else if (startswith(cmd, "RW")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
522 tracks[track].sector_bytes += 96; |
2116
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
523 tracks[track].has_subcodes = SUBCODES_COOKED; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
524 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
525 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
526 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
527 if (track) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
528 tracks[track].start_lba = tracks[track].pregap_lba = tracks[track].end_lba = tracks[track-1].end_lba; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
529 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
530 } else if (track >= 0) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
531 uint8_t is_datafile = startswith(cmd, "DATAFILE"); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
532 if (is_datafile || startswith(cmd, "FILE")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
533 |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
534 if (tracks[track].f) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
535 warning("TOC file has more than one file for track %d, only one is supported\n", track + 1); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
536 } else { |
2140
6d0de02a068a
Fix bug in TOC parser
Michael Pavone <pavone@retrodev.com>
parents:
2122
diff
changeset
|
537 cmd += is_datafile ? 8 : 4; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
538 char *fname_start = strchr(cmd, '"'); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
539 if (fname_start) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
540 ++fname_start; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
541 char *fname_end = strchr(fname_start, '"'); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
542 if (fname_end) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
543 if (!last_file_name || strncmp(last_file_name, fname_start, fname_end-fname_start)) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
544 free(last_file_name); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
545 last_file_name = calloc(1, 1 + fname_end-fname_start); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
546 memcpy(last_file_name, fname_start, fname_end-fname_start); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
547 char *fname; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
548 //TODO: zipped BIN/TOC support |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
549 if (is_absolute_path(last_file_name)) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
550 fname = last_file_name; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
551 } else { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
552 size_t dirlen = strlen(media->dir); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
553 fname = malloc(dirlen + 1 + (fname_end-fname_start) + 1); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
554 memcpy(fname, media->dir, dirlen); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
555 fname[dirlen] = PATH_SEP[0]; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
556 memcpy(fname + dirlen + 1, fname_start, fname_end-fname_start); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
557 fname[dirlen + 1 + (fname_end-fname_start)] = 0; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
558 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
559 f = fopen(fname, "rb"); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
560 if (!f) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
561 fatal_error("Failed to open %s specified by DATAFILE command in TOC file %s.%s\n", fname, media->name, media->extension); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
562 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
563 if (fname != last_file_name) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
564 free(fname); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
565 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
566 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
567 tracks[track].f = f; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
568 cmd = fname_end + 1; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
569 cmd = cmd_start_sameline(cmd); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
570 if (*cmd == '#') { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
571 char *end; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
572 tracks[track].file_offset = strtol(cmd + 1, &end, 10); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
573 cmd = cmd_start_sameline(end); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
574 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
575 if (!is_datafile) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
576 if (isdigit(*cmd)) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
577 uint32_t start = timecode_to_lba(cmd); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
578 tracks[track].file_offset += start * tracks[track].sector_bytes; |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
579 cmd = cmd_start_sameline(word_end(cmd)); |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
580 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
581 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
582 if (isdigit(*cmd)) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
583 uint32_t length = timecode_to_lba(cmd); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
584 tracks[track].end_lba += length; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
585 } else { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
586 long fsize = file_size(f); |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
587 tracks[track].end_lba += (fsize - tracks[track].file_offset) / tracks[track].sector_bytes; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
588 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
589 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
590 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
591 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
592 } else if (startswith(cmd, "SILENCE")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
593 cmd = cmd_start_sameline(cmd + 7); |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
594 uint32_t length = timecode_to_lba(cmd); |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
595 tracks[track].fake_pregap += length; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
596 tracks[track].end_lba += length; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
597 } else if (startswith(cmd, "START")) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
598 cmd = cmd_start_sameline(cmd + 5); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
599 tracks[track].start_lba = tracks[track].pregap_lba + timecode_to_lba(cmd); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
600 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
601 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
602 if (cmd && *cmd) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
603 line = next_line(cmd); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
604 } else { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
605 line = NULL; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
606 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
607 } else { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
608 line = NULL; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
609 } |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
610 } while (line); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
611 if (media->num_tracks > 0 && media->tracks[0].f) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
612 //replace cue sheet with first sector |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
613 free(media->buffer); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
614 media->buffer = calloc(2048, 1); |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
615 uint32_t old_fake_pregap = tracks[0].fake_pregap; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
616 if (tracks[0].type == TRACK_DATA && tracks[0].sector_bytes == 2352) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
617 // if the first track is a data track, don't trust the TOC file and look at the MM:SS:FF from first sector |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
618 uint8_t msf[3]; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
619 fseek(tracks[0].f, 12, SEEK_SET); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
620 if (sizeof(msf) == fread(msf, 1, sizeof(msf), tracks[0].f)) { |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
621 tracks[0].fake_pregap = msf[2] + (msf[0] * 60 + msf[1]) * 75; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
622 } |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
623 } else if (!tracks[0].fake_pregap) { |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
624 tracks[0].fake_pregap = 2 * 75; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
625 } |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
626 if (tracks[0].fake_pregap != old_fake_pregap) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
627 if (!tracks[0].start_lba) { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
628 tracks[0].start_lba = tracks[0].fake_pregap; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
629 } |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
630 uint32_t diff = tracks[0].fake_pregap - old_fake_pregap; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
631 tracks[0].end_lba += diff; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
632 for (uint32_t i = 1; i < media->num_tracks; i++) |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
633 { |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
634 tracks[i].pregap_lba += diff; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
635 tracks[i].start_lba += diff; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
636 tracks[i].end_lba += diff; |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
637 } |
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
638 } |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
639 |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
640 fseek(tracks[0].f, tracks[0].sector_bytes == 2352 ? 16 : 0, SEEK_SET); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
641 media->size = fread(media->buffer, 1, 2048, tracks[0].f); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
642 media->seek = bin_seek; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
643 media->read = bin_read; |
2116
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
644 media->read_subcodes = bin_subcode_read; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
645 } |
2516
69c28808b49a
Fix some TOC/CUE parser bugs and simplify how "fake" pregap is handled
Michael Pavone <pavone@retrodev.com>
parents:
2352
diff
changeset
|
646 print_toc(media); |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
647 uint8_t valid = media->num_tracks > 0 && media->tracks[0].f != NULL; |
2061
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
2059
diff
changeset
|
648 media->type = valid ? MEDIA_CDROM : MEDIA_CART; |
7c1760b5b3e5
Implemented basic TOC functionality of CDD MCU
Michael Pavone <pavone@retrodev.com>
parents:
2059
diff
changeset
|
649 return valid; |
2059
6399a776e981
Add basic support for BIN/CUE images
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
650 } |
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
|
651 |
3f29e2726522
Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents:
2074
diff
changeset
|
652 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
|
653 { |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
654 FILE *f = fopen(filename, "rb"); |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
655 if (!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
|
656 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
|
657 } |
3f29e2726522
Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents:
2074
diff
changeset
|
658 media->buffer = calloc(2048, 1); |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
659 media->size = fread(media->buffer, 1, 2048, f); |
2079
5a2b759f6b2d
BIOS doesn't like it if TOC read happens too quickly
Michael Pavone <pavone@retrodev.com>
parents:
2076
diff
changeset
|
660 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
|
661 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
|
662 media->tracks[0] = (track_info){ |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
663 .f = f, |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
664 .file_offset = 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
|
665 .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
|
666 .start_lba = 0, |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
667 .end_lba = file_size(f), |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
668 .sector_bytes = 2048, |
2116
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
669 .has_subcodes = SUBCODES_NONE, |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
670 .need_swap = 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
|
671 .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
|
672 }; |
3f29e2726522
Added basic support for ISO images for games that only have a data track
Michael Pavone <pavone@retrodev.com>
parents:
2074
diff
changeset
|
673 media->type = MEDIA_CDROM; |
2114
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
674 media->seek = bin_seek; |
2449c88cea36
Enhance support for CUE files and add initial support for cdrdao TOC files
Michael Pavone <pavone@retrodev.com>
parents:
2089
diff
changeset
|
675 media->read = bin_read; |
2116
cd057d6fe030
Initial stab at subcode emulation
Michael Pavone <pavone@retrodev.com>
parents:
2114
diff
changeset
|
676 media->read_subcodes = bin_subcode_read; |
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
|
677 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
|
678 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
679 |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
680 void cdimage_serialize(system_media *media, serialize_buffer *buf) |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
681 { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
682 if (media->type != MEDIA_CDROM) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
683 return; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
684 } |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
685 save_int32(buf, media->cur_track); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
686 save_int32(buf, media->cur_sector); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
687 if (media->cur_track < media->num_tracks && media->tracks[media->cur_track].f) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
688 save_int32(buf, ftell(media->tracks[media->cur_track].f)); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
689 } else { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
690 save_int32(buf, 0); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
691 } |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
692 save_int8(buf, media->in_fake_pregap); |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
693 save_int8(buf, media->byte_storage[0]); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
694 if (media->tmp_buffer) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
695 save_buffer8(buf, media->tmp_buffer, 96); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
696 } |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
697 save_int8(buf, media->byte_storage[1]); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
698 save_int8(buf, media->byte_storage[2]); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
699 } |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
700 |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
701 void cdimage_deserialize(deserialize_buffer *buf, void *vmedia) |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
702 { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
703 system_media *media = vmedia; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
704 if (media->type != MEDIA_CDROM) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
705 return; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
706 } |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
707 media->cur_track = load_int32(buf); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
708 media->cur_sector = load_int32(buf); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
709 uint32_t seekpos = load_int32(buf); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
710 if (media->cur_track < media->num_tracks && media->tracks[media->cur_track].f) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
711 fseek(media->tracks[media->cur_track].f, seekpos, SEEK_SET); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
712 } |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
713 media->in_fake_pregap = load_int8(buf); |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
714 media->byte_storage[0] = load_int8(buf); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
715 if (media->tmp_buffer) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
716 load_buffer8(buf, media->tmp_buffer, 96); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
717 } |
2298
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
718 if (buf->size - buf->cur_pos >= 2) { |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
719 media->byte_storage[1] = load_int8(buf); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
720 media->byte_storage[2] = load_int8(buf); |
9d68799f945b
Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
Michael Pavone <pavone@retrodev.com>
parents:
2288
diff
changeset
|
721 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2250
diff
changeset
|
722 } |