📄 sbpcd.c
字号:
drvcmd[3]=(pos>>16)&0x00FF;
drvcmd[4]=(pos>>8)&0x00FF;
drvcmd[5]=pos&0x00FF;
flags_cmd_out=f_putcmd|f_ResponseStatus;
}
else if (famT_drive)
{
drvcmd[0]=CMDT_SEEK;
if (f_blk_msf==1) pos=msf2blk(pos);
drvcmd[2]=(pos>>24)&0x00FF;
drvcmd[3]=(pos>>16)&0x00FF;
drvcmd[4]=(pos>>8)&0x00FF;
drvcmd[5]=pos&0x00FF;
D_S[d].n_bytes=1;
}
response_count=0;
i=cmd_out();
return (i);
}
/*==========================================================================*/
static int cc_SpinUp(void)
{
int i;
msg(DBG_SPI,"SpinUp.\n");
D_S[d].in_SpinUp = 1;
clr_cmdbuf();
if (fam0LV_drive)
{
drvcmd[0]=CMD0_SPINUP;
if (fam0L_drive)
flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|
f_ResponseStatus|f_obey_p_check|f_bit1;
else
flags_cmd_out=f_putcmd;
}
else if (fam1_drive)
{
drvcmd[0]=CMD1_SPINUP;
flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
}
else if (fam2_drive)
{
drvcmd[0]=CMD2_TRAY_CTL;
drvcmd[4]=0x01; /* "spinup" */
flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
}
else if (famT_drive)
{
drvcmd[0]=CMDT_TRAY_CTL;
drvcmd[4]=0x03; /* "insert", it hopefully spins the drive up */
}
response_count=0;
i=cmd_out();
D_S[d].in_SpinUp = 0;
return (i);
}
/*==========================================================================*/
static int cc_SpinDown(void)
{
int i;
if (fam0_drive) return (0);
clr_cmdbuf();
response_count=0;
if (fam1_drive)
{
drvcmd[0]=CMD1_SPINDOWN;
flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
}
else if (fam2_drive)
{
drvcmd[0]=CMD2_TRAY_CTL;
drvcmd[4]=0x02; /* "eject" */
flags_cmd_out=f_putcmd|f_ResponseStatus;
}
else if (famL_drive)
{
drvcmd[0]=CMDL_SPINDOWN;
drvcmd[1]=1;
flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
}
else if (famV_drive)
{
drvcmd[0]=CMDV_SPINDOWN;
flags_cmd_out=f_putcmd;
}
else if (famT_drive)
{
drvcmd[0]=CMDT_TRAY_CTL;
drvcmd[4]=0x02; /* "eject" */
}
i=cmd_out();
return (i);
}
/*==========================================================================*/
static int cc_get_mode_T(void)
{
int i;
clr_cmdbuf();
response_count=10;
drvcmd[0]=CMDT_GETMODE;
drvcmd[4]=response_count;
i=cmd_out_T();
return (i);
}
/*==========================================================================*/
static int cc_set_mode_T(void)
{
int i;
clr_cmdbuf();
response_count=1;
drvcmd[0]=CMDT_SETMODE;
drvcmd[1]=D_S[d].speed_byte;
drvcmd[2]=D_S[d].frmsiz>>8;
drvcmd[3]=D_S[d].frmsiz&0x0FF;
drvcmd[4]=D_S[d].f_XA; /* 1: XA */
drvcmd[5]=D_S[d].type_byte; /* 0, 1, 3 */
drvcmd[6]=D_S[d].mode_xb_6;
drvcmd[7]=D_S[d].mode_yb_7|D_S[d].volume_control;
drvcmd[8]=D_S[d].mode_xb_8;
drvcmd[9]=D_S[d].delay;
i=cmd_out_T();
return (i);
}
/*==========================================================================*/
static int cc_prep_mode_T(void)
{
int i, j;
i=cc_get_mode_T();
if (i<0) return (i);
for (i=0;i<10;i++)
sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
msgbuf[i*3]=0;
msg(DBG_TEA,"CMDT_GETMODE:%s\n", msgbuf);
D_S[d].speed_byte=0x02; /* 0x02: auto quad, 0x82: quad, 0x81: double, 0x80: single */
D_S[d].frmsiz=make16(infobuf[2],infobuf[3]);
D_S[d].f_XA=infobuf[4];
if (D_S[d].f_XA==0) D_S[d].type_byte=0;
else D_S[d].type_byte=1;
D_S[d].mode_xb_6=infobuf[6];
D_S[d].mode_yb_7=1;
D_S[d].mode_xb_8=infobuf[8];
D_S[d].delay=0; /* 0, 1, 2, 3 */
j=cc_set_mode_T();
i=cc_get_mode_T();
for (i=0;i<10;i++)
sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
msgbuf[i*3]=0;
msg(DBG_TEA,"CMDT_GETMODE:%s\n", msgbuf);
return (j);
}
/*==========================================================================*/
static int cc_SetSpeed(u_char speed, u_char x1, u_char x2)
{
int i;
if (fam0LV_drive) return (0);
clr_cmdbuf();
response_count=0;
if (fam1_drive)
{
drvcmd[0]=CMD1_SETMODE;
drvcmd[1]=0x03;
drvcmd[2]=speed;
drvcmd[3]=x1;
drvcmd[4]=x2;
flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
}
else if (fam2_drive)
{
drvcmd[0]=CMD2_SETSPEED;
if (speed&speed_auto)
{
drvcmd[2]=0xFF;
drvcmd[3]=0xFF;
}
else
{
drvcmd[2]=0;
drvcmd[3]=150;
}
flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
}
else if (famT_drive)
{
return (0);
}
i=cmd_out();
return (i);
}
/*==========================================================================*/
static int cc_SetVolume(void)
{
int i;
u_char channel0,channel1,volume0,volume1;
u_char control0,value0,control1,value1;
D_S[d].diskstate_flags &= ~volume_bit;
clr_cmdbuf();
channel0=D_S[d].vol_chan0;
volume0=D_S[d].vol_ctrl0;
channel1=control1=D_S[d].vol_chan1;
volume1=value1=D_S[d].vol_ctrl1;
control0=value0=0;
if (famV_drive) return (0);
if (((D_S[d].drv_options&audio_mono)!=0)&&(D_S[d].drv_type>=drv_211))
{
if ((volume0!=0)&&(volume1==0))
{
volume1=volume0;
channel1=channel0;
}
else if ((volume0==0)&&(volume1!=0))
{
volume0=volume1;
channel0=channel1;
}
}
if (channel0>1)
{
channel0=0;
volume0=0;
}
if (channel1>1)
{
channel1=1;
volume1=0;
}
if (fam1_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]=CMD1_SETMODE;
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 (fam2_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]=CMD2_SETMODE;
drvcmd[1]=0x0E;
drvcmd[3]=control0;
drvcmd[4]=value0;
drvcmd[5]=control1;
drvcmd[6]=value1;
flags_cmd_out=f_putcmd|f_ResponseStatus;
}
else if (famL_drive)
{
if ((volume0==0)||(channel0!=0)) control0 |= 0x80;
if ((volume1==0)||(channel1!=1)) control0 |= 0x40;
if (volume0|volume1) value0=0x80;
drvcmd[0]=CMDL_SETMODE;
drvcmd[1]=0x03;
drvcmd[4]=control0;
drvcmd[5]=value0;
flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
}
else if (fam0_drive) /* different firmware levels */
{
if (D_S[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 (D_S[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 (D_S[d].drv_type<drv_201) volume0=volume1=value0;
if (D_S[d].drv_type>=drv_201)
{
if (volume0==0) control0 |= 0x80;
if (volume1==0) control0 |= 0x40;
}
if (D_S[d].drv_type>=drv_211)
{
if (channel0!=0) control0 |= 0x20;
if (channel1!=1) control0 |= 0x10;
}
}
drvcmd[0]=CMD0_SETMODE;
drvcmd[1]=0x83;
drvcmd[4]=control0;
drvcmd[5]=value0;
flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
}
else if (famT_drive)
{
D_S[d].volume_control=0;
if (!volume0) D_S[d].volume_control|=0x10;
if (!volume1) D_S[d].volume_control|=0x20;
i=cc_prep_mode_T();
if (i<0) return (i);
}
if (!famT_drive)
{
response_count=0;
i=cmd_out();
if (i<0) return (i);
}
D_S[d].diskstate_flags |= volume_bit;
return (0);
}
/*==========================================================================*/
static int GetStatus(void)
{
int i;
if (famT_drive) return (0);
flags_cmd_out=f_getsta|f_ResponseStatus|f_obey_p_check;
response_count=0;
cmd_type=0;
i=cmd_out();
return (i);
}
/*==========================================================================*/
static int cc_DriveReset(void)
{
int i;
msg(DBG_RES,"cc_DriveReset called.\n");
clr_cmdbuf();
response_count=0;
if (fam0LV_drive) OUT(CDo_reset,0x00);
else if (fam1_drive)
{
drvcmd[0]=CMD1_RESET;
flags_cmd_out=f_putcmd;
i=cmd_out();
}
else if (fam2_drive)
{
drvcmd[0]=CMD2_RESET;
flags_cmd_out=f_putcmd;
i=cmd_out();
OUT(CDo_reset,0x00);
}
else if (famT_drive)
{
OUT(CDo_sel_i_d,0);
OUT(CDo_enable,D_S[d].drv_sel);
OUT(CDo_command,CMDT_RESET);
for (i=1;i<10;i++) OUT(CDo_command,0);
}
if (fam0LV_drive) sbp_sleep(5*HZ); /* wait 5 seco
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -