📄 sbpcd.c.txt
字号:
803 if (!(flags_cmd_out&f_obey_p_check)) return (0);
804 if (!st_check) return (0);
805 if (DS[d].in_SpinUp != 0) DPRINTF((DBG_SPI,"SBPCD: to xx_ReadError.\n"));
806 i=xx_ReadError();
807 if (DS[d].in_SpinUp != 0) DPRINTF((DBG_SPI,"SBPCD: to cmd_out OK.\n"));
808 return (i);
809 }
810 /*==========================================================================*/
811 static int xx_Seek(u_int pos, char f_blk_msf)
812 {
813 int i;
814
815 clr_cmdbuf();
816 if (f_blk_msf>1) return (-3);
817 if (!new_drive)
818 {
819 if (f_blk_msf==1) pos=msf2blk(pos);
820 drvcmd[2]=(pos>>16)&0x00FF;
821 drvcmd[3]=(pos>>8)&0x00FF;
822 drvcmd[4]=pos&0x00FF;
823 flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |
824 f_ResponseStatus | f_obey_p_check | f_bit1;
825 }
826 else
827 {
828 if (f_blk_msf==0) pos=blk2msf(pos);
829 drvcmd[1]=(pos>>16)&0x00FF;
830 drvcmd[2]=(pos>>8)&0x00FF;
831 drvcmd[3]=pos&0x00FF;
832 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
833 }
834 drvcmd[0]=0x01;
835 response_count=0;
836 i=cmd_out();
837 return (i);
838 }
839 /*==========================================================================*/
840 static int xx_SpinUp(void)
841 {
842 int i;
843
844 DPRINTF((DBG_SPI,"SBPCD: SpinUp.\n"));
845 DS[d].in_SpinUp = 1;
846 clr_cmdbuf();
847 if (!new_drive)
848 {
849 drvcmd[0]=0x05;
850 flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
851 }
852 else
853 {
854 drvcmd[0]=0x02;
855 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
856 }
857 response_count=0;
858 i=cmd_out();
859 DS[d].in_SpinUp = 0;
860 return (i);
861 }
862 /*==========================================================================*/
863 static int yy_SpinDown(void)
864 {
865 int i;
866
867 if (!new_drive) return (-3);
868 clr_cmdbuf();
869 drvcmd[0]=0x06;
870 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
871 response_count=0;
872 i=cmd_out();
873 return (i);
874 }
875 /*==========================================================================*/
876 static int yy_SetSpeed(u_char speed, u_char x1, u_char x2)
877 {
878 int i;
879
880 if (!new_drive) return (-3);
881 clr_cmdbuf();
882 drvcmd[0]=0x09;
883 drvcmd[1]=0x03;
884 drvcmd[2]=speed;
885 drvcmd[3]=x1;
886 drvcmd[4]=x2;
887 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
888 response_count=0;
889 i=cmd_out();
890 return (i);
891 }
892 /*==========================================================================*/
893 static int xx_SetVolume(void)
894 {
895 int i;
896 u_char channel0,channel1,volume0,volume1;
897 u_char control0,value0,control1,value1;
898
899 DS[d].diskstate_flags &= ~volume_bit;
900 clr_cmdbuf();
901 channel0=DS[d].vol_chan0;
902 volume0=DS[d].vol_ctrl0;
903 channel1=control1=DS[d].vol_chan1;
904 volume1=value1=DS[d].vol_ctrl1;
905 control0=value0=0;
906
907 if (((DS[d].drv_options&sax_a)!=0)&&(DS[d].drv_type>=drv_211))
908 {
909 if ((volume0!=0)&&(volume1==0))
910 {
911 volume1=volume0;
912 channel1=channel0;
913 }
914 else if ((volume0==0)&&(volume1!=0))
915 {
916 volume0=volume1;
917 channel0=channel1;
918 }
919 }
920 if (channel0>1)
921 {
922 channel0=0;
923 volume0=0;
924 }
925 if (channel1>1)
926 {
927 channel1=1;
928 volume1=0;
929 }
930
931 if (new_drive)
932 {
933 control0=channel0+1;
934 control1=channel1+1;
935 value0=(volume0>volume1)?volume0:volume1;
936 value1=value0;
937 if (volume0==0) control0=0;
938 if (volume1==0) control1=0;
939 drvcmd[0]=0x09;
940 drvcmd[1]=0x05;
941 drvcmd[3]=control0;
942 drvcmd[4]=value0;
943 drvcmd[5]=control1;
944 drvcmd[6]=value1;
945 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
946 }
947 else
948 {
949 if (DS[d].drv_type>=drv_300)
950 {
951 control0=volume0&0xFC;
952 value0=volume1&0xFC;
953 if ((volume0!=0)&&(volume0<4)) control0 |= 0x04;
954 if ((volume1!=0)&&(volume1<4)) value0 |= 0x04;
955 if (channel0!=0) control0 |= 0x01;
956 if (channel1==1) value0 |= 0x01;
957 }
958 else
959 {
960 value0=(volume0>volume1)?volume0:volume1;
961 if (DS[d].drv_type<drv_211)
962 {
963 if (channel0!=0)
964 {
965 i=channel1;
966 channel1=channel0;
967 channel0=i;
968 i=volume1;
969 volume1=volume0;
970 volume0=i;
971 }
972 if (channel0==channel1)
973 {
974 if (channel0==0)
975 {
976 channel1=1;
977 volume1=0;
978 volume0=value0;
979 }
980 else
981 {
982 channel0=0;
983 volume0=0;
984 volume1=value0;
985 }
986 }
987 }
988
989 if ((volume0!=0)&&(volume1!=0))
990 {
991 if (volume0==0xFF) volume1=0xFF;
992 else if (volume1==0xFF) volume0=0xFF;
993 }
994 else if (DS[d].drv_type<drv_201) volume0=volume1=value0;
995
996 if (DS[d].drv_type>=drv_201)
997 {
998 if (volume0==0) control0 |= 0x80;
999 if (volume1==0) control0 |= 0x40;
1000 }
1001 if (DS[d].drv_type>=drv_211)
1002 {
1003 if (channel0!=0) control0 |= 0x20;
1004 if (channel1!=1) control0 |= 0x10;
1005 }
1006 }
1007 drvcmd[0]=0x84;
1008 drvcmd[1]=0x83;
1009 drvcmd[4]=control0;
1010 drvcmd[5]=value0;
1011 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
1012 }
1013
1014 response_count=0;
1015 i=cmd_out();
1016 if (i>0) return (i);
1017 DS[d].diskstate_flags |= volume_bit;
1018 return (0);
1019 }
1020 /*==========================================================================*/
1021 static int GetStatus(void)
1022 {
1023 int i;
1024
1025 flags_cmd_out=f_getsta|f_ResponseStatus|f_obey_p_check;
1026 response_count=0;
1027 cmd_type=0;
1028 i=cmd_out();
1029 return (i);
1030 }
1031 /*==========================================================================*/
1032 static int xy_DriveReset(void)
1033 {
1034 int i;
1035
1036 DPRINTF((DBG_RES,"SBPCD: xy_DriveReset called.\n"));
1037 if (!new_drive) OUT(CDo_reset,0x00);
1038 else
1039 {
1040 clr_cmdbuf();
1041 drvcmd[0]=0x0A;
1042 flags_cmd_out=f_putcmd;
1043 response_count=0;
1044 i=cmd_out();
1045 }
1046 flush_status();
1047 i=GetStatus();
1048 if (i>=0) return -1;
1049 if (DS[d].error_byte!=aud_12) return -1;
1050 return (0);
1051 }
1052 /*==========================================================================*/
1053 static int SetSpeed(void)
1054 {
1055 int i, speed;
1056
1057 if (!(DS[d].drv_options&(speed_auto|speed_300|speed_150))) return (0);
1058 speed=0x80;
1059 if (!(DS[d].drv_options&speed_auto))
1060 {
1061 speed |= 0x40;
1062 if (!(DS[d].drv_options&speed_300)) speed=0;
1063 }
1064 i=yy_SetSpeed(speed,0,0);
1065 return (i);
1066 }
1067 /*==========================================================================*/
1068 static int DriveReset(void)
1069 {
1070 int i;
1071
1072 i=xy_DriveReset();
1073 if (i<0) return (-2);
1074 do
1075 {
1076 i=GetStatus();
1077 if ((i<0)&&(i!=-15)) return (-2); /* i!=-15 is from sta2err */
1078 if (!st_caddy_in) break;
1079 }
1080 while (!st_diskok);
1081 DS[d].CD_changed=1;
1082 i=SetSpeed();
1083 if (i<0) return (-2);
1084 return (0);
1085 }
1086 /*==========================================================================*/
1087 static int xx_Pause_Resume(int pau_res)
1088 {
1089 int i;
1090
1091 clr_cmdbuf();
1092 if (new_drive)
1093 {
1094 drvcmd[0]=0x0D;
1095 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
1096 }
1097 else
1098 {
1099 drvcmd[0]=0x8D;
1100 flags_cmd_out=f_putcmd|f_respo2|f_getsta|f_ResponseStatus|f_obey_p_check;
1101 }
1102 if (pau_res!=1) drvcmd[1]=0x80;
1103 response_count=0;
1104 i=cmd_out();
1105 return (i);
1106 }
1107 /*==========================================================================*/
1108 #if 000
1109 static int yy_LockDoor(char lock)
1110 {
1111 int i;
1112
1113 if (!new_drive) return (-3);
1114 clr_cmdbuf();
1115 drvcmd[0]=0x0C;
1116 if (lock==1) drvcmd[1]=0x01;
1117 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
1118 response_count=0;
1119 i=cmd_out();
1120 return (i);
1121 }
1122 #endif 000
1123 /*==========================================================================*/
1124 static int xx_ReadSubQ(void)
1125 {
1126 int i,j;
1127
1128 DS[d].diskstate_flags &= ~subq_bit;
1129 clr_cmdbuf();
1130 if (new_drive)
1131 {
1132 drvcmd[0]=0x87;
1133 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
1134 response_count=11;
1135 }
1136 else
1137 {
1138 drvcmd[0]=0x89;
1139 drvcmd[1]=0x02;
1140 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
1141 response_count=13;
1142 }
1143 for (j=0;j<255;j++)
1144 {
1145 i=cmd_out();
1146 if (i<0) return (i);
1147 if (infobuf[0]!=0) break;
1148 if (!st_spinning)
1149 {
1150 DS[d].SubQ_ctl_adr=DS[d].SubQ_trk=DS[d].SubQ_pnt_idx=DS[d].SubQ_whatisthis=0;
1151 DS[d].SubQ_run_tot=DS[d].SubQ_run_trk=0;
1152 return (0);
1153 }
1154 }
1155 DS[d].SubQ_audio=infobuf[0];
1156 DS[d].SubQ_ctl_adr=swap_nibbles(infobuf[1]);
1157 DS[d].SubQ_trk=byt2bcd(infobuf[2]);
1158 DS[d].SubQ_pnt_idx=byt2bcd(infobuf[3]);
1159 i=4;
1160 if (!new_drive) i=5;
1161 DS[d].SubQ_run_tot=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); /* msf-bin */
1162 i=7;
1163 if (!new_drive) i=9;
1164 DS[d].SubQ_run_trk=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2])); /* msf-bin */
1165 DS[d].SubQ_whatisthis=infobuf[i+3];
1166 DS[d].diskstate_flags |= subq_bit;
1167 return (0);
1168 }
1169 /*==========================================================================*/
1170 static int xx_ModeSense(void)
1171 {
1172 int i;
1173
1174 DS[d].diskstate_flags &= ~frame_size_bit;
1175 clr_cmdbuf();
1176 if (new_drive)
1177 {
1178 drvcmd[0]=0x84;
1179 drvcmd[1]=0x00;
1180 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
1181 response_count=5;
1182 }
1183 else
1184 {
1185 drvcmd[0]=0x85;
1186 drvcmd[1]=0x00;
1187 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
1188 response_count=2;
1189 }
1190 i=cmd_out();
1191 if (i<0) return (i);
1192 i=0;
1193 if (new_drive) DS[d].sense_byte=infobuf[i++];
1194 DS[d].frame_size=make16(infobuf[i],infobuf[i+1]);
1195 DS[d].diskstate_flags |= frame_size_bit;
1196 return (0);
1197 }
1198 /*==========================================================================*/
1199 #if 0000
1200 static int xx_TellVolume(void)
1201 {
1202 int i;
1203 u_char switches;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -