PAGE ,132 ;AN000; TITLE DOS - GRAPHICS Command - Interrupt 2FH Driver ;AN000; ;AN000; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; ;; DOS - GRAPHICS Command ;; (C) Copyright 1988 Microsoft ;; ;AN000; ;; File Name: GRINT2FH.ASM ;AN000; ;; ---------- ;AN000; ;; ;AN000; ;; Description: ;AN000; ;; ------------ ;AN000; ;; This file contains the Interrupt 2FH driver. ;AN000; ;; ;AN000; ;; Documentation Reference: ;AN000; ;; ------------------------ ;AN000; ;; OASIS High Level Design ;AN000; ;; OASIS GRAPHICS I1 Overview ;AN000; ;; ;AN000; ;; Procedures Contained in This File: ;AN000; ;; ---------------------------------- ;AN000; ;; INT_2FH_DRIVER - Interrupt 2FH driver ;AN000; ;; ;AN000; ;; Include Files Required: ;AN000; ;; ----------------------- ;AN000; ;; GRLOAD.EXT - Externals for profile load ;AN000; ;; GRCTRL.EXT - Externals for print screen control ;AN000; ;; GRPRINT.EXT - Externals for print modules ;AN000; ;; GRCPSD.EXT - Externals for COPY_SHARED_DATA module ;AN000; ;; ;AN000; ;; External Procedure References: ;AN000; ;; ------------------------------ ;AN000; ;; Calls next Int 2FH handler in the chain. ;AN000; ;; ;AN000; ;; Linkage Instructions: ;AN000; ;; -------------------- ;AN000; ;; Refer to GRAPHICS.ASM ;AN000; ;; ;AN000; ;; Change History: ;AN000; ;; --------------- ;AN000; ;; ;AN000; ;; ;AN000; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; ;; ;AN000; ;; ;AN000; CODE SEGMENT PUBLIC 'CODE' ;; ;AN000; ASSUME CS:CODE,DS:CODE ;; ;AN000; ;; ;AN000; PUBLIC OLD_INT_2FH ;; ;AN000; PUBLIC INT_2FH_DRIVER ;; ;AN000; PUBLIC PRT_SCR_2FH_NUMBER ;; ;AN000; PUBLIC RESIDENT_CODE_SEG ;; ;AN000; PUBLIC SHARED_DATA_AREA_PTR ;; ;AN000; ;; ;AN000; ;; ;AN000; .XLIST ;AN000; INCLUDE STRUC.INC ;AN000; INCLUDE GRINST.EXT ;AN000; INCLUDE GRCTRL.EXT ;AN000; INCLUDE GRCPSD.EXT ;AN000; .LIST ;AN000; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; ;; ;AN000; ;; Module: INT_2FH_DRIVER ;AN000; ;; ;AN000; ;; Description: ;AN000; ;; Respond to GRAPHICS Int 2FH calls. ;AN000; ;; The following calls are handled: ;AN000; ;; ;AN000; ;; AL = 0 ù Install Check ;AN000; ;; ;AN000; ;; Invoked By: ;AN000; ;; INT 2FH instruction. ;AN000; ;; ;AN000; ;; Modules Called: ;AN000; ;; Lower level INT 2FH handlers. ;AN000; ;; ;AN000; ;; Input Registers: ;AN000; ;; Install Check - AH=15H AL=0 ;AN000; ;; ;AN000; ;; ;AN000; ;; Output Registers: ;AN000; ;; Install Check: IF GRAPHICS installed ;AN000; ;; AH=FFH AL=FFH ;AN000; ;; ES : DI points to Shared Data Area ;AN000; ;; ELSE ;AN000; ;; AH=15H AL=0 ;AN000; ;; ;AN000; ;; Logic: ;AN000; ;; IF AH=15H THEN ;AN000; ;; IF AL=0 THEN ;AN000; ;; AH,AL := -1 ;AN000; ;; ES : DI := SHARED_DATA_AREA_PTR ;AN000; ;; ENDIF ;AN000; ;; IRET ;AN000; ;; ELSE ;AN000; ;; IF OLD_INT_2FH is a valid pointer THEN ;AN000; ;; Jump to Old Int 2FH ;AN000; ;; ELSE ;AN000; ;; IRET ;AN000; ;; ENDIF ;AN000; ;; ENDIF ;AN000; ;; ;AN000; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; ;AN000; INT_2FH_DRIVER PROC NEAR ;AN000; JMP INT_2FH ;AN000; PRT_SCR_2FH_NUMBER EQU 15H ; 2FH Multiplex interrupt number ;AN000; ; assigned to Print Screen. ;AN000; OLD_INT_2FH DD ? ; Pointer to next 2FH interrupt handler ;AN000; RESIDENT_CODE_SEG DW ? ; Segment for installed stuff ;AN000; SHARED_DATA_AREA_PTR DW ? ; Offset of the start of the ;AN000; ; Shared Data Area ;AN000; ;AN000; INT_2FH: ;AN000; ;-------------------------------------------------------------------------------;AN000; ; Verify if the 2FH Interrupt call is for our interrupt handler: ;AN000; ;-------------------------------------------------------------------------------;AN000; .IF AND;If 2FH call is for us ;AN000; .IF ; and request is "Get install state" ;AN000; .THEN ; then, ;AN000; ;-------------------------------------------------------------------------------;AN000; ; Yes: return results ;AN000; ;-------------------------------------------------------------------------------;AN000; MOV DI,CS:SHARED_DATA_AREA_PTR ; ES:DI := Pointer to shared ;AN000; PUSH CS:RESIDENT_CODE_SEG ; data area ;AN000; POP ES ; ;AN000; MOV AH,0FFH ; AL and AH := "We are installed" ;AN000; MOV AL,AH ; ;AN000; IRET ; Return to interrupted process ;AN000; ;-------------------------------------------------------------------------------;AN000; ; No, pass control to next 2FH interrupt handler: ;AN000; ;-------------------------------------------------------------------------------;AN000; .ELSE ; else, this call is not for us: ;AN000; .IF < NE 0> AND ;if there is another ;AN000; .IF < NE 0> ; 2FH driver ;AN000; .THEN ; below us then, ;AN000; JMP CS:OLD_INT_2FH ; pass control to it ;AN000; .ELSE ; else, there is nobody to pass ;AN000; IRET ; control to, just return. ;AN000; .ENDIF ; END If there is a driver below us.;AN000; .ENDIF ; END If this call is for us. ;AN000; INT_2FH_DRIVER ENDP ;AN000; ;AN000; CODE ENDS ;AN000; END ;AN000;