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 #include <retro_inline.h>
19 
20 /***************************************************************************
21     CONSTANTS
22 ***************************************************************************/
23 
24 // tracks are padded to a multiple of this many frames
25 extern const uint32_t CD_TRACK_PADDING;
26 
27 #define CD_MAX_TRACKS           (99)    /* AFAIK the theoretical limit */
28 #define CD_MAX_SECTOR_DATA      (2352)
29 #define CD_MAX_SUBCODE_DATA     (96)
30 
31 #define CD_FRAME_SIZE           (CD_MAX_SECTOR_DATA + CD_MAX_SUBCODE_DATA)
32 #define CD_FRAMES_PER_HUNK      (8)
33 
34 #define CD_METADATA_WORDS       (1+(CD_MAX_TRACKS * 6))
35 
36 enum
37 {
38 	CD_TRACK_MODE1 = 0,         /* mode 1 2048 bytes/sector */
39 	CD_TRACK_MODE1_RAW,         /* mode 1 2352 bytes/sector */
40 	CD_TRACK_MODE2,             /* mode 2 2336 bytes/sector */
41 	CD_TRACK_MODE2_FORM1,       /* mode 2 2048 bytes/sector */
42 	CD_TRACK_MODE2_FORM2,       /* mode 2 2324 bytes/sector */
43 	CD_TRACK_MODE2_FORM_MIX,    /* mode 2 2336 bytes/sector */
44 	CD_TRACK_MODE2_RAW,         /* mode 2 2352 bytes / sector */
45 	CD_TRACK_AUDIO,         /* redbook audio track 2352 bytes/sector (588 samples) */
46 
47 	CD_TRACK_RAW_DONTCARE       /* special flag for cdrom_read_data: just return me whatever is there */
48 };
49 
50 enum
51 {
52 	CD_SUB_NORMAL = 0,          /* "cooked" 96 bytes per sector */
53 	CD_SUB_RAW,                 /* raw uninterleaved 96 bytes per sector */
54 	CD_SUB_NONE                 /* no subcode data stored */
55 };
56 
57 #define CD_FLAG_GDROM   0x00000001  // disc is a GD-ROM, all tracks should be stored with GD-ROM metadata
58 #define CD_FLAG_GDROMLE 0x00000002  // legacy GD-ROM, with little-endian CDDA data
59 
60 /***************************************************************************
61     FUNCTION PROTOTYPES
62 ***************************************************************************/
63 
64 // ECC utilities
65 int ecc_verify(const uint8_t *sector);
66 void ecc_generate(uint8_t *sector);
67 void ecc_clear(uint8_t *sector);
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 // segacd needs it like this.. investigate
95 // Angelo also says PCE tracks often start playing at the
96 // wrong address.. related?
lba_to_msf_alt(int lba)97 static INLINE uint32_t lba_to_msf_alt(int lba)
98 {
99 	uint32_t ret = 0;
100 
101 	ret |= ((lba / (60 * 75))&0xff)<<16;
102 	ret |= (((lba / 75) % 60)&0xff)<<8;
103 	ret |= ((lba % 75)&0xff)<<0;
104 
105 	return ret;
106 }
107 
108 #endif  // __CDROM_H__
109