📄 sd.lst
字号:
0DCD 926002BE STS FirstFATSector,R6
0DCF 929002C1 STS FirstFATSector+3,R9
0DD1 928002C0 STS FirstFATSector+2,R8
(0084) //查询SD卡文件系统分区类型
(0085) switch (PartInfo.prPartType)
0DD3 90C002CF LDS R12,0x2CF
0DD5 24DD CLR R13
0DD6 01C6 MOVW R24,R12
0DD7 3084 CPI R24,4
0DD8 E0E0 LDI R30,0
0DD9 079E CPC R25,R30
0DDA F0B1 BEQ 0x0DF1
0DDB 3086 CPI R24,6
0DDC E0E0 LDI R30,0
0DDD 079E CPC R25,R30
0DDE F091 BEQ 0x0DF1
0DDF 3084 CPI R24,4
0DE0 E0E0 LDI R30,0
0DE1 079E CPC R25,R30
0DE2 F174 BLT 0x0E11
0DE3 01C6 MOVW R24,R12
0DE4 308B CPI R24,0xB
0DE5 E0E0 LDI R30,0
0DE6 079E CPC R25,R30
0DE7 F0C9 BEQ 0x0E01
0DE8 308C CPI R24,0xC
0DE9 E0E0 LDI R30,0
0DEA 079E CPC R25,R30
0DEB F0A9 BEQ 0x0E01
0DEC 308E CPI R24,0xE
0DED E0E0 LDI R30,0
0DEE 079E CPC R25,R30
0DEF F009 BEQ 0x0DF1
0DF0 C020 RJMP 0x0E11
(0086) {
(0087) case PART_TYPE_DOSFAT16:
(0088) case PART_TYPE_FAT16:
(0089) case PART_TYPE_FAT16LBA:
(0090) // 第一个目录扇区号为2
(0091) FirstDirSector = CLUST_FIRST;
0DF1 E042 LDI R20,2
0DF2 E050 LDI R21,0
0DF3 E060 LDI R22,0
0DF4 E070 LDI R23,0
0DF5 935002BB STS FirstDirSector+1,R21
0DF7 934002BA STS FirstDirSector,R20
0DF9 937002BD STS FirstDirSector+3,R23
0DFB 936002BC STS FirstDirSector+2,R22
(0092) //FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
(0093) Fat32Enabled = 0;
0DFD 2422 CLR R2
0DFE 922002CA STS Fat32Enabled,R2
(0094)
(0095) break;
0E00 C010 RJMP 0x0E11
(0096) case PART_TYPE_FAT32LBA:
(0097) case PART_TYPE_FAT32:
(0098)
(0099) FirstDirSector = bpb->bpbRootClust;
0E01 01F5 MOVW R30,R10
0E02 A021 LDD R2,Z+33
0E03 A032 LDD R3,Z+34
0E04 A043 LDD R4,Z+35
0E05 A054 LDD R5,Z+36
0E06 923002BB STS FirstDirSector+1,R3
0E08 922002BA STS FirstDirSector,R2
0E0A 925002BD STS FirstDirSector+3,R5
0E0C 924002BC STS FirstDirSector+2,R4
(0100) Fat32Enabled = 1;
0E0E E081 LDI R24,1
0E0F 938002CA STS Fat32Enabled,R24
(0101) break;
(0102) default:break;
(0103) //return 1;
(0104) }
(0105) //查询SD卡文件系统信息
(0106) switch (PartInfo.prPartType)
0E11 90A002CF LDS R10,0x2CF
0E13 24BB CLR R11
0E14 01C5 MOVW R24,R10
0E15 3084 CPI R24,4
0E16 E0E0 LDI R30,0
0E17 079E CPC R25,R30
0E18 F0B9 BEQ 0x0E30
0E19 3086 CPI R24,6
0E1A E0E0 LDI R30,0
0E1B 079E CPC R25,R30
0E1C F0E1 BEQ 0x0E39
0E1D 3084 CPI R24,4
0E1E E0E0 LDI R30,0
0E1F 079E CPC R25,R30
0E20 F40C BGE 0x0E22
0E21 C03B RJMP 0x0E5D
0E22 01C5 MOVW R24,R10
0E23 308B CPI R24,0xB
0E24 E0E0 LDI R30,0
0E25 079E CPC R25,R30
0E26 F169 BEQ 0x0E54
0E27 308C CPI R24,0xC
0E28 E0E0 LDI R30,0
0E29 079E CPC R25,R30
0E2A F101 BEQ 0x0E4B
0E2B 308E CPI R24,0xE
0E2C E0E0 LDI R30,0
0E2D 079E CPC R25,R30
0E2E F099 BEQ 0x0E42
0E2F C02D RJMP 0x0E5D
(0107) {
(0108) case PART_TYPE_DOSFAT16:
(0109) LCD_write_english_string(0,0,"DOSFAT 16");
0E30 EA89 LDI R24,0xA9
0E31 E090 LDI R25,0
0E32 8399 STD Y+1,R25
0E33 8388 STD Y+0,R24
0E34 2722 CLR R18
0E35 2700 CLR R16
0E36 940E0C88 CALL _LCD_write_english_string
(0110) break;
0E38 C02C RJMP 0x0E65
(0111) case PART_TYPE_FAT16:
(0112) LCD_write_english_string(0,0,"FAT16 ");
0E39 EA82 LDI R24,0xA2
0E3A E090 LDI R25,0
0E3B 8399 STD Y+1,R25
0E3C 8388 STD Y+0,R24
0E3D 2722 CLR R18
0E3E 2700 CLR R16
0E3F 940E0C88 CALL _LCD_write_english_string
(0113) break;
0E41 C023 RJMP 0x0E65
(0114) case PART_TYPE_FAT16LBA:
(0115) LCD_write_english_string(0,0,"FAT16 LBA");
0E42 E988 LDI R24,0x98
0E43 E090 LDI R25,0
0E44 8399 STD Y+1,R25
0E45 8388 STD Y+0,R24
0E46 2722 CLR R18
0E47 2700 CLR R16
0E48 940E0C88 CALL _LCD_write_english_string
(0116) break;
0E4A C01A RJMP 0x0E65
(0117) case PART_TYPE_FAT32LBA:
(0118) LCD_write_english_string(0,0,"FAT32 LBA");
0E4B E88E LDI R24,0x8E
0E4C E090 LDI R25,0
0E4D 8399 STD Y+1,R25
0E4E 8388 STD Y+0,R24
0E4F 2722 CLR R18
0E50 2700 CLR R16
0E51 940E0C88 CALL _LCD_write_english_string
(0119) break;
0E53 C011 RJMP 0x0E65
(0120) case PART_TYPE_FAT32:
(0121) LCD_write_english_string(0,0,"FAT32");
0E54 E888 LDI R24,0x88
0E55 E090 LDI R25,0
0E56 8399 STD Y+1,R25
0E57 8388 STD Y+0,R24
0E58 2722 CLR R18
0E59 2700 CLR R16
0E5A 940E0C88 CALL _LCD_write_english_string
(0122) break;
0E5C C008 RJMP 0x0E65
(0123) default:
(0124) LCD_write_english_string(0,0,"No Partition!");
0E5D E78A LDI R24,0x7A
0E5E E090 LDI R25,0
0E5F 8399 STD Y+1,R25
0E60 8388 STD Y+0,R24
0E61 2722 CLR R18
0E62 2700 CLR R16
0E63 940E0C88 CALL _LCD_write_english_string
(0125) break;
(0126) }
(0127) //显示磁盘容量
(0128) data=PartInfo.prSize>>11;
0E65 E08B LDI R24,0xB
0E66 E090 LDI R25,0
0E67 904002D9 LDS R4,0x2D9
0E69 905002DA LDS R5,0x2DA
0E6B 902002D7 LDS R2,0x2D7
0E6D 903002D8 LDS R3,0x2D8
0E6F 938A ST R24,-Y
0E70 0181 MOVW R16,R2
0E71 0192 MOVW R18,R4
0E72 940E13ED CALL lsr32
0E74 0158 MOVW R10,R16
(0129) LCD_set_XY(56,0);
0E75 2722 CLR R18
0E76 E308 LDI R16,0x38
0E77 940E0C5F CALL _LCD_set_XY
(0130) t1=data/100;
0E79 E624 LDI R18,0x64
0E7A E030 LDI R19,0
0E7B 0185 MOVW R16,R10
0E7C 940E12C6 CALL div16u
(0131) LCD_write_char(t1+48);
0E7E 5D00 SUBI R16,0xD0
0E7F 940E0C6E CALL _LCD_write_char
(0132) data=data%100;
0E81 E624 LDI R18,0x64
0E82 E030 LDI R19,0
0E83 0185 MOVW R16,R10
0E84 940E12C4 CALL mod16u
0E86 0158 MOVW R10,R16
(0133) t1=data/10;
0E87 E02A LDI R18,0xA
0E88 E030 LDI R19,0
0E89 940E12C6 CALL div16u
0E8B 2EC0 MOV R12,R16
(0134) LCD_write_char(t1+48);
0E8C 5D00 SUBI R16,0xD0
0E8D 940E0C6E CALL _LCD_write_char
(0135) t2=data%10;
0E8F E02A LDI R18,0xA
0E90 E030 LDI R19,0
0E91 0185 MOVW R16,R10
0E92 940E12C4 CALL mod16u
0E94 2EA0 MOV R10,R16
(0136) LCD_write_char(t2+48);
0E95 5D00 SUBI R16,0xD0
0E96 940E0C6E CALL _LCD_write_char
(0137) LCD_write_english_string(76,0,"M");
0E98 E788 LDI R24,0x78
0E99 E090 LDI R25,0
0E9A 8399 STD Y+1,R25
0E9B 8388 STD Y+0,R24
0E9C 2722 CLR R18
0E9D E40C LDI R16,0x4C
0E9E 940E0C88 CALL _LCD_write_english_string
(0138) LCD_write_english_string(0,1,"RATE");
0EA0 E783 LDI R24,0x73
0EA1 E090 LDI R25,0
0EA2 8399 STD Y+1,R25
0EA3 8388 STD Y+0,R24
0EA4 E021 LDI R18,1
0EA5 2700 CLR R16
0EA6 940E0C88 CALL _LCD_write_english_string
(0139) return 0;
0EA8 2700 CLR R16
0EA9 9622 ADIW R28,2
0EAA 940E1397 CALL pop_gset4
0EAC 9508 RET
_fatGetDirEntry:
rval --> Y+8
save2 --> R10
save --> Y+4
b --> Y+20
sector --> Y+0
hasBuffer --> Y+18
index --> Y+16
de --> Y+14
p --> R12
we --> Y+12
i --> R14
entry --> Y+32
0EAD 931A ST R17,-Y
0EAE 930A ST R16,-Y
0EAF 940E139D CALL push_gset5
0EB1 9766 SBIW R28,0x16
(0140) }
(0141)
(0142) /*-----------------------------------------------------------------------
(0143) 查询一个文件的开始簇
(0144) -----------------------------------------------------------------------*/
(0145) unsigned int baseentry = 0;
(0146) unsigned int entrycount = 0;
(0147)
(0148)
(0149) unsigned long fatGetDirEntry(unsigned int entry)
(0150) {
(0151) unsigned long sector;
(0152) struct direntry *de = 0; // 防止compiler warning
0EB2 2400 CLR R0
0EB3 2411 CLR R1
0EB4 861F STD Y+15,R1
0EB5 860E STD Y+14,R0
(0153) struct winentry *we;
(0154) unsigned int hasBuffer;
(0155) unsigned int b;
(0156) int i,index;
(0157) char *p;
(0158)
(0159) entrycount = 0;
0EB6 2422 CLR R2
0EB7 2433 CLR R3
0EB8 92300070 STS entrycount+1,R3
0EBA 9220006F STS entrycount,R2
(0160) DirNameBuffer = 0;
0EBC 92300068 STS DirNameBuffer+1,R3
0EBE 92200067 STS DirNameBuffer,R2
(0161)
(0162)
(0163) // 读取目录区数据
(0164) sector = fatClustToSect(FirstDirSector);
0EC0 912002BC LDS R18,FirstDirSector+2
0EC2 913002BD LDS R19,FirstDirSector+3
0EC4 910002BA LDS R16,FirstDirSector
0EC6 911002BB LDS R17,FirstDirSector+1
0EC8 DE22 RCALL _fatClustToSect
0EC9 01FE MOVW R30,R28
0ECA 8300 STD Z+0,R16
0ECB 8311 STD Z+1,R17
0ECC 8322 STD Z+2,R18
0ECD 8333 STD Z+3,R19
(0165)
(0166) hasBuffer = 0;
0ECE 2400 CLR R0
0ECF 2411 CLR R1
0ED0 8A1B STD Y+19,R1
0ED1 8A0A STD Y+18,R0
(0167)
(0168) index = 16;
0ED2 E180 LDI R24,0x10
0ED3 E090 LDI R25,0
0ED4 8B99 STD Y+17,R25
0ED5 8B88 STD Y+16,R24
(0169) do
(0170) {
(0171) if(index == 16) // 是否该一人一扇区time for next sector ?
0ED6 8988 LDD R24,Y+16
0ED7 8999 LDD R25,Y+17
0ED8 3180 CPI R24,0x10
0ED9 E0E0 LDI R30,0
0EDA 079E CPC R25,R30
0EDB F009 BEQ 0x0EDD
0EDC C02A RJMP 0x0F07
(0172) {
(0173) ReadBlock(sector++);
0EDD 01FE MOVW R30,R28
0EDE 8020 LDD R2,Z+0
0EDF 8031 LDD R3,Z+1
0EE0 8042 LDD R4,Z+2
0EE1 8053 LDD R5,Z+3
0EE2 01FE MOVW R30,R28
0EE3 8224 STD Z+4,R2
0EE4 8235 STD Z+5,R3
0EE5 8246 STD Z+6,R4
0EE6 8257 STD Z+7,R5
0EE7 E041 LDI R20,1
0EE8 E050 LDI R21,0
0EE9 E060 LDI R22,0
0EEA E070 LDI R23,0
0EEB 01FE MOVW R30,R28
0EEC 8024 LDD R2,Z+4
0EED 8035 LDD R3,Z+5
0EEE 8046 LDD R4,Z+6
0EEF 8057 LDD R5,Z+7
0EF0 0E24 ADD R2,R20
0EF1 1E35 ADC R3,R21
0EF2 1E46 ADC R4,R22
0EF3 1E57 ADC R5,R23
0EF4 01FE MOVW R30,R28
0EF5 8220 STD Z+0,R2
0EF6 8231 STD Z+1,R3
0EF7 8242 STD Z+2,R4
0EF8 8253 STD Z+3,R5
0EF9 01FE MOVW R30,R28
0EFA 8104 LDD R16,Z+4
0EFB 8115 LDD R17,Z+5
0EFC 8126 LDD R18,Z+6
0EFD 8137 LDD R19,Z+7
0EFE DDCF RCALL _ReadBlock
(0174) de = (struct direntry *)BUFFER;
0EFF EB86 LDI R24,0xB6
0F00 E090 LDI R25,0
0F01 879F STD Y+15,R25
0F02 878E STD Y+14,R24
(0175) index = 0;
0F03 2400 CLR R0
0F04 2411 CLR R1
0F05 8A19 STD Y+17,R1
0F06 8A08 STD Y+16,R0
(0176) }
(0177)
(0178) if(*de->deName != 0xE5)
0F07 85EE LDD R30,Y+14
0F08 85FF LDD R31,Y+15
0F09 8180 LDD R24,Z+0
0F0A 3E85 CPI R24,0xE5
0F0B F409 BNE 0x0F0D
0F0C C122 RJMP 0x102F
(0179) {
(0180) // 如果if not a deleted entry
(0181) if(de->deAttributes == ATTR_LONG_FILENAME)
0F0D 8583 LDD R24,Z+11
0F0E 308F CPI R24,0xF
0F0F F009 BEQ 0x0F11
0F10 C06F RJMP 0x0F80
(0182) {
(0183) // we have a long name entry
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -