📄 sd.lst
字号:
0CC0 902002CE LDS R2,0x2CE
0CC2 903002CF LDS R3,0x2CF
0CC4 923002C2 STS _FirstDataSector+1,R3
0CC6 922002C1 STS _FirstDataSector,R2
0CC8 925002C4 STS _FirstDataSector+3,R5
0CCA 924002C3 STS _FirstDataSector+2,R4
(0071) if(bpb->bpbFATsecs)
0CCC 01FC MOVW R30,R24
0CCD 8423 LDD R2,Z+11
0CCE 8434 LDD R3,Z+12
0CCF 2022 TST R2
0CD0 F411 BNE 0x0CD3
0CD1 2033 TST R3
0CD2 F121 BEQ 0x0CF7
(0072) {
(0073) // bpbFATsecs非0,为FAT16,FAT表所占的扇区数在bpbFATsecs里
(0074) FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
0CD3 01F5 MOVW R30,R10
0CD4 8523 LDD R18,Z+11
0CD5 8534 LDD R19,Z+12
0CD6 01F5 MOVW R30,R10
0CD7 8105 LDD R16,Z+5
0CD8 2711 CLR R17
0CD9 940E1356 CALL empy16s
0CDB 01F5 MOVW R30,R10
0CDC 8023 LDD R2,Z+3
0CDD 8034 LDD R3,Z+4
0CDE 0E20 ADD R2,R16
0CDF 1E31 ADC R3,R17
0CE0 2444 CLR R4
0CE1 2455 CLR R5
0CE2 908002C3 LDS R8,_FirstDataSector+2
0CE4 909002C4 LDS R9,_FirstDataSector+3
0CE6 906002C1 LDS R6,_FirstDataSector
0CE8 907002C2 LDS R7,_FirstDataSector+1
0CEA 0C62 ADD R6,R2
0CEB 1C73 ADC R7,R3
0CEC 1C84 ADC R8,R4
0CED 1C95 ADC R9,R5
0CEE 927002C2 STS _FirstDataSector+1,R7
0CF0 926002C1 STS _FirstDataSector,R6
0CF2 929002C4 STS _FirstDataSector+3,R9
0CF4 928002C3 STS _FirstDataSector+2,R8
(0075) }
0CF6 C02F RJMP 0x0D26
(0076) else
(0077) {
(0078) // bpbFATsecs是0,为FAT32,FAT表所占的扇区数在bpbBigFATsecs里
(0079) FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
0CF7 01F5 MOVW R30,R10
0CF8 8C21 LDD R2,Z+25
0CF9 8C32 LDD R3,Z+26
0CFA 8C43 LDD R4,Z+27
0CFB 8C54 LDD R5,Z+28
0CFC 01F5 MOVW R30,R10
0CFD 8065 LDD R6,Z+5
0CFE 2477 CLR R7
0CFF 2488 CLR R8
0D00 2499 CLR R9
0D01 925A ST R5,-Y
0D02 924A ST R4,-Y
0D03 923A ST R3,-Y
0D04 922A ST R2,-Y
0D05 0183 MOVW R16,R6
0D06 0194 MOVW R18,R8
0D07 940E1366 CALL empy32s
0D09 01F5 MOVW R30,R10
0D0A 8023 LDD R2,Z+3
0D0B 8034 LDD R3,Z+4
0D0C 2444 CLR R4
0D0D 2455 CLR R5
0D0E 0E20 ADD R2,R16
0D0F 1E31 ADC R3,R17
0D10 1E42 ADC R4,R18
0D11 1E53 ADC R5,R19
0D12 908002C3 LDS R8,_FirstDataSector+2
0D14 909002C4 LDS R9,_FirstDataSector+3
0D16 906002C1 LDS R6,_FirstDataSector
0D18 907002C2 LDS R7,_FirstDataSector+1
0D1A 0C62 ADD R6,R2
0D1B 1C73 ADC R7,R3
0D1C 1C84 ADC R8,R4
0D1D 1C95 ADC R9,R5
0D1E 927002C2 STS _FirstDataSector+1,R7
0D20 926002C1 STS _FirstDataSector,R6
0D22 929002C4 STS _FirstDataSector+3,R9
0D24 928002C3 STS _FirstDataSector+2,R8
(0080) }
(0081)
(0082) SectorsPerCluster = bpb->bpbSecPerClust;
0D26 01F5 MOVW R30,R10
0D27 8022 LDD R2,Z+2
0D28 2433 CLR R3
0D29 923002BE STS _SectorsPerCluster+1,R3
0D2B 922002BD STS _SectorsPerCluster,R2
(0083) BytesPerSector = bpb->bpbBytesPerSec;
0D2D 01F5 MOVW R30,R10
0D2E 8020 LDD R2,Z+0
0D2F 8031 LDD R3,Z+1
0D30 923002C0 STS _BytesPerSector+1,R3
0D32 922002BF STS _BytesPerSector,R2
(0084) FirstFATSector = bpb->bpbResSectors + PartInfo.prStartLBA;
0D34 904002D0 LDS R4,0x2D0
0D36 905002D1 LDS R5,0x2D1
0D38 902002CE LDS R2,0x2CE
0D3A 903002CF LDS R3,0x2CF
0D3C 8063 LDD R6,Z+3
0D3D 8074 LDD R7,Z+4
0D3E 2488 CLR R8
0D3F 2499 CLR R9
0D40 0C62 ADD R6,R2
0D41 1C73 ADC R7,R3
0D42 1C84 ADC R8,R4
0D43 1C95 ADC R9,R5
0D44 927002BA STS _FirstFATSector+1,R7
0D46 926002B9 STS _FirstFATSector,R6
0D48 929002BC STS _FirstFATSector+3,R9
0D4A 928002BB STS _FirstFATSector+2,R8
(0085) //查询SD卡文件系统分区类型
(0086) switch (PartInfo.prPartType)
0D4C 90C002CA LDS R12,0x2CA
0D4E 24DD CLR R13
0D4F 01C6 MOVW R24,R12
0D50 3084 CPI R24,4
0D51 E0E0 LDI R30,0
0D52 079E CPC R25,R30
0D53 F0B1 BEQ 0x0D6A
0D54 3086 CPI R24,6
0D55 E0E0 LDI R30,0
0D56 079E CPC R25,R30
0D57 F091 BEQ 0x0D6A
0D58 3084 CPI R24,4
0D59 E0E0 LDI R30,0
0D5A 079E CPC R25,R30
0D5B F174 BLT 0x0D8A
0D5C 01C6 MOVW R24,R12
0D5D 308B CPI R24,0xB
0D5E E0E0 LDI R30,0
0D5F 079E CPC R25,R30
0D60 F0C9 BEQ 0x0D7A
0D61 308C CPI R24,0xC
0D62 E0E0 LDI R30,0
0D63 079E CPC R25,R30
0D64 F0A9 BEQ 0x0D7A
0D65 308E CPI R24,0xE
0D66 E0E0 LDI R30,0
0D67 079E CPC R25,R30
0D68 F009 BEQ 0x0D6A
0D69 C020 RJMP 0x0D8A
(0087) {
(0088) case PART_TYPE_DOSFAT16:
(0089) case PART_TYPE_FAT16:
(0090) case PART_TYPE_FAT16LBA:
(0091) // 第一个目录扇区号为2
(0092) FirstDirSector = CLUST_FIRST;
0D6A E042 LDI R20,2
0D6B E050 LDI R21,0
0D6C E060 LDI R22,0
0D6D E070 LDI R23,0
0D6E 935002B6 STS _FirstDirSector+1,R21
0D70 934002B5 STS _FirstDirSector,R20
0D72 937002B8 STS _FirstDirSector+3,R23
0D74 936002B7 STS _FirstDirSector+2,R22
(0093) //FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
(0094) Fat32Enabled = 0;
0D76 2422 CLR R2
0D77 922002C5 STS _Fat32Enabled,R2
(0095)
(0096) break;
0D79 C010 RJMP 0x0D8A
(0097) case PART_TYPE_FAT32LBA:
(0098) case PART_TYPE_FAT32:
(0099)
(0100) FirstDirSector = bpb->bpbRootClust;
0D7A 01F5 MOVW R30,R10
0D7B A021 LDD R2,Z+33
0D7C A032 LDD R3,Z+34
0D7D A043 LDD R4,Z+35
0D7E A054 LDD R5,Z+36
0D7F 923002B6 STS _FirstDirSector+1,R3
0D81 922002B5 STS _FirstDirSector,R2
0D83 925002B8 STS _FirstDirSector+3,R5
0D85 924002B7 STS _FirstDirSector+2,R4
(0101) Fat32Enabled = 1;
0D87 E081 LDI R24,1
0D88 938002C5 STS _Fat32Enabled,R24
(0102) break;
(0103) default:break;
(0104) //return 1;
(0105) }
(0106) //查询SD卡文件系统信息
(0107) switch (PartInfo.prPartType)
0D8A 90A002CA LDS R10,0x2CA
0D8C 24BB CLR R11
0D8D 01C5 MOVW R24,R10
0D8E 3084 CPI R24,4
0D8F E0E0 LDI R30,0
0D90 079E CPC R25,R30
0D91 F0B9 BEQ 0x0DA9
0D92 3086 CPI R24,6
0D93 E0E0 LDI R30,0
0D94 079E CPC R25,R30
0D95 F0E1 BEQ 0x0DB2
0D96 3084 CPI R24,4
0D97 E0E0 LDI R30,0
0D98 079E CPC R25,R30
0D99 F40C BGE 0x0D9B
0D9A C03B RJMP 0x0DD6
0D9B 01C5 MOVW R24,R10
0D9C 308B CPI R24,0xB
0D9D E0E0 LDI R30,0
0D9E 079E CPC R25,R30
0D9F F169 BEQ 0x0DCD
0DA0 308C CPI R24,0xC
0DA1 E0E0 LDI R30,0
0DA2 079E CPC R25,R30
0DA3 F101 BEQ 0x0DC4
0DA4 308E CPI R24,0xE
0DA5 E0E0 LDI R30,0
0DA6 079E CPC R25,R30
0DA7 F099 BEQ 0x0DBB
0DA8 C02D RJMP 0x0DD6
(0108) {
(0109) case PART_TYPE_DOSFAT16:
(0110) LCD_write_english_string(0,0,"DOSFAT 16");
0DA9 EA84 LDI R24,0xA4
0DAA E090 LDI R25,0
0DAB 8399 STD Y+1,R25
0DAC 8388 STD Y+0,R24
0DAD 2722 CLR R18
0DAE 2700 CLR R16
0DAF 940E125D CALL _LCD_write_english_string
(0111) break;
0DB1 C02C RJMP 0x0DDE
(0112) case PART_TYPE_FAT16:
(0113) LCD_write_english_string(0,0,"FAT16 ");
0DB2 E98D LDI R24,0x9D
0DB3 E090 LDI R25,0
0DB4 8399 STD Y+1,R25
0DB5 8388 STD Y+0,R24
0DB6 2722 CLR R18
0DB7 2700 CLR R16
0DB8 940E125D CALL _LCD_write_english_string
(0114) break;
0DBA C023 RJMP 0x0DDE
(0115) case PART_TYPE_FAT16LBA:
(0116) LCD_write_english_string(0,0,"FAT16 LBA");
0DBB E983 LDI R24,0x93
0DBC E090 LDI R25,0
0DBD 8399 STD Y+1,R25
0DBE 8388 STD Y+0,R24
0DBF 2722 CLR R18
0DC0 2700 CLR R16
0DC1 940E125D CALL _LCD_write_english_string
(0117) break;
0DC3 C01A RJMP 0x0DDE
(0118) case PART_TYPE_FAT32LBA:
(0119) LCD_write_english_string(0,0,"FAT32 LBA");
0DC4 E889 LDI R24,0x89
0DC5 E090 LDI R25,0
0DC6 8399 STD Y+1,R25
0DC7 8388 STD Y+0,R24
0DC8 2722 CLR R18
0DC9 2700 CLR R16
0DCA 940E125D CALL _LCD_write_english_string
(0120) break;
0DCC C011 RJMP 0x0DDE
(0121) case PART_TYPE_FAT32:
(0122) LCD_write_english_string(0,0,"FAT32");
0DCD E883 LDI R24,0x83
0DCE E090 LDI R25,0
0DCF 8399 STD Y+1,R25
0DD0 8388 STD Y+0,R24
0DD1 2722 CLR R18
0DD2 2700 CLR R16
0DD3 940E125D CALL _LCD_write_english_string
(0123) break;
0DD5 C008 RJMP 0x0DDE
(0124) default:
(0125) LCD_write_english_string(0,0,"No Partition!");
0DD6 E785 LDI R24,0x75
0DD7 E090 LDI R25,0
0DD8 8399 STD Y+1,R25
0DD9 8388 STD Y+0,R24
0DDA 2722 CLR R18
0DDB 2700 CLR R16
0DDC 940E125D CALL _LCD_write_english_string
(0126) break;
(0127) }
(0128) //显示磁盘容量
(0129) data=PartInfo.prSize>>11;
0DDE E08B LDI R24,0xB
0DDF E090 LDI R25,0
0DE0 904002D4 LDS R4,0x2D4
0DE2 905002D5 LDS R5,0x2D5
0DE4 902002D2 LDS R2,0x2D2
0DE6 903002D3 LDS R3,0x2D3
0DE8 938A ST R24,-Y
0DE9 0181 MOVW R16,R2
0DEA 0192 MOVW R18,R4
0DEB 940E13FA CALL lsr32
0DED 0158 MOVW R10,R16
(0130) LCD_set_XY(56,0);
0DEE 2722 CLR R18
0DEF E308 LDI R16,0x38
0DF0 940E1234 CALL _LCD_set_XY
(0131) t1=data/100;
0DF2 E624 LDI R18,0x64
0DF3 E030 LDI R19,0
0DF4 0185 MOVW R16,R10
0DF5 940E12CB CALL div16u
(0132) LCD_write_char(t1+48);
0DF7 5D00 SUBI R16,0xD0
0DF8 940E1243 CALL _LCD_write_char
(0133) data=data%100;
0DFA E624 LDI R18,0x64
0DFB E030 LDI R19,0
0DFC 0185 MOVW R16,R10
0DFD 940E12C9 CALL mod16u
0DFF 0158 MOVW R10,R16
(0134) t1=data/10;
0E00 E02A LDI R18,0xA
0E01 E030 LDI R19,0
0E02 940E12CB CALL div16u
0E04 2EC0 MOV R12,R16
(0135) LCD_write_char(t1+48);
0E05 5D00 SUBI R16,0xD0
0E06 940E1243 CALL _LCD_write_char
(0136) t2=data%10;
0E08 E02A LDI R18,0xA
0E09 E030 LDI R19,0
0E0A 0185 MOVW R16,R10
0E0B 940E12C9 CALL mod16u
0E0D 2EA0 MOV R10,R16
(0137) LCD_write_char(t2+48);
0E0E 5D00 SUBI R16,0xD0
0E0F 940E1243 CALL _LCD_write_char
(0138) LCD_write_english_string(76,0,"M");
0E11 E783 LDI R24,0x73
0E12 E090 LDI R25,0
0E13 8399 STD Y+1,R25
0E14 8388 STD Y+0,R24
0E15 2722 CLR R18
0E16 E40C LDI R16,0x4C
0E17 940E125D CALL _LCD_write_english_string
(0139) //LCD_write_english_string(0,1,"RATE");
(0140) return 0;
0E19 2700 CLR R16
0E1A 9622 ADIW R28,2
0E1B 940E139C CALL pop_gset4
0E1D 9508 RET
_fatGetDirEntry:
rval --> Y+10
save2 --> R10
save --> Y+6
b --> Y+22
sector --> Y+2
hasBuffer --> Y+20
index --> Y+18
de --> Y+16
p --> R12
we --> Y+14
i --> R14
entry --> Y+34
0E1E 931A ST R17,-Y
0E1F 930A ST R16,-Y
0E20 940E13C5 CALL push_gset5
0E22 9768 SBIW R28,0x18
(0141) }
(0142)
(0143) /*-----------------------------------------------------------------------
(0144) 查询一个文件的开始簇
(0145) -----------------------------------------------------------------------*/
(0146) unsigned int baseentry = 0;
(0147) unsigned int entrycount = 0;
(0148)
(0149)
(0150) unsigned long fatGetDirEntry(unsigned int entry)
(0151) {
(0152) unsigned long sector;
(0153) struct direntry *de = 0; // 防止compiler warning
0E23 2400 CLR R0
0E24 2411 CLR R1
0E25 8A19 STD Y+17,R1
0E26 8A08 STD Y+16,R0
(0154) struct winentry *we;
(0155) unsigned int hasBuffer;
(0156) unsigned int b;
(0157) int i,index;
(0158) char *p;
(0159)
(0160) entrycount = 0;
0E27 2422 CLR R2
0E28 2433 CLR R3
0E29 92300070 STS 0x70,R3
0E2B 9220006F STS 0x6F,R2
(0161) DirNameBuffer = 0;
0E2D 92300068 STS 0x68,R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -