aboutsummaryrefslogtreecommitdiff
path: root/libmpio/fat.c
diff options
context:
space:
mode:
authorgermeier <germeier>2002-09-11 00:18:34 +0000
committergermeier <germeier>2002-09-11 00:18:34 +0000
commit9219a7fd076dbd9fdb57cb70036803975f867c2b (patch)
treec81d96132b111af24dd31694bb13e4d9ea229324 /libmpio/fat.c
parent196525ab0a4c2350cce745bfb1e6b340ced89d3c (diff)
downloadmpiosh-9219a7fd076dbd9fdb57cb70036803975f867c2b.tar.gz
mpiosh-9219a7fd076dbd9fdb57cb70036803975f867c2b.tar.bz2
mpiosh-9219a7fd076dbd9fdb57cb70036803975f867c2b.zip
updated writing support to support mpio_fatentry_t
Diffstat (limited to 'libmpio/fat.c')
-rw-r--r--libmpio/fat.c137
1 files changed, 114 insertions, 23 deletions
diff --git a/libmpio/fat.c b/libmpio/fat.c
index 3a5a087..5392bee 100644
--- a/libmpio/fat.c
+++ b/libmpio/fat.c
@@ -1,6 +1,6 @@
/*
*
- * $Id: fat.c,v 1.8 2002/09/10 13:41:21 germeier Exp $
+ * $Id: fat.c,v 1.9 2002/09/11 00:18:34 germeier Exp $
*
* Library for USB MPIO-*
*
@@ -360,7 +360,12 @@ mpio_fatentry_write(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f, WORD value)
int e;
BYTE backup;
- if (mem == MPIO_INTERNAL_MEM) sm = &m->internal;
+ if (mem == MPIO_INTERNAL_MEM)
+ {
+ debug("This should not be used for internal memory!\n");
+ exit(-1);
+ }
+
if (mem == MPIO_EXTERNAL_MEM) sm = &m->external;
if (sm->size == 128)
@@ -409,6 +414,39 @@ mpio_fat_internal_find_startsector(mpio_t *m, BYTE start)
return found;
}
+BYTE
+mpio_fat_internal_find_fileindex(mpio_t *m)
+{
+ mpio_fatentry_t *f;
+ mpio_smartmedia_t *sm = &m->internal;
+ BYTE index[256];
+ BYTE found; /* hmm, ... */
+
+ memset(index, 1, 256);
+
+ f = mpio_fatentry_new(m, MPIO_INTERNAL_MEM, 0);
+ while(mpio_fatentry_plus_plus(f))
+ {
+ if (sm->fat[f->entry * 0x10 + 1] != 0xff)
+ index[sm->fat[f->entry * 0x10 + 1]] = 0;
+ }
+ free(f);
+
+ found=6;
+ while((found<256) && (!index[found]))
+ found++;
+
+ if (found==256)
+ {
+ debug("Oops, did not find a new fileindex!\n"
+ "This should never happen, aborting now!, Sorry!\n");
+ exit(-1);
+ }
+
+ return found;
+}
+
+
int
mpio_fat_free_clusters(mpio_t *m, mpio_mem_t mem)
{
@@ -432,7 +470,7 @@ mpio_fat_free_clusters(mpio_t *m, mpio_mem_t mem)
}
mpio_fatentry_t *
-mpio_fat_find_free(mpio_t *m, mpio_mem_t mem)
+mpio_fatentry_find_free(mpio_t *m, mpio_mem_t mem)
{
mpio_fatentry_t *f;
@@ -617,16 +655,18 @@ mpio_fatentry_set_free (mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f)
int e;
mpio_smartmedia_t *sm;
- if (mem == MPIO_INTERNAL_MEM) {
- sm = &m->internal;
- e = f->entry * 0x10;
- memset((sm->fat+e), 0xff, 0x10);
- }
+ if (mem == MPIO_INTERNAL_MEM)
+ {
+ sm = &m->internal;
+ e = f->entry * 0x10;
+ memset((sm->fat+e), 0xff, 0x10);
+ }
- if (mem == MPIO_EXTERNAL_MEM) {
- sm = &m->internal;
- mpio_fatentry_write(m, mem, f, 0);
- }
+ if (mem == MPIO_EXTERNAL_MEM)
+ {
+ sm = &m->internal;
+ mpio_fatentry_write(m, mem, f, 0);
+ }
return 0;
}
@@ -637,18 +677,69 @@ mpio_fatentry_set_defect(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f)
int e;
mpio_smartmedia_t *sm;
- if (mem == MPIO_INTERNAL_MEM) {
- sm = &m->internal;
- e = f->entry * 0x10;
- debug("Sorry, I don't now how to mark an internal block as"
- " defective yet.\n");
-/* memset((sm->fat+e), 0xff, 0x10); */
- }
+ if (mem == MPIO_INTERNAL_MEM)
+ {
+ sm = &m->internal;
+ e = f->entry * 0x10;
+ debug("Sorry, I don't now how to mark an internal block as"
+ " defective yet.\n");
+ /* memset((sm->fat+e), 0xff, 0x10); */
+ }
- if (mem == MPIO_EXTERNAL_MEM) {
- sm = &m->internal;
- mpio_fatentry_write(m, mem, f, 0xfff7);
- }
+ if (mem == MPIO_EXTERNAL_MEM)
+ {
+ sm = &m->internal;
+ mpio_fatentry_write(m, mem, f, 0xfff7);
+ }
+
+ return 0;
+}
+
+int
+mpio_fatentry_set_eof(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f)
+{
+ int e;
+ mpio_smartmedia_t *sm;
+
+ if (mem == MPIO_INTERNAL_MEM)
+ {
+ sm = &m->internal;
+ e = f->entry * 0x10;
+ memset((sm->fat+e), 0xff, 0x10);
+ memset((f->i_fat+0x07), 0xff, 4);
+ }
+
+ if (mem == MPIO_EXTERNAL_MEM)
+ {
+ sm = &m->internal;
+ mpio_fatentry_write(m, mem, f, 0xffff);
+ }
+
+ return 0;
+}
+
+int
+mpio_fatentry_set_next(mpio_t *m, mpio_mem_t mem,
+ mpio_fatentry_t *f, mpio_fatentry_t *value)
+{
+ int e;
+ mpio_smartmedia_t *sm;
+
+ if (mem == MPIO_INTERNAL_MEM)
+ {
+ sm = &m->internal;
+ e = f->entry * 0x10;
+ sm->fat[e+0x07]= value->hw_address / 0x1000000;
+ sm->fat[e+0x08]=(value->hw_address / 0x10000 ) & 0xff;
+ sm->fat[e+0x09]=(value->hw_address / 0x100 ) & 0xff;
+ sm->fat[e+0x0a]= value->hw_address & 0xff;
+ }
+
+ if (mem == MPIO_EXTERNAL_MEM)
+ {
+ sm = &m->internal;
+ mpio_fatentry_write(m, mem, f, value->entry);
+ }
return 0;
}