romfile.c
来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 229 行
C
229 行
#ifdef __BOOT__
#include "../../SysUpdate/ShareSrc/Kernel.h"
#else
#include "Kernel.h"
#endif
#include "romfile.h"
ROM_FILE_TABLE romFileTable[ROM_FILE_NUM];
ROM_HANDLE_TABLE romHandleTable[ROM_FILE_NUM * ROM_FILE_USER];
const ROM_FILE_AREA romFileArea[] = {{0x0, 0x5000},{0x5000, 0x37000}};
BOOL isRomFileHandle(INT fd)
{
return (fd >= ROM_FILE_HANDLE);
}
INT32 RomSearchFileName(UINT8 *pFileName)
{
UINT32 i;
UINT32 area;
area = 1;
if(pFileName[0] == 'd' || pFileName[0] == 'D'){
area = 0;
}
for(i = 0; i < ROM_FILE_NUM * ROM_FILE_USER; i++){
if(memicmp(romFileTable[i].name, pFileName + 3, 12) == 0){
if(romFileTable[i].area == area){
return i;
}
}
}
return -1;
}
INT32 RomSearchFreeHandle(void)
{
UINT32 i;
for(i = 0; i < ROM_FILE_NUM * ROM_FILE_USER; i++){
if(romHandleTable[i].state == HANDLE_CLOSED){
return i;
}
}
return -1;
}
BOOL romFileInitial(VOID)
{
UINT8 *buf;
UINT32 i, j;
memset(&romFileTable[0], 0, sizeof(romFileTable));
memset(&romHandleTable[0], 0, sizeof(romHandleTable));
buf = (UINT8*)MemAlloc(((ROM_FILE_NUM + 1) * (12 + 4) / 512 + 1) * 512);
if (!buf){
return FALSE;
}
i = 0;
// read rom file table from area "D"
if(!FlashIoEx(0, romFileArea[0].firstSector, buf, ((ROM_FILE_NUM + 1) * (12 + 4) / 512 + 1), 1)){
MemFree(buf);
return FALSE;
}
//??? we should check it
for(; i < ROM_FILE_NUM; i++){
memcpy(romFileTable[i].name, buf + i * (12 + 4), 12);
if(romFileTable[i].name[0] == 0xff){
break;
}
romFileTable[i].area = 0;
romFileTable[i].offset = *((UINT32 *)(buf + i * (12 + 4) + 12));
romFileTable[i].length = *((UINT32 *)(buf + (i + 1) * (12 + 4) + 12)) - romFileTable[i].offset;
}
// read rom file table from area "C"
if(!FlashIoEx(0, romFileArea[1].firstSector, buf, ((ROM_FILE_NUM + 1) * (12 + 4) / 512 + 1), 1)){
MemFree(buf);
return FALSE;
}
//??? we should check it
for(j = i; j < ROM_FILE_NUM; j++){
memcpy(romFileTable[j].name, buf + (j - i) * (12 + 4), 12);
if(romFileTable[j].name[0] == 0xff){
break;
}
romFileTable[j].area = 1;
romFileTable[j].offset = *((UINT32 *)(buf + (j - i) * (12 + 4) + 12));
romFileTable[j].length = *((UINT32 *)(buf + (j - i + 1) * (12 + 4) + 12)) - romFileTable[j].offset;
}
MemFree(buf);
return TRUE;
}
INT romFileOpen(UINT8 *pFileName, UINT8 openMode)
{
INT32 tableNum;
INT32 handleNum;
handleNum = RomSearchFreeHandle();
if(handleNum == -1){
return NUF_NO_MEMORY;
}
tableNum = RomSearchFileName(pFileName);
if(tableNum == -1){
return NUF_NOFILE;
}
romFileTable[tableNum].user ++;
romHandleTable[handleNum].fileTable = &romFileTable[tableNum];
romHandleTable[handleNum].current = 0;
romHandleTable[handleNum].state = HANDLE_OPENED;
return handleNum + ROM_FILE_HANDLE;
}
STATUS romFileClose(INT fd)
{
if(romHandleTable[fd - ROM_FILE_HANDLE].fileTable -> user == 0){
return NUF_BADFILE;
}
if(romHandleTable[fd - ROM_FILE_HANDLE].state != HANDLE_OPENED){
return NUF_BADFILE;
}
romHandleTable[fd - ROM_FILE_HANDLE].fileTable -> user --;
romHandleTable[fd - ROM_FILE_HANDLE].state = HANDLE_CLOSED;
return NU_SUCCESS;
}
INT32 romFileRead(INT fd, CHAR *buf, INT32 count)
{
UINT32 current = romHandleTable[fd - ROM_FILE_HANDLE].current;
UINT32 area = romHandleTable[fd - ROM_FILE_HANDLE].fileTable->area;
UINT32 offset = romHandleTable[fd - ROM_FILE_HANDLE].fileTable->offset;
UINT32 length = romHandleTable[fd - ROM_FILE_HANDLE].fileTable->length;
UINT32 tempcount = count;
UINT8 *tempbuf;
tempbuf = (UINT8*)MemAlloc(512);
if (!tempbuf){
return NUF_NO_MEMORY;
}
// read the first page
if((offset + current) % 512){
if(!FlashIoEx(0, romFileArea[area].firstSector + (offset + current) / 512, tempbuf, 1, 1)){
MemFree(tempbuf);
return NUF_IO_ERROR;
}
if((offset + current) % 512 + tempcount <= 512){
memcpy(buf, tempbuf + (offset + current) % 512, tempcount);
romHandleTable[fd - ROM_FILE_HANDLE].current += tempcount;
MemFree(tempbuf);
return tempcount;
}
memcpy(buf, tempbuf + (offset + current) % 512, 512 - (offset + current) % 512);
buf += (512 - (offset + current) % 512);
tempcount -= (512 - (offset + current) % 512);
current += (512 - (offset + current) % 512);
}
// read middle pages
if(tempcount <= 512){
if(!FlashIoEx(0, romFileArea[area].firstSector + (offset + current) / 512, tempbuf, 1, 1)){
MemFree(tempbuf);
return NUF_IO_ERROR;
}
memcpy(buf, tempbuf, tempcount);
romHandleTable[fd - ROM_FILE_HANDLE].current += count;
MemFree(tempbuf);
return count;
}
if(!FlashIoEx(0, romFileArea[area].firstSector + (offset + current) / 512, buf, tempcount/512, 1)){
MemFree(tempbuf);
return NUF_IO_ERROR;
}
buf += (tempcount/512*512);
current += (tempcount/512*512);
tempcount -= (tempcount/512*512);
// read the last page
if(tempcount){
if(!FlashIoEx(0, romFileArea[area].firstSector + (offset + current) / 512, tempbuf, 1, 1)){
MemFree(tempbuf);
return NUF_IO_ERROR;
}
memcpy(buf, tempbuf, tempcount);
}
romHandleTable[fd - ROM_FILE_HANDLE].current += count;
MemFree(tempbuf);
return count;
}
INT32 romFileSeek(INT fd, INT32 offset, INT16 origin)
{
switch(origin){
case FILESEEK_BEGIN:
if(offset < romHandleTable[fd - ROM_FILE_HANDLE].fileTable -> length){
romHandleTable[fd - ROM_FILE_HANDLE].current = offset;
return offset;
}else{
return NUF_MAXFILE_SIZE;
}
case FILESEEK_CURRENT:
if(offset + romHandleTable[fd - ROM_FILE_HANDLE].current
< romHandleTable[fd - ROM_FILE_HANDLE].fileTable -> length){
romHandleTable[fd - ROM_FILE_HANDLE].current += offset;
return romHandleTable[fd - ROM_FILE_HANDLE].current;
}else{
return NUF_MAXFILE_SIZE;
}
default:
return NUF_INVPARM;
}
}
INT32 romFileLength(INT fd)
{
return romHandleTable[fd - ROM_FILE_HANDLE].fileTable -> length;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?