⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fx2_ata_revc.cod

📁 Cy68013的应用——USB2.0接口转IDE、CF卡接口
💻 COD
📖 第 1 页 / 共 5 页
字号:
09D6 7F2A              MOV     R7,#02AH
09D8 314D              ACALL   _writePIO8
  939:       }
09DA         ?C0208?IDE:
  940: 
  941:    writePIO8(ATA_LBA_LSB_REG,  ((BYTE *) &dwLBA)[3]);    // LBA (7:0)
09DA E50D              MOV     A,dwLBA+03H
09DC F13B              ACALL   ?L?COM002E
  942:    writePIO8(ATA_LBA_2SB_REG,  ((BYTE *) &dwLBA)[2]);    // LBA (15:8)
09DE E50C              MOV     A,dwLBA+02H
09E0 FD                MOV     R5,A
09E1 7F28              MOV     R7,#028H
09E3 314D              ACALL   _writePIO8
  943:    writePIO8(ATA_LBA_MSB_REG,  ((BYTE *) &dwLBA)[1]);    // LBA (23:16)
09E5 E50B              MOV     A,dwLBA+01H
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 6


09E7 FD                MOV     R5,A
09E8 7F2A              MOV     R7,#02AH
09EA 314D              ACALL   _writePIO8
  944: 
  945:    if (!bExtAddrSupport)
09EC 200412            JB      bExtAddrSupport,?C0209?IDE
  946:       {      
  947:       writePIO8(ATA_DRIVESEL_REG, ((BYTE *) &dwLBA)[0] | 0xe0 | ((BYTE)bMasterSlave << 4));
09EF F1B1              ACALL   ?L?COM002D
09F1 FF                MOV     R7,A
09F2 E50A              MOV     A,dwLBA
09F4 44E0              ORL     A,#0E0H
09F6 FD                MOV     R5,A
09F7 E5F0              MOV     A,B
09F9 FC                MOV     R4,A
09FA ED                MOV     A,R5
09FB 4F                ORL     A,R7
09FC FD                MOV     R5,A
09FD 7F2C              MOV     R7,#02CH
09FF 314D              ACALL   _writePIO8
  948:       }
0A01         ?C0209?IDE:
  949: 
  950:    dwLBA += sectorcount;
0A01 E4                CLR     A
0A02 FC                MOV     R4,A
0A03 FD                MOV     R5,A
0A04 E50D              MOV     A,dwLBA+03H
0A06 2569              ADD     A,sectorcount+01H
0A08 F50D              MOV     dwLBA+03H,A
0A0A E50C              MOV     A,dwLBA+02H
0A0C 3568              ADDC    A,sectorcount
0A0E F50C              MOV     dwLBA+02H,A
0A10 ED                MOV     A,R5
0A11 350B              ADDC    A,dwLBA+01H
0A13 F50B              MOV     dwLBA+01H,A
0A15 EC                MOV     A,R4
0A16 350A              ADDC    A,dwLBA
0A18 F50A              MOV     dwLBA,A
  951:    return sectorcount;
0A1A AE68              MOV     R6,sectorcount
0A1C AF69              MOV     R7,sectorcount+01H
  952: }
0A1E 22                RET     
----- FUNCTION stuffLBAandSector (END) -------


----- FUNCTION generalIDEInCommand (BEGIN) -----
 FILE: 'ide.c'
   70: bit generalIDEInCommand()
   71: {
   72:    BYTE cmd;
   73:    bit status;
   74: 
   75:    bShortPacketSent = 0;
0A1F C220              CLR     bShortPacketSent
   76:    
   77:    cmd = EP2FIFOBUF[0xf];  
0A21 90F00F            MOV     DPTR,#0F00FH
0A24 E0                MOVX    A,@DPTR
0A25 F55D              MOV     cmd,A
   78: 
   79:    switch (cmd)
0A27 1203B7            LCALL   ?C?CCASE
0A2A 0BAD              DW      ?C0037?IDE
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 7


0A2C 00                DB      00H
0A2D 0BC1              DW      ?C0041?IDE
0A2F 03                DB      03H
0A30 0BAD              DW      ?C0037?IDE
0A32 04                DB      04H
0A33 0B00              DW      ?C0017?IDE
0A35 08                DB      08H
0A36 0A5E              DW      ?C0002?IDE
0A38 12                DB      012H
0A39 0B9F              DW      ?C0033?IDE
0A3B 15                DB      015H
0A3C 0C93              DW      ?C0062?IDE
0A3E 1A                DB      01AH
0A3F 0C07              DW      ?C0043?IDE
0A41 1B                DB      01BH
0A42 0C07              DW      ?C0043?IDE
0A44 1E                DB      01EH
0A45 0B38              DW      ?C0026?IDE
0A47 23                DB      023H
0A48 0B38              DW      ?C0026?IDE
0A4A 25                DB      025H
0A4B 0B00              DW      ?C0017?IDE
0A4D 28                DB      028H
0A4E 0B11              DW      ?C0020?IDE
0A50 2B                DB      02BH
0A51 0B00              DW      ?C0017?IDE
0A53 2F                DB      02FH
0A54 0B9F              DW      ?C0033?IDE
0A56 55                DB      055H
0A57 0C93              DW      ?C0062?IDE
0A59 5A                DB      05AH
0A5A 0000              DW      00H
0A5C 0DA7              DW      ?C0081?IDE
   80:    {
   81:       // Minimum processing for a case in this switch statement:
   82:       case INQUIRY:
0A5E         ?C0002?IDE:
   83:       {
   84:          BYTE i;
   85:          
   86:          // relinquish control of the bulk buffer occupied by the CBW
   87:          EP2BCL = 0x80;     
0A5E D164              ACALL   ?L?COM000B
   88: 
   89:          waitForInBuffer();
0A60 F133              ACALL   waitForInBuffer
   90:          // CompactFlash uses a lot of local stuff
   91:          if (bCompactFlash)
0A62 300526            JNB     bCompactFlash,?C0003?IDE
   92:             {
   93:             AUTOPTRL2 = LSB(EP8FIFOBUF);
0A65 E4                CLR     A
0A66 F59E              MOV     AUTOPTRL2,A
   94: 
   95:             // Clear out the EP buffer
   96:             for (i = SCSI_IDENTIFY_LEN; i; i--)
0A68 755E2C            MOV     i,#02CH
0A6B         ?C0004?IDE:
   97:                XAUTODAT2 = 0;
0A6B 90E67C            MOV     DPTR,#0E67CH
0A6E E4                CLR     A
0A6F F0                MOVX    @DPTR,A
0A70 D55EF8            DJNZ    i,?C0004?IDE
0A73         ?C0005?IDE:
   98: 
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 8


   99:             // Load fields we use
  100:             EP8FIFOBUF[SCSI_INQUIRY_REMOVABLE_BYTE] |= SCSI_INQUIRY_REMOVABLE_BIT;
0A73 90FC01            MOV     DPTR,#0FC01H
0A76 E0                MOVX    A,@DPTR
0A77 4480              ORL     A,#080H
0A79 F0                MOVX    @DPTR,A
  101:             mymemmovexx(EP8FIFOBUF+SCSI_INQUIRY_MANUFACTURER, (void *)"Cypress Semi", sizeof("Cypress Semi"));
0A7A 7C07              MOV     R4,#HIGH 0100071BH
0A7C 7D1B              MOV     R5,#LOW 0100071BH
0A7E 7B0D              MOV     R3,#0DH
0A80 7A00              MOV     R2,#00H
0A82 7F08              MOV     R7,#08H
0A84 7EFC              MOV     R6,#0FCH
0A86 120752            LCALL   _mymemmovexx
  102:             }
0A89 806B              SJMP    ?C0007?IDE
0A8B         ?C0003?IDE:
  103: 
  104:          else
  105:             {
  106:             SendDeviceIdentifyCommand();
0A8B F149              ACALL   SendDeviceIdentifyCommand
  107: 
  108:             FetchDeviceIdentifyIntoEp8();
0A8D F1DE              ACALL   FetchDeviceIdentifyIntoEp8
  109:    
  110:             // copy the IDENTIFY data into the top of EP8FIFOBUF
  111:             mymemmovexx(EP8FIFOBUF+256, EP8FIFOBUF, 256);
0A8F 7B00              MOV     R3,#00H
0A91 7A01              MOV     R2,#01H
0A93 7D00              MOV     R5,#00H
0A95 7CFC              MOV     R4,#0FCH
0A97 7F00              MOV     R7,#00H
0A99 7EFD              MOV     R6,#0FDH
0A9B 120752            LCALL   _mymemmovexx
  112:    
  113:             // clear out the bottom of EP8FIFOBUF.  This is where we are going to build
  114:             // the response to the IDENTIFY command.
  115:             AUTOPTRL2 = LSB(EP8FIFOBUF);
0A9E E4                CLR     A
0A9F F59E              MOV     AUTOPTRL2,A
  116:             for (i = SCSI_IDENTIFY_LEN; i; i--)
0AA1 755E2C            MOV     i,#02CH
0AA4         ?C0008?IDE:
  117:                XAUTODAT2 = 0;
0AA4 90E67C            MOV     DPTR,#0E67CH
0AA7 E4                CLR     A
0AA8 F0                MOVX    @DPTR,A
0AA9 D55EF8            DJNZ    i,?C0008?IDE
0AAC         ?C0009?IDE:
  118:    
  119:             // Place the fields that we need into the SCSI block
  120:             AUTOPTRL2 = LSB(EP8FIFOBUF+SCSI_INQUIRY_MANUFACTURER);
0AAC 759E08            MOV     AUTOPTRL2,#08H
  121:             for (i = 0; i < SCSI_INQUIRY_MANUFACTURER_LEN; i++)
0AAF E4                CLR     A
0AB0 F55E              MOV     i,A
0AB2         ?C0011?IDE:
  122:                {
  123:                // swap bytes within words.  This is stored backwards!
  124:                XAUTODAT2 = EP8FIFOBUF[(ATAPI_INQUIRY_MANUFACTURER * 2 + (i ^ 1)) + 256];
0AB2 E55E              MOV     A,i
0AB4 6401              XRL     A,#01H
0AB6 2436              ADD     A,#036H
0AB8 F582              MOV     DPL,A
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 9


0ABA E4                CLR     A
0ABB 34FD              ADDC    A,#0FDH
0ABD F583              MOV     DPH,A
0ABF E0                MOVX    A,@DPTR
0AC0 90E67C            MOV     DPTR,#0E67CH
0AC3 F0                MOVX    @DPTR,A
  125:                }
0AC4 055E              INC     i
0AC6 E55E              MOV     A,i
0AC8 B418E7            CJNE    A,#018H,?C0011?IDE
0ACB         ?C0012?IDE:
  126:             
  127:             EP8FIFOBUF[SCSI_INQUIRY_REVISION+1] = EP8FIFOBUF[(ATAPI_INQUIRY_REVISION * 2) + 256]+'0';
0ACB 90FD92            MOV     DPTR,#0FD92H
0ACE E0                MOVX    A,@DPTR
0ACF 2430              ADD     A,#030H
0AD1 90FC21            MOV     DPTR,#0FC21H
0AD4 F0                MOVX    @DPTR,A
  128:             EP8FIFOBUF[SCSI_INQUIRY_REVISION+3] = EP8FIFOBUF[(ATAPI_INQUIRY_REVISION * 2 +2) + 256]+'0';
0AD5 90FD94            MOV     DPTR,#0FD94H
0AD8 E0                MOVX    A,@DPTR
0AD9 2430              ADD     A,#030H
0ADB 90FC23            MOV     DPTR,#0FC23H
0ADE F0                MOVX    @DPTR,A
  129:             EP8FIFOBUF[SCSI_INQUIRY_REMOVABLE_BYTE] |= SCSI_INQUIRY_REMOVABLE_BIT & EP8FIFOBUF[(ATAPI_INQUIRY_REM
>> OVABLE_BYTE) + 256];
0ADF 90FC01            MOV     DPTR,#0FC01H
0AE2 C083              PUSH    DPH
0AE4 C082              PUSH    DPL
0AE6 E0                MOVX    A,@DPTR
0AE7 FF                MOV     R7,A
0AE8 90FD00            MOV     DPTR,#0FD00H
0AEB E0                MOVX    A,@DPTR
0AEC 5480              ANL     A,#080H
0AEE FE                MOV     R6,A
0AEF EF                MOV     A,R7
0AF0 4E                ORL     A,R6
0AF1 D082              POP     DPL
0AF3 D083              POP     DPH
0AF5 F0                MOVX    @DPTR,A
  130:             }
0AF6         ?C0007?IDE:
  131: 
  132:          EP8FIFOBUF[SCSI_INQUIRY_REVISION_LEN] = 0x1F;
0AF6 90FC04            MOV     DPTR,#0FC04H
0AF9 741F              MOV     A,#01FH
0AFB F0                MOVX    @DPTR,A
  133:          loadEP8BC(SCSI_IDENTIFY_LEN);
0AFC 7F2C              MOV     R7,#02CH
  134:          sensePtr = senseOk;
  135:          return(USBS_PASSED);
0AFE 8103              AJMP    ?C0263?IDE
  136:       }
  137:       
  138:       case READ_06:
  139:       case READ_10:
  140:       case VERIFY_10:
0B00         ?C0017?IDE:
  141:       {
  142:          sensePtr = senseOk;
0B00 D115              ACALL   ?L?COM0008
0B02 B5090A            CJNE    A,sensePtr+01H,?C0018?IDE
0B05 7407              MOV     A,#HIGH senseOk
0B07 B50805            CJNE    A,sensePtr,?C0018?IDE
  143:          checkForMedia(1);
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 10


  144: 
  145:          if (sensePtr == senseOk)
  146:          {
  147:             return(ideReadCommand(cmd));   
0B0A AF5D              MOV     R7,cmd
0B0C 02120A            LJMP    _ideReadCommand
  148:          }
0B0F         ?C0018?IDE:
  149:          else
  150:          {
  151:             // relinquish control of the bulk buffer occupied by the CBW
  152:             EP2BCL = 0x80;     
  153:             
  154:             failedIn();         
  155:             return(USBS_FAILED);
0B0F 8023              SJMP    ?C0264?IDE
  156:          }
  157:       }
  158:                 
  159:       case SEEK_10:
0B11         ?C0020?IDE:
  160:       {
  161:          sensePtr = senseOk;
0B11 D115              ACALL   ?L?COM0008
0B13 6509              XRL     A,sensePtr+01H
0B15 7004              JNZ     ?C0241?IDE
0B17 7407              MOV     A,#HIGH senseOk
0B19 6508              XRL     A,sensePtr
0B1B         ?C0241?IDE:
0B1B 7017              JNZ     ?C0021?IDE
  162:          checkForMedia(1);
  163: 
  164:          if (sensePtr == senseOk)
  165:             {
  166:             // Cannot just call readcommand because it aborts on no dataTransferLen.
  167:             IDEPrepareForXfer();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -