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) {