Merge pull request #370 from negativeExponent/switch
[pcsx_rearmed.git] / deps / libchdr / cdrom.h
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
24 extern 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
35 enum\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
49 enum\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
64 int ecc_verify(const uint8_t *sector);\r
65 void ecc_generate(uint8_t *sector);\r
66 void ecc_clear(uint8_t *sector);\r
67 \r
68 \r
69 \r
70 /***************************************************************************\r
71     INLINE FUNCTIONS\r
72 ***************************************************************************/\r
73 \r
74 static 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
79 static 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
96 static 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