trunk/src/mame/machine/megacdcd.c
| r20080 | r20081 | |
| 236 | 236 | if(segacd.cd == NULL) // no cd is there, bail out |
| 237 | 237 | return; |
| 238 | 238 | CDD_STATUS |= SCD_STATUS; |
| 239 | | elapsedlba = SCD_CURLBA - segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) ].physframeofs; |
| 239 | elapsedlba = SCD_CURLBA - segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) ].logframeofs; |
| 240 | 240 | msf = lba_to_msf_alt (elapsedlba); |
| 241 | | //popmessage("%08x %08x",SCD_CURLBA,segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) + 1 ].physframeofs); |
| 241 | //popmessage("%08x %08x",SCD_CURLBA,segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) + 1 ].logframeofs); |
| 242 | 242 | CDD_MIN = to_bcd(((msf & 0x00ff0000)>>16),false); |
| 243 | 243 | CDD_SEC = to_bcd(((msf & 0x0000ff00)>>8),false); |
| 244 | 244 | CDD_FRAME = to_bcd(((msf & 0x000000ff)>>0),false); |
| r20080 | r20081 | |
| 263 | 263 | return; |
| 264 | 264 | CDD_STATUS |= SCD_STATUS; |
| 265 | 265 | |
| 266 | | UINT32 startlba = (segacd.toc->tracks[cdrom_get_last_track(segacd.cd)].physframeofs); |
| 266 | UINT32 startlba = (segacd.toc->tracks[cdrom_get_last_track(segacd.cd)].logframeofs); |
| 267 | 267 | UINT32 startmsf = lba_to_msf_alt( startlba ); |
| 268 | 268 | |
| 269 | 269 | CDD_MIN = to_bcd((startmsf&0x00ff0000)>>16,false); |
| r20080 | r20081 | |
| 301 | 301 | if (track < 1) |
| 302 | 302 | track = 1; |
| 303 | 303 | |
| 304 | | UINT32 startlba = (segacd.toc->tracks[track-1].physframeofs); |
| 304 | UINT32 startlba = (segacd.toc->tracks[track-1].logframeofs); |
| 305 | 305 | UINT32 startmsf = lba_to_msf_alt( startlba+150 ); |
| 306 | 306 | |
| 307 | 307 | CDD_MIN = to_bcd((startmsf&0x00ff0000)>>16,false); |
| r20080 | r20081 | |
| 359 | 359 | CLEAR_CDD_RESULT |
| 360 | 360 | UINT32 msf = getmsf_from_regs(); |
| 361 | 361 | SCD_CURLBA = msf_to_lba(msf)-150; |
| 362 | | UINT32 end_msf = segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) + 1 ].physframeofs; |
| 362 | UINT32 end_msf = segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) + 1 ].logframeofs; |
| 363 | 363 | SCD_CURTRK = cdrom_get_track(segacd.cd, SCD_CURLBA)+1; |
| 364 | 364 | LC8951UpdateHeader(); |
| 365 | 365 | SCD_STATUS = CDD_PLAYINGCDDA; |
trunk/src/lib/util/cdrom.c
| r20080 | r20081 | |
| 124 | 124 | return physlba; |
| 125 | 125 | } |
| 126 | 126 | |
| 127 | /*------------------------------------------------- |
| 128 | logical_to_chd_lba - find the CHD LBA |
| 129 | and the track number |
| 130 | -------------------------------------------------*/ |
| 127 | 131 | |
| 132 | INLINE UINT32 logical_to_chd_lba(cdrom_file *file, UINT32 loglba, UINT32 &tracknum) |
| 133 | { |
| 134 | UINT32 chdlba, physlba; |
| 135 | int track; |
| 128 | 136 | |
| 137 | /* loop until our current LBA is less than the start LBA of the next track */ |
| 138 | for (track = 0; track < file->cdtoc.numtrks; track++) |
| 139 | if (loglba < file->cdtoc.tracks[track + 1].logframeofs) |
| 140 | { |
| 141 | // convert to physical and proceed |
| 142 | physlba = file->cdtoc.tracks[track].physframeofs + (loglba - file->cdtoc.tracks[track].logframeofs); |
| 143 | chdlba = physlba - file->cdtoc.tracks[track].physframeofs + file->cdtoc.tracks[track].chdframeofs; |
| 144 | tracknum = track; |
| 145 | return chdlba; |
| 146 | } |
| 147 | |
| 148 | return loglba; |
| 149 | } |
| 150 | |
| 151 | |
| 129 | 152 | /*************************************************************************** |
| 130 | 153 | BASE FUNCTIONALITY |
| 131 | 154 | ***************************************************************************/ |
| r20080 | r20081 | |
| 134 | 157 | { |
| 135 | 158 | int i; |
| 136 | 159 | cdrom_file *file; |
| 137 | | UINT32 physofs; |
| 160 | UINT32 physofs, logofs; |
| 138 | 161 | |
| 139 | 162 | /* allocate memory for the CD-ROM file */ |
| 140 | 163 | file = new cdrom_file(); |
| r20080 | r20081 | |
| 168 | 191 | /* calculate the starting frame for each track, keeping in mind that CHDMAN |
| 169 | 192 | pads tracks out with extra frames to fit 4-frame size boundries |
| 170 | 193 | */ |
| 171 | | physofs = 0; |
| 194 | physofs = logofs = 0; |
| 172 | 195 | for (i = 0; i < file->cdtoc.numtrks; i++) |
| 173 | 196 | { |
| 174 | 197 | file->cdtoc.tracks[i].physframeofs = physofs; |
| 175 | 198 | file->cdtoc.tracks[i].chdframeofs = 0; |
| 176 | 199 | |
| 200 | // pregap counts against this track |
| 201 | logofs += file->cdtoc.tracks[i].pregap; |
| 202 | file->cdtoc.tracks[i].logframeofs = logofs; |
| 203 | |
| 204 | // postgap counts against the next track |
| 205 | logofs += file->cdtoc.tracks[i].postgap; |
| 206 | |
| 177 | 207 | physofs += file->cdtoc.tracks[i].frames; |
| 208 | logofs += file->cdtoc.tracks[i].frames; |
| 178 | 209 | |
| 179 | | LOG(("Track %02d is format %d subtype %d datasize %d subsize %d frames %d extraframes %d physofs %d chdofs %d\n", i+1, |
| 210 | LOG(("Track %02d is format %d subtype %d datasize %d subsize %d frames %d extraframes %d pregap %d postgap %d logofs %d physofs %d chdofs %d\n", i+1, |
| 180 | 211 | file->cdtoc.tracks[i].trktype, |
| 181 | 212 | file->cdtoc.tracks[i].subtype, |
| 182 | 213 | file->cdtoc.tracks[i].datasize, |
| 183 | 214 | file->cdtoc.tracks[i].subsize, |
| 184 | 215 | file->cdtoc.tracks[i].frames, |
| 185 | | file->cdtoc.tracks[i].extraframes, |
| 216 | file->cdtoc.tracks[i].extraframes, |
| 217 | file->cdtoc.tracks[i].pregap, |
| 218 | file->cdtoc.tracks[i].postgap, |
| 219 | file->cdtoc.tracks[i].logframeofs, |
| 186 | 220 | file->cdtoc.tracks[i].physframeofs, |
| 187 | 221 | file->cdtoc.tracks[i].chdframeofs)); |
| 188 | 222 | } |
| r20080 | r20081 | |
| 203 | 237 | { |
| 204 | 238 | int i; |
| 205 | 239 | cdrom_file *file; |
| 206 | | UINT32 physofs, chdofs; |
| 240 | UINT32 physofs, chdofs, logofs; |
| 207 | 241 | chd_error err; |
| 208 | 242 | |
| 209 | 243 | /* punt if no CHD */ |
| r20080 | r20081 | |
| 237 | 271 | /* calculate the starting frame for each track, keeping in mind that CHDMAN |
| 238 | 272 | pads tracks out with extra frames to fit 4-frame size boundries |
| 239 | 273 | */ |
| 240 | | physofs = chdofs = 0; |
| 274 | physofs = chdofs = logofs = 0; |
| 241 | 275 | for (i = 0; i < file->cdtoc.numtrks; i++) |
| 242 | 276 | { |
| 243 | 277 | file->cdtoc.tracks[i].physframeofs = physofs; |
| 244 | 278 | file->cdtoc.tracks[i].chdframeofs = chdofs; |
| 245 | 279 | |
| 280 | // pregap counts against this track |
| 281 | logofs += file->cdtoc.tracks[i].pregap; |
| 282 | file->cdtoc.tracks[i].logframeofs = logofs; |
| 283 | |
| 284 | // postgap counts against the next track |
| 285 | logofs += file->cdtoc.tracks[i].postgap; |
| 286 | |
| 246 | 287 | physofs += file->cdtoc.tracks[i].frames; |
| 247 | 288 | chdofs += file->cdtoc.tracks[i].frames; |
| 248 | 289 | chdofs += file->cdtoc.tracks[i].extraframes; |
| 290 | logofs += file->cdtoc.tracks[i].frames; |
| 249 | 291 | |
| 250 | | LOG(("Track %02d is format %d subtype %d datasize %d subsize %d frames %d extraframes %d physofs %d chdofs %d\n", i+1, |
| 292 | LOG(("Track %02d is format %d subtype %d datasize %d subsize %d frames %d extraframes %d pregap %d postgap %d logofs %d physofs %d chdofs %d\n", i+1, |
| 251 | 293 | file->cdtoc.tracks[i].trktype, |
| 252 | 294 | file->cdtoc.tracks[i].subtype, |
| 253 | 295 | file->cdtoc.tracks[i].datasize, |
| 254 | 296 | file->cdtoc.tracks[i].subsize, |
| 255 | 297 | file->cdtoc.tracks[i].frames, |
| 256 | | file->cdtoc.tracks[i].extraframes, |
| 298 | file->cdtoc.tracks[i].extraframes, |
| 299 | file->cdtoc.tracks[i].pregap, |
| 300 | file->cdtoc.tracks[i].postgap, |
| 301 | file->cdtoc.tracks[i].logframeofs, |
| 257 | 302 | file->cdtoc.tracks[i].physframeofs, |
| 258 | 303 | file->cdtoc.tracks[i].chdframeofs)); |
| 259 | 304 | } |
| r20080 | r20081 | |
| 328 | 373 | from a CD-ROM |
| 329 | 374 | -------------------------------------------------*/ |
| 330 | 375 | |
| 331 | | UINT32 cdrom_read_data(cdrom_file *file, UINT32 lbasector, void *buffer, UINT32 datatype) |
| 376 | UINT32 cdrom_read_data(cdrom_file *file, UINT32 lbasector, void *buffer, UINT32 datatype, bool phys) |
| 332 | 377 | { |
| 333 | 378 | if (file == NULL) |
| 334 | 379 | return 0; |
| 335 | 380 | |
| 336 | 381 | // compute CHD sector and tracknumber |
| 337 | 382 | UINT32 tracknum = 0; |
| 338 | | UINT32 chdsector = physical_to_chd_lba(file, lbasector, tracknum); |
| 383 | UINT32 chdsector; |
| 339 | 384 | |
| 385 | if (phys) |
| 386 | { |
| 387 | chdsector = physical_to_chd_lba(file, lbasector, tracknum); |
| 388 | } |
| 389 | else |
| 390 | { |
| 391 | chdsector = logical_to_chd_lba(file, lbasector, tracknum); |
| 392 | } |
| 393 | |
| 340 | 394 | /* copy out the requested sector */ |
| 341 | 395 | UINT32 tracktype = file->cdtoc.tracks[tracknum].trktype; |
| 342 | 396 | if ((datatype == tracktype) || (datatype == CD_TRACK_RAW_DONTCARE)) |
| r20080 | r20081 | |
| 390 | 444 | a sector |
| 391 | 445 | -------------------------------------------------*/ |
| 392 | 446 | |
| 393 | | UINT32 cdrom_read_subcode(cdrom_file *file, UINT32 lbasector, void *buffer) |
| 447 | UINT32 cdrom_read_subcode(cdrom_file *file, UINT32 lbasector, void *buffer, bool phys) |
| 394 | 448 | { |
| 395 | 449 | if (file == NULL) |
| 396 | 450 | return ~0; |
| 397 | 451 | |
| 398 | 452 | // compute CHD sector and tracknumber |
| 399 | 453 | UINT32 tracknum = 0; |
| 400 | | UINT32 chdsector = physical_to_chd_lba(file, lbasector, tracknum); |
| 454 | UINT32 chdsector; |
| 455 | |
| 456 | if (phys) |
| 457 | { |
| 458 | chdsector = physical_to_chd_lba(file, lbasector, tracknum); |
| 459 | } |
| 460 | else |
| 461 | { |
| 462 | chdsector = logical_to_chd_lba(file, lbasector, tracknum); |
| 463 | } |
| 464 | |
| 401 | 465 | if (file->cdtoc.tracks[tracknum].subsize == 0) |
| 402 | 466 | return 1; |
| 403 | 467 | |
| r20080 | r20081 | |
| 425 | 489 | return ~0; |
| 426 | 490 | |
| 427 | 491 | /* convert to a CHD sector offset and get track information */ |
| 428 | | physical_to_chd_lba(file, frame, track); |
| 492 | logical_to_chd_lba(file, frame, track); |
| 429 | 493 | return track; |
| 430 | 494 | } |
| 431 | 495 | |
| r20080 | r20081 | |
| 444 | 508 | if (track == 0xaa) |
| 445 | 509 | track = file->cdtoc.numtrks; |
| 446 | 510 | |
| 447 | | return file->cdtoc.tracks[track].physframeofs; |
| 511 | return file->cdtoc.tracks[track].logframeofs; |
| 448 | 512 | } |
| 449 | 513 | |
| 514 | /*------------------------------------------------- |
| 515 | cdrom_get_track_start_phys - get the |
| 516 | physical frame number that a track starts at |
| 517 | -------------------------------------------------*/ |
| 450 | 518 | |
| 519 | UINT32 cdrom_get_track_start_phys(cdrom_file *file, UINT32 track) |
| 520 | { |
| 521 | if (file == NULL) |
| 522 | return ~0; |
| 451 | 523 | |
| 524 | /* handle lead-out specially */ |
| 525 | if (track == 0xaa) |
| 526 | track = file->cdtoc.numtrks; |
| 527 | |
| 528 | return file->cdtoc.tracks[track].physframeofs; |
| 529 | } |
| 530 | |
| 452 | 531 | /*************************************************************************** |
| 453 | 532 | TOC UTILITIES |
| 454 | 533 | ***************************************************************************/ |
trunk/src/mess/machine/pce.c
| r20080 | r20081 | |
| 600 | 600 | f = bcd_2_dec( pce_cd.command_buffer[4]); |
| 601 | 601 | |
| 602 | 602 | frame = f + 75 * (s + m * 60); |
| 603 | | if(frame >= 525) // TODO: seven seconds gap? O_o |
| 604 | | frame -= 525; |
| 603 | // PCE tries to be clever here and set (start of track + track pregap size) to skip the pregap |
| 604 | // (I guess it wants the TOC to have the real start sector for data tracks and the start of the pregap for audio?) |
| 605 | frame -= pce_cd.toc->tracks[cdrom_get_track(pce_cd.cd, frame)].pregap; |
| 605 | 606 | break; |
| 606 | 607 | } |
| 607 | 608 | case 0x80: |
| 608 | | frame = pce_cd.toc->tracks[ bcd_2_dec( pce_cd.command_buffer[2] ) - 1 ].physframeofs; |
| 609 | frame = pce_cd.toc->tracks[ bcd_2_dec( pce_cd.command_buffer[2] ) - 1 ].logframeofs; |
| 609 | 610 | break; |
| 610 | 611 | default: |
| 611 | 612 | popmessage("CD-DA set start mode 0xc0, contact MESSdev"); |
| r20080 | r20081 | |
| 635 | 636 | else |
| 636 | 637 | { |
| 637 | 638 | pce_cd.cdda_status = PCE_CD_CDDA_PLAYING; |
| 638 | | pce_cd.end_frame = pce_cd.toc->tracks[ cdrom_get_track(pce_cd.cd, pce_cd.current_frame) + 1 ].physframeofs; //get the end of THIS track |
| 639 | pce_cd.end_frame = pce_cd.toc->tracks[ cdrom_get_track(pce_cd.cd, pce_cd.current_frame) + 1 ].logframeofs; //get the end of THIS track |
| 639 | 640 | cdda_start_audio( machine.device( "cdda" ), pce_cd.current_frame, pce_cd.end_frame - pce_cd.current_frame ); |
| 640 | 641 | pce_cd.end_mark = 0; |
| 641 | 642 | pce_cd.cdda_play_mode = 3; |
| r20080 | r20081 | |
| 680 | 681 | break; |
| 681 | 682 | } |
| 682 | 683 | case 0x80: |
| 683 | | frame = pce_cd.toc->tracks[ bcd_2_dec( pce_cd.command_buffer[2] ) - 1 ].physframeofs; |
| 684 | frame = pce_cd.toc->tracks[ bcd_2_dec( pce_cd.command_buffer[2] ) - 1 ].logframeofs; |
| 684 | 685 | break; |
| 685 | 686 | default: |
| 686 | 687 | popmessage("CD-DA set end mode 0xc0, contact MESSdev"); |
| r20080 | r20081 | |
| 822 | 823 | pce_cd.data_buffer_size = 2; |
| 823 | 824 | break; |
| 824 | 825 | case 0x01: /* Get total disk size in MSF format */ |
| 825 | | frame = toc->tracks[toc->numtrks-1].physframeofs; |
| 826 | frame = toc->tracks[toc->numtrks-1].logframeofs; |
| 826 | 827 | frame += toc->tracks[toc->numtrks-1].frames; |
| 827 | 828 | msf = lba_to_msf( frame + 150 ); |
| 828 | 829 | |
| r20080 | r20081 | |
| 834 | 835 | case 0x02: /* Get track information */ |
| 835 | 836 | if ( pce_cd.command_buffer[2] == 0xAA ) |
| 836 | 837 | { |
| 837 | | frame = toc->tracks[toc->numtrks-1].physframeofs; |
| 838 | frame = toc->tracks[toc->numtrks-1].logframeofs; |
| 838 | 839 | frame += toc->tracks[toc->numtrks-1].frames; |
| 839 | 840 | pce_cd.data_buffer[3] = 0x04; /* correct? */ |
| 840 | 841 | } else |
| 841 | 842 | { |
| 842 | 843 | track = MAX( bcd_2_dec( pce_cd.command_buffer[2] ), 1 ); |
| 843 | | frame = toc->tracks[track-1].physframeofs; |
| 844 | frame = toc->tracks[track-1].logframeofs; |
| 844 | 845 | pce_cd.data_buffer[3] = ( toc->tracks[track-1].trktype == CD_TRACK_AUDIO ) ? 0x00 : 0x04; |
| 845 | 846 | } |
| 846 | 847 | logerror("track = %d, frame = %d\n", track, frame ); |