Project

General

Profile

#include "integer.h"
#include "regs.h"
#include "file.h"
#include "simplefile.h"

/* these constants are just to satisfy menu.h */
char const * fil_type_rom;
char const * fil_type_bin;
char const * fil_type_car;
char const * fil_type_mem;
char const * fil_type_rpd;


int file_struct_size()
{
return sizeof(struct SimpleFile);
}

void file_init(struct SimpleFile * file)
{
file->num = 0;
file->size = 0;
file->type = 0;
file->is_readonly = 1;
file->offset = -1;
}

char *fname = "";
char const * file_name(struct SimpleFile * file)
{
return fname;
}

enum SimpleFileStatus file_open_name_in_dir(struct SimpleDirEntry * entry, char const * filename, struct SimpleFile * file)
{
return SimpleFile_FAIL;
}

enum SimpleFileStatus file_open_name(char const * path, struct SimpleFile * file)
{
return SimpleFile_FAIL;
}

enum SimpleFileStatus dir_init(void * mem, int space)
{
return SimpleFile_FAIL;
}

struct SimpleDirEntry * dir_entries(char const * dirPath)
{
return NULL;
}

DWORD cur_offset;
int cur_file;
BYTE sect_buffer[512];

BYTE cache_read(DWORD offset, int file)
{
if(((offset & ~0x1FF) != (cur_offset & ~0x1FF)) || (cur_file != file))
{
int i;

*zpu_out2 = offset >> 9;

set_sd_read(0);
set_sd_read(1 << file);
while(!get_sd_ack()) {};
set_sd_read(0);

set_sd_secbuf_rd(1);
for(i=0; i<512; i++) {
set_sd_secbuf_addr(i);
sect_buffer[i] = *zpu_in2;
}
set_sd_secbuf_rd(0);

cur_offset = offset;
cur_file = file;
}
return sect_buffer[offset & 0x1FF];
}

void cache_write(int file)
{
int i;

*zpu_out2 = cur_offset >> 9;

set_sd_secbuf_we(1);
for(i=0; i<512; i++) {
set_sd_secbuf_addr(i);
set_sd_secbuf_d(sect_buffer[i]);
}
set_sd_secbuf_we(0);

set_sd_write(0);
set_sd_write(1 << file);
while(!get_sd_ack()) {};
set_sd_write(0);
while(get_sd_ack()) {};
}

void file_reset()
{
cur_file = -1;
cur_offset = -1;
}

int file_size(struct SimpleFile * file)
{
return file->size;
}

int file_readonly(struct SimpleFile * file)
{
return file->is_readonly;
}

int file_type(struct SimpleFile * file)
{
return file->type;
}

enum SimpleFileStatus file_read(struct SimpleFile *file, void *buffer, int bytes, int *bytesread)
{
if((file->offset >= 0) && (file->size > file->offset) && (bytes > 0))
{
if((file->offset + bytes) > file->size) bytes = file->size - file->offset;
*bytesread = bytes;

while(bytes--) *(unsigned char *)buffer++ = cache_read(file->offset++, file->num);
return SimpleFile_OK;
}

*bytesread = 0;
return SimpleFile_FAIL;
}

enum SimpleFileStatus file_seek(struct SimpleFile * file, int offsetFromStart)
{
if((file->size > 0) && (file->size >= offsetFromStart))
{
file->offset = offsetFromStart;
return SimpleFile_OK;
}
return SimpleFile_FAIL;
}

enum SimpleFileStatus file_write(struct SimpleFile *file, void *buffer, int bytes, int *byteswritten)
{
if((file->offset >= 0) && (file->size > file->offset) && (bytes > 0))
{
if((file->offset + bytes) > file->size) bytes = file->size - file->offset;
*byteswritten = bytes;

while(bytes>0)
{
cache_read(file->offset, file->num);
do
{
sect_buffer[file->offset & 0x1FF] = *(unsigned char*) buffer;
bytes--;
file->offset++;
buffer++;
}
while((file->offset & 0x1FF) && (bytes>0));
cache_write(file->num);
}
return SimpleFile_OK;
}
return SimpleFile_FAIL;
}

enum SimpleFileStatus file_write_flush()
{
return SimpleFile_FAIL;
}

int file_mount(struct SimpleFile * file, unsigned char num, int size)
{
file->num = num;
file->offset = -1;
file->size = size;
file->is_readonly = 0;
file_reset();
}
(2-2/4)