mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
74 lines
2.9 KiB
C
74 lines
2.9 KiB
C
/****************************************************************************/
|
|
/* */
|
|
/* _ o p e n F u n c t i o n */
|
|
/* --------------------------- */
|
|
/* */
|
|
/* Function "_open" is used to parse the CP/M fcb and open or create */
|
|
/* the requested file. Created files are deleted first, to avoid */
|
|
/* directory problems. */
|
|
/* */
|
|
/* Calling Sequence: */
|
|
/* */
|
|
/* ret = _open(ch,filnam,bdosfunc); */
|
|
/* */
|
|
/* Where: */
|
|
/* ch Is a vacant channel number */
|
|
/* filnam Is a null-terminated CP/M filename */
|
|
/* bdosfunc Is the desired BDOS function to perform */
|
|
/* */
|
|
/* This routine may also be used to delete files as well. */
|
|
/* */
|
|
/****************************************************************************/
|
|
#include "stdio.h"
|
|
#include "cpm.h"
|
|
WORD _open(ch,filnam,bdosfunc) /****************************/
|
|
/* */
|
|
WORD ch; /* Channel number */
|
|
REG BYTE *filnam; /* -> filename */
|
|
WORD bdosfunc; /* BDOS Function */
|
|
{ /****************************/
|
|
EXTERN FILE *_getc(); /* fd -> fp xlate routine */
|
|
REG FILE *fp; /* -> ccb area */
|
|
REG struct xfcb *fcbp; /* -> FCB area in ccb */
|
|
REG BYTE *p; /* Temp character pointer */
|
|
REG WORD i; /* Character index */
|
|
/****************************/
|
|
fp = _getc(ch); /* Fetch ccb pointer */
|
|
fcbp = &(fp ->fcb); /* Fetch fcb pointer */
|
|
/****************************/
|
|
if(*(filnam+1) == ':') /* Drive ID present? */
|
|
{ /* If here, yes */
|
|
fcbp->drive = toupper(*filnam) /* Load drive ID */
|
|
- 'A' + 1; /* 1 for a:, 2 for b:, ... */
|
|
filnam += 2; /* Bump past ':' */
|
|
} /****************************/
|
|
/* */
|
|
i = 0; /* index */
|
|
/****************************/
|
|
while (*filnam > ' ' && i < 8 && /* */
|
|
*filnam != '.') /* Terminate on ext. */
|
|
{ /* */
|
|
fcbp -> fname[i++] = /* Load next character */
|
|
toupper(*filnam); /* */
|
|
filnam++; /* Increment */
|
|
} /* */
|
|
/****************************/
|
|
if (*filnam == '.') /* Extension specified? */
|
|
{ /* Yes */
|
|
filnam++; /* Bump past '.' */
|
|
i = 0; /* set index to 0 */
|
|
while(*filnam > ' ' && i < 3) /* copy */
|
|
{ /* */
|
|
fcbp -> ftype[i++] = /* */
|
|
toupper(*filnam); /* file type */
|
|
filnam++; /* */
|
|
} /* */
|
|
} /****************************/
|
|
/* */
|
|
if(bdosfunc == CREATE) /* Creating file? */
|
|
__BDOS(DELETE,fcbp); /* Yes, delete it first */
|
|
/****************************/
|
|
i = __BDOS(bdosfunc,fcbp); /* Do requested operation */
|
|
return((i<=3) ? SUCCESS : FAILURE); /* Binary return code */
|
|
} /****************************/
|