staticvoidlba_to_msf(uint8_t*buf,intlba){lba+=150;buf[0]=(lba/75)/60;buf[1]=(lba/75)%60;buf[2]=lba%75;}/* same toc as bochs. Return -1 if error or the toc length *//* XXX: check this */intcdrom_read_toc(intnb_sectors,uint8_t*buf,intmsf,intstart_track){uint8_t*q;intlen;
if(start_track>1&&start_track!=0xaa)return-1;q=buf+2;*q++=1;/* first session */*q++=1;/* last session */if(start_track<=1){*q++=0;/* reserved */*q++=0x14;/* ADR, control */*q++=1;/* track number */*q++=0;/* reserved */if(msf){*q++=0;/* reserved */lba_to_msf(q,0);q+=3;}else{/* sector 0 */cpu_to_be32wu((uint32_t*)q,0);q+=4;}}/* lead out track */*q++=0;/* reserved */*q++=0x16;/* ADR, control */*q++=0xaa;/* track number */*q++=0;/* reserved */if(msf){*q++=0;/* reserved */lba_to_msf(q,nb_sectors);q+=3;}else{cpu_to_be32wu((uint32_t*)q,nb_sectors);q+=4;}len=q-buf;cpu_to_be16wu((uint16_t*)buf,len-2);returnlen;}/* mostly same info as PearPc */intcdrom_read_toc_raw(intnb_sectors,uint8_t*buf,intmsf,intsession_num){uint8_t*q;intlen;
q=buf+2;*q++=1;/* first session */*q++=1;/* last session */*q++=1;/* session number */*q++=0x14;/* data track */*q++=0;/* track number */*q++=0xa0;/* lead-in */*q++=0;/* min */*q++=0;/* sec */*q++=0;/* frame */*q++=0;*q++=1;/* first track */*q++=0x00;/* disk type */*q++=0x00;
*q++=1;/* session number */*q++=0x14;/* data track */*q++=0;/* track number */*q++=0xa1;*q++=0;/* min */*q++=0;/* sec */*q++=0;/* frame */*q++=0;*q++=1;/* last track */*q++=0x00;*q++=0x00;
*q++=1;/* session number */*q++=0x14;/* data track */*q++=0;/* track number */*q++=0xa2;/* lead-out */*q++=0;/* min */*q++=0;/* sec */*q++=0;/* frame */if(msf){*q++=0;/* reserved */lba_to_msf(q,nb_sectors);q+=3;}else{cpu_to_be32wu((uint32_t*)q,nb_sectors);q+=4;}*q++=1;/* session number */*q++=0x14;/* ADR, control */*q++=0;/* track number */*q++=1;/* point */*q++=0;/* min */*q++=0;/* sec */*q++=0;/* frame */if(msf){