1 // license:BSD-3-Clause
\r
2 // copyright-holders:Aaron Giles
\r
3 /***************************************************************************
\r
7 Generic MAME cd-rom implementation
\r
9 ***************************************************************************/
\r
19 /***************************************************************************
\r
21 ***************************************************************************/
\r
23 // tracks are padded to a multiple of this many frames
\r
24 extern const uint32_t CD_TRACK_PADDING;
\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
30 #define CD_FRAME_SIZE (CD_MAX_SECTOR_DATA + CD_MAX_SUBCODE_DATA)
\r
31 #define CD_FRAMES_PER_HUNK (8)
\r
33 #define CD_METADATA_WORDS (1+(CD_MAX_TRACKS * 6))
\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
46 CD_TRACK_RAW_DONTCARE /* special flag for cdrom_read_data: just return me whatever is there */
\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
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
59 /***************************************************************************
\r
61 ***************************************************************************/
\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
70 /***************************************************************************
\r
72 ***************************************************************************/
\r
74 static inline uint32_t msf_to_lba(uint32_t msf)
\r
76 return ( ((msf&0x00ff0000)>>16) * 60 * 75) + (((msf&0x0000ff00)>>8) * 75) + ((msf&0x000000ff)>>0);
\r
79 static inline uint32_t lba_to_msf(uint32_t lba)
\r
83 m = lba / (60 * 75);
\r
84 lba -= m * (60 * 75);
\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
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
100 ret |= ((lba / (60 * 75))&0xff)<<16;
\r
101 ret |= (((lba / 75) % 60)&0xff)<<8;
\r
102 ret |= ((lba % 75)&0xff)<<0;
\r
107 #endif // __CDROM_H__
\r