nkeynes@1097: /** nkeynes@1097: * $Id$ nkeynes@1097: * nkeynes@1097: * Global cdrom definitions. nkeynes@1097: * nkeynes@1097: * Copyright (c) 2009 Nathan Keynes. nkeynes@1097: * nkeynes@1097: * This program is free software; you can redistribute it and/or modify nkeynes@1097: * it under the terms of the GNU General Public License as published by nkeynes@1097: * the Free Software Foundation; either version 2 of the License, or nkeynes@1097: * (at your option) any later version. nkeynes@1097: * nkeynes@1097: * This program is distributed in the hope that it will be useful, nkeynes@1097: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@1097: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@1097: * GNU General Public License for more details. nkeynes@1097: */ nkeynes@1097: nkeynes@1097: #ifndef cdrom_defs_H nkeynes@1097: #define cdrom_defs_H 1 nkeynes@1097: nkeynes@1097: #include "lxdream.h" nkeynes@1097: #include nkeynes@1296: #include nkeynes@1097: nkeynes@1097: nkeynes@1097: #ifdef __cplusplus nkeynes@1097: extern "C" { nkeynes@1097: #endif nkeynes@1097: nkeynes@1097: typedef uint32_t cdrom_lba_t; nkeynes@1097: typedef uint32_t cdrom_count_t; nkeynes@1097: nkeynes@1097: /** Tracks are numbered 1..99, with 0 reserved for errors */ nkeynes@1097: typedef uint8_t cdrom_trackno_t; nkeynes@1097: nkeynes@1097: typedef uint8_t cdrom_sessionno_t; nkeynes@1097: nkeynes@1097: typedef const struct cdrom_track *cdrom_track_t; nkeynes@1097: typedef struct cdrom_disc *cdrom_disc_t; nkeynes@1097: nkeynes@1097: /** sector read mode - values are based on the MMC READ CD command. */ nkeynes@1097: typedef uint16_t cdrom_read_mode_t; nkeynes@1097: #define CDROM_READ_ANY (0<<2) nkeynes@1097: #define CDROM_READ_CDDA (1<<2) nkeynes@1097: #define CDROM_READ_MODE1 (2<<2) nkeynes@1097: #define CDROM_READ_MODE2 (3<<2) nkeynes@1097: #define CDROM_READ_MODE2_FORM1 (4<<2) nkeynes@1097: #define CDROM_READ_MODE2_FORM2 (5<<2) nkeynes@1097: nkeynes@1097: #define CDROM_READ_NONE 0x0000 nkeynes@1097: #define CDROM_READ_SYNC 0x8000 nkeynes@1097: #define CDROM_READ_DATA 0x1000 nkeynes@1097: #define CDROM_READ_ECC 0x0800 nkeynes@1097: #define CDROM_READ_HEADER 0x2000 nkeynes@1097: #define CDROM_READ_SUBHEADER 0x4000 nkeynes@1097: #define CDROM_READ_RAW 0xF800 /* Read full sector */ nkeynes@1097: #define CDROM_READ_TYPE(x) ((x) & 0x1C) nkeynes@1097: #define CDROM_READ_FIELDS(x) ((x) & 0xF800) nkeynes@1097: nkeynes@1097: /** Actual sector mode */ nkeynes@1097: typedef enum { nkeynes@1097: SECTOR_UNKNOWN, // Unknown sector mode nkeynes@1097: SECTOR_CDDA, // Standard audio track nkeynes@1097: /* Data-only modes */ nkeynes@1097: SECTOR_MODE1, // Standard CD-Rom Mode 1 data track nkeynes@1097: SECTOR_MODE2_FORMLESS, // Mode 2 data track with no sub-structure (rare) nkeynes@1097: SECTOR_MODE2_FORM1, // Mode 2/Form 1 data track (standard for multisession) nkeynes@1097: SECTOR_MODE2_FORM2, // Mode 2/Form 2 data track (also fairly uncommon). nkeynes@1097: nkeynes@1097: /* 2336-byte Mode 2 XA sector with subheader and ecc data */ nkeynes@1097: SECTOR_SEMIRAW_MODE2, nkeynes@1097: /* 2352-byte raw data sector in an XA session */ nkeynes@1097: SECTOR_RAW_XA, nkeynes@1097: /* 2352-byte raw data sector in a non-XA session */ nkeynes@1097: SECTOR_RAW_NONXA, nkeynes@1178: /* CDDA + subchannel data */ nkeynes@1178: SECTOR_CDDA_SUBCHANNEL nkeynes@1097: } sector_mode_t; nkeynes@1097: nkeynes@1097: nkeynes@1097: extern const uint32_t cdrom_sector_size[]; nkeynes@1097: extern const uint32_t cdrom_sector_read_mode[]; nkeynes@1097: #define CDROM_MAX_SECTOR_SIZE 2352 nkeynes@1097: #define CDROM_MAX_TRACKS 99 nkeynes@1097: #define CDROM_MSF_START 150 /* MSF numbering starts after the initial pregap */ nkeynes@1097: #define CDROM_FRAMES_PER_SECOND 75 nkeynes@1097: #define CDROM_SECONDS_PER_MINUTE 60 nkeynes@1097: #define CDROM_FRAMES_PER_MINUTE (CDROM_FRAMES_PER_SECOND*CDROM_SECONDS_PER_MINUTE) nkeynes@1097: #define CDROM_PREGAP 150 /* Standard pregap, in frames */ nkeynes@1097: #define CDROM_SECTOR_SIZE(x) cdrom_sector_size[x] nkeynes@1097: #define CDROM_SECTOR_READ_MODE(x) cdrom_sector_read_mode[x] nkeynes@1097: #define MSFTOLBA( m,s,f ) ((f) + ((s)*CDROM_FRAMES_PER_SECOND) + ((m)*CDROM_FRAMES_PER_MINUTE) - CDROM_MSF_START) nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Convert an 8-bit BCD number to integer form. nkeynes@1097: * Eg, 0x79 => 79 nkeynes@1097: */ nkeynes@1097: uint8_t static inline BCDTOU8( uint8_t bcd ) nkeynes@1097: { nkeynes@1097: return (bcd & 0x0F) + (((bcd & 0xF0)>>4)*10); nkeynes@1097: } nkeynes@1097: nkeynes@1097: /** nkeynes@1097: * Convert a 32 bit BCD-encoded MSF address to the nkeynes@1097: * equivalent LBA form. nkeynes@1097: * Eg, 0x nkeynes@1097: */ nkeynes@1097: cdrom_lba_t static inline BCD_MSFTOLBA( uint32_t msf ) nkeynes@1097: { nkeynes@1097: msf = GUINT32_FROM_BE(msf); nkeynes@1097: int f = BCDTOU8(msf); nkeynes@1097: int s = BCDTOU8(msf>>8); nkeynes@1097: int m = BCDTOU8(msf>>16); nkeynes@1097: return MSFTOLBA(m,s,f); nkeynes@1097: } nkeynes@1097: nkeynes@1097: /* Disc types */ nkeynes@1097: typedef uint8_t cdrom_type_t; nkeynes@1097: #define CDROM_TYPE_NONXA 0x00 /* Audio or straight mode-1 data */ nkeynes@1097: #define CDROM_TYPE_CDI 0x10 nkeynes@1097: #define CDROM_TYPE_XA 0x20 nkeynes@1097: #define CDROM_TYPE_GD 0x80 /* SEGA only */ nkeynes@1097: nkeynes@1097: nkeynes@1097: /* Error codes are defined as MMC sense data - low byte is the sense key, nkeynes@1097: * next byte, is the ASC code, and third byte is the ASCQ (not currently used) nkeynes@1097: */ nkeynes@1097: typedef uint32_t cdrom_error_t; nkeynes@1097: #define CDROM_ERROR_OK 0x0000 nkeynes@1097: #define CDROM_ERROR_NODISC 0x3A02 nkeynes@1097: #define CDROM_ERROR_BADCMD 0x2005 nkeynes@1097: #define CDROM_ERROR_BADFIELD 0x2405 nkeynes@1097: #define CDROM_ERROR_BADREAD 0x3002 nkeynes@1097: #define CDROM_ERROR_BADREADMODE 0x6405 /* Illegal mode for this track */ nkeynes@1097: #define CDROM_ERROR_READERROR 0x1103 /* Read failed due to uncorrectable error */ nkeynes@1097: #define CDROM_ERROR_RESET 0x2906 nkeynes@1097: nkeynes@1097: #ifdef __cplusplus nkeynes@1097: } nkeynes@1097: #endif nkeynes@1097: nkeynes@1097: #endif /* !cdrom_defs_H */