]> Shamusworld >> Repos - virtualjaguar/blob - src/cdbios.cpp
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes.
[virtualjaguar] / src / cdbios.cpp
1 //////////////////////////////////////////////////////////////////////////////\r
2 //\r
3 //////////////////////////////////////////////////////////////////////////////\r
4 //\r
5 // 20.02.2002: fixed sector to msf conversion\r
6 // 19.02.2002: fixed a bug in toc encoding function\r
7 //\r
8 //\r
9 //\r
10 //////////////////////////////////////////////////////////////////////////////\r
11 #include "include/cdbios.h"\r
12 \r
13 /* Added by SDLEMU (http://sdlemu.ngemu.com */\r
14 /* Some GCC UNIX includes                   */\r
15 #ifdef __GCCUNIX__\r
16         #include <unistd.h>\r
17 #endif\r
18 \r
19 #define ERR_FLAG        0x3e00\r
20 #define CD_TOC          0x2c00\r
21 #define BIOS_VER    0x3004\r
22 \r
23 \r
24 #define CDBIOS_INIT             0\r
25 #define CDBIOS_INITM    1\r
26 #define CDBIOS_INITF    2\r
27 \r
28 \r
29 \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
48 \r
49 \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
53 \r
54 #define CDROM_AUDIO_MODE        0\r
55 #define CDROM_DATA_MODE         1\r
56 \r
57 #define CDROM_SINGLE_SPEED      0\r
58 #define CDROM_DOUBLE_SPEED  1\r
59 \r
60 #define CDROM_STATUS_OK         0\r
61 #define CDROM_STATUS_ERROR      1\r
62 \r
63 \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
68 \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
75 \r
76 uint32 cdbios_init_type;\r
77 uint32 *cdbios_sector_lut;\r
78 uint32 cdbios_init_done=0;\r
79 \r
80 //////////////////////////////////////////////////////////////////////////////\r
81 //\r
82 //////////////////////////////////////////////////////////////////////////////\r
83 //\r
84 //\r
85 //\r
86 //\r
87 //\r
88 //\r
89 //////////////////////////////////////////////////////////////////////////////\r
90 void cdbios_build_sector_lut(void)\r
91 {\r
92         uint32 last_sector=0;\r
93         int32 offset=0;\r
94         uint32 sector=0;\r
95 \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
97         \r
98         last_sector=last_track->start_lba+last_track->total_length-1;\r
99 \r
100 \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
103 \r
104         for (int session=0;session<cdi_descriptor->nb_of_sessions;session++)\r
105         {\r
106                 for (int track=0;track<cdi_descriptor->sessions[session].nb_of_tracks;track++)\r
107                 {\r
108                         s_cdi_track *current_track=&cdi_descriptor->sessions[session].tracks[track];\r
109 \r
110                         if (offset<((int32)(current_track->start_lba-1)))\r
111                         {\r
112                                 fprintf(log_get(),"cdbios: postgap between %i and %i\n",offset,current_track->start_lba-1);\r
113 \r
114                                 // fill-in postgap\r
115                                 for (;offset<current_track->start_lba;offset++)\r
116                                 {\r
117                                         cdbios_sector_lut[offset]=0xffffffff;\r
118                                 }\r
119 \r
120                         }                       \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
123                         {\r
124                                 cdbios_sector_lut[offset]=sector;\r
125                                 sector++;\r
126                         }\r
127 \r
128                 }\r
129         }\r
130 \r
131 }\r
132 //////////////////////////////////////////////////////////////////////////////\r
133 //\r
134 //////////////////////////////////////////////////////////////////////////////\r
135 //\r
136 //\r
137 //\r
138 //\r
139 //\r
140 //\r
141 //////////////////////////////////////////////////////////////////////////////\r
142 void cdbios_get_time(uint32 sectors, uint32 *mm, uint32 *ss, uint32 *ff)\r
143 {\r
144         uint32 _sectors=sectors;\r
145 \r
146         uint32 _mm=(sectors/(60*75));\r
147         sectors-=(_mm*(60*75));\r
148         uint32 _ss=(sectors/75);\r
149         sectors-=(_ss*75);\r
150         uint32 _ff=sectors;\r
151 \r
152         *mm=_mm;\r
153         *ss=_ss;\r
154         *ff=_ff;\r
155         \r
156 \r
157 //      fprintf(log_get(),"[%.2i:%.2i:%.2i]\n",_mm,_ss,_ff);\r
158 }\r
159 //////////////////////////////////////////////////////////////////////////////\r
160 //\r
161 //////////////////////////////////////////////////////////////////////////////\r
162 //\r
163 //\r
164 //\r
165 //\r
166 //\r
167 //\r
168 //////////////////////////////////////////////////////////////////////////////\r
169 void cdbios_encode_toc(void)\r
170 {\r
171         int i;\r
172         uint32 base=CD_TOC;\r
173 \r
174         jaguar_byte_write(base++,0x00);\r
175         jaguar_byte_write(base++,0x00);\r
176         jaguar_byte_write(base++,0x01);\r
177 \r
178         int nbtracks=0;\r
179         for (i=0;i<cdi_descriptor->nb_of_sessions;i++)\r
180                 nbtracks+=cdi_descriptor->sessions[i].nb_of_tracks;\r
181 \r
182         jaguar_byte_write(base++,nbtracks+1);\r
183         jaguar_byte_write(base++,cdi_descriptor->nb_of_sessions);\r
184         \r
185         uint32 mm=0;\r
186         uint32 ss=0;\r
187         uint32 ff=0;\r
188 \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
192                                         &mm,&ss,&ff);\r
193 \r
194         jaguar_byte_write(base++,mm);\r
195         jaguar_byte_write(base++,ss);\r
196         jaguar_byte_write(base++,ff);\r
197 \r
198         int track_count=1;\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
201                 {\r
202                         s_cdi_track *track=&cdi_descriptor->sessions[i].tracks[j];\r
203                         \r
204 //                      fprintf(log_get(),"track %i\n",track_count);\r
205 \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
216                                 \r
217                         track_count++;\r
218                 }\r
219 \r
220         cdi_tracks_count=track_count;\r
221         cdi_tracks=(s_cdi_track**)malloc(track_count*sizeof(s_cdi_track*));\r
222         track_count=0;\r
223         for (i=0;i<cdi_descriptor->nb_of_sessions;i++)\r
224         {\r
225                 for (int j=0;j<cdi_descriptor->sessions[i].nb_of_tracks;j++)\r
226                 {\r
227                         cdi_tracks[track_count]=&cdi_descriptor->sessions[i].tracks[j];\r
228                         track_count++;\r
229                 }\r
230         }\r
231 }\r
232 //////////////////////////////////////////////////////////////////////////////\r
233 //\r
234 //////////////////////////////////////////////////////////////////////////////\r
235 //\r
236 //\r
237 //\r
238 //\r
239 //\r
240 //\r
241 //////////////////////////////////////////////////////////////////////////////\r
242 void cdbios_decode_toc(void)\r
243 {\r
244         uint32 addr=0x2c00;\r
245         uint32 nb_tracks;\r
246         \r
247         fprintf(log_get(),"cdbios: toc:\n");\r
248         fprintf(log_get(),"cdbios:\n");\r
249         addr+=2;\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
255 \r
256         uint32 mm,ss,ff;\r
257 \r
258         nb_tracks--;\r
259 \r
260         while (nb_tracks)\r
261         {\r
262                 fprintf(log_get(),"cdbios:\n");\r
263                 fprintf(log_get(),"cdbios: track          : %i\n",jaguar_byte_read(addr++));\r
264                 \r
265                 mm=jaguar_byte_read(addr++);\r
266                 ss=jaguar_byte_read(addr++);\r
267                 ff=jaguar_byte_read(addr++);\r
268 \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
271                 \r
272                 mm=jaguar_byte_read(addr++);\r
273                 ss=jaguar_byte_read(addr++);\r
274                 ff=jaguar_byte_read(addr++);\r
275 \r
276                 fprintf(log_get(),"cdbios: duration       : %.2i:%.2i:%.2i\n",mm,ss,ff);\r
277                 nb_tracks--;\r
278         }\r
279 }\r
280 //////////////////////////////////////////////////////////////////////////////\r
281 //\r
282 //////////////////////////////////////////////////////////////////////////////\r
283 //\r
284 //\r
285 //\r
286 //\r
287 //\r
288 //\r
289 //////////////////////////////////////////////////////////////////////////////\r
290 void cd_bios_boot(char *filename)\r
291 {\r
292         cd_bios_init();\r
293 \r
294 \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
298         {\r
299                 fprintf(log_get(),"cdi: bad image\n");\r
300                 cdi_close(cdi_fp);\r
301                 return;\r
302         }\r
303         cdi_dump_descriptor(log_get(),cdi_descriptor);\r
304         cdbios_build_sector_lut();\r
305 \r
306         uint8 *code=cdi_extract_boot_code(cdi_fp,cdi_descriptor);\r
307 \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
311 \r
312         // set the boot address\r
313         jaguar_long_write(0x00000004,cdi_load_address);\r
314 \r
315         // write the toc\r
316         cdbios_encode_toc();\r
317 \r
318         // dump the toc\r
319         cdbios_decode_toc();\r
320 \r
321 //      fprintf(log_get(),"cdbios: boot code:\n");\r
322 //      jaguar_dasm(cdi_load_address, cdi_code_length);\r
323 }\r
324 //////////////////////////////////////////////////////////////////////////////\r
325 //\r
326 //////////////////////////////////////////////////////////////////////////////\r
327 //\r
328 //\r
329 //\r
330 //\r
331 //\r
332 //\r
333 //////////////////////////////////////////////////////////////////////////////\r
334 void cd_bios_init(void)\r
335 {\r
336         fprintf(log_get(),"cd_bios: initializing\n");\r
337         for (int i=0;i<19;i++)\r
338         {\r
339                 // RESET opcode\r
340                 jaguar_word_write(0x3000+(i*6),0x4E70);\r
341         }\r
342         cd_bios_reset();\r
343         cdbios_init_done=1;\r
344 }\r
345 //////////////////////////////////////////////////////////////////////////////\r
346 //\r
347 //////////////////////////////////////////////////////////////////////////////\r
348 //\r
349 //\r
350 //\r
351 //\r
352 //\r
353 //\r
354 //////////////////////////////////////////////////////////////////////////////\r
355 void cd_bios_reset(void)\r
356 {\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
363 }\r
364 //////////////////////////////////////////////////////////////////////////////\r
365 //\r
366 //////////////////////////////////////////////////////////////////////////////\r
367 //\r
368 //\r
369 //\r
370 //\r
371 //\r
372 //\r
373 //////////////////////////////////////////////////////////////////////////////\r
374 void cd_bios_done(void)\r
375 {\r
376         fprintf(log_get(),"cd_bios: done\n");\r
377         close(cdi_fp);\r
378 }\r
379 //////////////////////////////////////////////////////////////////////////////\r
380 //\r
381 //////////////////////////////////////////////////////////////////////////////\r
382 //\r
383 //\r
384 //\r
385 //\r
386 //\r
387 //\r
388 //////////////////////////////////////////////////////////////////////////////\r
389 void cdbios_cmd_init(void)\r
390 {\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
394 }\r
395 //////////////////////////////////////////////////////////////////////////////\r
396 //\r
397 //////////////////////////////////////////////////////////////////////////////\r
398 //\r
399 //\r
400 //\r
401 //\r
402 //\r
403 //\r
404 //////////////////////////////////////////////////////////////////////////////\r
405 void cdbios_cmd_mode(void)\r
406 {\r
407 //      uint32 data = s68000context.dreg[0];\r
408         uint32 data = m68k_get_reg(NULL, M68K_REG_D0);\r
409 \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
413 \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
416 }\r
417 //////////////////////////////////////////////////////////////////////////////\r
418 //\r
419 //////////////////////////////////////////////////////////////////////////////\r
420 //\r
421 //\r
422 //\r
423 //\r
424 //\r
425 //\r
426 //////////////////////////////////////////////////////////////////////////////\r
427 void cdbios_cmd_ack(void)\r
428 {\r
429     jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
430 }\r
431 //////////////////////////////////////////////////////////////////////////////\r
432 //\r
433 //////////////////////////////////////////////////////////////////////////////\r
434 //\r
435 //\r
436 //\r
437 //\r
438 //\r
439 //\r
440 //////////////////////////////////////////////////////////////////////////////\r
441 void cdbios_cmd_jeri(void)\r
442 {\r
443     jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
444 }\r
445 //////////////////////////////////////////////////////////////////////////////\r
446 //\r
447 //////////////////////////////////////////////////////////////////////////////\r
448 //\r
449 //\r
450 //\r
451 //\r
452 //\r
453 //\r
454 //////////////////////////////////////////////////////////////////////////////\r
455 void cdbios_cmd_spin(void)\r
456 {\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
462 }\r
463 //////////////////////////////////////////////////////////////////////////////\r
464 //\r
465 //////////////////////////////////////////////////////////////////////////////\r
466 //\r
467 //\r
468 //\r
469 //\r
470 //\r
471 //\r
472 //////////////////////////////////////////////////////////////////////////////\r
473 void cdbios_cmd_stop(void)\r
474 {\r
475     jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
476 }\r
477 //////////////////////////////////////////////////////////////////////////////\r
478 //\r
479 //////////////////////////////////////////////////////////////////////////////\r
480 //\r
481 //\r
482 //\r
483 //\r
484 //\r
485 //\r
486 //////////////////////////////////////////////////////////////////////////////\r
487 void cdbios_cmd_mute(void)\r
488 {\r
489     jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
490 }\r
491 //////////////////////////////////////////////////////////////////////////////\r
492 //\r
493 //////////////////////////////////////////////////////////////////////////////\r
494 //\r
495 //\r
496 //\r
497 //\r
498 //\r
499 //\r
500 //////////////////////////////////////////////////////////////////////////////\r
501 void cdbios_cmd_umute(void)\r
502 {\r
503     jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
504 }\r
505 //////////////////////////////////////////////////////////////////////////////\r
506 //\r
507 //////////////////////////////////////////////////////////////////////////////\r
508 //\r
509 //\r
510 //\r
511 //\r
512 //\r
513 //\r
514 //////////////////////////////////////////////////////////////////////////////\r
515 void cdbios_cmd_pause(void)\r
516 {\r
517     jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
518 }\r
519 //////////////////////////////////////////////////////////////////////////////\r
520 //\r
521 //////////////////////////////////////////////////////////////////////////////\r
522 //\r
523 //\r
524 //\r
525 //\r
526 //\r
527 //\r
528 //////////////////////////////////////////////////////////////////////////////\r
529 void cdbios_cmd_upause(void)\r
530 {\r
531     jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
532 }\r
533 void cdi_read_block(uint32 sector, uint8 *buffer, uint32 count)\r
534 {\r
535         while (count)\r
536         {\r
537                 cdi_load_sector(cdbios_sector_lut[sector],buffer);\r
538                 buffer+=2352;\r
539                 sector++;\r
540                 count--;\r
541         }\r
542 }\r
543 //////////////////////////////////////////////////////////////////////////////\r
544 //\r
545 //////////////////////////////////////////////////////////////////////////////\r
546 //\r
547 //\r
548 //\r
549 //\r
550 //\r
551 //\r
552 //////////////////////////////////////////////////////////////////////////////\r
553 void cdbios_cmd_read(void)\r
554 {\r
555         static uint8 cdbios_sector[2352];\r
556 \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
565 \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
572         else\r
573                 cdrom_circular_buffer_size = 0xFFFFFFFF; // no circular buffer;\r
574 \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
578 \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
582                                                 mm,ss,ff,\r
583                                                 cdrom_circular_buffer_size,cdrom_seek_only?"(seek only)":"");\r
584 \r
585         if (!cdrom_seek_only)\r
586         {\r
587                 if (cdbios_init_type==CDBIOS_INITM)\r
588                 {\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
595                                 );\r
596                 }\r
597                 if (((int32)cdrom_circular_buffer_size)==-1)\r
598                         cdrom_circular_buffer_size=0xffffffff;\r
599 \r
600                 uint32 track_offset=((ss+(60*mm))*75)+ff;\r
601 \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
607 \r
608                 if (cdbios_init_type==CDBIOS_INITF)\r
609                 {\r
610 //                      if (cdrom_destination_buffer_beginning==0x00046000)\r
611 //                              return;\r
612 \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
617                         free(buffer);\r
618                 }\r
619                 else\r
620                 if (cdbios_init_type==CDBIOS_INITM)\r
621                 {\r
622                         uint8 *buffer=(uint8*)malloc((31+nb_sectors+1)*2352);\r
623                         cdi_read_block(track_offset,buffer,nb_sectors+1);\r
624                         \r
625                         uint32  count=(31+nb_sectors+1)*2352;\r
626                         uint8   *alias=buffer;\r
627                         uint32  marker_count=2;\r
628 \r
629                         while (count-4)\r
630                         {\r
631                                 if (\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
636                                         )\r
637                                 {\r
638                                         marker_count--;\r
639                                         if (marker_count)\r
640                                         {\r
641                                                 alias+=3;\r
642                                         }\r
643                                         else\r
644                                         {\r
645                                                 exit(0);\r
646                                                 alias+=4;\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
649                                                 free(buffer);\r
650                                                 return;\r
651                                         }\r
652                                 }\r
653                                 alias++;\r
654                                 count--;\r
655                         }\r
656                         free(buffer);\r
657                 }\r
658                 else\r
659                 {\r
660                         fprintf(log_get(),"cdbios: unsupported read mode\n");\r
661                 }\r
662         }\r
663     jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
664 }\r
665 //////////////////////////////////////////////////////////////////////////////\r
666 //\r
667 //////////////////////////////////////////////////////////////////////////////\r
668 //\r
669 //\r
670 //\r
671 //\r
672 //\r
673 //\r
674 //////////////////////////////////////////////////////////////////////////////\r
675 void cdbios_cmd_uread(void)\r
676 {\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
680 }\r
681 //////////////////////////////////////////////////////////////////////////////\r
682 //\r
683 //////////////////////////////////////////////////////////////////////////////\r
684 //\r
685 //\r
686 //\r
687 //\r
688 //\r
689 //\r
690 //////////////////////////////////////////////////////////////////////////////\r
691 void cdbios_cmd_setup(void)\r
692 {\r
693         // initialize the cd system\r
694     jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);\r
695 }\r
696 //////////////////////////////////////////////////////////////////////////////\r
697 //\r
698 //////////////////////////////////////////////////////////////////////////////\r
699 //\r
700 //\r
701 //\r
702 //\r
703 //\r
704 //\r
705 //////////////////////////////////////////////////////////////////////////////\r
706 void cdbios_cmd_ptr(void)\r
707 {\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
711 }\r
712 //////////////////////////////////////////////////////////////////////////////\r
713 //\r
714 //////////////////////////////////////////////////////////////////////////////\r
715 //\r
716 //\r
717 //\r
718 //\r
719 //\r
720 //\r
721 //////////////////////////////////////////////////////////////////////////////\r
722 void cdbios_cmd_osamp(void)\r
723 {\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
727 }\r
728 //////////////////////////////////////////////////////////////////////////////\r
729 //\r
730 //////////////////////////////////////////////////////////////////////////////\r
731 //\r
732 //\r
733 //\r
734 //\r
735 //\r
736 //\r
737 //////////////////////////////////////////////////////////////////////////////\r
738 void cdbios_cmd_gettoc(void)\r
739 {\r
740     jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
741 }\r
742 //////////////////////////////////////////////////////////////////////////////\r
743 //\r
744 //////////////////////////////////////////////////////////////////////////////\r
745 //\r
746 //\r
747 //\r
748 //\r
749 //\r
750 //\r
751 //////////////////////////////////////////////////////////////////////////////\r
752 void cdbios_cmd_initm(void)\r
753 {\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
758 }\r
759 //////////////////////////////////////////////////////////////////////////////\r
760 //\r
761 //////////////////////////////////////////////////////////////////////////////\r
762 //\r
763 //\r
764 //\r
765 //\r
766 //\r
767 //\r
768 //////////////////////////////////////////////////////////////////////////////\r
769 void cdbios_cmd_initf(void)\r
770 {\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
775 }\r
776 //////////////////////////////////////////////////////////////////////////////\r
777 //\r
778 //////////////////////////////////////////////////////////////////////////////\r
779 //\r
780 //\r
781 //\r
782 //\r
783 //\r
784 //\r
785 //////////////////////////////////////////////////////////////////////////////\r
786 void cd_bios_process(uint32 offset)\r
787 {\r
788         if (!cdbios_init_done)\r
789                 return;\r
790 \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
793 \r
794         switch (offset)\r
795         {\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
814 \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
817         }\r
818 \r
819         // rts\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
824 }\r
825 //////////////////////////////////////////////////////////////////////////////\r
826 //\r
827 //////////////////////////////////////////////////////////////////////////////\r
828 //\r
829 //\r
830 //\r
831 //\r
832 //\r
833 //\r
834 //////////////////////////////////////////////////////////////////////////////\r
835 void cd_bios_exec(uint32 scanline)\r
836 {\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
840 }\r