diff --git a/kernel/dosfns.c b/kernel/dosfns.c index e646a5c..47dd6ca 100644 --- a/kernel/dosfns.c +++ b/kernel/dosfns.c @@ -776,28 +776,28 @@ COUNT DosClose(COUNT hndl) return ret; } -BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc, - UWORD * bps, UWORD * nc) +UWORD DosGetFree(UBYTE drive, UWORD * navc, UWORD * bps, UWORD * nc) { /* navc==NULL means: called from FatGetDrvData, fcbfns.c */ struct dpb FAR *dpbp; struct cds FAR *cdsp; COUNT rg[4]; + UWORD spc; /* next - "log" in the drive */ drive = (drive == 0 ? default_drive : drive - 1); /* first check for valid drive */ - *spc = -1; + spc = -1; cdsp = get_cds(drive); if (cdsp == NULL) - return FALSE; + return spc; if (cdsp->cdsFlags & CDSNETWDRV) { if (remote_getfree(cdsp, rg) != SUCCESS) - return FALSE; + return spc; /* for int21/ah=1c: 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 - Bart, 2002 Apr 1 */ + spc = rg[0]; if (navc != NULL) { *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]; *bps = (COUNT) rg[2]; - return TRUE; + return spc; } dpbp = cdsp->cdsDpb; if (dpbp == NULL) - return FALSE; + return spc; if (navc == NULL) { @@ -830,9 +830,9 @@ BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc, } if (media_check(dpbp) < 0) - return FALSE; + return spc; /* get the data available from dpb */ - *spc = (dpbp->dpb_clsmask + 1); + spc = (dpbp->dpb_clsmask + 1); *bps = dpbp->dpb_secsize; /* 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) { cluster_size <<= 1; - *spc <<= 1; + spc <<= 1; ntotal >>= 1; nfree >>= 1; } @@ -861,7 +861,7 @@ BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc, /* count */ if (navc != NULL) *navc = nfree > FAT_MAGIC16 ? FAT_MAGIC16 : (UCOUNT) nfree; - return TRUE; + return spc; } #endif /* 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) *navc = (COUNT) dos_free(dpbp); *nc = dpbp->dpb_size - 1; - if (*spc > 64) + if (spc > 64) { /* fake for 64k clusters do confuse some DOS programs, but let others work without overflowing */ - *spc >>= 1; - *navc = ((unsigned)*navc < FAT_MAGIC16 / 2) ? ((unsigned)*navc << 1) : FAT_MAGIC16; + spc >>= 1; + 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; } - return TRUE; + return spc; } #ifdef WITHFAT32 diff --git a/kernel/fcbfns.c b/kernel/fcbfns.c index 84aa97b..f4487a5 100644 --- a/kernel/fcbfns.c +++ b/kernel/fcbfns.c @@ -52,19 +52,22 @@ STATIC void FcbCalcRec(xfcb FAR * lpXfcb); 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; + UWORD spc; /* 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); /* Point to the media desctriptor for this drive */ + *pspc = (UBYTE)spc; if (dpbp == NULL) { - mdb = *spc >> 8; - *spc &= 0xff; + mdb = spc >> 8; + spc &= 0xff; return &mdb; } else diff --git a/kernel/inthndlr.c b/kernel/inthndlr.c index 85eb316..e82a356 100644 --- a/kernel/inthndlr.c +++ b/kernel/inthndlr.c @@ -615,7 +615,7 @@ dispatch: { 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.BX = FP_OFF(p); } @@ -795,7 +795,7 @@ dispatch: /* Dos Get Disk Free Space */ 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; /* Undocumented Get/Set Switchar */ diff --git a/kernel/proto.h b/kernel/proto.h index 8e1110f..b13700c 100644 --- a/kernel/proto.h +++ b/kernel/proto.h @@ -97,8 +97,7 @@ long DosOpenSft(char FAR * fname, unsigned flags, unsigned attrib); COUNT DosClose(COUNT hndl); COUNT DosCloseSft(int sft_idx, BOOL commitonly); #define DosCommit(hndl) DosCloseSft(get_sft_idx(hndl), TRUE) -BOOL DosGetFree(UBYTE drive, UWORD * spc, UWORD * navc, - UWORD * bps, UWORD * nc); +UWORD DosGetFree(UBYTE drive, UWORD * navc, UWORD * bps, UWORD * nc); COUNT DosGetCuDir(UBYTE drive, BYTE FAR * s); COUNT DosChangeDir(BYTE FAR * s); COUNT DosFindFirst(UCOUNT attr, BYTE FAR * name); @@ -204,7 +203,7 @@ int DosCharInput(VOID); VOID DosDirectConsoleIO(iregs FAR * r); VOID DosCharOutput(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 FcbParseFname(UBYTE *wTestMode, const BYTE FAR *lpFileName, fcb FAR * lpFcb); const BYTE FAR *ParseSkipWh(const BYTE FAR * lpFileName);