1
0
forked from me/IronOS

first commit

This commit is contained in:
minidso
2016-04-30 20:56:50 +05:00
commit 4d014816a7
141 changed files with 77255 additions and 0 deletions

237
S100App/Src/2FAT12.c Normal file
View 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 *********************************/