aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/include/psxcd.h
blob: 0460f206a22e1cc0efde5ae9bb5073548ba6db2c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
 * PSn00bSDK CD-ROM drive library
 * (C) 2019-2022 Lameguy64, spicyjpeg - MPL licensed
 */

#ifndef __PSXCD_H
#define __PSXCD_H

#include <stdint.h>

/*
 * CD-ROM control commands
 */
#define CdlNop				0x01	/* a.k.a. Getstat */
#define CdlSetloc			0x02
#define CdlPlay				0x03
#define CdlForward			0x04
#define CdlBackward			0x05
#define CdlReadN			0x06
#define CdlStandby			0x07	/* a.k.a. MotorOn */
#define CdlStop				0x08
#define CdlPause			0x09
#define CdlInit				0x0A
#define CdlMute				0x0B
#define CdlDemute			0x0C
#define CdlSetfilter		0x0D
#define CdlSetmode			0x0E
#define CdlGetparam			0x0F
#define CdlGetlocL			0x10
#define CdlGetlocP			0x11
#define CdlSetsession		0x12	/* ORIGINAL CODE */
#define CdlGetTN			0x13
#define CdlGetTD			0x14
#define CdlSeekL			0x15
#define CdlSeekP			0x16
#define CdlTest				0x19	/* ORIGINAL CODE */
#define CdlReadS			0x1B

/*
 * CD-ROM status bits
 */
#define CdlStatError		0x01
#define CdlStatStandby		0x02
#define CdlStatSeekError	0x04
#define CdlStatIdError		0x08	/* ORIGINAL CODE */
#define CdlStatShellOpen	0x10
#define CdlStatRead			0x20
#define CdlStatSeek			0x40
#define CdlStatPlay			0x80

/*
 * CD-ROM mode bits
 */
#define CdlModeDA			0x01
#define CdlModeAP			0x02
#define CdlModeRept			0x04
#define CdlModeSF			0x08
//#define CdlModeSize0		0x10
//#define CdlModeSize1		0x20
#define CdlModeIgnore		0x10
#define CdlModeSize			0x20
#define CdlModeRT			0x40
#define CdlModeSpeed		0x80

/*
 * CD-ROM interrupt result values
 */
#define CdlNoIntr			0x00
#define CdlDataReady		0x01
#define CdlComplete			0x02
#define CdlAcknowledge		0x03
#define CdlDataEnd			0x04
#define CdlDiskError		0x05

/*
 * CD-ROM file system error codes (original)
 */
#define CdlIsoOkay			0x00
#define CdlIsoSeekError		0x01
#define CdlIsoReadError		0x02
#define CdlIsoInvalidFs		0x03
#define CdlIsoLidOpen		0x04

#define btoi(b) ((b)/16*10+(b)%16)	/* Convert BCD value to integer */
#define itob(i) ((i)/10*16+(i)%10)	/* Convert integer to BCD value */

/*
 * CD-ROM disc location struct
 */
typedef struct _CdlLOC
{
	uint8_t minute;
	uint8_t second;
	uint8_t sector;
	uint8_t track;
} CdlLOC;

/*
 * CD-ROM audio attenuation struct (volume)
 */
typedef struct _CdlATV
{
	uint8_t val0;	/* L -> SPU L */
	uint8_t val1;	/* L -> SPU R */
	uint8_t val2;	/* R -> SPU R */
	uint8_t val3;	/* R -> SPU L */
} CdlATV;

/*
 * CD-ROM file information struct
 */
typedef struct _CdlFILE
{
	CdlLOC		pos;
	uint32_t	size;
	char		name[16];
} CdlFILE;

typedef struct _CdlFILTER
{
	uint8_t		file;
	uint8_t		chan;
	uint16_t	pad;
} CdlFILTER;

/* Directory query context */
typedef void* CdlDIR;

/* Data callback */
typedef void (*CdlCB)(int, uint8_t *);

#ifdef __cplusplus
extern "C" {
#endif

int CdInit(void);

CdlLOC* CdIntToPos(int i, CdlLOC *p);
int CdPosToInt(CdlLOC *p);
int CdGetToc(CdlLOC *toc);

int CdControl(uint8_t com, const void *param, uint8_t *result);
int CdControlB(uint8_t com, const void *param, uint8_t *result);
int CdControlF(uint8_t com, const void *param);
int CdSync(int mode, uint8_t *result);
uint32_t CdSyncCallback(CdlCB func);

int CdReadyCallback(CdlCB func);
int CdGetSector(void *madr, int size);
int CdGetSector2(void *madr, int size);
int CdDataSync(int mode);

CdlFILE* CdSearchFile(CdlFILE *loc, const char *filename);

int CdRead(int sectors, uint32_t *buf, int mode);
int CdReadSync(int mode, uint8_t *result);
uint32_t CdReadCallback(CdlCB func);

int CdStatus(void);
int CdMode(void);

int CdMix(CdlATV *vol);

/* ORIGINAL CODE */
CdlDIR* CdOpenDir(const char* path);
int CdReadDir(CdlDIR* dir, CdlFILE* file);
void CdCloseDir(CdlDIR* dir);

int CdGetVolumeLabel(char* label);

int* CdAutoPauseCallback(void(*func)());
int CdIsoError();

int CdLoadSession(int session);

#ifdef __cplusplus
}
#endif

#endif