?? sbpcd.c
字號(hào):
channel0=i; i=volume1; volume1=volume0; volume0=i; } if (channel0==channel1) { if (channel0==0) { channel1=1; volume1=0; volume0=value0; } else { channel0=0; volume0=0; volume1=value0; } } } if ((volume0!=0)&&(volume1!=0)) { if (volume0==0xFF) volume1=0xFF; else if (volume1==0xFF) volume0=0xFF; } else if (DS[d].drv_type<drv_201) volume0=volume1=value0; if (DS[d].drv_type>=drv_201) { if (volume0==0) control0 |= 0x80; if (volume1==0) control0 |= 0x40; } if (DS[d].drv_type>=drv_211) { if (channel0!=0) control0 |= 0x20; if (channel1!=1) control0 |= 0x10; } } drvcmd[0]=0x84; drvcmd[1]=0x83; drvcmd[4]=control0; drvcmd[5]=value0; flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check; } response_count=0; i=cmd_out(); if (i>0) return (i); DS[d].diskstate_flags |= volume_bit; return (0);}/*==========================================================================*/static int GetStatus(void){ int i; flags_cmd_out=f_getsta|f_ResponseStatus|f_obey_p_check; response_count=0; cmd_type=0; i=cmd_out(); return (i);}/*==========================================================================*/static int xy_DriveReset(void){ int i; DPRINTF((DBG_RES,"SBPCD: xy_DriveReset called.\n")); if (!new_drive) OUT(CDo_reset,0x00); else { clr_cmdbuf(); drvcmd[0]=0x0A; flags_cmd_out=f_putcmd; response_count=0; i=cmd_out(); } flush_status(); i=GetStatus(); if (i>=0) return -1; if (DS[d].error_byte!=aud_12) return -1; return (0);}/*==========================================================================*/static int SetSpeed(void){ int i, speed; if (!(DS[d].drv_options&(speed_auto|speed_300|speed_150))) return (0); speed=0x80; if (!(DS[d].drv_options&speed_auto)) { speed |= 0x40; if (!(DS[d].drv_options&speed_300)) speed=0; } i=yy_SetSpeed(speed,0,0); return (i);}/*==========================================================================*/static int DriveReset(void){ int i; i=xy_DriveReset(); if (i<0) return (-2); do { i=GetStatus(); if ((i<0)&&(i!=-15)) return (-2); /* i!=-15 is from sta2err */ if (!st_caddy_in) break; } while (!st_diskok); DS[d].CD_changed=1; i=SetSpeed(); if (i<0) return (-2); return (0);}/*==========================================================================*/static int xx_Pause_Resume(int pau_res){ int i; clr_cmdbuf(); if (new_drive) { drvcmd[0]=0x0D; flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check; } else { drvcmd[0]=0x8D; flags_cmd_out=f_putcmd|f_respo2|f_getsta|f_ResponseStatus|f_obey_p_check; } if (pau_res!=1) drvcmd[1]=0x80; response_count=0; i=cmd_out(); return (i);}/*==========================================================================*/#if 000static int yy_LockDoor(char lock){ int i; if (!new_drive) return (-3); clr_cmdbuf(); drvcmd[0]=0x0C; if (lock==1) drvcmd[1]=0x01; flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check; response_count=0; i=cmd_out(); return (i);}#endif 000/*==========================================================================*/static int xx_ReadSubQ(void){ int i,j; DS[d].diskstate_flags &= ~subq_bit; clr_cmdbuf(); if (new_drive) { drvcmd[0]=0x87; flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check; response_count=11; } else { drvcmd[0]=0x89; drvcmd[1]=0x02; flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check; response_count=13; } for (j=0;j<255;j++) { i=cmd_out(); if (i<0) return (i); if (infobuf[0]!=0) break; if (!st_spinning) { DS[d].SubQ_ctl_adr=DS[d].SubQ_trk=DS[d].SubQ_pnt_idx=DS[d].SubQ_whatisthis=0; DS[d].SubQ_run_tot=DS[d].SubQ_run_trk=0; return (0); } } DS[d].SubQ_audio=infobuf[0]; DS[d].SubQ_ctl_adr=swap_nibbles(infobuf[1]); DS[d].SubQ_trk=byt2bcd(infobuf[2]); DS[d].SubQ_pnt_idx=byt2bcd(infobuf[3]); i=4; if (!new_drive) i=5; DS[d].SubQ_run_tot=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); /* msf-bin */ i=7; if (!new_drive) i=9; DS[d].SubQ_run_trk=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); /* msf-bin */ DS[d].SubQ_whatisthis=infobuf[i+3]; DS[d].diskstate_flags |= subq_bit; return (0);}/*==========================================================================*/static int xx_ModeSense(void){ int i; DS[d].diskstate_flags &= ~frame_size_bit; clr_cmdbuf(); if (new_drive) { drvcmd[0]=0x84; drvcmd[1]=0x00; flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check; response_count=5; } else { drvcmd[0]=0x85; drvcmd[1]=0x00; flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check; response_count=2; } i=cmd_out(); if (i<0) return (i); i=0; if (new_drive) DS[d].sense_byte=infobuf[i++]; DS[d].frame_size=make16(infobuf[i],infobuf[i+1]); DS[d].diskstate_flags |= frame_size_bit; return (0);}/*==========================================================================*/#if 0000static int xx_TellVolume(void){ int i; u_char switches; u_char chan0,vol0,chan1,vol1; DS[d].diskstate_flags &= ~volume_bit; clr_cmdbuf(); if (new_drive) { drvcmd[0]=0x84; drvcmd[1]=0x05; response_count=5; flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check; } else { drvcmd[0]=0x85; drvcmd[1]=0x03; response_count=2; flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check; } i=cmd_out(); if (i<0) return (i); if (new_drive) { chan0=infobuf[1]&0x0F; vol0=infobuf[2]; chan1=infobuf[3]&0x0F; vol1=infobuf[4]; if (chan0==0) { chan0=1; vol0=0; } if (chan1==0) { chan1=2; vol1=0; } chan0 >>= 1; chan1 >>= 1; } else { chan0=0; chan1=1; vol0=vol1=infobuf[1]; if (DS[d].drv_type>=drv_201) { if (DS[d].drv_type<drv_300) { switches=infobuf[0]; if ((switches&0x80)!=0) vol0=0; if ((switches&0x40)!=0) vol1=0; if (DS[d].drv_type>=drv_211) { if ((switches&0x20)!=0) chan0=1; if ((switches&0x10)!=0) chan1=0; } } else { vol0=infobuf[0]; if ((vol0&0x01)!=0) chan0=1; if ((vol1&0x01)==0) chan1=0; vol0 &= 0xFC; vol1 &= 0xFC; if (vol0!=0) vol0 += 3; if (vol1!=0) vol1 += 3; } } } DS[d].vol_chan0=chan0; DS[d].vol_ctrl0=vol0; DS[d].vol_chan1=chan1; DS[d].vol_ctrl1=vol1; DS[d].vol_chan2=2; DS[d].vol_ctrl2=0xFF; DS[d].vol_chan3=3; DS[d].vol_ctrl3=0xFF; DS[d].diskstate_flags |= volume_bit; return (0);}#endif/*==========================================================================*/static int xx_ReadCapacity(void){ int i; DS[d].diskstate_flags &= ~cd_size_bit; clr_cmdbuf(); if (new_drive) { drvcmd[0]=0x85; flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check; } else { drvcmd[0]=0x88; flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check; } response_count=5; i=cmd_out(); if (i<0) return (i); DS[d].CDsize_blk=make32(make16(0,infobuf[0]),make16(infobuf[1],infobuf[2])); if (new_drive) DS[d].CDsize_blk=msf2blk(DS[d].CDsize_blk); DS[d].CDsize_frm = (DS[d].CDsize_blk * make16(infobuf[3],infobuf[4])) / CD_FRAMESIZE; DS[d].CDsize_blk += 151; DS[d].diskstate_flags |= cd_size_bit; return (0);}/*==========================================================================*/static int xx_ReadTocDescr(void){ int i; DS[d].diskstate_flags &= ~toc_bit; clr_cmdbuf(); if (new_drive) { drvcmd[0]=0x8B; flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check; } else { drvcmd[0]=0x8B; flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check; } response_count=6; i=cmd_out(); if (i<0) return (i); DS[d].xa_byte=infobuf[0]; DS[d].n_first_track=infobuf[1]; DS[d].n_last_track=infobuf[2]; DS[d].size_msf=make32(make16(0,infobuf[3]),make16(infobuf[4],infobuf[5])); DS[d].size_blk=msf2blk(DS[d].size_msf); DS[d].diskstate_flags |= toc_bit; DPRINTF((DBG_TOC,"SBPCD: TocDesc: %02X %02X %02X %08X\n", DS[d].xa_byte,DS[d].n_first_track,DS[d].n_last_track,DS[d].size_msf)); return (0);}/*==========================================================================*/static int xx_ReadTocEntry(int num){ int i; clr_cmdbuf(); if (new_drive) { drvcmd[0]=0x8C; flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check; } else { drvcmd[0]=0x8C; drvcmd[1]=0x02; flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check; } drvcmd[2]=num; response_count=8; i=cmd_out(); if (i<0) return (i); DS[d].TocEnt_nixbyte=infobuf[0]; DS[d].TocEnt_ctl_adr=swap_nibbles(infobuf[1]); DS[d].TocEnt_number=infobuf[2]; DS[d].TocEnt_format=infobuf[3]; if (new_drive) i=4; else i=5; DS[d].TocEnt_address=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); DPRINTF((DBG_TOC,"SBPCD: TocEntry: %02X %02X %02X %02X %08X\n", DS[d].TocEnt_nixbyte,DS[d].TocEnt_ctl_adr,DS[d].TocEnt_number, DS[d].TocEnt_format,DS[d].TocEnt_address)); return (0);}/*==========================================================================*/static int xx_ReadPacket(void){ int i; clr_cmdbuf(); drvcmd[0]=0x8E; drvcmd[1]=response_count; flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check; i=cmd_out(); return (i);}/*==========================================================================*/static int convert_UPC(u_char *p){ int i; p++; if (!new_drive) p[13]=0; for (i=0;i<7;i++) { if (new_drive) DS[d].UPC_buf[i]=swap_nibbles(*p++); else { DS[d].UPC_buf[i]=((*p++)<<4)&0xFF; DS[d].UPC_buf[i] |= *p++; } } DS[d].UPC_buf[6] &= 0xF0; return (0);}/*==========================================================================*/static int xx_ReadUPC(void){ int i; DS[d].diskstate_flags &= ~upc_bit; clr_cmdbuf(); if (new_drive) { drvcmd[0]=0x88; response_count=8; flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check; } else { drvcmd[0]=0x08; response_count=0; flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1; } i=cmd_out(); if (i<0) return (i); if (!new_drive) { response_count=16; i=xx_ReadPacket(); if (i<0) return (i); } DS[d].UPC_ctl_adr=0; if (new_drive) i=0; else i=2; if ((infobuf[i]&0x80)!=0) { convert_UPC(&infobuf[i]); DS[d].UPC_ctl_adr &= 0xF0; DS[d].UPC_ctl_adr |= 0x02; } DS[d].diskstate_flags |= upc_bit; return (0);}/*==========================================================================*/static int yy_CheckMultiSession(void){ int i;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -