📄 usbdisk.lst
字号:
0654 0000 NOP
(0083) if((D12_DATA&D12_FULLEMPTY)==0)
0655 90207C00 LDS R2,0x7C00
0657 FC20 SBRC R2,0
0658 C002 RJMP 0x065B
(0084) return 0;
0659 2700 CLR R16
065A C056 RJMP 0x06B1
(0085) D12_COMMAND=(0x80+endp);
065B 2F80 MOV R24,R16
065C 5880 SUBI R24,0x80
065D 93807C01 STS 0x7C01,R24
(0086) cwait;
065F 0000 NOP
(0087) i=D12_DATA;
0660 91607C00 LDS R22,0x7C00
(0088) i=i&0x60;
0662 7660 ANDI R22,0x60
(0089) if(endp==2)
0663 3002 CPI R16,2
0664 F4A9 BNE 0x067A
(0090) {
(0091) if(i==0x60)
0665 3660 CPI R22,0x60
0666 F451 BNE 0x0671
(0092) bEPPflags.bits.ep1buf_full=1;
0667 9180035A LDS R24,_bEPPflags
0669 9190035B LDS R25,_bEPPflags+1
066B 6094 ORI R25,4
066C 9390035B STS _bEPPflags+1,R25
066E 9380035A STS _bEPPflags,R24
0670 C009 RJMP 0x067A
(0093) else
(0094) bEPPflags.bits.ep1buf_full=0;
0671 9180035A LDS R24,_bEPPflags
0673 9190035B LDS R25,_bEPPflags+1
0675 7F9B ANDI R25,0xFB
0676 9390035B STS _bEPPflags+1,R25
0678 9380035A STS _bEPPflags,R24
(0095) }
(0096) if(endp==4)
067A 3004 CPI R16,4
067B F4A9 BNE 0x0691
(0097) {
(0098) if(i==0x60)
067C 3660 CPI R22,0x60
067D F451 BNE 0x0688
(0099) bEPPflags.bits.mainbuf_full=1;
067E 9180035A LDS R24,_bEPPflags
0680 9190035B LDS R25,_bEPPflags+1
0682 6890 ORI R25,0x80
0683 9390035B STS _bEPPflags+1,R25
0685 9380035A STS _bEPPflags,R24
0687 C009 RJMP 0x0691
(0100) else
(0101) bEPPflags.bits.mainbuf_full=0;
0688 9180035A LDS R24,_bEPPflags
068A 9190035B LDS R25,_bEPPflags+1
068C 779F ANDI R25,0x7F
068D 9390035B STS _bEPPflags+1,R25
068F 9380035A STS _bEPPflags,R24
(0102) }
(0103) D12_COMMAND=0xF0;
0691 EF80 LDI R24,0xF0
0692 93807C01 STS 0x7C01,R24
(0104) cwait;
0694 0000 NOP
(0105) j=D12_DATA;
0695 91407C00 LDS R20,0x7C00
(0106) cwait1;
0697 0000 NOP
0698 0000 NOP
(0107) j=D12_DATA;
0699 91407C00 LDS R20,0x7C00
(0108) if(j>len)j=len;
069B 1724 CP R18,R20
069C F408 BCC 0x069E
069D 2F42 MOV R20,R18
(0109) for(i=0;i<j;i++)
069E 2766 CLR R22
069F C00A RJMP 0x06AA
(0110) {
(0111) *(buf+i)=D12_DATA;
06A0 2FE6 MOV R30,R22
06A1 27FF CLR R31
06A2 0DEA ADD R30,R10
06A3 1DFB ADC R31,R11
06A4 90207C00 LDS R2,0x7C00
06A6 8220 STD Z+0,R2
(0112) cwait1;
06A7 0000 NOP
06A8 0000 NOP
06A9 9563 INC R22
06AA 1764 CP R22,R20
06AB F3A0 BCS 0x06A0
(0113) }
(0114) D12_COMMAND=0xF2;
06AC EF82 LDI R24,0xF2
06AD 93807C01 STS 0x7C01,R24
(0115) cwait;
06AF 0000 NOP
(0116) return j;
06B0 2F04 MOV R16,R20
06B1 940E0ED4 CALL pop_gset3
06B3 9508 RET
_D12_WriteEndpoint:
i --> R20
buf --> R22
len --> R18
endp --> R16
06B4 940E0EF4 CALL push_gset2
06B6 816C LDD R22,Y+4
06B7 817D LDD R23,Y+5
(0117) }
(0118) unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len,
(0119) unsigned char * buf)
(0120) {
(0121) unsigned char i;
(0122) D12_COMMAND=endp;
06B8 93007C01 STS 0x7C01,R16
(0123) D12_DATA;
(0124) D12_COMMAND=0xF0;
06BA EF80 LDI R24,0xF0
06BB 93807C01 STS 0x7C01,R24
(0125) cwait;
06BD 0000 NOP
(0126) D12_DATA=0;
06BE 2422 CLR R2
06BF 92207C00 STS 0x7C00,R2
(0127) cwait1;
06C1 0000 NOP
06C2 0000 NOP
(0128) D12_DATA=len;
06C3 93207C00 STS 0x7C00,R18
(0129) for(i=0;i<len;i++)
06C5 2744 CLR R20
06C6 C00A RJMP 0x06D1
(0130) {
(0131) D12_DATA=*(buf+i);
06C7 2FE4 MOV R30,R20
06C8 27FF CLR R31
06C9 0FE6 ADD R30,R22
06CA 1FF7 ADC R31,R23
06CB 8020 LDD R2,Z+0
06CC 92207C00 STS 0x7C00,R2
(0132) cwait1;
06CE 0000 NOP
06CF 0000 NOP
06D0 9543 INC R20
06D1 1742 CP R20,R18
06D2 F3A0 BCS 0x06C7
(0133) }
(0134) D12_COMMAND=0xFA;
06D3 EF8A LDI R24,0xFA
06D4 93807C01 STS 0x7C01,R24
(0135) cwait;
06D6 0000 NOP
(0136) return len;
06D7 2F02 MOV R16,R18
06D8 940E0ED1 CALL pop_gset2
06DA 9508 RET
_D12_CWriteEndpoint:
i --> R20
buf --> R22
len --> R18
endp --> R16
06DB 940E0EF4 CALL push_gset2
06DD 816C LDD R22,Y+4
06DE 817D LDD R23,Y+5
(0137) }
(0138) unsigned char D12_CWriteEndpoint(unsigned char endp, unsigned char len,
(0139) const unsigned char * buf)
(0140) {
(0141) unsigned char i;
(0142) D12_COMMAND=endp;
06DF 93007C01 STS 0x7C01,R16
(0143) cwait;
06E1 0000 NOP
(0144) D12_DATA;
(0145) cwait;
06E2 0000 NOP
(0146) D12_COMMAND=0xF0;
06E3 EF80 LDI R24,0xF0
06E4 93807C01 STS 0x7C01,R24
(0147) cwait;
06E6 0000 NOP
(0148) D12_DATA=0;
06E7 2422 CLR R2
06E8 92207C00 STS 0x7C00,R2
(0149) cwait1;
06EA 0000 NOP
06EB 0000 NOP
(0150) D12_DATA=len;
06EC 93207C00 STS 0x7C00,R18
(0151) for(i=0;i<len;i++)
06EE 2744 CLR R20
06EF C00A RJMP 0x06FA
(0152) {
(0153) D12_DATA=*(buf+i);
06F0 2FE4 MOV R30,R20
06F1 27FF CLR R31
06F2 0FE6 ADD R30,R22
06F3 1FF7 ADC R31,R23
06F4 91E4 LPM R30,0(Z)
06F5 93E07C00 STS 0x7C00,R30
(0154) cwait1;
06F7 0000 NOP
06F8 0000 NOP
06F9 9543 INC R20
06FA 1742 CP R20,R18
06FB F3A0 BCS 0x06F0
(0155) }
(0156) D12_COMMAND=0xFA;
06FC EF8A LDI R24,0xFA
06FD 93807C01 STS 0x7C01,R24
(0157) return len;
06FF 2F02 MOV R16,R18
0700 940E0ED1 CALL pop_gset2
0702 9508 RET
(0158) }
(0159) void D12_AcknowledgeEndpoint(unsigned char endp)
(0160) {
(0161) D12_COMMAND=endp;
_D12_AcknowledgeEndpoint:
endp --> R16
0703 93007C01 STS 0x7C01,R16
(0162) cwait;
0705 0000 NOP
(0163) D12_COMMAND=0xF1;
0706 EF81 LDI R24,0xF1
0707 93807C01 STS 0x7C01,R24
(0164) if(endp==0)
0709 2300 TST R16
070A F419 BNE 0x070E
(0165) D12_COMMAND=0xF2;
070B EF82 LDI R24,0xF2
070C 93807C01 STS 0x7C01,R24
(0166) }
070E 9508 RET
FILE: D:\AvrUSB\Flash.c
(0001) #include <iom161v.h>
(0002) #include <macros.h>
(0003) #include "Flash.h"
(0004) extern unsigned char PageBuf[512];
(0005)
(0006) const unsigned char Fat16_Bpb[512]={
(0007) 0xEB,0x03,0x90,'M','S','W','I','N','4','.','1',0,2,1,1,
(0008) 0,2,0,2,0,0xfc,0xf8,0xfa,0,0x3f,0,0xff,0,0,0,0,0,0,0,0,0,//35
(0009) 0,0,0x29,'1','2','3','4',
(0010) 'Y','U','X','K','-','M','A','S','S','-','1',
(0011) 'F','A','T','1','6',0,0,0,//61
(0012) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0013) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0014) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0015) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0016) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0017) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0018) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0019) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0020) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0021) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0022) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0023) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0024) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0025) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0026) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
(0027) 0x55,0xAA//unsigned char ExecutableMarker[2]
(0028) };
(0029) void Flash_Reset(void)
(0030) {
(0031) FC_CMD=RESET;
_Flash_Reset:
070F EF8F LDI R24,0xFF
0710 9380A000 STS 0xA000,R24
(0032) asm("nop \n nop");
0712 0000 NOP
0713 0000 NOP
(0033) WAITRB;
0714 9B84 SBIS 0x10,4
0715 CFFE RJMP 0x0714
(0034) }
0716 9508 RET
(0035) unsigned int Check_Flash_Id(void)
(0036) {
(0037) unsigned int id;
(0038) FC_CMD=READID;
_Check_Flash_Id:
id --> R16
0717 E980 LDI R24,0x90
0718 9380A000 STS 0xA000,R24
(0039) FC_ADDR=READ0;
071A 2422 CLR R2
071B 92209000 STS 0x9000,R2
(0040) id=FC_DATA<<8;
071D 91008000 LDS R16,0x8000
071F 2711 CLR R17
0720 2F10 MOV R17,R16
0721 2700 CLR R16
(0041) id+=FC_DATA;
0722 90208000 LDS R2,0x8000
0724 2433 CLR R3
0725 0D02 ADD R16,R2
0726 1D13 ADC R17,R3
(0042) FC_INACTIVE
0727 9360FC01 STS 0xFC01,R22
(0043) return id;
0729 9508 RET
_Erase_Cluster:
v --> R20
blockPage --> R20
cluster --> R20
072A 940E0EDD CALL push_gset1
072C 01A8 MOVW R20,R16
(0044) }
(0045) BOOL Erase_Cluster(unsigned int cluster)
(0046) {
(0047) unsigned char v;
(0048) unsigned int blockPage=cluster*32;
072D E200 LDI R16,0x20
072E E010 LDI R17,0
072F 019A MOVW R18,R20
0730 940E0E91 CALL empy16s
0732 01A8 MOVW R20,R16
(0049) fWPs;
0733 9A95 SBI 0x12,5
(0050) FC_CMD=BLOCK_ERASE_1C;
0734 E680 LDI R24,0x60
0735 9380A000 STS 0xA000,R24
(0051) FC_ADDR=blockPage%256;
0737 01CA MOVW R24,R20
0738 7090 ANDI R25,0
0739 93809000 STS 0x9000,R24
(0052) FC_ADDR=blockPage/256;
073B 011A MOVW R2,R20
073C 2C23 MOV R2,R3
073D 2433 CLR R3
073E 92209000 STS 0x9000,R2
(0053) FC_CMD=BLOCK_ERASE_2C;
0740 ED80 LDI R24,0xD0
0741 9380A000 STS 0xA000,R24
(0054) asm("nop \n nop");
0743 0000 NOP
0744 0000 NOP
(0055) WAITRB;
0745 9B84 SBIS 0x10,4
0746 CFFE RJMP 0x0745
(0056) FC_CMD=READSTATUS;
0747 E780 LDI R24,0x70
0748 9380A000 STS 0xA000,R24
(0057) v=FC_DATA;
074A 91408000 LDS R20,0x8000
(0058) FC_INACTIVE
074C 9360FC01 STS 0xFC01,R22
(0059) fWPc;
074E 9895 CBI 0x12,5
(0060) if(v&0x01)
074F FF40 SBRS R20,0
0750 C002 RJMP 0x0753
(0061) return FALSE;
0751 2700 CLR R16
0752 C001 RJMP 0x0754
(0062) return TRUE;
0753 E001 LDI R16,1
0754 940E0EE0 CALL pop_gset1
0756 9508 RET
_ReadPage:
blockPage --> R10
i --> R20
pPage --> R22
page --> R10
block --> R12
0757 940E0EFC CALL push_gset4
0759 0159 MOVW R10,R18
075A 0168 MOVW R12,R16
075B 8568 LDD R22,Y+8
075C 8579 LDD R23,Y+9
(0063) }
(0064)
(0065) void ReadPage(unsigned int block,unsigned int page,unsigned char *pPage)
(0066) {
(0067) unsigned int i=512;
075D E040 LDI R20,0
075E E052 LDI R21,2
(0068) unsigned int blockPage=block*32+page;
075F E200 LDI R16,0x20
0760 E010 LDI R17,0
0761 0196 MOVW R18,R12
0762 940E0E91 CALL empy16s
0764 0118 MOVW R2,R16
0765 0C2A ADD R2,R10
0766 1C3B ADC R3,R11
0767 0151 MOVW R10,R2
(0069) FC_CMD=READ0;
0768 2422 CLR R2
0769 9220A000 STS 0xA000,R2
(0070) FC_ADDR=0x00;
076B 92209000 STS 0x9000,R2
(0071) FC_ADDR=blockPage%256;
076D 01C5 MOVW R24,R10
076E 7090 ANDI R25,0
076F 93809000 STS 0x9000,R24
(0072) FC_ADDR=blockPage/256;
0771 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -