summaryrefslogtreecommitdiff
path: root/v4.0/src/INC/MSGSERV.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/INC/MSGSERV.ASM')
-rw-r--r--v4.0/src/INC/MSGSERV.ASM3133
1 files changed, 3133 insertions, 0 deletions
diff --git a/v4.0/src/INC/MSGSERV.ASM b/v4.0/src/INC/MSGSERV.ASM
new file mode 100644
index 0000000..21f012d
--- /dev/null
+++ b/v4.0/src/INC/MSGSERV.ASM
@@ -0,0 +1,3133 @@
1; * * * * * * * * * * * * START OF SPECIFICATIONS * * * * * * * * * * * * * * *
2;
3; MODULE NAME: MSGSERV.SAL
4;
5; DESCRIPTIVE NAME: Message Services SALUT file
6;
7; FUNCTION: This module incorporates all the messages services and
8; is called upon at build time to INCLUDE the code requested
9; by a utility. Code is requested using the macro MSG_SERVICES.
10;
11; ENTRY POINT: Since this a collection of subroutines, entry point is at
12; requested procedure.
13;
14; INPUT: Since this a collection of subroutines, input is dependent on function
15; requested.
16;
17; EXIT-NORMAL: In all cases, CARRY FLAG = 0
18;
19; EXIT-ERROR: In all cases, CARRY FLAG = 1
20;
21; INTERNAL REFERENCES: (list of included subroutines)
22;
23; - SYSLOADMSG
24; - SYSDISPMSG
25; - SYSGETMSG
26;
27;
28; EXTERNAL REFERENCES: None
29;
30; NOTES: At build time, some modules must be included. These are only included
31; once using assembler switches. Other logic is included at the request
32; of the utility.
33;
34; COMR and COMT are assembler switches to conditionally assemble code
35; for RESIDENT COMMAND.COM and TRANSIENT COMMAND.COM to reduce resident
36; storage and multiple EQUates.
37;
38; REVISION HISTORY: Created MAY 1987
39;
40; Label: DOS - - Message Retriever
41; (c) Copyright 1988 Microsoft
42;
43;
44; * * * * * * * * * * * * END OF SPECIFICATIONS * * * * * * * * * * * * * * * *
45; Page
46
47; $SALUT $M (2,5,22,62) ;;AN000;; Set SALUT formatting
48
49IF $M_STRUC ;;AN000;; IF we haven't included the structures yet THEN
50 $M_STRUC = FALSE ;;AN000;; Let the assembler know that we have
51 ;;AN000;; and include them
52
53 PAGE
54 SUBTTL DOS - Message Retriever - MSGSTR.INC Module
55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
56;;
57;; STRUCTURE: $M_SUBLIST_STRUC
58;;
59;; Replacable parameters are described by a sublist structure
60;;
61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
62 ;;
63$M_SUBLIST_STRUC STRUC ;;AN000;;
64 ;;
65 $M_S_SIZE DB 11 ;;AN000;; SUBLIST size (PTR to next SUBLIST)
66 $M_S_RESV DB 0 ;;AN000;; RESERVED
67 $M_S_VALUE DD ? ;;AN000;; Time, Date or PTR to data item
68 $M_S_ID DB ? ;;AN000;; n of %n
69 $M_S_FLAG DB ? ;;AN000;; Data-type flags
70 $M_S_MAXW DB ? ;;AN000;; Maximum field width
71 $M_S_MINW DB ? ;;AN000;; Minimum field width
72 $M_S_PAD DB ? ;;AN000;; Character for Pad field
73 ;;
74$M_SUBLIST_STRUC ENDS ;;AN000;;
75 ;;
76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
77;;
78;; STRUCTURE: $M_CLASS_ID
79;;
80;; Each class will be defined by this structure.
81;;
82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
83 ;;
84$M_CLASS_ID STRUC ;;AN000;;
85 ;;
86 $M_CLS_ID DB -1 ;;AN000;; Class identifer
87 $M_COMMAND_VER DW EXPECTED_VERSION ;;AN003;; COMMAND.COM version check
88 $M_NUM_CLS_MSG DB 0 ;;AN000;; Total number of message in class
89 ;;
90$M_CLASS_ID ENDS ;;
91 ;;AN000;;
92 $M_CLASS_ID_SZ EQU TYPE $M_CLASS_ID ;;AN000;;
93 ;;
94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
95;;
96;; STRUCTURE: $M_ID_STRUC
97;;
98;; Each message will be defined by this structure.
99;;
100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
101 ;;
102$M_ID STRUC ;;AN000;;
103 ;;
104 $M_NUM DW -1 ;;AN000;; Message Number
105 $M_TXT_PTR DW ? ;;AN000;; Pointer to message text
106 ;;
107$M_ID ENDS ;;AN000;;
108 ;;AN000;; Status Flag Values:
109 $M_ID_SZ EQU TYPE $M_ID ;;AN000;;
110 ;;
111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
112;;
113;; STRUCTURE: $M_RES_ADDRS
114;;
115;; Resident data area definition of variables
116;;
117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
118 ;;
119$M_RES_ADDRS STRUC ;;AN000;;
120 ;;
121 $M_EXT_ERR_ADDRS DD 0 ;;AN000;; Allow pointers to THREE Extended error locations
122 $M_EXT_FILE DD 0 ;;AN001;;
123 $M_EXT_COMMAND DD 0 ;;AN000;;
124 $M_EXT_TERM DD -1 ;;AN000;;
125 $M_PARSE_COMMAND DD 0 ;;AN000;;
126 $M_PARSE_ADDRS DD 0 ;;AN000;; Allow pointers to TWO Parse error locations
127 $M_PARSE_TERM DD -1 ;;AN000;;
128 $M_CRIT_ADDRS DD 0 ;;AN000;; Allow pointers to TWO Critical error locations
129 $M_CRIT_COMMAND DD 0 ;;AN000;;
130 $M_CRIT_TERM DD -1 ;;AN000;;
131 $M_DISK_PROC_ADDR DD -1 ;;AN004;; Address of READ_DISK_PROC
132 $M_CLASS_ADDRS DD $M_NUM_CLS DUP(0) ;;AN000;; Allow pointers to specified classes
133 $M_CLS_TERM DD -1 ;;AN000;;
134 $M_DBCS_VEC DD 0 ;;AN000;; Save DBCS vector
135 $M_HANDLE DW ? ;;AN000;;
136 $M_SIZE DB 0 ;;AN000;;
137 $M_CRLF DB 0DH,0AH ;;AN004;; CR LF message
138 $M_CLASS DB ? ;;AN004;; Saved class
139 $M_RETURN_ADDR DW ? ;;AN000;;
140 $M_MSG_NUM DW $M_NULL ;;AN000;;
141 $M_DIVISOR DW 10 ;;AN000;; Default = 10 (must be a WORD for division)
142 $M_TEMP_BUF DB $M_TEMP_BUF_SZ DUP("$") ;;AN000;; Temporary buffer
143 $M_BUF_TERM DB "$" ;;AN000;;
144
145$M_RES_ADDRS ENDS ;;AN000;;
146 ;;
147$M_RES_ADDRS_SZ EQU TYPE $M_RES_ADDRS ;;AN000;;
148 ;;
149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
150;;
151;; STRUCTURE: $M_COUNTRY_INFO
152;;
153;; Important fields of the Get Country Information call
154;;
155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
156 ;;
157$M_COUNTRY_INFO STRUC ;;AN000;; Expected Country infomation
158 ;;
159 $M_HEADER DB $M_RES_ADDRS_SZ-$M_TEMP_BUF_SZ-1 DUP(?) ;;AN000;; Go past first part of struc
160 $M_DATE_FORMAT DW ? ;;AN000;; <------- Date Format
161 $M_CURR_SEPARA DB 5 DUP(?) ;;AN000;;
162 $M_THOU_SEPARA DB ?,0 ;;AN000;; <------- Thou Separator
163 $M_DECI_SEPARA DB ?,0 ;;AN000;; <------- Decimal Separator
164 $M_DATE_SEPARA DB ?,0 ;;AN000;; <------- Date Separator
165 $M_TIME_SEPARA DB ?,0 ;;AN000;; <------- Time Separator
166 $M_CURR_FORMAT DB ? ;;AN000;;
167 $M_SIG_DIGS_CU DB ? ;;AN000;;
168 $M_TIME_FORMAT DB ? ;;AN000;; <------- Time Format
169 ;;
170$M_COUNTRY_INFO ENDS ;;AN000;;
171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
172 ;;
173ELSE ;;AN000;; ELSE if we have already included the STRUCTURES
174;
175; $SALUT $M (2,5,13,62) ;;AN000;; Set SALUT formatting for code section
176
177 IF MSGDATA ;;AN000;; IF this is a request to include the data area
178 MSGDATA = FALSE ;;AN000;; Let the assembler know not to include it again
179 ;;AN000;; and include it
180 PAGE
181 SUBTTL DOS - Message Retriever - MSGRES.TAB Module
182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
183;;
184;; DATA NAME: $M_RES_TABLE
185;;
186;; REFERENCE LABEL: $M_RT
187;;
188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
189 ;;
190IF COMR ;;AN000;; Since COMMAND.COM includes this twice
191 $M_RT EQU $M_RT2 ;;AN000;; we must redefine the label so no
192 $M_RT2 LABEL BYTE ;;AN000;; assembly errors occur
193 $M_ALTLABEL = TRUE ;;AN000;; Flag that label was changed
194ELSE ;;AN000;;
195 $M_RT LABEL BYTE ;;AN000;;
196ENDIF ;;AN000;;
197 $M_RES_ADDRS <> ;;AN000;; Resident addresses
198 ;;
199 include COPYRIGH.INC ;;AN001;; Include Copyright 1988 Microsoft
200 ;;
201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
202 ENDIF ;;AN000;; END of include of Data table
203
204;
205 IF NOT $M_MSGDATA_ONLY ;;AN000;; IF this was a request for only the data table THEN
206 ;; don't include any more code
207 ;;AN000;; Figure out what other code to include
208 IF DISK_PROC ;;AN003;; Is the request to include the READ_DISK code
209 IF COMR ;;AN003;; (Only Resident COMMAND.COM should ask for it)
210 $M_RT EQU $M_RT2 ;;AN003;;
211 ENDIF
212 DISK_PROC = FALSE ;;AN003;; Yes, THEN include it and reset flag
213 PAGE
214 SUBTTL DOS - Message Retriever - DISK_PROC Module
215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
216;;
217;; PROC NAME: DISK_PROC
218;;
219;; FUNCTION: Used in COMMAND.COM if we need to access the Parse or Extended
220;; errors from disk\diskette
221;; INPUTS: AX has the message number
222;; DX has the message class
223;; AND ... the COMMAND.COM Variable RESGROUP:COMSPEC is
224;; assumed to be set!!
225;;
226;; OUTPUTS: ES:DI points to message length (BYTE) followed by text
227;;
228;;
229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
230 ;;
231 PUBLIC READ_DISK_PROC ;;
232 ;;
233READ_DISK_PROC PROC FAR ;;AN003;;
234
235 PUSH AX ;;AN003;; Save everything
236 PUSH BX ;;AN003;;
237 PUSH DX ;;AN003;;
238 PUSH SI ;;AN003;;
239 PUSH BP ;;AN003;;
240 PUSH DS ;;AN003;;
241 PUSH DI ;;AN003;;
242 MOV BP,AX ;;AN003;; Save message number
243 MOV AX,DOS_EXTENDED_OPEN ;;AN003;; Set INT 21 function
244 LEA SI,RESGROUP:COMSPEC ;;AN003;; Get addressibilty to COMMAND.COM
245 PUSH CS ;;AN003;;
246 POP DS ;;AN003;;
247 MOV DI,-1 ;;AN003;; No extended attribute list
248 MOV BX,NO_CRIT_OPEN ;;AN003;; Don't generate critical error
249 MOV DX,NOT_EX_FAIL_EX_OPEN ;;AN003;; Open Flag
250 INT 21H ;;AN003;; Open the file
251 POP DI ;;AN003;; Retreive LSEEK pointer
252 ;;AN003;; Error ?
253; $IF NC,LONG ;;AN003;; No,
254 JNC $MXL1
255 JMP $MIF1
256$MXL1:
257 PUSH DI ;;AN003;; Save LSEEK pointer
258 MOV BX,AX ;;AN003;; Set handle in BX
259 MOV AX,DOS_LSEEK_FILE ;;AN003;; LSEEK to the errors
260 XOR CX,CX ;;AN003;; Value has been set by COMMAND.COM
261 MOV DX,DI ;;AN003;;
262 INT 21H ;;AN003;; LSEEK the file
263 POP DX ;;AN003;; Retreive LSEEK pointer
264 ;;AN003;; Error ?
265; $IF NC ;;AN003;; No,
266 JC $MIF2
267 INC CX ;;AN003;; Set flag to first pass
268; $DO ;;AN003;;
269$MDO3:
270 PUSH DX ;;AN003;; Save LSEEK pointer
271 PUSH CX ;;AN003;; Save first pass flag
272 PUSH AX ;;AN003;; Save number of messages (if set yet)
273 XOR SI,SI ;;AN003;; Reset buffer index
274 MOV AH,DOS_READ_BYTE ;;AN003;; Read
275 MOV CX,$M_TEMP_BUF_SZ ;;AN003;; the first part of the header
276 LEA DX,$M_RT.$M_TEMP_BUF ;;AN003;; into the temp buffer
277 INT 21H ;;AN003;; Read it
278 MOV DI,DX ;;AN003;;
279 POP AX ;;AN003;;
280 POP CX ;;AN003;;
281 OR CX,CX ;;AN003;;
282; $IF NZ ;;AN003;;
283 JZ $MIF4
284 XOR CX,CX ;;AN003;; Set flag to second pass
285 XOR AH,AH ;;AN003;; Get number of messages in class
286 MOV AL,DS:[DI].$M_NUM_CLS_MSG ;;AN003;;
287 MOV SI,$M_CLASS_ID_SZ ;;AN003;; Initialize index
288 CMP DS:[DI].$M_COMMAND_VER,EXPECTED_VERSION ;;AN003;; Is this the right version of COMMAND.COM?
289; $ENDIF ;;AN003;;
290$MIF4:
291 POP DX ;;AN003;;
292; $IF Z ;;AN003;; Yes,
293 JNZ $MIF6
294; $SEARCH ;;AN003;;
295$MDO7:
296 CMP BP,WORD PTR $M_RT.$M_TEMP_BUF[SI] ;;AN003;; Is this the message I'm looking for?
297; $EXITIF Z ;;AN003;; Yes, (ZF=1)
298 JNZ $MIF7
299 CLC ;;AN003;; Reset carry, exit search
300; $ORELSE ;;AN003;; No, (ZF=0)
301 JMP SHORT $MSR7
302$MIF7:
303 ADD SI,$M_ID_SZ ;;AN003;; Increment index
304 ADD DX,$M_ID_SZ ;;AN003;; Add offset of first header
305 DEC AX ;;AN003;; Decrement # of messages left
306; $LEAVE Z ;;AN003;; Have we exhausted all messages?
307 JZ $MEN7
308 CMP SI,$M_TEMP_BUF_SZ-1 ;;AN003;; No, Have we exhausted the buffer?
309; $ENDLOOP A ;;AN003;; No, Check next message (ZF=1)
310 JNA $MDO7
311$MEN7:
312 STC ;;AN003;; Yes, (ZF=0) set error (ZF=0)
313; $ENDSRCH ;;AN003;;
314$MSR7:
315; $ELSE ;;AN003;; No,
316 JMP SHORT $MEN6
317$MIF6:
318 XOR CX,CX ;;AN003;; Set Zero flag to exit READ Loop
319 STC ;;AN003;; Set Carry
320; $ENDIF ;;AN003;;
321$MEN6:
322; $ENDDO Z ;;AN003;; Get next buffer full if needed
323 JNZ $MDO3
324 ;;AN003;; Error ?
325; $IF NC ;;AN003;; No,
326 JC $MIF16
327 MOV AX,DOS_LSEEK_FILE ;;AN003;; Prepare to LSEEK to the specific message
328 XOR CX,CX ;;AN003;; Value has been set by COMMAND.COM
329 ADD DX,$M_CLASS_ID_SZ ;;AN003;; Add offset of first header
330 ADD DX,WORD PTR $M_RT.$M_TEMP_BUF[SI]+2 ;;AN003;; Add offset from msg structure
331 INT 21H ;;AN003;; LSEEK the file
332 MOV AH,DOS_READ_BYTE ;;AN003;; Read
333 MOV CX,$M_TEMP_BUF_SZ ;;AN003;; the message
334 LEA DX,$M_RT.$M_TEMP_BUF ;;AN003;; into the temp buffer
335 INT 21H ;;AN003;; Read it
336 MOV DI,DX ;;AN003;; into the temp buffer
337 PUSH DS ;;AN003;; into the temp buffer
338 POP ES ;;AN003;; into the temp buffer
339; $ENDIF ;;AN003;;
340$MIF16:
341; $ENDIF ;;AN003;;
342$MIF2:
343 PUSHF ;;AN003;; Close file handle
344 MOV AH,DOS_CLOSE_FILE ;;AN003;; Close file handle
345 INT 21H ;;AN003;;
346 $M_POPF ;;AN003;;
347; $ENDIF ;;AN003;; Yes there was an error,
348$MIF1:
349 POP DS ;;AN003;;
350 POP BP ;;AN003;;
351 POP SI ;;AN003;;
352 POP DX ;;AN003;;
353 POP BX ;;AN003;;
354 POP AX ;;AN003;;
355 ;;AN003;; abort everything
356 RET ;;AN003;;
357
358READ_DISK_PROC ENDP ;;AN003;;
359;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
360 ENDIF ;;AN003;; END of include for DISK_PROC
361;
362
363 IF SETSTDIO ;;AN000;; Is the request to include the code for SETSTDIO
364 SETSTDIO = FALSE ;;AN000;; Yes, THEN include it and reset flag
365 PAGE
366 SUBTTL DOS - Message Retriever - SETSTDIO Module
367;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
368;;
369;; PROC NAME: SETSTDIO
370;;
371;; FUNCTION:
372;; INPUTS:
373;;
374;; OUPUTS:
375;;
376;;
377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
378 ;;
379IF FARmsg ;AN001;
380 SETSTDINON PROC FAR ;AN001;
381ELSE ;AN001;
382 SETSTDINON PROC NEAR ;AN001;
383ENDIF ;AN001;
384 PUSH AX ;AN002; Save changed regs
385 PUSH BX ;AN002;
386 PUSH DX ;AN002;
387 MOV AX,DOS_IOCTL_GET_INFO ;AN001; Get info using IOCTL
388 MOV BX,STDIN ;AN001;
389 XOR DX,DX ;AN001;
390 INT 21H ;AN001;
391
392 OR DH,$M_CRIT_ERR_MASK ;AN001; Turn on bit
393 MOV AX,DOS_IOCTL_SET_INFO ;AN001; Set info using IOCTL
394 INT 21H ;AN001;
395 POP DX ;AN002; Restore Regs
396 POP BX ;AN002;
397 POP AX ;AN002;
398
399 RET ;AN001;
400 ;AN001;
401 SETSTDINON ENDP ;AN001;
402
403IF FARmsg ;AN001;
404 SETSTDINOFF PROC FAR ;AN001;
405ELSE ;AN001;
406 SETSTDINOFF PROC NEAR ;AN001;
407ENDIF ;AN001;
408
409 PUSH AX ;AN002; Save changed regs
410 PUSH BX ;AN002;
411 PUSH DX ;AN002;
412 MOV AX,DOS_IOCTL_GET_INFO ;AN001; Get info using IOCTL
413 MOV BX,STDIN ;AN001;
414 XOR DX,DX ;AN001;
415 INT 21H ;AN001;
416
417 AND DH,NOT $M_CRIT_ERR_MASK ;AN001; Turn off bit
418 MOV AX,DOS_IOCTL_SET_INFO ;AN001; Set info using IOCTL
419 INT 21H ;AN001;
420 POP DX ;AN002; Restore Regs
421 POP BX ;AN002;
422 POP AX ;AN002;
423
424 RET ;AN001;
425
426 SETSTDINOFF ENDP ;AN001;
427
428IF FARmsg ;AN001;
429 SETSTDOUTON PROC FAR ;AN001;
430ELSE ;AN001;
431 SETSTDOUTON PROC NEAR ;AN001;
432ENDIF ;AN001;
433
434 PUSH AX ;AN002; Save changed regs
435 PUSH BX ;AN002;
436 PUSH DX ;AN002;
437 MOV AX,DOS_IOCTL_GET_INFO ;AN001; Get info using IOCTL
438 MOV BX,STDOUT ;AN001;
439 XOR DX,DX ;AN001;
440 INT 21H ;AN001;
441
442 OR DH,$M_CRIT_ERR_MASK ;AN001; Turn on bit
443 MOV AX,DOS_IOCTL_SET_INFO ;AN001; Set info using IOCTL
444 INT 21H ;AN001;
445 POP DX ;AN002; Restore Regs
446 POP BX ;AN002;
447 POP AX ;AN002;
448
449 RET ;AN001;
450
451 SETSTDOUTON ENDP ;AN001;
452
453IF FARmsg ;AN001;
454 SETSTDOUTOFF PROC FAR ;AN001;
455ELSE ;AN001;
456 SETSTDOUTOFF PROC NEAR
457ENDIF ;AN001;
458
459 PUSH AX ;AN002; Save changed regs
460 PUSH BX ;AN002;
461 PUSH DX ;AN002;
462 MOV AX,DOS_IOCTL_GET_INFO ;AN001; Get info using IOCTL
463 MOV BX,STDOUT ;AN001;
464 XOR DX,DX ;AN001;
465 INT 21H ;AN001;
466
467 AND DH,NOT $M_CRIT_ERR_MASK ;AN001; Turn off bit
468 MOV AX,DOS_IOCTL_SET_INFO ;AN001; Set info using IOCTL
469 INT 21H ;AN001;
470 POP DX ;AN002; Restore Regs
471 POP BX ;AN002;
472 POP AX ;AN002;
473
474 RET ;AN001;
475
476 SETSTDOUTOFF ENDP ;AN001;
477;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
478 ENDIF ;;AN000;; END of include for SETSTDIO
479;
480 IF LOADmsg ;;AN000;; Is the request to include the code for SYSLOADMSG ?
481 IF COMR ;;AN000;;
482 $M_RT EQU $M_RT2 ;;AN000;;
483 ENDIF
484 LOADmsg = FALSE ;;AN000;; Yes, THEN include it and reset flag
485 PAGE
486 SUBTTL DOS - Message Retriever - LOADMSG.ASM Module
487;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
488;;
489;; PROC NAME: SYSLOADMSG
490;;
491;; FUNCTION:
492;; INPUTS:
493;;
494;; OUPUTS:
495;;
496;;
497;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
498 ;;
499IF FARmsg ;;AN000;;
500 SYSLOADMSG PROC FAR ;;AN000;;
501ELSE ;;AN000;;
502 SYSLOADMSG PROC NEAR ;;AN000;;
503ENDIF ;;AN000;;
504 PUSH AX ;;AN000;
505 PUSH BX ;;AN000;
506 PUSH DX ;;AN000;
507 PUSH ES ;;AN000;
508 PUSH DI ;;AN000;
509 XOR CX,CX ;;AN000; Reset to zero
510 MOV ES,CX ;;AN000;
511 XOR DI,DI ;;AN000;
512 MOV AX,DOS_GET_EXT_PARSE_ADD ;;AN000;; 2FH Interface
513 MOV DL,DOS_GET_EXTENDED ;;AN000;; Where are the Extended errors in COMMAND.COM
514 INT 2FH ;;AN000;; Private interface
515 MOV WORD PTR $M_RT.$M_EXT_COMMAND+2,ES ;;AN000;; Move into first avaliable table location
516 MOV WORD PTR $M_RT.$M_EXT_COMMAND,DI ;;AN000;;
517 ;;
518 MOV AX,DOS_GET_EXT_PARSE_ADD ;;AN000;; 2FH Interface
519 MOV DL,DOS_GET_PARSE ;;AN000;; Where are the Parse errors in COMMAND.COM
520 INT 2FH ;;AN000;; Private interface
521 MOV WORD PTR $M_RT.$M_PARSE_COMMAND+2,ES ;;AN000;; Move into first avaliable table location
522 MOV WORD PTR $M_RT.$M_PARSE_COMMAND,DI ;;AN000;;
523 ;;
524 MOV AX,DOS_GET_EXT_PARSE_ADD ;;AN000;; 2FH Interface
525 MOV DL,DOS_GET_CRITICAL ;;AN000;; Where are the Critical errors in COMMAND.COM
526 INT 2FH ;;AN000;; Private interface
527 MOV WORD PTR $M_RT.$M_CRIT_COMMAND+2,ES ;;AN000;; Move into first avaliable table location
528 MOV WORD PTR $M_RT.$M_CRIT_COMMAND,DI ;;AN000;;
529
530 MOV AX,DOS_GET_EXT_PARSE_ADD ;;AN001;; 2FH Interface
531 MOV DL,DOS_GET_FILE ;;AN001;; Where are the FILE dependant in IFSFUNC.EXE
532 INT 2FH ;;AN001;; Private interface
533 MOV WORD PTR $M_RT.$M_EXT_FILE+2,ES ;;AN001;; Move into first avaliable table location
534 MOV WORD PTR $M_RT.$M_EXT_FILE,DI ;;AN001;;
535
536IF COMR ;; ** Special case for RESIDENT COMMAND.COM
537 IF2
538 IFNDEF READ_DISK_INFO ;;AN003;;
539 Extrn READ_DISK_PROC:Far ;;AN003;;
540 ENDIF ;;AN003;;
541 ENDIF ;;AN003;;
542ELSE ;;
543 IF FARmsg ;;AN000;;
544 CALL FAR PTR $M_MSGSERV_1 ;;AN000;; Get addressibilty to MSGSERV CLASS 1 (EXTENDED Errors)
545 ELSE ;;AN000;;
546 CALL $M_MSGSERV_1 ;;AN000;; Get addressibilty to MSGSERV CLASS 1 (EXTENDED Errors)
547 ENDIF ;;AN000;;
548 MOV WORD PTR $M_RT.$M_EXT_ERR_ADDRS+2,ES ;;AN000;; Move into first avaliable table location
549 MOV WORD PTR $M_RT.$M_EXT_ERR_ADDRS,DI ;;AN000;;
550 MOV WORD PTR $M_RT.$M_CRIT_ADDRS+2,ES ;;AN000;; Move into first avaliable table location
551 MOV WORD PTR $M_RT.$M_CRIT_ADDRS,DI ;;AN000;;
552 ;;
553 IF FARmsg ;;AN000;;
554 CALL FAR PTR $M_MSGSERV_2 ;;AN000;; Get addressibilty to MSGSERV CLASS 2 (PARSE Errors)
555 ELSE ;;AN000;;
556 CALL $M_MSGSERV_2 ;;AN000;; Get addressibilty to MSGSERV CLASS 2 (PARSE Errors)
557 ENDIF ;;AN000;;
558 MOV WORD PTR $M_RT.$M_PARSE_ADDRS+2,ES ;;AN000;; Move into first avaliable table location
559 MOV WORD PTR $M_RT.$M_PARSE_ADDRS,DI ;;AN000;;
560ENDIF ;;
561 ;;
562 MOV AX,DOS_GET_EXT_PARSE_ADD ;;AN001;; 2FH Interface
563 MOV DL,DOS_GET_ADDR ;;AN001;; Where is the READ_DISK_PROC in COMMAND.COM
564 INT 2FH ;;AN001;; Private interface
565 MOV WORD PTR $M_RT.$M_DISK_PROC_ADDR+2,ES ;;AN001;; Move into first avaliable table location
566 MOV WORD PTR $M_RT.$M_DISK_PROC_ADDR,DI ;;AN001;;
567
568 $M_BUILD_PTRS %$M_NUM_CLS ;;AN000;; Build all utility classes
569 ;;AN000;;
570 CALL $M_GET_DBCS_VEC ;;AN000;; Save the DBCS vector
571
572IF NOT NOCHECKSTDIN ;;AN000;; IF EOF check is not to be suppressed
573 CALL $M_CHECKSTDIN ;;AN000;; Set EOF CHECK
574ENDIF ;;AN000;;
575 ;;AN000;;
576IF NOT NOCHECKSTDOUT ;;AN000;; IF Disk Full check is not to be suppressed
577 CALL $M_CHECKSTDOUT ;;AN000;; Set Disk Full CHECK
578ENDIF ;;AN000;;
579 ;;AN000;;
580IF NOVERCHECKmsg ;;AN000;; IF version check is to be supressed
581 CLC ;;AN000;; Make sure carry is clear
582ELSE ;;AN000;; ELSE
583 PUSH CX ;;AN000;;
584 CALL $M_VERSION_CHECK ;;AN000;; Check Version
585ENDIF ;;AN000;;
586 ;; Error ?
587; $IF NC ;;AN000;; No.
588 JC $MIF20
589IF NOT NOVERCHECKmsg ;;AN000;; IF version check was not supressed
590 POP CX ;;AN000;; Reset stack
591ENDIF ;;AN000;;
592 POP DI ;;AN000;; Restore REGS
593 POP ES ;;AN000;;
594 POP DX ;;AN000;;
595 POP BX ;;AN000;;
596 POP AX ;;AN000;;
597; $ELSE ;;AN000;; Yes,
598 JMP SHORT $MEN20
599$MIF20:
600IF NOVERCHECKmsg ;;AN000;; IF version check is to be supressed
601 ADD SP,10 ;;AN000;;
602 STC ;;AN000;; Reset carry flag
603ELSE ;;AN000;; IF version check is to be supressed
604 ADD SP,12 ;;AN000;;
605 STC ;;AN000;; Reset carry flag
606ENDIF ;;AN000;; IF version check is to be supressed
607; $ENDIF ;;AN000;;
608$MEN20:
609 RET ;;AN000;;
610 ;;
611 SYSLOADMSG ENDP ;;AN000;;
612;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
613 PAGE
614 SUBTTL DOS - Message Retriever - $M_VERSION_CHECK Proc
615;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
616;;
617;; Proc Name: $M_GET_DBCS_VEC
618;;
619;; Function: Get the DBCS vector and save it for later use
620;;
621;; Inputs: None
622;;
623;; Outputs: None
624;;
625;; Regs Changed:
626;;
627;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
628 ;;
629$M_GET_DBCS_VEC PROC NEAR ;;AN000;;
630 ;;
631 PUSH AX ;;AN000;; Save character to check
632 PUSH SI ;;AN000;;
633 PUSH DS ;;AN000;;
634 MOV AX,DOS_GET_DBCS_INFO ;;AN000;; DOS function to get DBSC environment
635 INT 21H ;;AN000;; Get environment pointer
636 PUSH DS ;;AN000;; Get environment pointer
637 POP ES ;;AN000;; Get environment pointer
638 POP DS ;;AN000;; Get environment pointer
639; $IF NC ;;AN000;;
640 JC $MIF23
641 MOV WORD PTR $M_RT.$M_DBCS_VEC,SI ;;AN000;; Save DBCS Vector
642 MOV WORD PTR $M_RT.$M_DBCS_VEC+2,ES ;;AN000;;
643; $ENDIF ;;AN000;;
644$MIF23:
645 POP SI ;;AN000;;
646 POP AX ;;AN000;; Retrieve character to check
647 RET ;;AN000;; Return
648 ;;
649$M_GET_DBCS_VEC ENDP ;;
650 ;;
651;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
652 IF NOCHECKSTDIN ;AN001; Are we suppose to include the code for Checking EOF ?
653 ELSE ;AN001; Yes, THEN include it
654 PAGE
655 SUBTTL DOS - Message Retriever - $M_CHECKSTDIN Proc
656;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
657;;
658;; Proc Name: $M_CHECKSTDIN
659;;
660;; Function:
661;;
662;; Inputs: None
663;;
664;; Outputs:
665;;
666;; Regs Changed:
667;;
668;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
669 ;;
670$M_CHECKSTDIN PROC NEAR ;AN001;
671
672 MOV AX,DOS_IOCTL_GET_INFO ;AN001; Get info using IOCTL
673 MOV BX,STDIN ;AN001;
674 XOR DX,DX ;AN001;
675 INT 21H ;AN001;
676
677 OR DH,$M_CRIT_ERR_MASK ;AN001; Turn on bit
678 MOV AX,DOS_IOCTL_SET_INFO ;AN001; Set info using IOCTL
679 INT 21H ;AN001;
680
681 RET ;AN001;
682
683$M_CHECKSTDIN ENDP ;AN001;
684 ;;
685;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
686 ENDIF ;AN001; END of include for EOF Check
687 IF NOCHECKSTDOUT ;AN001; Are we suppose to include the code for Checking Disk Full?
688 ELSE ;AN001; Yes, THEN include it
689 PAGE
690 SUBTTL DOS - Message Retriever - $M_CHECKSTDOUT Proc
691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
692;;
693;; Proc Name: $M_CHECKSTDOUT
694;;
695;; Function:
696;;
697;; Inputs: None
698;;
699;; Outputs:
700;;
701;; Regs Changed:
702;;
703;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
704 ;;
705$M_CHECKSTDOUT PROC NEAR ;AN001;
706
707 MOV AX,DOS_IOCTL_GET_INFO ;AN001; Get info using IOCTL
708 MOV BX,STDOUT ;AN001;
709 XOR DX,DX ;AN001;
710 INT 21H ;AN001;
711
712 OR DH,$M_CRIT_ERR_MASK ;AN001; Turn on bit
713 MOV AX,DOS_IOCTL_SET_INFO ;AN001; Set info using IOCTL
714 INT 21H ;AN001;
715
716 RET ;AN001;
717
718$M_CHECKSTDOUT ENDP ;AN001;
719 ;;
720;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
721 ENDIF ;AN001; END of include for Disk Full Check
722 IF NOVERCHECKmsg ;;AN000;; Are we suppose to include the code for DOS version check?
723 ELSE ;;AN000;; Yes, THEN include it
724 PAGE
725 SUBTTL DOS - Message Retriever - $M_VERSION_CHECK Proc
726;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
727;;
728;; Proc Name: $M_VERSION_CHECK
729;;
730;; Function: Determine if DOS version is within allowable limits
731;;
732;; Inputs: None
733;;
734;; Outputs: CARRY_FLAG = 1 if Incorrect DOS version
735;; Registers set for SYSDISPMSG
736;; CARRY_FLAG = 0 if Correct DOS version
737;;
738;; Regs Changed: AX
739;;
740;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
741 ;;
742$M_VERSION_CHECK PROC NEAR ;;AN000;;
743 ;;
744 MOV AH,DOS_GET_VERSION ;;AN000;; Check that version matches VERSIONA.INC
745 INT 21H ;;AN000;;
746 ;;
747 CMP AX,EXPECTED_VERSION ;;AN000;; IF DOS_MAJOR is correct
748; $IF E ;;AN000;;
749 JNE $MIF25
750 CLC ;;AN000;; Clear the carry flag
751; $ELSE ;;AN000;; ELSE
752 JMP SHORT $MEN25
753$MIF25:
754IF NOT COMR ;; ** Special case for RESIDENT COMMAND.COM
755 CMP AX,LOWEST_4CH_VERSION ;;AN000;; Does this version support AH = 4CH
756; $IF B ;;AN000;; No,
757 JNB $MIF27
758 MOV BX,NO_HANDLE ;;AN000;; No handle (version doesn't support)
759; $ELSE ;;AN000;; Yes,
760 JMP SHORT $MEN27
761$MIF27:
762 MOV BX,STDERR ;;AN000;; Standard Error
763; $ENDIF ;;AN000;;
764$MEN27:
765ELSE
766 MOV BX,NO_HANDLE ;;AN000;; No handle
767ENDIF
768 MOV AX,1 ;;AN000;; Set message # 1
769 MOV CX,NO_REPLACE ;;AN000;; No replacable parms
770 MOV DL,NO_INPUT ;;AN000;; No input
771 MOV DH,UTILITY_MSG_CLASS ;;AN000;; Utility class message
772 STC ;;AN000;; Set Carry Flag
773; $ENDIF ;;AN000;;
774$MEN25:
775 ;;
776 RET ;;AN000;; Return
777 ;;
778$M_VERSION_CHECK ENDP ;;
779 ;;
780;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
781 ENDIF ;;AN000;; END of include for DOS version check
782 ENDIF ;;AN000;; END of include for SYSLOADMSG
783;
784 IF GETmsg ;;AN000;; Is the request to include the code for SYSGETMSG ?
785 IF COMR ;;AN000;;
786 $M_RT EQU $M_RT2 ;;AN000;;
787 ENDIF ;;AN000;;
788 GETmsg = FALSE ;;AN000;; Yes, THEN include it and reset flag
789 PAGE
790 SUBTTL DOS - Message Retriever - GETMSG.ASM Module
791;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
792;;
793;; Proc Name: SYSGETMSG
794;;
795;; Function: The GET service returns the segment, offset and size of the
796;; message text to the caller based on a message number.
797;; The GET function will not display the message thus assumes
798;; caller will handle replaceable parameters.
799;;
800;; Inputs:
801;;
802;; Outputs:
803;;
804;; Psuedocode:
805;; Call $M_GET_MSG_ADDRESS
806;; IF MSG_NUM exists THEN
807;; Set DS:SI = MSG_TXT_PTR + 1
808;; CARRY_FLAG = 0
809;; ELSE
810;; CARRY_FLAG = 1
811;; ENDIF
812;;
813;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
814 ;;
815IF FARmsg ;;AN000;;
816 SYSGETMSG PROC FAR ;;AN000;;
817ELSE ;;AN000;;
818 SYSGETMSG PROC NEAR ;;AN000;;
819ENDIF ;;AN000;;
820 ;;
821;; Save registers needed later
822
823 PUSH AX ;;AN000;; Save changed regs
824 PUSH ES ;;AN000;;
825 PUSH DI ;;AN000;;
826 PUSH BP ;;AN000;;
827 ;;
828IF FARmsg ;;AN000;;
829 CALL FAR PTR $M_GET_MSG_ADDRESS ;;AN000;; Scan thru classes to find message
830ELSE ;;AN000;;
831 CALL $M_GET_MSG_ADDRESS ;;AN000;; Scan thru classes to find message
832ENDIF ;;AN000;; Return message in ES:DI
833; $IF NC ;;AN000;; Message found?
834 JC $MIF31
835 CMP DH,UTILITY_MSG_CLASS
836 CLC ;;AN000;;
837; $IF NE
838 JE $MIF32
839 PUSH ES ;;AN000;;
840 POP DS ;;AN000;; Return message in DS:SI
841; $ELSE
842 JMP SHORT $MEN32
843$MIF32:
844IF FARmsg ;;AN000;; Yes,
845 PUSH ES ;;AN000;;
846 POP DS ;;AN000;; Return message in DS:SI
847ELSE ;;AN000;;
848 PUSH CS ;;AN000;; Return message in DS:SI
849 POP DS ;;AN000;;
850ENDIF ;;AN000;;
851; $ENDIF ;;AN000;;
852$MEN32:
853 MOV SI,DI ;;AN000;; Return message in DS:SI
854; $ENDIF ;;AN000;;
855$MIF31:
856 ;;
857 POP BP ;;AN000;; Restore changed regs
858 POP DI ;;AN000;;
859 POP ES ;;AN000;;
860 POP AX ;;AN000;;
861 ;;
862 RET ;;AN000;; Return
863 ;;
864 SYSGETMSG ENDP ;;
865;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
866 IF $M_SUBS ;;AN000;; Include the common subroutines if they haven't yet
867 $M_SUBS = FALSE ;;AN000;; No, then include and reset the flag
868;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
869;;
870;; PROC NAME: $M_GET_MSG_ADDRESS
871;;
872;; FUNCTION: To scan thru classes to return pointer to the message header
873;; INPUTS: Access to $M_RES_ADDRESSES
874;; OUPUTS: IF CX = 0 THEN Message was not found
875;; IF CX > 1 THEN ES:DI points to the specified message
876;; REGS CHANGED: ES,DI,CX
877;;
878;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
879 ;;
880IF FARmsg ;;AN000;;
881 $M_GET_MSG_ADDRESS PROC FAR ;;AN000;;
882ELSE ;;AN000;;
883 $M_GET_MSG_ADDRESS PROC NEAR ;;AN000;;
884ENDIF ;;AN000;;
885 ;;
886 PUSH SI ;;AN000;;
887 PUSH BX ;;AN000;;
888 XOR SI,SI ;;AN000;; Use SI as an index
889 XOR CX,CX ;;AN000;; Use CX as an size
890; $DO ;;AN000;;
891$MDO36:
892 CMP DH,UTILITY_MSG_CLASS ;;AN000;; Were utility messages requested?
893; $IF E ;;AN000;; Yes,
894 JNE $MIF37
895 IF FARmsg ;;AN000;;
896 LES DI,DWORD PTR $M_RT.$M_CLASS_ADDRS[SI] ;;AN000;; Get address of class
897 MOV BX,ES ;;AN000;
898 ELSE ;;AN000;;
899 MOV DI,WORD PTR $M_RT.$M_CLASS_ADDRS[SI] ;;AN000;; Get address of class
900 MOV BX,DI ;;AN000;
901 ENDIF ;;AN000;;
902; $ELSE ;;AN000;; No,
903 JMP SHORT $MEN37
904$MIF37:
905 TEST DH,PARSE_ERR_CLASS ;;AN000;; Were parse errors requested?
906; $IF NE ;;AN000;; Yes,
907 JE $MIF39
908 LES DI,DWORD PTR $M_RT.$M_PARSE_COMMAND[SI] ;;AN000;; Get address of class
909 MOV BX,ES ;;AN000;
910; $ELSE ;;AN000;; No, extended errors were specified
911 JMP SHORT $MEN39
912$MIF39:
913 CMP AX,$M_CRIT_LO ;;AN000;; Is this a critical error?
914; $IF AE,AND ;;AN000;;
915 JNAE $MIF41
916 CMP AX,$M_CRIT_HI ;;AN000;;
917; $IF BE ;;AN000;; Yes,
918 JNBE $MIF41
919 LES DI,DWORD PTR $M_RT.$M_CRIT_ADDRS[SI] ;;AN000;; Get address of class
920 MOV BX,ES ;;AN000;
921; $ELSE ;;AN000;;
922 JMP SHORT $MEN41
923$MIF41:
924 LES DI,DWORD PTR $M_RT.$M_EXT_ERR_ADDRS[SI] ;;AN000;; Get address of class
925 MOV BX,ES ;;AN000;
926; $ENDIF ;;AN000;;
927$MEN41:
928; $ENDIF ;;AN000;;
929$MEN39:
930; $ENDIF ;;AN000;;
931$MEN37:
932 ;;
933 CMP BX,$M_TERMINATING_FLAG ;;AN000;; Are we finished all classes?
934; $IF E ;;AN000;; Yes,
935 JNE $MIF46
936 CMP DH,UTILITY_MSG_CLASS ;;AN000;; Was it a UTILITY class?
937; $IF E ;;AN000;; Yes,
938 JNE $MIF47
939 STC ;;AN000;; Set the carry flag
940; $ELSE ;;AN000;; No,
941 JMP SHORT $MEN47
942$MIF47:
943 MOV $M_RT.$M_MSG_NUM,AX ;;AN000;; Save message number
944 MOV AX,$M_SPECIAL_MSG_NUM ;;AN000;; Set special message number
945 MOV BP,$M_ONE_REPLACE ;;AN000;; Set one replace in message
946 XOR SI,SI ;;AN000;; Reset the SI index to start again
947 CLC ;;AN000;;
948; $ENDIF ;;AN000;; No,
949$MEN47:
950; $ELSE ;;AN000;;
951 JMP SHORT $MEN46
952$MIF46:
953 CMP BX,$M_CLASS_NOT_EXIST ;;AN000;; Does this class exist?
954; $IF NE ;;AN001;; Yes,
955 JE $MIF51
956 CALL $M_FIND_SPECIFIED_MSG ;;AN000;; Try to find the message
957; $ENDIF ;;AN000;;
958$MIF51:
959 ADD SI,$M_ADDR_SZ_FAR ;;AN000;; Get next class
960 CLC ;;AN000;;
961; $ENDIF ;;AN000;;
962$MEN46:
963; $LEAVE C ;;AN000;;
964 JC $MEN36
965 OR CX,CX ;;AN000;; Was the message found?
966; $ENDDO NZ,LONG ;;AN000;;
967 JNZ $MXL2
968 JMP $MDO36
969$MXL2:
970$MEN36:
971
972 PUSHF ;;AN006;; Save the flag state
973 CMP DH,EXT_ERR_CLASS ;;AN006;; Was an extended error requested?
974; $IF E ;;AN006;; Yes,
975 JNE $MIF56
976 PUSH DX ;;AN006;; Save all needed registers
977 PUSH BP ;;AN006;;
978 PUSH CX ;;AN006;;
979 PUSH ES ;;AN006;;
980 PUSH DI ;;AN006;;
981 PUSH AX ;;AN006;;
982
983 MOV AX,IFSFUNC_INSTALL_CHECK ;;AN006;; Check if IFSFUNC is installed
984 INT 2FH ;;AN006;;
985 CMP AL,IFSFUNC_INSTALLED ;;AN006;; Is it installed?
986 POP AX ;;AN006;; Restore msg number
987; $IF E ;;AN006;; Yes,
988 JNE $MIF57
989 MOV BX,AX ;;AN006;; BX is the extended error number
990 MOV AX,IFS_GET_ERR_TEXT ;;AN006;; AX is the muliplex number
991 INT 2FH ;;AN006;; Call IFSFUNC
992; $ELSE ;;AN006;; No,
993 JMP SHORT $MEN57
994$MIF57:
995 STC ;;AN006;; Carry conditon
996; $ENDIF ;;AN006;;
997$MEN57:
998
999; $IF C ;;AN006;; Was there an update?
1000 JNC $MIF60
1001 POP DI ;;AN006;; No,
1002 POP ES ;;AN006;; Restore old pointer
1003 POP CX ;;AN006;;
1004; $ELSE ;;AN006;; Yes
1005 JMP SHORT $MEN60
1006$MIF60:
1007 ADD SP,6 ;;AN006;; Throw away old pointer
1008 CALL $M_SET_LEN_IN_CX ;;AN006;; Get the length of the ASCIIZ string
1009; $ENDIF ;;AN006;;
1010$MEN60:
1011 POP BP ;;AN006;; Restore other Regs
1012 POP DX ;;AN006;;
1013; $ENDIF ;;AN006;;
1014$MIF56:
1015 $M_POPF ;;AN006;; Restore the flag state
1016
1017 POP BX ;;AN000;;
1018 POP SI ;;AN000;;
1019 RET ;;AN000;; Return ES:DI pointing to the message
1020 ;;
1021$M_GET_MSG_ADDRESS ENDP ;;
1022 ;;
1023$M_SET_LEN_IN_CX PROC NEAR ;;
1024 ;;
1025 PUSH DI ;;AN006;; Save position
1026 PUSH AX ;;AN006;;
1027 MOV CX,-1 ;;AN006;; Set CX for decrements
1028 XOR AL,AL ;;AN006;; Prepare compare register
1029 REPNE SCASB ;;AN006;; Scan for zero
1030 NOT CX ;;AN006;; Change decrement into number
1031 DEC CX ;;AN006;; Don't include the zero
1032 POP AX ;;AN006;;
1033 POP DI ;;AN006;; Restore position
1034 RET ;;AN006;;
1035 ;;
1036$M_SET_LEN_IN_CX ENDP ;;
1037 ;;
1038;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1039;;
1040;; PROC NAME: $M_FIND_SPECIFIED_MSG
1041;;
1042;; FUNCTION: To scan thru message headers until message is found
1043;; INPUTS: ES:DI points to beginning of msg headers
1044;; CX contains the number of messages in class
1045;; DH contains the message class
1046;; OUPUTS: IF CX = 0 THEN Message was not found
1047;; IF CX > 1 THEN ES:DI points to header of specified message
1048;;
1049;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1050 ;;
1051$M_FIND_SPECIFIED_MSG PROC NEAR ;;AN000;;
1052 ;;
1053 CMP BX,1 ;;AN004;; Do we have an address to CALL?
1054; $IF E,AND ;;AN004;; Yes,
1055 JNE $MIF64
1056 CMP WORD PTR $M_RT.$M_DISK_PROC_ADDR,-1 ;;AN004;; Do we have an address to CALL?
1057; $IF NE ;;AN004;; Yes,
1058 JE $MIF64
1059 CMP AX,$M_SPECIAL_MSG_NUM ;;AN004;; Are we displaying a default Ext Err?
1060; $IF E ;;AN004;; . . . and . . .
1061 JNE $MIF65
1062 PUSH AX ;;AN004;; Reset the special message number
1063 MOV AX,$M_RT.$M_MSG_NUM ;;AN004;; Get the old message number
1064 CALL DWORD PTR $M_RT.$M_DISK_PROC_ADDR ;;AN004;; Call the READ_DISK_PROC to get error text
1065 POP AX ;;AN004;; Reset the special message number
1066; $ELSE ;;AN004;; Get the old message number
1067 JMP SHORT $MEN65
1068$MIF65:
1069 CALL DWORD PTR $M_RT.$M_DISK_PROC_ADDR ;;AN004;; Call the READ_DISK_PROC to get error text
1070; $ENDIF ;;AN004;; Get the old message number
1071$MEN65:
1072; $ELSE ;;AN004;;
1073 JMP SHORT $MEN64
1074$MIF64:
1075 XOR CX,CX ;;AN002;; CX = 0 will allow us to
1076 CMP DH,UTILITY_MSG_CLASS ;;AN001;;
1077; $IF NE ;;AN001;;
1078 JE $MIF69
1079 MOV CL,BYTE PTR ES:[DI].$M_NUM_CLS_MSG ;;AN001;; Get number of messages in class
1080; $ELSE ;;AN001;;
1081 JMP SHORT $MEN69
1082$MIF69:
1083IF FARmsg ;;AN001;;
1084 CMP BYTE PTR ES:[DI].$M_CLASS_ID,DH ;;AN002;; Check if class still exists at
1085ELSE
1086 CMP BYTE PTR CS:[DI].$M_CLASS_ID,DH ;;AN002;; Check if class still exists at
1087ENDIF
1088; $IF E ;;AN002;; pointer (hopefully)
1089 JNE $MIF71
1090IF FARmsg ;;AN001;;
1091 MOV CL,BYTE PTR ES:[DI].$M_NUM_CLS_MSG ;;AN000;; Get number of messages in class
1092ELSE
1093 MOV CL,BYTE PTR CS:[DI].$M_NUM_CLS_MSG ;;AN000;; Get number of messages in class
1094ENDIF
1095; $ENDIF ;;AN002;; go on to the next class
1096$MIF71:
1097; $ENDIF ;;AN001;;
1098$MEN69:
1099 ADD DI,$M_CLASS_ID_SZ ;;AN000;; Point past the class header
1100 STC ;;AN004;; Flag that we haven't found anything yet
1101; $ENDIF ;;AN004;;
1102$MEN64:
1103
1104; $IF C ;;AN004;; Have we found anything yet?
1105 JNC $MIF75
1106 CLC ;;AN004;; No, reset carry
1107; $SEARCH ;;AN000;;
1108$MDO76:
1109 OR CX,CX ;;AN000;; Do we have any to check?
1110; $LEAVE Z ;;AN000;; No, return with CX = 0
1111 JZ $MEN76
1112 CMP DH,UTILITY_MSG_CLASS ;;AN001;;
1113; $IF NE ;;AN001;;
1114 JE $MIF78
1115 CMP AX,WORD PTR ES:[DI].$M_NUM ;;AN001;; Is this the message requested?
1116; $ELSE ;;AN001;;
1117 JMP SHORT $MEN78
1118$MIF78:
1119IF FARmsg ;;AN001;;
1120 CMP AX,WORD PTR ES:[DI].$M_NUM ;;AN000;; Is this the message requested?
1121ELSE
1122 CMP AX,WORD PTR CS:[DI].$M_NUM ;;AN000;; Is this the message requested?
1123ENDIF
1124; $ENDIF
1125$MEN78:
1126; $EXITIF E ;;AN000;;
1127 JNE $MIF76
1128; $ORELSE ;;AN000;
1129 JMP SHORT $MSR76
1130$MIF76:
1131 DEC CX ;;AN000;; No, well do we have more to check?
1132; $LEAVE Z ;;AN000;; No, return with CX = 0
1133 JZ $MEN76
1134 ADD DI,$M_ID_SZ ;;AN000;; Yes, skip past msg header
1135; $ENDLOOP ;;AN000;;
1136 JMP SHORT $MDO76
1137$MEN76:
1138 STC ;;AN000;;
1139; $ENDSRCH ;;AN000;; Check next message
1140$MSR76:
1141; $IF NC ;;AN000;; Did we find the message?
1142 JC $MIF86
1143 CMP DH,UTILITY_MSG_CLASS ;;AN001;; Yes, is it a utility message?
1144 CLC ;;AN001;;
1145; $IF E ;;AN001;;
1146 JNE $MIF87
1147IF FARmsg ;;AN001;;
1148ELSE ;;AN000;;
1149 PUSH CS ;;AN000;;
1150 POP ES ;;AN000;; Return ES:DI pointing to the message
1151ENDIF
1152; $ENDIF ;;AN001;;
1153$MIF87:
1154 ADD DI,WORD PTR ES:[DI].$M_TXT_PTR ;;AN000;; Prepare ES:DI pointing to the message
1155; $ENDIF ;;AN004;;
1156$MIF86:
1157; $ENDIF ;;AN004;;
1158$MIF75:
1159 ;; Yes, great we can return with CX > 0
1160
1161; $IF NC ;;AN000;; Did we find the message?
1162 JC $MIF91
1163 XOR CH,CH ;;AN000;;
1164 MOV CL,BYTE PTR ES:[DI] ;;AN000;; Move size into CX
1165 INC DI ;;AN000;; Increment past length
1166; $ENDIF ;;AN004;;
1167$MIF91:
1168
1169 MOV $M_RT.$M_SIZE,$M_NULL ;;AN004;; Reset variable
1170 RET ;;AN000;; Return
1171 ;;
1172$M_FIND_SPECIFIED_MSG ENDP ;;AN000;;
1173 ;;
1174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1175 ENDIF ;;AN000;; END of include of common subroutines
1176 ENDIF ;;AN000;; END of include of SYSGETMSG
1177;
1178 IF DISPLAYmsg ;;AN000;; Is the request to include the code for SYSGETMSG ?
1179 IF COMR ;;AN000;;
1180 $M_RT EQU $M_RT2 ;;AN000;;
1181 ENDIF ;;AN000;;
1182 DISPLAYmsg = FALSE ;;AN000;; Yes, THEN include it and reset flag
1183 PAGE
1184 SUBTTL DOS - Message Retriever - DISPMSG.ASM Module
1185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1186;;
1187;; Proc Name: SYSDISPMSG
1188;;
1189;; Function: The DISPLAY service will output a defined message to a handle
1190;; requested by the caller. It also provides function to display
1191;; messages when handles are not applicable (ie. DOS function calls
1192;; 00h to 0Ah) Replaceable parameters are allowed and are
1193;; defined previous to entry.
1194;;
1195;; It is assumes that a PRELOAD function has already determined
1196;; the addressibilty internally to the message retriever services.
1197;; Inputs:
1198;;
1199;; Outputs:
1200;;
1201;; Psuedocode:
1202;; Save registers needed later
1203;; Get address of the message requested
1204;; IF Message number exists THEN
1205;; IF replacable parameters were specified THEN
1206;; Display message with replacable parms
1207;; ELSE
1208;; Display string without replacable parms
1209;; ENDIF
1210;; IF character input was requested THEN
1211;; Wait for character input
1212;; ENDIF
1213;; Clear CARRY FLAG
1214;; ELSE
1215;; Set CARRY FLAG
1216;; ENDIF
1217;; Return
1218;;
1219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1220 ;;
1221IF FARmsg ;;AN000;;
1222 SYSDISPMSG PROC FAR ;;AN000;;
1223ELSE ;;AN000;;
1224 SYSDISPMSG PROC NEAR ;;AN000;;
1225ENDIF ;;AN000;;
1226 ;;
1227;; Save registers and values needed later
1228
1229 PUSH AX ;;AN000;; Save changed REGs
1230 PUSH BX ;;AN000;;
1231 PUSH CX ;;AN000;;
1232 PUSH BP ;;AN000;;
1233 PUSH DI ;;AN000;; Save pointer to input buffer (offset)
1234 PUSH ES ;;AN000;; Save pointer to input buffer (segment)
1235 PUSH DX ;;AN000;; Save Input/Class request
1236
1237 MOV BP,CX ;;AN000;; Use BP to hold replace count
1238 MOV WORD PTR $M_RT.$M_HANDLE,BX ;;AN000;; Save handle
1239 MOV BYTE PTR $M_RT.$M_CLASS,DH ;;AN004;; Save class
1240
1241;; Get address of the message requested
1242
1243IF FARmsg ;;AN000;;
1244 CALL FAR PTR $M_GET_MSG_ADDRESS ;;AN000;; Scan thru classes to find message
1245ELSE ;;AN000;;
1246 CALL $M_GET_MSG_ADDRESS ;;AN000;; Scan thru classes to find message
1247ENDIF ;;AN000;;
1248 OR CX,CX ;;AN000;; Was message found?
1249; $IF NZ ;;AN000;; YES, Message address in ES:DI
1250 JZ $MIF93
1251
1252;; Test if replacable parameters were specified
1253
1254 OR BP,BP ;;AN000;; Were replacable parameters requested
1255; $IF Z ;;AN000;;
1256 JNZ $MIF94
1257
1258;; Display string without replacable parms
1259
1260 CALL $M_DISPLAY_STRING ;;AN000;; No, great . . . Display message
1261; $ELSE ;;AN000;;
1262 JMP SHORT $MEN94
1263$MIF94:
1264IF $M_REPLACE ;;AN000;;
1265
1266;; Display message with replacable parms
1267
1268 CALL $M_DISPLAY_MESSAGE ;;AN000;; Display the message with substitutions
1269ENDIF ;;AN000;;
1270; $ENDIF ;;AN000;;
1271$MEN94:
1272; $IF NC
1273 JC $MIF97
1274
1275 POP DX ;;AN000;; Get Input/Class request
1276
1277 CALL $M_ADD_CRLF ;;AN004;; Check if we need to add the CR LF chars.
1278
1279 POP ES ;;AN000;; Get location of input buffer (if specified)
1280 POP DI ;;AN000;;
1281
1282;; Test if character input was requested
1283
1284IF INPUTmsg ;;AN000;;
1285 OR DL,DL ;;AN000;; Was Wait-For-Input requested?
1286; $IF NZ ;;AN000;;
1287 JZ $MIF98
1288 CALL $M_WAIT_FOR_INPUT ;;AN000;;
1289; $ENDIF ;;AN000;;
1290$MIF98:
1291ENDIF ;;AN000;;
1292; $ELSE ;;AN000;;
1293 JMP SHORT $MEN97
1294$MIF97:
1295 ADD SP,6 ;;AN000;;
1296 STC ;;AN000;; Reset carry flag
1297; $ENDIF ;;AN000;;
1298$MEN97:
1299; $ELSE ;;AN000;; No,
1300 JMP SHORT $MEN93
1301$MIF93:
1302 POP ES ;;AN000;; Get pointer to input buffer (segment)
1303 POP DI ;;AN000;; Get base pointer to first sublist (offset)
1304 POP DX ;;AN000;; Get base pointer to first sublist (segment)
1305 STC ;;AN000;; Set carry flag
1306; $ENDIF ;;AN000;;
1307$MEN93:
1308 ;;
1309; $IF NC ;;AN000;; Was there an error?
1310 JC $MIF104
1311 POP BP ;;AN000;; No,
1312 POP CX ;;AN000;;
1313 POP BX ;;AN000;;
1314IF INPUTmsg ;;AN000;;
1315 ADD SP,2 ;;AN000;;
1316ELSE ;AN000;
1317 POP AX ;;AN000;;
1318ENDIF ;;AN000;;
1319; $ELSE ;;AN000;; Yes,
1320 JMP SHORT $MEN104
1321$MIF104:
1322 ADD SP,8 ;;AN000;; Eliminate from stack
1323 STC ;;AN000;;
1324; $ENDIF ;;AN000;;
1325$MEN104:
1326 ;;
1327 RET ;;AN000;; Return
1328 ;;
1329 SYSDISPMSG ENDP ;;AN000;;
1330 ;;
1331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1332;
1333;;
1334;; PROC NAME: $M_DISPLAY_STRING
1335;;
1336;; FUNCTION: Will display or write string
1337;; INPUTS: ES:DI points to beginning of message
1338;; CX contains the length of string to write (if applicable)
1339;; OUTPUTS: None
1340;; REGS Revised: None
1341;;
1342;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1343 ;;
1344$M_DISPLAY_STRING PROC NEAR ;;AN000;;
1345 ;;
1346 PUSH AX ;;AN000;;
1347 PUSH BX ;;AN000;;
1348 PUSH DX ;;AN000;;
1349 ;;
1350 MOV BX,$M_RT.$M_HANDLE ;;AN000;; Retrieve handle
1351 ;;
1352IF COMR ;; ** Special case for RESIDENT COMMAND.COM
1353 CALL $M_DISPLAY_$_STRING ;;AN000;; No, display $ terminated string
1354ELSE
1355 CMP BX,$M_NO_HANDLE ;;AN000;; Was there a handle specified?
1356; $IF E ;;AN000;;
1357 JNE $MIF107
1358 CALL $M_DISPLAY_$_STRING ;;AN000;; No, display $ terminated string
1359; $ELSE ;;AN000;;
1360 JMP SHORT $MEN107
1361$MIF107:
1362 CALL $M_DISPLAY_H_STRING ;;AN000;; Yes, display string to handle
1363; $ENDIF ;;AN000;;
1364$MEN107:
1365 ;AN001;
1366; $IF C ;;AN000;; Was there an error?
1367 JNC $MIF110
1368 MOV AH,DOS_GET_EXT_ERROR ;;AN000;; Yes,
1369 MOV BX,DOS_GET_EXT_ERROR_BX ;;AN000;; Get extended error
1370 INT 21H ;;AN000;;
1371 XOR AH,AH ;;AN000;; Clear AH
1372 ADD SP,6 ;;AN000;; Clean up stack
1373 STC ;;AN000;; Flag that there was an error
1374; $ELSE ;;AN000;; No,
1375 JMP SHORT $MEN110
1376$MIF110:
1377 CMP BX,$M_NO_HANDLE ;;AN000;; Was there a handle specified?
1378; $IF NE ;;AN000;;
1379 JE $MIF112
1380 CMP AX,CX ;AN001; Was it ALL written?
1381; $IF NE ;AN001; No,
1382 JE $MIF113
1383 CALL $M_GET_EXT_ERR_39 ;AN001; Set Extended error
1384 ADD SP,6 ;AN001; Clean up stack
1385 STC ;AN001; Flag that there was an error
1386; $ENDIF ;AN001;
1387$MIF113:
1388; $ENDIF ;AN001;
1389$MIF112:
1390; $ENDIF ;;AN000;;
1391$MEN110:
1392ENDIF
1393; $IF NC ;;AN000;; Was there ANY error?
1394 JC $MIF117
1395 POP DX ;;AN000;; Restore regs
1396 POP BX ;;AN000;;
1397 POP AX ;;AN000;;
1398; $ENDIF ;;AN000;;
1399$MIF117:
1400 RET ;;AN000;; Return
1401 ;;
1402$M_DISPLAY_STRING ENDP ;;AN000;;
1403 ;;
1404;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1405;;
1406;; PROC NAME: $M_DISPLAY_$_STRING
1407;;
1408;; FUNCTION: Will display a $ terminated string
1409;; INPUTS: ES:DI points to beginning of message text (not the length)
1410;; OUPUTS: None
1411;; REGS USED: AX,DX
1412;;
1413;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1414 ;;
1415$M_DISPLAY_$_STRING PROC NEAR ;;AN000;;
1416 ;;
1417 PUSH DS ;;AN000;;
1418 PUSH ES ;;AN000;;
1419 POP DS ;;AN000;; Set DS to segment of message text
1420IF NOT COMR
1421 CMP CX,$M_SINGLE_CHAR ;;AN000;; Is this a single character?
1422; $IF E ;;AN000;; Yes,
1423 JNE $MIF119
1424 MOV AH,DOS_DISP_CHAR ;;AN000;; DOS Function to display CHARACTER
1425 MOV DL,BYTE PTR ES:[DI] ;;AN000;; Get the character
1426 INT 21H ;;AN000;; Write character
1427 POP DS ;;AN000;; Set DS to segment of message text
1428 MOV AL,DL ;;AN000;; Get the character in AL
1429 CALL $M_IS_IT_DBCS ;;AN000;; Is this the first byte of a DB character
1430 PUSH DS ;;AN000;;
1431 PUSH ES ;;AN000;;
1432 POP DS ;;AN000;; Set DS to segment of message text
1433; $IF C ;;AN000;; Yes,
1434 JNC $MIF120
1435 MOV DL,BYTE PTR ES:[DI]+1 ;;AN000;; Get the next character
1436 INT 21H ;;AN000;; Write character
1437 CLC ;;AN000;; Clear the DBCS indicator
1438; $ENDIF ;;AN000;;
1439$MIF120:
1440; $ELSE ;;AN000;; No,
1441 JMP SHORT $MEN119
1442$MIF119:
1443ENDIF
1444 MOV AH,DOS_DISP_CHAR ;;AN000;; DOS Function to display CHARACTER
1445; $DO ;;AN002;; No,
1446$MDO123:
1447 OR CX,CX ;;AN002;; Are there any left to display?
1448; $LEAVE Z ;;AN002;; Yes,
1449 JZ $MEN123
1450 MOV DL,BYTE PTR ES:[DI] ;;AN002;; Get the character
1451 INT 21H ;;AN002;; Display the character
1452 INC DI ;;AN002;; Set pointer to next character
1453 DEC CX ;;AN002;; Count this character
1454; $ENDDO Z ;;AN002;; No,
1455 JNZ $MDO123
1456$MEN123:
1457IF NOT COMR
1458; $ENDIF ;;AN000;;
1459$MEN119:
1460ENDIF
1461 CLC ;;AN000;; Char functions used don't return carry as error
1462 POP DS ;;AN000;;
1463 RET ;;AN000;;
1464 ;;
1465$M_DISPLAY_$_STRING ENDP ;;AN000;;
1466 ;;
1467IF NOT COMR
1468;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1469;;
1470;; PROC NAME: $M_DISPLAY_H_STRING
1471;;
1472;; FUNCTION: Will display a string to a specified handle
1473;; INPUTS: ES:DI points to beginning of message
1474;; CX contains the number of bytes to write
1475;; BX contains the handle to write to
1476;; OUPUTS: None
1477;; REGS USED: AX,DX
1478;;
1479;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1480 ;;
1481$M_DISPLAY_H_STRING PROC NEAR ;;AN000;;
1482 ;;
1483 XOR AX,AX ;;AN002;; Set number of bytes written to 0
1484 OR CX,CX ;;AN002;; For performance, don't write if not necessary
1485; $IF NZ ;;AN002;; Any chars to write?
1486 JZ $MIF127
1487 PUSH DS ;;AN000;; Yes,
1488 PUSH ES ;;AN000;;
1489 POP DS ;;AN000;; Set DS to segment of message text
1490 MOV AH,DOS_WRITE_HANDLE ;;AN000;; DOS function to write to a handle
1491 MOV DX,DI ;;AN000;; Pointer to data to write
1492 CMP CX,$M_SINGLE_CHAR ;;AN000;; Is this a single character?
1493; $IF E ;;AN000;; Yes,
1494 JNE $MIF128
1495 INT 21H ;;AN000;; Write character
1496 POP DS ;;AN000;; Set DS to segment of message text
1497 PUSH AX ;;AN000;;
1498 MOV AL,BYTE PTR ES:[DI] ;;AN000;; Get the character
1499 CALL $M_IS_IT_DBCS ;;AN000;; Is this the first byte of a DB character
1500 POP AX ;;AN000;; Set DS to segment of message text
1501 PUSH DS ;;AN000;;
1502 PUSH ES ;;AN000;;
1503 POP DS ;;AN000;; Set DS to segment of message text
1504; $IF C ;;AN000;; Yes,
1505 JNC $MIF129
1506 CLC ;;AN000;; Clear the DBCS indicator
1507 MOV AH,DOS_WRITE_HANDLE ;;AN000;; DOS function to write to a handle
1508 INC DX ;;AN000;; Point to next character
1509 INT 21H ;;AN000;; Write character
1510; $ENDIF ;;AN000;;
1511$MIF129:
1512; $ELSE ;;AN000;; No,
1513 JMP SHORT $MEN128
1514$MIF128:
1515 INT 21H ;;AN000;; Write String at DS:SI to handle
1516; $ENDIF ;;AN000;;
1517$MEN128:
1518 POP DS ;;AN000;;
1519; $ENDIF ;;AN002;;
1520$MIF127:
1521 ;;
1522 RET ;;AN000;;
1523 ;;
1524$M_DISPLAY_H_STRING ENDP ;;AN000;;
1525 ;;
1526;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1527;;
1528;; PROC NAME: $M_GET_EXT_ERR_39
1529;;
1530;; FUNCTION: Will set registers for extended error #39
1531;; INPUTS: None
1532;; OUPUTS: AX,BX,CX set
1533;; REGS USED:
1534;;
1535;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1536 ;;
1537$M_GET_EXT_ERR_39 PROC NEAR ;AN001;
1538 ;;
1539 MOV AX,EXT_ERR_39 ;AN001; Set AX=39
1540 MOV BX,(ERROR_CLASS_39 SHR 8) + ACTION_39 ;AN001; Set BH=1 BL=4
1541 MOV CH,LOCUS_39 ;AN001; Set CH=1
1542 ;AN001;
1543 RET ;AN001;
1544 ;;
1545$M_GET_EXT_ERR_39 ENDP ;AN001;
1546 ;;
1547;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1548ENDIF
1549;;
1550;; PROC NAME: $M_ADD_CRLF
1551;;
1552;; FUNCTION: Will decide whether to display a CRLF
1553;; INPUTS: DX contains the Input/Class requested
1554;; OUTPUTS: None
1555;; REGS Revised: CX,ES,DI
1556;;
1557;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1558 ;;
1559$M_ADD_CRLF PROC NEAR ;;AN004;;
1560 ;;
1561 CMP DH,UTILITY_MSG_CLASS ;;AN004;; Is it a utility message?
1562; $IF NE ;;AN004;; No,
1563 JE $MIF134
1564 TEST DH,$M_NO_CRLF_MASK ;;AN004;; Are we to supress the CR LF?
1565; $IF Z ;;AN004;; No,
1566 JNZ $MIF135
1567 PUSH DS ;;AN004;;
1568 POP ES ;;AN004;; Set ES to data segment
1569 LEA DI,$M_RT.$M_CRLF ;;AN004;; Point at CRLF message
1570 MOV CX,$M_CRLF_SIZE ;;AN004;; Set the message size
1571 CALL $M_DISPLAY_STRING ;;AN004;; Display the CRLF
1572; $ENDIF ;;AN004;;
1573$MIF135:
1574; $ENDIF ;;AN004;;
1575$MIF134:
1576 RET ;;AN004;; Return
1577 ;;
1578$M_ADD_CRLF ENDP ;;AN004;;
1579 ;;
1580;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1581;;
1582;; PROC NAME: $M_IS_IT_DBCS
1583;;
1584;; FUNCTION: Will decide whether character is Single or Double Byte
1585;; INPUTS: AL contains the byte to be checked
1586;; OUPUTS: Carry flag = 0 if byte is NOT in DBCS range
1587;; Carry flag = 1 if byte IS in DBCS range
1588;; REGS USED: All restored
1589;;
1590;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1591 ;;
1592$M_IS_IT_DBCS PROC NEAR ;;AN000;;
1593 ;;
1594 PUSH ES ;;AN000;; Save Extra segment register
1595 PUSH DI ;;AN000;; Save SI register
1596 ;;
1597 LES DI,$M_RT.$M_DBCS_VEC ;;AN000;;
1598 OR DI,DI ;;AN000;; Was the DBCS vector set?
1599; $IF NZ ;;AN000;;
1600 JZ $MIF138
1601; $DO ;;AN000;;
1602$MDO139:
1603 CMP WORD PTR ES:[DI],$M_DBCS_TERM ;;AN000;; Is this the terminating flag?
1604 CLC ;;AN000;;
1605; $LEAVE E ;;AN000;;
1606 JE $MEN139
1607 ;; No,
1608 CMP AL,BYTE PTR ES:[DI] ;;AN000;; Does the character fall in the DBCS range?
1609; $IF AE,AND ;;AN000;;
1610 JNAE $MIF141
1611 CMP AL,BYTE PTR ES:[DI]+1 ;;AN000;; Does the character fall in the DBCS range?
1612; $IF BE ;;AN000;;
1613 JNBE $MIF141
1614 STC ;;AN000;; Yes,
1615; $ENDIF ;;AN000;; Set carry flag
1616$MIF141:
1617 INC DI ;;AN000;; No,
1618 INC DI ;;AN000;; Go to next vector
1619; $ENDDO ;;AN000;;
1620 JMP SHORT $MDO139
1621$MEN139:
1622; $ENDIF ;;AN000;;
1623$MIF138:
1624
1625 POP DI ;;AN000;;
1626 POP ES ;;AN000;; Restore SI register
1627 RET ;;AN000;; Return
1628 ;;
1629$M_IS_IT_DBCS ENDP ;;AN000;;
1630 ;;
1631;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1632;;
1633;; PROC NAME: $M_CONVERT2ASC
1634;;
1635;; FUNCTION: Convert a binary number to a ASCII string
1636;; INPUTS: DX:AX contains the number to be converted
1637;; $M_RT_DIVISOR contains the divisor
1638;; OUPUTS: CX contains the number of characters
1639;; Top of stack --> Last character
1640;; . . .
1641;; Bot of stack --> First character
1642;; REGS USED:
1643;;
1644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1645 ;;
1646$M_CONVERT2ASC PROC NEAR ;;AN000;;
1647 ;;
1648 POP [$M_RT.$M_RETURN_ADDR] ;;AN000;; Save Return Address
1649 XOR BX,BX ;;AN000;; Use BP as a swapping register
1650 ;;
1651 XCHG BX,AX ;;AN000;; Initialize - Low Word in BP
1652 XCHG AX,DX ;;AN000;; - High Word in AX
1653; $DO ;;AN000;; DO UNTIL Low Word becomes zero
1654$MDO145:
1655 DIV $M_RT.$M_DIVISOR ;;AN000;; Divide High Word by divisor
1656 XCHG BX,AX ;;AN000;; Setup to divide Low Word using remainder
1657 ;; and save reduced High Word in BP
1658 DIV $M_RT.$M_DIVISOR ;;AN000;; Divide Low Word by divisor
1659 CMP DX,9 ;;AN000;; Make a digit of the remainder
1660; $IF A ;;AN000;; IF 10 to 15,
1661 JNA $MIF146
1662 ADD DL,55 ;;AN000;; Make A to F ASCII
1663; $ELSE ;;AN000;; IF 0 to 9,
1664 JMP SHORT $MEN146
1665$MIF146:
1666 ADD DL,'0' ;;AN000;; Make 0 to 9 ASCII
1667; $ENDIF ;;AN000;;
1668$MEN146:
1669 PUSH DX ;;AN000;; Save the digit on the stack
1670 INC CX ;;AN000;; Count that digit
1671 OR AX,AX ;;AN000;; Are we done?
1672; $LEAVE Z,AND ;;AN000;;
1673 JNZ $MLL149
1674 OR BX,BX ;;AN000;; AX and BX must be ZERO!!
1675; $LEAVE Z ;;AN000;; No,
1676 JZ $MEN145
1677$MLL149:
1678IF NOT COMR
1679 CMP CX,$M_FIRST_THOU ;;AN000;; Are we at the first thousands mark
1680; $IF E ;;AN000;; Yes,
1681 JNE $MIF150
1682 CMP $M_SL.$M_S_PAD,$M_COMMA ;;AN000;; Is the pad character a comma?
1683; $IF E ;;AN000;; Yes,
1684 JNE $MIF151
1685 PUSH WORD PTR $M_RT.$M_THOU_SEPARA ;;AN000;; Insert a thousand separator
1686 INC CX ;;AN000;;
1687; $ENDIF ;;AN000;;
1688$MIF151:
1689; $ELSE ;;AN000;; No,
1690 JMP SHORT $MEN150
1691$MIF150:
1692 CMP CX,$M_SECOND_THOU ;;AN000;; Are we at the first thousands mark
1693; $IF E ;;AN000;; Yes,
1694 JNE $MIF154
1695 CMP $M_SL.$M_S_PAD,$M_COMMA ;;AN000;; Is the pad character a comma?
1696; $IF E ;;AN000;; Yes,
1697 JNE $MIF155
1698 PUSH WORD PTR $M_RT.$M_THOU_SEPARA ;;AN000;; Insert a thousand separator
1699 INC CX ;;AN000;;
1700; $ENDIF ;;AN000;;
1701$MIF155:
1702; $ELSE ;;AN000;; No,
1703 JMP SHORT $MEN154
1704$MIF154:
1705 CMP CX,$M_THIRD_THOU ;;AN000;; Are we at the first thousands mark
1706; $IF E ;;AN000;; Yes,
1707 JNE $MIF158
1708 CMP $M_SL.$M_S_PAD,$M_COMMA ;;AN000;; Is the pad character a comma?
1709; $IF E ;;AN000;; Yes,
1710 JNE $MIF159
1711 PUSH WORD PTR $M_RT.$M_THOU_SEPARA ;;AN000;; Insert a thousand separator
1712 INC CX ;;AN000;;
1713; $ENDIF ;;AN000;;
1714$MIF159:
1715; $ENDIF ;;AN000;;
1716$MIF158:
1717; $ENDIF ;;AN000;;
1718$MEN154:
1719; $ENDIF ;;AN000;;
1720$MEN150:
1721ENDIF
1722 XCHG AX,BX ;;AN000;; Setup to divide the reduced High Word
1723 ;;AN000;; and Revised Low Word
1724 XOR DX,DX ;;AN000;; Reset remainder
1725; $ENDDO ;;AN000;; NEXT
1726 JMP SHORT $MDO145
1727$MEN145:
1728 ;;AN000;; Yes,
1729 XOR DX,DX ;;AN000;; Reset remainder
1730 XOR AX,AX ;;AN000;; Reset remainder
1731 PUSH [$M_RT.$M_RETURN_ADDR] ;;AN000;; Restore Return Address
1732 RET ;;AN000;; Return
1733 ;;
1734$M_CONVERT2ASC ENDP ;;AN000;;
1735 ;;
1736;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1737;;
1738;; PROC NAME: $M_DISPLAY_MESSAGE
1739;;
1740;; FUNCTION: Will display or write entire message (with replacable parameters)
1741;; INPUTS: ES:DI points to beginning of message
1742;; DS:SI points to first sublist structure in chain
1743;; BX contains the handle to write to (if applicable)
1744;; CX contains the length of string to write (before substitutions)
1745;; BP contains the count of replacables
1746;;
1747;; OUTPUTS:
1748;; REGS USED: All
1749;;
1750;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1751 ;;
1752$M_DISPLAY_MESSAGE PROC NEAR ;;AN000;;
1753 ;;
1754; $DO ;;AN000;; Note: DS:SI -> message
1755$MDO165:
1756 XOR DX,DX ;;AN000;; Set size = 0
1757 OR CX,CX ;;AN000;; Are we finished the message yet?
1758; $IF NZ ;;AN000;; No,
1759 JZ $MIF166
1760 MOV AH,"%" ;;AN000;; Prepare to scan for %
1761 MOV AL,0 ;;AN004;;
1762 ;;
1763; $DO ;;AN000;; Scan through string until %
1764$MDO167:
1765 CMP BYTE PTR ES:[DI],AH ;;AN000;; Is this character NOT a %
1766; $LEAVE E,AND ;;AN000;; No,
1767 JNE $MLL168
1768 CMP BYTE PTR ES:[DI+1],AH ;;AN000;; Is the next character also a %
1769; $LEAVE NE,AND ;;AN000;; No,
1770 JE $MLL168
1771 CMP AL,AH ;;AN000;; Was the character before a %
1772; $LEAVE NE ;;AN000;; No, GREAT found it
1773 JNE $MEN167
1774$MLL168:
1775 MOV AL,BYTE PTR ES:[DI] ;;AN004;; Yes, (to any of the above)
1776 CALL $M_IS_IT_DBCS ;;AN004;; Is this character the first part of a DBCS?
1777; $IF C ;;AN004;; Yes,
1778 JNC $MIF169
1779 INC DI ;;AN004;; Increment past second part
1780; $ENDIF ;;AN004;;
1781$MIF169:
1782 INC DI ;;AN000;; Next character in string
1783 INC DX ;;AN000;; Size = Size + 1
1784 DEC CX ;;AN000;; Decrement total size
1785; $ENDDO Z ;;AN000;; Exit scan if we're at the end of the line
1786 JNZ $MDO167
1787$MEN167:
1788; $ENDIF ;;AN000;;
1789$MIF166:
1790 ;;
1791 PUSH SI ;;AN000;; Save beginning of sublists
1792 XCHG CX,DX ;;AN000;; Get size of message to display (tot sz in DX)
1793 OR BP,BP ;;AN000;; Do we have any replacables to do?
1794; $IF NZ ;;AN000;; Yes,
1795 JZ $MIF173
1796 DEC BP ;;AN000;; Decrement number of replacables
1797
1798;; Search through sublists to find applicable one
1799
1800 CMP $M_RT.$M_MSG_NUM,$M_NULL ;;AN000;; Is this an Extended/Parse case
1801; $IF E ;;AN000;; No,
1802 JNE $MIF174
1803; $SEARCH ;;AN000;;
1804$MDO175:
1805 MOV AL,$M_SL.$M_S_ID ;;AN000;; Get ID byte
1806 ADD AL,30H ;;AN000;; Convert to ASCII
1807 CMP AL,BYTE PTR ES:[DI]+1 ;;AN000;; Is this the right sublist?
1808; $EXITIF E ;;AN000;;
1809 JNE $MIF175
1810; $ORELSE ;;AN000;; No,
1811 JMP SHORT $MSR175
1812$MIF175:
1813 CMP AL,$M_SPECIAL_CASE ;;AN000;; Does this sublist have ID = 0
1814; $LEAVE E,AND ;;AN000;; Yes,
1815 JNE $MLL178
1816 OR DX,DX ;;AN000;; Are we at the end of the message?
1817; $LEAVE Z ;;AN000;; No,
1818 JZ $MEN175
1819$MLL178:
1820 ADD SI,WORD PTR $M_SL.$M_S_SIZE ;;AN000;; Next SUBLIST
1821; $ENDLOOP ;;AN000;; Yes,
1822 JMP SHORT $MDO175
1823$MEN175:
1824 CMP $M_RT.$M_CLASS,UTILITY_MSG_CLASS ;;AN004;; Is it a utility message?
1825; $IF E ;;AN004;; Yes,
1826 JNE $MIF180
1827 INC DX ;;AN000;; Remember to display CR,LF
1828 INC DX ;;AN000;; at the end of the message
1829 DEC CX ;;AN000;; Adjust message length
1830 DEC CX ;;AN000;;
1831 DEC DI ;;AN000;; Adjust ending address of message
1832 DEC DI ;;AN000;;
1833; $ELSE ;;AN004;; No,
1834 JMP SHORT $MEN180
1835$MIF180:
1836 MOV DX,-1 ;;AN004;; Set special case
1837; $ENDIF ;;AN004;;
1838$MEN180:
1839; $ENDSRCH ;;AN000;;
1840$MSR175:
1841; $ENDIF ;;AN000;;
1842$MIF174:
1843; $ENDIF ;;AN000;;
1844$MIF173:
1845
1846;; Prepare and display this part of message
1847
1848 PUSH DI ;;AN000;; Save pointer to replace number
1849 SUB DI,CX ;;AN000;; Determine beginning of string
1850 CALL $M_DISPLAY_STRING ;;AN000;; Display string until % (or end)
1851 POP DI ;;AN000;; Get back pointer to replace number
1852 POP CX ;;AN000;; Clean up stack in case error
1853; $LEAVE C,LONG ;;AN000;; Fail if carry was set
1854 JNC $MXL3
1855 JMP $MEN165
1856$MXL3:
1857 PUSH CX ;;AN000;;
1858
1859;; Save and reset pointer registers
1860
1861 MOV CX,DX ;;AN000;; Get the size of the rest of the message
1862 CMP $M_SL.$M_S_ID,$M_SPECIAL_CASE-30H ;;AN000;; Is this the %0 case?
1863; $IF NE ;;AN000;; No,
1864 JE $MIF187
1865 OR CX,CX ;;AN000;; Are we finished the whole message?
1866; $IF NZ ;;AN000;; No,
1867 JZ $MIF188
1868 DEC CX ;;AN000;; Decrement total size (%)
1869 DEC CX ;;AN000;; Decrement total size (#)
1870 INC DI ;;AN000;; Go past %
1871 INC DI ;;AN000;; Go past replace number
1872; $ELSE ;;AN000;; Yes, (Note this will not leave because INC)
1873 JMP SHORT $MEN188
1874$MIF188:
1875 POP SI ;;AN000;; Get back pointer to beginning of SUBLISTs
1876; $ENDIF ;;AN000;; Yes, Note this will not leave because INC
1877$MEN188:
1878; $ELSE ;;AN000;;
1879 JMP SHORT $MEN187
1880$MIF187:
1881 OR CX,CX ;;AN000;; Are we finished the whole message?
1882; $IF Z ;;AN004;; No,
1883 JNZ $MIF192
1884 POP SI ;;AN000;; Get back pointer to beginning of SUBLISTs
1885; $ELSE ;;AN000;; No,
1886 JMP SHORT $MEN192
1887$MIF192:
1888 CMP CX,-1 ;;AN004;; Are we at the end of the message?
1889; $IF Z ;;AN004;; No,
1890 JNZ $MIF194
1891 XOR CX,CX ;;AN004;;
1892; $ENDIF ;;AN000;;
1893$MIF194:
1894 OR DI,DI ;;AN004;; Turn ZF off
1895; $ENDIF ;;AN000;;
1896$MEN192:
1897; $ENDIF ;;AN000;; Note this will not leave because INC
1898$MEN187:
1899; $LEAVE Z ;;AN000;;
1900 JZ $MEN165
1901 PUSH BP ;;AN000;; Save the replace count
1902 PUSH DI ;;AN000;; Save location to complete message
1903 PUSH ES ;;AN000;;
1904 PUSH CX ;;AN000;; Save size of the rest of the message
1905 XOR CX,CX ;;AN000;; Reset CX used for character count
1906
1907;; Determine what action is required on parameter
1908
1909 CMP $M_RT.$M_MSG_NUM,$M_NULL ;;AN000;; Is this an Extended/Parse case
1910; $IF E ;;AN000;;
1911 JNE $MIF199
1912
1913IF CHARmsg ;;AN000;; Was Char specified?
1914 TEST BYTE PTR $M_SL.$M_S_FLAG,NOT Char_Type AND $M_TYPE_MASK ;;AN000;;
1915; $IF Z ;;AN000;;
1916 JNZ $MIF200
1917
1918;; Character type requested
1919 ;;AN000;;
1920 LES DI,DWORD PTR $M_SL.$M_S_VALUE ;;AN000;; Load pointer to replacing parameter
1921 CALL $M_CHAR_REPLACE ;;AN000;;
1922; $ELSE ;;AN000;; Get the rest of the message to display
1923 JMP SHORT $MEN200
1924$MIF200:
1925ENDIF ;;AN000;;
1926IF NUMmsg ;;AN000;; Was Nnmeric type specified?
1927 TEST BYTE PTR $M_SL.$M_S_FLAG,NOT Sgn_Bin_Type AND $M_TYPE_MASK ;;AN000;;
1928; $IF Z,OR ;;AN000;;
1929 JZ $MLL202
1930 TEST BYTE PTR $M_SL.$M_S_FLAG,NOT Unsgn_Bin_Type AND $M_TYPE_MASK ;;AN000;;
1931; $IF Z,OR ;;AN000;;
1932 JZ $MLL202
1933 TEST BYTE PTR $M_SL.$M_S_FLAG,NOT Bin_Hex_Type AND $M_TYPE_MASK ;;AN000;;
1934; $IF Z ;;AN000;;
1935 JNZ $MIF202
1936$MLL202:
1937
1938;; Numeric type requested
1939
1940 LES DI,DWORD PTR $M_SL.$M_S_VALUE ;;AN000;; Load pointer to replacing parameter
1941 CALL $M_BIN2ASC_REPLACE ;;AN000;;
1942; $ELSE ;;AN000;; Get the rest of the message to display
1943 JMP SHORT $MEN202
1944$MIF202:
1945ENDIF ;;AN000;;
1946IF DATEmsg ;;AN000;; Was date specified?
1947 TEST BYTE PTR $M_SL.$M_S_FLAG,NOT Date_Type AND $M_TYPE_MASK ;;AN000;;
1948; $IF E ;;AN000;;
1949 JNE $MIF204
1950
1951;; Date type requested
1952
1953 CALL $M_DATE_REPLACE ;;AN000;;
1954; $ELSE ;;AN000;; Get the rest of the message to display
1955 JMP SHORT $MEN204
1956$MIF204:
1957ENDIF ;;AN000;;
1958IF TIMEmsg ;;AN000;; Was time (12 hour format) specified?
1959
1960;; Time type requested (Default if we have not matched until here)
1961
1962 CALL $M_TIME_REPLACE ;;AN000;;
1963ENDIF ;;AN000;;
1964
1965IF DATEmsg ;;AN000;;
1966; $ENDIF ;;AN000;;
1967$MEN204:
1968ENDIF ;;AN000;;
1969IF NUMmsg ;;AN000;;
1970; $ENDIF ;;AN000;;
1971$MEN202:
1972ENDIF ;;AN000;;
1973IF CHARmsg ;;AN000;;
1974; $ENDIF ;;AN000;;
1975$MEN200:
1976ENDIF ;;AN000;;
1977
1978IF $M_REPLACE ;;AN000;;
1979;; With the replace information of the Stack, display the replaceable field
1980
1981 CALL $M_DISPLAY_REPLACE ;;AN000;; Display the replace
1982ENDIF ;;AN000;;
1983;; None of the above - Extended/Parse replace
1984; $ELSE ;;AN000;;
1985 JMP SHORT $MEN199
1986$MIF199:
1987IF NOT COMR
1988 CALL $M_EXT_PAR_REPLACE ;;AN000;;
1989ENDIF
1990; $ENDIF ;;AN000;;
1991$MEN199:
1992
1993;; We must go back and complete the message after the replacable parameter if there is any left
1994
1995; $IF NC ;;AN000;; IF there was an error displaying then EXIT
1996 JC $MIF211
1997 POP CX ;;AN000;; Get size of the rest of the message
1998 POP ES ;;AN000;; Get address of the rest of the message
1999 POP DI ;;AN000;;
2000 POP BP ;;AN000;; Get replacment count
2001 POP SI ;;AN000;; ELSE get address of first sublist structure
2002; $ELSE ;;AN000;;
2003 JMP SHORT $MEN211
2004$MIF211:
2005 ADD SP,10 ;;AN000;; Clean up stack if error
2006 STC ;;AN000;;
2007; $ENDIF ;;AN000;;
2008$MEN211:
2009 CMP $M_RT.$M_MSG_NUM,$M_NULL ;;AN000;; Is this an Extended/Parse case
2010; $ENDDO NE,OR ;;AN000;;
2011 JNE $MLL214
2012; $ENDDO C,LONG ;;AN000;; Go back and display the rest of the message
2013 JC $MXL4
2014 JMP $MDO165
2015$MXL4:
2016$MLL214:
2017$MEN165:
2018 ;; IF there was an error displaying then EXIT
2019 MOV $M_RT.$M_MSG_NUM,0 ;;AN000;; Reset message number to null
2020 RET ;;AN000;; Return
2021 ;;
2022$M_DISPLAY_MESSAGE ENDP ;;AN000;;
2023IF NOT COMR
2024;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2025;;
2026;; PROC NAME: $M_EXT_PAR_REPLACE
2027;;
2028;; FUNCTION:
2029;; INPUTS:
2030;; OUPUTS:
2031;;
2032;; REGS USED:
2033;;
2034;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2035 ;;
2036$M_EXT_PAR_REPLACE PROC NEAR ;;AN000;;
2037 ;;
2038 XOR DX,DX ;;AN000;; Prepare for get binary value (HIGH)
2039 MOV AX,$M_RT.$M_MSG_NUM ;;AN000;; Prepare for get binary value (LOW)
2040 MOV $M_RT.$M_DIVISOR,$M_BASE10 ;;AN000;; Set default divisor
2041 ;;
2042 CALL $M_CONVERT2ASC ;;AN000;;
2043 ;;
2044; $DO ;;AN000;;
2045$MDO215:
2046 POP AX ;;AN000;; Get character in register
2047 MOV BYTE PTR $M_RT.$M_TEMP_BUF[BX],AL ;;AN000;; Move char into the buffer
2048 INC BX ;;AN000;; Increase buffer count
2049 CMP BX,$M_TEMP_BUF_SZ ;;AN000;; Is buffer full?
2050; $IF E ;;AN000;; Yes,
2051 JNE $MIF216
2052 CALL $M_FLUSH_BUF ;;AN000;; Flush the buffer
2053; $ENDIF ;;AN000;;
2054$MIF216:
2055 DEC CL ;;AN000;; Have we completed replace?
2056; $ENDDO Z ;;AN000;;
2057 JNZ $MDO215
2058 ;;
2059 MOV AX,$M_CR_LF ;;AN000;; Move char into the buffer
2060 MOV WORD PTR $M_RT.$M_TEMP_BUF[BX],AX ;;AN000;; Move char into the buffer
2061 INC BX ;;AN000;; Increase buffer count
2062 INC BX ;;AN000;; Increase buffer count
2063 CALL $M_FLUSH_BUF ;;AN000;; Flush the buffer
2064 RET ;;AN000::
2065 ;;
2066$M_EXT_PAR_REPLACE ENDP ;;AN000;;
2067 ;;
2068;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2069ENDIF
2070 IF $M_SUBS ;;AN000;; Include the common subroutines if they haven't yet
2071 $M_SUBS = FALSE ;;AN000;; No, then include and reset the flag
2072;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2073;;
2074;; PROC NAME: $M_GET_MSG_ADDRESS
2075;;
2076;; FUNCTION: To scan thru classes to return pointer to the message header
2077;; INPUTS: Access to $M_RES_ADDRESSES
2078;; OUPUTS: IF CX = 0 THEN Message was not found
2079;; IF CX > 1 THEN DS:SI points to the specified message
2080;; REGS CHANGED: ES,DI,CX,DS,SI
2081;;
2082;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2083 ;;
2084IF FARmsg ;;AN000;;
2085 $M_GET_MSG_ADDRESS PROC FAR ;;AN000;;
2086ELSE ;;AN000;;
2087 $M_GET_MSG_ADDRESS PROC NEAR ;;AN000;;
2088ENDIF ;;AN000;;
2089 ;;
2090 PUSH SI ;;AN000;;
2091 PUSH BX ;;AN000;;
2092 XOR SI,SI ;;AN000;; Use SI as an index
2093 XOR CX,CX ;;AN000;; Use CX as an size
2094; $DO ;;AN000;;
2095$MDO219:
2096 CMP DH,UTILITY_MSG_CLASS ;;AN000;; Were utility messages requested?
2097; $IF E ;;AN000;; Yes,
2098 JNE $MIF220
2099 IF FARmsg ;;AN000;;
2100 LES DI,DWORD PTR $M_RT.$M_CLASS_ADDRS[SI] ;;AN000;; Get address of class
2101 MOV BX,ES ;;AN000;
2102 ELSE ;;AN000;;
2103 MOV DI,WORD PTR $M_RT.$M_CLASS_ADDRS[SI] ;;AN000;; Get address of class
2104 MOV BX,DI ;;AN000;
2105 ENDIF ;;AN000;;
2106; $ELSE ;;AN000;; No,
2107 JMP SHORT $MEN220
2108$MIF220:
2109 TEST DH,PARSE_ERR_CLASS ;;AN000;; Were parse errors requested?
2110; $IF NE ;;AN000;; Yes,
2111 JE $MIF222
2112 LES DI,DWORD PTR $M_RT.$M_PARSE_COMMAND[SI] ;;AN000;; Get address of class
2113 MOV BX,ES ;;AN000;
2114; $ELSE ;;AN000;; No, extended errors were specified
2115 JMP SHORT $MEN222
2116$MIF222:
2117 CMP AX,$M_CRIT_LO ;;AN000;; Is this a critical error?
2118; $IF AE,AND ;;AN000;;
2119 JNAE $MIF224
2120 CMP AX,$M_CRIT_HI ;;AN000;;
2121; $IF BE ;;AN000;; Yes,
2122 JNBE $MIF224
2123 LES DI,DWORD PTR $M_RT.$M_CRIT_ADDRS[SI] ;;AN000;; Get address of class
2124 MOV BX,ES ;;AN000;
2125; $ELSE ;;AN000;;
2126 JMP SHORT $MEN224
2127$MIF224:
2128 LES DI,DWORD PTR $M_RT.$M_EXT_ERR_ADDRS[SI] ;;AN000;; Get address of class
2129 MOV BX,ES ;;AN000;
2130; $ENDIF ;;AN000;;
2131$MEN224:
2132; $ENDIF ;;AN000;;
2133$MEN222:
2134; $ENDIF ;;AN000;;
2135$MEN220:
2136 ;;
2137 CMP BX,$M_TERMINATING_FLAG ;;AN000;; Are we finished all classes?
2138; $IF E ;;AN000;; Yes,
2139 JNE $MIF229
2140 CMP DH,UTILITY_MSG_CLASS ;;AN000;; Was it a UTILITY class?
2141; $IF E ;;AN000;; Yes,
2142 JNE $MIF230
2143 STC ;;AN000;; Set the carry flag
2144; $ELSE ;;AN000;; No,
2145 JMP SHORT $MEN230
2146$MIF230:
2147 MOV $M_RT.$M_MSG_NUM,AX ;;AN000;; Save message number
2148 MOV AX,$M_SPECIAL_MSG_NUM ;;AN000;; Set special message number
2149 MOV BP,$M_ONE_REPLACE ;;AN000;; Set one replace in message
2150 XOR SI,SI ;;AN000;; Reset the SI index to start again
2151 CLC ;;AN000;;
2152; $ENDIF ;;AN000;; No,
2153$MEN230:
2154; $ELSE ;;AN000;;
2155 JMP SHORT $MEN229
2156$MIF229:
2157 CMP BX,$M_CLASS_NOT_EXIST ;;AN000;; Does this class exist?
2158; $IF NE ;;AN001;; Yes,
2159 JE $MIF234
2160 CALL $M_FIND_SPECIFIED_MSG ;;AN000;; Try to find the message
2161; $ENDIF ;;AN000;;
2162$MIF234:
2163 ADD SI,$M_ADDR_SZ_FAR ;;AN000;; Get next class
2164 CLC ;;AN000;;
2165; $ENDIF ;;AN000;;
2166$MEN229:
2167; $LEAVE C ;;AN000;;
2168 JC $MEN219
2169 OR CX,CX ;;AN000;; Was the message found?
2170; $ENDDO NZ,LONG ;;AN000;;
2171 JNZ $MXL5
2172 JMP $MDO219
2173$MXL5:
2174$MEN219:
2175
2176 PUSHF ;;AN006;; Save the flag state
2177 CMP DH,EXT_ERR_CLASS ;;AN006;; Was an extended error requested?
2178; $IF E ;;AN006;; Yes,
2179 JNE $MIF239
2180 PUSH DX ;;AN006;; Save all needed registers
2181 PUSH BP ;;AN006;;
2182 PUSH CX ;;AN006;;
2183 PUSH ES ;;AN006;;
2184 PUSH DI ;;AN006;;
2185 PUSH AX ;;AN006;;
2186
2187 MOV AX,IFSFUNC_INSTALL_CHECK ;;AN006;; Check if IFSFUNC is installed
2188 INT 2FH ;;AN006;;
2189 CMP AL,IFSFUNC_INSTALLED ;;AN006;; Is it installed?
2190 POP AX ;;AN006;; Restore msg number
2191; $IF E ;;AN006;; Yes,
2192 JNE $MIF240
2193 MOV BX,AX ;;AN006;; BX is the extended error number
2194 MOV AX,IFS_GET_ERR_TEXT ;;AN006;; AX is the muliplex number
2195 INT 2FH ;;AN006;; Call IFSFUNC
2196; $ELSE ;;AN006;; No,
2197 JMP SHORT $MEN240
2198$MIF240:
2199 STC ;;AN006;; Carry conditon
2200; $ENDIF ;;AN006;;
2201$MEN240:
2202
2203; $IF C ;;AN006;; Was there an update?
2204 JNC $MIF243
2205 POP DI ;;AN006;; No,
2206 POP ES ;;AN006;; Restore old pointer
2207 POP CX ;;AN006;;
2208; $ELSE ;;AN006;; Yes
2209 JMP SHORT $MEN243
2210$MIF243:
2211 ADD SP,6 ;;AN006;; Throw away old pointer
2212 CALL $M_SET_LEN_IN_CX ;;AN006;; Get the length of the ASCIIZ string
2213; $ENDIF ;;AN006;;
2214$MEN243:
2215 POP BP ;;AN006;; Restore other Regs
2216 POP DX ;;AN006;;
2217; $ENDIF ;;AN006;;
2218$MIF239:
2219 $M_POPF ;;AN006;; Restore the flag state
2220
2221 POP BX ;;AN000;;
2222 POP SI ;;AN000;;
2223 RET ;;AN000;; Return ES:DI pointing to the message
2224 ;;
2225$M_GET_MSG_ADDRESS ENDP ;;
2226 ;;
2227$M_SET_LEN_IN_CX PROC NEAR ;;
2228 ;;
2229 PUSH DI ;;AN006;; Save position
2230 PUSH AX ;;AN006;;
2231 MOV CX,-1 ;;AN006;; Set CX for decrements
2232 XOR AL,AL ;;AN006;; Prepare compare register
2233 REPNE SCASB ;;AN006;; Scan for zero
2234 NOT CX ;;AN006;; Change decrement into number
2235 DEC CX ;;AN006;; Don't include the zero
2236 POP AX ;;AN006;;
2237 POP DI ;;AN006;; Restore position
2238 RET ;;AN006;;
2239 ;;
2240$M_SET_LEN_IN_CX ENDP ;;
2241 ;;
2242;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2243;;
2244;; PROC NAME: $M_FIND_SPECIFIED_MSG
2245;;
2246;; FUNCTION: To scan thru message headers until message is found
2247;; INPUTS: ES:DI points to beginning of msg headers
2248;; CX contains the number of messages in class
2249;; DH contains the message class
2250;; OUPUTS: IF CX = 0 THEN Message was not found
2251;; IF CX > 1 THEN ES:DI points to header of specified message
2252;;
2253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2254 ;;
2255$M_FIND_SPECIFIED_MSG PROC NEAR ;;AN000;;
2256 ;;
2257 CMP BX,1 ;;AN004;; Do we have an address to CALL?
2258; $IF E,AND ;;AN004;; Yes,
2259 JNE $MIF247
2260 CMP WORD PTR $M_RT.$M_DISK_PROC_ADDR,-1 ;;AN004;; Do we have an address to CALL?
2261; $IF NE ;;AN004;; Yes,
2262 JE $MIF247
2263 CMP AX,$M_SPECIAL_MSG_NUM ;;AN004;; Are we displaying a default Ext Err?
2264; $IF E ;;AN004;; . . . and . . .
2265 JNE $MIF248
2266 PUSH AX ;;AN004;; Reset the special message number
2267 MOV AX,$M_RT.$M_MSG_NUM ;;AN004;; Get the old message number
2268 CALL DWORD PTR $M_RT.$M_DISK_PROC_ADDR ;;AN004;; Call the READ_DISK_PROC to get error text
2269 POP AX ;;AN004;; Reset the special message number
2270; $ELSE ;;AN004;; Get the old message number
2271 JMP SHORT $MEN248
2272$MIF248:
2273 CALL DWORD PTR $M_RT.$M_DISK_PROC_ADDR ;;AN004;; Call the READ_DISK_PROC to get error text
2274; $ENDIF ;;AN004;; Get the old message number
2275$MEN248:
2276; $ELSE ;;AN004;;
2277 JMP SHORT $MEN247
2278$MIF247:
2279 XOR CX,CX ;;AN002;; CX = 0 will allow us to
2280 CMP DH,UTILITY_MSG_CLASS ;;AN001;;
2281; $IF NE ;;AN001;;
2282 JE $MIF252
2283 MOV CL,BYTE PTR ES:[DI].$M_NUM_CLS_MSG ;;AN001;; Get number of messages in class
2284; $ELSE ;;AN001;;
2285 JMP SHORT $MEN252
2286$MIF252:
2287IF FARmsg ;;AN001;;
2288 CMP BYTE PTR ES:[DI].$M_CLASS_ID,DH ;;AN002;; Check if class still exists at
2289ELSE
2290 CMP BYTE PTR CS:[DI].$M_CLASS_ID,DH ;;AN002;; Check if class still exists at
2291ENDIF
2292; $IF E ;;AN002;; pointer (hopefully)
2293 JNE $MIF254
2294IF FARmsg ;;AN001;;
2295 MOV CL,BYTE PTR ES:[DI].$M_NUM_CLS_MSG ;;AN000;; Get number of messages in class
2296ELSE
2297 MOV CL,BYTE PTR CS:[DI].$M_NUM_CLS_MSG ;;AN000;; Get number of messages in class
2298ENDIF
2299; $ENDIF ;;AN002;; go on to the next class
2300$MIF254:
2301; $ENDIF ;;AN001;;
2302$MEN252:
2303 ADD DI,$M_CLASS_ID_SZ ;;AN000;; Point past the class header
2304 STC ;;AN004;; Flag that we haven't found anything yet
2305; $ENDIF ;;AN004;;
2306$MEN247:
2307
2308; $IF C ;;AN004;; Have we found anything yet?
2309 JNC $MIF258
2310 CLC ;;AN004;; No, reset carry
2311; $SEARCH ;;AN000;;
2312$MDO259:
2313 OR CX,CX ;;AN000;; Do we have any to check?
2314; $LEAVE Z ;;AN000;; No, return with CX = 0
2315 JZ $MEN259
2316 CMP DH,UTILITY_MSG_CLASS ;;AN001;;
2317; $IF NE ;;AN001;;
2318 JE $MIF261
2319 CMP AX,WORD PTR ES:[DI].$M_NUM ;;AN001;; Is this the message requested?
2320; $ELSE ;;AN001;;
2321 JMP SHORT $MEN261
2322$MIF261:
2323IF FARmsg ;;AN001;;
2324 CMP AX,WORD PTR ES:[DI].$M_NUM ;;AN000;; Is this the message requested?
2325ELSE
2326 CMP AX,WORD PTR CS:[DI].$M_NUM ;;AN000;; Is this the message requested?
2327ENDIF
2328; $ENDIF
2329$MEN261:
2330; $EXITIF E ;;AN000;;
2331 JNE $MIF259
2332; $ORELSE ;;AN000;
2333 JMP SHORT $MSR259
2334$MIF259:
2335 DEC CX ;;AN000;; No, well do we have more to check?
2336; $LEAVE Z ;;AN000;; No, return with CX = 0
2337 JZ $MEN259
2338 ADD DI,$M_ID_SZ ;;AN000;; Yes, skip past msg header
2339; $ENDLOOP ;;AN000;;
2340 JMP SHORT $MDO259
2341$MEN259:
2342 STC ;;AN000;;
2343; $ENDSRCH ;;AN000;; Check next message
2344$MSR259:
2345; $IF NC ;;AN000;; Did we find the message?
2346 JC $MIF269
2347 CMP DH,UTILITY_MSG_CLASS ;;AN001;; Yes, is it a utility message?
2348 CLC ;;AN001;;
2349; $IF E ;;AN001;;
2350 JNE $MIF270
2351IF FARmsg ;;AN001;;
2352ELSE ;;AN000;;
2353 PUSH CS ;;AN000;;
2354 POP ES ;;AN000;; Return ES:DI pointing to the message
2355ENDIF
2356; $ENDIF ;;AN001;;
2357$MIF270:
2358 ADD DI,WORD PTR ES:[DI].$M_TXT_PTR ;;AN000;; Prepare ES:DI pointing to the message
2359; $ENDIF ;;AN004;;
2360$MIF269:
2361; $ENDIF ;;AN004;;
2362$MIF258:
2363 ;; Yes, great we can return with CX > 0
2364
2365; $IF NC ;;AN000;; Did we find the message?
2366 JC $MIF274
2367 XOR CH,CH ;;AN000;;
2368 MOV CL,BYTE PTR ES:[DI] ;;AN000;; Move size into CX
2369 INC DI ;;AN000;; Increment past length
2370; $ENDIF ;;AN004;;
2371$MIF274:
2372
2373 MOV $M_RT.$M_SIZE,$M_NULL ;;AN004;; Reset variable
2374 RET ;;AN000;; Return
2375 ;;
2376$M_FIND_SPECIFIED_MSG ENDP ;;AN000;;
2377 ;;
2378;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2379 ENDIF ;;AN000;; END of include of common subroutines
2380;
2381 IF $M_REPLACE ;;AN000;; Is the request to include the code for replaceable parms
2382 $M_REPLACE = FALSE ;;AN000;; Tell the assembler we did
2383 ;;
2384;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2385$M_DISPLAY_REPLACE PROC NEAR ;;AN000;;
2386 ;;
2387 XOR BX,BX ;;AN000;; Use BX for buffer count
2388IF NOT COMR
2389 CMP $M_SL.$M_S_ID,$M_SPECIAL_CASE-30H ;;AN000;; Is this the special case (convert to ASCII)
2390; $IF E ;;AN000;; Yes,
2391 JNE $MIF276
2392 MOV WORD PTR $M_RT.$M_TEMP_BUF[BX],$M_SPACE_HYP ;;AN000;; Move in a " -"
2393 INC BX ;;AN000;; Increment count
2394 INC BX ;;AN000;; Increment count
2395 MOV BYTE PTR $M_RT.$M_TEMP_BUF[BX],$M_SPACE ;;AN000;; Move in a " "
2396 INC BX ;;AN000;; Increment count
2397 CALL $M_FLUSH_BUF ;;AN000;; Write out " - " to prepare for special case
2398; $ENDIF ;;AN000;; If it fails we will catch it later
2399$MIF276:
2400ENDIF
2401
2402 POP BP ;;AN000;; Remember the return address
2403 XOR BX,BX ;;AN000;; Use BX for buffer count
2404 XOR DX,DX ;;AN000;; Use DX for count of parms taken off the stack
2405
2406 MOV $M_RT.$M_SIZE,CL ;;AN000;; Save size to later clear stack
2407 MOV AL,BYTE PTR $M_SL.$M_S_MINW ;;AN000;; Get the minimum width
2408 ;;
2409 CMP AL,CL ;;AN000;; Do we need pad chars added?
2410; $IF A ;;AN000;; Yes,
2411 JNA $MIF278
2412 SUB AL,CL ;;AN000;; Calculate how many pad chars are needed.
2413 MOV DH,AL ;;AN000;; Save the number of pad characters
2414 TEST BYTE PTR $M_SL.$M_S_FLAG,Right_Align ;;AN000;; Was replaceable parm to be right aligned?
2415; $IF NZ ;;AN000;; Yes,
2416 JZ $MIF279
2417; $DO ;;AN000;; Begin filling buffer with pad chars
2418$MDO280:
2419 MOV AL,BYTE PTR $M_SL.$M_S_PAD ;;AN000;;
2420 MOV BYTE PTR $M_RT.$M_TEMP_BUF[BX],AL ;;AN000;; Move in a pad char
2421 INC BX ;;AN000;;
2422 CMP BX,$M_TEMP_BUF_SZ ;;AN000;; Is buffer full?
2423; $IF E ;;AN000;; Yes,
2424 JNE $MIF281
2425 CALL $M_FLUSH_BUF ;;AN000;; Flush the buffer
2426; $ENDIF ;;AN000;;
2427$MIF281:
2428 DEC DH ;;AN000;; Have we filled with enough pad chars?
2429; $ENDDO Z ;;AN000;; No, next pad character
2430 JNZ $MDO280
2431; $ENDIF ;;AN000;;
2432$MIF279:
2433; $ENDIF ;;AN000;; Yes,
2434$MIF278:
2435 ;;
2436 CMP BYTE PTR $M_SL.$M_S_MAXW,$M_UNLIM_W ;;AN000;; Is maximum width unlimited?
2437; $IF NE ;;AN000;;
2438 JE $MIF286
2439 CMP BYTE PTR $M_SL.$M_S_MAXW,CL ;;AN000;; Will we exceed maximum width?
2440; $IF B ;;AN000;; Yes,
2441 JNB $MIF287
2442 SUB CL,BYTE PTR $M_SL.$M_S_MAXW ;;AN000;; Calculate how many extra chars
2443 MOV DL,CL ;;AN000;; Remember how many chars to pop off
2444 MOV CL,BYTE PTR $M_SL.$M_S_MAXW ;;AN000;; Set new string length
2445; $ENDIF ;;AN000;;
2446$MIF287:
2447; $ENDIF ;;AN000;;
2448$MIF286:
2449 OR CX,CX ;;AN000;;
2450; $IF NZ ;;AN000;;
2451 JZ $MIF290
2452; $DO ;;AN000;; Begin filling buffer with string
2453$MDO291:
2454 TEST BYTE PTR $M_SL.$M_S_FLAG,NOT Char_Type AND $M_TYPE_MASK ;;AN000;;
2455; $IF Z,AND ;;AN000;;
2456 JNZ $MIF292
2457 TEST $M_SL.$M_S_FLAG,Char_field_ASCIIZ AND $M_SIZE_MASK ; Is this replace a ASCIIZ string?
2458; $IF NZ ;;AN000;; Yes,
2459 JZ $MIF292
2460 MOV AL,BYTE PTR ES:[DI] ;;AN000;; Get first character from string
2461 INC DI ;;AN000;; Next character in string
2462; $ELSE ;;AN000;; No,
2463 JMP SHORT $MEN292
2464$MIF292:
2465 POP AX ;;AN000;; Get character in register
2466; $ENDIF ;;AN000;;
2467$MEN292:
2468 MOV BYTE PTR $M_RT.$M_TEMP_BUF[BX],AL ;;AN000;; Move char into the buffer
2469 INC BX ;;AN000;; Increase buffer count
2470 CMP BX,$M_TEMP_BUF_SZ ;;AN000;; Is buffer full?
2471; $IF E ;;AN000;; Yes,
2472 JNE $MIF295
2473 CALL $M_FLUSH_BUF ;;AN000;; Flush the buffer
2474; $ENDIF ;;AN000;;
2475$MIF295:
2476 DEC CL ;;AN000;; Have we completed replace?
2477; $ENDDO Z ;;AN000;; Test again
2478 JNZ $MDO291
2479; $ENDIF ;;AN000;;
2480$MIF290:
2481 ;;
2482 TEST BYTE PTR $M_SL.$M_S_FLAG,Right_Align ;;AN000;; Was replaceable parm to be left aligned?
2483; $IF Z ;;AN000;; Yes,
2484 JNZ $MIF299
2485 OR DH,DH ;;AN000;; Do we need pad chars added?
2486; $IF NZ ;;AN000;; Yes,
2487 JZ $MIF300
2488; $DO ;;AN000;; Begin filling buffer with pad chars
2489$MDO301:
2490 MOV AL,BYTE PTR $M_SL.$M_S_PAD ;;AN000;;
2491 MOV BYTE PTR $M_RT.$M_TEMP_BUF[BX],AL ;;AN000;; Move in a pad char
2492 INC BX ;;AN000;;
2493 CMP BX,$M_TEMP_BUF_SZ ;;AN000;; Is buffer full?
2494; $IF E ;;AN000;; Yes,
2495 JNE $MIF302
2496 CALL $M_FLUSH_BUF ;;AN000;; Flush the buffer
2497; $ENDIF ;;AN000;;
2498$MIF302:
2499 DEC DH ;;AN000;; Have we filled with enough pad chars?
2500; $ENDDO Z ;;AN000;; Test again
2501 JNZ $MDO301
2502; $ENDIF ;;AN000;;
2503$MIF300:
2504; $ENDIF ;;AN000;;
2505$MIF299:
2506 ;;
2507 TEST BYTE PTR $M_SL.$M_S_FLAG,NOT Char_Type AND $M_TYPE_MASK ;;AN000;;
2508; $IF Z,AND ;;AN000;;
2509 JNZ $MIF307
2510 TEST $M_SL.$M_S_FLAG,Char_field_ASCIIZ AND $M_SIZE_MASK ;;AN000;; Is this replace a ASCIIZ string?
2511; $IF NZ ;;AN000;; Yes,
2512 JZ $MIF307
2513; $ELSE ;;AN000;;
2514 JMP SHORT $MEN307
2515$MIF307:
2516 OR DL,DL ;;AN000;;
2517; $IF NE ;;AN000;;
2518 JE $MIF309
2519; $DO ;;AN000;;
2520$MDO310:
2521 POP [$M_RT.$M_RETURN_ADDR] ;;AN000;; Clean Up stack using spare variable
2522 DEC DL ;;AN000;; Are we done?
2523; $ENDDO Z ;;AN000;;
2524 JNZ $MDO310
2525; $ENDIF ;;AN000;;
2526$MIF309:
2527; $ENDIF ;;AN000;;
2528$MEN307:
2529 CALL $M_FLUSH_BUF ;;AN000;; Flush the buffer for the final time
2530 PUSH BP ;;AN000;; Restore the return address
2531 ;;
2532 RET ;;AN000;;
2533 ;;
2534$M_DISPLAY_REPLACE ENDP ;;AN000;;
2535 ;;
2536;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2537;;
2538;; PROC NAME: $M_FLUSH_BUFFER
2539;;
2540;; FUNCTION: Display the contents of the temporary buffer
2541;; INPUTS: DI contains the number of bytes to display
2542;; OUTPUTS: BX reset to zero
2543;;
2544;; REGS USED:
2545;;
2546;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2547 ;;
2548$M_FLUSH_BUF PROC NEAR ;;AN000;;
2549 ;;
2550 PUSH CX ;;AN000;; Save changed regs
2551 PUSH ES ;;AN000;;
2552 PUSH DI ;;AN000;;
2553 PUSH DS ;;AN000;; Set ES pointing to buffer
2554 POP ES ;;AN000;;
2555 ;;
2556 MOV CX,BX ;;AN000;; Set number of bytes to display
2557 XOR BX,BX ;;AN000;; Reset buffer counter
2558 LEA DI,$M_RT.$M_TEMP_BUF ;;AN000;; Reset buffer location pointer
2559 CALL $M_DISPLAY_STRING ;;AN000;; Display the buffer
2560 ;;
2561; $IF NC ;;AN000;; Error?
2562 JC $MIF314
2563 POP DI ;;AN000;; No, Restore changed regs
2564 POP ES ;;AN000;;
2565 POP CX ;;AN000;;
2566; $ELSE ;;AN000;; Yes,
2567 JMP SHORT $MEN314
2568$MIF314:
2569 ADD SP,6 ;;AN000;; Fix stack
2570 STC ;;AN000;;
2571; $ENDIF ;;AN000;; Error?
2572$MEN314:
2573 ;;
2574 RET ;;AN000;; Return
2575 ;;
2576$M_FLUSH_BUF ENDP ;;AN000;;
2577 ;;
2578 ;;
2579 IF CHARmsg ;;AN000;; Is the request to include the code for CHAR replace?
2580 $M_REPLACE = TRUE ;;AN000;; Yes, THEN include it and flag that we will need common
2581 $M_CHAR_ONLY = TRUE ;;AN000;; replacement code later
2582;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2583;;
2584;; PROC NAME: $M_CHAR_REPLACE
2585;;
2586;; FUNCTION: Will prepare a single char or ASCIIZ string for replace
2587;; INPUTS: DS:SI points at corresponding SUBLIST
2588;; ES:DI contains the VALUE from SUBLIST
2589;; OUTPUTS: CX contains number of characters on stack
2590;; Top of stack --> Last character
2591;; . . .
2592;; Bot of stack --> First character
2593;;
2594;; OTHER REGS Revised: AX
2595;;
2596;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2597 ;;
2598$M_CHAR_REPLACE PROC NEAR ;;AN000;;
2599 ;;
2600 POP BP ;;AN000;; Save return address
2601 TEST $M_SL.$M_S_FLAG,NOT Char_Field_Char AND $M_SIZE_MASK ;;AN000;; Was Character specified?
2602; $IF Z ;;AN000;; Yes,
2603 JNZ $MIF317
2604 MOV AL,BYTE PTR ES:[DI] ;;AN000;; Get the character
2605 PUSH AX ;;AN000;; Put it on the stack
2606 INC CX ;;AN000;; Increase the count
2607 CALL $M_IS_IT_DBCS ;;AN000;; Is this the first byte of a DB character
2608; $IF C ;;AN000;; Yes,
2609 JNC $MIF318
2610 MOV AL,BYTE PTR ES:[DI]+1 ;;AN000;; Get the next character
2611 PUSH AX ;;AN000;; Put it on the stack
2612 CLC ;;AN000;; Clear the carry
2613; $ENDIF ;;AN000;;
2614$MIF318:
2615; $ELSE ;;AN000;; No, it was an ASCIIZ string
2616 JMP SHORT $MEN317
2617$MIF317:
2618; $DO ;;AN000;;
2619$MDO321:
2620 MOV AL,BYTE PTR ES:[DI] ;;AN000;; Get the character
2621 OR AL,AL ;;AN000;; Is it the NULL?
2622; $LEAVE Z ;;AN000;; No,
2623 JZ $MEN321
2624 INC DI ;;AN000;; Next character
2625 INC CX ;;AN000;; Increment the count
2626; $ENDDO ;;AN000;; Yes,
2627 JMP SHORT $MDO321
2628$MEN321:
2629 SUB DI,CX ;;AN000;; Set SI at the beginning of the string
2630; $ENDIF ;;AN000;;
2631$MEN317:
2632 ;;AN000;;
2633 PUSH BP ;;AN000;; Restore return address
2634 RET ;;AN000;; Return
2635 ;;
2636$M_CHAR_REPLACE ENDP ;;AN000;;
2637 ;;
2638;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2639 ENDIF ;;AN000;; END of include of CHAR replace code
2640;
2641 IF NUMmsg ;;AN000;; Is the request to include the code for NUM replace?
2642 $M_REPLACE = TRUE ;;AN000;; Yes, THEN include it and flag that we will need common
2643 $M_CHAR_ONLY = FALSE ;;AN000;; replacement code later
2644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2645;;
2646;; PROC NAME: $M_BIN2ASC_REPLACE
2647;;
2648;; FUNCTION: Convert a signed or unsigned binary number to an ASCII string
2649;; and prepare to display
2650;; INPUTS: DS:SI points at corresponding SUBLIST
2651;; ES:DI contains the VALUE from SUBLIST
2652;; OUTPUTS: CX contains number of characters on stack
2653;; Top of stack --> Last character
2654;; . . .
2655;; Bot of stack --> First character
2656;; OTHER REGS Revised: BX,DX,AX
2657;;
2658;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2659 ;;
2660$M_BIN2ASC_REPLACE PROC NEAR ;;AN000;;
2661 ;;
2662 POP BP ;;AN000;; Save return address
2663 ;;
2664 XOR DX,DX ;;AN000;; Prepare for get binary value (HIGH)
2665 XOR AX,AX ;;AN000;; Prepare for get binary value (LOW)
2666 MOV $M_RT.$M_DIVISOR,$M_BASE16 ;;AN000;; Set default divisor
2667 XOR BX,BX ;;AN000;; Use BP as the NEG flag (if applicable)
2668IF NOT COMR
2669 TEST $M_SL.$M_S_FLAG,NOT $M_BYTE AND $M_SIZE_MASK ;;AN000;; Was BYTE specified?
2670; $IF Z ;;AN000;;
2671 JNZ $MIF325
2672 MOV AL, BYTE PTR ES:[DI] ;;AN000;; Setup byte in AL
2673 TEST $M_SL.$M_S_FLAG,NOT Sgn_Bin_Type AND $M_TYPE_MASK ;;AN000;; Was Signed binary specified?
2674; $IF Z ;;AN000;;
2675 JNZ $MIF326
2676 TEST AL,10000000b ;;AN000;; Is this number negative?
2677; $IF NZ ;;AN000;; Yes,
2678 JZ $MIF327
2679 INC BX ;;AN000;; Remember that it was negative
2680 AND AL,01111111b ;;AN000;; Make it positive
2681; $ENDIF ;;AN000;;
2682$MIF327:
2683 MOV $M_RT.$M_DIVISOR,$M_BASE10 ;;AN000;;
2684; $ENDIF ;;AN000;;
2685$MIF326:
2686 TEST $M_SL.$M_S_FLAG,NOT Unsgn_Bin_Type AND $M_TYPE_MASK ;;AN000;; Was Signed binary specified?
2687; $IF Z ;;AN000;;
2688 JNZ $MIF330
2689 MOV $M_RT.$M_DIVISOR,$M_BASE10 ;;AN000;;
2690; $ENDIF ;;AN000;;
2691$MIF330:
2692; $ELSE ;;AN000;;
2693 JMP SHORT $MEN325
2694$MIF325:
2695ENDIF
2696 TEST $M_SL.$M_S_FLAG,NOT $M_WORD AND $M_SIZE_MASK ;;AN000;; Was WORD specified?
2697; $IF Z ;;AN000;;
2698 JNZ $MIF333
2699 MOV AX, WORD PTR ES:[DI] ;;AN000;; Setup byte in AL
2700 TEST $M_SL.$M_S_FLAG,NOT Sgn_Bin_Type AND $M_TYPE_MASK ;; AN000;; Was Signed binary specified?
2701; $IF Z ;;AN000;;
2702 JNZ $MIF334
2703 TEST AH,10000000b ;;AN000;; Is this number negative?
2704; $IF NZ ;;AN000;; Yes,
2705 JZ $MIF335
2706 INC BX ;;AN000;; Remember that it was negative
2707 AND AH,01111111b ;;AN000;; Make it positive
2708; $ENDIF ;;AN000;;
2709$MIF335:
2710 MOV $M_RT.$M_DIVISOR,$M_BASE10 ;;AN000;;
2711; $ENDIF ;;AN000;;
2712$MIF334:
2713 TEST $M_SL.$M_S_FLAG,NOT Unsgn_Bin_Type AND $M_TYPE_MASK ;;AN000;; Was Signed binary specified?
2714; $IF Z ;;AN000;;
2715 JNZ $MIF338
2716 MOV $M_RT.$M_DIVISOR,$M_BASE10 ;;AN000;;
2717; $ENDIF ;;AN000;;
2718$MIF338:
2719; $ELSE ;;AN000;;
2720 JMP SHORT $MEN333
2721$MIF333:
2722IF NOT COMR
2723 MOV AX, WORD PTR ES:[DI] ;;AN000;; Setup Double word in DX:AX
2724 MOV DX, WORD PTR ES:[DI]+2 ;;AN000;;
2725 TEST $M_SL.$M_S_FLAG,NOT Sgn_Bin_Type AND $M_TYPE_MASK ;;AN000;; Was Signed binary specified?
2726; $IF Z ;;AN000;;
2727 JNZ $MIF341
2728 TEST DH,10000000b ;;AN000;; Is this number negative?
2729; $IF NZ ;;AN000;; Yes,
2730 JZ $MIF342
2731 INC BX ;;AN000;; Remember that it was negative
2732 AND DH,01111111b ;;AN000;; Make it positive
2733; $ENDIF ;;AN000;;
2734$MIF342:
2735 MOV $M_RT.$M_DIVISOR,$M_BASE10 ;;AN000;;
2736; $ENDIF ;;AN000;;
2737$MIF341:
2738 TEST $M_SL.$M_S_FLAG,NOT Unsgn_Bin_Type AND $M_TYPE_MASK ;;AN000;; Was Signed binary specified?
2739; $IF Z ;;AN000;;
2740 JNZ $MIF345
2741 MOV $M_RT.$M_DIVISOR,$M_BASE10 ;;AN000;;
2742; $ENDIF ;;AN000;;
2743$MIF345:
2744ENDIF
2745; $ENDIF ;;AN000;;
2746$MEN333:
2747; $ENDIF ;;AN000;;
2748$MEN325:
2749 ;;
2750 CALL $M_CONVERT2ASC ;;AN000;; Convert to ASCII string
2751IF NOT COMR
2752 OR BX,BX ;;AN000;;
2753; $IF NZ ;;AN000;; Was number negative?
2754 JZ $MIF349
2755 XOR DX,DX ;;AN000;; Yes,
2756 MOV DL,$M_NEG_SIGN ;;AN000;; Put "-" on the stack with the number
2757 PUSH DX ;;AN000;;
2758; $ENDIF ;;AN000;; No,
2759$MIF349:
2760ENDIF
2761 ;;
2762 PUSH BP ;;AN000;; Restore return address
2763 RET ;;AN000;; Return
2764 ;;
2765$M_BIN2ASC_REPLACE ENDP ;;AN000;;
2766 ;;
2767;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2768 ENDIF ;;AN000;; END of include of NUM replace code
2769;
2770 IF DATEmsg ;;AN000;; Is the request to include the code for DATE replace?
2771 $M_REPLACE = TRUE ;;AN000;; Yes, THEN include it and flag that we will need common
2772 $M_CHAR_ONLY = FALSE ;;AN000;; replacement code later
2773;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2774;;
2775;; PROC NAME: $M_DATE_REPLACE
2776;;
2777;; FUNCTION: Convert a date to a decimal ASCII string using current
2778;; country format and prepare to display
2779;; INPUTS: DS:SI points at corresponding SUBLIST
2780;; ES:DI points at VALUE from SUBLIST
2781;; OUTPUTS: CX contains number of characters on stack
2782;; Top of stack --> Last character
2783;; . . .
2784;; Bot of stack --> First character
2785;; OTHER REGS Revised: DX, AX
2786;;
2787;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2788 ;;
2789$M_DATE_REPLACE PROC NEAR ;;AN000;;
2790 ;;
2791 POP BP ;;AN000;; Save return address
2792 MOV $M_RT.$M_DIVISOR,$M_BASE10 ;;AN000;; Set default divisor
2793 CALL $M_GET_DATE ;;AN000;; Set date format/separator in $M_RT
2794 ;;AN000;; All O.K.?
2795 XOR DX,DX ;;AN000;; Reset DX value
2796 XOR AX,AX ;;AN000;; Reset AX value
2797 CMP WORD PTR $M_RT.$M_DATE_FORMAT,0 ;;AN000;; USA Date Format
2798; $IF E ;;AN000;; Beginning from end: (saved on the stack)
2799 JNE $MIF351
2800 CALL $M_YEAR ;;AN000;; Get Year
2801 CALL $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string
2802 PUSH WORD PTR $M_RT.$M_DATE_SEPARA ;;AN000;;
2803 INC CX ;;AN000;; Increment count
2804 XOR AX,AX ;;AN000;; Reset AX value
2805 MOV AL,BYTE PTR $M_SL.$M_S_VALUE+3 ;;AN000;; Get Day
2806 CALL $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string
2807 PUSH WORD PTR $M_RT.$M_DATE_SEPARA ;;AN000;;
2808 INC CX ;;AN000;; Increment count
2809 MOV AL,BYTE PTR $M_SL.$M_S_VALUE+2 ;;AN000;; Get Month
2810 CALL $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string
2811; $ENDIF ;;AN000;;
2812$MIF351:
2813 ;;
2814 CMP WORD PTR $M_RT.$M_DATE_FORMAT,1 ;;AN000;; EUROPE Date Format
2815; $IF E ;;AN000;; Beginning from end: (saved on the stack)
2816 JNE $MIF353
2817 CALL $M_YEAR ;;AN000;; Get Year
2818 CALL $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string
2819 PUSH WORD PTR $M_RT.$M_DATE_SEPARA ;;AN000;;
2820 INC CX ;;AN000;;
2821 XOR AX,AX ;;AN000;; Reset AX
2822 MOV AL,BYTE PTR $M_SL.$M_S_VALUE+2 ;;AN000;; Get Month
2823 CALL $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string
2824 PUSH WORD PTR $M_RT.$M_DATE_SEPARA ;;AN000;;
2825 INC CX ;;AN000;;
2826 MOV AL,BYTE PTR $M_SL.$M_S_VALUE+3 ;;AN000;; Get Day
2827 CALL $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string
2828; $ENDIF ;;AN000;;
2829$MIF353:
2830 ;;
2831 CMP WORD PTR $M_RT.$M_DATE_FORMAT,2 ;;AN000;; JAPAN Date Format
2832; $IF E ;;AN000;; Beginning from end: (saved on the stack)
2833 JNE $MIF355
2834 MOV AL,BYTE PTR $M_SL.$M_S_VALUE+3 ;;AN000;; Get Day
2835 CALL $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string
2836 PUSH WORD PTR $M_RT.$M_DATE_SEPARA ;;AN000;;
2837 INC CX ;;AN000;;
2838 MOV AL,BYTE PTR $M_SL.$M_S_VALUE+2 ;;AN000;; Get Month
2839 CALL $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string
2840 PUSH WORD PTR $M_RT.$M_DATE_SEPARA ;;AN000;;
2841 INC CX ;;AN000;;
2842 CALL $M_YEAR ;;AN000;; Get Year
2843 CALL $M_CONVERTDATE ;;AN000;; Convert it to an ASCII string
2844; $ENDIF ;;AN000;;
2845$MIF355:
2846 ;;
2847 PUSH BP ;;AN000;; Restore return address
2848 RET ;;AN000;; Return
2849 ;;
2850$M_DATE_REPLACE ENDP ;;AN000;;
2851 ;;
2852$M_GET_DATE PROC NEAR ;;AN000;;
2853 MOV AH,DOS_GET_COUNTRY ;;AN000;; Call DOS for country dependant info
2854 MOV AL,0 ;;AN000;; Get current country info
2855 LEA DX,$M_RT.$M_TEMP_BUF ;;AN000;; Set up addressibility to buffer
2856 INT 21H ;;AN000;;
2857; $IF C ;;AN000;; No,
2858 JNC $MIF357
2859 MOV WORD PTR $M_RT.$M_DATE_FORMAT,$M_DEF_DATE_FORM ;;AN000;; Set default date format (BH)
2860 MOV BYTE PTR $M_RT.$M_DATE_SEPARA,$M_DEF_DATE_SEP ;;AN000;; Set default date separator (BL)
2861; $ENDIF ;;AN000;;
2862$MIF357:
2863 RET ;;AN000;;
2864$M_GET_DATE ENDP ;;AN000;;
2865 ;;
2866$M_YEAR PROC NEAR ;;AN000;;
2867 MOV AX,WORD PTR $M_SL.$M_S_VALUE ;;AN000;; Get Year
2868 TEST $M_SL.$M_S_FLAG,Date_MDY_4 AND $M_DATE_MASK ;;AN000;; Was Month/Day/Year (2 Digits) specified?
2869; $IF Z ;;AN000;;
2870 JNZ $MIF359
2871 CMP AX,$M_MAX_2_YEAR ;;AN000;; Get Year
2872; $IF A ;;AN000;;
2873 JNA $MIF360
2874 MOV AX,$M_MAX_2_YEAR ;;AN000;;
2875; $ENDIF ;;AN000;;
2876$MIF360:
2877; $ENDIF ;;AN000;;
2878$MIF359:
2879 RET ;;AN000;;
2880$M_YEAR ENDP ;;AN000;;
2881 ;;
2882$M_CONVERTDATE PROC NEAR ;;AN000;;
2883 POP WORD PTR $M_RT.$M_TEMP_BUF ;;AN000;; Save return address
2884 MOV $M_RT.$M_SIZE,CL ;;AN000;; Save the size before conversion
2885 CALL $M_CONVERT2ASC ;;AN000;; Convert it to an ASCII string
2886 DEC CX ;;AN000;; Test if size only grew by 1
2887 CMP CL,$M_RT.$M_SIZE ;;AN000;; Did size only grow by one
2888; $IF E ;;AN000;; Yes,
2889 JNE $MIF363
2890 MOV AX,$M_TIMEDATE_PAD ;;AN000;; Get a pad character (0)
2891 PUSH AX ;;AN000;; Save it
2892 INC CX ;;AN000;; Count it
2893; $ENDIF ;;AN000;;
2894$MIF363:
2895 INC CX ;;AN000;; Restore CX
2896 PUSH WORD PTR $M_RT.$M_TEMP_BUF ;;AN000;; Save return address
2897 RET ;;AN000;;
2898$M_CONVERTDATE ENDP ;;AN000;;
2899 ;;
2900;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2901 ENDIF ;;AN000;; END of include of DATE replace code
2902;
2903 IF TIMEmsg ;;AN000;; Is the request to include the code for TIME replace?
2904 $M_REPLACE = TRUE ;;AN000;; Yes, THEN include it and flag that we will need common
2905 $M_CHAR_ONLY = FALSE ;;AN000;; replacement code later
2906;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2907;;
2908;; PROC NAME: $M_TIME_REPLACE
2909;;
2910;; FUNCTION: Convert a time to a decimal ASCII string
2911;; and prepare to display
2912;; INPUTS: DS:SI points at corresponding SUBLIST
2913;; ES:DI points at VALUE from SUBLIST
2914;; OUTPUTS: CX contains number of characters on stack
2915;; Top of stack --> Last character
2916;; . . .
2917;; Bot of stack --> First character
2918;; REGS USED: BP,CX,AX
2919;;
2920;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2921 ;;
2922$M_TIME_REPLACE PROC NEAR ;;AN000;;
2923 ;;
2924 POP BP ;;AN000;; Save return address
2925 MOV $M_RT.$M_DIVISOR,$M_BASE10 ;;AN000;; Set default divisor
2926 CALL $M_GET_TIME ;;AN000;; All O.K.?
2927 TEST $M_SL.$M_S_FLAG,Time_Cty_Type AND $M_TIME_MASK ;;AN000;; Is this a request for current country info?
2928; $IF NZ ;;AN000;; Yes,
2929 JZ $MIF365
2930 CMP BYTE PTR $M_RT.$M_TIME_FORMAT,0 ;;AN000;; Is the current country format 12 Hour?
2931; $IF E ;;AN000;; Yes,
2932 JNE $MIF366
2933 MOV AL,BYTE PTR $M_SL.$M_S_VALUE ;;AN000;; Get Hours
2934 CMP AL,12 ;;AN000;; Is hour 12 or less?
2935; $IF L,OR ;;AN000;; or
2936 JL $MLL367
2937 CMP AL,23 ;;AN000;; Is hour 24 or greater?
2938; $IF G ;;AN000;; Yes,
2939 JNG $MIF367
2940$MLL367:
2941 MOV AL,$M_AM ;;AN000;;
2942 PUSH AX ;;AN000;; Push an "a" to represent AM.
2943 INC CX ;;AN000;;
2944; $ELSE ;;AN000;; No,
2945 JMP SHORT $MEN367
2946$MIF367:
2947 MOV AL,$M_PM ;;AN000;;
2948 PUSH AX ;;AN000;; Push an "p" to represent PM.
2949 INC CX ;;AN000;;
2950; $ENDIF ;;AN000;;
2951$MEN367:
2952; $ENDIF ;;AN000;;
2953$MIF366:
2954; $ENDIF ;;AN000;;
2955$MIF365:
2956 ;;
2957 XOR AX,AX ;;AN000;;
2958 XOR DX,DX ;;AN000;;
2959 TEST $M_SL.$M_S_FLAG,Time_HHMMSSHH_Cty AND $M_SIZE_MASK ;;AN000;; Was Hour/Min/Sec/Hunds (12 Hour) specified?
2960; $IF NZ ;;AN000;;
2961 JZ $MIF372
2962 MOV AL,BYTE PTR $M_SL.$M_S_VALUE+3 ;;AN000;; Get Hundreds
2963 CALL $M_CONVERTTIME ;;AN000;;
2964 PUSH WORD PTR $M_RT.$M_DECI_SEPARA ;;AN000;;
2965 INC CX ;;AN000;;
2966; $ENDIF ;;AN000;;
2967$MIF372:
2968 TEST $M_SL.$M_S_FLAG,Time_HHMMSSHH_Cty AND $M_SIZE_MASK ;;AN000;; Was Hour/Min/Sec/Hunds (12 Hour) specified?
2969; $IF NZ,OR ;;AN000;;
2970 JNZ $MLL374
2971 TEST $M_SL.$M_S_FLAG,Time_HHMMSS_Cty AND $M_SIZE_MASK ;;AN000;; Was Hour/Min/Sec (12 Hour) specified?
2972; $IF NZ ;;AN000;;
2973 JZ $MIF374
2974$MLL374:
2975 MOV AL,BYTE PTR $M_SL.$M_S_VALUE+2 ;;AN000;; Get Seconds
2976 CALL $M_CONVERTTIME ;;AN000;;
2977 PUSH WORD PTR $M_RT.$M_TIME_SEPARA ;;AN000;;
2978 INC CX ;;AN000;;
2979; $ENDIF ;;AN000;;
2980$MIF374:
2981 ;; Do Hour/Min (12 Hour)
2982 MOV AL,BYTE PTR $M_SL.$M_S_VALUE+1 ;;AN000;; Get Minutes
2983 CALL $M_CONVERTTIME ;;AN000;;
2984 PUSH WORD PTR $M_RT.$M_TIME_SEPARA ;;AN000;;
2985 INC CX ;;AN000;;
2986 ;;
2987 MOV AL,BYTE PTR $M_SL.$M_S_VALUE ;;AN000;; Get Hours
2988 TEST $M_SL.$M_S_FLAG,Time_Cty_Type AND $M_TIME_MASK ;;AN000;; Is this a request for current country info?
2989; $IF NZ ;;AN000;; Yes,
2990 JZ $MIF376
2991 CMP BYTE PTR $M_RT.$M_TIME_FORMAT,0 ;;AN000;; Is the current country format 12 Hour?
2992; $IF E ;;AN000;; Yes,
2993 JNE $MIF377
2994 CMP AL,13 ;;AN000;; Is hour less than 12?
2995; $IF GE ;;AN000;; Yes,
2996 JNGE $MIF378
2997 SUB AL,12 ;;AN000;; Set to a 12 hour value
2998; $ENDIF ;;AN000;;
2999$MIF378:
3000 CMP AL,0 ;;AN000;; Is hour less than 12?
3001; $IF E ;;AN000;; Yes,
3002 JNE $MIF380
3003 MOV AL,12 ;;AN000;; Set to a 12 hour value
3004; $ENDIF ;;AN000;;
3005$MIF380:
3006; $ENDIF ;;AN000;;
3007$MIF377:
3008; $ENDIF ;;AN000;;
3009$MIF376:
3010 CALL $M_CONVERT2ASC ;;AN000;; Convert it to ASCII
3011 ;;
3012 PUSH BP ;;AN000;; Restore return address
3013 RET ;;AN000;; Return
3014 ;;
3015$M_TIME_REPLACE ENDP ;;AN000;;
3016 ;;
3017$M_GET_TIME PROC NEAR ;;AN000;;
3018 MOV AH,DOS_GET_COUNTRY ;;AN000;; Call DOS for country dependant info
3019 MOV AL,0 ;;AN000;; Get current country info
3020 LEA DX,$M_RT.$M_TEMP_BUF ;;AN000;; Set up addressibility to buffer
3021 INT 21H ;;AN000;;
3022; $IF C ;;AN000;; No,
3023 JNC $MIF384
3024 MOV WORD PTR $M_RT.$M_TIME_FORMAT,$M_DEF_TIME_FORM ;;AN000;; Set default time format (BH)
3025 MOV BYTE PTR $M_RT.$M_TIME_SEPARA,$M_DEF_TIME_SEP ;;AN000;; Set default time separator (BL)
3026 MOV BYTE PTR $M_RT.$M_DECI_SEPARA,$M_DEF_DECI_SEP ;;AN000;; Set default time separator (BL)
3027; $ENDIF ;;AN000;;
3028$MIF384:
3029 RET ;;AN000;;
3030$M_GET_TIME ENDP ;;AN000;;
3031 ;;
3032$M_CONVERTTIME PROC NEAR ;;AN000;;
3033 POP WORD PTR $M_RT.$M_TEMP_BUF ;;AN000;; Save return address
3034 MOV $M_RT.$M_SIZE,CL ;;AN000;; Save the size before conversion
3035 CALL $M_CONVERT2ASC ;;AN000;; Convert it to an ASCII string
3036 DEC CX ;;AN000;; Test if size only grew by 1
3037 CMP CL,$M_RT.$M_SIZE ;;AN000;; Did size only grow by one
3038; $IF E ;;AN000;; Yes,
3039 JNE $MIF386
3040 MOV AX,$M_TIMEDATE_PAD ;;AN000;; Get a pad character (0)
3041 PUSH AX ;;AN000;; Save it
3042 INC CX ;;AN000;; Count it
3043; $ENDIF ;;AN000;;
3044$MIF386:
3045 INC CX ;;AN000;; Restore CX
3046 PUSH WORD PTR $M_RT.$M_TEMP_BUF ;;AN000;; Save return address
3047 RET ;;AN000;;
3048$M_CONVERTTIME ENDP ;;AN000;;
3049 ;;
3050;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3051 ENDIF ;;AN000;; END of include of TIME replace
3052 ENDIF ;;AN000;; END of include of Replacement common code
3053;
3054 IF INPUTmsg ;;AN000;; Is the request to include the code for NUM replace?
3055 INPUTmsg = FALSE ;;AN000;; Yes, THEN include it and reset the flag
3056;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3057;;
3058;; PROC NAME: $M_WAIT_FOR_INPUT
3059;;
3060;; FUNCTION: To accept keyed input and return extended key value
3061;; in AX register
3062;; INPUTS: DL contains the DOS function requested for input
3063;; OUPUTS: AX contains the extended key value that was read
3064;; REGS USED:
3065;;
3066;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3067 ;;
3068$M_WAIT_FOR_INPUT PROC NEAR ;;AN000;;
3069 ;;
3070 PUSH CX ;;AN000;; Save CX
3071 PUSH DX ;;AN000;; Save DX
3072 PUSH DS ;;AN000;; Save Data segment
3073 ;;
3074 CMP DL,DOS_CLR_KEYB_BUF_MASK ;;AN001;; Are we to clear the keyboard buffer?
3075; $IF A ;;AN001;; Yes,
3076 JNA $MIF388
3077 MOV AL,DL ;;AN001;; Mov function into AL
3078 AND AL,LOW_NIB_MASK ;;AN001;; Mask out the C in high nibble
3079 MOV AH,DOS_CLR_KEYB_BUF ;;AN001;; Set input function
3080; $ELSE ;;AN001;; No,
3081 JMP SHORT $MEN388
3082$MIF388:
3083 MOV AH,DL ;;AN000;; Put DOS function in AH
3084; $ENDIF ;;AN001;;
3085$MEN388:
3086 PUSH ES ;;AN000;; Get output buffer segment
3087 POP DS ;;AN000;;
3088 MOV DX,DI ;;AN000;; Get output buffer offset in case needed
3089 INT 21H ;;AN000;; Get keyboard input
3090 POP DS ;;AN000;;
3091
3092 CMP DL,DOS_BUF_KEYB_INP ;;AN000;;
3093 CLC ;;AN000;;
3094; $IF NE ;;AN000;; If character input
3095 JE $MIF391
3096 CALL $M_IS_IT_DBCS ;;AN000;; Is this character DBCS?
3097; $IF C ;;AN000;;
3098 JNC $MIF392
3099 MOV CL,AL ;;AN000;; Save first character
3100 MOV AH,DL ;;AN001;; Get back function
3101 INT 21H ;;AN000;; Get keyboard input
3102 MOV AH,CL ;;AN000;; Retreive first character AX = xxxx
3103 CLC ;;AN000;; Clear carry condition
3104; $ELSE ;;AN000;;
3105 JMP SHORT $MEN392
3106$MIF392:
3107 MOV AH,0 ;;AN000;; AX = 00xx where xx is SBCS
3108; $ENDIF ;;AN000;;
3109$MEN392:
3110; $ENDIF ;;AN000;;
3111$MIF391:
3112 ;;
3113; $IF NC ;;AN000;;
3114 JC $MIF396
3115 POP DX ;;AN000;;
3116 POP CX ;;AN000;;
3117; $ELSE ;;AN000;;
3118 JMP SHORT $MEN396
3119$MIF396:
3120 ADD SP,4 ;;AN000;;
3121 STC ;;AN000;; Reset carry flag
3122; $ENDIF ;;AN000;;
3123$MEN396:
3124 RET ;;AN000;; Return
3125 ;;
3126$M_WAIT_FOR_INPUT ENDP ;;AN000;;
3127 ;;
3128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3129 ENDIF ;;AN000;; END of include of Wait for Input
3130 ENDIF ;;AN000;; END of include of SYSDISPMSG
3131 ENDIF ;;AN000;; END of include of MSG_DATA_ONLY
3132ENDIF ;;AN000;; END of include of Structure only
3133 \ No newline at end of file