Mercurial > repos > blastem
comparison cdimage.c @ 2342:9f0c67e5c50a
Implement CD-ROM data sector scrambling/descrambling
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 01 Oct 2023 23:39:48 -0700 |
parents | 9d68799f945b |
children | 76dfad6a53b5 |
comparison
equal
deleted
inserted
replaced
2341:e81c6a44274c | 2342:9f0c67e5c50a |
---|---|
3 #include <stdlib.h> | 3 #include <stdlib.h> |
4 | 4 |
5 #include "system.h" | 5 #include "system.h" |
6 #include "util.h" | 6 #include "util.h" |
7 #include "wave.h" | 7 #include "wave.h" |
8 | |
9 uint8_t cdrom_scramble(uint16_t *lsfr, uint8_t data) | |
10 { | |
11 data ^= *lsfr; | |
12 uint16_t new_bit = *lsfr; | |
13 *lsfr >>= 1; | |
14 new_bit = (new_bit ^ *lsfr) & 1; | |
15 *lsfr |= new_bit << 14; | |
16 return data; | |
17 } | |
8 | 18 |
9 static char* cmd_start(char *cur) | 19 static char* cmd_start(char *cur) |
10 { | 20 { |
11 while (*cur && isblank(*cur)) | 21 while (*cur && isblank(*cur)) |
12 { | 22 { |
124 fprintf(stderr, "Only read %d subcode bytes\n", bytes); | 134 fprintf(stderr, "Only read %d subcode bytes\n", bytes); |
125 } | 135 } |
126 } | 136 } |
127 fseek(media->tracks[track].f, media->tracks[track].file_offset + lba * media->tracks[track].sector_bytes, SEEK_SET); | 137 fseek(media->tracks[track].f, media->tracks[track].file_offset + lba * media->tracks[track].sector_bytes, SEEK_SET); |
128 } | 138 } |
139 } | |
140 if (media->tracks[track].type == TRACK_DATA) { | |
141 media->cdrom_scramble_lsfr = 1; | |
129 } | 142 } |
130 } | 143 } |
131 return track; | 144 return track; |
132 } | 145 } |
133 | 146 |
152 } | 165 } |
153 } | 166 } |
154 | 167 |
155 static uint8_t bin_read(system_media *media, uint32_t offset) | 168 static uint8_t bin_read(system_media *media, uint32_t offset) |
156 { | 169 { |
170 uint8_t retval; | |
157 if (media->in_fake_pregap == FAKE_DATA) { | 171 if (media->in_fake_pregap == FAKE_DATA) { |
158 return fake_read(media->cur_sector, offset); | 172 retval = fake_read(media->cur_sector, offset); |
159 } else if (media->in_fake_pregap == FAKE_AUDIO) { | 173 } else if (media->in_fake_pregap == FAKE_AUDIO) { |
160 return 0; | 174 retval = 0; |
161 } else if ((media->tracks[media->cur_track].sector_bytes < 2352 && offset < 16) || offset > (media->tracks[media->cur_track].sector_bytes + 16)) { | 175 } else if ((media->tracks[media->cur_track].sector_bytes < 2352 && offset < 16) || offset > (media->tracks[media->cur_track].sector_bytes + 16)) { |
162 return fake_read(media->cur_sector, offset); | 176 retval = fake_read(media->cur_sector, offset); |
163 } else if (media->tracks[media->cur_track].flac) { | 177 } else if (media->tracks[media->cur_track].flac) { |
164 if (offset & 3) { | 178 if (offset & 3) { |
165 return media->byte_storage[(offset & 3) - 1]; | 179 retval = media->byte_storage[(offset & 3) - 1]; |
166 } else { | 180 } else { |
167 int16_t samples[2]; | 181 int16_t samples[2]; |
168 flac_get_sample(media->tracks[media->cur_track].flac, samples, 2); | 182 flac_get_sample(media->tracks[media->cur_track].flac, samples, 2); |
169 media->byte_storage[0] = samples[0] >> 8; | 183 media->byte_storage[0] = samples[0] >> 8; |
170 media->byte_storage[1] = samples[1]; | 184 media->byte_storage[1] = samples[1]; |
171 media->byte_storage[2] = samples[1] >> 8; | 185 media->byte_storage[2] = samples[1] >> 8; |
172 return samples[0]; | 186 retval = samples[0]; |
173 } | 187 } |
174 } else { | 188 } else { |
175 if (media->tracks[media->cur_track].need_swap) { | 189 if (media->tracks[media->cur_track].need_swap) { |
176 if (offset & 1) { | 190 if (offset & 1) { |
177 return media->byte_storage[0]; | 191 retval = media->byte_storage[0]; |
178 } | 192 } |
179 media->byte_storage[0] = fgetc(media->tracks[media->cur_track].f); | 193 media->byte_storage[0] = fgetc(media->tracks[media->cur_track].f); |
180 } | 194 } else { |
181 return fgetc(media->tracks[media->cur_track].f); | 195 retval = fgetc(media->tracks[media->cur_track].f); |
182 } | 196 } |
197 } | |
198 if (offset >= 12 && media->tracks[media->cur_track].type == TRACK_DATA) { | |
199 retval = cdrom_scramble(&media->cdrom_scramble_lsfr, retval); | |
200 } | |
201 return retval; | |
183 } | 202 } |
184 | 203 |
185 static uint8_t bin_subcode_read(system_media *media, uint32_t offset) | 204 static uint8_t bin_subcode_read(system_media *media, uint32_t offset) |
186 { | 205 { |
187 if (media->in_fake_pregap || !media->tracks[media->cur_track].has_subcodes) { | 206 if (media->in_fake_pregap || !media->tracks[media->cur_track].has_subcodes) { |