📄 fx2_ata.cod
字号:
0B1E F168 ACALL IDEPrepareForXfer
168: stuffLBAandSector(1);
0B20 D223 SETB ?stuffLBAandSector?BIT
0B22 316D ACALL stuffLBAandSector
169: writePIO8(ATAPI_COMMAND_REG, ATA_COMMAND_SEEK);
0B24 7D70 MOV R5,#070H
0B26 3149 ACALL ?L?COM000F
170: if(waitForBusyBit() == USBS_FAILED)
0B28 1174 ACALL waitForBusyBit
0B2A 5007 JNC ?C0022?IDE
171: {
172: loadSensePtrFromErrorRegister(1);
0B2C D223 SETB ?loadSensePtrFromErrorRegister?BIT
0B2E 121018 LCALL loadSensePtrFromErrorRegister
173: return(USBS_FAILED);
0B31 D3 SETB C
0B32 22 RET
174: }
0B33 ?C0022?IDE:
175: else
176: return(USBS_PASSED);
0B33 C3 CLR C
0B34 22 RET
177: }
0B35 ?C0021?IDE:
178: else
179: {
180: // relinquish control of the bulk buffer occupied by the CBW
181: EP2BCL = 0x80;
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 11
0B35
0B35 D169 ACALL ?L?COM000B
182:
183: failedIn();
184: return(USBS_FAILED);
0B37 A1AF AJMP ?C0271?IDE
185: }
186: }
187:
188: case READ_FORMAT_CAPACITIES:
189: case READ_CAPACITY:
0B39 ?C0026?IDE:
190: {
191: BYTE num_bytes = 8;
0B39 755E08 MOV num_bytes,#08H
192:
193: // relinquish control of the bulk buffer occupied by the CBW
194: EP2BCL = 0x80;
0B3C D169 ACALL ?L?COM000B
195:
196: sensePtr = senseOk;
0B3E F1AF ACALL ?L?COM0022
197: checkForMedia(1);
0B40 D223 SETB ?checkForMedia?BIT
0B42 12003E LCALL checkForMedia
198:
199: waitForInBuffer();
0B45 F138 ACALL waitForInBuffer
200: if (sensePtr == senseOk)
0B47 7434 MOV A,#LOW senseOk
0B49 6509 XRL A,sensePtr+01H
0B4B 7004 JNZ ?C0242?IDE
0B4D 7407 MOV A,#HIGH senseOk
0B4F 6508 XRL A,sensePtr
0B51 ?C0242?IDE:
0B51 7046 JNZ ?C0027?IDE
201: {
202: AUTOPTRL2 = LSB(EP8FIFOBUF);
0B53 F59E MOV AUTOPTRL2,A
203: if(cmd == READ_FORMAT_CAPACITIES) // add 4 byte capacity list header
0B55 E55D MOV A,cmd
0B57 B4230D CJNE A,#023H,?C0028?IDE
204: {
205: XAUTODAT2 = 0x0;
0B5A 90E67C MOV DPTR,#0E67CH
0B5D E4 CLR A
0B5E F0 MOVX @DPTR,A
206: XAUTODAT2 = 0x0;
0B5F F0 MOVX @DPTR,A
207: XAUTODAT2 = 0x0;
0B60 F0 MOVX @DPTR,A
208: XAUTODAT2 = 0x08;
0B61 7408 MOV A,#08H
0B63 F0 MOVX @DPTR,A
209: num_bytes = 12;
0B64 755E0C MOV num_bytes,#0CH
210: }
0B67 ?C0028?IDE:
211: XAUTODAT2 = ((BYTE *) &ActiveLunConfigData.driveCapacity)[0];
0B67 90E67C MOV DPTR,#0E67CH
0B6A E534 MOV A,ActiveLunConfigData+06H
0B6C F0 MOVX @DPTR,A
212: XAUTODAT2 = ((BYTE *) &ActiveLunConfigData.driveCapacity)[1];
0B6D E535 MOV A,ActiveLunConfigData+07H
0B6F F0 MOVX @DPTR,A
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 12
213: XAUTODAT2 = ((BYTE *) &ActiveLunConfigData.driveCapacity)[2];
0B70 E536 MOV A,ActiveLunConfigData+08H
0B72 F0 MOVX @DPTR,A
214: XAUTODAT2 = ((BYTE *) &ActiveLunConfigData.driveCapacity)[3];
0B73 E537 MOV A,ActiveLunConfigData+09H
0B75 F0 MOVX @DPTR,A
215: if(cmd == READ_FORMAT_CAPACITIES)
0B76 E55D MOV A,cmd
0B78 B42305 CJNE A,#023H,?C0029?IDE
216: XAUTODAT2 = ((ATA_SECTOR_SIZE >> 24) & 0xff) | 2; // Report media type -- Formatted
0B7B 7402 MOV A,#02H
0B7D F0 MOVX @DPTR,A
0B7E 8005 SJMP ?C0030?IDE
0B80 ?C0029?IDE:
217: else
218: XAUTODAT2 = (ATA_SECTOR_SIZE >> 24) & 0xff;
0B80 90E67C MOV DPTR,#0E67CH
0B83 E4 CLR A
0B84 F0 MOVX @DPTR,A
0B85 ?C0030?IDE:
219: XAUTODAT2 = (ATA_SECTOR_SIZE >> 16) & 0xff;
0B85 90E67C MOV DPTR,#0E67CH
0B88 E4 CLR A
0B89 F0 MOVX @DPTR,A
220: XAUTODAT2 = (ATA_SECTOR_SIZE >> 8) & 0xff;
0B8A 7402 MOV A,#02H
0B8C F0 MOVX @DPTR,A
221: XAUTODAT2 = (ATA_SECTOR_SIZE >> 0) & 0xff;
0B8D E4 CLR A
0B8E F0 MOVX @DPTR,A
222:
223: loadEP8BC(num_bytes);
0B8F AF5E MOV R7,num_bytes
0B91 FE MOV R6,A
0B92 121799 LCALL _loadEP8BC
224: status = USBS_PASSED;
0B95 C222 CLR status
225: }
0B97 8005 SJMP ?C0031?IDE
0B99 ?C0027?IDE:
226: else
227: {
228: failedIn();
0B99 1207F7 LCALL failedIn
229: status = USBS_FAILED;
0B9C D222 SETB status
230: }
0B9E ?C0031?IDE:
231:
232: return(status);
0B9E A222 MOV C,status
0BA0 22 RET
233: }
234:
235: ///////////////////////////////////////////////////////////
236: // Spoofed commands
237: case MODE_SELECT_06: // Note that these are in BOTH the read and write areas in case they are sent with
>> no data
238: case MODE_SELECT_10:
0BA1 ?C0033?IDE:
239: {
240: // relinquish control of the bulk buffer occupied by the CBW
241: EP2BCL = 0x80;
0BA1 D114 ACALL ?L?COM0007
0BA3 B50907 CJNE A,sensePtr+01H,?C0034?IDE
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 13
0BA6 7407 MOV A,#HIGH senseOk
0BA8 B50802 CJNE A,sensePtr,?C0034?IDE
242:
243: // This command is allowed to have data.
244: sensePtr = senseOk;
245: checkForMedia(1);
246:
247: if (sensePtr == senseOk)
248: return(USBS_PASSED);
0BAB C3 CLR C
0BAC 22 RET
0BAD ?C0034?IDE:
249: else
250: return(USBS_FAILED);
0BAD D3 SETB C
0BAE 22 RET
251: }
252:
253: case TEST_UNIT_READY:
254: case FORMAT_UNIT:
0BAF ?C0037?IDE:
255: {
256: // relinquish control of the bulk buffer occupied by the CBW
257: EP2BCL = 0x80;
0BAF F19C ACALL ?L?COM0001
0BB1 6003 JZ ?C0038?IDE
258:
259: if (dataTransferLen) // This command shouldn't have any data!
260: failedIn();
0BB3 1207F7 LCALL failedIn
0BB6 ?C0038?IDE:
261:
262: sensePtr = senseOk;
0BB6 D11A ACALL ?L?COM0008
0BB8 B50907 CJNE A,sensePtr+01H,?C0039?IDE
0BBB 7407 MOV A,#HIGH senseOk
0BBD B50802 CJNE A,sensePtr,?C0039?IDE
263: checkForMedia(1);
264:
265: if (sensePtr == senseOk)
266: return(USBS_PASSED);
0BC0 C3 CLR C
0BC1 22 RET
0BC2 ?C0039?IDE:
267: else
268: return(USBS_FAILED);
0BC2 D3 SETB C
0BC3 22 RET
269: }
270: case REQUEST_SENSE:
0BC4 ?C0041?IDE:
271: {
272: // relinquish control of the bulk buffer occupied by the CBW
273: EP2BCL = 0x80;
0BC4 D169 ACALL ?L?COM000B
274:
275: waitForInBuffer();
0BC6 F138 ACALL waitForInBuffer
276:
277: AUTOPTRL2 = LSB(EP8FIFOBUF);
0BC8 E4 CLR A
0BC9 F59E MOV AUTOPTRL2,A
278:
279: // First two bytes are 0x70 and 0x00
280: XAUTODAT2 = 0x70;
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 14
0BCB 90E67C MOV DPTR,#0E67CH
0BCE 7470 MOV A,#070H
0BD0 F0 MOVX @DPTR,A
281: XAUTODAT2 = 0x00;
0BD1 E4 CLR A
0BD2 F0 MOVX @DPTR,A
282: // Clear the rest of the buffer
283: mymemmovexx(EP8FIFOBUF+2, EP8FIFOBUF+1, 18-2);
0BD3 7B10 MOV R3,#010H
0BD5 FA MOV R2,A
0BD6 7D01 MOV R5,#01H
0BD8 7CFC MOV R4,#0FCH
0BDA 7F02 MOV R7,#02H
0BDC 7EFC MOV R6,#0FCH
0BDE 120758 LCALL _mymemmovexx
284: XAUTODAT2 = sensePtr[0];
0BE1 F174 ACALL ?L?COM0029
0BE3 E4 CLR A
0BE4 93 MOVC A,@A+DPTR
0BE5 90E67C MOV DPTR,#0E67CH
0BE8 F0 MOVX @DPTR,A
285:
286: AUTOPTRL2 = 7;
0BE9 759E07 MOV AUTOPTRL2,#07H
287: XAUTODAT2 = 18-8; // Length of data following this byte
0BEC 740A MOV A,#0AH
0BEE F0 MOVX @DPTR,A
288:
289: AUTOPTRL2 = 12;
0BEF 759E0C MOV AUTOPTRL2,#0CH
290: XAUTODAT2 = sensePtr[1];
0BF2 F174 ACALL ?L?COM0029
0BF4 7401 MOV A,#01H
0BF6 93 MOVC A,@A+DPTR
0BF7 90E67C MOV DPTR,#0E67CH
0BFA F0 MOVX @DPTR,A
291: XAUTODAT2 = sensePtr[2];
0BFB F174 ACALL ?L?COM0029
0BFD 7402 MOV A,#02H
0BFF 93 MOVC A,@A+DPTR
0C00 90E67C MOV DPTR,#0E67CH
0C03 F0 MOVX @DPTR,A
292:
293: loadEP8BC(18);
0C04 7F12 MOV R7,#012H
0C06
0C06 7E00 MOV R6,#00H
294: sensePtr = senseOk;
295: return(USBS_PASSED);
0C08 A1A4 AJMP ?C0266?IDE
296: }
297: case STOP_START_UNIT:
298: case PREVENT_ALLOW_MEDIUM_REMOVAL:
0C0A ?C0043?IDE:
299: {
300: BYTE options;
301:
302: options = EP2FIFOBUF[CBW_DATA_START+4];
0C0A 90F013 MOV DPTR,#0F013H
0C0D E0 MOVX A,@DPTR
0C0E F55E MOV options,A
303: // relinquish control of the bulk buffer occupied by the CBW
304: EP2BCL = 0x80;
0C10 F19C ACALL ?L?COM0001
0C12 6003 JZ ?C0044?IDE
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 15
305:
306: if (dataTransferLen) // This command shouldn't have any data!
307: failedIn();
0C14 1207F7 LCALL failedIn
0C17 ?C0044?IDE:
308:
309: if (bCompactFlash)
0C17 300521 JNB bCompactFlash,?C0045?IDE
310: {
311: if ((cmd == PREVENT_ALLOW_MEDIUM_REMOVAL && (options & 1)) || // media_lock
0C1A E55D MOV A,cmd
0C1C B41E05 CJNE A,#01EH,?C0048?IDE
0C1F E55E MOV A,options
0C21 20E00D JB ACC.0,?C0047?IDE
0C24 ?C0048?IDE:
0C24 E55D MOV A,cmd
0C26 B41B10 CJNE A,#01BH,?C0046?IDE
0C29 E55E MOV A,options
0C2B 5403 ANL A,#03H
0C2D FF MOV R7,A
0C2E BF0208 CJNE R7,#02H,?C0046?IDE
0C31 ?C0047?IDE:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -