📄 fat16.lst
字号:
1086 04b6 000F 1: lsl r16
1087 04b8 111F rol r17
1088 04ba EA95 dec r30
1089 04bc E1F7 brne 1b
1090 04be 40E2 ldi r20,lo8(32)
1091 04c0 50E0 ldi r21,hi8(32)
1092 04c2 B701 movw r22,r14
1093 04c4 C801 movw r24,r16
1094 04c6 8050 subi r24,lo8(-(BUFFER))
1095 04c8 9040 sbci r25,hi8(-(BUFFER))
1096 04ca 0E94 0000 call CopyBytes
1097 /* epilogue: frame size=0 */
1098 04ce 1F91 pop r17
1099 04d0 0F91 pop r16
1100 04d2 FF90 pop r15
1101 04d4 EF90 pop r14
1102 04d6 0895 ret
1103 /* epilogue end (size=5) */
1104 /* function ReadDIR size 46 (37) */
1106 .Lscope18:
1110 .global WriteDIR
1112 WriteDIR:
170:FAT16.c **** }
171:FAT16.c **** //-------------------------------------------------------------------------
172:FAT16.c **** void WriteDIR(uint16_t Index, DIR* Value){ //写根目录的指定项
1114 .LM102:
1115 /* prologue: frame size=0 */
1116 04d8 AF92 push r10
1117 04da BF92 push r11
1118 04dc CF92 push r12
1119 04de DF92 push r13
1120 04e0 EF92 push r14
1121 04e2 FF92 push r15
1122 04e4 0F93 push r16
1123 04e6 1F93 push r17
1124 /* prologue end (size=8) */
1125 04e8 8C01 movw r16,r24
1126 04ea 5B01 movw r10,r22
173:FAT16.c **** uint32_t LBA = DirStartSec()+Index/16;
1128 .LM103:
1129 04ec 0E94 0000 call DirStartSec
1130 04f0 6B01 movw r12,r22
1131 04f2 7C01 movw r14,r24
1132 04f4 C801 movw r24,r16
1133 04f6 B4E0 ldi r27,4
1134 04f8 9695 1: lsr r25
1135 04fa 8795 ror r24
1136 04fc BA95 dec r27
1137 04fe E1F7 brne 1b
1138 0500 AA27 clr r26
1139 0502 BB27 clr r27
1140 0504 C80E add r12,r24
1141 0506 D91E adc r13,r25
1142 0508 EA1E adc r14,r26
1143 050a FB1E adc r15,r27
174:FAT16.c **** ReadFatBlock(LBA);
1145 .LM104:
1146 050c C701 movw r24,r14
1147 050e B601 movw r22,r12
1148 0510 0E94 0000 call ReadFatBlock
175:FAT16.c **** CopyBytes((uint8_t *)Value,(uint8_t *)&BUFFER[(Index%16)*32],32);
1150 .LM105:
1151 0514 0F70 andi r16,lo8(15)
1152 0516 1070 andi r17,hi8(15)
1153 0518 A5E0 ldi r26,5
1154 051a 000F 1: lsl r16
1155 051c 111F rol r17
1156 051e AA95 dec r26
1157 0520 E1F7 brne 1b
1158 0522 0050 subi r16,lo8(-(BUFFER))
1159 0524 1040 sbci r17,hi8(-(BUFFER))
1160 0526 40E2 ldi r20,lo8(32)
1161 0528 50E0 ldi r21,hi8(32)
1162 052a B801 movw r22,r16
1163 052c C501 movw r24,r10
1164 052e 0E94 0000 call CopyBytes
176:FAT16.c **** WriteFatBlock(LBA);
1166 .LM106:
1167 0532 C701 movw r24,r14
1168 0534 B601 movw r22,r12
1169 0536 0E94 0000 call WriteFatBlock
1170 /* epilogue: frame size=0 */
1171 053a 1F91 pop r17
1172 053c 0F91 pop r16
1173 053e FF90 pop r15
1174 0540 EF90 pop r14
1175 0542 DF90 pop r13
1176 0544 CF90 pop r12
1177 0546 BF90 pop r11
1178 0548 AF90 pop r10
1179 054a 0895 ret
1180 /* epilogue end (size=9) */
1181 /* function WriteDIR size 58 (41) */
1186 .Lscope19:
1188 .global CopyFAT
1190 CopyFAT:
177:FAT16.c **** }
178:FAT16.c **** //-------------------------------------------------------------------------
179:FAT16.c **** void CopyFAT(void){ //复制文件分配表,使其和备份一致
1192 .LM107:
1193 /* prologue: frame size=0 */
1194 054c CF93 push r28
1195 054e DF93 push r29
1196 /* prologue end (size=2) */
180:FAT16.c **** uint16_t i;
181:FAT16.c ****
182:FAT16.c **** for(i=0;i<BPB_FATSz16;i++){
1198 .LM108:
1199 0550 C0E0 ldi r28,lo8(0)
1200 0552 D0E0 ldi r29,hi8(0)
1201 0554 8091 0000 lds r24,BPB_FATSz16
1202 0558 9091 0000 lds r25,(BPB_FATSz16)+1
1203 055c C817 cp r28,r24
1204 055e D907 cpc r29,r25
1205 0560 30F5 brsh .L90
1206 .L88:
183:FAT16.c **** ReadFatBlock(BPB_RsvdSecCnt+i);
1208 .LM109:
1209 0562 8091 0000 lds r24,BPB_RsvdSecCnt
1210 0566 9091 0000 lds r25,(BPB_RsvdSecCnt)+1
1211 056a 8C0F add r24,r28
1212 056c 9D1F adc r25,r29
1213 056e AA27 clr r26
1214 0570 BB27 clr r27
1215 0572 BC01 movw r22,r24
1216 0574 CD01 movw r24,r26
1217 0576 0E94 0000 call ReadFatBlock
184:FAT16.c **** WriteFatBlock(BPB_RsvdSecCnt+BPB_FATSz16+i);
1219 .LM110:
1220 057a 8091 0000 lds r24,BPB_RsvdSecCnt
1221 057e 9091 0000 lds r25,(BPB_RsvdSecCnt)+1
1222 0582 2091 0000 lds r18,BPB_FATSz16
1223 0586 3091 0000 lds r19,(BPB_FATSz16)+1
1224 058a 820F add r24,r18
1225 058c 931F adc r25,r19
1226 058e 8C0F add r24,r28
1227 0590 9D1F adc r25,r29
1228 0592 AA27 clr r26
1229 0594 BB27 clr r27
1230 0596 BC01 movw r22,r24
1231 0598 CD01 movw r24,r26
1232 059a 0E94 0000 call WriteFatBlock
1234 .LM111:
1235 059e 2196 adiw r28,1
1236 05a0 8091 0000 lds r24,BPB_FATSz16
1237 05a4 9091 0000 lds r25,(BPB_FATSz16)+1
1238 05a8 C817 cp r28,r24
1239 05aa D907 cpc r29,r25
1240 05ac D0F2 brlo .L88
1241 .L90:
1242 /* epilogue: frame size=0 */
1243 05ae DF91 pop r29
1244 05b0 CF91 pop r28
1245 05b2 0895 ret
1246 /* epilogue end (size=3) */
1247 /* function CopyFAT size 52 (47) */
1252 .Lscope20:
1256 .global CreateFile
1258 CreateFile:
185:FAT16.c **** }
186:FAT16.c **** }
187:FAT16.c **** //-------------------------------------------------------------------------
188:FAT16.c **** uint8_t CreateFile(uint8_t *Name,uint32_t Size){ //创建一个空文件
1260 .LM112:
1261 /* prologue: frame size=34 */
1262 05b4 6F92 push r6
1263 05b6 7F92 push r7
1264 05b8 8F92 push r8
1265 05ba 9F92 push r9
1266 05bc AF92 push r10
1267 05be BF92 push r11
1268 05c0 CF92 push r12
1269 05c2 DF92 push r13
1270 05c4 EF92 push r14
1271 05c6 FF92 push r15
1272 05c8 0F93 push r16
1273 05ca 1F93 push r17
1274 05cc CF93 push r28
1275 05ce DF93 push r29
1276 05d0 CDB7 in r28,__SP_L__
1277 05d2 DEB7 in r29,__SP_H__
1278 05d4 A297 sbiw r28,34
1279 05d6 0FB6 in __tmp_reg__,__SREG__
1280 05d8 F894 cli
1281 05da DEBF out __SP_H__,r29
1282 05dc 0FBE out __SREG__,__tmp_reg__
1283 05de CDBF out __SP_L__,r28
1284 /* prologue end (size=22) */
1285 05e0 4C01 movw r8,r24
1286 05e2 5A01 movw r10,r20
1287 05e4 6B01 movw r12,r22
189:FAT16.c **** uint16_t ClusID, ClusNum, ClusNext, i,dirIndex;
190:FAT16.c **** DIR FileDir;
191:FAT16.c ****
192:FAT16.c **** if(GetFileID(Name,&FileDir,&dirIndex)==1)return SD_FAIL; //文件已存在
1289 .LM113:
1290 05e6 AE01 movw r20,r28
1291 05e8 4F5D subi r20,lo8(-(33))
1292 05ea 5F4F sbci r21,hi8(-(33))
1293 05ec BE01 movw r22,r28
1294 05ee 6F5F subi r22,lo8(-(1))
1295 05f0 7F4F sbci r23,hi8(-(1))
1296 05f2 0E94 0000 call GetFileID
1297 05f6 8130 cpi r24,lo8(1)
1298 05f8 19F4 brne .L92
1300 .LM114:
1301 05fa 81E0 ldi r24,lo8(1)
1302 05fc 90E0 ldi r25,hi8(1)
1303 05fe 5DC0 rjmp .L91
1304 .L92:
193:FAT16.c ****
194:FAT16.c **** ClusNum=Size/(BPB_SecPerClus*BPB_BytesPerSec)+1;
1306 .LM115:
1307 0600 8091 0000 lds r24,BPB_SecPerClus
1308 0604 282F mov r18,r24
1309 0606 3327 clr r19
1310 0608 8091 0000 lds r24,BPB_BytesPerSec
1311 060c 9091 0000 lds r25,(BPB_BytesPerSec)+1
1312 0610 289F mul r18,r24
1313 0612 A001 movw r20,r0
1314 0614 299F mul r18,r25
1315 0616 500D add r21,r0
1316 0618 389F mul r19,r24
1317 061a 500D add r21,r0
1318 061c 1124 clr r1
1319 061e CA01 movw r24,r20
1320 0620 9C01 movw r18,r24
1321 0622 4427 clr r20
1322 0624 5527 clr r21
1323 0626 C601 movw r24,r12
1324 0628 B501 movw r22,r10
1325 062a 0E94 0000 call __udivmodsi4
1326 062e 7901 movw r14,r18
1327 0630 8A01 movw r16,r20
1328 0632 3901 movw r6,r18
1329 0634 0894 sec
1330 0636 611C adc r6,__zero_reg__
1331 0638 711C adc r7,__zero_reg__
195:FAT16.c ****
196:FAT16.c **** EmptyBytes((uint8_t *)&FileDir,sizeof(DIR));
1333 .LM116:
1334 063a 60E2 ldi r22,lo8(32)
1335 063c 70E0 ldi r23,hi8(32)
1336 063e CE01 movw r24,r28
1337 0640 0196 adiw r24,1
1338 0642 0E94 0000 call EmptyBytes
197:FAT16.c **** CopyBytes(Name,(uint8_t *)&FileDir.FileName,11);
1340 .LM117:
1341 0646 4BE0 ldi r20,lo8(11)
1342 0648 50E0 ldi r21,hi8(11)
1343 064a BE01 movw r22,r28
1344 064c 6F5F subi r22,lo8(-(1))
1345 064e 7F4F sbci r23,hi8(-(1))
1346 0650 C401 movw r24,r8
1347 0652 0E94 0000 call CopyBytes
198:FAT16.c **** FileDir.FilePosit.Size=Size;
1349 .LM118:
1350 0656 AD8E std Y+29,r10
1351 0658 BE8E std Y+30,r11
1352 065a CF8E std Y+31,r12
1353 065c D8A2 std Y+32,r13
199:FAT16.c **** FileDir.FilePosit.Start=GetNextFAT();
1355 .LM119:
1356 065e 0E94 0000 call GetNextFAT
1357 0662 9C8F std Y+28,r25
1358 0664 8B8F std Y+27,r24
200:FAT16.c **** ClusID=FileDir.FilePosit.Start;
1360 .LM120:
1361 0666 6C01 movw r12,r24
201:FAT16.c **** for(i=0;i<ClusNum-1;i++){
1363 .LM121:
1364 0668 AA24 clr r10
1365 066a BB24 clr r11
1366 066c C701 movw r24,r14
1367 .L99:
1368 066e A816 cp r10,r24
1369 0670 B906 cpc r11,r25
1370 0672 98F4 brsh .L98
202:FAT16.c **** WriteFAT(ClusID,0xffff);
1372 .LM122:
1373 0674 6FEF ldi r22,lo8(-1)
1374 0676 7FEF ldi r23,hi8(-1)
1375 0678 C601 movw r24,r12
1376 067a 0E94 0000 call WriteFAT
203:FAT16.c **** ClusNext=GetNextFAT();
1378 .LM123:
1379 067e 0E94 0000 call GetNextFAT
1380 0682 8C01 movw r16,r24
204:FAT16.c **** WriteFAT(ClusID,ClusNext);
1382 .LM124:
1383 0684 BC01 movw r22,r24
1384 0686 C601 movw r24,r12
1385 0688 0E94 0000 call WriteFAT
205:FAT16.c **** ClusID=ClusNext;
1387 .LM125:
1388 068c 6801 movw r12,r16
1390 .LM126:
1391 068e 0894 sec
1392 0690 A11C adc r10,__zero_reg__
1393 0692 B11C adc r11,__zero_reg__
1394 0694 C301 movw r24,r6
1395 0696 0197 sbiw r24,1
1396 0698 EACF rjmp .L99
1397 .L98:
206:FAT16.c **** }
207:FAT16.c **** WriteFAT(ClusID, 0xffff);
1399 .LM127:
1400 069a 6FEF ldi r22,lo8(-1)
1401 069c 7FEF ldi r23,hi8(-1)
1402 069e C601 movw r24,r12
1403 06a0 0E94 0000 call WriteFAT
208:FAT16.c **** WriteDIR(GetEmptyDIR(),&FileDir);
1405 .LM128:
1406 06a4 0E94 0000 call GetEmptyDIR
1407 06a8 BE01 movw r22,r28
1408 06aa 6F5F subi r22,lo8(-(1))
1409 06ac 7F4F sbci r23,hi8(-(1))
1410 06ae 0E94 0000 call WriteDIR
209:FAT16.c **** CopyFAT();
1412 .LM129:
1413 06b2 0E94 0000 call CopyFAT
210:FAT16.c **** return SD_SUCC;
1415 .LM130:
1416 06b6 80E0 ldi r24,lo8(0)
1417 06b8 90E0 ldi r25,hi8(0)
1418 .L91:
1419 /* epilogue: frame size=34 */
1420 06ba A296 adiw r28,34
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -