# HG changeset patch # User nkeynes # Date 1146660758 0 # Node ID 9446fb6df0c589088e6712317484442e020fce6b # Parent 2f631c3a3946e2a9d91d92e7409f42b1d85433bb Add (track) mode parameter to read sectors call Fix missing interrupt on end-of-packet read. --- a/src/gdrom/gdrom.c Tue May 02 14:09:11 2006 +0000 +++ b/src/gdrom/gdrom.c Wed May 03 12:52:38 2006 +0000 @@ -1,5 +1,5 @@ /** - * $Id: gdrom.c,v 1.2 2006-05-02 14:09:11 nkeynes Exp $ + * $Id: gdrom.c,v 1.3 2006-05-03 12:52:38 nkeynes Exp $ * * GD-Rom access functions. * @@ -20,10 +20,11 @@ #include "gdrom/ide.h" #include "gdrom/gdrom.h" +#include "gdrom/packet.h" #include "dream.h" static void gdrom_image_destroy( gdrom_disc_t ); -static uint32_t gdrom_image_read_sectors( gdrom_disc_t, uint32_t, uint32_t, char * ); +static uint32_t gdrom_image_read_sectors( gdrom_disc_t, uint32_t, uint32_t, int, char *, uint32_t * ); gdrom_disc_t gdrom_disc = NULL; @@ -59,7 +60,8 @@ } static uint32_t gdrom_image_read_sectors( gdrom_disc_t disc, uint32_t sector, - uint32_t sector_count, char *buf ) + uint32_t sector_count, int mode, char *buf, + uint32_t *length ) { int i, track = -1, track_offset, read_len; @@ -71,21 +73,24 @@ } } if( track == -1 ) - return 0; + return PKT_ERR_BADREAD; + if( mode == GDROM_GD && disc->track[i].mode != GDROM_GD ) + return PKT_ERR_BADREADMODE; track_offset = disc->track[track].sector_size * (sector - disc->track[track].lba); read_len = disc->track[track].sector_size * sector_count; fseek( disc->file, disc->track[track].offset + track_offset, SEEK_SET ); fread( buf, disc->track[track].sector_size, sector_count, disc->file ); - return read_len; + *length = read_len; + return PKT_ERR_OK; } uint32_t gdrom_read_sectors( uint32_t sector, uint32_t sector_count, - char *buf ) + int mode, char *buf, uint32_t *length ) { if( gdrom_disc == NULL ) - return 0; /* No media */ - return gdrom_disc->read_sectors( gdrom_disc, sector, sector_count, buf ); + return PKT_ERR_NODISC; /* No media */ + return gdrom_disc->read_sectors( gdrom_disc, sector, sector_count, mode, buf, length ); } --- a/src/gdrom/gdrom.h Tue May 02 14:09:11 2006 +0000 +++ b/src/gdrom/gdrom.h Wed May 03 12:52:38 2006 +0000 @@ -1,5 +1,5 @@ /** - * $Id: gdrom.h,v 1.3 2006-05-02 14:09:11 nkeynes Exp $ + * $Id: gdrom.h,v 1.4 2006-05-03 12:52:38 nkeynes Exp $ * * This file defines the structures and functions used by the GD-Rom * disc driver. (ie, the modules that supply a CD image to be used by the @@ -38,7 +38,8 @@ GDROM_MODE2_XA1, GDROM_MODE2_XA2, GDROM_CDDA, - GDROM_GD + GDROM_GD, + GDROM_RAW } gdrom_track_mode_t; /* The disc register indicates the current contents of the drive. When open @@ -76,7 +77,7 @@ FILE *file; /* Stream, for image files */ uint32_t (*read_sectors)( struct gdrom_disc *disc, uint32_t lba, uint32_t sector_count, - char *buf ); + int mode, char *buf, uint32_t *length ); void (*close)( struct gdrom_disc *disc ); } *gdrom_disc_t; @@ -110,6 +111,6 @@ gboolean gdrom_is_mounted( void ); uint32_t gdrom_read_sectors( uint32_t sector, uint32_t sector_count, - char *buf ); + int mode, char *buf, uint32_t *length ); #endif --- a/src/gdrom/ide.c Tue May 02 14:09:11 2006 +0000 +++ b/src/gdrom/ide.c Wed May 03 12:52:38 2006 +0000 @@ -1,5 +1,5 @@ /** - * $Id: ide.c,v 1.11 2006-05-02 14:09:11 nkeynes Exp $ + * $Id: ide.c,v 1.12 2006-05-03 12:52:38 nkeynes Exp $ * * IDE interface implementation * @@ -72,7 +72,7 @@ idereg.feature = 0; /* Indeterminate really */ idereg.status = 0x00; idereg.device = 0x00; - idereg.disc = gdrom_is_mounted() ? IDE_DISC_NONE : (IDE_DISC_CDROM|IDE_DISC_READY); + idereg.disc = gdrom_is_mounted() ? (IDE_DISC_CDROM|IDE_DISC_READY) : IDE_DISC_NONE; } static void ide_save_state( FILE *f ) @@ -147,6 +147,7 @@ if( idereg.datalen <=0 ) { idereg.readptr = NULL; idereg.status &= ~IDE_ST_DATA; + ide_raise_interrupt(); } else if( idereg.blockleft <= 0 ) { ide_raise_interrupt(); idereg.blockleft = idereg.blocksize; @@ -223,8 +224,8 @@ void ide_set_packet_error( uint16_t error ) { idereg.gdrom_error = error; + idereg.error = (error & 0x0F) << 4; if( error != 0 ) { - idereg.error = (error & 0x0F) << 4; idereg.status = 0x51; } } @@ -237,7 +238,8 @@ void ide_packet_command( unsigned char *cmd ) { uint32_t length, datalen; - uint32_t lba; + uint32_t lba, status; + int mode; int blocksize = idereg.lba1 + (idereg.lba2<<8); ide_raise_interrupt( ); @@ -295,14 +297,22 @@ data_buffer = realloc( data_buffer, data_buffer_len ); } - if( !gdrom_is_mounted() ) { - ide_set_packet_error( PKT_ERR_NODISC ); + switch( cmd[1] ) { + case 0x20: mode = GDROM_MODE1; break; + case 0x24: mode = GDROM_GD; break; + case 0x28: mode = GDROM_MODE1; break; /* ??? */ + case 0x30: mode = GDROM_RAW; break; + default: + ERROR( "Unrecognized read mode '%02X' in GD-Rom read request", cmd[1] ); + ide_set_packet_error( PKT_ERR_BADFIELD ); return; } - datalen = gdrom_read_sectors( lba, length, data_buffer ); - if( datalen == 0 ) { - ide_set_packet_error( 0x05 ); + status = gdrom_read_sectors( lba, length, mode, data_buffer, &data_buffer_len ); + if( status != 0 ) { + ide_set_packet_error( status ); + data_buffer[6] = (lba >> 8) & 0xFF; + data_buffer[7] = lba & 0xFF; return; } ide_set_read_buffer( data_buffer, datalen, blocksize ); --- a/src/gdrom/packet.h Tue May 02 14:09:11 2006 +0000 +++ b/src/gdrom/packet.h Wed May 03 12:52:38 2006 +0000 @@ -1,5 +1,5 @@ /** - * $Id: packet.h,v 1.1 2006-05-02 14:09:11 nkeynes Exp $ + * $Id: packet.h,v 1.2 2006-05-03 12:52:38 nkeynes Exp $ * * This file defines the command codes and any other flags used by the * GD-Rom ATAPI packet commands. @@ -56,7 +56,8 @@ #define PKT_ERR_NODISC 0x3A02 #define PKT_ERR_BADCMD 0x2005 #define PKT_ERR_BADFIELD 0x2405 - +#define PKT_ERR_BADREAD 0x0030 +#define PKT_ERR_BADREADMODE 0x6405 /* Illegal mode for this track */ #define IDE_READ_MODE1 0x20 #define IDE_READ_RAW 0x30