summaryrefslogtreecommitdiff
path: root/v4.0/src/SELECT/CASERVIC.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/SELECT/CASERVIC.ASM')
-rw-r--r--v4.0/src/SELECT/CASERVIC.ASM2644
1 files changed, 2644 insertions, 0 deletions
diff --git a/v4.0/src/SELECT/CASERVIC.ASM b/v4.0/src/SELECT/CASERVIC.ASM
new file mode 100644
index 0000000..4d1ed7b
--- /dev/null
+++ b/v4.0/src/SELECT/CASERVIC.ASM
@@ -0,0 +1,2644 @@
1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2;
3;
4; CASERVIC.ASM
5;
6;
7;
8; CAS SERVICES....FROM TSUISRD.ASM
9;
10;
11; DATE: MAY 15, 1987
12;
13;
14;
15; ;AN004; for PTM 1064 temporary fix until the CASSFAR.LIB
16; is fixed. The HELP routines of CAS, zero out the
17; frequency value.
18;
19; ;AN005; The help text comes up blank. No checking was done
20; for invalid helps (HRD_ERROR & HRD_DOSERROR). Now,
21; there is checking added to PCHLPRD_CALL!
22;
23; ;AN006; for PTM 1756 - added error checking for wrong diskette
24; when help accessed. JW
25;
26; ;AN007; for PTM 1810 - during a help request processing, any error
27; caused a problem because the manage_help routine would
28; try to remove a help panel which had not been displayed.
29;
30; ;AN008; for PTM 2191 - added code to display selected option when
31; selection is made by numeric input.
32;
33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
34.ALPHA ;AN000;
35 INCLUDE STRUC.INC ;AN000;
36 INCLUDE MACROS.INC ;AN006;JW
37 INCLUDE PANEL.MAC ;AN000;
38 INCLUDE PAN-LIST.INC ;AN000;
39 INCLUDE SELECT.INC ;AN000;
40 INCLUDE CASTRUC.INC ;AN000;
41 INCLUDE DATA.MAC ;AN000;
42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
43;
44; Variable(s) for Conditional Assembly
45;
46; These conditional assembly values are declared and set in an external
47; file and included during assembly.
48;
49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
50 INCLUDE CASVAR.INC ;AN000;
51 ;
52 EXTRN DISK_PANEL:WORD ;AN000;
53 EXTRN SEARCH_FILE:WORD;AN000;
54 EXTRN FK_ENT:BYTE ;AN000;
55 EXTRN FK_ENT_LEN:ABS ;AN000;
56 EXTRN E_FILE_ATTR:ABS ;AN000;
57 EXTRN E_RETURN:ABS ;AN000;
58 EXTRN ACTIVE:BYTE ;AN000;
59 EXTRN ALTERNATE:BYTE ;AN000;
60 EXTRN LCD:ABS ;AN000;
61 EXTRN E_RETURN:ABS ;AN000;
62 EXTRN ERROR_ACTIVE:BYTE;AN000;
63 EXTRN MEM_SIZE:WORD ;AN024;
64 ;;;;;;;;;
65 EXTRN DISPLAY_MESSAGE_ROUTINE:FAR ;AN024;
66 EXTRN HOOK_INT_24:FAR ;AN000;
67 EXTRN RESTORE_INT_24:FAR ;AN000;
68 EXTRN FIND_FILE_ROUTINE:FAR ;AN000;
69 EXTRN GET_FUNCTION_CALL:NEAR ;AN000;
70 EXTRN HANDLE_CHILDREN:NEAR ;AN000;
71 EXTRN PREPARE_PANEL_CALL:NEAR ;AN000;
72 EXTRN ALLOCATE_HELP:FAR ;AN024;
73 EXTRN DEALLOCATE_HELP:FAR ;AN024;
74 EXTRN ALLOCATE_LVB:FAR ;AN024;
75 EXTRN DEALLOCATE_LVB:FAR ;AN024;
76
77;
78; Table at OFFSET 0 of panel file
79;
80EXT_FILE STRUC ;AN024;
81 PCBS DW 0 ;AN024;offset of PCB vector table
82 NPCBS DW 0 ;AN024;number of PCBs
83 SCBS DW 0 ;AN024;offset of SCB vector table
84 NSCBS DW 0 ;AN024;number of SCBs
85 COLTBL DW 0 ;AN024;offset of COLOR attribute table
86 NCOLTBL DW 0 ;AN024;number of COLOR attribute sets
87 MONTBL DW 0 ;AN024;offset of MONO attribute table
88 NMONTBL DW 0 ;AN024;number of MONO attribute sets
89EXT_FILE ENDS ;AN024;
90 ;
91DATA SEGMENT BYTE PUBLIC 'DATA' ;AN024;
92CFILE DB 'SELECT.DAT',0 ;AN024;compressed panel file
93REPCHAR EQU 255 ;AN024;character used as repeat flag
94DATA ENDS ;AN024; ;AN000;
95 ;
96IF CASFAR ;AN000;
97 IFE CASRM ;AN000;
98 EXTRN INPUT:FAR ;AN000;
99 EXTRN HLPRD:FAR ;AN000;
100 EXTRN SLCTP:FAR ;AN000;
101 EXTRN PANEL:FAR ;AN000;
102 EXTRN DISPQ:FAR ;AN000;
103 EXTRN INCHA:FAR ;AN000;
104 EXTRN MBEEP:FAR ;AN000;
105 EXTRN INSTRN:FAR ;AN000;
106 EXTRN GVIDO:FAR ;AN000;
107 EXTRN WWRAP:FAR ;AN000;
108 ENDIF ;AN000;
109 ;
110SELECT SEGMENT PARA PUBLIC 'SELECT' ;AN000;segment for far routine
111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
112;
113; IF NEAR procedure, then define segment and EXTRN
114;
115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
116ELSE ;AN000;
117 ;
118SELECT SEGMENT PARA PUBLIC 'SELECT' ;AN000;segment for far routine
119 IFE CASRM ;AN000;
120 EXTRN INPUT:NEAR ;AN000;
121 EXTRN HLPRD:NEAR ;AN000;
122 EXTRN SLCTP:NEAR ;AN000;
123 EXTRN PANEL:NEAR ;AN000;
124 EXTRN DISPQ:NEAR ;AN000;
125 EXTRN INCHA:NEAR ;AN000;
126 EXTRN MBEEP:NEAR ;AN000;
127 EXTRN INSTRN:NEAR ;AN000;
128 EXTRN GVIDO:NEAR ;AN000;
129 EXTRN WWRAP:NEAR ;AN000;
130 ENDIF ;AN000;
131ENDIF ;AN000;
132 ASSUME CS:SELECT,DS:DATA,ES:DATA ;AN000;
133
134 PUBLIC CURSOROFF,PCGVIDO_CALL,INITIALIZE;AN000;
135 PUBLIC GET_KEY,PCDISPQ_CALL,PCPANEL_CALL;AN000;
136 PUBLIC GET_SCROLL_CALL,PCINPUT_CALL,CURSORON;AN000;
137 PUBLIC GET_SCB,GET_PCB,GET_ICB,PCMBEEP_CALL,PCSLCTP_CALL;AN000;
138 EXTRN GET_HELP_ID:NEAR ;AN000;
139 EXTRN ADJUST_DOWN:NEAR ;AN000;
140 EXTRN ADJUST_UP:NEAR ;AN000;
141 EXTRN INIT_SCROLL_CALL:NEAR ;AN000;
142 EXTRN INIT_PQUEUE_CALL:NEAR ;AN000;
143 EXTRN DISPLAY_PANEL_CALL:NEAR ;AN000;
144 EXTRN HANDLE_ERROR_CALL:FAR ;AN006;JW
145 EXTRN EXIT_SELECT:NEAR ;AN006;JW
146 ;
147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
148;
149; GET_SCROLL_CALL
150;
151; Process scroll field relative to current active panel.
152; Automatically handle help request, display and interaction.
153;
154; Entry: WR_DRETSEG = Segment of dynamic return key string
155; WR_DRETOFF = Offset of dynamic return key string
156; WR_DRETLEN = Length of dynamic return key string
157;
158; WR_HCBCONT = ID of the desired contextual help text
159;
160; WR_SCBID = SCB Number of scroll field
161;
162; AX 0 = Use default highlight and scroll list position
163; 1 = Initialize highlight and scroll list position
164; to the top of the list
165;
166; Exit: AX = Contains keystroke
167; BX = Current element
168;
169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
170PUSHH MACRO REG_LIST ;;AN000;
171 IRP REG,<REG_LIST> ;;AN000;
172 PUSH REG ;;AN000; save registers
173 ENDM ;;AN000;
174 ENDM ;;AN000;
175 ;;
176POPP MACRO REG_LIST ;;AN000;
177 IRP REG,<REG_LIST> ;;AN000;
178 POP REG ;;AN000; return registers to initial state
179 ENDM ;;AN000;
180 ENDM ;;AN000;
181 ;;
182DOSCALL MACRO ;;AN000;
183 INT 21H ;;AN000; call to DOS
184 ENDM ;;AN000;
185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
186;
187;
188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
189GET_SCROLL_CALL PROC NEAR ;AN000;
190 PUSH CX ;AN000;
191 PUSH DX ;AN000;
192 PUSH SI ;AN000;
193 PUSH DI ;AN000;
194 PUSH ES ;AN000;
195; ;
196; Initialize to top ;
197; ;
198 MOV BX,WR_SCBID ;AN000;get PCSLCTP field
199 CALL GET_SCB ;AN000;ES:DI points to SCB
200; ;
201 CMP AX,0 ;AN000;check to start list & highlight
202 JE GS10 ;AN000; at top
203; ;
204 MOV ES:[DI]+SCB_TOPELE,1;AN000;intialize parameters
205 MOV ES:[DI]+SCB_CURELE,AX;AN000;
206; ;
207; Locate PCB data and initialize SCB ;
208; ;
209GS10: MOV BX,QM_ACTIVEPAN ;AN000;get the active panel number
210 CALL GET_PCB ;AN000;ES:DI address of panel PCB
211 ;
212 PUSH ES:[DI]+PCB_UROW ;AN000; ;get active panel row
213 PUSH ES:[DI]+PCB_UCOL ;AN000; ;get active panel column
214 PUSH ES:[DI]+PCB_CCBID ;AN000;get active panel color index
215 ;
216 MOV BX,WR_SCBID ;AN000;get PCSLCTP field
217 CALL GET_SCB ;AN000;ES:DI points to SCB
218 ;
219 POP ES:[DI]+SCB_CCBID ;AN000;get the panel's current color ind
220 POP ES:[DI]+SCB_RELCOL ;AN000;set the panel's relative column
221 POP ES:[DI]+SCB_RELROW ;AN000;set the panel's relative row
222;
223; Build actual return string in complete buffer
224;
225 CALL SET_RETKEYS ;AN000;create complete return string
226 CALL SET_NUMKEYS ;AN000;GHG
227
228 PUSH WR_CRETSEG ;AN000;initialize SCB with complete
229 POP ES:[DI]+SCB_RLSEG ;AN000; return string information
230
231 PUSH WR_CRETOFF ;AN000;
232 POP ES:[DI]+SCB_RLOFF ;AN000;
233
234 PUSH WR_CRETLEN ;AN000;
235 POP ES:[DI]+SCB_RLLEN ;AN000;
236;
237; Process scroll field
238;
239 AND ES:[DI]+SCB_OPT1,NOT SCB_UKS;AN000;
240 ;set to not use keystrokes
241 CALL PCSLCTP_CALL ;AN000;display scroll field
242
243 MOV BX,ES:[DI]+SCB_CURELE ;AN000;get last current element
244 MOV AX,ES:[DI]+SCB_KS ;AN000;get last keystroke
245;
246;
247; determine if current element has specific contextual help text
248;
249 MOV WR_HLPOPT,HLP_OVER ;AN000;GHG position help panel with default
250 PUSH AX ;AN000;GHG
251 MOV BX,WR_SCBID ;AN000;GHG
252 MOV AX,ES:[DI]+SCB_CURELE ;AN000;GHG
253 CALL ADJUST_DOWN ;AN000;GHG
254 MOV CX,AX ;AN000;GHG
255 MOV AX,2 ;AN000;GHG
256 CALL GET_HELP_ID ;AN000;GHG
257 MOV WR_HCBCONT,AX ;AN000;GHG get current contextual help ID
258 XOR AH,AH ;AN000;GHG
259 MOV AL,DH ;AN000;GHG
260 MOV WR_HLPROW,AX ;AN000;GHG row override of 6
261 MOV AL,DL ;AN000;GHG
262 MOV WR_HLPCOL,AX ;AN000;GHG row override of 6
263 POP AX ;AN000;GHG
264
265 CALL CHK_NUMKEYS ;AN000;GHG
266 CALL CHK_RETKEYS ;AN000;check if used by other routine
267 JCXZ GS20 ;AN000;keystroke not used elsewhere
268
269 JMP GS10 ;AN000;keystroke used elswhere, continu
270 ; from last position
271;
272; Exit
273;
274GS20: MOV BX,ES:[DI]+SCB_CURELE ;AN000;return current element
275;
276; display the selected option and exit immediately
277;
278 PUSH AX ;AN008;JW
279 PUSH BX ;AN008;JW
280 OR ES:[DI]+SCB_OPT1,SCB_RD ;AN008;JW
281 CALL PCSLCTP_CALL ;AN008;JW display scroll field and exit
282 AND ES:[DI]+SCB_OPT1,NOT SCB_RD ;AN008;JW
283 POP BX ;AN008;JW
284 POP AX ;AN008;JW
285
286 POP ES ;AN000;
287 POP DI ;AN000;
288 POP SI ;AN000;
289 POP DX ;AN000;
290 POP CX ;AN000;
291
292 RET ;AN000;
293GET_SCROLL_CALL ENDP ;AN000;
294PAGE ;AN000;
295;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
296;
297; GET_INPUT_CALL
298;
299; Process input field relative to current active panel.
300; Automatically handle help request, display and interaction.
301;
302; Entry: WR_DRETSEG = Segment of dynamic return key string
303; WR_DRETOFF = Offset of dynamic return key string
304; WR_DRETLEN = Length of dynamic return key string
305;
306; WR_HCBCONT = ID of the desired contextual help text
307;
308; IN_ICBID = ICB Number of input field
309;
310; Exit: AX = Contains keystroke
311;
312;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
313 PUBLIC GET_INPUT_CALL ;AN000;GHG
314GET_INPUT_CALL PROC NEAR ;AN000;GHG
315 PUSH CX ;AN000;GHG
316 PUSH DX ;AN000;GHG
317 PUSH SI ;AN000;GHG
318 PUSH DI ;AN000;GHG
319 PUSH ES ;AN000;GHG
320 ;GHG
321 MOV BX,IN_ICBID ;AN000;GHG get PCSLCTP field
322 CALL GET_ICB ;AN000;GHG ES:DI points to SCB
323 ;GHG
324GI10: CALL SET_RETKEYS ;AN000;GHG create complete return string
325 ;GHG
326 PUSH WR_CRETSEG ;AN000;GHG initialize SCB with complete
327 POP ES:[DI]+ICB_RETSEG ;AN000;GHG return string information
328 ;GHG
329 PUSH WR_CRETOFF ;AN000;GHG
330 POP ES:[DI]+ICB_RETOFF ;AN000;GHG
331 ;GHG
332 PUSH WR_CRETLEN ;AN000;GHG
333 POP ES:[DI]+ICB_RETLEN ;AN000;GHG
334;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
335;
336; Process input field
337;
338;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
339 CALL PCINPUT_CALL ;AN000;GHG display input field
340 ;GHG
341 PUSHH <SI,DI,ES,DS> ;AN000;GHG
342 PUSH ES:[DI]+ICB_FIELDOFF ;AN000;GHG
343 PUSH ES:[DI]+ICB_FIELDSEG ;AN000;GHG
344 PUSH ES:[DI]+ICB_DEFOFF ;AN000;GHG
345 PUSH ES:[DI]+ICB_DEFSEG ;AN000;GHG
346 ;GHG
347 MOV CX,ES:[DI]+ICB_FIELDLEN;AN000;GHG
348 OR CX,CX ;AN000;GHG
349 JE GI_11 ;AN000;GHG
350 ;GHG
351 POP ES ;AN000;GHG
352 POP DI ;AN000;GHG
353 POP DS ;AN000;GHG
354 POP SI ;AN000;GHG
355 CLD ;AN000;GHG
356 REP MOVSB ;AN000;GHG
357GI_11: POPP <DS,ES,DI,SI> ;AN000;GHG
358 PUSH ES:[DI]+ICB_ENDBYTE ;AN000;GHG
359 POP ES:[DI]+ICB_DEFLEN ;AN000;GHG
360 ;GHG
361 MOV AX,ES:[DI]+ICB_KEYRET ;AN000;GHG get last keystroke
362; GHG
363;
364; determine if current element has specific contextual help text
365;
366 ;GHG
367 MOV WR_HLPOPT,HLP_OVER ;AN000;GHG position help panel with default
368 PUSH AX ;AN000;GHG
369 MOV AX,1 ;AN000;GHG
370 MOV BX,IN_ICBID ;AN000;GHG
371 CALL GET_HELP_ID ;AN000;GHG
372 MOV WR_HCBCONT,AX ;AN000;GHG get current contextual help ID
373 XOR AH,AH ;AN000;GHG
374 MOV AL,DH ;AN000;GHG
375 MOV WR_HLPROW,AX ;AN000;GHG row override
376 MOV AL,DL ;AN000;GHG
377 MOV WR_HLPCOL,AX ;AN000;GHG col override
378 POP AX ;AN000;GHG
379 ;GHG
380 CALL CURSOROFF ;AN000;GHG Turn cursor OFF!!!!
381 CALL CHK_RETKEYS ;AN000;GHG check if used by other routine
382 JCXZ GI20 ;AN000;GHG keystroke not used elsewhere
383 ;GHG
384 JMP GI10 ;AN000;GHG keystroke used elswhere, continue
385 ;GHG from last position
386GI20: POP ES ;AN000;GHG
387 POP DI ;AN000;GHG
388 POP SI ;AN000;GHG
389 POP DX ;AN000;GHG
390 POP CX ;AN000;GHG
391 ;GHG
392 RET ;AN000;GHG
393GET_INPUT_CALL ENDP ;AN000;GHG
394PAGE ;AN000;GHG
395;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GHG
396;
397; GET_INPUT
398;
399; Process input field relative to current active panel.
400; Automatically handle help request, display and interaction.
401;
402;
403; Entry: WR_DRETSEG = Segment of call's return key string
404; WR_DRETOFF = Offset of call's return key string
405; WR_DRETLEN = Length of call's return key string
406;
407; WR_HCBCONT = ID of the desired contextual help text
408;
409;
410; Exit: AX = Contains Keystroke
411;
412;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
413GET_INPUT PROC NEAR ;AN000;
414 RET ;AN000;
415GET_INPUT ENDP ;AN000;
416;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
417;
418; GET_KEY
419;
420; Get a keystroke from the keyboard and return to calling routine
421; if not used. This routine uses the string of return keys and
422; builds the complete set of return keys. Once the complete set of
423; return keys is built, the CAS keyboard routine is called to look
424; for a keystroke. When a keystroke is pressed, the CAS routine
425; returns and the keystroke is checked to determine if help should
426; be processed. If the keystroke is not used by help, then it is
427; returned to the calling routine for use.
428;
429; Entry: WR_DRETSEG = Segment of call's return key string
430; WR_DRETOFF = Offset of call's return key string
431; WR_DRETLEN = Length of call's return key string
432;
433; Exit: AX = Contains unused keystroke returned from call
434;
435;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
436GET_KEY PROC NEAR ;AN000;
437
438 PUSH CX ;AN000;save registers
439;
440; Create complete return key string
441;
442CGK10: MOV AX,0 ;AN000;clear to zero
443 ;
444 CALL SET_RETKEYS ;AN000;create complete return string
445 ;
446 PUSH WR_CRETSEG ;AN000;initialize PCINSTR parameters
447 POP INS_SSEG ;AN000; with complete return string data
448 ;
449 PUSH WR_CRETOFF ;AN000;
450 POP INS_SOFF ;AN000;
451 ;
452 PUSH WR_CRETLEN ;AN000;
453 POP INS_SLEN ;AN000;
454; ;
455; Get keystroke from keyboard ;
456; ;
457CGK20: MOV INC_OPT,INC_KWAIT ;AN000;wait for keystroke
458 CALL PCINCHA_CALL ;AN000;call CAS routine
459;
460; Check if keystroke is a valid return key
461;
462 MOV INS_OPT,INS_FKS ;AN000;set find keystroke option
463 MOV AX,INC_KS ;AN000;set keystroke to PCINSTR
464 MOV INS_KS,AX ;AN000; parameter
465 ;
466 CALL PCINSTR_CALL ;AN000;check if good key
467 ;
468 TEST INS_RSLT,0FFFFH ;AN000;check if key found
469 JNE CGK30 ;AN000;yes
470 ;
471 CALL PCMBEEP_CALL ;AN000;no
472 JMP CGK20 ;AN000;try again
473;
474; Check if help keystroke and process if yes
475;
476CGK30: CALL CHK_RETKEYS ;AN000;check keystroke
477 JCXZ CGKEXIT ;AN000;not used return to calling routin
478 JMP CGK10 ;AN000;if used by help, get another key
479 ;
480CGKEXIT: POP CX ;AN000;restore registers
481 RET ;AN000;
482GET_KEY ENDP ;AN000;
483PAGE ;AN000;
484;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
485;
486; SET_RETKEYS
487;
488; Combine the calling routine's dynamic return key string with
489; the return keys of the child panels currently displayed into
490; one complete return string.
491;
492; Entry: WR_DRETSEG = Segment of call's dynamic return key string
493; WR_DRETOFF = Offset of call's dynamic return key string
494; WR_DRETLEN = Length of call's dynamic return key string
495;
496; Exit: WR_CRETSEG = Segment of complete return key string to use
497; WR_CRETOFF = Offset of complete return key string to use
498; WR_CRETLEN = Length of complete return key string to use
499;
500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
501SET_RETKEYS PROC NEAR ;AN000;
502 PUSH CX ;AN000;
503 PUSH DX ;AN000;
504 PUSH DI ;AN000;
505 PUSH SI ;AN000;
506 PUSH ES ;AN000;
507 PUSH DS ;AN000;
508;
509; do not exceed WR_MAXRETKSZ buffer length
510;
511;
512; Move keystrokes from dynamic return key string to complete return strg buffer
513;
514 CLD ;AN000;auto increment
515 PUSH WR_CRETSEG ;AN000;get segment of complete return
516 POP ES ;AN000; buffer
517 ;
518 MOV DI,WR_CRETOFF ;AN000;get offset of complete return
519 ;
520 MOV CX,WR_DRETLEN ;AN000;get length of dynamic return strg
521 MOV DX,CX ;AN000; and initialize DX counter
522 ;
523 MOV SI,WR_DRETOFF ;AN000;get offset of dynamic return strg
524 ;
525 PUSH DS ;AN000;save data segment
526 ;
527 PUSH WR_DRETSEG ;AN000;get offset of dynamic return strg
528 POP DS ;AN000;
529 ;
530 REP MOVSB ;AN000;copy dynamic return key string
531 ; to complete return key buffer
532 POP DS ;AN000;restore data segment
533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
534;
535; Add assigned keys from displayed child panels to complete return buffer
536;
537;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
538 MOV SI,QM_RETKEYSOFF ;AN000;get offset of return buffer
539 ;
540 MOV CX,QM_RETKEYSLEN ;AN000;
541 ADD DX,CX ;AN000;add length of return keys
542 ;
543 PUSH DS ;AN000;save data segment
544 ;
545 PUSH QM_RETKEYSSEG ;AN000;
546 POP DS ;AN000;get segment of return buffer
547 ;
548 REP MOVSB ;AN000;copy string sent
549 ;
550 POP DS ;AN000;restore data segment
551 ;
552 MOV CX,WR_MAXRETKSZ ;AN061;
553 SUB CX,DX ;AN061;
554 MOV AL,0 ;AN061;
555 REP STOSB ;AN061;
556 ;
557 MOV WR_CRETLEN,DX ;AN000;initialize current return string
558; ;
559; Exit ;
560; ;
561SRK30: POP DS ;AN000;restore registers
562 POP ES ;AN000;
563 POP SI ;AN000;
564 POP DI ;AN000;
565 POP DX ;AN000;
566 POP CX ;AN000;
567 RET ;AN000;
568SET_RETKEYS ENDP ;AN000;
569;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
570;
571; SET_NUMKEYS
572;
573; Entry: WR_CRETSEG = Segment of call's dynamic return key string
574; WR_CRETOFF = Offset of call's dynamic return key string
575; WR_CRETLEN = Length of call's dynamic return key string
576;
577; Exit: WR_CRETSEG' = Segment of complete return key string to use
578; WR_CRETOFF' = Offset of complete return key string to use
579; WR_CRETLEN' = Length of complete return key string to use
580;
581; GORD GIDDINGS
582;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
583NUMKEYS DB '123456789' ;AN000;
584 ;
585SET_NUMKEYS PROC NEAR ;AN000;
586 PUSH AX ;AN000;save registers
587 PUSH BX ;AN000;
588 PUSH CX ;AN000;
589 PUSH DI ;AN000;
590 PUSH SI ;AN000;
591 PUSH ES ;AN000;
592 PUSH DS ;AN000;
593;
594; Move numeric keystrokes into completed return strg buffer
595;
596 MOV BX,WR_SCBID ;AN000;get PCSLCTP field
597 CALL GET_SCB ;AN000;ES:DI points to SCB
598 ;
599 TEST ES:[DI]+SCB_OPT3,SCB_NUMS;AN000;
600 JZ SNK_30 ;AN000;
601 ;
602 PUSH ES:[DI]+SCB_SELSEG ;AN000;
603 PUSH ES:[DI]+SCB_SELOFF ;AN000;
604 PUSH ES:[DI]+SCB_NUMELE ;AN000;
605 POP CX ;AN000;
606 POP DI ;AN000;
607 POP ES ;AN000;
608 XOR AX,AX ;AN000;
609 ;
610SNR_10: MOV BX,SCB_ACTIVEON ;AN000;
611 CMP ES:[DI],BX ;AN000;
612 JNE SNR_15 ;AN000;
613 INC AX ;AN000;
614SNR_15: INC DI ;AN000;
615 INC DI ;AN000;
616 LOOP SNR_10 ;AN000;
617 ;
618 CMP AX,9 ;AN000;
619 JBE SNR_20 ;AN000;
620 MOV AX,9 ;AN000;
621SNR_20: MOV CX,AX ;AN000;
622 ;
623 PUSH WR_CRETOFF ;AN000;get offset of complete return
624 PUSH WR_CRETSEG ;AN000;get segment of complete return
625 POP ES ;AN000;
626 POP DI ;AN000;
627 ;
628 ADD DI,WR_CRETLEN ;AN000;get length of dynamic return strg
629 ADD WR_CRETLEN,CX ;AN000;
630 LEA SI,NUMKEYS ;AN000;
631 PUSH CS ;AN000;
632 POP DS ;AN000;
633 ;
634 CLD ;AN000;auto increment
635 REP MOVSW ;AN000;
636 ;
637SNK_30: POP DS ;AN000;restore registers
638 POP ES ;AN000;
639 POP SI ;AN000;
640 POP DI ;AN000;
641 POP CX ;AN000;
642 POP BX ;AN000;
643 POP AX ;AN000;
644 RET ;AN000;
645SET_NUMKEYS ENDP ;AN000;
646;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
647;
648; CHK_RETKEYS
649;
650; Check return key for active function keys
651;
652; Note: That currently this routine searchs for only the help
653; function keys (F1=Help, F5=Index, F7=Keys); however, other
654; function keys could be searched for and processed in this
655; routine before returning to the main dialog.
656;
657; Entry: AX = Keystroke
658;
659; Exit: CX = 0= keystroke not used
660; 1= keystroke used
661;
662;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
663CHK_RETKEYS PROC NEAR ;AN000;
664 PUSHF ;AN000;save registers and variables
665 PUSH AX ;AN000;
666 PUSH BX ;AN000;
667 PUSH DX ;AN000;
668 PUSH SI ;AN000;
669 PUSH DI ;AN000;
670 PUSH ES ;AN000;
671 PUSH DS ;AN000;
672 PUSH WR_HCBCONT ;AN000;save contextual help ID
673 PUSH QM_ACTIVEPAN ;AN000;save current active panel
674 PUSH WR_SCBID ;AN000;save current SCB ID
675 PUSH WR_DRETSEG ;AN000;save dynamic return key vars
676 PUSH WR_DRETOFF ;AN000;
677 PUSH WR_DRETLEN ;AN000;
678 PUSH MB_FREQUENCY ;AN004;GHG for PTM 1064
679;
680; Check if keystroke pressed displays, processes, or removes contextual help
681;
682 CALL MANAGE_HELP ;AN000;
683;
684 CMP CX,0 ;AN000;check if keystroke used by help
685 JE CHK10 ;AN000;no, check other functions
686;
687 JMP CHKEXIT ;AN000;yes, exit
688;
689; Keys may be check here and processed for other functions
690;
691CHK10: ;AN000;
692;
693; Exit to calling routine
694;
695CHKEXIT: POP MB_FREQUENCY ;AN004;GHG for PTM 1064
696 POP WR_DRETLEN ;AN000;save dynamic return key vars
697 POP WR_DRETOFF ;AN000;
698 POP WR_DRETSEG ;AN000;
699 POP WR_SCBID ;AN000;restore current SCB ID
700 POP QM_ACTIVEPAN ;AN000;restore current active panel
701 POP WR_HCBCONT ;AN000;restore contextual help ID
702 POP DS ;AN000;
703 POP ES ;AN000;
704 POP DI ;AN000;
705 POP SI ;AN000;
706 POP DX ;AN000;
707 POP BX ;AN000;
708 POP AX ;AN000;
709 POPF ;AN000;
710 RET ;AN000;
711CHK_RETKEYS ENDP ;AN000;
712;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
713;
714; CHK_NUMKEYS
715;
716; Check return key for numeric keys
717;
718; Entry: AX = Keystroke
719;
720; Exit: AX = The first character in the completed return key string
721; WR_CRETSEG:WR_CRETOFF
722;
723;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
724CHK_NUMKEYS PROC NEAR ;AN000;
725 PUSH ES ;AN000;
726 PUSH DI ;AN000;
727 PUSH BX ;AN000;
728 MOV BX,WR_SCBID ;AN000;
729 CALL GET_SCB ;AN000;
730 TEST ES:[DI]+SCB_OPT3,SCB_NUMS ;AN000;
731 JZ CNK_20 ;AN000;
732 OR AH,AH ;AN000;
733 JNZ CNK_20 ;AN000;
734 CMP AL,'1' ;AN000;
735 JB CNK_20 ;AN000;
736 CMP AL,'9' ;AN000;
737 JA CNK_20 ;AN000;
738 ;
739 MOV BX,AX ;AN000; now form the index value
740 SUB BX,'0' ;AN000; from the keystroke!
741 ;
742 PUSHH <ES,DI> ;AN000;GHG
743 PUSHH <WR_CRETSEG,WR_CRETOFF> ;AN000;GHG
744 POPP <DI,ES> ;AN000;GHG
745 MOV AL,ES:[DI] ;AN000;GHG
746 POPP <DI,ES> ;AN000;GHG
747 ; ;
748 MOV ES:[DI]+SCB_KS,AX ;AN000;
749 PUSH AX ;AN000;
750 MOV AX,BX ;AN000;get PCSLCTP field
751 MOV BX,WR_SCBID ;AN000;
752 CALL ADJUST_UP ;AN000;
753 MOV ES:[DI]+SCB_CURELE,AX ;AN000;
754 POP AX ;AN000;
755 ;
756CNK_20: POP BX ;AN000;
757 POP DI ;AN000;
758 POP ES ;AN000;
759 RET ;AN000;
760CHK_NUMKEYS ENDP ;AN000;
761;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
762;
763; MANAGE_HELP
764;
765; Manage contextual, indexed and keys help. This routine is used :
766; to display, process and remove help from the screen.
767;
768; Entry: AX = Keystroke pressed
769;
770; WR_HLPOPT = Help display and operation options
771; WR_HLPROW = Override row for help panel
772; WR_HLPCOL = Override column for help panel
773;
774; WR_HCBCONT = Current contextual help ID
775; WR_HCBHELP = Help-on-help ID
776; WR_HCBKEYS = Keys help ID
777;
778; WR_PCBHPAN = Help panel ID
779;
780; WR_SCBCONT = Scroll ID for context forms of help
781; WR_SCBINDX = Scroll ID for indexed forms of help
782;
783; WR_KEYQUIT = Quit keystroke (Esc)
784; WR_KEYKEYS = Keys help keystroke (F7=Keys)
785; WR_KEYHELP = Help-on-help keystroke (F1=Help)
786; WR_KEYCONT = Contextual help keystroke (F1=Help)
787; WR_KEYINDX = Indexed help keystroke (F5=Index)
788; WR_KEYSWIT = Switch keystroke (F2=Switch)
789;
790; HRD_FILSPOFF = Offset of contextual help file path name
791; HRD_FILSPSEG = Segment of contextual help file path name
792;
793; Exit: AX = Keystroke
794; CX 0 = Keystroke not used
795; 1 = Keystroke used
796;
797;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
798MANAGE_HELP PROC NEAR ;AN000;
799;
800; Check if help is displayed
801;
802 MOV CX,0 ;AN000;
803
804 PUSH DS ;AN007;JW
805 PUSH CS ;AN007;JW
806 POP DS ;AN007;JW
807 CMP ERROR_ACTIVE,1 ;AN007;JW is an error being processed?
808 POP DS ;AN007;JW
809 JNE MH00 ;AN007;JW no, continue
810 JMP MHEXIT ;AN007;JW yes, exit
811
812MH00: CMP WR_HLPDIS,0 ;AN000;check if help is displayed
813 JE MH30 ;AN000;
814
815 CMP AX,WR_KEYSWIT ;AN000;check if any key but switch
816 JNE MH10 ;AN000; and remove help
817
818 TEST WR_HLPDIS,HLP_INDX ;AN000;check if index displayed
819 JNE MH05 ;AN000;yes
820
821 MOV QM_OPT1,QM_RVMCHD ;AN000;remove child panel
822 MOV AX,WR_PCBENTR ;AN000;Enter panel
823 MOV QM_ID,AX ;AN000;parent PCB number
824 CALL PCDISPQ_CALL ;AN000;
825
826MH05: MOV QM_OPT1,QM_PUSHCHD ;AN000;add child panel
827 MOV AX,WR_PCBHELP ;AN000;F1=Help panel
828 MOV QM_ID,AX ;AN000;parent PCB number
829 CALL PCDISPQ_CALL ;AN000;
830 JMP MH20 ;AN000;
831
832MH10: CALL REMOVE_HELP ;AN000;restore original display queues
833 JMP MH80 ;AN000;exit
834;
835; Process read help text
836;
837MH20: CALL PROCESS_HELP ;AN000;process contextual help
838
839 MOV CX,1 ;AN000;set keystroke used flag
840
841 CMP AX,WR_KEYSWIT ;AN000;check if help should be left
842 JNE MH25 ;AN000; on the screen
843
844 MOV QM_OPT1,QM_RVMCHD ;AN000;remove child panel
845 MOV AX,WR_PCBHELP ;AN000;F1=Help
846 MOV QM_ID,AX ;AN000;parent PCB number
847 CALL PCDISPQ_CALL ;AN000;
848
849 MOV AX,WR_PCBHELP ;AN000;F1=Help
850 MOV QM_ID,AX ;AN000;parent PCB number
851 CALL PCDISPQ_CALL ;AN000;
852
853 TEST WR_HLPDIS,HLP_INDX ;AN000;check if index displayed
854 JNE MH22 ;AN000;yes
855
856 MOV QM_OPT1,QM_PUSHCHD ;AN000;add child panel
857 MOV AX,WR_PCBENTR ;AN000;Enter panel
858 MOV QM_ID,AX ;AN000;parent PCB number
859 CALL PCDISPQ_CALL ;AN000;
860
861MH22: JMP MH80 ;AN000;exit
862
863MH25: CMP AL,01BH ;AN000;check for quit key
864 JNE MH30 ;AN000; refresh display
865
866 CALL REMOVE_HELP ;AN000;restore original display queues
867 JMP MH80 ;AN000;exit
868
869; Read help if requested
870
871MH30: CMP AX,WR_KEYHELP ;AN000;check if F1=help requested
872 JNE MH60 ;AN000;
873
874 CMP WR_HLPDIS,0 ;AN000;is help already displayed
875 JE MH40 ;AN000;no
876
877 CALL REMOVE_HELP ;AN000;restore original display queues
878
879MH40: TEST WR_HLPDIS,HLP_CONT ;AN000;check if contextual help already
880 JE MH50 ;AN000; on
881
882 MOV WR_HLPPAN,HLP_KEYS ;AN000;turn on help on keys
883 OR WR_HLPPAN,HLP_CONT ;AN000;turn on contextual help
884 OR WR_HLPPAN,HLP_INDX ;AN000;turn on help index
885
886 PUSH WR_HCBHELP ;AN000;set help-on-help ID
887 POP HRD_ID ;AN000;
888
889 MOV WR_HLPDIS,HLP_HELP ;AN000;turn help-on-help status on
890 CALL READ_HELP ;AN000;prepare help text
891 JMP MH20 ;AN000;loop to process
892
893MH50: MOV WR_HLPPAN,HLP_KEYS ;AN000;turn on help on keys
894 OR WR_HLPPAN,HLP_HELP ;AN000;turn on help-on-help
895 OR WR_HLPPAN,HLP_INDX ;AN000;turn on help index
896
897 PUSH WR_HCBCONT ;AN000;get current contextual help text
898 POP HRD_ID ;AN000; ID
899
900 MOV WR_HLPDIS,HLP_CONT ;AN000;turn contextual help status on
901 CALL READ_HELP ;AN000;prepare help text
902 JMP MH20 ;AN000;loop to process
903;
904; Check if indexed help requested for display
905;
906MH60: CMP AX,WR_KEYINDX ;AN000;check if index selected
907 JNE MH70 ;AN000;
908
909 CMP WR_HLPDIS,0 ;AN000;is help already displayed
910 JE MH65 ;AN000;no
911
912 CALL REMOVE_HELP ;AN000;restore original display queues
913
914MH65: MOV WR_HLPPAN,HLP_CONT ;AN000;turn on contextual help
915 OR WR_HLPPAN,HLP_KEYS ;AN000;turn on help on keys
916
917 MOV HRD_ID,0 ;AN000;set contextual help ID
918
919 MOV WR_HLPDIS,HLP_INDX ;AN000;turn index status on
920 CALL READ_HELP ;AN000;prepare help text
921 JMP MH20 ;AN000;loop to process
922;
923; Check if keys help requested for display
924;
925MH70: CMP AX,WR_KEYKEYS ;AN000;check for help on keys
926 JNE MHEXIT ;AN000;
927
928 CMP WR_HLPDIS,0 ;AN000;is help already displayed
929 JE MH75 ;AN000;no
930
931 CALL REMOVE_HELP ;AN000;restore original display queues
932
933MH75: MOV WR_HLPPAN,HLP_CONT ;AN000;turn on contextual help
934 OR WR_HLPPAN,HLP_INDX ;AN000;turn on help index
935
936 PUSH WR_HCBKEYS ;AN000;set keys help ID
937 POP HRD_ID ;AN000;
938
939 MOV WR_HLPDIS,HLP_KEYS ;AN000;turn keys help status on
940 CALL READ_HELP ;AN000;prepare help text
941 JMP MH20 ;AN000;loop to process
942;
943; Help was processed restore original active panel and return key string
944;
945MH80: MOV QM_OPT1,0 ;AN000;make original panel active
946 CALL PCDISPQ_CALL ;AN000; and update the return keys
947
948 CALL SET_RETKEYS ;AN000;restore original return keys
949
950 PUSH AX ;AN000;save keystroke
951
952 MOV AX,1 ;;AN000;;;;;;;;;;0 ;set break option off
953
954 CMP WR_HLPDIS,0 ;AN000;is help displayed
955 JE MH90 ;AN000;
956
957 MOV AX,1 ;AN000;turn break option on
958
959MH90: CALL PCPANEL_CALL ;AN000;make original panel the active
960 ; panel with the child panels
961 POP AX ;AN000;restore keystroke
962;
963; Exit
964;
965MHEXIT: ;AN000;exit
966;
967 RET ;AN000;
968MANAGE_HELP ENDP ;AN000;
969
970PAGE ;AN000;
971;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
972;
973; READ_HELP
974;
975; Read Help Text and Prepare for Display:
976;
977; o Read the specified contextual help text into the help buffer :
978;
979; o Save the current parent and child display queues
980;
981; o Add the contextual help panel to the new display queue
982;
983; o Exit without updating display
984;
985;
986; Entry: WR_PCBHPAN = Help panel ID
987; WR_SCBCONT = Scroll ID for context forms of help
988; WR_SCBINDX = Scroll ID for indexed forms of help
989;
990; HRD_ID = Current contextual help ID to read
991; HRD_FILSPOFF = Offset of help file path name
992; HRD_FILSPSEG = Segment of help file path name
993;
994; WR_HLPOPT = Help options
995; WR_HLPDIS = Help display status
996; WR_HLPPAN = Active help panels
997; WR_HLPROW = Override row for help panel
998; WR_HLPCOL = Override column for help panel
999;
1000; Exit: None
1001;
1002;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1003READ_HELP PROC NEAR ;AN000;
1004 PUSH BX ;AN000;save registers
1005 PUSH DX ;AN000;
1006 PUSH DI ;AN000;
1007 PUSH QM_ACTIVEPAN ;AN000;
1008;
1009; Read specified help text from file into memory buffer
1010;
1011 MOV HRD_OPT1,HRD_TEXT ;AN000;set the contextual option
1012 ;
1013 TEST WR_HLPDIS,HLP_INDX ;AN000;check if index status on
1014 JE RH05 ;AN000;
1015 ;
1016 MOV HRD_OPT1,HRD_TOPIC ;AN000;set the indexed help option
1017 ;
1018RH05: CALL HOOK_INT_24 ;AN000;
1019 ;
1020RH06: PUSH HRD_BUFOFF ;AN000;
1021 PUSH HRD_BUFLEN ;AN000;save help buffer length
1022 ;
1023 CALL PCHLPRD_CALL ;AN005;GHG call help read routine
1024 JNC RH07 ;AN006;JW
1025 ;
1026 POP HRD_BUFLEN ;AN006;JW restore help buffer length
1027 POP HRD_BUFOFF ;AN006;JW
1028 MOV BX,ERR_INS_INSTALL ;AN060;JW
1029 MOV CX,E_RETURN ;AN000;
1030 CALL HANDLE_ERROR_CALL ;AN000;
1031 JNC RH06 ;AN000;
1032 CLEAR_SCREEN2 ;AN000;
1033 JMP EXIT_SELECT ;AN000;
1034 ;
1035RH07: POP HRD_BUFLEN ;AN000;restore help buffer length
1036 POP HRD_BUFOFF ;AN000;
1037 CALL RESTORE_INT_24 ;AN006;JW
1038;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1039;
1040; Handle error for help text not found
1041;
1042; Perform WORD WRAP on help buffer...
1043;
1044;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1045 PUSH HRD_TEXTSEG ;AN000;GHG
1046 POP WWP_SRCTXTSEG ;AN000;GHG
1047 ;GHG
1048 PUSH HRD_TEXTOFF ;AN000;GHG
1049 POP WWP_SRCTXTOFF ;AN000;GHG
1050 ;GHG
1051 PUSH HRD_TEXTLEN ;AN000;GHG
1052 POP WWP_SRCTXTLEN ;AN000;GHG
1053 ;GHG
1054 PUSH WR_MAXHELPSZ ;AN000;GHG
1055 POP WWP_SRCBUFLEN ;AN000;GHG
1056 ;GHG
1057 PUSH ES ;AN000;GHG
1058 PUSH DI ;AN000;GHG
1059 MOV BX,WR_SCBCONT ;AN000;GHG get help scroll ID
1060 CALL GET_SCB ;AN000;GHG ES:DI points to SCB
1061 MOV BX,ES:[DI]+SCB_WIDTH ;AN000;GHG calculate number of help text
1062 MOV WWP_WIDTH,BX ;AN000;GHG
1063 POP DI ;AN000;GHG
1064 POP ES ;AN000;GHG
1065 ;GHG
1066 ;GHG
1067 XOR AX,AX ;AN000;GHG
1068 MOV WWP_NUMLINES,AX ;AN000;GHG
1069 MOV WWP_ERROR,AX ;AN000;GHG
1070 MOV WWP_OPT1,WWP_LEFTJUST+WWP_HYPHEN+WWP_SRCBUFFER ;AN000;GHG
1071 ;GHG
1072 CALL PCWWRAP_CALL ;AN000;GHG
1073;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1074;
1075; Determine position and add help panel to parent display queue
1076;
1077;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1078 MOV QM_OPT1,QM_PUSHPQU ;AN000;push parent queue
1079 OR QM_OPT1,QM_PUSHCQU ;AN000;push child queue
1080 CALL PCDISPQ_CALL ;AN000;update display queue
1081
1082 TEST WR_HLPOPT,HLP_OVER ;AN000;check for help panel position
1083 JE RH10 ;AN000; override
1084
1085 PUSH WR_HLPCOL ;AN000;set override
1086 POP QM_COLUMOVER ;AN000;
1087
1088 PUSH WR_HLPROW ;AN000;set override
1089 POP QM_ROWOVER ;AN000;
1090
1091RH10: MOV QM_OPT1,QM_RVMCHD ;AN000;remove child panel
1092 MOV AX,WR_PCBENTR ;AN000;Enter panel
1093 MOV QM_ID,AX ;AN000;parent PCB number
1094 CALL PCDISPQ_CALL ;AN000;update display queue
1095
1096 MOV AX,WR_PCBQUIT ;AN000;Quit panel
1097 MOV QM_ID,AX ;AN000;parent PCB number
1098 CALL PCDISPQ_CALL ;AN000;update display queue
1099
1100 MOV QM_OPT1,QM_PUSHPAN ;AN000;add help panel
1101 OR QM_OPT2,QM_BREAKON ;AN000;break on
1102 MOV BX,WR_PCBHPAN ;AN000;
1103 MOV QM_ID,BX ;AN000;get help panel number
1104 MOV QM_ACTIVEPAN,BX ;AN000;make help panel active
1105 CALL PCDISPQ_CALL ;AN000;update display queue
1106
1107 MOV QM_OPT2,0 ;AN000;set options off
1108 MOV QM_ROWOVER,0 ;AN000;deactivate overrides
1109 MOV QM_COLUMOVER,0 ;AN000;
1110;
1111; Check if help panel's children are active and add to display queue
1112;
1113 MOV QM_OPT1,QM_PUSHCHD ;AN000;add child panels option
1114
1115 MOV BX,WR_PCBQUIT ;AN000;Esc=Quit
1116 MOV QM_ID,BX ;AN000;get help panel number
1117 CALL PCDISPQ_CALL ;AN000;update display queue
1118
1119 TEST WR_HLPPAN,HLP_CONT ;AN000;check if contextual help active
1120 JE RH15 ;AN000;
1121
1122 MOV BX,WR_PCBHELP ;AN000;F1=Help panel
1123 MOV QM_ID,BX ;AN000;get help panel number
1124 CALL PCDISPQ_CALL ;AN000;update display queue
1125
1126RH15: TEST WR_HLPPAN,HLP_HELP ;AN000;check if help-on-help active
1127 JE RH20 ;AN000;
1128
1129 MOV BX,WR_PCBHELP ;AN000;F1=Help panel
1130 MOV QM_ID,BX ;AN000;get help panel number
1131 CALL PCDISPQ_CALL ;AN000;update display queue
1132
1133RH20: TEST WR_HLPPAN,HLP_INDX ;AN000;check if help index active
1134 JE RH30 ;AN000;
1135
1136 MOV BX,WR_PCBINDX ;AN000;F5=Index panel
1137 MOV QM_ID,BX ;AN000;get help panel number
1138 CALL PCDISPQ_CALL ;AN000;update display queue
1139
1140RH30: TEST WR_HLPPAN,HLP_KEYS ;AN000;check if help keys active
1141 JE RH40 ;AN000;
1142
1143 MOV BX,WR_PCBKEYS ;AN000;
1144 MOV QM_ID,BX ;AN000;get help panel number
1145 CALL PCDISPQ_CALL ;AN000;update display queue
1146;
1147; Locate help panel PCB data and initialize common data
1148;
1149RH40: MOV BX,WR_PCBHPAN ;AN000;get help panel ID
1150 CALL GET_PCB ;AN000;ES:DI points to PCB
1151
1152 PUSH ES:[DI]+PCB_UROW ;AN000;get help panel row
1153 PUSH ES:[DI]+PCB_UCOL ;AN000;get help panel column
1154;
1155; Initialize for indexed form of help
1156;
1157 TEST WR_HLPDIS,HLP_INDX ;AN000;check is index help status is on
1158 JE RH50 ;AN000;
1159
1160 LEA AX,WR_REFBUF ;AN000;get address of refresh table
1161 MOV WR_REFOFF,AX ;AN000;
1162
1163 LEA AX,WR_REFBUF ;AN000;get address of refresh table
1164 MOV WR_REFOFF,AX ;AN000;
1165
1166 MOV QM_OPT1,QM_PUSHCHD ;AN000;push child
1167 MOV AX,WR_PCBENTR ;AN000;Enter panel
1168 MOV QM_ID,AX ;AN000;parent PCB number
1169 CALL PCDISPQ_CALL ;AN000;update display queue
1170
1171 MOV BX,WR_SCBINDX ;AN000;get help scroll ID
1172 CALL GET_SCB ;AN000;ES:DI points to SCB
1173
1174 POP ES:[DI]+SCB_RELCOL ;AN000;set panel's relative column
1175 POP ES:[DI]+SCB_RELROW ;AN000;set panel's relative row
1176
1177 MOV ES:[DI]+SCB_TOPELE,1 ;AN000;set top element
1178 MOV ES:[DI]+SCB_CURELE,1 ;AN000;set current line
1179 MOV ES:[DI]+SCB_CURCOL,1 ;AN000;display offset into opt strings
1180
1181 ;
1182 ; adjust scrolling field width to be contained within panel
1183 ;
1184
1185 MOV AX,HRD_TOPICLEN ;AN000;get topic length
1186 MOV ES:[DI]+SCB_OASLEN,AX ;AN000;fixed string length
1187 MOV ES:[DI]+SCB_NUMCOL,AX ;AN000;maximum number of cols to scroll
1188
1189 ;
1190 ; adjust scrolling field number of display lines to be
1191 ; contained within panel
1192 ;
1193
1194 PUSH HRD_TOPICNUM ;AN000;set number of elements
1195 POP ES:[DI]+SCB_NUMELE ;AN000;
1196
1197 MOV AX,HRD_TOPICSEG ;AN000;set segment of topic vector
1198 MOV ES:[DI]+SCB_OAPSEG,AX ;AN000;
1199 MOV ES:[DI]+SCB_OASSEG,AX ;AN000;set option array string segment
1200
1201 PUSH HRD_TOPICOFF ;AN000;set offset of topic vector
1202 POP ES:[DI]+SCB_OAPOFF ;AN000;
1203
1204 JMP RHEXIT ;AN000;index initialized
1205;
1206; Initialize for contextual forms of help (cont, help, and keys)
1207;
1208RH50: LEA AX,WR_REFBUF ;AN000;get address of refresh table
1209 MOV WR_REFOFF,AX ;AN000;
1210;
1211 MOV BX,WR_SCBCONT ;AN000;get help scroll ID
1212 CALL GET_SCB ;AN000;ES:DI points to SCB
1213;
1214 POP ES:[DI]+SCB_RELCOL ;AN000;set panel's relative column
1215 POP ES:[DI]+SCB_RELROW ;AN000;set panel's relative row
1216;
1217 MOV ES:[DI]+SCB_TOPELE,1 ;AN000;GHG set top element
1218 MOV ES:[DI]+SCB_CURELE,1 ;AN000;GHG set current line
1219 MOV ES:[DI]+SCB_CURCOL,1 ;AN000;display offset into opt strings
1220;
1221 MOV AX,WWP_NUMLINES ;AN000;GHG Use WordWrap # lines
1222 DEC AX ;AN000;GHG
1223 MOV ES:[DI]+SCB_NUMELE,AX ;AN000;initialize number of elements
1224
1225 PUSH HRD_TEXTSEG ;AN000;set segment of help text
1226 POP ES:[DI]+SCB_OAPSEG ;AN000;
1227
1228 PUSH HRD_TEXTOFF ;AN000;set offset of help text
1229 POP ES:[DI]+SCB_OAPOFF ;AN000;
1230 MOV BX,ES:[DI]+SCB_WIDTH ;AN000;GHG SKIP OVER FIRST ELEMENT
1231 ADD ES:[DI]+SCB_OAPOFF,BX ;AN000;GHG
1232
1233RHEXIT: POP QM_ACTIVEPAN ;AN000;restore current active panel
1234 POP DI ;AN000;restore registers and exit
1235 POP DX ;AN000;
1236 POP BX ;AN000;
1237 RET ;AN000;
1238READ_HELP ENDP ;AN000;
1239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1240;
1241; PROCESS_HELP
1242;
1243; Process Help Panel and Text:
1244; o Update display to make help panel active
1245; o Configure proper return keys
1246; o Process scrolling of help text until exit key pressed
1247;
1248; Entry: WR_PCBHPAN = Help panel ID
1249; WR_SCBCONT = Scroll ID for context forms of help
1250; WR_SCBINDX = Scroll ID for indexed forms of help
1251;
1252; Exit: AX = Exit keystroke pressed
1253;
1254;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1255PROCESS_HELP PROC NEAR ;AN000;
1256 PUSH BX ;AN000;save registers
1257 PUSH DI ;AN000;
1258 PUSH ES ;AN000;
1259 PUSH WR_DRETSEG ;AN000;save dynamic return key vars
1260 PUSH WR_DRETOFF ;AN000;
1261 PUSH WR_DRETLEN ;AN000;
1262 PUSH QM_ACTIVEPAN ;AN000;
1263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1264;
1265; Refresh display with help panel
1266;
1267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1268 PUSH WR_PCBHPAN ;AN000;set the help panel as active
1269 POP QM_ACTIVEPAN ;AN000;
1270 ;
1271 MOV QM_OPT1,0 ;AN000;make help panel active panel
1272 CALL PCDISPQ_CALL ;AN000; and update the return keys
1273 ;
1274 MOV AX,1 ;AN000;set break option on
1275 CALL PCPANEL_CALL ;AN000;refresh display
1276;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1277;
1278; Locate proper scroll SCB for help form
1279;
1280;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1281 MOV BX,WR_SCBCONT ;AN000;set for contextual help form
1282 ;
1283 TEST WR_HLPDIS,HLP_INDX ;AN000;check if indexed help status on
1284 JE PH10 ;AN000;
1285 ;
1286 MOV BX,WR_SCBINDX ;AN000;set for indexed help form
1287 ;
1288PH10: CALL INIT_HELP_TITLE ;AN000;** GG
1289 CALL GET_SCB ;AN000;loads PCSLCTP vars with field
1290;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1291;
1292; Build return string of keystrokes and process help
1293;
1294;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1295 LEA AX,WR_RETHLPBUF ;AN000;set help dynamic return keys
1296 MOV WR_DRETOFF,AX ;AN000;
1297 ;
1298 MOV AX,WR_RETHLPLEN ;AN000;
1299 MOV WR_DRETLEN,AX ;AN000;
1300 ;
1301 MOV AX,DATA ;AN000;
1302 MOV WR_DRETSEG,AX ;AN000;
1303 ;
1304 CALL SET_RETKEYS ;AN000;create complete return string
1305 ;
1306 PUSH WR_CRETSEG ;AN000;initialize SCB with complete
1307 POP ES:[DI]+SCB_RLSEG ;AN000; return string information
1308 ;
1309 PUSH WR_CRETOFF ;AN000;
1310 POP ES:[DI]+SCB_RLOFF ;AN000;
1311 ;
1312 PUSH WR_CRETLEN ;AN000;
1313 POP ES:[DI]+SCB_RLLEN ;AN000;
1314 ;
1315 CALL PCSLCTP_CALL ;AN000;process help text until exit
1316 ;
1317 MOV AX,ES:[DI]+SCB_KS ;AN000;get keystroke from PCSLCTP
1318 ;
1319 TEST WR_HLPDIS,HLP_INDX ;AN000;check if index help status is on
1320 JE PHEXIT ;AN000;
1321 ;
1322 CMP AX,WR_KEYSELT ;AN000;check if select key pressed to
1323 JNE PHEXIT ;AN000; select desired topic
1324 ;
1325 MOV BX,ES:[DI]+SCB_CURELE;AN000;get current selected element
1326 MOV WR_HCBCONT,BX ;AN000;return new contextual help number
1327 ; selected from the help index
1328 MOV AX,WR_KEYHELP ;AN000;return contextual help key requst
1329 ; instead of enter key
1330PHEXIT: POP QM_ACTIVEPAN ;AN000;restore current active panel
1331 POP WR_DRETLEN ;AN000;restore return key vars
1332 POP WR_DRETOFF ;AN000;
1333 POP WR_DRETSEG ;AN000;
1334 POP ES ;AN000;restore registers and exit
1335 POP DI ;AN000;
1336 POP BX ;AN000;
1337 RET ;AN000;
1338PROCESS_HELP ENDP ;AN000;
1339;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1340;
1341;
1342; INITIALIZE_HELP_TITLE
1343;
1344;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1345INIT_HELP_TITLE PROC NEAR ;AN000;
1346 PUSHH <AX,BX,ES,DI,WR_SCBID> ;AN000;
1347 ;
1348 MOV BX,WR_PCBHPAN ;AN000;get help panel ID
1349 CALL GET_PCB ;AN000;ES:DI points to PCB
1350 ;
1351 PUSH ES:[DI]+PCB_UROW ;AN000;get help panel row
1352 PUSH ES:[DI]+PCB_UCOL ;AN000;get help panel column
1353 ;
1354 MOV BX,SCR_TITLE_HLP ;AN000;
1355 MOV WR_SCBID,BX ;AN000;
1356 CALL GET_SCB ;AN000;
1357 ;
1358 POP ES:[DI]+SCB_RELCOL ;AN000;
1359 POP ES:[DI]+SCB_RELROW ;AN000;
1360 ;
1361 PUSH HRD_TEXTSEG ;AN000;
1362 POP ES:[DI]+SCB_OAPSEG ;AN000;
1363 ;
1364 PUSH HRD_TEXTOFF ;AN000;
1365 POP ES:[DI]+SCB_OAPOFF ;AN000;
1366 ;
1367 PUSH ES:[DI]+SCB_OPT1 ;AN000;
1368 OR ES:[DI]+SCB_OPT1,SCB_RD ;AN000;
1369 CALL PCSLCTP_CALL ;AN000;display scroll field
1370 POP ES:[DI]+SCB_OPT1 ;AN000;
1371 ;
1372 POPP <WR_SCBID,DI,ES,BX,AX> ;AN000;
1373 RET ;AN000;
1374INIT_HELP_TITLE ENDP ;AN000;
1375;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1376;
1377; REMOVE_HELP
1378;
1379; Remove Help Panel:
1380;
1381; o Restore original parent and child display queues; thereby,
1382; removing help panels
1383;
1384; o Exit without updating display
1385;
1386; Entry: WR_KEYHELP = Help-on-help keystroke (F1=Help)
1387;
1388; Exit: WR_HLPDIS = Help status off
1389;
1390;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1391REMOVE_HELP PROC NEAR ;AN000;
1392 PUSH BX ;AN000;save registers
1393 PUSH DI ;AN000;
1394;
1395; Restore original parent and child queues
1396;
1397 MOV QM_OPT1,QM_POPPQU ;AN000;restore parent queue
1398 OR QM_OPT1,QM_POPCQU ;AN000;restore child queue
1399 CALL PCDISPQ_CALL ;AN000;update display queue
1400;
1401; Reset variables for exit
1402;
1403 TEST WR_HLPDIS,HLP_CONT ;AN000;check if contextual help
1404 JE RM20 ;AN000; already on, no set status off
1405
1406 CMP AX,WR_KEYHELP ;AN000;check if help on help request
1407 JE RMEXIT ;AN000;
1408
1409RM20: MOV WR_HLPDIS,0 ;AN000;help panels not on
1410;
1411; Exit
1412;
1413RMEXIT: POP DI ;AN000;restore registers and exit
1414 POP BX ;AN000;
1415 RET ;AN000;
1416REMOVE_HELP ENDP ;AN000;
1417;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1418;
1419; GET_PCB
1420;
1421; Get Panel Control Block information for child or parent panel. :
1422;
1423; Entry: BX = Number of PCB vector desired.
1424;
1425; Exit: ES = Segment of desired PCB.
1426; DI = Offset of desired PCB.
1427;
1428;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1429;
1430GET_PCB PROC NEAR ;AN000;
1431 PUSH AX ;AN000;
1432 PUSH BX ;AN000;
1433 PUSH CX ;AN000;
1434 PUSH DX ;AN000;GHG
1435;
1436; read panel control block vector to obtain PCB address
1437;
1438 PUSH QM_PCBVECSEG ;AN000;get beginning PCB vector address
1439 POP ES ;AN000;
1440 PUSH QM_PCBVECOFF ;AN000;
1441 POP DI ;AN000;
1442
1443 DEC BX ;AN000;make zero based
1444 MOV AX,VECSEGLEN ;AN000;multiply PCB element length by
1445 ADD AX,VECOFFLEN ;AN000; desired vector number in BX
1446 MUL BX ;AN000; to determine offset into PCB vec
1447 ADD DI,AX ;AN000;add offset inside table
1448 MOV BX,ES:[DI] ;AN000;get actual PCB segment
1449 MOV CX,ES:[DI]+VECSEGLEN ;AN000;point past PCB seg to get PCB off
1450
1451 MOV ES,BX ;AN000;set ES:DI to panel's actual
1452 MOV DI,CX ;AN000; PCB address
1453
1454 POP DX ;AN000;GHG
1455 POP CX ;AN000;
1456 POP BX ;AN000;
1457 POP AX ;AN000;
1458
1459 RET ;AN000;
1460GET_PCB ENDP ;AN000;
1461;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1462;
1463; GET_SCB
1464;
1465; Get Scroll Field Control Block information.
1466;
1467; Entry: BX = Number of SCB vector desired.
1468;
1469; Exit: ES:DI = Address of desired SCB
1470;
1471;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1472;
1473GET_SCB PROC NEAR ;AN000;
1474;
1475 PUSH AX ;AN000;
1476 PUSH BX ;AN000;
1477 PUSH CX ;AN000;
1478 PUSH DX ;AN000;GHG
1479;
1480; read scroll control block vector to obtain SCB address
1481;
1482 PUSH SRD_SCBVECSEG ;AN000;get beginning SCB vector address
1483 POP ES ;AN000;
1484 PUSH SRD_SCBVECOFF ;AN000;
1485 POP DI ;AN000;
1486;
1487 DEC BX ;AN000;make zero based
1488 MOV AX,VECSEGLEN ;AN000;multiply SCB element length by
1489 ADD AX,VECOFFLEN ;AN000; desired vector number in BX
1490 MUL BX ;AN000; to determine offset into SCB vec
1491 ADD DI,AX ;AN000;add offset inside table
1492 MOV BX,ES:[DI] ;AN000;get actual SCB segment
1493 MOV CX,ES:[DI]+VECSEGLEN ;AN000;point past SCB seg to get SCB off
1494;
1495 MOV ES,BX ;AN000;set ES:DI to scroll's actual
1496 MOV DI,CX ;AN000; SCB address
1497;
1498 POP DX ;AN000;GHG
1499 POP CX ;AN000;
1500 POP BX ;AN000;
1501 POP AX ;AN000;
1502;
1503 RET ;AN000;
1504GET_SCB ENDP ;AN000;
1505;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1506;
1507; GET_ICB
1508;
1509; Get Input Control Block information.
1510;
1511; Entry: BX = Number of ICB vector desired.
1512;
1513; Exit: ES:DI = Address of ICB
1514;
1515;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1516GET_ICB PROC NEAR ;AN000;
1517 PUSH AX ;AN000;
1518 PUSH BX ;AN000;
1519 PUSH CX ;AN000;
1520 PUSH DX ;AN000;GHG
1521;
1522; read input control block vector to obtain ICB address
1523;
1524 PUSH WR_ICBVECSEG ;AN000;get beginning ICB vector address
1525 POP ES ;AN000;
1526 PUSH WR_ICBVECOFF ;AN000;
1527 POP DI ;AN000;
1528
1529 DEC BX ;AN000;make zero based
1530 MOV AX,VECSEGLEN ;AN000;multiply ICB element length by
1531 ADD AX,VECOFFLEN ;AN000; desired vector number in BX
1532 MUL BX ;AN000; to determine offset into ICB vec
1533 ADD DI,AX ;AN000;add offset inside table
1534 MOV BX,ES:[DI] ;AN000;get actual ICB segment
1535 MOV CX,ES:[DI]+VECSEGLEN ;AN000;point past ICB seg to get ICB off
1536
1537 MOV ES,BX ;AN000;set ES:DI to field's actual
1538 MOV DI,CX ;AN000; ICB address
1539
1540 POP DX ;AN000;GHG
1541 POP CX ;AN000;
1542 POP BX ;AN000;
1543 POP AX ;AN000;
1544 RET ;AN000;
1545GET_ICB ENDP ;AN000;
1546;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1547;
1548; REFRESH_FLDS
1549;
1550; Refresh specified input and scrolling fields in the logical video :
1551; buffer during screen build.
1552;
1553; Format = DW Panel control block number
1554; DW Number of fields in this record
1555; DW Object type ID
1556; DW Field ID
1557;
1558; DW Object type ID
1559; DW Field ID
1560;
1561; Entry: WR_REFNUM = Number of PCB entries
1562; WR_REFOFF = Offset of table
1563; WR_REFSEG = Segment of table
1564;
1565; PM_PANBRKID = Panel PCB number to refresh
1566;
1567; Exit: None
1568;
1569;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1570REFRESH_FLDS PROC NEAR ;AN000;
1571 PUSH AX ;AN000;save registers
1572 PUSH BX ;AN000;
1573 PUSH CX ;AN000;
1574 PUSH DX ;AN000;
1575 PUSH ES ;AN000;
1576 PUSH DI ;AN000;
1577;
1578; Initialize for table search
1579;
1580 MOV CX,WR_REFNUM ;AN000;get number of refresh table recs
1581 CMP CX,0 ;AN000;check the number of PCB entries
1582 JA RF10 ;AN000;
1583 JMP RFEXIT ;AN000;no records, exit
1584
1585RF10: PUSH WR_REFOFF ;AN000;get address of refresh table
1586 POP WR_REFCNT ;AN000;
1587
1588 PUSH WR_REFSEG ;AN000;
1589 POP ES ;AN000;
1590;
1591; Locate matching table and PCB break number
1592;
1593RF20: MOV DI,WR_REFCNT ;AN000;set beginning address of current
1594 ; table record
1595
1596 MOV AX,ES:[DI]+2 ;AN000;get number of fields in record
1597 MOV BX,4 ;AN000;4 bytes per field entry *
1598 MUL BX ;AN000; number of fields in this record
1599 ADD WR_REFCNT,AX ;AN000; + 4 bytes for the number of
1600 ADD WR_REFCNT,4 ;AN000; PCB bytes and the number of flds
1601
1602 MOV BX,PM_PANBRKID ;AN000;
1603 CMP BX,ES:[DI] ;AN000;check if PCB match to table rec
1604 JE RF30 ;AN000;
1605
1606 LOOP RF20 ;AN000;check next table record
1607 JMP RFEXIT ;AN000;no match, exit
1608;
1609; Match found, refresh all fields
1610;
1611RF30: MOV CX,ES:[DI]+2 ;AN000;get number of fields
1612
1613RF40: ADD DI,4 ;AN000;point to field data
1614 MOV AX,SCROLLOBJID ;AN000;check if scroll field
1615 CMP AX,ES:[DI] ;AN000;
1616 JNE RF50 ;AN000;
1617
1618 MOV BX,ES:[DI]+2 ;AN000;get field ID
1619 CALL REFRESH_SCB ;AN000;update logical video buffer
1620 JMP RF60 ;AN000;get next field entry
1621
1622RF50: MOV AX,INPUTOBJID ;AN000;check if input field
1623 CMP AX,ES:[DI] ;AN000;
1624 JNE RF60 ;AN000;
1625
1626 MOV BX,ES:[DI]+2 ;AN000;get field ID
1627 CALL REFRESH_ICB ;AN000;update logical video buffer
1628
1629RF60: LOOP RF40 ;AN000;get next field in same record
1630
1631RFEXIT: POP DI ;AN000;restore registers
1632 POP ES ;AN000;
1633 POP DX ;AN000;
1634 POP CX ;AN000;
1635 POP BX ;AN000;
1636 POP AX ;AN000;
1637
1638 RET ;AN000;
1639REFRESH_FLDS ENDP ;AN000;
1640;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1641;
1642; REFRESH_SCB
1643;
1644; Refresh scroll field in logic video buffer and exit.
1645;
1646; Entry: BX = Scroll ID field number
1647;
1648; Exit: None
1649;
1650;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1651REFRESH_SCB PROC NEAR ;AN000;
1652 PUSH ES ;AN000;save registers
1653 PUSH DI ;AN000;
1654
1655 CALL GET_SCB ;AN000;load SCB address
1656
1657 PUSH ES:[DI]+SCB_OPT1 ;AN000;save options
1658 PUSH ES:[DI]+SCB_OPT3 ;AN000;
1659
1660 OR ES:[DI]+SCB_OPT1,SCB_RD ;AN000;set display and exit option
1661 AND ES:[DI]+SCB_OPT1,NOT SCB_UKS;AN000;
1662 OR ES:[DI]+SCB_OPT3,SCB_LVBOVR;AN000;
1663
1664 PUSH PM_LVBOFF ;AN000;initialize logical video address
1665 POP ES:[DI]+SCB_LVBOFF ;AN000;
1666
1667 PUSH PM_LVBSEG ;AN000;
1668 POP ES:[DI]+SCB_LVBSEG ;AN000;
1669
1670 CALL PCSLCTP_CALL ;AN000;refresh logical video buffer
1671
1672 POP ES:[DI]+SCB_OPT3 ;AN000;restore option
1673 POP ES:[DI]+SCB_OPT1 ;AN000;
1674
1675RSEXIT: POP DI ;AN000;restore registers
1676 POP ES ;AN000;
1677
1678 RET ;AN000;
1679REFRESH_SCB ENDP ;AN000;
1680;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1681;
1682; REFRESH_ICB
1683;
1684; Refresh input field in logic video buffer and exit.
1685;
1686; Entry: BX = Input ID field number
1687;
1688; Exit: None
1689;
1690;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1691REFRESH_ICB PROC NEAR ;AN000;
1692 PUSH AX ;AN000;
1693 PUSH ES ;AN000;save registers
1694 PUSH DI ;AN000;
1695 PUSH IN_ICBID ;AN000;
1696 ;
1697 MOV IN_ICBID,BX ;AN000;
1698 CALL GET_ICB ;AN000;load ICB address
1699 ;
1700 CMP ES:[DI]+ICB_FIELDLEN ,0;AN000;
1701 CMP ES:[DI]+ICB_FIELDOFF ,0;AN000;
1702 CMP ES:[DI]+ICB_FIELDSEG ,0;AN000;
1703 CMP ES:[DI]+ICB_DEFLEN ,0;AN000;
1704 CMP ES:[DI]+ICB_DEFOFF ,0;AN000;
1705 CMP ES:[DI]+ICB_DEFSEG ,0;AN000;
1706
1707 PUSH IN_OPT ;AN000;
1708 PUSH ES:[DI]+ICB_OPT1 ;AN000;
1709 OR ES:[DI]+ICB_OPT1,ICB_OUT;AN000;
1710 OR IN_OPT,IN_LVBOV ;AN000;
1711 ;
1712 PUSH PM_LVBOFF ;AN000;initialize logical video address
1713 POP IN_LVBOFF ;AN000;
1714 ;
1715 PUSH PM_LVBSEG ;AN000;
1716 POP IN_LVBSEG ;AN000;
1717 ;
1718 CALL PCINPUT_CALL ;AN000;
1719 ;
1720 POP ES:[DI]+ICB_OPT1 ;AN000;
1721 POP IN_OPT ;AN000;
1722 CALL CURSOROFF ;AN000;
1723 ;
1724 POP IN_ICBID ;AN000;
1725 POP DI ;AN000;restore registers
1726 POP ES ;AN000;
1727 POP AX ;AN000;
1728 RET ;AN000;
1729REFRESH_ICB ENDP ;AN000;
1730;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1731;
1732; CURSOROFF
1733;
1734; Deactivates cursor from display.
1735;
1736; Entry: None
1737;
1738; Exit: None
1739;
1740;;;;;;;;;;;;;;;;;;;;;;;;;
1741CURSOROFF PROC NEAR ;AN000;
1742 PUSH AX ;AN000;save registers
1743 PUSH BX ;AN000;
1744 PUSH CX ;AN000;
1745 ;
1746 MOV AH,3 ;AN000;function to get cursor info
1747 MOV BH,0 ;AN000;page zero
1748 INT 10H ;AN000;
1749 OR CH,20H ;AN000;set bit 6
1750 MOV AH,1 ;AN000;function to set cursor
1751 INT 10H ;AN000;
1752 ;
1753 POP CX ;AN000;restore registers
1754 POP BX ;AN000;
1755 POP AX ;AN000;
1756 RET ;AN000;
1757CURSOROFF ENDP ;AN000;
1758;;;;;;;;;;;;;;;;;;;;;;;;;
1759;
1760; CURSORON
1761;
1762; Activates cursor display on screen.
1763;
1764; Entry: None
1765;
1766; Exit: None
1767;
1768;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1769CURSORON PROC NEAR ;AN000;
1770 PUSH AX ;AN000;save registers
1771 PUSH BX ;AN000;
1772 PUSH CX ;AN000;
1773 ;
1774 MOV AH,3 ;AN000;function to get cursor info
1775 MOV BH,0 ;AN000;page zero
1776 INT 10H ;AN000;
1777 AND CH,NOT 20H ;AN000;clear bit 6
1778 MOV AH,1 ;AN000;function to set cursor
1779 INT 10H ;AN000;
1780 ;
1781 POP CX ;AN000;restore registers
1782 POP BX ;AN000;
1783 POP AX ;AN000;
1784 ;
1785 RET ;AN000;
1786CURSORON ENDP ;AN000;
1787;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1788;
1789; PCINCHA_CALL
1790;
1791; Call to PCINCHA.
1792;
1793; Entry: PB initialized.
1794;
1795; Exit: None
1796;
1797;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1798PCINCHA_CALL PROC NEAR ;AN000;
1799 ;
1800 CALL CLEAR_INBUFF ;AN088;SEH this call was moved and now replaced to exist both before and after call
1801 ;
1802 PUSH DS ;AN000;set segment
1803 POP ES ;AN000;
1804 PUSH DS ;AN000;
1805 PUSH DI ;AN000;save registers
1806 LEA DI,INC_OPT ;AN000;set DI to proper parameter block
1807 ; for call
1808IF CASRM ;AN000;
1809 MOV AH,00H ;AN000;make call to CAS-RM
1810 MOV BX,INC_RN ;AN000;set CAS routine number
1811 INT CASINT ;AN000;call routine
1812ELSE ;AN000;
1813 CALL INCHA ;AN000;
1814 CALL CLEAR_INBUFF ;AC083;SEH call moved to after call to INCHA in order to flush buffer ;AN059;
1815ENDIF ;AN000;
1816 POP DI ;AN000;restore registers
1817 POP DS ;AN000;
1818 RET ;AN000;
1819PCINCHA_CALL ENDP ;AN000;
1820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1821;
1822; PCDISPQ_CALL
1823;
1824; Call to PCDISPQ.
1825;
1826; Entry: PB initialized.
1827;
1828; Exit: None
1829;
1830;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1831PCDISPQ_CALL PROC NEAR ;AN000;
1832 PUSH DS ;AN000;set segment
1833 POP ES ;AN000;
1834 PUSH DS ;AN000;
1835 PUSH DI ;AN000;save registers
1836 LEA DI,QM_OPT1 ;AN000;set DI to proper parameter block
1837IF CASRM ;AN000;
1838 MOV AH,00H ;AN000;make call to CAS-RM
1839 MOV BX,QM_RN ;AN000;set CAS routine number
1840 INT CASINT ;AN000;call routine
1841ELSE ;AN000;
1842 CALL DISPQ ;AN000;
1843ENDIF ;AN000;
1844 POP DI ;AN000;restore registers
1845 POP DS ;AN000;
1846 RET ;AN000;
1847PCDISPQ_CALL ENDP ;AN000;
1848;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1849;
1850; PCPANEL_CALL
1851;
1852; Initialize for call to PCPANEL including refresh of input and
1853; scroll fields in the logical video buffer before display.
1854;
1855; Entry: PB initialized.
1856;
1857; Exit: None
1858;
1859;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1860PCPANEL_CALL PROC NEAR ;AN000;
1861 PUSH QM_PANQUENUM ;AN000;
1862 POP PM_PANQUENUM ;AN000;number of panels in parent queue
1863 ;
1864 PUSH QM_CHDQUENUM ;AN000;
1865 POP PM_CHDQUENUM ;AN000;number panels in child queue
1866 ;
1867 PUSH QM_ACTIVEPAN ;AN000;
1868 POP PM_ACTIVEPAN ;AN000;active parent panel number
1869 ;
1870 MOV BX,PM_DOA ;AN000;display child panels in active
1871 OR BX,PM_DOV ;AN000;use child row, col, color overrid
1872 OR BX,PM_DOQ ;AN000;display childs in active parent
1873 OR BX,PM_CL ;AN000;initialize LVB to base char/attr
1874 ;
1875 CMP AX,1 ;AN000;check if break option is on
1876 JNE PP05 ;AN000;
1877 ;
1878 CMP WR_REFIELDCNT,0 ;AN000;GHG
1879 JNE PP06 ;AN000;GHG
1880 XOR AX,AX ;AN000;GHG
1881 JMP PP05 ;AN000;GHG
1882 ;
1883PP06: OR BX,PM_BK ;AN000;set panel manager break option on
1884 ;
1885PP05: MOV PM_OPT1,BX ;AN000;set options
1886 MOV PM_PANPDQNUM,1 ;AN000;beg/ending parent PDQ number
1887 MOV PM_PANBRKOFF,0 ;AN000;panel off in lvb of break panel
1888 JMP PP20 ;AN000;begin update
1889 ;set options to continue panel break
1890PP10: AND PM_OPT1,NOT PM_CL ;AN000;turn init LVB base char/attr off
1891 ;do Actual PCPANEL call
1892PP20: PUSH DS ;AN000;set segment
1893 POP ES ;AN000;
1894 PUSH DS ;AN000;
1895 PUSH DI ;AN000;save registers
1896 LEA DI,PM_OPT1 ;AN000;set DI to proper parameter block
1897IF CASRM ;AN000;
1898 MOV AH,00H ;AN000;make call to CAS-RM
1899 MOV BX,PM_RN ;AN000;set CAS routine number
1900 INT CASINT ;AN000;call routine
1901ELSE ;AN000;
1902 CALL PANEL ;AN000;
1903ENDIF ;AN000;
1904 POP DI ;AN000;restore registers
1905 POP DS ;AN000;
1906 ;
1907 CMP AX,1 ;AN000;check if the break option is
1908 JNE PPEXIT ;AN000; active
1909 ;
1910 MOV AX,PM_PANPDQNUM ;AN000;beg/ending parent PDQ number
1911 DEC AX ;AN000;adjust for possible break option
1912 ; on last panel in PDQ
1913 CMP AX,PM_PANQUENUM ;AN000;check if all panels updated
1914 JA PPEXIT ;AN000; when complete var is 1 greater
1915 ;
1916 CALL REFRESH_FLDS ;AN000;refresh fields in break panel
1917 JMP PP10 ;AN000;continue to process panels
1918PPEXIT: RET ;AN000;
1919PCPANEL_CALL ENDP ;AN000;
1920;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1921;
1922; PCMBEEP_CALL
1923;
1924; Call to PCMBEEP.
1925;
1926; Entry: PB initialized.
1927;
1928; Exit: None
1929;
1930;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1931PCMBEEP_CALL PROC NEAR ;AN000;
1932 PUSH DS ;AN000;set segment
1933 POP ES ;AN000;
1934 PUSH DS ;AN000;
1935 PUSH DI ;AN000;save registers
1936 LEA DI,MB_FREQUENCY ;AN000;set DI to proper parameter block
1937IF CASRM ;AN000;
1938 MOV AH,00H ;AN000;make call to CAS-RM
1939 MOV BX,MB_RN ;AN000;set CAS routine number
1940 INT CASINT ;AN000;call routine
1941ELSE ;AN000;
1942 CALL MBEEP ;AN000;
1943ENDIF ;AN000;
1944 POP DI ;AN000;restore registers
1945 POP DS ;AN000;
1946 RET ;AN000;
1947PCMBEEP_CALL ENDP ;AN000;
1948;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1949;
1950; PCSLCTP_CALL
1951;
1952; Call to PCSCLTP.
1953;
1954; Entry: ES:DI = beginning address of PCSLCTP parameter block.
1955;
1956; Exit: None
1957;
1958;
1959; Initialize color index vector
1960;
1961;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1962PCSLCTP_CALL PROC NEAR ;AN000;
1963 ;
1964 CALL CLEAR_INBUFF ;AN059;
1965 ;
1966 PUSH PM_CCBVECNUM ;AN000;set color index number
1967 POP ES:[DI]+SCB_CCBVECNUM;AN000;
1968
1969 PUSH CRD_CCBVECOFF ;AN000;set color index offset
1970 POP ES:[DI]+SCB_CCBVECOFF;AN000;
1971
1972 PUSH CRD_CCBVECSEG ;AN000;set color index segment
1973 POP ES:[DI]+SCB_CCBVECSEG;AN000;
1974
1975 PUSH ES:[DI]+SCB_OPT1 ;AN000;
1976 PUSH ES:[DI]+SCB_OPT2 ;AN000;
1977 PUSH ES:[DI]+SCB_OPT3 ;AN000;
1978 PUSH ES:[DI]+SCB_NUMLINE ;AN000;
1979 AND ES:[DI]+SCB_OPT3,NOT SCB_NUMS;AN000;
1980IF CASRM ;AN000;
1981 MOV AH,00H ;AN000;make call to CAS-RM
1982 MOV BX,SCB_RN ;AN000;set CAS routine number
1983 INT CASINT ;AN000;call slctopt
1984ELSE ;AN000;
1985 CALL SLCTP ;AN000;
1986ENDIF ;AN000;
1987 POP ES:[DI]+SCB_NUMLINE ;AN000;
1988 POP ES:[DI]+SCB_OPT3 ;AN000;
1989 POP ES:[DI]+SCB_OPT2 ;AN000;
1990 POP ES:[DI]+SCB_OPT1 ;AN000;
1991 RET ;AN000;
1992PCSLCTP_CALL ENDP ;AN000;
1993;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1994;
1995; PCHLPRD_CALL
1996;
1997; Call to PCHLPRD.
1998;
1999; Entry: PB initialized.
2000;
2001; Exit: None
2002;
2003;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2004PCHLPRD_CALL PROC NEAR ;AN000;
2005 PUSH DS ;AN000;set segment
2006 POP ES ;AN000;
2007 PUSH DS ;AN000;
2008 PUSH DI ;AN000;save registers
2009 LEA DI,HRD_OPT1 ;;AN000;set DI to proper parameter block
2010IF CASRM ;AN000;
2011 MOV AH,00H ;AN000;make call to CAS-RM
2012 MOV BX,HRD_RN ;AN000;set CAS routine number
2013 INT CASINT ;AN000;call routine
2014ELSE ;AN000;
2015 CALL HLPRD ;AN000;
2016ENDIF ;AN000;
2017 .IF < HRD_ERROR eq 0 > and;AN005;GHG
2018 .IF < HRD_DOSERROR eq 0 > ;AN005;GHG
2019 CLC ;AN005;GHG
2020 .ELSE ;AN005;GHG
2021 STC ;AN005;GHG
2022 .ENDIF ;AN005;GHG
2023 ;
2024 POP DI ;AN000;restore registers
2025 POP DS ;AN000;
2026 RET ;AN000;
2027PCHLPRD_CALL ENDP ;AN000;
2028;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2029;
2030; PCINSTR_CALL
2031;
2032; Call to PCINSTR.
2033;
2034; Entry: PB initialized.
2035;
2036; Exit: None
2037;
2038;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2039PCINSTR_CALL PROC NEAR ;AN000;
2040 PUSH DS ;AN000;set segment
2041 POP ES ;AN000;
2042 PUSH DS ;AN000;
2043 PUSH DI ;AN000;save registers
2044 LEA DI,INS_OPT ;;AN000;set DI to proper parameter block
2045IF CASRM ;AN000;
2046 MOV AH,00H ;AN000;make call to CAS-RM
2047 MOV BX,INS_RN ;AN000;set CAS routine number
2048 INT CASINT ;AN000;call routine
2049ELSE ;AN000;
2050 CALL INSTRN ;AN000;
2051ENDIF ;AN000;
2052 POP DI ;AN000;restore registers
2053 POP DS ;AN000;
2054 RET ;AN000;
2055PCINSTR_CALL ENDP ;AN000;
2056;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2057;
2058; PCINPUT_CALL
2059;
2060; Call to PCINPUT.
2061;
2062; Entry: PB initialized.
2063;
2064; Exit: None
2065;
2066;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2067PCINPUT_CALL PROC NEAR ;AN000;
2068 ;
2069 CALL CLEAR_INBUFF ;AN059;
2070 ;
2071 PUSH DS ;AN000;set segment
2072 POP ES ;AN000;
2073 PUSH DS ;AN000;
2074 PUSH DI ;AN000;save registers
2075 LEA DI,IN_OPT ;AN000;set DI to proper parameter block
2076IF CASRM ;AN000;
2077 MOV AH,00H ;AN000;make call to CAS-RM
2078 MOV BX,IN_RN ;AN000;set CAS routine number
2079 INT CASINT ;AN000;call slctopt
2080ELSE ;AN000;
2081 CALL INPUT ;AN000;
2082ENDIF ;AN000;
2083 POP DI ;AN000;restore registers
2084 POP DS ;AN000;
2085 RET ;AN000;
2086PCINPUT_CALL ENDP ;AN000;
2087;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2088;
2089; PCGVIDO_CALL
2090;
2091; Call to PCGVIDO.
2092;
2093; Entry: PB initialized.
2094;
2095; Exit: None
2096;
2097;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2098PCGVIDO_CALL PROC NEAR ;AN000;
2099 PUSH DS ;AN000;set segment
2100 POP ES ;AN000;
2101 PUSH DS ;AN000;
2102 PUSH DI ;AN000;save registers
2103 LEA DI,GV_STAT1 ;AN000;set DI to proper parameter block
2104IF CASRM ;AN000;
2105 MOV AH,00H ;AN000;make call to CAS-RM
2106 MOV BX,GV_RN ;AN000;set CAS routine number
2107 INT CASINT ;AN000;call routine
2108ELSE ;AN000;
2109 CALL GVIDO ;AN000;
2110ENDIF ;AN000;
2111 POP DI ;AN000;restore registers
2112 POP DS ;AN000;
2113 RET ;AN000;
2114PCGVIDO_CALL ENDP ;AN000;
2115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2116;
2117; PCWWRAP_CALL
2118;
2119; Call to PCWWRAP.
2120;
2121; Entry: PB initialized.
2122;
2123; Exit: None
2124;
2125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2126PCWWRAP_CALL PROC NEAR ;AN000;
2127 PUSH DS ;AN000;set segment
2128 POP ES ;AN000;
2129 PUSH DS ;AN000;
2130 PUSH DI ;AN000;save registers
2131 LEA DI,WWP_OPT1 ;AN000;set DI to proper parameter block
2132IF CASRM ;AN000;
2133 MOV AH,00H ;AN000;make call to CAS-RM
2134 MOV BX,PM_RN ;AN000;set CAS routine number
2135 INT CASINT ;AN000;call slctopt
2136ELSE ;AN000;
2137 CALL WWRAP ;AN000;
2138ENDIF ;AN000;
2139 POP DI ;AN000;restore registers
2140 POP DS ;AN000;
2141 RET ;AN000;
2142PCWWRAP_CALL ENDP ;AN000;
2143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2144;
2145;
2146; INITIALIZE
2147;
2148; Initialize the DOS allocated buffer with data (color, panels
2149; scrolling fields) and reserve room for help, queue management
2150; and the logical video buffer.
2151;
2152; Entry: WR_DATA2LEN = Length of DOS allocated buffer
2153; WR_DATA2OFF = Offset of DOS allocated buffer
2154; WR_DATA2SEG = Segment of DOS allocated buffer
2155;
2156; Exit: CY=0 and WR_ERROR = 0, No error occurred, 1= error occurred
2157; WR_DATA2LEN = Amount of DOS allocated buffer remaining
2158; WR_DATA2OFF = New offset of DOS allocated buffer
2159;
2160; ELSE
2161; CY=1 and WR_ERROR = 1, Error occurred (WR_DATA2LEN/OFF are invalid)
2162;
2163; CY support added
2164;
2165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2166INITIALIZE PROC NEAR ;AN000;
2167 ;AN000;
2168 PUSH ES ;AN000;
2169 PUSH DI ;AN000;
2170 PUSH DS ;AN000;
2171 PUSH SI ;AN000;
2172 ;AN000;
2173 MOV WR_ERROR,0 ;AN000;reset error inidicator
2174 ;
2175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2176;
2177; Read Compressed Panel file
2178;
2179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2180 ;
2181 MOV DX,OFFSET CFILE ;AN024;filename to read , SELECT.DAT
2182 XOR AL,AL ;AN024;
2183 MOV AH,3DH ;AN024;
2184 INT 21H ;AN024;open file
2185 ;AN024;
2186 MOV BX,AX ;AN024;get file handle
2187 PUSH BX ;AN024;save it
2188 XOR CX,CX ;AN024;
2189 XOR DX,DX ;AN024;
2190 MOV AL,2 ;AN024;move ptr to end of file
2191 MOV AH,42H ;AN024;LSEEK
2192 INT 21H ;AN024;
2193 ;AN024;
2194 PUSH AX ;AN024;save length
2195 XOR CX,CX ;AN024;zero file offset
2196 XOR DX,DX ;AN024; "
2197 MOV AL,0 ;AN024;move ptr to start of file
2198 MOV AH,42H ;AN024;LSEEK
2199 INT 21H ;AN024;
2200 POP BX ;AN024;restore length
2201 PUSH BX ;AN024;save it again
2202 SHR BX,1 ;AN024;convert to paragraph
2203 SHR BX,1 ;AN024;
2204 SHR BX,1 ;AN024;
2205 SHR BX,1 ;AN024;
2206 INC BX ;AN024;ensure enough room
2207 MOV AX,BX ;AN024;
2208 ;AN024;
2209 POP CX ;AN024;restore length
2210 POP BX ;AN024;restore file handle
2211
2212 MOV DX,WR_DATA2SEG ;AN024;GS:DI = target
2213 ADD DX,MAX_MEMPAR ;AN024;
2214 SUB DX,AX ;AN024;
2215 MOV DS,DX ;AN024;get segment of read buffer
2216 XOR DX,DX ;AN024;get offset to read into
2217 MOV AH,3FH ;AN024;read it
2218 INT 21H ;AN024;
2219 ;AN024;
2220 MOV AH,3EH ;AN024;close it
2221 INT 21H ;AN024;
2222 ;AN024;
2223 PUSH DS ;AN024;save source segment
2224 MOV AX,DATA ;AN024;
2225 MOV DS,AX ;AN024;get DATA segment
2226 MOV AX,WR_DATA2SEG ;AN024;ES:DI = target
2227 MOV ES,AX ;AN024;
2228 MOV DI,WR_DATA2OFF ;AN024;
2229 POP DS ;AN024;restore source segment
2230 XOR SI,SI ;AN024;offset is zero
2231 ;
2232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2233;
2234; Expand Panel file
2235;
2236;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2237 ;
2238 MOV DX,0 ;AN024;initialize result string
2239EC1: CMP CX,0 ;AN024;any characters left?
2240 JNE EC2 ;AN024;yes
2241 JMP DONE1 ;AN024;no
2242 ;AN024;
2243EC2: LODSB ;AN024;get character
2244 DEC CX ;AN024;adjust character count
2245 MOV BL,1 ;AN024;set default repeat
2246 CMP AL,REPCHAR ;AN024;is it a repeat character
2247 JNE EC4 ;AN024;no
2248 ;AN024;
2249 CMP CX,0 ;AN024;any characters left?
2250 JNE EC2_4 ;AN024;
2251 JMP DONE1 ;AN024;no
2252 ;AN024;
2253EC2_4: LODSB ;AN024;get number of characters
2254 DEC CX ;AN024;Adjust character count
2255 CMP AL,REPCHAR ;AN024;is it still the repeat character
2256 JNE EC2_1 ;AN024;no
2257 JMP EC4 ;AN024;
2258 ;AN024;
2259EC2_1: CMP AL,1 ;AN024;code <CR>?
2260 JNE EC2_2 ;AN024;no
2261 ;AN024;
2262 MOV AL,13 ;AN024;
2263 JMP EC4 ;AN024;
2264 ;AN024;
2265EC2_2: CMP AL,2 ;AN024;code <EOF>?
2266 JNE EC3 ;AN024;no
2267 ;AN024;
2268 MOV AL,26 ;AN024;
2269 JMP EC4 ;AN024;
2270 ;AN024;
2271EC3: MOV BL,AL ;AN024;save number of repeats
2272 ;AN024;
2273 CMP CX,0 ;AN024;any characters left?
2274 JNE EC3_6 ;AN024;
2275 JMP DONE1 ;AN024;no
2276 ;AN024;
2277EC3_6: LODSB ;AN024;get actual character
2278 DEC CX ;AN024;adjust character count
2279 CMP AL,REPCHAR ;AN024;coded character?
2280 JNE EC4 ;AN024;no
2281 ;AN024;
2282 CMP CX,0 ;AN024;any characters left?
2283 JNE EC3_8 ;AN024;
2284 JMP DONE1 ;AN024;no
2285 ;AN024;
2286EC3_8: LODSB ;AN024;yes
2287 DEC CX ;AN024;adjust character count
2288 CMP AL,REPCHAR ;AN024;coded repchar?
2289 JE EC4 ;AN024;yes
2290 ;AN024;
2291 CMP AL,1 ;AN024;coded <CR>?
2292 JNE EC3_1 ;AN024;no
2293 ;AN024;
2294 MOV AL,13 ;AN024;yes
2295 JMP EC4 ;AN024;
2296 ;AN024;
2297EC3_1: CMP AL,2 ;AN024;coded <EOF>?
2298 JNE EC3_2 ;AN024;no
2299 ;AN024;
2300 MOV AL,26 ;AN024;
2301 JMP EC4 ;AN024;
2302 ;AN024;
2303EC3_2: INC CX ;AN024;unknown, restore
2304 DEC SI ;AN024;
2305 MOV AL,REPCHAR ;AN024;
2306 ;AN024;
2307EC4: ADD DL,BL ;AN024;adjust length
2308 ADC DH,0 ;AN024;
2309 ;AN024;
2310EC7: PUSH CX ;AN024;save CX
2311 XOR CX,CX ;AN024;zero CX
2312 MOV CL,BL ;AN024;set repeat number
2313 ;AN024;
2314EC8: REP STOSB ;AN024;store char
2315 POP CX ;AN024;recover CX
2316 JMP EC1 ;AN024;
2317 ;
2318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2319;
2320; Finished expanding panel file
2321;
2322;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2323 ;
2324DONE1: ;AN024;
2325 MOV AX,DATA ;AN024;restore DATA segment
2326 MOV DS,AX ;AN024;
2327 ;AN024;
2328 MOV DI,WR_DATA2OFF ;AN024;restore pointer to start
2329 ADD DX,16 ;AN024;add paragraph to expanded length
2330 ADD WR_DATA2OFF,DX ;AN024;save new available offset
2331 ;AN024;
2332 MOV AX,WR_DATA2LEN ;AN024;calculate remaining buffer space
2333 SUB AX,DX ;AN024; from required space
2334 MOV WR_DATA2LEN,AX ;AN024;set remaining space
2335 ;
2336;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2337;
2338; initialize Color Table information
2339;
2340;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2341 ;
2342 .IF < GV_VIDMODE eq 7 > or ;AN000;
2343 .IF < ACTIVE eq LCD > ;AN000;
2344 .THEN ;AN000;
2345 MOV AX,ES:[DI].MONTBL ;AN000;
2346 MOV BX,ES:[DI].NMONTBL ;AN000;
2347 .ELSE ;AN000;
2348 MOV AX,ES:[DI].COLTBL ;AN000;
2349 MOV BX,ES:[DI].NCOLTBL ;AN000;
2350 .ENDIF ;AN000;
2351 ;AN000;
2352 MOV PM_CCBVECNUM,BX ;AN000;
2353 MOV PM_CCBVECOFF,AX ;AN000;set color index offset to PCPANEL
2354 MOV CRD_CCBVECOFF,AX ;AN000;set color index offset to PCPANEL
2355 MOV AX,ES ;AN000;set color index segment to
2356 MOV PM_CCBVECSEG,AX ;AN000; PCPANEL
2357 MOV CRD_CCBVECSEG,AX ;AN000; PCPANEL
2358 ;
2359;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2360;
2361; initialize PCDISPQ information
2362;
2363;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2364 ;
2365 MOV AX,ES:[DI].NPCBS ;AN000;
2366 MOV QM_PCBVECNUM,AX ;AN000;number of PCB elements in vector
2367 ;AN000;
2368 MOV AX,ES:[DI].PCBS ;AN000;
2369 MOV QM_PCBVECOFF,AX ;AN000;offset of PCB vector
2370 ;AN000;
2371 MOV AX,ES ;AN000;
2372 MOV QM_PCBVECSEG,AX ;AN000;segment of PCB vector
2373 ;
2374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2375;
2376; initialize PCPANEL with PCDISPQ and PCPANRD information
2377;
2378;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2379 ;
2380 MOV SI,ES:[DI].PCBS ;AN000;offset of PCB vector read from
2381 MOV PM_PCBVECOFF,SI ;AN000; disk
2382 ;AN000;
2383 MOV AX,ES ;AN000;segment of PCB vector read from
2384 MOV PM_PCBVECSEG,AX ;AN000; disk
2385 ;AN000;
2386 MOV CX,ES:[DI].NPCBS ;AN000;number of PCB vectors read from
2387 MOV PM_PCBVECNUM,CX ;AN000; disk
2388 ;
2389;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2390;
2391; add segment address to PCBs
2392;
2393;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2394 ;
2395 ADD SI,2 ;AN000;move to offset
2396I_PCB_SEG: ;AN000;
2397 MOV BX,ES:[SI] ;AN000;
2398 MOV ES:[BX].PCB_EXPANDSEG,AX ;AN000;
2399 MOV ES:[BX].PCB_CHILDSEG,AX ;AN000;
2400 ADD SI,4 ;AN000;
2401 LOOP I_PCB_SEG ;AN000;
2402 ;
2403;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2404;
2405; add segment address to PCB vectors
2406;
2407;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2408 ;
2409 MOV CX,ES:[DI].NPCBS ;AN000;number of PCB vectors
2410 MOV SI,ES:[DI].PCBS ;AN000;offset of PCB vectors
2411I_PCBVEC_SEG: ;AN000;
2412 MOV ES:[SI],AX ;AN000;
2413 ADD SI,4 ;AN000;
2414 LOOP I_PCBVEC_SEG ;AN000;
2415 ;
2416;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2417;
2418; initialize SCB vector table pointer
2419;
2420;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2421 ;
2422 MOV AX,ES ;AN000;
2423 MOV SRD_SCBVECSEG,AX ;AN000;get beginning SCB vector address
2424 MOV SI,ES:[DI].SCBS ;AN000;
2425 MOV SRD_SCBVECOFF,SI ;AN000;
2426 MOV CX,ES:[DI].NSCBS ;AN000;number of SCB vectors
2427 ;
2428;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2429;
2430; add segment address to SCBs
2431;
2432;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2433 ;
2434 ADD SI,2 ;AN000;move to offset
2435 ;AN000;
2436I_SCB_SEG: ;AN000;
2437 MOV BX,ES:[SI] ;AN000;
2438 MOV ES:[BX].SCB_UASEG,AX ;AN000;
2439 MOV ES:[BX].SCB_DASEG,AX ;AN000;
2440 MOV ES:[BX].SCB_PUSEG,AX ;AN000;
2441 MOV ES:[BX].SCB_PDSEG,AX ;AN000;
2442 MOV ES:[BX].SCB_PISEG,AX ;AN000;
2443 MOV ES:[BX].SCB_AISEG,AX ;AN000;
2444 MOV ES:[BX].SCB_CISEG,AX ;AN000;
2445 MOV ES:[BX].SCB_UISEG,AX ;AN000;
2446 MOV ES:[BX].SCB_DISEG,AX ;AN000;
2447 MOV ES:[BX].SCB_INDEXSEG,AX ;AN000;
2448 MOV ES:[BX].SCB_SELSEG,AX ;AN000;
2449 MOV ES:[BX].SCB_OAPSEG,AX ;AN000;
2450 MOV ES:[BX].SCB_OASSEG,AX ;AN000;
2451 ADD SI,4 ;AN000;
2452 LOOP I_SCB_SEG ;AN000;
2453 ;
2454;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2455;
2456; add segment address to SCB vectors
2457;
2458;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2459 ;
2460 MOV CX,ES:[DI].NSCBS ;AN000;number of SCB vectors
2461 MOV SI,ES:[DI].SCBS ;AN000;offset of SCB vectors
2462I_SCBVEC_SEG: ;AN000;
2463 MOV ES:[SI],AX ;AN000;
2464 ADD SI,4 ;AN000;
2465 LOOP I_SCBVEC_SEG ;AN000;
2466 ;
2467;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2468;
2469; Init 4KB for logical video buffer for PCPANEL
2470;
2471;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2472 ;
2473 ;AN000;
2474 MOV AX,GV_SCRWIDTH ;AN000;
2475 MOV PM_LVBWIDTH,AX ;AN000;width of log vid buf in bytes
2476 ;AN000;
2477 MOV AX,GV_SCRLEN ;AN000;
2478 MOV PM_LVBLEN,AX ;AN000;number bytes in logical video
2479 ;AN000;
2480 PUSH WR_LVBOFF ;AN000;
2481 POP PM_LVBOFF ;AN000;offset of logical video buffer
2482 ;AN000;
2483 PUSH WR_LVBSEG ;AN000;set the allocated segment
2484 POP PM_LVBSEG ;AN000;
2485 ;AN000;
2486 MOV AX,WR_LVBLEN ;AN000;calculate remaining buffer
2487 SUB AX,GV_SCRLEN ;AN000;
2488 MOV WR_LVBLEN,AX ;AN000;set remaining space
2489 ;AN000;
2490 MOV AX,GV_SCRLEN ;AN000;
2491 ADD WR_LVBOFF,AX ;AN000;set new free buffer offset
2492 ;AN000;
2493 MOV LVB_INITED,TRUE ;AN000;LVB always remains
2494 ;
2495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2496;
2497; PCDISPQ buffer initialization option
2498;
2499;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2500 ;
2501 MOV QM_OPT1,QM_INIT ;AN000;Initialize working buffer
2502 ;AN000;
2503 PUSH WR_MAXCHDQUE ;AN000;
2504 POP QM_MAXCHDQUE ;AN000;max # of child queues to save
2505 ;AN000;
2506 PUSH WR_MAXPANQUE ;AN000;
2507 POP QM_MAXPANQUE ;AN000;max # of panel queues to save
2508 ;AN000;
2509 PUSH WR_MAXNUMCHD ;AN000;
2510 POP QM_MAXNUMCHD ;AN000;max # of parent panels queued
2511 ;AN000;
2512 PUSH WR_MAXNUMPAN ;AN000;
2513 POP QM_MAXNUMPAN ;AN000;max # of child panels queued
2514 ;AN000;
2515 PUSH WR_LVBLEN ;AN000;
2516 POP QM_BUFLEN ;AN000;length of avail buffer
2517 ;AN000;
2518 PUSH WR_LVBOFF ;AN000;
2519 POP QM_BUFOFF ;AN000;offset of buffer
2520 ;AN000;
2521 PUSH WR_LVBSEG ;AN000;
2522 POP QM_BUFSEG ;AN000;segment of buffer
2523 ;AN000;
2524 CALL PCDISPQ_CALL ;AN000;update display queue
2525 ;AN000;
2526 MOV AX,WR_LVBLEN ;AN000;calculate remaining buffer space
2527 SUB AX,QM_BUFLEN ;AN000; from required space
2528 MOV WR_LVBLEN,AX ;AN000;set remaining space
2529 ;AN000;
2530 MOV AX,QM_BUFLEN ;AN000;add returned buffer size
2531 ADD WR_LVBOFF,AX ;AN000;set new free buffer offset
2532 ;AN000;
2533 PUSH QM_PANQUEOFF ;AN000;offset address of parent queue
2534 POP PM_PANQUEOFF ;AN000;offset address of parent queue
2535 ;AN000;
2536 PUSH QM_PANQUESEG ;AN000;segment address of parent queue
2537 POP PM_PANQUESEG ;AN000;segment address of parent queue
2538 ;AN000;
2539 PUSH QM_CHDQUEOFF ;AN000;offset of child queue
2540 POP PM_CHDQUEOFF ;AN000;offset of child queue
2541 ;AN000;
2542 PUSH QM_CHDQUESEG ;AN000;segment of child queue
2543 POP PM_CHDQUESEG ;AN000;segment of child queue
2544 ;
2545;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2546;
2547; Reserve buffer for completed return key buffer
2548;
2549;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2550 ;
2551 PUSH WR_MAXRETKSZ ;AN000;maximum number of bytes in return
2552 POP WR_CRETLEN ;AN000; buffer
2553 ;AN000;
2554 PUSH WR_LVBOFF ;AN000;offset of completed return buffer
2555 POP WR_CRETOFF ;AN000;
2556 ;AN000;
2557 PUSH WR_LVBSEG ;AN000;segment of completed return
2558 POP WR_CRETSEG ;AN000; buffer
2559 ;AN000;
2560 MOV AX,WR_LVBLEN ;AN000;calculate remaining buffer space
2561 SUB AX,WR_MAXRETKSZ ;AN000;
2562 MOV WR_LVBLEN,AX ;AN000;set remaining space
2563 ;AN000;
2564 MOV AX,WR_MAXRETKSZ ;AN000;
2565 ADD WR_LVBOFF,AX ;AN000;set new free buffer offset
2566 CLC ;AN000;GHG
2567 JMP IEXIT ;AN000;
2568 ;AN000;
2569I110: MOV WR_ERROR,1 ;AN000;set error indicator
2570 STC ;AN000;GHG
2571IEXIT: ;AN000;exit
2572 POP SI ;AN000;
2573 POP DS ;AN000;
2574 POP DI ;AN000;
2575 POP ES ;AN000;
2576 RET ;AN000;
2577INITIALIZE ENDP ;AN000;
2578;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2579;
2580; INSERT_DISK_ROUTINE: Prompts user for insertion of disk into A: drive
2581;
2582; INPUT: DISK_PANEL - Panel number to be displayed
2583; SEARCH_FILE - File to search for on diskette
2584;
2585; OUTPUT: none
2586;
2587; OPERATION: Panel macros are called to display the panel and search
2588; for the file.
2589;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2590PUBLIC INSERT_DISK_ROUTINE ;AN000;
2591INSERT_DISK_ROUTINE PROC NEAR ;AN000;
2592 ;
2593 .REPEAT ;AN000;
2594 MOV AX,PAN_INST_PROMPT ;AN000;
2595 CALL INIT_PQUEUE_CALL ;AN000;
2596 MOV AX,DISK_PANEL ;AN000;
2597 CALL PREPARE_PANEL_CALL ;AN000;
2598 MOV AX,PAN_HBAR ;AN000;
2599 CALL PREPARE_PANEL_CALL ;AN000;
2600 CALL HANDLE_CHILDREN ;AN000;
2601 CALL DISPLAY_PANEL_CALL ;AN000;
2602 ;
2603 MOV CX,FK_ENT_LEN ;AN000;
2604 LEA DX,FK_ENT ;AN000;
2605 CALL GET_FUNCTION_CALL ;AN000;
2606 ;
2607 MOV DI, SEARCH_FILE ;AN000;
2608 MOV CX, E_FILE_ATTR ;AN000;
2609 CALL FIND_FILE_ROUTINE ;AN000;
2610 .LEAVE < nc > ;AN000;
2611 ;
2612 MOV BX,ERR_DOS_DISK ;AN000;
2613 MOV CX,E_RETURN ;AN000;
2614 CALL HANDLE_ERROR_CALL ;AN000;
2615 JNC CONTINUE ;AN000;
2616 CLEAR_SCREEN2 ;AN000;
2617 JMP EXIT_SELECT ;AN000;
2618CONTINUE: ;AN000;
2619 .UNTIL ;AN000;
2620 ;
2621 RET ;AN000;
2622INSERT_DISK_ROUTINE ENDP ;AN000;
2623;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2624;
2625; Clear the input buffer
2626;
2627;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2628CLEAR_INBUFF PROC NEAR ;AN059;
2629; ;
2630CI_1: MOV AH,0BH ;AN059;
2631 INT 21H ;AN059;
2632 CMP AL,0 ;AN059;
2633 JE CI_2 ;AN059;
2634 MOV AH,07H ;AN059;
2635 INT 21H ;AN059;
2636 JMP CI_1 ;AN059;
2637 ;
2638CI_2: RET ;AN059;
2639CLEAR_INBUFF ENDP ;AN059;
2640;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2641;
2642;
2643SELECT ENDS ;AN000;
2644 END ;AN000;