Search
lxdream.org :: lxdream/src/gdrom/ide.c :: diff
lxdream 0.9.1
released Jun 29
Download Now
filename src/gdrom/ide.c
changeset 1097:d4807997e450
prev1075: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 +1000
1.2 +++ b/src/gdrom/ide.c Sun Jan 31 18:35:06 2010 +1000
1.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.10
1.11 #define MAX_WRITE_BUF 4096
1.12 @@ -49,7 +49,6 @@
1.13 NULL, ide_save_state, ide_load_state };
1.14
1.15 struct ide_registers idereg;
1.16 -gdrom_disc_t gdrom_disc = NULL;
1.17
1.18 unsigned char data_buffer[MAX_SECTOR_SIZE];
1.19
1.20 @@ -160,9 +159,7 @@
1.21
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.30
1.31 @@ -443,21 +440,18 @@
1.32
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.38
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.41
1.42 /**
1.43 * Read the next sector from the active read, if any
1.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, &sector_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, &sector_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.63
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.74
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 }
.