📄 fat16.lis
字号:
00A0 FA93 st -y,R31
00A2 EA93 st -y,R30
00A4 9A93 st -y,R25
00A6 8A93 st -y,R24
00A8 00D0 rcall asgncblk
00AA .dbline 89
00AA FA01 movw R30,R20
00AC 2080 ldd R2,z+0
00AE 3324 clr R3
00B0 822D mov R24,R2
00B2 853E cpi R24,229
00B4 11F0 breq L21
00B6 8823 tst R24
00B8 11F4 brne L19
00BA L21:
00BA .dbline 89
00BA ; if((a[0]==0xe5)||(a[0]==0)) return 0;
00BA 0027 clr R16
00BC 1FC0 rjmp L16
00BE L19:
00BE .dbline 90
00BE ; for(i=0;i<3;i++)
00BE 6627 clr R22
00C0 1AC0 rjmp L25
00C2 L22:
00C2 .dbline 91
00C2 ; {
00C2 .dbline 92
00C2 ; if((a[i+8]!=b[i])&&(a[i+8]!=c[i]))
00C2 E62F mov R30,R22
00C4 FF27 clr R31
00C6 E40F add R30,R20
00C8 F51F adc R31,R21
00CA 2084 ldd R2,z+8
00CC 3324 clr R3
00CE CE01 movw R24,R28
00D0 E62F mov R30,R22
00D2 FF27 clr R31
00D4 E80F add R30,R24
00D6 F91F adc R31,R25
00D8 4080 ldd R4,z+0
00DA 2414 cp R2,R4
00DC 59F0 breq L26
00DE CE01 movw R24,R28
00E0 0396 adiw R24,3
00E2 E62F mov R30,R22
00E4 FF27 clr R31
00E6 E80F add R30,R24
00E8 F91F adc R31,R25
00EA 4080 ldd R4,z+0
00EC 2414 cp R2,R4
00EE 11F0 breq L26
00F0 .dbline 93
00F0 ; return 0;
00F0 0027 clr R16
00F2 04C0 rjmp L16
00F4 L26:
00F4 .dbline 94
00F4 L23:
00F4 .dbline 90
00F4 6395 inc R22
00F6 L25:
00F6 .dbline 90
00F6 6330 cpi R22,3
00F8 20F3 brlo L22
00FA .dbline 95
00FA ; }
00FA ; return 1;
00FA 01E0 ldi R16,1
00FC .dbline -2
00FC L16:
00FC 2696 adiw R28,6
00FE 00D0 rcall pop_gset2
0100 .dbline 0 ; func end
0100 0895 ret
0102 .dbsym l c 3 A[3:3]c
0102 .dbsym l b 0 A[3:3]c
0102 .dbsym r a 20 pc
0102 .dbsym r i 22 c
0102 .dbsym r A 22 pV
0102 .dbend
0102 .dbfunc e ReadBPB _ReadBPB fV
0102 .dbstruct 0 512 .1
0102 .dbfield 0 BS_jmpBoot A[3:3]c
0102 .dbfield 3 BS_OEMName A[8:8]c
0102 .dbfield 11 BPB_BytesPerSec i
0102 .dbfield 13 BPB_SecPerClus c
0102 .dbfield 14 BPB_RsvdSecCnt i
0102 .dbfield 16 BPB_NumFATs c
0102 .dbfield 17 BPB_RootEntCnt i
0102 .dbfield 19 BPB_TotSec16 i
0102 .dbfield 21 BPB_Media c
0102 .dbfield 22 BPB_FATSz16 i
0102 .dbfield 24 BPB_SecPerTrk i
0102 .dbfield 26 BPB_NumHeads i
0102 .dbfield 28 BPB_HiddSec l
0102 .dbfield 32 BPB_TotSec32 l
0102 .dbfield 36 BS_DrvNum c
0102 .dbfield 37 BS_Reservedl c
0102 .dbfield 38 BS_BootSig c
0102 .dbfield 39 BS_VolID l
0102 .dbfield 43 BS_VolLab A[11:11]c
0102 .dbfield 54 BS_FilSysType A[8:8]c
0102 .dbfield 62 ExecutableCode A[448:448]c
0102 .dbfield 510 ExecutableMarker A[2:2]c
0102 .dbend
0102 ; BPB -> R10,R11
.even
0102 _ReadBPB::
0102 00D0 rcall push_gset3
0104 .dbline -1
0104 .dbline 102
0104 ;
0104 ; }
0104 ; //********************************************************************************************
0104 ; //读取BPB数据结构
0104 ; void ReadBPB(void)
0104 ; //********************************************************************************************
0104 ; {
0104 .dbline 103
0104 ; FAT_BPB* BPB = (FAT_BPB*)BUFFER;
0104 80E0 ldi R24,<_BUFFER
0106 90E0 ldi R25,>_BUFFER
0108 5C01 movw R10,R24
010A .dbline 104
010A ; ReadBlock(0);
010A 00E0 ldi R16,0
010C 10E0 ldi R17,0
010E 20E0 ldi R18,0
0110 30E0 ldi R19,0
0112 7CDF rcall _ReadBlock
0114 .dbline 107
0114 ;
0114 ; //缓存相关参数
0114 ; BPB_SecPerClus = BPB->BPB_SecPerClus;
0114 F501 movw R30,R10
0116 2584 ldd R2,z+13
0118 20922100 sts _BPB_SecPerClus,R2
011C .dbline 108
011C ; BPB_RsvdSecCnt = BPB->BPB_RsvdSecCnt;
011C F501 movw R30,R10
011E 2684 ldd R2,z+14
0120 3784 ldd R3,z+15
0122 30922000 sts _BPB_RsvdSecCnt+1,R3
0126 20921F00 sts _BPB_RsvdSecCnt,R2
012A .dbline 109
012A ; BPB_NumFATs = BPB->BPB_NumFATs;
012A F501 movw R30,R10
012C 2088 ldd R2,z+16
012E 20921E00 sts _BPB_NumFATs,R2
0132 .dbline 110
0132 ; BPB_RootEntCnt = BPB->BPB_RootEntCnt;
0132 F501 movw R30,R10
0134 2188 ldd R2,z+17
0136 3288 ldd R3,z+18
0138 30921D00 sts _BPB_RootEntCnt+1,R3
013C 20921C00 sts _BPB_RootEntCnt,R2
0140 .dbline 111
0140 ; BPB_TotSec16 = BPB->BPB_TotSec16;
0140 F501 movw R30,R10
0142 2388 ldd R2,z+19
0144 3488 ldd R3,z+20
0146 30921B00 sts _BPB_TotSec16+1,R3
014A 20921A00 sts _BPB_TotSec16,R2
014E .dbline 112
014E ; BPB_FATSz16 = BPB->BPB_FATSz16;
014E F501 movw R30,R10
0150 2688 ldd R2,z+22
0152 3788 ldd R3,z+23
0154 30921900 sts _BPB_FATSz16+1,R3
0158 20921800 sts _BPB_FATSz16,R2
015C .dbline 113
015C ; BPB_HiddSec = BPB->BPB_HiddSec;
015C F501 movw R30,R10
015E 248C ldd R2,z+28
0160 358C ldd R3,z+29
0162 468C ldd R4,z+30
0164 578C ldd R5,z+31
0166 30921500 sts _BPB_HiddSec+1,R3
016A 20921400 sts _BPB_HiddSec,R2
016E 50921700 sts _BPB_HiddSec+2+1,R5
0172 40921600 sts _BPB_HiddSec+2,R4
0176 .dbline -2
0176 L28:
0176 00D0 rcall pop_gset3
0178 .dbline 0 ; func end
0178 0895 ret
017A .dbsym r BPB 10 pS[.1]
017A .dbend
017A .dbfunc s DirStartSec _DirStartSec fl
.even
017A _DirStartSec:
017A .dbline -1
017A .dbline 121
017A ;
017A ; }
017A ;
017A ; //********************************************************************************************
017A ; //获取根目录开始扇区号
017A ; static uint32 DirStartSec(void)
017A ; //********************************************************************************************
017A ; {
017A .dbline 122
017A ; return BPB_RsvdSecCnt + BPB_NumFATs * BPB_FATSz16;
017A 20911800 lds R18,_BPB_FATSz16
017E 30911900 lds R19,_BPB_FATSz16+1
0182 00911E00 lds R16,_BPB_NumFATs
0186 1127 clr R17
0188 00D0 rcall empy16s
018A 20901F00 lds R2,_BPB_RsvdSecCnt
018E 30902000 lds R3,_BPB_RsvdSecCnt+1
0192 200E add R2,R16
0194 311E adc R3,R17
0196 4424 clr R4
0198 5524 clr R5
019A 8101 movw R16,R2
019C 9201 movw R18,R4
019E .dbline -2
019E L29:
019E .dbline 0 ; func end
019E 0895 ret
01A0 .dbend
01A0 .dbfunc s DataStartSec _DataStartSec fl
.even
01A0 _DataStartSec:
01A0 .dbline -1
01A0 .dbline 129
01A0 ; }
01A0 ;
01A0 ; //********************************************************************************************
01A0 ; //获取数据区开始扇区号
01A0 ; static uint32 DataStartSec(void)
01A0 ; //********************************************************************************************
01A0 ; {
01A0 .dbline 130
01A0 ; return DirStartSec() +( BPB_RootEntCnt >>4);
01A0 ECDF rcall _DirStartSec
01A2 20901C00 lds R2,_BPB_RootEntCnt
01A6 30901D00 lds R3,_BPB_RootEntCnt+1
01AA 3694 lsr R3
01AC 2794 ror R2
01AE 3694 lsr R3
01B0 2794 ror R2
01B2 3694 lsr R3
01B4 2794 ror R2
01B6 3694 lsr R3
01B8 2794 ror R2
01BA 4424 clr R4
01BC 5524 clr R5
01BE 020D add R16,R2
01C0 131D adc R17,R3
01C2 241D adc R18,R4
01C4 351D adc R19,R5
01C6 .dbline -2
01C6 L30:
01C6 .dbline 0 ; func end
01C6 0895 ret
01C8 .dbend
01C8 .dbfunc s GetDirSecCount _GetDirSecCount fi
.even
01C8 _GetDirSecCount:
01C8 .dbline -1
01C8 .dbline 137
01C8 ; }
01C8 ;
01C8 ; //********************************************************************************************
01C8 ; //目录项占用的扇区数
01C8 ; static uint16 GetDirSecCount(void)
01C8 ; //********************************************************************************************
01C8 ; {
01C8 .dbline 138
01C8 ; return (BPB_RootEntCnt >>4);
01C8 00911C00 lds R16,_BPB_RootEntCnt
01CC 10911D00 lds R17,_BPB_RootEntCnt+1
01D0 1695 lsr R17
01D2 0795 ror R16
01D4 1695 lsr R17
01D6 0795 ror R16
01D8 1695 lsr R17
01DA 0795 ror R16
01DC 1695 lsr R17
01DE 0795 ror R16
01E0 .dbline -2
01E0 L31:
01E0 .dbline 0 ; func end
01E0 0895 ret
01E2 .dbend
01E2 .dbfunc e ClusConvLBA _ClusConvLBA fl
01E2 ; ClusID -> R10,R11
.even
01E2 _ClusConvLBA::
01E2 00D0 rcall push_gset3
01E4 5801 movw R10,R16
01E6 .dbline -1
01E6 .dbline 145
01E6 ; }
01E6 ;
01E6 ; //********************************************************************************************
01E6 ; //获取一个簇的开始扇区
01E6 ; uint32 ClusConvLBA(uint16 ClusID)
01E6 ; //********************************************************************************************
01E6 ; {
01E6 .dbline 146
01E6 ; return DataStartSec() + ((uint32)BPB_SecPerClus) * (ClusID - 2);
01E6 DCDF rcall _DataStartSec
01E8 1801 movw R2,R16
01EA 2901 movw R4,R18
01EC C501 movw R24,R10
01EE 0297 sbiw R24,2
01F0 3C01 movw R6,R24
01F2 8824 clr R8
01F4 9924 clr R9
01F6 40912100 lds R20,_BPB_SecPerClus
01FA 5527 clr R21
01FC 6627 clr R22
01FE 7727 clr R23
0200 9A92 st -y,R9
0202 8A92 st -y,R8
0204 7A92 st -y,R7
0206 6A92 st -y,R6
0208 8A01 movw R16,R20
020A 9B01 movw R18,R22
020C 00D0 rcall empy32u
020E 200E add R2,R16
0210 311E adc R3,R17
0212 421E adc R4,R18
0214 531E adc R5,R19
0216 8101 movw R16,R2
0218 9201 movw R18,R4
021A .dbline -2
021A L32:
021A 00D0 rcall pop_gset3
021C .dbline 0 ; func end
021C 0895 ret
021E .dbsym r ClusID 10 i
021E .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -