📄 sd.lst
字号:
(0070) FirstDataSector = PartInfo.prStartLBA;
04CC 90400444 LDS R4,0x444
04CE 90500445 LDS R5,0x445
04D0 90200442 LDS R2,0x442
04D2 90300443 LDS R3,0x443
04D4 92300436 STS FirstDataSector+1,R3
04D6 92200435 STS FirstDataSector,R2
04D8 92500438 STS FirstDataSector+3,R5
04DA 92400437 STS FirstDataSector+2,R4
(0071) if(bpb->bpbFATsecs)
04DC 01FC MOVW R30,R24
04DD 8423 LDD R2,Z+11
04DE 8434 LDD R3,Z+12
04DF 2022 TST R2
04E0 F411 BNE 0x04E3
04E1 2033 TST R3
04E2 F121 BEQ 0x0507
(0072) {
(0073) // bpbFATsecs非0,为FAT16,FAT表所占的扇区数在bpbFATsecs里
(0074) FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
04E3 01F5 MOVW R30,R10
04E4 8523 LDD R18,Z+11
04E5 8534 LDD R19,Z+12
04E6 01F5 MOVW R30,R10
04E7 8105 LDD R16,Z+5
04E8 2711 CLR R17
04E9 940E0D58 CALL empy16s
04EB 01F5 MOVW R30,R10
04EC 8023 LDD R2,Z+3
04ED 8034 LDD R3,Z+4
04EE 0E20 ADD R2,R16
04EF 1E31 ADC R3,R17
04F0 2444 CLR R4
04F1 2455 CLR R5
04F2 90800437 LDS R8,FirstDataSector+2
04F4 90900438 LDS R9,FirstDataSector+3
04F6 90600435 LDS R6,FirstDataSector
04F8 90700436 LDS R7,FirstDataSector+1
04FA 0C62 ADD R6,R2
04FB 1C73 ADC R7,R3
04FC 1C84 ADC R8,R4
04FD 1C95 ADC R9,R5
04FE 92700436 STS FirstDataSector+1,R7
0500 92600435 STS FirstDataSector,R6
0502 92900438 STS FirstDataSector+3,R9
0504 92800437 STS FirstDataSector+2,R8
(0075) }
0506 C02F RJMP 0x0536
(0076) else
(0077) {
(0078) // bpbFATsecs是0,为FAT32,FAT表所占的扇区数在bpbBigFATsecs里
(0079) FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
0507 01F5 MOVW R30,R10
0508 8C21 LDD R2,Z+25
0509 8C32 LDD R3,Z+26
050A 8C43 LDD R4,Z+27
050B 8C54 LDD R5,Z+28
050C 01F5 MOVW R30,R10
050D 8065 LDD R6,Z+5
050E 2477 CLR R7
050F 2488 CLR R8
0510 2499 CLR R9
0511 925A ST R5,-Y
0512 924A ST R4,-Y
0513 923A ST R3,-Y
0514 922A ST R2,-Y
0515 0183 MOVW R16,R6
0516 0194 MOVW R18,R8
0517 940E0D68 CALL empy32s
0519 01F5 MOVW R30,R10
051A 8023 LDD R2,Z+3
051B 8034 LDD R3,Z+4
051C 2444 CLR R4
051D 2455 CLR R5
051E 0E20 ADD R2,R16
051F 1E31 ADC R3,R17
0520 1E42 ADC R4,R18
0521 1E53 ADC R5,R19
0522 90800437 LDS R8,FirstDataSector+2
0524 90900438 LDS R9,FirstDataSector+3
0526 90600435 LDS R6,FirstDataSector
0528 90700436 LDS R7,FirstDataSector+1
052A 0C62 ADD R6,R2
052B 1C73 ADC R7,R3
052C 1C84 ADC R8,R4
052D 1C95 ADC R9,R5
052E 92700436 STS FirstDataSector+1,R7
0530 92600435 STS FirstDataSector,R6
0532 92900438 STS FirstDataSector+3,R9
0534 92800437 STS FirstDataSector+2,R8
(0080) }
(0081)
(0082) SectorsPerCluster = bpb->bpbSecPerClust;
0536 01F5 MOVW R30,R10
0537 8022 LDD R2,Z+2
0538 2433 CLR R3
0539 92300432 STS SectorsPerCluster+1,R3
053B 92200431 STS SectorsPerCluster,R2
(0083) BytesPerSector = bpb->bpbBytesPerSec;
053D 01F5 MOVW R30,R10
053E 8020 LDD R2,Z+0
053F 8031 LDD R3,Z+1
0540 92300434 STS BytesPerSector+1,R3
0542 92200433 STS BytesPerSector,R2
(0084) FirstFATSector = bpb->bpbResSectors + PartInfo.prStartLBA;
0544 90400444 LDS R4,0x444
0546 90500445 LDS R5,0x445
0548 90200442 LDS R2,0x442
054A 90300443 LDS R3,0x443
054C 8063 LDD R6,Z+3
054D 8074 LDD R7,Z+4
054E 2488 CLR R8
054F 2499 CLR R9
0550 0C62 ADD R6,R2
0551 1C73 ADC R7,R3
0552 1C84 ADC R8,R4
0553 1C95 ADC R9,R5
0554 9270042E STS FirstFATSector+1,R7
0556 9260042D STS FirstFATSector,R6
0558 92900430 STS FirstFATSector+3,R9
055A 9280042F STS FirstFATSector+2,R8
(0085) //查询SD卡文件系统分区类型
(0086) switch (PartInfo.prPartType)
055C 90C0043E LDS R12,0x43E
055E 24DD CLR R13
055F 01C6 MOVW R24,R12
0560 3084 CPI R24,4
0561 E0E0 LDI R30,0
0562 079E CPC R25,R30
0563 F0B1 BEQ 0x057A
0564 3086 CPI R24,6
0565 E0E0 LDI R30,0
0566 079E CPC R25,R30
0567 F091 BEQ 0x057A
0568 3084 CPI R24,4
0569 E0E0 LDI R30,0
056A 079E CPC R25,R30
056B F174 BLT 0x059A
056C 01C6 MOVW R24,R12
056D 308B CPI R24,0xB
056E E0E0 LDI R30,0
056F 079E CPC R25,R30
0570 F0C9 BEQ 0x058A
0571 308C CPI R24,0xC
0572 E0E0 LDI R30,0
0573 079E CPC R25,R30
0574 F0A9 BEQ 0x058A
0575 308E CPI R24,0xE
0576 E0E0 LDI R30,0
0577 079E CPC R25,R30
0578 F009 BEQ 0x057A
0579 C020 RJMP 0x059A
(0087) {
(0088) case PART_TYPE_DOSFAT16:
(0089) case PART_TYPE_FAT16:
(0090) case PART_TYPE_FAT16LBA:
(0091) // 第一个目录扇区号为2
(0092) FirstDirSector = CLUST_FIRST;
057A E042 LDI R20,2
057B E050 LDI R21,0
057C E060 LDI R22,0
057D E070 LDI R23,0
057E 9350042A STS FirstDirSector+1,R21
0580 93400429 STS FirstDirSector,R20
0582 9370042C STS FirstDirSector+3,R23
0584 9360042B STS FirstDirSector+2,R22
(0093) //FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
(0094) Fat32Enabled = 0;
0586 2422 CLR R2
0587 92200439 STS Fat32Enabled,R2
(0095)
(0096) break;
0589 C010 RJMP 0x059A
(0097) case PART_TYPE_FAT32LBA:
(0098) case PART_TYPE_FAT32:
(0099)
(0100) FirstDirSector = bpb->bpbRootClust;
058A 01F5 MOVW R30,R10
058B A021 LDD R2,Z+33
058C A032 LDD R3,Z+34
058D A043 LDD R4,Z+35
058E A054 LDD R5,Z+36
058F 9230042A STS FirstDirSector+1,R3
0591 92200429 STS FirstDirSector,R2
0593 9250042C STS FirstDirSector+3,R5
0595 9240042B STS FirstDirSector+2,R4
(0101) Fat32Enabled = 1;
0597 E081 LDI R24,1
0598 93800439 STS Fat32Enabled,R24
(0102) break;
(0103) default:break;
(0104) //return 1;
(0105) }
(0106) //查询SD卡文件系统信息
(0107) switch (PartInfo.prPartType)
059A 90A0043E LDS R10,0x43E
059C 24BB CLR R11
059D 01C5 MOVW R24,R10
059E 3084 CPI R24,4
059F E0E0 LDI R30,0
05A0 079E CPC R25,R30
05A1 F0B9 BEQ 0x05B9
05A2 3086 CPI R24,6
05A3 E0E0 LDI R30,0
05A4 079E CPC R25,R30
05A5 F0E1 BEQ 0x05C2
05A6 3084 CPI R24,4
05A7 E0E0 LDI R30,0
05A8 079E CPC R25,R30
05A9 F40C BGE 0x05AB
05AA C03B RJMP 0x05E6
05AB 01C5 MOVW R24,R10
05AC 308B CPI R24,0xB
05AD E0E0 LDI R30,0
05AE 079E CPC R25,R30
05AF F169 BEQ 0x05DD
05B0 308C CPI R24,0xC
05B1 E0E0 LDI R30,0
05B2 079E CPC R25,R30
05B3 F101 BEQ 0x05D4
05B4 308E CPI R24,0xE
05B5 E0E0 LDI R30,0
05B6 079E CPC R25,R30
05B7 F099 BEQ 0x05CB
05B8 C02D RJMP 0x05E6
(0108) {
(0109) case PART_TYPE_DOSFAT16:
(0110) LCD_write_String(0,0,"DOSFAT 16");
05B9 E489 LDI R24,0x49
05BA E091 LDI R25,1
05BB 8399 STD Y+1,R25
05BC 8388 STD Y+0,R24
05BD 2722 CLR R18
05BE 2700 CLR R16
05BF 940E0B1F CALL _LCD_write_String
(0111) break;
05C1 C02C RJMP 0x05EE
(0112) case PART_TYPE_FAT16:
(0113) LCD_write_String(0,0,"FAT16 ");
05C2 E482 LDI R24,0x42
05C3 E091 LDI R25,1
05C4 8399 STD Y+1,R25
05C5 8388 STD Y+0,R24
05C6 2722 CLR R18
05C7 2700 CLR R16
05C8 940E0B1F CALL _LCD_write_String
(0114) break;
05CA C023 RJMP 0x05EE
(0115) case PART_TYPE_FAT16LBA:
(0116) LCD_write_String(0,0,"FAT16 LBA");
05CB E388 LDI R24,0x38
05CC E091 LDI R25,1
05CD 8399 STD Y+1,R25
05CE 8388 STD Y+0,R24
05CF 2722 CLR R18
05D0 2700 CLR R16
05D1 940E0B1F CALL _LCD_write_String
(0117) break;
05D3 C01A RJMP 0x05EE
(0118) case PART_TYPE_FAT32LBA:
(0119) LCD_write_String(0,0,"FAT32 LBA");
05D4 E28E LDI R24,0x2E
05D5 E091 LDI R25,1
05D6 8399 STD Y+1,R25
05D7 8388 STD Y+0,R24
05D8 2722 CLR R18
05D9 2700 CLR R16
05DA 940E0B1F CALL _LCD_write_String
(0120) break;
05DC C011 RJMP 0x05EE
(0121) case PART_TYPE_FAT32:
(0122) LCD_write_String(0,0,"FAT32");
05DD E288 LDI R24,0x28
05DE E091 LDI R25,1
05DF 8399 STD Y+1,R25
05E0 8388 STD Y+0,R24
05E1 2722 CLR R18
05E2 2700 CLR R16
05E3 940E0B1F CALL _LCD_write_String
(0123) break;
05E5 C008 RJMP 0x05EE
(0124) default:
(0125) LCD_write_String(0,0,"No Partition!");
05E6 E18A LDI R24,0x1A
05E7 E091 LDI R25,1
05E8 8399 STD Y+1,R25
05E9 8388 STD Y+0,R24
05EA 2722 CLR R18
05EB 2700 CLR R16
05EC 940E0B1F CALL _LCD_write_String
(0126) break;
(0127) }
(0128) //显示磁盘容量
(0129) data=PartInfo.prSize>>11;
05EE E08B LDI R24,0xB
05EF E090 LDI R25,0
05F0 90400448 LDS R4,0x448
05F2 90500449 LDS R5,0x449
05F4 90200446 LDS R2,0x446
05F6 90300447 LDS R3,0x447
05F8 938A ST R24,-Y
05F9 0181 MOVW R16,R2
05FA 0192 MOVW R18,R4
05FB 940E0DF4 CALL lsr32
05FD 0158 MOVW R10,R16
(0130) LCD_set_XY(56,0);
05FE 2722 CLR R18
05FF E308 LDI R16,0x38
0600 940E0AF6 CALL _LCD_set_XY
(0131) t1=data/100;
0602 E624 LDI R18,0x64
0603 E030 LDI R19,0
0604 0185 MOVW R16,R10
0605 940E0CB5 CALL div16u
(0132) LCD_write_char(t1+48);
0607 5D00 SUBI R16,0xD0
0608 940E0B05 CALL _LCD_write_char
(0133) data=data%100;
060A E624 LDI R18,0x64
060B E030 LDI R19,0
060C 0185 MOVW R16,R10
060D 940E0CB3 CALL mod16u
060F 0158 MOVW R10,R16
(0134) t1=data/10;
0610 E02A LDI R18,0xA
0611 E030 LDI R19,0
0612 940E0CB5 CALL div16u
0614 2EC0 MOV R12,R16
(0135) LCD_write_char(t1+48);
0615 5D00 SUBI R16,0xD0
0616 940E0B05 CALL _LCD_write_char
(0136) t2=data%10;
0618 E02A LDI R18,0xA
0619 E030 LDI R19,0
061A 0185 MOVW R16,R10
061B 940E0CB3 CALL mod16u
061D 2EA0 MOV R10,R16
(0137) LCD_write_char(t2+48);
061E 5D00 SUBI R16,0xD0
061F 940E0B05 CALL _LCD_write_char
(0138) LCD_write_String(76,0,"M");
0621 E188 LDI R24,0x18
0622 E091 LDI R25,1
0623 8399 STD Y+1,R25
0624 8388 STD Y+0,R24
0625 2722 CLR R18
0626 E40C LDI R16,0x4C
0627 940E0B1F CALL _LCD_write_String
(0139) LCD_write_String(0,1,"RATE");
0629 E183 LDI R24,0x13
062A E091 LDI R25,1
062B 8399 STD Y+1,R25
062C 8388 STD Y+0,R24
062D E021 LDI R18,1
062E 2700 CLR R16
062F 940E0B1F CALL _LCD_write_String
(0140) return 0;
0631 2700 CLR R16
0632 9622 ADIW R28,2
0633 940E0D9E CALL pop_gset4
0635 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
0636 931A ST R17,-Y
0637 930A ST R16,-Y
0638 940E0DA4 CALL push_gset5
063A 9766 SBIW R28,0x16
(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
063B 2400 CLR R0
063C 2411 CLR R1
063D 861F STD Y+15,R1
063E 860E STD Y+14,R0
(0154) struct winentry *we;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -