1 PAGE
90,132 ;\ f\eA\b\e2
2 TITLE GRTAB
- DEFINE ROM GRAPHIC CHARACTERS FOR
128-255
8 LISTPARM
= 1 ;0=SUPPRESS LIST; 1=ALLOW LIST ;AN000;
10 ;****************** START OF SPECIFICATIONS *****************************
12 ; (MAIN ROUTINE FOR UTILITY "GRAFTABL")
14 ; DESCRIPTIVE NAME: Makes resident a 1K block of data defining the
15 ; graphic character set when in graphics mode.
17 ;FUNCTION: When in normal text mode (BASIC SCREEN 0), the CGA will properly
18 ; handle all 255 characters in the screen display.
19 ; However, when in graphics mode (BASIC SCREEN 1), then only the
20 ; first 128 characters are properly shown on the screen.
21 ; The upper 128 characters are defined in graphics mode by
22 ; the 8 by 128 byte table pointed to by interrupt 1FH
23 ; vector, which is normally set to 0:0, thus producing
24 ; garbage on the screen for the upper set of characters.
26 ; The purpose of this routine is to define an 8 by 128 byte
27 ; table that defines each of these graphic characters in
28 ; the upper 128 byte range, and also to put the vector
29 ; pointer to this table into the interrupt 1FH. Once
30 ; loaded, this table remains resident.
32 ; An interrupt handler is hooked into the INT 2FH vector that
33 ; screens INT 2FH calls for the MULTIPLEX ID value of hex B0,
34 ; as defined by an equate, MY_MULTIPLEX_NUMBER, in GRATABHAN.
35 ; The response indicates that GRAFTABL has been loaded, thus
36 ; permitting the redefinition of the original 1K table with
37 ; some new specification.
39 ; ENTRY POINT: Entry_Point, JMP from GRTABHAN.SAL at his ORG 100H.
40 ; LINKAGE: [d:][path] GRAFTABL [437 | 850 | 860 | 863 | 865 | ? | /STATUS]
42 ; INPUT: (DOS COMMAND LINE PARAMETERS)
43 ; '/STATUS'- (OR /STA) Identify the table already loaded, if any.
44 ; '?' - Display the list of operands supported by GRAFTABL.
45 ; 437 - Install the USA Graphic Character Set
46 ; (BLANK) - Means same as '437', the 'USA' definition table
47 ; 850 - Install the Multi-lingual Graphic Character Set
48 ; 860 - Install the Portuguese Graphic Character Set
49 ; 863 - Install the Canadian French Graphic Character Set
50 ; 865 - Install the Nordic Graphic Character Set
52 ; EXIT-NORMAL: ERRORLEVEL 0 - Leaving the 1K block of newly defined
53 ; characters resident. There was no
54 ; previously defined character table.
55 ; Available RAM reduced by hex 1360 bytes.
57 ; ERRORLEVEL 1 - No change in size of available RAM storage.
58 ; A previously loaded character table exists.
59 ; If a new table was requested, it has replaced
60 ; the previous table at its original location.
62 ; ERRORLEVEL 2 - No change in size of available RAM storage.
63 ; No previously loaded character table exists.
65 ; (The request for status, with parm="/sta[tus]",
66 ; or the request for HELP, with parm="?",
67 ; will result in either code 1 or 2.)
69 ; EXIT-ERROR: ERRORLEVEL 3 - Incorrect parameter.
70 ; No action taken, assumes "?" requested HELP.
71 ; No change in size of available RAM storage.
73 ; ERRORLEVEL 4 - Incorrect version of DOS, DOS 4.0 required
75 ; EFFECTS: Either the desired table is hooked into Interrupt 1FH,
76 ; or the identity of the previously loaded table is
79 ; INTERNAL REFERENCES:
81 ; FINDTYPE - Scan existing table to see who is already loaded
82 ; MOVTAB - Moves the specified table to overlay a portion of the PSP
83 ; BADPARMS - Displays error message, and sets error ERRORLEVEL code
84 ; SENDMSG - passes parms to regs and invokes the system message routine.
87 ; PSP - Contains the DOS command line parameters. Partly overlayed
88 ; with the installation of the character table.
89 ; WORKAREA - Temporary storage
91 ; EXTERNAL REFERENCES:
93 ; GRTABHAN (ENTRY is "HANDLER") - hooked into INT 2FH to identify
94 ; that GRAFTABL is loaded and resident.
95 ; SYSDISPMSG - Uses the MSG parm lists to construct the messages
97 ; SYSLOADMSG - Loads messages, makes them accessable.
98 ; SYSPARSE - Processes the DOS Command line, finds parms.
99 ; PARSE - Interfaces with the system Parser.
102 ; GRTABUS - 1k binary table of the USA graphic character set
103 ; GRTABML - 1k binary table of the Multi-Lingual graphic
105 ; GRTABPO - 1k binary table of the Portuguese graphic
107 ; GRTABCF - 1k binary table of the Canada French graphic
109 ; GRTABNO - 1k binary table of the Nordic graphic character
111 ; GRTABSM - Definition of messages, text and MSG parm lists,
112 ; and COPYRIGHT notice
113 ; GRTABPAR - Control blocks to define the DOS command line parms.
114 ; MPEXNUM - Byte containing the value of the multiplex number
115 ; (For ease of patching, if such should ever become needed,
116 ; this byte is immediately just before the interrupt 2FH
117 ; handler's entry point, after that handler is loaded. To
118 ; change this value here in these source modules, that value
119 ; is defined in GRTABHAN as the equate: MY_MULTIPLEX_NUMBER.
120 ; For purposes of patching the GRAFTABL.EXE file, this byte
121 ; is at offset 5FH into the module.)
124 ; This module should be processed with the SALUT preprocessor
125 ; with the re-alignment not requested, as:
129 ; To assemble these modules, the alphabetical or sequential
130 ; ordering of segments may be used.
132 ; Sample LINK command:
136 ; Where the GRTABLK.ARF is defined as:
137 ; GRTABHAN+ (must be first in this list)
138 ; GRTABUS+ (these languages must be linked in this order)
139 ; GRTABML+ (Multi-Lingual)
140 ; GRTABPO+ (Portuguese)
141 ; GRTABCF+ (Canadian French)
143 ; GRTABSM+ (contains COPYRIGHT, SYSDISPMSG, SYSLOADMSG code)
144 ; GRTABPAR+ (contains PARSE control blocks, code to call SYSPARSE)
145 ; GRTABP+ (contains SYSPARSE to decode COMMAND line parms)
146 ; GRTAB (MAIN ROUTINE)
149 ; These modules must be linked in this order. The load module is
150 ; a COM file, to be converted to COM with EXE2BIN.
153 ; A000 Version 4.00: add PARSER, System Message Handler,
154 ; A001 PTM 382 display "ACTIVE" OR "PREVIOUS" CP.
155 ; A002 PTM 474 Avoid duplicate switches
156 ; A003 PTM 538 Display parm in error
157 ; A004 PTM1821 INCLUDE COPYRIGH.INC moved to msg_service macro.
158 ; A005 PTM3262 specify BASESW EQU 1 before PARSE.ASM
159 ; A006 PTM3512 PATHGEN START/END LABELS
160 ; A007 PTM3621 break up large help msg into smaller messages
161 ; A008 PTM3899 Free Environment, close all STDxxx handles
162 ; when leaving a resident portion
164 ; COPYRIGHT: The following notice is found in the OBJ code generated from
165 ; the "GRTABSM.ASM" module:
167 ; "Version 4.00 (C) Copyright Microsoft Corp 1981, 1988"
168 ; "Licensed Material - Program Property of Microsoft"
170 ;****************** END OF SPECIFICATIONS *****************************
171 HEADER
<MACRO DEFINITIONS
, LOCAL EQUATES
>
172 INCLUDE PATHMAC
.INC ;AN006;
173 ; $SALUT (0,36,41,52)
174 DOSCALL
MACRO FN
,SF
;; ;AN000;
175 IFNB
<FN
> ;;ARE THERE ANY PARMS AT ALL?;AN000;
177 MOV AX,(FN
SHL 8)+SF
;;AH=FN;AH=SF ;AN000;
178 ELSE ;;SINCE THERE IS NO SUB FUNC ;AN000;
184 ; = = = = = = = = = = = =
185 ; $SALUT (4,19,23,36)
186 FIXLIST
MACRO LP
,DOIT
;; ;AN000;
191 ; = = = = = = = = = = = =
192 HEADER
MACRO TEXT
;; ;AN000;
193 FIXLIST LISTPARM
,.XLIST
;; ;AN000;
194 SUBTTL TEXT
;; ;AN000;
195 FIXLIST LISTPARM
,.LIST
;; ;AN000;
198 ; = = = = = = = = = = = =
199 ; DEFINITION OF FUNCTIONS TO BE REQUESTED OF INT 2FH
200 GET_INST_STATE EQU
0 ;FUNCTION = "GET INSTALLED STATE"
201 WHERE_R_U EQU
1 ;FUNCTION = "WHERE ARE YOU?"
202 ; REQUESTS VECTOR OF LOADED TABLE BE
203 ; PUT IN VECTOR POINTED TO BY DS:[BX]
206 SHOW_MSG EQU
09H ;"SEND MESSAGE TO CONSOLE" DOS FUNCTION
207 SET_VECT EQU 25H
;"SET VECTOR" DOS FUNCTION
208 GET_VERSION EQU 30H
;"GET DOS VERSION"
209 RET_RES EQU 31H
;"RETURN TO DOS" REMAIN RESIDENT
210 GET_VECT EQU 35H
;"GET VECTOR" DOS FUNCTION
211 CLOSE EQU 3EH
;AN008; CLOSE A FILE HANDLE
212 FREE_AL_MEM EQU 49H
;AN008; FREE ALLOCATED MEM
213 RET_FN EQU 4
CH ;"RETURN TO DOS" NOT REMAIN RESIDENT
215 ; VECTOR TABLE ENTRIES USED
216 VEC_GRAF_CHAR EQU 1FH
;VECTOR THAT POINTS TO GRAPHIC CHAR TABLE
217 VEC_MULTIPLX EQU 2FH
;VECTOR OF MULTIPLEX HANDLER
218 VEC_DOS EQU 21H
;VECTOR POINTS TO DOS FUNCTIONS
219 VEC_RET EQU 20H
;RETURN TO DOS, WITHOUT RET CODE ;AN000;
221 ; DOS COMMAND LINE PARAMETERS
222 RETCODE_QUESTION EQU
-1 ;VALUE IN BX, IF PARM=?
223 ZERO EQU
0 ;VALUE IN BX IF PARM=/STATUS OR /STA
224 FIXLIST LISTPARM
,.XLIST
; ;AN000;
225 ;SLASH EQU "/" ;REQUEST FOR STATUS
226 ;PARM? EQU "?" ;REQUEST FOR HELP
227 ; THE PARM THAT ASKS FOR A PARTICULAR LANGUAGE
228 ; IS THE TWO CHAR PAIR, DEFINED AS "LANID"
229 ; IN THE STRUC, "LANGUAGE"
230 FIXLIST LISTPARM
,.LIST
; ;AN000;
232 ; STANDARD FILE HANDLES
233 STDIN EQU
0 ;AN008; STANDARD INPUT DEVICE
234 STDOUT EQU
1 ;STANDARD OUTPUT DEVICE
235 STDERR EQU
2 ;STANDARD ERROR OUTPUT DEVICE
236 STDAUX EQU
3 ;AN008; STANDARD AUX DEVICE
237 STDPRN EQU
4 ;AN008; STANDARD PRINTER DEVICE
240 BLANK EQU
" " ;BLANK CHARACTER
241 NIBBLE_SIZE EQU
4 ;SHIFT COUNT TO MOVE ONE NIBBLE ;AN000;
242 FIXLIST LISTPARM
,.XLIST
; ;AN000;
243 ;CASEBIT EQU 0FFH-20H ;TURN OFF THIS BIT TO MAKE UPPER CASE
244 ;LOWERA EQU 'a' ;LOWER CASE CHARACTER 'a'
245 ;LOWERZ EQU "z" ;LOWER CASE CHARACTER 'z'
246 FIXLIST LISTPARM
,.LIST
; ;AN000;
248 EXTRN HANDLER_SIZE
:ABS
;THE BYTE SIZE REQUIREMENTS
249 EXTRN CPID_L
:ABS
;NO. BYTES IN EACH CPID ENTRY
251 VECTOR
STRUC ;DEFINITION OF ANY DOUBLE WORD VECTOR POINTER
252 VECOFF
DW ?
;OFFSET PORTION OF VECTOR POINTER
253 VECSEG
DW ?
;SEGMENT PORTION OF VECTOR POINTER
255 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
256 LANGUAGE
STRUC ;DEFINITION OF EACH LANGUAGE TABLE
257 LANCHAR
DB 1024 DUP(?
) ;8 BYTES PER EACH OF 128 CHARACTERS
258 LANID
DW ?
;TWO BYTE CODEPAGE ID, TO MATCH
259 ; GRAFTABL CMD LINE PARM
260 LANNAME
DB 14 DUP(?
) ;ASCIIZ STRING NAME OF LANGUAGE
263 TABSIZE EQU SIZE LANCHAR
+ SIZE LANID
+ SIZE LANNAME
;SIZE OF
264 ; EACH GRAPHIC CHAR TABLE + ID + NAME
265 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
266 ; VALUES FOR THE MSG_DESC CONTROL BLOCK
267 ONE_SUBS EQU
1 ;ONE VARIABLE FIELD IN MESSAGE ;AN000;
268 TWO_SUBS EQU
2 ;TWO VARIABLE FIELDS IN MESSAGE ;AN000;
269 CLASS_1 EQU
0100H ;CLASS 1 (DOS EXTENDED ERRORS) ;AN000;
270 CLASS_2 EQU
0200H ;CLASS 2 (PARSE ERRORS) ;AN000;
271 CLASS_A EQU
0A00H ;CLASS A TYPE MESSAGE ;AN000;
273 ;THIS MESSAGE DESCRIPTOR CONTROL BLOCK IS GENERATED, ONE PER MESSAGE,
274 ;TO DEFINE THE SEVERAL PARAMETERS THAT ARE EXPECTED TO BE PASSED IN
275 ;CERTAIN REGISTERS WHEN THE SYSDISPMSG FUNCTION IS TO BE INVOKED.
277 MSG_DESC
STRUC ; ;AN000;
278 MSG_NUM
DW 0 ;MESSAGE NUMBER (TO AX) ;AN000;
279 MSG_HANDLE
DW STDOUT
;HANDLE OF OUTPUT DEVICE (TO BX) ;AN000;
280 MSG_SUBLIST
DW 0 ;POINTER TO SUBLIST (TO SI) ;AN000;
281 MSG_COUNT
DW 0 ;SUBSTITUTION COUNT (TO CX) ;AN000;
282 MSG_CLASS
DW CLASS_A
;MESSAGE CLASS (IN HIGH BYTE, TO DH) ;AN000;
283 ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL)
284 MSG_DESC ENDS
; ;AN000;
285 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
286 SUBLIST
STRUC ; ;AN000;
287 SUB_SIZE
DB TYPE SUBLIST
;SUBLIST SIZE (POINTER TO NEXT SUBLIST) ;AN000;
288 SUB_RES
DB 0 ;RESERVED ;AN000;
289 ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD
290 SUB_VALUE
DW 0 ;TIME, DATE, OR PTR TO DATA ITEM ;AN000;
291 SUB_VALUE_SEG
DW 0 ;SEG ID OF PTR ;AN000;
292 ;(ABOVE FIELD MUST BE FILLED AT EXECUTION TIME
293 ; IF THIS IS A .COM FILE)
294 SUB_ID
DB 0 ;N OF %N ;AN000;
295 SUB_FLAGS
DB 0 ;DATA TYPE FLAGS ;AN000;
296 SUB_MAX_WIDTH
DB 0 ;MAXIMUM FIELD WIDTH (0=UNLIMITED) ;AN000;
297 SUB_MIN_WIDTH
DB 0 ;MINIMUM FIELD WIDTH ;AN000;
298 SUB_PAD_CHAR
DB " " ;CHARACTER FOR PAD FIELD ;AN000;
299 SUBLIST ENDS
; ;AN000;
300 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
302 DB 2
CH DUP(?
) ;AN008;
303 ENVIRON_SEG
DW ?
;AN008; SEG ID OF ENVIRONMENT
304 DB 32H
DUP(?
) ;AN008; SET WHERE
305 MOV_DEST
DB 20H
DUP(?
) ; INT HANDLER IS TO BE MOVED TO
306 ;AT MOV_DEST+HANDLER_SIZE WILL GO THE
308 PARMCNT
DB ?
;COUNT OF CHARS IN DOS COMMAND LINE PARM LIST
309 PARMDOS
DB 127 DUP(?
) ;DOS COMMAND LINE PARM TEXT
312 PSPSIZE EQU SIZE DEFPSP
;SIZE OF THE PSP ITSELF
313 SHIFT_SIZE EQU PSPSIZE
- MOV_DEST
; HOW FAR HANDLER/TABLE MOVED
314 ;WHEN THEY BECAME RESIDENT
315 SHIFT_SIZE_SEG EQU SHIFT_SIZE
SHR NIBBLE_SIZE
;DIVIDE BY 16 ;AN000;
316 ; TO CONVERT BYTES TO SEGS
317 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
319 HEADER
<EXTERNALS
AND WORKAREA
>
322 CSEG
SEGMENT WORD PUBLIC
323 ASSUME
CS:CSEG
;AS A .COM FILE, THE DOS
324 ASSUME
DS:CSEG
; LOADER HAS ALREADY
325 ASSUME
ES:CSEG
; INITIALIZED ALL THESE
326 ASSUME
SS:CSEG
; SEGMENT REGISTERS
328 GRTAB_BASE EQU
$ ;FOR EASE IN DEBUGGING ;AN000;
329 PUBLIC GRTAB_BASE
; TELL LINK MAP WHERE THIS IS ;AN000;
331 EXTRN END_PSP
:BYTE ;MOVE RESIDENT CODE FROM HERE TO "MOV_DEST"
332 EXTRN MPEXNUM
:BYTE ;MULTIPLEXOR ID VALUE
333 EXTRN HANDLER
:NEAR ;ENTRY TO INT2FH HANDLER
334 EXTRN PREV_OWN
:DWORD ;VECTOR TO SAVE PREVIOUS INT2FH OWNER
335 EXTRN PATCH_OFF
:WORD ;THESE TWO PATCH LOCATION IN GRTABHAN.SAL
336 EXTRN PATCH_SEG
:WORD ; ARE TO RECEIVE LOCATION WHERE TABLE IS MOVED TO
337 EXTRN TABLEUS
:BYTE ;START OF THE USA CHAR TABLE
338 EXTRN COPYRIGHT
:BYTE ;USED TO MARK THE END OF THE ARRAY OF CHAR TABLES
339 ; THE COPYRIGHT TEXT IS ITSELF UN-REFERENCED
340 FIXLIST LISTPARM
,.XLIST
; ;AN000;
341 ; EXTRN MSG1:WORD ;NON-STD VER OF GRAPHIC CHAR SET TABLE IS ALREADY LOADED
342 ; EXTRN MSG2:WORD ;XXX VER OF GRAPHIC CHAR SET TABLE IS ALREADY LOADED
343 ; EXTRN MSG3:WORD ;XXX VER OF GRAPHIC CHAR SET HAS JUST BEEN LOADED
344 ; EXTRN MSG4:WORD ;INCORRECT PARAMETER
345 ; EXTRN MSG5:WORD ;NO VER OF GRAPHIC CHAR SET TABLE IS ALREADY LOADED
346 ; EXTRN MSG6:WORD ;INCORRECT DOS VERSION
347 ; EXTRN MSG7:WORD ;DOS COMMAND LINE PARAMETERS SUPPORTED:
348 ; EXTRN MSG8:WORD ;ID - LANGUAGE NAME
349 ; EXTRN LANGUAGE_NAME:BYTE ;14 BYTE AREA TO RECEIVE ASCIIZ OF LANGUAGE NAME
350 FIXLIST LISTPARM
,.LIST
; ;AN000;
351 EXTRN MSGNUM_EXTERR
:WORD ;ALL DOS EXTENDED ERRORS ;AN000;
352 EXTRN MSGNUM_PARSE
:WORD ;ALL PARSING ERRORS ;AN000;
353 EXTRN SUBLIST_PARSE
:WORD ;DEFINES THE BAD PARM AS %0 ;AN003;
354 EXTRN MSGNUM_VER
:WORD ;"Incorrect DOS Version" ;AN000;
355 EXTRN MSGNUM_ACTIVE
:WORD ;"Active Code Page: %1" ;AN000;
356 EXTRN MSGNUM_PREVIOUS
:WORD ;"Previous Code Page: %1" ;AN000;
357 EXTRN CPID
:BYTE ;4 BYTE STRING OF CODE PAGE ID ;AN000;
358 EXTRN SLIST_23
:WORD ;SET VECTOR TO POINT TO "NONE" OR "NON-STANDARD", ;AN000;
359 ; OR TO ONE OF THE "CPID" ENTRIES
360 EXTRN MSGNUM_NONE
:WORD ;"None" ;AN000;
361 EXTRN MSGNUM_NSTD
:WORD ;"Non-Standard" ;AN000;
362 EXTRN MSGNUM_HELP_TITLE
:WORD ;"DOS command line parameters supported:" ;AN000;
363 EXTRN MSGNUM_HELP_TITLE7
:WORD ;AN007;
364 EXTRN MSGNUM_HELP_TITLE8
:WORD ;AN007;
365 EXTRN MSGNUM_HELP_TITLE9
:WORD ;AN007;
366 EXTRN MSGNUM_HELP_TITLE10
:WORD ;AN007;
367 EXTRN SYSDISPMSG
:NEAR ;DISPLAY MESSAGE SUBROUTINE ;AN000;
368 EXTRN SYSLOADMSG
:NEAR ;LOAD MESSAGE SUBROUTINE ;AN000;
369 EXTRN SYSGETMSG
:NEAR ;GET MESSAGE SUBROUTINE ;AN000;
370 EXTRN PARSER
:NEAR ;INVOKES SYSTEM DOS COMMAND LINE PARSER ;AN000;
371 ; $SALUT (4,17,22,32)
372 WHERE
DD 0 ;VECTOR POINTING TO PREVIOUS GRAFTABL TABLE
373 ; VECTOR AS SET BY "GRTABHAN" MULTIPLEX HANDLER.
374 ;THIS IS NOT NECESSARILY WHAT INT 1FH HAS.
375 ADPSP
DW 0 ;SEG ID OF PSP.
376 ; CHANGED TO SHOW ITS SHIFTED LOCATION
377 FIXLIST LISTPARM
,.XLIST
; ;AN000;
378 ;ACC DW 0 ;ACCUMULATES VALUE OF CODEPAGE ID
379 ;TEN DW 10 ;CONSTANT TO CONVERT ASCII DECIMAL TO BINARY
380 ;TOKEN DB " " ;RECEIVES THE TEXT OF DOS PARMS, AND OVERFLOW AREA
381 ;TOKEN_SIZE EQU $-TOKEN
382 FIXLIST LISTPARM
,.LIST
; ;AN000;
383 RESSIZE_PARA
DW 0 ;SIZE OF RESIDENT PORTION, HANDLER+TABLE, IN PARAGRAPHS
384 RESSIZE_BYTE
DW 0 ;SIZE OF RESIDENT PORTION, HANDLER+TABLE, IN BYTES
385 SAVESI
DW 0 ;REMEMBER WHERE CURRENT TABLE STARTS
386 CPIDPOINTER
DW CPID
;POINTER TO ENTRY IN CPID TABLE OF PREVIOUS ENTRY
387 ACTIVECPID
DW CPID
;POINTER TO ENTRY IN CPID TABLE OF ACTIVE ENTRY
389 IDXXX
DW 0 ;ID OF PREVIOUSLY LOADED TABLE
390 INSTALLED
DB 0 ;OUTPUT OF INT 2FH, "FF"=GRAFTABL ALREADY INSTALLED
391 ; AND 'WHERE' WILL POINT TO PREVIOUS TABLE
392 ;"00"=GRAFTABL NOT INSTALLED
394 ; DEFINITIONS OF VALUES OF CONTENTS OF "INSTALLED".
395 LOADED EQU
0FFH ;GRAFTABLE IS ALREADY IN VECTOR
398 ; DEFINITIONS OF VALUES OF CONTENTS OF 'EXITFL'.
399 ; THESE VALUES ARE THE RETURN CODES CHECKED BY ERRORLEVEL.
400 EXVER EQU
4 ;RETURN TO DOS, INVALID DOS VERSION
401 EXPAR EQU
3 ;RETURN TO DOS, INVALID DOS COMMAND LINE PARMS
402 ; OR SYSTEM MESSAGE HANDLER ERROR
403 EXNONE EQU
2 ;RETURN TO DOS, NO TABLE WAS LOADED
404 EXDOS EQU
1 ;RETURN TO DOS, CHAR TABLE PREVIOUSLY LOADED
405 EXRES EQU
0 ;RETURN TO DOS, LEAVING THE 1K BLOCK OF CHAR RESIDENT
407 EXITFL
DB EXDOS
;ERRORLEVEL RETURN CODE, INITIALLY SET TO "EXDOS"
409 BAD1F
DB 0 ;FLAG, GET SET TO "RESET" IF GRAFTABL FONT IS
410 RESET EQU
1 ; LOADED, BUT 1FH DOES NOT POINT TO IT
411 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
412 PATHLABL GRTAB
;AN006;
414 HEADER
<EXECUTABLE CODE, INITIALIZATION
>
416 ENTRY_POINT
LABEL NEAR ;JUMPED TO FROM ENTRY POINT IN GRTABHAN
418 ;VERSION CHECKING AND SYSTEM MESSAGE INITIALIZATION
420 CALL SYSLOADMSG
; INIT SYSMSG HANDLER ;AN000;
422 ; $IF C ; IF THERE WAS A PROBLEM ;AN000;
424 CALL SYSDISPMSG
; LET HIM SAY WHY HE HAD A PROBLEM ;AN000;
426 MOV EXITFL
,EXVER
; TELL ERRORLEVEL BAD DOS VERSION ;AN000;
427 MOV AH,RET_FN
;RETURN TO DOS, DO NOT STAY RESIDENT ;AN000;
428 ; $ELSE ; SINCE SYSDISPMSG IS HAPPY ;AN000;
431 CLD ;CLEAR DIRECTION TO AUTO-INCREMENT ;AN000;
432 CALL MAIN_GRTAB
;PERFORM REST OF GRAFTABL FUNCTIONS ;AN000;
433 ;AH=DOS FUNCTION OF TYPE OF RETURN TO DOS
434 ; $ENDIF ;LOAD OF SYS MSGS OK? ;AN000;
436 MOV AL,EXITFL
;PASS BACK ERRORLEVEL RET CODE
437 INT VEC_DOS
;(21H) RETURN TO DOS WITH RET CODE
439 INT VEC_RET
;(20H) IF ABOVE NOT WORK, EXIT ANYWAY ;AN000;
441 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
442 HEADER
<MAIN_GRTAB
- PERFORM FUNCTIONS INDICATED BY PARMS
>
445 ;INPUT: SYSTEM MESSAGE HANDLER IS LOADED, DOS VERSION IS CORRECT.
446 ;OUTPUT: AH=FUNCTION NUMBER FOR PROPER TYPE OF RETURN TO DOS.
448 MOV SLIST_23
.SUB_VALUE_SEG
,CS ;DO MY OWN SEGMENT FIXUPS ;AN000;
449 MOV SUBLIST_PARSE
.SUB_VALUE_SEG
,CS ; ;AN003;
451 MOV ADPSP
,ES ;SAVE SEG ID OF PSP
452 SUB ADPSP
,SHIFT_SIZE_SEG
;WHERE THE SEG BASE OF MOVED INT HANDLER WILL BE
453 PUSH ES ;SAVE PSP SEGID
455 MOV AX,HANDLER_SIZE
;GET SIZE OF MULTIPLEX HANDLER (NOT PSP) ;AN000;
456 ADD AX,TABSIZE
;ADD THE SIZE OF THE CHAR TABLE
457 MOV RESSIZE_BYTE
,AX ;SAVE BYTE LENGTH OF HANDLER + CHAR TABLE
458 ; THIS IS THE AMOUNT TO BE SHIFTED
459 ADD AX,OFFSET MOV_DEST
;ADD ON PART OF PSP NOT OVERLAID BY CODE MOVE ;AN000;
460 MOV CL,NIBBLE_SIZE
;DIVIDE ;AN000;
461 SHR AX,CL ; BYTE SIZE BY 16
462 MOV RESSIZE_PARA
,AX ;SAVE PARA LENGTH OF HANDLER + CHAR TABLE
463 ; AND FIRST PART OF PSP
464 ;THIS IS THE AMOUNT TO STAY RESIDENT
466 ;PATCH INT2FH HANDLER IN CASE LATER
467 ; IT BECOMES RESIDENT AND IS ASKED
468 ; TO TELL WHERE ITS CHAR TABLE WENT
469 MOV AX,ADPSP
;TELL INT2FH HANDLER WHERE TO SAY HIS TABLE IS
471 MOV PATCH_OFF
,OFFSET TABLEUS
;TELL INT2FH HANDLER
472 ; WHERE TO SAY HIS TABLE IS
473 MOV AH,GET_VECT
;REQUEST "GET VECTOR" FUNCTION
474 MOV AL,VEC_MULTIPLX
; FOR INTERRUPT 2FH
475 INT VEC_DOS
;OUTPUT: ES:BX = VECTOR OF CONTENTS
477 ASSUME
ES:NOTHING
;SINCE ORIG PSP POINTER IS LOST
478 ;PATCH INT2FH HANDLER TO TELL HIM WHERE
479 ; THE CURRENT INT2FH HANDLER IS IN CASE
480 ; THIS NEW HANDLER REPLACES THE OLD ONE
481 MOV PREV_OWN
.VECOFF
,BX ;REMEMBER WHERE THE PREVIOUS
482 MOV PREV_OWN
.VECSEG
,ES ; OWNER OF INT 2FH WAS
484 POP ES ;RESTORE THE PSP SEGID BAS ;AN000;
485 ASSUME
ES:CSEG
;REG IS RESET BACK LIKE IT WAS
486 CALL FINDTYPE
;SET 'IDXXX' TO SHOW
487 ; WHAT IS IN THE LOW RAM TABLE NOW
489 FIXLIST LISTPARM
,.XLIST
; ;AN000;
490 ; CALL PROCESS ;RESPOND TO REQUEST DEFINED BY PARMS
491 ; ; SETTING 'EXITFL' TO INDICATE RESULTS
492 FIXLIST LISTPARM
,.LIST
; ;AN000;
493 CALL PARSER
;LOOK AT DOS COMMAND LINE PARMS ;AN000;
495 ;IF A CODEPAGE NUMBER WAS SPECIFIED
496 ; BX = OFFSET TO LANGUAGE TABLE TO BE LOADED
497 ; DX = INTEGER VALUE OF CODEPAGE SPECIFIED
498 ;IF /STATUS WAS SPECIFIED
500 ;IF QUESTION MARK WAS SPECIFIED
503 CALL DOFUNCTION
; RESPOND TO PARMS ;AN000;
504 ; SETTING 'EXITFL' TO INDICATE RESULTS
507 FIXLIST LISTPARM
,.XLIST
; ;AN000;
508 ; $ELSE ;SINCE THE DOS VERSION IS NOT ACCEPTABLE,
509 ; THE LOCATION, "MSG6", CONTAINS OFFSET TO TEXT OF
510 ; MOV DX,MSG6 ;"INCORRECT DOS VERSION" (THIS MSG ENDS WITH "$")
511 ; ;GET POINTER TO MESSAGE TEXT TO DS:DX
512 ; MOV AH,SHOW_MSG ;'WRITE TO CONSOLE' DOS FUNCTION
515 ; MOV EXITFL,EXVER ;SET ERROR CODE TO ERROR TERMINATION, BAD VERSION
516 ; $ENDIF ;CHECK DOS VERSION NUMBER
517 FIXLIST LISTPARM
,.LIST
; ;AN000;
519 CMP EXITFL
,EXRES
;CHECK THE EXIT TYPE FLAG
520 ; $IF E ;IF NEW TABLE HAS JUST BEEN LOADED
522 ;THE INT2FH HANDLER AND THE CHAR TABLE HAVE ALREADY BEEN MOVED INTO THE PSP.
523 ;CHANGE THE TWO VECTORS TO POINT TO WHERE THEN WENT.
524 ;THE TWO VECTORS ARE:
525 ; 2FH - MULTIPLEX INTERRUPT HANDLER
526 ; 1FH - 128 CHAR DEFINITION TABLE
531 MOV DS,AX ;FIND SEG WHERE TABLE WENT
534 ;SET INTERRUPT VECTOR 1FH TO POINT TO WHERE THE CHAR TABLE IS
535 LEA DX,TABLEUS
;WHERE CHAR TABLE IS
536 ; DS:DX = VECTOR POINTING TO CHAR TABLE AFTER MOVE
537 MOV AH,SET_VECT
;FUNCTION TO MOVE DS:DX INTO VECTOR FOR INT 1FH
538 MOV AL,VEC_GRAF_CHAR
;INTERRUPT NUMBER TO RECEIVE NEW CONTENTS
539 INT VEC_DOS
;CHANGE THE VECTOR
541 ;SET INTERRUPT VECTOR 2FH (MULTIPLEXOR) TO WHERE THE INTERRUPT HANDLER IS
542 LEA DX,HANDLER
;SET DS:DX = INT 2FH INTERRUPT HANDLER
543 MOV AH,SET_VECT
;FUNCTION TO MOVE DS:DX INTO VECTOR FOR INT 2FH
544 MOV AL,VEC_MULTIPLX
;CHANGE THE CONTENTS OF THE MULTIPLEX INTERRUPT
545 INT VEC_DOS
;HOOK IN THE INTERRUPT HANDLER
547 POP DS ;RESTORE SEG REG
550 ;FREE THE SEGMENT CONTAINING THE ENVIRONMENT
551 PUSH ES ;AN008; SAVE NORMAL ES
552 MOV AX,DS:ENVIRON_SEG
;AN008; FROM PSP GET SEG OF ENVIRONMENT
553 MOV ES,AX ;AN008; SET SEGREG TO POINT TO ENVIRONMENT SEG
554 ASSUME
ES:NOTHING
;AN008; ES NOW HAS SEG OF ENVIRONMENT
556 MOV AH,FREE_AL_MEM
;AN008; (49H) FREE MEM ALLOC TO ENVIRON
557 ;ES = SEGID OF BLOCK BEING RETURNED
558 INT VEC_DOS
;AN008; FREE ENVIRONMENT
559 ;IF CARRY IS SET, THERE WAS A PROBLEM
560 ;THIS IS NOT CHECKED, IGNORING ANY ERROR
562 POP ES ;AN008; RESTORE ES TO NORMAL VALUE
563 ASSUME
ES:CSEG
;AN008;
565 ;LOOP THRU ALL THE STANDARD EXTERNALLY OPENED HANDLES, 0-4,
566 ; AND CLOSE EACH ONE BEFORE RETURNING TO DOS, STAYING RESIDENT.
567 MOV BX,STDIN
;AN008; START WITH FIRST STANDARD HANDLE
571 INC BX ;AN008; SELECT NEXT HANDLE
574 MOV AH,CLOSE
;AN008; (3EH) CLOSE A FILE HANDLE
576 INT VEC_DOS
;AN008; CLOSE THE HANDLE
577 ;CARRY IS SET IF A PROBLEM WITH CLOSE
578 ;IN THIS CASE, ERRORS ARE IGNORED.
580 CMP BX,STDPRN
;AN008; WAS THIS THE LAST ONE?
581 ; $ENDDO E ;AN008; QUIT IF LAST ONE
584 ;SET UP TO LEAVE A PORTION OF GRAFTABL RESIDENT:
585 ; THE MULTIPLEXOR INTERRUPT HANDLER, AND
586 ; THE FIRST 1K PIXEL TABLE.
588 MOV DX,RESSIZE_PARA
;MARK END OF AREA TO REMAIN RESIDENT
589 MOV AH,RET_RES
;FUNCTION TO RETURN TO DOS, BUT STAY RESIDENT
590 ; $ELSE ;SINCE NEW TABLE NOT LOADED
593 ; MAYBE BECAUSE TABLE ALREADY LOADED
594 ; OR MAYBE BECAUSE BAD DOS COMMAND LINE PARMS
595 MOV AH,RET_FN
;RETURN TO DOS, DO NOT STAY RESIDENT
598 RET ;RETURN TO CALLER
600 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
601 HEADER
<LOCAL SUBROUTINES
, SCAN TO SEE WHO IS ALREADY LOADED
>
604 ;OUTPUT = IDXXX HAS 2 CHAR ID OF WHATEVER IS ALREADY LOADED
605 ; OR IS JUST 0 IF 1FH DOES NOT POINT TO A GRAFTABL DEFINED FONT.
606 ; SUBLIST_23 IS SET TO CONTAIN THE ORIGINAL CP PREVIOUSLY LOADED
607 ; OR "NONE". THIS SUBLIST IS USED BY BOTH MESSAGES 2 AND 3
608 ; WHICH STATE THE "ACTIVE CODEPAGE" AND "PREVIOUS CODEPAGE".
609 ; THE MESSAGE ACTUALLY TO USE THIS SUBLIST IS SELECTED IN "DOFUNCTION"
610 ; AFTER INTERROGATING THE PARMS, SO THAT "/STATUS" & "?" WILL REFER TO
611 ; THE "ACTIVE CODEPAGE", AND OTHER REQUESTS WILL SAY "PREVIOUS CP".
614 MOV AH,MPEXNUM
;REQUEST "GET INSTALLED STATE"
615 MOV AL,GET_INST_STATE
;IDENTIFY THAT IT IS ME I AM LOOKING FOR
616 ;AH=MULTIPLEXOR NUMBER, AL=FUNCTION REQUEST
617 INT VEC_MULTIPLX
;SEE IF I AM ALREADY LOADED
619 MOV INSTALLED
,AL ;SAVE THE "INSTALLED?" INDICATOR
621 ; $IF E ;IF I AM ALREADY INSTALLED
623 ; GRAFTABL HAS BEEN LOADED. SEVERAL CONDITIONS MAY EXIST:
624 ; INT 1FH STILL POINTS TO THE TABLE GRAFTABL LOADED
625 ; AND THAT TABLE HAS NOT BEEN ALTERED.
626 ; INT 1FH STILL POINTS TO THE TABLE GRAFTABL LOADED
627 ; BUT THE CONTENTS OF THAT TABLE HAS BEEN ALTERED.
628 ; INT 1FH NO LONGER POINTS TO THE TABLE GRAFTABL LOADED,
629 ; BUT POINTS TO SOME OTHER CHARACTER TABLE.
631 ; NOW WE ASK THE MULTIPLEXOR HANDLER OF GRAFTABLE, SINCE WE
632 ; KNOW HE HAS BEEN LOADED, TO TELL US WHERE HIS GRAFTABL
633 ; CHARACTER FONT TABLE IS IN RESIDENT RAM, BY SETTING THE
634 ; DWORD AT "WHERE" TO POINT TO THE OLD GRAFTABL FONT TABLE.
636 ;AH STILL SHOULD HAVE "MY_MULTIPLEX_NUMBER"
637 MOV AL,WHERE_R_U
;ASK "WHERE ARE YOU"
638 LEA BX,WHERE
;PASS POINTER TO VECTOR TO RECEIVE ANSWER
639 ;AH=MULTIPLEXOR NUMBER, AL=FUNCTION REQUEST
640 ;DS:BX POINTS TO "WHERE", TO RECEIVE RESPONSE
641 INT VEC_MULTIPLX
;SET VECTOR "WHERE" TO POINT TO HIS TABLE
643 ; COMPARE THE CONTENTS OF VECTOR 1FH WITH THE VECTOR AT "WHERE"
644 ; WHICH POINTS TO THE CURRENTLY LOADED TABLE OF GRAFTABL.
645 ; THE USER MAY HAVE ALTERED THE CONTENTS OF VECTOR 1FH AFTER
646 ; HAVING PREVIOUSLY LOADED A GRAFTABL CHARACTER FONT.
647 XOR AX,AX ;ZERO A REG
648 MOV ES,AX ;LOOK AT THE VECTOR TABLE
649 ;ES IS STILL ASSUMED "NOTHING"
650 MOV AX,ES:[VEC_GRAF_CHAR
* DWORD] ;AN000;
654 MOV AX,ES:[VEC_GRAF_CHAR
* 4]+2 ;AN000;
656 ; $IF E ;IF THE 1FH VECTOR IS POINTING TO A GRAFTABLE
658 ; DEFINED CHARACTER TABLE.
659 ;NOW TO FIND OUT WHICH TABLE HE IS POINT TO.
660 LEA SI,TABLEUS
;GET WHERE NEW TABLE IS IN THIS LOAD MODULE
661 ; DS:SI POINT TO NEW TABLE
662 ; IN THIS SEARCH, WE ARE GOING TO STEP THRU THE ARRAY OF
663 ; TABLES WE HAVE DEFINED, COMPARING EACH ONE WITH WHATEVER "WHERE"
664 ; POINTS TO, TO SEE IF WHAT WAS PREVIOUSLY LOADED IS LIKE ONE
665 ; OF THE TABLES WE HAVE DEFINED HERE. A MATCH LETS US IDENTIFY
666 ; THE ONE PREVIOUSLY LOADED; A NON-MATCH MEANS THAT WHATEVER
667 ; THAT WAS PREVIOUSLY LOADED HAS APPARENTLY BEEN ALTERED,
668 ; SO WHATEVER IT WAS, WE CANNOT SAY WHICH TABLE IT IS, AND SO WE
669 ; IDENTIFY IT AS SIMPLY A NON-STANDARD TABLE. THIS SEARCH WILL
670 ; SELECT WHICH OF TWO MESSAGES TO BE DISPLAYED.
671 MOV SAVESI
,SI ;SAVE WHERE TABLE STARTS
675 ADD CPIDPOINTER
,CPID_L
;BUMP TO NEXT ENTRY IN CPID TABLE. ;AN000;
676 MOV SI,SAVESI
;GO BACK TO START OF TABLE ;AN000;
677 ADD SI,TABSIZE
;BUMP TO NEXT TABLE ;AN000;
678 MOV SAVESI
,SI ;SAVE WHERE TABLE STARTS ;AN000;
681 ; THIS CHANGES ES TO PREVIOUSLY LOADED TABLE
683 LES DI,WHERE
;GET THE CONTENTS OF THE VECTOR
684 ;ES:DI POINTS TO THE OLD TABLE OF CHARACTERS
685 ;ES IS STILL ASSUMED "NOTHING"
686 MOV CX,TABSIZE
;GET SIZE OF TABLE
687 REP CMPSB ;COMPARE ES:[DI] WITH DS:[SI]
688 ; $EXITIF E ;IF THIS TABLE ALREADY LOADED
690 LES DI,WHERE
;RESTORE THE POINTERS TO RESIDENT TABLE
691 MOV AX,ES:[DI].LANID
;PICK UP 2 CHAR ID OF PREVIOUS TABLE
692 MOV IDXXX
,AX ;REMEMBER WHAT THAT WAS PREVIOUSLY LOADED
694 PUSH DS ;SET UP THE ES REG TO ;AN000;
695 POP ES ; BE THE SAME AS DS, THE COMMON SEGMENT ;AN000;
696 ASSUME
ES:CSEG
; ;AN000;
698 MOV AX,CPIDPOINTER
;GET OFFSET TO CURRENT CPID ENTRY ;AN000;
699 MOV SLIST_23
.SUB_VALUE
,AX ;PUT CP NAME IN MSG ;AN000;
700 ;SO MSG IS "PREVIOUS CODE PAGE: XXX"
701 FIXLIST LISTPARM
,.XLIST
; ;AN000;
702 ; LEA DI,LANGUAGE_NAME ;TO THE MESSAGES' VARIABLE NAME OF LANGUAGE FIELD
703 ; MOV SI,SAVESI ;FROM THE NAME OF THE LANGUAGE
704 ; ADD SI,OFFSET LANNAME ; IN THE NEW TABLE
705 ; MOV CX,SIZE LANNAME ;PASS NAME OF LANGUAGE
706 ; REP MOVSB ; TO THE MESSAGES
707 ; ; AND THEN TELL THE OPERATOR WHAT WAS FOUND
708 ; LEA AX,MSG2 ;XXX VER OF GRAPHIC CHAR SET TABLE IS ALREADY LOADED
709 FIXLIST LISTPARM
,.LIST
; ;AN000;
710 ; $ORELSE ;SINCE THIS VERSION IS NOT ALREADY LOADED
713 ASSUME
ES:NOTHING
;SINCE BASE REG NOT RESET YET,
714 LEA AX,COPYRIGHT
;WHICH IS IMMEDIATELY FOLLOWING THE LAST TABLE
715 CMP AX,SI ;HAVE WE INCREMENTED THE INDEX TO BE BEYOND
716 ; THE LAST TABLE TO BE CHECKED
717 ; $ENDLOOP BE ;QUIT IF NO NEXT TABLE TO BE LOOKED AT
719 PUSH DS ;SET UP THE ES REG TO ;AN000;
720 POP ES ; BE THE SAME AS DS, THE COMMON SEGMENT ;AN000;
721 ASSUME
ES:CSEG
;TELL THE ASSEMBLER WHAT I JUST DID ;AN000;
723 FIXLIST LISTPARM
,.XLIST
; ;AN000;
724 ; LEA AX,MSG1 ;NON-STD VER OF GRAPHIC CHAR SET TABLE IS ALREADY LOADED
725 FIXLIST LISTPARM
,.LIST
; ;AN000;
726 CALL PREV_NONSTD
;SET MSG TO SAY "NON STANDARD" ;AN000;
727 ; SO MSG IS "PREVIOUS CODE PAGE: NON-STANDARD"
730 ; $ELSE ;SINCE THE 1FH VECTOR DOES NOT POINT TO
733 ; THE SAME PLACE AS "WHERE"
734 ; THEN THE USER MUST HAVE USED GRAFTABL TO
735 ; LOAD A CHAR FONT, THEN LOADED SOME OTHER
736 ; TABLE AND CHANGED VECTOR 1FH TO POINT TO THE NEW ONE.
737 PUSH DS ;SET UP THE ES REG TO ;AN000;
738 POP ES ; BE THE SAME AS DS, THE COMMON SEGMENT ;AN000;
739 ASSUME
ES:CSEG
;TELL THE ASSEMBLER WHAT I JUST DID ;AN000;
741 CALL PREV_NONSTD
;SET MSG TO SAY "NON STANDARD" ;AN000;
743 FIXLIST LISTPARM
,.XLIST
; ;AN000;
744 ; LEA AX,MSG1 ;NON-STD VER OF GRAPHIC CHAR SET TABLE IS ALREADY LOADED
745 FIXLIST LISTPARM
,.LIST
; ;AN000;
746 MOV BAD1F
,RESET
;INDICATE THAT THE 1FH VECTOR DOES NOT POINT
747 ; TO THE GRAFTABL FONT
748 ; $ENDIF ;HAS 1Fh BEEN CHANGED?
750 ; $ELSE ;SINCE GRAFTABLE IS NOT LOADED,
753 PUSH DS ;SET UP THE ES REG TO ;AN000;
754 POP ES ; BE THE SAME AS DS, THE COMMON SEGMENT ;AN000;
755 ASSUME
ES:CSEG
;TELL THE ASSEMBLER WHAT I JUST DID ;AN000;
757 CALL PREV_NONE
;SET MSG TO SAY "NONE" ;AN000;
759 FIXLIST LISTPARM
,.XLIST
; ;AN000;
760 ; LEA AX,MSG5 ;NO VER OF CHAR TABLE IS ALREADY LOADED
761 FIXLIST LISTPARM
,.LIST
; ;AN000;
762 ; $ENDIF ;ALREADY INSTALLED?
766 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
767 HEADER
<PREV_NONSTD
- SET UP MESSAGE TO SAY
'NON-STANDARD'> ; ;AN000;
768 PREV_NONSTD PROC
NEAR ; ;AN000;
769 PUBLIC PREV_NONSTD
; ;AN000;
770 ;SET UP SUBLIST FOR MSGS 2-3 TO HAVE THE VARIABLE TEXT: "NON-STANDARD".
771 ASSUME
ES:CSEG
; ;AN000;
773 MOV AX,MSGNUM_NSTD
.MSG_NUM
;PASS MESSAGE NUMBER OF "NON-STANDARD" ;AN000;
774 MOV DH,BYTE PTR MSGNUM_NSTD
.MSG_CLASS
+BYTE ;PASS MSG'S CLASS ;AN000;
775 CALL SYSGETMSG
;FIND WHERE THE TEXT OF "NON-STANDARD" IS ;AN000;
776 ;ES:SI=VECTOR TO MESSAGE TEXT
777 MOV SLIST_23
.SUB_VALUE
,SI ;PUT OFFSET INTO SUBLIST ;AN000;
778 RET ;RETURN TO CALLER ;AN000;
779 PREV_NONSTD ENDP
; ;AN000;
780 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
781 HEADER
<PREV_NONE
- SET UP MESSAGE TO SAY
'NONE'> ; ;AN000;
782 PREV_NONE PROC
NEAR ; ;AN000;
783 PUBLIC PREV_NONE
; ;AN000;
784 ;SET UP SUBLIST FOR MSGS 2-3 TO HAVE THE VARIABLE TEXT: "NONE".
785 ASSUME
ES:CSEG
; ;AN000;
787 MOV AX,MSGNUM_NONE
.MSG_NUM
;PASS MESSAGE NUMBER OF "NONE" ;AN000;
788 MOV DH,BYTE PTR MSGNUM_NONE
.MSG_CLASS
+BYTE ;PASS MSG'S CLASS ;AN000;
789 CALL SYSGETMSG
;FIND WHERE THE TEXT OF "NONE" IS ;AN000;
790 ;ES:SI=VECTOR TO MESSAGE TEXT
791 MOV SLIST_23
.SUB_VALUE
,SI ;PUT OFFSET INTO SUBLIST ;AN000;
792 RET ;RETURN TO CALLER ;AN000;
793 PREV_NONE ENDP
; ;AN000;
794 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
795 FIXLIST LISTPARM
,.XLIST
; ;AN000;
796 ; HEADER <PARSE THE COMMAND LINE PARMS>
797 ;PROCESS PROC NEAR ;LOOK AT RESPONSE TO DOS COMMAND LINE PARMS
799 ;INPUT: DS, ES - PSP SEG ID
800 ;OUTPUT:EXITFL IS SET TO REFLECT EXISTING CONDITIONS
802 ; CALL PARSER ;LOOK AT DOS COMMAND LINE PARMS
804 ; ;IF A CODEPAGE NUMBER WAS SPECIFIED
805 ; ; BX = OFFSET TO LANGUAGE TABLE TO BE LOADED
806 ; ; DX = INTEGER VALUE OF CODEPAGE SPECIFIED
807 ; ;IF /STATUS WAS SPECIFIED
809 ; ;IF QUESTION MARK WAS SPECIFIED
812 ; CALL DOFUNCTION ; RESPOND TO PARMS
813 ; ; SETTING 'EXITFL' TO INDICATE RESULTS
816 ; PUSH ES ;SAVE BASE REG
817 ; MOV SI,OFFSET PARMDOS ;GET WHERE DOS PARMS START
818 ; SUB DI,DI ;INIT INDEX TO ZERO, WHERE TO PUT PARMS IN TOKEN
819 ; MOV CL,DS:PARMCNT ;GET HOW MANY CHARS ARE IN THE DOS COMMAND LINE
820 ; XOR CH,CH ;CLEAR COUNTER OF OUTPUT CHARS
821 ; CALL UPCASE ;CONVERT ANY LOWER CASE CHARS TO UPPERCASE
824 ; CMP CL,0 ;ANY DOS PARMS?
825 ; $LEAVE BE ;QUIT IF NOT PARMS
826 ; MOV DL,BYTE PTR [SI] ;SET DL TO A PARM CHAR FROM PARMDOS IN PSP
827 ; CMP DL,BLANK ;IGNORE THE SPECIAL CHARS:
828 ; $IF A ; BLANK AND LOWER NUMBERED CONTROL CHARS
829 ; CMP DL,"?" ;IS THE SPECIFIED PARAMETER
830 ; $IF E ; A QUESTION MARK?
831 ; MOV BYTE PTR TOKEN[DI],DL ;PUT DL CONVERTED TO TOKEN
832 ; INC DI ;BUMP TO NEXT AVAIL SPOT IN TOKEN
833 ; ADD CH,3 ;COUNT THIS AS AN OUTPUT CHAR,WITH NO ROOM FOR MORE
834 ; $ELSE ;SINCE NOT "?"
835 ; CMP DL,'0' ;IF CHAR IN RANGE OF NUMERICS
836 ; $IF AE,AND ;UNSIGNED TEST
841 ; IMUL TEN ;CLOBBERS DX
842 ; POP DX ;FIX IT BACK
843 ; SUB DL,'0' ;CONVERT FROM NUMERIC CHAR TO BINARY
844 ; ADD AL,DL ;ADD NEW NUMBER FROM PARM
845 ; ADC AH,0 ;PROPOGATE CARRY
846 ; MOV ACC,AX ;SAVE RESULTS SO FAR
847 ; INC CH ;COUNT THIS AS AN OUTPUT CHAR
848 ; $ELSE ;SINCE NOT A NUMERIC CHARACTER
849 ; MOV CH,TOKEN_SIZE ;FORCE PARM ERROR, MAY BE CHANGED TO OK
851 ; $IF AE ;IF AT LEAST 4 CHARS ARE PRESENT
852 ; CMP WORD PTR [SI],"S/" ;FIRST TWO CHARS OF "/STA"
854 ; CMP WORD PTR [SI]+WORD,"AT" ;NEXT TWO CHARS OF "/STA"
856 ; MOV BYTE PTR TOKEN[DI],'/' ;PUT "/" CONVERTED TO TOKEN
857 ; INC DI ;BUMP TO NEXT AVAIL SPOT IN TOKEN
858 ; MOV CH,3 ;COUNT THIS AS AN OUTPUT CHAR,WITH NO ROOM FOR MORE
859 ; MOV CL,1 ;PRETEND THAT IS ALL OF THE COMMAND LINE THERE IS
862 ; $ENDIF ;IS CHAR IN NUMERIC RANGE?
863 ; $ENDIF ;IS PARM A QUESTION MARK?
864 ; $ENDIF ;BLANK OR LOWER VALUED CONTROL CHARS?
865 ; CMP CH,TOKEN_SIZE ;IS OUTPUT AREA OVERLY FULL?
867 ; CALL BADPARMS ;FUSS ABOUT INVALID PARMS
869 ; INC SI ;BUMP INDEX TO NEXT PARM CHAR IN PSP
870 ; DEC CL ;DEC COUNT OF INPUT CHARS FROM PARMS
872 ; ;SINCE CL COUNT WENT TO ZERO,
873 ; CMP CH,0 ;ANY DOS PARMS LEFT AFTER CLEANUP?
875 ; MOV WORD PTR TOKEN,437 ;MAKE IT LOOK LIKE "US" WAS SPECIFIED
876 ; $ELSE ;SOME PARM WAS SPECIFIED
877 ; CMP BYTE PTR TOKEN,PARM?
878 ; $IF NE,AND ;IF NOT A QUESTION MARK, AND
879 ; CMP BYTE PTR TOKEN,SLASH
880 ; $IF NE ;IF NOT A SLASH (FOR /STATUS)
881 ; MOV AX,ACC ;GET ACCUMULATOR
882 ; MOV WORD PTR TOKEN,AX ; TO TOKEN
883 ; $ENDIF ;QUESTION MARK?
884 ; $ENDIF ;ANY DOS PARMS?
885 ; CALL DOFUNCTION ;RESPOND TO PARAMETER IN "TOKEN"
887 ; $ENDSRCH ;SCANNING DOS COMMAND LINE FOR PARMS
889 ; POP ES ;RESTORE BASE REG
894 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
896 ;;CONVERT CHARACTERS IN PARMLIST TO UPPER CASE
897 ;;INPUT: SI=OFFSET IN DS: TO PARM TEXT
898 ;; CX=NUMBER OF CHARS OF PARMS
900 ; OR CX,CX ;IF THERE ARE CHARS IN PARMLIST
901 ; $IF NZ ; THEN GO LOOK AT EACH CHAR
902 ; PUSH SI ;SAVE POINTER TO PARMS
903 ; PUSH CX ;SAVE COUNTER OF PARMS
904 ; $DO ;STEP THRU ALL CHARS OF PARM LIST, CONVERTING TO UPPER CASE
905 ; MOV AL,[SI] ;GET CHAR FROM PARMLIST TO AL
906 ; CMP AL,LOWERA ;COMPARE WITH LOWER CASE "a"
907 ; $IF AE,AND ;UNSIGNED TEST
908 ; CMP AL,LOWERZ ;COMPARE WITH LOWER CASE "z"
909 ; $IF BE ;IF CHAR IS LOWER CASE
910 ; AND AL,CASEBIT ;CONVERT TO UPPER CASE BY DELETING THE 20H BIT
911 ; MOV [SI],AL ;RESTORE CHAR TO PARMLIST
913 ; INC SI ;BUMP INDEX TO LOOK AT NEXT CHAR
915 ; POP CX ;RESTORE COUNTER OF PARMS
916 ; POP SI ;RESTORE POINTER TO PARMS
917 ; $ENDIF ;ANY CHARS IN PARMLIST?
921 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
922 FIXLIST LISTPARM
,.LIST
; ;AN000;
923 HEADER
<RESPOND TO PARAMETER
> ;AC000;
924 DOFUNCTION PROC
NEAR ;RESPOND TO PARM ;AC000;
926 ;INPUT: IF A CODEPAGE NUMBER WAS SPECIFIED
927 ; BX = OFFSET TO LANGUAGE TABLE TO BE LOADED
928 ; DX = INTEGER VALUE OF CODEPAGE SPECIFIED
929 ; IF /STATUS WAS SPECIFIED
931 ; IF QUESTION MARK WAS SPECIFIED
935 CMP BX,RETCODE_QUESTION
;IS QUESTION MARK SPECFIED?
938 CALL HELP
;DISPLAY RESULTS OF "?" SPECIFICATION
940 ; $ELSE ;SINCE QUESTION MARK IS NOT PARM SPECIFIED
943 CMP BX,ZERO
;IS /STATUS SPECIFIED?
944 ; $IF NE ;IF NOT STATUS, MUST BE REQUEST TO LOAD A TABLE
946 LEA DI,MSGNUM_PREVIOUS
;"Previous Code Page: xxx" ;AN001;
947 CALL SENDMSG
;SEND THE MSG TO STDOUT ;AN001;
949 MOV DX,[BX].LANID
;FETCH THE TWO CHAR ID FROM TABLE
950 CMP DX,IDXXX
;IS THIS ONE ALREADY LOADED?
951 ; $IF NE ;IF NOT, LOAD IT
954 FIXLIST LISTPARM
,.XLIST
; ;AN000;
955 ; MOV CX,LENGTH LANNAME ;GET LENGTH OF NAME FIELD
956 ; LEA SI,[BX].LANNAME ;GET WHERE NAME FIELD IS IN THE NEW TABLE
957 ; LEA DI,LANGUAGE_NAME ;WHERE WHERE TO PUT NAME IN VARIABLE MESSAGE FIELD
958 ; REP MOVSB ;MOVE LANGUAGE NAME TO PRINTF VARIABLE FIELD
959 FIXLIST LISTPARM
,.LIST
; ;AN000;
961 MOV SI,BX ;PASS START OF CHAR TABLE
962 CALL MOVTAB
;PUT THIS TABLE INTO THE USA POSITION
964 FIXLIST LISTPARM
,.XLIST
; ;AN000;
965 ; LEA AX,MSG3 ;XXXXX VER OF GRAPHIC CHAR SET HAS JUST BEEN LOADED
966 FIXLIST LISTPARM
,.LIST
; ;AN000;
967 LEA DI,MSGNUM_ACTIVE
;"ACTIVE CODE PAGE: XXX" ;AN000;
968 MOV AX,ACTIVECPID
;GET POINTER TO CP JUST ACTIVATED ;AN000;
969 MOV SLIST_23
.SUB_VALUE
,AX ;INTO SUBLIST ;AN000;
970 CALL SENDMSG
;SHOW "ACTIVE CODE PAGE: XXX" ;AN000;
972 CMP BAD1F
,RESET
;THIS FLAG SET TO '1' MEANS INT 1FH POINTS TO
973 ; $IF E ; A TABLE OTHER THAN ONE LOADED BY GRAFTABL
977 LDS DX,WHERE
;SET DS:DX POINT TO PREVIOUSLY LOADED GRAFTABL FONT
978 MOV AH,SET_VECT
;FUNCTION TO MOVE DS:DX INTO VECTOR FOR INT 1FH
979 MOV AL,VEC_GRAF_CHAR
;INTERRUPT NUMBER TO RECEIVE NEW CONTENTS
980 INT VEC_DOS
;CHANGE THE VECTOR
986 ; $ENDIF ;THIS TABLE ALREADY LOADED?
988 FIXLIST LISTPARM
,.XLIST
; ;AN000;
989 ; ADD BX,TYPE LANGUAGE ;STEP BASE TO NEXT TABLE
990 ; LEA AX,COPYRIGHT ;AT START OF MSGS, BEYOND LAST TABLE
992 ; $ENDLOOP AE ;GO TRY THE NEXT TABLE, IF ANY
993 ; ;NOT ANY NEXT TABLE
994 ; CALL BADPARMS ;FUSS ABOUT INVALID PARMS
996 ; $ENDSRCH ;COMPARING TOKEN WITH ID IN TABLES
997 FIXLIST LISTPARM
,.LIST
; ;AN000;
998 ; $ELSE ;SINCE /STATUS SPECIFIED,
1001 LEA DI,MSGNUM_ACTIVE
;POINT TO "ACTIVE CODE PAGE: XXX" ;AN001;
1002 CALL SENDMSG
; VARIABLE FILLED BY "FINDTYPE" ;AN001;
1004 CMP IDXXX
,ZERO
;SEE WHO IS LOADED, IF ANYBODY
1007 MOV EXITFL
,EXNONE
;SET EXIT CODE TO SAY NO TABLE LOADED AT ALL
1008 ; $ELSE ;SINCE SOMEONE IS LOADED,
1011 MOV EXITFL
,EXDOS
;SAY A TABLE IS LOADED
1012 ; $ENDIF ;ANY TABLE PREVIOUSLY LOADED?
1017 ; $ENDIF ;QUESTION MARK?
1021 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1022 HEADER
<LOCAL SUBROUTINE
, INSTALL A PARTICULAR TABLE
>
1025 ;INPUT: SI = OFFSET OF SOURCE TABLE
1028 ;OUTPUT: THE SOURCE TABLE WILL BE MOVED TO ONE OF TWO PLACES,
1030 ; (IF THIS IS THE FIRST TIME FOR GRAFTABL)
1031 ; TO THE "TABLEUS" IN THE PSP (IF USA NOT SPECIFIED),
1032 ; AND THEN BOTH INT2FH AND TABLEUS MOVED TO MOV_DEST IN THE PSP,
1034 ; ON TOP OF THE PREVIOUS TABLE LEFT BY A PREVIOUS GRAFTABL CALL,
1035 ; AS POINTED TO BY THE VECTOR, "WHERE".
1037 PUSH ES ;SAVE THE PSP
1038 CMP INSTALLED
,LOADED
;IF A PREVIOUS COPY OF GRAFTABL
1039 ; $IF E ; HAS ALREADY BEEN LOADED
1042 LES DI,WHERE
;REMEMBER WHERE PREVIOUSLY TABLE WENT
1043 ASSUME
ES:NOTHING
;ES IS BASE OF OLD PREVIOUSLY LOADED TABLE
1044 MOV CX,TABSIZE
;THE TABLE,2 CHAR ID,& LANGUAGE NAME ARE TO BE MOVED
1045 REP MOVSB ;MOVE NEW TABLE ON TOP OF OLD TABLE
1046 ;WHEN EXITING, LEAVE NOTHING RESIDENT
1047 ; $ELSE ;SINCE NO PREVIOUS LOAD OF GRAFTABL EXISTS,
1050 ASSUME
ES:CSEG
;SINCE ES WAS NOT CHANGED,
1051 MOV EXITFL
,EXRES
;WHEN EXITING, LEAVE TABLE RESIDENT
1052 ; ALONG WITH THE INT2FH HANDLER
1054 ;SINCE IT IS THE USA TABLE THAT IS
1055 ; PHYSICALLY NEXT TO THE INTERRUPT HANDLER,
1056 ; THAT PAIR OF AREAS IS WHAT WILL STAY
1057 ; RESIDENT. IF THE USA TABLE IS NOT THE
1058 ; DESIRED VERSION, THEN FIRST MOVE THE
1059 ; VERSION DESIRED ON TOP OF THE USA VERSION,
1060 ; THEN MOVE THE PAIR DOWN ON TOP OF THE PSP
1061 ; WHERE THEY WILL STAY RESIDENT.
1063 LEA DI,TABLEUS
;FIND WHERE FIRST TABLE NOW IS
1065 ; $IF NE ;IF NOT THE USA TABLE,
1067 MOV CX,TABSIZE
;SIZE OF THE TABLE
1068 REP MOVSB ;MOVE THE XX TABLE ONTO THE USA TABLE
1071 MOV DI,OFFSET MOV_DEST
;WHERE TO MOVE EVERYTHING TO
1072 LEA SI,END_PSP
;START WITH THE INT2FH HANDLER, ON THRU THE TABLE
1073 ;ES:DI POINT TO DESTINATION, DS:SI POINT TO SOURCE
1074 MOV CX,RESSIZE_BYTE
;GET SIZE OF TABLE + RESIDENT CODE INT HANDLER
1075 REP MOVSB ;MOVE THE TABLE ONTO THE PSP OF THIS LOAD
1078 POP ES ;RESTORE THE PSP POINTER TO ES
1081 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1082 HEADER
<HELP
- GENERATE
DISPLAY RESPONDING TO STATUS REQUEST
>
1083 HELP PROC
NEAR ;RESPOND TO "?" PARM SPECIFIED
1085 ;INPUT: DS, ES = POINTS TO PSP
1086 ; IDXXX = CP OF WHO IS ALREADY LOADED
1087 ; EXITFL = ERROR LEVEL RET CODE
1088 ; NORMAL VALUE SAYS SOME TABLE HAS BEEN LOADED, BUT
1089 ; INVALID PARMS COULD HAVE ALREADY ALTERED THIS VALUE.
1090 ;OUTPUT: EXITFL MAY BE CHANGED TO "EXNONE", IF NO TABLE LOADED
1093 LEA DI,MSGNUM_ACTIVE
;POINT TO "ACTIVE CODE PAGE: XXX" ;AN001;
1094 CALL SENDMSG
; VARIABLE FILLED BY "FINDTYPE" ;AN001;
1096 CMP EXITFL
,EXDOS
;IS RET CODE UNTOUCHED SO FAR?
1097 ; $IF E ;IF SO, REPORT WHO IS LOADED
1099 CMP IDXXX
,ZERO
;SEE WHO IS LOADED, IF ANYBODY
1102 MOV EXITFL
,EXNONE
;SET EXIT CODE TO SAY NO TABLE LOADED AT ALL
1103 ; $ENDIF ;ANY TABLE PREVIOUSLY LOADED?
1105 ; $ENDIF ;RET CODE UNTOUCHED?
1108 FIXLIST LISTPARM
,.XLIST
; ;AN000;
1109 ; LEA AX,MSG7 ;"DOS command line parameters supported:"
1110 FIXLIST LISTPARM
,.LIST
; ;AN000;
1111 LEA DI,MSGNUM_HELP_TITLE
;"DOS command line parameters supported:" ;AN000;
1112 CALL SENDMSG
;DISPLAY MSG IN STDOUT ;AN000;
1114 LEA DI,MSGNUM_HELP_TITLE7
;AN007;
1115 CALL SENDMSG
;AN007;DISPLAY MSG IN STDOUT ;AN000;
1117 LEA DI,MSGNUM_HELP_TITLE8
;AN007;
1118 CALL SENDMSG
;AN007;DISPLAY MSG IN STDOUT ;AN000;
1120 LEA DI,MSGNUM_HELP_TITLE9
;AN007;
1121 CALL SENDMSG
;AN007;DISPLAY MSG IN STDOUT ;AN000;
1123 LEA DI,MSGNUM_HELP_TITLE10
;AN007;
1124 CALL SENDMSG
;AN007;DISPLAY MSG IN STDOUT ;AN000;
1126 FIXLIST LISTPARM
,.XLIST
; ;AN000;
1127 ; LEA SI,TABLEUS ;START WITH THE FIRST TABLE
1129 ; LEA DI,LANGUAGE_NAME ;FIND WHERE NAME OF LANGUAGE GOES
1130 ; MOV CX,LENGTH LANNAME ;HOW LONG IS THIS FIELD
1131 ; SUB BX,BX ;CLEAR INDEX TO NAME FIELD TO ZERO
1133 ; MOV AL,[SI][BX].LANNAME ;GET CHAR FROM LANGUAGE NAME IN TABLE
1134 ; MOV [DI][BX],AL ;MOVE THAT CHAR TO MSG VARIABLE FIELD
1135 ; INC BX ;POINT TO NEXT POSITION
1137 ; MOV AX,[SI].LANID ;PICK UP THE 2 CHAR ID
1138 ; MOV IDXXX,AX ;PUT IT WHERE MSG8 IS LOOKING FOR IT
1139 ; LEA AX,MSG8 ;"%d - %s"
1140 ; CALL SENDMSG ;DISPLAY "IDXXX" AND "LANGUAGE_NAME"
1142 ; ADD SI,TYPE LANGUAGE ;BUMP TO THE NEXT TABLE
1143 ; LEA AX,COPYRIGHT ;IT IMMEDIATELY FOLLOWS THE LAST TABLE
1146 FIXLIST LISTPARM
,.LIST
; ;AN000;
1149 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1150 FIXLIST LISTPARM
,.XLIST
; ;AN000;
1152 ; LEA AX,MSG4 ;"INCORRECT PARAMETER"
1155 ; CALL HELP ;DISPLAY RESULTS OF "?" SPECIFICATION
1157 ; MOV EXITFL,EXPAR ;ERRORLEVEL CODE TO "PARM ERROR"
1160 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1161 FIXLIST LISTPARM
,.LIST
1163 HEADER
<SENDMSG
- PASS
IN REGS
DATA FROM MSG DESCRIPTOR TO DISP MSG
> ;AN000;
1164 SENDMSG PROC
NEAR ; ;AN000;
1165 PUBLIC SENDMSG
; ;AN000;
1166 ;INPUT - DI=POINTER TO MSG_DESC STRUC FOR THIS MESSAGE
1167 ;OUTPUT - IF CARRY SET, EXTENDED ERROR MSG ATTEMPTED DISPLAYED
1168 ; IF CARRY CLEAR, ALL OK
1169 ; IN EITHER CASE, DI AND AX ALTERED, OTHERS OK
1170 ; = = = = = = = = = = = =
1172 PUSH BX ; SAVE CALLER'S REGS ;AN000;
1177 ; PASS PARMS TO MESSAGE HANDLER IN
1178 ; THE APPROPRIATE REGISTERS IT NEEDS.
1179 MOV AX,[DI].MSG_NUM
;MESSAGE NUMBER ;AN000;
1180 MOV BX,[DI].MSG_HANDLE
;HANDLE TO DISPLAY TO ;AN000;
1181 MOV SI,[DI].MSG_SUBLIST
;OFFSET IN ES: OF SUBLIST, OR 0 IF NONE ;AN000;
1182 MOV CX,[DI].MSG_COUNT
;NUMBER OF %PARMS, 0 IF NONE ;AN000;
1183 MOV DX,[DI].MSG_CLASS
;CLASS IN HIGH BYTE, INPUT FUNCTION IN LOW ;AN000;
1184 CALL SYSDISPMSG
;DISPLAY THE MESSAGE ;AN000;
1186 ; $IF C ;IF THERE IS A PROBLEM ;AN000;
1188 ;AX=EXTENDED ERROR NUMBER ;AN000;
1189 LEA DI,MSGNUM_EXTERR
;GET REST OF ERROR DESCRIPTOR ;AN000;
1190 MOV BX,[DI].MSG_HANDLE
;HANDLE TO DISPLAY TO ;AN000;
1191 MOV SI,[DI].MSG_SUBLIST
;OFFSET IN ES: OF SUBLIST, OR 0 IF NONE ;AN000;
1192 MOV CX,[DI].MSG_COUNT
;NUMBER OF %PARMS, 0 IF NONE ;AN000;
1193 MOV DX,[DI].MSG_CLASS
;CLASS IN HIGH BYTE, INPUT FUNCTION IN LOW ;AN000;
1194 CALL SYSDISPMSG
;TRY TO SAY WHAT HAPPENED ;AN000;
1196 STC ;REPORT PROBLEM ;AN000;
1197 ; $ENDIF ;PROBLEM WITH DISPLAY? ;AN000;
1200 POP SI ;RESTORE CALLER'S REGISTERS ;AN000;
1204 FIXLIST LISTPARM
,.XLIST
; ;AN000;
1205 ;;INPUT: AX = OFFSET OF MSG PARM LIST
1207 ; PUSH CS ;MATCH REQUIREMENTS OF PRINTF, WHICH IS "FAR"
1208 ; CALL PRINTF ;USING MSG PARM LIST, BUILD MSG, DISPLAY MSG
1209 ; ;PRINTF WILL POP OFF THE PARM, PUSHED FROM AX
1211 FIXLIST LISTPARM
,.LIST
; ;AN000;
1214 SENDMSG ENDP
; ;AN000;
1215 PATHLABL GRTAB
;AN006;