📄 usbdisk.lst
字号:
(0079) {
(0080) unsigned char i,j;
(0081) D12_COMMAND=endp;
0654 93007C01 STS 0x7C01,R16
(0082) cwait;
0656 0000 NOP
(0083) if((D12_DATA&D12_FULLEMPTY)==0)
0657 90207C00 LDS R2,0x7C00
0659 FC20 SBRC R2,0
065A C002 RJMP 0x065D
(0084) return 0;
065B 2700 CLR R16
065C C056 RJMP 0x06B3
(0085) D12_COMMAND=(0x80+endp);
065D 2F80 MOV R24,R16
065E 5880 SUBI R24,0x80
065F 93807C01 STS 0x7C01,R24
(0086) cwait;
0661 0000 NOP
(0087) i=D12_DATA;
0662 91607C00 LDS R22,0x7C00
(0088) i=i&0x60;
0664 7660 ANDI R22,0x60
(0089) if(endp==2)
0665 3002 CPI R16,2
0666 F4A9 BNE 0x067C
(0090) {
(0091) if(i==0x60)
0667 3660 CPI R22,0x60
0668 F451 BNE 0x0673
(0092) bEPPflags.bits.ep1buf_full=1;
0669 9180035A LDS R24,bEPPflags
066B 9190035B LDS R25,bEPPflags+1
066D 6094 ORI R25,4
066E 9390035B STS bEPPflags+1,R25
0670 9380035A STS bEPPflags,R24
0672 C009 RJMP 0x067C
(0093) else
(0094) bEPPflags.bits.ep1buf_full=0;
0673 9180035A LDS R24,bEPPflags
0675 9190035B LDS R25,bEPPflags+1
0677 7F9B ANDI R25,0xFB
0678 9390035B STS bEPPflags+1,R25
067A 9380035A STS bEPPflags,R24
(0095) }
(0096) if(endp==4)
067C 3004 CPI R16,4
067D F4A9 BNE 0x0693
(0097) {
(0098) if(i==0x60)
067E 3660 CPI R22,0x60
067F F451 BNE 0x068A
(0099) bEPPflags.bits.mainbuf_full=1;
0680 9180035A LDS R24,bEPPflags
0682 9190035B LDS R25,bEPPflags+1
0684 6890 ORI R25,0x80
0685 9390035B STS bEPPflags+1,R25
0687 9380035A STS bEPPflags,R24
0689 C009 RJMP 0x0693
(0100) else
(0101) bEPPflags.bits.mainbuf_full=0;
068A 9180035A LDS R24,bEPPflags
068C 9190035B LDS R25,bEPPflags+1
068E 779F ANDI R25,0x7F
068F 9390035B STS bEPPflags+1,R25
0691 9380035A STS bEPPflags,R24
(0102) }
(0103) D12_COMMAND=0xF0;
0693 EF80 LDI R24,0xF0
0694 93807C01 STS 0x7C01,R24
(0104) cwait;
0696 0000 NOP
(0105) j=D12_DATA;
0697 91407C00 LDS R20,0x7C00
(0106) cwait1;
0699 0000 NOP
069A 0000 NOP
(0107) j=D12_DATA;
069B 91407C00 LDS R20,0x7C00
(0108) if(j>len)j=len;
069D 1724 CP R18,R20
069E F408 BCC 0x06A0
069F 2F42 MOV R20,R18
(0109) for(i=0;i<j;i++)
06A0 2766 CLR R22
06A1 C00A RJMP 0x06AC
(0110) {
(0111) *(buf+i)=D12_DATA;
06A2 2FE6 MOV R30,R22
06A3 27FF CLR R31
06A4 0DEA ADD R30,R10
06A5 1DFB ADC R31,R11
06A6 90207C00 LDS R2,0x7C00
06A8 8220 STD Z+0,R2
(0112) cwait1;
06A9 0000 NOP
06AA 0000 NOP
06AB 9563 INC R22
06AC 1764 CP R22,R20
06AD F3A0 BCS 0x06A2
(0113) }
(0114) D12_COMMAND=0xF2;
06AE EF82 LDI R24,0xF2
06AF 93807C01 STS 0x7C01,R24
(0115) cwait;
06B1 0000 NOP
(0116) return j;
06B2 2F04 MOV R16,R20
06B3 940E0EDD CALL pop_gset3
06B5 9508 RET
_D12_WriteEndpoint:
i --> R20
buf --> R22
len --> R18
endp --> R16
06B6 940E0EEC CALL push_gset2
06B8 816C LDD R22,Y+4
06B9 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;
06BA 93007C01 STS 0x7C01,R16
(0123) D12_DATA;
(0124) D12_COMMAND=0xF0;
06BC EF80 LDI R24,0xF0
06BD 93807C01 STS 0x7C01,R24
(0125) cwait;
06BF 0000 NOP
(0126) D12_DATA=0;
06C0 2422 CLR R2
06C1 92207C00 STS 0x7C00,R2
(0127) cwait1;
06C3 0000 NOP
06C4 0000 NOP
(0128) D12_DATA=len;
06C5 93207C00 STS 0x7C00,R18
(0129) for(i=0;i<len;i++)
06C7 2744 CLR R20
06C8 C00A RJMP 0x06D3
(0130) {
(0131) D12_DATA=*(buf+i);
06C9 2FE4 MOV R30,R20
06CA 27FF CLR R31
06CB 0FE6 ADD R30,R22
06CC 1FF7 ADC R31,R23
06CD 8020 LDD R2,Z+0
06CE 92207C00 STS 0x7C00,R2
(0132) cwait1;
06D0 0000 NOP
06D1 0000 NOP
06D2 9543 INC R20
06D3 1742 CP R20,R18
06D4 F3A0 BCS 0x06C9
(0133) }
(0134) D12_COMMAND=0xFA;
06D5 EF8A LDI R24,0xFA
06D6 93807C01 STS 0x7C01,R24
(0135) cwait;
06D8 0000 NOP
(0136) return len;
06D9 2F02 MOV R16,R18
06DA 940E0EDA CALL pop_gset2
06DC 9508 RET
_D12_CWriteEndpoint:
i --> R20
buf --> R22
len --> R18
endp --> R16
06DD 940E0EEC CALL push_gset2
06DF 816C LDD R22,Y+4
06E0 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;
06E1 93007C01 STS 0x7C01,R16
(0143) cwait;
06E3 0000 NOP
(0144) D12_DATA;
(0145) cwait;
06E4 0000 NOP
(0146) D12_COMMAND=0xF0;
06E5 EF80 LDI R24,0xF0
06E6 93807C01 STS 0x7C01,R24
(0147) cwait;
06E8 0000 NOP
(0148) D12_DATA=0;
06E9 2422 CLR R2
06EA 92207C00 STS 0x7C00,R2
(0149) cwait1;
06EC 0000 NOP
06ED 0000 NOP
(0150) D12_DATA=len;
06EE 93207C00 STS 0x7C00,R18
(0151) for(i=0;i<len;i++)
06F0 2744 CLR R20
06F1 C00A RJMP 0x06FC
(0152) {
(0153) D12_DATA=*(buf+i);
06F2 2FE4 MOV R30,R20
06F3 27FF CLR R31
06F4 0FE6 ADD R30,R22
06F5 1FF7 ADC R31,R23
06F6 91E4 LPM R30,0(Z)
06F7 93E07C00 STS 0x7C00,R30
(0154) cwait1;
06F9 0000 NOP
06FA 0000 NOP
06FB 9543 INC R20
06FC 1742 CP R20,R18
06FD F3A0 BCS 0x06F2
(0155) }
(0156) D12_COMMAND=0xFA;
06FE EF8A LDI R24,0xFA
06FF 93807C01 STS 0x7C01,R24
(0157) return len;
0701 2F02 MOV R16,R18
0702 940E0EDA CALL pop_gset2
0704 9508 RET
(0158) }
(0159) void D12_AcknowledgeEndpoint(unsigned char endp)
(0160) {
(0161) D12_COMMAND=endp;
_D12_AcknowledgeEndpoint:
endp --> R16
0705 93007C01 STS 0x7C01,R16
(0162) cwait;
0707 0000 NOP
(0163) D12_COMMAND=0xF1;
0708 EF81 LDI R24,0xF1
0709 93807C01 STS 0x7C01,R24
(0164) if(endp==0)
070B 2300 TST R16
070C F419 BNE 0x0710
(0165) D12_COMMAND=0xF2;
070D EF82 LDI R24,0xF2
070E 93807C01 STS 0x7C01,R24
0710 9508 RET
FILE: J:\PDIUSBD12-Materials\富昌\优盘5.0\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:
0711 EF8F LDI R24,0xFF
0712 9380A000 STS 0xA000,R24
(0032) asm("nop \n nop");
0714 0000 NOP
0715 0000 NOP
(0033) WAITRB;
0716 9B84 SBIS 0x10,4
0717 CFFE RJMP 0x0716
0718 9508 RET
(0034) }
(0035) unsigned int Check_Flash_Id(void)
(0036) {
(0037) unsigned int id;
(0038) FC_CMD=READID;
_Check_Flash_Id:
id --> R16
0719 E980 LDI R24,0x90
071A 9380A000 STS 0xA000,R24
(0039) FC_ADDR=READ0;
071C 2422 CLR R2
071D 92209000 STS 0x9000,R2
(0040) id=FC_DATA<<8;
071F 91008000 LDS R16,0x8000
0721 2711 CLR R17
0722 2F10 MOV R17,R16
0723 2700 CLR R16
(0041) id+=FC_DATA;
0724 90208000 LDS R2,0x8000
0726 2433 CLR R3
0727 0D02 ADD R16,R2
0728 1D13 ADC R17,R3
(0042) FC_INACTIVE
0729 9360FC01 STS 0xFC01,R22
(0043) return id;
072B 9508 RET
_Erase_Cluster:
v --> R20
blockPage --> R20
cluster --> R20
072C 940E0EEE CALL push_gset1
072E 01A8 MOVW R20,R16
(0044) }
(0045) BOOL Erase_Cluster(unsigned int cluster)
(0046) {
(0047) unsigned char v;
(0048) unsigned int blockPage=cluster*32;
072F E200 LDI R16,0x20
0730 E010 LDI R17,0
0731 019A MOVW R18,R20
0732 940E0E9A CALL empy16s
0734 01A8 MOVW R20,R16
(0049) fWPs;
0735 9A95 SBI 0x12,5
(0050) FC_CMD=BLOCK_ERASE_1C;
0736 E680 LDI R24,0x60
0737 9380A000 STS 0xA000,R24
(0051) FC_ADDR=blockPage%256;
0739 01CA MOVW R24,R20
073A 7090 ANDI R25,0
073B 93809000 STS 0x9000,R24
(0052) FC_ADDR=blockPage/256;
073D 011A MOVW R2,R20
073E 2C23 MOV R2,R3
073F 2433 CLR R3
0740 92209000 STS 0x9000,R2
(0053) FC_CMD=BLOCK_ERASE_2C;
0742 ED80 LDI R24,0xD0
0743 9380A000 STS 0xA000,R24
(0054) asm("nop \n nop");
0745 0000 NOP
0746 0000 NOP
(0055) WAITRB;
0747 9B84 SBIS 0x10,4
0748 CFFE RJMP 0x0747
(0056) FC_CMD=READSTATUS;
0749 E780 LDI R24,0x70
074A 9380A000 STS 0xA000,R24
(0057) v=FC_DATA;
074C 91408000 LDS R20,0x8000
(0058) FC_INACTIVE
074E 9360FC01 STS 0xFC01,R22
(0059) fWPc;
0750 9895 CBI 0x12,5
(0060) if(v&0x01)
0751 FF40 SBRS R20,0
0752 C002 RJMP 0x0755
(0061) return FALSE;
0753 2700 CLR R16
0754 C001 RJMP 0x0756
(0062) return TRUE;
0755 E001 LDI R16,1
0756 940E0EF1 CALL pop_gset1
0758 9508 RET
_ReadPage:
blockPage --> R10
i --> R20
pPage --> R22
page --> R10
block --> R12
0759 940E0EE8 CALL push_gset4
075B 0159 MOVW R10,R18
075C 0168 MOVW R12,R16
075D 8568 LDD R22,Y+8
075E 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;
075F E040 LDI R20,0
0760 E052 LDI R21,2
(0068) unsigned int blockPage=block*32+page;
0761 E200 LDI R16,0x20
0762 E010 LDI R17,0
0763 0196 MOVW R18,R12
0764 940E0E9A CALL empy16s
0766 0118 MOVW R2,R16
0767 0C2A ADD R2,R10
0768 1C3B ADC R3,R11
0769 0151 MOVW R10,R2
(0069) FC_CMD=READ0;
076A 2422 CLR R2
076B 9220A000 STS 0xA000,R2
(0070) FC_ADDR=0x00;
076D 92209000 STS 0x9000,R2
(0071) FC_ADDR=blockPage%25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -