📄 fx2_ata.cod
字号:
312: (cmd == STOP_START_UNIT && ((options & 3) == 2))) // STOP_START_UNIT(EJECT):
313: {
314: sensePtr = senseCantEject;
0C31 750807 MOV sensePtr,#HIGH senseCantEject
0C34 75094C MOV sensePtr+01H,#LOW senseCantEject
315: return(USBS_FAILED);
0C37 D3 SETB C
0C38 22 RET
316: }
0C39 ?C0046?IDE:
317: else // start unit or other command we didn't consider -- should return okay.
318: {
319: sensePtr = senseOk;
320: return(USBS_PASSED);
0C39 A1A7 AJMP ?C0269?IDE
321: }
322: }
0C3B ?C0045?IDE:
323:
324: sensePtr = senseOk;
0C3B D11A ACALL ?L?COM0008
0C3D 6509 XRL A,sensePtr+01H
0C3F 7004 JNZ ?C0245?IDE
0C41 7407 MOV A,#HIGH senseOk
0C43 6508 XRL A,sensePtr
0C45 ?C0245?IDE:
0C45 6002 JZ ?C0050?IDE
325: checkForMedia(1);
326: if (sensePtr != senseOk)
327: return(USBS_FAILED);
0C47 D3 SETB C
0C48 22 RET
0C49 ?C0050?IDE:
328:
329: waitForBusyBit();
0C49 1174 ACALL waitForBusyBit
330: if (cmd == PREVENT_ALLOW_MEDIUM_REMOVAL)
0C4B E55D MOV A,cmd
0C4D B41E0D CJNE A,#01EH,?C0051?IDE
331: {
332: if (options & 1)
0C50 E55E MOV A,options
0C52 30E004 JNB ACC.0,?C0052?IDE
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 16
333: writePIO8(ATA_COMMAND_REG, ATA_COMMAND_MEDIA_LOCK);
0C55 7DDE MOV R5,#0DEH
0C57 800E SJMP ?C0268?IDE
0C59 ?C0052?IDE:
334: else
335: writePIO8(ATA_COMMAND_REG, ATA_COMMAND_MEDIA_UNLOCK);
0C59 7DDF MOV R5,#0DFH
0C5B
336: }
0C5B 800A SJMP ?C0268?IDE
0C5D ?C0051?IDE:
337: else // STOP_START_UNIT:
338: if ((options & 3) == 2)
0C5D E55E MOV A,options
0C5F 5403 ANL A,#03H
0C61 FF MOV R7,A
0C62 BF0204 CJNE R7,#02H,?C0054?IDE
339: writePIO8(ATA_COMMAND_REG, ATA_COMMAND_MEDIA_EJECT);
0C65 7DED MOV R5,#0EDH
0C67
0C67 3149 ACALL ?L?COM000F
0C69 ?C0054?IDE:
340:
341: waitForBusyBit();
0C69 1174 ACALL waitForBusyBit
342:
343: if (readATAPI_STATUS_REG() & ATAPI_STATUS_ERROR_BIT)
0C6B 1201F6 LCALL readATAPI_STATUS_REG
0C6E EF MOV A,R7
0C6F 30E023 JNB ACC.0,?C0056?IDE
344: {
345: BYTE error = loadSensePtrFromErrorRegister(1);
0C72 D223 SETB ?loadSensePtrFromErrorRegister?BIT
0C74 121018 LCALL loadSensePtrFromErrorRegister
0C77 8F5F MOV error,R7
346: if (error & 4) // command not supported -- Non removable media, return PASS
0C79 E55F MOV A,error
0C7B 30E202 JNB ACC.2,?C0057?IDE
347: {
348: sensePtr = senseOk;
0C7E
349: return(USBS_PASSED);
0C7E A1A7 AJMP ?C0269?IDE
350: }
0C80 ?C0057?IDE:
351: else if ((error & 2) && (options & 3) == 2)
0C80 E55F MOV A,error
0C82 30E10E JNB ACC.1,?C0058?IDE
0C85 E55E MOV A,options
0C87 5403 ANL A,#03H
0C89 FF MOV R7,A
0C8A BF0206 CJNE R7,#02H,?C0058?IDE
352: sensePtr = senseCantEject;
0C8D 750807 MOV sensePtr,#HIGH senseCantEject
0C90 75094C MOV sensePtr+01H,#LOW senseCantEject
0C93 ?C0058?IDE:
353: return(USBS_FAILED);
0C93 D3 SETB C
0C94 22 RET
354: }
0C95 ?C0056?IDE:
355: else
356: return(USBS_PASSED);
0C95 C3 CLR C
0C96 22 RET
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 17
357: break;
358: }
359:
360: case MODE_SENSE_06:
361: case MODE_SENSE_10:
0C97 ?C0062?IDE:
362: {
363: BYTE pagenum;
364:
365: pagenum = EP2FIFOBUF[CBW_DATA_START+2] & 0x3F; // identify page (see p.141 SCSI 2ed.)
0C97 90F011 MOV DPTR,#0F011H
0C9A E0 MOVX A,@DPTR
0C9B 543F ANL A,#03FH
0C9D F55E MOV pagenum,A
366:
367: EP2BCL = 0x80; // relinquish control of the bulk buffer occupied by the CBW
0C9F D114 ACALL ?L?COM0007
0CA1 6509 XRL A,sensePtr+01H
0CA3 7004 JNZ ?C0246?IDE
0CA5 7407 MOV A,#HIGH senseOk
0CA7 6508 XRL A,sensePtr
0CA9 ?C0246?IDE:
0CA9 6002 JZ ?C0063?IDE
368:
369: sensePtr = senseOk;
370: checkForMedia(1);
371: if (sensePtr != senseOk)
372: {
373: failedIn();
0CAB
374: return(USBS_FAILED);
0CAB A1AF AJMP ?C0271?IDE
375: }
0CAD ?C0063?IDE:
376:
377: waitForInBuffer();
0CAD F138 ACALL waitForInBuffer
378:
379: if((pagenum != 0x05) && (pagenum != 0x3F)
0CAF E55E MOV A,pagenum
0CB1 6405 XRL A,#05H
0CB3 6020 JZ ?C0064?IDE
0CB5 E55E MOV A,pagenum
0CB7 643F XRL A,#03FH
0CB9 601A JZ ?C0064?IDE
0CBB E55E MOV A,pagenum
0CBD 6401 XRL A,#01H
0CBF 6014 JZ ?C0064?IDE
0CC1 E55E MOV A,pagenum
0CC3 6408 XRL A,#08H
0CC5 600E JZ ?C0064?IDE
0CC7 E55E MOV A,pagenum
0CC9 641B XRL A,#01BH
0CCB 6008 JZ ?C0064?IDE
380: && (pagenum != 0x01) && (pagenum != 0x08) && (pagenum != 0x1B))
381: { // only respond to requests for certain pages (the mandatory ones plus page 5)
382: sensePtr = senseInvalidFieldInCDB;
0CCD 750807 MOV sensePtr,#HIGH senseInvalidFieldInCDB
0CD0 750931 MOV sensePtr+01H,#LOW senseInvalidFieldInCDB
383: failedIn();
0CD3
384: return(USBS_FAILED);
0CD3 A1AF AJMP ?C0271?IDE
385: }
0CD5 ?C0064?IDE:
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 18
386:
387: // If one of the supported pages is requested, return the 8 byte Mode Parameter Header
388: // plus a single 12 byte page. Only the Mode Data length (LSB) is significant in the
389: // Mode Parameter Header. It has a Vendor Specific Medium Type Code in byte 2, and
390: // a 1 bit WP Write Protect bit in byte 3 that are not initialized here.
391: // Pages 0x01, and 0x08 do not have significant data - they are spoofed.
392: // Page 0x1B has a TLUN field in byte 3 that is initialized to 1 (as per ISD).
393: // Page 0x05 does contain information that is needed to boot to HDD and CDROM.
394: // Page 0x3F, All Pages, is also responded to.
395: // The supported pages are (see INF-8070_1_3.pdf p37 Table 25):
396: // case 0x01: // Read-Write Error Recovery Page
397: // case 0x08: // Caching Page
398: // case 0x05: // Flexible Disk Page: needed to boot from USB
399: // case 0x1B: // Removable Block Access Capabilities Page
400: // case 0x3F: // All (4) Pages
401:
402: // The format used is:
403: // Mode parameter header (4 or 8 bytes)
404: // Block descriptors (not supported)
405: // Mode page
406: EP8FIFOBUF[0] = 0x00;
0CD5 90FC00 MOV DPTR,#0FC00H
0CD8 E4 CLR A
0CD9 F0 MOVX @DPTR,A
407: mymemmovexx(EP8FIFOBUF+1, EP8FIFOBUF, 100-1); // clear buffer - <100 bytes in all responses
0CDA 7B63 MOV R3,#063H
0CDC FA MOV R2,A
0CDD FD MOV R5,A
0CDE 7CFC MOV R4,#0FCH
0CE0 7F01 MOV R7,#01H
0CE2 7EFC MOV R6,#0FCH
0CE4 120758 LCALL _mymemmovexx
408:
409: AUTOPTRL2 = LSB(EP8FIFOBUF);
0CE7 E4 CLR A
0CE8 F59E MOV AUTOPTRL2,A
410: if (cmd == MODE_SENSE_10)
0CEA E55D MOV A,cmd
0CEC B45A1A CJNE A,#05AH,?C0065?IDE
411: {
412: XAUTODAT2 = MSB(0);
0CEF 90E67C MOV DPTR,#0E67CH
0CF2 E4 CLR A
0CF3 F0 MOVX @DPTR,A
413: if (pagenum == 0x3f)
0CF4 E55E MOV A,pagenum
0CF6 B43F05 CJNE A,#03FH,?C0066?IDE
414: XAUTODAT2 = LSB(8-2 + 12*4); // return 12 bytes for each page
0CF9 7436 MOV A,#036H
0CFB F0 MOVX @DPTR,A
0CFC 8006 SJMP ?C0067?IDE
0CFE ?C0066?IDE:
415: else
416: XAUTODAT2 = LSB(8-2 + 12*1); // return 12 bytes for each page
0CFE 90E67C MOV DPTR,#0E67CH
0D01 7412 MOV A,#012H
0D03 F0 MOVX @DPTR,A
0D04 ?C0067?IDE:
417: AUTOPTRL2 = LSB(EP8FIFOBUF) + 8; // The rest of the header is zeroes. Start the pages at byte 8.
>>
0D04 759E08 MOV AUTOPTRL2,#08H
418: }
0D07 8013 SJMP ?C0068?IDE
0D09 ?C0065?IDE:
419: else
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 19
420: {
421: if (pagenum == 0x3f)
0D09 E55E MOV A,pagenum
0D0B 90E67C MOV DPTR,#0E67CH
0D0E B43F05 CJNE A,#03FH,?C0069?IDE
422: XAUTODAT2 = LSB(4-1 + 12*4); // Header is 4 bytes long, data from each page is 12 bytes.
0D11 7433 MOV A,#033H
0D13 F0 MOVX @DPTR,A
0D14 8003 SJMP ?C0070?IDE
0D16 ?C0069?IDE:
423: else
424: XAUTODAT2 = LSB(4-1 + 12*1);
0D16 740F MOV A,#0FH
0D18 F0 MOVX @DPTR,A
0D19 ?C0070?IDE:
425: AUTOPTRL2 = LSB(EP8FIFOBUF) + 4;
0D19 759E04 MOV AUTOPTRL2,#04H
426: }
0D1C ?C0068?IDE:
427:
428: if((pagenum == 0x05) || (pagenum == 0x3F))
0D1C E55E MOV A,pagenum
0D1E 6405 XRL A,#05H
0D20 6006 JZ ?C0072?IDE
0D22 E55E MOV A,pagenum
0D24 643F XRL A,#03FH
0D26 7036 JNZ ?C0071?IDE
0D28 ?C0072?IDE:
429: {
430: XAUTODAT2 = 5; // fill out the page num - fields are all 0x0
0D28 90E67C MOV DPTR,#0E67CH
0D2B 7405 MOV A,#05H
0D2D F0 MOVX @DPTR,A
431: XAUTODAT2 = 12-2; // set individual Page Length -- return 12 for all commands
0D2E 740A MOV A,#0AH
0D30 F0 MOVX @DPTR,A
432:
433: if(EZUSB_HIGHSPEED())
0D31 90E680 MOV DPTR,#0E680H
0D34 E0 MOVX A,@DPTR
0D35 90E67C MOV DPTR,#0E67CH
0D38 30E706 JNB ACC.7,?C0073?IDE
434: {
435: XAUTODAT2 = 0xFF; // HS Transfer Rate (MSB) (field limited to 65Mb/Sec)
0D3B 74FF MOV A,#0FFH
0D3D F0 MOVX @DPTR,A
436: XAUTODAT2 = 0xFF; // HS Transfer Rate (LSB)
0D3E F0 MOVX @DPTR,A
437: }
0D3F 8006 SJMP ?C0074?IDE
0D41 ?C0073?IDE:
438: else
439: {
440: XAUTODAT2 = 0x2E; // FS Transfer Rate (MSB) (12Mb/Sec)
0D41 742E MOV A,#02EH
0D43 F0 MOVX @DPTR,A
441: XAUTODAT2 = 0xE0; // FS Transfer Rate (LSB)
0D44 74E0 MOV A,#0E0H
0D46 F0 MOVX @DPTR,A
442: }
0D47 ?C0074?IDE:
443: XAUTODAT2 = ActiveLunConfigData.NumHeads; // #Heads
0D47 90E67C MOV DPTR,#0E67CH
0D4A E530 MOV A,ActiveLunConfigData+02H
0D4C F0 MOVX @DPTR,A
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 20
444: XAUTODAT2 = ActiveLunConfigData.NumSectPerTrack; // #SectorsPerTrack
0D4D E531 MOV A,ActiveLunConfigData+03H
0D4F F0 MOVX @DPTR,A
445: XAUTODAT2 = (ATA_SECTOR_SIZE >> 8) & 0xff; // Data Bytes per sector (truncated)
0D50 7402 MOV A,#02H
0D52 F0 MOVX @DPTR,A
446: XAUTODAT2 = (ATA_SECTOR_SIZE >> 0) & 0xff; // Data Bytes per sector
0D53 E4 CLR A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -