📄 sbpcd.c
字号:
if (channel1>1)
{
channel1=1;
volume1=0;
}
if (new_drive)
{
control0=channel0+1;
control1=channel1+1;
value0=(volume0>volume1)?volume0:volume1;
value1=value0;
if (volume0==0) control0=0;
if (volume1==0) control1=0;
drvcmd[0]=0x09;
drvcmd[1]=0x05;
drvcmd[3]=control0;
drvcmd[4]=value0;
drvcmd[5]=control1;
drvcmd[6]=value1;
flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
}
else
{
if (DS[d].drv_type>=drv_300)
{
control0=volume0&0xFC;
value0=volume1&0xFC;
if ((volume0!=0)&&(volume0<4)) control0 |= 0x04;
if ((volume1!=0)&&(volume1<4)) value0 |= 0x04;
if (channel0!=0) control0 |= 0x01;
if (channel1==1) value0 |= 0x01;
}
else
{
value0=(volume0>volume1)?volume0:volume1;
if (DS[d].drv_type<drv_211)
{
if (channel0!=0)
{
i=channel1;
channel1=channel0;
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 000
static 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 0000
static 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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -