📄 fx2_ata.cod
字号:
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 F140 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 F1B6 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 0BAF DW ?C0037?IDE
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 7
0A2C 00 DB 00H
0A2D 0BC4 DW ?C0041?IDE
0A2F 03 DB 03H
0A30 0BAF DW ?C0037?IDE
0A32 04 DB 04H
0A33 0B01 DW ?C0017?IDE
0A35 08 DB 08H
0A36 0A5E DW ?C0002?IDE
0A38 12 DB 012H
0A39 0BA1 DW ?C0033?IDE
0A3B 15 DB 015H
0A3C 0C97 DW ?C0062?IDE
0A3E 1A DB 01AH
0A3F 0C0A DW ?C0043?IDE
0A41 1B DB 01BH
0A42 0C0A DW ?C0043?IDE
0A44 1E DB 01EH
0A45 0B39 DW ?C0026?IDE
0A47 23 DB 023H
0A48 0B39 DW ?C0026?IDE
0A4A 25 DB 025H
0A4B 0B01 DW ?C0017?IDE
0A4D 28 DB 028H
0A4E 0B12 DW ?C0020?IDE
0A50 2B DB 02BH
0A51 0B01 DW ?C0017?IDE
0A53 2F DB 02FH
0A54 0BA1 DW ?C0033?IDE
0A56 55 DB 055H
0A57 0C97 DW ?C0062?IDE
0A59 5A DB 05AH
0A5A 0000 DW 00H
0A5C 0DAB 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 D169 ACALL ?L?COM000B
88:
89: waitForInBuffer();
0A60 F138 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 01000721H
0A7C 7D21 MOV R5,#LOW 01000721H
0A7E 7B0D MOV R3,#0DH
0A80 7A00 MOV R2,#00H
0A82 7F08 MOV R7,#08H
0A84 7EFC MOV R6,#0FCH
0A86 120758 LCALL _mymemmovexx
102: }
0A89 806C SJMP ?C0007?IDE
0A8B ?C0003?IDE:
103:
104: else
105: {
106: SendDeviceIdentifyCommand();
0A8B F14E ACALL SendDeviceIdentifyCommand
107:
108: FetchDeviceIdentifyIntoEp8();
0A8D 121278 LCALL FetchDeviceIdentifyIntoEp8
109:
110: // copy the IDENTIFY data into the top of EP8FIFOBUF
111: mymemmovexx(EP8FIFOBUF+256, EP8FIFOBUF, 256);
0A90 7B00 MOV R3,#00H
0A92 7A01 MOV R2,#01H
0A94 7D00 MOV R5,#00H
0A96 7CFC MOV R4,#0FCH
0A98 7F00 MOV R7,#00H
0A9A 7EFD MOV R6,#0FDH
0A9C 120758 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);
0A9F E4 CLR A
0AA0 F59E MOV AUTOPTRL2,A
116: for (i = SCSI_IDENTIFY_LEN; i; i--)
0AA2 755E2C MOV i,#02CH
0AA5 ?C0008?IDE:
117: XAUTODAT2 = 0;
0AA5 90E67C MOV DPTR,#0E67CH
0AA8 E4 CLR A
0AA9 F0 MOVX @DPTR,A
0AAA D55EF8 DJNZ i,?C0008?IDE
0AAD ?C0009?IDE:
118:
119: // Place the fields that we need into the SCSI block
120: AUTOPTRL2 = LSB(EP8FIFOBUF+SCSI_INQUIRY_MANUFACTURER);
0AAD 759E08 MOV AUTOPTRL2,#08H
121: for (i = 0; i < SCSI_INQUIRY_MANUFACTURER_LEN; i++)
0AB0 E4 CLR A
0AB1 F55E MOV i,A
0AB3 ?C0011?IDE:
122: {
123: // swap bytes within words. This is stored backwards!
124: XAUTODAT2 = EP8FIFOBUF[(ATAPI_INQUIRY_MANUFACTURER * 2 + (i ^ 1)) + 256];
0AB3 E55E MOV A,i
0AB5 6401 XRL A,#01H
0AB7 2436 ADD A,#036H
0AB9 F582 MOV DPL,A
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 9
0ABB E4 CLR A
0ABC 34FD ADDC A,#0FDH
0ABE F583 MOV DPH,A
0AC0 E0 MOVX A,@DPTR
0AC1 90E67C MOV DPTR,#0E67CH
0AC4 F0 MOVX @DPTR,A
125: }
0AC5 055E INC i
0AC7 E55E MOV A,i
0AC9 B418E7 CJNE A,#018H,?C0011?IDE
0ACC ?C0012?IDE:
126:
127: EP8FIFOBUF[SCSI_INQUIRY_REVISION+1] = EP8FIFOBUF[(ATAPI_INQUIRY_REVISION * 2) + 256]+'0';
0ACC 90FD92 MOV DPTR,#0FD92H
0ACF E0 MOVX A,@DPTR
0AD0 2430 ADD A,#030H
0AD2 90FC21 MOV DPTR,#0FC21H
0AD5 F0 MOVX @DPTR,A
128: EP8FIFOBUF[SCSI_INQUIRY_REVISION+3] = EP8FIFOBUF[(ATAPI_INQUIRY_REVISION * 2 +2) + 256]+'0';
0AD6 90FD94 MOV DPTR,#0FD94H
0AD9 E0 MOVX A,@DPTR
0ADA 2430 ADD A,#030H
0ADC 90FC23 MOV DPTR,#0FC23H
0ADF F0 MOVX @DPTR,A
129: EP8FIFOBUF[SCSI_INQUIRY_REMOVABLE_BYTE] |= SCSI_INQUIRY_REMOVABLE_BIT & EP8FIFOBUF[(ATAPI_INQUIRY_REM
>> OVABLE_BYTE) + 256];
0AE0 90FC01 MOV DPTR,#0FC01H
0AE3 C083 PUSH DPH
0AE5 C082 PUSH DPL
0AE7 E0 MOVX A,@DPTR
0AE8 FF MOV R7,A
0AE9 90FD00 MOV DPTR,#0FD00H
0AEC E0 MOVX A,@DPTR
0AED 5480 ANL A,#080H
0AEF FE MOV R6,A
0AF0 EF MOV A,R7
0AF1 4E ORL A,R6
0AF2 D082 POP DPL
0AF4 D083 POP DPH
0AF6 F0 MOVX @DPTR,A
130: }
0AF7 ?C0007?IDE:
131:
132: EP8FIFOBUF[SCSI_INQUIRY_REVISION_LEN] = 0x1F;
0AF7 90FC04 MOV DPTR,#0FC04H
0AFA 741F MOV A,#01FH
0AFC F0 MOVX @DPTR,A
133: loadEP8BC(SCSI_IDENTIFY_LEN);
0AFD 7F2C MOV R7,#02CH
134: sensePtr = senseOk;
135: return(USBS_PASSED);
0AFF 8106 AJMP ?C0263?IDE
136: }
137:
138: case READ_06:
139: case READ_10:
140: case VERIFY_10:
0B01 ?C0017?IDE:
141: {
142: sensePtr = senseOk;
0B01 D11A ACALL ?L?COM0008
0B03 B5090A CJNE A,sensePtr+01H,?C0018?IDE
0B06 7407 MOV A,#HIGH senseOk
0B08 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));
0B0B AF5D MOV R7,cmd
0B0D 021087 LJMP _ideReadCommand
148: }
0B10 ?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);
0B10 8023 SJMP ?C0264?IDE
156: }
157: }
158:
159: case SEEK_10:
0B12 ?C0020?IDE:
160: {
161: sensePtr = senseOk;
0B12 D11A ACALL ?L?COM0008
0B14 6509 XRL A,sensePtr+01H
0B16 7004 JNZ ?C0241?IDE
0B18 7407 MOV A,#HIGH senseOk
0B1A 6508 XRL A,sensePtr
0B1C ?C0241?IDE:
0B1C 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 + -