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