windows-nt/Source/XPSP1/NT/base/mvdm/wow16/mmsystem/mmtask/mmtask.asm
2020-09-26 16:20:57 +08:00

268 lines
6.4 KiB
NASM

PAGE 58,132
;*****************************************************************************
TITLE MMTASK.ASM - Windows MultiMedia Systems Task Stub
;*****************************************************************************
;
; Copyright (C) Microsoft Corporation 1985-1990. All rights reserved.
;
; Title: MMTASK.asm - a windows application that acts as a
; task stub.
;
; Version: 1.00
;
; Date: 12-Mar-1990
;
; Author: ROBWI
;
;-----------------------------------------------------------------------------
;
; Change log:
;
; DATE REV DESCRIPTION
; ----------- --- --------------------------------------------------------
; 12-Mar-1990 ROBWI First Version
; 18-APR-1990 ROBWI Moved from idle.asm to mmtask.asm
;
;=============================================================================
?WIN=0
?PLM=1
PMODE = 1
.xlist
include cmacros.inc
.list
wptr equ WORD PTR
; The following structure should be used to access high and low
; words of a DWORD. This means that "word ptr foo[2]" -> "foo.hi".
LONG struc
lo dw ?
hi dw ?
LONG ends
FARPOINTER struc
off dw ?
sel dw ?
FARPOINTER ends
;----------------------------------------------------------------------
;
; MMTASKSTRUC : The following structure should be passed to mmtask (in
; the command line) when it is exec'd.
MMTASKSTRUC struc
lpfn dd ? ; fp to function to call.
inst dd ? ; instance data to pass to lpfn
dwstck dd ? ; stack size.
MMTASKSTRUC ends
EXIT_PROCESS equ 1
;-----------------------------------------------------------------------;
;
; externals from KERNEL
externFP WaitEvent
externFP PostEvent
externFP OldYield
externFP InitTask
externFP InitApp ; to get a msg q so that we can call user
externFP OutputDebugString
externFP SetMessageQueue
sBegin DATA
assumes DS,DATA
; Stuff needed to avoid the C runtime coming in
DD 0 ; So null pointers get 0
maxRsrvPtrs = 5
DW maxRsrvPtrs
usedRsrvPtrs = 0
labelDP <PUBLIC,rsrvptrs>
DefRsrvPtr MACRO name
globalW name,0
usedRsrvPtrs = usedRsrvPtrs + 1
ENDM
DefRsrvPtr pLocalHeap ; Local heap pointer
DefRsrvPtr pAtomTable ; Atom table pointer
DefRsrvPtr pStackTop ; top of stack
DefRsrvPtr pStackMin ; minimum value of SP
DefRsrvPtr pStackBot ; bottom of stack
if maxRsrvPtrs-usedRsrvPtrs
DW maxRsrvPtrs-usedRsrvPtrs DUP (0)
endif
public __acrtused
__acrtused = 1
loadparams DB (SIZE MMTASKSTRUC) DUP (0)
sEnd DATA
sBegin Code
assumes cs, Code
assumes ds, Data
assumes es, nothing
assumes ss, nothing
;--------------------------Private-Routine-----------------------------;
;
; @doc INTERNAL MMTASKAPP
;
; @asm AppEntry | called when the APP is loaded
;
; @reg CX | size of heap
; @reg DI | module handle
; @reg DS | automatic data segment
; @reg ES:SI | address of command line (not used)
; @reg
;
; @rdesc Register values at return
;
; @reg AX | 1 if success, 0 if error
;
; @uses AX BX CX DX FLAGS
;
; @comm Preserves: SI DI DS BP
;
; Calls: None
;
; History:
;
; 06-27-89 -by- Todd Laney [ToddLa] Created shell appentry
; routine
; 03-13-90 -stolen- Rob Williams [RobWi] Added all kinds o'
; stuff for making it an MMTASK application.
;
;-----------------------------------------------------------------------;
cProc AppEntry,<FAR,PUBLIC,NODATA>,<>
cBegin
; Copy the parameters out of the command line before
; InitTask gets a chance to modify them.
push di
push si
push cx
; switch ds and es so that we can do a string move
; into the data segment
push ds ; save ds o
mov ax, es
mov ds, ax ; ds = es 0
pop es ; es = ds 0
; copy the command line if it is the correct length
mov si, 81h
lea di, loadparams
mov cx, SIZE MMTASKSTRUC / 2
xor ax, ax
mov al, byte ptr ds:[80h]
shr ax, 1
cmp ax, cx ; Q: structure size correct
jne Skip_Copy ; N: Skip the copy
.ERRNZ SIZE MMTASKSTRUC MOD 2
cld ; Y: Copy the structure
rep movsw
Skip_Copy:
; restore original es and ds
push es
mov ax, ds
mov es, ax ; es = ds = es 0
pop ds
pop cx
pop si
pop di
; pretend the command string is 0 length.
xor ax, ax
mov es:[80h], ax
; initialize the task and the event queue
cCall InitTask
cCall InitApp, <di>
cCall SetMessageQueue, <64>
or ax,ax
jz MMTASKexit
; DX is now the CmdShow value.
; CX is stack size.
; event count is initially one so call waitevent to clear the event count
cCall WaitEvent, <0>
; check parameters
mov dx, loadparams.lpfn.hi
or dx, dx ; callback ok?
jz MMTASKExit ; N: out'a here
cCall OldYield ; be polite.
mov ax, loadparams.inst.lo
mov dx, loadparams.inst.hi
cCall loadparams.lpfn, <dx, ax>
MMTASKExit:
ifdef DEBUG
; lets make sure the app did not do anything evil
cmp wptr ds:[0],0
jne evil
cmp wptr ds:[2],0
jne evil
cmp wptr ds:[4],5
jne evil
je not_evil
evil:
lea ax,evil_str
cCall OuputDebugString, <cs,ax>
int 3
jmp not_evil
evil_str:
db "MMTASK: NULL pointer assignment! fag!",13,10,0
not_evil:
endif
; before we actualy exit lets yield, so we don't re-enter
; USERS AppExit code.....
cCall OldYield
cCall OldYield
cCall OldYield
mov ah, 4Ch
int 21h
cEnd
sEnd
end AppEntry