]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/SELECT/CASERVIC.ASM
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 ; CAS SERVICES....FROM TSUISRD.ASM
15 ; ;AN004; for PTM 1064 temporary fix until the CASSFAR.LIB
16 ; is fixed. The HELP routines of CAS, zero out the
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!
23 ; ;AN006; for PTM 1756 - added error checking for wrong diskette
24 ; when help accessed. JW
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.
30 ; ;AN008; for PTM 2191 - added code to display selected option when
31 ; selection is made by numeric input.
33 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
44 ; Variable(s) for Conditional Assembly
46 ; These conditional assembly values are declared and set in an external
47 ; file and included during assembly.
49 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
50 INCLUDE CASVAR
.INC ;AN000;
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;
61 EXTRN E_RETURN
:ABS
;AN000;
62 EXTRN ERROR_ACTIVE
:BYTE;AN000;
63 EXTRN MEM_SIZE
:WORD ;AN024;
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;
78 ; Table at OFFSET 0 of panel file
80 EXT_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
91 DATA SEGMENT BYTE PUBLIC 'DATA' ;AN024;
92 CFILE
DB 'SELECT.DAT',0 ;AN024;compressed panel file
93 REPCHAR EQU
255 ;AN024;character used as repeat flag
94 DATA ENDS
;AN024; ;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;
110 SELECT
SEGMENT PARA
PUBLIC 'SELECT' ;AN000;segment for far routine
111 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
113 ; IF NEAR procedure, then define segment and EXTRN
115 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
118 SELECT
SEGMENT PARA
PUBLIC 'SELECT' ;AN000;segment for far routine
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;
132 ASSUME
CS:SELECT
,DS:DATA,ES:DATA ;AN000;
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
147 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
151 ; Process scroll field relative to current active panel.
152 ; Automatically handle help request, display and interaction.
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
158 ; WR_HCBCONT = ID of the desired contextual help text
160 ; WR_SCBID = SCB Number of scroll field
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
166 ; Exit: AX = Contains keystroke
167 ; BX = Current element
169 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
170 PUSHH
MACRO REG_LIST
;;AN000;
171 IRP REG
,<REG_LIST
> ;;AN000;
172 PUSH REG
;;AN000; save registers
176 POPP
MACRO REG_LIST
;;AN000;
177 IRP REG
,<REG_LIST
> ;;AN000;
178 POP REG
;;AN000; return registers to initial state
182 DOSCALL
MACRO ;;AN000;
183 INT 21H
;;AN000; call to DOS
185 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
188 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
189 GET_SCROLL_CALL PROC
NEAR ;AN000;
196 ; Initialize to top ;
198 MOV BX,WR_SCBID
;AN000;get PCSLCTP field
199 CALL GET_SCB
;AN000;ES:DI points to SCB
201 CMP AX,0 ;AN000;check to start list & highlight
202 JE GS10
;AN000; at top
204 MOV ES:[DI]+SCB_TOPELE
,1;AN000;intialize parameters
205 MOV ES:[DI]+SCB_CURELE
,AX;AN000;
207 ; Locate PCB data and initialize SCB ;
209 GS10: MOV BX,QM_ACTIVEPAN
;AN000;get the active panel number
210 CALL GET_PCB
;AN000;ES:DI address of panel PCB
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
216 MOV BX,WR_SCBID
;AN000;get PCSLCTP field
217 CALL GET_SCB
;AN000;ES:DI points to SCB
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
223 ; Build actual return string in complete buffer
225 CALL SET_RETKEYS
;AN000;create complete return string
226 CALL SET_NUMKEYS
;AN000;GHG
228 PUSH WR_CRETSEG
;AN000;initialize SCB with complete
229 POP ES:[DI]+SCB_RLSEG
;AN000; return string information
231 PUSH WR_CRETOFF
;AN000;
232 POP ES:[DI]+SCB_RLOFF
;AN000;
234 PUSH WR_CRETLEN
;AN000;
235 POP ES:[DI]+SCB_RLLEN
;AN000;
237 ; Process scroll field
239 AND ES:[DI]+SCB_OPT1
,NOT SCB_UKS
;AN000;
240 ;set to not use keystrokes
241 CALL PCSLCTP_CALL
;AN000;display scroll field
243 MOV BX,ES:[DI]+SCB_CURELE
;AN000;get last current element
244 MOV AX,ES:[DI]+SCB_KS
;AN000;get last keystroke
247 ; determine if current element has specific contextual help text
249 MOV WR_HLPOPT
,HLP_OVER
;AN000;GHG position help panel with default
251 MOV BX,WR_SCBID
;AN000;GHG
252 MOV AX,ES:[DI]+SCB_CURELE
;AN000;GHG
253 CALL ADJUST_DOWN
;AN000;GHG
256 CALL GET_HELP_ID
;AN000;GHG
257 MOV WR_HCBCONT
,AX ;AN000;GHG get current contextual help ID
260 MOV WR_HLPROW
,AX ;AN000;GHG row override of 6
262 MOV WR_HLPCOL
,AX ;AN000;GHG row override of 6
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
269 JMP GS10
;AN000;keystroke used elswhere, continu
274 GS20: MOV BX,ES:[DI]+SCB_CURELE
;AN000;return current element
276 ; display the selected option and exit immediately
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
293 GET_SCROLL_CALL ENDP
;AN000;
295 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
299 ; Process input field relative to current active panel.
300 ; Automatically handle help request, display and interaction.
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
306 ; WR_HCBCONT = ID of the desired contextual help text
308 ; IN_ICBID = ICB Number of input field
310 ; Exit: AX = Contains keystroke
312 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
313 PUBLIC GET_INPUT_CALL
;AN000;GHG
314 GET_INPUT_CALL PROC
NEAR ;AN000;GHG
321 MOV BX,IN_ICBID
;AN000;GHG get PCSLCTP field
322 CALL GET_ICB
;AN000;GHG ES:DI points to SCB
324 GI10: CALL SET_RETKEYS
;AN000;GHG create complete return string
326 PUSH WR_CRETSEG
;AN000;GHG initialize SCB with complete
327 POP ES:[DI]+ICB_RETSEG
;AN000;GHG return string information
329 PUSH WR_CRETOFF
;AN000;GHG
330 POP ES:[DI]+ICB_RETOFF
;AN000;GHG
332 PUSH WR_CRETLEN
;AN000;GHG
333 POP ES:[DI]+ICB_RETLEN
;AN000;GHG
334 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
336 ; Process input field
338 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
339 CALL PCINPUT_CALL
;AN000;GHG display input field
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
347 MOV CX,ES:[DI]+ICB_FIELDLEN
;AN000;GHG
357 GI_11: POPP
<DS,ES,DI,SI> ;AN000;GHG
358 PUSH ES:[DI]+ICB_ENDBYTE
;AN000;GHG
359 POP ES:[DI]+ICB_DEFLEN
;AN000;GHG
361 MOV AX,ES:[DI]+ICB_KEYRET
;AN000;GHG get last keystroke
364 ; determine if current element has specific contextual help text
367 MOV WR_HLPOPT
,HLP_OVER
;AN000;GHG position help panel with default
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
375 MOV WR_HLPROW
,AX ;AN000;GHG row override
377 MOV WR_HLPCOL
,AX ;AN000;GHG col override
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
384 JMP GI10
;AN000;GHG keystroke used elswhere, continue
385 ;GHG from last position
386 GI20: POP ES ;AN000;GHG
393 GET_INPUT_CALL ENDP
;AN000;GHG
395 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GHG
399 ; Process input field relative to current active panel.
400 ; Automatically handle help request, display and interaction.
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
407 ; WR_HCBCONT = ID of the desired contextual help text
410 ; Exit: AX = Contains Keystroke
412 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
413 GET_INPUT PROC
NEAR ;AN000;
415 GET_INPUT ENDP
;AN000;
416 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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.
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
433 ; Exit: AX = Contains unused keystroke returned from call
435 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
436 GET_KEY PROC
NEAR ;AN000;
438 PUSH CX ;AN000;save registers
440 ; Create complete return key string
442 CGK10: MOV AX,0 ;AN000;clear to zero
444 CALL SET_RETKEYS
;AN000;create complete return string
446 PUSH WR_CRETSEG
;AN000;initialize PCINSTR parameters
447 POP INS_SSEG
;AN000; with complete return string data
449 PUSH WR_CRETOFF
;AN000;
452 PUSH WR_CRETLEN
;AN000;
455 ; Get keystroke from keyboard ;
457 CGK20: MOV INC_OPT
,INC_KWAIT
;AN000;wait for keystroke
458 CALL PCINCHA_CALL
;AN000;call CAS routine
460 ; Check if keystroke is a valid return key
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
466 CALL PCINSTR_CALL
;AN000;check if good key
468 TEST INS_RSLT
,0FFFFH ;AN000;check if key found
471 CALL PCMBEEP_CALL
;AN000;no
472 JMP CGK20
;AN000;try again
474 ; Check if help keystroke and process if yes
476 CGK30: 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
480 CGKEXIT: POP CX ;AN000;restore registers
484 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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.
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
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
500 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
501 SET_RETKEYS PROC
NEAR ;AN000;
509 ; do not exceed WR_MAXRETKSZ buffer length
512 ; Move keystrokes from dynamic return key string to complete return strg buffer
514 CLD ;AN000;auto increment
515 PUSH WR_CRETSEG
;AN000;get segment of complete return
516 POP ES ;AN000; buffer
518 MOV DI,WR_CRETOFF
;AN000;get offset of complete return
520 MOV CX,WR_DRETLEN
;AN000;get length of dynamic return strg
521 MOV DX,CX ;AN000; and initialize DX counter
523 MOV SI,WR_DRETOFF
;AN000;get offset of dynamic return strg
525 PUSH DS ;AN000;save data segment
527 PUSH WR_DRETSEG
;AN000;get offset of dynamic return strg
530 REP MOVSB ;AN000;copy dynamic return key string
531 ; to complete return key buffer
532 POP DS ;AN000;restore data segment
533 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
535 ; Add assigned keys from displayed child panels to complete return buffer
537 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
538 MOV SI,QM_RETKEYSOFF
;AN000;get offset of return buffer
540 MOV CX,QM_RETKEYSLEN
;AN000;
541 ADD DX,CX ;AN000;add length of return keys
543 PUSH DS ;AN000;save data segment
545 PUSH QM_RETKEYSSEG
;AN000;
546 POP DS ;AN000;get segment of return buffer
548 REP MOVSB ;AN000;copy string sent
550 POP DS ;AN000;restore data segment
552 MOV CX,WR_MAXRETKSZ
;AN061;
557 MOV WR_CRETLEN
,DX ;AN000;initialize current return string
561 SRK30: POP DS ;AN000;restore registers
568 SET_RETKEYS ENDP
;AN000;
569 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
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
582 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
583 NUMKEYS
DB '123456789' ;AN000;
585 SET_NUMKEYS PROC
NEAR ;AN000;
586 PUSH AX ;AN000;save registers
594 ; Move numeric keystrokes into completed return strg buffer
596 MOV BX,WR_SCBID
;AN000;get PCSLCTP field
597 CALL GET_SCB
;AN000;ES:DI points to SCB
599 TEST ES:[DI]+SCB_OPT3
,SCB_NUMS
;AN000;
602 PUSH ES:[DI]+SCB_SELSEG
;AN000;
603 PUSH ES:[DI]+SCB_SELOFF
;AN000;
604 PUSH ES:[DI]+SCB_NUMELE
;AN000;
610 SNR_10: MOV BX,SCB_ACTIVEON
;AN000;
611 CMP ES:[DI],BX ;AN000;
614 SNR_15: INC DI ;AN000;
621 SNR_20: MOV CX,AX ;AN000;
623 PUSH WR_CRETOFF
;AN000;get offset of complete return
624 PUSH WR_CRETSEG
;AN000;get segment of complete return
628 ADD DI,WR_CRETLEN
;AN000;get length of dynamic return strg
629 ADD WR_CRETLEN
,CX ;AN000;
630 LEA SI,NUMKEYS
;AN000;
634 CLD ;AN000;auto increment
637 SNK_30: POP DS ;AN000;restore registers
645 SET_NUMKEYS ENDP
;AN000;
646 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
650 ; Check return key for active function keys
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.
657 ; Entry: AX = Keystroke
659 ; Exit: CX = 0= keystroke not used
662 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
663 CHK_RETKEYS PROC
NEAR ;AN000;
664 PUSHF ;AN000;save registers and variables
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
680 ; Check if keystroke pressed displays, processes, or removes contextual help
682 CALL MANAGE_HELP
;AN000;
684 CMP CX,0 ;AN000;check if keystroke used by help
685 JE CHK10
;AN000;no, check other functions
687 JMP CHKEXIT
;AN000;yes, exit
689 ; Keys may be check here and processed for other functions
693 ; Exit to calling routine
695 CHKEXIT: 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
711 CHK_RETKEYS ENDP
;AN000;
712 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
716 ; Check return key for numeric keys
718 ; Entry: AX = Keystroke
720 ; Exit: AX = The first character in the completed return key string
721 ; WR_CRETSEG:WR_CRETOFF
723 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
724 CHK_NUMKEYS PROC
NEAR ;AN000;
728 MOV BX,WR_SCBID
;AN000;
730 TEST ES:[DI]+SCB_OPT3
,SCB_NUMS
;AN000;
739 MOV BX,AX ;AN000; now form the index value
740 SUB BX,'0' ;AN000; from the keystroke!
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
748 MOV ES:[DI]+SCB_KS
,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;
756 CNK_20: POP BX ;AN000;
760 CHK_NUMKEYS ENDP
;AN000;
761 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
765 ; Manage contextual, indexed and keys help. This routine is used :
766 ; to display, process and remove help from the screen.
768 ; Entry: AX = Keystroke pressed
770 ; WR_HLPOPT = Help display and operation options
771 ; WR_HLPROW = Override row for help panel
772 ; WR_HLPCOL = Override column for help panel
774 ; WR_HCBCONT = Current contextual help ID
775 ; WR_HCBHELP = Help-on-help ID
776 ; WR_HCBKEYS = Keys help ID
778 ; WR_PCBHPAN = Help panel ID
780 ; WR_SCBCONT = Scroll ID for context forms of help
781 ; WR_SCBINDX = Scroll ID for indexed forms of help
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)
790 ; HRD_FILSPOFF = Offset of contextual help file path name
791 ; HRD_FILSPSEG = Segment of contextual help file path name
793 ; Exit: AX = Keystroke
794 ; CX 0 = Keystroke not used
797 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
798 MANAGE_HELP PROC
NEAR ;AN000;
800 ; Check if help is displayed
807 CMP ERROR_ACTIVE
,1 ;AN007;JW is an error being processed?
809 JNE MH00
;AN007;JW no, continue
810 JMP MHEXIT
;AN007;JW yes, exit
812 MH00: CMP WR_HLPDIS
,0 ;AN000;check if help is displayed
815 CMP AX,WR_KEYSWIT
;AN000;check if any key but switch
816 JNE MH10
;AN000; and remove help
818 TEST WR_HLPDIS
,HLP_INDX
;AN000;check if index displayed
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;
826 MH05: 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;
832 MH10: CALL REMOVE_HELP
;AN000;restore original display queues
835 ; Process read help text
837 MH20: CALL PROCESS_HELP
;AN000;process contextual help
839 MOV CX,1 ;AN000;set keystroke used flag
841 CMP AX,WR_KEYSWIT
;AN000;check if help should be left
842 JNE MH25
;AN000; on the screen
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;
849 MOV AX,WR_PCBHELP
;AN000;F1=Help
850 MOV QM_ID
,AX ;AN000;parent PCB number
851 CALL PCDISPQ_CALL
;AN000;
853 TEST WR_HLPDIS
,HLP_INDX
;AN000;check if index displayed
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;
861 MH22: JMP MH80
;AN000;exit
863 MH25: CMP AL,01BH ;AN000;check for quit key
864 JNE MH30
;AN000; refresh display
866 CALL REMOVE_HELP
;AN000;restore original display queues
869 ; Read help if requested
871 MH30: CMP AX,WR_KEYHELP
;AN000;check if F1=help requested
874 CMP WR_HLPDIS
,0 ;AN000;is help already displayed
877 CALL REMOVE_HELP
;AN000;restore original display queues
879 MH40: TEST WR_HLPDIS
,HLP_CONT
;AN000;check if contextual help already
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
886 PUSH WR_HCBHELP
;AN000;set help-on-help ID
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
893 MH50: 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
897 PUSH WR_HCBCONT
;AN000;get current contextual help text
898 POP HRD_ID
;AN000; ID
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
904 ; Check if indexed help requested for display
906 MH60: CMP AX,WR_KEYINDX
;AN000;check if index selected
909 CMP WR_HLPDIS
,0 ;AN000;is help already displayed
912 CALL REMOVE_HELP
;AN000;restore original display queues
914 MH65: MOV WR_HLPPAN
,HLP_CONT
;AN000;turn on contextual help
915 OR WR_HLPPAN
,HLP_KEYS
;AN000;turn on help on keys
917 MOV HRD_ID
,0 ;AN000;set contextual help ID
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
923 ; Check if keys help requested for display
925 MH70: CMP AX,WR_KEYKEYS
;AN000;check for help on keys
928 CMP WR_HLPDIS
,0 ;AN000;is help already displayed
931 CALL REMOVE_HELP
;AN000;restore original display queues
933 MH75: MOV WR_HLPPAN
,HLP_CONT
;AN000;turn on contextual help
934 OR WR_HLPPAN
,HLP_INDX
;AN000;turn on help index
936 PUSH WR_HCBKEYS
;AN000;set keys help ID
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
943 ; Help was processed restore original active panel and return key string
945 MH80: MOV QM_OPT1
,0 ;AN000;make original panel active
946 CALL PCDISPQ_CALL
;AN000; and update the return keys
948 CALL SET_RETKEYS
;AN000;restore original return keys
950 PUSH AX ;AN000;save keystroke
952 MOV AX,1 ;;AN000;;;;;;;;;;0 ;set break option off
954 CMP WR_HLPDIS
,0 ;AN000;is help displayed
957 MOV AX,1 ;AN000;turn break option on
959 MH90: CALL PCPANEL_CALL
;AN000;make original panel the active
960 ; panel with the child panels
961 POP AX ;AN000;restore keystroke
968 MANAGE_HELP ENDP
;AN000;
971 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
975 ; Read Help Text and Prepare for Display:
977 ; o Read the specified contextual help text into the help buffer :
979 ; o Save the current parent and child display queues
981 ; o Add the contextual help panel to the new display queue
983 ; o Exit without updating display
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
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
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
1002 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1003 READ_HELP PROC
NEAR ;AN000;
1004 PUSH BX ;AN000;save registers
1007 PUSH QM_ACTIVEPAN
;AN000;
1009 ; Read specified help text from file into memory buffer
1011 MOV HRD_OPT1
,HRD_TEXT
;AN000;set the contextual option
1013 TEST WR_HLPDIS
,HLP_INDX
;AN000;check if index status on
1016 MOV HRD_OPT1
,HRD_TOPIC
;AN000;set the indexed help option
1018 RH05: CALL HOOK_INT_24
;AN000;
1020 RH06: PUSH HRD_BUFOFF
;AN000;
1021 PUSH HRD_BUFLEN
;AN000;save help buffer length
1023 CALL PCHLPRD_CALL
;AN005;GHG call help read routine
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;
1032 CLEAR_SCREEN2
;AN000;
1033 JMP EXIT_SELECT
;AN000;
1035 RH07: POP HRD_BUFLEN
;AN000;restore help buffer length
1036 POP HRD_BUFOFF
;AN000;
1037 CALL RESTORE_INT_24
;AN006;JW
1038 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1040 ; Handle error for help text not found
1042 ; Perform WORD WRAP on help buffer...
1044 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1045 PUSH HRD_TEXTSEG
;AN000;GHG
1046 POP WWP_SRCTXTSEG
;AN000;GHG
1048 PUSH HRD_TEXTOFF
;AN000;GHG
1049 POP WWP_SRCTXTOFF
;AN000;GHG
1051 PUSH HRD_TEXTLEN
;AN000;GHG
1052 POP WWP_SRCTXTLEN
;AN000;GHG
1054 PUSH WR_MAXHELPSZ
;AN000;GHG
1055 POP WWP_SRCBUFLEN
;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
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
1072 CALL PCWWRAP_CALL
;AN000;GHG
1073 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1075 ; Determine position and add help panel to parent display queue
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
1082 TEST WR_HLPOPT
,HLP_OVER
;AN000;check for help panel position
1083 JE RH10
;AN000; override
1085 PUSH WR_HLPCOL
;AN000;set override
1086 POP QM_COLUMOVER
;AN000;
1088 PUSH WR_HLPROW
;AN000;set override
1089 POP QM_ROWOVER
;AN000;
1091 RH10: 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
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
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
1107 MOV QM_OPT2
,0 ;AN000;set options off
1108 MOV QM_ROWOVER
,0 ;AN000;deactivate overrides
1109 MOV QM_COLUMOVER
,0 ;AN000;
1111 ; Check if help panel's children are active and add to display queue
1113 MOV QM_OPT1
,QM_PUSHCHD
;AN000;add child panels option
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
1119 TEST WR_HLPPAN
,HLP_CONT
;AN000;check if contextual help active
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
1126 RH15: TEST WR_HLPPAN
,HLP_HELP
;AN000;check if help-on-help active
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
1133 RH20: TEST WR_HLPPAN
,HLP_INDX
;AN000;check if help index active
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
1140 RH30: TEST WR_HLPPAN
,HLP_KEYS
;AN000;check if help keys active
1143 MOV BX,WR_PCBKEYS
;AN000;
1144 MOV QM_ID
,BX ;AN000;get help panel number
1145 CALL PCDISPQ_CALL
;AN000;update display queue
1147 ; Locate help panel PCB data and initialize common data
1149 RH40: MOV BX,WR_PCBHPAN
;AN000;get help panel ID
1150 CALL GET_PCB
;AN000;ES:DI points to PCB
1152 PUSH ES:[DI]+PCB_UROW
;AN000;get help panel row
1153 PUSH ES:[DI]+PCB_UCOL
;AN000;get help panel column
1155 ; Initialize for indexed form of help
1157 TEST WR_HLPDIS
,HLP_INDX
;AN000;check is index help status is on
1160 LEA AX,WR_REFBUF
;AN000;get address of refresh table
1161 MOV WR_REFOFF
,AX ;AN000;
1163 LEA AX,WR_REFBUF
;AN000;get address of refresh table
1164 MOV WR_REFOFF
,AX ;AN000;
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
1171 MOV BX,WR_SCBINDX
;AN000;get help scroll ID
1172 CALL GET_SCB
;AN000;ES:DI points to SCB
1174 POP ES:[DI]+SCB_RELCOL
;AN000;set panel's relative column
1175 POP ES:[DI]+SCB_RELROW
;AN000;set panel's relative row
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
1182 ; adjust scrolling field width to be contained within panel
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
1190 ; adjust scrolling field number of display lines to be
1191 ; contained within panel
1194 PUSH HRD_TOPICNUM
;AN000;set number of elements
1195 POP ES:[DI]+SCB_NUMELE
;AN000;
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
1201 PUSH HRD_TOPICOFF
;AN000;set offset of topic vector
1202 POP ES:[DI]+SCB_OAPOFF
;AN000;
1204 JMP RHEXIT
;AN000;index initialized
1206 ; Initialize for contextual forms of help (cont, help, and keys)
1208 RH50: LEA AX,WR_REFBUF
;AN000;get address of refresh table
1209 MOV WR_REFOFF
,AX ;AN000;
1211 MOV BX,WR_SCBCONT
;AN000;get help scroll ID
1212 CALL GET_SCB
;AN000;ES:DI points to SCB
1214 POP ES:[DI]+SCB_RELCOL
;AN000;set panel's relative column
1215 POP ES:[DI]+SCB_RELROW
;AN000;set panel's relative row
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
1221 MOV AX,WWP_NUMLINES
;AN000;GHG Use WordWrap # lines
1223 MOV ES:[DI]+SCB_NUMELE
,AX ;AN000;initialize number of elements
1225 PUSH HRD_TEXTSEG
;AN000;set segment of help text
1226 POP ES:[DI]+SCB_OAPSEG
;AN000;
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
1233 RHEXIT: POP QM_ACTIVEPAN
;AN000;restore current active panel
1234 POP DI ;AN000;restore registers and exit
1238 READ_HELP ENDP
;AN000;
1239 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
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
1252 ; Exit: AX = Exit keystroke pressed
1254 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1255 PROCESS_HELP PROC
NEAR ;AN000;
1256 PUSH BX ;AN000;save registers
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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1265 ; Refresh display with help panel
1267 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1268 PUSH WR_PCBHPAN
;AN000;set the help panel as active
1269 POP QM_ACTIVEPAN
;AN000;
1271 MOV QM_OPT1
,0 ;AN000;make help panel active panel
1272 CALL PCDISPQ_CALL
;AN000; and update the return keys
1274 MOV AX,1 ;AN000;set break option on
1275 CALL PCPANEL_CALL
;AN000;refresh display
1276 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1278 ; Locate proper scroll SCB for help form
1280 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1281 MOV BX,WR_SCBCONT
;AN000;set for contextual help form
1283 TEST WR_HLPDIS
,HLP_INDX
;AN000;check if indexed help status on
1286 MOV BX,WR_SCBINDX
;AN000;set for indexed help form
1288 PH10: CALL INIT_HELP_TITLE
;AN000;** GG
1289 CALL GET_SCB
;AN000;loads PCSLCTP vars with field
1290 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1292 ; Build return string of keystrokes and process help
1294 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1295 LEA AX,WR_RETHLPBUF
;AN000;set help dynamic return keys
1296 MOV WR_DRETOFF
,AX ;AN000;
1298 MOV AX,WR_RETHLPLEN
;AN000;
1299 MOV WR_DRETLEN
,AX ;AN000;
1302 MOV WR_DRETSEG
,AX ;AN000;
1304 CALL SET_RETKEYS
;AN000;create complete return string
1306 PUSH WR_CRETSEG
;AN000;initialize SCB with complete
1307 POP ES:[DI]+SCB_RLSEG
;AN000; return string information
1309 PUSH WR_CRETOFF
;AN000;
1310 POP ES:[DI]+SCB_RLOFF
;AN000;
1312 PUSH WR_CRETLEN
;AN000;
1313 POP ES:[DI]+SCB_RLLEN
;AN000;
1315 CALL PCSLCTP_CALL
;AN000;process help text until exit
1317 MOV AX,ES:[DI]+SCB_KS
;AN000;get keystroke from PCSLCTP
1319 TEST WR_HLPDIS
,HLP_INDX
;AN000;check if index help status is on
1322 CMP AX,WR_KEYSELT
;AN000;check if select key pressed to
1323 JNE PHEXIT
;AN000; select desired topic
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
1330 PHEXIT: 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
1338 PROCESS_HELP ENDP
;AN000;
1339 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1342 ; INITIALIZE_HELP_TITLE
1344 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1345 INIT_HELP_TITLE PROC
NEAR ;AN000;
1346 PUSHH
<AX,BX,ES,DI,WR_SCBID
> ;AN000;
1348 MOV BX,WR_PCBHPAN
;AN000;get help panel ID
1349 CALL GET_PCB
;AN000;ES:DI points to PCB
1351 PUSH ES:[DI]+PCB_UROW
;AN000;get help panel row
1352 PUSH ES:[DI]+PCB_UCOL
;AN000;get help panel column
1354 MOV BX,SCR_TITLE_HLP
;AN000;
1355 MOV WR_SCBID
,BX ;AN000;
1356 CALL GET_SCB
;AN000;
1358 POP ES:[DI]+SCB_RELCOL
;AN000;
1359 POP ES:[DI]+SCB_RELROW
;AN000;
1361 PUSH HRD_TEXTSEG
;AN000;
1362 POP ES:[DI]+SCB_OAPSEG
;AN000;
1364 PUSH HRD_TEXTOFF
;AN000;
1365 POP ES:[DI]+SCB_OAPOFF
;AN000;
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;
1372 POPP
<WR_SCBID
,DI,ES,BX,AX> ;AN000;
1374 INIT_HELP_TITLE ENDP
;AN000;
1375 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1379 ; Remove Help Panel:
1381 ; o Restore original parent and child display queues; thereby,
1382 ; removing help panels
1384 ; o Exit without updating display
1386 ; Entry: WR_KEYHELP = Help-on-help keystroke (F1=Help)
1388 ; Exit: WR_HLPDIS = Help status off
1390 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1391 REMOVE_HELP PROC
NEAR ;AN000;
1392 PUSH BX ;AN000;save registers
1395 ; Restore original parent and child queues
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
1401 ; Reset variables for exit
1403 TEST WR_HLPDIS
,HLP_CONT
;AN000;check if contextual help
1404 JE RM20
;AN000; already on, no set status off
1406 CMP AX,WR_KEYHELP
;AN000;check if help on help request
1409 RM20: MOV WR_HLPDIS
,0 ;AN000;help panels not on
1413 RMEXIT: POP DI ;AN000;restore registers and exit
1416 REMOVE_HELP ENDP
;AN000;
1417 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1421 ; Get Panel Control Block information for child or parent panel. :
1423 ; Entry: BX = Number of PCB vector desired.
1425 ; Exit: ES = Segment of desired PCB.
1426 ; DI = Offset of desired PCB.
1428 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1430 GET_PCB PROC
NEAR ;AN000;
1436 ; read panel control block vector to obtain PCB address
1438 PUSH QM_PCBVECSEG
;AN000;get beginning PCB vector address
1440 PUSH QM_PCBVECOFF
;AN000;
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
1451 MOV ES,BX ;AN000;set ES:DI to panel's actual
1452 MOV DI,CX ;AN000; PCB address
1460 GET_PCB ENDP
;AN000;
1461 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1465 ; Get Scroll Field Control Block information.
1467 ; Entry: BX = Number of SCB vector desired.
1469 ; Exit: ES:DI = Address of desired SCB
1471 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1473 GET_SCB PROC
NEAR ;AN000;
1480 ; read scroll control block vector to obtain SCB address
1482 PUSH SRD_SCBVECSEG
;AN000;get beginning SCB vector address
1484 PUSH SRD_SCBVECOFF
;AN000;
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
1495 MOV ES,BX ;AN000;set ES:DI to scroll's actual
1496 MOV DI,CX ;AN000; SCB address
1504 GET_SCB ENDP
;AN000;
1505 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1509 ; Get Input Control Block information.
1511 ; Entry: BX = Number of ICB vector desired.
1513 ; Exit: ES:DI = Address of ICB
1515 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1516 GET_ICB PROC
NEAR ;AN000;
1522 ; read input control block vector to obtain ICB address
1524 PUSH WR_ICBVECSEG
;AN000;get beginning ICB vector address
1526 PUSH WR_ICBVECOFF
;AN000;
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
1537 MOV ES,BX ;AN000;set ES:DI to field's actual
1538 MOV DI,CX ;AN000; ICB address
1545 GET_ICB ENDP
;AN000;
1546 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1550 ; Refresh specified input and scrolling fields in the logical video :
1551 ; buffer during screen build.
1553 ; Format = DW Panel control block number
1554 ; DW Number of fields in this record
1561 ; Entry: WR_REFNUM = Number of PCB entries
1562 ; WR_REFOFF = Offset of table
1563 ; WR_REFSEG = Segment of table
1565 ; PM_PANBRKID = Panel PCB number to refresh
1569 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1570 REFRESH_FLDS PROC
NEAR ;AN000;
1571 PUSH AX ;AN000;save registers
1578 ; Initialize for table search
1580 MOV CX,WR_REFNUM
;AN000;get number of refresh table recs
1581 CMP CX,0 ;AN000;check the number of PCB entries
1583 JMP RFEXIT
;AN000;no records, exit
1585 RF10: PUSH WR_REFOFF
;AN000;get address of refresh table
1586 POP WR_REFCNT
;AN000;
1588 PUSH WR_REFSEG
;AN000;
1591 ; Locate matching table and PCB break number
1593 RF20: MOV DI,WR_REFCNT
;AN000;set beginning address of current
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
1602 MOV BX,PM_PANBRKID
;AN000;
1603 CMP BX,ES:[DI] ;AN000;check if PCB match to table rec
1606 LOOP RF20
;AN000;check next table record
1607 JMP RFEXIT
;AN000;no match, exit
1609 ; Match found, refresh all fields
1611 RF30: MOV CX,ES:[DI]+2 ;AN000;get number of fields
1613 RF40: ADD DI,4 ;AN000;point to field data
1614 MOV AX,SCROLLOBJID
;AN000;check if scroll field
1615 CMP AX,ES:[DI] ;AN000;
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
1622 RF50: MOV AX,INPUTOBJID
;AN000;check if input field
1623 CMP AX,ES:[DI] ;AN000;
1626 MOV BX,ES:[DI]+2 ;AN000;get field ID
1627 CALL REFRESH_ICB
;AN000;update logical video buffer
1629 RF60: LOOP RF40
;AN000;get next field in same record
1631 RFEXIT: POP DI ;AN000;restore registers
1639 REFRESH_FLDS ENDP
;AN000;
1640 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1644 ; Refresh scroll field in logic video buffer and exit.
1646 ; Entry: BX = Scroll ID field number
1650 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1651 REFRESH_SCB PROC
NEAR ;AN000;
1652 PUSH ES ;AN000;save registers
1655 CALL GET_SCB
;AN000;load SCB address
1657 PUSH ES:[DI]+SCB_OPT1
;AN000;save options
1658 PUSH ES:[DI]+SCB_OPT3
;AN000;
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;
1664 PUSH PM_LVBOFF
;AN000;initialize logical video address
1665 POP ES:[DI]+SCB_LVBOFF
;AN000;
1667 PUSH PM_LVBSEG
;AN000;
1668 POP ES:[DI]+SCB_LVBSEG
;AN000;
1670 CALL PCSLCTP_CALL
;AN000;refresh logical video buffer
1672 POP ES:[DI]+SCB_OPT3
;AN000;restore option
1673 POP ES:[DI]+SCB_OPT1
;AN000;
1675 RSEXIT: POP DI ;AN000;restore registers
1679 REFRESH_SCB ENDP
;AN000;
1680 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1684 ; Refresh input field in logic video buffer and exit.
1686 ; Entry: BX = Input ID field number
1690 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1691 REFRESH_ICB PROC
NEAR ;AN000;
1693 PUSH ES ;AN000;save registers
1695 PUSH IN_ICBID
;AN000;
1697 MOV IN_ICBID
,BX ;AN000;
1698 CALL GET_ICB
;AN000;load ICB address
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;
1708 PUSH ES:[DI]+ICB_OPT1
;AN000;
1709 OR ES:[DI]+ICB_OPT1
,ICB_OUT
;AN000;
1710 OR IN_OPT
,IN_LVBOV
;AN000;
1712 PUSH PM_LVBOFF
;AN000;initialize logical video address
1713 POP IN_LVBOFF
;AN000;
1715 PUSH PM_LVBSEG
;AN000;
1716 POP IN_LVBSEG
;AN000;
1718 CALL PCINPUT_CALL
;AN000;
1720 POP ES:[DI]+ICB_OPT1
;AN000;
1722 CALL CURSOROFF
;AN000;
1724 POP IN_ICBID
;AN000;
1725 POP DI ;AN000;restore registers
1729 REFRESH_ICB ENDP
;AN000;
1730 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1734 ; Deactivates cursor from display.
1740 ;;;;;;;;;;;;;;;;;;;;;;;;;
1741 CURSOROFF PROC
NEAR ;AN000;
1742 PUSH AX ;AN000;save registers
1746 MOV AH,3 ;AN000;function to get cursor info
1747 MOV BH,0 ;AN000;page zero
1749 OR CH,20H
;AN000;set bit 6
1750 MOV AH,1 ;AN000;function to set cursor
1753 POP CX ;AN000;restore registers
1757 CURSOROFF ENDP
;AN000;
1758 ;;;;;;;;;;;;;;;;;;;;;;;;;
1762 ; Activates cursor display on screen.
1768 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1769 CURSORON PROC
NEAR ;AN000;
1770 PUSH AX ;AN000;save registers
1774 MOV AH,3 ;AN000;function to get cursor info
1775 MOV BH,0 ;AN000;page zero
1777 AND CH,NOT 20H
;AN000;clear bit 6
1778 MOV AH,1 ;AN000;function to set cursor
1781 POP CX ;AN000;restore registers
1786 CURSORON ENDP
;AN000;
1787 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1793 ; Entry: PB initialized.
1797 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1798 PCINCHA_CALL PROC
NEAR ;AN000;
1800 CALL CLEAR_INBUFF
;AN088;SEH this call was moved and now replaced to exist both before and after call
1802 PUSH DS ;AN000;set segment
1805 PUSH DI ;AN000;save registers
1806 LEA DI,INC_OPT
;AN000;set DI to proper parameter block
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
1814 CALL CLEAR_INBUFF
;AC083;SEH call moved to after call to INCHA in order to flush buffer ;AN059;
1816 POP DI ;AN000;restore registers
1819 PCINCHA_CALL ENDP
;AN000;
1820 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1826 ; Entry: PB initialized.
1830 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1831 PCDISPQ_CALL PROC
NEAR ;AN000;
1832 PUSH DS ;AN000;set segment
1835 PUSH DI ;AN000;save registers
1836 LEA DI,QM_OPT1
;AN000;set DI to proper parameter block
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
1844 POP DI ;AN000;restore registers
1847 PCDISPQ_CALL ENDP
;AN000;
1848 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1852 ; Initialize for call to PCPANEL including refresh of input and
1853 ; scroll fields in the logical video buffer before display.
1855 ; Entry: PB initialized.
1859 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1860 PCPANEL_CALL PROC
NEAR ;AN000;
1861 PUSH QM_PANQUENUM
;AN000;
1862 POP PM_PANQUENUM
;AN000;number of panels in parent queue
1864 PUSH QM_CHDQUENUM
;AN000;
1865 POP PM_CHDQUENUM
;AN000;number panels in child queue
1867 PUSH QM_ACTIVEPAN
;AN000;
1868 POP PM_ACTIVEPAN
;AN000;active parent panel number
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
1875 CMP AX,1 ;AN000;check if break option is on
1878 CMP WR_REFIELDCNT
,0 ;AN000;GHG
1880 XOR AX,AX ;AN000;GHG
1883 PP06: OR BX,PM_BK
;AN000;set panel manager break option on
1885 PP05: 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
1890 PP10: AND PM_OPT1
,NOT PM_CL
;AN000;turn init LVB base char/attr off
1891 ;do Actual PCPANEL call
1892 PP20: PUSH DS ;AN000;set segment
1895 PUSH DI ;AN000;save registers
1896 LEA DI,PM_OPT1
;AN000;set DI to proper parameter block
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
1904 POP DI ;AN000;restore registers
1907 CMP AX,1 ;AN000;check if the break option is
1908 JNE PPEXIT
;AN000; active
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
1916 CALL REFRESH_FLDS
;AN000;refresh fields in break panel
1917 JMP PP10
;AN000;continue to process panels
1919 PCPANEL_CALL ENDP
;AN000;
1920 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1926 ; Entry: PB initialized.
1930 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1931 PCMBEEP_CALL PROC
NEAR ;AN000;
1932 PUSH DS ;AN000;set segment
1935 PUSH DI ;AN000;save registers
1936 LEA DI,MB_FREQUENCY
;AN000;set DI to proper parameter block
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
1944 POP DI ;AN000;restore registers
1947 PCMBEEP_CALL ENDP
;AN000;
1948 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1954 ; Entry: ES:DI = beginning address of PCSLCTP parameter block.
1959 ; Initialize color index vector
1961 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1962 PCSLCTP_CALL PROC
NEAR ;AN000;
1964 CALL CLEAR_INBUFF
;AN059;
1966 PUSH PM_CCBVECNUM
;AN000;set color index number
1967 POP ES:[DI]+SCB_CCBVECNUM
;AN000;
1969 PUSH CRD_CCBVECOFF
;AN000;set color index offset
1970 POP ES:[DI]+SCB_CCBVECOFF
;AN000;
1972 PUSH CRD_CCBVECSEG
;AN000;set color index segment
1973 POP ES:[DI]+SCB_CCBVECSEG
;AN000;
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;
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
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;
1992 PCSLCTP_CALL ENDP
;AN000;
1993 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1999 ; Entry: PB initialized.
2003 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2004 PCHLPRD_CALL PROC
NEAR ;AN000;
2005 PUSH DS ;AN000;set segment
2008 PUSH DI ;AN000;save registers
2009 LEA DI,HRD_OPT1
;;AN000;set DI to proper parameter block
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
2017 .IF < HRD_ERROR
eq 0 > and;AN005;GHG
2018 .IF < HRD_DOSERROR
eq 0 > ;AN005;GHG
2024 POP DI ;AN000;restore registers
2027 PCHLPRD_CALL ENDP
;AN000;
2028 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2034 ; Entry: PB initialized.
2038 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2039 PCINSTR_CALL PROC
NEAR ;AN000;
2040 PUSH DS ;AN000;set segment
2043 PUSH DI ;AN000;save registers
2044 LEA DI,INS_OPT
;;AN000;set DI to proper parameter block
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
2052 POP DI ;AN000;restore registers
2055 PCINSTR_CALL ENDP
;AN000;
2056 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2062 ; Entry: PB initialized.
2066 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2067 PCINPUT_CALL PROC
NEAR ;AN000;
2069 CALL CLEAR_INBUFF
;AN059;
2071 PUSH DS ;AN000;set segment
2074 PUSH DI ;AN000;save registers
2075 LEA DI,IN_OPT
;AN000;set DI to proper parameter block
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
2083 POP DI ;AN000;restore registers
2086 PCINPUT_CALL ENDP
;AN000;
2087 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2093 ; Entry: PB initialized.
2097 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2098 PCGVIDO_CALL PROC
NEAR ;AN000;
2099 PUSH DS ;AN000;set segment
2102 PUSH DI ;AN000;save registers
2103 LEA DI,GV_STAT1
;AN000;set DI to proper parameter block
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
2111 POP DI ;AN000;restore registers
2114 PCGVIDO_CALL ENDP
;AN000;
2115 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2121 ; Entry: PB initialized.
2125 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2126 PCWWRAP_CALL PROC
NEAR ;AN000;
2127 PUSH DS ;AN000;set segment
2130 PUSH DI ;AN000;save registers
2131 LEA DI,WWP_OPT1
;AN000;set DI to proper parameter block
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
2139 POP DI ;AN000;restore registers
2142 PCWWRAP_CALL ENDP
;AN000;
2143 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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.
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
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
2161 ; CY=1 and WR_ERROR = 1, Error occurred (WR_DATA2LEN/OFF are invalid)
2165 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2166 INITIALIZE PROC
NEAR ;AN000;
2173 MOV WR_ERROR
,0 ;AN000;reset error inidicator
2175 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2177 ; Read Compressed Panel file
2179 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2181 MOV DX,OFFSET CFILE
;AN024;filename to read , SELECT.DAT
2184 INT 21H
;AN024;open file
2186 MOV BX,AX ;AN024;get file handle
2187 PUSH BX ;AN024;save it
2190 MOV AL,2 ;AN024;move ptr to end of file
2191 MOV AH,42H
;AN024;LSEEK
2194 PUSH AX ;AN024;save length
2195 XOR CX,CX ;AN024;zero file offset
2197 MOV AL,0 ;AN024;move ptr to start of file
2198 MOV AH,42H
;AN024;LSEEK
2200 POP BX ;AN024;restore length
2201 PUSH BX ;AN024;save it again
2202 SHR BX,1 ;AN024;convert to paragraph
2206 INC BX ;AN024;ensure enough room
2209 POP CX ;AN024;restore length
2210 POP BX ;AN024;restore file handle
2212 MOV DX,WR_DATA2SEG
;AN024;GS:DI = target
2213 ADD DX,MAX_MEMPAR
;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
2220 MOV AH,3EH
;AN024;close it
2223 PUSH DS ;AN024;save source segment
2225 MOV DS,AX ;AN024;get DATA segment
2226 MOV AX,WR_DATA2SEG
;AN024;ES:DI = target
2228 MOV DI,WR_DATA2OFF
;AN024;
2229 POP DS ;AN024;restore source segment
2230 XOR SI,SI ;AN024;offset is zero
2232 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2236 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2238 MOV DX,0 ;AN024;initialize result string
2239 EC1: CMP CX,0 ;AN024;any characters left?
2243 EC2: 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
2249 CMP CX,0 ;AN024;any characters left?
2253 EC2_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
2259 EC2_1: CMP AL,1 ;AN024;code <CR>?
2265 EC2_2: CMP AL,2 ;AN024;code <EOF>?
2271 EC3: MOV BL,AL ;AN024;save number of repeats
2273 CMP CX,0 ;AN024;any characters left?
2277 EC3_6: LODSB ;AN024;get actual character
2278 DEC CX ;AN024;adjust character count
2279 CMP AL,REPCHAR
;AN024;coded character?
2282 CMP CX,0 ;AN024;any characters left?
2286 EC3_8: LODSB ;AN024;yes
2287 DEC CX ;AN024;adjust character count
2288 CMP AL,REPCHAR
;AN024;coded repchar?
2291 CMP AL,1 ;AN024;coded <CR>?
2294 MOV AL,13 ;AN024;yes
2297 EC3_1: CMP AL,2 ;AN024;coded <EOF>?
2303 EC3_2: INC CX ;AN024;unknown, restore
2305 MOV AL,REPCHAR
;AN024;
2307 EC4: ADD DL,BL ;AN024;adjust length
2310 EC7: PUSH CX ;AN024;save CX
2311 XOR CX,CX ;AN024;zero CX
2312 MOV CL,BL ;AN024;set repeat number
2314 EC8: REP STOSB ;AN024;store char
2315 POP CX ;AN024;recover CX
2318 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2320 ; Finished expanding panel file
2322 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2325 MOV AX,DATA ;AN024;restore DATA segment
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
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
2336 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2338 ; initialize Color Table information
2340 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2342 .IF < GV_VIDMODE
eq 7 > or ;AN000;
2343 .IF < ACTIVE
eq LCD
> ;AN000;
2345 MOV AX,ES:[DI].MONTBL
;AN000;
2346 MOV BX,ES:[DI].NMONTBL
;AN000;
2348 MOV AX,ES:[DI].COLTBL
;AN000;
2349 MOV BX,ES:[DI].NCOLTBL
;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
2359 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2361 ; initialize PCDISPQ information
2363 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2365 MOV AX,ES:[DI].NPCBS
;AN000;
2366 MOV QM_PCBVECNUM
,AX ;AN000;number of PCB elements in vector
2368 MOV AX,ES:[DI].PCBS
;AN000;
2369 MOV QM_PCBVECOFF
,AX ;AN000;offset of PCB vector
2372 MOV QM_PCBVECSEG
,AX ;AN000;segment of PCB vector
2374 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2376 ; initialize PCPANEL with PCDISPQ and PCPANRD information
2378 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2380 MOV SI,ES:[DI].PCBS
;AN000;offset of PCB vector read from
2381 MOV PM_PCBVECOFF
,SI ;AN000; disk
2383 MOV AX,ES ;AN000;segment of PCB vector read from
2384 MOV PM_PCBVECSEG
,AX ;AN000; disk
2386 MOV CX,ES:[DI].NPCBS
;AN000;number of PCB vectors read from
2387 MOV PM_PCBVECNUM
,CX ;AN000; disk
2389 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2391 ; add segment address to PCBs
2393 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2395 ADD SI,2 ;AN000;move to offset
2397 MOV BX,ES:[SI] ;AN000;
2398 MOV ES:[BX].PCB_EXPANDSEG
,AX ;AN000;
2399 MOV ES:[BX].PCB_CHILDSEG
,AX ;AN000;
2401 LOOP I_PCB_SEG
;AN000;
2403 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2405 ; add segment address to PCB vectors
2407 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2409 MOV CX,ES:[DI].NPCBS
;AN000;number of PCB vectors
2410 MOV SI,ES:[DI].PCBS
;AN000;offset of PCB vectors
2411 I_PCBVEC_SEG: ;AN000;
2412 MOV ES:[SI],AX ;AN000;
2414 LOOP I_PCBVEC_SEG
;AN000;
2416 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2418 ; initialize SCB vector table pointer
2420 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
2428 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2430 ; add segment address to SCBs
2432 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2434 ADD SI,2 ;AN000;move to offset
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;
2452 LOOP I_SCB_SEG
;AN000;
2454 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2456 ; add segment address to SCB vectors
2458 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2460 MOV CX,ES:[DI].NSCBS
;AN000;number of SCB vectors
2461 MOV SI,ES:[DI].SCBS
;AN000;offset of SCB vectors
2462 I_SCBVEC_SEG: ;AN000;
2463 MOV ES:[SI],AX ;AN000;
2465 LOOP I_SCBVEC_SEG
;AN000;
2467 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2469 ; Init 4KB for logical video buffer for PCPANEL
2471 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2474 MOV AX,GV_SCRWIDTH
;AN000;
2475 MOV PM_LVBWIDTH
,AX ;AN000;width of log vid buf in bytes
2477 MOV AX,GV_SCRLEN
;AN000;
2478 MOV PM_LVBLEN
,AX ;AN000;number bytes in logical video
2480 PUSH WR_LVBOFF
;AN000;
2481 POP PM_LVBOFF
;AN000;offset of logical video buffer
2483 PUSH WR_LVBSEG
;AN000;set the allocated segment
2484 POP PM_LVBSEG
;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
2490 MOV AX,GV_SCRLEN
;AN000;
2491 ADD WR_LVBOFF
,AX ;AN000;set new free buffer offset
2493 MOV LVB_INITED
,TRUE
;AN000;LVB always remains
2495 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2497 ; PCDISPQ buffer initialization option
2499 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2501 MOV QM_OPT1
,QM_INIT
;AN000;Initialize working buffer
2503 PUSH WR_MAXCHDQUE
;AN000;
2504 POP QM_MAXCHDQUE
;AN000;max # of child queues to save
2506 PUSH WR_MAXPANQUE
;AN000;
2507 POP QM_MAXPANQUE
;AN000;max # of panel queues to save
2509 PUSH WR_MAXNUMCHD
;AN000;
2510 POP QM_MAXNUMCHD
;AN000;max # of parent panels queued
2512 PUSH WR_MAXNUMPAN
;AN000;
2513 POP QM_MAXNUMPAN
;AN000;max # of child panels queued
2515 PUSH WR_LVBLEN
;AN000;
2516 POP QM_BUFLEN
;AN000;length of avail buffer
2518 PUSH WR_LVBOFF
;AN000;
2519 POP QM_BUFOFF
;AN000;offset of buffer
2521 PUSH WR_LVBSEG
;AN000;
2522 POP QM_BUFSEG
;AN000;segment of buffer
2524 CALL PCDISPQ_CALL
;AN000;update display queue
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
2530 MOV AX,QM_BUFLEN
;AN000;add returned buffer size
2531 ADD WR_LVBOFF
,AX ;AN000;set new free buffer offset
2533 PUSH QM_PANQUEOFF
;AN000;offset address of parent queue
2534 POP PM_PANQUEOFF
;AN000;offset address of parent queue
2536 PUSH QM_PANQUESEG
;AN000;segment address of parent queue
2537 POP PM_PANQUESEG
;AN000;segment address of parent queue
2539 PUSH QM_CHDQUEOFF
;AN000;offset of child queue
2540 POP PM_CHDQUEOFF
;AN000;offset of child queue
2542 PUSH QM_CHDQUESEG
;AN000;segment of child queue
2543 POP PM_CHDQUESEG
;AN000;segment of child queue
2545 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2547 ; Reserve buffer for completed return key buffer
2549 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2551 PUSH WR_MAXRETKSZ
;AN000;maximum number of bytes in return
2552 POP WR_CRETLEN
;AN000; buffer
2554 PUSH WR_LVBOFF
;AN000;offset of completed return buffer
2555 POP WR_CRETOFF
;AN000;
2557 PUSH WR_LVBSEG
;AN000;segment of completed return
2558 POP WR_CRETSEG
;AN000; buffer
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
2564 MOV AX,WR_MAXRETKSZ
;AN000;
2565 ADD WR_LVBOFF
,AX ;AN000;set new free buffer offset
2569 I110: MOV WR_ERROR
,1 ;AN000;set error indicator
2577 INITIALIZE ENDP
;AN000;
2578 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2580 ; INSERT_DISK_ROUTINE: Prompts user for insertion of disk into A: drive
2582 ; INPUT: DISK_PANEL - Panel number to be displayed
2583 ; SEARCH_FILE - File to search for on diskette
2587 ; OPERATION: Panel macros are called to display the panel and search
2589 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2590 PUBLIC INSERT_DISK_ROUTINE
;AN000;
2591 INSERT_DISK_ROUTINE PROC
NEAR ;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;
2603 MOV CX,FK_ENT_LEN
;AN000;
2604 LEA DX,FK_ENT
;AN000;
2605 CALL GET_FUNCTION_CALL
;AN000;
2607 MOV DI, SEARCH_FILE
;AN000;
2608 MOV CX, E_FILE_ATTR
;AN000;
2609 CALL FIND_FILE_ROUTINE
;AN000;
2610 .LEAVE < nc
> ;AN000;
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;
2622 INSERT_DISK_ROUTINE ENDP
;AN000;
2623 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2625 ; Clear the input buffer
2627 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2628 CLEAR_INBUFF PROC
NEAR ;AN059;
2630 CI_1: MOV AH,0BH ;AN059;
2639 CLEAR_INBUFF ENDP
;AN059;
2640 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;