mirror of
https://github.com/ARMSX2/ARMSX1.git
synced 2026-08-24 16:53:35 -07:00
Start working on XA-ADCPM
This commit is contained in:
+14
-31
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user