📄 fx2_ata_revc.cod
字号:
312: (cmd == STOP_START_UNIT && ((options & 3) == 2))) // STOP_START_UNIT(EJECT):
313: {
314: sensePtr = senseCantEject;
0C2D 750807 MOV sensePtr,#HIGH senseCantEject
0C30 750946 MOV sensePtr+01H,#LOW senseCantEject
315: return(USBS_FAILED);
0C33 D3 SETB C
0C34 22 RET
316: }
0C35 ?C0046?IDE:
317: else // start unit or other command we didn't consider -- should return okay.
318: {
319: sensePtr = senseOk;
320: return(USBS_PASSED);
0C35 A1A3 AJMP ?C0269?IDE
321: }
322: }
0C37 ?C0045?IDE:
323:
324: sensePtr = senseOk;
0C37 D115 ACALL ?L?COM0008
0C39 6509 XRL A,sensePtr+01H
0C3B 7004 JNZ ?C0245?IDE
0C3D 7407 MOV A,#HIGH senseOk
0C3F 6508 XRL A,sensePtr
0C41 ?C0245?IDE:
0C41 6002 JZ ?C0050?IDE
325: checkForMedia(1);
326: if (sensePtr != senseOk)
327: return(USBS_FAILED);
0C43 D3 SETB C
0C44 22 RET
0C45 ?C0050?IDE:
328:
329: waitForBusyBit();
0C45 1173 ACALL waitForBusyBit
330: if (cmd == PREVENT_ALLOW_MEDIUM_REMOVAL)
0C47 E55D MOV A,cmd
0C49 B41E0D CJNE A,#01EH,?C0051?IDE
331: {
332: if (options & 1)
0C4C E55E MOV A,options
0C4E 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);
0C51 7DDE MOV R5,#0DEH
0C53 800E SJMP ?C0268?IDE
0C55 ?C0052?IDE:
334: else
335: writePIO8(ATA_COMMAND_REG, ATA_COMMAND_MEDIA_UNLOCK);
0C55 7DDF MOV R5,#0DFH
0C57
336: }
0C57 800A SJMP ?C0268?IDE
0C59 ?C0051?IDE:
337: else // STOP_START_UNIT:
338: if ((options & 3) == 2)
0C59 E55E MOV A,options
0C5B 5403 ANL A,#03H
0C5D FF MOV R7,A
0C5E BF0204 CJNE R7,#02H,?C0054?IDE
339: writePIO8(ATA_COMMAND_REG, ATA_COMMAND_MEDIA_EJECT);
0C61 7DED MOV R5,#0EDH
0C63
0C63 3149 ACALL ?L?COM000F
0C65 ?C0054?IDE:
340:
341: waitForBusyBit();
0C65 1173 ACALL waitForBusyBit
342:
343: if (readATAPI_STATUS_REG() & ATAPI_STATUS_ERROR_BIT)
0C67 1201F6 LCALL readATAPI_STATUS_REG
0C6A EF MOV A,R7
0C6B 30E023 JNB ACC.0,?C0056?IDE
344: {
345: BYTE error = loadSensePtrFromErrorRegister(1);
0C6E D223 SETB ?loadSensePtrFromErrorRegister?BIT
0C70 1213F2 LCALL loadSensePtrFromErrorRegister
0C73 8F5F MOV error,R7
346: if (error & 4) // command not supported -- Non removable media, return PASS
0C75 E55F MOV A,error
0C77 30E202 JNB ACC.2,?C0057?IDE
347: {
348: sensePtr = senseOk;
0C7A
349: return(USBS_PASSED);
0C7A A1A3 AJMP ?C0269?IDE
350: }
0C7C ?C0057?IDE:
351: else if ((error & 2) && (options & 3) == 2)
0C7C E55F MOV A,error
0C7E 30E10E JNB ACC.1,?C0058?IDE
0C81 E55E MOV A,options
0C83 5403 ANL A,#03H
0C85 FF MOV R7,A
0C86 BF0206 CJNE R7,#02H,?C0058?IDE
352: sensePtr = senseCantEject;
0C89 750807 MOV sensePtr,#HIGH senseCantEject
0C8C 750946 MOV sensePtr+01H,#LOW senseCantEject
0C8F ?C0058?IDE:
353: return(USBS_FAILED);
0C8F D3 SETB C
0C90 22 RET
354: }
0C91 ?C0056?IDE:
355: else
356: return(USBS_PASSED);
0C91 C3 CLR C
0C92 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:
0C93 ?C0062?IDE:
362: {
363: BYTE pagenum;
364:
365: pagenum = EP2FIFOBUF[CBW_DATA_START+2] & 0x3F; // identify page (see p.141 SCSI 2ed.)
0C93 90F011 MOV DPTR,#0F011H
0C96 E0 MOVX A,@DPTR
0C97 543F ANL A,#03FH
0C99 F55E MOV pagenum,A
366:
367: EP2BCL = 0x80; // relinquish control of the bulk buffer occupied by the CBW
0C9B D10F ACALL ?L?COM0007
0C9D 6509 XRL A,sensePtr+01H
0C9F 7004 JNZ ?C0246?IDE
0CA1 7407 MOV A,#HIGH senseOk
0CA3 6508 XRL A,sensePtr
0CA5 ?C0246?IDE:
0CA5 6002 JZ ?C0063?IDE
368:
369: sensePtr = senseOk;
370: checkForMedia(1);
371: if (sensePtr != senseOk)
372: {
373: failedIn();
0CA7
374: return(USBS_FAILED);
0CA7 A1AC AJMP ?C0271?IDE
375: }
0CA9 ?C0063?IDE:
376:
377: waitForInBuffer();
0CA9 F133 ACALL waitForInBuffer
378:
379: if((pagenum != 0x05) && (pagenum != 0x3F)
0CAB E55E MOV A,pagenum
0CAD 6405 XRL A,#05H
0CAF 6020 JZ ?C0064?IDE
0CB1 E55E MOV A,pagenum
0CB3 643F XRL A,#03FH
0CB5 601A JZ ?C0064?IDE
0CB7 E55E MOV A,pagenum
0CB9 6401 XRL A,#01H
0CBB 6014 JZ ?C0064?IDE
0CBD E55E MOV A,pagenum
0CBF 6408 XRL A,#08H
0CC1 600E JZ ?C0064?IDE
0CC3 E55E MOV A,pagenum
0CC5 641B XRL A,#01BH
0CC7 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;
0CC9 750807 MOV sensePtr,#HIGH senseInvalidFieldInCDB
0CCC 75092B MOV sensePtr+01H,#LOW senseInvalidFieldInCDB
383: failedIn();
0CCF
384: return(USBS_FAILED);
0CCF A1AC AJMP ?C0271?IDE
385: }
0CD1 ?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;
0CD1 90FC00 MOV DPTR,#0FC00H
0CD4 E4 CLR A
0CD5 F0 MOVX @DPTR,A
407: mymemmovexx(EP8FIFOBUF+1, EP8FIFOBUF, 100-1); // clear buffer - <100 bytes in all responses
0CD6 7B63 MOV R3,#063H
0CD8 FA MOV R2,A
0CD9 FD MOV R5,A
0CDA 7CFC MOV R4,#0FCH
0CDC 7F01 MOV R7,#01H
0CDE 7EFC MOV R6,#0FCH
0CE0 120752 LCALL _mymemmovexx
408:
409: AUTOPTRL2 = LSB(EP8FIFOBUF);
0CE3 E4 CLR A
0CE4 F59E MOV AUTOPTRL2,A
410: if (cmd == MODE_SENSE_10)
0CE6 E55D MOV A,cmd
0CE8 B45A1A CJNE A,#05AH,?C0065?IDE
411: {
412: XAUTODAT2 = MSB(0);
0CEB 90E67C MOV DPTR,#0E67CH
0CEE E4 CLR A
0CEF F0 MOVX @DPTR,A
413: if (pagenum == 0x3f)
0CF0 E55E MOV A,pagenum
0CF2 B43F05 CJNE A,#03FH,?C0066?IDE
414: XAUTODAT2 = LSB(8-2 + 12*4); // return 12 bytes for each page
0CF5 7436 MOV A,#036H
0CF7 F0 MOVX @DPTR,A
0CF8 8006 SJMP ?C0067?IDE
0CFA ?C0066?IDE:
415: else
416: XAUTODAT2 = LSB(8-2 + 12*1); // return 12 bytes for each page
0CFA 90E67C MOV DPTR,#0E67CH
0CFD 7412 MOV A,#012H
0CFF F0 MOVX @DPTR,A
0D00 ?C0067?IDE:
417: AUTOPTRL2 = LSB(EP8FIFOBUF) + 8; // The rest of the header is zeroes. Start the pages at byte 8.
>>
0D00 759E08 MOV AUTOPTRL2,#08H
418: }
0D03 8013 SJMP ?C0068?IDE
0D05 ?C0065?IDE:
419: else
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 19
420: {
421: if (pagenum == 0x3f)
0D05 E55E MOV A,pagenum
0D07 90E67C MOV DPTR,#0E67CH
0D0A 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.
0D0D 7433 MOV A,#033H
0D0F F0 MOVX @DPTR,A
0D10 8003 SJMP ?C0070?IDE
0D12 ?C0069?IDE:
423: else
424: XAUTODAT2 = LSB(4-1 + 12*1);
0D12 740F MOV A,#0FH
0D14 F0 MOVX @DPTR,A
0D15 ?C0070?IDE:
425: AUTOPTRL2 = LSB(EP8FIFOBUF) + 4;
0D15 759E04 MOV AUTOPTRL2,#04H
426: }
0D18 ?C0068?IDE:
427:
428: if((pagenum == 0x05) || (pagenum == 0x3F))
0D18 E55E MOV A,pagenum
0D1A 6405 XRL A,#05H
0D1C 6006 JZ ?C0072?IDE
0D1E E55E MOV A,pagenum
0D20 643F XRL A,#03FH
0D22 7036 JNZ ?C0071?IDE
0D24 ?C0072?IDE:
429: {
430: XAUTODAT2 = 5; // fill out the page num - fields are all 0x0
0D24 90E67C MOV DPTR,#0E67CH
0D27 7405 MOV A,#05H
0D29 F0 MOVX @DPTR,A
431: XAUTODAT2 = 12-2; // set individual Page Length -- return 12 for all commands
0D2A 740A MOV A,#0AH
0D2C F0 MOVX @DPTR,A
432:
433: if(EZUSB_HIGHSPEED())
0D2D 90E680 MOV DPTR,#0E680H
0D30 E0 MOVX A,@DPTR
0D31 90E67C MOV DPTR,#0E67CH
0D34 30E706 JNB ACC.7,?C0073?IDE
434: {
435: XAUTODAT2 = 0xFF; // HS Transfer Rate (MSB) (field limited to 65Mb/Sec)
0D37 74FF MOV A,#0FFH
0D39 F0 MOVX @DPTR,A
436: XAUTODAT2 = 0xFF; // HS Transfer Rate (LSB)
0D3A F0 MOVX @DPTR,A
437: }
0D3B 8006 SJMP ?C0074?IDE
0D3D ?C0073?IDE:
438: else
439: {
440: XAUTODAT2 = 0x2E; // FS Transfer Rate (MSB) (12Mb/Sec)
0D3D 742E MOV A,#02EH
0D3F F0 MOVX @DPTR,A
441: XAUTODAT2 = 0xE0; // FS Transfer Rate (LSB)
0D40 74E0 MOV A,#0E0H
0D42 F0 MOVX @DPTR,A
442: }
0D43 ?C0074?IDE:
443: XAUTODAT2 = ActiveLunConfigData.NumHeads; // #Heads
0D43 90E67C MOV DPTR,#0E67CH
0D46 E530 MOV A,ActiveLunConfigData+02H
0D48 F0 MOVX @DPTR,A
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 20
444: XAUTODAT2 = ActiveLunConfigData.NumSectPerTrack; // #SectorsPerTrack
0D49 E531 MOV A,ActiveLunConfigData+03H
0D4B F0 MOVX @DPTR,A
445: XAUTODAT2 = (ATA_SECTOR_SIZE >> 8) & 0xff; // Data Bytes per sector (truncated)
0D4C 7402 MOV A,#02H
0D4E F0 MOVX @DPTR,A
446: XAUTODAT2 = (ATA_SECTOR_SIZE >> 0) & 0xff; // Data Bytes per sector
0D4F E4 CLR A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -