📄 ata_cd_rom.lst
字号:
C51 COMPILER V8.02 ATA_CD_ROM 05/17/2007 20:56:02 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE ATA_CD_ROM
OBJECT MODULE PLACED IN .\Output\ATA_CD_ROM.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ATA_CD_ROM.c BROWSE DEBUG OBJECTEXTEND OBJECT(.\Output\ATA_CD_ROM.obj)
line level source
1 #include <regx51.h>
2 #include "ATA_CD_ROM.h"
3
4 unsigned char ATA_DATA_BUS,ATA_General_Status,ATA_Device_Head_Status,ATA_Error_Status;
5 unsigned char ATA_DATA_BUS_LS,ATA_DATA_BUS_MS;
6
7 unsigned char start_track,temp0,temp1,temp2,temp3;
8 unsigned char Start_M,Start_S,Start_F,End_M,End_S,End_F;
9 unsigned char Packet_Table[32];
10
11 void Initial_CD_ROM(void)
12 {
13 1 ATA_nRESET = 0; //Reset CD ROM
14 1 DelayXms(100);
15 1 ATA_nRESET = 1;
16 1 DelayXms(2000); //Delay 2 sec
17 1 do
18 1 {
19 2 Get_Status_Register();
20 2 }while((ATA_General_Status&0x80)==0x80);
21 1 //}while(P1_7);
22 1 //LED_Glisten();
23 1
24 1 Get_Device_Head_Register();
25 1 Device = 0; //Set Master,then CD ROM
26 1 Set_Device_Head_Register();
27 1
28 1 do
29 1 {
30 2 Get_Status_Register();
31 2 }while((ATA_General_Status&0x80)==0x80);
32 1
33 1 ATA_DATA_BUS = 0x90; //Device Diagnostic
34 1 Set_CMD_Register();
35 1
36 1 do
37 1 {
38 2 Get_Status_Register();
39 2 }while((ATA_General_Status&0x80)==0x80);
40 1
41 1 Get_Error_Register();
42 1 while((ATA_Error_Status!=0x01) && (ATA_Error_Status!=0x81)); //it isn't find,then Device
43 1 }
44
45 void test_unit_ready_cmd(void)
46 {
47 1 unsigned int i;
48 1 test_unit_loop:
49 1
50 1 DelayXms(1000);
51 1 for(i=0;i<32;i++)
52 1 {
53 2 Packet_Table[i]=0x00; //clear packet table
54 2 }
55 1
C51 COMPILER V8.02 ATA_CD_ROM 05/17/2007 20:56:02 PAGE 2
56 1 do
57 1 {
58 2 Get_Status_Register();
59 2 }while((ATA_General_Status&0x88)!=0x00);
60 1
61 1 ATA_DATA_BUS = 0xA0; //Send Packet Command
62 1 Set_CMD_Register();
63 1 Send_Packet_Command();
64 1
65 1 while((ATA_General_Status&0x01)==0x01)
66 1 {
67 2 goto test_unit_loop;
68 2 }
69 1 }
70
71 void Read_TOC_CMD(void)
72 {
73 1 unsigned int i;
74 1
75 1 for(i=0;i<32;i++)
76 1 {
77 2 Packet_Table[i]=0x00; //clear packet table
78 2 }
79 1
80 1 do
81 1 {
82 2 Get_Status_Register();
83 2 }while((ATA_General_Status&0x88)!=0x00);
84 1
85 1 ATA_DATA_BUS = 0xA0; //Send Packet Command
86 1 Set_CMD_Register();
87 1
88 1 Packet_Table[0]=0x43;
89 1 Packet_Table[1]=0x02;
90 1 Packet_Table[7]=0xFF;
91 1 Packet_Table[8]=0xFF;
92 1
93 1 Send_Packet_Command();
94 1
95 1 while((ATA_General_Status&0x08)!=0x08);
96 1 Get_Data(); //Read DATA length
97 1 Get_Data(); //Read DATA length
98 1 start_track = ATA_DATA_BUS_LS;
99 1
100 1 Read_TOC_Loop:
101 1
102 1 Get_Data(); //Address and Control field
103 1 Get_Data(); //Get track number
104 1 temp0 = ATA_DATA_BUS_LS;
105 1 Get_Data();
106 1 temp1 = ATA_DATA_BUS_MS;
107 1 Get_Data();
108 1 temp2 = ATA_DATA_BUS_LS;
109 1 temp3 = ATA_DATA_BUS_MS;
110 1 if(temp0==start_track)
111 1 {
112 2 Start_M = temp1;
113 2 Start_S = temp2;
114 2 Start_F = temp3;
115 2 }
116 1 if(temp0==0xAA)
117 1 {
C51 COMPILER V8.02 ATA_CD_ROM 05/17/2007 20:56:02 PAGE 3
118 2 End_M = temp1;
119 2 End_S = temp2;
120 2 End_F = temp3;
121 2 }
122 1 do
123 1 {
124 2 //DelayXms(100);
125 2 Get_Status_Register();
126 2 }while((ATA_General_Status&0x80)==0x80);
127 1
128 1 Get_Status_Register();
129 1
130 1 if((ATA_General_Status&0x08)==0x08)
131 1 {
132 2 goto Read_TOC_Loop;
133 2 }
134 1 }
135
136 void Play_CD_CMD(void)
137 {
138 1 unsigned int i;
139 1
140 1 for(i=0;i<32;i++)
141 1 {
142 2 Packet_Table[i]=0x00; //clear packet table
143 2 }
144 1
145 1 do
146 1 {
147 2 Get_Status_Register();
148 2 }while((ATA_General_Status&0x88)!=0x00);
149 1
150 1 ATA_DATA_BUS = 0xA0; //Send Packet Command
151 1 Set_CMD_Register();
152 1
153 1 Packet_Table[0] = 0x47;
154 1 Packet_Table[3] = Start_M;
155 1 Packet_Table[4] = Start_S;
156 1 Packet_Table[5] = Start_F;
157 1 Packet_Table[6] = End_M;
158 1 Packet_Table[7] = End_S;
159 1 Packet_Table[8] = End_F;
160 1
161 1 Send_Packet_Command();
162 1 while((ATA_General_Status&0x01)==0x01);
163 1 }
164
165 void Get_Status_Register(void)
166 {
167 1 ATA_Address = 0xF0; //Set Read Status Address
168 1 ATA_DATA_LS = 0xFF; //Default LSB of DATA Bus
169 1 //ATA_DATA_MS = 0xFF; //Default MSB of DATA Bus
170 1 ATA_nDIOR = 0; //Start Read Data of Register
171 1 ATA_General_Status = ATA_DATA_LS;
172 1 ATA_nDIOR = 1; //Read Data done
173 1 }
174
175 void Get_Device_Head_Register(void)
176 {
177 1 ATA_Address = 0xD0;
178 1 ATA_DATA_LS = 0xFF;
179 1 ATA_DATA_MS = 0xFF;
C51 COMPILER V8.02 ATA_CD_ROM 05/17/2007 20:56:02 PAGE 4
180 1 ATA_nDIOR = 0;
181 1 ATA_Device_Head_Status = ATA_DATA_LS;
182 1 ATA_nDIOR = 1;
183 1 }
184
185 void Set_Device_Head_Register(void)
186 {
187 1 ATA_Address = 0xD0;
188 1 ATA_DATA_LS = ATA_Device_Head_Status;
189 1 ATA_nDIOW = 0;
190 1 DelayXms(100);
191 1 ATA_nDIOW = 1;
192 1 }
193
194 void Set_CMD_Register(void)
195 {
196 1 ATA_Address = 0xF0;
197 1 ATA_DATA_LS = ATA_DATA_BUS;
198 1 ATA_nDIOW = 0;
199 1 DelayXms(100);
200 1 ATA_nDIOW = 1;
201 1 }
202
203 void Get_Error_Register(void)
204 {
205 1 ATA_Address = 0x30;
206 1 ATA_DATA_LS = 0xFF;
207 1 ATA_DATA_MS = 0xFF;
208 1 ATA_nDIOR = 0;
209 1 ATA_Error_Status = ATA_DATA_LS;
210 1 ATA_nDIOR = 1;
211 1 }
212
213 void Get_Data(void)
214 {
215 1 ATA_Address = 0x10;
216 1 ATA_DATA_LS = 0xFF;
217 1 ATA_DATA_MS = 0xFF;
218 1 ATA_nDIOR = 0;
219 1 ATA_DATA_BUS_LS = ATA_DATA_LS;
220 1 ATA_DATA_BUS_MS = ATA_DATA_MS;
221 1 ATA_nDIOR = 1;
222 1 }
223
224 void Send_Packet_Command(void)
225 {
226 1 unsigned int i;
227 1 do
228 1 {
229 2 Get_Status_Register();
230 2 }while((ATA_General_Status&0x89)!=0x08);
231 1
232 1
233 1 for(i=0;i<6;i++)
234 1 {
235 2 ATA_DATA_BUS_LS = Packet_Table[i*2];
236 2 ATA_DATA_BUS_MS = Packet_Table[i*2+1];
237 2 Set_ATA_DATA_ALL();
238 2 }
239 1
240 1 do
241 1 {
C51 COMPILER V8.02 ATA_CD_ROM 05/17/2007 20:56:02 PAGE 5
242 2 ATA_INTRQ = 1;
243 2 }while(ATA_INTRQ==0);
244 1
245 1 Get_Status_Register();
246 1 }
247
248 void Set_ATA_DATA_ALL(void)
249 {
250 1 ATA_Address = 0x10;
251 1 ATA_DATA_LS = ATA_DATA_BUS_LS;
252 1 ATA_DATA_MS = ATA_DATA_BUS_MS;
253 1 ATA_nDIOW = 0;
254 1 DelayXms(100);
255 1 ATA_nDIOW = 1;
256 1 }
257
258 void DelayXms(unsigned int counter)
259 {
260 1 unsigned int i,j;
261 1 for(i=0;i<counter;i++)
262 1 for(j=0;j<120;j++);
263 1 }
264
265 void LED_Glisten(void)
266 {
267 1 while(1)
268 1 {
269 2 P3_7 = 0;
270 2 DelayXms(500);
271 2 P3_7 = 1;
272 2 DelayXms(500);
273 2 }
274 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 523 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 49 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -