#include "file_local.h"
-#include "volume/dev/devvol.h"
C_FILE g_File;
-C_DEVVOL g_DevVol;
void File_Initialize(void)
#include <stdio.h>
#include <string.h>
#include "file_local.h"
-#include "volume.h"
/* ファイルのオープン */
+++ /dev/null
-/**
- * Hyper Operating System Application Framework
- *
- * @file volume.h
- * @brief %jp{ボリュームオブジェクト}
- *
- * %jp{ディスクドライブなどの単位をボリュームとして扱う}
- *
- * Copyright (C) 2006 by Project HOS
- * http://sourceforge.jp/projects/hos/
- */
-
-
-#ifndef __HOS__volume_h__
-#define __HOS__volume_h__
-
-#include "file.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-HANDLE Volume_OpenFile(HANDLE hVolume, const char *pszPath, int iMode); /* ファイルを開く */
-FILE_ERR Volume_MakeDir(HANDLE hVolume, const char *pszPath); /* サブディレクトリを作成 */
-FILE_ERR Volume_Remove(HANDLE hVolume, const char *pszPath); /* ファイルを削除 */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
-#endif /* __HOS__volume_h__ */
-
-
-/* end of file */
+++ /dev/null
-
-#include <stdio.h>
-#include "volume.h"
-#include "volumeobj.h"
-
-
-HANDLE Volume_OpenFile(HANDLE hVolume, const char *pszPath, int iMode)
-{
- C_VOLUMEOBJ *self;
-
- self = (C_VOLUMEOBJ *)hVolume;
-
- if ( self->pMethods->pfncOpenFile == NULL )
- {
- return HANDLE_NULL;
- }
-
- return self->pMethods->pfncOpenFile(hVolume, pszPath, iMode);
-}
-
+++ /dev/null
-/**
- * Hyper Operating System Application Framework
- *
- * @file devvol.h
- * @brief %jp{デバイスドライバをファイルとして管理するボリューム}
- *
- * Copyright (C) 2006-2007 by Project HOS
- * http://sourceforge.jp/projects/hos/
- */
-
-
-#ifndef __HOS__devvol_h__
-#define __HOS__devvol_h__
-
-
-#include "system/file/file.h"
-#include "system/file/volumeobj.h"
-
-
-#define DEVVOL_MAX_DEVICE 16
-
-/* デバイス情報 */
-struct c_drvobj;
-typedef struct t_devvol_devinf
-{
- char szName[FILE_MAX_NAME]; /* デバイス名 */
- struct c_drvobj *pDrvObj; /* デバイスドライバへの参照 */
-} T_DEVVOL_DEVINF;
-
-
-/* */
-typedef struct c_devvol
-{
- C_VOLUMEOBJ VolumeObj; /* ボリュームオブジェクトを継承 */
-
- T_DEVVOL_DEVINF DevTable[DEVVOL_MAX_DEVICE];
-} C_DEVVOL;
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void DevVol_Create(C_DEVVOL *self);
-FILE_ERR DevVol_AddDevice(C_DEVVOL *self, const char *pszName, struct c_drvobj *pDrvObj);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __HOS__devdir_h__ */
-
-
-
-/* end of file */
+++ /dev/null
-
-#include <string.h>
-#include "devvol_local.h"
-
-
-FILE_ERR DevVol_AddDevice(C_DEVVOL *self, const char *pszName, struct c_drvobj *pDrvObj)
-{
- int i;
-
- /* テーブルの空きを検索 */
- for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
- {
- if ( self->DevTable[i].pDrvObj == NULL )
- {
- strcpy(self->DevTable[i].szName, pszName);
- self->DevTable[i].pDrvObj = pDrvObj;
- return FILE_ERR_OK;
- }
- }
-
- return FILE_ERR_NG;
-}
+++ /dev/null
-
-#include <stdio.h>
-#include "devvol_local.h"
-
-
-const T_VOLUMEOBJ_METHODS DevVol_VolumeObjMethods =
-{
- {
- DevVol_Delete,
- DevVol_OpenFile,
-
- },
- NULL,
- NULL,
-};
-
-
-void DevVol_Create(C_DEVVOL *self)
-{
- int i;
-
- /* 親クラスコンストラクタ呼び出し */
- VolumeObj_Create(&self->VolumeObj, &DevVol_VolumeObjMethods);
-
- /* 初期化 */
- for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
- {
- self->DevTable[i].pDrvObj = NULL;
- }
-}
-
-
+++ /dev/null
-#include "devvol_local.h"
-
-void DevVol_Delete(HANDLE hVolume)
-{
-}
-
+++ /dev/null
-
-#ifndef __HOS__devvol_local_h__
-#define __HOS__devvol_local_h__
-
-
-#include "devvol.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void DevVol_Delete(HANDLE hVolume);
-HANDLE DevVol_OpenFile(HANDLE hVolume, const char *pszPath, int iMode); /* ファイルを開く */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif
+++ /dev/null
-#include <stdio.h>
-#include <string.h>
-#include "devvol_local.h"
-#include "system/sysapi/sysapi.h"
-#include "system/file/drvobj.h"
-
-
-/* ファイルを開く */
-HANDLE DevVol_OpenFile(HANDLE hVolume, const char *pszPath, int iMode)
-{
- C_DEVVOL *self;
- int i;
-
- self = (C_DEVVOL *)hVolume;
-
-
- /* 先頭の'/'を読み飛ばし */
- pszPath++;
-
- /* デバイスを検索 */
- for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
- {
- if ( strcmp(pszPath, self->DevTable[i].szName) == 0 )
- {
- break;
- }
- }
- if ( i >= DEVVOL_MAX_DEVICE )
- {
- return HANDLE_NULL;
- }
-
- return DrvObj_vOpen(self->DevTable[i].pDrvObj, pszPath, iMode);
-}
-
-
-/* end of file */
-
+++ /dev/null
-/**
- * Hyper Operating System Application Framework
- *
- * @file fatfile.h
- * @brief %jp{FATファイルシステム ファイルI/Fクラス}
- *
- * Copyright (C) 2006 by Project HOS
- * http://sourceforge.jp/projects/hos/
- */
-
-
-#ifndef __HOS__fatfile_h__
-#define __HOS__fatfile_h__
-
-
-#include "system/file/fileobj.h"
-#include "fatvol.h"
-
-
-typedef struct c_fatfile
-{
- C_FILEOBJ FileObj; /* ファイルオブジェクトを継承 */
-
- int iMode; /* ファイルのモード */
- C_FATVOL *pFatVol; /* FatVolクラスの参照 */
- FATVOL_UINT uiStartCluster; /* ファイルの先頭クラスタ */
- HANDLE hDir; /* 所属するディレクトリのハンドル */
- int iDirEntry; /* ディレクトリ内のエントリ位置 */
-
- FILE_POS FilePos; /* ファイルポインタ */
- FILE_POS FileSize; /* ファイルサイズ */
-
- FATVOL_UINT uiCurrentCluster; /* 現在のクラスタ */
- FATVOL_UINT uiClusterSize; /* クラスタサイズ */
-} C_FATFILE;
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-FILE_ERR FatFile_Create(C_FATFILE *self, C_FATVOL *pFatVol, FATVOL_UINT uiCluster, HANDLE hDir, int iDirEntry, int iMode); /**< コンストラクタ */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __HOS__pc16550file_h__ */
-
-
-/* end of file */
+++ /dev/null
-
-#include <stdio.h>
-#include "fatfile_local.h"
-
-
-const T_FILEOBJ_METHODS FatFile_FileObjMethods =
-{
-/* { FatFile_Delete }, */ /* デストラクタ */
- FatFile_IoControl, /* IoControl */
- FatFile_Seek, /* Seek */
- FatFile_Read, /* Read */
- FatFile_Write, /* Write */
-};
-
-
-FILE_ERR FatFile_Create(C_FATFILE *self, C_FATVOL *pFatVol, FATVOL_UINT uiCluster, HANDLE hDir, int iDirEntry, int iMode)
-{
- /* 親クラスコンストラクタ呼び出し */
- FileObj_Create(&self->FileObj, &FatFile_FileObjMethods);
-
- /* 初期化 */
- self->iMode = iMode;
- self->pFatVol = pFatVol;
- self->uiStartCluster = uiCluster;
- self->hDir = hDir;
- self->iDirEntry = iDirEntry;
-
- /* サイズ取得 */
- if ( hDir == NULL )
- {
-
- }
-
- /* ファイルポインタ初期化 */
- self->FilePos = 0;
- self->uiCurrentCluster = self->uiStartCluster;
-
-
- return FILE_ERR_OK;
-}
-
-
-/* end of file */
+++ /dev/null
-/**
- * Hyper Operating System Application Framework
- *
- * @file fatfile.h
- * @brief %jp{FATファイルシステム ファイルI/Fクラス}
- *
- * Copyright (C) 2006 by Project HOS
- * http://sourceforge.jp/projects/hos/
- */
-
-
-#ifndef __HOS__fatfile_local_h__
-#define __HOS__fatfile_local_h__
-
-
-#include "fatfile.h"
-#include "fatvol_local.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void FatFile_Delete(HANDLE hFile);
-FILE_ERR FatFile_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize);
-FILE_POS FatFile_Seek(HANDLE hFile, FILE_POS Offset, int iOrign);
-FILE_SIZE FatFile_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size);
-FILE_SIZE FatFile_Write(HANDLE hFile, const void *pData, FILE_SIZE Size);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __HOS__fatfile_local_h__ */
-
-
-/* end of file */
+++ /dev/null
-
-
-#include <string.h>
-#include "fatfile_local.h"
-
-
-/* 読み出し */
-FILE_SIZE FatFile_Read(
- HANDLE hFile,
- void *pBuf,
- FILE_SIZE Size)
-{
- C_FATFILE *self;
- void *pClusterBuf;
- FATVOL_UINT ulBlock;
- FILE_SIZE ReadSize;
-
- /* ハンドル取得 */
- self = (C_FATFILE *)hFile;
-
- /* サイズオーバーするなら */
- if ( self->FilePos + Size > self->FileSize )
- {
- /* サイズ更新されていないかディレクトリテーブルを参照 */
- if ( self->hDir != NULL )
- {
- }
- }
-
- /* サイズクリップ */
- if ( Size > self->FileSize - self->FilePos )
- {
- Size = self->FileSize - self->FilePos;
- }
-
- /* 要求読み出し量保存 */
- ReadSize = Size;
-
- /* 読み出し */
- while ( Size > 0 && self->FilePos < self->FileSize )
- {
- FILE_POS ReadStart;
- FILE_SIZE ReadSize;
- unsigned char *pubClusterBuf;
-
- /* 転送位置計算 */
- ReadStart = self->FilePos % self->uiClusterSize;
- ReadSize = self->uiClusterSize - ReadStart;
- if ( ReadSize > Size )
- {
- ReadSize = Size;
- }
-
- /* バッファ取得 */
- if ( FatVol_GetClusterBuf(self->pFatVol, self->uiCurrentCluster, &pClusterBuf, 1) != FATVOL_ERR_OK )
- {
- break;
- }
-
- /* 転送 */
- memcpy(pBuf, (char *)pClusterBuf + ReadStart, ReadSize);
-
- /* バッファ開放 */
- FatVol_RelClusterBuf(self->pFatVol, pClusterBuf, 0);
-
- /* サイズ更新 */
- self->FilePos += ReadSize;
- pBuf = (char *)pBuf + ReadSize;
- Size -= ReadSize;
-
- /* 次のクラスタに進む */
- self->uiCurrentCluster = FatVol_GetNextCluster(self->pFatVol, self->uiCurrentCluster);
- }
-
- return ReadSize - Size;
-}
-
-
-/* end of file */
+++ /dev/null
-
-
-#ifndef __HOS__fatvol_h__
-#define __HOS__fatvol_h__
-
-
-#include "system/sysapi/sysapi.h"
-#include "system/file/file.h"
-
-
-#define FATVOL_ERR_OK 0
-#define FATVOL_ERR_NG (-1)
-
-
-/* 型定義 */
-typedef unsigned long FATVOL_UINT;
-
-
-/* クラスタバッファ */
-typedef struct t_fatvol_clusterbuf
-{
- FATVOL_UINT uiClusterNum;
- int iDirty;
- unsigned char *pubBuf;
-} T_FATVOL_CLUSTERBUF;
-
-
-/* クラスタバッファ */
-typedef struct c_fatvol
-{
- HANDLE hBlockFile; /**< ブロックデバイスドライバのハンドル */
-
- int iFatType; /**< FATのタイプ */
- FATVOL_UINT uiOffset; /**< ディスクのオフセット */
- FATVOL_UINT uiDriveSize; /**< ドライブの総サイズ */
- FATVOL_UINT uiBytesPerSector; /**< セクタサイズ */
- FATVOL_UINT uiSectorsPerCluster; /**< クラスタサイズ */
- FATVOL_UINT uiFatStartSector; /**< FATの開始セクタ番号 */
- FATVOL_UINT uiSectorPerFat; /**< FATあたりのセクタ数 */
- FATVOL_UINT uiFatNum; /**< FATの個数 */
- FATVOL_UINT uiRootDirEntryNum; /**< ルートディレクトリのエントリ数 */
- FATVOL_UINT uiRootDirSector; /**< ルートディレクトリのセクタ */
- FATVOL_UINT uiCluster0Sector; /**< クラスタ0のセクタ番号 */
- FATVOL_UINT uiMaxClusterNum;
- FATVOL_UINT uiRootDirCluster;
-
- unsigned char *pubFatBuf; /**< FATのバッファリングメモリ */
- unsigned char *pubFatDirty; /**< FATの更新フラグ */
-
- T_FATVOL_CLUSTERBUF *pClusterBuf;
- int iClusterBufNum;
- int iClusterBufIndex;
-} C_FATVOL;
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int FatVol_Create(C_FATVOL *self, HANDLE hBlockFile);
-void FatVol_Delete(C_FATVOL *self);
-HANDLE FatVol_CreateFile(C_FATVOL *self, FATVOL_UINT uiCluster, HANDLE hDir, int iDirEntry, int iMode);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __HOS__fatdrive_h__ */
-
-
+++ /dev/null
-#include "fatvol_local.h"
-
-
-/** クラスタ読み込み */
-int FatVol_ClusterRead(
- C_FATVOL *self,
- FATVOL_UINT uiCluster,
- void *pBuf)
-{
- FATVOL_UINT uiPos;
- FATVOL_UINT uiSize;
-
- if ( uiCluster >= 0xffff0000 && (self->iFatType == FATVOL_TYPE_FAT12 || self->iFatType == FATVOL_TYPE_FAT16) )
- {
- /* FAT12/16 のルートディレクトリを 0xf0000000 にマップ */
- uiCluster -= 0xf0000000;
-
- /* 読み出し位置移動 */
- uiPos = (self->uiRootDirSector + (uiCluster * self->uiSectorsPerCluster)) * self->uiBytesPerSector;
- if ( File_Seek(self->hBlockFile, uiPos, FILE_SEEK_SET) != uiPos )
- {
- return FATVOL_ERR_NG;
- }
-
- /* 読み出し */
- uiSize = self->uiBytesPerSector * self->uiSectorsPerCluster;
- if ( File_Read(self->hBlockFile, pBuf, uiSize) != uiSize )
- {
- return FATVOL_ERR_NG;
- }
- }
- else
- {
- /* 読み出し位置移動 */
- uiPos = (self->uiCluster0Sector + (uiCluster * self->uiSectorsPerCluster)) * self->uiBytesPerSector;
- if ( File_Seek(self->hBlockFile, uiPos, FILE_SEEK_SET) != uiPos )
- {
- return FATVOL_ERR_NG;
- }
-
- /* 読み出し */
- uiSize = self->uiBytesPerSector * self->uiSectorsPerCluster;
- if ( File_Read(self->hBlockFile, pBuf, uiSize) != uiSize )
- {
- return FATVOL_ERR_NG;
- }
- }
-
- return FATVOL_ERR_OK;
-}
-
-
-/* end of file */
+++ /dev/null
-
-#include "fatvol_local.h"
-
-
-/** クラスタ書き込み */
-int FatVol_ClusterWrite(
- C_FATVOL *self,
- FATVOL_UINT uiCluster,
- const void *pBuf)
-{
- FATVOL_UINT uiPos;
- FATVOL_UINT uiSize;
-
- if ( uiCluster >= 0xffff0000 && (self->iFatType == FATVOL_TYPE_FAT12 || self->iFatType == FATVOL_TYPE_FAT16) )
- {
- /* FAT12/16 のルートディレクトリを 0xffff0000 にマップ */
- uiCluster -= 0xf0000000;
-
- /* 書き出し位置移動 */
- uiPos = (self->uiRootDirSector + (uiCluster * self->uiSectorsPerCluster)) * self->uiBytesPerSector;
- if ( File_Seek(self->hBlockFile, uiPos, FILE_SEEK_SET) != uiPos )
- {
- return FATVOL_ERR_NG;
- }
-
- /* 書き出し */
- uiSize = self->uiBytesPerSector * self->uiSectorsPerCluster;
- if ( File_Write(self->hBlockFile, pBuf, uiSize) != uiSize )
- {
- return FATVOL_ERR_NG;
- }
- }
- else
- {
- /* 書き出し位置移動 */
- uiPos = (self->uiCluster0Sector + (uiCluster * self->uiSectorsPerCluster)) * self->uiBytesPerSector;
- if ( File_Seek(self->hBlockFile, uiPos, FILE_SEEK_SET) != uiPos )
- {
- return FATVOL_ERR_NG;
- }
-
- /* 書き出し */
- uiSize = self->uiBytesPerSector * self->uiSectorsPerCluster;
- if ( File_Write(self->hBlockFile, pBuf, uiSize) != uiSize )
- {
- return FATVOL_ERR_NG;
- }
- }
-
- return FATVOL_ERR_OK;
-}
-
-
-/* end of file */
+++ /dev/null
-
-#include <string.h>
-#include "fatvol_local.h"
-
-
-int FatVol_Create(C_FATVOL *self, HANDLE hBlockFile)
-{
- unsigned char ubBuf[512];
- int i;
-
- /* ドライブの設定 */
- self->hBlockFile = hBlockFile;
- self->uiOffset = 0x33*512;
-
- /* サイズ取得 */
- self->uiDriveSize = File_Seek(self->hBlockFile, FILE_SEEK_END, 0);
- self->iFatType = FATVOL_TYPE_UNKNOWN;
-
- /* BIOS Parameter Block */
- File_Seek(self->hBlockFile, self->uiOffset, FILE_SEEK_SET);
- File_Read(self->hBlockFile, ubBuf, 512);
-
- /* FAT12/16/32判定 */
- if ( ubBuf[0x36] == 'F' && ubBuf[0x37] == 'A' && ubBuf[0x38] == 'T' && ubBuf[0x39] == '1' )
- {
- if ( ubBuf[0x3a] == '2' )
- {
- self->iFatType = FATVOL_TYPE_FAT12;
- }
- else if ( ubBuf[0x3a] == '6' )
- {
- self->iFatType = FATVOL_TYPE_FAT16;
- }
- }
- else if ( ubBuf[0x52] == 'F' && ubBuf[0x53] == 'A' && ubBuf[0x54] == 'T' && ubBuf[0x55] == '3' && ubBuf[0x56] == '2')
- {
- self->iFatType = FATVOL_TYPE_FAT32;
- }
-
- /* フォーマット別情報解析 */
- switch ( self->iFatType )
- {
- case FATVOL_TYPE_FAT12:
- case FATVOL_TYPE_FAT16:
- self->uiBytesPerSector = ubBuf[0x0b] + ubBuf[0x0c] * 256; /**< セクタサイズ */
- self->uiSectorsPerCluster = ubBuf[0x0d]; /**< 1クラスタのセクタ数 */
- self->uiRootDirEntryNum = ubBuf[0x11] + ubBuf[0x12] * 256; /**< ルートディレクトリ最大エントリ数 */
- self->uiFatStartSector = ubBuf[0x0e] + ubBuf[0x0f] * 256; /**< FATの開始セクタ番号 */
- self->uiSectorPerFat = ubBuf[0x16] + ubBuf[0x17] * 256; /**< FATあたりのセクタ数 */
- self->uiFatNum = ubBuf[0x10]; /**< FAT個数 */
- self->uiRootDirSector = self->uiFatStartSector + (self->uiSectorPerFat * self->uiFatNum);
- /**< ルートディレクトリ開始位置 */
- self->uiCluster0Sector = self->uiRootDirSector
- + (((self->uiRootDirEntryNum * 32) + self->uiBytesPerSector - 1) / self->uiBytesPerSector)
- - (2 * self->uiSectorsPerCluster); /**< クラスタ0の開始セクタ */
-
- /* FATバッファ準備 */
- self->pubFatBuf = (unsigned char *)SysMem_Alloc(self->uiSectorPerFat * self->uiBytesPerSector);
- self->pubFatDirty = (unsigned char *)SysMem_Alloc(self->uiSectorPerFat);
-
- /* FATバッファ準備 */
- File_Seek(self->hBlockFile, self->uiFatStartSector * self->uiBytesPerSector, FILE_SEEK_SET);
- File_Read(self->hBlockFile, self->pubFatBuf, self->uiSectorPerFat * self->uiBytesPerSector);
- memset(self->pubFatDirty, 0, self->uiSectorPerFat);
-
- break;
-
- case FATVOL_TYPE_FAT32:
- break;
-
- default:
- return FATVOL_ERR_NG;
- }
-
- /* 最大クラスタ番号算出 */
- switch ( self->iFatType )
- {
- case FATVOL_TYPE_FAT12:
- self->uiMaxClusterNum = (self->uiSectorPerFat * self->uiBytesPerSector) / 3 * 2;
- if ( self->uiMaxClusterNum >= 0x0ff7 )
- {
- self->uiMaxClusterNum = 0x0ff6;
- }
- break;
-
- case FATVOL_TYPE_FAT16:
- self->uiMaxClusterNum = (self->uiSectorPerFat * self->uiBytesPerSector) / 2;
- if ( self->uiMaxClusterNum >= 0xfff7 )
- {
- self->uiMaxClusterNum = 0xfff6;
- }
- break;
-
- case FATVOL_TYPE_FAT32:
- self->uiMaxClusterNum = (self->uiSectorPerFat * self->uiBytesPerSector) / 4;
- break;
- }
-
- /* クラスタバッファ取得 */
- self->iClusterBufIndex = 0;
- self->iClusterBufNum = 32;
- self->pClusterBuf = (T_FATVOL_CLUSTERBUF *)SysMem_Alloc(sizeof(T_FATVOL_CLUSTERBUF) * self->iClusterBufNum);
- for ( i = 0; i < self->iClusterBufNum; i++ )
- {
- self->pClusterBuf[i].uiClusterNum = FATVOL_CLUSTER_ENDMARKER;
- self->pClusterBuf[i].iDirty = 0;
- self->pClusterBuf[i].pubBuf = SysMem_Alloc(self->uiSectorsPerCluster * self->uiBytesPerSector);
- }
-
- return FATVOL_ERR_OK;
-}
-
-
-
+++ /dev/null
-#include <stdio.h>
-#include "system/sysapi/sysapi.h"
-#include "fatfile.h"
-#include "fatvol_local.h"
-
-
-HANDLE FatVol_CreateFile(
- C_FATVOL *self,
- FATVOL_UINT uiCluster,
- HANDLE hDir,
- int iDirEntry,
- int iMode)
-{
- C_FATFILE *pFatFile;
-
- /* オブジェクトを生成 */
- pFatFile = (C_FATFILE *)SysMem_Alloc(sizeof(C_FATFILE));
- if ( pFatFile == NULL )
- {
- return HANDLE_NULL;
- }
- FatFile_Create(pFatFile, self, uiCluster, hDir, iDirEntry, iMode);
-
- return (HANDLE)pFatFile;
-}
-
-
-/* end of file */
+++ /dev/null
-
-#include <string.h>
-#include "fatvol_local.h"
-
-
-/** FATのフラッシュ */
-void FatVol_FlushFat(C_FATVOL *self)
-{
- unsigned long i;
-
- /* FAT先頭へ移動 */
- File_Seek(self->hBlockFile, self->uiFatStartSector * self->uiBytesPerSector, FILE_SEEK_SET);
-
- for ( i = 0; i < self->uiFatNum; i++ )
- {
- int j;
-
- for ( j = 0; j < self->uiSectorPerFat; j++ )
- {
- if ( self->pubFatDirty[j] )
- {
- File_Write(self->hBlockFile, &self->pubFatBuf[j * self->uiBytesPerSector], self->uiBytesPerSector);
- }
- else
- {
- File_Seek(self->hBlockFile, self->uiBytesPerSector, FILE_SEEK_CUR);
- }
- }
- }
-
- /* 更新フラグクリア */
- memset(self->pubFatDirty, 0, self->uiSectorPerFat);
-}
-
-
-/* end of file */
+++ /dev/null
-
-#include "fatvol_local.h"
-
-
-/**< クラスタ読み込み */
-int FatVol_GetClusterBuf(
- C_FATVOL *self,
- FATVOL_UINT uiCluster,
- void **ppBuf,
- int iRead)
-{
- int i;
-
- /* 既にバッファに居ないか探索 */
- for ( i = 0; i < self->iClusterBufNum; i++ )
- {
- /* 見つかれば既存バッファを返す */
- if ( self->pClusterBuf[i].uiClusterNum == uiCluster )
- {
- *ppBuf = self->pClusterBuf[i].pubBuf;
- return FATVOL_ERR_OK;
- }
- }
-
- /* 空のバッファを探す */
- for ( i = 0; i < self->iClusterBufNum; i++ )
- {
- if ( self->pClusterBuf[i].uiClusterNum == FATVOL_CLUSTER_ENDMARKER )
- {
- break;
- }
- }
-
- /* 空きが無ければ空ける */
- if ( i >= self->iClusterBufNum )
- {
- /* FIFO順でフラッシュ */
- i = self->iClusterBufIndex++;
-
- /* dirtyなら吐き出す */
- if ( self->pClusterBuf[i].iDirty )
- {
- if ( FatVol_ClusterWrite(self, self->pClusterBuf[i].uiClusterNum, self->pClusterBuf[i].pubBuf) != FATVOL_ERR_OK )
- {
- return FATVOL_ERR_NG;
- }
- self->pClusterBuf[i].iDirty = 0;
- }
- self->pClusterBuf[i].uiClusterNum = FATVOL_CLUSTER_ENDMARKER;
- }
-
- /* バッファに読み込み */
- if ( iRead )
- {
- if ( FatVol_ClusterRead(self, self->pClusterBuf[i].uiClusterNum, self->pClusterBuf[i].pubBuf) != FATVOL_ERR_OK )
- {
- return FATVOL_ERR_NG;
- }
- }
- self->pClusterBuf[i].iDirty = 0;
- self->pClusterBuf[i].uiClusterNum = uiCluster;
-
- return FATVOL_ERR_OK;
-}
-
-
-/* end of file */
+++ /dev/null
-
-#include <string.h>
-#include "fatvol_local.h"
-
-
-FATVOL_UINT FatVol_GetNextCluster(C_FATVOL *self, FATVOL_UINT uiCluster)
-{
- FATVOL_UINT uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
-
- switch ( self->iFatType )
- {
- case FATVOL_TYPE_FAT12:
- /* 0xffff0000 からルートディレクトリをマップ */
- if ( uiCluster >= 0xffff0000 )
- {
- return uiCluster + 1;
- }
-
- /* FAT検索 */
- if ( uiCluster % 2 == 0 )
- {
- uiNextCluster = self->pubFatBuf[(uiCluster / 2) * 3 + 0]
- + ((self->pubFatBuf[(uiCluster / 2) * 3 + 1] & 0x0f) << 8);
- }
- else
- {
- uiNextCluster = ((self->pubFatBuf[(uiCluster / 2) * 3 + 1] >> 4) & 0xf)
- + (self->pubFatBuf[(uiCluster / 2) * 3 + 2] << 4);
- }
-
- if ( uiNextCluster >= 0x0ff7 )
- {
- uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
- }
- break;
-
- case FATVOL_TYPE_FAT16:
- /* 0xffff0000 からルートディレクトリをマップ */
- if ( uiCluster >= 0xffff0000 )
- {
- return uiCluster + 1;
- }
-
- /* FAT検索 */
- uiNextCluster = self->pubFatBuf[uiCluster * 2] + self->pubFatBuf[uiCluster * 2 + 1] * 256;
- if ( uiNextCluster >= 0xfff7 )
- {
- uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
- }
- break;
-
- case FATVOL_TYPE_FAT32:
- uiNextCluster = self->pubFatBuf[uiCluster * 4]
- + self->pubFatBuf[uiCluster * 4 + 1] * 256
- + self->pubFatBuf[uiCluster * 4 + 2] * 256 * 256
- + self->pubFatBuf[uiCluster * 4 + 3] * 256 * 256 * 256;
- break;
- }
-
- return uiNextCluster;
-}
-
-
-/* end of file */
+++ /dev/null
-
-
-#ifndef __HOS__fatvol_local_h__
-#define __HOS__fatvol_local_h__
-
-
-#include "fatvol.h"
-
-
-/* 最終クラスタマーカー */
-#define FATVOL_CLUSTER_FREE 0x00000000
-#define FATVOL_CLUSTER_ENDMARKER 0xffffffff
-
-
-/* ファイルシステムのタイプ */
-#define FATVOL_TYPE_UNKNOWN 0
-#define FATVOL_TYPE_FAT12 1
-#define FATVOL_TYPE_FAT16 2
-#define FATVOL_TYPE_FAT32 3
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int FatVol_ClusterWrite(C_FATVOL *self, FATVOL_UINT uiCluster, const void *pBuf); /**< クラスタ書き込み */
-int FatVol_ClusterRead(C_FATVOL *self, FATVOL_UINT uiCluster, void *pBuf); /**< クラスタ読み込み */
-int FatVol_GetClusterBuf(C_FATVOL *self, FATVOL_UINT uiCluster, void **ppBuf, int iRead);
-int FatVol_RelClusterBuf(C_FATVOL *self, void *ppBuf, int iDirty);
-
-FATVOL_UINT FatVol_GetNextCluster(C_FATVOL *self, FATVOL_UINT uiCluster);
-void FatVol_SetNextCluster(C_FATVOL *self, FATVOL_UINT uiCluster, FATVOL_UINT uiNextCluster);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __HOS__fatvol_local_h__ */
-
-
-/* end of file */
+++ /dev/null
-
-#include <string.h>
-#include "fatvol_local.h"
-
-
-HANDLE FatVol_Open(C_FATVOL *self, const char *pszPath, int iMode)
-{
- unsigned char ubBuf[32];
- FATVOL_UINT uiCluster;
- HANDLE hDir;
- HANDLE hFile;
- char szEntryName[8+3+1];
- int iEntryNameLen;
- char szName[8+3+1];
- int iNameLen;
- int iDirEntry;
- int i, j;
-
- /* ルートを基点にする */
- if ( *pszPath == '/' )
- {
- pszPath++;
- }
-
- /* ルートディレクトリを開く */
- hDir = FatVol_CreateFile(self, self->uiRootDirCluster, 0, 0, FILE_MODE_READ | FILE_MODE_WRITE);
-
- for ( ; ; )
- {
- /* 名前の部分を検索 */
- for ( iNameLen = 0; pszPath[iNameLen] != '\0'; iNameLen++ )
- {
- if ( pszPath[iNameLen] == '/' )
- {
- szName[iNameLen] = '\0';
- break;
- }
-
- /* 大文字に変換 */
- if ( pszPath[iNameLen] >= 'a' && pszPath[iNameLen] <= 'z' )
- {
- szName[iNameLen] = pszPath[iNameLen] - ('a' - 'A');
- }
- else
- {
- szName[iNameLen] = pszPath[iNameLen];
- }
- }
-
- /* ディレクトリエントリを検索 */
- iDirEntry = -1;
- for ( i = 0; File_Read(hDir, ubBuf, 32, 0) == 32; i++ )
- {
- /* 0なら打ち切り */
- if ( ubBuf[0] == 0x00 )
- {
- break;
- }
-
- /* 名前部分取り出し */
- iEntryNameLen = 0;
- for ( j = 0; j < 8; j++ )
- {
- if ( ubBuf[0+j] == ' ' || ubBuf[0+j] == '\0' )
- {
- break;
- }
- szEntryName[iEntryNameLen++] = (char)ubBuf[0+j];
- }
- szEntryName[iEntryNameLen++] = '.';
- for ( j = 0; j < 3; j++ )
- {
- if ( ubBuf[8+j] == ' ' || ubBuf[8+j] == '\0' )
- {
- break;
- }
- szEntryName[iEntryNameLen++] = (char)ubBuf[8+j];
- }
- szEntryName[iEntryNameLen++] = '\0';
- if ( iEntryNameLen > 2 && szEntryName[iEntryNameLen-1] == '.' )
- {
- szEntryName[--iEntryNameLen] = '\0';
- }
-
- if ( strcmp(szEntryName, szName) == 0 )
- {
- iDirEntry = i;
- break;
- }
- }
-
- /* 開始クラスタ取得 */
- uiCluster = ubBuf[0x1a] + ubBuf[0x1b]*256;
- if ( self->iFatType == FATVOL_TYPE_FAT32 )
- {
- uiCluster += ubBuf[0x14]*256*256 + ubBuf[0x15]*256*256*256;
- }
-
- /* パス部分の解析が終わっていればここで抜ける */
- if ( pszPath[iNameLen] == '\0' )
- {
- break;
- }
-
- File_Close(hDir);
-
- /* サブディレクトリがなければエラー */
- if ( iDirEntry < 0 || !(ubBuf[0x0b] & 0x10) )
- {
- return HANDLE_NULL;
- }
-
- /* サブディレクトリを開く */
- hDir = FatVol_CreateFile(self, uiCluster, 0, 0, FILE_MODE_READ | FILE_MODE_WRITE);
-
- pszPath += iNameLen;
- }
-
- /* 既存ファイルがあれば */
- if ( iDirEntry >= 0 )
- {
- hFile = FatVol_CreateFile(self, uiCluster, hDir, iDirEntry, iMode);
- if ( hFile == HANDLE_NULL )
- {
- File_Close(hDir);
- }
- return hFile;
- }
-
- File_Close(hDir);
- return HANDLE_NULL;
-}
-
-
+++ /dev/null
-
-#include <stddef.h>
-#include "fatvol_local.h"
-
-
-/**< クラスタ読み込み */
-int FatVol_RelClusterBuf(
- C_FATVOL *self,
- void *pBuf,
- int iDirty)
-{
- T_FATVOL_CLUSTERBUF *pClusterBuf;
-
- /* バッファ情報取得 */
- pClusterBuf = (T_FATVOL_CLUSTERBUF *)((char *)pBuf - offsetof(T_FATVOL_CLUSTERBUF, pubBuf));
-
- pClusterBuf->iDirty = iDirty;
-
- return FATVOL_ERR_OK;
-}
-
-
-/* end of file */
+++ /dev/null
-
-
-#include "fatvol_local.h"
-
-
-void FatVol_SetNextCluster(C_FATVOL *self, FATVOL_UINT uiCluster, FATVOL_UINT uiNextCluster)
-{
- switch ( self->iFatType )
- {
- case FATVOL_TYPE_FAT12:
- /* FAT更新 */
- if ( uiCluster % 2 == 0 )
- {
- self->pubFatBuf[(uiCluster / 2) * 3 + 0] = uiNextCluster & 0xff;
- self->pubFatBuf[(uiCluster / 2) * 3 + 1] = ((uiNextCluster >> 8) & 0x0f) | (self->pubFatBuf[(uiCluster / 2) * 3 + 1] & 0xf0);
- }
- else
- {
- self->pubFatBuf[(uiCluster / 2) * 3 + 1] = ((uiNextCluster << 4) & 0xf0) | (self->pubFatBuf[(uiCluster / 2) * 3 + 1] & 0x0f);
- self->pubFatBuf[(uiCluster / 2) * 3 + 2] = ((uiNextCluster >> 4) & 0xff);
- }
-
- /* 更新フラグ設定 */
- self->pubFatDirty[((uiCluster / 2) * 3 + 0) / self->uiBytesPerSector] = 1;
- self->pubFatDirty[((uiCluster / 2) * 3 + 2) / self->uiBytesPerSector] = 1;
- break;
-
- case FATVOL_TYPE_FAT16:
- /* FAT更新 */
- self->pubFatBuf[uiCluster * 2 + 0] = uiNextCluster % 256;
- self->pubFatBuf[uiCluster * 2 + 1] = uiNextCluster / 256;
-
- /* 更新フラグ設定 */
- self->pubFatDirty[(uiCluster * 2) / self->uiBytesPerSector] = 1;
- break;
-
- case FATVOL_TYPE_FAT32:
- /* FAT更新 */
- self->pubFatBuf[uiCluster * 2 + 0] = uiNextCluster % 256;
- self->pubFatBuf[uiCluster * 2 + 1] = (uiNextCluster / 256) % 256;
- self->pubFatBuf[uiCluster * 2 + 2] = (uiNextCluster / 256 / 256) % 256;
- self->pubFatBuf[uiCluster * 2 + 3] = (uiNextCluster / 256 / 256 / 256) % 256;
-
- /* 更新フラグ設定 */
- self->pubFatDirty[(uiCluster * 4) / self->uiBytesPerSector] = 1;
- }
-}
-
-
-/* end of file */