Commit 631ad37c authored by Robert Sprowson's avatar Robert Sprowson
Browse files

Allow RAM builds with messages in, fix for saving to images > 2G

RAM build include messages.
Removed atexit() handler, in favour of finalisation-code option in CMHG file.
Changed cluster rounding in saveFILE() to deal with extents > 2G.

Version 1.00. Tagged as 'DOSFS-1_00'
parent 6f9ea986
......@@ -21,6 +21,7 @@ OBJS = DOSFS DOSFSctl DOSclusters DOSdirs DOSnaming Helpers MsgTrans \
Statics TIMEconv debug StaticDefs
ROM_OBJS = ${OBJS} init
ROMCDEFINES = -DROM
RES_AREA = dosfs_msgarea
CMHGDEFINES = ${CDEFINES}
CMHGDEPENDS = DOSFS MsgTrans
ASMHDRS = DOSFS
......@@ -33,6 +34,6 @@ include CModule
DBG_LIBS += ${NET5LIBS}
ASFLAGS += -pd "PCMCIATRUE SETL {${PCMCIA}}"
CFLAGS += -DPCMCIA${PCMCIA}
CDFLAGS += -DPCMCIA${PCMCIA} -DDEBUGLIB
CDFLAGS += -DDEBUGLIB
# Dynamic dependencies:
/* (0.99)
/* (1.00)
*
* This file is automatically maintained by srccommit, do not edit manually.
* Last processed by srccommit version: 1.1.
*
*/
#define Module_MajorVersion_CMHG 0.99
#define Module_MajorVersion_CMHG 1.00
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 13 Jan 2013
#define Module_MajorVersion "0.99"
#define Module_Version 99
#define Module_MajorVersion "1.00"
#define Module_Version 100
#define Module_MinorVersion ""
#define Module_Date "13 Jan 2013"
......@@ -18,6 +18,6 @@
#define Module_ComponentName "DOSFS"
#define Module_ComponentPath "castle/RiscOS/Sources/FileSys/ImageFS/DOSFS"
#define Module_FullVersion "0.99"
#define Module_HelpVersion "0.99 (13 Jan 2013)"
#define Module_LibraryVersionInfo "0:99"
#define Module_FullVersion "1.00"
#define Module_HelpVersion "1.00 (13 Jan 2013)"
#define Module_LibraryVersionInfo "1:0"
......@@ -975,7 +975,11 @@ void fs_service(int service_number,_kernel_swi_regs *rset,void *privateword)
}
}
break ;
#ifndef ROM
case 0x60 : /* Service_ResourceFSStarting */
(*(void (*)(void *, void *, void *, void *))rset->r[2])(dosfs_msgarea(), 0, 0, (void *)rset->r[3]);
break;
#endif
case 0x68 : /* Service_CloseFile */
break ;
......@@ -1597,7 +1601,7 @@ _kernel_oserror *fs_commands(const char *argv,int argc,int command,void *private
/*-------------------------------------------------------------------------*/
static void shutdown_fs(void)
_kernel_oserror *shutdown_fs(int fatal, int podule, void *pw)
{
_kernel_swi_regs rset ;
mapentry *cptr ;
......@@ -1606,25 +1610,30 @@ static void shutdown_fs(void)
/* JRS 26/3/92: free all DOS name mappings */
while (maplist != NULL)
{
{
cptr = maplist;
maplist = maplist->next;
free(cptr) ;
}
}
/* OS_FSControl with image type */
/* Deregister our image type (ignoring errors) */
rset.r[0] = FSControl_DeRegisterImageFS;
rset.r[1] = (word)imagetype ; /* image type we provide support for */
/* ignore any errors */
(void)_kernel_swi(OS_FSControl,&rset,&rset) ;
/* Close Messages file. */
/* Close messages file, remove from ResourceFS if RAM loaded */
msgtrans_closefile();
#ifndef ROM
_swix(ResourceFS_DeregisterFiles, _IN(0), dosfs_msgarea());
#endif
show_mem_trace();
trace_off();
return ;
UNUSED(fatal);
UNUSED(podule);
UNUSED(pw);
return NULL;
}
/*-------------------------------------------------------------------------*/
......@@ -1636,21 +1645,26 @@ _kernel_oserror *init_fs(const char *cmd_tail,int podule_base,void *privateword)
/* set up debugging */
debug_initialise ("DOSFS", "", 0);
debug_set_device(DEBUGIT_OUTPUT);
// debug_set_device(DEBUGIT_OUTPUT);
// debug_set_device(HAL_OUTPUT);
// debug_set_device(PRINTF_OUTPUT);
debug_set_device(PRINTF_OUTPUT);
debug_set_unbuffered_files (TRUE);
debug_set_stamp_debug (TRUE);
dprintf(("","DOSFS: init_fs: entered\n"));
_syserr = &_gerror ; /* reference the static global error area */
#ifndef ROM
/* Register the messages for RAM based modules */
r.r[0] = (int)dosfs_msgarea();
syserr = _kernel_swi(ResourceFS_RegisterFiles, &r, &r);
if (syserr != NULL) return syserr;
dprintf(("","DOSFS: messages registered\n"));
#endif
if ((syserr = declare_FS(privateword)) != NULL)
dprintf(("","DOSFS: init_fs: &%08X \"%s\"\n",syserr->errnum,syserr->errmess)) ;
if (atexit(shutdown_fs) != 0)
dprintf(("","DOSFS: init_fs: failed to add shutdown function\n")) ;
r.r[0] = (int)"File$Type_FC8";
r.r[1] = (int)"DOSDisc";
r.r[2] = 7;
......
......@@ -642,183 +642,187 @@ int DOS_image_RW(int op,word sec,word off,byte *memaddr,word nbytes,DOSdisc *iha
/*---------------------------------------------------------------------------*/
/*!
* \param fname Full path name
* \param leafname NULL terminated filename
* \param ld Load address
* \param ex Exec address
* \param bs Base address
* \param len Length of data
* \param cdir Current directory (where file is to be placed)
* \param fzero TRUE if we are to zero the data CLUSTERs
* \param ihand Image handle
* \return -1 if the save failed
*/
int saveFILE(char *fname,char *leafname,word ld,word ex,char *bs,word len,DIR_info **cdir,DOS_direntry **dentry,int fzero,DOSdisc *ihand)
{
/* in: fname : full path name
* leafname : NULL terminated filename
* ld : load address
* ex : exec address
* bs : base address
* len : length of data
* cdir : current directory (where file is to be placed)
* fzero : TRUE if we are to zero the data CLUSTERs
* ihand : filesystem image handle
*/
int CLUSTERsize ;
int CLUSTERs_required ;
int loop ;
int startCLUSTER ; /* cluster where the file starts */
time5byte saveTIME ; /* local time save started at */
DIR_info *pdir = NULL ; /* parent directory */
DOS_direntry *lfn[20];
int numreq=0;
int not_sfn;
char shortname[13];
shortname[11]=0;
shortname[12]=0;
if ((int)len < 0)
return_error0(int, err_discfull);
get_RISCOS_TIME(&saveTIME) ;
dprintf(("","saveFILE: \"%s\" len &%08X (*cdir = &%08X)\n",leafname,len,(int)(*cdir)));
/* calculate the number of complete clusters required to hold the object */
CLUSTERsize = cluster_size(&(ihand->disc_boot)) ;
CLUSTERs_required = ((len + (CLUSTERsize - 1)) / CLUSTERsize) ;
dprintf(("","saveFILE: CLUSTERs_required = %d\n",CLUSTERs_required));
/* check to see if the file already exists */
/* start at the beginning of the directory */
loop = 0 ;
if ((*dentry = findDIRentry(leafname,*cdir,(*cdir)->dir_size,&loop))!=NULL)
int CLUSTERsize ;
int CLUSTERs_required ;
int loop ;
int startCLUSTER ; /* cluster where the file starts */
time5byte saveTIME ; /* local time save started at */
DIR_info *pdir = NULL ; /* parent directory */
DOS_direntry *lfn[(MaxString + 12) / 13];
int numreq, diroffset;
int not_sfn;
char *longfileholder = NULL;
char shortname[13];
char shorttemp[14];
get_RISCOS_TIME(&saveTIME) ;
dprintf(("","saveFILE: \"%s\" len &%08X (*cdir = &%08X)\n",leafname,len,(int)(*cdir)));
/* calculate the number of complete clusters required to hold the object */
CLUSTERsize = cluster_size(&(ihand->disc_boot)) ;
CLUSTERs_required = len / CLUSTERsize ;
if (len & (CLUSTERsize - 1)) CLUSTERs_required++ ; /* Round up partials */
dprintf(("","saveFILE: CLUSTERs_required = %d\n",CLUSTERs_required));
/* check to see if the file already exists */
/* start at the beginning of the directory */
loop = 0 ;
if ((*dentry = findDIRentry(leafname,*cdir,(*cdir)->dir_size,&loop))!=NULL)
{
dprintf(("","saveFILE: file already exists\n"));
dprintf(("","saveFILE: file already exists\n"));
/* Make sure that the file is not open. */
if (find_open_file(fname, *dentry, ihand) >= 0)
return_error1(int, err_fileopen, fname);
/* Make sure that the file is not open. */
if (find_open_file(fname, *dentry, ihand) >= 0)
return_error1(int, err_fileopen, fname);
/* Make sure the file isn't locked. */
if (((*dentry)->FILE_attribute & FILE_readonly) != 0)
return_error1(int, err_filelocked, fname);
/* Make sure the file isn't locked. */
if (((*dentry)->FILE_attribute & FILE_readonly) != 0)
return_error1(int, err_filelocked, fname);
startCLUSTER = get_FILE_cluster(*dentry,ihand) ;
startCLUSTER = get_FILE_cluster(*dentry,ihand) ;
if ((startCLUSTER = adjustusedchain(startCLUSTER, CLUSTERs_required, ihand)) < 0)
return -1;
if ((startCLUSTER = adjustusedchain(startCLUSTER, CLUSTERs_required, ihand)) < 0)
return -1;
}
else
else
{
dprintf(("","saveFILE: file does NOT exist\n"));
numreq = (strlen(leafname)/13) + 2;
dprintf(("","saveFILE: numreq = %d\n",numreq));
if(get_dir_entry_array(lfn, ihand, numreq, cdir, &pdir,NULL) <0) return -1;
dprintf(("","saveFILE: p1 size =%x \n",(*cdir)->dir_size));
if ((startCLUSTER = claimfreeclusters(CLUSTERs_required, ihand)) < 0) return -1;
char shorttemp[14];
dprintf(("","saveFILE: file does NOT exist\n"));
/* Try to allocate the long filename array. The leafname has a NULL
* terminator, rounded up to the nearest block of 13, plus one extra
* for the DOS short name length + 1 + 12 + 1 = length + 2
* --------------- ------
* 13 13
*/
numreq = (strlen(leafname) / 13) + 2;
dprintf(("","saveFILE: numreq = %d\n",numreq));
if (get_dir_entry_array(lfn, ihand, numreq, cdir, &pdir,NULL) < 0)
{
return -1;
}
dprintf(("","saveFILE: p1 size =%x \n",(*cdir)->dir_size));
not_sfn=shorten_lfn(leafname,shortname,shorttemp,*cdir);
(*dentry) = not_sfn?lfn[numreq-1]:lfn[0];
dprintf(("","saveFILE: p2 .. *dentry = %p\n",(*dentry)));
/* "dentry" = pointer to the directory entry to create */
if ((startCLUSTER = claimfreeclusters(CLUSTERs_required, ihand)) < 0)
{
return -1;
}
dprintf(("","saveFILE: long filename = %s\n",leafname));
dprintf(("","saveFILE: short tempory filename = %s\n",shorttemp));
dprintf(("","saveFILE: short filename = \'%c%c%c%c%c%c%c%c\' ext=\'%c%c%c\'\n",shortname[0],shortname[1],shortname[2],shortname[3],shortname[4],shortname[5],shortname[6],shortname[7],shortname[8],shortname[9],shortname[10]));
if(not_sfn) MakeLFNEntries(&lfn[0],numreq,leafname,shortname);
/* Create 8.3 filename from leafname */
not_sfn = shorten_lfn(leafname, shortname, shorttemp, *cdir);
(*dentry) = not_sfn ? lfn[numreq - 1] : lfn[0];
dprintf(("","saveFILE: long filename = %s\n",leafname));
dprintf(("","saveFILE: short filename = \'%c%c%c%c%c%c%c%c\' ext=\'%c%c%c\'\n",
shortname[0],shortname[1],shortname[2],shortname[3],shortname[4],shortname[5],shortname[6],shortname[7],
shortname[8],shortname[9],shortname[10]));
if (not_sfn) MakeLFNEntries(&lfn[0],numreq,leafname,shortname);
/* write the information into the directory entry
*
* This requires the filename to be split into name and extension fields
* We fill the name with SPACEs first (the string terminator (NULL) is
* placed in the attributes field)
*
* NOTE: these should be done in this order due to the fact that the
* text building function terminates each string with a NUL
*/
sprintf((char *)&((*dentry)->FILE_status)," ") ;
memcpy((char *)&((*dentry)->FILE_status), &shortname[0], 8);
memcpy((char *)&((*dentry)->FILE_extension), &shortname[8], 3);
/* mark the file as suitable for archiving */
(*dentry)->FILE_attribute = FILE_archive ;
memset((char *)&((*dentry)->FILE_reserved),0,spare1) ; /* ZERO "spare1" bytes */
if(not_sfn)
{
longfileholder = (char *)malloc(strlen(leafname) + 1);
if (longfileholder == NULL)
{
return_errorT(int,err_heapexhausted, tok_heapexhausted, 0, 0);
}
strcpy(longfileholder, leafname);
}
/* write the information into the directory entry
*
* This requires the filename to be split into name and extension fields
* We fill the name with SPACEs first (the string terminator (NULL) is
* placed in the attributes field)
*
* NOTE: these should be done in this order due to the fact that the
* text building function terminates each string with a NUL
*/
set_dir_flags(*cdir, dir_MODIFIED) ; /* directory updated */
// sprintf((char *)&((*dentry)->FILE_status)," ") ;
memcpy((char *)&((*dentry)->FILE_status),&shortname[0],8);
memcpy((char *)&((*dentry)->FILE_extension),&shortname[8],3);
/* mark the file as suitable for archiving */
(*dentry)->FILE_attribute = FILE_archive ;
// bzero((char *)&((*dentry)->FILE_reserved),spare1) ; /* ZERO "spare1" bytes */
memset((char *)&((*dentry)->FILE_reserved),0,spare1) ; /* ZERO "spare1" bytes */
char * longfileholder = NULL;
if(not_sfn)
{
longfileholder = malloc(strlen(leafname)+1);
if (longfileholder == NULL)
{
return_errorT(int,err_heapexhausted, tok_heapexhausted, 0, 0);
}
strcpy(longfileholder,leafname);
}
int diroffset = (int) ((int)(*dentry)-(int)DI_Base(*cdir)) / sizeof(DOS_direntry);
(*cdir)->lfnp[diroffset] = longfileholder;
dprintf(("","**************************************HERE: index (diroffset) = %d, pointer = %p, actual = %p lnfp=%p\n",diroffset,(*cdir)->lfnp[diroffset], longfileholder,&((*cdir)->lfnp[diroffset])));
dprintf(("","saveFILE: &((*cdir)->lfnp[diroffset]) = %p\n",&((*cdir)->lfnp[diroffset])));
dprintf(("","saveFILE: CBC dir = %x\n",DI_Base(*cdir)));
// int index=0;
// if(findDIRentry(shorttemp,*cdir,(*cdir)->dir_size,&index))
// {
// (*cdir)->lfnp[index] = longfileholder;
// }
// dprintf(("","**************************************HERE: index = %d, pointer = %p, actual = %p\n",index,(*cdir)->lfnp[index], longfileholder));
diroffset = (int)((int)(*dentry) - DI_Base(*cdir)) / sizeof(DOS_direntry);
(*cdir)->lfnp[diroffset] = longfileholder;
dprintf(("","saveFILE: &((*cdir)->lfnp[diroffset]) = %p\n",&((*cdir)->lfnp[diroffset])));
dprintf(("","saveFILE: CBC dir = %x\n",DI_Base(*cdir)));
}
set_dir_flags(*cdir, dir_MODIFIED) ; /* directory updated */
set_dir_flags(*cdir, dir_MODIFIED) ; /* directory updated */
DOS_newdirentry * mentry = (DOS_newdirentry*)(*dentry);
mentry->FILE_CrtTimeTenth = 0;
mentry->FILE_NTRes = 0;
put_FILE_time(mentry->FILE_time,mentry->FILE_timeHI,RISCOStoTIME(&saveTIME)) ;
put_FILE_time(mentry->FILE_CrtTime,mentry->FILE_CrtTimeHi,RISCOStoTIME(&saveTIME)) ;
put_FILE_date(mentry->FILE_date,mentry->FILE_dateHI,RISCOStoDATE(&saveTIME)) ;
put_FILE_date(mentry->FILE_CrtDate,mentry->FILE_CrtDateHi,RISCOStoDATE(&saveTIME)) ;
put_FILE_date(mentry->FILE_LstAccDate,mentry->FILE_LstAccDateHi,RISCOStoDATE(&saveTIME)) ;
mentry->FILE_NTRes = 0;
DOS_newdirentry * mentry = (DOS_newdirentry *)(*dentry);
mentry->FILE_CrtTimeTenth = 0;
mentry->FILE_NTRes = 0;
put_FILE_time(mentry->FILE_time,mentry->FILE_timeHI,RISCOStoTIME(&saveTIME)) ;
put_FILE_time(mentry->FILE_CrtTime,mentry->FILE_CrtTimeHi,RISCOStoTIME(&saveTIME)) ;
put_FILE_date(mentry->FILE_date,mentry->FILE_dateHI,RISCOStoDATE(&saveTIME)) ;
put_FILE_date(mentry->FILE_CrtDate,mentry->FILE_CrtDateHi,RISCOStoDATE(&saveTIME)) ;
put_FILE_date(mentry->FILE_LstAccDate,mentry->FILE_LstAccDateHi,RISCOStoDATE(&saveTIME)) ;
mentry->FILE_NTRes = 0;
dprintf(("","saveFILE: NTRes = %x\n",mentry->FILE_NTRes));
dprintf(("","saveFILE: NTRes = %x\n",mentry->FILE_NTRes));
dprintf(("","saveFILE: startCLUSTER = &%03X\n",startCLUSTER));
dprintf(("","saveFILE: startCLUSTER = &%03X\n",startCLUSTER));
put_FILE_cluster((*dentry),startCLUSTER,ihand) ;
(*dentry)->FILE_size = len ;
put_FILE_cluster((*dentry),startCLUSTER,ihand) ;
(*dentry)->FILE_size = len ;
dprintf(("","saveFILE: NTRes = %x\n",mentry->FILE_NTRes));
dprintf(("","saveFILE: NTRes = %x\n",mentry->FILE_NTRes));
/* copy the data from memory into the allocated clusters */
/* use "saveOBJECT" to perform this */
if (fzero == 0 && len)
/* copy the data from memory into the allocated clusters */
/* use "saveOBJECT" to perform this */
if (fzero == 0 && len)
{
if (DOS_object_RW(Wdata,startCLUSTER,bs,len,ihand) != 0)
if (DOS_object_RW(Wdata,startCLUSTER,bs,len,ihand) != 0)
{
dprintf(("","saveFILE: \"saveOBJECT\" call failed\n"));
return -1;
dprintf(("","saveFILE: \"saveOBJECT\" call failed\n"));
return -1;
}
}
dprintf(("","saveFILE: NTRes = %x\n",mentry->FILE_NTRes));
/* Update the load and exec addresses */
update_loadexec(*dentry, ld, ex);
dprintf(("","saveFILE: p3\n"));
dprintf(("","saveFILE: NTRes = %x\n",mentry->FILE_NTRes));
/* Update the load and exec addresses */
update_loadexec(*dentry, ld, ex);
dprintf(("","saveFILE: p3\n"));
if (pdir != NULL) {
if (ensure_directory(pdir)!= 0) {
dprintf(("","saveFILE: ensure_dir failed\n"));
return -1;
if (pdir != NULL)
{
if (ensure_directory(pdir)!= 0)
{
dprintf(("","saveFILE: ensure_dir failed\n"));
return -1;
}
}
}
/* now ensure all the directory information and FATs onto the disc */
if ((ensure_directory(*cdir)!= 0) || (ensure_FATs(ihand) != 0))
{
dprintf(("","saveFILE: ensure_dir || ensure_FATs failed\n"));
return(-1) ; /* error already defined */
}
dprintf(("","saveFILE: NTRes = %x\n",mentry->FILE_NTRes));
/* and we have a nice return */
return(0) ;
/* now ensure all the directory information and FATs onto the disc */
if ((ensure_directory(*cdir)!= 0) || (ensure_FATs(ihand) != 0))
{
dprintf(("","saveFILE: ensure_dir || ensure_FATs failed\n"));
return(-1) ; /* error already defined */
}
dprintf(("","saveFILE: NTRes = %x\n",mentry->FILE_NTRes));
/* and we have a nice return */
return(0) ;
}
/* Extend or truncate the given file to the required length. */
......@@ -832,8 +836,8 @@ int ensure_exact(FILEhand *fhand,int ensure)
dprintf(("","DOSFS_ensure_exact: fhand &%08X (fext &%08X)\n",(int)fhand,ensure));
CLUSTERsize = cluster_size(&(fhand->ihand->disc_boot)) ;
ensure = ((ensure + (CLUSTERsize - 1)) & ~(CLUSTERsize - 1)) ;
CLUSTERs_required = (ensure / CLUSTERsize) ;
CLUSTERs_required = ensure / CLUSTERsize ;
if (ensure & (CLUSTERsize - 1)) CLUSTERs_required++ ; /* Round up partials */
startCLUSTER = fhand->startCLUSTER ;
if ((startCLUSTER = adjustusedchain(startCLUSTER, CLUSTERs_required, fhand->ihand)) < 0)
......
......@@ -555,7 +555,7 @@ int DOSFS_create_dir(char *fname, word ld, word ex, word size, DOSdisc *ihand)
*/
numreq = (strlen(leafname) / 13) + 2;
dprintf(("","DOSFS_create_dir: numreq = %d\n",numreq));
if (get_dir_entry_array(lfn, ihand, numreq, &cdir, &pdir,NULL) <0)
if (get_dir_entry_array(lfn, ihand, numreq, &cdir, &pdir,NULL) < 0)
{
return -1;
}
......@@ -612,7 +612,7 @@ int DOSFS_create_dir(char *fname, word ld, word ex, word size, DOSdisc *ihand)
}
strcpy(longfileholder, leafname);
diroffset = ((int)((int)(dentry) - (DI_Base(cdir))) / sizeof(DOS_direntry));
diroffset = (int)((int)(dentry) - DI_Base(cdir)) / sizeof(DOS_direntry);
(cdir)->lfnp[diroffset] = longfileholder;
dprintf(("","DOSFS_create_dir: index = %d, pointer = %p, actual = %p\n",diroffset,(cdir)->lfnp[diroffset], longfileholder));
......
......@@ -467,8 +467,8 @@ DOSdisc *DOSFS_image_open(word fshand, word buffsize)
dprintf(("","DOSFS_image_open: numFATs = %d\n",numFATs));
dprintf(("","DOSFS_image_open: numRESVD = %d\n",numRESVD));
dprintf(("","DOSFS_image_open: cluster size = %x\n",dboot->BOOT_secalloc));
dprintf(("","DOSFS_image_open: Sector size = %d\n",((dboot->BOOT_secsize)|(dboot->BOOT_secsizeHI<<8))));
dprintf(("","DOSFS_image_open: sectors per cluster = %x\n",dboot->BOOT_secalloc));
dprintf(("","DOSFS_image_open: sector size = %d\n",((dboot->BOOT_secsize)|(dboot->BOOT_secsizeHI<<8))));
dprintf(("","DOSFS_image_open: cluster size = %d\n",dboot->BOOT_secalloc * ((dboot->BOOT_secsize)|(dboot->BOOT_secsizeHI<<8))));
RootDirSectors = (dboot->BOOT_root_dir | (dboot->BOOT_root_dirHI << 8)) * sizeof(DOS_direntry); /* Bytes */
......
......@@ -12,7 +12,7 @@
; See the License for the specific language governing permissions and
; limitations under the License.
;
;> m.DOSFShdr
;> cmhg.DOSFShdr
; ---------------------------------------------------------------------------
; This is the definition for the DOSFS (RISC OS MultiFS C Module)
; ---------------------------------------------------------------------------
......@@ -26,9 +26,12 @@ title-string: DOSFS
date-string: Module_Date_CMHG
#ifdef ROM
library-initialisation-code: _dosfs_initialisemodule
service-call-handler: fs_service 0x11 0x12 0x27 0x40 0x42 0x5C 0x68 0x69 0x6A 0x6B 0x6C
#else
service-call-handler: fs_service 0x11 0x12 0x27 0x40 0x42 0x5C 0x60 0x68 0x69 0x6A 0x6B 0x6C
#endif
initialisation-code: init_fs
service-call-handler: fs_service 0x11 0x12 0x27 0x40 0x42 0x5C 0x68 0x69 0x6A 0x6B 0x6C
finalisation-code: shutdown_fs
swi-chunk-base-number: 0x44B00
swi-handler-code: fs_swi
swi-decoding-table: DOSFS DiscFormat LayoutStructure
......
......@@ -34,8 +34,9 @@ typedef unsigned int word ;
/*-------------------------------------------------------------------------*/
/* global (static) variables used within the module */
extern void *dosfs_msgarea(void); /* Generated by 'resgen' */
extern int discopswi;
extern int module_flags ; /* Global flags, mixture of: */
extern int module_flags ; /* Global flags, mixture of: */
#define TRUNCATE_NAMES 0x00000001
#include "DOSshape.h"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment