#include "common.h"

// Open/fileopen: R0=appname, R1=filename

extern myfile* filelist;
extern int     nextchandle;
extern char*   enumeratertn;

char mychoiceschandle[]="mychoices$chandle\0";

oserror * module_init(const char *cmd_tail, int podule_base, void *pw)
{
// Read sys variable and set if exists (for nextchandle, to stop dups)
int  v;
regs r;
r.r[0]=(regint)mychoiceschandle;
r.r[1]=(regint)&v; // value
r.r[2]=4;
r.r[3]=0;
r.r[4]=0;
if(os(OS_ReadVarVal,&r,&r)==NULL)
 {
 nextchandle=v+1;
 }

return (oserror *)0;
}

oserror * module_final(int fatal, int podule, void *pw)
{
// Delete all filelist entries
while(filelist)
 {
 filelist->close(filelist);
 delete filelist;
 }
// Set nextchangle into a system variable (stops duplicates)
regs r;
r.r[0]=(regint)mychoiceschandle;
r.r[1]=(regint)&nextchandle;
r.r[2]=4;
r.r[3]=0;
r.r[4]=1;
os(OS_SetVarVal,&r,&r);
// Free memory
if(enumeratertn) free(enumeratertn);
return (oserror *)0;
}

void module_service(int number, _kernel_swi_regs *r, void *pw)
{
if(r->r[1]==0x53)
 {
 filelist->closeall();
 }
}

oserror * swi_fileopen(int number, regs *r, void *pw)  { reseterror();                         r->r[0]=fileopen(*r);  return rtnerror(); }
oserror * swi_fileclose(int number, regs *r, void *pw) { reseterror();                                 fileclose(*r); return rtnerror(); }
oserror * swi_filesafe(int number, regs *r, void *pw)  { reseterror(); myfile* tmp=filelist;      tmp->closeall();    return rtnerror(); }

oserror * swi_setint(int number, regs *r, void *pw)     { reseterror();         setint(*r);             return rtnerror(); }
oserror * swi_setstring(int number, regs *r, void *pw)  { reseterror();         setstring(*r);          return rtnerror(); }
oserror * swi_readint(int number, regs *r, void *pw)    { reseterror(); r->r[2]=readint(*r);            return rtnerror(); }
oserror * swi_readstring(int number, regs *r, void *pw) { reseterror(); r->r[2]=(regint)readstring(*r); return rtnerror(); }

oserror * swi_getmem(int number, regs *r, void *pw) { reseterror(); readmem(*r); return rtnerror(); }
oserror * swi_setmem(int number, regs *r, void *pw) { reseterror(); setmem(*r);  return rtnerror(); }

oserror * swi_exist(int number, regs *r, void *pw)  { reseterror(); r->r[2]=exist(*r); return rtnerror(); }
oserror * swi_size(int number, regs *r, void *pw)   { reseterror(); r->r[2]=size(*r);  return rtnerror(); }
oserror * swi_delete(int number, regs *r, void *pw) { reseterror();         del(*r);   return rtnerror(); }

oserror * swi_enumerate(int number, regs *r, void *pw) { reseterror(); enumerate(*r); return rtnerror(); }
oserror * swi_print(int number, regs *r, void *pw)     { reseterror(); fileprint();   return rtnerror(); }

oserror * swi_setf64(int number, regs *r, void *pw) { reseterror(); setfloat(*r,FPA64);  return rtnerror(); }
oserror * swi_setf32(int number, regs *r, void *pw) { reseterror(); setfloat(*r,FPA32);  return rtnerror(); }
oserror * swi_setv64(int number, regs *r, void *pw) { reseterror(); setfloat(*r,VFP64);  return rtnerror(); }
oserror * swi_setv32(int number, regs *r, void *pw) { reseterror(); setfloat(*r,VFP32);  return rtnerror(); }
oserror * swi_setb40(int number, regs *r, void *pw) { reseterror(); setfloat(*r,BBC40);  return rtnerror(); }
oserror * swi_getf64(int number, regs *r, void *pw) { reseterror(); readfloat(*r,FPA64); return rtnerror(); }
oserror * swi_getf32(int number, regs *r, void *pw) { reseterror(); readfloat(*r,FPA32); return rtnerror(); }
oserror * swi_getv64(int number, regs *r, void *pw) { reseterror(); readfloat(*r,VFP64); return rtnerror(); }
oserror * swi_getv32(int number, regs *r, void *pw) { reseterror(); readfloat(*r,VFP32); return rtnerror(); }
oserror * swi_getb40(int number, regs *r, void *pw) { reseterror(); readfloat(*r,BBC40); return rtnerror(); }

oserror * swi_undefined(int number, regs *r, void *pw)
{
seterror("SWI is undefined");
return rtnerror();
}


