mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Create readme Started commenting the files in english NO Optimisations yet, just trying to get it all working over as is first Using newer STM StdPeriph libs (i think they are newer?)
238 lines
10 KiB
C
238 lines
10 KiB
C
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. ********************
|
||
File Name : 2FAT12.c
|
||
Version : S100 APP Ver 2.11
|
||
Description:
|
||
Author : bure & Celery
|
||
Data: 2015/08/03
|
||
History:
|
||
2015/08/03 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
*******************************************************************************/
|
||
#include <string.h>
|
||
#include "FAT12.h"
|
||
#include "Bios.h"
|
||
|
||
|
||
#define FAT_LEN 0x1800
|
||
#define FAT1_BASE 0x00001000 // FAT1<54><31><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||
#define FAT2_BASE 0x00002800 // FAT2<54><32><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||
#define ROOT_BASE 0x00004000 // <20><>Ŀ¼<C4BF><C2BC>ʼ<EFBFBD><CABC>ַ
|
||
#define FILE_BASE 0x00008000 // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||
#define SEC_LEN 0x200 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
#define FAT1_SEC 0x0C // FAT1<54><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
#define FAT2_SEC 0x0C // FAT2<54><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
#define OK 0 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
#define SEC_ERR 1 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||
#define FAT_ERR 2 // FAT<41><54><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||
#define OVER 3 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
#define NEW 4 // <20><>Ŀ¼<C4BF><C2BC>
|
||
#define END 0xFFF // <20><><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
|
||
|
||
#define OW 0 // <20><>д(<28><><EFBFBD>ݴ<EFBFBD>0<EFBFBD><30>1<EFBFBD><31>д)
|
||
#define RW 1 // <20><>д
|
||
|
||
|
||
/*******************************************************************************
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>Ӵغź<C5BA>
|
||
*******************************************************************************/
|
||
u8 NextCluster(u16* pCluster)
|
||
{
|
||
u16 FatNum;
|
||
u32 Addr = FAT1_BASE +(*pCluster + *pCluster/2);
|
||
|
||
*(pCluster+1)= *pCluster; // <20><><EFBFBD><EFBFBD>ǰһ<C7B0><D2BB><EFBFBD>غ<EFBFBD>
|
||
// *(pCluster+1)= 0;
|
||
if((*pCluster >= END)||(*pCluster < 2)) return OK;
|
||
if(ReadDiskData((u8*)&FatNum, Addr, 2)!= OK) return SEC_ERR;
|
||
*pCluster = (*pCluster & 1)?(FatNum >>4):(FatNum & 0x0FFF); // ָ<><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>
|
||
return OK;
|
||
}
|
||
/*******************************************************************************
|
||
<20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>(512 Bytes), <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>
|
||
*******************************************************************************/
|
||
u8 ReadFileSec(u8* pBuffer, u16* pCluster)
|
||
{
|
||
u32 ReadAddr = FILE_BASE + SEC_LEN*(*pCluster-2);
|
||
|
||
if(ReadDiskData(pBuffer, ReadAddr, 256)!=OK) return SEC_ERR; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
pBuffer += 256;
|
||
ReadAddr += 256;
|
||
if(ReadDiskData(pBuffer, ReadAddr, 256)!=OK) return SEC_ERR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(NextCluster(pCluster)!=0) return FAT_ERR; // ȡ<><C8A1>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>
|
||
return OK;
|
||
}
|
||
/*******************************************************************************
|
||
д<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>(512 Bytes)<29><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ǰFAT<41><54><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>
|
||
*******************************************************************************/
|
||
u8 ProgFileSec(u8* pBuffer, u16* pCluster)
|
||
{
|
||
u16 Tmp;
|
||
u32 ProgAddr = FILE_BASE + SEC_LEN*(*pCluster-2);
|
||
|
||
if(ProgDiskPage(pBuffer, ProgAddr)!= OK) return SEC_ERR; // дǰ<D0B4><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
pBuffer += 256;
|
||
ProgAddr += 256;
|
||
if(ProgDiskPage(pBuffer, ProgAddr)!= OK) return SEC_ERR; // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
Tmp = *pCluster;
|
||
switch(Tmp) {
|
||
case 0: // <20><><EFBFBD>дغ<D0B4>
|
||
case 1: // <20><><EFBFBD>дغ<D0B4>
|
||
if(SeekBlank (pBuffer, pCluster )!= OK) return OVER;
|
||
if(SetCluster(pBuffer, pCluster )!= OK) return SEC_ERR;
|
||
*(pCluster+1) = Tmp;
|
||
return OK;
|
||
case END: // <20><><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
|
||
default :
|
||
if(NextCluster(pCluster)!= OK) return FAT_ERR; // ȡ<><C8A1>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>
|
||
return OK;
|
||
}
|
||
}
|
||
/*******************************************************************************
|
||
<20><><EFBFBD>ҿ<EFBFBD><D2BF>дغţ<D8BA><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>дغż<D8BA><C5BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>дغ<D0B4>
|
||
*******************************************************************************/
|
||
u8 SeekBlank(u8* pBuffer, u16* pCluster)
|
||
{
|
||
u16 Offset, Tmp, i, n = 0;
|
||
u32 SecAddr;
|
||
|
||
for(i=0; i<4096; i++) {
|
||
Offset = i + i/2;
|
||
if((Offset%256)== 0) {
|
||
SecAddr = FAT1_BASE +(Offset &(~0xFF));
|
||
if(ReadDiskData(pBuffer, SecAddr, 258)!= 0) return SEC_ERR;
|
||
}
|
||
Offset %= 256;
|
||
Tmp = pBuffer[Offset] + (pBuffer[Offset+1] <<8);
|
||
Tmp = (i & 1)?(Tmp >>4):(Tmp & 0xFFF);
|
||
if(Tmp == 0) {
|
||
*pCluster++ = i;
|
||
n++;
|
||
if(n > 1) return OK;
|
||
}
|
||
}
|
||
*(pCluster+1)= 0xFFF;
|
||
return OK;
|
||
}
|
||
/*******************************************************************************
|
||
<20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>д<EFBFBD><D0B4>FAT<41><54>ǰ<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ǰ<EFBFBD>غ<EFBFBD>Ϊԭ<CEAA><D4AD>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>
|
||
*******************************************************************************/
|
||
u8 SetCluster(u8* pBuffer, u16* pCluster)
|
||
{
|
||
u16 Offset, Tmp, i, k;
|
||
u32 SecAddr;
|
||
|
||
i = *pCluster; // <20><>ȡԭ<C8A1><D4AD>ǰ<EFBFBD>غ<EFBFBD>
|
||
k = *(pCluster+1); // <20><>ȡ<EFBFBD><C8A1>һ<EFBFBD>غ<EFBFBD>
|
||
*pCluster = k;
|
||
Offset = i + i/2;
|
||
SecAddr = FAT1_BASE +(Offset &(~0xFF));
|
||
Tmp = Offset & 0xFF;
|
||
if(ReadDiskData(pBuffer, SecAddr, 256)!= 0) return SEC_ERR;
|
||
if(i & 1) pBuffer[Tmp]=((k<<4)& 0xF0)+(pBuffer[Tmp]& 0x0F);
|
||
else pBuffer[Tmp]= k;
|
||
if(Tmp++ < 256) {
|
||
if(i & 1) pBuffer[Tmp]= k>>4;
|
||
else pBuffer[Tmp]=((k>>8)& 0x0F)+(pBuffer[Tmp]& 0xF0);
|
||
if(ProgDiskPage(pBuffer, SecAddr)!= 0) return SEC_ERR;
|
||
} else {
|
||
if(ProgDiskPage(pBuffer, SecAddr)!= 0) return SEC_ERR;
|
||
SecAddr += 256;
|
||
if(ReadDiskData(pBuffer, SecAddr, 256)!= 0) return SEC_ERR;
|
||
if(i & 1) pBuffer[0]= k>>4;
|
||
else pBuffer[0]=((k>>8)& 0x0F)+(pBuffer[0]& 0xF0);
|
||
if(ProgDiskPage(pBuffer, SecAddr)!= 0) return SEC_ERR;
|
||
}
|
||
return OK;
|
||
}
|
||
/*******************************************************************************
|
||
|
||
*******************************************************************************/
|
||
u8 FAT_SearchFile(u8* pBuffer, u8* pFileName, u16* pCluster, u32* pDirAddr,u32* flag)
|
||
{
|
||
u16 i, n;
|
||
|
||
*pCluster = 0;
|
||
for(*pDirAddr=ROOT_BASE; *pDirAddr<FILE_BASE; ) {
|
||
if(ReadDiskData(pBuffer, *pDirAddr, 256)!= OK) return SEC_ERR;
|
||
for(n=0; n<256; n+=32) {
|
||
for(i=0; i<4; i++) {
|
||
if(pBuffer[n + i]!= 0) {
|
||
if(pBuffer[n + i]!= pFileName[i]) break;
|
||
if(i == 3) { // <20>ҵ<EFBFBD><D2B5>ļ<EFBFBD><C4BC><EFBFBD>
|
||
*pCluster = *(u16*)(pBuffer + n + 0x1A); // <20>ļ<EFBFBD><C4BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>
|
||
return OK;
|
||
}
|
||
} else return NEW; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>հ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>
|
||
}
|
||
*pDirAddr += 32;
|
||
}
|
||
}
|
||
return OVER;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
<20><>ģʽ<C4A3><CABD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غż<D8BA>Ŀ¼<C4BF><C2BC><EFBFBD>ַ<EFBFBD><D6B7> 0<>غż<D8BA><C5BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>հ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>ַ
|
||
*******************************************************************************/
|
||
u8 OpenFileRd(u8* pBuffer, u8* pFileName, u16* pCluster, u32* pDirAddr)
|
||
{
|
||
u16 i, n;
|
||
|
||
*pCluster = 0;
|
||
for(*pDirAddr=ROOT_BASE; *pDirAddr<FILE_BASE; ) {
|
||
if(ReadDiskData(pBuffer, *pDirAddr, 256)!= OK) return SEC_ERR;
|
||
for(n=0; n<256; n+=32) {
|
||
for(i=0; i<11; i++) {
|
||
if(pBuffer[n + i]!= 0) {
|
||
if(pBuffer[n + i]!= pFileName[i]) break;
|
||
if(i == 10) { // <20>ҵ<EFBFBD><D2B5>ļ<EFBFBD><C4BC><EFBFBD>
|
||
*pCluster = *(u16*)(pBuffer + n + 0x1A); // <20>ļ<EFBFBD><C4BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>
|
||
return OK;
|
||
}
|
||
} else return NEW; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>հ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>
|
||
}
|
||
*pDirAddr += 32;
|
||
}
|
||
}
|
||
return OVER;
|
||
}
|
||
/*******************************************************************************
|
||
дģʽ<C4A3><CABD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غż<D8BA>Ŀ¼<C4BF><C2BC><EFBFBD>ַ
|
||
*******************************************************************************/
|
||
u8 OpenFileWr(u8* pBuffer, u8* pFileName, u16* pCluster, u32* pDirAddr)
|
||
{
|
||
u16 i, n;
|
||
|
||
i = OpenFileRd(pBuffer, pFileName, pCluster, pDirAddr);
|
||
if(i != NEW) return i;
|
||
else { // <20><>ǰ<EFBFBD><C7B0>Ϊ<EFBFBD>հ<EFBFBD>Ŀ¼<C4BF><C2BC>
|
||
if(SeekBlank(pBuffer, pCluster)!= OK) return OVER; // <20><>FAT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
n =*pDirAddr & 0xFF; // nΪ<6E><CEAA>ǰҳĿ¼<C4BF><C2BC>
|
||
if(ReadDiskData(pBuffer,(*pDirAddr)-n, 256)!= OK) return SEC_ERR;
|
||
for(i=0; i<11; i++) pBuffer[n + i]= pFileName[i]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>
|
||
*(u16*)(pBuffer + n + 0x1A)= *pCluster;
|
||
if(ProgDiskPage(pBuffer,(*pDirAddr)-n)!= OK) return SEC_ERR;
|
||
return OK;
|
||
}
|
||
}
|
||
/*******************************************************************************
|
||
<20>ر<EFBFBD><D8B1>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>FAT<41><54><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ŀ¼<C4BF><EFBFBD><EEA3AC><EFBFBD><EFBFBD>FAT1<54><31>FAT2
|
||
*******************************************************************************/
|
||
u8 CloseFile(u8* pBuffer, u32 Lenght, u16* pCluster, u32* pDirAddr)
|
||
{
|
||
u16 n;
|
||
|
||
// *pCluster = *(pCluster+1); // <20><>ȡǰһ<C7B0><D2BB><EFBFBD>غ<EFBFBD>
|
||
*(pCluster+1) = 0xFFF;
|
||
SetCluster(pBuffer, pCluster);
|
||
if(ReadDiskData(pBuffer, (*pDirAddr &(~0xFF)), 256)!= OK) return SEC_ERR;
|
||
*(u8* )(pBuffer +(*pDirAddr & 0xFF)+ 0x0B)= 0x20;
|
||
*(u32*)(pBuffer +(*pDirAddr & 0xFF)+ 0x1C)= Lenght;
|
||
if(ProgDiskPage(pBuffer, (*pDirAddr &(~0xFF)))!= OK) return SEC_ERR;
|
||
for(n=0; n<FAT1_SEC; n++) {
|
||
if(ReadDiskData(pBuffer, FAT1_BASE+n*256, 256)!= OK) return SEC_ERR;
|
||
if(ProgDiskPage(pBuffer, FAT2_BASE+n*256 )!= OK) return SEC_ERR;
|
||
}
|
||
return OK;
|
||
}
|
||
/******************************** END OF FILE *********************************/
|