nkeynes@125: /** nkeynes@142: * $Id: gdrom.h,v 1.3 2006-05-02 14:09:11 nkeynes Exp $ nkeynes@125: * nkeynes@125: * This file defines the structures and functions used by the GD-Rom nkeynes@125: * disc driver. (ie, the modules that supply a CD image to be used by the nkeynes@125: * system). nkeynes@125: * nkeynes@125: * Copyright (c) 2005 Nathan Keynes. nkeynes@125: * nkeynes@125: * This program is free software; you can redistribute it and/or modify nkeynes@125: * it under the terms of the GNU General Public License as published by nkeynes@125: * the Free Software Foundation; either version 2 of the License, or nkeynes@125: * (at your option) any later version. nkeynes@125: * nkeynes@125: * This program is distributed in the hope that it will be useful, nkeynes@125: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@125: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@125: * GNU General Public License for more details. nkeynes@125: */ nkeynes@125: nkeynes@125: #ifndef dream_gdrom_H nkeynes@125: #define dream_gdrom_H 1 nkeynes@125: nkeynes@125: #include "dream.h" nkeynes@125: nkeynes@138: struct gdrom_toc { nkeynes@142: uint32_t track[99]; nkeynes@125: uint32_t first, last, leadout; nkeynes@138: }; nkeynes@138: nkeynes@138: #define GDROM_PREGAP 150 /* Sectors */ nkeynes@138: nkeynes@138: extern uint32_t gdrom_sector_size[]; nkeynes@138: #define GDROM_SECTOR_SIZE(x) gdrom_sector_size[x] nkeynes@138: typedef enum { nkeynes@138: GDROM_MODE1, nkeynes@138: GDROM_MODE2, nkeynes@138: GDROM_MODE2_XA1, nkeynes@138: GDROM_MODE2_XA2, nkeynes@138: GDROM_CDDA, nkeynes@138: GDROM_GD nkeynes@138: } gdrom_track_mode_t; nkeynes@138: nkeynes@138: /* The disc register indicates the current contents of the drive. When open nkeynes@138: * contains 0x06. nkeynes@138: */ nkeynes@138: #define IDE_DISC_AUDIO 0x00 nkeynes@138: #define IDE_DISC_NONE 0x06 nkeynes@138: #define IDE_DISC_CDROM 0x20 nkeynes@138: #define IDE_DISC_GDROM 0x80 nkeynes@138: #define IDE_DISC_READY 0x01 /* ored with above */ nkeynes@138: #define IDE_DISC_IDLE 0x02 /* ie spun-down */ nkeynes@138: nkeynes@142: #define TRACK_PRE_EMPHASIS 0x10 nkeynes@142: #define TRACK_COPY_PERMITTED 0x20 nkeynes@142: #define TRACK_DATA 0x40 nkeynes@142: #define TRACK_FOUR_CHANNEL 0x80 nkeynes@142: nkeynes@138: struct gdrom_track { nkeynes@138: gdrom_track_mode_t mode; nkeynes@142: uint8_t flags; /* Track flags */ nkeynes@138: int session; /* session # containing this track */ nkeynes@138: uint32_t lba; /* start sector address */ nkeynes@138: uint32_t sector_size; /* For convenience, determined by mode */ nkeynes@138: uint32_t sector_count; nkeynes@138: uint32_t offset; /* File offset of start of track - image files only */ nkeynes@138: }; nkeynes@125: nkeynes@125: nkeynes@125: typedef struct gdrom_disc { nkeynes@138: int disc_type; nkeynes@138: int track_count; nkeynes@138: struct gdrom_track track[99]; nkeynes@138: gchar mcn[14]; /* Media catalogue number */ nkeynes@138: const gchar *filename; /* Image filename */ nkeynes@138: FILE *file; /* Stream, for image files */ nkeynes@138: uint32_t (*read_sectors)( struct gdrom_disc *disc, nkeynes@138: uint32_t lba, uint32_t sector_count, nkeynes@138: char *buf ); nkeynes@138: void (*close)( struct gdrom_disc *disc ); nkeynes@125: } *gdrom_disc_t; nkeynes@125: nkeynes@138: /** nkeynes@138: * Construct a new image file using the default methods. nkeynes@138: */ nkeynes@138: gdrom_disc_t gdrom_image_new( FILE *file ); nkeynes@125: nkeynes@138: /** nkeynes@138: * Open an image file nkeynes@138: */ nkeynes@138: gdrom_disc_t gdrom_image_open( const gchar *filename ); nkeynes@138: gdrom_disc_t nrg_image_open( const gchar *filename ); nkeynes@138: nkeynes@138: /** nkeynes@138: * Retrieve the disc table of contents, and write it into the buffer in the nkeynes@138: * format expected by the DC. nkeynes@138: * @return TRUE on success, FALSE on failure (eg no disc mounted) nkeynes@138: */ nkeynes@138: gboolean gdrom_get_toc( char *buf ); nkeynes@138: nkeynes@138: /** nkeynes@138: * Shortcut to open and mount an image file nkeynes@138: */ nkeynes@138: gdrom_disc_t gdrom_mount_image( const gchar *filename ); nkeynes@138: nkeynes@138: void gdrom_mount_disc( gdrom_disc_t disc ); nkeynes@138: nkeynes@138: void gdrom_unmount_disc( void ); nkeynes@138: nkeynes@138: gboolean gdrom_is_mounted( void ); nkeynes@138: nkeynes@138: uint32_t gdrom_read_sectors( uint32_t sector, uint32_t sector_count, nkeynes@138: char *buf ); nkeynes@125: nkeynes@125: #endif