📄 fx2_ata_revc.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 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 + -