Path: blob/a-new-beginning/SharedDependencies/Sources/libchdr/include/cdrom.h
2 views
/* license:BSD-3-Clause1* copyright-holders:Aaron Giles2***************************************************************************34cdrom.h56Generic MAME cd-rom implementation78***************************************************************************/910#pragma once1112#ifndef __CDROM_H__13#define __CDROM_H__1415#include <stdint.h>161718/***************************************************************************19CONSTANTS20***************************************************************************/2122/* tracks are padded to a multiple of this many frames */23extern const uint32_t CD_TRACK_PADDING;2425#define CD_MAX_TRACKS (99) /* AFAIK the theoretical limit */26#define CD_MAX_SECTOR_DATA (2352)27#define CD_MAX_SUBCODE_DATA (96)2829#define CD_FRAME_SIZE (CD_MAX_SECTOR_DATA + CD_MAX_SUBCODE_DATA)30#define CD_FRAMES_PER_HUNK (8)3132#define CD_METADATA_WORDS (1+(CD_MAX_TRACKS * 6))3334enum35{36CD_TRACK_MODE1 = 0, /* mode 1 2048 bytes/sector */37CD_TRACK_MODE1_RAW, /* mode 1 2352 bytes/sector */38CD_TRACK_MODE2, /* mode 2 2336 bytes/sector */39CD_TRACK_MODE2_FORM1, /* mode 2 2048 bytes/sector */40CD_TRACK_MODE2_FORM2, /* mode 2 2324 bytes/sector */41CD_TRACK_MODE2_FORM_MIX, /* mode 2 2336 bytes/sector */42CD_TRACK_MODE2_RAW, /* mode 2 2352 bytes / sector */43CD_TRACK_AUDIO, /* redbook audio track 2352 bytes/sector (588 samples) */4445CD_TRACK_RAW_DONTCARE /* special flag for cdrom_read_data: just return me whatever is there */46};4748enum49{50CD_SUB_NORMAL = 0, /* "cooked" 96 bytes per sector */51CD_SUB_RAW, /* raw uninterleaved 96 bytes per sector */52CD_SUB_NONE /* no subcode data stored */53};5455#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 */5758/***************************************************************************59FUNCTION PROTOTYPES60***************************************************************************/6162/* ECC utilities */63int ecc_verify(const uint8_t *sector);64void ecc_generate(uint8_t *sector);65void ecc_clear(uint8_t *sector);66676869/***************************************************************************70INLINE FUNCTIONS71***************************************************************************/7273static inline uint32_t msf_to_lba(uint32_t msf)74{75return ( ((msf&0x00ff0000)>>16) * 60 * 75) + (((msf&0x0000ff00)>>8) * 75) + ((msf&0x000000ff)>>0);76}7778static inline uint32_t lba_to_msf(uint32_t lba)79{80uint8_t m, s, f;8182m = lba / (60 * 75);83lba -= m * (60 * 75);84s = lba / 75;85f = lba % 75;8687return ((m / 10) << 20) | ((m % 10) << 16) |88((s / 10) << 12) | ((s % 10) << 8) |89((f / 10) << 4) | ((f % 10) << 0);90}9192/**93* segacd needs it like this.. investigate94* Angelo also says PCE tracks often start playing at the95* wrong address.. related?96**/97static inline uint32_t lba_to_msf_alt(int lba)98{99uint32_t ret = 0;100101ret |= ((lba / (60 * 75))&0xff)<<16;102ret |= (((lba / 75) % 60)&0xff)<<8;103ret |= ((lba % 75)&0xff)<<0;104105return ret;106}107108#endif /* __CDROM_H__ */109110111