]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/SELECT/SELQUIT.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / SELECT / SELQUIT.ASM
1
2
3 PAGE 55,132 ;AN000;
4 NAME SELQUIT ;AN000;
5 TITLE SELQUIT - Exit Panel support for SELECT.EXE;AN000;
6 SUBTTL selquit.asm ;AN000;
7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 ;
9 ;
10 ; SELQUIT.ASM
11 ;
12 ; DATE: July 6/87
13 ;
14 ; COMMENTS:
15 ;
16 ; This files must be compiled with MASM 3.0 (using /A option)
17 ;
18 ; Copyright 1988 Microsoft
19 ;
20 ; ;AN001; Added flag to indicate error processing was in effect.
21 ;
22 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
23 .LFCOND ;AN000;
24 .XLIST ;AN000;
25 INCLUDE PANEL.MAC ;AN000;
26 INCLUDE PCEQUATE.INC ;AN000;
27 INCLUDE PAN-LIST.INC ;AN000;
28 INCLUDE CASTRUC.INC ;AN000;
29 INCLUDE EXT.INC ;AN000;
30 INCLUDE STRUC.INC ;AN000;
31 INCLUDE MACROS.INC ;AN000;
32 .LIST ;AN000;
33 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
34 ;
35 ; Setup Environment
36 ;
37 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38 EXTRN QM_ACTIVEPAN:WORD ;AN000;
39 ;
40 EXTRN GET_KEY:NEAR ;AN000;
41 EXTRN CURSOROFF:NEAR ;AN000;
42 EXTRN PCINPUT_CALL:NEAR ;AN000;
43 EXTRN PCDISPQ_CALL:NEAR ;AN000;
44 ;
45 EXTRN WR_DRETLEN:WORD ;AN000;
46 EXTRN WR_DRETOFF:WORD ;AN000;
47 EXTRN WR_DRETSEG:WORD ;AN000;
48 EXTRN GET_PCB:NEAR ;AN000;
49 EXTRN QM_OPT1:WORD ;AN000;
50 EXTRN QM_ID:WORD ;AN000;
51 EXTRN INC_KS:WORD ;AN000;
52 ;
53 EXTRN HANDLE_CHILDREN:NEAR ;AN000;
54 EXTRN ADJUST_UP:NEAR ;AN000;
55 EXTRN ADJUST_DOWN:NEAR ;AN000;
56 EXTRN INIT_PQUEUE_CALL:NEAR ;AN000;
57 EXTRN PREPARE_PANEL_CALL:NEAR ;AN000;
58 EXTRN DISPLAY_PANEL_CALL:NEAR ;AN000;
59 EXTRN GET_FUNCTION_CALL:NEAR ;AN000;
60 EXTRN QM_OPT2:WORD ;AN000;
61 EXTRN WR_REFIELDCNT:WORD ;AN000;
62 EXTRN ERROR_KEYS:BYTE ;AN000;
63 EXTRN ERROR_KEYS_LEN:ABS ;AN000;
64 EXTRN PCMBEEP_CALL:NEAR ;AN000;
65 EXTRN BIN_TO_CHAR_ROUTINE:FAR ;AN000;
66 ;
67 TRUE EQU 1 ;AN000;
68 FALSE EQU 0 ;AN000;
69 ;
70 SELECT SEGMENT PARA PUBLIC 'SELECT' ;AN000;segment for far routine
71 ASSUME CS:SELECT ;AN000;
72 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
73 ;
74 ; HANDLE_F3
75 ;
76 ;
77 ; CLC = return to SELECT
78 ; STC = quit SELECT.....
79 ;
80 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
81 F3_ACTIVE DB FALSE ;AN001;DT
82 ;
83 PUBLIC HANDLE_F3 ;AN000;
84 HANDLE_F3 PROC ;AN000;
85 PUSHH <AX,BX,DI,ES,WR_DRETLEN> ;AN000;
86 PUSHH <WR_DRETOFF,WR_DRETSEG> ;AN000;
87 PUSHH <WR_REFIELDCNT> ;AN000;
88 ;
89 .IF < F3_ACTIVE eq FALSE > near ;AN000;
90 CALL CURSOROFF ;;AN000;;;
91 ;
92 MOV AX,QM_PUSHPQU ;AN000;save parent queue
93 OR AX,QM_PUSHCQU ;AN000;save child queue
94 MOV QM_OPT1,AX ;AN000;
95 CALL PCDISPQ_CALL ;AN000;update display queue
96 ;
97 MOV QM_OPT1,QM_CLSPAN ;AN000;clear parent panel queue
98 OR QM_OPT1,QM_CLSCHD ;AN000;clear parent panel queue
99 CALL PCDISPQ_CALL ;AN000;update display queue
100 MOV QM_ACTIVEPAN,PAN_CONFIRM;AN000;current active parent panel
101 MOV AX,PAN_CONFIRM ;AN000;
102 MOV QM_OPT1,QM_PUSHPAN ;AN000;push parent panels
103 CALL PREPARE_PANEL_CALL ;AN000;add panel to display queue
104
105 MOV WR_REFIELDCNT,0 ;AN000;set for break = off
106 PREPARE_PANEL PAN_HBAR ;AN000;
107 PREPARE_CHILDREN ;AN000;
108 DISPLAY_PANEL ;AN000;push parent panels
109 ;
110 MOV CX,FK_ENT_F3_LEN ;AN000;
111 LEA DX,FK_ENT_F3 ;AN000;
112 MOV WR_DRETLEN,CX ;AN000;get return string length
113 MOV AX,DX ;AN000;get return string offset
114 MOV WR_DRETOFF,AX ;AN000;
115 MOV AX,DS ;AN000;get return string segment
116 MOV WR_DRETSEG,AX ;AN000;
117 CALL GET_KEY ;AN000;
118 MOV AX,INC_KS ;AN003;GHG
119 MOV N_USER_FUNC,AX ;AN003;GHG
120 ;
121 MOV AX,QM_POPPQU ;AN000;
122 OR AX,QM_POPCQU ;AN000;
123 MOV QM_OPT1,AX ;AN000;
124 CALL PCDISPQ_CALL ;AN000;
125 MOV AX,I_USER_INDEX ;AN000;get last current element
126 ;
127 .IF < N_USER_FUNC eq F3*256 > ;AN000;
128 .THEN ;AN000;
129 STC ;AN000;
130 MOV F3_ACTIVE,TRUE ;AN000;DT Indicate exit selected
131 .ELSE ;AN000;
132 POP WR_REFIELDCNT ;AN000;
133 PUSH WR_REFIELDCNT ;AN000;
134 DISPLAY_PANEL ;AN000;
135 CLC ;AN000;
136 .ENDIF ;AN000;;;
137 ;
138 .ELSE ;AN027;SEH Set carry flag to avoid
139 STC ;AN027;SEH endless loop in Get_Function_call
140 .ENDIF ;AN000;
141 ;
142 POPP <WR_REFIELDCNT,WR_DRETSEG> ;AN000;
143 POPP <WR_DRETOFF,WR_DRETLEN,ES> ;AN000;
144 POPP <DI,BX,AX> ;AN000;
145 RET ;AN000;
146 HANDLE_F3 ENDP ;AN000;
147 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
148 ;
149 ; AX,input
150 ; BX,action
151 ;
152 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
153 ERROR_PANEL DW ? ;AN000;
154 ERROR_TYPE DW ? ;AN000;
155 ERROR_CODE DW ? ;AN000;
156 ERROR_STRING DB 5 DUP(0) ;AN000;
157 ;
158 PUBLIC ERROR_ACTIVE ;AN001;JW
159 ERROR_ACTIVE DB 0 ;AN001;JW
160 ;
161 PUBLIC HANDLE_ERROR_CALL ;AN000;
162 HANDLE_ERROR_CALL PROC FAR ;AN000;
163 PUSHH <AX,BX,DI,ES,WR_DRETLEN> ;AN000;
164 PUSHH <WR_DRETOFF,WR_DRETSEG> ;AN000;
165 PUSHH <WR_REFIELDCNT> ;AN000;
166 ;
167 MOV ERROR_CODE,AX ;AN000;
168 MOV ERROR_PANEL,BX ;AN000;
169 MOV ERROR_TYPE,CX ;AN000;
170 MOV ERROR_ACTIVE,1 ;AN001;JW
171 ;
172 MOV BX,ERR_BORDER ;AN000;DT current active parent panel
173 CALL GET_PCB ;AN000;DT get the PCB for this
174 MOV ES:[DI].PCB_CHILDNUM,CX ;AN000;DT set the number of children
175 ;
176 CALL CURSOROFF ;AN000;
177 ;
178 MOV QM_OPT1,QM_PUSHPQU ;AN000;save parent queue
179 OR QM_OPT1,QM_PUSHCQU ;AN000;save child queue
180 CALL PCDISPQ_CALL ;AN000;update display queue
181 ;
182 .IF < F3_ACTIVE eq TRUE > ;AN000;
183 MOV QM_OPT1,QM_CLSPAN ;AN000;clear parent panel queue
184 OR QM_OPT1,QM_CLSCHD ;AN000;clear parent panel queue
185 CALL PCDISPQ_CALL ;AN000;update display queue
186 .ENDIF ;AN000;
187
188 MOV QM_OPT1,QM_PUSHPAN ;AN000;push parent panels
189 OR QM_OPT2,QM_BREAKON ;AN000;break on
190
191 MOV BX,ERR_BORDER ;AN000;current active parent panel
192 MOV QM_ID,BX ;AN000;current active parent panel
193 MOV QM_ACTIVEPAN,BX ;AN000;current active parent panel
194 MOV AX,BX ;AN000;
195 CALL PREPARE_PANEL_CALL ;AN000;add panel to display queue
196 ;
197 MOV QM_OPT2,0 ;AN000;
198 ;
199 ;;;;;;;;MOV WR_REFIELDCNT,0 ;set for break = off
200 PREPARE_PANEL ERROR_PANEL ;AN000;
201 PREPARE_CHILDREN ;AN000;
202 DISPLAY_PANEL ;AN000;push parent panels
203 ;
204 CALL PCMBEEP_CALL ;AN000;
205 ;
206 MOV CX,ERROR_TYPE ;AN000;
207 INC CX ;AN000;JW
208 LEA DX,ERROR_KEYS ;AN000;
209 CALL GET_FUNCTION_CALL ;AN000;
210 MOV ERROR_ACTIVE,0 ;AN001;JW
211 ;
212 MOV QM_OPT1,QM_POPPQU ;AN000;
213 OR QM_OPT1,QM_POPCQU ;AN000;
214 CALL PCDISPQ_CALL ;AN000;
215 MOV AX,I_USER_INDEX ;AN000;get last current element
216 ;
217 .IF < N_USER_FUNC eq F3*256 > or ;AC000;DT F3 to exit SELECT
218 .IF < F3_ACTIVE eq TRUE > ;AN000;DT or already selected
219 .THEN ;AN000;
220 STC ;AN000;
221 .ELSE ;AN000;
222 POP WR_REFIELDCNT ;AN000;
223 PUSH WR_REFIELDCNT ;AN000;
224 DISPLAY_PANEL ;AN000;
225 CLC ;AN000;
226 .ENDIF ;AN000;
227 ;
228 POPP <WR_REFIELDCNT,WR_DRETSEG>;AN000;
229 POPP <WR_DRETOFF,WR_DRETLEN,ES>;AN000;
230 POPP <DI,BX,AX> ;AN000;
231 RET ;AN000;
232 HANDLE_ERROR_CALL ENDP ;AN000;
233 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
234 ;
235 ; AX,input
236 ; BX,action
237 ;
238 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
239 PUBLIC HANDLE_PANEL_CALL ;AN000;
240 HANDLE_PANEL_CALL PROC FAR ;AN000;
241 PUSH AX ;AN000;
242 PUSH AX ;AN000;
243 PUSH AX ;AN000;
244 MOV AX,PAN_INSTALL_DOS ;AN000;
245 CALL INIT_PQUEUE_CALL ;AN000;
246 POP AX ;AN000;
247 CALL PREPARE_PANEL_CALL ;AN000;
248 POP AX ;AN000;
249 .IF < AX ne PAN_DSKCPY_CPY > ;AN000;
250 MOV AX,PAN_HBAR ;AN000;
251 CALL PREPARE_PANEL_CALL ;AN000;
252 CALL HANDLE_CHILDREN ;AN000;
253 .ENDIF ;AN000;
254 CALL DISPLAY_PANEL_CALL ;AN000;
255 POP AX ;AN000;
256 RET ;AN000;
257 HANDLE_PANEL_CALL ENDP ;AN000;
258 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
259 ;
260 ; AX,input
261 ; BX,action
262 ;
263 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
264 PUBLIC HANDLE_PANEL_CALL2 ;AN000;
265 HANDLE_PANEL_CALL2 PROC FAR ;AN000;
266 PUSH AX ;AN000;
267 PUSH AX ;AN000;
268 MOV AX,BX ;AN000;DT
269 CALL INIT_PQUEUE_CALL ;AN000;DT
270 POP AX ;AN000;
271 CALL PREPARE_PANEL_CALL ;AN000;
272 POP AX ;AN000;
273 PUSH AX ;AN000;DT
274 .IF < AX ne SUB_COPYING > ;AN000;
275 MOV AX,PAN_HBAR ;AN000;
276 CALL PREPARE_PANEL_CALL ;AN000;
277 CALL HANDLE_CHILDREN ;AN000;
278 .ENDIF ;AN000;
279 CALL DISPLAY_PANEL_CALL ;AN000;
280 POP AX ;AN000;
281 RET ;AN000;
282 HANDLE_PANEL_CALL2 ENDP ;AN000;
283 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
284 ;
285 ; AX,input
286 ;
287 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
288 PUBLIC HANDLE_PANEL_CALL3 ;AN111;JW
289 HANDLE_PANEL_CALL3 PROC FAR ;AN111;JW
290 CALL INIT_PQUEUE_CALL ;AN111;JW
291 CALL DISPLAY_PANEL_CALL ;AN111;JW
292 RET ;AN111;JW
293 HANDLE_PANEL_CALL3 ENDP ;AN111;JW
294 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
295 ;
296 ; AX,input
297 ; BX,action
298 ;
299 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
300 PUBLIC HANDLE_KEYSTROKE ;AN000;
301 HANDLE_KEYSTROKE PROC FAR ;AN000;
302 MOV CX,FK_ENT_LEN ;AN000;
303 LEA DX,FK_ENT ;AN000;
304 CALL GET_FUNCTION_CALL ;AN000;
305 RET ;AN000;
306 HANDLE_KEYSTROKE ENDP ;AN000;
307 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
308 ;
309 ; End of program code
310 ;
311 ;;;;;;;;;;;;;;;;;;;;;;;;;
312 SELECT ENDS ;AN000;
313 END ;AN000;