Start working on XA-ADCPM

This commit is contained in:
allkern
2023-09-18 14:32:21 -03:00
parent 7b79768480
commit 49a2e2abe3
3 changed files with 94 additions and 31 deletions
+14 -31
View File
@@ -8,6 +8,7 @@
#define RESP_PUSH(data) \
cdrom->rfifo[cdrom->rfifo_index++] = data; \
cdrom->rfifo_index &= 15; \
SET_BITS(status, STAT_RSLRRDY_MASK, STAT_RSLRRDY_MASK);
#define PFIFO_POP (cdrom->pfifo[--cdrom->pfifo_index])
@@ -130,10 +131,6 @@ void cdrom_cmd_setloc(psx_cdrom_t* cdrom) {
// Read ongoing
case CD_STATE_SEND_RESP2: {
// log_set_quiet(0);
log_fatal("SETLOC WHILE READN");
// log_set_quiet(0+0);
int f = PFIFO_POP;
int s = PFIFO_POP;
int m = PFIFO_POP;
@@ -321,9 +318,7 @@ void cdrom_cmd_readn(psx_cdrom_t* cdrom) {
// );
if (cdrom->dfifo[0x12] & 0x20) {
// log_set_quiet(0);
log_fatal("Unimplemented XA Form2 Sector");
// log_set_quiet(0+0);
// exit(1);
}
@@ -791,23 +786,19 @@ void cdrom_cmd_getid(psx_cdrom_t* cdrom) {
}
}
void cdrom_cmd_reads(psx_cdrom_t* cdrom) {
log_fatal("reads: Unimplemented");
//exit(1);
cdrom->delayed_command = CDL_NONE;
cdrom->read_ongoing = 1;
switch (cdrom->state) {
case CD_STATE_RECV_CMD: {
log_fatal("CdlReadN: CD_STATE_RECV_CMD");
log_fatal("CdlReadS: CD_STATE_RECV_CMD");
cdrom->irq_delay = DELAY_1MS;
cdrom->state = CD_STATE_SEND_RESP1;
cdrom->delayed_command = CDL_READS;
} break;
case CD_STATE_SEND_RESP1: {
log_fatal("CdlReadN: CD_STATE_SEND_RESP1");
log_fatal("CdlReadS: CD_STATE_SEND_RESP1");
SET_BITS(ifr, IFR_INT, IFR_INT3);
RESP_PUSH(GETSTAT_MOTOR);
@@ -820,12 +811,10 @@ void cdrom_cmd_reads(psx_cdrom_t* cdrom) {
msf_from_bcd(&msf);
cdrom->seek_pending = 0;
int err = psx_disc_seek(cdrom->disc, msf);
if (err) {
log_fatal("CdlReadN: Out of bounds seek");
log_fatal("CdlReadS: Out of bounds seek");
cdrom->irq_delay = DELAY_1MS * 600;
cdrom->delayed_command = CDL_ERROR;
@@ -853,7 +842,7 @@ void cdrom_cmd_reads(psx_cdrom_t* cdrom) {
// circumvent this detection code, but it will work
// for most intents and purposes
if (!correct_msf) {
log_fatal("CdlReadN: Audio read");
log_fatal("CdlReadS: Audio read");
cdrom->irq_delay = DELAY_1MS * 600;
cdrom->delayed_command = CDL_ERROR;
@@ -877,7 +866,7 @@ void cdrom_cmd_reads(psx_cdrom_t* cdrom) {
} break;
case CD_STATE_SEND_RESP2: {
log_fatal("CdlReadN: CD_STATE_SEND_RESP2");
log_fatal("CdlReadS: CD_STATE_SEND_RESP2");
msf_t msf;
@@ -890,21 +879,15 @@ void cdrom_cmd_reads(psx_cdrom_t* cdrom) {
psx_disc_seek(cdrom->disc, msf);
psx_disc_read_sector(cdrom->disc, cdrom->dfifo);
// printf("Sector header: msf=%02x:%02x:%02x, mode=%02x, subheader=%02x,%02x,%02x,%02x\n",
// cdrom->dfifo[0x0c],
// cdrom->dfifo[0x0d],
// cdrom->dfifo[0x0e],
// cdrom->dfifo[0x0f],
// cdrom->dfifo[0x10],
// cdrom->dfifo[0x11],
// cdrom->dfifo[0x12],
// cdrom->dfifo[0x13]
// );
if (cdrom->mode & MODE_XA_ADPCM) {
cdrom->state = CD_STATE_RECV_CMD;
cdrom->delayed_command = CDL_NONE;
return;
}
if (cdrom->dfifo[0x12] & 0x20) {
// log_set_quiet(0);
log_fatal("Unimplemented XA Form2 Sector");
// log_set_quiet(0+0);
// exit(1);
}
@@ -921,7 +904,7 @@ void cdrom_cmd_reads(psx_cdrom_t* cdrom) {
cdrom->irq_delay = double_speed ? READ_DOUBLE_DELAY : READ_SINGLE_DELAY;
cdrom->state = CD_STATE_SEND_RESP2;
cdrom->delayed_command = CDL_READN;
cdrom->delayed_command = CDL_READS;
cdrom->dfifo_index = 0;
SET_BITS(ifr, IFR_INT, IFR_INT1);
@@ -1069,7 +1052,7 @@ void cdrom_write_cmd(psx_cdrom_t* cdrom, uint8_t value) {
cdrom->pfifo[4],
cdrom->pfifo[5]
);
// log_set_quiet(0+0);
// log_set_quiet(1);
cdrom->command = value;
cdrom->state = CD_STATE_RECV_CMD;
+11
View File
@@ -0,0 +1,11 @@
#include "xa.h"
#include <stdint.h>
void xa_decode_audio(uint8_t* src, uint16_t* dst) {
// Not a XA sector
if (src[XA_HDR_MODE] != 0x02)
return;
// uint8_t ci = src[XA_SHDR_CODINGINFO];
}
+69
View File
@@ -0,0 +1,69 @@
#ifndef XA_H
#define XA_H
/*
000h 0Ch Sync
00Ch 4 Header (Minute,Second,Sector,Mode=02h)
010h 4 Sub-Header (File, Channel, Submode with bit5=1, Codinginfo)
014h 4 Copy of Sub-Header
018h 914h Data (2324 bytes)
92Ch 4 EDC (checksum accross [010h..92Bh]) (or 00000000h if no EDC)
*/
enum {
XA_HDR_MINUTE = 0x0c,
XA_HDR_SECOND,
XA_HDR_SECTOR,
XA_HDR_MODE,
XA_SHDR_FILE,
XA_SHDR_CHANNEL,
XA_SHDR_SUBMODE,
XA_SHDR_CODINGINFO
};
/*
0 End of Record (EOR) (all Volume Descriptors, and all sectors with EOF)
1 Video ;\Sector Type (usually ONE of these bits should be set)
2 Audio ; Note: PSX .STR files are declared as Data (not as Video)
3 Data ;/
4 Trigger (for application use)
5 Form2 (0=Form1/800h-byte data, 1=Form2, 914h-byte data)
6 Real Time (RT)
7 End of File (EOF) (or end of Directory/PathTable/VolumeTerminator)
*/
enum {
XA_SM_EOR = 0x01,
XA_SM_VIDEO = 0x02,
XA_SM_AUDIO = 0x04,
XA_SM_DATA = 0x08,
XA_SM_TRIG = 0x10,
XA_SM_FORM2 = 0x20,
XA_SM_RT = 0x40,
XA_SM_EOF = 0x80
};
/*
0-1 Mono/Stereo (0=Mono, 1=Stereo, 2-3=Reserved)
2-2 Sample Rate (0=37800Hz, 1=18900Hz, 2-3=Reserved)
4-5 Bits per Sample (0=Normal/4bit, 1=8bit, 2-3=Reserved)
6 Emphasis (0=Normal/Off, 1=Emphasis)
7 Reserved (0)
*/
enum {
XA_CI_MODE = 0x03,
XA_CI_SAMPLERATE = 0x0c,
XA_CI_BPS = 0x30,
XA_CI_EMPHASIS = 0x40,
XA_CI_MONO = 0x00,
XA_CI_STEREO = 0x01,
XA_CI_37800HZ = 0x00,
XA_CI_18900HZ = 0x04,
XA_CI_4BIT = 0x00,
XA_CI_8BIT = 0x10
};
void xa_decode_sector(void*, void*);
#endif