1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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 <AH EQ PRT_SCR_2FH_NUMBER> AND;If 2FH call is for us ;AN000;
.IF <ZERO AL> ; 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 <<WORD PTR CS:OLD_INT_2FH> NE 0> AND ;if there is another ;AN000;
.IF <<WORD PTR CS:OLD_INT_2FH+2> 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;
|