📄 fx2_ata_revc.cod
字号:
0B1D F163 ACALL IDEPrepareForXfer
168: stuffLBAandSector(1);
0B1F D223 SETB ?stuffLBAandSector?BIT
0B21 316D ACALL stuffLBAandSector
169: writePIO8(ATAPI_COMMAND_REG, ATA_COMMAND_SEEK);
0B23 7D70 MOV R5,#070H
0B25 3149 ACALL ?L?COM000F
170: if(waitForBusyBit() == USBS_FAILED)
0B27 1173 ACALL waitForBusyBit
0B29 5007 JNC ?C0022?IDE
171: {
172: loadSensePtrFromErrorRegister(1);
0B2B D223 SETB ?loadSensePtrFromErrorRegister?BIT
0B2D 1213F2 LCALL loadSensePtrFromErrorRegister
173: return(USBS_FAILED);
0B30 D3 SETB C
0B31 22 RET
174: }
0B32 ?C0022?IDE:
175: else
176: return(USBS_PASSED);
0B32 C3 CLR C
0B33 22 RET
177: }
0B34 ?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
0B34
0B34 D164 ACALL ?L?COM000B
182:
183: failedIn();
184: return(USBS_FAILED);
0B36 A1AC AJMP ?C0271?IDE
185: }
186: }
187:
188: case READ_FORMAT_CAPACITIES:
189: case READ_CAPACITY:
0B38 ?C0026?IDE:
190: {
191: BYTE num_bytes = 8;
0B38 755E08 MOV num_bytes,#08H
192:
193: // relinquish control of the bulk buffer occupied by the CBW
194: EP2BCL = 0x80;
0B3B D164 ACALL ?L?COM000B
195:
196: sensePtr = senseOk;
0B3D F1AA ACALL ?L?COM0022
197: checkForMedia(1);
0B3F D223 SETB ?checkForMedia?BIT
0B41 12003E LCALL checkForMedia
198:
199: waitForInBuffer();
0B44 F133 ACALL waitForInBuffer
200: if (sensePtr == senseOk)
0B46 742E MOV A,#LOW senseOk
0B48 6509 XRL A,sensePtr+01H
0B4A 7004 JNZ ?C0242?IDE
0B4C 7407 MOV A,#HIGH senseOk
0B4E 6508 XRL A,sensePtr
0B50 ?C0242?IDE:
0B50 7046 JNZ ?C0027?IDE
201: {
202: AUTOPTRL2 = LSB(EP8FIFOBUF);
0B52 F59E MOV AUTOPTRL2,A
203: if(cmd == READ_FORMAT_CAPACITIES) // add 4 byte capacity list header
0B54 E55D MOV A,cmd
0B56 B4230D CJNE A,#023H,?C0028?IDE
204: {
205: XAUTODAT2 = 0x0;
0B59 90E67C MOV DPTR,#0E67CH
0B5C E4 CLR A
0B5D F0 MOVX @DPTR,A
206: XAUTODAT2 = 0x0;
0B5E F0 MOVX @DPTR,A
207: XAUTODAT2 = 0x0;
0B5F F0 MOVX @DPTR,A
208: XAUTODAT2 = 0x08;
0B60 7408 MOV A,#08H
0B62 F0 MOVX @DPTR,A
209: num_bytes = 12;
0B63 755E0C MOV num_bytes,#0CH
210: }
0B66 ?C0028?IDE:
211: XAUTODAT2 = ((BYTE *) &ActiveLunConfigData.driveCapacity)[0];
0B66 90E67C MOV DPTR,#0E67CH
0B69 E534 MOV A,ActiveLunConfigData+06H
0B6B F0 MOVX @DPTR,A
212: XAUTODAT2 = ((BYTE *) &ActiveLunConfigData.driveCapacity)[1];
0B6C E535 MOV A,ActiveLunConfigData+07H
0B6E F0 MOVX @DPTR,A
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 12
213: XAUTODAT2 = ((BYTE *) &ActiveLunConfigData.driveCapacity)[2];
0B6F E536 MOV A,ActiveLunConfigData+08H
0B71 F0 MOVX @DPTR,A
214: XAUTODAT2 = ((BYTE *) &ActiveLunConfigData.driveCapacity)[3];
0B72 E537 MOV A,ActiveLunConfigData+09H
0B74 F0 MOVX @DPTR,A
215: if(cmd == READ_FORMAT_CAPACITIES)
0B75 E55D MOV A,cmd
0B77 B42305 CJNE A,#023H,?C0029?IDE
216: XAUTODAT2 = ((ATA_SECTOR_SIZE >> 24) & 0xff) | 2; // Report media type -- Formatted
0B7A 7402 MOV A,#02H
0B7C F0 MOVX @DPTR,A
0B7D 8005 SJMP ?C0030?IDE
0B7F ?C0029?IDE:
217: else
218: XAUTODAT2 = (ATA_SECTOR_SIZE >> 24) & 0xff;
0B7F 90E67C MOV DPTR,#0E67CH
0B82 E4 CLR A
0B83 F0 MOVX @DPTR,A
0B84 ?C0030?IDE:
219: XAUTODAT2 = (ATA_SECTOR_SIZE >> 16) & 0xff;
0B84 90E67C MOV DPTR,#0E67CH
0B87 E4 CLR A
0B88 F0 MOVX @DPTR,A
220: XAUTODAT2 = (ATA_SECTOR_SIZE >> 8) & 0xff;
0B89 7402 MOV A,#02H
0B8B F0 MOVX @DPTR,A
221: XAUTODAT2 = (ATA_SECTOR_SIZE >> 0) & 0xff;
0B8C E4 CLR A
0B8D F0 MOVX @DPTR,A
222:
223: loadEP8BC(num_bytes);
0B8E AF5E MOV R7,num_bytes
0B90 FE MOV R6,A
0B91 1217A6 LCALL _loadEP8BC
224: status = USBS_PASSED;
0B94 C222 CLR status
225: }
0B96 8004 SJMP ?C0031?IDE
0B98 ?C0027?IDE:
226: else
227: {
228: failedIn();
0B98 1116 ACALL failedIn
229: status = USBS_FAILED;
0B9A D222 SETB status
230: }
0B9C ?C0031?IDE:
231:
232: return(status);
0B9C A222 MOV C,status
0B9E 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:
0B9F ?C0033?IDE:
239: {
240: // relinquish control of the bulk buffer occupied by the CBW
241: EP2BCL = 0x80;
0B9F D10F ACALL ?L?COM0007
0BA1 B50907 CJNE A,sensePtr+01H,?C0034?IDE
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 13
0BA4 7407 MOV A,#HIGH senseOk
0BA6 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);
0BA9 C3 CLR C
0BAA 22 RET
0BAB ?C0034?IDE:
249: else
250: return(USBS_FAILED);
0BAB D3 SETB C
0BAC 22 RET
251: }
252:
253: case TEST_UNIT_READY:
254: case FORMAT_UNIT:
0BAD ?C0037?IDE:
255: {
256: // relinquish control of the bulk buffer occupied by the CBW
257: EP2BCL = 0x80;
0BAD F197 ACALL ?L?COM0001
0BAF 6002 JZ ?C0038?IDE
258:
259: if (dataTransferLen) // This command shouldn't have any data!
260: failedIn();
0BB1 1116 ACALL failedIn
0BB3 ?C0038?IDE:
261:
262: sensePtr = senseOk;
0BB3 D115 ACALL ?L?COM0008
0BB5 B50907 CJNE A,sensePtr+01H,?C0039?IDE
0BB8 7407 MOV A,#HIGH senseOk
0BBA B50802 CJNE A,sensePtr,?C0039?IDE
263: checkForMedia(1);
264:
265: if (sensePtr == senseOk)
266: return(USBS_PASSED);
0BBD C3 CLR C
0BBE 22 RET
0BBF ?C0039?IDE:
267: else
268: return(USBS_FAILED);
0BBF D3 SETB C
0BC0 22 RET
269: }
270: case REQUEST_SENSE:
0BC1 ?C0041?IDE:
271: {
272: // relinquish control of the bulk buffer occupied by the CBW
273: EP2BCL = 0x80;
0BC1 D164 ACALL ?L?COM000B
274:
275: waitForInBuffer();
0BC3 F133 ACALL waitForInBuffer
276:
277: AUTOPTRL2 = LSB(EP8FIFOBUF);
0BC5 E4 CLR A
0BC6 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
0BC8 90E67C MOV DPTR,#0E67CH
0BCB 7470 MOV A,#070H
0BCD F0 MOVX @DPTR,A
281: XAUTODAT2 = 0x00;
0BCE E4 CLR A
0BCF F0 MOVX @DPTR,A
282: // Clear the rest of the buffer
283: mymemmovexx(EP8FIFOBUF+2, EP8FIFOBUF+1, 18-2);
0BD0 7B10 MOV R3,#010H
0BD2 FA MOV R2,A
0BD3 7D01 MOV R5,#01H
0BD5 7CFC MOV R4,#0FCH
0BD7 7F02 MOV R7,#02H
0BD9 7EFC MOV R6,#0FCH
0BDB 120752 LCALL _mymemmovexx
284: XAUTODAT2 = sensePtr[0];
0BDE F16F ACALL ?L?COM0029
0BE0 E4 CLR A
0BE1 93 MOVC A,@A+DPTR
0BE2 90E67C MOV DPTR,#0E67CH
0BE5 F0 MOVX @DPTR,A
285:
286: AUTOPTRL2 = 7;
0BE6 759E07 MOV AUTOPTRL2,#07H
287: XAUTODAT2 = 18-8; // Length of data following this byte
0BE9 740A MOV A,#0AH
0BEB F0 MOVX @DPTR,A
288:
289: AUTOPTRL2 = 12;
0BEC 759E0C MOV AUTOPTRL2,#0CH
290: XAUTODAT2 = sensePtr[1];
0BEF F16F ACALL ?L?COM0029
0BF1 7401 MOV A,#01H
0BF3 93 MOVC A,@A+DPTR
0BF4 90E67C MOV DPTR,#0E67CH
0BF7 F0 MOVX @DPTR,A
291: XAUTODAT2 = sensePtr[2];
0BF8 F16F ACALL ?L?COM0029
0BFA 7402 MOV A,#02H
0BFC 93 MOVC A,@A+DPTR
0BFD 90E67C MOV DPTR,#0E67CH
0C00 F0 MOVX @DPTR,A
292:
293: loadEP8BC(18);
0C01 7F12 MOV R7,#012H
0C03
0C03 7E00 MOV R6,#00H
294: sensePtr = senseOk;
295: return(USBS_PASSED);
0C05 A1A0 AJMP ?C0266?IDE
296: }
297: case STOP_START_UNIT:
298: case PREVENT_ALLOW_MEDIUM_REMOVAL:
0C07 ?C0043?IDE:
299: {
300: BYTE options;
301:
302: options = EP2FIFOBUF[CBW_DATA_START+4];
0C07 90F013 MOV DPTR,#0F013H
0C0A E0 MOVX A,@DPTR
0C0B F55E MOV options,A
303: // relinquish control of the bulk buffer occupied by the CBW
304: EP2BCL = 0x80;
0C0D F197 ACALL ?L?COM0001
0C0F 6002 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();
0C11 1116 ACALL failedIn
0C13 ?C0044?IDE:
308:
309: if (bCompactFlash)
0C13 300521 JNB bCompactFlash,?C0045?IDE
310: {
311: if ((cmd == PREVENT_ALLOW_MEDIUM_REMOVAL && (options & 1)) || // media_lock
0C16 E55D MOV A,cmd
0C18 B41E05 CJNE A,#01EH,?C0048?IDE
0C1B E55E MOV A,options
0C1D 20E00D JB ACC.0,?C0047?IDE
0C20 ?C0048?IDE:
0C20 E55D MOV A,cmd
0C22 B41B10 CJNE A,#01BH,?C0046?IDE
0C25 E55E MOV A,options
0C27 5403 ANL A,#03H
0C29 FF MOV R7,A
0C2A BF0208 CJNE R7,#02H,?C0046?IDE
0C2D ?C0047?IDE:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -