]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/GRAFTABL/GRTAB.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / GRAFTABL / GRTAB.ASM
1 PAGE 90,132 ;\ f\eA\b\e2
2 TITLE GRTAB - DEFINE ROM GRAPHIC CHARACTERS FOR 128-255
3 IF1
4 %OUT GRTAB.SAL...
5 ELSE
6 ; %OUT GRTAB.SAL...
7 ENDIF
8 LISTPARM = 1 ;0=SUPPRESS LIST; 1=ALLOW LIST ;AN000;
9 ;.XLIST ; ;AN000;
10 ;****************** START OF SPECIFICATIONS *****************************
11 ; MODULE NAME: GRTAB
12 ; (MAIN ROUTINE FOR UTILITY "GRAFTABL")
13
14 ; DESCRIPTIVE NAME: Makes resident a 1K block of data defining the
15 ; graphic character set when in graphics mode.
16
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.
25
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.
31
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.
38
39 ; ENTRY POINT: Entry_Point, JMP from GRTABHAN.SAL at his ORG 100H.
40 ; LINKAGE: [d:][path] GRAFTABL [437 | 850 | 860 | 863 | 865 | ? | /STATUS]
41
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
51
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.
56
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.
61
62 ; ERRORLEVEL 2 - No change in size of available RAM storage.
63 ; No previously loaded character table exists.
64 ;
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.)
68
69 ; EXIT-ERROR: ERRORLEVEL 3 - Incorrect parameter.
70 ; No action taken, assumes "?" requested HELP.
71 ; No change in size of available RAM storage.
72
73 ; ERRORLEVEL 4 - Incorrect version of DOS, DOS 4.0 required
74
75 ; EFFECTS: Either the desired table is hooked into Interrupt 1FH,
76 ; or the identity of the previously loaded table is
77 ; displayed.
78
79 ; INTERNAL REFERENCES:
80 ; ROUTINES:
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.
85
86 ; DATA AREAS:
87 ; PSP - Contains the DOS command line parameters. Partly overlayed
88 ; with the installation of the character table.
89 ; WORKAREA - Temporary storage
90
91 ; EXTERNAL REFERENCES:
92 ; ROUTINES:
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
96 ; on STDOUT.
97 ; SYSLOADMSG - Loads messages, makes them accessable.
98 ; SYSPARSE - Processes the DOS Command line, finds parms.
99 ; PARSE - Interfaces with the system Parser.
100
101 ; DATA AREAS:
102 ; GRTABUS - 1k binary table of the USA graphic character set
103 ; GRTABML - 1k binary table of the Multi-Lingual graphic
104 ; character set
105 ; GRTABPO - 1k binary table of the Portuguese graphic
106 ; character set
107 ; GRTABCF - 1k binary table of the Canada French graphic
108 ; character set
109 ; GRTABNO - 1k binary table of the Nordic graphic character
110 ; set
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.)
122
123 ; NOTES:
124 ; This module should be processed with the SALUT preprocessor
125 ; with the re-alignment not requested, as:
126
127 ; SALUT GRTAB,NUL
128
129 ; To assemble these modules, the alphabetical or sequential
130 ; ordering of segments may be used.
131
132 ; Sample LINK command:
133
134 ; LINK @GRTABLK.ARF
135
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)
142 ; GRTABNO+ (Nordic)
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)
147 ; GRAFTABL;
148
149 ; These modules must be linked in this order. The load module is
150 ; a COM file, to be converted to COM with EXE2BIN.
151
152 ; REVISION HISTORY:
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
163 ;
164 ; COPYRIGHT: The following notice is found in the OBJ code generated from
165 ; the "GRTABSM.ASM" module:
166
167 ; "Version 4.00 (C) Copyright Microsoft Corp 1981, 1988"
168 ; "Licensed Material - Program Property of Microsoft"
169
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;
176 IFNB <SF> ;; ;AN000;
177 MOV AX,(FN SHL 8)+SF ;;AH=FN;AH=SF ;AN000;
178 ELSE ;;SINCE THERE IS NO SUB FUNC ;AN000;
179 MOV AH,FN ;; ;AN000;
180 ENDIF ;; ;AN000;
181 ENDIF ;; ;AN000;
182 INT 21H ;; ;AN000;
183 ENDM ;; ;AN000;
184 ; = = = = = = = = = = = =
185 ; $SALUT (4,19,23,36)
186 FIXLIST MACRO LP,DOIT ;; ;AN000;
187 IF LP ;; ;AN000;
188 DOIT ;; ;AN000;
189 ENDIF ;; ;AN000;
190 ENDM ;; ;AN000;
191 ; = = = = = = = = = = = =
192 HEADER MACRO TEXT ;; ;AN000;
193 FIXLIST LISTPARM,.XLIST ;; ;AN000;
194 SUBTTL TEXT ;; ;AN000;
195 FIXLIST LISTPARM,.LIST ;; ;AN000;
196 PAGE ;; ;AN000;
197 ENDM ;; ;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]
204
205 ; DOS FUNCTIONS:
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 4CH ;"RETURN TO DOS" NOT REMAIN RESIDENT
214
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;
220
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;
231
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
238
239 ; OTHER EQUATES
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;
247
248 EXTRN HANDLER_SIZE:ABS ;THE BYTE SIZE REQUIREMENTS
249 EXTRN CPID_L:ABS ;NO. BYTES IN EACH CPID ENTRY
250
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
254 VECTOR ENDS
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
261 LANGUAGE ENDS
262
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;
272
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.
276
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 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
301 DEFPSP STRUC
302 DB 2CH 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
307 ; TABLE ITSELF
308 PARMCNT DB ? ;COUNT OF CHARS IN DOS COMMAND LINE PARM LIST
309 PARMDOS DB 127 DUP(?) ;DOS COMMAND LINE PARM TEXT
310 DEFPSP ENDS
311
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 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
318 .LIST
319 HEADER <EXTERNALS AND WORKAREA>
320 ; $SALUT (4,6,12,28)
321
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
327
328 GRTAB_BASE EQU $ ;FOR EASE IN DEBUGGING ;AN000;
329 PUBLIC GRTAB_BASE ; TELL LINK MAP WHERE THIS IS ;AN000;
330
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
388 PUBLIC ACTIVECPID
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
393
394 ; DEFINITIONS OF VALUES OF CONTENTS OF "INSTALLED".
395 LOADED EQU 0FFH ;GRAFTABLE IS ALREADY IN VECTOR
396
397
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
406
407 EXITFL DB EXDOS ;ERRORLEVEL RETURN CODE, INITIALLY SET TO "EXDOS"
408 PUBLIC EXITFL
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;
413 ; $SALUT (3,4,9,32)
414 HEADER <EXECUTABLE CODE, INITIALIZATION>
415 MAIN PROC NEAR
416 ENTRY_POINT LABEL NEAR ;JUMPED TO FROM ENTRY POINT IN GRTABHAN
417 PUBLIC ENTRY_POINT
418 ;VERSION CHECKING AND SYSTEM MESSAGE INITIALIZATION
419
420 CALL SYSLOADMSG ; INIT SYSMSG HANDLER ;AN000;
421
422 ; $IF C ; IF THERE WAS A PROBLEM ;AN000;
423 JNC $$IF1
424 CALL SYSDISPMSG ; LET HIM SAY WHY HE HAD A PROBLEM ;AN000;
425
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;
429 JMP SHORT $$EN1
430 $$IF1:
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;
435 $$EN1:
436 MOV AL,EXITFL ;PASS BACK ERRORLEVEL RET CODE
437 INT VEC_DOS ;(21H) RETURN TO DOS WITH RET CODE
438
439 INT VEC_RET ;(20H) IF ABOVE NOT WORK, EXIT ANYWAY ;AN000;
440 MAIN ENDP
441 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
442 HEADER <MAIN_GRTAB - PERFORM FUNCTIONS INDICATED BY PARMS>
443 MAIN_GRTAB PROC NEAR
444 PUBLIC MAIN_GRTAB
445 ;INPUT: SYSTEM MESSAGE HANDLER IS LOADED, DOS VERSION IS CORRECT.
446 ;OUTPUT: AH=FUNCTION NUMBER FOR PROPER TYPE OF RETURN TO DOS.
447
448 MOV SLIST_23.SUB_VALUE_SEG,CS ;DO MY OWN SEGMENT FIXUPS ;AN000;
449 MOV SUBLIST_PARSE.SUB_VALUE_SEG,CS ; ;AN003;
450
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
454
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
465
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
470 MOV PATCH_SEG,AX
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
476
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
483
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
488
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;
494
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
499 ; BX = 0
500 ;IF QUESTION MARK WAS SPECIFIED
501 ; BX=-1
502
503 CALL DOFUNCTION ; RESPOND TO PARMS ;AN000;
504 ; SETTING 'EXITFL' TO INDICATE RESULTS
505
506
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
513 ; INT VEC_DOS
514 ;
515 ; MOV EXITFL,EXVER ;SET ERROR CODE TO ERROR TERMINATION, BAD VERSION
516 ; $ENDIF ;CHECK DOS VERSION NUMBER
517 FIXLIST LISTPARM,.LIST ; ;AN000;
518
519 CMP EXITFL,EXRES ;CHECK THE EXIT TYPE FLAG
520 ; $IF E ;IF NEW TABLE HAS JUST BEEN LOADED
521 JNE $$IF4
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
527
528 PUSH DS
529
530 MOV AX,ADPSP
531 MOV DS,AX ;FIND SEG WHERE TABLE WENT
532 ASSUME DS:NOTHING
533
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
540
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
546
547 POP DS ;RESTORE SEG REG
548 ASSUME DS:CSEG
549
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
555
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
561
562 POP ES ;AN008; RESTORE ES TO NORMAL VALUE
563 ASSUME ES:CSEG ;AN008;
564
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
568 ; $DO COMPLEX
569 JMP SHORT $$SD5
570 $$DO5:
571 INC BX ;AN008; SELECT NEXT HANDLE
572 ; $STRTDO
573 $$SD5:
574 MOV AH,CLOSE ;AN008; (3EH) CLOSE A FILE HANDLE
575 ; BX=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.
579
580 CMP BX,STDPRN ;AN008; WAS THIS THE LAST ONE?
581 ; $ENDDO E ;AN008; QUIT IF LAST ONE
582 JNE $$DO5
583
584 ;SET UP TO LEAVE A PORTION OF GRAFTABL RESIDENT:
585 ; THE MULTIPLEXOR INTERRUPT HANDLER, AND
586 ; THE FIRST 1K PIXEL TABLE.
587
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
591 JMP SHORT $$EN4
592 $$IF4:
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
596 ; $ENDIF
597 $$EN4:
598 RET ;RETURN TO CALLER
599 MAIN_GRTAB ENDP
600 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
601 HEADER <LOCAL SUBROUTINES, SCAN TO SEE WHO IS ALREADY LOADED>
602 FINDTYPE PROC NEAR
603 PUBLIC FINDTYPE
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".
612
613 ASSUME ES:NOTHING
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
618
619 MOV INSTALLED,AL ;SAVE THE "INSTALLED?" INDICATOR
620 CMP AL,LOADED
621 ; $IF E ;IF I AM ALREADY INSTALLED
622 JNE $$IF10
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.
630
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.
635
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
642
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;
651 CMP AX,WHERE.VECOFF
652 ; $IF E,AND
653 JNE $$IF11
654 MOV AX,ES:[VEC_GRAF_CHAR * 4]+2 ;AN000;
655 CMP AX,WHERE.VECSEG
656 ; $IF E ;IF THE 1FH VECTOR IS POINTING TO A GRAFTABLE
657 JNE $$IF11
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
672 ; $SEARCH COMPLEX
673 JMP SHORT $$SS12
674 $$DO12:
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;
679 ; $STRTSRCH
680 $$SS12:
681 ; THIS CHANGES ES TO PREVIOUSLY LOADED TABLE
682
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
689 JNE $$IF12
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
693
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;
697
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
711 JMP SHORT $$SR12
712 $$IF12:
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
718 JNBE $$DO12
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;
722
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"
728 ; $ENDSRCH
729 $$SR12:
730 ; $ELSE ;SINCE THE 1FH VECTOR DOES NOT POINT TO
731 JMP SHORT $$EN11
732 $$IF11:
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;
740
741 CALL PREV_NONSTD ;SET MSG TO SAY "NON STANDARD" ;AN000;
742
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?
749 $$EN11:
750 ; $ELSE ;SINCE GRAFTABLE IS NOT LOADED,
751 JMP SHORT $$EN10
752 $$IF10:
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;
756
757 CALL PREV_NONE ;SET MSG TO SAY "NONE" ;AN000;
758
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?
763 $$EN10:
764 RET
765 FINDTYPE ENDP
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;
772
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;
786
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
798 ; PUBLIC PROCESS
799 ;INPUT: DS, ES - PSP SEG ID
800 ;OUTPUT:EXITFL IS SET TO REFLECT EXISTING CONDITIONS
801
802 ; CALL PARSER ;LOOK AT DOS COMMAND LINE PARMS
803 ;
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
808 ; ; BX = 0
809 ; ;IF QUESTION MARK WAS SPECIFIED
810 ; ; BX=-1
811 ;
812 ; CALL DOFUNCTION ; RESPOND TO PARMS
813 ; ; SETTING 'EXITFL' TO INDICATE RESULTS
814 ;
815 ; ASSUME ES:CSEG
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
822 ;
823 ; $SEARCH
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
837 ; CMP DL,'9'
838 ; $IF BE
839 ; PUSH DX
840 ; MOV AX,ACC
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
850 ; CMP CL,4
851 ; $IF AE ;IF AT LEAST 4 CHARS ARE PRESENT
852 ; CMP WORD PTR [SI],"S/" ;FIRST TWO CHARS OF "/STA"
853 ; $IF E,AND
854 ; CMP WORD PTR [SI]+WORD,"AT" ;NEXT TWO CHARS OF "/STA"
855 ; $IF E
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
860 ; $ENDIF ;"/STA"?
861 ; $ENDIF ;LENGTH 4?
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?
866 ; $EXITIF GE
867 ; CALL BADPARMS ;FUSS ABOUT INVALID PARMS
868 ; $ORELSE
869 ; INC SI ;BUMP INDEX TO NEXT PARM CHAR IN PSP
870 ; DEC CL ;DEC COUNT OF INPUT CHARS FROM PARMS
871 ; $ENDLOOP
872 ; ;SINCE CL COUNT WENT TO ZERO,
873 ; CMP CH,0 ;ANY DOS PARMS LEFT AFTER CLEANUP?
874 ; $IF E ;IF NONE,
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"
886 ;
887 ; $ENDSRCH ;SCANNING DOS COMMAND LINE FOR PARMS
888 ;
889 ; POP ES ;RESTORE BASE REG
890 ; ASSUME ES:CSEG
891 ;
892 ; RET
893 ;PROCESS ENDP
894 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
895 ;UPCASE PROC NEAR
896 ;;CONVERT CHARACTERS IN PARMLIST TO UPPER CASE
897 ;;INPUT: SI=OFFSET IN DS: TO PARM TEXT
898 ;; CX=NUMBER OF CHARS OF PARMS
899 ;
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
912 ; $ENDIF
913 ; INC SI ;BUMP INDEX TO LOOK AT NEXT CHAR
914 ; $ENDDO LOOP
915 ; POP CX ;RESTORE COUNTER OF PARMS
916 ; POP SI ;RESTORE POINTER TO PARMS
917 ; $ENDIF ;ANY CHARS IN PARMLIST?
918 ;
919 ; RET
920 ;UPCASE ENDP
921 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
922 FIXLIST LISTPARM,.LIST ; ;AN000;
923 HEADER <RESPOND TO PARAMETER> ;AC000;
924 DOFUNCTION PROC NEAR ;RESPOND TO PARM ;AC000;
925 PUBLIC DOFUNCTION
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
930 ; BX = 0
931 ; IF QUESTION MARK WAS SPECIFIED
932 ; BX=-1
933
934 ASSUME ES:CSEG
935 CMP BX,RETCODE_QUESTION ;IS QUESTION MARK SPECFIED?
936 ; $IF E
937 JNE $$IF22
938 CALL HELP ;DISPLAY RESULTS OF "?" SPECIFICATION
939
940 ; $ELSE ;SINCE QUESTION MARK IS NOT PARM SPECIFIED
941 JMP SHORT $$EN22
942 $$IF22:
943 CMP BX,ZERO ;IS /STATUS SPECIFIED?
944 ; $IF NE ;IF NOT STATUS, MUST BE REQUEST TO LOAD A TABLE
945 JE $$IF24
946 LEA DI,MSGNUM_PREVIOUS ;"Previous Code Page: xxx" ;AN001;
947 CALL SENDMSG ;SEND THE MSG TO STDOUT ;AN001;
948
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
952 JE $$IF25
953
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;
960
961 MOV SI,BX ;PASS START OF CHAR TABLE
962 CALL MOVTAB ;PUT THIS TABLE INTO THE USA POSITION
963
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;
971
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
974 JNE $$IF26
975 PUSH DS
976 ASSUME DS:NOTHING
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
981
982 POP DS
983 ASSUME DS:CSEG
984 ; $ENDIF ;BAD 1FH?
985 $$IF26:
986 ; $ENDIF ;THIS TABLE ALREADY LOADED?
987 $$IF25:
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
991 ; CMP BX,AX
992 ; $ENDLOOP AE ;GO TRY THE NEXT TABLE, IF ANY
993 ; ;NOT ANY NEXT TABLE
994 ; CALL BADPARMS ;FUSS ABOUT INVALID PARMS
995 ;
996 ; $ENDSRCH ;COMPARING TOKEN WITH ID IN TABLES
997 FIXLIST LISTPARM,.LIST ; ;AN000;
998 ; $ELSE ;SINCE /STATUS SPECIFIED,
999 JMP SHORT $$EN24
1000 $$IF24:
1001 LEA DI,MSGNUM_ACTIVE ;POINT TO "ACTIVE CODE PAGE: XXX" ;AN001;
1002 CALL SENDMSG ; VARIABLE FILLED BY "FINDTYPE" ;AN001;
1003
1004 CMP IDXXX,ZERO ;SEE WHO IS LOADED, IF ANYBODY
1005 ; $IF E
1006 JNE $$IF30
1007 MOV EXITFL,EXNONE ;SET EXIT CODE TO SAY NO TABLE LOADED AT ALL
1008 ; $ELSE ;SINCE SOMEONE IS LOADED,
1009 JMP SHORT $$EN30
1010 $$IF30:
1011 MOV EXITFL,EXDOS ;SAY A TABLE IS LOADED
1012 ; $ENDIF ;ANY TABLE PREVIOUSLY LOADED?
1013 $$EN30:
1014
1015 ; $ENDIF ;/STATUS?
1016 $$EN24:
1017 ; $ENDIF ;QUESTION MARK?
1018 $$EN22:
1019 RET
1020 DOFUNCTION ENDP
1021 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1022 HEADER <LOCAL SUBROUTINE, INSTALL A PARTICULAR TABLE>
1023 MOVTAB PROC NEAR
1024 PUBLIC MOVTAB
1025 ;INPUT: SI = OFFSET OF SOURCE TABLE
1026 ; ES = PSP
1027 ASSUME ES:CSEG
1028 ;OUTPUT: THE SOURCE TABLE WILL BE MOVED TO ONE OF TWO PLACES,
1029 ; EITHER
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,
1033 ; OR
1034 ; ON TOP OF THE PREVIOUS TABLE LEFT BY A PREVIOUS GRAFTABL CALL,
1035 ; AS POINTED TO BY THE VECTOR, "WHERE".
1036
1037 PUSH ES ;SAVE THE PSP
1038 CMP INSTALLED,LOADED ;IF A PREVIOUS COPY OF GRAFTABL
1039 ; $IF E ; HAS ALREADY BEEN LOADED
1040 JNE $$IF35
1041
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,
1048 JMP SHORT $$EN35
1049 $$IF35:
1050 ASSUME ES:CSEG ;SINCE ES WAS NOT CHANGED,
1051 MOV EXITFL,EXRES ;WHEN EXITING, LEAVE TABLE RESIDENT
1052 ; ALONG WITH THE INT2FH HANDLER
1053
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.
1062
1063 LEA DI,TABLEUS ;FIND WHERE FIRST TABLE NOW IS
1064 CMP SI,DI
1065 ; $IF NE ;IF NOT THE USA TABLE,
1066 JE $$IF37
1067 MOV CX,TABSIZE ;SIZE OF THE TABLE
1068 REP MOVSB ;MOVE THE XX TABLE ONTO THE USA TABLE
1069 ; $ENDIF
1070 $$IF37:
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
1076 ; $ENDIF
1077 $$EN35:
1078 POP ES ;RESTORE THE PSP POINTER TO ES
1079 RET
1080 MOVTAB ENDP
1081 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1082 HEADER <HELP - GENERATE DISPLAY RESPONDING TO STATUS REQUEST>
1083 HELP PROC NEAR ;RESPOND TO "?" PARM SPECIFIED
1084 PUBLIC HELP
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
1091
1092 ASSUME ES:CSEG
1093 LEA DI,MSGNUM_ACTIVE ;POINT TO "ACTIVE CODE PAGE: XXX" ;AN001;
1094 CALL SENDMSG ; VARIABLE FILLED BY "FINDTYPE" ;AN001;
1095
1096 CMP EXITFL,EXDOS ;IS RET CODE UNTOUCHED SO FAR?
1097 ; $IF E ;IF SO, REPORT WHO IS LOADED
1098 JNE $$IF40
1099 CMP IDXXX,ZERO ;SEE WHO IS LOADED, IF ANYBODY
1100 ; $IF E
1101 JNE $$IF41
1102 MOV EXITFL,EXNONE ;SET EXIT CODE TO SAY NO TABLE LOADED AT ALL
1103 ; $ENDIF ;ANY TABLE PREVIOUSLY LOADED?
1104 $$IF41:
1105 ; $ENDIF ;RET CODE UNTOUCHED?
1106 $$IF40:
1107
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;
1113
1114 LEA DI,MSGNUM_HELP_TITLE7 ;AN007;
1115 CALL SENDMSG ;AN007;DISPLAY MSG IN STDOUT ;AN000;
1116
1117 LEA DI,MSGNUM_HELP_TITLE8 ;AN007;
1118 CALL SENDMSG ;AN007;DISPLAY MSG IN STDOUT ;AN000;
1119
1120 LEA DI,MSGNUM_HELP_TITLE9 ;AN007;
1121 CALL SENDMSG ;AN007;DISPLAY MSG IN STDOUT ;AN000;
1122
1123 LEA DI,MSGNUM_HELP_TITLE10 ;AN007;
1124 CALL SENDMSG ;AN007;DISPLAY MSG IN STDOUT ;AN000;
1125
1126 FIXLIST LISTPARM,.XLIST ; ;AN000;
1127 ; LEA SI,TABLEUS ;START WITH THE FIRST TABLE
1128 ; $DO
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
1132 ; $DO
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
1136 ; $ENDDO LOOP
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"
1141 ;
1142 ; ADD SI,TYPE LANGUAGE ;BUMP TO THE NEXT TABLE
1143 ; LEA AX,COPYRIGHT ;IT IMMEDIATELY FOLLOWS THE LAST TABLE
1144 ; CMP SI,AX
1145 ; $ENDDO AE
1146 FIXLIST LISTPARM,.LIST ; ;AN000;
1147 RET
1148 HELP ENDP
1149 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1150 FIXLIST LISTPARM,.XLIST ; ;AN000;
1151 ;BADPARMS PROC NEAR
1152 ; LEA AX,MSG4 ;"INCORRECT PARAMETER"
1153 ; CALL SENDMSG
1154 ;
1155 ; CALL HELP ;DISPLAY RESULTS OF "?" SPECIFICATION
1156 ;
1157 ; MOV EXITFL,EXPAR ;ERRORLEVEL CODE TO "PARM ERROR"
1158 ; RET
1159 ;BADPARMS ENDP
1160 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1161 FIXLIST LISTPARM,.LIST
1162
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 ; = = = = = = = = = = = =
1171
1172 PUSH BX ; SAVE CALLER'S REGS ;AN000;
1173 PUSH CX ; ;AN000;
1174 PUSH DX ; ;AN000;
1175 PUSH SI ; ;AN000;
1176
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;
1185
1186 ; $IF C ;IF THERE IS A PROBLEM ;AN000;
1187 JNC $$IF44
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;
1195
1196 STC ;REPORT PROBLEM ;AN000;
1197 ; $ENDIF ;PROBLEM WITH DISPLAY? ;AN000;
1198 $$IF44:
1199
1200 POP SI ;RESTORE CALLER'S REGISTERS ;AN000;
1201 POP DX ; ;AN000;
1202 POP CX ; ;AN000;
1203 POP BX ; ;AN000;
1204 FIXLIST LISTPARM,.XLIST ; ;AN000;
1205 ;;INPUT: AX = OFFSET OF MSG PARM LIST
1206 ; PUSH AX
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
1210 ;
1211 FIXLIST LISTPARM,.LIST ; ;AN000;
1212
1213 RET ; ;AN000;
1214 SENDMSG ENDP ; ;AN000;
1215 PATHLABL GRTAB ;AN006;
1216 CSEG ENDS
1217 END
1218 \1a