summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/GRAFTABL/GRTAB.ASM
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/GRAFTABL/GRTAB.ASM
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/CMD/GRAFTABL/GRTAB.ASM')
-rw-r--r--v4.0/src/CMD/GRAFTABL/GRTAB.ASM1218
1 files changed, 1218 insertions, 0 deletions
diff --git a/v4.0/src/CMD/GRAFTABL/GRTAB.ASM b/v4.0/src/CMD/GRAFTABL/GRTAB.ASM
new file mode 100644
index 0000000..b0ef30c
--- /dev/null
+++ b/v4.0/src/CMD/GRAFTABL/GRTAB.ASM
@@ -0,0 +1,1218 @@
1 PAGE 90,132 ;A2
2 TITLE GRTAB - DEFINE ROM GRAPHIC CHARACTERS FOR 128-255
3 IF1
4 %OUT GRTAB.SAL...
5 ELSE
6; %OUT GRTAB.SAL...
7 ENDIF
8LISTPARM = 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)
174DOSCALL 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)
186FIXLIST MACRO LP,DOIT ;; ;AN000;
187IF LP ;; ;AN000;
188DOIT ;; ;AN000;
189ENDIF ;; ;AN000;
190 ENDM ;; ;AN000;
191; = = = = = = = = = = = =
192HEADER 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
200GET_INST_STATE EQU 0 ;FUNCTION = "GET INSTALLED STATE"
201WHERE_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:
206SHOW_MSG EQU 09H ;"SEND MESSAGE TO CONSOLE" DOS FUNCTION
207SET_VECT EQU 25H ;"SET VECTOR" DOS FUNCTION
208GET_VERSION EQU 30H ;"GET DOS VERSION"
209RET_RES EQU 31H ;"RETURN TO DOS" REMAIN RESIDENT
210GET_VECT EQU 35H ;"GET VECTOR" DOS FUNCTION
211CLOSE EQU 3EH ;AN008; CLOSE A FILE HANDLE
212FREE_AL_MEM EQU 49H ;AN008; FREE ALLOCATED MEM
213RET_FN EQU 4CH ;"RETURN TO DOS" NOT REMAIN RESIDENT
214
215; VECTOR TABLE ENTRIES USED
216VEC_GRAF_CHAR EQU 1FH ;VECTOR THAT POINTS TO GRAPHIC CHAR TABLE
217VEC_MULTIPLX EQU 2FH ;VECTOR OF MULTIPLEX HANDLER
218VEC_DOS EQU 21H ;VECTOR POINTS TO DOS FUNCTIONS
219VEC_RET EQU 20H ;RETURN TO DOS, WITHOUT RET CODE ;AN000;
220
221; DOS COMMAND LINE PARAMETERS
222RETCODE_QUESTION EQU -1 ;VALUE IN BX, IF PARM=?
223ZERO 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
233STDIN EQU 0 ;AN008; STANDARD INPUT DEVICE
234STDOUT EQU 1 ;STANDARD OUTPUT DEVICE
235STDERR EQU 2 ;STANDARD ERROR OUTPUT DEVICE
236STDAUX EQU 3 ;AN008; STANDARD AUX DEVICE
237STDPRN EQU 4 ;AN008; STANDARD PRINTER DEVICE
238
239; OTHER EQUATES
240BLANK EQU " " ;BLANK CHARACTER
241NIBBLE_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
251VECTOR STRUC ;DEFINITION OF ANY DOUBLE WORD VECTOR POINTER
252VECOFF DW ? ;OFFSET PORTION OF VECTOR POINTER
253VECSEG DW ? ;SEGMENT PORTION OF VECTOR POINTER
254VECTOR ENDS
255; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
256LANGUAGE STRUC ;DEFINITION OF EACH LANGUAGE TABLE
257LANCHAR DB 1024 DUP(?) ;8 BYTES PER EACH OF 128 CHARACTERS
258LANID DW ? ;TWO BYTE CODEPAGE ID, TO MATCH
259 ; GRAFTABL CMD LINE PARM
260LANNAME DB 14 DUP(?) ;ASCIIZ STRING NAME OF LANGUAGE
261LANGUAGE ENDS
262
263TABSIZE 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
267ONE_SUBS EQU 1 ;ONE VARIABLE FIELD IN MESSAGE ;AN000;
268TWO_SUBS EQU 2 ;TWO VARIABLE FIELDS IN MESSAGE ;AN000;
269CLASS_1 EQU 0100H ;CLASS 1 (DOS EXTENDED ERRORS) ;AN000;
270CLASS_2 EQU 0200H ;CLASS 2 (PARSE ERRORS) ;AN000;
271CLASS_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
277MSG_DESC STRUC ; ;AN000;
278MSG_NUM DW 0 ;MESSAGE NUMBER (TO AX) ;AN000;
279MSG_HANDLE DW STDOUT ;HANDLE OF OUTPUT DEVICE (TO BX) ;AN000;
280MSG_SUBLIST DW 0 ;POINTER TO SUBLIST (TO SI) ;AN000;
281MSG_COUNT DW 0 ;SUBSTITUTION COUNT (TO CX) ;AN000;
282MSG_CLASS DW CLASS_A ;MESSAGE CLASS (IN HIGH BYTE, TO DH) ;AN000;
283 ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL)
284MSG_DESC ENDS ; ;AN000;
285; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
286SUBLIST STRUC ; ;AN000;
287SUB_SIZE DB TYPE SUBLIST ;SUBLIST SIZE (POINTER TO NEXT SUBLIST) ;AN000;
288SUB_RES DB 0 ;RESERVED ;AN000;
289 ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD
290SUB_VALUE DW 0 ;TIME, DATE, OR PTR TO DATA ITEM ;AN000;
291SUB_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)
294SUB_ID DB 0 ;N OF %N ;AN000;
295SUB_FLAGS DB 0 ;DATA TYPE FLAGS ;AN000;
296SUB_MAX_WIDTH DB 0 ;MAXIMUM FIELD WIDTH (0=UNLIMITED) ;AN000;
297SUB_MIN_WIDTH DB 0 ;MINIMUM FIELD WIDTH ;AN000;
298SUB_PAD_CHAR DB " " ;CHARACTER FOR PAD FIELD ;AN000;
299SUBLIST ENDS ; ;AN000;
300; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
301DEFPSP STRUC
302 DB 2CH DUP(?) ;AN008;
303ENVIRON_SEG DW ? ;AN008; SEG ID OF ENVIRONMENT
304 DB 32H DUP(?) ;AN008; SET WHERE
305MOV_DEST DB 20H DUP(?) ; INT HANDLER IS TO BE MOVED TO
306 ;AT MOV_DEST+HANDLER_SIZE WILL GO THE
307 ; TABLE ITSELF
308PARMCNT DB ? ;COUNT OF CHARS IN DOS COMMAND LINE PARM LIST
309PARMDOS DB 127 DUP(?) ;DOS COMMAND LINE PARM TEXT
310DEFPSP ENDS
311
312PSPSIZE EQU SIZE DEFPSP ;SIZE OF THE PSP ITSELF
313SHIFT_SIZE EQU PSPSIZE - MOV_DEST ; HOW FAR HANDLER/TABLE MOVED
314 ;WHEN THEY BECAME RESIDENT
315SHIFT_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
322CSEG 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
328GRTAB_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)
372WHERE 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.
375ADPSP 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;
383RESSIZE_PARA DW 0 ;SIZE OF RESIDENT PORTION, HANDLER+TABLE, IN PARAGRAPHS
384RESSIZE_BYTE DW 0 ;SIZE OF RESIDENT PORTION, HANDLER+TABLE, IN BYTES
385SAVESI DW 0 ;REMEMBER WHERE CURRENT TABLE STARTS
386CPIDPOINTER DW CPID ;POINTER TO ENTRY IN CPID TABLE OF PREVIOUS ENTRY
387ACTIVECPID DW CPID ;POINTER TO ENTRY IN CPID TABLE OF ACTIVE ENTRY
388 PUBLIC ACTIVECPID
389IDXXX DW 0 ;ID OF PREVIOUSLY LOADED TABLE
390INSTALLED 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".
395LOADED 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.
400EXVER EQU 4 ;RETURN TO DOS, INVALID DOS VERSION
401EXPAR EQU 3 ;RETURN TO DOS, INVALID DOS COMMAND LINE PARMS
402 ; OR SYSTEM MESSAGE HANDLER ERROR
403EXNONE EQU 2 ;RETURN TO DOS, NO TABLE WAS LOADED
404EXDOS EQU 1 ;RETURN TO DOS, CHAR TABLE PREVIOUSLY LOADED
405EXRES EQU 0 ;RETURN TO DOS, LEAVING THE 1K BLOCK OF CHAR RESIDENT
406
407EXITFL DB EXDOS ;ERRORLEVEL RETURN CODE, INITIALLY SET TO "EXDOS"
408 PUBLIC EXITFL
409BAD1F DB 0 ;FLAG, GET SET TO "RESET" IF GRAFTABL FONT IS
410RESET 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>
415MAIN PROC NEAR
416ENTRY_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;
440MAIN ENDP
441; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
442 HEADER <MAIN_GRTAB - PERFORM FUNCTIONS INDICATED BY PARMS>
443MAIN_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
599MAIN_GRTAB ENDP
600; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
601 HEADER <LOCAL SUBROUTINES, SCAN TO SEE WHO IS ALREADY LOADED>
602FINDTYPE 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
765FINDTYPE ENDP
766; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
767 HEADER <PREV_NONSTD - SET UP MESSAGE TO SAY 'NON-STANDARD'> ; ;AN000;
768PREV_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;
779PREV_NONSTD ENDP ; ;AN000;
780; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
781 HEADER <PREV_NONE - SET UP MESSAGE TO SAY 'NONE'> ; ;AN000;
782PREV_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;
793PREV_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;
924DOFUNCTION 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
1020DOFUNCTION ENDP
1021; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1022 HEADER <LOCAL SUBROUTINE, INSTALL A PARTICULAR TABLE>
1023MOVTAB 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
1080MOVTAB ENDP
1081; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1082 HEADER <HELP - GENERATE DISPLAY RESPONDING TO STATUS REQUEST>
1083HELP 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
1148HELP 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;
1164SENDMSG 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;
1214SENDMSG ENDP ; ;AN000;
1215 PATHLABL GRTAB ;AN006;
1216CSEG ENDS
1217 END
1218 \ No newline at end of file