)
Call European MS-DOS 4.0 device helper function with:
DL = function
00h "SchedClock" called on each timer tick
AL = tick interval in milliseconds
01h "DevDone" device I/O complete
ES:BX -> request header
Note: must update status word first; may be called from
an interrupt handler
02h "PullRequest" pull next request from queue
DS:SI -> DWORD pointer to start of device's request queue
Return: ZF clear if pending request
ES:BX -> request header
ZF set if no more requests
03h "PullParticular" remove specific request from queue
DS:SI -> DWORD pointer to start of device's request queue
ES:BX -> request header
Return: ZF set if request header not found
04h "PushRequest" push the request onto the queue
DS:SI -> DWORD pointer to start of device's request queue
ES:BX -> request header
interrupts disabled
05h "ConsInputFilter" keyboard input check
AX = character (high byte 00h if PC ASCII character)
Return: ZF set if character should be discarded
ZF clear if character should be handled normally
Note: called by keyboard interrupt handler so DOS can scan
for special input characters
06h "SortRequest" push request in sorted order by starting sector
DS:SI -> DWORD pointer to start of device's request queue
ES:BX -> request header
interrupts disabled
07h "SigEvent" send signal on keyboard event
AH = event identifier
Return: AL,FLAGS destroyed
09h "ProcBlock" block on event
AX:BX = event identifier (typically a pointer)
CX = timeout in ms or 0000h for never
DH = interruptable flag (nonzero if pause may be interrupted)
interrupts disabled
Return: after corresponding ProcRun call
CF clear if event wakeup, set if unusual wakeup
ZF set if timeout wakeup, clear if interrupted
AL = wakeup code, nonzero if unusual wakeup
interrupts enabled
BX,CX,DX destroyed
Note: block process and schedules another to run
0Ah "ProcRun" unblock process
AX:BX = event identifier (typically a pointer)
Return: AX = number of processes awakened
ZF set if no processes awakened
BX,CX,DX destroyed
0Bh "QueueInit" initialize/clear character queue
DS:BX -> character queue structure (see #02600)
Note: the queue size field must be set before calling
0Dh "QueueWrite" put a character in the queue
DS:BX -> character queue (see #02600)
AL = character to append to end of queue
Return: ZF set if queue is full
ZF clear if character stored
0Eh "QueueRead" get a character from the queue
DS:BX -> character queue (see #02600)
Return: ZF set if queue is empty
ZF clear if characters in queue
AL = first character in queue
10h "GetDOSVar" return pointer to DOS variable
AL = index of variable
03h current process ID
BX = index into variable if AL specifies an array
CX = expected length of variable
Return: CF clear if successful
DX:AX -> variable
CF set on error
AX,DX destroyed
BX,CX destroyed
Note: the variables may not be modified
14h "Yield" yield CPU if higher-priority task ready to run
Return: FLAGS destroyed
1Bh "CritEnter" begin system critical section
DS:BX -> semaphore (6 BYTEs, initialized to zero)
Return: AX,BX,CX,DX destroyed
1Ch "CritLeave" end system critical section
DS:BX -> semaphore (6 BYTEs, initialized to zero)
Return: AX,BX,CX,DX destroyed
Note: must be called in the context of the process which
called CritEnter on the semaphore
Note: the DWORD pointing at the request queue must be allocated by the driver
and initialized to 0000h:0000h. It always points at the next request
to be executed