diff options
Diffstat (limited to 'v4.0/src/CMD/GRAFTABL/GRTAB.ASM')
| -rw-r--r-- | v4.0/src/CMD/GRAFTABL/GRTAB.ASM | 1218 |
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 | ||
| 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 | \ No newline at end of file | ||