int21/ah=0x1b,0x1c should only change AL

Change prototype of DosGetFree so it returns AX (Arkady)
Checking the return value for FFFF is enough to check for failure.


git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1008 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2004-07-25 08:04:54 +00:00
parent 7c861194f8
commit 7cd4f6c14b
4 changed files with 30 additions and 26 deletions

View File

@ -776,28 +776,28 @@ COUNT DosClose(COUNT hndl)
return ret; return ret;
} }
BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc, UWORD DosGetFree(UBYTE drive, UWORD * navc, UWORD * bps, UWORD * nc)
UWORD * bps, UWORD * nc)
{ {
/* navc==NULL means: called from FatGetDrvData, fcbfns.c */ /* navc==NULL means: called from FatGetDrvData, fcbfns.c */
struct dpb FAR *dpbp; struct dpb FAR *dpbp;
struct cds FAR *cdsp; struct cds FAR *cdsp;
COUNT rg[4]; COUNT rg[4];
UWORD spc;
/* next - "log" in the drive */ /* next - "log" in the drive */
drive = (drive == 0 ? default_drive : drive - 1); drive = (drive == 0 ? default_drive : drive - 1);
/* first check for valid drive */ /* first check for valid drive */
*spc = -1; spc = -1;
cdsp = get_cds(drive); cdsp = get_cds(drive);
if (cdsp == NULL) if (cdsp == NULL)
return FALSE; return spc;
if (cdsp->cdsFlags & CDSNETWDRV) if (cdsp->cdsFlags & CDSNETWDRV)
{ {
if (remote_getfree(cdsp, rg) != SUCCESS) if (remote_getfree(cdsp, rg) != SUCCESS)
return FALSE; return spc;
/* for int21/ah=1c: /* for int21/ah=1c:
Undoc DOS says, its not supported for Undoc DOS says, its not supported for
@ -806,21 +806,21 @@ BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc,
the redirector can provide all info the redirector can provide all info
- Bart, 2002 Apr 1 */ - Bart, 2002 Apr 1 */
spc = rg[0];
if (navc != NULL) if (navc != NULL)
{ {
*navc = (COUNT) rg[3]; *navc = (COUNT) rg[3];
*spc &= 0xff; /* zero out media ID byte */ spc &= 0xff; /* zero out media ID byte */
} }
*spc = (COUNT) rg[0];
*nc = (COUNT) rg[1]; *nc = (COUNT) rg[1];
*bps = (COUNT) rg[2]; *bps = (COUNT) rg[2];
return TRUE; return spc;
} }
dpbp = cdsp->cdsDpb; dpbp = cdsp->cdsDpb;
if (dpbp == NULL) if (dpbp == NULL)
return FALSE; return spc;
if (navc == NULL) if (navc == NULL)
{ {
@ -830,9 +830,9 @@ BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc,
} }
if (media_check(dpbp) < 0) if (media_check(dpbp) < 0)
return FALSE; return spc;
/* get the data available from dpb */ /* get the data available from dpb */
*spc = (dpbp->dpb_clsmask + 1); spc = (dpbp->dpb_clsmask + 1);
*bps = dpbp->dpb_secsize; *bps = dpbp->dpb_secsize;
/* now tell fs to give us free cluster */ /* now tell fs to give us free cluster */
@ -850,7 +850,7 @@ BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc,
while (ntotal > FAT_MAGIC16 && cluster_size < 0x8000) while (ntotal > FAT_MAGIC16 && cluster_size < 0x8000)
{ {
cluster_size <<= 1; cluster_size <<= 1;
*spc <<= 1; spc <<= 1;
ntotal >>= 1; ntotal >>= 1;
nfree >>= 1; nfree >>= 1;
} }
@ -861,7 +861,7 @@ BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc,
/* count */ /* count */
if (navc != NULL) if (navc != NULL)
*navc = nfree > FAT_MAGIC16 ? FAT_MAGIC16 : (UCOUNT) nfree; *navc = nfree > FAT_MAGIC16 ? FAT_MAGIC16 : (UCOUNT) nfree;
return TRUE; return spc;
} }
#endif #endif
/* a passed navc of NULL means: skip free; see FatGetDrvData /* a passed navc of NULL means: skip free; see FatGetDrvData
@ -869,15 +869,17 @@ BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc,
if (navc != NULL) if (navc != NULL)
*navc = (COUNT) dos_free(dpbp); *navc = (COUNT) dos_free(dpbp);
*nc = dpbp->dpb_size - 1; *nc = dpbp->dpb_size - 1;
if (*spc > 64) if (spc > 64)
{ {
/* fake for 64k clusters do confuse some DOS programs, but let /* fake for 64k clusters do confuse some DOS programs, but let
others work without overflowing */ others work without overflowing */
*spc >>= 1; spc >>= 1;
*navc = ((unsigned)*navc < FAT_MAGIC16 / 2) ? ((unsigned)*navc << 1) : FAT_MAGIC16; if (navc != NULL)
*navc = ((unsigned)*navc < FAT_MAGIC16 / 2) ?
((unsigned)*navc << 1) : FAT_MAGIC16;
*nc = ((unsigned)*nc < FAT_MAGIC16 / 2) ? ((unsigned)*nc << 1) : FAT_MAGIC16; *nc = ((unsigned)*nc < FAT_MAGIC16 / 2) ? ((unsigned)*nc << 1) : FAT_MAGIC16;
} }
return TRUE; return spc;
} }
#ifdef WITHFAT32 #ifdef WITHFAT32

View File

@ -52,19 +52,22 @@ STATIC void FcbCalcRec(xfcb FAR * lpXfcb);
static dmatch Dmatch; static dmatch Dmatch;
BYTE FAR *FatGetDrvData(UBYTE drive, UWORD * spc, UWORD * bps, UWORD * nc) BYTE FAR *FatGetDrvData(UBYTE drive, UBYTE * pspc, UWORD * bps, UWORD * nc)
{ {
static BYTE mdb; static BYTE mdb;
UWORD spc;
/* get the data available from dpb */ /* get the data available from dpb */
if (DosGetFree(drive, spc, NULL, bps, nc)) spc = DosGetFree(drive, NULL, bps, nc);
if (spc != 0xffff)
{ {
struct dpb FAR *dpbp = get_dpb(drive == 0 ? default_drive : drive - 1); struct dpb FAR *dpbp = get_dpb(drive == 0 ? default_drive : drive - 1);
/* Point to the media desctriptor for this drive */ /* Point to the media desctriptor for this drive */
*pspc = (UBYTE)spc;
if (dpbp == NULL) if (dpbp == NULL)
{ {
mdb = *spc >> 8; mdb = spc >> 8;
*spc &= 0xff; spc &= 0xff;
return &mdb; return &mdb;
} }
else else

View File

@ -615,7 +615,7 @@ dispatch:
{ {
BYTE FAR *p; BYTE FAR *p;
p = FatGetDrvData(lr.DL, &lr.AX, &lr.CX, &lr.DX); p = FatGetDrvData(lr.DL, &lr.AL, &lr.CX, &lr.DX);
lr.DS = FP_SEG(p); lr.DS = FP_SEG(p);
lr.BX = FP_OFF(p); lr.BX = FP_OFF(p);
} }
@ -795,7 +795,7 @@ dispatch:
/* Dos Get Disk Free Space */ /* Dos Get Disk Free Space */
case 0x36: case 0x36:
DosGetFree(lr.DL, &lr.AX, &lr.BX, &lr.CX, &lr.DX); lr.AX = DosGetFree(lr.DL, &lr.BX, &lr.CX, &lr.DX);
break; break;
/* Undocumented Get/Set Switchar */ /* Undocumented Get/Set Switchar */

View File

@ -97,8 +97,7 @@ long DosOpenSft(char FAR * fname, unsigned flags, unsigned attrib);
COUNT DosClose(COUNT hndl); COUNT DosClose(COUNT hndl);
COUNT DosCloseSft(int sft_idx, BOOL commitonly); COUNT DosCloseSft(int sft_idx, BOOL commitonly);
#define DosCommit(hndl) DosCloseSft(get_sft_idx(hndl), TRUE) #define DosCommit(hndl) DosCloseSft(get_sft_idx(hndl), TRUE)
BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc, UWORD DosGetFree(UBYTE drive, UWORD * navc, UWORD * bps, UWORD * nc);
UWORD * bps, UWORD * nc);
COUNT DosGetCuDir(UBYTE drive, BYTE FAR * s); COUNT DosGetCuDir(UBYTE drive, BYTE FAR * s);
COUNT DosChangeDir(BYTE FAR * s); COUNT DosChangeDir(BYTE FAR * s);
COUNT DosFindFirst(UCOUNT attr, BYTE FAR * name); COUNT DosFindFirst(UCOUNT attr, BYTE FAR * name);
@ -204,7 +203,7 @@ int DosCharInput(VOID);
VOID DosDirectConsoleIO(iregs FAR * r); VOID DosDirectConsoleIO(iregs FAR * r);
VOID DosCharOutput(COUNT c); VOID DosCharOutput(COUNT c);
VOID DosDisplayOutput(COUNT c); VOID DosDisplayOutput(COUNT c);
BYTE FAR *FatGetDrvData(UBYTE drive, UWORD * spc, UWORD * bps, BYTE FAR *FatGetDrvData(UBYTE drive, UBYTE * spc, UWORD * bps,
UWORD * nc); UWORD * nc);
UWORD FcbParseFname(UBYTE *wTestMode, const BYTE FAR *lpFileName, fcb FAR * lpFcb); UWORD FcbParseFname(UBYTE *wTestMode, const BYTE FAR *lpFileName, fcb FAR * lpFcb);
const BYTE FAR *ParseSkipWh(const BYTE FAR * lpFileName); const BYTE FAR *ParseSkipWh(const BYTE FAR * lpFileName);