mirror of
https://github.com/FDOS/kernel.git
synced 2025-07-23 22:04:33 +02:00
more win3 support, some comments, upx option to build.bat, misc debug print changes
git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/branches/UNSTABLE@1147 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
a82122eec8
commit
24f47a5ecc
@ -6,7 +6,7 @@
|
|||||||
if NOT "%1" == "/?" goto start
|
if NOT "%1" == "/?" goto start
|
||||||
echo ":-----------------------------------------------------------------------"
|
echo ":-----------------------------------------------------------------------"
|
||||||
echo ":- Syntax: BUILD [-r] [fat32|fat16] [msc|wc|tc|tcpp|bc] [86|186|386] "
|
echo ":- Syntax: BUILD [-r] [fat32|fat16] [msc|wc|tc|tcpp|bc] [86|186|386] "
|
||||||
echo ":- [debug] [lfnapi] [/L #] [/D value] [list] "
|
echo ":- [debug] [lfnapi] [/L #] [/D value] [list] [upx] "
|
||||||
echo ":- option case is significant !! "
|
echo ":- option case is significant !! "
|
||||||
echo ":- Note: Open Watcom (wc) is the preferred compiler "
|
echo ":- Note: Open Watcom (wc) is the preferred compiler "
|
||||||
echo ":-----------------------------------------------------------------------"
|
echo ":-----------------------------------------------------------------------"
|
||||||
@ -47,6 +47,8 @@ if "%1" == "186" set XCPU=186
|
|||||||
if "%1" == "386" set XCPU=386
|
if "%1" == "386" set XCPU=386
|
||||||
if "%1" == "x86" goto setCPU
|
if "%1" == "x86" goto setCPU
|
||||||
|
|
||||||
|
if "%1" == "upx" set XUPX=upx --8086 --best
|
||||||
|
|
||||||
if "%1" == "debug" set ALLCFLAGS=%ALLCFLAGS% -DDEBUG
|
if "%1" == "debug" set ALLCFLAGS=%ALLCFLAGS% -DDEBUG
|
||||||
if "%1" == "lfnapi" set ALLCFLAGS=%ALLCFLAGS% -DWITHLFNAPI
|
if "%1" == "lfnapi" set ALLCFLAGS=%ALLCFLAGS% -DWITHLFNAPI
|
||||||
|
|
||||||
|
8
config.b
8
config.b
@ -87,10 +87,15 @@ set WATCOM=c:\watcom
|
|||||||
::set MAKE=nmaker /nologo
|
::set MAKE=nmaker /nologo
|
||||||
|
|
||||||
:-----------------------------------------------------------------------
|
:-----------------------------------------------------------------------
|
||||||
|
:- This section can still be used if you need special consideration
|
||||||
|
:- for UPX, such as it is not in your PATH or you do not want
|
||||||
|
:- 8086 compatible settings, otherwise the recommended use is now
|
||||||
|
:- to add 'upx' option to the build.bat command line
|
||||||
|
|
||||||
:- where is UPX and which options to use
|
:- where is UPX and which options to use
|
||||||
:- (comment this out if you don't want to use it)
|
:- (comment this out if you don't want to use it)
|
||||||
|
|
||||||
set XUPX=upx --8086 --best
|
::set XUPX=upx --8086 --best
|
||||||
|
|
||||||
:-----------------------------------------------------------------------
|
:-----------------------------------------------------------------------
|
||||||
:- select default target: CPU type (default is 86) and
|
:- select default target: CPU type (default is 86) and
|
||||||
@ -107,6 +112,7 @@ set XUPX=upx --8086 --best
|
|||||||
:- Give extra compiler DEFINE flags here
|
:- Give extra compiler DEFINE flags here
|
||||||
:- such as -DDEBUG : extra DEBUG output
|
:- such as -DDEBUG : extra DEBUG output
|
||||||
:- -DDOSEMU : printf output goes to dosemu log
|
:- -DDOSEMU : printf output goes to dosemu log
|
||||||
|
:- -DWIN31SUPPORT : extra Win3.x API support
|
||||||
::set ALLCFLAGS=-DDEBUG
|
::set ALLCFLAGS=-DDEBUG
|
||||||
|
|
||||||
:-----------------------------------------------------------------------
|
:-----------------------------------------------------------------------
|
||||||
|
@ -395,12 +395,24 @@
|
|||||||
time failure finding/loading CONFIG.SYS)
|
time failure finding/loading CONFIG.SYS)
|
||||||
* config.txt
|
* config.txt
|
||||||
- update to include all CONFIG.SYS options (except ANYDOS)
|
- update to include all CONFIG.SYS options (except ANYDOS)
|
||||||
|
* debug.h
|
||||||
|
- add additional debug style printfs to enable selective debug output
|
||||||
|
* entry.asm
|
||||||
|
- add [conditional compiled] support for OEM handler (int 21h ah>0xf8)
|
||||||
|
- work towards critical section entry/exit calls for Win3 support
|
||||||
* exeflat.c
|
* exeflat.c
|
||||||
- show usage also when number of arguments incorrect
|
- show usage also when number of arguments incorrect
|
||||||
* fatdir.c
|
* fatdir.c
|
||||||
- be more restrictive in what considered a volume search
|
- be more restrictive in what considered a volume search
|
||||||
* initdisk.c
|
* initdisk.c
|
||||||
- set hidden & huge fields in floppy bpb (bugfix 1789)
|
- set hidden & huge fields in floppy bpb (bugfix 1789)
|
||||||
|
* inthndlr.c
|
||||||
|
- add [conditional compiled] support for Win3 API calls (entry/exit/...)
|
||||||
|
* int2f.asm
|
||||||
|
- switch to local stack when Win3 support compiled in, ?unneeded/to be removed?
|
||||||
|
* kernel.asm
|
||||||
|
- comment some additional variables
|
||||||
|
- use some unused spaces for OEMHandler variable and Win3 instancing information
|
||||||
* main.c
|
* main.c
|
||||||
- treat block devices returning 0 units as load failure
|
- treat block devices returning 0 units as load failure
|
||||||
* oemboot.asm - add [optional] PC/MS DOS compatible boot sector
|
* oemboot.asm - add [optional] PC/MS DOS compatible boot sector
|
||||||
|
28
hdr/debug.h
28
hdr/debug.h
@ -36,8 +36,14 @@
|
|||||||
NOTE: this file included by INIT time code and normal
|
NOTE: this file included by INIT time code and normal
|
||||||
resident code, so use care for all memory references
|
resident code, so use care for all memory references
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* allow output even in non-debug builds */
|
||||||
|
#if 0
|
||||||
|
#ifndef DEBUG_NEED_PRINTF
|
||||||
|
#define DEBUG_NEED_PRINTF
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* use to limit output to debug builds */
|
/* use to limit output to debug builds */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#define DebugPrintf(x) printf x
|
#define DebugPrintf(x) printf x
|
||||||
@ -92,9 +98,12 @@
|
|||||||
#define FDirDbgPrintf(x)
|
#define FDirDbgPrintf(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* extra debug output marking sections */
|
/* extra debug output when transferring I/O chunks of data */
|
||||||
/* #define DISPLAY_GETBLOCK */
|
/* #define DISPLAY_GETBLOCK */
|
||||||
|
|
||||||
|
/* extra output during read/write operations */
|
||||||
|
/* #define DSK_DEBUG */
|
||||||
|
|
||||||
/* display info on various FAT handling functions (fatfs.c) */
|
/* display info on various FAT handling functions (fatfs.c) */
|
||||||
/* #define DEBUGFATFS */
|
/* #define DEBUGFATFS */
|
||||||
#ifdef DEBUGFATFS
|
#ifdef DEBUGFATFS
|
||||||
@ -103,6 +112,14 @@
|
|||||||
#define FatFSDbgPrintf(x)
|
#define FatFSDbgPrintf(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* debug truename */
|
||||||
|
/* #define DEBUG_TRUENAME */
|
||||||
|
#ifdef DEBUG_TRUENAME
|
||||||
|
#define tn_printf(x) printf x
|
||||||
|
#else
|
||||||
|
#define tn_printf(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* just to be sure printf is declared */
|
/* just to be sure printf is declared */
|
||||||
#if defined(DEBUG) || defined(DEBUGIRQ) || defined(DEBUGCFG) || \
|
#if defined(DEBUG) || defined(DEBUGIRQ) || defined(DEBUGCFG) || \
|
||||||
@ -110,8 +127,11 @@
|
|||||||
defined(DEBUGFATDIR) || defined(DEBUGFATFS)
|
defined(DEBUGFATDIR) || defined(DEBUGFATFS)
|
||||||
#ifndef DEBUG_NEED_PRINTF
|
#ifndef DEBUG_NEED_PRINTF
|
||||||
#define DEBUG_NEED_PRINTF
|
#define DEBUG_NEED_PRINTF
|
||||||
VOID VA_CDECL printf(const char * fmt, ...);
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG_NEED_PRINTF
|
||||||
|
VOID VA_CDECL printf(const char * fmt, ...);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __DEBUG_H */
|
#endif /* __DEBUG_H */
|
||||||
|
@ -96,10 +96,12 @@ STATIC int remote_lock_unlock(sft FAR *sftp, /* SFT for file */
|
|||||||
|
|
||||||
/* get current directory structure for drive
|
/* get current directory structure for drive
|
||||||
return NULL if the CDS is not valid or the
|
return NULL if the CDS is not valid or the
|
||||||
drive is not within range */
|
drive is not within range, on input drv is
|
||||||
|
0 for default or 1=A,2=B,...
|
||||||
|
*/
|
||||||
struct cds FAR *get_cds1(unsigned drv)
|
struct cds FAR *get_cds1(unsigned drv)
|
||||||
{
|
{
|
||||||
if (drv-- == 0) /* 0 = A:, 1 = B:, ... */
|
if (drv-- == 0) /* get default drive or convert to 0 = A:, 1 = B:, ... */
|
||||||
drv = default_drive;
|
drv = default_drive;
|
||||||
return get_cds(drv);
|
return get_cds(drv);
|
||||||
}
|
}
|
||||||
@ -781,6 +783,16 @@ COUNT DosClose(COUNT hndl)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get disk free space (in terms of free clusters and cluster size)
|
||||||
|
input: drive specifies which disk to obtain information about,
|
||||||
|
where 0=default, 1=A,2=B,...
|
||||||
|
navc, bps, and nc are pointers to uninitialized variables
|
||||||
|
used to hold the result, where
|
||||||
|
navc is count of available [free] clusters
|
||||||
|
bps is bytes per sector
|
||||||
|
nc is total number of clusters
|
||||||
|
returns the number of sectors per cluster or on error -1
|
||||||
|
*/
|
||||||
UWORD DosGetFree(UBYTE drive, UWORD * navc, UWORD * bps, UWORD * nc)
|
UWORD DosGetFree(UBYTE drive, UWORD * navc, UWORD * bps, UWORD * nc)
|
||||||
{
|
{
|
||||||
/* navc==NULL means: called from FatGetDrvData, fcbfns.c */
|
/* navc==NULL means: called from FatGetDrvData, fcbfns.c */
|
||||||
|
@ -206,6 +206,35 @@ reloc_call_int20_handler:
|
|||||||
; int21_handler(iregs UserRegs)
|
; int21_handler(iregs UserRegs)
|
||||||
;
|
;
|
||||||
reloc_call_int21_handler:
|
reloc_call_int21_handler:
|
||||||
|
;%define OEMHANDLER ; enable OEM hook, mostly OEM DOS 2.x, maybe through OEM 6.x
|
||||||
|
%ifdef OEMHANDLER
|
||||||
|
extern _OemHook21
|
||||||
|
; When defined and set (!= ffff:ffffh) invoke installed
|
||||||
|
; int 21h handler for ah=f9h through ffh
|
||||||
|
; with all registers preserved, callee must perform the iret
|
||||||
|
cmp ah, 0f9h ; if a normal int21 call, proceed
|
||||||
|
jb skip_oemhndlr ; as quickly as possible
|
||||||
|
; we need all registers preserved but also
|
||||||
|
; access to the hook address, so we copy locally
|
||||||
|
; 1st (while performing check for valid address)
|
||||||
|
; then do the jmp
|
||||||
|
push ds
|
||||||
|
push dx
|
||||||
|
mov dx,[cs:_DGROUP_]
|
||||||
|
mov ds,dx
|
||||||
|
cmp word [_OemHook21], -1
|
||||||
|
je no_oemhndlr
|
||||||
|
cmp word [_OemHook21+2], -1
|
||||||
|
je no_oemhndlr
|
||||||
|
pop dx
|
||||||
|
pop ds
|
||||||
|
jmp far [ds:_OemHook21] ; invoke OEM handler (no return)
|
||||||
|
;local_hookaddr dd 0
|
||||||
|
no_oemhndlr:
|
||||||
|
pop dx
|
||||||
|
pop ds
|
||||||
|
skip_oemhndlr:
|
||||||
|
%endif ;OEMHANDLER
|
||||||
;
|
;
|
||||||
; Create the stack frame for C call. This is done to
|
; Create the stack frame for C call. This is done to
|
||||||
; preserve machine state and provide a C structure for
|
; preserve machine state and provide a C structure for
|
||||||
@ -246,7 +275,9 @@ int21_reentry:
|
|||||||
jne int21_1
|
jne int21_1
|
||||||
|
|
||||||
int21_user:
|
int21_user:
|
||||||
|
%IFNDEF WIN31SUPPORT ; begin critical section
|
||||||
call dos_crit_sect
|
call dos_crit_sect
|
||||||
|
%ENDIF ; NOT WIN31SUPPORT
|
||||||
|
|
||||||
push ss
|
push ss
|
||||||
push bp
|
push bp
|
||||||
@ -309,15 +340,30 @@ int21_onerrorstack:
|
|||||||
jmp short int21_exit_nodec
|
jmp short int21_exit_nodec
|
||||||
|
|
||||||
|
|
||||||
int21_2: inc byte [_InDOS]
|
int21_2:
|
||||||
|
%IFDEF WIN31SUPPORT ; begin critical section
|
||||||
|
; should be called as needed, but we just
|
||||||
|
; mark the whole int21 api as critical
|
||||||
|
push ax
|
||||||
|
mov ax, 8001h ; Enter Critical Section
|
||||||
|
int 2ah
|
||||||
|
pop ax
|
||||||
|
%ENDIF ; WIN31SUPPORT
|
||||||
|
inc byte [_InDOS]
|
||||||
mov cx,_char_api_tos
|
mov cx,_char_api_tos
|
||||||
or ah,ah
|
or ah,ah
|
||||||
jz int21_3
|
jz int21_3
|
||||||
|
%IFDEF WIN31SUPPORT ; testing, this function call crashes
|
||||||
|
cmp ah,06h
|
||||||
|
je int21_3
|
||||||
|
%ENDIF ; WIN31SUPPORT
|
||||||
cmp ah,0ch
|
cmp ah,0ch
|
||||||
jbe int21_normalentry
|
jbe int21_normalentry
|
||||||
|
|
||||||
int21_3:
|
int21_3:
|
||||||
|
%IFNDEF WIN31SUPPORT ; begin critical section
|
||||||
call dos_crit_sect
|
call dos_crit_sect
|
||||||
|
%ENDIF ; NOT WIN31SUPPORT
|
||||||
mov cx,_disk_api_tos
|
mov cx,_disk_api_tos
|
||||||
|
|
||||||
int21_normalentry:
|
int21_normalentry:
|
||||||
@ -337,6 +383,17 @@ int21_normalentry:
|
|||||||
call _int21_service
|
call _int21_service
|
||||||
|
|
||||||
int21_exit: dec byte [_InDOS]
|
int21_exit: dec byte [_InDOS]
|
||||||
|
%IFDEF WIN31SUPPORT ; end critical section
|
||||||
|
call dos_crit_sect ; release all critical sections
|
||||||
|
%if 0
|
||||||
|
; should be called as needed, but we just
|
||||||
|
; mark the whole int21 api as critical
|
||||||
|
push ax
|
||||||
|
mov ax, 8101h ; Leave Critical Section
|
||||||
|
int 2ah
|
||||||
|
pop ax
|
||||||
|
%endif
|
||||||
|
%ENDIF ; WIN31SUPPORT
|
||||||
|
|
||||||
;
|
;
|
||||||
; Recover registers from system call. Registers and flags
|
; Recover registers from system call. Registers and flags
|
||||||
|
@ -1833,11 +1833,11 @@ int dos_cd(char * PathName)
|
|||||||
f_node_ptr get_near_f_node(void)
|
f_node_ptr get_near_f_node(void)
|
||||||
{
|
{
|
||||||
f_node_ptr fnp = fnode;
|
f_node_ptr fnp = fnode;
|
||||||
DebugPrintf(("get_near_f_node: fnp is %p\n", fnp));
|
DDebugPrintf(("get_near_f_node: fnp is %p\n", fnp));
|
||||||
if (fnp->f_count && (++fnp)->f_count)
|
if (fnp->f_count && (++fnp)->f_count)
|
||||||
panic("more than two near fnodes requested at the same time!\n");
|
panic("more than two near fnodes requested at the same time!\n");
|
||||||
fnp->f_count++;
|
fnp->f_count++;
|
||||||
DebugPrintf(("got near fnode, fnp->f_count=%i\n", fnp->f_count));
|
DDebugPrintf(("got near fnode, fnp->f_count=%i\n", fnp->f_count));
|
||||||
return fnp;
|
return fnp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,6 +69,9 @@ Int2f3:
|
|||||||
cmp ax,4a33h ; Check DOS version 7
|
cmp ax,4a33h ; Check DOS version 7
|
||||||
jne Check4Share
|
jne Check4Share
|
||||||
xor ax,ax ; no undocumented shell strings
|
xor ax,ax ; no undocumented shell strings
|
||||||
|
xor bx,bx ; RBIL undoc BX = ?? (0h)
|
||||||
|
; " DS:DX ASCIIZ shell exe name
|
||||||
|
; " DS:SI SHELL= line
|
||||||
iret
|
iret
|
||||||
Check4Share:
|
Check4Share:
|
||||||
%endif
|
%endif
|
||||||
@ -134,6 +137,28 @@ IntDosCal:
|
|||||||
|
|
||||||
cld
|
cld
|
||||||
|
|
||||||
|
%IFDEF WIN31SUPPORT ; switch to local stack, no reentrancy support
|
||||||
|
extern mux2F_stk_top:wrt DGROUP
|
||||||
|
cli
|
||||||
|
; setup, initialize copy
|
||||||
|
mov si, sp ; ds:si = ss:sp (user stack)
|
||||||
|
mov ax, ss
|
||||||
|
mov ds, ax
|
||||||
|
mov di, mux2F_stk_top-30 ; es:di = local stack-copied chunk
|
||||||
|
mov es, [cs:_DGROUP_] ; [-X == -(2*cx below+4) ]
|
||||||
|
mov cx, 13 ; how many words to copy over
|
||||||
|
; setup, store original stack pointer
|
||||||
|
mov [es:di+28], si ; store ss:sp
|
||||||
|
mov [es:di+26], ds
|
||||||
|
; actually switch to local stack
|
||||||
|
mov ax, es
|
||||||
|
mov ss, ax
|
||||||
|
mov sp, di
|
||||||
|
; copy over stack data to local stack
|
||||||
|
rep movsw
|
||||||
|
sti
|
||||||
|
%ENDIF ; WIN31SUPPORT
|
||||||
|
|
||||||
%if XCPU >= 386
|
%if XCPU >= 386
|
||||||
%ifdef WATCOM
|
%ifdef WATCOM
|
||||||
mov si,fs
|
mov si,fs
|
||||||
@ -156,6 +181,24 @@ IntDosCal:
|
|||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%IFDEF WIN31SUPPORT ; switch back to user stack
|
||||||
|
cli
|
||||||
|
; setup, initialize copy
|
||||||
|
mov si, sp ; ds:si = ss:sp (local stack)
|
||||||
|
mov ax, ss
|
||||||
|
mov ds, ax
|
||||||
|
mov di, [ds:si+28] ; restore original ss:sp
|
||||||
|
mov es, [ds:si+26]
|
||||||
|
mov cx, 13 ; how many words to copy over
|
||||||
|
; actually switch to user stack
|
||||||
|
mov ax, es
|
||||||
|
mov ss, ax
|
||||||
|
mov sp, di
|
||||||
|
; copy over stack data to user stack
|
||||||
|
rep movsw
|
||||||
|
sti
|
||||||
|
%ENDIF ; WIN31SUPPORT
|
||||||
|
|
||||||
pop es
|
pop es
|
||||||
pop ds
|
pop ds
|
||||||
pop di
|
pop di
|
||||||
|
@ -31,6 +31,8 @@
|
|||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "nls.h"
|
#include "nls.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef VERSION_STRINGS
|
#ifdef VERSION_STRINGS
|
||||||
BYTE *RcsId =
|
BYTE *RcsId =
|
||||||
@ -413,7 +415,7 @@ dispatch:
|
|||||||
if (bDumpRegs)
|
if (bDumpRegs)
|
||||||
{
|
{
|
||||||
fmemcpy(&error_regs, user_r, sizeof(iregs));
|
fmemcpy(&error_regs, user_r, sizeof(iregs));
|
||||||
printf("System call (21h): %02x\n", user_r->AX);
|
printf("System call (21h): %04x\n", user_r->AX);
|
||||||
dump_regs = TRUE;
|
dump_regs = TRUE;
|
||||||
dump();
|
dump();
|
||||||
}
|
}
|
||||||
@ -762,6 +764,7 @@ dispatch:
|
|||||||
case 0x31:
|
case 0x31:
|
||||||
DosMemChange(cu_psp, lr.DX < 6 ? 6 : lr.DX, 0);
|
DosMemChange(cu_psp, lr.DX < 6 ? 6 : lr.DX, 0);
|
||||||
return_code = lr.AL | 0x300;
|
return_code = lr.AL | 0x300;
|
||||||
|
DDebugPrintf(("ErrorLevel kernel returns is %x(==%x|0x300)\n", (unsigned)return_code, (unsigned)lr.AL));
|
||||||
tsr = TRUE;
|
tsr = TRUE;
|
||||||
return_user();
|
return_user();
|
||||||
break;
|
break;
|
||||||
@ -1034,6 +1037,7 @@ dispatch:
|
|||||||
rc = 0x100;
|
rc = 0x100;
|
||||||
}
|
}
|
||||||
return_code = lr.AL | rc;
|
return_code = lr.AL | rc;
|
||||||
|
DDebugPrintf(("ErrorLevel kernel returns is %x\n", (unsigned)return_code));
|
||||||
if (DosMemCheck() != SUCCESS)
|
if (DosMemCheck() != SUCCESS)
|
||||||
panic("MCB chain corrupted");
|
panic("MCB chain corrupted");
|
||||||
#ifdef TSC
|
#ifdef TSC
|
||||||
@ -1045,6 +1049,7 @@ dispatch:
|
|||||||
/* Get Child-program Return Value */
|
/* Get Child-program Return Value */
|
||||||
case 0x4d:
|
case 0x4d:
|
||||||
lr.AX = return_code;
|
lr.AX = return_code;
|
||||||
|
DDebugPrintf(("Child ErrorLevel kernel returns is %x(==%x)\n", (unsigned)return_code, (unsigned)lr.AX));
|
||||||
/* needs to be cleared (RBIL) */
|
/* needs to be cleared (RBIL) */
|
||||||
return_code = 0;
|
return_code = 0;
|
||||||
break;
|
break;
|
||||||
@ -1734,7 +1739,12 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
|
|||||||
switch (r.AL)
|
switch (r.AL)
|
||||||
{
|
{
|
||||||
/* default: unhandled requests pass through unchanged */
|
/* default: unhandled requests pass through unchanged */
|
||||||
#if 0
|
case 0x0: /* is Windows active */
|
||||||
|
case 0x0A: /* identify Windows version */
|
||||||
|
{
|
||||||
|
/* return AX unchanged if Windows not active */
|
||||||
|
break;
|
||||||
|
} /* 0x0, 0x0A */
|
||||||
case 0x03: /* Windows Get Instance Data */
|
case 0x03: /* Windows Get Instance Data */
|
||||||
{
|
{
|
||||||
/* This should only be called if AX=1607h/BX=15h is not supported. */
|
/* This should only be called if AX=1607h/BX=15h is not supported. */
|
||||||
@ -1742,12 +1752,12 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
|
|||||||
can also be in INSTANCE.386 [which in theory means Windows could
|
can also be in INSTANCE.386 [which in theory means Windows could
|
||||||
be updated to support FD kernel without responding to these?].
|
be updated to support FD kernel without responding to these?].
|
||||||
*/
|
*/
|
||||||
|
DebugPrintf(("get instance data\n"));
|
||||||
break;
|
break;
|
||||||
} /* 0x03 */
|
} /* 0x03 */
|
||||||
#endif
|
|
||||||
case 0x05: /* Windows Startup Broadcast */
|
case 0x05: /* Windows Startup Broadcast */
|
||||||
{
|
{
|
||||||
/* After receiving this call we activiate compatibility changes
|
/* After receiving this call we activate compatibility changes
|
||||||
as DOS 5 does, though can wait until 0x07 subfunc 0x01
|
as DOS 5 does, though can wait until 0x07 subfunc 0x01
|
||||||
*/
|
*/
|
||||||
/* on entry:
|
/* on entry:
|
||||||
@ -1763,6 +1773,7 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
|
|||||||
r.BX = FP_OFF(&winStartupInfo);
|
r.BX = FP_OFF(&winStartupInfo);
|
||||||
winStartupInfo.winver = r.di; /* match what caller says it is */
|
winStartupInfo.winver = r.di; /* match what caller says it is */
|
||||||
winInstanced = 1; /* internal flag marking Windows is active */
|
winInstanced = 1; /* internal flag marking Windows is active */
|
||||||
|
DebugPrintf(("Win startup\n"));
|
||||||
break;
|
break;
|
||||||
} /* 0x05 */
|
} /* 0x05 */
|
||||||
case 0x06: /* Windows Exit Broadcast */
|
case 0x06: /* Windows Exit Broadcast */
|
||||||
@ -1772,10 +1783,12 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
|
|||||||
Note: If Windows fatally exits then may not be called.
|
Note: If Windows fatally exits then may not be called.
|
||||||
*/
|
*/
|
||||||
winInstanced = 0; /* internal flag marking Windows is NOT active */
|
winInstanced = 0; /* internal flag marking Windows is NOT active */
|
||||||
|
DebugPrintf(("Win exit\n"));
|
||||||
break;
|
break;
|
||||||
} /* 0x06 */
|
} /* 0x06 */
|
||||||
case 0x07: /* DOSMGR Virtual Device API */
|
case 0x07: /* DOSMGR Virtual Device API */
|
||||||
{
|
{
|
||||||
|
DebugPrintf(("Vxd:DOSMGR:%x:%x:%x:%x\n",r.AX,r.BX,r.CX,r.DX));
|
||||||
if (r.BX == 0x15) /* VxD id of "DOSMGR" */
|
if (r.BX == 0x15) /* VxD id of "DOSMGR" */
|
||||||
{
|
{
|
||||||
switch (r.CX)
|
switch (r.CX)
|
||||||
@ -1791,7 +1804,7 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
|
|||||||
}
|
}
|
||||||
case 0x01: /* enable Win support, ie patch DOS */
|
case 0x01: /* enable Win support, ie patch DOS */
|
||||||
{
|
{
|
||||||
/* DOS 5+ return with flags unchanged, Windows critical section
|
/* DOS 5+ return with bitflags unchanged, Windows critical section
|
||||||
needs are handled without need to patch. If this
|
needs are handled without need to patch. If this
|
||||||
function does not return successfully windows will
|
function does not return successfully windows will
|
||||||
attempt to do the patching itself (very bad idea).
|
attempt to do the patching itself (very bad idea).
|
||||||
@ -1810,12 +1823,19 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
|
|||||||
0010h: notify Windows of logical drive map change ("Insert disk X:")
|
0010h: notify Windows of logical drive map change ("Insert disk X:")
|
||||||
*/
|
*/
|
||||||
r.BX = r.DX; /* sure we support everything asked for, ;-) */
|
r.BX = r.DX; /* sure we support everything asked for, ;-) */
|
||||||
r.DX = 0xA2AB; /* on succes DS:AX set to A2AB:B97Ch */
|
r.DX = 0xA2AB; /* on succes DX:AX set to A2AB:B97Ch */
|
||||||
r.AX = 0xB97C;
|
r.AX = 0xB97C;
|
||||||
/* FIXME: do we need to do anything special for FD kernel? */
|
/* FIXME: do we need to do anything special for FD kernel? */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* case 0x02 is below so we can reuse it for 0x05 */
|
case 0x02: /* disable Win support, ie remove patches */
|
||||||
|
{
|
||||||
|
/* Note: if we do anything special in 'patch DOS', undo it here.
|
||||||
|
This is only called when Windows exits, can be ignored.
|
||||||
|
*/
|
||||||
|
r.CX = 0; /* for compatibility with MS-DOS 5/6 */
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 0x03: /* get internal structure sizes */
|
case 0x03: /* get internal structure sizes */
|
||||||
{
|
{
|
||||||
if (r.CX & 0x01) /* size of Current Directory Structure in bytes */
|
if (r.CX & 0x01) /* size of Current Directory Structure in bytes */
|
||||||
@ -1839,29 +1859,89 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
|
|||||||
*/
|
*/
|
||||||
r.DX = 0xA2AB; /* on succes DS:AX set to A2AB:B97Ch */
|
r.DX = 0xA2AB; /* on succes DS:AX set to A2AB:B97Ch */
|
||||||
r.AX = 0xB97C;
|
r.AX = 0xB97C;
|
||||||
r.BX = 0x0008; /* our whole data seg is instanced, so
|
r.BX = 0; /* a zero here tells Windows to instance everything */
|
||||||
anything within it we assume instanced. */
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x05: /* get device driver size */
|
case 0x05: /* get device driver size */
|
||||||
{
|
{
|
||||||
|
/* On entry ES:DI points to possible device driver
|
||||||
|
if is not one return with AX=BX=CX=DX=0
|
||||||
|
else return BX:CX size in bytes allocated to driver
|
||||||
|
and DX:AX set to A2AB:B97Ch */
|
||||||
|
mcb FAR *smcb = MK_PTR(mcb, (r.ES-1), 0); /* para before is possibly submcb segment */
|
||||||
|
/* drivers always start a seg:0 (DI==0), so if not then either
|
||||||
|
not device driver or duplicate (ie device driver file loaded
|
||||||
|
is of multi-driver variety; multiple device drivers in same file,
|
||||||
|
whose memory was allocated as a single chunk)
|
||||||
|
Drivers don't really have a MCB, instead the DOS MCB is broken
|
||||||
|
up into submcbs, which will have a type of 'D' (or 'E')
|
||||||
|
So we check that this is primary segment, a device driver, and owner.
|
||||||
|
*/
|
||||||
|
if (!r.DI && (smcb->m_type == 'D') && (smcb->m_psp == r.ES))
|
||||||
|
{
|
||||||
|
ULONG size = smcb->m_size * 16ul;
|
||||||
|
r.BX = hiword(size);
|
||||||
|
r.CX = loword(size);
|
||||||
|
r.DX = 0xA2AB; /* on succes DX:AX set to A2AB:B97Ch */
|
||||||
|
r.AX = 0xB97C;
|
||||||
|
break;
|
||||||
|
}
|
||||||
r.DX = 0; /* we aren't one so return unsupported */
|
r.DX = 0; /* we aren't one so return unsupported */
|
||||||
r.AX = 0;
|
r.AX = 0;
|
||||||
r.BX = 0;
|
r.BX = 0;
|
||||||
/* fall through to set CX=0 and exit */
|
r.CX = 0;
|
||||||
}
|
|
||||||
case 0x02: /* disable Win support, ie remove patches */
|
|
||||||
{
|
|
||||||
/* Note: if we do anything special in 'patch DOS', undo it here.
|
|
||||||
This is only called when Windows exits, can be ignored.
|
|
||||||
*/
|
|
||||||
r.CX = 0; /* for compatibility with MS-DOS 5/6 */
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
DebugPrintf(("Vxd:DOSMGR:%x:%x:%x:%x\n",r.AX,r.BX,r.CX,r.DX));
|
||||||
break;
|
break;
|
||||||
} /* 0x07 */
|
} /* 0x07 */
|
||||||
|
case 0x08: /* Windows Init Complete Broadcast */
|
||||||
|
{
|
||||||
|
DebugPrintf(("Init complete\n"));
|
||||||
|
break;
|
||||||
|
} /* 0x08 */
|
||||||
|
case 0x09: /* Windows Begin Exit Broadcast */
|
||||||
|
{
|
||||||
|
DebugPrintf(("Exit initiated\n"));
|
||||||
|
break;
|
||||||
|
} /* 0x09 */
|
||||||
|
case 0x0B: /* Win TSR Identify */
|
||||||
|
{
|
||||||
|
DebugPrintf(("TSR identify request.\n"));
|
||||||
|
break;
|
||||||
|
} /* 0x0B */
|
||||||
|
case 0x80: /* Win Release Time-slice */
|
||||||
|
{
|
||||||
|
/* This function is generally only called in idle loops */
|
||||||
|
enable; /* enable interrupts */
|
||||||
|
// __emit__(0xf4); /* halt */
|
||||||
|
asm hlt;
|
||||||
|
r.AX = 0;
|
||||||
|
/* DebugPrintf(("Release Time Slice\n")); */
|
||||||
|
break;
|
||||||
|
} /* 0x80 */
|
||||||
|
case 0x81: /* Win3 Begin Critical Section */
|
||||||
|
{
|
||||||
|
DebugPrintf(("Begin CritSect\n"));
|
||||||
|
break;
|
||||||
|
} /* 0x81 */
|
||||||
|
case 0x82: /* Win3 End Critical Section */
|
||||||
|
{
|
||||||
|
DebugPrintf(("End CritSect\n"));
|
||||||
|
break;
|
||||||
|
} /* 0x82 */
|
||||||
|
case 0x8F: /* Win4 Close Awareness */
|
||||||
|
{
|
||||||
|
if (r.DH != 0x01) /* query close */
|
||||||
|
r.AX = 0x0;
|
||||||
|
/* else r.AX = 0x168F; don't close -- continue execution */
|
||||||
|
break;
|
||||||
|
} /* 0x8F */
|
||||||
|
default:
|
||||||
|
DebugPrintf(("Win call (int 2Fh/16h): %04x %04x %04x %04x\n", r.AX, r.BX, r.CX, r.DX));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
@ -1874,7 +1954,7 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
|
|||||||
/* To prevent corruption when dos=umb where Windows 3.0 standard
|
/* To prevent corruption when dos=umb where Windows 3.0 standard
|
||||||
writes a sentinel at 9FFEh, DOS 5 will save the MCB marking
|
writes a sentinel at 9FFEh, DOS 5 will save the MCB marking
|
||||||
end of conventional memory (ie MCB following caller's PSP memory
|
end of conventional memory (ie MCB following caller's PSP memory
|
||||||
block [which I assume occupies all of convential memory] into
|
block [which I assume occupies all of conventional memory] into
|
||||||
the DOS data segment.
|
the DOS data segment.
|
||||||
Note: presumably Win3.1 uses the WinPatchTable.OffLastMCBSeg
|
Note: presumably Win3.1 uses the WinPatchTable.OffLastMCBSeg
|
||||||
when DOS ver > 5 to do this itself.
|
when DOS ver > 5 to do this itself.
|
||||||
|
@ -256,11 +256,14 @@ dos_data db 0
|
|||||||
global _NetBios
|
global _NetBios
|
||||||
_NetBios dw 0 ; NetBios Number
|
_NetBios dw 0 ; NetBios Number
|
||||||
|
|
||||||
times (26h - 0ch - ($ - DATASTART)) db 0
|
times (26h - 12h - ($ - DATASTART)) db 0
|
||||||
|
|
||||||
; Globally referenced variables - WARNING: DO NOT CHANGE ORDER
|
; Globally referenced variables - WARNING: DO NOT CHANGE ORDER
|
||||||
; BECAUSE THEY ARE DOCUMENTED AS UNDOCUMENTED (?) AND HAVE
|
; BECAUSE THEY ARE DOCUMENTED AS UNDOCUMENTED (?) AND HAVE
|
||||||
; MANY MULTIPLEX PROGRAMS AND TSR'S ACCESSING THEM
|
; MANY MULTIPLEX PROGRAMS AND TSR'S ACCESSING THEM
|
||||||
|
global _OemHook21
|
||||||
|
_OemHook21 dd -1 ;-0012 OEM fn handler (int21/f8h)
|
||||||
|
dw 0 ;-000e offset from DOS CS of int21 ret
|
||||||
global _NetRetry
|
global _NetRetry
|
||||||
_NetRetry dw 3 ;-000c network retry count
|
_NetRetry dw 3 ;-000c network retry count
|
||||||
global _NetDelay
|
global _NetDelay
|
||||||
@ -284,7 +287,8 @@ _clock dd 0 ; 0008 CLOCK$ device
|
|||||||
_syscon dw _con_dev,seg _con_dev ; 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
|
||||||
dd 0 ; 0012 pointer to buffers info structure
|
global _inforecptr
|
||||||
|
_inforecptr dd 0 ; 0012 pointer to buffers info structure
|
||||||
global _CDSp
|
global _CDSp
|
||||||
_CDSp dd 0 ; 0016 Current Directory Structure
|
_CDSp dd 0 ; 0016 Current Directory Structure
|
||||||
global _FCBp
|
global _FCBp
|
||||||
@ -338,7 +342,7 @@ _bufloc db 0 ; 0053 00=conv 01=HMA
|
|||||||
_deblock_buf dd 0 ; 0054 deblock buffer
|
_deblock_buf dd 0 ; 0054 deblock buffer
|
||||||
times 3 db 0 ; 0058 unknown
|
times 3 db 0 ; 0058 unknown
|
||||||
dw 0 ; 005B unknown
|
dw 0 ; 005B unknown
|
||||||
db 0, 0FFh, 0 ; 005D unknown
|
db 0, 0FFh, 0 ; 005D int24fail,memstrat,a20count
|
||||||
global _VgaSet
|
global _VgaSet
|
||||||
_VgaSet db 0 ; 0060 unknown
|
_VgaSet db 0 ; 0060 unknown
|
||||||
dw 0 ; 0061 unknown
|
dw 0 ; 0061 unknown
|
||||||
@ -385,7 +389,8 @@ _winStartupInfo:
|
|||||||
dw instance_table,seg instance_table ; array of instance data
|
dw instance_table,seg instance_table ; array of instance data
|
||||||
instance_table: ; should include stacks, Win may auto determine SDA region
|
instance_table: ; should include stacks, Win may auto determine SDA region
|
||||||
; we simply include whole DOS data segment
|
; we simply include whole DOS data segment
|
||||||
dw 0, seg _DATASTART ; [?linear?] address of region's base
|
dw seg _DATASTART, 0 ; [?linear?] address of region's base
|
||||||
|
; dw 0, 0;seg _DATASTART ; [?linear?] address of region's base
|
||||||
dw markEndInstanceData wrt seg _DATASTART ; size in bytes
|
dw markEndInstanceData wrt seg _DATASTART ; size in bytes
|
||||||
dd 0 ; 0 marks end of table
|
dd 0 ; 0 marks end of table
|
||||||
patch_bytes: ; mark end of array of offsets of critical section bytes to patch
|
patch_bytes: ; mark end of array of offsets of critical section bytes to patch
|
||||||
@ -414,6 +419,8 @@ _winPatchTable: ; returns offsets to various internal variables
|
|||||||
_firstsftt:
|
_firstsftt:
|
||||||
dd -1 ; link to next
|
dd -1 ; link to next
|
||||||
dw 5 ; count
|
dw 5 ; count
|
||||||
|
times 5*59 db 0 ; reserve space for the 5 sft entries
|
||||||
|
db 0 ; pad byte so next value on even boundary
|
||||||
|
|
||||||
; Some references seem to indicate that this data should start at 01fbh in
|
; Some references seem to indicate that this data should start at 01fbh in
|
||||||
; order to maintain 100% MS-DOS compatibility.
|
; order to maintain 100% MS-DOS compatibility.
|
||||||
@ -717,6 +724,13 @@ blk_stk_top:
|
|||||||
times 64 dw 0
|
times 64 dw 0
|
||||||
clk_stk_top:
|
clk_stk_top:
|
||||||
|
|
||||||
|
%IFDEF WIN31SUPPORT
|
||||||
|
; mux2F private stack
|
||||||
|
global mux2F_stk_top
|
||||||
|
times 128 dw 0
|
||||||
|
mux2F_stk_top:
|
||||||
|
%ENDIF ; WIN31SUPPORT
|
||||||
|
|
||||||
; Dynamic data:
|
; Dynamic data:
|
||||||
; member of the DOS DATA GROUP
|
; member of the DOS DATA GROUP
|
||||||
; and marks definitive end of all used data in kernel data segment
|
; and marks definitive end of all used data in kernel data segment
|
||||||
|
@ -48,7 +48,7 @@ DEPENDS=makefile ..\*.bat ..\mkfiles\*.*
|
|||||||
# Implicit Rules #######################################################
|
# Implicit Rules #######################################################
|
||||||
|
|
||||||
.asm.obj:
|
.asm.obj:
|
||||||
$(NASM) $(NASMFLAGS) $<
|
$(NASM) $(NASMFLAGS) -l$*.lst $<
|
||||||
|
|
||||||
.c.obj:
|
.c.obj:
|
||||||
$(CC) $(CFLAGS) $<
|
$(CC) $(CFLAGS) $<
|
||||||
|
Loading…
x
Reference in New Issue
Block a user