1.1 --- a/src/bios.c Mon Feb 15 17:27:14 2010 +1000
1.2 +++ b/src/bios.c Tue Feb 16 09:29:39 2010 +1000
1.4 #define GD_ERROR_DISC_CHANGE 6
1.5 #define GD_ERROR_SYSTEM 1
1.7 +struct gdrom_toc2_params {
1.12 +struct gdrom_readcd_params {
1.14 + cdrom_count_t count;
1.19 +struct gdrom_playcd_params {
1.20 + cdrom_lba_t start;
1.25 typedef union gdrom_cmd_params {
1.26 - struct gdrom_toc2_params {
1.31 - struct gdrom_readcd_params {
1.32 - cdrom_lba_t sector;
1.33 - cdrom_count_t count;
1.38 - struct gdrom_playcd_params {
1.39 - cdrom_lba_t start;
1.43 + struct gdrom_toc2_params toc2;
1.44 + struct gdrom_readcd_params readcd;
1.45 + struct gdrom_playcd_params playcd;
1.46 } *gdrom_cmd_params_t;
1.50 typedef struct gdrom_queue_entry {
1.54 + union gdrom_cmd_params params;
1.56 } *gdrom_queue_entry_t;
1.60 } bios_gdrom_status;
1.62 +void bios_gdrom_init( void )
1.64 + memset( &gdrom_cmd_queue, 0, sizeof(gdrom_cmd_queue) );
1.67 void bios_gdrom_run_command( gdrom_queue_entry_t cmd )
1.69 DEBUG( "BIOS GD command %d", cmd->cmd_code );
1.70 + cdrom_error_t status = CDROM_ERROR_OK;
1.72 switch( cmd->cmd_code ) {
1.75 cmd->status = GD_CMD_STATUS_DONE;
1.77 + case GD_CMD_GETTOC2:
1.78 + ptr = mem_get_region( cmd->params.toc2.buffer );
1.79 + status = gdrom_read_toc( ptr );
1.80 + if( status == CDROM_ERROR_OK ) {
1.81 + /* Convert data to little-endian */
1.82 + struct gdrom_toc *toc = (struct gdrom_toc *)ptr;
1.83 + for( unsigned i=0; i<99; i++ ) {
1.84 + toc->track[i] = ntohl(toc->track[i]);
1.86 + toc->first = ntohl(toc->first);
1.87 + toc->last = ntohl(toc->last);
1.88 + toc->leadout = ntohl(toc->leadout);
1.91 + case GD_CMD_PIOREAD:
1.92 + case GD_CMD_DMAREAD:
1.93 + ptr = mem_get_region( cmd->params.readcd.buffer );
1.94 + status = gdrom_read_cd( cmd->params.readcd.lba,
1.95 + cmd->params.readcd.count, 0x28, ptr, NULL );
1.98 + WARN( "Unknown BIOS GD command %d\n", cmd->cmd_code );
1.99 + cmd->status = GD_CMD_STATUS_ERROR;
1.100 + cmd->result[0] = GD_ERROR_SYSTEM;
1.104 + switch( status ) {
1.105 + case CDROM_ERROR_OK:
1.106 + cmd->status = GD_CMD_STATUS_DONE;
1.107 + cmd->result[0] = GD_ERROR_OK;
1.109 + case CDROM_ERROR_NODISC:
1.110 + cmd->status = GD_CMD_STATUS_ERROR;
1.111 + cmd->result[0] = GD_ERROR_NO_DISC;
1.114 cmd->status = GD_CMD_STATUS_ERROR;
1.115 cmd->result[0] = GD_ERROR_SYSTEM;
1.120 -void bios_gdrom_init( void )
1.122 - memset( &gdrom_cmd_queue, 0, sizeof(gdrom_cmd_queue) );
1.125 -uint32_t bios_gdrom_enqueue( uint32_t cmd, sh4ptr_t ptr )
1.126 +uint32_t bios_gdrom_enqueue( uint32_t cmd, sh4addr_t data )
1.129 for( i=0; i<COMMAND_QUEUE_LENGTH; i++ ) {
1.130 if( gdrom_cmd_queue[i].status != GD_CMD_STATUS_ACTIVE ) {
1.131 gdrom_cmd_queue[i].status = GD_CMD_STATUS_ACTIVE;
1.132 gdrom_cmd_queue[i].cmd_code = cmd;
1.133 - gdrom_cmd_queue[i].data = ptr;
1.135 + case GD_CMD_PIOREAD:
1.136 + case GD_CMD_DMAREAD:
1.137 + mem_copy_from_sh4( (unsigned char *)&gdrom_cmd_queue[i].params.readcd, data, sizeof(struct gdrom_readcd_params) );
1.139 + case GD_CMD_GETTOC2:
1.140 + mem_copy_from_sh4( (unsigned char *)&gdrom_cmd_queue[i].params.toc2, data, sizeof(struct gdrom_toc2_params) );
1.142 + case GD_CMD_PLAY:
1.143 + case GD_CMD_PLAY2:
1.144 + mem_copy_from_sh4( (unsigned char *)&gdrom_cmd_queue[i].params.playcd, data, sizeof(struct gdrom_playcd_params) );
1.150 @@ -165,10 +218,7 @@
1.151 case 0: /* GD-Rom */
1.152 switch( sh4r.r[7] ) {
1.153 case 0: /* Send command */
1.154 - if( sh4r.r[5] == 0 )
1.155 - sh4r.r[0] = bios_gdrom_enqueue( sh4r.r[4], NULL );
1.157 - sh4r.r[0] = bios_gdrom_enqueue( sh4r.r[4], mem_get_region(sh4r.r[5]) );
1.158 + sh4r.r[0] = bios_gdrom_enqueue( sh4r.r[4], sh4r.r[5] );
1.160 case 1: /* Check command */
1.161 cmd = bios_gdrom_get_command( sh4r.r[4] );