+++ /dev/null
-//
-// CD BIOS core
-//
-// 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 "cdbios.h"
-
-/* Added by SDLEMU (http://sdlemu.ngemu.com */
-/* Some GCC UNIX includes */
-#ifdef __GCCUNIX__
-#include <unistd.h>
-#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
-#define CD_JERI 0x3012
-#define CD_SPIN 0x3018
-#define CD_STOP 0x301E
-#define CD_MUTE 0x3024
-#define CD_UMUTE 0x302A
-#define CD_PAUSE 0x3030
-#define CD_UPAUSE 0x3036
-#define CD_READ 0x303C
-#define CD_UREAD 0x3042
-#define CD_SETUP 0x3048
-#define CD_PTR 0x304E
-#define CD_OSAMP 0x3054
-#define CD_GETTOC 0x306A
-#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 };
-
-#define CDROM_AUDIO_MODE 0
-#define CDROM_DATA_MODE 1
-
-#define CDROM_SINGLE_SPEED 0
-#define CDROM_DOUBLE_SPEED 1
-
-#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 cdrom_destination_buffer_beginning;
-uint32 cdrom_destination_buffer_end;
-uint32 cdrom_time_code;
-uint32 cdrom_seek_only;
-uint32 cdrom_partition_marker;
-uint32 cdrom_circular_buffer_size;
-
-uint32 cdbios_init_type;
-uint32 * cdbios_sector_lut;
-uint32 cdbios_init_done = 0;
-
-
-void cdbios_build_sector_lut(void)
-{
- uint32 last_sector=0;
- int32 offset=0;
- uint32 sector=0;
-
- s_cdi_track *last_track=&cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].tracks[cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].nb_of_tracks-1];
-
- last_sector=last_track->start_lba+last_track->total_length-1;
-
-
- cdbios_sector_lut=(uint32*)malloc((last_sector+1)*sizeof(uint32));
- memset(cdbios_sector_lut,0xff,(last_sector+1)*sizeof(uint32));
-
- for (int session=0;session<cdi_descriptor->nb_of_sessions;session++)
- {
- for (int track=0;track<cdi_descriptor->sessions[session].nb_of_tracks;track++)
- {
- s_cdi_track *current_track=&cdi_descriptor->sessions[session].tracks[track];
-
- if (offset<((int32)(current_track->start_lba-1)))
- {
- fprintf(log_get(),"cdbios: postgap between %i and %i\n",offset,current_track->start_lba-1);
-
- // fill-in postgap
- for (;offset<current_track->start_lba;offset++)
- {
- cdbios_sector_lut[offset]=0xffffffff;
- }
-
- }
- fprintf(log_get(),"cdbios: data between %i and %i\n",offset,current_track->start_lba+current_track->total_length-1);
- for (;offset<current_track->start_lba+current_track->total_length;offset++)
- {
- cdbios_sector_lut[offset]=sector;
- sector++;
- }
-
- }
- }
-
-}
-
-void cdbios_get_time(uint32 sectors, uint32 *mm, uint32 *ss, uint32 *ff)
-{
- uint32 _sectors=sectors;
-
- uint32 _mm=(sectors/(60*75));
- sectors-=(_mm*(60*75));
- uint32 _ss=(sectors/75);
- sectors-=(_ss*75);
- uint32 _ff=sectors;
-
- *mm=_mm;
- *ss=_ss;
- *ff=_ff;
-
-
-// fprintf(log_get(),"[%.2i:%.2i:%.2i]\n",_mm,_ss,_ff);
-}
-
-void cdbios_encode_toc(void)
-{
- int i;
- uint32 base=CD_TOC;
-
- JaguarWriteByte(base++,0x00);
- JaguarWriteByte(base++,0x00);
- JaguarWriteByte(base++,0x01);
-
- int nbtracks=0;
- for (i=0;i<cdi_descriptor->nb_of_sessions;i++)
- nbtracks+=cdi_descriptor->sessions[i].nb_of_tracks;
-
- JaguarWriteByte(base++,nbtracks+1);
- JaguarWriteByte(base++,cdi_descriptor->nb_of_sessions);
-
- uint32 mm=0;
- uint32 ss=0;
- uint32 ff=0;
-
- cdbios_get_time(cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].tracks[cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].nb_of_tracks-1].start_lba+
- cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].tracks[cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].nb_of_tracks-1].length+
- 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);
-
- JaguarWriteByte(base++,mm);
- JaguarWriteByte(base++,ss);
- JaguarWriteByte(base++,ff);
-
- int track_count=1;
- for (i=0;i<cdi_descriptor->nb_of_sessions;i++)
- for (int j=0;j<cdi_descriptor->sessions[i].nb_of_tracks;j++)
- {
- s_cdi_track *track=&cdi_descriptor->sessions[i].tracks[j];
-
-// fprintf(log_get(),"track %i\n",track_count);
-
- JaguarWriteByte(base++,track_count);
- cdbios_get_time(track->start_lba+track->pregap_length,&mm,&ss,&ff);
- JaguarWriteByte(base++,mm);
- JaguarWriteByte(base++,ss);
- JaguarWriteByte(base++,ff);
- JaguarWriteByte(base++,i);
- cdbios_get_time(track->length,&mm,&ss,&ff);
- JaguarWriteByte(base++,mm);
- JaguarWriteByte(base++,ss);
- JaguarWriteByte(base++,ff);
-
- track_count++;
- }
-
- cdi_tracks_count=track_count;
- cdi_tracks=(s_cdi_track**)malloc(track_count*sizeof(s_cdi_track*));
- track_count=0;
- for (i=0;i<cdi_descriptor->nb_of_sessions;i++)
- {
- for (int j=0;j<cdi_descriptor->sessions[i].nb_of_tracks;j++)
- {
- cdi_tracks[track_count]=&cdi_descriptor->sessions[i].tracks[j];
- track_count++;
- }
- }
-}
-
-void cdbios_decode_toc(void)
-{
- uint32 addr=0x2c00;
- uint32 nb_tracks;
-
- fprintf(log_get(),"cdbios: toc:\n");
- fprintf(log_get(),"cdbios:\n");
- addr+=2;
- 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",
- JaguarReadByte(addr++),JaguarReadByte(addr++),JaguarReadByte(addr++));
-
- uint32 mm,ss,ff;
-
- nb_tracks--;
-
- while (nb_tracks)
- {
- fprintf(log_get(),"cdbios:\n");
- fprintf(log_get(),"cdbios: track : %i\n",JaguarReadByte(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",JaguarReadByte(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();
-
-
- cdi_fp=cdi_open(filename);
- cdi_descriptor=cdi_get_descriptor(cdi_fp,log_get());
- if (cdi_descriptor==0)
- {
- fprintf(log_get(),"cdi: bad image\n");
- cdi_close(cdi_fp);
- return;
- }
- cdi_dump_descriptor(log_get(),cdi_descriptor);
- cdbios_build_sector_lut();
-
- uint8 *code=cdi_extract_boot_code(cdi_fp,cdi_descriptor);
-
- // copy the code to ram
- for (uint32 i=0;i<cdi_code_length;i++)
- JaguarWriteByte(cdi_load_address+i,code[i]);
-
- // set the boot address
- JaguarWriteLong(0x00000004,cdi_load_address);
-
- // write the toc
- cdbios_encode_toc();
-
- // dump the toc
- cdbios_decode_toc();
-
-// fprintf(log_get(),"cdbios: boot code:\n");
-// jaguar_dasm(cdi_load_address, cdi_code_length);
-}
-
-void cd_bios_init(void)
-{
- fprintf(log_get(),"cd_bios: initializing\n");
- for (int i=0;i<19;i++)
- {
- // RESET opcode
- JaguarWriteWord(0x3000+(i*6),0x4E70);
- }
- cd_bios_reset();
- cdbios_init_done=1;
-}
-
-void cd_bios_reset(void)
-{
- fprintf(log_get(), "cd_bios: reset\n");
- JaguarWriteWord(BIOS_VER, 0x0405);
- cdrom_mode = CDROM_DATA_MODE;
- cdrom_speed = CDROM_SINGLE_SPEED;
- cdrom_oversample_factor = 1;
- cdbios_session = 0;
-}
-
-void cd_bios_done(void)
-{
- close(cdi_fp);
- fprintf(log_get(), "CD BIOS: Done.\n");
-}
-
-void cdbios_cmd_init(void)
-{
- cdbios_init_type = CDBIOS_INIT;
- JaguarWriteWord(ERR_FLAG, CDROM_STATUS_OK);
- fprintf(log_get(), "cdbios: init(0x%.8x)\n", m68k_get_reg(NULL, M68K_REG_A0));
-}
-
-void cdbios_cmd_mode(void)
-{
-// uint32 data = s68000context.dreg[0];
- uint32 data = m68k_get_reg(NULL, M68K_REG_D0);
-
- uint32 cdrom_mode = (data>>1) & 0x01;
- uint32 cdrom_speed = data & 0x01;
- 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)
-{
- JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_jeri(void)
-{
- 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;
- JaguarWriteWord(ERR_FLAG, CDROM_STATUS_OK);
-// fprintf(log_get(),"cdbios: switching to session %i\n",spin);
-}
-
-void cdbios_cmd_stop(void)
-{
- JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_mute(void)
-{
- JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_umute(void)
-{
- JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_pause(void)
-{
- JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_upause(void)
-{
- JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK);
-}
-void cdi_read_block(uint32 sector, uint8 *buffer, uint32 count)
-{
- while (count)
- {
- cdi_load_sector(cdbios_sector_lut[sector],buffer);
- buffer+=2352;
- sector++;
- count--;
- }
-}
-
-void cdbios_cmd_read(void)
-{
- static uint8 cdbios_sector[2352];
-
-/* cdrom_destination_buffer_beginning=s68000context.areg[0];
- cdrom_destination_buffer_end=s68000context.areg[1];
- cdrom_time_code=(s68000context.dreg[0])&0x7fffffff;
- cdrom_seek_only=s68000context.dreg[0]&0x80000000;*/
- cdrom_destination_buffer_beginning = m68k_get_reg(NULL, M68K_REG_A0);
- cdrom_destination_buffer_end = m68k_get_reg(NULL, M68K_REG_A1);
- cdrom_time_code = m68k_get_reg(NULL, M68K_REG_D0) & 0x7FFFFFFF;
- cdrom_seek_only = m68k_get_reg(NULL, M68K_REG_D0) & 0x80000000;
-
-/* cdrom_partition_marker=s68000context.dreg[1];
- if (s68000context.dreg[2]!=0)
- cdrom_circular_buffer_size=(1<<s68000context.dreg[2]);*/
- cdrom_partition_marker = m68k_get_reg(NULL, M68K_REG_D1);
- if (m68k_get_reg(NULL, M68K_REG_D2) != 0)
- cdrom_circular_buffer_size = 1 << m68k_get_reg(NULL, M68K_REG_D2);
- else
- cdrom_circular_buffer_size = 0xFFFFFFFF; // no circular buffer;
-
- uint32 mm = (10 * ((cdrom_time_code >> 20) & 0x0F)) + ((cdrom_time_code >> 16) & 0x0F);
- uint32 ss = (10 * ((cdrom_time_code >> 12) & 0x0F)) + ((cdrom_time_code >> 8) & 0x0F);
- uint32 ff = (10 * ((cdrom_time_code >> 4) & 0x0F)) + ((cdrom_time_code >> 0) & 0x0F);
-
- fprintf(log_get(),"cdbios: read(0x%.8x, 0x%.8x, %.2i:%.2i:%.2i, %i) %s\n",
- cdrom_destination_buffer_beginning,
- cdrom_destination_buffer_end,
- mm,ss,ff,
- cdrom_circular_buffer_size,cdrom_seek_only?"(seek only)":"");
-
- if (!cdrom_seek_only)
- {
- if (cdbios_init_type==CDBIOS_INITM)
- {
- fprintf(log_get(),"cdbios: partition marker: %c%c%c%c (0x%.8x)\n",
- ((cdrom_partition_marker>>24)&0xff),
- ((cdrom_partition_marker>>16)&0xff),
- ((cdrom_partition_marker>>8)&0xff),
- (cdrom_partition_marker&0xff),
- cdrom_partition_marker
- );
- }
- if (((int32)cdrom_circular_buffer_size)==-1)
- cdrom_circular_buffer_size=0xffffffff;
-
- uint32 track_offset=((ss+(60*mm))*75)+ff;
-
- fprintf(log_get(),"cdbios: track offset: %i\n",track_offset);
- uint32 nb_sectors=(cdrom_destination_buffer_end-cdrom_destination_buffer_beginning)/2352;
- uint32 reste=(cdrom_destination_buffer_end-cdrom_destination_buffer_beginning)%2352;
- uint32 buffer_offset=0;
- uint32 nb_bytes_to_read=cdrom_destination_buffer_end-cdrom_destination_buffer_beginning+1;
-
- if (cdbios_init_type==CDBIOS_INITF)
- {
-// if (cdrom_destination_buffer_beginning==0x00046000)
-// return;
-
- uint8 *buffer=(uint8*)malloc((nb_sectors+1)*2352);
- cdi_read_block(track_offset,buffer,nb_sectors+1);
- for (uint32 k=0;k<nb_bytes_to_read;k++)
- JaguarWriteByte(cdrom_destination_buffer_beginning+k,buffer[k]);
- free(buffer);
- }
- else
- if (cdbios_init_type==CDBIOS_INITM)
- {
- uint8 *buffer=(uint8*)malloc((31+nb_sectors+1)*2352);
- cdi_read_block(track_offset,buffer,nb_sectors+1);
-
- uint32 count=(31+nb_sectors+1)*2352;
- uint8 *alias=buffer;
- uint32 marker_count=2;
-
- while (count-4)
- {
- if (
- (alias[0]==((cdrom_partition_marker>>24)&0xff))&&
- (alias[1]==((cdrom_partition_marker>>16)&0xff))&&
- (alias[2]==((cdrom_partition_marker>>8)&0xff))&&
- (alias[3]==((cdrom_partition_marker>>0)&0xff))
- )
- {
- marker_count--;
- if (marker_count)
- {
- alias+=3;
- }
- else
- {
- exit(0);
- alias+=4;
- for (uint32 k=0;k<nb_bytes_to_read;k++)
- JaguarWriteByte(cdrom_destination_buffer_beginning+k,alias[k]);
- free(buffer);
- return;
- }
- }
- alias++;
- count--;
- }
- free(buffer);
- }
- else
- {
- fprintf(log_get(),"cdbios: unsupported read mode\n");
- }
- }
- JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_uread(void)
-{
- // stop the recording started with a cd_read command
- // for now, there is nothing to do
- JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_setup(void)
-{
- // initialize the cd system
- JaguarWriteWord(ERR_FLAG, CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_ptr(void)
-{
-// s68000context.areg[0]=cdrom_destination_buffer_end+4;
- m68k_set_reg(M68K_REG_A0, cdrom_destination_buffer_end + 4);
- JaguarWriteWord(ERR_FLAG, CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_osamp(void)
-{
-// cdrom_oversample_factor=(1<<(s68000context.dreg[0]&0xffff));
- cdrom_oversample_factor = 1 << (m68k_get_reg(NULL, M68K_REG_D0) & 0xFFFF);
- JaguarWriteWord(ERR_FLAG, CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_gettoc(void)
-{
- JaguarWriteWord(ERR_FLAG,CDROM_STATUS_OK);
-}
-
-void cdbios_cmd_initm(void)
-{
- cdbios_init_type = CDBIOS_INITM;
- JaguarWriteWord(ERR_FLAG, CDROM_STATUS_OK);
-// fprintf(log_get(),"cdbios: initm(0x%.8x)\n",s68000context.areg[0]);
- fprintf(log_get(), "cdbios: initm(0x%.8x)\n", m68k_get_reg(NULL, M68K_REG_A0));
-}
-
-void cdbios_cmd_initf(void)
-{
- cdbios_init_type = CDBIOS_INITF;
- JaguarWriteWord(ERR_FLAG, CDROM_STATUS_OK);
-// fprintf(log_get(),"cdbios: initf(0x%.8x)\n",s68000context.areg[0]);
- fprintf(log_get(), "cdbios: initf(0x%.8x)\n", m68k_get_reg(NULL, M68K_REG_A0));
-}
-
-void cd_bios_process(uint32 offset)
-{
- if (!cdbios_init_done)
- return;
-
- fprintf(log_get(), "cdbios: processing command '%s'\n", cdbios_command[(offset-0x3000) / 6]);
- fprintf(log_get(), "cdbios: 68K PC=%08X SP=%08X\n", JaguarReadLong(m68k_get_reg(NULL, M68K_REG_A7)), m68k_get_reg(NULL, M68K_REG_A7));
-
- switch (offset)
- {
- case CD_INIT: cdbios_cmd_init(); break;
- case CD_MODE: cdbios_cmd_mode(); break;
- case CD_ACK: cdbios_cmd_ack(); break;
- case CD_JERI: cdbios_cmd_jeri(); break;
- case CD_SPIN: cdbios_cmd_spin(); break;
- case CD_STOP: cdbios_cmd_stop(); break;
- case CD_MUTE: cdbios_cmd_mute(); break;
- case CD_UMUTE: cdbios_cmd_umute(); break;
- case CD_PAUSE: cdbios_cmd_pause(); break;
- case CD_UPAUSE: cdbios_cmd_upause(); break;
- case CD_READ: cdbios_cmd_read(); break;
- case CD_UREAD: cdbios_cmd_uread(); break;
- case CD_SETUP: cdbios_cmd_setup(); break;
- case CD_PTR: cdbios_cmd_ptr(); break;
- case CD_OSAMP: cdbios_cmd_osamp(); break;
- case CD_GETTOC: cdbios_cmd_gettoc(); break;
- case CD_INITM: cdbios_cmd_initm(); break;
- case CD_INITF: cdbios_cmd_initf(); break;
-
- default: fprintf(log_get(), "cdbios: unemulated entry point at %08X 68K PC=%08X SP=%08X\n", offset, JaguarReadLong(m68k_get_reg(NULL, M68K_REG_A7)), m68k_get_reg(NULL, M68K_REG_A7));
- JaguarWriteWord(ERR_FLAG, CDROM_STATUS_OK);
- }
-
- // rts
-// s68000context.pc=JaguarReadLong(s68000context.areg[7]);
-// s68000context.areg[7]=(s68000context.areg[7]+4)&0xffffffff;
- m68k_set_reg(M68K_REG_PC, JaguarReadLong(m68k_get_reg(NULL, M68K_REG_A7)));
- m68k_set_reg(M68K_REG_A7, (m68k_get_reg(NULL, M68K_REG_A7) + 4) & 0xFFFFFFFF);
-}
-
-void cd_bios_exec(uint32 scanline)
-{
- // single speed mode: 150 Kb/s (153600 bytes/s)
- // single speed mode: 300 Kb/s (307200 bytes/s)
- uint32 bytes_per_scanline=(153600*((cdrom_speed==CDROM_DOUBLE_SPEED)?2:1))/525;
-}
+++ /dev/null
-//
-// CD Interface handler
-//
-// by David Raingeard
-// GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
-// Cleanups by James L. Hammons
-//
-
-#include "cdi.h"
-
-/* Added by SDLEMU (http://sdlemu.ngemu.com) */
-/* Added for GCC UNIX compatibility */
-#ifdef __GCCUNIX__
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-
-#define O_BINARY (0)
-#endif
-
-#define CDI_V2 0x80000004
-#define CDI_V3 0x80000005
-#define CDI_V35 0x80000006
-
-static uint8 cdi_track_start_mark[10] =
- { 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF };
-
-int cdi_fp;
-uint32 cdi_load_address;
-uint32 cdi_code_length;
-s_cdi_descriptor * cdi_descriptor;
-s_cdi_track ** cdi_tracks;
-uint32 cdi_tracks_count;
-
-
-int cdi_open(char * path)
-{
- WriteLog("CDI: Opening %s\n", path);
- return open(path, O_BINARY | O_RDONLY);
-}
-
-void cdi_close(int fp)
-{
- WriteLog("CDI: Closing\n");
- close(fp);
-}
-
-
-s_cdi_descriptor * cdi_get_descriptor(int fp, FILE * stdfp)
-{
- s_cdi_descriptor * descriptor;
- uint32 previous_position = 0;
-
- if (fp == -1)
- return 0;
-
- descriptor = (s_cdi_descriptor *)malloc(sizeof(s_cdi_descriptor));
-
- if (descriptor == NULL)
- return 0;
-
- lseek(fp, 0, SEEK_END);
- descriptor->length = lseek(fp, 0LL, SEEK_CUR);
-
- if (descriptor->length < 8)
- {
- if (stdfp)
- fprintf(stdfp, "CDI: Image is too short (%i bytes)\n", (int)descriptor->length);
- free(descriptor);
- return 0;
- }
-
- lseek(fp, descriptor->length - 8, SEEK_SET);
- read(fp, &descriptor->version, 4);
- read(fp, &descriptor->header_offset, 4);
- lseek(fp, descriptor->header_offset, SEEK_SET);
- read(fp, &descriptor->nb_of_sessions, 2);
-
- descriptor->sessions=(s_cdi_session *)malloc(descriptor->nb_of_sessions * sizeof(s_cdi_session));
-
- if (descriptor->sessions == NULL)
- {
- free(descriptor);
- return 0;
- }
-
- if (stdfp)
- fprintf(stdfp, "CDI: %i sessions\n", descriptor->nb_of_sessions);
-
- uint32 track_position = 0;
- for(uint16 session=0; session<descriptor->nb_of_sessions; session++)
- {
- read(fp, &descriptor->sessions[session].nb_of_tracks, 2);
- descriptor->sessions[session].tracks = (s_cdi_track *)malloc(descriptor->sessions[session].nb_of_tracks * sizeof(s_cdi_track));
-
- if (stdfp)
- fprintf(stdfp, "CDI:\nCDI: Reading session %i (%i tracks)\n", session, descriptor->sessions[session].nb_of_tracks);
-
- for (uint16 track=0; track<descriptor->sessions[session].nb_of_tracks; track++)
- {
- static char current_start_mark[10];
- s_cdi_track * current_track=&descriptor->sessions[session].tracks[track];
- if (stdfp)
- fprintf(stdfp, "CDI:\nCDI: \t\tReading track %i\n",track);
-
- uint32 temp_value;
-
- read(fp, &temp_value, 4);
-
- if (temp_value != 0)
- lseek(fp, 8, SEEK_CUR); // extra data (DJ 3.00.780 and up)
-
- read(fp, current_start_mark, 10);
-
- if (memcmp(cdi_track_start_mark, current_start_mark, 10))
- {
- if (stdfp)
- fprintf(stdfp, "CDI: Could not find the track start mark\n");
- return 0;
- }
-
- read(fp, current_start_mark, 10);
-
- if (memcmp(cdi_track_start_mark, current_start_mark, 10))
- {
- if (stdfp)
- fprintf(stdfp, "CDI: Could not find the track start mark\n");
- return 0;
- }
-
- lseek(fp, 4, SEEK_CUR);
- read(fp, ¤t_track->filename_length, 1);
- lseek(fp, current_track->filename_length, SEEK_CUR);
-
- lseek(fp, 11, SEEK_CUR);
- lseek(fp, 4, SEEK_CUR);
- lseek(fp, 4, SEEK_CUR);
- read(fp, &temp_value, 4);
-
- if (temp_value == 0x80000000)
- lseek(fp, 8, SEEK_CUR); // DJ4
-
- lseek(fp, 2, SEEK_CUR);
-
- read(fp, ¤t_track->pregap_length, 4);
-
- if (current_track->pregap_length != 150)
- WriteLog("CDI: Warning: Pregap different than 150\n");
-
- read(fp, ¤t_track->length, 4);
-
- if (stdfp)
- fprintf(stdfp, "CDI: \t\t\tPregap length: %i\n", (int)current_track->pregap_length);
- if (stdfp)
- fprintf(stdfp, "CDI: \t\t\tLength: %i\n", (int)current_track->length);
-
- lseek(fp, 6, SEEK_CUR);
-
- read(fp, ¤t_track->mode, 4);
-
- if (stdfp)
- fprintf(stdfp, "CDI: \t\t\tMode: %i\n", (int)current_track->mode);
-
- lseek(fp, 12, SEEK_CUR);
- read(fp, ¤t_track->start_lba, 4);
-
- if (stdfp)
- fprintf(stdfp, "CDI: \t\t\tStart LBA: %i\n", (int)current_track->start_lba);
-
- read(fp, ¤t_track->total_length, 4);
-
- if (stdfp)
- fprintf(stdfp, "CDI: \t\t\tTotal length: %i\n", (int)current_track->total_length);
-
- lseek(fp, 16, SEEK_CUR);
- read(fp, ¤t_track->sector_size_value, 4);
-
- if (stdfp)
- fprintf(stdfp, "CDI: \t\t\tSector size: %i\n", (int)current_track->sector_size_value);
-
- switch(current_track->sector_size_value)
- {
- case 0: current_track->sector_size = 2048; break;
- case 1: current_track->sector_size = 2336; break;
- case 2: current_track->sector_size = 2352; break;
- default:
- {
- if (stdfp)
- fprintf(stdfp, "CDI: \t\t\tUnsupported %i bytes sector\n", (int)current_track->sector_size_value);
- return 0;
- }
- }
-
- if (current_track->mode > 2)
- if (stdfp)
- fprintf(stdfp, "CDI: \t\t\tTrack mode %i not supported\n", (int)current_track->mode);
-
- lseek(fp, 29, SEEK_CUR);
-
- if (descriptor->version != CDI_V2)
- {
- lseek(fp, 5, SEEK_CUR);
- read(fp, &temp_value, 4);
-
- if (temp_value == 0xFFFFFFFF)
- lseek(fp, 78, SEEK_CUR); // extra data (DJ 3.00.780 and up)
- }
-
- current_track->position = track_position;
- track_position += (current_track->pregap_length+current_track->length) * current_track->sector_size;
- previous_position = track_position;
- }
-
- lseek(fp, 4, SEEK_CUR);
- lseek(fp, 8, SEEK_CUR);
-
- if (descriptor->version != CDI_V2)
- lseek(fp, 1, SEEK_CUR);
-
- }
-
- if (descriptor->header_offset == 0)
- return 0;
-
- return descriptor;
-}
-
-void cdi_dump_descriptor(FILE * fp, s_cdi_descriptor * cdi_descriptor)
-{
- fprintf(fp, "CDI: %i Mb\n", (int)(cdi_descriptor->length >> 20));
- fprintf(fp, "CDI: Format version ");
- switch(cdi_descriptor->version)
- {
- case CDI_V2:
- fprintf(fp, "2\n");
- break;
- case CDI_V3:
- fprintf(fp, "3\n");
- break;
- case CDI_V35:
- fprintf(fp, "3.5\n");
- break;
- default:
- fprintf(fp, "unknown\n");
- }
- fprintf(fp, "CDI: %i sessions\n", cdi_descriptor->nb_of_sessions);
-}
-
-uint8 * cdi_extract_boot_code(int fp, s_cdi_descriptor * cdi_descriptor)
-{
- s_cdi_track * boot_track = &cdi_descriptor->sessions[1].tracks[0];
- uint32 boot_track_size = boot_track->length * boot_track->sector_size;
-
- uint8 * boot_track_data = (uint8 *)malloc(boot_track_size);
- lseek(fp, 2 + (boot_track->position), SEEK_SET);
- read(fp, boot_track_data, boot_track_size);
-
- uint32 * boot_track_data_32 = (uint32 *)boot_track_data;
- uint32 offset = 0;
- while (offset < (boot_track_size >> 2))
- {
- if (boot_track_data_32[offset] == 0x49205452)
- break;
- offset++;
- }
- if (offset == (boot_track_size >> 2))
- {
- WriteLog("CDI: Cannot find the boot code\n");
- return NULL;
- }
-
-//This is likely wrong, but won't get a chance to fix it until I can get a CD image
-//to work with...
- offset = (offset << 2) + 4;
- uint16 * data16 = (uint16 *)&boot_track_data[offset];
- cdi_load_address = *data16++;
- cdi_load_address <<= 16;
- cdi_load_address |= *data16++;
- cdi_code_length = *data16++;
- cdi_code_length <<= 16;
- cdi_code_length |= *data16++;
- WriteLog("CDI: Load address: %08X\n", cdi_load_address);
- WriteLog("CDI: Length: %08X\n", cdi_code_length);
-//No need for byte swapping any more...
-/* WriteLog("cdi: byte swapping boot code\n");
-
- for(uint32 i=0; i<(cdi_code_length >> 1); i++)
- {
- uint16 sdata = data16[i];
- sdata = (sdata >> 8) | (sdata << 8);
- data16[i] = sdata;
- }*/
-
- return (uint8 *)data16;
-}
-
-void cdi_load_sector(uint32 sector, uint8 * buffer)
-{
- if (sector == 0xFFFFFFFF)
- {
- memset(buffer, 0x00, 2352);
- return;
- }
-
- sector *= 2352;
-
- lseek(cdi_fp, 2+sector, SEEK_SET);
- read(cdi_fp, buffer, 2352);
-
-//This is probably not needed any more...
-/* // byte swap
- for (uint32 i=0;i<2352;i+=2)
- {
- uint8 sdata=buffer[i+0];
- buffer[i+0]=buffer[i+1];
- buffer[i+1]=sdata;
- }*/
-}