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;
}
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

View File

@ -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

View File

@ -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 */

View File

@ -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);