Merge pull request #370 from negativeExponent/switch
[pcsx_rearmed.git] / deps / libchdr / cdrom.h
CommitLineData
ce188d4d 1// license:BSD-3-Clause\r
2// copyright-holders:Aaron Giles\r
3/***************************************************************************\r
4\r
5 cdrom.h\r
6\r
7 Generic MAME cd-rom implementation\r
8\r
9***************************************************************************/\r
10\r
11#pragma once\r
12\r
13#ifndef __CDROM_H__\r
14#define __CDROM_H__\r
15\r
16#include <stdint.h>\r
17\r
18\r
19/***************************************************************************\r
20 CONSTANTS\r
21***************************************************************************/\r
22\r
23// tracks are padded to a multiple of this many frames\r
24extern const uint32_t CD_TRACK_PADDING;\r
25\r
26#define CD_MAX_TRACKS (99) /* AFAIK the theoretical limit */\r
27#define CD_MAX_SECTOR_DATA (2352)\r
28#define CD_MAX_SUBCODE_DATA (96)\r
29\r
30#define CD_FRAME_SIZE (CD_MAX_SECTOR_DATA + CD_MAX_SUBCODE_DATA)\r
31#define CD_FRAMES_PER_HUNK (8)\r
32\r
33#define CD_METADATA_WORDS (1+(CD_MAX_TRACKS * 6))\r
34\r
35enum\r
36{\r
37 CD_TRACK_MODE1 = 0, /* mode 1 2048 bytes/sector */\r
38 CD_TRACK_MODE1_RAW, /* mode 1 2352 bytes/sector */\r
39 CD_TRACK_MODE2, /* mode 2 2336 bytes/sector */\r
40 CD_TRACK_MODE2_FORM1, /* mode 2 2048 bytes/sector */\r
41 CD_TRACK_MODE2_FORM2, /* mode 2 2324 bytes/sector */\r
42 CD_TRACK_MODE2_FORM_MIX, /* mode 2 2336 bytes/sector */\r
43 CD_TRACK_MODE2_RAW, /* mode 2 2352 bytes / sector */\r
44 CD_TRACK_AUDIO, /* redbook audio track 2352 bytes/sector (588 samples) */\r
45\r
46 CD_TRACK_RAW_DONTCARE /* special flag for cdrom_read_data: just return me whatever is there */\r
47};\r
48\r
49enum\r
50{\r
51 CD_SUB_NORMAL = 0, /* "cooked" 96 bytes per sector */\r
52 CD_SUB_RAW, /* raw uninterleaved 96 bytes per sector */\r
53 CD_SUB_NONE /* no subcode data stored */\r
54};\r
55\r
56#define CD_FLAG_GDROM 0x00000001 // disc is a GD-ROM, all tracks should be stored with GD-ROM metadata\r
57#define CD_FLAG_GDROMLE 0x00000002 // legacy GD-ROM, with little-endian CDDA data\r
58\r
59/***************************************************************************\r
60 FUNCTION PROTOTYPES\r
61***************************************************************************/\r
62\r
63// ECC utilities\r
64int ecc_verify(const uint8_t *sector);\r
65void ecc_generate(uint8_t *sector);\r
66void ecc_clear(uint8_t *sector);\r
67\r
68\r
69\r
70/***************************************************************************\r
71 INLINE FUNCTIONS\r
72***************************************************************************/\r
73\r
74static inline uint32_t msf_to_lba(uint32_t msf)\r
75{\r
76 return ( ((msf&0x00ff0000)>>16) * 60 * 75) + (((msf&0x0000ff00)>>8) * 75) + ((msf&0x000000ff)>>0);\r
77}\r
78\r
79static inline uint32_t lba_to_msf(uint32_t lba)\r
80{\r
81 uint8_t m, s, f;\r
82\r
83 m = lba / (60 * 75);\r
84 lba -= m * (60 * 75);\r
85 s = lba / 75;\r
86 f = lba % 75;\r
87\r
88 return ((m / 10) << 20) | ((m % 10) << 16) |\r
89 ((s / 10) << 12) | ((s % 10) << 8) |\r
90 ((f / 10) << 4) | ((f % 10) << 0);\r
91}\r
92\r
93// segacd needs it like this.. investigate\r
94// Angelo also says PCE tracks often start playing at the\r
95// wrong address.. related?\r
96static inline uint32_t lba_to_msf_alt(int lba)\r
97{\r
98 uint32_t ret = 0;\r
99\r
100 ret |= ((lba / (60 * 75))&0xff)<<16;\r
101 ret |= (((lba / 75) % 60)&0xff)<<8;\r
102 ret |= ((lba % 75)&0xff)<<0;\r
103\r
104 return ret;\r
105}\r
106\r
107#endif // __CDROM_H__\r