#include "compiler.h"
#include "dosio.h"
#include "pealstub.h"
static UINT8 curpath[MAX_PATH];
static char *curfilep= curpath + 1;
void* Callback_vfs[11];
#define ISKANJI(c) (((((c) ^ 0x20) - 0xa1) & 0xff) < 0x3c)
void dosio_init(void) { }
void dosio_term(void) { }
// ファイル操作
FILEH file_open(const char *path) {
UInt32 arg;
arg = ByteSwap32(path);
return((FILEH)(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[0], &arg, 4));
}
FILEH file_open_rb(const char *path) {
return(file_open(path));
}
FILEH file_create(const char *path) {
UInt32 arg;
arg = ByteSwap32(path);
return((FILEH)(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[1], &arg, 4));
}
long file_seek(FILEH handle, long pointer, int method) {
UInt32 arg[3];
arg[0] = ByteSwap32(handle);
arg[1] = ByteSwap32(pointer);
arg[2] = ByteSwap32(method);
return((long)(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[2], &arg, 12));
}
UINT file_read(FILEH handle, void *data, UINT length) {
UInt32 arg[3];
arg[0] = ByteSwap32(handle);
arg[1] = ByteSwap32(data);
arg[2] = ByteSwap32(length);
return((UINT)(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[3], &arg, 12));
}
UINT file_write(FILEH handle, const void *data, UINT length) {
UInt32 arg[3];
arg[0] = ByteSwap32(handle);
arg[1] = ByteSwap32(data);
arg[2] = ByteSwap32(length);
return((UINT)(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[4], &arg, 12));
}
short file_close(FILEH handle) {
ArgOne params;
params.ptr = ByteSwap32(handle);
(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[5], ¶ms, 4);
return(0);
}
UINT file_getsize(FILEH handle) {
ArgOne arg;
arg.ptr = ByteSwap32(handle);
return((UINT)(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[6], &arg, 4));
}
static void cnvdatetime(UINT32 nowseconds, DOSDATE *dosdate, DOSTIME *dostime) {
DateTimeType now_time;
ARM_TimSecondsToDateTime(nowseconds, &now_time);
if (dosdate) {
dosdate->year = now_time.year;
dosdate->month = now_time.month;
dosdate->day = now_time.day;
}
if (dostime) {
dostime->hour = now_time.hour;
dostime->minute = now_time.minute;
dostime->second = now_time.second;
}
}
short file_getdatetime(FILEH handle, DOSDATE *dosdate, DOSTIME *dostime) {
UINT32 seconds;
ArgOne params;
params.ptr = ByteSwap32(handle);
seconds = (UINT32)(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[7], ¶ms, 4);
if (!seconds) {
return(-1);
}
cnvdatetime(seconds, dosdate, dostime);
return(0);
}
short file_delete(const char *path) {
ArgOne params;
params.ptr = ByteSwap32(path);
return((short)(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[8], ¶ms, 4));
}
short file_attr(const char *path) {
FILEH handle;
ArgOne params;
UInt32 ret;
handle = file_open(path);
if (handle == FILEH_INVALID) {
return(-1);
}
params.ptr = ByteSwap32(handle);
ret = (UINT32)(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[9], ¶ms, 4);
file_close(handle);
return(ret);
}
short file_dircreate(const char *path) {
ArgOne params;
params.ptr = ByteSwap32(path);
return((short)(gCall68KFuncP)(gEmulStateP, (unsigned long)Callback_vfs[10], ¶ms, 4));
}
// カレントファイル操作
void file_setcd(const char *exepath) {
file_cpyname(curpath, exepath, sizeof(curpath));
curfilep = file_getname(curpath);
*curfilep = '\0';
}
char *file_getcd(const char *path) {
*curfilep = '\0';
file_catname(curpath, path, sizeof(curpath));
return(curpath);
}
FILEH file_open_c(const char *path) {
*curfilep = '\0';
file_catname(curpath, path, sizeof(curpath));
return(file_open(curpath));
}
FILEH file_open_rb_c(const char *path) {
*curfilep = '\0';
file_catname(curpath, path, sizeof(curpath));
return(file_open_rb(curpath));
}
FILEH file_create_c(const char *path) {
*curfilep = '\0';
file_catname(curpath, path, sizeof(curpath));
return(file_create(curpath));
}
short file_delete_c(const char *path) {
*curfilep = '\0';
file_catname(curpath, path, sizeof(curpath));
return(file_delete(curpath));
}
short file_attr_c(const char *path) {
*curfilep = '\0';
file_catname(curpath, path, sizeof(curpath));
return(file_attr(curpath));
}
void file_catname(char *path, const char *sjis, int maxlen) {
char *p;
p = path + OEMSTRLEN(path);
milstr_ncat(path, sjis, maxlen);
while(1) {
if (ISKANJI(*p)) {
if (*(p+1) == '\0') {
break;
}
p++;
}
else if ((*p == '/') || (*p == '\\')) {
*p = '/';
}
else if (*p == '\0') {
break;
}
p++;
}
}
char *file_getname(const char *path) {
const char *ret;
ret = path;
while(*path != '\0') {
if (*path++ == '/') {
ret = path;
}
}
return((char *)ret);
}
void file_cutname(char *path) {
char *p;
p = file_getname(path);
p[0] = '\0';
}
char *file_getext(const char *path) {
const char *p;
const char *q;
p = file_getname(path);
q = NULL;
while(*p != '\0') {
if (*p++ == '.') {
q = p;
}
}
if (!q) {
q = p;
}
return((char *)q);
}
void file_cutext(char *path) {
char *p;
char *q;
p = file_getname(path);
q = NULL;
while(*p != '\0') {
if (*p == '.') {
q = p;
}
p++;
}
if (q) {
*q = '\0';
}
}
void file_cutseparator(char *path) {
int pos;
pos = OEMSTRLEN(path) - 1;
if ((pos > 0) && (path[pos] == '/')) {
path[pos] = '\0';
}
}
void file_setseparator(char *path, int maxlen) {
int pos;
pos = OEMSTRLEN(path) - 1;
if ((pos < 0) || (path[pos] == '/') || ((pos + 2) >= maxlen)) {
return;
}
path[++pos] = '/';
path[++pos] = '\0';
}
RetroPC.NET-CVS <cvs@retropc.net>