mirror of
https://github.com/FDOS/kernel.git
synced 2025-07-23 13:54:30 +02:00
Make UMB_get_largest "pascal". Let it use the xms driver address from
the HMA code. Misc small config.c cleanups. The uncompressed 386/fat32 kernel is now below 70000 bytes (69896). git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@854 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
4af102b61f
commit
6e6e34024b
@ -170,7 +170,6 @@ STATIC seg base_seg = 0;
|
|||||||
STATIC seg umb_base_seg = 0;
|
STATIC seg umb_base_seg = 0;
|
||||||
BYTE FAR *lpTop = 0;
|
BYTE FAR *lpTop = 0;
|
||||||
STATIC unsigned nCfgLine = 0;
|
STATIC unsigned nCfgLine = 0;
|
||||||
STATIC COUNT nPass = 0;
|
|
||||||
COUNT UmbState = 0;
|
COUNT UmbState = 0;
|
||||||
STATIC BYTE szLine[256] = { 0 };
|
STATIC BYTE szLine[256] = { 0 };
|
||||||
STATIC BYTE szBuf[256] = { 0 };
|
STATIC BYTE szBuf[256] = { 0 };
|
||||||
@ -545,8 +544,12 @@ STATIC void umb_init(void)
|
|||||||
{
|
{
|
||||||
UCOUNT umb_seg, umb_size;
|
UCOUNT umb_seg, umb_size;
|
||||||
seg umb_max;
|
seg umb_max;
|
||||||
|
void far *xms_addr;
|
||||||
|
|
||||||
if (UMB_get_largest(&umb_seg, &umb_size))
|
if ((xms_addr = DetectXMSDriver()) == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (UMB_get_largest(xms_addr, &umb_seg, &umb_size))
|
||||||
{
|
{
|
||||||
UmbState = 1;
|
UmbState = 1;
|
||||||
|
|
||||||
@ -571,7 +574,7 @@ STATIC void umb_init(void)
|
|||||||
the first UMB.
|
the first UMB.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
while (UMB_get_largest(&umb_seg, &umb_size))
|
while (UMB_get_largest(xms_addr, &umb_seg, &umb_size))
|
||||||
{
|
{
|
||||||
seg umb_prev, umb_next;
|
seg umb_prev, umb_next;
|
||||||
|
|
||||||
@ -621,16 +624,13 @@ STATIC void umb_init(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID DoConfig(int pass)
|
VOID DoConfig(int nPass)
|
||||||
{
|
{
|
||||||
COUNT nFileDesc;
|
COUNT nFileDesc;
|
||||||
BYTE *pLine;
|
BYTE *pLine;
|
||||||
BOOL bEof;
|
BOOL bEof;
|
||||||
|
|
||||||
|
|
||||||
/* Set pass number */
|
|
||||||
nPass = pass;
|
|
||||||
|
|
||||||
/* Check to see if we have a config.sys file. If not, just */
|
/* Check to see if we have a config.sys file. If not, just */
|
||||||
/* exit since we don't force the user to have one. */
|
/* exit since we don't force the user to have one. */
|
||||||
if ((nFileDesc = open("fdconfig.sys", 0)) >= 0)
|
if ((nFileDesc = open("fdconfig.sys", 0)) >= 0)
|
||||||
|
@ -111,8 +111,6 @@ VOID configDone(VOID);
|
|||||||
VOID FAR * KernelAlloc(size_t nBytes, char type, int mode);
|
VOID FAR * KernelAlloc(size_t nBytes, char type, int mode);
|
||||||
void FAR * KernelAllocPara(size_t nPara, char type, char *name, int mode);
|
void FAR * KernelAllocPara(size_t nPara, char type, char *name, int mode);
|
||||||
char *strcat(char * d, const char * s);
|
char *strcat(char * d, const char * s);
|
||||||
COUNT ASMCFUNC Umb_Test(void);
|
|
||||||
COUNT ASMCFUNC UMB_get_largest(UCOUNT * seg, UCOUNT * size);
|
|
||||||
BYTE * GetStringArg(BYTE * pLine, BYTE * pszString);
|
BYTE * GetStringArg(BYTE * pLine, BYTE * pszString);
|
||||||
void DoInstall(void);
|
void DoInstall(void);
|
||||||
UWORD GetBiosKey(int timeout);
|
UWORD GetBiosKey(int timeout);
|
||||||
@ -121,7 +119,12 @@ UWORD GetBiosKey(int timeout);
|
|||||||
COUNT dsk_init(VOID);
|
COUNT dsk_init(VOID);
|
||||||
|
|
||||||
/* int2f.asm */
|
/* int2f.asm */
|
||||||
COUNT ASMCFUNC Umb_Test(void);
|
COUNT ASMPASCAL Umb_Test(void);
|
||||||
|
COUNT ASMPASCAL UMB_get_largest(void FAR * driverAddress,
|
||||||
|
UCOUNT * seg, UCOUNT * size);
|
||||||
|
#ifdef __WATCOMC__
|
||||||
|
#pragma aux (pascal) UMB_get_largest modify exact [ax bx cx dx]
|
||||||
|
#endif
|
||||||
|
|
||||||
/* inithma.c */
|
/* inithma.c */
|
||||||
int MoveKernelToHMA(void);
|
int MoveKernelToHMA(void);
|
||||||
|
@ -163,14 +163,18 @@ int EnableHMA(VOID)
|
|||||||
|
|
||||||
int MoveKernelToHMA()
|
int MoveKernelToHMA()
|
||||||
{
|
{
|
||||||
|
void far *xms_addr;
|
||||||
|
|
||||||
if (DosLoadedInHMA)
|
if (DosLoadedInHMA)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((XMSDriverAddress = DetectXMSDriver()) == NULL)
|
if ((xms_addr = DetectXMSDriver()) == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
XMSDriverAddress = xms_addr;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#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
|
||||||
@ -196,7 +200,7 @@ int MoveKernelToHMA()
|
|||||||
|
|
||||||
if (HMAclaimed == 0 &&
|
if (HMAclaimed == 0 &&
|
||||||
(HMAclaimed =
|
(HMAclaimed =
|
||||||
init_call_XMScall(XMSDriverAddress, 0x0100, 0xffff)) == 0)
|
init_call_XMScall(xms_addr, 0x0100, 0xffff)) == 0)
|
||||||
{
|
{
|
||||||
printf("Can't reserve HMA area ??\n");
|
printf("Can't reserve HMA area ??\n");
|
||||||
|
|
||||||
|
@ -677,34 +677,20 @@ skip5f02:
|
|||||||
; B1h no UMB's are available
|
; B1h no UMB's are available
|
||||||
; B2h UMB segment number is invalid
|
; B2h UMB segment number is invalid
|
||||||
;
|
;
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
segment INIT_TEXT
|
segment INIT_TEXT
|
||||||
; int UMB_get_largest(UCOUNT *seg, UCOUNT *size);
|
; int ASMPASCAL UMB_get_largest(void FAR * driverAddress,
|
||||||
global _UMB_get_largest
|
; UCOUNT * seg, UCOUNT * size);
|
||||||
|
global UMB_GET_LARGEST
|
||||||
|
|
||||||
_UMB_get_largest:
|
UMB_GET_LARGEST:
|
||||||
push bp
|
push bp
|
||||||
mov bp,sp
|
mov bp,sp
|
||||||
|
|
||||||
sub sp,4 ; for the far call
|
|
||||||
|
|
||||||
mov ax,4300h ; is there a xms driver installed?
|
|
||||||
int 2fh
|
|
||||||
cmp al,80h
|
|
||||||
jne umbt_error
|
|
||||||
|
|
||||||
mov ax,4310h
|
|
||||||
int 2fh
|
|
||||||
|
|
||||||
|
|
||||||
mov [bp-2],es ; save driver entry point
|
|
||||||
mov [bp-4],bx
|
|
||||||
|
|
||||||
mov dx,0xffff ; go for broke!
|
mov dx,0xffff ; go for broke!
|
||||||
mov ax,1000h ; get the umb's
|
mov ax,1000h ; get the umb's
|
||||||
call far [bp-4] ; Call the driver
|
call far [bp+8] ; Call the driver
|
||||||
|
|
||||||
;
|
;
|
||||||
; bl = 0xB0 and ax = 0 so do it again.
|
; bl = 0xB0 and ax = 0 so do it again.
|
||||||
;
|
;
|
||||||
@ -715,7 +701,7 @@ _UMB_get_largest:
|
|||||||
je umbt_error
|
je umbt_error
|
||||||
|
|
||||||
mov ax,1000h ; dx set with largest size
|
mov ax,1000h ; dx set with largest size
|
||||||
call far [bp-4] ; Call the driver
|
call far [bp+8] ; Call the driver
|
||||||
|
|
||||||
cmp ax,1
|
cmp ax,1
|
||||||
jne umbt_error
|
jne umbt_error
|
||||||
@ -723,16 +709,15 @@ _UMB_get_largest:
|
|||||||
; and the size
|
; and the size
|
||||||
|
|
||||||
mov cx,bx ; *seg = segment
|
mov cx,bx ; *seg = segment
|
||||||
mov bx, [bp+4]
|
mov bx, [bp+6]
|
||||||
mov [bx],cx
|
mov [bx],cx
|
||||||
|
|
||||||
mov bx, [bp+6] ; *size = size
|
mov bx, [bp+4] ; *size = size
|
||||||
mov [bx],dx
|
mov [bx],dx
|
||||||
|
|
||||||
umbt_ret:
|
umbt_ret:
|
||||||
mov sp,bp
|
|
||||||
pop bp
|
pop bp
|
||||||
ret ; this was called NEAR!!
|
ret 8 ; this was called NEAR!!
|
||||||
|
|
||||||
umbt_error: xor ax,ax
|
umbt_error: xor ax,ax
|
||||||
jmp short umbt_ret
|
jmp short umbt_ret
|
||||||
|
Loading…
x
Reference in New Issue
Block a user