1
0
mirror of https://github.com/mist-devel/mist-firmware.git synced 2026-01-13 15:17:43 +00:00

HDD: some support for reading CD-XA sectors

This commit is contained in:
Gyorgy Szombathelyi 2022-09-06 04:29:15 +02:00
parent 267d9993a5
commit 48b8599c6d
3 changed files with 18 additions and 12 deletions

View File

@ -21,6 +21,7 @@
#define TOKEN_MODE1_2048 "MODE1/2048"
#define TOKEN_MODE1_2352 "MODE1/2352"
#define TOKEN_MODE2_2352 "MODE2/2352"
#define TOKEN_MODE2_2336 "MODE2/2336"
#define TOKEN_PREGAP "PREGAP"
#define TOKEN_INDEX "INDEX"
@ -166,7 +167,7 @@ char cue_parse(const char *filename, IDXFile *image)
bin_valid = 1;
track = 1;
toc.tracks[0].sector_size = 2048;
toc.tracks[0].type = SECTOR_DATA;
toc.tracks[0].type = SECTOR_DATA_MODE1;
toc.tracks[0].offset = 0;
toc.tracks[0].start = 0;
} else {
@ -244,13 +245,16 @@ char cue_parse(const char *filename, IDXFile *image)
toc.tracks[track-1].type = SECTOR_AUDIO;
} else if (!strcmp(word, TOKEN_MODE1_2352)) {
toc.tracks[track-1].sector_size = 2352;
toc.tracks[track-1].type = SECTOR_DATA;
toc.tracks[track-1].type = SECTOR_DATA_MODE1;
} else if (!strcmp(word, TOKEN_MODE2_2352)) {
toc.tracks[track-1].sector_size = 2352;
toc.tracks[track-1].type = SECTOR_DATA;
toc.tracks[track-1].type = SECTOR_DATA_MODE2;
} else if (!strcmp(word, TOKEN_MODE2_2336)) {
toc.tracks[track-1].sector_size = 2336;
toc.tracks[track-1].type = SECTOR_DATA_MODE2;
} else if (!strcmp(word, TOKEN_MODE1_2048)) {
toc.tracks[track-1].sector_size = 2048;
toc.tracks[track-1].type = SECTOR_DATA;
toc.tracks[track-1].type = SECTOR_DATA_MODE1;
} else {
error = CUE_RES_INVALID;
}

View File

@ -7,7 +7,8 @@
#endif
#define SECTOR_AUDIO 0
#define SECTOR_DATA 1
#define SECTOR_DATA_MODE1 1
#define SECTOR_DATA_MODE2 2
#define CUE_RES_OK 0
#define CUE_RES_NOTFOUND 1

15
hdd.c
View File

@ -442,11 +442,10 @@ static void PKT_Read(unsigned char unit, unsigned int lba, unsigned int len, uns
while (len--) {
unsigned char track = cue_gettrackbylba(lba);
int offset = (lba - toc.tracks[track].start) * toc.tracks[track].sector_size + toc.tracks[track].offset;
hdd_debugf("lba: %d track: %d, offset: %d", lba, track, offset);
if ((blocksize == 2048 && toc.tracks[track].type != SECTOR_DATA) ||
if ((blocksize == 2048 && toc.tracks[track].type != SECTOR_DATA_MODE1 && toc.tracks[track].type != SECTOR_DATA_MODE2) ||
(blocksize != 2048 && blocksize !=2352) ||
(toc.tracks[track].sector_size != 2048 && toc.tracks[track].sector_size != 2352)) {
(toc.tracks[track].sector_size != 2048 && toc.tracks[track].sector_size != 2352 && toc.tracks[track].sector_size != 2336)) {
cdrom_setsense(SENSEKEY_ILLEGAL_REQUEST, 0x26, 2);
cdrom_send_error(unit);
return;
@ -454,10 +453,12 @@ static void PKT_Read(unsigned char unit, unsigned int lba, unsigned int len, uns
pBuffer = sector_buffer;
cdrom.currentlba = lba;
if (blocksize == 2048 && toc.tracks[track].sector_size == 2352) offset+=16;
if (blocksize == 2352 && toc.tracks[track].sector_size == 2048) {
if (blocksize == 2048 && toc.tracks[track].sector_size >= 2336 && toc.tracks[track].type == SECTOR_DATA_MODE2) offset+=8; // CD-XA with 8 subheader bytes
if (blocksize == 2352 && (toc.tracks[track].sector_size == 2048 || toc.tracks[track].sector_size == 2336)) {
cdrom_generate_header(pBuffer, lba);
pBuffer+=16;
}
hdd_debugf("lba: %d track: %d, offset: %d, blocksize: %d sector_size: %d", lba, track, offset, blocksize, toc.tracks[track].sector_size);
f_lseek(&toc.file->file, offset);
f_read(&toc.file->file, pBuffer, MIN(toc.tracks[track].sector_size, blocksize), &br);
if (blocksize == 2352 && toc.tracks[track].sector_size == 2048) {
@ -629,7 +630,7 @@ static void PKT_SubChannel(unsigned char *cmd, unsigned char unit, unsigned shor
// current position
respsize = (cmd[2] & 0x40) ? 16 : 4;
sector_buffer[4] = 0x01;
sector_buffer[5] = (1 << 4) | ((toc.tracks[track-1].type == SECTOR_DATA) ? 4 : 0);
sector_buffer[5] = (1 << 4) | (toc.tracks[track-1].type == SECTOR_AUDIO ? 0 : 4);
sector_buffer[6] = track + 1;
sector_buffer[7] = cdrom.currentlba >= toc.tracks[track].start ? 1 : 0; // TODO: support more than 1 indices
unsigned int rellba = cdrom.currentlba - toc.tracks[track].start;
@ -726,7 +727,7 @@ static void PKT_ReadTOC(unsigned char *cmd, unsigned char unit, unsigned short b
for (int i=1; i<=toc.last; i++) {
if (i>=track) {
p[0] = p[3] = 0;
p[1] = (1 << 4) | ((toc.tracks[i-1].type == SECTOR_DATA) ? 4 : 0);
p[1] = (1 << 4) | (toc.tracks[i-1].type == SECTOR_AUDIO ? 0 : 4);
p[2] = i;
lba = toc.tracks[i-1].start;
hdd_debugf("track %d lba: %d", i, lba);
@ -772,7 +773,7 @@ static void PKT_ReadTOC(unsigned char *cmd, unsigned char unit, unsigned short b
tocsize = 12;
memset(sector_buffer, 0, tocsize);
sector_buffer[2] = sector_buffer[3] = 1; // first/last session numbers
sector_buffer[5] = (1 << 4) | ((toc.tracks[0].type == SECTOR_DATA) ? 4 : 0);
sector_buffer[5] = (1 << 4) | (toc.tracks[0].type == SECTOR_AUDIO ? 0 : 4);
sector_buffer[6] = 1;
lba = toc.tracks[0].start;
if (msftime) {