📄 fat.cod
字号:
; 686 : {
; 687 : g_FATParms.FATType = FAT_32;
0057c e59f2354 ldr r2, [pc, #0x354]
00580 e3a03002 mov r3, #2
00584 e5823000 str r3, [r2]
00588 |$L38337|
00588 |$L38335|
; 688 : }
; 689 :
; 690 : //
; 691 : // Get the FAT filesystem description.
; 692 : //
; 693 : if ( (g_FATParms.FATType == FAT_12) ||
; 694 : (g_FATParms.FATType == FAT_16) )
00588 e59f3348 ldr r3, [pc, #0x348]
0058c e5933000 ldr r3, [r3]
00590 e3530000 cmp r3, #0
00594 0a000003 beq |$L38339|
00598 e59f3338 ldr r3, [pc, #0x338]
0059c e5933000 ldr r3, [r3]
005a0 e3530001 cmp r3, #1
005a4 1a000005 bne |$L38338|
005a8 |$L38339|
; 695 : {
; 696 : memcpy(FATType, (void *)pFAT16Extension->TypeFAT16, 8);
005a8 e3a02008 mov r2, #8
005ac e59d3220 ldr r3, [sp, #0x220]
005b0 e2831012 add r1, r3, #0x12
005b4 e28d0e21 add r0, sp, #0x21, 28
005b8 eb000000 bl memcpy
; 697 : }
; 698 : else
005bc ea000004 b |$L38341|
005c0 |$L38338|
; 699 : {
; 700 : memcpy(FATType, (void *)pFAT32Extension->TypeFAT32, 8);
005c0 e3a02008 mov r2, #8
005c4 e59d321c ldr r3, [sp, #0x21C]
005c8 e283102e add r1, r3, #0x2E
005cc e28d0e21 add r0, sp, #0x21, 28
005d0 eb000000 bl memcpy
005d4 |$L38341|
; 701 : }
; 702 : FATType[8] = '\0';
005d4 e3a03000 mov r3, #0
005d8 e5cd3218 strb r3, [sp, #0x218]
; 703 :
; 704 : //
; 705 : // Compute LBA for various disk regions.
; 706 : //
; 707 :
; 708 : // The start of the data region, the first sector of cluster 2 is...
; 709 : g_FATParms.DataStartLBA = g_FATParms.ReservedSects +
; 710 : (g_FATParms.NumFATs * g_FATParms.SectorsPerFAT) +
; 711 : g_FATParms.RootDirSectors;
005dc e59f32f4 ldr r3, [pc, #0x2F4]
005e0 e1d3e1b8 ldrh lr, [r3, #0x18]
005e4 e59f32ec ldr r3, [pc, #0x2EC]
005e8 e5d30015 ldrb r0, [r3, #0x15]
005ec e59f12e4 ldr r1, [pc, #0x2E4]
005f0 e5d1302c ldrb r3, [r1, #0x2C]
005f4 e1a02403 mov r2, r3, lsl #8
005f8 e5d1302b ldrb r3, [r1, #0x2B]
005fc e1833002 orr r3, r3, r2
00600 e1a02403 mov r2, r3, lsl #8
00604 e5d1302a ldrb r3, [r1, #0x2A]
00608 e1833002 orr r3, r3, r2
0060c e1a02403 mov r2, r3, lsl #8
00610 e5d13029 ldrb r3, [r1, #0x29]
00614 e1833002 orr r3, r3, r2
00618 e0030390 mul r3, r0, r3
0061c e08e0003 add r0, lr, r3
00620 e59f12b0 ldr r1, [pc, #0x2B0]
00624 e5d13028 ldrb r3, [r1, #0x28]
00628 e1a02403 mov r2, r3, lsl #8
0062c e5d13027 ldrb r3, [r1, #0x27]
00630 e1833002 orr r3, r3, r2
00634 e1a02403 mov r2, r3, lsl #8
00638 e5d13026 ldrb r3, [r1, #0x26]
0063c e1833002 orr r3, r3, r2
00640 e1a02403 mov r2, r3, lsl #8
00644 e5d13025 ldrb r3, [r1, #0x25]
00648 e1833002 orr r3, r3, r2
0064c e0802003 add r2, r0, r3
00650 e59f3280 ldr r3, [pc, #0x280]
00654 e5832010 str r2, [r3, #0x10]
; 712 :
; 713 : g_FATParms.NumRootEntries = pBPB->NumRootEntries;
00658 e59d3000 ldr r3, [sp]
0065c e2831011 add r1, r3, #0x11
00660 e5d13001 ldrb r3, [r1, #1]
00664 e1a03403 mov r3, r3, lsl #8
00668 e1a02803 mov r2, r3, lsl #16
0066c e1a02822 mov r2, r2, lsr #16
00670 e5d13000 ldrb r3, [r1]
00674 e1832002 orr r2, r3, r2
00678 e59f3258 ldr r3, [pc, #0x258]
0067c e1c321b6 strh r2, [r3, #0x16]
; 714 : g_FATParms.BytesPerSect = pBPB->BytesPerSect;
00680 e59d3000 ldr r3, [sp]
00684 e283100b add r1, r3, #0xB
00688 e5d13001 ldrb r3, [r1, #1]
0068c e1a03403 mov r3, r3, lsl #8
00690 e1a02803 mov r2, r3, lsl #16
00694 e1a02822 mov r2, r2, lsr #16
00698 e5d13000 ldrb r3, [r1]
0069c e1833002 orr r3, r3, r2
006a0 e59f2230 ldr r2, [pc, #0x230]
006a4 e5c2301f strb r3, [r2, #0x1F]
006a8 e1a03423 mov r3, r3, lsr #8
006ac e5c23020 strb r3, [r2, #0x20]
; 715 :
; 716 : if (g_FATParms.FATType == FAT_32)
006b0 e59f3220 ldr r3, [pc, #0x220]
006b4 e5933000 ldr r3, [r3]
006b8 e3530002 cmp r3, #2
006bc 1a000020 bne |$L38343|
; 717 : {
; 718 : g_FATParms.RootDirCluster = pFAT32Extension->RootFirstCluster;
006c0 e59d321c ldr r3, [sp, #0x21C]
006c4 e2831008 add r1, r3, #8
006c8 e5d13003 ldrb r3, [r1, #3]
006cc e1a02403 mov r2, r3, lsl #8
006d0 e5d13002 ldrb r3, [r1, #2]
006d4 e1833002 orr r3, r3, r2
006d8 e1a02403 mov r2, r3, lsl #8
006dc e5d13001 ldrb r3, [r1, #1]
006e0 e1833002 orr r3, r3, r2
006e4 e1a02403 mov r2, r3, lsl #8
006e8 e5d13000 ldrb r3, [r1]
006ec e1832002 orr r2, r3, r2
006f0 e59f31e0 ldr r3, [pc, #0x1E0]
006f4 e583200c str r2, [r3, #0xC]
; 719 : g_FATParms.RootDirLBA = Cluster2LBA( g_FATParms.RootDirCluster );
006f8 e59f31d8 ldr r3, [pc, #0x1D8]
006fc e593000c ldr r0, [r3, #0xC]
00700 eb000000 bl Cluster2LBA
00704 e58d022c str r0, [sp, #0x22C]
00708 e59d222c ldr r2, [sp, #0x22C]
0070c e59f31c4 ldr r3, [pc, #0x1C4]
00710 e5832008 str r2, [r3, #8]
; 720 : g_FATParms.DriveId = pFAT32Extension->DriveId32;
00714 e59d321c ldr r3, [sp, #0x21C]
00718 e283301c add r3, r3, #0x1C
0071c e5d32000 ldrb r2, [r3]
00720 e59f31b0 ldr r3, [pc, #0x1B0]
00724 e5c3201e strb r2, [r3, #0x1E]
; 721 : // FAT LBA starts right after the reserved sectors
; 722 : g_FATParms.FATLBA = g_FATParms.ReservedSects + uFirstPartitionLBA;
00728 e59f31a8 ldr r3, [pc, #0x1A8]
0072c e1d321b8 ldrh r2, [r3, #0x18]
00730 e59d323c ldr r3, [sp, #0x23C]
00734 e0822003 add r2, r2, r3
00738 e59f3198 ldr r3, [pc, #0x198]
0073c e5832004 str r2, [r3, #4]
; 723 :
; 724 : }
; 725 : else
00740 ea00001e b |$L38344|
00744 |$L38343|
; 726 : {
; 727 : // FAT-12/16 FAT root is not an allocated cluster!
; 728 : g_FATParms.RootDirCluster = 0;
00744 e59f218c ldr r2, [pc, #0x18C]
00748 e3a03000 mov r3, #0
0074c e582300c str r3, [r2, #0xC]
; 729 : // Since it is not an allocated cluster, then calculate the LBA
; 730 : // here...
; 731 : g_FATParms.RootDirLBA =
; 732 : g_FATParms.DataStartLBA -
; 733 : ((sizeof(DIRENTRY) * g_FATParms.NumRootEntries) / g_FATParms.BytesPerSect);
00750 e59f3180 ldr r3, [pc, #0x180]
00754 e1d321b6 ldrh r2, [r3, #0x16]
00758 e3a03020 mov r3, #0x20
0075c e00e0392 mul lr, r2, r3
00760 e59f1170 ldr r1, [pc, #0x170]
00764 e5d13020 ldrb r3, [r1, #0x20]
00768 e1a03403 mov r3, r3, lsl #8
0076c e1a02803 mov r2, r3, lsl #16
00770 e1a02822 mov r2, r2, lsr #16
00774 e5d1301f ldrb r3, [r1, #0x1F]
00778 e1830002 orr r0, r3, r2
0077c e1a0100e mov r1, lr
00780 eb000000 bl __rt_udiv
00784 e59f314c ldr r3, [pc, #0x14C]
00788 e5933010 ldr r3, [r3, #0x10]
0078c e0432000 sub r2, r3, r0
00790 e59f3140 ldr r3, [pc, #0x140]
00794 e5832008 str r2, [r3, #8]
; 734 : g_FATParms.DriveId = pFAT16Extension->DriveId16;
00798 e59d3220 ldr r3, [sp, #0x220]
0079c e5d32000 ldrb r2, [r3]
007a0 e59f3130 ldr r3, [pc, #0x130]
007a4 e5c3201e strb r2, [r3, #0x1E]
; 735 : // FAT LBA starts right after the reserved sectors
; 736 : g_FATParms.FATLBA = g_FATParms.ReservedSects + uFirstPartitionLBA;
007a8 e59f3128 ldr r3, [pc, #0x128]
007ac e1d321b8 ldrh r2, [r3, #0x18]
007b0 e59d323c ldr r3, [sp, #0x23C]
007b4 e0822003 add r2, r2, r3
007b8 e59f3118 ldr r3, [pc, #0x118]
007bc e5832004 str r2, [r3, #4]
007c0 |$L38344|
; 737 : }
; 738 :
; 739 : if ((sizeof(DIRENTRY) * g_FATParms.NumRootEntries) % g_FATParms.BytesPerSect)
007c0 e59f3110 ldr r3, [pc, #0x110]
007c4 e1d321b6 ldrh r2, [r3, #0x16]
007c8 e3a03020 mov r3, #0x20
007cc e00e0392 mul lr, r2, r3
007d0 e59f1100 ldr r1, [pc, #0x100]
007d4 e5d13020 ldrb r3, [r1, #0x20]
007d8 e1a03403 mov r3, r3, lsl #8
007dc e1a02803 mov r2, r3, lsl #16
007e0 e1a02822 mov r2, r2, lsr #16
007e4 e5d1301f ldrb r3, [r1, #0x1F]
007e8 e1830002 orr r0, r3, r2
007ec e1a0100e mov r1, lr
007f0 eb000000 bl __rt_udiv
007f4 e3510000 cmp r1, #0
007f8 0a000004 beq |$L38347|
; 740 : {
; 741 : --g_FATParms.RootDirLBA;
007fc e59f30d4 ldr r3, [pc, #0xD4]
00800 e5933008 ldr r3, [r3, #8]
00804 e2432001 sub r2, r3, #1
00808 e59f30c8 ldr r3, [pc, #0xC8]
0080c e5832008 str r2, [r3, #8]
00810 |$L38347|
; 742 : }
; 743 :
; 744 : g_FATParms.SectsPerClust = pBPB->SectsPerClust;
00810 e59d3000 ldr r3, [sp]
00814 e283300d add r3, r3, #0xD
00818 e5d32000 ldrb r2, [r3]
0081c e59f30b4 ldr r3, [pc, #0xB4]
00820 e5c32014 strb r2, [r3, #0x14]
; 745 : g_FATParms.NumHeads = (USHORT) pBPB->NumHeads;
00824 e59d3000 ldr r3, [sp]
00828 e283101a add r1, r3, #0x1A
0082c e5d13001 ldrb r3, [r1, #1]
00830 e1a03403 mov r3, r3, lsl #8
00834 e1a02803 mov r2, r3, lsl #16
00838 e1a02822 mov r2, r2, lsr #16
0083c e5d13000 ldrb r3, [r1]
00840 e1833002 orr r3, r3, r2
00844 e59f208c ldr r2, [pc, #0x8C]
00848 e5c23021 strb r3, [r2, #0x21]
0084c e1a03423 mov r3, r3, lsr #8
00850 e5c23022 strb r3, [r2, #0x22]
; 746 : g_FATParms.SectsPerTrack = pBPB->SectsPerTrack;
00854 e59d3000 ldr r3, [sp]
00858 e2831018 add r1, r3, #0x18
0085c e5d13001 ldrb r3, [r1, #1]
00860 e1a03403 mov r3, r3, lsl #8
00864 e1a02803 mov r2, r3, lsl #16
00868 e1a02822 mov r2, r2, lsr #16
0086c e5d13000 ldrb r3, [r1]
00870 e1833002 orr r3, r3, r2
00874 e59f205c ldr r2, [pc, #0x5C]
00878 e5c23023 strb r3, [r2, #0x23]
0087c e1a03423 mov r3, r3, lsr #8
00880 e5c23024 strb r3, [r2, #0x24]
; 747 :
; 748 : // Some BIOS/floppy combinations don't support multi-sector reads.
; 749 : // On a PC BIOS based system, a drive ID < 0x80 is a floppy disk.
; 750 : // We will not have that here! So, set the ReadBufferLen to the
; 751 : // maximum rather than the number of bytes per sector!
; 752 : // ReadBufferLen = ((pBPB->DriveId < 0x80) ? g_FATParms.BytesPerSect : READ_BUFFER_LENGTH_MAX);
; 753 : ReadBufferLen = READ_BUFFER_LENGTH_MAX;
00884 e3a03902 mov r3, #2, 18
00888 e58d3208 str r3, [sp, #0x208]
; 754 :
; 755 : //
; 756 : // Initialize the read buffer.
; 757 : //
; 758 : if (!InitReadBuffer(READ_BUFFER_START, ReadBufferLen))
0088c e59d1208 ldr r1, [sp, #0x208]
00890 e3a00602 mov r0, #2, 12
00894 eb000000 bl InitReadBuffer
00898 e58d0230 str r0, [sp, #0x230]
0089c e59d3230 ldr r3, [sp, #0x230]
008a0 e3530000 cmp r3, #0
008a4 1a000004 bne |$L38349|
; 759 : {
; 760 : SERPRINT("ERROR: Failed to initialize read buffer.\r\n");
008a8 e59f0024 ldr r0, [pc, #0x24]
008ac eb000000 bl EdbgOutputDebugString
; 761 : return(FALSE);
008b0 e3a03000 mov r3, #0
008b4 e58d3224 str r3, [sp, #0x224]
008b8 ea000001 b |$L38312|
008bc |$L38349|
; 762 : }
; 763 :
; 764 : #if defined( DUMP_FAT_INFO )
; 765 : SERPRINT("\r\nDrive Info:\r\n");
; 766 : SERPRINT(" - Drive ID ................... 0x%x\r\n", g_FATParms.DriveId);
; 767 : SERPRINT(" - Heads ...................... 0x%x\r\n", g_FATParms.NumHeads);
; 768 : SERPRINT(" - Number of Sectors Per Track 0x%x\r\n", g_FATParms.SectsPerTrack);
; 769 : SERPRINT(" - Sector Size ............... 0x%x\r\n\r\n", g_FATParms.BytesPerSect);
; 770 :
; 771 : SERPRINT("FAT Info:\r\n");
; 772 : SERPRINT(" - FAT Type ................... %s(%d)\r\n", FATType, g_FATParms.FATType );
; 773 : SERPRINT(" - Cluster Size ............... 0x%x\r\n", (g_FATParms.SectsPerClust * g_FATParms.BytesPerSect));
; 774 : SERPRINT(" - Number of FATs ............. 0x%x\r\n", g_FATParms.NumFATs);
; 775 : SERPRINT(" - Number of Sectors Per FAT .. 0x%x\r\n", g_FATParms.SectorsPerFAT);
; 776 : SERPRINT(" - Number of Hidden Sectors ... 0x%x\r\n", g_FATParms.NumHiddenSectors);
; 777 : SERPRINT(" - Number of Reserved Sectors . 0x%x\r\n\r\n", g_FATParms.ReservedSects);
; 778 : SERPRINT(" - Root dir location (LBA) .... 0x%x\r\n", g_FATParms.RootDirLBA);
; 779 : SERPRINT(" - FAT location (LBA) ......... 0x%x\r\n", g_FATParms.FATLBA);
; 780 : SERPRINT(" - Data location (LBA) ........ 0x%x\r\n\r\n", g_FATParms.DataStartLBA);
; 781 :
; 782 : #if defined( DUMP_ROOT_DIR )
; 783 : DumpRootDir();
; 784 : #endif // (DUMP_ROOT_DIR )
; 785 :
; 786 : #if defined( DUMP_FAT_TABLE )
; 787 : DumpFATTable();
; 788 : #endif // ( DUMP_FAT_TABLE )
; 789 :
; 790 : #endif /
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -