236 lines
6 KiB
PHP
236 lines
6 KiB
PHP
;
|
|
; Task Data Block
|
|
;
|
|
; Contains all task specific data.
|
|
;
|
|
|
|
;
|
|
; The following macros allow saving and restoring hardware interrupt
|
|
; vectors inline.
|
|
|
|
numTaskInts = 0
|
|
?hinum = 0
|
|
|
|
?higen macro x,i,r,t
|
|
|
|
if r LE 3
|
|
|
|
?hisav&x ¯o
|
|
ife t
|
|
mov si,4*i
|
|
else
|
|
mov si,i
|
|
endif
|
|
rept 2*r
|
|
movsw
|
|
endm
|
|
&endm
|
|
|
|
?hires&x ¯o
|
|
ife t
|
|
mov di,4*i
|
|
else
|
|
mov di,i
|
|
endif
|
|
rept 2*r
|
|
movsw
|
|
endm
|
|
&endm
|
|
|
|
else
|
|
|
|
?hisav&x ¯o
|
|
ife t
|
|
mov si,4*i
|
|
else
|
|
mov si,i
|
|
endif
|
|
mov cx,2*r
|
|
rep movsw
|
|
&endm
|
|
|
|
?hires&x ¯o
|
|
ife t
|
|
mov di,4*i
|
|
else
|
|
mov di,i
|
|
endif
|
|
mov cx,2*r
|
|
rep movsw
|
|
&endm
|
|
|
|
endif
|
|
endm
|
|
|
|
DefTaskIntGroup macro i,r,t
|
|
?higen %?hinum,i,r,t
|
|
?hinum = ?hinum + 1
|
|
numTaskInts = numTaskInts + r
|
|
endm
|
|
|
|
?hiexp macro n,x
|
|
n&x
|
|
endm
|
|
|
|
|
|
SaveTaskInts macro destination
|
|
mov es,destination
|
|
xor ax,ax
|
|
mov ds,ax
|
|
mov di,TDB_INTVECS
|
|
?hicnt = 0
|
|
rept ?hinum
|
|
?hiexp &?hisav,%?hicnt
|
|
?hicnt = ?hicnt + 1
|
|
endm
|
|
endm
|
|
|
|
RestTaskInts macro source
|
|
mov ds,source
|
|
mov si,TDB_INTVECS
|
|
xor ax,ax
|
|
mov es,ax
|
|
?hicnt = 0
|
|
rept ?hinum
|
|
?hiexp &?hires,%?hicnt
|
|
?hicnt = ?hicnt + 1
|
|
endm
|
|
endm
|
|
|
|
; Define the hardware interrupts we will keep on a task specific basis.
|
|
; We only save on a per task basis those interrupts related to arithmetic.
|
|
; So we save 0, 2, 4, 6, 7, 10h, 3Eh, and 75h.
|
|
; Int 0 is divide by 0
|
|
; Int 2 is Coprocessor Error
|
|
; Int 4 is overflow
|
|
; Int 6 is invalid op-code
|
|
; Int 7 is no coprocessor,
|
|
; Int 3Eh is use by the C compiler for 8087 emulation.
|
|
; Int 75h is use by the C compiler for 8087 emulation.
|
|
; In Windows 1.03 we saved 0h, 1h, 2h, 3Eh.
|
|
; For DOS5 compatibility we should save 0, 4, 6, and 7.
|
|
|
|
|
|
DefTaskIntGroup (00h),1,0
|
|
DefTaskIntGroup (02h),1,0
|
|
DefTaskIntGroup (04h),1,0
|
|
DefTaskIntGroup (06h),2,0
|
|
DefTaskIntGroup (3Eh),1,0
|
|
DefTaskIntGroup (75h),1,0
|
|
|
|
ifdef WOW
|
|
include tdb16.inc
|
|
else ; original TDB
|
|
|
|
THUNKELEM EQU 8 ; (62*8) = 512-16 (low arena overhead)
|
|
THUNKSIZE EQU 8
|
|
|
|
; Task data structure
|
|
|
|
|
|
;
|
|
; DON'T YOU DARE CHANGE ANYTHING IN HERE
|
|
; OR RAOR WILL KILL YOU
|
|
; OLE DEPENDS ON THIS 3/25/91
|
|
;
|
|
|
|
TDB STRUC
|
|
|
|
TDB_next DW ? ; next task in dispatch queue
|
|
TDB_taskSP DW ? ; Saved SS:SP for this task
|
|
TDB_taskSS DW ? ;
|
|
TDB_nEvents DW ? ; Task event counter
|
|
TDB_priority DB ? ; Task priority (0 is highest)
|
|
|
|
TDB_thread_ordinal DB ? ; ordinal number of this thread
|
|
TDB_thread_next DW ? ; next thread
|
|
TDB_thread_tdb DW ? ; the real TDB for this task
|
|
|
|
TDB_thread_list DW ? ; list of allocated thread structures
|
|
TDB_thread_free DW ? ; free list of availble thread structures
|
|
TDB_thread_count DW ? ; total count of tread structures
|
|
|
|
TDB_FCW DW ? ; Floating point control word
|
|
|
|
TDB_flags DB ? ; Task flags
|
|
TDB_filler DB ? ; keep word aligned
|
|
|
|
TDB_ErrMode DW ? ; Error mode for this task
|
|
TDB_ExpWinVer DW ? ; Expected Windows version for this task
|
|
TDB_Module DW ? ; Task module handle to free in killtask
|
|
TDB_pModule DW ? ; Pointer to the module database.
|
|
TDB_Queue DW ? ; Task Event Queue pointer
|
|
TDB_Parent DW ? ; TDB of the task that started this up
|
|
|
|
TDB_SigAction DW ? ; Action for app task signal
|
|
TDB_ASignalProc DD ? ; App's Task Signal procedure address
|
|
TDB_USignalProc DD ? ; User's Task Signal procedure address
|
|
TDB_GNotifyProc DD ? ; Task global discard notify proc.
|
|
|
|
TDB_INTVECS DD numTaskInts DUP (?) ; Task specfic hardware interrupts
|
|
|
|
if 0
|
|
; EMS fields are OBSOLETE!
|
|
|
|
TDB_LIMSave DW ? ; Offset within TDB of LIM save area
|
|
TDB_EMSPID DW ? ; EMS PID for this task
|
|
TDB_EEMSSave DD ? ; LPTR to EEMS save area (in a TDB)
|
|
TDB_EMSBCnt DW ? ; number of EMS banks allocated so far
|
|
TDB_EMSMaxBCnt DW ? ; Maximum # banks this task wants.
|
|
TDB_EMSRegSet DB ? ; The register set this TDB lives in.
|
|
|
|
else
|
|
|
|
TDB_CompatFlags DW ? ; Compatibility flags
|
|
TDB_CompatFlags2 DW ? ; Upper 16 bits
|
|
DB 9 DUP (?) ; Filler to keep TDB size unchanged
|
|
endif
|
|
|
|
TDB_cLibrary DB ? ; tracks add/del of ALL libs in system EMS
|
|
TDB_PHT DD ? ; (HANDLE:OFFSET) to private handle table
|
|
TDB_PDB DW ? ; MSDOS Process Data Block (PDB)
|
|
TDB_DTA DD ? ; MSDOS Disk Transfer Address
|
|
TDB_Drive DB ? ; MSDOS current drive
|
|
TDB_Directory DB 65 DUP (?) ; MSDOS current directory
|
|
TDB_Validity DW ? ; initial AX to be passed to a task
|
|
TDB_Yield_to DW ? ; DirectedYield arg stored here
|
|
TDB_LibInitSeg DW ? ; segment address of libraries to init
|
|
TDB_LibInitOff DW ?
|
|
; MakeProcInstance thunks live here.
|
|
TDB_MPI_Sel DW ? ; Code selector for thunks
|
|
TDB_MPI_Thunks DW ((THUNKELEM*THUNKSIZE)/2) dup (?)
|
|
|
|
TDB_ModName DB 8 DUP (?) ; Name of Module.
|
|
TDB_sig DW ? ; Signature word to detect bogus code
|
|
TDB ENDS
|
|
endif ; original TDB_
|
|
|
|
TDBsize = SIZE TDB
|
|
|
|
|
|
; signature word used to check validity of a TDB
|
|
|
|
TDB_SIGNATURE equ 'DT'
|
|
|
|
; TDB flags
|
|
|
|
TDBF_WINOLDAP EQU 01h ; This app is WinOldAp.
|
|
TDBF_EMSSHARE EQU 02h ; This app shares EMS banks with MSDOS EXEC.
|
|
TDBF_CACHECHECK EQU 04h ; Used in CacheCompact to prevent revisitation.
|
|
TDBF_OS2APP EQU 08h ; This is an OS/2 app.
|
|
TDBF_WIN32S EQU 10h ; This is Win32S app.
|
|
|
|
Task_Regs struc
|
|
Task_DX dw ?
|
|
Task_BX dw ?
|
|
Task_ES dw ?
|
|
Task_CX dw ?
|
|
Task_AX dw ?
|
|
Task_DI dw ?
|
|
Task_SI dw ?
|
|
Task_DS dw ?
|
|
Task_BP dw ?
|
|
Task_IP dw ?
|
|
Task_CS dw ?
|
|
Task_Regs ends
|