📄 fat.c
字号:
#include <built_in.h>
#include "mmc.h"//<mmc.h>
#include "rom.h"//<rom.h>
//*************** MACROS ***************//
/* R閏up鑢e l'閠at d'un cluster. */
#define fat_cluster_is_free(F) (((F) & 0x0FFFFFFF) == 0x00000000)
#define fat_cluster_is_bad(F) (((F) & 0x0FFFFFFF) == 0x0FFFFFF7)
#define fat_cluster_is_last(F) ((F) >= 0x0FFFFFF8)
#define fat_cluster_is_next(F) \
\
(!fat_cluster_is_free(F) && \
!fat_cluster_is_bad(F) && \
!fat_cluster_is_last(F))
#define fat_cluster_is_not_next(F) \
\
(fat_cluster_is_free(F) || \
fat_cluster_is_bad(F) || \
fat_cluster_is_last(F))
//*************** VARIABLES GLOBALES ***************//
typedef struct { /* Fichier. */
unsigned long entry_block; /* Bloc de l'entr閑 du fichier. */
unsigned int entry_byte; /* Octet de l'entr閑 du fichier dans son bloc. */
unsigned long first_cluster; /* Num閞o du premier cluster du fichier. */
unsigned long size; /* Taille du fichier. */
} fat_file;
/* Sauvegardes des derni鑢es op閞ations. */
unsigned long fat_last_block = 0xFFFFFFFF;
unsigned long fat_last_cluster;
unsigned short fat_last_cluster_block;
fat_file *fat_last_read_block_file = 0x00;
unsigned long fat_last_read_block_nb_cluster = 0xFFFFFFFF;
unsigned long fat_last_read_line_offset = 0;
//*************** FONCTIONS "PRIVEES" ***************//
/* Num閞o de bloc de l'entr閑 d'un cluster dans la FAT. */
unsigned long fat_cluster_to_entry_block(unsigned long cluster) {
return cluster / (MMC_BLOCK_LENGTH / 4) + 38;
}
/* Num閞o du premier bloc d'un cluster. */
unsigned long fat_cluster_to_block(unsigned long cluster) {
return 8 * (cluster - 2) + 3960;
}
/* Octet de l'entr閑 d'un cluster dans la FAT. */
unsigned long fat_cluster_to_fat_byte(unsigned long cluster) {
return 4 * (cluster % (MMC_BLOCK_LENGTH / 4));
}
/* Sauve le bloc en cours sur la carte. */
unsigned short fat_save_block() {
unsigned int i;
/* Ouverture d'un bloc en 閏riture. */
mmc_open_write_block_inline(fat_last_block);
/* Ecriture des donn閑s. */
for( i = 0; i < MMC_BLOCK_LENGTH; ++i)
mmc_write(flash_read(rom_address + i));
/* V閞ification d'閏riture et fermeture du bloc. */
mmc_write_verif_inline();
mmc_close_block_inline();
return 0;
}
/* Charge un bloc dans le tampon. */
unsigned short fat_load_block(unsigned long block) {
unsigned int i;
/* Si le bloc n'a pas d閖
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -