From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/CMD/GRAPHICS/GRINT2FH.ASM | 146 +++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 v4.0/src/CMD/GRAPHICS/GRINT2FH.ASM (limited to 'v4.0/src/CMD/GRAPHICS/GRINT2FH.ASM') diff --git a/v4.0/src/CMD/GRAPHICS/GRINT2FH.ASM b/v4.0/src/CMD/GRAPHICS/GRINT2FH.ASM new file mode 100644 index 0000000..b195c25 --- /dev/null +++ b/v4.0/src/CMD/GRAPHICS/GRINT2FH.ASM @@ -0,0 +1,146 @@ + 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; -- cgit v1.2.3