mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
267 lines
6.4 KiB
267 lines
6.4 KiB
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
|