mirror of
https://github.com/FDOS/kernel.git
synced 2025-07-26 23:34:18 +02:00
FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@305 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
6c5e9311a8
commit
048c87bbac
@ -5,6 +5,9 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
# $Log$
|
# $Log$
|
||||||
|
# Revision 1.4 2001/09/23 20:39:44 bartoldeman
|
||||||
|
# FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
#
|
||||||
# Revision 1.3 2000/05/25 20:56:19 jimtabor
|
# Revision 1.3 2000/05/25 20:56:19 jimtabor
|
||||||
# Fixed project history
|
# Fixed project history
|
||||||
#
|
#
|
||||||
@ -49,7 +52,7 @@
|
|||||||
|
|
||||||
!include "..\config.mak"
|
!include "..\config.mak"
|
||||||
|
|
||||||
production: b_fat12.bin b_fat16.bin
|
production: b_fat12.bin b_fat16.bin b_fat32.bin
|
||||||
|
|
||||||
b_fat12.bin: boot.asm
|
b_fat12.bin: boot.asm
|
||||||
$(NASM) -dISFAT12 boot.asm -ob_fat12.bin
|
$(NASM) -dISFAT12 boot.asm -ob_fat12.bin
|
||||||
@ -57,8 +60,11 @@ b_fat12.bin: boot.asm
|
|||||||
b_fat16.bin: boot.asm
|
b_fat16.bin: boot.asm
|
||||||
$(NASM) -dISFAT16 boot.asm -ob_fat16.bin
|
$(NASM) -dISFAT16 boot.asm -ob_fat16.bin
|
||||||
|
|
||||||
|
b_fat32.bin: boot32.asm
|
||||||
|
$(NASM) boot32.asm -ob_fat32.bin
|
||||||
|
|
||||||
clobber: clean
|
clobber: clean
|
||||||
$(RM) b_fat12.bin b_fat16.bin status.me
|
$(RM) b_fat12.bin b_fat16.bin b_fat32.bin status.me
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.lst *.map *.bak *.obj
|
$(RM) *.lst *.map *.bak *.obj
|
||||||
|
6
config.m
6
config.m
@ -13,6 +13,9 @@ RM=..\utils\rm -f
|
|||||||
#NASM=nasm
|
#NASM=nasm
|
||||||
|
|
||||||
# Give extra Turbo C compiler flags here
|
# Give extra Turbo C compiler flags here
|
||||||
|
# such as -DDEBUG : extra DEBUG output
|
||||||
|
# -DDOSEMU : printf output goes to dosemu log
|
||||||
|
# -DWITHFAT32 : compile with FAT32 support
|
||||||
#ALLCFLAGS=-DDEBUG
|
#ALLCFLAGS=-DDEBUG
|
||||||
|
|
||||||
|
|
||||||
@ -59,6 +62,9 @@ RM=..\utils\rm -f
|
|||||||
# $Id$
|
# $Id$
|
||||||
#
|
#
|
||||||
# $Log$
|
# $Log$
|
||||||
|
# Revision 1.8 2001/09/23 20:39:43 bartoldeman
|
||||||
|
# FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
#
|
||||||
# Revision 1.7 2001/04/16 14:36:56 bartoldeman
|
# Revision 1.7 2001/04/16 14:36:56 bartoldeman
|
||||||
# Added ALLCFLAGS for compiler option configuration.
|
# Added ALLCFLAGS for compiler option configuration.
|
||||||
#
|
#
|
||||||
|
@ -1,3 +1,47 @@
|
|||||||
|
2001 Sep 24 - Build 2025
|
||||||
|
-------- Bart Oldeman (bart.oldeman@bristol.ac.uk)
|
||||||
|
+ Fixes Victor
|
||||||
|
* More FAT32 fixes
|
||||||
|
+ Fixes Tom
|
||||||
|
* Printer handling
|
||||||
|
* misc INT2F/AH=12 fixes.
|
||||||
|
* misc clean-ups
|
||||||
|
+ Fixes Bart
|
||||||
|
* Added drive B: handling if only one floppy drive available
|
||||||
|
(look for play_dj() in dsk.c)
|
||||||
|
* Simplify Victor's FAT32 fixes a bit
|
||||||
|
* More printer clean-ups
|
||||||
|
2001 Sep 22 - Build 2025 (test)
|
||||||
|
-------- Bart Oldeman (bart.oldeman@bristol.ac.uk)
|
||||||
|
+ Added Victor
|
||||||
|
* FAT32 support
|
||||||
|
* Delete long file names if short file name given
|
||||||
|
+ Added Jeremy
|
||||||
|
* modified SYS so it takes optional 2nd parameter (similar to PC DOS)
|
||||||
|
where if only 1 argument is given, assume to be destination drive,
|
||||||
|
but if two arguments given, 1st is source (drive and/or path)
|
||||||
|
and second is destination drive
|
||||||
|
+ fixes Victor
|
||||||
|
* some small FCB and dsk.c fixes
|
||||||
|
+ fixes Tom
|
||||||
|
* some FAT32 issues
|
||||||
|
* many compiler portability changes (compiles with Watcom, MSC, ...)
|
||||||
|
* DosMemChange should set the PSP
|
||||||
|
* converted INT2F/AH=12 functions to C and added some - enough to
|
||||||
|
get most of the MS LAN network client working
|
||||||
|
+ fixes Bart
|
||||||
|
* some FAT32 issues
|
||||||
|
* Dos{Open,Creat}Sft drive letter issues
|
||||||
|
for CDROMs (thanks Jeremy)
|
||||||
|
* shrink_file should ALWAYS fail for directories, also with
|
||||||
|
dos_set_fattr (thanks Jeremy)
|
||||||
|
* only give warnings for slightly suspect partitions at boot
|
||||||
|
time where CHS does not match LBA.
|
||||||
|
* re-enabled copyright notice.
|
||||||
|
* some dsk.c clean-ups to avoid DIR giving the same contents for
|
||||||
|
a different floppy (get serial number/volume label did reset the
|
||||||
|
changed state).
|
||||||
|
* attribute should be 8-bit fix
|
||||||
2001 Aug 19 - Build 2024/h
|
2001 Aug 19 - Build 2024/h
|
||||||
-------- Bart Oldeman (bart.oldeman@bristol.ac.uk)
|
-------- Bart Oldeman (bart.oldeman@bristol.ac.uk)
|
||||||
+ fixes Bart
|
+ fixes Bart
|
||||||
|
@ -30,6 +30,9 @@
|
|||||||
; $Id$
|
; $Id$
|
||||||
;
|
;
|
||||||
; $Log$
|
; $Log$
|
||||||
|
; Revision 1.8 2001/09/23 20:39:44 bartoldeman
|
||||||
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
;
|
||||||
; Revision 1.7 2001/07/09 22:19:33 bartoldeman
|
; Revision 1.7 2001/07/09 22:19:33 bartoldeman
|
||||||
; LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
; LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
||||||
;
|
;
|
||||||
@ -455,3 +458,8 @@ _fl_lba_ReadWrite:
|
|||||||
|
|
||||||
pop bp
|
pop bp
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
global _fl_readkey
|
||||||
|
_fl_readkey: xor ah, ah
|
||||||
|
int 16h
|
||||||
|
ret
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#define asm __asm
|
#define asm __asm
|
||||||
|
#if _MSC_VER >= 700
|
||||||
|
#pragma warning(disable:4103)
|
||||||
|
#endif
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
#elif defined(_QC) || defined(__WATCOM__)
|
#elif defined(_QC) || defined(__WATCOM__)
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
11
hdr/buffer.h
11
hdr/buffer.h
@ -38,6 +38,9 @@ static BYTE *buffer_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.5 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.4 2001/08/19 12:58:34 bartoldeman
|
* Revision 1.4 2001/08/19 12:58:34 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -65,7 +68,11 @@ struct buffer
|
|||||||
ULONG b_blkno; /* block for this buffer */
|
ULONG b_blkno; /* block for this buffer */
|
||||||
/* DOS-C: 0xffff for huge block numbers */
|
/* DOS-C: 0xffff for huge block numbers */
|
||||||
BYTE b_copies; /* number of copies to write */
|
BYTE b_copies; /* number of copies to write */
|
||||||
UBYTE b_offset_lo; /* span between copies (low) */
|
#ifdef WITHFAT32
|
||||||
|
ULONG b_offset; /* span between copies */
|
||||||
|
#else
|
||||||
|
UWORD b_offset; /* span between copies */
|
||||||
|
#endif
|
||||||
#if 0 /*TE*/
|
#if 0 /*TE*/
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
@ -74,8 +81,6 @@ struct buffer
|
|||||||
}
|
}
|
||||||
_b;
|
_b;
|
||||||
#endif
|
#endif
|
||||||
UBYTE b_offset_hi; /* DOS-C: span between copies (high) */
|
|
||||||
UBYTE b_unused;
|
|
||||||
BYTE b_buffer[BUFFERSIZE]; /* 512 byte sectors for now */
|
BYTE b_buffer[BUFFERSIZE]; /* 512 byte sectors for now */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
39
hdr/dcb.h
39
hdr/dcb.h
@ -36,6 +36,9 @@ static BYTE *clock_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.5 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.4 2001/04/15 03:21:50 bartoldeman
|
* Revision 1.4 2001/04/15 03:21:50 bartoldeman
|
||||||
* See history.txt for the list of fixes.
|
* See history.txt for the list of fixes.
|
||||||
*
|
*
|
||||||
@ -98,9 +101,18 @@ struct dpb
|
|||||||
UWORD dpb_fatstrt; /* FAT start sector */
|
UWORD dpb_fatstrt; /* FAT start sector */
|
||||||
UBYTE dpb_fats; /* # of FAT copies */
|
UBYTE dpb_fats; /* # of FAT copies */
|
||||||
UWORD dpb_dirents; /* # of dir entries */
|
UWORD dpb_dirents; /* # of dir entries */
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
UWORD dpb_wdata; /* start of data area */
|
||||||
|
UWORD dpb_wsize; /* # of clusters+1 on media */
|
||||||
|
UWORD dpb_wfatsize; /* # of sectors / FAT */
|
||||||
|
#else
|
||||||
UWORD dpb_data; /* start of data area */
|
UWORD dpb_data; /* start of data area */
|
||||||
UWORD dpb_size; /* # of clusters+1 on media */
|
UWORD dpb_size; /* # of clusters+1 on media */
|
||||||
UWORD dpb_fatsize; /* # of sectors / FAT */
|
UWORD dpb_fatsize; /* # of sectors / FAT */
|
||||||
|
#define dpb_wdata dpb_data
|
||||||
|
#define dpb_wsize dpb_size
|
||||||
|
#define dpb_wfatsize dpb_fatsize
|
||||||
|
#endif
|
||||||
UWORD dpb_dirstrt; /* start sec. of root dir */
|
UWORD dpb_dirstrt; /* start sec. of root dir */
|
||||||
struct dhdr FAR * /* pointer to device header */
|
struct dhdr FAR * /* pointer to device header */
|
||||||
dpb_device;
|
dpb_device;
|
||||||
@ -108,13 +120,36 @@ struct dpb
|
|||||||
BYTE dpb_flags; /* -1 = force MEDIA CHK */
|
BYTE dpb_flags; /* -1 = force MEDIA CHK */
|
||||||
struct dpb FAR * /* next dpb in chain */
|
struct dpb FAR * /* next dpb in chain */
|
||||||
dpb_next; /* -1 = end */
|
dpb_next; /* -1 = end */
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
UWORD dpb_wcluster; /* cluster # of first free */
|
||||||
|
/* -1 if not known */
|
||||||
|
ULONG dpb_nfreeclst; /* number of free clusters */
|
||||||
|
/* -1 if not known */
|
||||||
|
UWORD dpb_xflags; /* extended flags, see bpb */
|
||||||
|
UWORD dpb_xfsinfosec; /* FS info sector number, */
|
||||||
|
/* 0xFFFF if unknown */
|
||||||
|
UWORD dpb_xbackupsec; /* backup boot sector number */
|
||||||
|
/* 0xFFFF if unknown */
|
||||||
|
ULONG dpb_data;
|
||||||
|
ULONG dpb_size; /* # of clusters+1 on media */
|
||||||
|
ULONG dpb_fatsize; /* # of sectors / FAT */
|
||||||
|
ULONG dpb_xrootclst; /* starting cluster of root dir */
|
||||||
|
ULONG dpb_cluster; /* cluster # of first free */
|
||||||
|
/* -1 if not known */
|
||||||
|
#else
|
||||||
UWORD dpb_cluster; /* cluster # of first free */
|
UWORD dpb_cluster; /* cluster # of first free */
|
||||||
/* -1 if not known */
|
/* -1 if not known */
|
||||||
|
#define dpb_wcluster dpb_cluster
|
||||||
UWORD dpb_nfreeclst; /* number of free clusters */
|
UWORD dpb_nfreeclst; /* number of free clusters */
|
||||||
/* -1 if not known */
|
/* -1 if not known */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define UNKNCLUSTER 0x0000 /* see RBIL INT 21/AH=52 entry */
|
#define UNKNCLUSTER 0x0000 /* see RBIL INT 21/AH=52 entry */
|
||||||
#define UNKNCLSTFREE 0xffff /* 0xffff = unknown for DOS */
|
#ifdef WITHFAT32
|
||||||
|
#define UNKNCLSTFREE 0xffffffffl /* unknown for DOS */
|
||||||
|
#else
|
||||||
|
#define UNKNCLSTFREE 0xffff /* unknown for DOS */
|
||||||
|
#endif
|
||||||
|
#define UNKNCLSTFREE16 0xffff /* unknown for DOS */
|
||||||
|
|
||||||
|
61
hdr/device.h
61
hdr/device.h
@ -35,6 +35,9 @@ static BYTE *device_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.8 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.7 2001/07/22 01:58:58 bartoldeman
|
* Revision 1.7 2001/07/22 01:58:58 bartoldeman
|
||||||
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
|
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
|
||||||
*
|
*
|
||||||
@ -229,25 +232,10 @@ struct dhdr
|
|||||||
/* */
|
/* */
|
||||||
/* Bios Parameter Block structure */
|
/* Bios Parameter Block structure */
|
||||||
/* */
|
/* */
|
||||||
/* The following offsets are computed as byte offsets and are based on */
|
|
||||||
/* the struct below. The struct itself cannot be used because on some */
|
#define FAT_NO_MIRRORING 0x80
|
||||||
/* compilers, structure alignement may be forced, throwing following */
|
|
||||||
/* fields off (e.g. - BYTE, followed by a WORD may have a byte of fill */
|
#define BPB_SIZEOF 31 /* size of the standard BPB */
|
||||||
/* inserted in between; the WORD would then be at offset 2, not 1). */
|
|
||||||
/* */
|
|
||||||
#define BPB_NBYTE 0
|
|
||||||
#define BPB_NSECTOR 2
|
|
||||||
#define BPB_NRESERVED 3
|
|
||||||
#define BPB_NFAT 5
|
|
||||||
#define BPB_NDIRENT 6
|
|
||||||
#define BPB_NSIZE 8
|
|
||||||
#define BPB_MDESC 10
|
|
||||||
#define BPB_NFSECT 11
|
|
||||||
#define BPB_NSECS 13
|
|
||||||
#define BPB_NHEADS 15
|
|
||||||
#define BPB_HIDDEN 17
|
|
||||||
#define BPB_HUGE 21
|
|
||||||
#define BPB_SIZEOF 25
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@ -264,6 +252,20 @@ typedef struct
|
|||||||
ULONG bpb_hidden; /* Hidden sectors */
|
ULONG bpb_hidden; /* Hidden sectors */
|
||||||
ULONG bpb_huge; /* Size in sectors if */
|
ULONG bpb_huge; /* Size in sectors if */
|
||||||
/* bpb_nsize == 0 */
|
/* bpb_nsize == 0 */
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
ULONG bpb_xnfsect; /* FAT size in sectors if */
|
||||||
|
/* bpb_nfsect == 0 */
|
||||||
|
UWORD bpb_xflags; /* extended flags */
|
||||||
|
/* bit 7: disable mirroring */
|
||||||
|
/* bits 6-4: reserved (0) */
|
||||||
|
/* bits 3-0: active FAT number */
|
||||||
|
UWORD bpb_xfsversion; /* filesystem version */
|
||||||
|
ULONG bpb_xrootclst; /* starting cluster of root dir */
|
||||||
|
UWORD bpb_xfsinfosec; /* FS info sector number, */
|
||||||
|
/* 0xFFFF if unknown */
|
||||||
|
UWORD bpb_xbackupsec; /* backup boot sector number */
|
||||||
|
/* 0xFFFF if unknown */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
bpb;
|
bpb;
|
||||||
|
|
||||||
@ -334,6 +336,18 @@ typedef struct ddtstruct
|
|||||||
BITS ddt_WriteVerifySupported:1;
|
BITS ddt_WriteVerifySupported:1;
|
||||||
} ddt;
|
} ddt;
|
||||||
|
|
||||||
|
/* description flag bits */
|
||||||
|
#define DF_FIXED 0x001
|
||||||
|
#define DF_CHANGELINE 0x002
|
||||||
|
#define DF_CURBPBLOCK 0x004
|
||||||
|
#define DF_SAMESIZE 0x008
|
||||||
|
#define DF_MULTLOG 0x010
|
||||||
|
#define DF_CURLOG 0x020
|
||||||
|
#define DF_DISKCHANGE 0x040
|
||||||
|
#define DF_DPCHANGED 0x080
|
||||||
|
#define DF_REFORMAT 0x100
|
||||||
|
#define DF_NOACCESS 0x200
|
||||||
|
|
||||||
/* typedef struct ddtstruct ddt;*/
|
/* typedef struct ddtstruct ddt;*/
|
||||||
|
|
||||||
struct gblkio
|
struct gblkio
|
||||||
@ -383,6 +397,15 @@ typedef struct
|
|||||||
}
|
}
|
||||||
boot;
|
boot;
|
||||||
|
|
||||||
|
/* File system information structure */
|
||||||
|
struct fsinfo
|
||||||
|
{
|
||||||
|
UDWORD fi_signature; /* must be 0x61417272 */
|
||||||
|
DWORD fi_nfreeclst; /* number of free clusters, -1 if unknown */
|
||||||
|
DWORD fi_cluster; /* most recently allocated cluster, -1 if unknown */
|
||||||
|
UBYTE fi_reserved[12];
|
||||||
|
};
|
||||||
|
|
||||||
typedef boot super; /* Alias for boot structure */
|
typedef boot super; /* Alias for boot structure */
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -36,6 +36,9 @@ static BYTE *dirmatch_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.6 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.5 2001/07/09 22:19:33 bartoldeman
|
* Revision 1.5 2001/07/09 22:19:33 bartoldeman
|
||||||
* LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
* LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
||||||
*
|
*
|
||||||
@ -100,7 +103,12 @@ typedef struct
|
|||||||
BYTE dm_name_pat[FNAME_SIZE + FEXT_SIZE];
|
BYTE dm_name_pat[FNAME_SIZE + FEXT_SIZE];
|
||||||
BYTE dm_attr_srch;
|
BYTE dm_attr_srch;
|
||||||
UWORD dm_entry;
|
UWORD dm_entry;
|
||||||
UWORD dm_cluster;
|
#ifdef WITHFAT32
|
||||||
|
ULONG dm_dircluster;
|
||||||
|
#else
|
||||||
|
UWORD dm_dircluster;
|
||||||
|
UWORD reserved;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@ -119,8 +127,6 @@ typedef struct
|
|||||||
}
|
}
|
||||||
dm_flags; /* file flags */
|
dm_flags; /* file flags */
|
||||||
|
|
||||||
UWORD dm_dirstart;
|
|
||||||
|
|
||||||
BYTE dm_attr_fnd; /* found file attribute */
|
BYTE dm_attr_fnd; /* found file attribute */
|
||||||
time dm_time; /* file time */
|
time dm_time; /* file time */
|
||||||
date dm_date; /* file date */
|
date dm_date; /* file date */
|
||||||
|
@ -36,6 +36,9 @@ static BYTE *error_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.6 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.5 2001/04/16 01:45:26 bartoldeman
|
* Revision 1.5 2001/04/16 01:45:26 bartoldeman
|
||||||
* Fixed handles, config.sys drivers, warnings. Enabled INT21/AH=6C, printf %S/%Fs
|
* Fixed handles, config.sys drivers, warnings. Enabled INT21/AH=6C, printf %S/%Fs
|
||||||
*
|
*
|
||||||
@ -107,16 +110,19 @@ static BYTE *error_hRcsId = "$Id$";
|
|||||||
#define DE_INVLDENV -10 /* Invalid enviornement */
|
#define DE_INVLDENV -10 /* Invalid enviornement */
|
||||||
#define DE_INVLDFMT -11 /* Invalid format */
|
#define DE_INVLDFMT -11 /* Invalid format */
|
||||||
#define DE_INVLDACC -12 /* Invalid access */
|
#define DE_INVLDACC -12 /* Invalid access */
|
||||||
#define DE_INVLDDATA -13 /* Inavalid data */
|
#define DE_INVLDDATA -13 /* Invalid data */
|
||||||
#define DE_INVLDDRV -15 /* Invalid drive */
|
#define DE_INVLDDRV -15 /* Invalid drive */
|
||||||
#define DE_RMVCUDIR -16 /* Attempt remove current dir */
|
#define DE_RMVCUDIR -16 /* Attempt remove current dir */
|
||||||
#define DE_DEVICE -17 /* Not same device */
|
#define DE_DEVICE -17 /* Not same device */
|
||||||
#define DE_NFILES -18 /* No more files */
|
#define DE_NFILES -18 /* No more files */
|
||||||
#define DE_WRTPRTCT -19 /* No more files */
|
#define DE_WRTPRTCT -19 /* No more files */
|
||||||
#define DE_BLKINVLD -20 /* invalid block */
|
#define DE_BLKINVLD -20 /* invalid block */
|
||||||
|
#define DE_INVLDBUF -24 /* invalid buffer size, ext fnc */
|
||||||
#define DE_SEEK -25 /* error on file seek */
|
#define DE_SEEK -25 /* error on file seek */
|
||||||
#define DE_HNDLDSKFULL -28 /* handle disk full (?) */
|
#define DE_HNDLDSKFULL -28 /* handle disk full (?) */
|
||||||
|
|
||||||
|
#define DE_INVLDPARM -0x57 /* invalid parameter */
|
||||||
|
|
||||||
#define DE_DEADLOCK -36
|
#define DE_DEADLOCK -36
|
||||||
#define DE_LOCK -39
|
#define DE_LOCK -39
|
||||||
|
|
||||||
|
36
hdr/fat.h
36
hdr/fat.h
@ -36,6 +36,9 @@ static BYTE *fat_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.8 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.7 2001/07/09 22:19:33 bartoldeman
|
* Revision 1.7 2001/07/09 22:19:33 bartoldeman
|
||||||
* LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
* LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
||||||
*
|
*
|
||||||
@ -104,6 +107,8 @@ static BYTE *fat_hRcsId = "$Id$";
|
|||||||
/* /// Added D_DEVICE bit. - Ron Cemer */
|
/* /// Added D_DEVICE bit. - Ron Cemer */
|
||||||
#define D_DEVICE 0x40 /* device bit */
|
#define D_DEVICE 0x40 /* device bit */
|
||||||
|
|
||||||
|
#define D_LFN (D_RDONLY | D_HIDDEN | D_SYSTEM | D_VOLID)
|
||||||
|
|
||||||
/* FAT file name constants */
|
/* FAT file name constants */
|
||||||
#define FNAME_SIZE 8
|
#define FNAME_SIZE 8
|
||||||
#define FEXT_SIZE 3
|
#define FEXT_SIZE 3
|
||||||
@ -122,11 +127,15 @@ static BYTE *fat_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/* Test for 16 bit or 12 bit FAT */
|
/* Test for 16 bit or 12 bit FAT */
|
||||||
#define SIZEOF_CLST16 2
|
#define SIZEOF_CLST16 2
|
||||||
|
#define SIZEOF_CLST32 4
|
||||||
#define FAT_MAGIC 4086
|
#define FAT_MAGIC 4086
|
||||||
#define FAT_MAGIC16 ((unsigned)65526l)
|
#define FAT_MAGIC16 ((unsigned)65526l)
|
||||||
#define FAT_MAGIC32 268435456l
|
#define FAT_MAGIC32 268435456l
|
||||||
|
|
||||||
#define ISFAT32(dpbp) (((dpbp)->dpb_size)>FAT_MAGIC16 && ((dpbp)->dpb_size)<=FAT_MAGIC32 )
|
/* int ISFAT32(struct dpb FAR *dpbp);*/
|
||||||
|
#define ISFAT32(x) _ISFAT32(x)
|
||||||
|
|
||||||
|
#define _ISFAT32(dpbp) (((dpbp)->dpb_size)>FAT_MAGIC16 && ((dpbp)->dpb_size)<=FAT_MAGIC32 )
|
||||||
#define ISFAT16(dpbp) (((dpbp)->dpb_size)>FAT_MAGIC && ((dpbp)->dpb_size)<=FAT_MAGIC16 )
|
#define ISFAT16(dpbp) (((dpbp)->dpb_size)>FAT_MAGIC && ((dpbp)->dpb_size)<=FAT_MAGIC16 )
|
||||||
#define ISFAT12(dpbp) (((dpbp)->dpb_size)<=FAT_MAGIC)
|
#define ISFAT12(dpbp) (((dpbp)->dpb_size)<=FAT_MAGIC)
|
||||||
|
|
||||||
@ -136,7 +145,12 @@ struct dirent
|
|||||||
UBYTE dir_name[FNAME_SIZE]; /* Filename */
|
UBYTE dir_name[FNAME_SIZE]; /* Filename */
|
||||||
UBYTE dir_ext[FEXT_SIZE]; /* Filename extension */
|
UBYTE dir_ext[FEXT_SIZE]; /* Filename extension */
|
||||||
UBYTE dir_attrib; /* File Attribute */
|
UBYTE dir_attrib; /* File Attribute */
|
||||||
BYTE dir_reserved[10]; /* reserved */
|
UBYTE dir_case; /* File case */
|
||||||
|
UBYTE dir_crtimems; /* Milliseconds */
|
||||||
|
UWORD dir_crtime; /* Creation time */
|
||||||
|
UWORD dir_crdate; /* Creation date */
|
||||||
|
UWORD dir_accdate; /* Last access date */
|
||||||
|
UWORD dir_start_high; /* High word of the cluster */
|
||||||
time dir_time; /* Time file created/updated */
|
time dir_time; /* Time file created/updated */
|
||||||
date dir_date; /* Date file created/updated */
|
date dir_date; /* Date file created/updated */
|
||||||
UWORD dir_start; /* Starting cluster */
|
UWORD dir_start; /* Starting cluster */
|
||||||
@ -148,6 +162,24 @@ struct dirent
|
|||||||
/* filesystem sizeof(dirent) - may be different from core */
|
/* filesystem sizeof(dirent) - may be different from core */
|
||||||
/* */
|
/* */
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
#define getdstart(dentry) \
|
||||||
|
(((ULONG)dentry.dir_start_high << 16) | dentry.dir_start)
|
||||||
|
#define setdstart(dentry, value) \
|
||||||
|
dentry.dir_start = (UCOUNT)value; \
|
||||||
|
dentry.dir_start_high = (UCOUNT)(value >> 16)
|
||||||
|
#define checkdstart(dentry, value) \
|
||||||
|
(dentry.dir_start == (UCOUNT)value && \
|
||||||
|
dentry.dir_start_high == (UCOUNT)(value >> 16))
|
||||||
|
#else
|
||||||
|
#define getdstart(dentry) \
|
||||||
|
dentry.dir_start
|
||||||
|
#define setdstart(dentry, value) \
|
||||||
|
dentry.dir_start = (UCOUNT)value
|
||||||
|
#define checkdstart(dentry, value) \
|
||||||
|
(dentry.dir_start == (UCOUNT)value)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DIR_NAME 0
|
#define DIR_NAME 0
|
||||||
#define DIR_EXT FNAME_SIZE
|
#define DIR_EXT FNAME_SIZE
|
||||||
#define DIR_ATTRIB FNAME_SIZE+FEXT_SIZE
|
#define DIR_ATTRIB FNAME_SIZE+FEXT_SIZE
|
||||||
|
24
hdr/fnode.h
24
hdr/fnode.h
@ -36,6 +36,9 @@ static BYTE *fnode_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.9 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.8 2001/08/19 12:58:34 bartoldeman
|
* Revision 1.8 2001/08/19 12:58:34 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -122,18 +125,33 @@ struct f_node
|
|||||||
struct dirent f_dir; /* this file's dir entry image */
|
struct dirent f_dir; /* this file's dir entry image */
|
||||||
|
|
||||||
ULONG f_diroff; /* offset of the dir entry */
|
ULONG f_diroff; /* offset of the dir entry */
|
||||||
UWORD f_dirstart; /* the starting cluster of dir */
|
CLUSTER f_dirstart; /* the starting cluster of dir */
|
||||||
/* when dir is not root */
|
/* when dir is not root */
|
||||||
struct dpb FAR *f_dpb; /* the block device for file */
|
struct dpb FAR *f_dpb; /* the block device for file */
|
||||||
|
|
||||||
ULONG f_dsize; /* file size (for directories) */
|
ULONG f_dsize; /* file size (for directories) */
|
||||||
ULONG f_offset; /* byte offset for next op */
|
ULONG f_offset; /* byte offset for next op */
|
||||||
ULONG f_highwater; /* the largest offset ever */
|
ULONG f_highwater; /* the largest offset ever */
|
||||||
UWORD f_back; /* the cluster we were at */
|
CLUSTER f_back; /* the cluster we were at */
|
||||||
ULONG f_cluster_offset; /* byte offset that the next 3 point to */
|
ULONG f_cluster_offset; /* byte offset that the next 3 point to */
|
||||||
UWORD f_cluster; /* the cluster we are at */
|
CLUSTER f_cluster; /* the cluster we are at */
|
||||||
UWORD f_sector; /* the sector in the cluster */
|
UWORD f_sector; /* the sector in the cluster */
|
||||||
UWORD f_boff; /* the byte in the cluster */
|
UWORD f_boff; /* the byte in the cluster */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
struct lfn_inode
|
||||||
|
{
|
||||||
|
UNICODE name[255];
|
||||||
|
|
||||||
|
struct dirent l_dir; /* this file's dir entry image */
|
||||||
|
|
||||||
|
ULONG l_diroff; /* offset of the dir entry */
|
||||||
|
CLUSTER l_dirstart; /* the starting cluster of dir */
|
||||||
|
/* when dir is not root */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct lfn_inode FAR * lfn_inode_ptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct f_node * f_node_ptr;
|
typedef struct f_node * f_node_ptr;
|
||||||
|
@ -57,6 +57,9 @@ static BYTE *pcb_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.6 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.5 2001/04/15 03:21:50 bartoldeman
|
* Revision 1.5 2001/04/15 03:21:50 bartoldeman
|
||||||
* See history.txt for the list of fixes.
|
* See history.txt for the list of fixes.
|
||||||
*
|
*
|
||||||
@ -239,7 +242,7 @@ pcb;
|
|||||||
* On return, all processor registers are stored into *pr (including
|
* On return, all processor registers are stored into *pr (including
|
||||||
* flags).
|
* flags).
|
||||||
*/
|
*/
|
||||||
void intr(int intnr, iregs * const pr);
|
void ASMCFUNC intr(int intnr, iregs * const pr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
66
hdr/portab.h
66
hdr/portab.h
@ -36,6 +36,9 @@ static char *portab_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.10 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.9 2001/06/03 14:16:17 bartoldeman
|
* Revision 1.9 2001/06/03 14:16:17 bartoldeman
|
||||||
* BUFFERS tuning and misc bug fixes/cleanups (2024c).
|
* BUFFERS tuning and misc bug fixes/cleanups (2024c).
|
||||||
*
|
*
|
||||||
@ -119,6 +122,49 @@ static char *portab_hRcsId = "$Id$";
|
|||||||
/* */
|
/* */
|
||||||
/****************************************************************/
|
/****************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/* commandline overflow - removing -DI86 TE*/
|
||||||
|
#if defined(__TURBOC__)
|
||||||
|
|
||||||
|
#define I86
|
||||||
|
#define CDECL cdecl
|
||||||
|
void __int__(int);
|
||||||
|
|
||||||
|
#elif defined (_MSC_VER)
|
||||||
|
|
||||||
|
#define I86
|
||||||
|
#define CDECL _cdecl
|
||||||
|
#define __int__(intno) asm int intno;
|
||||||
|
|
||||||
|
#if defined(M_I286) /* /G3 doesn't set M_I386, but sets M_I286 TE*/
|
||||||
|
#define I386
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__) /* don't know a better way */
|
||||||
|
|
||||||
|
#define I86
|
||||||
|
#define __int__(intno) asm int intno;
|
||||||
|
#define asm __asm
|
||||||
|
#define far __far
|
||||||
|
#define CDECL __cdecl
|
||||||
|
|
||||||
|
#if _M_IX86 >= 300
|
||||||
|
#define I386
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined (_MYMC68K_COMILER_)
|
||||||
|
|
||||||
|
#define MC68K
|
||||||
|
|
||||||
|
#else
|
||||||
|
anyone knows a _portable_ way to create nice errors??
|
||||||
|
at least this causes the compiler not to compile :-)
|
||||||
|
#endif
|
||||||
|
/* functions, that are shared between C and ASM _must_
|
||||||
|
have a certain calling standard. These are declared
|
||||||
|
as 'ASMCFUNC', and is (and will be ?-) cdecl */
|
||||||
|
#define ASMCFUNC cdecl
|
||||||
|
|
||||||
#ifdef MC68K
|
#ifdef MC68K
|
||||||
|
|
||||||
#define far /* No far type */
|
#define far /* No far type */
|
||||||
@ -198,6 +244,13 @@ typedef int COUNT;
|
|||||||
typedef unsigned int UCOUNT;
|
typedef unsigned int UCOUNT;
|
||||||
typedef unsigned long ULONG;
|
typedef unsigned long ULONG;
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
typedef unsigned long CLUSTER;
|
||||||
|
#else
|
||||||
|
typedef unsigned short CLUSTER;
|
||||||
|
#endif
|
||||||
|
typedef unsigned short UNICODE;
|
||||||
|
|
||||||
#define STATIC /* local calls inside module */
|
#define STATIC /* local calls inside module */
|
||||||
|
|
||||||
|
|
||||||
@ -240,18 +293,7 @@ typedef signed long LONG;
|
|||||||
#define UNREFERENCED_PARAMETER(x) x;
|
#define UNREFERENCED_PARAMETER(x) x;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef I86 /* commandline overflow - removing /DPROTO TE*/
|
||||||
#if defined(__TURBOC__)
|
|
||||||
#define FDCALL pascal
|
|
||||||
#define CDECL cdecl
|
|
||||||
#else
|
|
||||||
#define FDCALL
|
|
||||||
#define CDECL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef I86
|
|
||||||
/* commandline overflow - removing /DPROTO
|
|
||||||
TE*/
|
|
||||||
#define PROTO
|
#define PROTO
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -36,6 +36,9 @@ static BYTE *process_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.5 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.4 2000/08/06 04:18:21 jimtabor
|
* Revision 1.4 2000/08/06 04:18:21 jimtabor
|
||||||
* See history.txt
|
* See history.txt
|
||||||
*
|
*
|
||||||
@ -128,7 +131,7 @@ typedef struct
|
|||||||
BYTE ps_fill1; /* single char fill */
|
BYTE ps_fill1; /* single char fill */
|
||||||
|
|
||||||
/* CP/M-like entry point */
|
/* CP/M-like entry point */
|
||||||
BYTE ps_farcall; /* far call opcode */
|
UBYTE ps_farcall; /* far call opcode */
|
||||||
VOID(FAR * ps_reentry) (); /* re-entry point */
|
VOID(FAR * ps_reentry) (); /* re-entry point */
|
||||||
VOID(interrupt FAR * ps_isv22) (), /* terminate address */
|
VOID(interrupt FAR * ps_isv22) (), /* terminate address */
|
||||||
(interrupt FAR * ps_isv23) (), /* break address */
|
(interrupt FAR * ps_isv23) (), /* break address */
|
||||||
@ -142,7 +145,7 @@ typedef struct
|
|||||||
VOID FAR *ps_prevpsp; /* previous psp pointer */
|
VOID FAR *ps_prevpsp; /* previous psp pointer */
|
||||||
BYTE FAR *ps_dta; /* process dta address */
|
BYTE FAR *ps_dta; /* process dta address */
|
||||||
BYTE ps_fill2[16];
|
BYTE ps_fill2[16];
|
||||||
BYTE ps_unix[3]; /* unix style call - 0xcd 0x21 0xcb */
|
UBYTE ps_unix[3]; /* unix style call - 0xcd 0x21 0xcb */
|
||||||
BYTE ps_fill3[9];
|
BYTE ps_fill3[9];
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
|
@ -42,6 +42,8 @@ static BYTE *date_hRcsId = "$Id$";
|
|||||||
|
|
||||||
#define REVISION_MAJOR 1
|
#define REVISION_MAJOR 1
|
||||||
#define REVISION_MINOR 1
|
#define REVISION_MINOR 1
|
||||||
#define REVISION_SEQ 24
|
#define REVISION_SEQ 25
|
||||||
#define BUILD 2024
|
#define BUILD "2025"
|
||||||
#define SUB_BUILD "h"
|
#define SUB_BUILD "test"
|
||||||
|
#define KERNEL_VERSION_STRING "1.1.25" /*#REVISION_MAJOR "." #REVISION_MINOR "." #REVISION_SEQ*/
|
||||||
|
#define KERNEL_BUILD_STRING "2025test" /*#BUILD SUB_BUILD*/
|
||||||
|
@ -34,6 +34,9 @@
|
|||||||
; $Id$
|
; $Id$
|
||||||
;
|
;
|
||||||
; $Log$
|
; $Log$
|
||||||
|
; Revision 1.6 2001/09/23 20:39:44 bartoldeman
|
||||||
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
;
|
||||||
; Revision 1.5 2001/04/15 03:21:50 bartoldeman
|
; Revision 1.5 2001/04/15 03:21:50 bartoldeman
|
||||||
; See history.txt for the list of fixes.
|
; See history.txt for the list of fixes.
|
||||||
;
|
;
|
||||||
@ -423,7 +426,7 @@ _fstrncmp:
|
|||||||
|
|
||||||
; and the destination pointer, d
|
; and the destination pointer, d
|
||||||
les di,[bp+8]
|
les di,[bp+8]
|
||||||
mov cx,[bp+10]
|
mov cx,[bp+12]
|
||||||
|
|
||||||
jmp short dostrncmp
|
jmp short dostrncmp
|
||||||
|
|
||||||
|
@ -37,6 +37,9 @@ static BYTE *blockioRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.13 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.12 2001/07/22 01:58:58 bartoldeman
|
* Revision 1.12 2001/07/22 01:58:58 bartoldeman
|
||||||
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
|
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
|
||||||
*
|
*
|
||||||
@ -194,15 +197,13 @@ VOID FAR reloc_call_init_buffers(void)
|
|||||||
pbuffer->b_flag = 0;
|
pbuffer->b_flag = 0;
|
||||||
pbuffer->b_blkno = 0;
|
pbuffer->b_blkno = 0;
|
||||||
pbuffer->b_copies = 0;
|
pbuffer->b_copies = 0;
|
||||||
pbuffer->b_offset_lo = 0;
|
pbuffer->b_offset = 0;
|
||||||
pbuffer->b_offset_hi = 0;
|
|
||||||
if (i < (Config.cfgBuffers - 1))
|
if (i < (Config.cfgBuffers - 1))
|
||||||
pbuffer->b_next = pbuffer + 1;
|
pbuffer->b_next = pbuffer + 1;
|
||||||
else
|
else
|
||||||
pbuffer->b_next = NULL;
|
pbuffer->b_next = NULL;
|
||||||
}
|
}
|
||||||
firstbuf = &buffers[0];
|
firstbuf = &buffers[0];
|
||||||
lastbuf = &buffers[Config.cfgBuffers - 1];
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
/* Extract the block number from a buffer structure. */
|
/* Extract the block number from a buffer structure. */
|
||||||
@ -496,12 +497,11 @@ BOOL flush1(struct buffer FAR * bp)
|
|||||||
if (bp->b_flag & BFR_FAT)
|
if (bp->b_flag & BFR_FAT)
|
||||||
{
|
{
|
||||||
int i = bp->b_copies;
|
int i = bp->b_copies;
|
||||||
LONG blkno = getblkno(bp);
|
ULONG blkno = getblkno(bp);
|
||||||
UWORD offset = ((UWORD) bp->b_offset_hi << 8) | bp->b_offset_lo;
|
|
||||||
|
|
||||||
while (--i > 0)
|
while (--i > 0)
|
||||||
{
|
{
|
||||||
blkno += offset;
|
blkno += bp->b_offset;
|
||||||
result = dskxfer(bp->b_unit, blkno,
|
result = dskxfer(bp->b_unit, blkno,
|
||||||
(VOID FAR *) bp->b_buffer, 1, DSKWRITE); /* BER 9/4/00 */
|
(VOID FAR *) bp->b_buffer, 1, DSKWRITE); /* BER 9/4/00 */
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
|
|
||||||
extern void spawn_int23(void);
|
extern void ASMCFUNC spawn_int23(void);
|
||||||
|
|
||||||
#ifdef VERSION_STRINGS
|
#ifdef VERSION_STRINGS
|
||||||
static BYTE *RcsId = "$Id$";
|
static BYTE *RcsId = "$Id$";
|
||||||
@ -38,6 +38,9 @@ static BYTE *RcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.7 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.6 2001/08/19 12:58:36 bartoldeman
|
* Revision 1.6 2001/08/19 12:58:36 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
|
@ -36,6 +36,9 @@ static BYTE *charioRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.13 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.12 2001/08/20 20:32:15 bartoldeman
|
* Revision 1.12 2001/08/20 20:32:15 bartoldeman
|
||||||
* Truename, get free space and ctrl-break fixes.
|
* Truename, get free space and ctrl-break fixes.
|
||||||
*
|
*
|
||||||
@ -150,10 +153,6 @@ static VOID kbfill();
|
|||||||
struct dhdr FAR *finddev();
|
struct dhdr FAR *finddev();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __TURBOC__
|
|
||||||
void __int__(int); /* TC 2.01 requires this. :( -- ror4 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Return a pointer to the first driver in the chain that
|
/* Return a pointer to the first driver in the chain that
|
||||||
* matches the attributes.
|
* matches the attributes.
|
||||||
* not necessary because we have the syscon pointer.
|
* not necessary because we have the syscon pointer.
|
||||||
@ -177,8 +176,15 @@ struct dhdr FAR *finddev(UWORD attr_mask)
|
|||||||
VOID _cso(COUNT c)
|
VOID _cso(COUNT c)
|
||||||
{
|
{
|
||||||
if (syscon->dh_attr & ATTR_FASTCON) {
|
if (syscon->dh_attr & ATTR_FASTCON) {
|
||||||
|
#if defined(__TURBOC__)
|
||||||
_AL = c;
|
_AL = c;
|
||||||
__int__(0x29);
|
__int__(0x29);
|
||||||
|
#else
|
||||||
|
asm {
|
||||||
|
mov al, byte ptr c;
|
||||||
|
int 0x29;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CharReqHdr.r_length = sizeof(request);
|
CharReqHdr.r_length = sizeof(request);
|
||||||
|
170
kernel/config.c
170
kernel/config.c
@ -29,10 +29,10 @@
|
|||||||
|
|
||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
#include "init-mod.h"
|
#include "init-mod.h"
|
||||||
|
#include "init-dat.h"
|
||||||
#include "dyndata.h"
|
#include "dyndata.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
These are the far variables from the DOS data segment that we need here. The
|
These are the far variables from the DOS data segment that we need here. The
|
||||||
init procedure uses a different default DS data segment, which is discarded
|
init procedure uses a different default DS data segment, which is discarded
|
||||||
@ -41,42 +41,41 @@
|
|||||||
|
|
||||||
-- Bart
|
-- Bart
|
||||||
*/
|
*/
|
||||||
extern struct buffer FAR * FAR lastbuf;/* tail of ditto */
|
extern f_node_ptr DOSFAR f_nodes; /* pointer to the array */
|
||||||
extern f_node_ptr FAR f_nodes; /* pointer to the array */
|
extern UWORD DOSFAR f_nodes_cnt, /* number of allocated f_nodes */
|
||||||
extern UWORD FAR f_nodes_cnt, /* number of allocated f_nodes */
|
DOSFAR first_mcb; /* Start of user memory */
|
||||||
FAR first_mcb; /* Start of user memory */
|
|
||||||
|
|
||||||
extern UBYTE FAR lastdrive, FAR nblkdev, FAR mem_access_mode,
|
extern UBYTE DOSFAR lastdrive, DOSFAR nblkdev, DOSFAR mem_access_mode,
|
||||||
FAR uppermem_link;
|
DOSFAR uppermem_link;
|
||||||
extern struct dhdr
|
extern struct dhdr
|
||||||
FAR blk_dev, /* Block device (Disk) driver */
|
DOSTEXTFAR blk_dev, /* Block device (Disk) driver */
|
||||||
FAR nul_dev;
|
DOSFAR nul_dev;
|
||||||
extern struct buffer FAR * FAR firstbuf; /* head of buffers linked list */
|
extern struct buffer FAR * DOSFAR firstbuf; /* head of buffers linked list */
|
||||||
|
|
||||||
extern struct dpb FAR * FAR DPBp;
|
extern struct dpb FAR * DOSFAR DPBp;
|
||||||
/* First drive Parameter Block */
|
/* First drive Parameter Block */
|
||||||
extern cdstbl FAR * FAR CDSp;
|
extern cdstbl FAR * DOSFAR CDSp;
|
||||||
/* Current Directory Structure */
|
/* Current Directory Structure */
|
||||||
extern sfttbl FAR * FAR sfthead;
|
extern sfttbl FAR * DOSFAR sfthead;
|
||||||
/* System File Table head */
|
/* System File Table head */
|
||||||
extern sfttbl FAR * FAR FCBp;
|
extern sfttbl FAR * DOSFAR FCBp;
|
||||||
|
|
||||||
extern BYTE FAR VgaSet,
|
extern BYTE DOSFAR VgaSet,
|
||||||
FAR _HMATextAvailable, /* first byte of available CODE area */
|
DOSFAR _HMATextAvailable, /* first byte of available CODE area */
|
||||||
FAR _HMATextStart[], /* first byte of HMAable CODE area */
|
FAR _HMATextStart[], /* first byte of HMAable CODE area */
|
||||||
FAR _HMATextEnd[],
|
FAR _HMATextEnd[],
|
||||||
FAR break_ena, /* break enabled flag */
|
DOSFAR break_ena, /* break enabled flag */
|
||||||
FAR os_major, /* major version number */
|
DOSFAR os_major, /* major version number */
|
||||||
FAR os_minor, /* minor version number */
|
DOSFAR os_minor, /* minor version number */
|
||||||
FAR switchar,
|
DOSFAR switchar,
|
||||||
FAR _InitTextStart, /* first available byte of ram */
|
DOSFAR _InitTextStart, /* first available byte of ram */
|
||||||
FAR ReturnAnyDosVersionExpected;
|
DOSFAR ReturnAnyDosVersionExpected;
|
||||||
|
|
||||||
extern UWORD FAR ram_top, /* How much ram in Kbytes */
|
extern UWORD DOSFAR ram_top, /* How much ram in Kbytes */
|
||||||
FAR UMB_top,
|
DOSFAR UMB_top,
|
||||||
FAR umb_start,
|
DOSFAR umb_start,
|
||||||
FAR uppermem_root,
|
DOSFAR uppermem_root,
|
||||||
FAR LoL_nbuffers;
|
DOSFAR LoL_nbuffers;
|
||||||
|
|
||||||
#ifdef VERSION_STRINGS
|
#ifdef VERSION_STRINGS
|
||||||
static BYTE *RcsId = "$Id$";
|
static BYTE *RcsId = "$Id$";
|
||||||
@ -90,6 +89,9 @@ static BYTE *RcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.28 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.27 2001/08/19 12:58:36 bartoldeman
|
* Revision 1.27 2001/08/19 12:58:36 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -276,16 +278,20 @@ struct config Config
|
|||||||
,0 /* strategy for command.com is low by default */
|
,0 /* strategy for command.com is low by default */
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
/* MSC places uninitialized data into COMDEF records,
|
||||||
BYTE FAR *lpBase;
|
that end up in DATA segment. this can't be tolerated
|
||||||
BYTE FAR *upBase;
|
in INIT code.
|
||||||
BYTE FAR *lpTop;
|
please make sure, that ALL data in INIT is initialized !!
|
||||||
BYTE FAR *lpOldTop;
|
*/
|
||||||
static COUNT nCfgLine;
|
BYTE FAR *lpBase = 0;
|
||||||
static COUNT nPass;
|
BYTE FAR *upBase = 0;
|
||||||
COUNT UmbState;
|
BYTE FAR *lpTop = 0;
|
||||||
static BYTE szLine[256];
|
BYTE FAR *lpOldTop = 0;
|
||||||
static BYTE szBuf[256];
|
STATIC COUNT nCfgLine = 0;
|
||||||
|
STATIC COUNT nPass = 0;
|
||||||
|
COUNT UmbState = 0;
|
||||||
|
STATIC BYTE szLine[256] = {0};
|
||||||
|
STATIC BYTE szBuf[256] = {0};
|
||||||
|
|
||||||
int singleStep = FALSE;
|
int singleStep = FALSE;
|
||||||
int SkipAllConfig = FALSE;
|
int SkipAllConfig = FALSE;
|
||||||
@ -296,18 +302,18 @@ INIT VOID mumcb_init(UCOUNT seg, UWORD size);
|
|||||||
INIT VOID Config_Buffers(BYTE * pLine);
|
INIT VOID Config_Buffers(BYTE * pLine);
|
||||||
INIT VOID sysScreenMode(BYTE * pLine);
|
INIT VOID sysScreenMode(BYTE * pLine);
|
||||||
INIT VOID sysVersion(BYTE * pLine);
|
INIT VOID sysVersion(BYTE * pLine);
|
||||||
INIT VOID Break(BYTE * pLine);
|
INIT VOID CfgBreak(BYTE * pLine);
|
||||||
INIT VOID Device(BYTE * pLine);
|
INIT VOID Device(BYTE * pLine);
|
||||||
INIT VOID DeviceHigh(BYTE * pLine);
|
INIT VOID DeviceHigh(BYTE * pLine);
|
||||||
INIT VOID Files(BYTE * pLine);
|
INIT VOID Files(BYTE * pLine);
|
||||||
INIT VOID Fcbs(BYTE * pLine);
|
INIT VOID Fcbs(BYTE * pLine);
|
||||||
INIT VOID Lastdrive(BYTE * pLine);
|
INIT VOID CfgLastdrive(BYTE * pLine);
|
||||||
INIT BOOL LoadDevice(BYTE * pLine, COUNT top, COUNT mode);
|
INIT BOOL LoadDevice(BYTE * pLine, COUNT top, COUNT mode);
|
||||||
INIT VOID Dosmem(BYTE * pLine);
|
INIT VOID Dosmem(BYTE * pLine);
|
||||||
INIT VOID Country(BYTE * pLine);
|
INIT VOID Country(BYTE * pLine);
|
||||||
INIT VOID InitPgm(BYTE * pLine);
|
INIT VOID InitPgm(BYTE * pLine);
|
||||||
INIT VOID InitPgmHigh(BYTE * pLine);
|
INIT VOID InitPgmHigh(BYTE * pLine);
|
||||||
INIT VOID Switchar(BYTE * pLine);
|
INIT VOID CfgSwitchar(BYTE * pLine);
|
||||||
INIT VOID CfgFailure(BYTE * pLine);
|
INIT VOID CfgFailure(BYTE * pLine);
|
||||||
INIT VOID Stacks(BYTE * pLine);
|
INIT VOID Stacks(BYTE * pLine);
|
||||||
INIT VOID SetAnyDos(BYTE * pLine);
|
INIT VOID SetAnyDos(BYTE * pLine);
|
||||||
@ -323,7 +329,7 @@ INIT COUNT strcasecmp(REG BYTE *d, REG BYTE *s);
|
|||||||
extern void HMAconfig(int finalize);
|
extern void HMAconfig(int finalize);
|
||||||
VOID config_init_buffers(COUNT anzBuffers); /* from BLOCKIO.C */
|
VOID config_init_buffers(COUNT anzBuffers); /* from BLOCKIO.C */
|
||||||
|
|
||||||
INIT static VOID FAR *AlignParagraph(VOID FAR * lpPtr);
|
INIT STATIC VOID FAR *AlignParagraph(VOID FAR * lpPtr);
|
||||||
#ifndef I86
|
#ifndef I86
|
||||||
#define AlignParagraph(x) (x)
|
#define AlignParagraph(x) (x)
|
||||||
#endif
|
#endif
|
||||||
@ -339,9 +345,9 @@ struct table
|
|||||||
VOID(*func) (BYTE * pLine);
|
VOID(*func) (BYTE * pLine);
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct table commands[] =
|
STATIC struct table commands[] =
|
||||||
{
|
{
|
||||||
{"BREAK", 1, Break},
|
{"BREAK", 1, CfgBreak},
|
||||||
{"BUFFERS", 1, Config_Buffers},
|
{"BUFFERS", 1, Config_Buffers},
|
||||||
{"COMMAND", 1, InitPgm},
|
{"COMMAND", 1, InitPgm},
|
||||||
{"COUNTRY", 1, Country},
|
{"COUNTRY", 1, Country},
|
||||||
@ -350,14 +356,14 @@ static struct table commands[] =
|
|||||||
{"DOS", 1, Dosmem},
|
{"DOS", 1, Dosmem},
|
||||||
{"FCBS", 1, Fcbs},
|
{"FCBS", 1, Fcbs},
|
||||||
{"FILES", 1, Files},
|
{"FILES", 1, Files},
|
||||||
{"LASTDRIVE", 1, Lastdrive},
|
{"LASTDRIVE", 1, CfgLastdrive},
|
||||||
{"NUMLOCK", 1, Numlock},
|
{"NUMLOCK", 1, Numlock},
|
||||||
/* rem is never executed by locking out pass */
|
/* rem is never executed by locking out pass */
|
||||||
{"REM", 0, CfgFailure},
|
{"REM", 0, CfgFailure},
|
||||||
{"SHELL", 1, InitPgm},
|
{"SHELL", 1, InitPgm},
|
||||||
{"SHELLHIGH", 1, InitPgmHigh},
|
{"SHELLHIGH", 1, InitPgmHigh},
|
||||||
{"STACKS", 1, Stacks},
|
{"STACKS", 1, Stacks},
|
||||||
{"SWITCHAR", 1, Switchar},
|
{"SWITCHAR", 1, CfgSwitchar},
|
||||||
{"SCREEN", 1, sysScreenMode}, /* JPP */
|
{"SCREEN", 1, sysScreenMode}, /* JPP */
|
||||||
{"VERSION", 1, sysVersion}, /* JPP */
|
{"VERSION", 1, sysVersion}, /* JPP */
|
||||||
{"ANYDOS", 1, SetAnyDos}, /* JPP */
|
{"ANYDOS", 1, SetAnyDos}, /* JPP */
|
||||||
@ -370,9 +376,9 @@ INIT BYTE FAR *KernelAlloc(WORD nBytes);
|
|||||||
INIT BYTE FAR *KernelAllocDma(WORD);
|
INIT BYTE FAR *KernelAllocDma(WORD);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
BYTE *pLineStart;
|
BYTE *pLineStart = 0;
|
||||||
|
|
||||||
BYTE HMAState;
|
BYTE HMAState = 0;
|
||||||
#define HMA_NONE 0 /* do nothing */
|
#define HMA_NONE 0 /* do nothing */
|
||||||
#define HMA_REQ 1 /* DOS = HIGH detected */
|
#define HMA_REQ 1 /* DOS = HIGH detected */
|
||||||
#define HMA_DONE 2 /* Moved kernel to HMA */
|
#define HMA_DONE 2 /* Moved kernel to HMA */
|
||||||
@ -946,7 +952,7 @@ INIT void Config_Buffers(BYTE * pLine)
|
|||||||
Config.cfgBuffers = max(Config.cfgBuffers, nBuffers);
|
Config.cfgBuffers = max(Config.cfgBuffers, nBuffers);
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID sysScreenMode(BYTE * pLine)
|
INIT STATIC VOID sysScreenMode(BYTE * pLine)
|
||||||
{
|
{
|
||||||
COUNT nMode;
|
COUNT nMode;
|
||||||
|
|
||||||
@ -962,12 +968,20 @@ INIT static VOID sysScreenMode(BYTE * pLine)
|
|||||||
0x12 (18) 43/50 lines
|
0x12 (18) 43/50 lines
|
||||||
0x14 (20) 25 lines
|
0x14 (20) 25 lines
|
||||||
*/
|
*/
|
||||||
|
#if defined(__TURBOC__)
|
||||||
_AX = (0x11 << 8) + nMode;
|
_AX = (0x11 << 8) + nMode;
|
||||||
_BL = 0;
|
_BL = 0;
|
||||||
__int__(0x10);
|
__int__(0x10);
|
||||||
|
#else
|
||||||
|
asm {
|
||||||
|
mov al, byte ptr nMode;
|
||||||
|
mov ah, 0x11;
|
||||||
|
int 0x10;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID sysVersion(BYTE * pLine)
|
INIT STATIC VOID sysVersion(BYTE * pLine)
|
||||||
{
|
{
|
||||||
COUNT major,
|
COUNT major,
|
||||||
minor;
|
minor;
|
||||||
@ -994,7 +1008,7 @@ INIT static VOID sysVersion(BYTE * pLine)
|
|||||||
os_minor = minor;
|
os_minor = minor;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID Files(BYTE * pLine)
|
INIT STATIC VOID Files(BYTE * pLine)
|
||||||
{
|
{
|
||||||
COUNT nFiles;
|
COUNT nFiles;
|
||||||
|
|
||||||
@ -1006,7 +1020,7 @@ INIT static VOID Files(BYTE * pLine)
|
|||||||
Config.cfgFiles = max(Config.cfgFiles, nFiles);
|
Config.cfgFiles = max(Config.cfgFiles, nFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID Lastdrive(BYTE * pLine)
|
INIT STATIC VOID CfgLastdrive(BYTE * pLine)
|
||||||
{
|
{
|
||||||
/* Format: LASTDRIVE = letter */
|
/* Format: LASTDRIVE = letter */
|
||||||
BYTE drv;
|
BYTE drv;
|
||||||
@ -1067,7 +1081,7 @@ INIT STATIC VOID Dosmem(BYTE * pLine)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID Switchar(BYTE * pLine)
|
INIT STATIC VOID CfgSwitchar(BYTE * pLine)
|
||||||
{
|
{
|
||||||
/* Format: SWITCHAR = character */
|
/* Format: SWITCHAR = character */
|
||||||
|
|
||||||
@ -1075,7 +1089,7 @@ INIT static VOID Switchar(BYTE * pLine)
|
|||||||
switchar = *szBuf;
|
switchar = *szBuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID Fcbs(BYTE * pLine)
|
INIT STATIC VOID Fcbs(BYTE * pLine)
|
||||||
{
|
{
|
||||||
/* Format: FCBS = totalFcbs [,protectedFcbs] */
|
/* Format: FCBS = totalFcbs [,protectedFcbs] */
|
||||||
COUNT fcbs;
|
COUNT fcbs;
|
||||||
@ -1117,7 +1131,7 @@ INIT BOOL LoadCountryInfo(char *filename, UWORD ctryCode, UWORD codePage)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID Country(BYTE * pLine)
|
INIT STATIC VOID Country(BYTE * pLine)
|
||||||
{
|
{
|
||||||
/* Format: COUNTRY = countryCode, [codePage], filename */
|
/* Format: COUNTRY = countryCode, [codePage], filename */
|
||||||
COUNT ctryCode;
|
COUNT ctryCode;
|
||||||
@ -1153,7 +1167,7 @@ INIT static VOID Country(BYTE * pLine)
|
|||||||
CfgFailure(pLine);
|
CfgFailure(pLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID Stacks(BYTE * pLine)
|
INIT STATIC VOID Stacks(BYTE * pLine)
|
||||||
{
|
{
|
||||||
COUNT stacks;
|
COUNT stacks;
|
||||||
|
|
||||||
@ -1180,14 +1194,14 @@ INIT static VOID Stacks(BYTE * pLine)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID InitPgmHigh(BYTE * pLine)
|
INIT STATIC VOID InitPgmHigh(BYTE * pLine)
|
||||||
{
|
{
|
||||||
InitPgm(pLine);
|
InitPgm(pLine);
|
||||||
Config.cfgP_0_startmode = 0x80;
|
Config.cfgP_0_startmode = 0x80;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
INIT static VOID InitPgm(BYTE * pLine)
|
INIT STATIC VOID InitPgm(BYTE * pLine)
|
||||||
{
|
{
|
||||||
/* Get the string argument that represents the new init pgm */
|
/* Get the string argument that represents the new init pgm */
|
||||||
pLine = GetStringArg(pLine, Config.cfgInit);
|
pLine = GetStringArg(pLine, Config.cfgInit);
|
||||||
@ -1202,16 +1216,16 @@ INIT static VOID InitPgm(BYTE * pLine)
|
|||||||
Config.cfgP_0_startmode = 0;
|
Config.cfgP_0_startmode = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID Break(BYTE * pLine)
|
INIT STATIC VOID CfgBreak(BYTE * pLine)
|
||||||
{
|
{
|
||||||
/* Format: BREAK = (ON | OFF) */
|
/* Format: BREAK = (ON | OFF) */
|
||||||
GetStringArg(pLine, szBuf);
|
GetStringArg(pLine, szBuf);
|
||||||
break_ena = strcasecmp(szBuf, "OFF") ? 1 : 0;
|
break_ena = strcasecmp(szBuf, "OFF") ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID Numlock(BYTE * pLine)
|
INIT STATIC VOID Numlock(BYTE * pLine)
|
||||||
{
|
{
|
||||||
extern VOID keycheck();
|
extern VOID ASMCFUNC keycheck();
|
||||||
|
|
||||||
/* Format: NUMLOCK = (ON | OFF) */
|
/* Format: NUMLOCK = (ON | OFF) */
|
||||||
BYTE FAR *keyflags = (BYTE FAR *)MK_FP(0x40,0x17);
|
BYTE FAR *keyflags = (BYTE FAR *)MK_FP(0x40,0x17);
|
||||||
@ -1223,7 +1237,7 @@ INIT static VOID Numlock(BYTE * pLine)
|
|||||||
keycheck();
|
keycheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID DeviceHigh(BYTE * pLine)
|
INIT STATIC VOID DeviceHigh(BYTE * pLine)
|
||||||
{
|
{
|
||||||
if(UmbState == 1)
|
if(UmbState == 1)
|
||||||
{
|
{
|
||||||
@ -1313,7 +1327,7 @@ INIT BOOL LoadDevice(BYTE * pLine, COUNT top, COUNT mode)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT static VOID CfgFailure(BYTE * pLine)
|
INIT STATIC VOID CfgFailure(BYTE * pLine)
|
||||||
{
|
{
|
||||||
BYTE *pTmp = pLineStart;
|
BYTE *pTmp = pLineStart;
|
||||||
|
|
||||||
@ -1581,25 +1595,39 @@ VOID config_init_buffers(COUNT anzBuffers)
|
|||||||
|
|
||||||
pbuffer = firstbuf;
|
pbuffer = firstbuf;
|
||||||
|
|
||||||
|
DebugPrintf(("init_buffers at"));
|
||||||
|
|
||||||
for (i = 0; ; ++i)
|
for (i = 0; ; ++i)
|
||||||
{
|
{
|
||||||
if (FP_SEG(pbuffer) == 0xffff) HMAcount++;
|
if (FP_SEG(pbuffer) == 0xffff) HMAcount++;
|
||||||
|
|
||||||
lastbuf = pbuffer;
|
|
||||||
|
|
||||||
pbuffer->b_dummy = FP_OFF(pbuffer);
|
pbuffer->b_dummy = FP_OFF(pbuffer);
|
||||||
pbuffer->b_unit = 0;
|
pbuffer->b_unit = 0;
|
||||||
pbuffer->b_flag = 0;
|
pbuffer->b_flag = 0;
|
||||||
pbuffer->b_blkno = 0;
|
pbuffer->b_blkno = 0;
|
||||||
pbuffer->b_copies = 0;
|
pbuffer->b_copies = 0;
|
||||||
pbuffer->b_offset_lo = 0;
|
pbuffer->b_offset = 0;
|
||||||
pbuffer->b_offset_hi = 0;
|
|
||||||
pbuffer->b_next = NULL;
|
pbuffer->b_next = NULL;
|
||||||
|
|
||||||
DebugPrintf(("init_buffers buffer %d at %p\n",i, pbuffer));
|
DebugPrintf((" (%d,%p)",i, pbuffer));
|
||||||
|
|
||||||
|
/* now, we can have quite some buffers in HMA
|
||||||
|
-- up to 37 for KE38616.
|
||||||
|
so we fill the HMA with buffers
|
||||||
|
*/
|
||||||
|
|
||||||
if (i < (anzBuffers - 1))
|
if (i < (anzBuffers - 1))
|
||||||
|
{
|
||||||
|
pbuffer->b_next = HMAalloc(sizeof (struct buffer));
|
||||||
|
|
||||||
|
if (pbuffer->b_next == NULL)
|
||||||
|
{
|
||||||
|
/* if more buffer requested then fit into HMA, allocate
|
||||||
|
some from low memory as rewuested
|
||||||
|
*/
|
||||||
pbuffer->b_next = ConfigAlloc(sizeof (struct buffer));
|
pbuffer->b_next = ConfigAlloc(sizeof (struct buffer));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (pbuffer->b_next == NULL)
|
if (pbuffer->b_next == NULL)
|
||||||
break;
|
break;
|
||||||
@ -1607,8 +1635,12 @@ VOID config_init_buffers(COUNT anzBuffers)
|
|||||||
pbuffer = pbuffer->b_next;
|
pbuffer = pbuffer->b_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugPrintf(("Kernel: allocated %d Diskbuffers = %u Bytes in HMA\n",
|
DebugPrintf((" done\n"));
|
||||||
HMAcount, HMAcount*sizeof (struct buffer)));
|
|
||||||
|
if (HMAcount)
|
||||||
|
printf("Kernel: allocated %d Diskbuffers = %u Bytes in HMA\n",
|
||||||
|
HMAcount, HMAcount*sizeof (struct buffer));
|
||||||
|
|
||||||
if (HMAState == HMA_NONE || HMAState == HMA_REQ)
|
if (HMAState == HMA_NONE || HMAState == HMA_REQ)
|
||||||
lpBase = tmplpBase;
|
lpBase = tmplpBase;
|
||||||
}
|
}
|
||||||
|
134
kernel/dosfns.c
134
kernel/dosfns.c
@ -37,6 +37,9 @@ static BYTE *dosfnsRcsId = "$Id$";
|
|||||||
* /// Added SHARE support. 2000/09/04 Ron Cemer
|
* /// Added SHARE support. 2000/09/04 Ron Cemer
|
||||||
*
|
*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.26 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.25 2001/08/20 20:32:15 bartoldeman
|
* Revision 1.25 2001/08/20 20:32:15 bartoldeman
|
||||||
* Truename, get free space and ctrl-break fixes.
|
* Truename, get free space and ctrl-break fixes.
|
||||||
*
|
*
|
||||||
@ -258,6 +261,31 @@ static int share_lock_unlock
|
|||||||
/* /// End of additions for SHARE. - Ron Cemer */
|
/* /// End of additions for SHARE. - Ron Cemer */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
struct dpb FAR *GetDriveDPB(UBYTE drive, COUNT *rc)
|
||||||
|
{
|
||||||
|
struct dpb FAR *dpb;
|
||||||
|
drive = drive == 0 ? default_drive : drive - 1;
|
||||||
|
|
||||||
|
if (drive >= lastdrive)
|
||||||
|
{
|
||||||
|
*rc = DE_INVLDDRV;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dpb = CDSp->cds_table[drive].cdsDpb;
|
||||||
|
if (dpb == 0 ||
|
||||||
|
CDSp->cds_table[drive].cdsFlags & CDSNETWDRV)
|
||||||
|
{
|
||||||
|
*rc = DE_INVLDDRV;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*rc = SUCCESS;
|
||||||
|
return dpb;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static VOID DosGetFile(BYTE * lpszPath, BYTE FAR * lpszDosFileName)
|
static VOID DosGetFile(BYTE * lpszPath, BYTE FAR * lpszDosFileName)
|
||||||
{
|
{
|
||||||
BYTE szLclName[FNAME_SIZE + 1];
|
BYTE szLclName[FNAME_SIZE + 1];
|
||||||
@ -758,7 +786,7 @@ COUNT DosCreatSft(BYTE * fname, COUNT attrib)
|
|||||||
COUNT drive;
|
COUNT drive;
|
||||||
|
|
||||||
/* NEVER EVER allow directories to be created */
|
/* NEVER EVER allow directories to be created */
|
||||||
if (attrib & ~(D_RDONLY|D_HIDDEN|D_SYSTEM|D_ARCHIVE))
|
if (attrib & 0xff & ~(D_RDONLY|D_HIDDEN|D_SYSTEM|D_ARCHIVE))
|
||||||
{
|
{
|
||||||
return DE_ACCESS;
|
return DE_ACCESS;
|
||||||
}
|
}
|
||||||
@ -772,7 +800,7 @@ COUNT DosCreatSft(BYTE * fname, COUNT attrib)
|
|||||||
sftp->sft_shroff = -1; /* /// Added for SHARE - Ron Cemer */
|
sftp->sft_shroff = -1; /* /// Added for SHARE - Ron Cemer */
|
||||||
sftp->sft_psp = cu_psp;
|
sftp->sft_psp = cu_psp;
|
||||||
sftp->sft_mode = SFT_MRDWR;
|
sftp->sft_mode = SFT_MRDWR;
|
||||||
sftp->sft_attrib = attrib;
|
sftp->sft_attrib = attrib & 0xff;
|
||||||
sftp->sft_psp = cu_psp;
|
sftp->sft_psp = cu_psp;
|
||||||
|
|
||||||
/* check for a device */
|
/* check for a device */
|
||||||
@ -787,12 +815,7 @@ COUNT DosCreatSft(BYTE * fname, COUNT attrib)
|
|||||||
return sft_idx;
|
return sft_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
drive = get_verify_drive(fname);
|
if (current_ldt->cdsFlags & CDSNETWDRV) {
|
||||||
if(drive < 0) {
|
|
||||||
return drive;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CDSp->cds_table[drive].cdsFlags & CDSNETWDRV) {
|
|
||||||
lpCurSft = (sfttbl FAR *)sftp;
|
lpCurSft = (sfttbl FAR *)sftp;
|
||||||
sftp->sft_mode = attrib;
|
sftp->sft_mode = attrib;
|
||||||
result = -int2f_Remote_call(REM_CREATE, 0, 0, 0, (VOID FAR *) sftp, 0, MK_FP(0, attrib));
|
result = -int2f_Remote_call(REM_CREATE, 0, 0, 0, (VOID FAR *) sftp, 0, MK_FP(0, attrib));
|
||||||
@ -803,6 +826,11 @@ COUNT DosCreatSft(BYTE * fname, COUNT attrib)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drive = get_verify_drive(fname);
|
||||||
|
if (drive < 0) {
|
||||||
|
return drive;
|
||||||
|
}
|
||||||
|
|
||||||
/* /// Added for SHARE. - Ron Cemer */
|
/* /// Added for SHARE. - Ron Cemer */
|
||||||
if (IsShareInstalled()) {
|
if (IsShareInstalled()) {
|
||||||
if ((sftp->sft_shroff = share_open_check
|
if ((sftp->sft_shroff = share_open_check
|
||||||
@ -975,12 +1003,7 @@ COUNT DosOpenSft(BYTE * fname, COUNT mode)
|
|||||||
return sft_idx;
|
return sft_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
drive = get_verify_drive(fname);
|
if (current_ldt->cdsFlags & CDSNETWDRV) {
|
||||||
if (drive < 0) {
|
|
||||||
return drive;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CDSp->cds_table[drive].cdsFlags & CDSNETWDRV) {
|
|
||||||
lpCurSft = (sfttbl FAR *)sftp;
|
lpCurSft = (sfttbl FAR *)sftp;
|
||||||
result = -int2f_Remote_call(REM_OPEN, 0, 0, 0, (VOID FAR *) sftp, 0, MK_FP(0, mode));
|
result = -int2f_Remote_call(REM_OPEN, 0, 0, 0, (VOID FAR *) sftp, 0, MK_FP(0, mode));
|
||||||
if (result == SUCCESS) {
|
if (result == SUCCESS) {
|
||||||
@ -989,6 +1012,12 @@ COUNT DosOpenSft(BYTE * fname, COUNT mode)
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drive = get_verify_drive(fname);
|
||||||
|
if (drive < 0) {
|
||||||
|
return drive;
|
||||||
|
}
|
||||||
|
|
||||||
sftp->sft_shroff = -1; /* /// Added for SHARE - Ron Cemer */
|
sftp->sft_shroff = -1; /* /// Added for SHARE - Ron Cemer */
|
||||||
|
|
||||||
/* /// Added for SHARE. - Ron Cemer */
|
/* /// Added for SHARE. - Ron Cemer */
|
||||||
@ -1117,6 +1146,10 @@ VOID DosGetFree(UBYTE drive, COUNT FAR * spc, COUNT FAR * navc, COUNT FAR * bps,
|
|||||||
struct dpb FAR *dpbp;
|
struct dpb FAR *dpbp;
|
||||||
struct cds FAR *cdsp;
|
struct cds FAR *cdsp;
|
||||||
COUNT rg[4];
|
COUNT rg[4];
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
UCOUNT shift = 0;
|
||||||
|
ULONG cluster_size, ntotal, nfree;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* next - "log" in the drive */
|
/* next - "log" in the drive */
|
||||||
drive = (drive == 0 ? default_drive : drive - 1);
|
drive = (drive == 0 ? default_drive : drive - 1);
|
||||||
@ -1145,8 +1178,28 @@ VOID DosGetFree(UBYTE drive, COUNT FAR * spc, COUNT FAR * navc, COUNT FAR * bps,
|
|||||||
dpbp = CDSp->cds_table[drive].cdsDpb;
|
dpbp = CDSp->cds_table[drive].cdsDpb;
|
||||||
if (dpbp == NULL || media_check(dpbp) < 0)
|
if (dpbp == NULL || media_check(dpbp) < 0)
|
||||||
return;
|
return;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
cluster_size = (dpbp->dpb_clsmask + 1) * dpbp->dpb_secsize;
|
||||||
|
ntotal = dpbp->dpb_size - 1;
|
||||||
|
if (ISFAT32(dpbp)) while (cluster_size <= 0x7fff) {
|
||||||
|
cluster_size <<= 1;
|
||||||
|
ntotal >>= 1;
|
||||||
|
shift++;
|
||||||
|
}
|
||||||
|
/* get the data available from dpb */
|
||||||
|
*nc = (UCOUNT)ntotal;
|
||||||
|
if (ntotal > 0xfffe)
|
||||||
|
*nc = 0xfffe;
|
||||||
|
*spc = (dpbp->dpb_clsmask + 1) << shift;
|
||||||
|
*bps = dpbp->dpb_secsize;
|
||||||
|
|
||||||
/* get the data vailable from dpb */
|
/* now tell fs to give us free cluster */
|
||||||
|
/* count */
|
||||||
|
nfree = dos_free(dpbp) >> shift;
|
||||||
|
if (nfree > 0xfffe) nfree = 0xfffe;
|
||||||
|
*navc = (UCOUNT)nfree;
|
||||||
|
#else
|
||||||
|
/* get the data available from dpb */
|
||||||
*nc = dpbp->dpb_size - 1;
|
*nc = dpbp->dpb_size - 1;
|
||||||
*spc = dpbp->dpb_clsmask + 1;
|
*spc = dpbp->dpb_clsmask + 1;
|
||||||
*bps = dpbp->dpb_secsize;
|
*bps = dpbp->dpb_secsize;
|
||||||
@ -1154,8 +1207,59 @@ VOID DosGetFree(UBYTE drive, COUNT FAR * spc, COUNT FAR * navc, COUNT FAR * bps,
|
|||||||
/* now tell fs to give us free cluster */
|
/* now tell fs to give us free cluster */
|
||||||
/* count */
|
/* count */
|
||||||
*navc = dos_free(dpbp);
|
*navc = dos_free(dpbp);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
/* network names like \\SERVER\C aren't supported yet */
|
||||||
|
#define IS_SLASH(ch) (ch == '\\' || ch == '/')
|
||||||
|
COUNT DosGetExtFree(BYTE FAR *DriveString, struct xfreespace FAR *xfsp)
|
||||||
|
{
|
||||||
|
struct dpb FAR *dpbp;
|
||||||
|
struct cds FAR *cdsp;
|
||||||
|
UBYTE drive;
|
||||||
|
UCOUNT rg[4];
|
||||||
|
|
||||||
|
if (IS_SLASH(DriveString[0]) || !IS_SLASH(DriveString[2])
|
||||||
|
|| DriveString[1] != ':')
|
||||||
|
return DE_INVLDDRV;
|
||||||
|
drive = DosUpFChar(*DriveString) - 'A';
|
||||||
|
if (drive >= lastdrive) return DE_INVLDDRV;
|
||||||
|
|
||||||
|
cdsp = &CDSp->cds_table[drive];
|
||||||
|
|
||||||
|
if (!(cdsp->cdsFlags & CDSVALID))
|
||||||
|
return DE_INVLDDRV;
|
||||||
|
|
||||||
|
if (cdsp->cdsFlags & CDSNETWDRV)
|
||||||
|
{
|
||||||
|
int2f_Remote_call(REM_GETSPACE, 0, 0, 0, cdsp, 0, &rg);
|
||||||
|
|
||||||
|
xfsp->xfs_clussize = rg[0];
|
||||||
|
xfsp->xfs_totalclusters = rg[1];
|
||||||
|
xfsp->xfs_secsize = rg[2];
|
||||||
|
xfsp->xfs_freeclusters = rg[3];
|
||||||
|
} else {
|
||||||
|
dpbp = CDSp->cds_table[drive].cdsDpb;
|
||||||
|
if (dpbp == NULL || media_check(dpbp) < 0)
|
||||||
|
return DE_INVLDDRV;
|
||||||
|
xfsp->xfs_secsize = dpbp->dpb_secsize;
|
||||||
|
xfsp->xfs_totalclusters = dpbp->dpb_size;
|
||||||
|
xfsp->xfs_freeclusters = dos_free(dpbp);
|
||||||
|
xfsp->xfs_clussize = dpbp->dpb_clsmask + 1;
|
||||||
|
}
|
||||||
|
xfsp->xfs_totalunits = xfsp->xfs_totalclusters;
|
||||||
|
xfsp->xfs_freeunits = xfsp->xfs_freeclusters;
|
||||||
|
xfsp->xfs_totalsectors = xfsp->xfs_totalclusters * xfsp->xfs_clussize;
|
||||||
|
xfsp->xfs_freesectors = xfsp->xfs_freeclusters * xfsp->xfs_clussize;
|
||||||
|
xfsp->xfs_datasize = sizeof(struct xfreespace);
|
||||||
|
|
||||||
|
fmemset(xfsp->xfs_reserved, 0, 8);
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
COUNT DosGetCuDir(UBYTE drive, BYTE FAR * s)
|
COUNT DosGetCuDir(UBYTE drive, BYTE FAR * s)
|
||||||
{
|
{
|
||||||
BYTE FAR *cp;
|
BYTE FAR *cp;
|
||||||
|
@ -42,10 +42,6 @@ segment HMA_TEXT
|
|||||||
extern critical_sp:wrt DGROUP
|
extern critical_sp:wrt DGROUP
|
||||||
extern _lpUserStack:wrt DGROUP
|
extern _lpUserStack:wrt DGROUP
|
||||||
extern _user_r:wrt DGROUP
|
extern _user_r:wrt DGROUP
|
||||||
extern _api_sp:wrt DGROUP ; api stacks - for context
|
|
||||||
extern _api_ss:wrt DGROUP ; switching
|
|
||||||
extern _usr_sp:wrt DGROUP ; user stacks
|
|
||||||
extern _usr_ss:wrt DGROUP
|
|
||||||
extern _dosidle_flag:wrt DGROUP
|
extern _dosidle_flag:wrt DGROUP
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
@ -71,10 +67,6 @@ Do_DosI:
|
|||||||
push word [_user_r+2]
|
push word [_user_r+2]
|
||||||
push word [_lpUserStack]
|
push word [_lpUserStack]
|
||||||
push word [_lpUserStack+2]
|
push word [_lpUserStack+2]
|
||||||
push word [_api_sp]
|
|
||||||
push word [_api_ss]
|
|
||||||
push word [_usr_sp]
|
|
||||||
push word [_usr_ss]
|
|
||||||
mov es,word [_cu_psp]
|
mov es,word [_cu_psp]
|
||||||
push word [es:PSP_USERSS]
|
push word [es:PSP_USERSS]
|
||||||
push word [es:PSP_USERSP]
|
push word [es:PSP_USERSP]
|
||||||
@ -84,10 +76,6 @@ Do_DosI:
|
|||||||
mov es,word [_cu_psp]
|
mov es,word [_cu_psp]
|
||||||
pop word [es:PSP_USERSP]
|
pop word [es:PSP_USERSP]
|
||||||
pop word [es:PSP_USERSS]
|
pop word [es:PSP_USERSS]
|
||||||
pop word [_usr_ss]
|
|
||||||
pop word [_usr_sp]
|
|
||||||
pop word [_api_ss]
|
|
||||||
pop word [_api_sp]
|
|
||||||
pop word [_lpUserStack+2]
|
pop word [_lpUserStack+2]
|
||||||
pop word [_lpUserStack]
|
pop word [_lpUserStack]
|
||||||
pop word [_user_r+2]
|
pop word [_user_r+2]
|
||||||
|
251
kernel/dsk.c
251
kernel/dsk.c
@ -34,6 +34,9 @@ static BYTE *dskRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.20 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.19 2001/07/28 18:13:06 bartoldeman
|
* Revision 1.19 2001/07/28 18:13:06 bartoldeman
|
||||||
* Fixes for FORMAT+SYS, FATFS, get current dir, kernel init memory situation.
|
* Fixes for FORMAT+SYS, FATFS, get current dir, kernel init memory situation.
|
||||||
*
|
*
|
||||||
@ -165,16 +168,17 @@ static BYTE *dskRcsId = "$Id$";
|
|||||||
|
|
||||||
|
|
||||||
#ifdef PROTO
|
#ifdef PROTO
|
||||||
BOOL fl_reset(WORD);
|
BOOL ASMCFUNC fl_reset(WORD);
|
||||||
COUNT fl_readdasd(WORD);
|
COUNT ASMCFUNC fl_readdasd(WORD);
|
||||||
COUNT fl_diskchanged(WORD);
|
COUNT ASMCFUNC fl_diskchanged(WORD);
|
||||||
COUNT fl_rd_status(WORD);
|
COUNT ASMCFUNC fl_rd_status(WORD);
|
||||||
|
|
||||||
COUNT fl_read(WORD, WORD, WORD, WORD, WORD, BYTE FAR *);
|
COUNT ASMCFUNC fl_read(WORD, WORD, WORD, WORD, WORD, BYTE FAR *);
|
||||||
COUNT fl_write(WORD, WORD, WORD, WORD, WORD, BYTE FAR *);
|
COUNT ASMCFUNC fl_write(WORD, WORD, WORD, WORD, WORD, BYTE FAR *);
|
||||||
COUNT fl_verify(WORD, WORD, WORD, WORD, WORD, BYTE FAR *);
|
COUNT ASMCFUNC fl_verify(WORD, WORD, WORD, WORD, WORD, BYTE FAR *);
|
||||||
|
VOID ASMCFUNC fl_readkey(VOID);
|
||||||
|
|
||||||
extern COUNT fl_lba_ReadWrite (BYTE drive, WORD mode,
|
extern COUNT ASMCFUNC fl_lba_ReadWrite (BYTE drive, WORD mode,
|
||||||
struct _bios_LBA_address_packet FAR *dap_p);
|
struct _bios_LBA_address_packet FAR *dap_p);
|
||||||
|
|
||||||
int LBA_Transfer(ddt *pddt ,UWORD mode, VOID FAR *buffer,
|
int LBA_Transfer(ddt *pddt ,UWORD mode, VOID FAR *buffer,
|
||||||
@ -187,20 +191,22 @@ COUNT fl_rd_status();
|
|||||||
COUNT fl_read();
|
COUNT fl_read();
|
||||||
COUNT fl_write();
|
COUNT fl_write();
|
||||||
COUNT fl_verify();
|
COUNT fl_verify();
|
||||||
|
VOID fl_readkey();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define NENTRY 26 /* total size of dispatch table */
|
#define NENTRY 26 /* total size of dispatch table */
|
||||||
|
|
||||||
extern BYTE FAR nblk_rel;
|
extern BYTE FAR nblk_rel;
|
||||||
|
|
||||||
|
extern int FAR ASMCFUNC Get_nblk_rel(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define LBA_READ 0x4200
|
#define LBA_READ 0x4200
|
||||||
#define LBA_WRITE 0x4300
|
#define LBA_WRITE 0x4300
|
||||||
UWORD LBA_WRITE_VERIFY = 0x4302;
|
UWORD LBA_WRITE_VERIFY = 0x4302;
|
||||||
#define LBA_VERIFY 0x4400
|
#define LBA_VERIFY 0x4400
|
||||||
|
|
||||||
extern void __int__(int);
|
|
||||||
|
|
||||||
/* this buffer must not overlap a 64K boundary
|
/* this buffer must not overlap a 64K boundary
|
||||||
due to DMA transfers
|
due to DMA transfers
|
||||||
this is certainly true, if located somewhere
|
this is certainly true, if located somewhere
|
||||||
@ -312,7 +318,7 @@ static WORD(*dispatch[NENTRY]) () =
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define hd(x) ((x) & 0x80)
|
#define hd(x) ((x) & DF_FIXED)
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
/* F U N C T I O N S --------------------------------------------------- */
|
/* F U N C T I O N S --------------------------------------------------- */
|
||||||
@ -321,7 +327,7 @@ static WORD(*dispatch[NENTRY]) () =
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
COUNT FAR blk_driver(rqptr rp)
|
COUNT FAR ASMCFUNC blk_driver(rqptr rp)
|
||||||
{
|
{
|
||||||
if (rp->r_unit >= nUnits && rp->r_command != C_INIT)
|
if (rp->r_unit >= nUnits && rp->r_command != C_INIT)
|
||||||
return failure(E_UNIT);
|
return failure(E_UNIT);
|
||||||
@ -342,45 +348,83 @@ WORD _dsk_init(rqptr rp, ddt *pddt)
|
|||||||
return S_DONE; /* to keep the compiler happy */
|
return S_DONE; /* to keep the compiler happy */
|
||||||
}
|
}
|
||||||
|
|
||||||
WORD mediachk(rqptr rp, ddt *pddt)
|
STATIC WORD play_dj(ddt*pddt)
|
||||||
|
{
|
||||||
|
/* play the DJ ... */
|
||||||
|
if ((pddt->ddt_descflags & (DF_MULTLOG | DF_CURLOG)) == DF_MULTLOG)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
ddt *pddt2 = getddt(0);
|
||||||
|
for (i = 0; i < nUnits; i++, pddt2++)
|
||||||
|
{
|
||||||
|
if (pddt->ddt_driveno == pddt2->ddt_driveno &&
|
||||||
|
(pddt2->ddt_descflags & (DF_MULTLOG | DF_CURLOG)) ==
|
||||||
|
(DF_MULTLOG | DF_CURLOG))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == nUnits)
|
||||||
|
{
|
||||||
|
printf("Error in the DJ mechanism!\n"); /* should not happen! */
|
||||||
|
return M_CHANGED;
|
||||||
|
}
|
||||||
|
printf("Remove diskette in drive %c:\n", 'A'+pddt2->ddt_logdriveno);
|
||||||
|
printf("Insert diskette in drive %c:\n", 'A'+pddt->ddt_logdriveno);
|
||||||
|
printf("Press the any key to continue ... \n");
|
||||||
|
fl_readkey();
|
||||||
|
pddt2->ddt_descflags &= ~DF_CURLOG;
|
||||||
|
pddt->ddt_descflags |= DF_CURLOG;
|
||||||
|
return M_CHANGED;
|
||||||
|
}
|
||||||
|
return M_NOT_CHANGED;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC WORD diskchange(ddt *pddt)
|
||||||
{
|
{
|
||||||
COUNT drive = pddt->ddt_driveno;
|
|
||||||
COUNT result;
|
COUNT result;
|
||||||
|
|
||||||
/* if it's a hard drive, media never changes */
|
/* if it's a hard drive, media never changes */
|
||||||
if (hd(drive))
|
if (hd(pddt->ddt_descflags))
|
||||||
rp->r_mcretcode = M_NOT_CHANGED;
|
return M_NOT_CHANGED;
|
||||||
else
|
|
||||||
/* else, check floppy status */
|
if (play_dj(pddt) == M_CHANGED)
|
||||||
|
return M_CHANGED;
|
||||||
|
|
||||||
|
if (pddt->ddt_descflags & DF_CHANGELINE) /* if we can detect a change ... */
|
||||||
{
|
{
|
||||||
if ((result = fl_readdasd(drive)) == 2) /* if we can detect a change ... */
|
if ((result = fl_diskchanged(pddt->ddt_driveno)) == 1)
|
||||||
{
|
/* check if it has changed... */
|
||||||
if ((result = fl_diskchanged(drive)) == 1) /* check if it has changed... */
|
return M_CHANGED;
|
||||||
rp->r_mcretcode = M_CHANGED;
|
|
||||||
else if (result == 0)
|
else if (result == 0)
|
||||||
rp->r_mcretcode = M_NOT_CHANGED;
|
return M_NOT_CHANGED;
|
||||||
else
|
|
||||||
rp->r_mcretcode = tdelay((LONG) 37) ? M_DONT_KNOW : M_NOT_CHANGED;
|
|
||||||
}
|
|
||||||
else if (result == 3) /* if it's a fixed disk, then no change */
|
|
||||||
rp->r_mcretcode = M_NOT_CHANGED;
|
|
||||||
else /* can not detect or error... */
|
|
||||||
rp->r_mcretcode = tdelay((LONG) 37) ? M_DONT_KNOW : M_NOT_CHANGED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* can not detect or error... */
|
||||||
|
return tdelay((LONG) 37) ? M_DONT_KNOW : M_NOT_CHANGED;
|
||||||
|
}
|
||||||
|
|
||||||
|
WORD mediachk(rqptr rp, ddt *pddt)
|
||||||
|
{
|
||||||
|
/* check floppy status */
|
||||||
|
if (pddt->ddt_descflags & DF_DISKCHANGE)
|
||||||
|
{
|
||||||
|
pddt->ddt_descflags &= ~DF_DISKCHANGE;
|
||||||
|
rp->r_mcretcode = M_DONT_KNOW;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rp->r_mcretcode = diskchange(pddt);
|
||||||
|
}
|
||||||
return S_DONE;
|
return S_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read Write Sector Zero or Hard Drive Dos Bpb
|
* Read Write Sector Zero or Hard Drive Dos Bpb
|
||||||
*/
|
*/
|
||||||
STATIC WORD RWzero(rqptr rp, WORD t)
|
STATIC WORD RWzero(ddt *pddt, UWORD mode)
|
||||||
{
|
{
|
||||||
ddt *pddt = getddt(rp->r_unit);
|
|
||||||
UWORD done;
|
UWORD done;
|
||||||
|
|
||||||
return LBA_Transfer(pddt,
|
return LBA_Transfer(pddt, mode,
|
||||||
t == 0 ? LBA_READ : LBA_WRITE,
|
|
||||||
(UBYTE FAR *)&DiskTransferBuffer,
|
(UBYTE FAR *)&DiskTransferBuffer,
|
||||||
pddt->ddt_offset,1,&done);
|
pddt->ddt_offset,1,&done);
|
||||||
}
|
}
|
||||||
@ -396,7 +440,7 @@ static WORD Getlogdev(rqptr rp, ddt *pddt)
|
|||||||
UNREFERENCED_PARAMETER(pddt);
|
UNREFERENCED_PARAMETER(pddt);
|
||||||
|
|
||||||
x++;
|
x++;
|
||||||
if( x > nblk_rel )
|
if( x > Get_nblk_rel() )
|
||||||
return failure(E_UNIT);
|
return failure(E_UNIT);
|
||||||
|
|
||||||
rp->r_unit = x;
|
rp->r_unit = x;
|
||||||
@ -439,22 +483,24 @@ static WORD blk_Media(rqptr rp, ddt *pddt)
|
|||||||
{
|
{
|
||||||
UNREFERENCED_PARAMETER(rp);
|
UNREFERENCED_PARAMETER(rp);
|
||||||
|
|
||||||
if (hd( pddt->ddt_driveno))
|
if (hd( pddt->ddt_descflags))
|
||||||
return S_BUSY|S_DONE; /* Hard Drive */
|
return S_BUSY|S_DONE; /* Hard Drive */
|
||||||
else
|
else
|
||||||
return S_DONE; /* Floppy */
|
return S_DONE; /* Floppy */
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC WORD bldbpb(rqptr rp, ddt *pddt)
|
static getbpb(ddt *pddt)
|
||||||
{
|
{
|
||||||
ULONG count;
|
ULONG count;
|
||||||
bpb *pbpbarray = &pddt->ddt_bpb;
|
bpb *pbpbarray = &pddt->ddt_bpb;
|
||||||
WORD head,/*track,*/sector,ret;
|
WORD head,/*track,*/sector,ret;
|
||||||
|
|
||||||
ret = RWzero( rp, 0);
|
ret = RWzero(pddt, LBA_READ);
|
||||||
getword(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[BPB_NBYTE]), &pbpbarray->bpb_nbyte);
|
getword(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[0]), &pbpbarray->bpb_nbyte);
|
||||||
|
|
||||||
pddt->ddt_descflags |= 0x200; /* set drive to not accessible */
|
pddt->ddt_descflags |= DF_NOACCESS; /* set drive to not accessible and changed */
|
||||||
|
if (diskchange(pddt) != M_NOT_CHANGED)
|
||||||
|
pddt->ddt_descflags |= DF_DISKCHANGE;
|
||||||
|
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return (dskerr(ret));
|
return (dskerr(ret));
|
||||||
@ -466,30 +512,41 @@ STATIC WORD bldbpb(rqptr rp, ddt *pddt)
|
|||||||
return S_DONE;
|
return S_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
pddt->ddt_descflags &= ~0x200; /* set drive to accessible */
|
pddt->ddt_descflags &= ~DF_NOACCESS; /* set drive to accessible */
|
||||||
|
|
||||||
/*TE ~ 200 bytes*/
|
/*TE ~ 200 bytes*/
|
||||||
|
|
||||||
getbyte(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[BPB_NSECTOR]), &pbpbarray->bpb_nsector);
|
fmemcpy(pbpbarray, &DiskTransferBuffer[BT_BPB], sizeof(bpb));
|
||||||
getword(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[BPB_NRESERVED]), &pbpbarray->bpb_nreserved);
|
|
||||||
getbyte(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[BPB_NFAT]), &pbpbarray->bpb_nfat);
|
|
||||||
getword(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[BPB_NDIRENT]), &pbpbarray->bpb_ndirent);
|
|
||||||
getword(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[BPB_NSIZE]), &pbpbarray->bpb_nsize);
|
|
||||||
getbyte(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[BPB_MDESC]), &pbpbarray->bpb_mdesc);
|
|
||||||
getword(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[BPB_NFSECT]), &pbpbarray->bpb_nfsect);
|
|
||||||
getword(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[BPB_NSECS]), &pbpbarray->bpb_nsecs);
|
|
||||||
getword(&((((BYTE *) & DiskTransferBuffer[BT_BPB]))[BPB_NHEADS]), &pbpbarray->bpb_nheads);
|
|
||||||
getlong(&((((BYTE *) & DiskTransferBuffer[BT_BPB])[BPB_HIDDEN])), &pbpbarray->bpb_hidden);
|
|
||||||
getlong(&((((BYTE *) & DiskTransferBuffer[BT_BPB])[BPB_HUGE])), &pbpbarray->bpb_huge);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Needs fat32 offset code */
|
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
/*??*/
|
||||||
|
/* 2b is fat16 volume label. if memcmp, then offset 0x36.
|
||||||
|
if (fstrncmp((BYTE *) & DiskTransferBuffer[0x36], "FAT16",5) == 0 ||
|
||||||
|
fstrncmp((BYTE *) & DiskTransferBuffer[0x36], "FAT12",5) == 0) {
|
||||||
|
TE: I'm not sure, what the _real_ decision point is, however MSDN
|
||||||
|
'A_BF_BPB_SectorsPerFAT
|
||||||
|
The number of sectors per FAT.
|
||||||
|
Note: This member will always be zero in a FAT32 BPB.
|
||||||
|
Use the values from A_BF_BPB_BigSectorsPerFat...
|
||||||
|
*/
|
||||||
|
if (pbpbarray->bpb_nfsect != 0)
|
||||||
|
{
|
||||||
|
/* FAT16/FAT12 boot sector */
|
||||||
getlong(&((((BYTE *) & DiskTransferBuffer[0x27])[0])), &pddt->ddt_serialno);
|
getlong(&((((BYTE *) & DiskTransferBuffer[0x27])[0])), &pddt->ddt_serialno);
|
||||||
|
|
||||||
memcpy(pddt->ddt_volume,&DiskTransferBuffer[0x2B], 11);
|
memcpy(pddt->ddt_volume,&DiskTransferBuffer[0x2B], 11);
|
||||||
memcpy(pddt->ddt_fstype,&DiskTransferBuffer[0x36], 8);
|
memcpy(pddt->ddt_fstype,&DiskTransferBuffer[0x36], 8);
|
||||||
|
} else {
|
||||||
|
/* FAT32 boot sector */
|
||||||
|
getlong(&((((BYTE *) & DiskTransferBuffer[0x43])[0])), &pddt->ddt_serialno);
|
||||||
|
memcpy(pddt->ddt_volume,&DiskTransferBuffer[0x47], 11);
|
||||||
|
memcpy(pddt->ddt_fstype,&DiskTransferBuffer[0x52], 8);
|
||||||
|
pbpbarray->bpb_ndirent = 512;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
getlong(&((((BYTE *) & DiskTransferBuffer[0x27])[0])), &pddt->ddt_serialno);
|
||||||
|
memcpy(pddt->ddt_volume,&DiskTransferBuffer[0x2B], 11);
|
||||||
|
memcpy(pddt->ddt_fstype,&DiskTransferBuffer[0x36], 8);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -503,8 +560,6 @@ STATIC WORD bldbpb(rqptr rp, ddt *pddt)
|
|||||||
printf("BPB_MDESC = %02x\n", pbpbarray->bpb_mdesc);
|
printf("BPB_MDESC = %02x\n", pbpbarray->bpb_mdesc);
|
||||||
printf("BPB_NFSECT = %04x\n", pbpbarray->bpb_nfsect);
|
printf("BPB_NFSECT = %04x\n", pbpbarray->bpb_nfsect);
|
||||||
#endif
|
#endif
|
||||||
rp->r_bpptr = pbpbarray;
|
|
||||||
|
|
||||||
|
|
||||||
count =
|
count =
|
||||||
pbpbarray->bpb_nsize == 0 ?
|
pbpbarray->bpb_nsize == 0 ?
|
||||||
@ -518,7 +573,7 @@ STATIC WORD bldbpb(rqptr rp, ddt *pddt)
|
|||||||
tmark();
|
tmark();
|
||||||
return failure(E_FAILURE);
|
return failure(E_FAILURE);
|
||||||
}
|
}
|
||||||
pddt->ddt_ncyl = count / (head * sector);
|
pddt->ddt_ncyl = (count + head * sector - 1) / (head * sector);
|
||||||
tmark();
|
tmark();
|
||||||
|
|
||||||
#ifdef DSK_DEBUG
|
#ifdef DSK_DEBUG
|
||||||
@ -527,6 +582,19 @@ STATIC WORD bldbpb(rqptr rp, ddt *pddt)
|
|||||||
printf("BPB_HIDDEN = %08lx\n", pbpbarray->bpb_hidden);
|
printf("BPB_HIDDEN = %08lx\n", pbpbarray->bpb_hidden);
|
||||||
printf("BPB_HUGE = %08lx\n", pbpbarray->bpb_huge);
|
printf("BPB_HUGE = %08lx\n", pbpbarray->bpb_huge);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
STATIC WORD bldbpb(rqptr rp, ddt *pddt)
|
||||||
|
{
|
||||||
|
WORD result;
|
||||||
|
|
||||||
|
if ((result = getbpb(pddt)) != 0)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
rp->r_bpptr = &pddt->ddt_bpb;
|
||||||
return S_DONE;
|
return S_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -553,14 +621,22 @@ STATIC WORD Genblkdev(rqptr rp,ddt *pddt)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
bpb FAR *pbpb;
|
bpb FAR *pbpb;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
int extended = 0;
|
||||||
|
|
||||||
switch(rp->r_count){
|
if ((rp->r_count >> 8) == 0x48) extended = 1;
|
||||||
case 0x0860: /* get device parameters */
|
else
|
||||||
|
#endif
|
||||||
|
if ((rp->r_count >> 8) != 8)
|
||||||
|
return failure(E_CMD);
|
||||||
|
|
||||||
|
switch(rp->r_count & 0xff){
|
||||||
|
case 0x60: /* get device parameters */
|
||||||
{
|
{
|
||||||
struct gblkio FAR * gblp = (struct gblkio FAR *) rp->r_trans;
|
struct gblkio FAR * gblp = (struct gblkio FAR *) rp->r_trans;
|
||||||
REG COUNT x = 5,y = 1,z = 0;
|
REG COUNT x = 5,y = 1,z = 0;
|
||||||
|
|
||||||
if (!hd(pddt->ddt_driveno)){
|
if (!hd(pddt->ddt_descflags)){
|
||||||
y = 2;
|
y = 2;
|
||||||
x = 8; /* any odd ball drives return this */
|
x = 8; /* any odd ball drives return this */
|
||||||
switch(pddt->ddt_bpb.bpb_nsize)
|
switch(pddt->ddt_bpb.bpb_nsize)
|
||||||
@ -590,57 +666,57 @@ STATIC WORD Genblkdev(rqptr rp,ddt *pddt)
|
|||||||
gblp->gbio_ncyl = pddt->ddt_ncyl;
|
gblp->gbio_ncyl = pddt->ddt_ncyl;
|
||||||
/* use default dpb or current bpb? */
|
/* use default dpb or current bpb? */
|
||||||
pbpb = (gblp->gbio_spcfunbit & 0x01) == 0 ? &pddt->ddt_defbpb : &pddt->ddt_bpb;
|
pbpb = (gblp->gbio_spcfunbit & 0x01) == 0 ? &pddt->ddt_defbpb : &pddt->ddt_bpb;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (!extended) fmemcpy(&gblp->gbio_bpb, pbpb, BPB_SIZEOF);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
fmemcpy(&gblp->gbio_bpb, pbpb, sizeof(gblp->gbio_bpb));
|
fmemcpy(&gblp->gbio_bpb, pbpb, sizeof(gblp->gbio_bpb));
|
||||||
gblp->gbio_spcfunbit |= 0x04; /* bit 2 set if all sectors in track same size (should be set) */
|
|
||||||
gblp->gbio_nsecs = pbpb->bpb_nsector;
|
gblp->gbio_nsecs = pbpb->bpb_nsector;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x0866: /* get volume serial number */
|
case 0x66: /* get volume serial number */
|
||||||
{
|
{
|
||||||
struct Gioc_media FAR * gioc = (struct Gioc_media FAR *) rp->r_trans;
|
struct Gioc_media FAR * gioc = (struct Gioc_media FAR *) rp->r_trans;
|
||||||
struct FS_info FAR * fs = (struct FS_info FAR *) &DiskTransferBuffer[0x27];
|
|
||||||
|
|
||||||
ret = RWzero( rp, 0);
|
ret = getbpb(pddt);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return (dskerr(ret));
|
return (ret);
|
||||||
|
|
||||||
gioc->ioc_serialno = fs->serialno;
|
gioc->ioc_serialno = pddt->ddt_serialno;
|
||||||
pddt->ddt_serialno = fs->serialno;
|
|
||||||
|
|
||||||
fmemcpy(pddt->ddt_volume, fs->volume,11);
|
|
||||||
fmemcpy(pddt->ddt_volume, fs->fstype,8);
|
|
||||||
fmemcpy(gioc->ioc_volume, pddt->ddt_volume,11);
|
fmemcpy(gioc->ioc_volume, pddt->ddt_volume,11);
|
||||||
fmemcpy(gioc->ioc_fstype, pddt->ddt_fstype,8);
|
fmemcpy(gioc->ioc_fstype, pddt->ddt_fstype,8);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x0846: /* set volume serial number */
|
case 0x46: /* set volume serial number */
|
||||||
{
|
{
|
||||||
struct Gioc_media FAR * gioc = (struct Gioc_media FAR *) rp->r_trans;
|
struct Gioc_media FAR * gioc = (struct Gioc_media FAR *) rp->r_trans;
|
||||||
struct FS_info FAR * fs = (struct FS_info FAR *) &DiskTransferBuffer[0x27];
|
struct FS_info FAR * fs;
|
||||||
|
|
||||||
ret = RWzero( rp, 0);
|
ret = getbpb(pddt);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return (dskerr(ret));
|
return (ret);
|
||||||
|
|
||||||
|
fs = (struct FS_info FAR *) &DiskTransferBuffer
|
||||||
|
[(pddt->ddt_bpb.bpb_nfsect != 0 ? 0x27 : 0x43)];
|
||||||
fs->serialno = gioc->ioc_serialno;
|
fs->serialno = gioc->ioc_serialno;
|
||||||
pddt->ddt_serialno = fs->serialno;
|
pddt->ddt_serialno = fs->serialno;
|
||||||
|
|
||||||
ret = RWzero( rp, 1);
|
ret = RWzero(pddt, LBA_WRITE);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return (dskerr(ret));
|
return (dskerr(ret));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x0867: /* get access flag */
|
case 0x67: /* get access flag */
|
||||||
{
|
{
|
||||||
struct Access_info FAR * ai = (struct Access_info FAR *) rp->r_trans;
|
struct Access_info FAR * ai = (struct Access_info FAR *) rp->r_trans;
|
||||||
ai->AI_Flag = pddt->ddt_descflags & 0x200 ? 0 : 1; /* bit 9 */
|
ai->AI_Flag = pddt->ddt_descflags & DF_NOACCESS ? 0 : 1; /* bit 9 */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x0847: /* set access flag */
|
case 0x47: /* set access flag */
|
||||||
{
|
{
|
||||||
struct Access_info FAR * ai = (struct Access_info FAR *) rp->r_trans;
|
struct Access_info FAR * ai = (struct Access_info FAR *) rp->r_trans;
|
||||||
pddt->ddt_descflags &= ~0x200;
|
pddt->ddt_descflags &= ~DF_NOACCESS;
|
||||||
pddt->ddt_descflags |= (ai->AI_Flag ? 0 : 0x200);
|
pddt->ddt_descflags |= (ai->AI_Flag ? 0 : DF_NOACCESS);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -671,7 +747,7 @@ WORD blockio(rqptr rp, ddt *pddt)
|
|||||||
|
|
||||||
tmark();
|
tmark();
|
||||||
start = (rp->r_start != HUGECOUNT ? rp->r_start : rp->r_huge);
|
start = (rp->r_start != HUGECOUNT ? rp->r_start : rp->r_huge);
|
||||||
pbpb = hd(pddt->ddt_driveno) ? &pddt->ddt_defbpb : &pddt->ddt_bpb;
|
pbpb = hd(pddt->ddt_descflags) ? &pddt->ddt_defbpb : &pddt->ddt_bpb;
|
||||||
size = (pbpb->bpb_nsize ? pbpb->bpb_nsize : pbpb->bpb_huge);
|
size = (pbpb->bpb_nsize ? pbpb->bpb_nsize : pbpb->bpb_huge);
|
||||||
|
|
||||||
if (start >= size ||
|
if (start >= size ||
|
||||||
@ -822,6 +898,9 @@ int LBA_Transfer(ddt *pddt ,UWORD mode, VOID FAR *buffer,
|
|||||||
|
|
||||||
int num_retries;
|
int num_retries;
|
||||||
|
|
||||||
|
/* optionally change from A: to B: or back */
|
||||||
|
play_dj(pddt);
|
||||||
|
|
||||||
*transferred = 0;
|
*transferred = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -908,7 +987,7 @@ int LBA_Transfer(ddt *pddt ,UWORD mode, VOID FAR *buffer,
|
|||||||
|
|
||||||
error_code = (mode == LBA_READ ? fl_read : fl_write)(
|
error_code = (mode == LBA_READ ? fl_read : fl_write)(
|
||||||
pddt->ddt_driveno,
|
pddt->ddt_driveno,
|
||||||
chs.Head, chs.Cylinder, chs.Sector,
|
chs.Head, (UWORD)chs.Cylinder, chs.Sector,
|
||||||
count, transfer_address);
|
count, transfer_address);
|
||||||
|
|
||||||
if (error_code == 0 &&
|
if (error_code == 0 &&
|
||||||
@ -916,7 +995,7 @@ int LBA_Transfer(ddt *pddt ,UWORD mode, VOID FAR *buffer,
|
|||||||
{
|
{
|
||||||
error_code = fl_verify(
|
error_code = fl_verify(
|
||||||
pddt->ddt_driveno,
|
pddt->ddt_driveno,
|
||||||
chs.Head, chs.Cylinder, chs.Sector,
|
chs.Head, (UWORD)chs.Cylinder, chs.Sector,
|
||||||
count, transfer_address);
|
count, transfer_address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,4 +10,4 @@
|
|||||||
#include "init-mod.h"
|
#include "init-mod.h"
|
||||||
#include "dyndata.h"
|
#include "dyndata.h"
|
||||||
|
|
||||||
struct DynS Dyn;
|
struct DynS Dyn = {0};
|
||||||
|
@ -15,5 +15,5 @@ void DynFree(void *ptr);
|
|||||||
|
|
||||||
struct DynS {
|
struct DynS {
|
||||||
unsigned Allocated;
|
unsigned Allocated;
|
||||||
char Buffer[0];
|
char Buffer[1];
|
||||||
};
|
};
|
||||||
|
@ -48,7 +48,16 @@ additionally:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*extern struct DynS FAR Dyn;*/
|
||||||
|
|
||||||
|
#ifndef __TURBOC__
|
||||||
|
#include "init-dat.h"
|
||||||
|
extern struct DynS DOSFAR Dyn;
|
||||||
|
#else
|
||||||
extern struct DynS FAR Dyn;
|
extern struct DynS FAR Dyn;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void far *DynAlloc(char *what, unsigned num, unsigned size)
|
void far *DynAlloc(char *what, unsigned num, unsigned size)
|
||||||
{
|
{
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
; $Id$
|
; $Id$
|
||||||
;
|
;
|
||||||
; $Log$
|
; $Log$
|
||||||
|
; Revision 1.14 2001/09/23 20:39:44 bartoldeman
|
||||||
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
;
|
||||||
; Revision 1.13 2001/04/21 22:32:53 bartoldeman
|
; Revision 1.13 2001/04/21 22:32:53 bartoldeman
|
||||||
; Init DS=Init CS, fixed stack overflow problems and misc bugs.
|
; Init DS=Init CS, fixed stack overflow problems and misc bugs.
|
||||||
;
|
;
|
||||||
@ -111,10 +114,6 @@ segment HMA_TEXT
|
|||||||
extern _MachineId:wrt DGROUP
|
extern _MachineId:wrt DGROUP
|
||||||
extern critical_sp:wrt DGROUP
|
extern critical_sp:wrt DGROUP
|
||||||
|
|
||||||
extern _api_sp:wrt DGROUP ; api stacks - for context
|
|
||||||
extern _api_ss:wrt DGROUP ; switching
|
|
||||||
extern _usr_sp:wrt DGROUP ; user stacks
|
|
||||||
extern _usr_ss:wrt DGROUP
|
|
||||||
extern int21regs_seg:wrt DGROUP
|
extern int21regs_seg:wrt DGROUP
|
||||||
extern int21regs_off:wrt DGROUP
|
extern int21regs_off:wrt DGROUP
|
||||||
|
|
||||||
@ -487,33 +486,28 @@ int2526:
|
|||||||
mov bx, DGROUP
|
mov bx, DGROUP
|
||||||
mov ds, bx
|
mov ds, bx
|
||||||
|
|
||||||
; save away foreground process' stack
|
|
||||||
push word [_usr_ss]
|
|
||||||
push word [_usr_sp]
|
|
||||||
|
|
||||||
mov word [_usr_ss],ss
|
|
||||||
mov word [_usr_sp],sp
|
|
||||||
|
|
||||||
; setup our local stack
|
; setup our local stack
|
||||||
cli
|
cli
|
||||||
mov ss,bx
|
mov ss,bx
|
||||||
mov sp,_disk_api_tos
|
mov sp,_disk_api_tos
|
||||||
sti
|
sti
|
||||||
|
|
||||||
|
push dx
|
||||||
|
push cx ; save user stack
|
||||||
|
|
||||||
push dx ; SS:SP -> user stack
|
push dx ; SS:SP -> user stack
|
||||||
push cx
|
push cx
|
||||||
push ax ; was set on entry = 25,26
|
push ax ; was set on entry = 25,26
|
||||||
call _int2526_handler
|
call _int2526_handler
|
||||||
add sp, byte 4
|
add sp, byte 6
|
||||||
|
|
||||||
|
pop cx
|
||||||
|
pop dx ; restore user stack
|
||||||
|
|
||||||
; restore foreground stack here
|
; restore foreground stack here
|
||||||
cli
|
cli
|
||||||
mov ss,word [_usr_ss]
|
mov ss, dx
|
||||||
mov sp,word [_usr_sp]
|
mov sp, cx
|
||||||
|
|
||||||
pop word [_usr_sp]
|
|
||||||
pop word [_usr_ss]
|
|
||||||
|
|
||||||
pop es
|
pop es
|
||||||
pop ds
|
pop ds
|
||||||
@ -593,10 +587,6 @@ CritErr05:
|
|||||||
push word [_MachineId]
|
push word [_MachineId]
|
||||||
push word [int21regs_seg]
|
push word [int21regs_seg]
|
||||||
push word [int21regs_off]
|
push word [int21regs_off]
|
||||||
push word [_api_sp]
|
|
||||||
push word [_api_ss]
|
|
||||||
push word [_usr_sp]
|
|
||||||
push word [_usr_ss]
|
|
||||||
push word [_user_r+2]
|
push word [_user_r+2]
|
||||||
push word [_user_r]
|
push word [_user_r]
|
||||||
mov [critical_sp],sp
|
mov [critical_sp],sp
|
||||||
@ -626,10 +616,6 @@ CritErr05:
|
|||||||
mov sp,[critical_sp]
|
mov sp,[critical_sp]
|
||||||
pop word [_user_r]
|
pop word [_user_r]
|
||||||
pop word [_user_r+2]
|
pop word [_user_r+2]
|
||||||
pop word [_usr_ss]
|
|
||||||
pop word [_usr_sp]
|
|
||||||
pop word [_api_ss]
|
|
||||||
pop word [_api_sp]
|
|
||||||
pop word [int21regs_off]
|
pop word [int21regs_off]
|
||||||
pop word [int21regs_seg]
|
pop word [int21regs_seg]
|
||||||
pop word [_MachineId]
|
pop word [_MachineId]
|
||||||
|
@ -36,6 +36,9 @@ static BYTE *fatdirRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.23 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.22 2001/08/19 12:58:36 bartoldeman
|
* Revision 1.22 2001/08/19 12:58:36 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -280,6 +283,18 @@ f_node_ptr dir_open(BYTE * dirname)
|
|||||||
/* Set the root flags since we always start from the root */
|
/* Set the root flags since we always start from the root */
|
||||||
|
|
||||||
fnp->f_flags.f_droot = TRUE;
|
fnp->f_flags.f_droot = TRUE;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (ISFAT32(fnp->f_dpb)) {
|
||||||
|
fnp->f_flags.f_droot = FALSE;
|
||||||
|
fnp->f_flags.f_ddir = TRUE;
|
||||||
|
fnp->f_offset = 0l;
|
||||||
|
fnp->f_cluster_offset = 0l;
|
||||||
|
fnp->f_highwater = 0l;
|
||||||
|
fnp->f_cluster = fnp->f_dpb->dpb_xrootclst;
|
||||||
|
fnp->f_dirstart = fnp->f_dpb->dpb_xrootclst;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (p = pszPath; *p != '\0';)
|
for (p = pszPath; *p != '\0';)
|
||||||
{
|
{
|
||||||
/* skip all path seperators */
|
/* skip all path seperators */
|
||||||
@ -349,8 +364,8 @@ f_node_ptr dir_open(BYTE * dirname)
|
|||||||
fnp->f_offset = 0l;
|
fnp->f_offset = 0l;
|
||||||
fnp->f_cluster_offset = 0l; /*JPP */
|
fnp->f_cluster_offset = 0l; /*JPP */
|
||||||
fnp->f_highwater = 0l;
|
fnp->f_highwater = 0l;
|
||||||
fnp->f_cluster = fnp->f_dir.dir_start;
|
fnp->f_cluster = getdstart(fnp->f_dir);
|
||||||
fnp->f_dirstart = fnp->f_dir.dir_start;
|
fnp->f_dirstart = fnp->f_cluster;
|
||||||
/* reset the directory flags */
|
/* reset the directory flags */
|
||||||
fnp->f_diroff = 0l;
|
fnp->f_diroff = 0l;
|
||||||
fnp->f_flags.f_dmod = FALSE;
|
fnp->f_flags.f_dmod = FALSE;
|
||||||
@ -564,6 +579,9 @@ COUNT dir_write(REG f_node_ptr fnp)
|
|||||||
release_f_node(fnp);
|
release_f_node(fnp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fnp->f_flags.f_dnew && fnp->f_dir.dir_attrib != D_LFN)
|
||||||
|
fmemset(&fnp->f_dir.dir_case, 0, 8);
|
||||||
putdirent((struct dirent FAR *)&fnp->f_dir,
|
putdirent((struct dirent FAR *)&fnp->f_dir,
|
||||||
(VOID FAR *) & bp->b_buffer[(UWORD)fnp->f_diroff % fnp->f_dpb->dpb_secsize]);
|
(VOID FAR *) & bp->b_buffer[(UWORD)fnp->f_diroff % fnp->f_dpb->dpb_secsize]);
|
||||||
|
|
||||||
@ -690,8 +708,7 @@ COUNT dos_findfirst(UCOUNT attr, BYTE *name)
|
|||||||
/* Test the attribute and return first found */
|
/* Test the attribute and return first found */
|
||||||
if ((fnp->f_dir.dir_attrib & ~(D_RDONLY | D_ARCHIVE)) == D_VOLID)
|
if ((fnp->f_dir.dir_attrib & ~(D_RDONLY | D_ARCHIVE)) == D_VOLID)
|
||||||
{
|
{
|
||||||
dmp->dm_dirstart= fnp->f_dirstart;
|
dmp->dm_dircluster = fnp->f_dirstart; /* TE */
|
||||||
dmp->dm_cluster = fnp->f_dir.dir_start; /* TE */
|
|
||||||
memcpy(&SearchDir, &fnp->f_dir, sizeof(struct dirent));
|
memcpy(&SearchDir, &fnp->f_dir, sizeof(struct dirent));
|
||||||
dir_close(fnp);
|
dir_close(fnp);
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
@ -708,15 +725,9 @@ COUNT dos_findfirst(UCOUNT attr, BYTE *name)
|
|||||||
{
|
{
|
||||||
dmp->dm_entry = 0;
|
dmp->dm_entry = 0;
|
||||||
if (!fnp->f_flags.f_droot)
|
if (!fnp->f_flags.f_droot)
|
||||||
{
|
dmp->dm_dircluster = fnp->f_dirstart;
|
||||||
dmp->dm_cluster = fnp->f_dirstart;
|
|
||||||
dmp->dm_dirstart = fnp->f_dirstart;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
dmp->dm_dircluster = 0;
|
||||||
dmp->dm_cluster = 0;
|
|
||||||
dmp->dm_dirstart = 0;
|
|
||||||
}
|
|
||||||
dir_close(fnp);
|
dir_close(fnp);
|
||||||
return dos_findnext();
|
return dos_findnext();
|
||||||
}
|
}
|
||||||
@ -773,10 +784,13 @@ COUNT dos_findnext(void)
|
|||||||
|
|
||||||
fnp->f_offset = fnp->f_diroff;
|
fnp->f_offset = fnp->f_diroff;
|
||||||
|
|
||||||
fnp->f_dirstart =
|
fnp->f_dir.dir_start = dmp->dm_dircluster;
|
||||||
fnp->f_dir.dir_start =
|
#ifdef WITHFAT32
|
||||||
fnp->f_cluster =
|
fnp->f_dir.dir_start_high = dmp->dm_dircluster >> 16;
|
||||||
dmp->dm_dirstart;
|
#endif
|
||||||
|
|
||||||
|
fnp->f_cluster = fnp->f_dirstart =
|
||||||
|
dmp->dm_dircluster;
|
||||||
|
|
||||||
fnp->f_flags.f_droot = fnp->f_dirstart == 0;
|
fnp->f_flags.f_droot = fnp->f_dirstart == 0;
|
||||||
fnp->f_flags.f_ddir = TRUE;
|
fnp->f_flags.f_ddir = TRUE;
|
||||||
@ -790,7 +804,8 @@ COUNT dos_findnext(void)
|
|||||||
while (dir_read(fnp) == DIRENT_SIZE)
|
while (dir_read(fnp) == DIRENT_SIZE)
|
||||||
{
|
{
|
||||||
++dmp->dm_entry;
|
++dmp->dm_entry;
|
||||||
if (fnp->f_dir.dir_name[0] != '\0' && fnp->f_dir.dir_name[0] != DELETED)
|
if (fnp->f_dir.dir_name[0] != '\0' && fnp->f_dir.dir_name[0] != DELETED
|
||||||
|
&& (fnp->f_dir.dir_attrib & D_VOLID) != D_VOLID )
|
||||||
{
|
{
|
||||||
if (fcmp_wild((BYTE FAR *)dmp->dm_name_pat, (BYTE FAR *)fnp->f_dir.dir_name, FNAME_SIZE + FEXT_SIZE))
|
if (fcmp_wild((BYTE FAR *)dmp->dm_name_pat, (BYTE FAR *)fnp->f_dir.dir_name, FNAME_SIZE + FEXT_SIZE))
|
||||||
{
|
{
|
||||||
@ -817,8 +832,7 @@ COUNT dos_findnext(void)
|
|||||||
/* If found, transfer it to the dmatch structure */
|
/* If found, transfer it to the dmatch structure */
|
||||||
if (found)
|
if (found)
|
||||||
{
|
{
|
||||||
dmp->dm_dirstart= fnp->f_dirstart;
|
dmp->dm_dircluster = fnp->f_dirstart;
|
||||||
dmp->dm_cluster = fnp->f_dir.dir_start; /* TE */
|
|
||||||
memcpy(&SearchDir, &fnp->f_dir, sizeof(struct dirent));
|
memcpy(&SearchDir, &fnp->f_dir, sizeof(struct dirent));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -891,5 +905,4 @@ int FileName83Length(BYTE *filename83)
|
|||||||
ConvertName83ToNameSZ(buff, filename83);
|
ConvertName83ToNameSZ(buff, filename83);
|
||||||
|
|
||||||
return strlen(buff);
|
return strlen(buff);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
243
kernel/fatfs.c
243
kernel/fatfs.c
@ -47,6 +47,9 @@ BYTE *RcsId = "$Id$";
|
|||||||
* performance killer on large drives. (~0.5 sec /dos_mkdir) TE
|
* performance killer on large drives. (~0.5 sec /dos_mkdir) TE
|
||||||
*
|
*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.24 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.23 2001/08/19 12:58:36 bartoldeman
|
* Revision 1.23 2001/08/19 12:58:36 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -267,7 +270,7 @@ STATIC void copy_file_changes(f_node_ptr src, f_node_ptr dst);
|
|||||||
date dos_getdate(VOID);
|
date dos_getdate(VOID);
|
||||||
time dos_gettime(VOID);
|
time dos_gettime(VOID);
|
||||||
BOOL find_free(f_node_ptr);
|
BOOL find_free(f_node_ptr);
|
||||||
UWORD find_fat_free(f_node_ptr);
|
CLUSTER find_fat_free(f_node_ptr);
|
||||||
VOID wipe_out(f_node_ptr);
|
VOID wipe_out(f_node_ptr);
|
||||||
BOOL last_link(f_node_ptr);
|
BOOL last_link(f_node_ptr);
|
||||||
BOOL extend(f_node_ptr);
|
BOOL extend(f_node_ptr);
|
||||||
@ -318,9 +321,6 @@ COUNT dos_open(BYTE * path, COUNT flag)
|
|||||||
fnp->f_highwater = fnp->f_dir.dir_size;
|
fnp->f_highwater = fnp->f_dir.dir_size;
|
||||||
|
|
||||||
fnp->f_back = LONG_LAST_CLUSTER;
|
fnp->f_back = LONG_LAST_CLUSTER;
|
||||||
/* /// Moved to below. - Ron Cemer
|
|
||||||
fnp->f_cluster = fnp->f_dir.dir_start;
|
|
||||||
fnp->f_cluster_offset = 0l; */ /*JPP */
|
|
||||||
|
|
||||||
fnp->f_flags.f_dmod = FALSE;
|
fnp->f_flags.f_dmod = FALSE;
|
||||||
fnp->f_flags.f_dnew = FALSE;
|
fnp->f_flags.f_dnew = FALSE;
|
||||||
@ -329,7 +329,7 @@ COUNT dos_open(BYTE * path, COUNT flag)
|
|||||||
merge_file_changes(fnp, TRUE); /* /// Added - Ron Cemer */
|
merge_file_changes(fnp, TRUE); /* /// Added - Ron Cemer */
|
||||||
|
|
||||||
/* /// Moved from above. - Ron Cemer */
|
/* /// Moved from above. - Ron Cemer */
|
||||||
fnp->f_cluster = fnp->f_dir.dir_start;
|
fnp->f_cluster = getdstart(fnp->f_dir);
|
||||||
fnp->f_cluster_offset = 0l; /*JPP */
|
fnp->f_cluster_offset = 0l; /*JPP */
|
||||||
|
|
||||||
return xlt_fnp(fnp);
|
return xlt_fnp(fnp);
|
||||||
@ -488,6 +488,55 @@ STATIC BOOL find_fname(f_node_ptr fnp, BYTE * fname, BYTE * fext)
|
|||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* STATIC BOOL find_full_fname(f_node_ptr fnp, f_node_ptr lfnp, BYTE * fname,
|
||||||
|
BYTE * fext)
|
||||||
|
{
|
||||||
|
BOOL found = FALSE;
|
||||||
|
|
||||||
|
lfnp->f_cluster = LONG_LAST_CLUSTER;
|
||||||
|
while (dir_read(fnp) == DIRENT_SIZE)
|
||||||
|
{
|
||||||
|
if (fnp->f_dir.dir_name[0] != '\0')
|
||||||
|
{
|
||||||
|
if (fnp->f_dir.dir_name[0] == DELETED)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (fnp->f_dir.dir_attrib != 0xf) lfnp->f_cluster = LONG_LAST_CLUSTER;
|
||||||
|
else if (lfnp->f_cluster == LONG_LAST_CLUSTER)
|
||||||
|
memcpy(lfnp, struct fnp, sizeof(f_node));
|
||||||
|
|
||||||
|
if (fcmp(fname, (BYTE *)fnp->f_dir.dir_name, FNAME_SIZE)
|
||||||
|
&& fcmp(fext, (BYTE *)fnp->f_dir.dir_ext, FEXT_SIZE)
|
||||||
|
&& ((fnp->f_dir.dir_attrib & D_VOLID) == 0))
|
||||||
|
{
|
||||||
|
found = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
} */
|
||||||
|
|
||||||
|
/* input: fnp with valid non-LFN directory entry, not equal to '..' or
|
||||||
|
'.' */
|
||||||
|
void remove_lfn_entries(f_node_ptr fnp)
|
||||||
|
{
|
||||||
|
ULONG original_diroff = fnp->f_diroff;
|
||||||
|
while (TRUE) {
|
||||||
|
if(fnp->f_diroff == 0) break;
|
||||||
|
fnp->f_diroff -= 2*DIRENT_SIZE;
|
||||||
|
/* it cannot / should not get below 0 because of '.' and '..'
|
||||||
|
but maybe add another check for robustness */
|
||||||
|
dir_read(fnp);
|
||||||
|
if (fnp->f_dir.dir_attrib != D_LFN)
|
||||||
|
break;
|
||||||
|
fnp->f_dir.dir_name[0] = DELETED;
|
||||||
|
fnp->f_flags.f_dmod = TRUE;
|
||||||
|
dir_write(fnp);
|
||||||
|
}
|
||||||
|
fnp->f_diroff = original_diroff - DIRENT_SIZE;
|
||||||
|
dir_read(fnp);
|
||||||
|
}
|
||||||
/* /// Added - Ron Cemer */
|
/* /// Added - Ron Cemer */
|
||||||
/* If more than one f_node has a file open, and a write
|
/* If more than one f_node has a file open, and a write
|
||||||
occurs, this function must be called to propagate the
|
occurs, this function must be called to propagate the
|
||||||
@ -551,6 +600,9 @@ STATIC int is_same_file(f_node_ptr fnp1, f_node_ptr fnp2) {
|
|||||||
STATIC void copy_file_changes(f_node_ptr src, f_node_ptr dst) {
|
STATIC void copy_file_changes(f_node_ptr src, f_node_ptr dst) {
|
||||||
dst->f_highwater = src->f_highwater;
|
dst->f_highwater = src->f_highwater;
|
||||||
dst->f_dir.dir_start = src->f_dir.dir_start;
|
dst->f_dir.dir_start = src->f_dir.dir_start;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
dst->f_dir.dir_start_high = src->f_dir.dir_start_high;
|
||||||
|
#endif
|
||||||
dst->f_dir.dir_size = src->f_dir.dir_size;
|
dst->f_dir.dir_size = src->f_dir.dir_size;
|
||||||
dst->f_dir.dir_date = src->f_dir.dir_date;
|
dst->f_dir.dir_date = src->f_dir.dir_date;
|
||||||
dst->f_dir.dir_time = src->f_dir.dir_time;
|
dst->f_dir.dir_time = src->f_dir.dir_time;
|
||||||
@ -631,7 +683,7 @@ COUNT dos_creat(BYTE * path, COUNT attrib)
|
|||||||
fnp->f_mode = RDWR;
|
fnp->f_mode = RDWR;
|
||||||
|
|
||||||
fnp->f_dir.dir_size = 0l;
|
fnp->f_dir.dir_size = 0l;
|
||||||
fnp->f_dir.dir_start = FREE;
|
setdstart(fnp->f_dir, FREE);
|
||||||
fnp->f_dir.dir_attrib = attrib | D_ARCHIVE;
|
fnp->f_dir.dir_attrib = attrib | D_ARCHIVE;
|
||||||
fnp->f_dir.dir_time = dos_gettime();
|
fnp->f_dir.dir_time = dos_gettime();
|
||||||
fnp->f_dir.dir_date = dos_getdate();
|
fnp->f_dir.dir_date = dos_getdate();
|
||||||
@ -651,7 +703,8 @@ COUNT dos_creat(BYTE * path, COUNT attrib)
|
|||||||
fnp->f_highwater = 0l;
|
fnp->f_highwater = 0l;
|
||||||
|
|
||||||
fnp->f_back = LONG_LAST_CLUSTER;
|
fnp->f_back = LONG_LAST_CLUSTER;
|
||||||
fnp->f_cluster = fnp->f_dir.dir_start = FREE;
|
fnp->f_cluster = FREE;
|
||||||
|
setdstart(fnp->f_dir, FREE);
|
||||||
fnp->f_cluster_offset = 0l; /*JPP */
|
fnp->f_cluster_offset = 0l; /*JPP */
|
||||||
fnp->f_flags.f_dmod = TRUE;
|
fnp->f_flags.f_dmod = TRUE;
|
||||||
fnp->f_flags.f_ddate = FALSE;
|
fnp->f_flags.f_ddate = FALSE;
|
||||||
@ -691,6 +744,7 @@ COUNT dos_delete(BYTE * path)
|
|||||||
/* Ok, so we can delete. Start out by */
|
/* Ok, so we can delete. Start out by */
|
||||||
/* clobbering all FAT entries for this file */
|
/* clobbering all FAT entries for this file */
|
||||||
/* (or, in English, truncate the FAT). */
|
/* (or, in English, truncate the FAT). */
|
||||||
|
remove_lfn_entries(fnp);
|
||||||
wipe_out(fnp);
|
wipe_out(fnp);
|
||||||
fnp->f_dir.dir_size = 0l;
|
fnp->f_dir.dir_size = 0l;
|
||||||
*(fnp->f_dir.dir_name) = DELETED;
|
*(fnp->f_dir.dir_name) = DELETED;
|
||||||
@ -745,11 +799,11 @@ COUNT dos_rmdir(BYTE * path)
|
|||||||
has many 'archive' directories
|
has many 'archive' directories
|
||||||
we still don't allow RDONLY directories to be deleted TE*/
|
we still don't allow RDONLY directories to be deleted TE*/
|
||||||
|
|
||||||
if (fnp->f_dir.dir_attrib & ~(D_DIR |D_HIDDEN|D_ARCHIVE|D_SYSTEM))
|
/* if (fnp->f_dir.dir_attrib & ~(D_DIR |D_HIDDEN|D_ARCHIVE|D_SYSTEM))
|
||||||
{
|
{
|
||||||
dir_close(fnp);
|
dir_close(fnp);
|
||||||
return DE_ACCESS;
|
return DE_ACCESS;
|
||||||
}
|
} */
|
||||||
|
|
||||||
/* Check that the directory is empty. Only the */
|
/* Check that the directory is empty. Only the */
|
||||||
/* "." and ".." are permissable. */
|
/* "." and ".." are permissable. */
|
||||||
@ -776,7 +830,7 @@ COUNT dos_rmdir(BYTE * path)
|
|||||||
{
|
{
|
||||||
if (fnp1->f_dir.dir_name[0] == '\0')
|
if (fnp1->f_dir.dir_name[0] == '\0')
|
||||||
break;
|
break;
|
||||||
if (fnp1->f_dir.dir_name[0] == DELETED)
|
if (fnp1->f_dir.dir_name[0] == DELETED || fnp1->f_dir.dir_attrib == D_LFN)
|
||||||
continue;
|
continue;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -796,6 +850,7 @@ COUNT dos_rmdir(BYTE * path)
|
|||||||
/* Ok, so we can delete. Start out by */
|
/* Ok, so we can delete. Start out by */
|
||||||
/* clobbering all FAT entries for this file */
|
/* clobbering all FAT entries for this file */
|
||||||
/* (or, in English, truncate the FAT). */
|
/* (or, in English, truncate the FAT). */
|
||||||
|
remove_lfn_entries(fnp);
|
||||||
wipe_out(fnp);
|
wipe_out(fnp);
|
||||||
fnp->f_dir.dir_size = 0l;
|
fnp->f_dir.dir_size = 0l;
|
||||||
*(fnp->f_dir.dir_name) = DELETED;
|
*(fnp->f_dir.dir_name) = DELETED;
|
||||||
@ -880,6 +935,7 @@ COUNT dos_rename(BYTE * path1, BYTE * path2)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
remove_lfn_entries(fnp1);
|
||||||
|
|
||||||
/* put the fnode's name into the directory. */
|
/* put the fnode's name into the directory. */
|
||||||
bcopy(szFileName, (BYTE *)fnp2->f_dir.dir_name, FNAME_SIZE);
|
bcopy(szFileName, (BYTE *)fnp2->f_dir.dir_name, FNAME_SIZE);
|
||||||
@ -888,6 +944,9 @@ COUNT dos_rename(BYTE * path1, BYTE * path2)
|
|||||||
/* Set the fnode to the desired mode */
|
/* Set the fnode to the desired mode */
|
||||||
fnp2->f_dir.dir_size = fnp1->f_dir.dir_size;
|
fnp2->f_dir.dir_size = fnp1->f_dir.dir_size;
|
||||||
fnp2->f_dir.dir_start = fnp1->f_dir.dir_start;
|
fnp2->f_dir.dir_start = fnp1->f_dir.dir_start;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
fnp2->f_dir.dir_start_high = fnp1->f_dir.dir_start_high;
|
||||||
|
#endif
|
||||||
fnp2->f_dir.dir_attrib = fnp1->f_dir.dir_attrib;
|
fnp2->f_dir.dir_attrib = fnp1->f_dir.dir_attrib;
|
||||||
fnp2->f_dir.dir_time = fnp1->f_dir.dir_time;
|
fnp2->f_dir.dir_time = fnp1->f_dir.dir_time;
|
||||||
fnp2->f_dir.dir_date = fnp1->f_dir.dir_date;
|
fnp2->f_dir.dir_date = fnp1->f_dir.dir_date;
|
||||||
@ -916,22 +975,18 @@ COUNT dos_rename(BYTE * path1, BYTE * path2)
|
|||||||
/* */
|
/* */
|
||||||
STATIC VOID wipe_out(f_node_ptr fnp)
|
STATIC VOID wipe_out(f_node_ptr fnp)
|
||||||
{
|
{
|
||||||
REG UWORD st,
|
REG CLUSTER st,
|
||||||
next;
|
next;
|
||||||
struct dpb FAR *dpbp = fnp->f_dpb;
|
struct dpb FAR *dpbp = fnp->f_dpb;
|
||||||
|
|
||||||
/* if already free or not valid file, just exit */
|
/* if already free or not valid file, just exit */
|
||||||
if ((fnp == NULL) || (fnp->f_dir.dir_start == FREE))
|
if ((fnp == NULL) || checkdstart(fnp->f_dir, FREE))
|
||||||
return;
|
|
||||||
|
|
||||||
/* if there are no FAT entries, just exit */
|
|
||||||
if (fnp->f_dir.dir_start == FREE)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Loop from start until either a FREE entry is */
|
/* Loop from start until either a FREE entry is */
|
||||||
/* encountered (due to a fractured file system) of the */
|
/* encountered (due to a fractured file system) of the */
|
||||||
/* last cluster is encountered. */
|
/* last cluster is encountered. */
|
||||||
for (st = fnp->f_dir.dir_start;
|
for (st = getdstart(fnp->f_dir);
|
||||||
st != LONG_LAST_CLUSTER;)
|
st != LONG_LAST_CLUSTER;)
|
||||||
{
|
{
|
||||||
/* get the next cluster pointed to */
|
/* get the next cluster pointed to */
|
||||||
@ -952,6 +1007,9 @@ STATIC VOID wipe_out(f_node_ptr fnp)
|
|||||||
/* and just follow the linked list */
|
/* and just follow the linked list */
|
||||||
st = next;
|
st = next;
|
||||||
}
|
}
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (ISFAT32(dpbp)) write_fsinfo(dpbp);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC BOOL find_free(f_node_ptr fnp)
|
STATIC BOOL find_free(f_node_ptr fnp)
|
||||||
@ -1139,9 +1197,9 @@ BOOL dos_setfsize(COUNT fd, LONG size)
|
|||||||
/* */
|
/* */
|
||||||
/* Find free cluster in disk FAT table */
|
/* Find free cluster in disk FAT table */
|
||||||
/* */
|
/* */
|
||||||
STATIC UWORD find_fat_free(f_node_ptr fnp)
|
STATIC CLUSTER find_fat_free(f_node_ptr fnp)
|
||||||
{
|
{
|
||||||
REG UWORD idx;
|
REG CLUSTER idx;
|
||||||
|
|
||||||
#ifdef DISPLAY_GETBLOCK
|
#ifdef DISPLAY_GETBLOCK
|
||||||
printf("[find_fat_free]\n");
|
printf("[find_fat_free]\n");
|
||||||
@ -1152,6 +1210,7 @@ STATIC UWORD find_fat_free(f_node_ptr fnp)
|
|||||||
else
|
else
|
||||||
idx = 2;
|
idx = 2;
|
||||||
|
|
||||||
|
|
||||||
/* Search the FAT table looking for the first free */
|
/* Search the FAT table looking for the first free */
|
||||||
/* entry. */
|
/* entry. */
|
||||||
for (; idx <= fnp->f_dpb->dpb_size; idx++)
|
for (; idx <= fnp->f_dpb->dpb_size; idx++)
|
||||||
@ -1164,6 +1223,9 @@ STATIC UWORD find_fat_free(f_node_ptr fnp)
|
|||||||
if (idx > fnp->f_dpb->dpb_size)
|
if (idx > fnp->f_dpb->dpb_size)
|
||||||
{
|
{
|
||||||
fnp->f_dpb->dpb_cluster = UNKNCLUSTER;
|
fnp->f_dpb->dpb_cluster = UNKNCLUSTER;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (ISFAT32(fnp->f_dpb)) write_fsinfo(fnp->f_dpb);
|
||||||
|
#endif
|
||||||
dir_close(fnp);
|
dir_close(fnp);
|
||||||
return LONG_LAST_CLUSTER;
|
return LONG_LAST_CLUSTER;
|
||||||
}
|
}
|
||||||
@ -1173,6 +1235,9 @@ STATIC UWORD find_fat_free(f_node_ptr fnp)
|
|||||||
|
|
||||||
/* return the free entry */
|
/* return the free entry */
|
||||||
fnp->f_dpb->dpb_cluster = idx;
|
fnp->f_dpb->dpb_cluster = idx;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (ISFAT32(fnp->f_dpb)) write_fsinfo(fnp->f_dpb);
|
||||||
|
#endif
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1185,8 +1250,7 @@ COUNT dos_mkdir(BYTE * dir)
|
|||||||
REG f_node_ptr fnp;
|
REG f_node_ptr fnp;
|
||||||
REG COUNT idx;
|
REG COUNT idx;
|
||||||
struct buffer FAR *bp;
|
struct buffer FAR *bp;
|
||||||
UWORD free_fat;
|
CLUSTER free_fat, parent;
|
||||||
UWORD parent;
|
|
||||||
COUNT ret;
|
COUNT ret;
|
||||||
|
|
||||||
/* first split the passed dir into comopnents (i.e. - */
|
/* first split the passed dir into comopnents (i.e. - */
|
||||||
@ -1274,7 +1338,6 @@ COUNT dos_mkdir(BYTE * dir)
|
|||||||
fnp->f_back = LONG_LAST_CLUSTER;
|
fnp->f_back = LONG_LAST_CLUSTER;
|
||||||
|
|
||||||
fnp->f_dir.dir_size = 0l;
|
fnp->f_dir.dir_size = 0l;
|
||||||
fnp->f_dir.dir_start = FREE;
|
|
||||||
fnp->f_dir.dir_attrib = D_DIR;
|
fnp->f_dir.dir_attrib = D_DIR;
|
||||||
fnp->f_dir.dir_time = dos_gettime();
|
fnp->f_dir.dir_time = dos_gettime();
|
||||||
fnp->f_dir.dir_date = dos_getdate();
|
fnp->f_dir.dir_date = dos_getdate();
|
||||||
@ -1288,8 +1351,9 @@ COUNT dos_mkdir(BYTE * dir)
|
|||||||
|
|
||||||
|
|
||||||
/* Mark the cluster in the FAT as used */
|
/* Mark the cluster in the FAT as used */
|
||||||
fnp->f_dir.dir_start = fnp->f_cluster = free_fat;
|
fnp->f_cluster = free_fat;
|
||||||
link_fat(fnp->f_dpb, (UCOUNT) free_fat, LONG_LAST_CLUSTER);
|
setdstart(fnp->f_dir, free_fat);
|
||||||
|
link_fat(fnp->f_dpb, free_fat, LONG_LAST_CLUSTER);
|
||||||
|
|
||||||
/* Craft the new directory. Note that if we're in a new */
|
/* Craft the new directory. Note that if we're in a new */
|
||||||
/* directory just under the root, ".." pointer is 0. */
|
/* directory just under the root, ".." pointer is 0. */
|
||||||
@ -1313,7 +1377,7 @@ COUNT dos_mkdir(BYTE * dir)
|
|||||||
DirEntBuffer.dir_attrib = D_DIR;
|
DirEntBuffer.dir_attrib = D_DIR;
|
||||||
DirEntBuffer.dir_time = dos_gettime();
|
DirEntBuffer.dir_time = dos_gettime();
|
||||||
DirEntBuffer.dir_date = dos_getdate();
|
DirEntBuffer.dir_date = dos_getdate();
|
||||||
DirEntBuffer.dir_start = free_fat;
|
setdstart(DirEntBuffer, free_fat);
|
||||||
DirEntBuffer.dir_size = 0l;
|
DirEntBuffer.dir_size = 0l;
|
||||||
|
|
||||||
/* And put it out */
|
/* And put it out */
|
||||||
@ -1321,7 +1385,12 @@ COUNT dos_mkdir(BYTE * dir)
|
|||||||
|
|
||||||
/* create the ".." entry */
|
/* create the ".." entry */
|
||||||
bcopy(".. ", (BYTE *) DirEntBuffer.dir_name, FNAME_SIZE);
|
bcopy(".. ", (BYTE *) DirEntBuffer.dir_name, FNAME_SIZE);
|
||||||
DirEntBuffer.dir_start = parent;
|
#ifdef WITHFAT32
|
||||||
|
if (ISFAT32(fnp->f_dpb) && parent == fnp->f_dpb->dpb_xrootclst) {
|
||||||
|
parent = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
setdstart(DirEntBuffer, parent);
|
||||||
|
|
||||||
/* and put it out */
|
/* and put it out */
|
||||||
putdirent((struct dirent FAR *)&DirEntBuffer, (BYTE FAR *) & bp->b_buffer[DIRENT_SIZE]);
|
putdirent((struct dirent FAR *)&DirEntBuffer, (BYTE FAR *) & bp->b_buffer[DIRENT_SIZE]);
|
||||||
@ -1337,7 +1406,7 @@ COUNT dos_mkdir(BYTE * dir)
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* as we are overwriting it completely, don't read first */
|
/* as we are overwriting it completely, don't read first */
|
||||||
bp = getblockOver((ULONG) clus2phys(fnp->f_dir.dir_start,
|
bp = getblockOver((ULONG) clus2phys(getdstart(fnp->f_dir),
|
||||||
(fnp->f_dpb->dpb_clsmask + 1),
|
(fnp->f_dpb->dpb_clsmask + 1),
|
||||||
fnp->f_dpb->dpb_data) + idx,
|
fnp->f_dpb->dpb_data) + idx,
|
||||||
fnp->f_dpb->dpb_unit);
|
fnp->f_dpb->dpb_unit);
|
||||||
@ -1366,12 +1435,12 @@ COUNT dos_mkdir(BYTE * dir)
|
|||||||
|
|
||||||
BOOL last_link(f_node_ptr fnp)
|
BOOL last_link(f_node_ptr fnp)
|
||||||
{
|
{
|
||||||
return (((UWORD) fnp->f_cluster == (UWORD) LONG_LAST_CLUSTER));
|
return (fnp->f_cluster == LONG_LAST_CLUSTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC BOOL extend(f_node_ptr fnp)
|
STATIC BOOL extend(f_node_ptr fnp)
|
||||||
{
|
{
|
||||||
UWORD free_fat;
|
CLUSTER free_fat;
|
||||||
|
|
||||||
#ifdef DISPLAY_GETBLOCK
|
#ifdef DISPLAY_GETBLOCK
|
||||||
printf("extend\n");
|
printf("extend\n");
|
||||||
@ -1386,9 +1455,9 @@ STATIC BOOL extend(f_node_ptr fnp)
|
|||||||
|
|
||||||
/* Now that we've found a free FAT entry, mark it as the last */
|
/* Now that we've found a free FAT entry, mark it as the last */
|
||||||
/* entry and save. */
|
/* entry and save. */
|
||||||
link_fat(fnp->f_dpb, (UCOUNT) fnp->f_back, free_fat);
|
link_fat(fnp->f_dpb, fnp->f_back, free_fat);
|
||||||
fnp->f_cluster = free_fat;
|
fnp->f_cluster = free_fat;
|
||||||
link_fat(fnp->f_dpb, (UCOUNT) free_fat, LONG_LAST_CLUSTER);
|
link_fat(fnp->f_dpb, free_fat, LONG_LAST_CLUSTER);
|
||||||
|
|
||||||
/* Mark the directory so that the entry is updated */
|
/* Mark the directory so that the entry is updated */
|
||||||
fnp->f_flags.f_dmod = TRUE;
|
fnp->f_flags.f_dmod = TRUE;
|
||||||
@ -1445,7 +1514,7 @@ STATIC COUNT extend_dir(f_node_ptr fnp)
|
|||||||
/* JPP: finds the next free cluster in the FAT */
|
/* JPP: finds the next free cluster in the FAT */
|
||||||
STATIC BOOL first_fat(f_node_ptr fnp)
|
STATIC BOOL first_fat(f_node_ptr fnp)
|
||||||
{
|
{
|
||||||
UWORD free_fat;
|
CLUSTER free_fat;
|
||||||
|
|
||||||
/* get an empty cluster, so that we make it into a file. */
|
/* get an empty cluster, so that we make it into a file. */
|
||||||
free_fat = find_fat_free(fnp);
|
free_fat = find_fat_free(fnp);
|
||||||
@ -1459,9 +1528,9 @@ STATIC BOOL first_fat(f_node_ptr fnp)
|
|||||||
/* entry and save it. */
|
/* entry and save it. */
|
||||||
/* BUG!! this caused wrong allocation, if file was created,
|
/* BUG!! this caused wrong allocation, if file was created,
|
||||||
then seeked, then written */
|
then seeked, then written */
|
||||||
fnp->f_cluster =
|
fnp->f_cluster = free_fat;
|
||||||
fnp->f_dir.dir_start = free_fat;
|
setdstart(fnp->f_dir, free_fat);
|
||||||
link_fat(fnp->f_dpb, (UCOUNT) free_fat, LONG_LAST_CLUSTER);
|
link_fat(fnp->f_dpb, free_fat, LONG_LAST_CLUSTER);
|
||||||
|
|
||||||
/* Mark the directory so that the entry is updated */
|
/* Mark the directory so that the entry is updated */
|
||||||
fnp->f_flags.f_dmod = TRUE;
|
fnp->f_flags.f_dmod = TRUE;
|
||||||
@ -1485,12 +1554,13 @@ COUNT map_cluster(REG f_node_ptr fnp, COUNT mode)
|
|||||||
fnp->f_cluster_offset, fnp->f_offset,
|
fnp->f_cluster_offset, fnp->f_offset,
|
||||||
fnp->f_offset - fnp->f_cluster_offset);
|
fnp->f_offset - fnp->f_cluster_offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The variable clssize will be used later. */
|
/* The variable clssize will be used later. */
|
||||||
clssize = (ULONG)fnp->f_dpb->dpb_secsize * (fnp->f_dpb->dpb_clsmask + 1);
|
clssize = (ULONG)fnp->f_dpb->dpb_secsize * (fnp->f_dpb->dpb_clsmask + 1);
|
||||||
|
|
||||||
/* If someone did a seek, but no writes have occured, we will */
|
/* If someone did a seek, but no writes have occured, we will */
|
||||||
/* need to initialize the fnode. */
|
/* need to initialize the fnode. */
|
||||||
if ((mode == XFR_WRITE) && (fnp->f_dir.dir_start == FREE))
|
if ((mode == XFR_WRITE) && checkdstart(fnp->f_dir, FREE))
|
||||||
{
|
{
|
||||||
/* If there are no more free fat entries, then we are full! */
|
/* If there are no more free fat entries, then we are full! */
|
||||||
if (!first_fat(fnp))
|
if (!first_fat(fnp))
|
||||||
@ -1508,7 +1578,7 @@ COUNT map_cluster(REG f_node_ptr fnp, COUNT mode)
|
|||||||
idx = fnp->f_offset;
|
idx = fnp->f_offset;
|
||||||
|
|
||||||
fnp->f_cluster = fnp->f_flags.f_ddir ? fnp->f_dirstart :
|
fnp->f_cluster = fnp->f_flags.f_ddir ? fnp->f_dirstart :
|
||||||
fnp->f_dir.dir_start;
|
getdstart(fnp->f_dir);
|
||||||
fnp->f_cluster_offset = 0;
|
fnp->f_cluster_offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1532,7 +1602,6 @@ COUNT map_cluster(REG f_node_ptr fnp, COUNT mode)
|
|||||||
/* the last cluster marker. */
|
/* the last cluster marker. */
|
||||||
else if ((mode == XFR_WRITE) && last_link(fnp))
|
else if ((mode == XFR_WRITE) && last_link(fnp))
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!extend(fnp))
|
if (!extend(fnp))
|
||||||
{
|
{
|
||||||
dir_close(fnp);
|
dir_close(fnp);
|
||||||
@ -1545,6 +1614,7 @@ COUNT map_cluster(REG f_node_ptr fnp, COUNT mode)
|
|||||||
fnp->f_cluster = next_cluster(fnp->f_dpb, fnp->f_cluster);
|
fnp->f_cluster = next_cluster(fnp->f_dpb, fnp->f_cluster);
|
||||||
fnp->f_cluster_offset += clssize;
|
fnp->f_cluster_offset += clssize;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DISPLAY_GETBLOCK
|
#ifdef DISPLAY_GETBLOCK
|
||||||
printf("done.\n");
|
printf("done.\n");
|
||||||
#endif
|
#endif
|
||||||
@ -1627,7 +1697,7 @@ UCOUNT readblock(COUNT fd, VOID FAR * buffer, UCOUNT count, COUNT * err)
|
|||||||
/* initializing to the starting cluster and */
|
/* initializing to the starting cluster and */
|
||||||
/* setting all offsets to zero. */
|
/* setting all offsets to zero. */
|
||||||
fnp->f_cluster = fnp->f_flags.f_ddir ? fnp->f_dirstart :
|
fnp->f_cluster = fnp->f_flags.f_ddir ? fnp->f_dirstart :
|
||||||
fnp->f_dir.dir_start;
|
getdstart(fnp->f_dir);
|
||||||
|
|
||||||
fnp->f_cluster_offset = 0l;
|
fnp->f_cluster_offset = 0l;
|
||||||
fnp->f_back = LONG_LAST_CLUSTER;
|
fnp->f_back = LONG_LAST_CLUSTER;
|
||||||
@ -1679,7 +1749,7 @@ UCOUNT readblock(COUNT fd, VOID FAR * buffer, UCOUNT count, COUNT * err)
|
|||||||
fnp->f_boff = fnp->f_offset & (secsize - 1);
|
fnp->f_boff = fnp->f_offset & (secsize - 1);
|
||||||
|
|
||||||
#ifdef DSK_DEBUG
|
#ifdef DSK_DEBUG
|
||||||
printf("read %d links; dir offset %ld, cluster %d\n",
|
printf("read %d links; dir offset %ld, cluster %lx\n",
|
||||||
fnp->f_count,
|
fnp->f_count,
|
||||||
fnp->f_diroff,
|
fnp->f_diroff,
|
||||||
fnp->f_cluster);
|
fnp->f_cluster);
|
||||||
@ -1853,7 +1923,7 @@ UCOUNT writeblock(COUNT fd, VOID FAR * buffer, UCOUNT count, COUNT * err)
|
|||||||
/* will have a start cluster of FREE. If we're */
|
/* will have a start cluster of FREE. If we're */
|
||||||
/* doing a write and this is the first time */
|
/* doing a write and this is the first time */
|
||||||
/* through, allocate a new cluster to the file. */
|
/* through, allocate a new cluster to the file. */
|
||||||
if (fnp->f_dir.dir_start == FREE)
|
if (checkdstart(fnp->f_dir, FREE))
|
||||||
if (!first_fat(fnp)) /* get a free cluster */
|
if (!first_fat(fnp)) /* get a free cluster */
|
||||||
{ /* error means disk full */
|
{ /* error means disk full */
|
||||||
dir_close(fnp);
|
dir_close(fnp);
|
||||||
@ -1864,7 +1934,7 @@ UCOUNT writeblock(COUNT fd, VOID FAR * buffer, UCOUNT count, COUNT * err)
|
|||||||
/* initializing to the starting cluster and */
|
/* initializing to the starting cluster and */
|
||||||
/* setting all offsets to zero. */
|
/* setting all offsets to zero. */
|
||||||
fnp->f_cluster = fnp->f_flags.f_ddir ? fnp->f_dirstart :
|
fnp->f_cluster = fnp->f_flags.f_ddir ? fnp->f_dirstart :
|
||||||
fnp->f_dir.dir_start;
|
getdstart(fnp->f_dir);
|
||||||
|
|
||||||
fnp->f_cluster_offset = 0l;
|
fnp->f_cluster_offset = 0l;
|
||||||
fnp->f_back = LONG_LAST_CLUSTER;
|
fnp->f_back = LONG_LAST_CLUSTER;
|
||||||
@ -2105,12 +2175,12 @@ LONG dos_lseek(COUNT fd, LONG foffset, COUNT origin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* returns the number of unused clusters */
|
/* returns the number of unused clusters */
|
||||||
UWORD dos_free(struct dpb FAR *dpbp)
|
CLUSTER dos_free(struct dpb FAR *dpbp)
|
||||||
{
|
{
|
||||||
/* There's an unwritten rule here. All fs */
|
/* There's an unwritten rule here. All fs */
|
||||||
/* cluster start at 2 and run to max_cluster+2 */
|
/* cluster start at 2 and run to max_cluster+2 */
|
||||||
REG UWORD i;
|
REG CLUSTER i;
|
||||||
REG UWORD cnt = 0;
|
REG CLUSTER cnt = 0;
|
||||||
/* UWORD max_cluster = ( ((ULONG) dpbp->dpb_size
|
/* UWORD max_cluster = ( ((ULONG) dpbp->dpb_size
|
||||||
* * (ULONG) (dpbp->dpb_clsmask + 1) - (dpbp->dpb_data + 1) )
|
* * (ULONG) (dpbp->dpb_clsmask + 1) - (dpbp->dpb_data + 1) )
|
||||||
* / (dpbp->dpb_clsmask + 1) ) + 2;
|
* / (dpbp->dpb_clsmask + 1) ) + 2;
|
||||||
@ -2119,7 +2189,7 @@ UWORD dos_free(struct dpb FAR *dpbp)
|
|||||||
/*?? UWORD max_cluster = ( ((ULONG) dpbp->dpb_size * (ULONG) (dpbp->dpb_clsmask + 1))
|
/*?? UWORD max_cluster = ( ((ULONG) dpbp->dpb_size * (ULONG) (dpbp->dpb_clsmask + 1))
|
||||||
/ (dpbp->dpb_clsmask + 1) ) + 1;
|
/ (dpbp->dpb_clsmask + 1) ) + 1;
|
||||||
*/
|
*/
|
||||||
UWORD max_cluster = dpbp->dpb_size + 1;
|
CLUSTER max_cluster = dpbp->dpb_size + 1;
|
||||||
|
|
||||||
if (dpbp->dpb_nfreeclst != UNKNCLSTFREE)
|
if (dpbp->dpb_nfreeclst != UNKNCLSTFREE)
|
||||||
return dpbp->dpb_nfreeclst;
|
return dpbp->dpb_nfreeclst;
|
||||||
@ -2131,6 +2201,9 @@ UWORD dos_free(struct dpb FAR *dpbp)
|
|||||||
++cnt;
|
++cnt;
|
||||||
}
|
}
|
||||||
dpbp->dpb_nfreeclst = cnt;
|
dpbp->dpb_nfreeclst = cnt;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (ISFAT32(dpbp)) write_fsinfo(dpbp);
|
||||||
|
#endif
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2262,7 +2335,11 @@ COUNT dos_setfattr(BYTE * name, UWORD attrp)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
VOID bpb_to_dpb(bpb FAR *bpbp, REG struct dpb FAR * dpbp, BOOL extended)
|
||||||
|
#else
|
||||||
VOID bpb_to_dpb(bpb FAR *bpbp, REG struct dpb FAR * dpbp)
|
VOID bpb_to_dpb(bpb FAR *bpbp, REG struct dpb FAR * dpbp)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
ULONG size;
|
ULONG size;
|
||||||
REG COUNT i;
|
REG COUNT i;
|
||||||
@ -2276,25 +2353,57 @@ VOID bpb_to_dpb(bpb FAR *bpbp, REG struct dpb FAR * dpbp)
|
|||||||
size = bpbp->bpb_nsize == 0 ?
|
size = bpbp->bpb_nsize == 0 ?
|
||||||
bpbp->bpb_huge :
|
bpbp->bpb_huge :
|
||||||
(ULONG) bpbp->bpb_nsize;
|
(ULONG) bpbp->bpb_nsize;
|
||||||
/* patch point
|
dpbp->dpb_wfatsize = bpbp->bpb_nfsect;
|
||||||
dpbp->dpb_size = size / ((ULONG) bpbp->bpb_nsector);
|
|
||||||
*/
|
|
||||||
dpbp->dpb_fatsize = bpbp->bpb_nfsect;
|
|
||||||
dpbp->dpb_dirstrt = dpbp->dpb_fatstrt
|
dpbp->dpb_dirstrt = dpbp->dpb_fatstrt
|
||||||
+ dpbp->dpb_fats * dpbp->dpb_fatsize;
|
+ dpbp->dpb_fats * dpbp->dpb_wfatsize;
|
||||||
dpbp->dpb_data = dpbp->dpb_dirstrt
|
dpbp->dpb_wdata = dpbp->dpb_dirstrt
|
||||||
+ ((DIRENT_SIZE * dpbp->dpb_dirents
|
+ ((DIRENT_SIZE * dpbp->dpb_dirents
|
||||||
+ (dpbp->dpb_secsize - 1))
|
+ (dpbp->dpb_secsize - 1))
|
||||||
/ dpbp->dpb_secsize);
|
/ dpbp->dpb_secsize);
|
||||||
/*
|
/* Michal Meller <maceman@priv4,onet.pl> patch to jimtabor */
|
||||||
Michal Meller <maceman@priv4,onet.pl> patch to jimtabor
|
dpbp->dpb_wsize = ((size - dpbp->dpb_wdata)
|
||||||
*/
|
/ ((ULONG) bpbp->bpb_nsector) + 1);
|
||||||
dpbp->dpb_size = ((size - dpbp->dpb_data) / ((ULONG) bpbp->bpb_nsector) + 1);
|
|
||||||
|
|
||||||
dpbp->dpb_flags = 0;
|
dpbp->dpb_flags = 0;
|
||||||
/* dpbp->dpb_next = (struct dpb FAR *)-1;*/
|
dpbp->dpb_wcluster = UNKNCLUSTER;
|
||||||
|
/* number of free clusters */
|
||||||
|
*((UWORD FAR *)(&dpbp->dpb_nfreeclst)) = UNKNCLSTFREE16;
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (extended)
|
||||||
|
{
|
||||||
|
dpbp->dpb_fatsize = bpbp->bpb_nfsect == 0 ? bpbp->bpb_xnfsect
|
||||||
|
: bpbp->bpb_nfsect;
|
||||||
dpbp->dpb_cluster = UNKNCLUSTER;
|
dpbp->dpb_cluster = UNKNCLUSTER;
|
||||||
dpbp->dpb_nfreeclst = UNKNCLSTFREE; /* number of free clusters */
|
dpbp->dpb_nfreeclst = UNKNCLSTFREE; /* number of free clusters */
|
||||||
|
|
||||||
|
dpbp->dpb_xflags = 0;
|
||||||
|
dpbp->dpb_xfsinfosec = 0xffff;
|
||||||
|
dpbp->dpb_xbackupsec = 0xffff;
|
||||||
|
dpbp->dpb_xrootclst = 0;
|
||||||
|
dpbp->dpb_size = ((size - (dpbp->dpb_fatstrt + dpbp->dpb_fats
|
||||||
|
* dpbp->dpb_fatsize))
|
||||||
|
/ ((ULONG) bpbp->bpb_nsector) + 1);
|
||||||
|
|
||||||
|
if (ISFAT32(dpbp))
|
||||||
|
{
|
||||||
|
dpbp->dpb_xflags = bpbp->bpb_xflags;
|
||||||
|
dpbp->dpb_xfsinfosec = bpbp->bpb_xfsinfosec;
|
||||||
|
dpbp->dpb_xbackupsec = bpbp->bpb_xbackupsec;
|
||||||
|
dpbp->dpb_dirents = 0;
|
||||||
|
dpbp->dpb_dirstrt = 0xffff;
|
||||||
|
dpbp->dpb_wsize = 0;
|
||||||
|
dpbp->dpb_data = dpbp->dpb_fatstrt + dpbp->dpb_fats * dpbp->dpb_fatsize;
|
||||||
|
dpbp->dpb_xrootclst = bpbp->bpb_xrootclst;
|
||||||
|
read_fsinfo(dpbp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dpbp->dpb_data = dpbp->dpb_wdata;
|
||||||
|
dpbp->dpb_size = dpbp->dpb_wsize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 1, dpbp->dpb_shftcnt = 0;
|
for (i = 1, dpbp->dpb_shftcnt = 0;
|
||||||
i < (sizeof(dpbp->dpb_shftcnt) * 8); /* 8 bit bytes in C */
|
i < (sizeof(dpbp->dpb_shftcnt) * 8); /* 8 bit bytes in C */
|
||||||
dpbp->dpb_shftcnt++, i <<= 1)
|
dpbp->dpb_shftcnt++, i <<= 1)
|
||||||
@ -2384,7 +2493,11 @@ COUNT media_check(REG struct dpb FAR * dpbp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
bpb_to_dpb(MediaReqHdr.r_bpptr, dpbp, TRUE);
|
||||||
|
#else
|
||||||
bpb_to_dpb(MediaReqHdr.r_bpptr, dpbp);
|
bpb_to_dpb(MediaReqHdr.r_bpptr, dpbp);
|
||||||
|
#endif
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2435,10 +2548,10 @@ STATIC VOID shrink_file(f_node_ptr fnp)
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
ULONG lastoffset = fnp->f_offset; /* has to be saved */
|
ULONG lastoffset = fnp->f_offset; /* has to be saved */
|
||||||
UCOUNT next,st;
|
CLUSTER next,st;
|
||||||
struct dpb FAR *dpbp = fnp->f_dpb;
|
struct dpb FAR *dpbp = fnp->f_dpb;
|
||||||
|
|
||||||
if (fnp->f_flags.f_ddir) /* can't shrink dirs */
|
if (fnp->f_flags.f_ddir || (fnp->f_dir.dir_attrib & D_DIR)) /* can't shrink dirs */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fnp->f_offset = fnp->f_highwater; /* end of file */
|
fnp->f_offset = fnp->f_highwater; /* end of file */
|
||||||
@ -2448,10 +2561,10 @@ STATIC VOID shrink_file(f_node_ptr fnp)
|
|||||||
if (map_cluster(fnp, XFR_READ) != SUCCESS) /* error, don't truncate */
|
if (map_cluster(fnp, XFR_READ) != SUCCESS) /* error, don't truncate */
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
|
||||||
st = fnp->f_cluster;
|
st = fnp->f_cluster;
|
||||||
|
|
||||||
if (st == FREE || st == LONG_LAST_CLUSTER) /* first cluster is free or EOC, done */
|
/* first cluster is free or EOC */
|
||||||
|
if (st == FREE || st == LONG_LAST_CLUSTER)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
next = next_cluster(dpbp, st);
|
next = next_cluster(dpbp, st);
|
||||||
@ -2467,7 +2580,7 @@ STATIC VOID shrink_file(f_node_ptr fnp)
|
|||||||
|
|
||||||
if (fnp->f_highwater == 0)
|
if (fnp->f_highwater == 0)
|
||||||
{
|
{
|
||||||
fnp->f_dir.dir_start = FREE;
|
setdstart(fnp->f_dir, FREE);
|
||||||
link_fat(dpbp, st, FREE);
|
link_fat(dpbp, st, FREE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2491,12 +2604,14 @@ STATIC VOID shrink_file(f_node_ptr fnp)
|
|||||||
if ((dpbp->dpb_cluster == UNKNCLUSTER)
|
if ((dpbp->dpb_cluster == UNKNCLUSTER)
|
||||||
|| (dpbp->dpb_cluster > st))
|
|| (dpbp->dpb_cluster > st))
|
||||||
dpbp->dpb_cluster = st;
|
dpbp->dpb_cluster = st;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
fnp->f_offset = lastoffset; /* has to be restored */
|
fnp->f_offset = lastoffset; /* has to be restored */
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (ISFAT32(dpbp)) write_fsinfo(dpbp);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
179
kernel/fattab.c
179
kernel/fattab.c
@ -35,6 +35,9 @@ static BYTE *RcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.8 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.7 2001/07/09 22:19:33 bartoldeman
|
* Revision 1.7 2001/07/09 22:19:33 bartoldeman
|
||||||
* LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
* LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
||||||
*
|
*
|
||||||
@ -111,15 +114,19 @@ static BYTE *RcsId = "$Id$";
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef PROTO
|
#ifdef PROTO
|
||||||
UCOUNT link_fat12(struct dpb FAR *, UCOUNT, UCOUNT);
|
UCOUNT link_fat12(struct dpb FAR *, CLUSTER, CLUSTER);
|
||||||
UCOUNT link_fat16(struct dpb FAR *, UCOUNT, UCOUNT);
|
UCOUNT link_fat16(struct dpb FAR *, CLUSTER, CLUSTER);
|
||||||
UWORD next_cl12(struct dpb FAR *, UCOUNT);
|
UCOUNT link_fat32(struct dpb FAR *, CLUSTER, CLUSTER);
|
||||||
UWORD next_cl16(struct dpb FAR *, UCOUNT);
|
CLUSTER next_cl12(struct dpb FAR *, CLUSTER);
|
||||||
|
CLUSTER next_cl16(struct dpb FAR *, CLUSTER);
|
||||||
|
CLUSTER next_cl32(struct dpb FAR *, CLUSTER);
|
||||||
#else
|
#else
|
||||||
UCOUNT link_fat12();
|
UCOUNT link_fat12();
|
||||||
UCOUNT link_fat16();
|
UCOUNT link_fat16();
|
||||||
UWORD next_cl12();
|
UCOUNT link_fat32();
|
||||||
UWORD next_cl16();
|
CLUSTER next_cl12();
|
||||||
|
CLUSTER next_cl16();
|
||||||
|
CLUSTER next_cl32();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
@ -128,7 +135,15 @@ UWORD next_cl16();
|
|||||||
/* */
|
/* */
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
|
||||||
struct buffer FAR *getFATblock(UWORD cluster, struct dpb FAR *dpbp)
|
#ifndef ISFAT32
|
||||||
|
int ISFAT32(struct dpb FAR *dpbp)
|
||||||
|
{
|
||||||
|
return _ISFAT32(dpbp);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
struct buffer FAR *getFATblock(CLUSTER cluster, struct dpb FAR *dpbp)
|
||||||
{
|
{
|
||||||
ULONG sector;
|
ULONG sector;
|
||||||
struct buffer FAR *bp;
|
struct buffer FAR *bp;
|
||||||
@ -137,11 +152,24 @@ struct buffer FAR *getFATblock(UWORD cluster, struct dpb FAR *dpbp)
|
|||||||
{
|
{
|
||||||
sector = ((cluster << 1) + cluster) >> 1;
|
sector = ((cluster << 1) + cluster) >> 1;
|
||||||
}
|
}
|
||||||
else /* FAT16 */
|
#ifdef WITHFAT32
|
||||||
|
else if (ISFAT32(dpbp))
|
||||||
|
{
|
||||||
|
sector = (ULONG)cluster * SIZEOF_CLST32;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else
|
||||||
{
|
{
|
||||||
sector = (ULONG)cluster * SIZEOF_CLST16;
|
sector = (ULONG)cluster * SIZEOF_CLST16;
|
||||||
}
|
}
|
||||||
sector = sector / dpbp->dpb_secsize + dpbp->dpb_fatstrt;
|
sector = sector / dpbp->dpb_secsize + dpbp->dpb_fatstrt;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (ISFAT32(dpbp) && (dpbp->dpb_xflags & FAT_NO_MIRRORING)) {
|
||||||
|
/* we must modify the active fat,
|
||||||
|
it's number is in the 0-3 bits of dpb_xflags */
|
||||||
|
sector += (dpbp->dpb_xflags & 0xf) * dpbp->dpb_fatsize;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bp = getblock(sector, dpbp->dpb_unit);
|
bp = getblock(sector, dpbp->dpb_unit);
|
||||||
|
|
||||||
@ -150,11 +178,44 @@ struct buffer FAR *getFATblock(UWORD cluster, struct dpb FAR *dpbp)
|
|||||||
bp->b_flag &= ~(BFR_DATA | BFR_DIR);
|
bp->b_flag &= ~(BFR_DATA | BFR_DIR);
|
||||||
bp->b_flag |= BFR_FAT | BFR_VALID;
|
bp->b_flag |= BFR_FAT | BFR_VALID;
|
||||||
bp->b_copies = dpbp->dpb_fats;
|
bp->b_copies = dpbp->dpb_fats;
|
||||||
bp->b_offset_lo = dpbp->dpb_fatsize;
|
#ifdef WITHFAT32
|
||||||
bp->b_offset_hi = dpbp->dpb_fatsize >> 8;
|
if (ISFAT32(dpbp) && (dpbp->dpb_xflags & FAT_NO_MIRRORING)) bp->b_copies = 1;
|
||||||
|
#endif
|
||||||
|
bp->b_offset = dpbp->dpb_fatsize;
|
||||||
}
|
}
|
||||||
return bp;
|
return bp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
void read_fsinfo(struct dpb FAR *dpbp)
|
||||||
|
{
|
||||||
|
struct buffer FAR *bp;
|
||||||
|
struct fsinfo FAR *fip;
|
||||||
|
|
||||||
|
bp = getblock(dpbp->dpb_xfsinfosec, dpbp->dpb_unit);
|
||||||
|
bp->b_flag &= ~(BFR_DATA | BFR_DIR | BFR_FAT | BFR_DIRTY);
|
||||||
|
bp->b_flag |= BFR_VALID;
|
||||||
|
|
||||||
|
fip = (struct fsinfo FAR *) & bp->b_buffer[0x1e4];
|
||||||
|
dpbp->dpb_nfreeclst = fip->fi_nfreeclst;
|
||||||
|
dpbp->dpb_cluster = fip->fi_cluster;
|
||||||
|
}
|
||||||
|
|
||||||
|
void write_fsinfo(struct dpb FAR *dpbp)
|
||||||
|
{
|
||||||
|
struct buffer FAR *bp;
|
||||||
|
struct fsinfo FAR *fip;
|
||||||
|
|
||||||
|
bp = getblock(dpbp->dpb_xfsinfosec, dpbp->dpb_unit);
|
||||||
|
bp->b_flag &= ~(BFR_DATA | BFR_DIR | BFR_FAT);
|
||||||
|
bp->b_flag |= BFR_VALID | BFR_DIRTY;
|
||||||
|
|
||||||
|
fip = (struct fsinfo FAR *) & bp->b_buffer[0x1e4];
|
||||||
|
fip->fi_nfreeclst = dpbp->dpb_nfreeclst;
|
||||||
|
fip->fi_cluster = dpbp->dpb_cluster;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
/* The FAT file system is difficult to trace through FAT table. */
|
/* The FAT file system is difficult to trace through FAT table. */
|
||||||
/* There are two kinds of FAT's, 12 bit and 16 bit. The 16 bit */
|
/* There are two kinds of FAT's, 12 bit and 16 bit. The 16 bit */
|
||||||
@ -171,7 +232,7 @@ struct buffer FAR *getFATblock(UWORD cluster, struct dpb FAR *dpbp)
|
|||||||
/* 12 bytes are compressed to 9 bytes */
|
/* 12 bytes are compressed to 9 bytes */
|
||||||
/* */
|
/* */
|
||||||
|
|
||||||
UCOUNT link_fat(struct dpb FAR *dpbp, UCOUNT Cluster1, REG UCOUNT Cluster2)
|
UCOUNT link_fat(struct dpb FAR *dpbp, CLUSTER Cluster1, REG CLUSTER Cluster2)
|
||||||
{
|
{
|
||||||
UCOUNT res;
|
UCOUNT res;
|
||||||
|
|
||||||
@ -179,6 +240,10 @@ UCOUNT link_fat(struct dpb FAR *dpbp, UCOUNT Cluster1, REG UCOUNT Cluster2)
|
|||||||
res = link_fat12(dpbp, Cluster1, Cluster2);
|
res = link_fat12(dpbp, Cluster1, Cluster2);
|
||||||
else if (ISFAT16(dpbp))
|
else if (ISFAT16(dpbp))
|
||||||
res = link_fat16(dpbp, Cluster1, Cluster2);
|
res = link_fat16(dpbp, Cluster1, Cluster2);
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
else if (ISFAT32(dpbp))
|
||||||
|
res = link_fat32(dpbp, Cluster1, Cluster2);
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
return DE_BLKINVLD;
|
return DE_BLKINVLD;
|
||||||
|
|
||||||
@ -199,15 +264,46 @@ UCOUNT link_fat(struct dpb FAR *dpbp, UCOUNT Cluster1, REG UCOUNT Cluster2)
|
|||||||
/* cluster */
|
/* cluster */
|
||||||
/* BUG: was counted twice for 2nd,.. cluster. moved to find_fat_free() */
|
/* BUG: was counted twice for 2nd,.. cluster. moved to find_fat_free() */
|
||||||
|
|
||||||
/* else {
|
/* else
|
||||||
|
{
|
||||||
--dpbp->dpb_nfreeclst;
|
--dpbp->dpb_nfreeclst;
|
||||||
|
} */
|
||||||
}
|
}
|
||||||
*/
|
#ifdef WITHFAT32
|
||||||
}
|
if (ISFAT32(dpbp)) write_fsinfo(dpbp);
|
||||||
|
#endif
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
UCOUNT link_fat16(struct dpb FAR *dpbp, UCOUNT Cluster1, UCOUNT Cluster2)
|
#ifdef WITHFAT32
|
||||||
|
UCOUNT link_fat32(struct dpb FAR *dpbp, CLUSTER Cluster1, CLUSTER Cluster2)
|
||||||
|
{
|
||||||
|
UCOUNT idx;
|
||||||
|
struct buffer FAR *bp;
|
||||||
|
|
||||||
|
/* Get the block that this cluster is in */
|
||||||
|
bp = getFATblock(Cluster1, dpbp);
|
||||||
|
|
||||||
|
if (bp == NULL)
|
||||||
|
return DE_BLKINVLD;
|
||||||
|
|
||||||
|
/* form an index so that we can read the block as a */
|
||||||
|
/* byte array */
|
||||||
|
idx = (UWORD)((Cluster1 * SIZEOF_CLST32) % dpbp->dpb_secsize);
|
||||||
|
|
||||||
|
/* Finally, put the word into the buffer and mark the */
|
||||||
|
/* buffer as dirty. */
|
||||||
|
fputlong((DWORD FAR *) & Cluster2, (VOID FAR *) & (bp->b_buffer[idx]));
|
||||||
|
bp->b_flag |= BFR_DIRTY | BFR_VALID;
|
||||||
|
|
||||||
|
/* Return successful. */
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
UCOUNT link_fat16(struct dpb FAR *dpbp, CLUSTER Cluster1, CLUSTER Cluster2)
|
||||||
{
|
{
|
||||||
UCOUNT idx;
|
UCOUNT idx;
|
||||||
struct buffer FAR *bp;
|
struct buffer FAR *bp;
|
||||||
@ -232,7 +328,7 @@ UCOUNT link_fat16(struct dpb FAR *dpbp, UCOUNT Cluster1, UCOUNT Cluster2)
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
UCOUNT link_fat12(struct dpb FAR *dpbp, UCOUNT Cluster1, UCOUNT Cluster2)
|
UCOUNT link_fat12(struct dpb FAR *dpbp, CLUSTER Cluster1, CLUSTER Cluster2)
|
||||||
{
|
{
|
||||||
REG UBYTE FAR *fbp0,
|
REG UBYTE FAR *fbp0,
|
||||||
FAR * fbp1;
|
FAR * fbp1;
|
||||||
@ -247,7 +343,7 @@ UCOUNT link_fat12(struct dpb FAR *dpbp, UCOUNT Cluster1, UCOUNT Cluster2)
|
|||||||
|
|
||||||
/* form an index so that we can read the block as a */
|
/* form an index so that we can read the block as a */
|
||||||
/* byte array */
|
/* byte array */
|
||||||
idx = (((Cluster1 << 1) + Cluster1) >> 1) % dpbp->dpb_secsize;
|
idx = (UCOUNT)(((Cluster1 << 1) + Cluster1) >> 1) % dpbp->dpb_secsize;
|
||||||
|
|
||||||
/* Test to see if the cluster straddles the block. If */
|
/* Test to see if the cluster straddles the block. If */
|
||||||
/* it does, get the next block and use both to form the */
|
/* it does, get the next block and use both to form the */
|
||||||
@ -285,19 +381,44 @@ UCOUNT link_fat12(struct dpb FAR *dpbp, UCOUNT Cluster1, UCOUNT Cluster2)
|
|||||||
|
|
||||||
/* Given the disk parameters, and a cluster number, this function
|
/* Given the disk parameters, and a cluster number, this function
|
||||||
looks at the FAT, and returns the next cluster in the clain. */
|
looks at the FAT, and returns the next cluster in the clain. */
|
||||||
UWORD next_cluster(struct dpb FAR *dpbp, UCOUNT ClusterNum)
|
CLUSTER next_cluster(struct dpb FAR *dpbp, CLUSTER ClusterNum)
|
||||||
{
|
{
|
||||||
|
if (ClusterNum == LONG_LAST_CLUSTER) printf("fatal error: trying to do next_cluster(dpbp, EOC)!\n");
|
||||||
if (ISFAT12(dpbp))
|
if (ISFAT12(dpbp))
|
||||||
return next_cl12(dpbp, ClusterNum);
|
return next_cl12(dpbp, ClusterNum);
|
||||||
else if (ISFAT16(dpbp))
|
else if (ISFAT16(dpbp))
|
||||||
return next_cl16(dpbp, ClusterNum);
|
return next_cl16(dpbp, ClusterNum);
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
else if (ISFAT32(dpbp))
|
||||||
|
return next_cl32(dpbp, ClusterNum);
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
return LONG_LAST_CLUSTER;
|
return LONG_LAST_CLUSTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
UWORD next_cl16(struct dpb FAR *dpbp, UCOUNT ClusterNum)
|
#ifdef WITHFAT32
|
||||||
|
CLUSTER next_cl32(struct dpb FAR *dpbp, CLUSTER ClusterNum)
|
||||||
{
|
{
|
||||||
struct buffer FAR *bp;
|
struct buffer FAR *bp;
|
||||||
|
UDWORD res;
|
||||||
|
|
||||||
|
/* Get the block that this cluster is in */
|
||||||
|
bp = getFATblock(ClusterNum, dpbp);
|
||||||
|
|
||||||
|
if (bp == NULL)
|
||||||
|
return DE_BLKINVLD;
|
||||||
|
|
||||||
|
res = *(UDWORD FAR *)&(bp->b_buffer[(UCOUNT)((ClusterNum * SIZEOF_CLST32) % dpbp->dpb_secsize)]);
|
||||||
|
if (res > LONG_BAD) return LONG_LAST_CLUSTER;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CLUSTER next_cl16(struct dpb FAR *dpbp, CLUSTER ClusterNum)
|
||||||
|
{
|
||||||
|
struct buffer FAR *bp;
|
||||||
|
UWORD res;
|
||||||
|
|
||||||
/* Get the block that this cluster is in */
|
/* Get the block that this cluster is in */
|
||||||
bp = getFATblock( ClusterNum, dpbp);
|
bp = getFATblock( ClusterNum, dpbp);
|
||||||
@ -307,7 +428,6 @@ UWORD next_cl16(struct dpb FAR *dpbp, UCOUNT ClusterNum)
|
|||||||
|
|
||||||
#ifndef I86
|
#ifndef I86
|
||||||
UCOUNT idx;
|
UCOUNT idx;
|
||||||
UWORD RetCluster;
|
|
||||||
|
|
||||||
/* form an index so that we can read the block as a */
|
/* form an index so that we can read the block as a */
|
||||||
/* byte array */
|
/* byte array */
|
||||||
@ -315,17 +435,17 @@ UWORD next_cl16(struct dpb FAR *dpbp, UCOUNT ClusterNum)
|
|||||||
|
|
||||||
/* Get the cluster number, */
|
/* Get the cluster number, */
|
||||||
|
|
||||||
fgetword((VOID FAR *) & (bp->b_buffer[idx]), (WORD FAR *) & RetCluster);
|
fgetword((VOID FAR *) & (bp->b_buffer[idx]), (WORD FAR *) & res);
|
||||||
|
|
||||||
/* and return successful. */
|
|
||||||
return RetCluster;
|
|
||||||
#else
|
#else
|
||||||
/* this saves 2 WORDS of stack :-) */
|
/* this saves 2 WORDS of stack :-) */
|
||||||
|
|
||||||
return *(UWORD FAR *)&(bp->b_buffer[(ClusterNum * SIZEOF_CLST16) % dpbp->dpb_secsize]);
|
res = *(UWORD FAR *)&(bp->b_buffer[(UCOUNT)((ClusterNum * SIZEOF_CLST16) % dpbp->dpb_secsize)]);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
if ((res & MASK16) == MASK16) return LONG_LAST_CLUSTER;
|
||||||
|
else if ((res & BAD16) == BAD16) return LONG_BAD;
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@ -385,7 +505,7 @@ UWORD next_cl12(struct dpb FAR *dpbp, REG UCOUNT ClusterNum)
|
|||||||
/* new version - 50 byte smaller, saves 10 bytes on stack :-)
|
/* new version - 50 byte smaller, saves 10 bytes on stack :-)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
UWORD next_cl12(struct dpb FAR *dpbp, REG UCOUNT ClusterNum)
|
CLUSTER next_cl12(struct dpb FAR *dpbp, REG CLUSTER ClusterNum)
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
UBYTE bytes[2];
|
UBYTE bytes[2];
|
||||||
@ -403,7 +523,7 @@ UWORD next_cl12(struct dpb FAR *dpbp, REG UCOUNT ClusterNum)
|
|||||||
|
|
||||||
/* form an index so that we can read the block as a */
|
/* form an index so that we can read the block as a */
|
||||||
/* byte array */
|
/* byte array */
|
||||||
idx = (((ClusterNum << 1) + ClusterNum) >> 1) % dpbp->dpb_secsize;
|
idx = (UCOUNT)(((ClusterNum << 1) + ClusterNum) >> 1) % dpbp->dpb_secsize;
|
||||||
|
|
||||||
clusterbuff.bytes[0] = bp->b_buffer[idx];
|
clusterbuff.bytes[0] = bp->b_buffer[idx];
|
||||||
|
|
||||||
@ -440,10 +560,9 @@ UWORD next_cl12(struct dpb FAR *dpbp, REG UCOUNT ClusterNum)
|
|||||||
ClusterNum = clusterbuff.word & 0x0fff;
|
ClusterNum = clusterbuff.word & 0x0fff;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if ((ClusterNum & MASK12) == MASK12)
|
||||||
if ((ClusterNum & MASK) == MASK)
|
|
||||||
ClusterNum = LONG_LAST_CLUSTER;
|
ClusterNum = LONG_LAST_CLUSTER;
|
||||||
else if ((ClusterNum & BAD) == BAD)
|
else if ((ClusterNum & BAD12) == BAD12)
|
||||||
ClusterNum = LONG_BAD;
|
ClusterNum = LONG_BAD;
|
||||||
return ClusterNum;
|
return ClusterNum;
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,9 @@ static BYTE *RcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.18 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.17 2001/08/20 20:32:15 bartoldeman
|
* Revision 1.17 2001/08/20 20:32:15 bartoldeman
|
||||||
* Truename, get free space and ctrl-break fixes.
|
* Truename, get free space and ctrl-break fixes.
|
||||||
*
|
*
|
||||||
@ -177,6 +180,10 @@ VOID FatGetDrvData(UCOUNT drive, COUNT FAR * spc, COUNT FAR * bps,
|
|||||||
{
|
{
|
||||||
struct dpb FAR *dpbp;
|
struct dpb FAR *dpbp;
|
||||||
struct cds FAR *cdsp;
|
struct cds FAR *cdsp;
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
UCOUNT shift = 0;
|
||||||
|
ULONG cluster_size, ntotal;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* first check for valid drive */
|
/* first check for valid drive */
|
||||||
*spc = -1;
|
*spc = -1;
|
||||||
@ -211,9 +218,23 @@ VOID FatGetDrvData(UCOUNT drive, COUNT FAR * spc, COUNT FAR * bps,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
cluster_size = (dpbp->dpb_clsmask + 1) * dpbp->dpb_secsize;
|
||||||
|
ntotal = dpbp->dpb_size - 1;
|
||||||
|
while (cluster_size <= 0x7fff) {
|
||||||
|
cluster_size <<= 1;
|
||||||
|
ntotal >>= 1;
|
||||||
|
shift++;
|
||||||
|
}
|
||||||
|
/* get the data available from dpb */
|
||||||
|
if (ntotal > 0xfffe) ntotal = 0xfffe;
|
||||||
|
*nc = (UCOUNT)ntotal;
|
||||||
|
*spc = (dpbp->dpb_clsmask + 1) << shift;
|
||||||
|
#else
|
||||||
/* get the data vailable from dpb */
|
/* get the data vailable from dpb */
|
||||||
*nc = dpbp->dpb_size - 1;
|
*nc = dpbp->dpb_size - 1;
|
||||||
*spc = dpbp->dpb_clsmask + 1;
|
*spc = dpbp->dpb_clsmask + 1;
|
||||||
|
#endif
|
||||||
*bps = dpbp->dpb_secsize;
|
*bps = dpbp->dpb_secsize;
|
||||||
|
|
||||||
/* Point to the media desctriptor for this drive */
|
/* Point to the media desctriptor for this drive */
|
||||||
@ -268,12 +289,12 @@ WORD FcbParseFname(int wTestMode, BYTE FAR ** lpFileName, fcb FAR * lpFcb)
|
|||||||
if (*(*lpFileName + 1) == ':')
|
if (*(*lpFileName + 1) == ':')
|
||||||
{
|
{
|
||||||
/* non-portable construct to be changed */
|
/* non-portable construct to be changed */
|
||||||
REG UBYTE Drive = DosUpFChar(**lpFileName) - 'A' + 1;
|
REG UBYTE Drive = DosUpFChar(**lpFileName) - 'A';
|
||||||
|
|
||||||
if (Drive >= lastdrive)
|
if (Drive >= lastdrive)
|
||||||
return PARSE_RET_BADDRIVE;
|
return PARSE_RET_BADDRIVE;
|
||||||
|
|
||||||
lpFcb->fcb_drive = Drive;
|
lpFcb->fcb_drive = Drive + 1;
|
||||||
*lpFileName += 2;
|
*lpFileName += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -744,10 +765,6 @@ BOOL FcbDelete(xfcb FAR * lpXfcb)
|
|||||||
/* Build a traditional DOS file name */
|
/* Build a traditional DOS file name */
|
||||||
CommonFcbInit(lpXfcb, SecPathName, &FcbDrive);
|
CommonFcbInit(lpXfcb, SecPathName, &FcbDrive);
|
||||||
|
|
||||||
if ((UCOUNT)FcbDrive >= lastdrive) {
|
|
||||||
return DE_INVLDDRV;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check for a device */
|
/* check for a device */
|
||||||
if (IsDevice(SecPathName))
|
if (IsDevice(SecPathName))
|
||||||
{
|
{
|
||||||
@ -952,7 +969,7 @@ BOOL FcbFindFirst(xfcb FAR * lpXfcb)
|
|||||||
*lpDir++ = FcbDrive;
|
*lpDir++ = FcbDrive;
|
||||||
fmemcpy(lpDir, &SearchDir, sizeof(struct dirent));
|
fmemcpy(lpDir, &SearchDir, sizeof(struct dirent));
|
||||||
|
|
||||||
lpFcb->fcb_dirclst = Dmatch.dm_dirstart;
|
lpFcb->fcb_dirclst = (UWORD)Dmatch.dm_dircluster;
|
||||||
lpFcb->fcb_strtclst = Dmatch.dm_entry;
|
lpFcb->fcb_strtclst = Dmatch.dm_entry;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -993,8 +1010,7 @@ BOOL FcbFindNext(xfcb FAR * lpXfcb)
|
|||||||
|
|
||||||
Dmatch.dm_attr_srch = wAttr;
|
Dmatch.dm_attr_srch = wAttr;
|
||||||
Dmatch.dm_entry = lpFcb->fcb_strtclst;
|
Dmatch.dm_entry = lpFcb->fcb_strtclst;
|
||||||
Dmatch.dm_cluster = lpFcb->fcb_dirclst;
|
Dmatch.dm_dircluster = lpFcb->fcb_dirclst;
|
||||||
Dmatch.dm_dirstart= lpFcb->fcb_dirclst;
|
|
||||||
|
|
||||||
if ((xfcb FAR *) lpFcb != lpXfcb)
|
if ((xfcb FAR *) lpFcb != lpXfcb)
|
||||||
{
|
{
|
||||||
@ -1015,7 +1031,7 @@ BOOL FcbFindNext(xfcb FAR * lpXfcb)
|
|||||||
*lpDir++ = FcbDrive;
|
*lpDir++ = FcbDrive;
|
||||||
fmemcpy((struct dirent FAR *)lpDir, &SearchDir, sizeof(struct dirent));
|
fmemcpy((struct dirent FAR *)lpDir, &SearchDir, sizeof(struct dirent));
|
||||||
|
|
||||||
lpFcb->fcb_dirclst = Dmatch.dm_dirstart;
|
lpFcb->fcb_dirclst = (UWORD)Dmatch.dm_dircluster;
|
||||||
lpFcb->fcb_strtclst = Dmatch.dm_entry;
|
lpFcb->fcb_strtclst = Dmatch.dm_entry;
|
||||||
|
|
||||||
lpFcb->fcb_sftno = Dmatch.dm_drive;
|
lpFcb->fcb_sftno = Dmatch.dm_drive;
|
||||||
|
104
kernel/globals.h
104
kernel/globals.h
@ -36,6 +36,9 @@ static BYTE *Globals_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.17 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.16 2001/08/19 12:58:36 bartoldeman
|
* Revision 1.16 2001/08/19 12:58:36 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -215,6 +218,7 @@ static BYTE *Globals_hRcsId = "$Id$";
|
|||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
|
#include "xstructs.h"
|
||||||
|
|
||||||
/* JPP: for testing/debuging disk IO */
|
/* JPP: for testing/debuging disk IO */
|
||||||
/*#define DISPLAY_GETBLOCK */
|
/*#define DISPLAY_GETBLOCK */
|
||||||
@ -288,12 +292,17 @@ static BYTE *Globals_hRcsId = "$Id$";
|
|||||||
/* FAT cluster special flags */
|
/* FAT cluster special flags */
|
||||||
#define FREE 0x000
|
#define FREE 0x000
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
#define LONG_LAST_CLUSTER 0x0FFFFFFFl
|
||||||
|
#define LONG_BAD 0x0FFFFFF7l
|
||||||
|
#else
|
||||||
#define LONG_LAST_CLUSTER 0xFFFF
|
#define LONG_LAST_CLUSTER 0xFFFF
|
||||||
#define LONG_MASK 0xFFF8
|
#define LONG_BAD 0xFFF8
|
||||||
#define LONG_BAD 0xFFF0
|
#endif
|
||||||
#define LAST_CLUSTER 0x0FFF
|
#define MASK16 0xFFF8
|
||||||
#define MASK 0xFF8
|
#define BAD16 0xFFF0
|
||||||
#define BAD 0xFF0
|
#define MASK12 0xFF8
|
||||||
|
#define BAD12 0xFF0
|
||||||
|
|
||||||
/* Keyboard buffer maximum size */
|
/* Keyboard buffer maximum size */
|
||||||
#ifdef LINESIZE
|
#ifdef LINESIZE
|
||||||
@ -314,20 +323,8 @@ FAR clk_dev, /* Clock device driver */
|
|||||||
FAR aux_dev, /* Generic aux device driver */
|
FAR aux_dev, /* Generic aux device driver */
|
||||||
FAR blk_dev; /* Block device (Disk) driver */
|
FAR blk_dev; /* Block device (Disk) driver */
|
||||||
extern UWORD
|
extern UWORD
|
||||||
ram_top, /* How much ram in Kbytes */
|
ram_top; /* How much ram in Kbytes */
|
||||||
#ifdef I86
|
|
||||||
|
|
||||||
api_sp, /* api stacks - for context */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
api_ss, /* switching */
|
|
||||||
usr_sp, /* user stack */
|
|
||||||
usr_ss;
|
|
||||||
extern COUNT *
|
extern COUNT *
|
||||||
#ifdef MC68K
|
|
||||||
api_sp, /* api stacks - for context */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
error_tos, /* error stack */
|
error_tos, /* error stack */
|
||||||
disk_api_tos, /* API handler stack - disk fns */
|
disk_api_tos, /* API handler stack - disk fns */
|
||||||
char_api_tos; /* API handler stack - char fns */
|
char_api_tos; /* API handler stack - char fns */
|
||||||
@ -381,29 +378,26 @@ GLOBAL WORD bDumpRdWrParms
|
|||||||
|
|
||||||
GLOBAL BYTE copyright[]
|
GLOBAL BYTE copyright[]
|
||||||
#ifdef MAIN
|
#ifdef MAIN
|
||||||
#if 0
|
= "(C) Copyright 1995-2001 Pasquale J. Villani and The FreeDOS Project.\n\
|
||||||
= "(C) Copyright 1995, 1996, 1997, 1998\nPasquale J. Villani\nAll Rights Reserved\n"
|
All Rights Reserved. This is free software and comes with ABSOLUTELY NO\n\
|
||||||
#else
|
WARRANTY; you can redistribute it and/or modify it under the terms of the\n\
|
||||||
= ""
|
GNU General Public License as published by the Free Software Foundation;\n\
|
||||||
#endif
|
either version 2, or (at your option) any later version.\n"
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
|
||||||
GLOBAL BYTE os_release[]
|
GLOBAL BYTE os_release[]
|
||||||
#ifdef MAIN
|
#ifdef MAIN
|
||||||
#if 0
|
#if 0
|
||||||
= "DOS-C version %d.%d Beta %d [FreeDOS Release] (Build %d).\n\
|
= "DOS-C version %d.%d Beta %d [FreeDOS Release] (Build %d).\n"
|
||||||
\n\
|
#endif
|
||||||
DOS-C is free software; you can redistribute it and/or modify it under the\n\
|
= "FreeDOS kernel version " KERNEL_VERSION_STRING \
|
||||||
terms of the GNU General Public License as published by the Free Software\n\
|
" (Build " KERNEL_BUILD_STRING ") [" __DATE__ " " __TIME__ "]\n"
|
||||||
Foundation; either version 2, or (at your option) any later version.\n\n\
|
#if 0
|
||||||
For technical information and description of the DOS-C operating system\n\
|
"For technical information and description of the DOS-C operating system\n\
|
||||||
consult \"FreeDOS Kernel\" by Pat Villani, published by Miller\n\
|
consult \"FreeDOS Kernel\" by Pat Villani, published by Miller\n\
|
||||||
Freeman Publishing, Lawrence KS, USA (ISBN 0-87930-436-7).\n\
|
Freeman Publishing, Lawrence KS, USA (ISBN 0-87930-436-7).\n\
|
||||||
\n"
|
\n"
|
||||||
#else
|
|
||||||
= "FreeDOS kernel version %d.%d.%d"SUB_BUILD
|
|
||||||
" (Build %d"SUB_BUILD") [" __DATE__ " " __TIME__ "]\n\n"
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
@ -584,13 +578,6 @@ GLOBAL f_node_ptr f_nodes; /* pointer to the array */
|
|||||||
|
|
||||||
GLOBAL UWORD f_nodes_cnt; /* number of allocated f_nodes */
|
GLOBAL UWORD f_nodes_cnt; /* number of allocated f_nodes */
|
||||||
|
|
||||||
GLOBAL struct buffer
|
|
||||||
FAR *lastbuf; /* tail of ditto */
|
|
||||||
/* FAR * buffers; /* pointer to array of track buffers */
|
|
||||||
|
|
||||||
/*GLOBAL BYTE FAR * dma_scratch;*/ /* scratchpad used for working around */
|
|
||||||
/* DMA transfers during disk I/O */
|
|
||||||
|
|
||||||
GLOBAL iregs
|
GLOBAL iregs
|
||||||
FAR * ustackp, /* user stack */
|
FAR * ustackp, /* user stack */
|
||||||
FAR * kstackp; /* kernel stack */
|
FAR * kstackp; /* kernel stack */
|
||||||
@ -603,34 +590,31 @@ GLOBAL iregs
|
|||||||
/* Process related functions - not under automatic generation. */
|
/* Process related functions - not under automatic generation. */
|
||||||
/* Typically, these are in ".asm" files. */
|
/* Typically, these are in ".asm" files. */
|
||||||
VOID
|
VOID
|
||||||
FAR cpm_entry(VOID),
|
FAR ASMCFUNC cpm_entry(VOID)
|
||||||
INRPT FAR re_entry(VOID) /*,
|
/*INRPT FAR handle_break(VOID) */ ;
|
||||||
INRPT FAR handle_break(VOID) */ ;
|
|
||||||
VOID
|
VOID
|
||||||
enable(VOID),
|
enable(VOID),
|
||||||
disable(VOID);
|
disable(VOID);
|
||||||
COUNT
|
COUNT
|
||||||
CriticalError(
|
ASMCFUNC CriticalError(
|
||||||
COUNT nFlag, COUNT nDrive, COUNT nError, struct dhdr FAR * lpDevice);
|
COUNT nFlag, COUNT nDrive, COUNT nError, struct dhdr FAR * lpDevice);
|
||||||
|
|
||||||
#ifdef PROTO
|
#ifdef PROTO
|
||||||
VOID FAR CharMapSrvc(VOID);
|
VOID FAR ASMCFUNC CharMapSrvc(VOID);
|
||||||
VOID FAR set_stack(VOID);
|
VOID FAR ASMCFUNC set_stack(VOID);
|
||||||
VOID FAR restore_stack(VOID);
|
VOID FAR ASMCFUNC restore_stack(VOID);
|
||||||
WORD execrh(request FAR *, struct dhdr FAR *);
|
WORD ASMCFUNC execrh(request FAR *, struct dhdr FAR *);
|
||||||
VOID exit(COUNT);
|
VOID exit(COUNT);
|
||||||
/*VOID INRPT FAR handle_break(VOID); */
|
/*VOID INRPT FAR handle_break(VOID); */
|
||||||
VOID tmark(VOID);
|
VOID ASMCFUNC tmark(VOID);
|
||||||
BOOL tdelay(LONG);
|
BOOL ASMCFUNC tdelay(LONG);
|
||||||
BYTE FAR *device_end(VOID);
|
BYTE FAR *ASMCFUNC device_end(VOID);
|
||||||
COUNT kb_data(VOID);
|
COUNT ASMCFUNC kb_data(VOID);
|
||||||
COUNT kb_input(VOID);
|
COUNT ASMCFUNC kb_input(VOID);
|
||||||
COUNT kb_init(VOID);
|
COUNT ASMCFUNC kb_init(VOID);
|
||||||
VOID setvec(UWORD, VOID(INRPT FAR *) ());
|
VOID ASMCFUNC setvec(UWORD, VOID(INRPT FAR *) ());
|
||||||
BYTE FAR *getvec(UWORD);
|
BYTE FAR *ASMCFUNC getvec(UWORD);
|
||||||
COUNT con(COUNT);
|
COUNT con(COUNT);
|
||||||
VOID getdirent(BYTE FAR *, struct dirent FAR *);
|
|
||||||
VOID putdirent(struct dirent FAR *, BYTE FAR *);
|
|
||||||
#else
|
#else
|
||||||
VOID FAR CharMapSrvc();
|
VOID FAR CharMapSrvc();
|
||||||
VOID FAR set_stack();
|
VOID FAR set_stack();
|
||||||
@ -647,8 +631,6 @@ COUNT kb_init();
|
|||||||
VOID setvec();
|
VOID setvec();
|
||||||
BYTE FAR *getvec();
|
BYTE FAR *getvec();
|
||||||
COUNT con();
|
COUNT con();
|
||||||
VOID getdirent();
|
|
||||||
VOID putdirent();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -687,12 +669,12 @@ VOID fputbyte();
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef I86
|
#ifdef I86
|
||||||
#define setvec(n, isr) (void)(*(VOID (INRPT FAR * FAR *)())(4 * (n)) = (isr))
|
#define setvec(n, isr) (void)(*(VOID (INRPT FAR * FAR *)())(MK_FP(0,4 * (n))) = (isr))
|
||||||
#endif
|
#endif
|
||||||
/*#define is_leap_year(y) ((y) & 3 ? 0 : (y) % 100 ? 1 : (y) % 400 ? 0 : 1) */
|
/*#define is_leap_year(y) ((y) & 3 ? 0 : (y) % 100 ? 1 : (y) % 400 ? 0 : 1) */
|
||||||
|
|
||||||
/* ^Break handling */
|
/* ^Break handling */
|
||||||
void spawn_int23(void); /* procsupt.asm */
|
void ASMCFUNC spawn_int23(void); /* procsupt.asm */
|
||||||
int control_break(void); /* break.c */
|
int control_break(void); /* break.c */
|
||||||
void handle_break(void); /* break.c */
|
void handle_break(void); /* break.c */
|
||||||
|
|
||||||
|
@ -21,10 +21,6 @@
|
|||||||
#include "nls.h"
|
#include "nls.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
|
|
||||||
#ifdef __TURBOC__
|
|
||||||
void __int__(int); /* TC 2.01 requires this. :( -- ror4 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The null macro `INIT' can be used to allow the reader to differentiate
|
* The null macro `INIT' can be used to allow the reader to differentiate
|
||||||
* between functions defined in `INIT_TEXT' and those defined in `_TEXT'.
|
* between functions defined in `INIT_TEXT' and those defined in `_TEXT'.
|
||||||
@ -43,14 +39,14 @@ void __int__(int); /* TC 2.01 requires this. :( -- ror4 */
|
|||||||
#define fstrncpy reloc_call_fstrncpy
|
#define fstrncpy reloc_call_fstrncpy
|
||||||
#define strcpy reloc_call_strcpy
|
#define strcpy reloc_call_strcpy
|
||||||
#define strlen reloc_call_strlen
|
#define strlen reloc_call_strlen
|
||||||
WORD execrh(request FAR *, struct dhdr FAR *);
|
WORD ASMCFUNC execrh(request FAR *, struct dhdr FAR *);
|
||||||
VOID fmemcpy(REG VOID FAR * d, REG VOID FAR * s, REG COUNT n);
|
VOID ASMCFUNC fmemcpy(REG VOID FAR * d, REG VOID FAR * s, REG COUNT n);
|
||||||
void fmemset(REG VOID FAR * s, REG int ch, REG COUNT n);
|
void ASMCFUNC fmemset(REG VOID FAR * s, REG int ch, REG COUNT n);
|
||||||
void memset(REG VOID * s, REG int ch, REG COUNT n);
|
void ASMCFUNC memset(REG VOID * s, REG int ch, REG COUNT n);
|
||||||
VOID strcpy(REG BYTE * d, REG BYTE * s);
|
VOID ASMCFUNC strcpy(REG BYTE * d, REG BYTE * s);
|
||||||
VOID fstrncpy(REG BYTE FAR * d, REG BYTE FAR * s, REG COUNT n);
|
VOID ASMCFUNC fstrncpy(REG BYTE FAR * d, REG BYTE FAR * s, REG COUNT n);
|
||||||
COUNT fstrlen(REG BYTE FAR * s);
|
COUNT ASMCFUNC fstrlen(REG BYTE FAR * s);
|
||||||
COUNT strlen(REG BYTE * s);
|
COUNT ASMCFUNC strlen(REG BYTE * s);
|
||||||
|
|
||||||
#undef LINESIZE
|
#undef LINESIZE
|
||||||
#define LINESIZE KBD_MAXLENGTH
|
#define LINESIZE KBD_MAXLENGTH
|
||||||
@ -60,7 +56,7 @@ COUNT strlen(REG BYTE * s);
|
|||||||
extern BYTE DosLoadedInHMA;
|
extern BYTE DosLoadedInHMA;
|
||||||
extern fmemcmp(BYTE far *s1, BYTE FAR *s2, unsigned len);
|
extern fmemcmp(BYTE far *s1, BYTE FAR *s2, unsigned len);
|
||||||
|
|
||||||
#define setvec(n, isr) (void)(*(VOID (INRPT FAR * FAR *)())(4 * (n)) = (isr))
|
#define setvec(n, isr) (void)(*(VOID (FAR * FAR *)())(MK_FP(0,4 * (n))) = (isr))
|
||||||
|
|
||||||
#define fbcopy(s, d, n) fmemcpy(d,s,n)
|
#define fbcopy(s, d, n) fmemcpy(d,s,n)
|
||||||
#define GLOBAL extern
|
#define GLOBAL extern
|
||||||
@ -133,15 +129,15 @@ INIT COUNT toupper(COUNT c);
|
|||||||
INIT VOID mcb_init(UCOUNT seg, UWORD size);
|
INIT VOID mcb_init(UCOUNT seg, UWORD size);
|
||||||
INIT VOID strcat(REG BYTE * d, REG BYTE * s);
|
INIT VOID strcat(REG BYTE * d, REG BYTE * s);
|
||||||
INIT BYTE FAR *KernelAlloc(WORD nBytes);
|
INIT BYTE FAR *KernelAlloc(WORD nBytes);
|
||||||
INIT COUNT Umb_Test(void);
|
INIT COUNT ASMCFUNC Umb_Test(void);
|
||||||
INIT COUNT UMB_get_largest(UCOUNT *seg, UCOUNT *size);
|
INIT COUNT ASMCFUNC UMB_get_largest(UCOUNT *seg, UCOUNT *size);
|
||||||
INIT BYTE *GetStringArg(BYTE * pLine, BYTE * pszString);
|
INIT BYTE *GetStringArg(BYTE * pLine, BYTE * pszString);
|
||||||
|
|
||||||
/* diskinit.c */
|
/* diskinit.c */
|
||||||
COUNT dsk_init(VOID);
|
COUNT dsk_init(VOID);
|
||||||
|
|
||||||
/* int2f.asm */
|
/* int2f.asm */
|
||||||
COUNT Umb_Test(void);
|
COUNT ASMCFUNC Umb_Test(void);
|
||||||
|
|
||||||
/* inithma.c */
|
/* inithma.c */
|
||||||
int MoveKernelToHMA(void);
|
int MoveKernelToHMA(void);
|
||||||
@ -152,45 +148,41 @@ UWORD init_oem(void);
|
|||||||
|
|
||||||
/* intr.asm */
|
/* intr.asm */
|
||||||
|
|
||||||
void init_call_intr(int nr, iregs *rp);
|
void ASMCFUNC init_call_intr(int nr, iregs *rp);
|
||||||
UCOUNT read(int fd, void *buf, UCOUNT count);
|
UCOUNT ASMCFUNC read(int fd, void *buf, UCOUNT count);
|
||||||
int open(const char *pathname, int flags);
|
int ASMCFUNC open(const char *pathname, int flags);
|
||||||
int close(int fd);
|
int ASMCFUNC close(int fd);
|
||||||
int dup2(int oldfd, int newfd);
|
int ASMCFUNC dup2(int oldfd, int newfd);
|
||||||
int allocmem(UWORD size, seg *segp);
|
int ASMCFUNC allocmem(UWORD size, seg *segp);
|
||||||
INIT VOID init_PSPInit(seg psp_seg);
|
INIT VOID ASMCFUNC init_PSPInit(seg psp_seg);
|
||||||
INIT VOID init_PSPSet(seg psp_seg);
|
INIT VOID ASMCFUNC init_PSPSet(seg psp_seg);
|
||||||
INIT COUNT init_DosExec(COUNT mode, exec_blk * ep, BYTE * lp);
|
INIT COUNT ASMCFUNC init_DosExec(COUNT mode, exec_blk * ep, BYTE * lp);
|
||||||
INIT VOID keycheck(VOID);
|
INIT VOID ASMCFUNC keycheck(VOID);
|
||||||
|
|
||||||
/* irqstack.asm */
|
/* irqstack.asm */
|
||||||
VOID init_stacks(VOID FAR * stack_base, COUNT nStacks, WORD stackSize);
|
VOID ASMCFUNC init_stacks(VOID FAR * stack_base, COUNT nStacks, WORD stackSize);
|
||||||
|
|
||||||
/* inthndlr.c */
|
/* inthndlr.c */
|
||||||
VOID far int21_entry(iregs UserRegs);
|
VOID far ASMCFUNC int21_entry(iregs UserRegs);
|
||||||
VOID int21_service(iregs far * r);
|
VOID ASMCFUNC int21_service(iregs far * r);
|
||||||
VOID INRPT FAR int0_handler(void);
|
VOID FAR ASMCFUNC int0_handler(void);
|
||||||
VOID INRPT FAR int6_handler(void);
|
VOID FAR ASMCFUNC int6_handler(void);
|
||||||
VOID INRPT FAR empty_handler(void);
|
VOID FAR ASMCFUNC empty_handler(void);
|
||||||
VOID INRPT far got_cbreak(void); /* procsupt.asm */
|
VOID far ASMCFUNC got_cbreak(void); /* procsupt.asm */
|
||||||
VOID INRPT far int20_handler(iregs UserRegs);
|
VOID far ASMCFUNC int20_handler(iregs UserRegs);
|
||||||
VOID INRPT far int21_handler(iregs UserRegs);
|
VOID far ASMCFUNC int21_handler(iregs UserRegs);
|
||||||
VOID INRPT FAR int22_handler(void);
|
VOID FAR ASMCFUNC int22_handler(void);
|
||||||
VOID INRPT FAR int23_handler(int es, int ds, int di, int si, int bp, int sp, int bx, int dx, int cx, int ax, int ip, int cs
|
VOID FAR ASMCFUNC int24_handler(void);
|
||||||
, int flags);
|
VOID FAR ASMCFUNC low_int25_handler(void);
|
||||||
VOID INRPT FAR int24_handler(void);
|
VOID FAR ASMCFUNC low_int26_handler(void);
|
||||||
VOID INRPT FAR low_int25_handler(void);
|
VOID FAR ASMCFUNC int27_handler(void);
|
||||||
VOID INRPT FAR low_int26_handler(void);
|
VOID FAR ASMCFUNC int28_handler(void);
|
||||||
VOID INRPT FAR int27_handler(int es, int ds, int di, int si, int bp, int sp, int bx, int dx, int cx, int ax, int ip, int cs
|
VOID FAR ASMCFUNC int29_handler(void);
|
||||||
, int flags);
|
VOID FAR ASMCFUNC int2a_handler(void);
|
||||||
VOID INRPT FAR int28_handler(void);
|
VOID FAR ASMCFUNC int2f_handler(void);
|
||||||
VOID INRPT FAR int29_handler(int es, int ds, int di, int si, int bp, int sp, int bx, int dx, int cx, int ax, int ip, int cs
|
|
||||||
, int flags);
|
|
||||||
VOID INRPT FAR int2a_handler(void);
|
|
||||||
VOID INRPT FAR int2f_handler(void);
|
|
||||||
|
|
||||||
/* main.c */
|
/* main.c */
|
||||||
INIT VOID main(void);
|
INIT VOID ASMCFUNC FreeDOSmain(void);
|
||||||
INIT BOOL init_device(struct dhdr FAR * dhp, BYTE FAR * cmdLine, COUNT mode, COUNT top);
|
INIT BOOL init_device(struct dhdr FAR * dhp, BYTE FAR * cmdLine, COUNT mode, COUNT top);
|
||||||
INIT VOID init_fatal(BYTE * err_msg);
|
INIT VOID init_fatal(BYTE * err_msg);
|
||||||
|
|
||||||
@ -201,3 +193,10 @@ void MoveKernel(unsigned NewKernelSegment);
|
|||||||
extern WORD HMAFree; /* first byte in HMA not yet used */
|
extern WORD HMAFree; /* first byte in HMA not yet used */
|
||||||
|
|
||||||
extern unsigned CurrentKernelSegment;
|
extern unsigned CurrentKernelSegment;
|
||||||
|
|
||||||
|
#if defined(WATCOM) && 0
|
||||||
|
ULONG FAR ASMCFUNC MULULUS(ULONG mul1, UWORD mul2); /* MULtiply ULong by UShort */
|
||||||
|
ULONG FAR ASMCFUNC MULULUL(ULONG mul1, ULONG mul2); /* MULtiply ULong by ULong */
|
||||||
|
ULONG FAR ASMCFUNC DIVULUS(ULONG mul1, UWORD mul2); /* DIVide ULong by UShort */
|
||||||
|
ULONG FAR ASMCFUNC DIVMODULUS(ULONG mul1, UWORD mul2,UWORD *rem); /* DIVide ULong by UShort */
|
||||||
|
#endif
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
#include "init-mod.h"
|
#include "init-mod.h"
|
||||||
|
#include "init-dat.h"
|
||||||
#include "dyndata.h"
|
#include "dyndata.h"
|
||||||
#ifdef VERSION_STRINGS
|
#ifdef VERSION_STRINGS
|
||||||
static BYTE *dskRcsId = "$Id$";
|
static BYTE *dskRcsId = "$Id$";
|
||||||
@ -34,11 +35,11 @@ static BYTE *dskRcsId = "$Id$";
|
|||||||
/*
|
/*
|
||||||
data shared between DSK.C and INITDISK.C
|
data shared between DSK.C and INITDISK.C
|
||||||
*/
|
*/
|
||||||
extern UBYTE FAR DiskTransferBuffer[1 * SEC_SIZE];
|
extern UBYTE DOSFAR DiskTransferBuffer[1 * SEC_SIZE];
|
||||||
|
|
||||||
extern COUNT FAR nUnits;
|
extern COUNT DOSFAR nUnits;
|
||||||
|
|
||||||
extern UWORD FAR LBA_WRITE_VERIFY;
|
extern UWORD DOSFAR LBA_WRITE_VERIFY;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rev 1.0 13 May 2001 tom ehlert
|
* Rev 1.0 13 May 2001 tom ehlert
|
||||||
@ -150,10 +151,19 @@ extern UWORD FAR LBA_WRITE_VERIFY;
|
|||||||
#define IsExtPartition(parttyp) ((parttyp) == EXTENDED || \
|
#define IsExtPartition(parttyp) ((parttyp) == EXTENDED || \
|
||||||
(parttyp) == EXTENDED_LBA )
|
(parttyp) == EXTENDED_LBA )
|
||||||
|
|
||||||
#define IsFAT16Partition(parttyp) ((parttyp) == FAT12 || \
|
#ifdef WITHFAT32
|
||||||
|
#define IsFATPartition(parttyp) ((parttyp) == FAT12 || \
|
||||||
|
(parttyp) == FAT16SMALL || \
|
||||||
|
(parttyp) == FAT16LARGE || \
|
||||||
|
(parttyp) == FAT16_LBA || \
|
||||||
|
(parttyp) == FAT32 || \
|
||||||
|
(parttyp) == FAT32_LBA)
|
||||||
|
#else
|
||||||
|
#define IsFATPartition(parttyp) ((parttyp) == FAT12 || \
|
||||||
(parttyp) == FAT16SMALL || \
|
(parttyp) == FAT16SMALL || \
|
||||||
(parttyp) == FAT16LARGE || \
|
(parttyp) == FAT16LARGE || \
|
||||||
(parttyp) == FAT16_LBA)
|
(parttyp) == FAT16_LBA)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MSDOS_EXT_SIGN 0x29 /* extended boot sector signature */
|
#define MSDOS_EXT_SIGN 0x29 /* extended boot sector signature */
|
||||||
#define MSDOS_FAT12_SIGN "FAT12 " /* FAT12 filesystem signature */
|
#define MSDOS_FAT12_SIGN "FAT12 " /* FAT12 filesystem signature */
|
||||||
@ -204,6 +214,23 @@ struct PartTableEntry /* INTERNAL representation of partition table entry */
|
|||||||
|
|
||||||
UBYTE GlobalEnableLBAsupport = 1; /* = 0 --> disable LBA support */
|
UBYTE GlobalEnableLBAsupport = 1; /* = 0 --> disable LBA support */
|
||||||
|
|
||||||
|
COUNT init_readdasd(UBYTE drive)
|
||||||
|
{
|
||||||
|
static iregs regs;
|
||||||
|
|
||||||
|
regs.a.b.h = 0x15;
|
||||||
|
regs.d.b.l = drive;
|
||||||
|
init_call_intr(0x13,®s);
|
||||||
|
if ((regs.flags & 1) == 0) switch (regs.a.b.h)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
return DF_CHANGELINE;
|
||||||
|
case 3:
|
||||||
|
return DF_FIXED;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
translate LBA sectors into CHS addressing
|
translate LBA sectors into CHS addressing
|
||||||
copied and pasted from dsk.c!
|
copied and pasted from dsk.c!
|
||||||
@ -343,26 +370,29 @@ VOID CalculateFATData(ddt FAR *pddt, ULONG NumSectors, UBYTE FileSystem)
|
|||||||
fmemcpy(pddt->ddt_fstype, MSDOS_FAT16_SIGN, 8);
|
fmemcpy(pddt->ddt_fstype, MSDOS_FAT16_SIGN, 8);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* FAT 32 code: commented out for now */
|
|
||||||
#ifdef WITHFAT32
|
#ifdef WITHFAT32
|
||||||
case FAT32:
|
case FAT32:
|
||||||
/* For FAT32, use 4k clusters on sufficiently large file systems,
|
/* For FAT32, use 4k clusters on sufficiently large file systems,
|
||||||
* otherwise 1 sector per cluster. This is also what M$'s format
|
* otherwise 1 sector per cluster. This is also what M$'s format
|
||||||
* command does for FAT32. */
|
* command does for FAT32. */
|
||||||
defbpb->bpb_nsector = ((long long)blocks*SECTORS_PER_BLOCK >= 512*1024 ? 8 : 1);
|
defbpb->bpb_nsector = (NumSectors >= 512*1024 ? 8 : 1);
|
||||||
do {
|
do {
|
||||||
clust = ((long long) fatdata *defbpb->bpb_nbyte + defbpb->bpb_nfat*8) /
|
/* simple calculation - no long long available */
|
||||||
((int) defbpb->bpb_nsector * defbpb->bpb_nbyte + defbpb->bpb_nfat*4);
|
clust = (ULONG)fatdata / defbpb->bpb_nsector;
|
||||||
|
/* this calculation below yields a smaller value - the above is non-optimal
|
||||||
|
but should not be dangerous */
|
||||||
|
/* clust = ((long long) fatdata *defbpb->bpb_nbyte + defbpb->bpb_nfat*8) /
|
||||||
|
((int) defbpb->bpb_nsector * defbpb->bpb_nbyte + defbpb->bpb_nfat*4); */
|
||||||
fatlength = cdiv ((clust+2) * 4, defbpb->bpb_nbyte);
|
fatlength = cdiv ((clust+2) * 4, defbpb->bpb_nbyte);
|
||||||
/* Need to recalculate number of clusters, since the unused parts of the
|
/* Need to recalculate number of clusters, since the unused parts of the
|
||||||
* FATS and data area together could make up space for an additional,
|
* FATS and data area together could make up space for an additional,
|
||||||
* not really present cluster. */
|
* not really present cluster. */
|
||||||
clust = (fatdata - defbpb->bpb_nfat*fatlength)/defbpb->bpb_nsector;
|
clust = (fatdata - defbpb->bpb_nfat*fatlength)/defbpb->bpb_nsector;
|
||||||
maxclust = (fatlength * defbpb->bpb_nbyte) / 4;
|
maxclust = (fatlength * defbpb->bpb_nbyte) / 4;
|
||||||
if (maxclust > MAX_CLUST_32)
|
if (maxclust > FAT_MAGIC32)
|
||||||
maxclust = MAX_CLUST_32;
|
maxclust = FAT_MAGIC32;
|
||||||
DebugPrintf(( "FAT32: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n",
|
DebugPrintf(( "FAT32: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n",
|
||||||
clust, fatlength, maxclust, FAT_MAGIC ));
|
clust, fatlength, maxclust, FAT_MAGIC32 ));
|
||||||
if (clust > maxclust)
|
if (clust > maxclust)
|
||||||
{
|
{
|
||||||
clust = 0;
|
clust = 0;
|
||||||
@ -372,10 +402,9 @@ VOID CalculateFATData(ddt FAR *pddt, ULONG NumSectors, UBYTE FileSystem)
|
|||||||
break;
|
break;
|
||||||
defbpb->bpb_nsector <<= 1;
|
defbpb->bpb_nsector <<= 1;
|
||||||
} while (defbpb->bpb_nsector && defbpb->bpb_nsector <= maxclustsize);
|
} while (defbpb->bpb_nsector && defbpb->bpb_nsector <= maxclustsize);
|
||||||
bpb_nfsect = fatlength;
|
|
||||||
defbpb->bpb_nfsect = 0;
|
defbpb->bpb_nfsect = 0;
|
||||||
defbpb->fat32.fat32_length = fatlength;
|
defbpb->bpb_xnfsect = fatlength;
|
||||||
memcpy(pddt->ddt_fstype, MSDOS_FAT32_SIGN, 8);
|
fmemcpy(pddt->ddt_fstype, MSDOS_FAT32_SIGN, 8);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -396,6 +425,7 @@ void DosDefinePartition(struct DriveParamS *driveParam,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pddt->ddt_driveno = driveParam->driveno;
|
pddt->ddt_driveno = driveParam->driveno;
|
||||||
|
pddt->ddt_logdriveno = nUnits;
|
||||||
pddt->ddt_LBASupported = driveParam->LBA_supported;
|
pddt->ddt_LBASupported = driveParam->LBA_supported;
|
||||||
pddt->ddt_WriteVerifySupported = driveParam->WriteVerifySupported;
|
pddt->ddt_WriteVerifySupported = driveParam->WriteVerifySupported;
|
||||||
pddt->ddt_ncyl = driveParam->chs.Cylinder;
|
pddt->ddt_ncyl = driveParam->chs.Cylinder;
|
||||||
@ -420,7 +450,8 @@ void DosDefinePartition(struct DriveParamS *driveParam,
|
|||||||
CalculateFATData(pddt, pEntry->NumSect, pEntry->FileSystem);
|
CalculateFATData(pddt, pEntry->NumSect, pEntry->FileSystem);
|
||||||
|
|
||||||
pddt->ddt_serialno = 0x12345678l;
|
pddt->ddt_serialno = 0x12345678l;
|
||||||
pddt->ddt_descflags = 0x200; /* drive inaccessible until bldbpb successful */
|
/* drive inaccessible until bldbpb successful */
|
||||||
|
pddt->ddt_descflags = init_readdasd(pddt->ddt_driveno) | DF_NOACCESS;
|
||||||
fmemcpy(&pddt->ddt_bpb, &pddt->ddt_defbpb, sizeof(bpb));
|
fmemcpy(&pddt->ddt_bpb, &pddt->ddt_defbpb, sizeof(bpb));
|
||||||
|
|
||||||
#ifdef _BETA_ /* Alain whishes to keep this in later versions, too */
|
#ifdef _BETA_ /* Alain whishes to keep this in later versions, too */
|
||||||
@ -443,10 +474,6 @@ void DosDefinePartition(struct DriveParamS *driveParam,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void __int__(int);
|
|
||||||
|
|
||||||
|
|
||||||
/* Get the parameters of the hard disk */
|
/* Get the parameters of the hard disk */
|
||||||
int LBA_Get_Drive_Parameters(int drive,struct DriveParamS *driveParam)
|
int LBA_Get_Drive_Parameters(int drive,struct DriveParamS *driveParam)
|
||||||
{
|
{
|
||||||
@ -658,7 +685,7 @@ ScanForPrimaryPartitions(struct DriveParamS *driveParam,int scan_type,
|
|||||||
|
|
||||||
partitionStart = startSector + pEntry->RelSect;
|
partitionStart = startSector + pEntry->RelSect;
|
||||||
|
|
||||||
if (!IsFAT16Partition(pEntry->FileSystem))
|
if (!IsFATPartition(pEntry->FileSystem))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -680,13 +707,13 @@ ScanForPrimaryPartitions(struct DriveParamS *driveParam,int scan_type,
|
|||||||
chs.Head != pEntry->Begin.Head ||
|
chs.Head != pEntry->Begin.Head ||
|
||||||
chs.Sector != pEntry->Begin.Sector )
|
chs.Sector != pEntry->Begin.Sector )
|
||||||
{
|
{
|
||||||
printf("NOT using suspect partition %u FS %02x:",
|
printf("WARNING: using suspect partition %u FS %02x:",
|
||||||
i, pEntry->FileSystem);
|
i, pEntry->FileSystem);
|
||||||
printCHS(" start calc ",&chs);
|
printCHS(" with calculated values ",&chs);
|
||||||
printCHS(" != ",&pEntry->Begin);
|
printCHS(" instead of ",&pEntry->Begin);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
fmemcpy(&pEntry->Begin, &chs, sizeof(struct CHS));
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -695,14 +722,20 @@ ScanForPrimaryPartitions(struct DriveParamS *driveParam,int scan_type,
|
|||||||
end.Head != pEntry->End.Head ||
|
end.Head != pEntry->End.Head ||
|
||||||
end.Sector != pEntry->End.Sector )
|
end.Sector != pEntry->End.Sector )
|
||||||
{
|
{
|
||||||
printf("NOT using suspect partition %u FS %02x:",
|
if (pEntry->NumSect == 0)
|
||||||
|
{
|
||||||
|
printf("Not using partition %u with 0 sectors\n", i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("WARNING: using suspect partition %u FS %02x:",
|
||||||
i, pEntry->FileSystem);
|
i, pEntry->FileSystem);
|
||||||
|
|
||||||
printCHS(" end calc ",&end);
|
printCHS(" with calculated values ",&end);
|
||||||
printCHS(" != ",&pEntry->End);
|
printCHS(" instead of ",&pEntry->End);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
fmemcpy(&pEntry->End, &end, sizeof(struct CHS));
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1053,6 +1086,7 @@ void ReadAllPartitionTables(void)
|
|||||||
bpb FAR *pbpbarray;
|
bpb FAR *pbpbarray;
|
||||||
int Unit;
|
int Unit;
|
||||||
ddt FAR *pddt;
|
ddt FAR *pddt;
|
||||||
|
static iregs regs;
|
||||||
|
|
||||||
/* Setup media info and BPBs arrays for floppies (this is a 360kb flop) */
|
/* Setup media info and BPBs arrays for floppies (this is a 360kb flop) */
|
||||||
for (Unit = 0; Unit < nUnits; Unit++)
|
for (Unit = 0; Unit < nUnits; Unit++)
|
||||||
@ -1073,12 +1107,12 @@ void ReadAllPartitionTables(void)
|
|||||||
pbpbarray->bpb_nsecs = 9;
|
pbpbarray->bpb_nsecs = 9;
|
||||||
|
|
||||||
pddt->ddt_driveno = 0;
|
pddt->ddt_driveno = 0;
|
||||||
|
pddt->ddt_logdriveno = Unit;
|
||||||
pddt->ddt_ncyl = 40;
|
pddt->ddt_ncyl = 40;
|
||||||
pddt->ddt_LBASupported = FALSE;
|
pddt->ddt_LBASupported = FALSE;
|
||||||
|
pddt->ddt_descflags = init_readdasd(0);
|
||||||
|
|
||||||
pddt->ddt_offset = 0l;
|
pddt->ddt_offset = 0l;
|
||||||
|
|
||||||
|
|
||||||
pddt->ddt_serialno = 0x12345678l;
|
pddt->ddt_serialno = 0x12345678l;
|
||||||
fmemcpy(&pddt->ddt_bpb, pbpbarray, sizeof(bpb));
|
fmemcpy(&pddt->ddt_bpb, pbpbarray, sizeof(bpb));
|
||||||
}
|
}
|
||||||
@ -1087,14 +1121,15 @@ void ReadAllPartitionTables(void)
|
|||||||
this is a quick patch - see if B: exists
|
this is a quick patch - see if B: exists
|
||||||
test for A: also, need not exist
|
test for A: also, need not exist
|
||||||
*/
|
*/
|
||||||
{
|
init_call_intr(0x11,®s); /* get equipment list */
|
||||||
iregs r;
|
if ((regs.a.x & 1) && (regs.a.x & 0xc0)) {
|
||||||
|
|
||||||
init_call_intr(0x11,&r); /* get equipment list */
|
|
||||||
if ((r.a.x & 1) && (r.a.x & 0xc0))
|
|
||||||
pddt->ddt_driveno = 1;
|
pddt->ddt_driveno = 1;
|
||||||
|
pddt->ddt_descflags = init_readdasd(1);
|
||||||
/* floppy drives installed and a B: drive */
|
/* floppy drives installed and a B: drive */
|
||||||
/*if ((r.a.x & 1)==0) */ /* no floppy drives installed */
|
/*if ((r.a.x & 1)==0) */ /* no floppy drives installed */
|
||||||
|
} else { /* set up the DJ method : multiple logical drives */
|
||||||
|
(pddt-1)->ddt_descflags |= DF_CURLOG | DF_MULTLOG;
|
||||||
|
pddt->ddt_descflags |= DF_MULTLOG;
|
||||||
}
|
}
|
||||||
|
|
||||||
nHardDisk = min(nHardDisk,MAX_HARD_DRIVE-1);
|
nHardDisk = min(nHardDisk,MAX_HARD_DRIVE-1);
|
||||||
|
@ -66,9 +66,9 @@
|
|||||||
|
|
||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
#include "init-mod.h"
|
#include "init-mod.h"
|
||||||
|
#include "init-dat.h"
|
||||||
|
|
||||||
|
|
||||||
extern BYTE FAR version_flags; /* minor version number */
|
|
||||||
|
|
||||||
extern BYTE
|
extern BYTE
|
||||||
FAR _HMATextAvailable, /* first byte of available CODE area */
|
FAR _HMATextAvailable, /* first byte of available CODE area */
|
||||||
@ -81,6 +81,9 @@ static BYTE *RcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.10 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.9 2001/08/19 12:58:36 bartoldeman
|
* Revision 1.9 2001/08/19 12:58:36 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -112,22 +115,28 @@ static BYTE *RcsId = "$Id$";
|
|||||||
* initial creation
|
* initial creation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ClaimHMA(VOID);
|
|
||||||
|
|
||||||
BYTE DosLoadedInHMA=FALSE; /* set to TRUE if loaded HIGH */
|
BYTE DosLoadedInHMA=FALSE; /* set to TRUE if loaded HIGH */
|
||||||
BYTE HMAclaimed=FALSE; /* set to TRUE if claimed from HIMEM */
|
BYTE HMAclaimed=FALSE; /* set to TRUE if claimed from HIMEM */
|
||||||
WORD HMAFree; /* first byte in HMA not yet used */
|
WORD HMAFree = 0; /* first byte in HMA not yet used */
|
||||||
|
|
||||||
|
|
||||||
extern BYTE FAR * FAR XMSDriverAddress;
|
extern BYTE FAR * DOSTEXTFAR ASMCFUNC XMSDriverAddress;
|
||||||
extern FAR _EnableA20(VOID);
|
extern FAR ASMCFUNC _EnableA20(VOID);
|
||||||
extern FAR _DisableA20(VOID);
|
extern FAR ASMCFUNC _DisableA20(VOID);
|
||||||
|
|
||||||
|
|
||||||
extern void FAR *DetectXMSDriver(VOID);
|
extern void FAR *ASMCFUNC DetectXMSDriver(VOID);
|
||||||
|
extern int ASMCFUNC init_call_XMScall( void FAR * driverAddress, UWORD ax, UWORD dx);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
#ifdef __TURBOC__
|
||||||
#define int3() __int__(3);
|
#define int3() __int__(3);
|
||||||
|
#else
|
||||||
|
void int3()
|
||||||
|
{ __asm int 3;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#define int3()
|
#define int3()
|
||||||
#endif
|
#endif
|
||||||
@ -158,14 +167,6 @@ VOID hdump(BYTE FAR *p)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef __TURBOC__
|
|
||||||
void __int__(int); /* TC 2.01 requires this. :( -- ror4 */
|
|
||||||
unsigned char __inportb__(int portid);
|
|
||||||
void __outportb__ (int portid, unsigned char value);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define KeyboardShiftState() (*(BYTE FAR *)(MK_FP(0x40,0x17)))
|
#define KeyboardShiftState() (*(BYTE FAR *)(MK_FP(0x40,0x17)))
|
||||||
|
|
||||||
|
|
||||||
@ -240,23 +241,13 @@ int MoveKernelToHMA()
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if ((XMSDriverAddress = DetectXMSDriver()) == NULL)
|
||||||
void FAR *pXMS = DetectXMSDriver();
|
|
||||||
|
|
||||||
if (pXMS != NULL)
|
|
||||||
{
|
|
||||||
XMSDriverAddress = pXMS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
/* A) for debugging purpose, suppress this,
|
/* A) for debugging purpose, suppress this,
|
||||||
if any shift key is pressed
|
if any shift key is pressed
|
||||||
*/
|
*/
|
||||||
#ifdef DEBUG
|
|
||||||
if (KeyboardShiftState() & 0x0f)
|
if (KeyboardShiftState() & 0x0f)
|
||||||
{
|
{
|
||||||
printf("Keyboard state is %0x, NOT moving to HMA\n",KeyboardShiftState());
|
printf("Keyboard state is %0x, NOT moving to HMA\n",KeyboardShiftState());
|
||||||
@ -273,7 +264,15 @@ int MoveKernelToHMA()
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClaimHMA();
|
/* allocate HMA through XMS driver */
|
||||||
|
|
||||||
|
if (HMAclaimed == 0 &&
|
||||||
|
(HMAclaimed = init_call_XMScall( XMSDriverAddress, 0x0100, 0xffff)) == 0)
|
||||||
|
{
|
||||||
|
printf("Can't reserve HMA area ??\n");
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
MoveKernel(0xffff);
|
MoveKernel(0xffff);
|
||||||
|
|
||||||
@ -293,12 +292,8 @@ int MoveKernelToHMA()
|
|||||||
/* report the fact we are running high thorugh int 21, ax=3306 */
|
/* report the fact we are running high thorugh int 21, ax=3306 */
|
||||||
version_flags |= 0x10;
|
version_flags |= 0x10;
|
||||||
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
errorReturn:
|
|
||||||
printf("HMA errors, not doing HMA\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -345,35 +340,6 @@ void InstallVDISK(VOID)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int init_call_XMScall( void FAR * driverAddress, UWORD ax, UWORD dx);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
allocate HMA through XMS driver
|
|
||||||
*/
|
|
||||||
|
|
||||||
void ClaimHMA(VOID)
|
|
||||||
{
|
|
||||||
void FAR *pXMS;
|
|
||||||
|
|
||||||
if (!DosLoadedInHMA) return;
|
|
||||||
if (HMAclaimed) return;
|
|
||||||
|
|
||||||
|
|
||||||
pXMS = DetectXMSDriver();
|
|
||||||
|
|
||||||
if (pXMS != NULL)
|
|
||||||
{
|
|
||||||
XMSDriverAddress = pXMS;
|
|
||||||
|
|
||||||
if (init_call_XMScall( pXMS, 0x0100, 0xffff))
|
|
||||||
{
|
|
||||||
printf("HMA area successfully claimed\n");
|
|
||||||
HMAclaimed = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
this should be called, after each device driver
|
this should be called, after each device driver
|
||||||
has been loaded with FALSE
|
has been loaded with FALSE
|
||||||
@ -430,7 +396,7 @@ void MoveKernel(unsigned NewKernelSegment)
|
|||||||
UBYTE FAR *HMASource;
|
UBYTE FAR *HMASource;
|
||||||
unsigned len;
|
unsigned len;
|
||||||
|
|
||||||
__int__(3);
|
int3();
|
||||||
if (CurrentKernelSegment == 0)
|
if (CurrentKernelSegment == 0)
|
||||||
CurrentKernelSegment = FP_SEG(_HMATextEnd);
|
CurrentKernelSegment = FP_SEG(_HMATextEnd);
|
||||||
|
|
||||||
@ -497,8 +463,8 @@ void MoveKernel(unsigned NewKernelSegment)
|
|||||||
UWORD jmpSegment;
|
UWORD jmpSegment;
|
||||||
};
|
};
|
||||||
extern struct RelocationTable
|
extern struct RelocationTable
|
||||||
FAR _HMARelocationTableStart[],
|
DOSTEXTFAR _HMARelocationTableStart[],
|
||||||
FAR _HMARelocationTableEnd[];
|
DOSTEXTFAR _HMARelocationTableEnd[];
|
||||||
|
|
||||||
struct RelocationTable FAR *rp, rtemp ;
|
struct RelocationTable FAR *rp, rtemp ;
|
||||||
|
|
||||||
@ -511,7 +477,8 @@ void MoveKernel(unsigned NewKernelSegment)
|
|||||||
rp->callNear != 0xe8 || /* call NEAR */
|
rp->callNear != 0xe8 || /* call NEAR */
|
||||||
0)
|
0)
|
||||||
{
|
{
|
||||||
printf("illegal relocation entry # %d\n",rp - _HMARelocationTableStart);
|
printf("illegal relocation entry # %d\n",(FP_OFF(rp) - FP_OFF(_HMARelocationTableStart))/sizeof(struct RelocationTable));
|
||||||
|
int3();
|
||||||
goto errorReturn;
|
goto errorReturn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,9 @@ static BYTE *RcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.5 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.4 2001/04/21 22:32:53 bartoldeman
|
* Revision 1.4 2001/04/21 22:32:53 bartoldeman
|
||||||
* Init DS=Init CS, fixed stack overflow problems and misc bugs.
|
* Init DS=Init CS, fixed stack overflow problems and misc bugs.
|
||||||
*
|
*
|
||||||
@ -90,20 +93,15 @@ static BYTE *RcsId = "$Id$";
|
|||||||
* Initial revision.
|
* Initial revision.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __TURBOC__
|
|
||||||
void __int__(int); /* TC 2.01 requires this. :( -- ror4 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
UWORD init_oem(void)
|
UWORD init_oem(void)
|
||||||
{
|
{
|
||||||
UWORD top_k;
|
UWORD top_k;
|
||||||
|
|
||||||
#ifndef __TURBOC__
|
#ifndef __TURBOC__
|
||||||
_asm
|
asm
|
||||||
{
|
{
|
||||||
int 12 h
|
int 0x12;
|
||||||
mov top_k,
|
mov top_k,ax;
|
||||||
ax
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
__int__(0x12);
|
__int__(0x12);
|
||||||
|
177
kernel/int2f.asm
177
kernel/int2f.asm
@ -30,6 +30,9 @@
|
|||||||
; $Id$
|
; $Id$
|
||||||
;
|
;
|
||||||
; $Log$
|
; $Log$
|
||||||
|
; Revision 1.13 2001/09/23 20:39:44 bartoldeman
|
||||||
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
;
|
||||||
; Revision 1.12 2001/08/19 12:58:36 bartoldeman
|
; Revision 1.12 2001/08/19 12:58:36 bartoldeman
|
||||||
; Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
; Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
;
|
;
|
||||||
@ -107,7 +110,6 @@
|
|||||||
%include "stacks.inc"
|
%include "stacks.inc"
|
||||||
|
|
||||||
segment HMA_TEXT
|
segment HMA_TEXT
|
||||||
extern _nul_dev:wrt DGROUP
|
|
||||||
extern _cu_psp:wrt DGROUP
|
extern _cu_psp:wrt DGROUP
|
||||||
extern _syscall_MUX14:wrt HMA_TEXT
|
extern _syscall_MUX14:wrt HMA_TEXT
|
||||||
|
|
||||||
@ -158,153 +160,46 @@ Int2f?iret:
|
|||||||
iret
|
iret
|
||||||
|
|
||||||
|
|
||||||
FarTabRetnBX: pop bx
|
|
||||||
jmp FarTabRetn
|
;***********************************************************
|
||||||
;
|
; internal doscalls INT2F/11xx - handled through C
|
||||||
;return dos data seg.
|
;***********************************************************
|
||||||
IntDosCal:
|
IntDosCal:
|
||||||
cmp al, 31h
|
; set up register frame
|
||||||
ja FarTabRetn
|
;struct int2f12regs
|
||||||
push bx
|
;{
|
||||||
mov bl, al
|
; UWORD es,ds;
|
||||||
mov bh, 0
|
; UWORD di,si,bp,bx,dx,cx,ax;
|
||||||
shl bx, 1
|
; UWORD ip,cs,flags;
|
||||||
jmp [cs:bx+DosCalTbl]
|
; UWORD callerARG1;
|
||||||
|
;};
|
||||||
DosCalTbl:
|
|
||||||
dw retff, IntDosCal_1, IntDosCal_2, IntDosCal_3, IntDosCal_4, IntDosCal_5,
|
|
||||||
dw IntDosCal_6, IntDosCal_7, IntDosCal_8, IntDosCal_9, IntDosCal_a,
|
|
||||||
dw IntDosCal_b, IntDosCal_c, IntDosCal_d, IntDosCal_e, IntDosCal_f,
|
|
||||||
dw IntDosCal_10, IntDosCal_11, IntDosCal_12, IntDosCal_13, IntDosCal_14,
|
|
||||||
dw IntDosCal_15, IntDosCal_16, IntDosCal_17, IntDosCal_18, IntDosCal_19,
|
|
||||||
dw IntDosCal_1a, IntDosCal_1b, IntDosCal_1c, IntDosCal_1d, IntDosCal_1e,
|
|
||||||
dw IntDosCal_1f, IntDosCal_20, IntDosCal_21, IntDosCal_22, IntDosCal_23,
|
|
||||||
dw IntDosCal_24, IntDosCal_25, IntDosCal_26, IntDosCal_27, IntDosCal_28,
|
|
||||||
dw IntDosCal_29, IntDosCal_2a, IntDosCal_2b, IntDosCal_2c, IntDosCal_2d,
|
|
||||||
dw IntDosCal_2e, IntDosCal_2f, IntDosCal_30, IntDosCal_31
|
|
||||||
|
|
||||||
retff: mov al,0ffh
|
|
||||||
jmp FarTabRetnBX
|
|
||||||
|
|
||||||
IntDosCal_3:
|
|
||||||
push ax
|
push ax
|
||||||
mov ax, seg _nul_dev
|
push cx
|
||||||
mov ds,ax
|
push dx
|
||||||
pop ax
|
|
||||||
clc
|
|
||||||
jmp FarTabRetnBX
|
|
||||||
|
|
||||||
IntDosCal_8:
|
|
||||||
; decrease SFT reference count
|
|
||||||
dec word [es:di]
|
|
||||||
jnz .skip
|
|
||||||
dec word [es:di]
|
|
||||||
.skip:
|
|
||||||
jmp FarTabRetnBX
|
|
||||||
|
|
||||||
IntDosCal_1:
|
|
||||||
IntDosCal_2:
|
|
||||||
IntDosCal_4:
|
|
||||||
IntDosCal_5:
|
|
||||||
IntDosCal_6:
|
|
||||||
IntDosCal_7:
|
|
||||||
IntDosCal_9:
|
|
||||||
IntDosCal_a:
|
|
||||||
IntDosCal_b:
|
|
||||||
IntDosCal_c:
|
|
||||||
IntDosCal_d:
|
|
||||||
IntDosCal_e:
|
|
||||||
IntDosCal_f:
|
|
||||||
IntDosCal_10:
|
|
||||||
IntDosCal_11:
|
|
||||||
IntDosCal_13:
|
|
||||||
IntDosCal_14:
|
|
||||||
IntDosCal_15:
|
|
||||||
IntDosCal_16:
|
|
||||||
IntDosCal_17:
|
|
||||||
IntDosCal_19:
|
|
||||||
IntDosCal_1a:
|
|
||||||
IntDosCal_1c:
|
|
||||||
IntDosCal_1d:
|
|
||||||
IntDosCal_1e:
|
|
||||||
IntDosCal_1f:
|
|
||||||
IntDosCal_20:
|
|
||||||
IntDosCal_22:
|
|
||||||
IntDosCal_23:
|
|
||||||
IntDosCal_24:
|
|
||||||
IntDosCal_26:
|
|
||||||
IntDosCal_27:
|
|
||||||
IntDosCal_28:
|
|
||||||
IntDosCal_29:
|
|
||||||
IntDosCal_2b:
|
|
||||||
IntDosCal_2d:
|
|
||||||
IntDosCal_2e:
|
|
||||||
IntDosCal_2f:
|
|
||||||
IntDosCal_30:
|
|
||||||
IntDosCal_31:
|
|
||||||
jmp FarTabRetnBX
|
|
||||||
|
|
||||||
; get length of asciiz string
|
|
||||||
IntDosCal_12:
|
|
||||||
push di
|
|
||||||
push es
|
|
||||||
extern _fstrlen
|
|
||||||
call _fstrlen
|
|
||||||
add sp, byte 4
|
|
||||||
mov cx, ax
|
|
||||||
inc cx
|
|
||||||
jmp FarTabRetnBX
|
|
||||||
|
|
||||||
; get caller's registers
|
|
||||||
IntDosCal_18:
|
|
||||||
extern _user_r
|
|
||||||
lds si, [_user_r]
|
|
||||||
jmp FarTabRetnBX
|
|
||||||
|
|
||||||
; #days in February - valid until 2099.
|
|
||||||
IntDosCal_1b:
|
|
||||||
mov al, 28
|
|
||||||
test cl, 3
|
|
||||||
jnz .noleap
|
|
||||||
inc al
|
|
||||||
.noleap: jmp FarTabRetnBX
|
|
||||||
|
|
||||||
; truename
|
|
||||||
IntDosCal_21:
|
|
||||||
xor bx, bx
|
|
||||||
push bx
|
push bx
|
||||||
push es
|
push bp
|
||||||
|
push si
|
||||||
push di
|
push di
|
||||||
push ds
|
push ds
|
||||||
push si
|
push es
|
||||||
extern _truename
|
|
||||||
call _truename
|
|
||||||
add sp, byte 10
|
|
||||||
jmp FarTabRetnBX
|
|
||||||
|
|
||||||
; get length of asciiz string
|
mov ax,DGROUP
|
||||||
IntDosCal_25:
|
mov ds,ax
|
||||||
push si
|
extern _int2F_12_handler:wrt HGROUP
|
||||||
push ds
|
call _int2F_12_handler
|
||||||
call _fstrlen
|
|
||||||
add sp, byte 4
|
pop es
|
||||||
mov cx, ax
|
pop ds
|
||||||
inc cx
|
pop di
|
||||||
jmp FarTabRetnBX
|
pop si
|
||||||
|
pop bp
|
||||||
|
pop bx
|
||||||
|
pop dx
|
||||||
|
pop cx
|
||||||
|
pop ax
|
||||||
|
|
||||||
|
iret
|
||||||
|
|
||||||
;
|
|
||||||
;Set FastOpen but does nothing.
|
|
||||||
IntDosCal_2a:
|
|
||||||
clc
|
|
||||||
jmp FarTabRetn
|
|
||||||
;
|
|
||||||
; added by James Tabor For Zip Drives
|
|
||||||
;Return Null Device Pointer
|
|
||||||
IntDosCal_2c:
|
|
||||||
mov ax,_nul_dev
|
|
||||||
mov bx,seg _nul_dev
|
|
||||||
clc
|
|
||||||
jmp FarTabRetn
|
|
||||||
|
|
||||||
|
|
||||||
; Int 2F Multipurpose Remote System Calls
|
; Int 2F Multipurpose Remote System Calls
|
||||||
|
@ -37,6 +37,9 @@ BYTE *RcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.31 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.30 2001/08/19 12:58:36 bartoldeman
|
* Revision 1.30 2001/08/19 12:58:36 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -274,11 +277,19 @@ VOID FAR int21_entry(iregs UserRegs)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Structures needed for int 25 / int 26 */
|
||||||
|
struct HugeSectorBlock
|
||||||
|
{
|
||||||
|
ULONG blkno;
|
||||||
|
WORD nblks;
|
||||||
|
BYTE FAR *buf;
|
||||||
|
};
|
||||||
|
|
||||||
/* Normal entry. This minimizes user stack usage by avoiding local */
|
/* Normal entry. This minimizes user stack usage by avoiding local */
|
||||||
/* variables needed for the rest of the handler. */
|
/* variables needed for the rest of the handler. */
|
||||||
/* this here works on the users stack !! and only very few functions
|
/* this here works on the users stack !! and only very few functions
|
||||||
are allowed */
|
are allowed */
|
||||||
VOID int21_syscall(iregs FAR * irp)
|
VOID ASMCFUNC int21_syscall(iregs FAR * irp)
|
||||||
{
|
{
|
||||||
Int21AX = irp->AX;
|
Int21AX = irp->AX;
|
||||||
|
|
||||||
@ -364,7 +375,7 @@ VOID int21_syscall(iregs FAR * irp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID int21_service(iregs FAR * r)
|
VOID ASMCFUNC int21_service(iregs FAR * r)
|
||||||
{
|
{
|
||||||
COUNT rc = 0,
|
COUNT rc = 0,
|
||||||
rc1;
|
rc1;
|
||||||
@ -893,7 +904,11 @@ dispatch:
|
|||||||
}
|
}
|
||||||
dpb->dpb_flags = M_CHANGED; /* force reread of drive BPB/DPB */
|
dpb->dpb_flags = M_CHANGED; /* force reread of drive BPB/DPB */
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (media_check(dpb) < 0 || ISFAT32(dpb))
|
||||||
|
#else
|
||||||
if (media_check(dpb) < 0)
|
if (media_check(dpb) < 0)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
r->AL = 0xff;
|
r->AL = 0xff;
|
||||||
CritErrCode = 0x0f;
|
CritErrCode = 0x0f;
|
||||||
@ -1255,7 +1270,11 @@ dispatch:
|
|||||||
|
|
||||||
case 0x53:
|
case 0x53:
|
||||||
/* DOS 2+ internal - TRANSLATE BIOS PARAMETER BLOCK TO DRIVE PARAM BLOCK */
|
/* DOS 2+ internal - TRANSLATE BIOS PARAMETER BLOCK TO DRIVE PARAM BLOCK */
|
||||||
bpb_to_dpb((bpb FAR *)MK_FP(r->DS, r->SI), (struct dpb FAR *)MK_FP(r->ES, r->BP));
|
bpb_to_dpb((bpb FAR *)MK_FP(r->DS, r->SI), (struct dpb FAR *)MK_FP(r->ES, r->BP)
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
,(r->CX == 0x4558 && r->DX == 0x4152)
|
||||||
|
#endif
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Get verify state */
|
/* Get verify state */
|
||||||
@ -1721,11 +1740,216 @@ break_out:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* case 0x6d and above not implemented : see default; return AL=0 */
|
/* case 0x6d and above not implemented : see default; return AL=0 */
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
/* DOS 7.0+ FAT32 extended funcitons */
|
||||||
|
case 0x73:
|
||||||
|
{
|
||||||
|
switch(r->AL)
|
||||||
|
{
|
||||||
|
/* Get extended drive parameter block */
|
||||||
|
case 0x02:
|
||||||
|
{
|
||||||
|
struct xdpbdata FAR *xddp = (struct xdpbdata FAR *)MK_FP(r->ES, r->DI);
|
||||||
|
struct dpb FAR *dpb;
|
||||||
|
|
||||||
|
if (r->CX < sizeof(struct xdpbdata))
|
||||||
|
{
|
||||||
|
r->AX = -DE_INVLDBUF;
|
||||||
|
goto error_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dpb = GetDriveDPB(r->DL, &rc);
|
||||||
|
if (rc != SUCCESS) goto error_exit;
|
||||||
|
|
||||||
|
dpb->dpb_flags = M_CHANGED; /* force reread of drive BPB/DPB */
|
||||||
|
|
||||||
|
if (media_check(dpb) < 0)
|
||||||
|
{
|
||||||
|
r->AX = -DE_INVLDDRV;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
fmemcpy(&xddp->xdd_dpb, dpb, sizeof(struct dpb));
|
||||||
|
xddp->xdd_dpbsize = sizeof(struct dpb);
|
||||||
|
CLEAR_CARRY_FLAG();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Get extended free drive space */
|
||||||
|
case 0x03:
|
||||||
|
{
|
||||||
|
struct xfreespace FAR *xfsp =
|
||||||
|
(struct xfreespace FAR *)MK_FP(r->ES, r->DI);
|
||||||
|
if (r->CX < sizeof(struct xfreespace))
|
||||||
|
{
|
||||||
|
r->AX = -DE_INVLDBUF;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
CLEAR_CARRY_FLAG();
|
||||||
|
rc = DosGetExtFree((BYTE FAR *)FP_DS_DX, xfsp);
|
||||||
|
if (rc != SUCCESS)
|
||||||
|
goto error_exit;
|
||||||
|
xfsp->xfs_datasize = sizeof(struct xfreespace);
|
||||||
|
xfsp->xfs_version.actual = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Set DPB to use for formatting */
|
||||||
|
case 0x04:
|
||||||
|
{
|
||||||
|
struct xdpbforformat FAR *xdffp =
|
||||||
|
(struct xdpbforformat FAR *)MK_FP(r->ES, r->DI);
|
||||||
|
struct dpb FAR *dpb;
|
||||||
|
if (r->CX < sizeof(struct xdpbforformat))
|
||||||
|
{
|
||||||
|
r->AX = -DE_INVLDBUF;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
dpb = GetDriveDPB(r->DL, &rc);
|
||||||
|
if (rc != SUCCESS) goto error_exit;
|
||||||
|
|
||||||
|
CLEAR_CARRY_FLAG();
|
||||||
|
xdffp->xdff_datasize = sizeof(struct xdpbforformat);
|
||||||
|
xdffp->xdff_version.actual = 0;
|
||||||
|
|
||||||
|
switch ((UWORD)xdffp->xdff_function)
|
||||||
|
{
|
||||||
|
case 0x00:
|
||||||
|
{
|
||||||
|
DWORD nfreeclst = xdffp->xdff_f.setdpbcounts.nfreeclst;
|
||||||
|
DWORD cluster = xdffp->xdff_f.setdpbcounts.cluster;
|
||||||
|
if ((dpb->dpb_xfsinfosec == 0xffff && (nfreeclst != 0 ||
|
||||||
|
cluster != 0)) ||
|
||||||
|
nfreeclst == 1 || nfreeclst > dpb->dpb_size ||
|
||||||
|
cluster == 1 || cluster > dpb->dpb_size)
|
||||||
|
{
|
||||||
|
r->AX = -DE_INVLDPARM;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
dpb->dpb_nfreeclst = nfreeclst;
|
||||||
|
dpb->dpb_cluster = cluster;
|
||||||
|
write_fsinfo(dpb);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x01:
|
||||||
|
{
|
||||||
|
ddt *pddt = getddt(r->DL);
|
||||||
|
fmemcpy(&pddt->ddt_bpb, xdffp->xdff_f.rebuilddpb.bpbp,
|
||||||
|
sizeof(bpb));
|
||||||
|
}
|
||||||
|
case 0x02:
|
||||||
|
{
|
||||||
|
rebuild_dpb:
|
||||||
|
dpb->dpb_flags = M_CHANGED;
|
||||||
|
|
||||||
|
if (media_check(dpb) < 0)
|
||||||
|
{
|
||||||
|
r->AX = -DE_INVLDDRV;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x03:
|
||||||
|
{
|
||||||
|
struct buffer FAR *bp;
|
||||||
|
bpb FAR *bpbp;
|
||||||
|
DWORD newmirroring = xdffp->xdff_f.setmirroring.newmirroring;
|
||||||
|
if (newmirroring != -1 && newmirroring & ~(0xf | 0x80))
|
||||||
|
{
|
||||||
|
r->AX = -DE_INVLDPARM;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
xdffp->xdff_f.setmirroring.oldmirroring = dpb->dpb_xflags;
|
||||||
|
if (newmirroring != -1)
|
||||||
|
{
|
||||||
|
bp = getblock(1, dpb->dpb_unit);
|
||||||
|
bp->b_flag &= ~(BFR_DATA | BFR_DIR | BFR_FAT);
|
||||||
|
bp->b_flag |= BFR_VALID | BFR_DIRTY;
|
||||||
|
bpbp = (bpb FAR *)& bp->b_buffer[BT_BPB];
|
||||||
|
bpbp->bpb_xflags = newmirroring;
|
||||||
|
}
|
||||||
|
goto rebuild_dpb;
|
||||||
|
}
|
||||||
|
case 0x04:
|
||||||
|
{
|
||||||
|
struct buffer FAR *bp;
|
||||||
|
bpb FAR *bpbp;
|
||||||
|
DWORD rootclst = xdffp->xdff_f.setroot.newrootclst;
|
||||||
|
if (rootclst != -1 && (rootclst == 1 ||
|
||||||
|
rootclst > dpb->dpb_size))
|
||||||
|
{
|
||||||
|
r->AX = -DE_INVLDPARM;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
xdffp->xdff_f.setroot.oldrootclst = dpb->dpb_xrootclst;
|
||||||
|
if (rootclst != -1)
|
||||||
|
{
|
||||||
|
bp = getblock(1, dpb->dpb_unit);
|
||||||
|
bp->b_flag &= ~(BFR_DATA | BFR_DIR | BFR_FAT);
|
||||||
|
bp->b_flag |= BFR_VALID | BFR_DIRTY;
|
||||||
|
bpbp = (bpb FAR *) & bp->b_buffer[BT_BPB];
|
||||||
|
bpbp->bpb_xrootclst = rootclst;
|
||||||
|
}
|
||||||
|
goto rebuild_dpb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Extended absolute disk read/write */
|
||||||
|
/* TODO(vlp) consider using of the 13-14th bits of SI */
|
||||||
|
case 0x05:
|
||||||
|
{
|
||||||
|
struct HugeSectorBlock FAR *SectorBlock =
|
||||||
|
(struct HugeSectorBlock FAR *)MK_FP(r->DS, r->BX);
|
||||||
|
UBYTE mode;
|
||||||
|
|
||||||
|
if (r->CX != 0xffff || ((r->SI & 1) == 0 && r->SI != 0)
|
||||||
|
|| (r->SI & ~0x6001))
|
||||||
|
{
|
||||||
|
r->AX = -DE_INVLDPARM;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r->DL - 1 >= lastdrive || r->DL == 0)
|
||||||
|
{
|
||||||
|
r->AX = 0x207;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
CLEAR_CARRY_FLAG();
|
||||||
|
|
||||||
|
if (r->SI == 0) mode = DSKREAD;
|
||||||
|
else mode = DSKWRITE;
|
||||||
|
InDOS++;
|
||||||
|
|
||||||
|
r->AX=dskxfer(r->DL - 1, SectorBlock->blkno, SectorBlock->buf,
|
||||||
|
SectorBlock->nblks, mode);
|
||||||
|
|
||||||
|
if (mode == DSKWRITE)
|
||||||
|
if (r->AX <= 0)
|
||||||
|
setinvld(r->DL - 1);
|
||||||
|
|
||||||
|
if (r->AX > 0)
|
||||||
|
{
|
||||||
|
r->AX = 0x20c;
|
||||||
|
r->flags |= FLG_CARRY;
|
||||||
|
--InDOS;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
r->AX = 0;
|
||||||
|
r->flags &= ~FLG_CARRY;
|
||||||
|
--InDOS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (bDumpRegs)
|
if (bDumpRegs)
|
||||||
{
|
{
|
||||||
@ -1737,11 +1961,6 @@ break_out:
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* terminate handler */
|
|
||||||
VOID INRPT FAR int22_handler(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* No kernel INT-23 handler required no longer -- 1999/04/15 ska */
|
/* No kernel INT-23 handler required no longer -- 1999/04/15 ska */
|
||||||
/* ctrl-Break handler */
|
/* ctrl-Break handler */
|
||||||
@ -1760,14 +1979,6 @@ VOID INRPT FAR int23_handler(int es, int ds, int di, int si, int bp, int sp, int
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Structures needed for int 25 / int 26 */
|
|
||||||
struct HugeSectorBlock
|
|
||||||
{
|
|
||||||
ULONG blkno;
|
|
||||||
WORD nblks;
|
|
||||||
BYTE FAR *buf;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct int25regs
|
struct int25regs
|
||||||
{
|
{
|
||||||
UWORD es,
|
UWORD es,
|
||||||
@ -1788,7 +1999,7 @@ struct int25regs
|
|||||||
/*
|
/*
|
||||||
this function is called from an assembler wrapper function
|
this function is called from an assembler wrapper function
|
||||||
*/
|
*/
|
||||||
VOID int2526_handler(WORD mode, struct int25regs FAR * r)
|
VOID ASMCFUNC int2526_handler(WORD mode, struct int25regs FAR * r)
|
||||||
{
|
{
|
||||||
ULONG blkno;
|
ULONG blkno;
|
||||||
UWORD nblks;
|
UWORD nblks;
|
||||||
@ -1807,6 +2018,15 @@ VOID int2526_handler(WORD mode, struct int25regs FAR * r)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
if (!(CDSp->cds_table[drv].cdsFlags & CDSNETWDRV) &&
|
||||||
|
ISFAT32(CDSp->cds_table[drv].cdsDpb))
|
||||||
|
{
|
||||||
|
r->ax = 0x207;
|
||||||
|
r->flags |= FLG_CARRY;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
nblks = r->cx;
|
nblks = r->cx;
|
||||||
blkno = r->dx;
|
blkno = r->dx;
|
||||||
@ -1868,3 +2088,138 @@ static VOID StartTrace(VOID)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
this function is called from an assembler wrapper function
|
||||||
|
and serves the internal dos calls - int2f/12xx
|
||||||
|
*/
|
||||||
|
struct int2f12regs
|
||||||
|
{
|
||||||
|
UWORD es,ds;
|
||||||
|
UWORD di,si,bp,bx,dx,cx,ax;
|
||||||
|
UWORD ip,cs,flags;
|
||||||
|
UWORD callerARG1; /* used if called from INT2F/12 */
|
||||||
|
};
|
||||||
|
|
||||||
|
VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
|
||||||
|
{
|
||||||
|
UWORD function = r.ax & 0xff;
|
||||||
|
|
||||||
|
if (function > 0x31)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch(function)
|
||||||
|
{
|
||||||
|
case 0x00: /* installation check */
|
||||||
|
r.ax |= 0x00ff;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x03: /* get DOS data segment */
|
||||||
|
r.ds = FP_SEG(&nul_dev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x08: /* decrease SFT reference count */
|
||||||
|
{
|
||||||
|
UWORD FAR *SFTp = MK_FP(r.es,r.di);
|
||||||
|
|
||||||
|
r.ax = *SFTp;
|
||||||
|
|
||||||
|
if (--*SFTp == 0) --*SFTp;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x12: /* get length of asciiz string */
|
||||||
|
|
||||||
|
r.cx = fstrlen(MK_FP(r.es, r.di))+1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
case 0x18: /* get caller's registers */
|
||||||
|
|
||||||
|
r.ds = FP_SEG(user_r);
|
||||||
|
r.si = FP_OFF(user_r);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x1b: /* #days in February - valid until 2099.*/
|
||||||
|
|
||||||
|
r.ax = (r.ax & 0xff00) | (r.cx & 3 ? 28 : 29);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x21: /* truename */
|
||||||
|
|
||||||
|
truename(MK_FP(r.ds,r.si), MK_FP(r.es,r.di),0);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x25: /* get length of asciiz string */
|
||||||
|
|
||||||
|
r.cx = fstrlen(MK_FP(r.ds, r.si))+1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case 0x2a: /* Set FastOpen but does nothing. */
|
||||||
|
|
||||||
|
r.flags &= ~FLG_CARRY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x2c: /* added by James Tabor For Zip Drives
|
||||||
|
Return Null Device Pointer */
|
||||||
|
/* by UDOS+RBIL: get header of SECOND device driver in device chain,
|
||||||
|
omitting the NUL device TE*/
|
||||||
|
r.bx = FP_SEG(nul_dev.dh_next);
|
||||||
|
r.ax = FP_OFF(nul_dev.dh_next);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x2e: /* GET or SET error table addresse - ignored
|
||||||
|
called by MS debug with DS != DOSDS, printf
|
||||||
|
doesn't work!! */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x16: /* get address of system file table entry - used by NET.EXE
|
||||||
|
BX system file table entry number ( such as returned from 2F/1220)
|
||||||
|
returns
|
||||||
|
ES:DI pointer to SFT entry */
|
||||||
|
{
|
||||||
|
sft FAR *p = get_sft(r.bx);
|
||||||
|
|
||||||
|
r.es = FP_SEG(p);
|
||||||
|
r.di = FP_OFF(p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
case 0x17: /* get current directory structure for drive - used by NET.EXE
|
||||||
|
STACK: drive (0=A:,1=B,...)
|
||||||
|
; returns
|
||||||
|
; CF set if error
|
||||||
|
; DS:SI pointer to CDS for drive
|
||||||
|
;
|
||||||
|
; called like
|
||||||
|
; push 2 (c-drive)
|
||||||
|
; mov ax,1217
|
||||||
|
; int 2f
|
||||||
|
;
|
||||||
|
; probable use: get sizeof(CDSentry)
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
UWORD drv = r.callerARG1 & 0xff;
|
||||||
|
|
||||||
|
if (drv >= lastdrive)
|
||||||
|
r.flags |= FLG_CARRY;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r.ds = FP_SEG(CDSp);
|
||||||
|
r.si = FP_OFF(&CDSp->cds_table[drv]);
|
||||||
|
r.flags &= ~FLG_CARRY;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
printf("unknown internal dos function INT2F/12%02x\n",function);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -6,4 +6,4 @@ struct REGPACK {
|
|||||||
unsigned r_bp, r_di, r_si, r_ds, r_es, r_flags;
|
unsigned r_bp, r_di, r_si, r_ds, r_es, r_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void intr(int intrnr, struct REGPACK *rp);
|
extern void ASMCFUNC intr(int intrnr, struct REGPACK *rp);
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
; $Header$
|
; $Header$
|
||||||
;
|
;
|
||||||
; $Log$
|
; $Log$
|
||||||
|
; Revision 1.10 2001/09/23 20:39:44 bartoldeman
|
||||||
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
;
|
||||||
; Revision 1.9 2001/04/29 17:34:40 bartoldeman
|
; Revision 1.9 2001/04/29 17:34:40 bartoldeman
|
||||||
; A new SYS.COM/config.sys single stepping/console output/misc fixes.
|
; A new SYS.COM/config.sys single stepping/console output/misc fixes.
|
||||||
;
|
;
|
||||||
@ -217,6 +220,15 @@ _blk_dev equ $
|
|||||||
_nblk_rel db 4
|
_nblk_rel db 4
|
||||||
db 0,0,0,0,0,0,0
|
db 0,0,0,0,0,0,0
|
||||||
|
|
||||||
|
; quick hack for MSC
|
||||||
|
global _Get_nblk_rel
|
||||||
|
_Get_nblk_rel:
|
||||||
|
mov ah,0
|
||||||
|
mov al,[cs:_nblk_rel]
|
||||||
|
retf
|
||||||
|
;end of hack
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;
|
;
|
||||||
; Temporary table until next release
|
; Temporary table until next release
|
||||||
|
@ -30,6 +30,9 @@
|
|||||||
; $Header$
|
; $Header$
|
||||||
;
|
;
|
||||||
; $Log$
|
; $Log$
|
||||||
|
; Revision 1.5 2001/09/23 20:39:44 bartoldeman
|
||||||
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
;
|
||||||
; Revision 1.4 2001/03/21 02:56:26 bartoldeman
|
; Revision 1.4 2001/03/21 02:56:26 bartoldeman
|
||||||
; See history.txt for changes. Bug fixes and HMA support are the main ones.
|
; See history.txt for changes. Bug fixes and HMA support are the main ones.
|
||||||
;
|
;
|
||||||
@ -63,6 +66,25 @@
|
|||||||
|
|
||||||
%include "segs.inc"
|
%include "segs.inc"
|
||||||
|
|
||||||
|
;
|
||||||
|
; Error Return Codes
|
||||||
|
;
|
||||||
|
|
||||||
|
%define E_WRPRT 0 ; Write Protect
|
||||||
|
%define E_UNIT 1 ; Unknown Unit
|
||||||
|
%define E_NOTRDY 2 ; Device Not Ready
|
||||||
|
%define E_CMD 3 ; Unknown Command
|
||||||
|
%define E_CRC 4 ; Crc Error
|
||||||
|
%define E_LENGTH 5 ; Bad Length
|
||||||
|
%define E_SEEK 6 ; Seek Error
|
||||||
|
%define E_MEDIA 7 ; Unknown MEDIA
|
||||||
|
%define E_NOTFND 8 ; Sector Not Found
|
||||||
|
%define E_PAPER 9 ; No Paper
|
||||||
|
%define E_WRITE 10 ; Write Fault
|
||||||
|
%define E_READ 11 ; Read Fault
|
||||||
|
%define E_FAILURE 12 ; General Failure
|
||||||
|
|
||||||
|
|
||||||
extern _IOExit:wrt TGROUP
|
extern _IOExit:wrt TGROUP
|
||||||
extern _IOSuccess:wrt TGROUP
|
extern _IOSuccess:wrt TGROUP
|
||||||
extern _IOErrorExit:wrt TGROUP
|
extern _IOErrorExit:wrt TGROUP
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
; $Id$
|
; $Id$
|
||||||
;
|
;
|
||||||
; $Log$
|
; $Log$
|
||||||
|
; Revision 1.18 2001/09/23 20:39:44 bartoldeman
|
||||||
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
;
|
||||||
; Revision 1.17 2001/08/19 12:58:36 bartoldeman
|
; Revision 1.17 2001/08/19 12:58:36 bartoldeman
|
||||||
; Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
; Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
;
|
;
|
||||||
@ -171,7 +174,7 @@ beyond_entry: resb 256-(beyond_entry-entry)
|
|||||||
|
|
||||||
segment INIT_TEXT
|
segment INIT_TEXT
|
||||||
|
|
||||||
extern _main:wrt IGROUP
|
extern _FreeDOSmain:wrt IGROUP
|
||||||
|
|
||||||
;
|
;
|
||||||
; kernel start-up
|
; kernel start-up
|
||||||
@ -255,7 +258,7 @@ floppy: mov byte [_BootDrive],bl ; tell where we came from
|
|||||||
mov ax,cs
|
mov ax,cs
|
||||||
mov ds,ax
|
mov ds,ax
|
||||||
mov es,ax
|
mov es,ax
|
||||||
jmp _main
|
jmp _FreeDOSmain
|
||||||
|
|
||||||
segment INIT_TEXT_END
|
segment INIT_TEXT_END
|
||||||
|
|
||||||
@ -292,6 +295,8 @@ segment _FIXED_DATA
|
|||||||
; use. A 0 indicates MS-DOS 3.X style, a 1 indicates MS-DOS 4.0-6.X style.
|
; use. A 0 indicates MS-DOS 3.X style, a 1 indicates MS-DOS 4.0-6.X style.
|
||||||
global DATASTART
|
global DATASTART
|
||||||
DATASTART:
|
DATASTART:
|
||||||
|
global _DATASTART
|
||||||
|
_DATASTART:
|
||||||
dos_data db 0
|
dos_data db 0
|
||||||
dw kernel_start
|
dw kernel_start
|
||||||
db 0 ; padding
|
db 0 ; padding
|
||||||
@ -326,7 +331,7 @@ _sfthead dw _firstsftt ; 0004 System File Table head
|
|||||||
global _clock
|
global _clock
|
||||||
_clock dd 0 ; 0008 CLOCK$ device
|
_clock dd 0 ; 0008 CLOCK$ device
|
||||||
global _syscon
|
global _syscon
|
||||||
_syscon dd 0 ; 000c console device
|
_syscon dw _con_dev,seg _con_dev ; 000c console device
|
||||||
global _maxbksize
|
global _maxbksize
|
||||||
_maxbksize dw 512 ; 0010 maximum bytes/sector of any block device
|
_maxbksize dw 512 ; 0010 maximum bytes/sector of any block device
|
||||||
dw buf_info ; 0012 pointer to buffers info structure
|
dw buf_info ; 0012 pointer to buffers info structure
|
||||||
@ -654,14 +659,6 @@ intr_dos_stk resw 1
|
|||||||
intr_dos_seg resw 1
|
intr_dos_seg resw 1
|
||||||
|
|
||||||
|
|
||||||
global _api_sp
|
|
||||||
_api_sp dw 0 ; api stacks - for context
|
|
||||||
global _api_ss
|
|
||||||
_api_ss dw 0 ; switching
|
|
||||||
global _usr_sp
|
|
||||||
_usr_sp dw 0 ; user stacks
|
|
||||||
global _usr_ss
|
|
||||||
_usr_ss dw 0
|
|
||||||
global _ram_top
|
global _ram_top
|
||||||
_ram_top dw 0
|
_ram_top dw 0
|
||||||
|
|
||||||
@ -764,9 +761,11 @@ segment _STACK class=STACK stack
|
|||||||
segment _TEXT
|
segment _TEXT
|
||||||
; dummy interrupt return handlers
|
; dummy interrupt return handlers
|
||||||
|
|
||||||
|
global _int22_handler
|
||||||
global _int28_handler
|
global _int28_handler
|
||||||
global _int2a_handler
|
global _int2a_handler
|
||||||
global _empty_handler
|
global _empty_handler
|
||||||
|
_int22_handler:
|
||||||
_int28_handler:
|
_int28_handler:
|
||||||
_int2a_handler:
|
_int2a_handler:
|
||||||
_empty_handler:
|
_empty_handler:
|
||||||
|
130
kernel/main.c
130
kernel/main.c
@ -29,6 +29,10 @@
|
|||||||
|
|
||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
#include "init-mod.h"
|
#include "init-mod.h"
|
||||||
|
#include "dyndata.h"
|
||||||
|
#include "init-dat.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
These are the far variables from the DOS data segment that we need here. The
|
These are the far variables from the DOS data segment that we need here. The
|
||||||
@ -38,31 +42,31 @@
|
|||||||
|
|
||||||
-- Bart
|
-- Bart
|
||||||
*/
|
*/
|
||||||
extern UBYTE FAR nblkdev,
|
extern UBYTE DOSFAR nblkdev,
|
||||||
FAR lastdrive; /* value of last drive */
|
DOSFAR lastdrive; /* value of last drive */
|
||||||
|
|
||||||
GLOBAL BYTE
|
GLOBAL BYTE
|
||||||
FAR os_major, /* major version number */
|
DOSFAR os_major, /* major version number */
|
||||||
FAR os_minor, /* minor version number */
|
DOSFAR os_minor, /* minor version number */
|
||||||
FAR dosidle_flag,
|
DOSFAR dosidle_flag,
|
||||||
FAR BootDrive, /* Drive we came up from */
|
DOSFAR BootDrive, /* Drive we came up from */
|
||||||
FAR default_drive; /* default drive for dos */
|
DOSFAR default_drive; /* default drive for dos */
|
||||||
|
|
||||||
GLOBAL BYTE FAR os_release[];
|
GLOBAL BYTE DOSFAR os_release[];
|
||||||
GLOBAL BYTE FAR copyright[];
|
GLOBAL BYTE DOSFAR copyright[];
|
||||||
GLOBAL seg FAR RootPsp; /* Root process -- do not abort */
|
GLOBAL seg DOSFAR RootPsp; /* Root process -- do not abort */
|
||||||
|
|
||||||
extern struct dpb FAR * FAR DPBp; /* First drive Parameter Block */
|
extern struct dpb FAR * DOSFAR DPBp; /* First drive Parameter Block */
|
||||||
extern cdstbl FAR * FAR CDSp; /* Current Directory Structure */
|
extern cdstbl FAR * DOSFAR CDSp; /* Current Directory Structure */
|
||||||
|
|
||||||
extern struct dhdr FAR * FAR clock, /* CLOCK$ device */
|
extern struct dhdr FAR * DOSFAR clock, /* CLOCK$ device */
|
||||||
FAR * FAR syscon; /* console device */
|
FAR * DOSFAR syscon; /* console device */
|
||||||
extern struct dhdr FAR con_dev, /* console device drive */
|
extern struct dhdr DOSTEXTFAR con_dev, /* console device drive */
|
||||||
FAR clk_dev, /* Clock device driver */
|
DOSTEXTFAR clk_dev, /* Clock device driver */
|
||||||
FAR blk_dev; /* Block device (Disk) driver */
|
DOSTEXTFAR blk_dev; /* Block device (Disk) driver */
|
||||||
extern UWORD
|
extern UWORD
|
||||||
FAR ram_top; /* How much ram in Kbytes */
|
DOSFAR ram_top; /* How much ram in Kbytes */
|
||||||
extern iregs FAR * FAR user_r; /* User registers for int 21h call */
|
extern iregs FAR * DOSFAR user_r; /* User registers for int 21h call */
|
||||||
extern BYTE FAR _HMATextEnd[];
|
extern BYTE FAR _HMATextEnd[];
|
||||||
|
|
||||||
#ifdef VERSION_STRINGS
|
#ifdef VERSION_STRINGS
|
||||||
@ -71,6 +75,9 @@ static BYTE *mainRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.21 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.20 2001/07/28 18:13:06 bartoldeman
|
* Revision 1.20 2001/07/28 18:13:06 bartoldeman
|
||||||
* Fixes for FORMAT+SYS, FATFS, get current dir, kernel init memory situation.
|
* Fixes for FORMAT+SYS, FATFS, get current dir, kernel init memory situation.
|
||||||
*
|
*
|
||||||
@ -234,9 +241,32 @@ INIT static VOID init_kernel(VOID);
|
|||||||
INIT static VOID signon(VOID);
|
INIT static VOID signon(VOID);
|
||||||
INIT VOID kernel(VOID);
|
INIT VOID kernel(VOID);
|
||||||
INIT VOID FsConfig(VOID);
|
INIT VOID FsConfig(VOID);
|
||||||
|
INIT VOID InitPrinters(VOID);
|
||||||
|
|
||||||
INIT VOID main(void)
|
#ifdef _MSC_VER
|
||||||
|
BYTE _acrtused = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
__segment DosDataSeg = 0; /* serves for all references to the DOS DATA segment
|
||||||
|
necessary for MSC+our funny linking model
|
||||||
|
*/
|
||||||
|
__segment DosTextSeg = 0;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
INIT VOID ASMCFUNC FreeDOSmain(void)
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
extern FAR DATASTART;
|
||||||
|
extern FAR prn_dev;
|
||||||
|
DosDataSeg = (__segment)&DATASTART;
|
||||||
|
DosTextSeg = (__segment)&prn_dev;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
setvec(0, int0_handler); /* zero divide */
|
setvec(0, int0_handler); /* zero divide */
|
||||||
setvec(1, empty_handler); /* single step */
|
setvec(1, empty_handler); /* single step */
|
||||||
setvec(3, empty_handler); /* debug breakpoint */
|
setvec(3, empty_handler); /* debug breakpoint */
|
||||||
@ -295,7 +325,7 @@ INIT void init_kernel(void)
|
|||||||
lpOldTop = lpTop = MK_FP(FP_SEG(lpTop) - 0xfff, 0xfff0);
|
lpOldTop = lpTop = MK_FP(FP_SEG(lpTop) - 0xfff, 0xfff0);
|
||||||
|
|
||||||
/* Fake int 21h stack frame */
|
/* Fake int 21h stack frame */
|
||||||
user_r = (iregs FAR *) DOS_PSP + 0xD0;
|
user_r = (iregs FAR *) MK_FP(DOS_PSP,0xD0);
|
||||||
|
|
||||||
#ifndef KDB
|
#ifndef KDB
|
||||||
for (i = 0x20; i <= 0x3f; i++)
|
for (i = 0x20; i <= 0x3f; i++)
|
||||||
@ -304,6 +334,7 @@ INIT void init_kernel(void)
|
|||||||
|
|
||||||
/* Initialize IO subsystem */
|
/* Initialize IO subsystem */
|
||||||
InitIO();
|
InitIO();
|
||||||
|
InitPrinters();
|
||||||
|
|
||||||
#ifndef KDB
|
#ifndef KDB
|
||||||
/* set interrupt vectors */
|
/* set interrupt vectors */
|
||||||
@ -431,14 +462,31 @@ INIT VOID FsConfig(VOID)
|
|||||||
|
|
||||||
INIT VOID signon()
|
INIT VOID signon()
|
||||||
{
|
{
|
||||||
BYTE tmp_or[81]; /* ugly constant, but this string should fit on one line */
|
printf("\n%S" ,(void FAR *)os_release);
|
||||||
|
|
||||||
printf("\nFreeDOS Kernel compatibility %d.%d\n%S\n",
|
printf("Kernel compatibility %d.%d",
|
||||||
os_major, os_minor, copyright);
|
os_major, os_minor );
|
||||||
fmemcpy(tmp_or, os_release, 81);
|
|
||||||
printf(tmp_or,
|
#if defined(__TURBOC__)
|
||||||
REVISION_MAJOR, REVISION_MINOR, REVISION_SEQ,
|
printf(" - TURBOC");
|
||||||
BUILD);
|
#elif defined(_MSC_VER)
|
||||||
|
printf(" - MSC");
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
printf(" - WATCOMC");
|
||||||
|
#else
|
||||||
|
generate some bullshit error here, as the compiler should be known
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (I386)
|
||||||
|
printf(" - 80386 CPU required");
|
||||||
|
#elif defined (I186)
|
||||||
|
printf(" - 80186 CPU required");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
printf(" - FAT32 support");
|
||||||
|
#endif
|
||||||
|
printf("\n\n%S",(void FAR *)copyright);
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT void kernel()
|
INIT void kernel()
|
||||||
@ -683,3 +731,29 @@ VOID init_fatal(BYTE * err_msg)
|
|||||||
printf("\nInternal kernel error - %s\nSystem halted\n", err_msg);
|
printf("\nInternal kernel error - %s\nSystem halted\n", err_msg);
|
||||||
for (;;) ;
|
for (;;) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Initialize all printers
|
||||||
|
|
||||||
|
this should work. IMHO, this might also be done on first use
|
||||||
|
of printer, as I never liked the noise by a resetting printer, and
|
||||||
|
I usually much more often reset my system, then I print :-)
|
||||||
|
*/
|
||||||
|
|
||||||
|
INIT VOID InitPrinters(VOID)
|
||||||
|
{
|
||||||
|
iregs r;
|
||||||
|
int num_printers,i;
|
||||||
|
|
||||||
|
init_call_intr(0x11,&r); /* get equipment list */
|
||||||
|
|
||||||
|
num_printers = (r.a.x >> 14) & 3; /* bits 15-14 */
|
||||||
|
|
||||||
|
for (i = 0;i < num_printers;i++)
|
||||||
|
{
|
||||||
|
r.a.x = 0x0100; /* initialize printer */
|
||||||
|
r.d.x = i;
|
||||||
|
init_call_intr(0x17,&r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,9 @@ static BYTE *memmgrRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.15 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.14 2001/04/21 22:32:53 bartoldeman
|
* Revision 1.14 2001/04/21 22:32:53 bartoldeman
|
||||||
* Init DS=Init CS, fixed stack overflow problems and misc bugs.
|
* Init DS=Init CS, fixed stack overflow problems and misc bugs.
|
||||||
*
|
*
|
||||||
@ -524,6 +527,12 @@ COUNT DosMemChange(UWORD para, UWORD size, UWORD * maxSize)
|
|||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
q->m_name[i] = '\0';
|
q->m_name[i] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* MS network client NET.EXE: DosMemChange sets the PSP *
|
||||||
|
* not tested, if always, or only on success TE*
|
||||||
|
* only on success seems more logical to me - Bart */
|
||||||
|
p->m_psp = cu_psp;
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,6 +31,9 @@ static BYTE *mainRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.14 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.13 2001/08/20 20:32:15 bartoldeman
|
* Revision 1.13 2001/08/20 20:32:15 bartoldeman
|
||||||
* Truename, get free space and ctrl-break fixes.
|
* Truename, get free space and ctrl-break fixes.
|
||||||
*
|
*
|
||||||
@ -255,7 +258,7 @@ COUNT get_verify_drive(char FAR *src)
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
COUNT truename(char FAR * src, char FAR * dest, COUNT t)
|
COUNT ASMCFUNC truename(char FAR * src, char FAR * dest, COUNT t)
|
||||||
{
|
{
|
||||||
static char buf[128] = "A:\\\0\0\0\0\0\0\0\0\0";
|
static char buf[128] = "A:\\\0\0\0\0\0\0\0\0\0";
|
||||||
char *bufp = buf + 3;
|
char *bufp = buf + 3;
|
||||||
@ -353,7 +356,7 @@ COUNT truename(char FAR * src, char FAR * dest, COUNT t)
|
|||||||
|
|
||||||
if (*src != '\\' && *src != '/') /* append current dir */
|
if (*src != '\\' && *src != '/') /* append current dir */
|
||||||
{
|
{
|
||||||
DosGetCuDir(i+1, bufp);
|
DosGetCuDir((UBYTE)(i+1), bufp);
|
||||||
if (*bufp)
|
if (*bufp)
|
||||||
{
|
{
|
||||||
while (*bufp)
|
while (*bufp)
|
||||||
|
10
kernel/nls.c
10
kernel/nls.c
@ -44,6 +44,9 @@ static BYTE *RcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.9 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.8 2001/07/09 22:19:33 bartoldeman
|
* Revision 1.8 2001/07/09 22:19:33 bartoldeman
|
||||||
* LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
* LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
||||||
*
|
*
|
||||||
@ -482,7 +485,7 @@ VOID DosUpMem(VOID FAR * str, unsigned len)
|
|||||||
* the HiByte of the first argument must remain unchanged.
|
* the HiByte of the first argument must remain unchanged.
|
||||||
* See NLSSUPT.ASM -- 2000/03/30 ska
|
* See NLSSUPT.ASM -- 2000/03/30 ska
|
||||||
*/
|
*/
|
||||||
unsigned char DosUpChar(unsigned char ch)
|
unsigned char ASMCFUNC DosUpChar(unsigned char ch)
|
||||||
/* upcase a single character */
|
/* upcase a single character */
|
||||||
{
|
{
|
||||||
assertDSeqSS(); /* because "&ch" */
|
assertDSeqSS(); /* because "&ch" */
|
||||||
@ -629,11 +632,10 @@ COUNT DosSetCodepage(UWORD actCP, UWORD sysCP)
|
|||||||
Return value: AL register to be returned
|
Return value: AL register to be returned
|
||||||
if AL == 0, Carry must be cleared, otherwise set
|
if AL == 0, Carry must be cleared, otherwise set
|
||||||
*/
|
*/
|
||||||
#pragma argsused
|
UWORD ASMCFUNC syscall_MUX14(DIRECT_IREGS)
|
||||||
UWORD syscall_MUX14(DIRECT_IREGS)
|
|
||||||
{ struct nlsPackage FAR*nls; /* addressed NLS package */
|
{ struct nlsPackage FAR*nls; /* addressed NLS package */
|
||||||
|
|
||||||
if (flags || cs || ip || ds || es || si);
|
UNREFERENCED_PARAMETER (flags || cs || ip || ds || es || si);
|
||||||
|
|
||||||
log( ("NLS: MUX14(): subfct=%x, cp=%u, cntry=%u\n",
|
log( ("NLS: MUX14(): subfct=%x, cp=%u, cntry=%u\n",
|
||||||
AL, BX, DX) );
|
AL, BX, DX) );
|
||||||
|
30
kernel/prf.c
30
kernel/prf.c
@ -41,7 +41,7 @@
|
|||||||
#define hexd init_hexd
|
#define hexd init_hexd
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
COUNT fstrlen (BYTE FAR * s); /* don't want globals.h, sorry */
|
COUNT ASMCFUNC fstrlen (BYTE FAR * s); /* don't want globals.h, sorry */
|
||||||
|
|
||||||
|
|
||||||
#ifdef VERSION_STRINGS
|
#ifdef VERSION_STRINGS
|
||||||
@ -50,6 +50,9 @@ static BYTE *prfRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.12 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.11 2001/07/22 01:58:58 bartoldeman
|
* Revision 1.11 2001/07/22 01:58:58 bartoldeman
|
||||||
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
|
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
|
||||||
*
|
*
|
||||||
@ -75,6 +78,9 @@ static BYTE *prfRcsId = "$Id$";
|
|||||||
* recoded for smaller object footprint, added main() for testing+QA
|
* recoded for smaller object footprint, added main() for testing+QA
|
||||||
*
|
*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.12 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.11 2001/07/22 01:58:58 bartoldeman
|
* Revision 1.11 2001/07/22 01:58:58 bartoldeman
|
||||||
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
|
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
|
||||||
*
|
*
|
||||||
@ -141,7 +147,7 @@ static BYTE *prfRcsId = "$Id$";
|
|||||||
* Initial revision.
|
* Initial revision.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static BYTE *charp;
|
static BYTE *charp = 0;
|
||||||
|
|
||||||
#ifdef PROTO
|
#ifdef PROTO
|
||||||
VOID handle_char(COUNT);
|
VOID handle_char(COUNT);
|
||||||
@ -162,10 +168,6 @@ VOID cso(COUNT);
|
|||||||
VOID cso();
|
VOID cso();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __TURBOC__
|
|
||||||
void __int__(int); /* TC 2.01 requires this. :( -- ror4 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef FORSYS
|
#ifdef FORSYS
|
||||||
COUNT fstrlen (BYTE FAR * s) /* don't want globals.h, sorry */
|
COUNT fstrlen (BYTE FAR * s) /* don't want globals.h, sorry */
|
||||||
{
|
{
|
||||||
@ -188,9 +190,18 @@ put_console(COUNT c)
|
|||||||
#ifdef FORSYS
|
#ifdef FORSYS
|
||||||
write(1,&c,1); /* write character to stdout */
|
write(1,&c,1); /* write character to stdout */
|
||||||
#else
|
#else
|
||||||
|
#if defined(__TURBOC__)
|
||||||
_AX = 0x0e00 | c;
|
_AX = 0x0e00 | c;
|
||||||
_BX = 0x0070;
|
_BX = 0x0070;
|
||||||
__int__(0x10);
|
__int__(0x10);
|
||||||
|
#else
|
||||||
|
__asm {
|
||||||
|
mov al, byte ptr c;
|
||||||
|
mov ah, 0x0e;
|
||||||
|
mov bx, 0x0070;
|
||||||
|
int 0x10;
|
||||||
|
}
|
||||||
|
#endif /* __TURBO__*/
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,7 +238,9 @@ BYTE *
|
|||||||
p = q = s;
|
p = q = s;
|
||||||
do
|
do
|
||||||
{ /* generate digits in reverse order */
|
{ /* generate digits in reverse order */
|
||||||
*p++ = "0123456789abcdef"[(UWORD)(u % base)];
|
static char hexDigits[] = "0123456789abcdef";
|
||||||
|
|
||||||
|
*p++ = hexDigits[(UWORD)(u % base)];
|
||||||
}
|
}
|
||||||
while ((u /= base) > 0);
|
while ((u /= base) > 0);
|
||||||
|
|
||||||
@ -365,9 +378,10 @@ COUNT
|
|||||||
case 'p':
|
case 'p':
|
||||||
{
|
{
|
||||||
WORD w[2];
|
WORD w[2];
|
||||||
|
static char pointerFormat[] = "%04x:%04x";
|
||||||
w[1] = *((unsigned int*) arg)++;
|
w[1] = *((unsigned int*) arg)++;
|
||||||
w[0] = *((unsigned int*) arg)++;
|
w[0] = *((unsigned int*) arg)++;
|
||||||
do_printf("%04x:%04x",(BYTE**)&w);
|
do_printf(pointerFormat,(BYTE**)&w);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
; $Header$
|
; $Header$
|
||||||
;
|
;
|
||||||
; $Log$
|
; $Log$
|
||||||
|
; Revision 1.4 2001/09/23 20:39:44 bartoldeman
|
||||||
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
;
|
||||||
; Revision 1.3 2000/05/25 20:56:21 jimtabor
|
; Revision 1.3 2000/05/25 20:56:21 jimtabor
|
||||||
; Fixed project history
|
; Fixed project history
|
||||||
;
|
;
|
||||||
@ -52,6 +55,17 @@
|
|||||||
|
|
||||||
%include "io.inc"
|
%include "io.inc"
|
||||||
|
|
||||||
|
%define PRT_TIMEOUT 01h
|
||||||
|
%define PRT_IOERROR 08h
|
||||||
|
%define PRT_SELECTED 10h
|
||||||
|
%define PRT_OUTOFPAPER 20h
|
||||||
|
%define PRT_ACK 40h
|
||||||
|
%define PRT_NOTBUSY 80h
|
||||||
|
|
||||||
|
%define PRT_WRITECHAR 00h
|
||||||
|
%define PRT_INITPORT 01h
|
||||||
|
%define PRT_GETSTATUS 02h
|
||||||
|
|
||||||
segment _IO_FIXED_DATA
|
segment _IO_FIXED_DATA
|
||||||
|
|
||||||
global LptTable
|
global LptTable
|
||||||
@ -93,18 +107,16 @@ uPrtQuantum dw 50h
|
|||||||
PrtWrite:
|
PrtWrite:
|
||||||
jcxz PrtWr3 ; Exit if nothing to write
|
jcxz PrtWr3 ; Exit if nothing to write
|
||||||
PrtWr1:
|
PrtWr1:
|
||||||
mov bx,2
|
mov bx,2 ; number of retries
|
||||||
PrtWr2:
|
PrtWr2:
|
||||||
mov al,[es:di]
|
|
||||||
inc di
|
call PrintSingleCharacter
|
||||||
xor ah,ah ; Zero register
|
|
||||||
call PrtIOCall ; (0800)
|
|
||||||
jnz PrtWr4 ; Exit if done
|
jnz PrtWr4 ; Exit if done
|
||||||
loop PrtWr1 ; otherwise loop
|
loop PrtWr1 ; otherwise loop
|
||||||
PrtWr3:
|
PrtWr3:
|
||||||
jmp _IOExit
|
jmp _IOExit
|
||||||
PrtWr4:
|
PrtWr4:
|
||||||
dec di
|
|
||||||
dec bx
|
dec bx
|
||||||
jnz PrtWr2
|
jnz PrtWr2
|
||||||
PrtWr5:
|
PrtWr5:
|
||||||
@ -115,32 +127,32 @@ PrtWr5:
|
|||||||
PrtOutStat:
|
PrtOutStat:
|
||||||
call GetPrtStat
|
call GetPrtStat
|
||||||
jnz PrtWr5
|
jnz PrtWr5
|
||||||
mov al,9
|
mov al, E_PAPER
|
||||||
test ah,20h
|
test ah, PRT_OUTOFPAPER
|
||||||
jnz PrtWr5
|
jnz PrtWr5
|
||||||
test ah,80h
|
test ah, PRT_NOTBUSY
|
||||||
jnz PrtWr3
|
jnz PrtWr3
|
||||||
jmp _IODone
|
jmp _IODone
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GetPrtStat:
|
GetPrtStat:
|
||||||
mov ah,2
|
mov ah,PRT_GETSTATUS
|
||||||
|
|
||||||
PrtIOCall:
|
PrtIOCall:
|
||||||
call GetUnitNum
|
call GetUnitNum
|
||||||
int 17h ; print char al, get status ah
|
int 17h ; print char al, get status ah
|
||||||
test ah,8
|
test ah, PRT_TIMEOUT|PRT_IOERROR
|
||||||
jz PrtIOCal2
|
jnz PrtIOCal2
|
||||||
mov al,9
|
mov al, E_PAPER
|
||||||
test ah,20h
|
test ah, PRT_OUTOFPAPER
|
||||||
jnz PrtIOCal1
|
jnz PrtIOCal1
|
||||||
inc al
|
inc al ; al<-E_WRITE
|
||||||
PrtIOCal1:
|
PrtIOCal1:
|
||||||
retn
|
retn
|
||||||
PrtIOCal2:
|
PrtIOCal2:
|
||||||
mov al,2
|
mov al, E_NOTRDY
|
||||||
test ah,1
|
test ah, PRT_TIMEOUT
|
||||||
retn
|
retn
|
||||||
|
|
||||||
|
|
||||||
@ -161,7 +173,7 @@ PrtOtBsy1:
|
|||||||
PrtOtBsy2:
|
PrtOtBsy2:
|
||||||
call GetPrtStat
|
call GetPrtStat
|
||||||
jnz PrtOtBsy3
|
jnz PrtOtBsy3
|
||||||
test ah,80h
|
test ah, PRT_NOTBUSY
|
||||||
loopz PrtOtBsy2
|
loopz PrtOtBsy2
|
||||||
pop cx
|
pop cx
|
||||||
jz PrtOtBsy4
|
jz PrtOtBsy4
|
||||||
@ -206,3 +218,66 @@ PrtGnIoctl3:
|
|||||||
mov [cs:uPrtQuantum+bx],cx
|
mov [cs:uPrtQuantum+bx],cx
|
||||||
mov [es:di],cx
|
mov [es:di],cx
|
||||||
jmp _IOExit
|
jmp _IOExit
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; original implementation didn't work at all.
|
||||||
|
; this one's not much better either,
|
||||||
|
; but should print a little bit
|
||||||
|
;
|
||||||
|
; the status bits = AH
|
||||||
|
;
|
||||||
|
; 1 0
|
||||||
|
; 80 - BUSY not busy busy
|
||||||
|
; 40 - ACK transfer finished not yet finished
|
||||||
|
; 20 - PAP no paper available paper OK
|
||||||
|
; 10 - ONOF printer online not online
|
||||||
|
; 08 - ERR some error no error
|
||||||
|
; 01 - TIM some error when transfer OK
|
||||||
|
;
|
||||||
|
; some states
|
||||||
|
; 30 - there is no printer at all
|
||||||
|
; c8 - there is a printer without power
|
||||||
|
; 10 - printer with power, but not initialized
|
||||||
|
; 90 - this one is fine
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
; you must not simply print without asking for status
|
||||||
|
; as the BIOS has a LARGE timeout before aborting
|
||||||
|
;
|
||||||
|
|
||||||
|
PrintSingleCharacter:
|
||||||
|
|
||||||
|
mov ah, PRT_GETSTATUS ; get status, ah=2
|
||||||
|
call GetUnitNum
|
||||||
|
int 17h ; print char al, get status ah
|
||||||
|
|
||||||
|
test ah, PRT_OUTOFPAPER|PRT_IOERROR
|
||||||
|
jnz decode_error
|
||||||
|
|
||||||
|
test ah, PRT_NOTBUSY
|
||||||
|
jz decode_error
|
||||||
|
|
||||||
|
|
||||||
|
mov al,[es:di]
|
||||||
|
mov ah,PRT_WRITECHAR ; print character, ah=0
|
||||||
|
call GetUnitNum
|
||||||
|
int 17h ; print char al, get status ah
|
||||||
|
|
||||||
|
test ah, PRT_OUTOFPAPER|PRT_IOERROR|PRT_TIMEOUT
|
||||||
|
jnz decode_error
|
||||||
|
inc di
|
||||||
|
xor al,al ; set zero flag + clear al
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
decode_error:
|
||||||
|
mov al, E_PAPER
|
||||||
|
test ah, PRT_OUTOFPAPER ;out_of_paper, 20h
|
||||||
|
jnz out_of_paper
|
||||||
|
mov al, E_WRITE
|
||||||
|
out_of_paper:
|
||||||
|
or al,al ; reset zero flag
|
||||||
|
ret
|
||||||
|
@ -30,6 +30,9 @@
|
|||||||
; $Id$
|
; $Id$
|
||||||
;
|
;
|
||||||
; $Log$
|
; $Log$
|
||||||
|
; Revision 1.7 2001/09/23 20:39:44 bartoldeman
|
||||||
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
;
|
||||||
; Revision 1.6 2001/04/15 03:21:50 bartoldeman
|
; Revision 1.6 2001/04/15 03:21:50 bartoldeman
|
||||||
; See history.txt for the list of fixes.
|
; See history.txt for the list of fixes.
|
||||||
;
|
;
|
||||||
@ -93,10 +96,6 @@
|
|||||||
|
|
||||||
%include "segs.inc"
|
%include "segs.inc"
|
||||||
|
|
||||||
extern _api_sp:wrt DGROUP ; api stacks - for context
|
|
||||||
extern _api_ss:wrt DGROUP ; switching
|
|
||||||
extern _usr_sp:wrt DGROUP ; user stacks
|
|
||||||
extern _usr_ss:wrt DGROUP
|
|
||||||
extern _lpUserStack:wrt DGROUP
|
extern _lpUserStack:wrt DGROUP
|
||||||
|
|
||||||
extern _break_flg:wrt DGROUP ; break detected flag
|
extern _break_flg:wrt DGROUP ; break detected flag
|
||||||
@ -104,14 +103,14 @@
|
|||||||
|
|
||||||
%include "stacks.inc"
|
%include "stacks.inc"
|
||||||
|
|
||||||
segment _TEXT
|
segment HMA_TEXT
|
||||||
|
|
||||||
extern _DGROUP_:wrt TGROUP
|
extern _DGROUP_:wrt TGROUP
|
||||||
|
|
||||||
;
|
;
|
||||||
; Special call for switching processes
|
; Special call for switching processes
|
||||||
;
|
;
|
||||||
; void interrupt far exec_user(irp)
|
; void exec_user(irp)
|
||||||
; iregs far *irp;
|
; iregs far *irp;
|
||||||
;
|
;
|
||||||
global _exec_user
|
global _exec_user
|
||||||
@ -123,10 +122,10 @@ _exec_user:
|
|||||||
;
|
;
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
mov bp,sp
|
pop ax ; return address (unused)
|
||||||
|
|
||||||
mov ax,word [bp+6] ; irp (user ss:sp)
|
pop ax ; irp (user ss:sp)
|
||||||
mov dx,word [bp+8]
|
pop dx
|
||||||
cli
|
cli
|
||||||
mov ss,dx
|
mov ss,dx
|
||||||
mov sp,ax ; set-up user stack
|
mov sp,ax ; set-up user stack
|
||||||
@ -135,7 +134,7 @@ _exec_user:
|
|||||||
POP$ALL
|
POP$ALL
|
||||||
iret
|
iret
|
||||||
|
|
||||||
|
segment _TEXT
|
||||||
|
|
||||||
|
|
||||||
;; Called whenever the BIOS detects a ^Break state
|
;; Called whenever the BIOS detects a ^Break state
|
||||||
@ -208,8 +207,6 @@ _spawn_int23:
|
|||||||
mov ss, [_lpUserStack+2]
|
mov ss, [_lpUserStack+2]
|
||||||
mov sp, [_lpUserStack]
|
mov sp, [_lpUserStack]
|
||||||
|
|
||||||
; mov ss,[_usr_ss]
|
|
||||||
; mov sp,[_usr_sp]
|
|
||||||
sti
|
sti
|
||||||
|
|
||||||
; get all the user registers back
|
; get all the user registers back
|
||||||
|
104
kernel/proto.h
104
kernel/proto.h
@ -34,6 +34,9 @@ static BYTE *Proto_hRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.22 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.21 2001/08/19 12:58:36 bartoldeman
|
* Revision 1.21 2001/08/19 12:58:36 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -199,7 +202,7 @@ BOOL flush(void);
|
|||||||
BOOL fill(REG struct buffer FAR * bp, ULONG blkno, COUNT dsk);
|
BOOL fill(REG struct buffer FAR * bp, ULONG blkno, COUNT dsk);
|
||||||
/* *** Changed on 9/4/00 BER */
|
/* *** Changed on 9/4/00 BER */
|
||||||
UWORD dskxfer(COUNT dsk, ULONG blkno, VOID FAR * buf, UWORD numblocks, COUNT mode);
|
UWORD dskxfer(COUNT dsk, ULONG blkno, VOID FAR * buf, UWORD numblocks, COUNT mode);
|
||||||
/* *** End of change
|
/* *** End of change */
|
||||||
|
|
||||||
/* chario.c */
|
/* chario.c */
|
||||||
VOID sto(COUNT c);
|
VOID sto(COUNT c);
|
||||||
@ -218,6 +221,9 @@ UCOUNT sti(keyboard * kp);
|
|||||||
sft FAR *get_sft(UCOUNT);
|
sft FAR *get_sft(UCOUNT);
|
||||||
|
|
||||||
/* dosfns.c */
|
/* dosfns.c */
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
struct dpb FAR *GetDriveDPB(UBYTE drive, COUNT *rc);
|
||||||
|
#endif
|
||||||
BYTE FAR *get_root(BYTE FAR *);
|
BYTE FAR *get_root(BYTE FAR *);
|
||||||
BOOL fnmatch(BYTE FAR *, BYTE FAR *, COUNT, COUNT);
|
BOOL fnmatch(BYTE FAR *, BYTE FAR *, COUNT, COUNT);
|
||||||
BOOL check_break(void);
|
BOOL check_break(void);
|
||||||
@ -238,6 +244,7 @@ COUNT DosOpenSft(BYTE * fname, COUNT mode);
|
|||||||
COUNT DosClose(COUNT hndl);
|
COUNT DosClose(COUNT hndl);
|
||||||
COUNT DosCloseSft(WORD sft_idx);
|
COUNT DosCloseSft(WORD sft_idx);
|
||||||
VOID DosGetFree(UBYTE drive, COUNT FAR * spc, COUNT FAR * navc, COUNT FAR * bps, COUNT FAR * nc);
|
VOID DosGetFree(UBYTE drive, COUNT FAR * spc, COUNT FAR * navc, COUNT FAR * bps, COUNT FAR * nc);
|
||||||
|
COUNT DosGetExtFree(BYTE FAR *DriveString, struct xfreespace FAR *xfsp);
|
||||||
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);
|
||||||
@ -260,7 +267,7 @@ sft FAR *idx_to_sft(COUNT SftIndex);
|
|||||||
COUNT get_sft_idx(UCOUNT hndl);
|
COUNT get_sft_idx(UCOUNT hndl);
|
||||||
|
|
||||||
/*dosidle.asm */
|
/*dosidle.asm */
|
||||||
VOID DosIdle_int(void);
|
VOID ASMCFUNC DosIdle_int(void);
|
||||||
|
|
||||||
/* dosnames.c */
|
/* dosnames.c */
|
||||||
VOID SpacePad(BYTE *, COUNT);
|
VOID SpacePad(BYTE *, COUNT);
|
||||||
@ -268,7 +275,8 @@ COUNT ParseDosName(BYTE *, COUNT *, BYTE *, BYTE *, BYTE *, BOOL);
|
|||||||
/* COUNT ParseDosPath(BYTE *, COUNT *, BYTE *, BYTE FAR *); */
|
/* COUNT ParseDosPath(BYTE *, COUNT *, BYTE *, BYTE FAR *); */
|
||||||
|
|
||||||
/* dsk.c */
|
/* dsk.c */
|
||||||
COUNT FAR blk_driver(rqptr rp);
|
COUNT FAR ASMCFUNC blk_driver(rqptr rp);
|
||||||
|
ddt *getddt(int dev);
|
||||||
|
|
||||||
/* error.c */
|
/* error.c */
|
||||||
VOID dump(void);
|
VOID dump(void);
|
||||||
@ -312,7 +320,7 @@ UCOUNT writeblock(COUNT fd, VOID FAR * buffer, UCOUNT count, COUNT * err);
|
|||||||
COUNT dos_read(COUNT fd, VOID FAR * buffer, UCOUNT count);
|
COUNT dos_read(COUNT fd, VOID FAR * buffer, UCOUNT count);
|
||||||
COUNT dos_write(COUNT fd, VOID FAR * buffer, UCOUNT count);
|
COUNT dos_write(COUNT fd, VOID FAR * buffer, UCOUNT count);
|
||||||
LONG dos_lseek(COUNT fd, LONG foffset, COUNT origin);
|
LONG dos_lseek(COUNT fd, LONG foffset, COUNT origin);
|
||||||
UWORD dos_free(struct dpb FAR *dpbp);
|
CLUSTER dos_free(struct dpb FAR *dpbp);
|
||||||
|
|
||||||
VOID trim_path(BYTE FAR * s);
|
VOID trim_path(BYTE FAR * s);
|
||||||
|
|
||||||
@ -327,15 +335,23 @@ COUNT media_check(REG struct dpb FAR *dpbp);
|
|||||||
f_node_ptr xlt_fd(COUNT fd);
|
f_node_ptr xlt_fd(COUNT fd);
|
||||||
COUNT xlt_fnp(f_node_ptr fnp);
|
COUNT xlt_fnp(f_node_ptr fnp);
|
||||||
struct dhdr FAR *select_unit(COUNT drive);
|
struct dhdr FAR *select_unit(COUNT drive);
|
||||||
|
#ifdef WITHFAT32
|
||||||
|
VOID bpb_to_dpb(bpb FAR *bpbp, REG struct dpb FAR * dpbp, BOOL extended);
|
||||||
|
#else
|
||||||
VOID bpb_to_dpb(bpb FAR *bpbp, REG struct dpb FAR * dpbp);
|
VOID bpb_to_dpb(bpb FAR *bpbp, REG struct dpb FAR * dpbp);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* fattab.c */
|
/* fattab.c */
|
||||||
UCOUNT link_fat(struct dpb FAR *dpbp, UCOUNT Cluster1, REG UCOUNT Cluster2);
|
void read_fsinfo(struct dpb FAR *dpbp);
|
||||||
UCOUNT link_fat16(struct dpb FAR *dpbp, UCOUNT Cluster1, UCOUNT Cluster2);
|
void write_fsinfo(struct dpb FAR *dpbp);
|
||||||
UCOUNT link_fat12(struct dpb FAR *dpbp, UCOUNT Cluster1, UCOUNT Cluster2);
|
UCOUNT link_fat(struct dpb FAR *dpbp, CLUSTER Cluster1, REG CLUSTER Cluster2);
|
||||||
UWORD next_cluster(struct dpb FAR *dpbp, REG UCOUNT ClusterNum);
|
UCOUNT link_fat32(struct dpb FAR *dpbp, CLUSTER Cluster1, CLUSTER Cluster2);
|
||||||
UWORD next_cl16(struct dpb FAR *dpbp, REG UCOUNT ClusterNum);
|
UCOUNT link_fat16(struct dpb FAR *dpbp, CLUSTER Cluster1, CLUSTER Cluster2);
|
||||||
UWORD next_cl12(struct dpb FAR *dpbp, REG UCOUNT ClusterNum);
|
UCOUNT link_fat12(struct dpb FAR *dpbp, CLUSTER Cluster1, CLUSTER Cluster2);
|
||||||
|
CLUSTER next_cluster(struct dpb FAR *dpbp, REG CLUSTER ClusterNum);
|
||||||
|
CLUSTER next_cl32(struct dpb FAR *dpbp, REG CLUSTER ClusterNum);
|
||||||
|
CLUSTER next_cl16(struct dpb FAR *dpbp, REG CLUSTER ClusterNum);
|
||||||
|
CLUSTER next_cl12(struct dpb FAR *dpbp, REG CLUSTER ClusterNum);
|
||||||
|
|
||||||
/* fcbfns.c */
|
/* fcbfns.c */
|
||||||
VOID DosOutputString(BYTE FAR * s);
|
VOID DosOutputString(BYTE FAR * s);
|
||||||
@ -397,22 +413,22 @@ VOID fbcopy(REG VOID FAR * s, REG VOID FAR * d, REG COUNT n);
|
|||||||
*/
|
*/
|
||||||
VOID strcpy(REG BYTE * d, REG BYTE * s);
|
VOID strcpy(REG BYTE * d, REG BYTE * s);
|
||||||
#define scopy(s, d) strcpy(d,s)
|
#define scopy(s, d) strcpy(d,s)
|
||||||
VOID fmemcpy(REG VOID FAR * d, REG VOID FAR * s, REG COUNT n);
|
VOID ASMCFUNC fmemcpy(REG VOID FAR * d, REG VOID FAR * s, REG COUNT n);
|
||||||
#define fbcopy(s, d, n) fmemcpy(d,s,n)
|
#define fbcopy(s, d, n) fmemcpy(d,s,n)
|
||||||
|
|
||||||
|
|
||||||
/*VOID fscopy(REG BYTE FAR * s, REG BYTE FAR * d);*/
|
/*VOID fscopy(REG BYTE FAR * s, REG BYTE FAR * d);*/
|
||||||
VOID fstrcpy(REG BYTE FAR * d, REG BYTE FAR * s);
|
VOID ASMCFUNC fstrcpy(REG BYTE FAR * d, REG BYTE FAR * s);
|
||||||
#define fscopy(s,d) fstrcpy(d,s)
|
#define fscopy(s,d) fstrcpy(d,s)
|
||||||
|
|
||||||
VOID fstrcpy(REG BYTE FAR * d, REG BYTE FAR * s);
|
VOID ASMCFUNC fstrcpy(REG BYTE FAR * d, REG BYTE FAR * s);
|
||||||
|
|
||||||
/*VOID bcopy(REG BYTE * s, REG BYTE * d, REG COUNT n);*/
|
/*VOID bcopy(REG BYTE * s, REG BYTE * d, REG COUNT n);*/
|
||||||
void memcpy(REG void * d, REG VOID * s, REG COUNT n);
|
void ASMCFUNC memcpy(REG void * d, REG VOID * s, REG COUNT n);
|
||||||
#define bcopy(s,d,n) memcpy(d,s,n)
|
#define bcopy(s,d,n) memcpy(d,s,n)
|
||||||
|
|
||||||
void fmemset(REG VOID FAR * s, REG int ch, REG COUNT n);
|
void ASMCFUNC fmemset(REG VOID FAR * s, REG int ch, REG COUNT n);
|
||||||
void memset(REG VOID * s, REG int ch, REG COUNT n);
|
void ASMCFUNC memset(REG VOID * s, REG int ch, REG COUNT n);
|
||||||
|
|
||||||
|
|
||||||
/* nls.c */
|
/* nls.c */
|
||||||
@ -420,7 +436,7 @@ BYTE DosYesNo(unsigned char ch);
|
|||||||
#ifndef DosUpMem
|
#ifndef DosUpMem
|
||||||
VOID DosUpMem(VOID FAR * str, unsigned len);
|
VOID DosUpMem(VOID FAR * str, unsigned len);
|
||||||
#endif
|
#endif
|
||||||
unsigned char DosUpChar(unsigned char ch);
|
unsigned char ASMCFUNC DosUpChar(unsigned char ch);
|
||||||
VOID DosUpString(char FAR *str);
|
VOID DosUpString(char FAR *str);
|
||||||
VOID DosUpFMem(VOID FAR *str, unsigned len);
|
VOID DosUpFMem(VOID FAR *str, unsigned len);
|
||||||
unsigned char DosUpFChar(unsigned char ch);
|
unsigned char DosUpFChar(unsigned char ch);
|
||||||
@ -435,7 +451,7 @@ COUNT DosSetCountry(UWORD cntry);
|
|||||||
#endif
|
#endif
|
||||||
COUNT DosGetCodepage(UWORD FAR* actCP, UWORD FAR* sysCP);
|
COUNT DosGetCodepage(UWORD FAR* actCP, UWORD FAR* sysCP);
|
||||||
COUNT DosSetCodepage(UWORD actCP, UWORD sysCP);
|
COUNT DosSetCodepage(UWORD actCP, UWORD sysCP);
|
||||||
UWORD syscall_MUX14(DIRECT_IREGS);
|
UWORD ASMCFUNC syscall_MUX14(DIRECT_IREGS);
|
||||||
|
|
||||||
/* prf.c */
|
/* prf.c */
|
||||||
VOID put_console(COUNT c);
|
VOID put_console(COUNT c);
|
||||||
@ -444,38 +460,43 @@ WORD sprintf(BYTE * buff, CONST BYTE * fmt, ...);
|
|||||||
VOID hexd(char *title,VOID FAR *p,COUNT numBytes);
|
VOID hexd(char *title,VOID FAR *p,COUNT numBytes);
|
||||||
|
|
||||||
/* strings.c */
|
/* strings.c */
|
||||||
COUNT strlen(REG BYTE * s);
|
COUNT ASMCFUNC strlen(REG BYTE * s);
|
||||||
COUNT fstrlen(REG BYTE FAR * s);
|
COUNT ASMCFUNC fstrlen(REG BYTE FAR * s);
|
||||||
VOID _fstrcpy(REG BYTE FAR * d, REG BYTE FAR * s);
|
VOID ASMCFUNC _fstrcpy(REG BYTE FAR * d, REG BYTE FAR * s);
|
||||||
VOID strncpy(REG BYTE * d, REG BYTE * s, COUNT l);
|
VOID ASMCFUNC strncpy(REG BYTE * d, REG BYTE * s, COUNT l);
|
||||||
COUNT strcmp(REG BYTE * d, REG BYTE * s);
|
COUNT ASMCFUNC strcmp(REG BYTE * d, REG BYTE * s);
|
||||||
COUNT fstrcmp(REG BYTE FAR * d, REG BYTE FAR * s);
|
COUNT ASMCFUNC fstrcmp(REG BYTE FAR * d, REG BYTE FAR * s);
|
||||||
COUNT fstrncmp(REG BYTE FAR * d, REG BYTE FAR * s, COUNT l);
|
COUNT ASMCFUNC fstrncmp(REG BYTE FAR * d, REG BYTE FAR * s, COUNT l);
|
||||||
COUNT strncmp(REG BYTE * d, REG BYTE * s, COUNT l);
|
COUNT ASMCFUNC strncmp(REG BYTE * d, REG BYTE * s, COUNT l);
|
||||||
/*
|
/*
|
||||||
void fsncopy(REG BYTE FAR * s, REG BYTE FAR * d, COUNT l);
|
void fsncopy(REG BYTE FAR * s, REG BYTE FAR * d, COUNT l);
|
||||||
#define fstrncpy(d,s,l) fsncopy(s,d,l)
|
#define fstrncpy(d,s,l) fsncopy(s,d,l)
|
||||||
*/
|
*/
|
||||||
void fstrncpy(REG BYTE FAR * d, REG BYTE FAR * s, COUNT l);
|
void ASMCFUNC fstrncpy(REG BYTE FAR * d, REG BYTE FAR * s, COUNT l);
|
||||||
#define fsncopy(s,d,l) fstrncpy(d,s,l)
|
#define fsncopy(s,d,l) fstrncpy(d,s,l)
|
||||||
|
|
||||||
BYTE *strchr(BYTE * s, BYTE c);
|
BYTE * ASMCFUNC strchr(BYTE * s, BYTE c);
|
||||||
|
|
||||||
/* sysclk.c */
|
/* sysclk.c */
|
||||||
WORD FAR clk_driver(rqptr rp);
|
WORD FAR ASMCFUNC clk_driver(rqptr rp);
|
||||||
COUNT BcdToByte(COUNT x);
|
COUNT BcdToByte(COUNT x);
|
||||||
COUNT BcdToWord(BYTE * x, UWORD * mon, UWORD * day, UWORD * yr);
|
COUNT BcdToWord(BYTE * x, UWORD * mon, UWORD * day, UWORD * yr);
|
||||||
COUNT ByteToBcd(COUNT x);
|
COUNT ByteToBcd(COUNT x);
|
||||||
LONG WordToBcd(BYTE * x, UWORD * mon, UWORD * day, UWORD * yr);
|
LONG WordToBcd(BYTE * x, UWORD * mon, UWORD * day, UWORD * yr);
|
||||||
|
|
||||||
|
/* syspack.c */
|
||||||
|
#ifdef NONNATIVE
|
||||||
|
VOID getdirent(BYTE FAR * vp, struct dirent FAR * dp);
|
||||||
|
VOID putdirent(struct dirent FAR * dp, BYTE FAR * vp);
|
||||||
|
#else
|
||||||
|
#define getdirent(vp, dp) fmemcpy(dp, vp, sizeof(struct dirent))
|
||||||
|
#define putdirent(dp, vp) fmemcpy(vp, dp, sizeof(struct dirent))
|
||||||
|
#endif
|
||||||
|
|
||||||
/* syscon.c */
|
/* syscon.c */
|
||||||
WORD con_driver(rqptr rp);
|
WORD con_driver(rqptr rp);
|
||||||
VOID break_handler(void);
|
VOID break_handler(void);
|
||||||
|
|
||||||
/* syspack.c */
|
|
||||||
VOID getdirent(BYTE FAR * vp, struct dirent FAR * dp);
|
|
||||||
VOID putdirent(struct dirent FAR * dp, BYTE FAR * vp);
|
|
||||||
|
|
||||||
/* systime.c */
|
/* systime.c */
|
||||||
VOID DosGetTime(BYTE FAR * hp, BYTE FAR * mp, BYTE FAR * sp, BYTE FAR * hdp);
|
VOID DosGetTime(BYTE FAR * hp, BYTE FAR * mp, BYTE FAR * sp, BYTE FAR * hdp);
|
||||||
COUNT DosSetTime(BYTE FAR * hp, BYTE FAR * mp, BYTE FAR * sp, BYTE FAR * hdp);
|
COUNT DosSetTime(BYTE FAR * hp, BYTE FAR * mp, BYTE FAR * sp, BYTE FAR * hdp);
|
||||||
@ -499,11 +520,11 @@ VOID InitPSP(VOID);
|
|||||||
int SetJFTSize(UWORD nHandles);
|
int SetJFTSize(UWORD nHandles);
|
||||||
int DosMkTmp(BYTE FAR * pathname, UWORD attr);
|
int DosMkTmp(BYTE FAR * pathname, UWORD attr);
|
||||||
COUNT get_verify_drive(char FAR * src);
|
COUNT get_verify_drive(char FAR * src);
|
||||||
COUNT truename(char FAR * src, char FAR * dest, COUNT t);
|
COUNT ASMCFUNC truename(char FAR * src, char FAR * dest, COUNT t);
|
||||||
|
|
||||||
/* network.c */
|
/* network.c */
|
||||||
COUNT int2f_Remote_call(UWORD func, UWORD b, UCOUNT n, UWORD d, VOID FAR * s, UWORD i, VOID FAR * data);
|
COUNT ASMCFUNC int2f_Remote_call(UWORD func, UWORD b, UCOUNT n, UWORD d, VOID FAR * s, UWORD i, VOID FAR * data);
|
||||||
COUNT QRemote_Fn(char FAR * s, char FAR * d);
|
COUNT ASMCFUNC QRemote_Fn(char FAR * s, char FAR * d);
|
||||||
|
|
||||||
UWORD get_machine_name(BYTE FAR * netname);
|
UWORD get_machine_name(BYTE FAR * netname);
|
||||||
VOID set_machine_name(BYTE FAR * netname, UWORD name_num);
|
VOID set_machine_name(BYTE FAR * netname, UWORD name_num);
|
||||||
@ -511,7 +532,7 @@ UCOUNT Remote_RW(UWORD func, UCOUNT n, BYTE FAR * bp, sft FAR * s, COUNT FAR * e
|
|||||||
COUNT Remote_find(UWORD func);
|
COUNT Remote_find(UWORD func);
|
||||||
|
|
||||||
/* procsupt.asm */
|
/* procsupt.asm */
|
||||||
VOID INRPT FAR exec_user(iregs FAR * irp);
|
VOID ASMCFUNC exec_user(iregs FAR * irp);
|
||||||
|
|
||||||
/* detect.c */
|
/* detect.c */
|
||||||
unsigned long FAR is_dosemu(void);
|
unsigned long FAR is_dosemu(void);
|
||||||
@ -527,4 +548,11 @@ unsigned long FAR is_dosemu(void);
|
|||||||
ASSERT_CONST( (BYTE FAR *)x->fcb_ext - (BYTE FAR *)x->fcbname == 8)
|
ASSERT_CONST( (BYTE FAR *)x->fcb_ext - (BYTE FAR *)x->fcbname == 8)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define ASSERT_CONST(x) { typedef struct { char x[2 * (x) - 1]; } xx ; }
|
#define ASSERT_CONST(x) { typedef struct { char _xx[x ? 1 : -1]; } xx ; }
|
||||||
|
|
||||||
|
#if defined(WATCOM) && 0
|
||||||
|
ULONG FAR ASMCFUNC MULULUS(ULONG mul1, UWORD mul2); /* MULtiply ULong by UShort */
|
||||||
|
ULONG FAR ASMCFUNC MULULUL(ULONG mul1, ULONG mul2); /* MULtiply ULong by ULong */
|
||||||
|
ULONG FAR ASMCFUNC DIVULUS(ULONG mul1, UWORD mul2); /* DIVide ULong by UShort */
|
||||||
|
ULONG FAR ASMCFUNC DIVMODULUS(ULONG mul1, UWORD mul2,UWORD *rem); /* DIVide ULong by UShort */
|
||||||
|
#endif
|
||||||
|
@ -29,6 +29,9 @@
|
|||||||
; $Header$
|
; $Header$
|
||||||
;
|
;
|
||||||
; $Log$
|
; $Log$
|
||||||
|
; Revision 1.9 2001/09/23 20:39:44 bartoldeman
|
||||||
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
;
|
||||||
; Revision 1.8 2001/07/09 22:19:33 bartoldeman
|
; Revision 1.8 2001/07/09 22:19:33 bartoldeman
|
||||||
; LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
; LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
||||||
;
|
;
|
||||||
@ -71,9 +74,9 @@
|
|||||||
|
|
||||||
group PGROUP PSP
|
group PGROUP PSP
|
||||||
group TGROUP _TEXT _IO_TEXT _IO_FIXED_DATA
|
group TGROUP _TEXT _IO_TEXT _IO_FIXED_DATA
|
||||||
group DGROUP _FIXED_DATA _DATA _BSSSTART _BSS _BSSEND DYN_DATA
|
group DGROUP _FIXED_DATA _DATA _BSSSTART _BSS _BSSEND DYN_DATA DCONST
|
||||||
group HGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END
|
group HGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END
|
||||||
group IGROUP INIT_TEXT_START INIT_TEXT INIT_TEXT_END ID_B ID ID_E IB_B IB IB_E
|
group IGROUP INIT_TEXT_START INIT_TEXT INIT_TEXT_END ID_B ID ID_E IB_B IB IB_E IC IDATA
|
||||||
|
|
||||||
segment PSP class=PSP
|
segment PSP class=PSP
|
||||||
segment _TEXT class=CODE
|
segment _TEXT class=CODE
|
||||||
@ -84,6 +87,8 @@ segment _DATA class=DATA align=2
|
|||||||
segment _BSSSTART class=BSS align=2
|
segment _BSSSTART class=BSS align=2
|
||||||
segment _BSS class=BSS align=2
|
segment _BSS class=BSS align=2
|
||||||
segment _BSSEND class=BSS
|
segment _BSSEND class=BSS
|
||||||
|
;for MSC
|
||||||
|
segment DCONST class=DCONST align=2
|
||||||
segment DYN_DATA class=DYN_DATA
|
segment DYN_DATA class=DYN_DATA
|
||||||
segment HMA_TEXT_START class=HMA align=16
|
segment HMA_TEXT_START class=HMA align=16
|
||||||
segment HMA_TEXT class=HMA
|
segment HMA_TEXT class=HMA
|
||||||
@ -94,7 +99,9 @@ segment INIT_TEXT_END class=INIT
|
|||||||
segment ID_B class=ID align=2
|
segment ID_B class=ID align=2
|
||||||
segment ID class=ID align=2
|
segment ID class=ID align=2
|
||||||
segment ID_E class=ID align=2
|
segment ID_E class=ID align=2
|
||||||
|
segment IDATA class=ID align=2
|
||||||
segment IB_B class=IB align=2
|
segment IB_B class=IB align=2
|
||||||
segment IB class=IB align=2
|
segment IB class=IB align=2
|
||||||
segment IB_E class=IB align=2
|
segment IB_E class=IB align=2
|
||||||
|
segment IC class=IC align=2
|
||||||
|
|
||||||
|
@ -35,6 +35,9 @@ static BYTE *RcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.9 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.8 2001/08/19 12:58:36 bartoldeman
|
* Revision 1.8 2001/08/19 12:58:36 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -102,9 +105,9 @@ static BYTE *RcsId = "$Id$";
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef PROTO
|
#ifdef PROTO
|
||||||
BOOL ReadPCClock(ULONG *);
|
BOOL ASMCFUNC ReadPCClock(ULONG *);
|
||||||
VOID WriteATClock(BYTE *, BYTE, BYTE, BYTE);
|
VOID ASMCFUNC WriteATClock(BYTE *, BYTE, BYTE, BYTE);
|
||||||
VOID WritePCClock(ULONG);
|
VOID ASMCFUNC WritePCClock(ULONG);
|
||||||
COUNT BcdToByte(COUNT);
|
COUNT BcdToByte(COUNT);
|
||||||
COUNT BcdToWord(BYTE *, UWORD *, UWORD *, UWORD *);
|
COUNT BcdToWord(BYTE *, UWORD *, UWORD *, UWORD *);
|
||||||
COUNT ByteToBcd(COUNT);
|
COUNT ByteToBcd(COUNT);
|
||||||
@ -141,14 +144,14 @@ static ULONG Ticks;
|
|||||||
*/
|
*/
|
||||||
UWORD DaysSinceEpoch = 0;
|
UWORD DaysSinceEpoch = 0;
|
||||||
|
|
||||||
BOOL ReadATClock(BYTE *, BYTE *, BYTE *, BYTE *);
|
BOOL ASMCFUNC ReadATClock(BYTE *, BYTE *, BYTE *, BYTE *);
|
||||||
|
|
||||||
static COUNT BcdToByte(COUNT x)
|
static COUNT BcdToByte(COUNT x)
|
||||||
{
|
{
|
||||||
return ((((x) >> 4) & 0xf) * 10 + ((x) & 0xf));
|
return ((((x) >> 4) & 0xf) * 10 + ((x) & 0xf));
|
||||||
}
|
}
|
||||||
|
|
||||||
WORD FAR clk_driver(rqptr rp)
|
WORD FAR ASMCFUNC clk_driver(rqptr rp)
|
||||||
{
|
{
|
||||||
COUNT
|
COUNT
|
||||||
c;
|
c;
|
||||||
|
@ -36,6 +36,9 @@ static BYTE *syspackRcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.4 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.3 2000/05/25 20:56:21 jimtabor
|
* Revision 1.3 2000/05/25 20:56:21 jimtabor
|
||||||
* Fixed project history
|
* Fixed project history
|
||||||
*
|
*
|
||||||
@ -134,7 +137,6 @@ VOID fputbyte(BYTE FAR * bp, VOID FAR * vp)
|
|||||||
{
|
{
|
||||||
*(BYTE FAR *) vp = *bp;
|
*(BYTE FAR *) vp = *bp;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
VOID getdirent(BYTE FAR * vp, struct dirent FAR * dp)
|
VOID getdirent(BYTE FAR * vp, struct dirent FAR * dp)
|
||||||
{
|
{
|
||||||
@ -162,3 +164,4 @@ VOID putdirent(struct dirent FAR * dp, BYTE FAR * vp)
|
|||||||
for (i = 0, p = (BYTE FAR *) & vp[DIR_RESERVED]; i < 10; i++)
|
for (i = 0, p = (BYTE FAR *) & vp[DIR_RESERVED]; i < 10; i++)
|
||||||
*p++ = NULL;
|
*p++ = NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
@ -35,6 +35,9 @@ static BYTE *RcsId = "$Id$";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.18 2001/09/23 20:39:44 bartoldeman
|
||||||
|
* FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
*
|
||||||
* Revision 1.17 2001/08/19 12:58:36 bartoldeman
|
* Revision 1.17 2001/08/19 12:58:36 bartoldeman
|
||||||
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
* Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
||||||
*
|
*
|
||||||
@ -191,10 +194,6 @@ static exe_header header;
|
|||||||
+ 1 byte: '\0'
|
+ 1 byte: '\0'
|
||||||
-- 1999/04/21 ska */
|
-- 1999/04/21 ska */
|
||||||
|
|
||||||
#ifdef __TURBOC__
|
|
||||||
void __int__(int); /* TC 2.01 requires this. :( -- ror4 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PROTO
|
#ifndef PROTO
|
||||||
COUNT ChildEnv(exec_blk FAR *, UWORD *, char far *);
|
COUNT ChildEnv(exec_blk FAR *, UWORD *, char far *);
|
||||||
#else
|
#else
|
||||||
@ -326,7 +325,7 @@ VOID new_psp(psp FAR * p, int psize)
|
|||||||
|
|
||||||
/* CP/M-like entry point - jump to special entry */
|
/* CP/M-like entry point - jump to special entry */
|
||||||
p->ps_farcall = 0xea;
|
p->ps_farcall = 0xea;
|
||||||
p->ps_reentry = cpm_entry;
|
p->ps_reentry = (VOID(FAR *) ())cpm_entry;
|
||||||
/* unix style call - 0xcd 0x21 0xcb (int 21, retf) */
|
/* unix style call - 0xcd 0x21 0xcb (int 21, retf) */
|
||||||
p->ps_unix[0] = 0xcd;
|
p->ps_unix[0] = 0xcd;
|
||||||
p->ps_unix[1] = 0x21;
|
p->ps_unix[1] = 0x21;
|
||||||
@ -347,11 +346,11 @@ VOID new_psp(psp FAR * p, int psize)
|
|||||||
p->ps_dta = (BYTE FAR *) (&p->ps_cmd_count);
|
p->ps_dta = (BYTE FAR *) (&p->ps_cmd_count);
|
||||||
|
|
||||||
/* terminate address */
|
/* terminate address */
|
||||||
p->ps_isv22 = (VOID(interrupt FAR *) (void))getvec(0x22);
|
p->ps_isv22 = (VOID(INRPT FAR *) (void))getvec(0x22);
|
||||||
/* break address */
|
/* break address */
|
||||||
p->ps_isv23 = (VOID(interrupt FAR *) (void))getvec(0x23);
|
p->ps_isv23 = (VOID(INRPT FAR *) (void))getvec(0x23);
|
||||||
/* critical error address */
|
/* critical error address */
|
||||||
p->ps_isv24 = (VOID(interrupt FAR *) (void))getvec(0x24);
|
p->ps_isv24 = (VOID(INRPT FAR *) (void))getvec(0x24);
|
||||||
|
|
||||||
/* File System parameters */
|
/* File System parameters */
|
||||||
/* user stack pointer - int 21 */
|
/* user stack pointer - int 21 */
|
||||||
@ -465,7 +464,7 @@ COUNT DosComLoader(BYTE FAR * namep, exec_blk FAR * exp, COUNT mode)
|
|||||||
LONG com_size;
|
LONG com_size;
|
||||||
|
|
||||||
int ModeLoadHigh = mode & 0x80;
|
int ModeLoadHigh = mode & 0x80;
|
||||||
int UMBstate = uppermem_link;
|
UBYTE UMBstate = uppermem_link;
|
||||||
|
|
||||||
mode &= 0x7f;
|
mode &= 0x7f;
|
||||||
|
|
||||||
@ -684,7 +683,7 @@ COUNT DosExeLoader(BYTE FAR * namep, exec_blk FAR * exp, COUNT mode)
|
|||||||
LONG exe_size;
|
LONG exe_size;
|
||||||
|
|
||||||
int ModeLoadHigh = mode & 0x80;
|
int ModeLoadHigh = mode & 0x80;
|
||||||
int UMBstate = uppermem_link;
|
UBYTE UMBstate = uppermem_link;
|
||||||
|
|
||||||
mode &= 0x7f;
|
mode &= 0x7f;
|
||||||
|
|
||||||
|
12
sys/sys.mak
12
sys/sys.mak
@ -4,6 +4,9 @@
|
|||||||
# $Id$
|
# $Id$
|
||||||
#
|
#
|
||||||
# $Log$
|
# $Log$
|
||||||
|
# Revision 1.9 2001/09/23 20:39:44 bartoldeman
|
||||||
|
# FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
||||||
|
#
|
||||||
# Revision 1.8 2001/04/29 17:34:41 bartoldeman
|
# Revision 1.8 2001/04/29 17:34:41 bartoldeman
|
||||||
# A new SYS.COM/config.sys single stepping/console output/misc fixes.
|
# A new SYS.COM/config.sys single stepping/console output/misc fixes.
|
||||||
#
|
#
|
||||||
@ -49,7 +52,7 @@
|
|||||||
!include "..\config.mak"
|
!include "..\config.mak"
|
||||||
|
|
||||||
CFLAGS = -mt -1- -v -vi- -k- -f- -ff- -O -Z -d -I$(INCLUDEPATH);..\hdr \
|
CFLAGS = -mt -1- -v -vi- -k- -f- -ff- -O -Z -d -I$(INCLUDEPATH);..\hdr \
|
||||||
-DI86;PROTO;FORSYS
|
-DI86;PROTO;FORSYS;WITHFAT32
|
||||||
|
|
||||||
# *Implicit Rules*
|
# *Implicit Rules*
|
||||||
.c.obj:
|
.c.obj:
|
||||||
@ -77,6 +80,9 @@ b_fat12.h: ..\boot\b_fat12.bin bin2c.com
|
|||||||
b_fat16.h: ..\boot\b_fat16.bin bin2c.com
|
b_fat16.h: ..\boot\b_fat16.bin bin2c.com
|
||||||
bin2c ..\boot\b_fat16.bin b_fat16.h b_fat16
|
bin2c ..\boot\b_fat16.bin b_fat16.h b_fat16
|
||||||
|
|
||||||
|
b_fat32.h: ..\boot\b_fat32.bin bin2c.com
|
||||||
|
bin2c ..\boot\b_fat32.bin b_fat32.h b_fat32
|
||||||
|
|
||||||
#floppy.obj: ..\drivers\floppy.asm
|
#floppy.obj: ..\drivers\floppy.asm
|
||||||
# $(NASM) -fobj -DSYS=1 ..\drivers\floppy.asm -o floppy.obj
|
# $(NASM) -fobj -DSYS=1 ..\drivers\floppy.asm -o floppy.obj
|
||||||
|
|
||||||
@ -88,13 +94,13 @@ sys.com: $(EXE_dependencies)
|
|||||||
$(CLIB);
|
$(CLIB);
|
||||||
|
|
||||||
clobber: clean
|
clobber: clean
|
||||||
$(RM) sys.com b_fat12.h b_fat16.h
|
$(RM) sys.com b_fat12.h b_fat16.h b_fat32.h
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.obj *.bak *.crf *.xrf *.map *.lst *.las status.me
|
$(RM) *.obj *.bak *.crf *.xrf *.map *.lst *.las status.me
|
||||||
|
|
||||||
# *Individual File Dependencies*
|
# *Individual File Dependencies*
|
||||||
sys.obj: sys.c ..\hdr\portab.h ..\hdr\device.h b_fat12.h b_fat16.h
|
sys.obj: sys.c ..\hdr\portab.h ..\hdr\device.h b_fat12.h b_fat16.h b_fat32.h
|
||||||
|
|
||||||
# RULES (DEPENDENCIES)
|
# RULES (DEPENDENCIES)
|
||||||
# ----------------
|
# ----------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user