X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcdbios.cpp;h=d3e416144834fde7c0e0edd61152a017c664cb59;hb=3580a9ef98432ed54f065f2d537d588fdc083592;hp=447a5b6ea725cecf7680e45ef7a99da2cf242648;hpb=86bd0f2592c3cd674239532247276bd2d579a857;p=virtualjaguar diff --git a/src/cdbios.cpp b/src/cdbios.cpp index 447a5b6..d3e4161 100644 --- a/src/cdbios.cpp +++ b/src/cdbios.cpp @@ -1,32 +1,31 @@ -////////////////////////////////////////////////////////////////////////////// // -////////////////////////////////////////////////////////////////////////////// +// CD BIOS core // -// 20.02.2002: fixed sector to msf conversion -// 19.02.2002: fixed a bug in toc encoding function +// by David Raingeard +// GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS) +// Cleanups by James L. Hammons // +// David R.: +// 02/20/2002: Fixed sector to MSF conversion +// 02/19/2002: Fixed a bug in TOC encoding function // -// -////////////////////////////////////////////////////////////////////////////// -#include "include/cdbios.h" + +#include "cdbios.h" /* Added by SDLEMU (http://sdlemu.ngemu.com */ /* Some GCC UNIX includes */ #ifdef __GCCUNIX__ - #include +#include #endif #define ERR_FLAG 0x3e00 #define CD_TOC 0x2c00 #define BIOS_VER 0x3004 - #define CDBIOS_INIT 0 #define CDBIOS_INITM 1 #define CDBIOS_INITF 2 - - #define CD_INIT 0x3000 #define CD_MODE 0x3006 #define CD_ACK 0x300C @@ -46,10 +45,10 @@ #define CD_INITM 0x3060 #define CD_INITF 0x3066 - -char *cdbios_command[]={"init","mode","ack","jeri","spin","stop","mute","umute","pause","upause", - "read","uread","setup","ptr","osamp","getoc","initm","initf", - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +char * cdbios_command[] = + { "init", "mode", "ack", "jeri", "spin", "stop", "mute", "umute", "pause", "upause", + "read", "uread", "setup", "ptr", "osamp", "getoc", "initm", "initf", + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; #define CDROM_AUDIO_MODE 0 #define CDROM_DATA_MODE 1 @@ -60,11 +59,10 @@ char *cdbios_command[]={"init","mode","ack","jeri","spin","stop","mute","umute", #define CDROM_STATUS_OK 0 #define CDROM_STATUS_ERROR 1 - uint32 cdrom_mode = CDROM_DATA_MODE; uint32 cdrom_speed = CDROM_SINGLE_SPEED; uint32 cdrom_oversample_factor = 1; -uint32 cdbios_session=0; +uint32 cdbios_session = 0; uint32 cdrom_destination_buffer_beginning; uint32 cdrom_destination_buffer_end; @@ -74,19 +72,10 @@ uint32 cdrom_partition_marker; uint32 cdrom_circular_buffer_size; uint32 cdbios_init_type; -uint32 *cdbios_sector_lut; -uint32 cdbios_init_done=0; +uint32 * cdbios_sector_lut; +uint32 cdbios_init_done = 0; + -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// void cdbios_build_sector_lut(void) { uint32 last_sector=0; @@ -129,16 +118,7 @@ void cdbios_build_sector_lut(void) } } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_get_time(uint32 sectors, uint32 *mm, uint32 *ss, uint32 *ff) { uint32 _sectors=sectors; @@ -156,31 +136,22 @@ void cdbios_get_time(uint32 sectors, uint32 *mm, uint32 *ss, uint32 *ff) // fprintf(log_get(),"[%.2i:%.2i:%.2i]\n",_mm,_ss,_ff); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_encode_toc(void) { int i; uint32 base=CD_TOC; - jaguar_byte_write(base++,0x00); - jaguar_byte_write(base++,0x00); - jaguar_byte_write(base++,0x01); + JaguarWriteByte(base++,0x00); + JaguarWriteByte(base++,0x00); + JaguarWriteByte(base++,0x01); int nbtracks=0; for (i=0;inb_of_sessions;i++) nbtracks+=cdi_descriptor->sessions[i].nb_of_tracks; - jaguar_byte_write(base++,nbtracks+1); - jaguar_byte_write(base++,cdi_descriptor->nb_of_sessions); + JaguarWriteByte(base++,nbtracks+1); + JaguarWriteByte(base++,cdi_descriptor->nb_of_sessions); uint32 mm=0; uint32 ss=0; @@ -191,9 +162,9 @@ void cdbios_encode_toc(void) cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].tracks[cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].nb_of_tracks-1].pregap_length, &mm,&ss,&ff); - jaguar_byte_write(base++,mm); - jaguar_byte_write(base++,ss); - jaguar_byte_write(base++,ff); + JaguarWriteByte(base++,mm); + JaguarWriteByte(base++,ss); + JaguarWriteByte(base++,ff); int track_count=1; for (i=0;inb_of_sessions;i++) @@ -203,16 +174,16 @@ void cdbios_encode_toc(void) // fprintf(log_get(),"track %i\n",track_count); - jaguar_byte_write(base++,track_count); + JaguarWriteByte(base++,track_count); cdbios_get_time(track->start_lba+track->pregap_length,&mm,&ss,&ff); - jaguar_byte_write(base++,mm); - jaguar_byte_write(base++,ss); - jaguar_byte_write(base++,ff); - jaguar_byte_write(base++,i); + JaguarWriteByte(base++,mm); + JaguarWriteByte(base++,ss); + JaguarWriteByte(base++,ff); + JaguarWriteByte(base++,i); cdbios_get_time(track->length,&mm,&ss,&ff); - jaguar_byte_write(base++,mm); - jaguar_byte_write(base++,ss); - jaguar_byte_write(base++,ff); + JaguarWriteByte(base++,mm); + JaguarWriteByte(base++,ss); + JaguarWriteByte(base++,ff); track_count++; } @@ -229,16 +200,7 @@ void cdbios_encode_toc(void) } } } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_decode_toc(void) { uint32 addr=0x2c00; @@ -247,11 +209,11 @@ void cdbios_decode_toc(void) fprintf(log_get(),"cdbios: toc:\n"); fprintf(log_get(),"cdbios:\n"); addr+=2; - fprintf(log_get(),"cdbios: minimum track number: %i\n",jaguar_byte_read(addr++)); - fprintf(log_get(),"cdbios: maximum track number: %i\n",nb_tracks=jaguar_byte_read(addr++)); - fprintf(log_get(),"cdbios: number of sessions : %i\n",jaguar_byte_read(addr++)); + fprintf(log_get(),"cdbios: minimum track number: %i\n",JaguarReadByte(addr++)); + fprintf(log_get(),"cdbios: maximum track number: %i\n",nb_tracks=JaguarReadByte(addr++)); + fprintf(log_get(),"cdbios: number of sessions : %i\n",JaguarReadByte(addr++)); fprintf(log_get(),"cdbios: start of last lead out time: %.2i:%.2i:%.2i\n", - jaguar_byte_read(addr++),jaguar_byte_read(addr++),jaguar_byte_read(addr++)); + JaguarReadByte(addr++),JaguarReadByte(addr++),JaguarReadByte(addr++)); uint32 mm,ss,ff; @@ -260,33 +222,24 @@ void cdbios_decode_toc(void) while (nb_tracks) { fprintf(log_get(),"cdbios:\n"); - fprintf(log_get(),"cdbios: track : %i\n",jaguar_byte_read(addr++)); + fprintf(log_get(),"cdbios: track : %i\n",JaguarReadByte(addr++)); - mm=jaguar_byte_read(addr++); - ss=jaguar_byte_read(addr++); - ff=jaguar_byte_read(addr++); + mm=JaguarReadByte(addr++); + ss=JaguarReadByte(addr++); + ff=JaguarReadByte(addr++); fprintf(log_get(),"cdbios: start at : %.2i:%.2i:%.2i\n",mm,ss,ff); - fprintf(log_get(),"cdbios: session : %i\n",jaguar_byte_read(addr++)); + fprintf(log_get(),"cdbios: session : %i\n",JaguarReadByte(addr++)); - mm=jaguar_byte_read(addr++); - ss=jaguar_byte_read(addr++); - ff=jaguar_byte_read(addr++); + mm=JaguarReadByte(addr++); + ss=JaguarReadByte(addr++); + ff=JaguarReadByte(addr++); fprintf(log_get(),"cdbios: duration : %.2i:%.2i:%.2i\n",mm,ss,ff); nb_tracks--; } } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cd_bios_boot(char *filename) { cd_bios_init(); @@ -307,10 +260,10 @@ void cd_bios_boot(char *filename) // copy the code to ram for (uint32 i=0;i>1) & 0x01; uint32 cdrom_speed = data & 0x01; - jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK); + JaguarWriteWord(ERR_FLAG, CDROM_STATUS_OK); // fprintf(log_get(),"cdbios: %s\n",(cdrom_mode==CDROM_AUDIO_MODE)?"audio mode":"data mode"); // fprintf(log_get(),"cdbios: %s\n",(cdrom_speed==CDROM_DOUBLE_SPEED)?"double speed":"single speed"); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_cmd_ack(void) { - jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK); + JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_cmd_jeri(void) { - jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK); + JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_cmd_spin(void) { // uint16 spin=(1<<(s68000context.dreg[0]&0xffff)); uint16 spin = (1 << (m68k_get_reg(NULL, M68K_REG_D0) & 0xFFFF)); cdbios_session = spin; - jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK); + JaguarWriteWord(ERR_FLAG, CDROM_STATUS_OK); // fprintf(log_get(),"cdbios: switching to session %i\n",spin); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_cmd_stop(void) { - jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK); + JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_cmd_mute(void) { - jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK); + JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_cmd_umute(void) { - jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK); + JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_cmd_pause(void) { - jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK); + JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_cmd_upause(void) { - jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK); + JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK); } void cdi_read_block(uint32 sector, uint8 *buffer, uint32 count) { @@ -540,16 +376,7 @@ void cdi_read_block(uint32 sector, uint8 *buffer, uint32 count) count--; } } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void cdbios_cmd_read(void) { static uint8 cdbios_sector[2352]; @@ -613,7 +440,7 @@ void cdbios_cmd_read(void) uint8 *buffer=(uint8*)malloc((nb_sectors+1)*2352); cdi_read_block(track_offset,buffer,nb_sectors+1); for (uint32 k=0;k