DevHelp SchedClock

This service allows the physical Clock$ device driver to obtain a pointer to the address of the system's clock tick handler, SchedClock. SchedClock must be called on each occurrence of a periodic clock tick.

Syntax
USHORT APIENTRY DevHelp_SchedClock( PFN Near * SchedRoutineAddr );  MOV  AX,Pointer_Save         ; Offset in DS to a DWORD where the pointer is returned MOV  DL,DevHlp_SchedClock
 * C
 * Assembler

CALL [Device_Help] 

C

 * SchedRoutineAddr (NPFN) : Address of the system tick handler to be returned.

Assembler
MOV  AX,Pointer_Save    ; Offset in DS to a DWORD where the pointer is returned

Return Code
Success Indicator: SchedRoutineAddr will contain the address of the system tick handler.
 * C

Possible errors: None.

Pointer_Save will contain the address of the system tick handler.
 * Assembler

Remarks
The physical Clock$ device driver calls this function during the physical Clock$ device driver's initialization. For input to this DevHlp, the physical Clock$ device driver must ensure that its DS points to its data segment, and it must supply the offset to a DWORD area. SchedClock then fills in the physical device driver's save area with a pointer to a DWORD in system memory. The DWORD in system memory contains the pointer to the SchedClock routine. This is shown in the following example:  Device driver data segment System SchedClock         System Timer Pointer_Save         pointer                  Handler ┌───────────┐   ┌─────────────────┐    ┌────────────────────┐ │  pointer  ├────► SchedClock_Addr ├────► SchedClock routine │ └───────────┘   └─────────────────┘    └────────────────────┘  DWORD in System Memory

The physical device driver can use the pointer that is returned in Pointer_Save to call SchedClock. SchedClock is called by the physical Clock$ device driver with a CALL FAR INDIRECT, using the pointer to the area that contains the actual address of the SchedClock routine.

SchedClock must be called at interrupt time for each periodic clock tick to indicate the passage of system time. The tick is then dispersed to the appropriate components of the system. A definition of the interface to SchedClock follows:  MOV  AL,millisecs               ; Milliseconds since last call MOV  DH,EOIflag                 ; Indicator of EOI ; = 0 prior to EOI ; = 1 after EOI CALL [pointer]                  ; Pointer to the area which contains the actual ; address of SchedClock

 The Clock$ device driver's interrupt handler must run with interrupts enabled as the convention, prior to issuing an End-Of-Interrupt (EOI) for the timer interrupt. Any critical processing, such as updating the fraction-of-seconds count, must be done prior to calling SchedClock. SchedClock must then be called to allow system processing prior to the dismissal of the interrupt. When SchedClock returns, the Clock$ device driver must issue the EOI and call SchedClock again. Notice that once the EOI has been issued, the device driver's interrupt handler can be reentered. SchedClock is also reentrant.

The physical device driver must not get the actual address of the SchedClock routine, but instead use the pointer returned by SchedClock.

C

 * 1) include "dhcalls.h"

USHORT APIENTRY DevHelp_SchedClock( PFN Near * SchedRoutineAddr ); 