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

📄 usbdisk.lst

📁 采用Atmeag162单片机来制作的U盘程序源码
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -