filename | src/gdrom/ide.c |
changeset | 1097:d4807997e450 |
prev | 1075:1a21750d300c |
author | nkeynes |
date | Sun Jan 31 18:35:06 2010 +1000 (14 years ago) |
permissions | -rw-r--r-- |
last change | Refactor CDROM host support - Completely separate GDROM hardware (in gdrom/gdrom.c) from generic CDROM support (now in drivers/cdrom) - Add concept of 'sector sources' that can be mixed and matched to create cdrom discs (makes support of arbitrary disc types much simpler) |
file | annotate | diff | log | raw |
1.1 --- a/src/gdrom/ide.c Fri Jul 31 13:45:32 2009 +10001.2 +++ b/src/gdrom/ide.c Sun Jan 31 18:35:06 2010 +10001.3 @@ -28,7 +28,7 @@1.4 #include "mem.h"1.5 #include "asic.h"1.6 #include "gdrom/ide.h"1.7 -#include "gdrom/gddriver.h"1.8 +#include "gdrom/gdrom.h"1.9 #include "gdrom/packet.h"1.11 #define MAX_WRITE_BUF 40961.12 @@ -49,7 +49,6 @@1.13 NULL, ide_save_state, ide_load_state };1.15 struct ide_registers idereg;1.16 -gdrom_disc_t gdrom_disc = NULL;1.18 unsigned char data_buffer[MAX_SECTOR_SIZE];1.20 @@ -160,9 +159,7 @@1.22 static uint32_t ide_run_slice( uint32_t nanosecs )1.23 {1.24 - if( gdrom_disc != NULL && gdrom_disc->run_time_slice != NULL ) {1.25 - gdrom_disc->run_time_slice(gdrom_disc, nanosecs);1.26 - }1.27 + gdrom_run_slice(nanosecs);1.28 return nanosecs;1.29 }1.31 @@ -443,21 +440,18 @@1.33 uint8_t ide_get_drive_status( void )1.34 {1.35 - return gdrom_disc_get_drive_status(gdrom_disc);1.36 + return gdrom_get_drive_status();1.37 }1.39 -#define REQUIRE_DISC() if( gdrom_disc == NULL || gdrom_disc->disc_type == IDE_DISC_NONE ) { ide_set_packet_result( PKT_ERR_NODISC ); return; }1.40 +#define REQUIRE_DISC() if( gdrom_get_drive_status() == IDE_DISC_NONE ) { ide_set_packet_result( PKT_ERR_NODISC ); return; }1.42 /**1.43 * Read the next sector from the active read, if any1.44 */1.45 static void ide_read_next_sector( void )1.46 {1.47 - uint32_t sector_size;1.48 - REQUIRE_DISC();1.49 - gdrom_error_t status =1.50 - gdrom_disc->read_sector( gdrom_disc, idereg.current_lba, idereg.current_mode,1.51 - data_buffer, §or_size );1.52 + size_t sector_size;1.53 + cdrom_error_t status = gdrom_read_cd( idereg.current_lba, 1, idereg.current_mode, data_buffer, §or_size );1.54 if( status != PKT_ERR_OK ) {1.55 ide_set_packet_result( status );1.56 idereg.gdrom_sense[5] = (idereg.current_lba >> 16) & 0xFF;1.57 @@ -507,7 +501,7 @@1.58 uint8_t status = ide_get_drive_status();1.59 /* FIXME: Refactor read_position to avoid this kind of crud */1.60 unsigned char tmp[16];1.61 - gdrom_disc_get_short_status( gdrom_disc, idereg.current_lba, tmp );1.62 + gdrom_read_short_status( idereg.current_lba, tmp );1.64 length = cmd[4];1.65 if( lba+length > GDROM_DRIVE_STATUS_LENGTH )1.66 @@ -559,12 +553,11 @@1.67 ide_start_packet_read( length, 0 );1.68 break;1.69 case PKT_CMD_READ_TOC:1.70 - REQUIRE_DISC();1.71 length = (cmd[3]<<8) | cmd[4];1.72 if( length > GDROM_TOC_SIZE )1.73 length = GDROM_TOC_SIZE;1.75 - status = gdrom_disc_get_toc( gdrom_disc, data_buffer );1.76 + status = gdrom_read_toc( data_buffer );1.77 if( status != PKT_ERR_OK ) {1.78 ide_set_packet_result( status );1.79 } else {1.80 @@ -572,11 +565,10 @@1.81 }1.82 break;1.83 case PKT_CMD_SESSION_INFO:1.84 - REQUIRE_DISC();1.85 length = cmd[4];1.86 if( length > 6 )1.87 length = 6;1.88 - status = gdrom_disc_get_session_info( gdrom_disc, cmd[2], data_buffer );1.89 + status = gdrom_read_session( cmd[2], data_buffer );1.90 if( status != PKT_ERR_OK ) {1.91 ide_set_packet_result( status );1.92 } else {1.93 @@ -584,8 +576,10 @@1.94 }1.95 break;1.96 case PKT_CMD_PLAY_AUDIO:1.97 - REQUIRE_DISC();1.98 - ide_set_packet_result( 0 );1.99 + lba = (cmd[2] << 16) | (cmd[3]<<8) | cmd[4];1.100 + length = ((cmd[8]<<16) | (cmd[9]<<8) | cmd[10]) - lba;1.101 + status = gdrom_play_audio( lba, length );1.102 + ide_set_packet_result( status );1.103 ide_raise_interrupt();1.104 idereg.status = 0x50;1.105 break;1.106 @@ -617,7 +611,7 @@1.107 if( length > 14 ) {1.108 length = 14;1.109 }1.110 - gdrom_disc_get_short_status( gdrom_disc, idereg.current_lba, data_buffer );1.111 + gdrom_read_short_status( idereg.current_lba, data_buffer );1.112 ide_start_packet_read( length, 0 );1.113 break;1.114 }
.