📄 usbdisk.lst
字号:
__start:
__text_start:
01A0 EFCF LDI R28,0xFF
01A1 E0D4 LDI R29,4
01A2 BFCD OUT 0x3D,R28
01A3 BFDE OUT 0x3E,R29
01A4 51C0 SUBI R28,0x10
01A5 40D0 SBCI R29,0
01A6 EA0A LDI R16,0xAA
01A7 8308 STD Y+0,R16
01A8 2400 CLR R0
01A9 E4E0 LDI R30,0x40
01AA E0F1 LDI R31,1
01AB E013 LDI R17,3
01AC 39E4 CPI R30,0x94
01AD 07F1 CPC R31,R17
01AE F011 BEQ 0x01B1
01AF 9201 ST R0,Z+
01B0 CFFB RJMP 0x01AC
01B1 8300 STD Z+0,R16
01B2 E0E0 LDI R30,0
01B3 E0F3 LDI R31,3
01B4 E0A0 LDI R26,0
01B5 E0B1 LDI R27,1
01B6 E013 LDI R17,3
01B7 34E0 CPI R30,0x40
01B8 07F1 CPC R31,R17
01B9 F021 BEQ 0x01BE
01BA 95C8 LPM
01BB 9631 ADIW R30,1
01BC 920D ST R0,X+
01BD CFF9 RJMP 0x01B7
01BE 940E0CFD CALL _main
_exit:
01C0 CFFF RJMP _exit
_RBC_Hander:
result --> R20
01C1 940E0EF4 CALL push_gset2
FILE: D:\AvrUSB\SCSI.C
(0001) #include <iom162v.h>
(0002) #include <macros.h>
(0003) #include "SCSI.H"
(0004) #include "SCSIDef.H"
(0005) #include "BulkOnly.H"
(0006) #include "MAIN.H"
(0007)
(0008) #include "Fat.h"
(0009)
(0010)
(0011) extern BULK_STRUCT Bulk_Block;
(0012) extern CONTROL_XFER ControlData;
(0013) extern EPPFLAGS bEPPflags;
(0014) BULK_CONTROL Bulk_Control_r;
(0015) BULK_CONTROL Bulk_Control_w;
(0016) unsigned char PageBuf[512];
(0017)
(0018) #define CBW_bCBWCBLength Bulk_Block.cbw.dCBWDataTransferLength
(0019)
(0020) const STD_INQUIRY_DATA inquiryData={
(0021) 0,//unsigned DeviceType :5;
(0022) 0,//unsigned Reserved0 :3;
(0023) 0,//unsigned Reserved1 :7;
(0024) 1,//unsigned RemovableMedia :1;
(0025) 2,//unsigned char Reserved2;
(0026) 2,//unsigned Reserved3 :5;
(0027) 0,//unsigned NormACA :1;
(0028) 0,//unsigned Obsolete0 :1;
(0029) 0,//unsigned AERC :1;
(0030) 0x1f,0,0,//unsigned char Reserved4[3];
(0031) 0,//unsigned SoftReset :1;
(0032) 0,//unsigned CommandQueue :1;
(0033) 0,//unsigned Reserved5 :1;
(0034) 0,//unsigned LinkedCommands :1;
(0035) 0,//unsigned Synchronous :1;
(0036) 0,//unsigned Wide16Bit :1;
(0037) 0,//unsigned Wide32Bit :1;
(0038) 0,//unsigned RelativeAddressing :1;
(0039) 'Y','U','X','K', //VendorInformation[8];
(0040) '2','0','0','5',
(0041) 'U','S','B','-', //ProductInformation[16];
(0042) 'M','A','S','S',
(0043) '-','S','T','O',
(0044) 'R','A','G','E',
(0045) '0','.','0','0', //ProductReisionLevel[4];
(0046) };
(0047)
(0048) const MODE_DATA ModeData={
(0049) 3,//unsigned char OperationCode;
(0050) 0,//unsigned char Reserved0;
(0051) 0,//unsigned Reserved1 :7;
(0052) 0,//unsigned WP :1;
(0053) 0 //unsigned char Reserved2;
(0054) };
(0055) const READ_CAPACITY_DATA ReadCapacityData={
(0056) 0,0,0xfb,0xff,//unsigned char LogicalBlockAddress[4];
(0057) 0,0,0x02,0//unsigned char LogicalLength[4];
(0058) };
(0059) #define CAPACITY_LIST_LENGTH sizeof(CAPACITYLIST_HEAD)+sizeof(CM_FORMAT_CAPACITY_DATA)
(0060) const CAPACITYLIST_HEAD CapacitylistHead={
(0061) 0,0,0,//unsigned char Reserved0[3];
(0062) sizeof(CM_FORMAT_CAPACITY_DATA) //unsigned char CapacityLength;
(0063) };
(0064) const CM_FORMAT_CAPACITY_DATA CMFormatCapacityData={
(0065) 0,0x10,0,0,//unsigned char LogicalBlockAddress[4];
(0066) 3, //unsigned DescriptorCode :2;
(0067) 0, //unsigned Reserved0 :6;
(0068) 0,2,0 //unsigned char LogicalLength[3];
(0069) };
(0070)
(0071)
(0072) BOOLEAN RBC_Hander(void)
(0073) {
(0074) #define cdbGeneric Bulk_Block.cbw.CBWCB.RbcCdb_Generic
(0075)
(0076) BOOLEAN result=FALSE;
01C3 2744 CLR R20
(0077) ControlData.wLength=0;
01C4 2422 CLR R2
01C5 2433 CLR R3
01C6 92300366 STS 0x366,R3
01C8 92200365 STS 0x365,R2
(0078) switch(cdbGeneric.OperationCode)
01CA 91600384 LDS R22,0x384
01CC 2777 CLR R23
01CD 316A CPI R22,0x1A
01CE E0E0 LDI R30,0
01CF 077E CPC R23,R30
01D0 F409 BNE 0x01D2
01D1 C03B RJMP 0x020D
01D2 E18A LDI R24,0x1A
01D3 E090 LDI R25,0
01D4 1786 CP R24,R22
01D5 0797 CPC R25,R23
01D6 F0A4 BLT 0x01EB
01D7 3162 CPI R22,0x12
01D8 E0E0 LDI R30,0
01D9 077E CPC R23,R30
01DA F179 BEQ 0x020A
01DB E182 LDI R24,0x12
01DC E090 LDI R25,0
01DD 1786 CP R24,R22
01DE 0797 CPC R25,R23
01DF F02C BLT 0x01E5
01E0 3060 CPI R22,0
01E1 0767 CPC R22,R23
01E2 F409 BNE 0x01E4
01E3 C035 RJMP 0x0219
01E4 C040 RJMP 0x0225
01E5 3166 CPI R22,0x16
01E6 E0E0 LDI R30,0
01E7 077E CPC R23,R30
01E8 F409 BNE 0x01EA
01E9 C03B RJMP 0x0225
01EA C03A RJMP 0x0225
01EB 3263 CPI R22,0x23
01EC E0E0 LDI R30,0
01ED 077E CPC R23,R30
01EE F139 BEQ 0x0216
01EF 3265 CPI R22,0x25
01F0 E0E0 LDI R30,0
01F1 077E CPC R23,R30
01F2 F101 BEQ 0x0213
01F3 3268 CPI R22,0x28
01F4 E0E0 LDI R30,0
01F5 077E CPC R23,R30
01F6 F0C9 BEQ 0x0210
01F7 326A CPI R22,0x2A
01F8 E0E0 LDI R30,0
01F9 077E CPC R23,R30
01FA F121 BEQ 0x021F
01FB E28A LDI R24,0x2A
01FC E090 LDI R25,0
01FD 1786 CP R24,R22
01FE 0797 CPC R25,R23
01FF F02C BLT 0x0205
0200 316E CPI R22,0x1E
0201 E0E0 LDI R30,0
0202 077E CPC R23,R30
0203 F0F1 BEQ 0x0222
0204 C020 RJMP 0x0225
0205 326F CPI R22,0x2F
0206 E0E0 LDI R30,0
0207 077E CPC R23,R30
0208 F099 BEQ 0x021C
0209 C01B RJMP 0x0225
(0079) {
(0080) case SPC_CMD_INQUIRY:
(0081) result=SPC_InQuiry();
020A D020 RCALL _SPC_InQuiry
020B 2F40 MOV R20,R16
(0082) break;
020C C01A RJMP 0x0227
(0083) case SPC_CMD_MODESENSE6:
(0084) result=SPC_ModeSense();
020D D025 RCALL _SPC_ModeSense
020E 2F40 MOV R20,R16
(0085) break;
020F C017 RJMP 0x0227
(0086) case RBC_CMD_READ10:
(0087) result=RBC_Read10();
0210 D02A RCALL _RBC_Read10
0211 2F40 MOV R20,R16
(0088) break;
0212 C014 RJMP 0x0227
(0089) case RBC_CMD_READCAPACITY:
(0090) result=RBC_ReadCapacity();
0213 D0F7 RCALL _RBC_ReadCapacity
0214 2F40 MOV R20,R16
(0091) break;
0215 C011 RJMP 0x0227
(0092) case SPC_CMD_FORMAT_CAPACITY:
(0093) result=SPC_FormatCapacity();
0216 D0FC RCALL _SPC_FormatCapacity
0217 2F40 MOV R20,R16
(0094) break;
0218 C00E RJMP 0x0227
(0095) case SPC_CMD_TESTUNITREADY:
(0096) result=SPC_TestUnit();
0219 D101 RCALL _SPC_TestUnit
021A 2F40 MOV R20,R16
(0097) break;
021B C00B RJMP 0x0227
(0098) case RBC_CMD_VERIFY10:
(0099) result=RBC_Verify10();
021C D107 RCALL _RBC_Verify10
021D 2F40 MOV R20,R16
(0100) break;
021E C008 RJMP 0x0227
(0101) case RBC_CMD_WRITE10:
(0102) result=RBC_Write10();
021F D10D RCALL _RBC_Write10
0220 2F40 MOV R20,R16
(0103) break;
0221 C005 RJMP 0x0227
(0104) case SPC_CMD_PRVENTALLOWMEDIUMREMOVAL:
(0105) result=SPC_LockMedia();
0222 D24B RCALL _SPC_LockMedia
0223 2F40 MOV R20,R16
(0106) break;
0224 C002 RJMP 0x0227
(0107) case SPC_CMD_RESERVE6:
(0108) default:
(0109) result=SPC_Reserve6();
0225 D251 RCALL _SPC_Reserve6
0226 2F40 MOV R20,R16
(0110) break;
(0111) }
(0112) return result;
0227 2F04 MOV R16,R20
0228 940E0ED1 CALL pop_gset2
022A 9508 RET
(0113) #undef cdbGeneric
(0114) }
(0115) BOOLEAN SPC_InQuiry(void)
(0116) {
(0117) Bulk_code_transmit((const unsigned char*)&inquiryData,
_SPC_InQuiry:
022B E224 LDI R18,0x24
022C E030 LDI R19,0
022D E804 LDI R16,0x84
022E E010 LDI R17,0
022F 940E0D6A CALL _Bulk_code_transmit
(0118) sizeof(STD_INQUIRY_DATA));
(0119) return TRUE;
0231 E001 LDI R16,1
0232 9508 RET
(0120) }
(0121) BOOLEAN SPC_ModeSense(void)
(0122) {
(0123) Bulk_code_transmit((const unsigned char*)&ModeData,
_SPC_ModeSense:
0233 E024 LDI R18,4
0234 E030 LDI R19,0
0235 EA08 LDI R16,0xA8
0236 E010 LDI R17,0
0237 940E0D6A CALL _Bulk_code_transmit
(0124) sizeof(MODE_DATA));
(0125) return TRUE;
0239 E001 LDI R16,1
023A 9508 RET
_RBC_Read10:
Logical_Block_Address --> Y+2
023B 940E0EF4 CALL push_gset2
023D 9726 SBIW R28,6
(0126) }
(0127) BOOLEAN RBC_Read10(void)
(0128) {
(0129) #define cdbRead10 Bulk_Block.cbw.CBWCB.RbcCdb_Read10
(0130) unsigned long Logical_Block_Address;
(0131) Logical_Block_Address=cdbRead10.LogicalBlockAddress[0]*0x1000000;
023E 90200386 LDS R2,0x386
0240 2433 CLR R3
0241 2444 CLR R4
0242 2455 CLR R5
0243 E040 LDI R20,0
0244 E050 LDI R21,0
0245 E060 LDI R22,0
0246 E071 LDI R23,1
0247 925A ST R5,-Y
0248 924A ST R4,-Y
0249 923A ST R3,-Y
024A 922A ST R2,-Y
024B 018A MOVW R16,R20
024C 019B MOVW R18,R22
024D 940E0EA1 CALL empy32u
024F 01FE MOVW R30,R28
0250 8302 STD Z+2,R16
0251 8313 STD Z+3,R17
0252 8324 STD Z+4,R18
0253 8335 STD Z+5,R19
(0132) Logical_Block_Address+=cdbRead10.LogicalBlockAddress[1]*0x10000;
0254 90200387 LDS R2,0x387
0256 2433 CLR R3
0257 2444 CLR R4
0258 2455 CLR R5
0259 E040 LDI R20,0
025A E050 LDI R21,0
025B E061 LDI R22,1
025C E070 LDI R23,0
025D 925A ST R5,-Y
025E 924A ST R4,-Y
025F 923A ST R3,-Y
0260 922A ST R2,-Y
0261 018A MOVW R16,R20
0262 019B MOVW R18,R22
0263 940E0EA1 CALL empy32u
0265 01FE MOVW R30,R28
0266 8022 LDD R2,Z+2
0267 8033 LDD R3,Z+3
0268 8044 LDD R4,Z+4
0269 8055 LDD R5,Z+5
026A 0E20 ADD R2,R16
026B 1E31 ADC R3,R17
026C 1E42 ADC R4,R18
026D 1E53 ADC R5,R19
026E 01FE MOVW R30,R28
026F 8222 STD Z+2,R2
0270 8233 STD Z+3,R3
0271 8244 STD Z+4,R4
0272 8255 STD Z+5,R5
(0133) Logical_Block_Address+=cdbRead10.LogicalBlockAddress[2]*0x100;
0273 91200388 LDS R18,0x388
0275 2733 CLR R19
0276 E000 LDI R16,0
0277 E011 LDI R17,1
0278 940E0E91 CALL empy16s
027A 0118 MOVW R2,R16
027B 2444 CLR R4
027C FC37 SBRC R3,7
027D 9440 COM R4
027E 2455 CLR R5
027F FC47 SBRC R4,7
0280 9450 COM R5
0281 01FE MOVW R30,R28
0282 8062 LDD R6,Z+2
0283 8073 LDD R7,Z+3
0284 8084 LDD R8,Z+4
0285 8095 LDD R9,Z+5
0286 0C62 ADD R6,R2
0287 1C73 ADC R7,R3
0288 1C84 ADC R8,R4
0289 1C95 ADC R9,R5
028A 01FE MOVW R30,R28
028B 8262 STD Z+2,R6
028C 8273 STD Z+3,R7
028D 8284 STD Z+4,R8
028E 8295 STD Z+5,R9
(0134) Logical_Block_Address+=cdbRead10.LogicalBlockAddress[3];
028F 90200389 LDS R2,0x389
0291 2433 CLR R3
0292 2444 CLR R4
0293 2455 CLR R5
0294 01FE MOVW R30,R28
0295 8062 LDD R6,Z+2
0296 8073 LDD R7,Z+3
0297 8084 LDD R8,Z+4
0298 8095 LDD R9,Z+5
0299 0C62 ADD R6,R2
029A 1C73 ADC R7,R3
029B 1C84 ADC R8,R4
029C 1C95 ADC R9,R5
029D 01FE MOVW R30,R28
029E 8262 STD Z+2,R6
029F 8273 STD Z+3,R7
02A0 8284 STD Z+4,R8
02A1 8295 STD Z+5,R9
(0135) Bulk_Control_r.Transfer_Length=cdbRead10.TransferLength[0]*256+cdbRead10.TransferLength[1];
02A2 9120038B LDS R18,0x38B
02A4 2733 CLR R19
02A5 E000 LDI R16,0
02A6 E011 LDI R17,1
02A7 940E0E91 CALL empy16s
02A9 0118 MOVW R2,R16
02AA 9040038C LDS R4,0x38C
02AC 2455 CLR R5
02AD 0C24 ADD R2,R4
02AE 1C35 ADC R3,R5
02AF 9230034B STS _Bulk_Control_r+1,R3
02B1 9220034A STS _Bulk_Control_r,R2
(0136) Bulk_Control_r.CurrentPage=Logical_Block_Address%0x20;
02B3 E14F LDI R20,0x1F
02B4 E050 LDI R21,0
02B5 E060 LDI R22,0
02B6 E070 LDI R23,0
02B7 01FE MOVW R30,R28
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -