mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
first commit
This commit is contained in:
237
S100App/Src/2FAT12.c
Normal file
237
S100App/Src/2FAT12.c
Normal file
@@ -0,0 +1,237 @@
|
||||
/********************* (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><EFBFBD>
|
||||
#define SEC_ERR 1 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||
#define FAT_ERR 2 // FAT<41><54><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||
#define OVER 3 // <20><><EFBFBD><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><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><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><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><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>ǰ<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 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><EFBFBD>
|
||||
}
|
||||
*pDirAddr += 32;
|
||||
}
|
||||
}
|
||||
return OVER;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
<20><>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غż<D8BA>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7> 0<>غż<D8BA><C5BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>հ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><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><EFBFBD>
|
||||
}
|
||||
*pDirAddr += 32;
|
||||
}
|
||||
}
|
||||
return OVER;
|
||||
}
|
||||
/*******************************************************************************
|
||||
дģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غż<D8BA>Ŀ¼<C4BF><C2BC><EFBFBD><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><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 *********************************/
|
||||
Reference in New Issue
Block a user