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