1 //////////////////////////////////////////////////////////////////////////////
3 //////////////////////////////////////////////////////////////////////////////
5 // 20.02.2002: fixed sector to msf conversion
6 // 19.02.2002: fixed a bug in toc encoding function
10 //////////////////////////////////////////////////////////////////////////////
11 #include "include/cdbios.h"
13 /* Added by SDLEMU (http://sdlemu.ngemu.com */
14 /* Some GCC UNIX includes */
19 #define ERR_FLAG 0x3e00
21 #define BIOS_VER 0x3004
25 #define CDBIOS_INITM 1
26 #define CDBIOS_INITF 2
30 #define CD_INIT 0x3000
31 #define CD_MODE 0x3006
33 #define CD_JERI 0x3012
34 #define CD_SPIN 0x3018
35 #define CD_STOP 0x301E
36 #define CD_MUTE 0x3024
37 #define CD_UMUTE 0x302A
38 #define CD_PAUSE 0x3030
39 #define CD_UPAUSE 0x3036
40 #define CD_READ 0x303C
41 #define CD_UREAD 0x3042
42 #define CD_SETUP 0x3048
44 #define CD_OSAMP 0x3054
45 #define CD_GETTOC 0x306A
46 #define CD_INITM 0x3060
47 #define CD_INITF 0x3066
50 char *cdbios_command[]={"init","mode","ack","jeri","spin","stop","mute","umute","pause","upause",
51 "read","uread","setup","ptr","osamp","getoc","initm","initf",
52 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
54 #define CDROM_AUDIO_MODE 0
55 #define CDROM_DATA_MODE 1
57 #define CDROM_SINGLE_SPEED 0
58 #define CDROM_DOUBLE_SPEED 1
60 #define CDROM_STATUS_OK 0
61 #define CDROM_STATUS_ERROR 1
64 uint32 cdrom_mode = CDROM_DATA_MODE;
65 uint32 cdrom_speed = CDROM_SINGLE_SPEED;
66 uint32 cdrom_oversample_factor = 1;
67 uint32 cdbios_session=0;
69 uint32 cdrom_destination_buffer_beginning;
70 uint32 cdrom_destination_buffer_end;
71 uint32 cdrom_time_code;
72 uint32 cdrom_seek_only;
73 uint32 cdrom_partition_marker;
74 uint32 cdrom_circular_buffer_size;
76 uint32 cdbios_init_type;
77 uint32 *cdbios_sector_lut;
78 uint32 cdbios_init_done=0;
80 //////////////////////////////////////////////////////////////////////////////
82 //////////////////////////////////////////////////////////////////////////////
89 //////////////////////////////////////////////////////////////////////////////
90 void cdbios_build_sector_lut(void)
96 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];
98 last_sector=last_track->start_lba+last_track->total_length-1;
101 cdbios_sector_lut=(uint32*)malloc((last_sector+1)*sizeof(uint32));
102 memset(cdbios_sector_lut,0xff,(last_sector+1)*sizeof(uint32));
104 for (int session=0;session<cdi_descriptor->nb_of_sessions;session++)
106 for (int track=0;track<cdi_descriptor->sessions[session].nb_of_tracks;track++)
108 s_cdi_track *current_track=&cdi_descriptor->sessions[session].tracks[track];
110 if (offset<((int32)(current_track->start_lba-1)))
112 fprintf(log_get(),"cdbios: postgap between %i and %i\n",offset,current_track->start_lba-1);
115 for (;offset<current_track->start_lba;offset++)
117 cdbios_sector_lut[offset]=0xffffffff;
121 fprintf(log_get(),"cdbios: data between %i and %i\n",offset,current_track->start_lba+current_track->total_length-1);
122 for (;offset<current_track->start_lba+current_track->total_length;offset++)
124 cdbios_sector_lut[offset]=sector;
132 //////////////////////////////////////////////////////////////////////////////
134 //////////////////////////////////////////////////////////////////////////////
141 //////////////////////////////////////////////////////////////////////////////
142 void cdbios_get_time(uint32 sectors, uint32 *mm, uint32 *ss, uint32 *ff)
144 uint32 _sectors=sectors;
146 uint32 _mm=(sectors/(60*75));
147 sectors-=(_mm*(60*75));
148 uint32 _ss=(sectors/75);
157 // fprintf(log_get(),"[%.2i:%.2i:%.2i]\n",_mm,_ss,_ff);
159 //////////////////////////////////////////////////////////////////////////////
161 //////////////////////////////////////////////////////////////////////////////
168 //////////////////////////////////////////////////////////////////////////////
169 void cdbios_encode_toc(void)
174 jaguar_byte_write(base++,0x00);
175 jaguar_byte_write(base++,0x00);
176 jaguar_byte_write(base++,0x01);
179 for (i=0;i<cdi_descriptor->nb_of_sessions;i++)
180 nbtracks+=cdi_descriptor->sessions[i].nb_of_tracks;
182 jaguar_byte_write(base++,nbtracks+1);
183 jaguar_byte_write(base++,cdi_descriptor->nb_of_sessions);
189 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+
190 cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].tracks[cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].nb_of_tracks-1].length+
191 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,
194 jaguar_byte_write(base++,mm);
195 jaguar_byte_write(base++,ss);
196 jaguar_byte_write(base++,ff);
199 for (i=0;i<cdi_descriptor->nb_of_sessions;i++)
200 for (int j=0;j<cdi_descriptor->sessions[i].nb_of_tracks;j++)
202 s_cdi_track *track=&cdi_descriptor->sessions[i].tracks[j];
204 // fprintf(log_get(),"track %i\n",track_count);
206 jaguar_byte_write(base++,track_count);
207 cdbios_get_time(track->start_lba+track->pregap_length,&mm,&ss,&ff);
208 jaguar_byte_write(base++,mm);
209 jaguar_byte_write(base++,ss);
210 jaguar_byte_write(base++,ff);
211 jaguar_byte_write(base++,i);
212 cdbios_get_time(track->length,&mm,&ss,&ff);
213 jaguar_byte_write(base++,mm);
214 jaguar_byte_write(base++,ss);
215 jaguar_byte_write(base++,ff);
220 cdi_tracks_count=track_count;
221 cdi_tracks=(s_cdi_track**)malloc(track_count*sizeof(s_cdi_track*));
223 for (i=0;i<cdi_descriptor->nb_of_sessions;i++)
225 for (int j=0;j<cdi_descriptor->sessions[i].nb_of_tracks;j++)
227 cdi_tracks[track_count]=&cdi_descriptor->sessions[i].tracks[j];
232 //////////////////////////////////////////////////////////////////////////////
234 //////////////////////////////////////////////////////////////////////////////
241 //////////////////////////////////////////////////////////////////////////////
242 void cdbios_decode_toc(void)
247 fprintf(log_get(),"cdbios: toc:\n");
248 fprintf(log_get(),"cdbios:\n");
250 fprintf(log_get(),"cdbios: minimum track number: %i\n",jaguar_byte_read(addr++));
251 fprintf(log_get(),"cdbios: maximum track number: %i\n",nb_tracks=jaguar_byte_read(addr++));
252 fprintf(log_get(),"cdbios: number of sessions : %i\n",jaguar_byte_read(addr++));
253 fprintf(log_get(),"cdbios: start of last lead out time: %.2i:%.2i:%.2i\n",
254 jaguar_byte_read(addr++),jaguar_byte_read(addr++),jaguar_byte_read(addr++));
262 fprintf(log_get(),"cdbios:\n");
263 fprintf(log_get(),"cdbios: track : %i\n",jaguar_byte_read(addr++));
265 mm=jaguar_byte_read(addr++);
266 ss=jaguar_byte_read(addr++);
267 ff=jaguar_byte_read(addr++);
269 fprintf(log_get(),"cdbios: start at : %.2i:%.2i:%.2i\n",mm,ss,ff);
270 fprintf(log_get(),"cdbios: session : %i\n",jaguar_byte_read(addr++));
272 mm=jaguar_byte_read(addr++);
273 ss=jaguar_byte_read(addr++);
274 ff=jaguar_byte_read(addr++);
276 fprintf(log_get(),"cdbios: duration : %.2i:%.2i:%.2i\n",mm,ss,ff);
280 //////////////////////////////////////////////////////////////////////////////
282 //////////////////////////////////////////////////////////////////////////////
289 //////////////////////////////////////////////////////////////////////////////
290 void cd_bios_boot(char *filename)
295 cdi_fp=cdi_open(filename);
296 cdi_descriptor=cdi_get_descriptor(cdi_fp,log_get());
297 if (cdi_descriptor==0)
299 fprintf(log_get(),"cdi: bad image\n");
303 cdi_dump_descriptor(log_get(),cdi_descriptor);
304 cdbios_build_sector_lut();
306 uint8 *code=cdi_extract_boot_code(cdi_fp,cdi_descriptor);
308 // copy the code to ram
309 for (uint32 i=0;i<cdi_code_length;i++)
310 jaguar_byte_write(cdi_load_address+i,code[i]);
312 // set the boot address
313 jaguar_long_write(0x00000004,cdi_load_address);
321 // fprintf(log_get(),"cdbios: boot code:\n");
322 // jaguar_dasm(cdi_load_address, cdi_code_length);
324 //////////////////////////////////////////////////////////////////////////////
326 //////////////////////////////////////////////////////////////////////////////
333 //////////////////////////////////////////////////////////////////////////////
334 void cd_bios_init(void)
336 fprintf(log_get(),"cd_bios: initializing\n");
337 for (int i=0;i<19;i++)
340 jaguar_word_write(0x3000+(i*6),0x4E70);
345 //////////////////////////////////////////////////////////////////////////////
347 //////////////////////////////////////////////////////////////////////////////
354 //////////////////////////////////////////////////////////////////////////////
355 void cd_bios_reset(void)
357 fprintf(log_get(), "cd_bios: reset\n");
358 jaguar_word_write(BIOS_VER, 0x0405);
359 cdrom_mode = CDROM_DATA_MODE;
360 cdrom_speed = CDROM_SINGLE_SPEED;
361 cdrom_oversample_factor = 1;
364 //////////////////////////////////////////////////////////////////////////////
366 //////////////////////////////////////////////////////////////////////////////
373 //////////////////////////////////////////////////////////////////////////////
374 void cd_bios_done(void)
376 fprintf(log_get(),"cd_bios: done\n");
379 //////////////////////////////////////////////////////////////////////////////
381 //////////////////////////////////////////////////////////////////////////////
388 //////////////////////////////////////////////////////////////////////////////
389 void cdbios_cmd_init(void)
391 cdbios_init_type = CDBIOS_INIT;
392 jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);
393 fprintf(log_get(), "cdbios: init(0x%.8x)\n", m68k_get_reg(NULL, M68K_REG_A0));
395 //////////////////////////////////////////////////////////////////////////////
397 //////////////////////////////////////////////////////////////////////////////
404 //////////////////////////////////////////////////////////////////////////////
405 void cdbios_cmd_mode(void)
407 // uint32 data = s68000context.dreg[0];
408 uint32 data = m68k_get_reg(NULL, M68K_REG_D0);
410 uint32 cdrom_mode = (data>>1) & 0x01;
411 uint32 cdrom_speed = data & 0x01;
412 jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);
414 // fprintf(log_get(),"cdbios: %s\n",(cdrom_mode==CDROM_AUDIO_MODE)?"audio mode":"data mode");
415 // fprintf(log_get(),"cdbios: %s\n",(cdrom_speed==CDROM_DOUBLE_SPEED)?"double speed":"single speed");
417 //////////////////////////////////////////////////////////////////////////////
419 //////////////////////////////////////////////////////////////////////////////
426 //////////////////////////////////////////////////////////////////////////////
427 void cdbios_cmd_ack(void)
429 jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);
431 //////////////////////////////////////////////////////////////////////////////
433 //////////////////////////////////////////////////////////////////////////////
440 //////////////////////////////////////////////////////////////////////////////
441 void cdbios_cmd_jeri(void)
443 jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);
445 //////////////////////////////////////////////////////////////////////////////
447 //////////////////////////////////////////////////////////////////////////////
454 //////////////////////////////////////////////////////////////////////////////
455 void cdbios_cmd_spin(void)
457 // uint16 spin=(1<<(s68000context.dreg[0]&0xffff));
458 uint16 spin = (1 << (m68k_get_reg(NULL, M68K_REG_D0) & 0xFFFF));
459 cdbios_session = spin;
460 jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);
461 // fprintf(log_get(),"cdbios: switching to session %i\n",spin);
463 //////////////////////////////////////////////////////////////////////////////
465 //////////////////////////////////////////////////////////////////////////////
472 //////////////////////////////////////////////////////////////////////////////
473 void cdbios_cmd_stop(void)
475 jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);
477 //////////////////////////////////////////////////////////////////////////////
479 //////////////////////////////////////////////////////////////////////////////
486 //////////////////////////////////////////////////////////////////////////////
487 void cdbios_cmd_mute(void)
489 jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);
491 //////////////////////////////////////////////////////////////////////////////
493 //////////////////////////////////////////////////////////////////////////////
500 //////////////////////////////////////////////////////////////////////////////
501 void cdbios_cmd_umute(void)
503 jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);
505 //////////////////////////////////////////////////////////////////////////////
507 //////////////////////////////////////////////////////////////////////////////
514 //////////////////////////////////////////////////////////////////////////////
515 void cdbios_cmd_pause(void)
517 jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);
519 //////////////////////////////////////////////////////////////////////////////
521 //////////////////////////////////////////////////////////////////////////////
528 //////////////////////////////////////////////////////////////////////////////
529 void cdbios_cmd_upause(void)
531 jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);
533 void cdi_read_block(uint32 sector, uint8 *buffer, uint32 count)
537 cdi_load_sector(cdbios_sector_lut[sector],buffer);
543 //////////////////////////////////////////////////////////////////////////////
545 //////////////////////////////////////////////////////////////////////////////
552 //////////////////////////////////////////////////////////////////////////////
553 void cdbios_cmd_read(void)
555 static uint8 cdbios_sector[2352];
557 /* cdrom_destination_buffer_beginning=s68000context.areg[0];
558 cdrom_destination_buffer_end=s68000context.areg[1];
559 cdrom_time_code=(s68000context.dreg[0])&0x7fffffff;
560 cdrom_seek_only=s68000context.dreg[0]&0x80000000;*/
561 cdrom_destination_buffer_beginning = m68k_get_reg(NULL, M68K_REG_A0);
562 cdrom_destination_buffer_end = m68k_get_reg(NULL, M68K_REG_A1);
563 cdrom_time_code = m68k_get_reg(NULL, M68K_REG_D0) & 0x7FFFFFFF;
564 cdrom_seek_only = m68k_get_reg(NULL, M68K_REG_D0) & 0x80000000;
566 /* cdrom_partition_marker=s68000context.dreg[1];
567 if (s68000context.dreg[2]!=0)
568 cdrom_circular_buffer_size=(1<<s68000context.dreg[2]);*/
569 cdrom_partition_marker = m68k_get_reg(NULL, M68K_REG_D1);
570 if (m68k_get_reg(NULL, M68K_REG_D2) != 0)
571 cdrom_circular_buffer_size = 1 << m68k_get_reg(NULL, M68K_REG_D2);
573 cdrom_circular_buffer_size = 0xFFFFFFFF; // no circular buffer;
575 uint32 mm = (10 * ((cdrom_time_code >> 20) & 0x0F)) + ((cdrom_time_code >> 16) & 0x0F);
576 uint32 ss = (10 * ((cdrom_time_code >> 12) & 0x0F)) + ((cdrom_time_code >> 8) & 0x0F);
577 uint32 ff = (10 * ((cdrom_time_code >> 4) & 0x0F)) + ((cdrom_time_code >> 0) & 0x0F);
579 fprintf(log_get(),"cdbios: read(0x%.8x, 0x%.8x, %.2i:%.2i:%.2i, %i) %s\n",
580 cdrom_destination_buffer_beginning,
581 cdrom_destination_buffer_end,
583 cdrom_circular_buffer_size,cdrom_seek_only?"(seek only)":"");
585 if (!cdrom_seek_only)
587 if (cdbios_init_type==CDBIOS_INITM)
589 fprintf(log_get(),"cdbios: partition marker: %c%c%c%c (0x%.8x)\n",
590 ((cdrom_partition_marker>>24)&0xff),
591 ((cdrom_partition_marker>>16)&0xff),
592 ((cdrom_partition_marker>>8)&0xff),
593 (cdrom_partition_marker&0xff),
594 cdrom_partition_marker
597 if (((int32)cdrom_circular_buffer_size)==-1)
598 cdrom_circular_buffer_size=0xffffffff;
600 uint32 track_offset=((ss+(60*mm))*75)+ff;
602 fprintf(log_get(),"cdbios: track offset: %i\n",track_offset);
603 uint32 nb_sectors=(cdrom_destination_buffer_end-cdrom_destination_buffer_beginning)/2352;
604 uint32 reste=(cdrom_destination_buffer_end-cdrom_destination_buffer_beginning)%2352;
605 uint32 buffer_offset=0;
606 uint32 nb_bytes_to_read=cdrom_destination_buffer_end-cdrom_destination_buffer_beginning+1;
608 if (cdbios_init_type==CDBIOS_INITF)
610 // if (cdrom_destination_buffer_beginning==0x00046000)
613 uint8 *buffer=(uint8*)malloc((nb_sectors+1)*2352);
614 cdi_read_block(track_offset,buffer,nb_sectors+1);
615 for (uint32 k=0;k<nb_bytes_to_read;k++)
616 jaguar_byte_write(cdrom_destination_buffer_beginning+k,buffer[k]);
620 if (cdbios_init_type==CDBIOS_INITM)
622 uint8 *buffer=(uint8*)malloc((31+nb_sectors+1)*2352);
623 cdi_read_block(track_offset,buffer,nb_sectors+1);
625 uint32 count=(31+nb_sectors+1)*2352;
627 uint32 marker_count=2;
632 (alias[0]==((cdrom_partition_marker>>24)&0xff))&&
633 (alias[1]==((cdrom_partition_marker>>16)&0xff))&&
634 (alias[2]==((cdrom_partition_marker>>8)&0xff))&&
635 (alias[3]==((cdrom_partition_marker>>0)&0xff))
647 for (uint32 k=0;k<nb_bytes_to_read;k++)
648 jaguar_byte_write(cdrom_destination_buffer_beginning+k,alias[k]);
660 fprintf(log_get(),"cdbios: unsupported read mode\n");
663 jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);
665 //////////////////////////////////////////////////////////////////////////////
667 //////////////////////////////////////////////////////////////////////////////
674 //////////////////////////////////////////////////////////////////////////////
675 void cdbios_cmd_uread(void)
677 // stop the recording started with a cd_read command
678 // for now, there is nothing to do
679 jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);
681 //////////////////////////////////////////////////////////////////////////////
683 //////////////////////////////////////////////////////////////////////////////
690 //////////////////////////////////////////////////////////////////////////////
691 void cdbios_cmd_setup(void)
693 // initialize the cd system
694 jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);
696 //////////////////////////////////////////////////////////////////////////////
698 //////////////////////////////////////////////////////////////////////////////
705 //////////////////////////////////////////////////////////////////////////////
706 void cdbios_cmd_ptr(void)
708 // s68000context.areg[0]=cdrom_destination_buffer_end+4;
709 m68k_set_reg(M68K_REG_A0, cdrom_destination_buffer_end + 4);
710 jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);
712 //////////////////////////////////////////////////////////////////////////////
714 //////////////////////////////////////////////////////////////////////////////
721 //////////////////////////////////////////////////////////////////////////////
722 void cdbios_cmd_osamp(void)
724 // cdrom_oversample_factor=(1<<(s68000context.dreg[0]&0xffff));
725 cdrom_oversample_factor = 1 << (m68k_get_reg(NULL, M68K_REG_D0) & 0xFFFF);
726 jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);
728 //////////////////////////////////////////////////////////////////////////////
730 //////////////////////////////////////////////////////////////////////////////
737 //////////////////////////////////////////////////////////////////////////////
738 void cdbios_cmd_gettoc(void)
740 jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);
742 //////////////////////////////////////////////////////////////////////////////
744 //////////////////////////////////////////////////////////////////////////////
751 //////////////////////////////////////////////////////////////////////////////
752 void cdbios_cmd_initm(void)
754 cdbios_init_type = CDBIOS_INITM;
755 jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);
756 // fprintf(log_get(),"cdbios: initm(0x%.8x)\n",s68000context.areg[0]);
757 fprintf(log_get(), "cdbios: initm(0x%.8x)\n", m68k_get_reg(NULL, M68K_REG_A0));
759 //////////////////////////////////////////////////////////////////////////////
761 //////////////////////////////////////////////////////////////////////////////
768 //////////////////////////////////////////////////////////////////////////////
769 void cdbios_cmd_initf(void)
771 cdbios_init_type = CDBIOS_INITF;
772 jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);
773 // fprintf(log_get(),"cdbios: initf(0x%.8x)\n",s68000context.areg[0]);
774 fprintf(log_get(), "cdbios: initf(0x%.8x)\n", m68k_get_reg(NULL, M68K_REG_A0));
776 //////////////////////////////////////////////////////////////////////////////
778 //////////////////////////////////////////////////////////////////////////////
785 //////////////////////////////////////////////////////////////////////////////
786 void cd_bios_process(uint32 offset)
788 if (!cdbios_init_done)
791 fprintf(log_get(), "cdbios: processing command '%s'\n", cdbios_command[(offset-0x3000) / 6]);
792 fprintf(log_get(), "cdbios: 68K PC=%08X SP=%08X\n", jaguar_long_read(m68k_get_reg(NULL, M68K_REG_A7)), m68k_get_reg(NULL, M68K_REG_A7));
796 case CD_INIT: cdbios_cmd_init(); break;
797 case CD_MODE: cdbios_cmd_mode(); break;
798 case CD_ACK: cdbios_cmd_ack(); break;
799 case CD_JERI: cdbios_cmd_jeri(); break;
800 case CD_SPIN: cdbios_cmd_spin(); break;
801 case CD_STOP: cdbios_cmd_stop(); break;
802 case CD_MUTE: cdbios_cmd_mute(); break;
803 case CD_UMUTE: cdbios_cmd_umute(); break;
804 case CD_PAUSE: cdbios_cmd_pause(); break;
805 case CD_UPAUSE: cdbios_cmd_upause(); break;
806 case CD_READ: cdbios_cmd_read(); break;
807 case CD_UREAD: cdbios_cmd_uread(); break;
808 case CD_SETUP: cdbios_cmd_setup(); break;
809 case CD_PTR: cdbios_cmd_ptr(); break;
810 case CD_OSAMP: cdbios_cmd_osamp(); break;
811 case CD_GETTOC: cdbios_cmd_gettoc(); break;
812 case CD_INITM: cdbios_cmd_initm(); break;
813 case CD_INITF: cdbios_cmd_initf(); break;
815 default: fprintf(log_get(), "cdbios: unemulated entry point at %08X 68K PC=%08X SP=%08X\n", offset, jaguar_long_read(m68k_get_reg(NULL, M68K_REG_A7)), m68k_get_reg(NULL, M68K_REG_A7));
816 jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);
820 // s68000context.pc=jaguar_long_read(s68000context.areg[7]);
821 // s68000context.areg[7]=(s68000context.areg[7]+4)&0xffffffff;
822 m68k_set_reg(M68K_REG_PC, jaguar_long_read(m68k_get_reg(NULL, M68K_REG_A7)));
823 m68k_set_reg(M68K_REG_A7, (m68k_get_reg(NULL, M68K_REG_A7) + 4) & 0xFFFFFFFF);
825 //////////////////////////////////////////////////////////////////////////////
827 //////////////////////////////////////////////////////////////////////////////
834 //////////////////////////////////////////////////////////////////////////////
835 void cd_bios_exec(uint32 scanline)
837 // single speed mode: 150 Kb/s (153600 bytes/s)
838 // single speed mode: 300 Kb/s (307200 bytes/s)
839 uint32 bytes_per_scanline=(153600*((cdrom_speed==CDROM_DOUBLE_SPEED)?2:1))/525;