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