mirror of
https://github.com/FDOS/kernel.git
synced 2025-07-27 07:44:09 +02:00
Optional support for modifying CONFIG via memdisk args, requires MEMDISK_ARGS and 386 defined to be included.
git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1634 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
a108714c31
commit
4499bd29b3
1
filelist
1
filelist
@ -108,6 +108,7 @@
|
|||||||
*/*/kernel/lfnapi.c
|
*/*/kernel/lfnapi.c
|
||||||
*/*/kernel/ludivmul.inc
|
*/*/kernel/ludivmul.inc
|
||||||
*/*/kernel/main.c
|
*/*/kernel/main.c
|
||||||
|
*/*/kernel/memdisk.asm
|
||||||
*/*/kernel/memmgr.c
|
*/*/kernel/memmgr.c
|
||||||
*/*/kernel/misc.c
|
*/*/kernel/misc.c
|
||||||
*/*/kernel/network.c
|
*/*/kernel/network.c
|
||||||
|
141
kernel/config.c
141
kernel/config.c
@ -599,16 +599,99 @@ STATIC void umb_init(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* we require 386, so only supported for 386+ compiled kernels */
|
||||||
|
#if defined(MEMDISK_ARGS)
|
||||||
|
#ifndef I386
|
||||||
|
#undef MEMDISK_ARGS
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MEMDISK_ARGS
|
||||||
|
struct memdiskinfo {
|
||||||
|
UWORD bytes; /* Total size of this structure, value >= 26 */
|
||||||
|
UBYTE version_minor; /* Memdisk minor version */
|
||||||
|
UBYTE version; /* Memdisk major version */
|
||||||
|
UDWORD base; /* Pointer to disk data in high memory */
|
||||||
|
UDWORD size; /* Size of disk in 512 byte sectors */
|
||||||
|
char FAR * cmdline; /* Command line */
|
||||||
|
ADDRESS oldint13; /* Old INT 13h */
|
||||||
|
ADDRESS oldint15; /* Old INT 15h */
|
||||||
|
UWORD olddosmem; /* Amount of DOS memory before Memdisk loaded */
|
||||||
|
UBYTE boot_id; /* major >= 3, boot loader ID */
|
||||||
|
UBYTE unused;
|
||||||
|
UWORD DPT_offset; /* >= 3.71, ES based offset to installed DPT, +16 is Old INT 1Eh */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* query_memdisk() based on similar subroutine in Eric Auer's public domain getargs.asm which is based on IFMEMDSK */
|
||||||
|
struct memdiskinfo FAR * ASMCFUNC query_memdisk(UBYTE drive);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
VOID DoConfig(int nPass)
|
VOID DoConfig(int nPass)
|
||||||
{
|
{
|
||||||
COUNT nFileDesc;
|
COUNT nFileDesc;
|
||||||
BYTE *pLine;
|
BYTE *pLine;
|
||||||
BOOL bEof;
|
BOOL bEof;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef MEMDISK_ARGS
|
||||||
|
/* check if MEMDISK used for LoL->BootDrive, if so check for special appended arguments */
|
||||||
|
struct memdiskinfo FAR *mdsk;
|
||||||
|
BYTE FAR *mdsk_cfg = NULL;
|
||||||
|
UBYTE drv = (LoL->BootDrive < 3)?0x0:0x80; /* 1=A,2=B,3=C */
|
||||||
|
mdsk = query_memdisk(drv);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (nPass==0)
|
if (nPass==0)
|
||||||
|
{
|
||||||
HaltCpuWhileIdle = 0; /* init to "no HLT while idle" */
|
HaltCpuWhileIdle = 0; /* init to "no HLT while idle" */
|
||||||
|
|
||||||
|
#ifdef MEMDISK_ARGS
|
||||||
|
if (mdsk != NULL)
|
||||||
|
{
|
||||||
|
printf("MEMDISK version %u.%02u (%lu sectors)\n", mdsk->version, mdsk->version_minor, mdsk->size);
|
||||||
|
DebugPrintf(("MEMDISK args:{%S} bootdrive=[%0Xh]\n", mdsk->cmdline, (unsigned int)drv));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MEMDISK_ARGS
|
||||||
|
if (mdsk != NULL)
|
||||||
|
{
|
||||||
|
/* scan for FD= */
|
||||||
|
/* when done mdsk->cmdline points to { character or assume no valid CONFIG options */
|
||||||
|
for (mdsk_cfg=mdsk->cmdline; *mdsk_cfg; ++mdsk_cfg)
|
||||||
|
{
|
||||||
|
if (*mdsk_cfg != ' ') continue;
|
||||||
|
++mdsk_cfg;
|
||||||
|
if (*mdsk_cfg != 'F') goto goback1;
|
||||||
|
++mdsk_cfg;
|
||||||
|
if (*mdsk_cfg != 'D') goto goback2;
|
||||||
|
++mdsk_cfg;
|
||||||
|
if (*mdsk_cfg != '=') goto goback3;
|
||||||
|
++mdsk_cfg;
|
||||||
|
break;
|
||||||
|
|
||||||
|
goback3:
|
||||||
|
--mdsk_cfg;
|
||||||
|
goback2:
|
||||||
|
--mdsk_cfg;
|
||||||
|
goback1:
|
||||||
|
--mdsk_cfg;
|
||||||
|
}
|
||||||
|
/* if FD= was not found then flag as no extra CONFIG lines */
|
||||||
|
if (!*mdsk_cfg) mdsk_cfg = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DebugPrintf(("MEMDISK not detected! bootdrive=[%0Xh]\n", (unsigned int)drv));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* 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 (but 1st */
|
||||||
|
/* also process MEMDISK passed config options if present). */
|
||||||
if ((nFileDesc = open("fdconfig.sys", 0)) >= 0)
|
if ((nFileDesc = open("fdconfig.sys", 0)) >= 0)
|
||||||
{
|
{
|
||||||
DebugPrintf(("Reading FDCONFIG.SYS...\n"));
|
DebugPrintf(("Reading FDCONFIG.SYS...\n"));
|
||||||
@ -619,10 +702,18 @@ VOID DoConfig(int nPass)
|
|||||||
if ((nFileDesc = open("config.sys", 0)) < 0)
|
if ((nFileDesc = open("config.sys", 0)) < 0)
|
||||||
{
|
{
|
||||||
DebugPrintf(("CONFIG.SYS not found\n"));
|
DebugPrintf(("CONFIG.SYS not found\n"));
|
||||||
|
#ifdef MEMDISK_ARGS
|
||||||
|
if (mdsk_cfg != NULL)
|
||||||
|
bEof = TRUE;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
DebugPrintf(("Reading CONFIG.SYS...\n"));
|
DebugPrintf(("Reading CONFIG.SYS...\n"));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Have one -- initialize. */
|
/* Have one -- initialize. */
|
||||||
nCfgLine = 0;
|
nCfgLine = 0;
|
||||||
@ -633,12 +724,22 @@ VOID DoConfig(int nPass)
|
|||||||
/* do the table lookup and execute the handler for that */
|
/* do the table lookup and execute the handler for that */
|
||||||
/* function. */
|
/* function. */
|
||||||
|
|
||||||
|
#ifdef MEMDISK_ARGS
|
||||||
|
for (; !bEof || (mdsk_cfg != NULL); nCfgLine++)
|
||||||
|
#else
|
||||||
for (; !bEof; nCfgLine++)
|
for (; !bEof; nCfgLine++)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
struct table *pEntry;
|
struct table *pEntry;
|
||||||
|
|
||||||
pLineStart = szLine;
|
pLineStart = szLine;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef MEMDISK_ARGS
|
||||||
|
if (!bEof)
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
/* read in a single line, \n or ^Z terminated */
|
/* read in a single line, \n or ^Z terminated */
|
||||||
|
|
||||||
for (pLine = szLine;;)
|
for (pLine = szLine;;)
|
||||||
@ -663,9 +764,47 @@ VOID DoConfig(int nPass)
|
|||||||
pLine++;
|
pLine++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MEMDISK_ARGS
|
||||||
|
}
|
||||||
|
else if (mdsk_cfg != NULL)
|
||||||
|
{
|
||||||
|
pLine = szLine;
|
||||||
|
/* copy data to near buffer skipping { and } */
|
||||||
|
if (*mdsk_cfg != '{') /* if not at start of line */
|
||||||
|
{
|
||||||
|
mdsk_cfg = NULL; /* no longer need data, so set to NULL to flag done */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (pLine = szLine, mdsk_cfg++; *mdsk_cfg; mdsk_cfg++, pLine++)
|
||||||
|
{
|
||||||
|
/* copy character to near buffer */
|
||||||
|
*pLine = *mdsk_cfg;
|
||||||
|
|
||||||
|
/* ensure we don't copy too much, exceed our buffer size */
|
||||||
|
if (pLine >= szLine + sizeof(szLine) - 3)
|
||||||
|
{
|
||||||
|
CfgFailure(pLine);
|
||||||
|
printf("error - line overflow line %d \n", nCfgLine);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if end of this simulated line is found, skip over EOL marker then proceed to process line */
|
||||||
|
if (*pLine == '}')
|
||||||
|
{
|
||||||
|
mdsk_cfg++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
*pLine = 0;
|
*pLine = 0;
|
||||||
pLine = szLine;
|
pLine = szLine;
|
||||||
|
|
||||||
|
DebugPrintf(("CONFIG=[%s]\n", pLine));
|
||||||
|
|
||||||
/* Skip leading white space and get verb. */
|
/* Skip leading white space and get verb. */
|
||||||
pLine = scan(pLine, szBuf);
|
pLine = scan(pLine, szBuf);
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ error.obj
|
|||||||
OBJS4=break.obj dosfns.obj fatdir.obj fatfs.obj fattab.obj fcbfns.obj \
|
OBJS4=break.obj dosfns.obj fatdir.obj fatfs.obj fattab.obj fcbfns.obj \
|
||||||
inthndlr.obj
|
inthndlr.obj
|
||||||
OBJS5=ioctl.obj memmgr.obj task.obj newstuff.obj nls.obj network.obj
|
OBJS5=ioctl.obj memmgr.obj task.obj newstuff.obj nls.obj network.obj
|
||||||
OBJS6=prf.obj misc.obj strings.obj syspack.obj lfnapi.obj iasmsupt.obj
|
OBJS6=prf.obj misc.obj strings.obj syspack.obj lfnapi.obj iasmsupt.obj memdisk.obj
|
||||||
OBJS7=main.obj config.obj initoem.obj inithma.obj dyninit.obj iprf.obj \
|
OBJS7=main.obj config.obj initoem.obj inithma.obj dyninit.obj iprf.obj \
|
||||||
initdisk.obj initclk.obj
|
initdisk.obj initclk.obj
|
||||||
OBJS=$(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) $(OBJS6) $(OBJS7)
|
OBJS=$(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) $(OBJS6) $(OBJS7)
|
||||||
@ -79,6 +79,7 @@ intr.obj: intr.asm segs.inc $(TARGET).lnk
|
|||||||
io.obj: io.asm segs.inc $(HDR)stacks.inc $(TARGET).lnk
|
io.obj: io.asm segs.inc $(HDR)stacks.inc $(TARGET).lnk
|
||||||
irqstack.obj: irqstack.asm segs.inc $(TARGET).lnk
|
irqstack.obj: irqstack.asm segs.inc $(TARGET).lnk
|
||||||
kernel.obj: kernel.asm segs.inc ludivmul.inc $(TARGET).lnk
|
kernel.obj: kernel.asm segs.inc ludivmul.inc $(TARGET).lnk
|
||||||
|
memdisk.obj: memdisk.asm segs.inc $(TARGET).lnk
|
||||||
nls_hc.obj: nls_hc.asm segs.inc $(TARGET).lnk
|
nls_hc.obj: nls_hc.asm segs.inc $(TARGET).lnk
|
||||||
nlssupt.obj: nlssupt.asm segs.inc $(HDR)stacks.inc $(TARGET).lnk
|
nlssupt.obj: nlssupt.asm segs.inc $(HDR)stacks.inc $(TARGET).lnk
|
||||||
printer.obj: printer.asm io.inc $(TARGET).lnk
|
printer.obj: printer.asm io.inc $(TARGET).lnk
|
||||||
|
81
kernel/memdisk.asm
Normal file
81
kernel/memdisk.asm
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
; File:
|
||||||
|
; memdisk.asm
|
||||||
|
; Description:
|
||||||
|
; Query for memdisk provided config.sys parameters
|
||||||
|
;
|
||||||
|
; DOS-C
|
||||||
|
; Copyright (c) 2011
|
||||||
|
; FreeDOS
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
; This file is part of DOS-C.
|
||||||
|
;
|
||||||
|
; DOS-C is free software; you can redistribute it and/or
|
||||||
|
; modify it under the terms of the GNU General Public License
|
||||||
|
; as published by the Free Software Foundation; either version
|
||||||
|
; 2, or (at your option) any later version.
|
||||||
|
;
|
||||||
|
; DOS-C is distributed in the hope that it will be useful, but
|
||||||
|
; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||||
|
; the GNU General Public License for more details.
|
||||||
|
;
|
||||||
|
;
|
||||||
|
|
||||||
|
%if XCPU == 386 ; requires 386+ registers, until CPU check implemented only allow for 386 builds
|
||||||
|
|
||||||
|
%include "segs.inc"
|
||||||
|
segment INIT_TEXT
|
||||||
|
|
||||||
|
CPU 386
|
||||||
|
;*********************************************************************
|
||||||
|
;
|
||||||
|
; query_memdisk() based on similar subroutine in Eric Auer's public domain getargs.asm which is based on IFMEMDSK
|
||||||
|
; input: drive (in AL) to query if memdisk provided disk
|
||||||
|
; output: a far * to a memdiskinfo structure as defined by memdisk (see config.c)
|
||||||
|
; struct memdiskinfo FAR * query_memdisk(UBYTE drive);
|
||||||
|
global _query_memdisk
|
||||||
|
_query_memdisk:
|
||||||
|
; save registers, assumes enough space on stack & valid stack frame setup, ax & dx return values
|
||||||
|
push es
|
||||||
|
push di
|
||||||
|
push ebx
|
||||||
|
push ecx
|
||||||
|
push edx ; we only care about high word
|
||||||
|
push eax ; we only care about high word
|
||||||
|
mov dl, al ; drive number (only argument, assumed to be in AL)
|
||||||
|
mov eax,454d0800h ; magic1 + AH=8 (get geometry)
|
||||||
|
mov ecx,444d0000h ; magic2
|
||||||
|
mov edx,53490000h ; magic3 +
|
||||||
|
mov ebx,3f4b0000h ; magic4
|
||||||
|
int 13h ; BIOS DISK API
|
||||||
|
shr eax,16 ; ignore AX
|
||||||
|
shr ebx,16 ; ignore BX
|
||||||
|
shr ecx,16 ; ignore CX (geometry C/S)
|
||||||
|
shr edx,16 ; ignore DX (geometry H in DH)
|
||||||
|
cmp ax,4d21h ; magic5
|
||||||
|
jnz nomemdisk
|
||||||
|
cmp cx,4d45h ; magic6
|
||||||
|
jnz nomemdisk
|
||||||
|
cmp dx,4944h ; magic7
|
||||||
|
jnz nomemdisk
|
||||||
|
cmp bx,4b53h ; magic8
|
||||||
|
jnz nomemdisk
|
||||||
|
jmp cleanup
|
||||||
|
|
||||||
|
nomemdisk:
|
||||||
|
xor di, di ; return NULL;
|
||||||
|
mov es, di
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
pop eax
|
||||||
|
pop edx
|
||||||
|
mov ax, di ; return MK_FP(es, di);
|
||||||
|
mov dx, es
|
||||||
|
pop ecx
|
||||||
|
pop ebx
|
||||||
|
pop di
|
||||||
|
pop es
|
||||||
|
retn
|
||||||
|
|
||||||
|
%endif
|
Loading…
x
Reference in New Issue
Block a user