summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/GRAPHICS/GRLOAD2.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/GRAPHICS/GRLOAD2.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/GRAPHICS/GRLOAD2.ASM')
-rw-r--r--v4.0/src/CMD/GRAPHICS/GRLOAD2.ASM910
1 files changed, 910 insertions, 0 deletions
diff --git a/v4.0/src/CMD/GRAPHICS/GRLOAD2.ASM b/v4.0/src/CMD/GRAPHICS/GRLOAD2.ASM
new file mode 100644
index 0000000..68041ba
--- /dev/null
+++ b/v4.0/src/CMD/GRAPHICS/GRLOAD2.ASM
@@ -0,0 +1,910 @@
1 PAGE ,132 ;AN000;
2 TITLE DOS - GRAPHICS Command - Profile Load Modules #2 ;AN000;
3 ;AN000;
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
5;; DOS - GRAPHICS Command
6;; (C) Copyright 1988 Microsoft
7;; ;AN000;
8;; File Name: GRLOAD.ASM ;AN000;
9;; ---------- ;AN000;
10;; ;AN000;
11;; Description: ;AN000;
12;; ------------ ;AN000;
13;; This file contains the modules used to load the ;AN000;
14;; GRAPHICS profile into resident memory. ;AN000;
15;; ;AN000;
16;; ************* The EGA Dynamic Save Area will be built (by ;AN000;
17;; ** NOTE ** CHAIN_INTERRUPTS in file GRINST.ASM) over top of these ;AN000;
18;; ************* modules to avoid having to relocate this save just before ;AN000;
19;; terminating. This is safe since the maximum memory used is ;AN000;
20;; 288 bytes and the profile loading modules are MUCH larger than ;AN000;
21;; this. So GRLOAD.ASM MUST be linked before GRINST.ASM and after ;AN000;
22;; GRPRINT.ASM. ;AN000;
23;; ;AN000;
24;; ;AN000;
25;; Documentation Reference: ;AN000;
26;; ------------------------ ;AN000;
27;; PLACID Functional Specifications ;AN000;
28;; OASIS High Level Design ;AN000;
29;; OASIS GRAPHICS I1 Overview ;AN000;
30;; ;AN000;
31;; Procedures Contained in This File: ;AN000;
32;; ---------------------------------- ;AN000;
33;; LOAD_PROFILE - Main module for profile loading ;AN000;
34;; ;AN000;
35;; Include Files Required: ;AN000;
36;; ----------------------- ;AN000;
37;; ?????????? - Externals for profile loading modules ;AN000;
38;; ;AN000;
39;; External Procedure References: ;AN000;
40;; ------------------------------ ;AN000;
41;; None ;AN000;
42;; ;AN000;
43;; Linkage Instructions: ;AN000;
44;; --------------------- ;AN000;
45;; Refer to GRAPHICS.ASM ;AN000;
46;; ;AN000;
47;; Change History: ;AN000;
48;; --------------- ;AN000;
49;; ;AN000;
50;; ;AN000;
51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
52 ;; ;AN000;
53 ;; ;AN000;
54CODE SEGMENT PUBLIC 'CODE' BYTE ;; ;AN000;
55 ;; ;AN000;
56 INCLUDE STRUC.INC ;; ;AN000;
57 INCLUDE GRINST.EXT ;; Bring in external declarations ;AN000;
58 ;; for transient command processing ;AN000;
59 INCLUDE GRSHAR.STR ;; ;AN000;
60 INCLUDE GRMSG.EQU ;; ;AN000;
61 INCLUDE GRINST.EXT ;; ;AN000;
62 INCLUDE GRLOAD.EXT ;; ;AN000;
63 INCLUDE GRPARSE.EXT ;; ;AN000;
64 INCLUDE GRPATTRN.STR ;; ;AN000;
65 INCLUDE GRPATTRN.EXT ;; ;AN000;
66 ;; ;AN000;
67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
68;; ;AN000;
69;; Public Symbols ;AN000;
70;; ;AN000;
71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
72 ;; ;AN000;
73 PUBLIC PARSE_VERB ;; ;AN000;
74 PUBLIC PARSE_PRINTER ;; ;AN000;
75 PUBLIC PARSE_DISPLAYMODE ;; ;AN000;
76 PUBLIC PARSE_PRINTBOX ;; ;AN000;
77 PUBLIC PARSE_SETUP ;; ;AN000;
78 PUBLIC PARSE_RESTORE ;; ;AN000;
79 PUBLIC TERMINATE_DISPLAYMODE ;; ;AN000;
80 PUBLIC TERMINATE_PRINTER ;; ;AN000;
81 PUBLIC CUR_PRINTER_TYPE ;; ;AN000;
82 ;; ;AN000;
83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
84 ;; ;AN000;
85 ASSUME CS:CODE,DS:CODE ;; ;AN000;
86 ;; ;AN000;
87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
88 ;; ;AN000;
89 ;; ;AN000;
90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
91;; ;AN000;
92;; Profile Load Variables ;AN000;
93;; ;AN000;
94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
95 ;; ;AN000;
96NO EQU 0 ;; ;AN000;
97YES EQU 1 ;; ;AN000;
98 ;; ;AN000;
99RESULT_BUFFER LABEL BYTE ;; general purpose result buffer ;AN000;
100 DB ? ;; operand type ;AN000;
101RESULT_TAG DB 0 ;; operand tag ;AN000;
102 DW ? ;; pointer to synonym/keyword ;AN000;
103RESULT_VAL DB ?,?,?,? ;; returned numeric value ;AN000;
104 ;; ;AN000;
105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
106;; ;AN000;
107;; Module Name: ;AN000;
108;; TERMINATE_DISPLAYMODE ;AN000;
109;; ;AN000;
110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
111 ;; ;AN000;
112 ;; ;AN000;
113TERMINATE_DISPLAYMODE PROC ;; ;AN000;
114 ;; ;AN000;
115 MOV AX,STMTS_DONE ;; ;AN000;
116 .IF <PTD_FOUND EQ YES> AND ;; For the matched PTD ;AN000;
117 .IF <BIT AX NAND BOX> AND ;; issue "Invalid parm value" ;AN000;
118 .IF <PRT_BOX_ERROR EQ NO> ;; message if PRINTBOX ID not ;AN000;
119 ;; matched in each DISPLAYMODE section ;AN000;
120 PUSH AX ;; Save STMT_DONE flags ;AN000;
121 MOV AX,INVALID_PB ;; ;AN000;
122 MOV CX,0 ;; ;AN000;
123 CALL DISP_ERROR ;; ;AN000;
124 MOV BUILD_STATE,NO ;; ;AN000;
125 MOV PRT_BOX_ERROR,YES ;; Issue this message only once ;AN000;
126 POP AX ;; ;AN000;
127 .ENDIF ;; ;AN000;
128 AND AX,GR ;; Check for missing statements is last ;AN000;
129 .IF <AX NE GR> ;; DISPLAYMODE section: ;AN000;
130 OR STMT_ERROR,MISSING ;; GRAPHICS stmt is required ;AN000;
131 MOV PARSE_ERROR,YES ;; ;AN000;
132 MOV BUILD_STATE,NO ;; ;AN000;
133 .ENDIF ;; ;AN000;
134 ;; ;AN000;
135 ;; ;AN000;
136 ;; ;AN000;
137 RET ;; ;AN000;
138 ;; ;AN000;
139TERMINATE_DISPLAYMODE ENDP ;; ;AN000;
140 ;; ;AN000;
141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
142;; ;AN000;
143;; Module Name: ;AN000;
144;; TERMINATE_PRINTER ;AN000;
145;; ;AN000;
146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
147 ;; ;AN000;
148TERMINATE_PRINTER PROC ;; ;AN000;
149 ;; ;AN000;
150 MOV AX,BLOCK_END ;; ;AN000;
151 .IF <AX A MAX_BLOCK_END> ;; Keep track of the largest PRINTER ;AN000;
152 MOV MAX_BLOCK_END,AX ;; section so we can allow space for ;AN000;
153 .ENDIF ;; reload with a different printer ;AN000;
154 ;; type. ;AN000;
155 ;; ;AN000;
156 ;; Check for missing statements ;AN000;
157 MOV AX,STMTS_DONE ;; ;AN000;
158 AND AX,DISP ;; At least one DISPLAYMODE ;AN000;
159 .IF <AX NE DISP> ;; must have been found in last ;AN000;
160 OR STMT_ERROR,MISSING ;; PRINTER section ;AN000;
161 MOV PARSE_ERROR,YES ;; ;AN000;
162 MOV BUILD_STATE,NO ;; ;AN000;
163 .ENDIF ;; ;AN000;
164 ;; ;AN000;
165 RET ;; ;AN000;
166 ;; ;AN000;
167TERMINATE_PRINTER ENDP ;; ;AN000;
168 ;; ;AN000;
169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
170;; ;AN000;
171;; Module Name: ;AN000;
172;; PARSE_PRINTER ;AN000;
173;; ;AN000;
174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
175 ;; ;AN000;
176PRINTER_PARSE_PARMS LABEL WORD ;; Parser control blocks ;AN000;
177 DW PRINTER_P ;; ;AN000;
178 DB 2 ;; # of lists ;AN000;
179 DB 0 ;; # items in delimeter list ;AN000;
180 DB 1 ;; # items in end-of-line list ;AN000;
181 DB ';' ;; ';' used for comments ;AN000;
182 ;; ;AN000;
183PRINTER_P DB 0,1 ;; Required, max parms ;AN000;
184 DW PRINTER_P1 ;; ;AN000;
185 DB 0 ;; # Switches ;AN000;
186 DB 0 ;; # keywords ;AN000;
187 ;; ;AN000;
188PRINTER_P1 DW 2000H ;; simple string ;AN000;
189 DW 0002H ;; Capitalize using character table ;AN000;
190 DW RESULT_BUFFER ;; Result buffer ;AN000;
191 DW PRINTER_P1V ;; Value list ;AN000;
192 DB 0 ;; Synomyms ;AN000;
193 ;; ;AN000;
194PRINTER_P1V DB 3 ;; # of value lists ;AN000;
195 DB 0 ;; # of range numerics ;AN000;
196 DB 0 ;; # of discrete numerics ;AN000;
197 DB 1 ;; # of strings ;AN000;
198 DB 1 ;; tag: index into verb jump table ;AN000;
199PRINTER_P1V1 DW ? ;; string offset ;AN000;
200 ;; ;AN000;
201 ;; ;AN000;
202CUR_PRINTER_TYPE DB 0 ;; Type of printer currently being ;AN000;
203 ;; parsed: 1-color 2-b&w ;AN000;
204 ;; ;AN000;
205PARSE_PRINTER PROC ;; ;AN000;
206 ;; ;AN000;
207 MOV CUR_STMT,PRT ;; ;AN000;
208 MOV CUR_PRINTER_TYPE,BLACK_WHITE ;; Assume black & white until we hit ;AN000;
209 ;; a COLORPRINT ;AN000;
210 ;; ;AN000;
211 .IF <BIT STMTS_DONE AND PRT> ;; If not the first PRINTER section ;AN000;
212 CALL TERMINATE_DISPLAYMODE ;; then clean up the last one and ;AN000;
213 CALL TERMINATE_PRINTER ;; the last DISPLAYMODE section. ;AN000;
214 .ENDIF ;; ;AN000;
215 ;; ;AN000;
216 MOV AX,FIRST_BLOCK ;; ;AN000;
217 MOV BLOCK_START,AX ;; Reset block pointers to start ;AN000;
218 MOV BLOCK_END,AX ;; of variable area ;AN000;
219 ;; ;AN000;
220 MOV STMTS_DONE,PRT ;; Clear all bits except for PRT ;AN000;
221 MOV GROUPS_DONE,0 ;; Clear ;AN000;
222 ;; ;AN000;
223 .IF <PTD_FOUND EQ YES> ;; PRINTER statement marks the end of ;AN000;
224 MOV PTD_FOUND,PROCESSED ;; the previous PTD ;AN000;
225 MOV BUILD_STATE,NO ;; Stop building shared data ;AN000;
226 .ENDIF ;; ;AN000;
227 ;; ;AN000;
228 MOV CL,TAB_DIR_NB_ENTRIES ;; Reset the pattern table copy ;AN000;
229 XOR CH,CH ;; pointers. These pointers ;AN000;
230 MOV BX,OFFSET TAB_DIRECTORY ;; are established when a pattern ;AN000;
231 .REPEAT ;; table is copied to the shared ;AN000;
232 MOV [BX].TAB_COPY,-1 ;; data area. Initially they ;AN000;
233 ADD BX,SIZE TAB_ENTRY ;; are -1. ;AN000;
234 .LOOP ;; ;AN000;
235 ;; ;AN000;
236 MOV AX,OFFSET PRINTER_TYPE_PARM ;; Store printer type from command ;AN000;
237 MOV PRINTER_P1V1,AX ;; line in value list ;AN000;
238 MOV DI,OFFSET PRINTER_PARSE_PARMS ;; parse parms ;AN000;
239 ;; SI => the line to parse ;AN000;
240 XOR DX,DX ;; ;AN000;
241 ;; ;AN000;
242 .REPEAT ;; ;AN000;
243 XOR CX,CX ;; Don't worry about number of operands ;AN000;
244 CALL SYSPARSE ;; ;AN000;
245 .IF <AX EQ 9> ;; Syntax error is the only thing ;AN000;
246 OR STMT_ERROR,INVALID ;; which can go wrong ;AN000;
247 MOV PARSE_ERROR,YES ;; ;AN000;
248 MOV BUILD_STATE,NO ;; ;AN000;
249 .ENDIF ;; ;AN000;
250 .UNTIL <AX EQ 0> OR ;; ;AN000;
251 .UNTIL <AX EQ -1> ;; ;AN000;
252 ;; Printer type parm matched one coded ;AN000;
253 ;; on the PRINTER statement ;AN000;
254 .IF <AX EQ 0> ;; ;AN000;
255 .IF <PTD_FOUND EQ NO> ;; ;AN000;
256 MOV PTD_FOUND,YES ;; If the printer type matches and ;AN000;
257 .IF <PARSE_ERROR EQ NO> AND ;; no errors have been found yet ;AN000;
258 .IF <PRT_BOX_ERROR EQ NO> AND ;; ;AN000;
259 .IF <MEM_OVERFLOW EQ NO> ;; ;AN000;
260 MOV BUILD_STATE,YES ;; then start building the shared ;AN000;
261 .ENDIF ;; data ;AN000;
262 .ENDIF ;; ;AN000;
263 .ELSE ;; No match ;AN000;
264 MOV BUILD_STATE,NO ;; ;AN000;
265 .IF <AX NE -1> ;; Error during parse ;AN000;
266 OR STMT_ERROR,INVALID ;; set error flag for caller ;AN000;
267 MOV PARSE_ERROR,YES ;; set error flag for caller ;AN000;
268 .ENDIF ;; ;AN000;
269 .ENDIF ;; ;AN000;
270 ;; ;AN000;
271 RET ;AN000;
272 ;; ;AN000;
273PARSE_PRINTER ENDP ;AN000;
274 ;AN000;
275 ;; ;AN000;
276 ;; ;AN000;
277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
278;; ;AN000;
279;; Module Name: ;AN000;
280;; PARSE_DISPLAYMODE ;AN000;
281;; ;AN000;
282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
283 ;; ;AN000;
284DISPMODE_PARSE_PARMS LABEL WORD ;; Parser control blocks ;AN000;
285 DW DISPMODE_P ;; ;AN000;
286 DB 2 ;; # of lists ;AN000;
287 DB 0 ;; # items in delimeter list ;AN000;
288 DB 1 ;; # items in end-of-line list ;AN000;
289 DB ';' ;; ';' used for comments ;AN000;
290 ;; ;AN000;
291DISPMODE_P DB 0,1 ;; Required, max parms ;AN000;
292 DW DISPMODE_P1 ;; ;AN000;
293 DB 0 ;; # Switches ;AN000;
294 DB 0 ;; # keywords ;AN000;
295 ;; ;AN000;
296DISPMODE_P1 DW 8000H ;; Numeric ;AN000;
297 DW 0 ;; No Capitalize ;AN000;
298 DW RESULT_BUFFER ;; Result buffer ;AN000;
299 DW DISPMODE_P1V ;; Value list ;AN000;
300 DB 0 ;; Synomyms ;AN000;
301 ;; ;AN000;
302DISPMODE_P1V DB 1 ;; # of value lists ;AN000;
303 DB 1 ;; # of range numerics ;AN000;
304 DB 1 ;; tag ;AN000;
305 DD 0,19 ;; range 0..19 ;AN000;
306 ;; ;AN000;
307 ;; ;AN000;
308 ;; ;AN000;
309PARSE_DISPLAYMODE PROC ;; ;AN000;
310 ;; ;AN000;
311 MOV CUR_STMT,DISP ;; ;AN000;
312 ;; Check for a preceeding PRINTER ;AN000;
313 .IF <BIT STMTS_DONE NAND PRT> ;; ;AN000;
314 OR STMT_ERROR,MISSING ;; ;AN000;
315 MOV PARSE_ERROR,YES ;; ;AN000;
316 MOV BUILD_STATE,NO ;; ;AN000;
317 .ENDIF ;; ;AN000;
318 ;; ;AN000;
319 ;; ;AN000;
320 .IF <BIT STMTS_DONE NAND DISP> ;; If first DISPLAYMODE... ;AN000;
321 .IF <BUILD_STATE EQ YES> ;; ;AN000;
322 MOV AX,BLOCK_END ;; ;AN000;
323 MOV [BP].DISPLAYMODE_PTR,AX ;; Set pointer to first DISPLAYMODE ;AN000;
324 MOV BLOCK_START,AX ;; New block starts after last one ;AN000;
325 .ENDIF ;; ;AN000;
326 .ELSE ;; ;AN000;
327 CALL TERMINATE_DISPLAYMODE ;; If not the first DISPLAYMODE then ;AN000;
328 ;; clean up the last one. ;AN000;
329 MOV DI,BLOCK_START ;; DI=pointer to DISPLAYMODE block just ;AN000;
330 MOV AX,BLOCK_END ;; built ;AN000;
331 .IF <BUILD_STATE EQ YES> ;; ;AN000;
332 MOV [BP+DI].NEXT_DISP_MODE,AX ;; Add new block to DISPLAYMODE chain ;AN000;
333 .ENDIF ;; ;AN000;
334 MOV BLOCK_START,AX ;; New block starts after last one ;AN000;
335 .ENDIF ;; ;AN000;
336 ;; ;AN000;
337 MOV AX,SIZE DISPLAYMODE_STR ;; Allocate space for new DISPLAYMODE ;AN000;
338 CALL GROW_SHARED_DATA ;; block ;AN000;
339 .IF <BUILD_STATE EQ YES> ;; ;AN000;
340 MOV DI,BLOCK_START ;; Start of new block ;AN000;
341 MOV [BP+DI].NUM_SETUP_ESC,0 ;; SETUP, RESTORE are optional so set ;AN000;
342 MOV [BP+DI].NUM_RESTORE_ESC,0 ;; to defaults ;AN000;
343 MOV [BP+DI].SETUP_ESC_PTR,-1 ;; ;AN000;
344 MOV [BP+DI].RESTORE_ESC_PTR,-1 ;; ;AN000;
345 MOV [BP+DI].BOX_WIDTH,0 ;; ;AN000;
346 MOV [BP+DI].BOX_HEIGHT,0 ;; ;AN000;
347 MOV [BP+DI].PRINT_OPTIONS,0 ;; Default to NO print options ;AN000;
348 MOV [BP+DI].NUM_DISP_MODE,0 ;; Get ready to INC this sucker ;AN000;
349 MOV [BP+DI].NEXT_DISP_MODE,-1 ;; This is the last DISPLAYMODE for now! ;AN000;
350 MOV AX,BLOCK_END ;; ;AN000;
351 MOV [BP+DI].DISP_MODE_LIST_PTR,AX;; Start mode list at end of new block ;AN000;
352 .ENDIF ;; ;AN000;
353 ;; ;AN000;
354 OR STMTS_DONE,DISP ;; Indicate DISPLAYMODE found ;AN000;
355 AND STMTS_DONE,NOT (BOX+GR+SET+REST) ;; Reset flags for PRINTBOX, GRAPHICS ;AN000;
356 ;; stmts found ;AN000;
357 AND GROUPS_DONE,NOT (GR+SET+REST) ;; Reset flags for GRAPHICS, SETUP, ;AN000;
358 ;; RESTORE groups processed ;AN000;
359 MOV DI,OFFSET DISPMODE_PARSE_PARMS ;; parse parms ;AN000;
360 ;; SI => the line to parse ;AN000;
361 XOR DX,DX ;; ;AN000;
362 .REPEAT ;; ;AN000;
363 XOR CX,CX ;; ;AN000;
364 CALL SYSPARSE ;; ;AN000;
365 .IF <AX EQ 0> ;; If mode is valid ;AN000;
366 PUSH AX ;; ;AN000;
367 MOV AX,1 ;; Add a mode to the list ;AN000;
368 CALL GROW_SHARED_DATA ;; Update block end ;AN000;
369 .IF <BUILD_STATE EQ YES> ;; ;AN000;
370 PUSH DI ;; ;AN000;
371 MOV DI,BLOCK_START ;; ;AN000;
372 INC [BP+DI].NUM_DISP_MODE ;; Bump number of modes in list ;AN000;
373 MOV DI,BLOCK_END ;; ;AN000;
374 MOV AL,RESULT_VAL ;; Get mode from result buffer ;AN000;
375 MOV [BP+DI-1],AL ;; Store the mode at end of list ;AN000;
376 POP DI ;; ;AN000;
377 .ENDIF ;; ;AN000;
378 POP AX ;; ;AN000;
379 .ELSE ;; ;AN000;
380 .IF <AX NE -1> ;; ;AN000;
381 OR STMT_ERROR,INVALID ;; Mode is invalid ;AN000;
382 MOV PARSE_ERROR,YES ;; ;AN000;
383 MOV BUILD_STATE,NO ;; ;AN000;
384 .ENDIF ;; ;AN000;
385 .ENDIF ;; ;AN000;
386 .UNTIL <AX EQ -1> ;; ;AN000;
387 ;; ;AN000;
388 RET ;AN000;
389 ;; ;AN000;
390PARSE_DISPLAYMODE ENDP ;AN000;
391 ;AN000;
392 ;; ;AN000;
393;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
394;; ;AN000;
395;; Module Name: ;AN000;
396;; PARSE_SETUP ;AN000;
397;; ;AN000;
398;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
399 ;; ;AN000;
400SETUP_PARSE_PARMS LABEL WORD ;; Parser control blocks ;AN000;
401 DW SETUP_P ;; ;AN000;
402 DB 2 ;; # of lists ;AN000;
403 DB 0 ;; # items in delimeter list ;AN000;
404 DB 1 ;; # items in end-of-line list ;AN000;
405 DB ';' ;; ';' used for comments ;AN000;
406 ;; ;AN000;
407SETUP_P DB 0,1 ;; Required, max parms ;AN000;
408 DW SETUP_P1 ;; ;AN000;
409 DB 0 ;; # Switches ;AN000;
410 DB 0 ;; # keywords ;AN000;
411 ;; ;AN000;
412SETUP_P1 DW 08000H ;; Numeric ;AN000;
413 DW 0 ;; nO Capitalize ;AN000;
414 DW RESULT_BUFFER ;; Result buffer ;AN000;
415 DW SETUP_P1V ;; Value list ;AN000;
416 DB 0 ;; Synomyms ;AN000;
417 ;; ;AN000;
418 ;; ;AN000;
419SETUP_P1V DB 1 ;; # of value lists ;AN000;
420 DB 1 ;; # of range numerics ;AN000;
421 DB 1 ;; tag ;AN000;
422 DD 0,255 ;; range 0..255 ;AN000;
423 ;; ;AN000;
424 ;; ;AN000;
425PARSE_SETUP PROC ;; ;AN000;
426 ;; ;AN000;
427 MOV CUR_STMT,SET ;; ;AN000;
428 .IF <BIT STMTS_DONE NAND DISP> ;; DISPLAYMODE must preceed this ;AN000;
429 OR STMT_ERROR,MISSING ;; ;AN000;
430 MOV PARSE_ERROR,YES ;; ;AN000;
431 MOV BUILD_STATE,NO ;; ;AN000;
432 .ENDIF ;; ;AN000;
433 ;; ;AN000;
434 .IF <BIT GROUPS_DONE AND SET> ;; Check for previous group of SETUP ;AN000;
435 OR STMT_ERROR,SEQUENCE ;; stmts ;AN000;
436 MOV PARSE_ERROR,YES ;; ;AN000;
437 MOV BUILD_STATE,NO ;; ;AN000;
438 .ENDIF ;; ;AN000;
439 ;; ;AN000;
440 .IF <BIT STMTS_DONE NAND SET> ;; If first SETUP... ;AN000;
441 .IF <BUILD_STATE EQ YES> ;; ;AN000;
442 MOV DI,BLOCK_START ;; ;AN000;
443 MOV AX,BLOCK_END ;; ;AN000;
444 MOV [BP+DI].SETUP_ESC_PTR,AX ;; Set pointer to SETUP seq ;AN000;
445 MOV [BP+DI].NUM_SETUP_ESC,0 ;; Init sequence size ;AN000;
446 .ENDIF ;; ;AN000;
447 .ENDIF ;; ;AN000;
448 ;; ;AN000;
449 OR STMTS_DONE,SET ;; Indicate SETUP found ;AN000;
450 .IF <PREV_STMT NE SET> THEN ;; Terminate any preceeding groups ;AN000;
451 MOV AX,PREV_STMT ;; except for SETUP group ;AN000;
452 OR GROUPS_DONE,AX ;; ;AN000;
453 .ENDIF ;; ;AN000;
454 ;; ;AN000;
455 MOV DI,OFFSET SETUP_PARSE_PARMS ;; parse parms ;AN000;
456 ;; SI => the line to parse ;AN000;
457 XOR DX,DX ;; ;AN000;
458 .REPEAT ;; ;AN000;
459 XOR CX,CX ;; ;AN000;
460 CALL SYSPARSE ;; ;AN000;
461 .IF <AX EQ 0> ;; If esc byte is valid ;AN000;
462 PUSH AX ;; ;AN000;
463 MOV AX,1 ;; Add a byte to the sequence ;AN000;
464 CALL GROW_SHARED_DATA ;; Update block end ;AN000;
465 .IF <BUILD_STATE EQ YES> ;; ;AN000;
466 PUSH DI ;; ;AN000;
467 MOV DI,BLOCK_START ;; ;AN000;
468 INC [BP+DI].NUM_SETUP_ESC ;; Bump number of bytes in sequence ;AN000;
469 MOV DI,BLOCK_END ;; ;AN000;
470 MOV AL,RESULT_VAL ;; Get esc byte from result buffer ;AN000;
471 MOV [BP+DI-1],AL ;; Store at end of sequence ;AN000;
472 POP DI ;; ;AN000;
473 .ENDIF ;; ;AN000;
474 POP AX ;; ;AN000;
475 .ELSE ;; ;AN000;
476 .IF <AX NE -1> ;; ;AN000;
477 OR STMT_ERROR,INVALID ;; parm is invalid ;AN000;
478 MOV PARSE_ERROR,YES ;; ;AN000;
479 MOV BUILD_STATE,NO ;; ;AN000;
480 .ENDIF ;; ;AN000;
481 .ENDIF ;; ;AN000;
482 .UNTIL <AX EQ -1> NEAR ;; ;AN000;
483 RET ;; ;AN000;
484 ;; ;AN000;
485PARSE_SETUP ENDP ;; ;AN000;
486 ;AN000;
487 ;; ;AN000;
488;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
489;; ;AN000;
490;; Module Name: ;AN000;
491;; PARSE_RESTORE ;AN000;
492;; ;AN000;
493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
494 ;; ;AN000;
495RESTORE_PARSE_PARMS LABEL WORD ;; Parser control blocks ;AN000;
496 DW RESTORE_P ;; ;AN000;
497 DB 2 ;; # of lists ;AN000;
498 DB 0 ;; # items in delimeter list ;AN000;
499 DB 1 ;; # items in end-of-line list ;AN000;
500 DB ';' ;; ';' used for comments ;AN000;
501 ;; ;AN000;
502RESTORE_P DB 0,1 ;; Required, max parms ;AN000;
503 DW RESTORE_P1 ;; ;AN000;
504 DB 0 ;; # Switches ;AN000;
505 DB 0 ;; # keywords ;AN000;
506 ;; ;AN000;
507RESTORE_P1 DW 08000H ;; Numeric ;AN000;
508 DW 0 ;; nO Capitalize ;AN000;
509 DW RESULT_BUFFER ;; Result buffer ;AN000;
510 DW RESTORE_P1V ;; Value list ;AN000;
511 DB 0 ;; Synomyms ;AN000;
512 ;; ;AN000;
513 ;; ;AN000;
514RESTORE_P1V DB 1 ;; # of value lists ;AN000;
515 DB 1 ;; # of range numerics ;AN000;
516 DB 1 ;; tag ;AN000;
517 DD 0,255 ;; range 0..255 ;AN000;
518 ;; ;AN000;
519 ;; ;AN000;
520PARSE_RESTORE PROC ;; ;AN000;
521 ;; ;AN000;
522 MOV CUR_STMT,SET ;; ;AN000;
523 .IF <BIT STMTS_DONE NAND DISP> ;; DISPLAYMODE must preceed this ;AN000;
524 OR STMT_ERROR,MISSING ;; ;AN000;
525 MOV PARSE_ERROR,YES ;; ;AN000;
526 MOV BUILD_STATE,NO ;; ;AN000;
527 .ENDIF ;; ;AN000;
528 ;; ;AN000;
529 .IF <BIT GROUPS_DONE AND REST> ;; Check for previous group of RESTORE ;AN000;
530 OR STMT_ERROR,SEQUENCE ;; stmts ;AN000;
531 MOV PARSE_ERROR,YES ;; ;AN000;
532 MOV BUILD_STATE,NO ;; ;AN000;
533 .ENDIF ;; ;AN000;
534 ;; ;AN000;
535 .IF <BIT STMTS_DONE NAND REST> ;; If first RESTORE... ;AN000;
536 .IF <BUILD_STATE EQ YES> ;; ;AN000;
537 MOV DI,BLOCK_START ;; ;AN000;
538 MOV AX,BLOCK_END ;; ;AN000;
539 MOV [BP+DI].RESTORE_ESC_PTR,AX ;; Set pointer to RESTORE seq ;AN000;
540 MOV [BP+DI].NUM_RESTORE_ESC,0 ;; Init sequence size ;AN000;
541 .ENDIF ;; ;AN000;
542 .ENDIF ;; ;AN000;
543 ;; ;AN000;
544 OR STMTS_DONE,REST ;; Indicate RESTORE found ;AN000;
545 .IF <PREV_STMT NE REST> THEN ;; Terminate any preceeding groups ;AN000;
546 MOV AX,PREV_STMT ;; except for RESTORE group ;AN000;
547 OR GROUPS_DONE,AX ;; ;AN000;
548 .ENDIF ;; ;AN000;
549 ;; ;AN000;
550 MOV DI,OFFSET RESTORE_PARSE_PARMS ;; parse parms ;AN000;
551 ;; SI => the line to parse ;AN000;
552 XOR DX,DX ;; ;AN000;
553 .REPEAT ;; ;AN000;
554 XOR CX,CX ;; ;AN000;
555 CALL SYSPARSE ;; ;AN000;
556 .IF <AX EQ 0> ;; If esc byte is valid ;AN000;
557 PUSH AX ;; ;AN000;
558 MOV AX,1 ;; Add a byte to the sequence ;AN000;
559 CALL GROW_SHARED_DATA ;; Update block end ;AN000;
560 .IF <BUILD_STATE EQ YES> ;; ;AN000;
561 PUSH DI ;; ;AN000;
562 MOV DI,BLOCK_START ;; ;AN000;
563 INC [BP+DI].NUM_RESTORE_ESC ;; Bump number of bytes in sequence ;AN000;
564 MOV DI,BLOCK_END ;; ;AN000;
565 MOV AL,RESULT_VAL ;; Get esc byte from result buffer ;AN000;
566 MOV [BP+DI-1],AL ;; Store at end of sequence ;AN000;
567 POP DI ;; ;AN000;
568 .ENDIF ;; ;AN000;
569 POP AX ;; ;AN000;
570 .ELSE ;; ;AN000;
571 .IF <AX NE -1> ;; ;AN000;
572 OR STMT_ERROR,INVALID ;; parm is invalid ;AN000;
573 MOV PARSE_ERROR,YES ;; ;AN000;
574 MOV BUILD_STATE,NO ;; ;AN000;
575 .ENDIF ;; ;AN000;
576 .ENDIF ;; ;AN000;
577 .UNTIL <AX EQ -1> NEAR ;; ;AN000;
578 RET ;; ;AN000;
579 ;; ;AN000;
580PARSE_RESTORE ENDP ;; ;AN000;
581 ;AN000;
582 ;; ;AN000;
583;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
584;; ;AN000;
585;; Module Name: ;AN000;
586;; PARSE_PRINTBOX ;AN000;
587;; ;AN000;
588;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
589 ;; ;AN000;
590PRINTBOX_PARSE_PARMS LABEL WORD ;; Parser control blocks ;AN000;
591 DW PRINTBOX_P ;; ;AN000;
592 DB 2 ;; # of lists ;AN000;
593 DB 0 ;; # items in delimeter list ;AN000;
594 DB 1 ;; # items in end-of-line list ;AN000;
595 DB ';' ;; ';' used for comments ;AN000;
596 ;; ;AN000;
597PRINTBOX_P DB 1,4 ;; Required, max parms ;AN000;
598 DW PRINTBOX_P0 ;; LCD/STD ;AN000;
599 DW PRINTBOX_P1 ;; width ;AN000;
600 DW PRINTBOX_P1 ;; height ;AN000;
601 DW PRINTBOX_P2 ;; rotate ;AN000;
602 DB 0 ;; # Switches ;AN000;
603 DB 0 ;; # keywords ;AN000;
604 ;; ;AN000;
605PRINTBOX_P0 DW 2000H ;; sTRING - display type ;AN000;
606 DW 2 ;; Capitalize ;AN000;
607 DW RESULT_BUFFER ;; Result buffer ;AN000;
608 DW PRINTBOX_P0V ;; Value list ;AN000;
609 DB 0 ;; Synomyms ;AN000;
610 ;; ;AN000;
611PRINTBOX_P0V DB 3 ;; # of value lists ;AN000;
612 DB 0 ;; # of range numerics ;AN000;
613 DB 0 ;; # of discrete numerics ;AN000;
614 DB 1 ;; # of strings ;AN000;
615 DB 1 ;; tag ;AN000;
616PRINTBOX_P0V1 DW ? ;; string ;AN000;
617 ;; ;AN000;
618PRINTBOX_P1 DW 8001H ;; Numeric - BOX DIMENSIONS ;AN000;
619 DW 0 ;; No Capitalize ;AN000;
620 DW RESULT_BUFFER ;; Result buffer ;AN000;
621 DW PRINTBOX_P1V ;; Value list ;AN000;
622 DB 0 ;; Synomyms ;AN000;
623 ;; ;AN000;
624PRINTBOX_P1V DB 1 ;; # of value lists ;AN000;
625 DB 1 ;; # of range numerics ;AN000;
626 DB 1 ;; tag ;AN000;
627 DD 1,9 ;; range 1..9 ;AN000;
628 ;; ;AN000;
629 ;; ;AN000;
630PRINTBOX_P2 DW 2001H ;; sTRING - ROTATE PARM ;AN000;
631 DW 2 ;; Capitalize ;AN000;
632 DW RESULT_BUFFER ;; Result buffer ;AN000;
633 DW PRINTBOX_P2V ;; Value list ;AN000;
634 DB 0 ;; Synomyms ;AN000;
635 ;; ;AN000;
636PRINTBOX_P2V DB 3 ;; # of value lists ;AN000;
637 DB 0 ;; # of range numerics ;AN000;
638 DB 0 ;; # of discrete numerics ;AN000;
639 DB 1 ;; # of strings ;AN000;
640 DB 1 ;; tag ;AN000;
641 DW ROTATE_STR ;; string ;AN000;
642ROTATE_STR DB 'ROTATE',0 ;; ;AN000;
643 ;; ;AN000;
644 ;; ;AN000;
645PROF_BOX_W DB 0 ;; Box width and height extracted from ;AN000;
646PROF_BOX_H DB 0 ;; the profile ;AN000;
647PRINTBOX_MATCH DB 0 ;; ;AN000;
648 ;; ;AN000;
649 ;; ;AN000;
650PARSE_PRINTBOX PROC ;; ;AN000;
651 ;; ;AN000;
652 MOV PRINTBOX_MATCH,NO ;; Start out assuming the PRINTBOX ID ;AN000;
653 MOV PROF_BOX_W,0 ;; does not match the one requested ;AN000;
654 MOV PROF_BOX_H,0 ;; ;AN000;
655 MOV CUR_STMT,BOX ;; ;AN000;
656 .IF <BIT STMTS_DONE NAND DISP> ;; DISPLAYMODE must preceed PRINTBOX ;AN000;
657 OR STMT_ERROR,MISSING ;; ;AN000;
658 MOV PARSE_ERROR,YES ;; ;AN000;
659 MOV BUILD_STATE,NO ;; ;AN000;
660 .ENDIF ;; ;AN000;
661 ;; Multiple PRINTBOX stmts may be coded ;AN000;
662 ;; We must decide if this one ;AN000;
663 ;; matches the requested display type ;AN000;
664 ;; If not, ignore the statement ;AN000;
665 MOV DI,OFFSET PRINTBOX_PARSE_PARMS ;; parse parms ;AN000;
666 ;; SI => the line to parse ;AN000;
667 XOR DX,DX ;; ;AN000;
668 XOR CX,CX ;; ;AN000;
669 ;; ;AN000;
670 MOV AX,PRINTBOX_ID_PTR ;; Insert requested display type in ;AN000;
671 MOV PRINTBOX_P0V1,AX ;; parser value list ;AN000;
672 CALL SYSPARSE ;; PARSE display type ;AN000;
673 .IF <AX EQ 0> ;; If ID matches then set this flag. ;AN000;
674 MOV PRINTBOX_MATCH,YES ;; ;AN000;
675 OR STMTS_DONE,BOX ;; Indicate PRINTBOX found ;AN000;
676 MOV AX,PREV_STMT ;; Terminate any preceeding groups ;AN000;
677 OR GROUPS_DONE,AX ;; ;AN000;
678 .ENDIF ;; ;AN000;
679 ;; ;AN000;
680 ;; ;AN000;
681 ;; ;AN000;
682 CALL SYSPARSE ;; PARSE horizontal dimension ;AN000;
683 .IF <AX EQ 0> ;; ;AN000;
684 MOV BL,RESULT_VAL ;; ;AN000;
685 MOV PROF_BOX_W,BL ;; Save in local var ;AN000;
686 .ELSE ;; ;AN000;
687 .IF <AX EQ -1> ;; ;AN000;
688 JMP PRINTBOX_DONE ;; ;AN000;
689 .ELSE ;; ;AN000;
690 OR STMT_ERROR,INVALID ;; ;AN000;
691 MOV PARSE_ERROR,YES ;; ;AN000;
692 MOV BUILD_STATE,NO ;; ;AN000;
693 .ENDIF ;; ;AN000;
694 .ENDIF ;; ;AN000;
695 ;; ;AN000;
696 CALL SYSPARSE ;; PARSE vertical dimension ;AN000;
697 .IF <AX EQ 0> ;; ;AN000;
698 MOV BL,RESULT_VAL ;; ;AN000;
699 MOV PROF_BOX_H,BL ;; Save in local var ;AN000;
700 .ELSE ;; ;AN000;
701 .IF <AX EQ -1> ;; ;AN000;
702 JMP PRINTBOX_DONE ;; ;AN000;
703 .ELSE ;; ;AN000;
704 OR STMT_ERROR,INVALID ;; ;AN000;
705 MOV PARSE_ERROR,YES ;; ;AN000;
706 MOV BUILD_STATE,NO ;; ;AN000;
707 .ENDIF ;; ;AN000;
708 .ENDIF ;; ;AN000;
709 ;; ;AN000;
710 CALL SYSPARSE ;; Parse ROTATE parm ;AN000;
711 .IF <AX EQ 0> ;; ;AN000;
712 .IF <BUILD_STATE EQ YES> AND ;; ;AN000;
713 .IF <PRINTBOX_MATCH EQ YES> ;; ;AN000;
714 PUSH DI ;; ;AN000;
715 MOV DI,BLOCK_START ;; ;AN000;
716 OR [BP+DI].PRINT_OPTIONS,ROTATE ;; ;AN000;
717 POP DI ;; ;AN000;
718 .ENDIF ;; ;AN000;
719 .ELSE ;; ;AN000;
720 .IF <AX EQ -1> ;; ;AN000;
721 JMP PRINTBOX_DONE ;; ;AN000;
722 .ELSE ;; ;AN000;
723 OR STMT_ERROR,INVALID ;; ;AN000;
724 MOV PARSE_ERROR,YES ;; ;AN000;
725 MOV BUILD_STATE,NO ;; ;AN000;
726 .ENDIF ;; ;AN000;
727 .ENDIF ;; ;AN000;
728 ;; ;AN000;
729 CALL SYSPARSE ;; CHECK FOR EXTRA PARMS ;AN000;
730 .IF <AX NE -1> ;; ;AN000;
731 OR STMT_ERROR,INVALID ;; ;AN000;
732 MOV PARSE_ERROR,YES ;; ;AN000;
733 MOV BUILD_STATE,NO ;; ;AN000;
734 .ENDIF ;; ;AN000;
735 ;; ;AN000;
736 ;; ;AN000;
737PRINTBOX_DONE: ;; ;AN000;
738 ;; ;AN000;
739 .IF <BUILD_STATE EQ YES> AND ;; Store the PRINTBOX dimensions ;AN000;
740 .IF <PRINTBOX_MATCH EQ YES> ;; ;AN000;
741 PUSH DI ;; in the DISPLAYMODE block ;AN000;
742 MOV DI,BLOCK_START ;; ;AN000;
743 MOV AL,PROF_BOX_W ;; ;AN000;
744 MOV [BP+DI].BOX_WIDTH,AL ;; ;AN000;
745 MOV AL,PROF_BOX_H ;; ;AN000;
746 MOV [BP+DI].BOX_HEIGHT,AL ;; ;AN000;
747 POP DI ;; ;AN000;
748 .ENDIF ;; ;AN000;
749 ;; If we have a B&W printer then ;AN000;
750 ;; load the grey patterns for the ;AN000;
751 ;; requested print box size. ;AN000;
752 .IF <CUR_PRINTER_TYPE EQ BLACK_WHITE> NEAR ;AN000;
753 ;; ;AN000;
754 .IF <PROF_BOX_W NE 0> AND NEAR ;; Dimensions could also be 0 if the ;AN000;
755 .IF <PROF_BOX_H NE 0> NEAR ;; printbox ID does not apply to this;AN000;
756 ;; displaymode, so don't try for ;AN000;
757 ;; a pattern! ;AN000;
758 MOV BX,OFFSET TAB_DIRECTORY ;; ;AN000;
759 MOV CL,TAB_DIR_NB_ENTRIES ;; ;AN000;
760 XOR CH,CH ;; ;AN000;
761 MOV DI,BLOCK_START ;; ;AN000;
762 MOV AL,PROF_BOX_W ;; Requested box width ;AN000;
763 MOV AH,PROF_BOX_H ;; Requested box height ;AN000;
764 .REPEAT ;; ;AN000;
765 .IF <[BX].BOX_W_PAT EQ AL> AND ;; ;AN000;
766 .IF <[BX].BOX_H_PAT EQ AH> ;; ;AN000;
767 .LEAVE ;; ;AN000;
768 .ELSE ;; ;AN000;
769 ADD BX,SIZE TAB_ENTRY ;; ;AN000;
770 .ENDIF ;; ;AN000;
771 .LOOP ;; ;AN000;
772 .IF <ZERO CX> ;; ;AN000;
773 OR STMT_ERROR,INVALID ;; Unsupported box size ;AN000;
774 MOV PARSE_ERROR,YES ;; ;AN000;
775 MOV BUILD_STATE,NO ;; ;AN000;
776 .ELSE NEAR ;; Box size OK - pattern tab found ;AN000;
777 .IF <[BX].TAB_COPY NE -1> ;; Pointer is NOT null if the table ;AN000;
778 MOV AX,[BX].TAB_COPY ;; has already been copied to ;AN000;
779 ;; the shared data area. ;AN000;
780 .IF <BUILD_STATE EQ YES> AND ;; Point to the copy. ;AN000;
781 .IF <PRINTBOX_MATCH EQ YES> ;; Establish pointer to table ONLY ;AN000;
782 MOV [BP+DI].PATTERN_TAB_PTR,AX ;; if the PB ID matched. ;AN000;
783 MOV AL,[BX].NB_INT ;; Number of table entries (intensitie;AN000;
784 MOV [BP+DI].NUM_PATTERNS,AL ;; ;AN000;
785 .ENDIF ;; ;AN000;
786 .ELSE ;; Otherwise we have to copy it. ;AN000;
787 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
788 ;; Copy the table even if the printbox ID didn't match! ;AN000;
789 ;; This is a simple way to reserve enough space to allow reloading ;AN000;
790 ;; with a different PRINTBOX ID specified on the command line. ;AN000;
791 ;; This scheme avoids storing ;AN000;
792 ;; duplicate tables but may reserve slightly more space ;AN000;
793 ;; (probably only a hundred bytes or so) than ;AN000;
794 ;; could ever be required. The optimal solution (too ;AN000;
795 ;; complicated!) would involve keeping running totals for each ;AN000;
796 ;; PRINTBOX ID coded. ;AN000;
797 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
798 ;; ;AN000;
799 MOV DI,BLOCK_END ;; Copy it onto the end of the ;AN000;
800 ;; current block ;AN000;
801 MOV DX,DI ;; Save start addr of the copy ;AN000;
802 MOV [BX].TAB_COPY,DX ;; Store ptr to copy in the directory ;AN000;
803 MOV AX,[BX].TAB_SIZE ;; ;AN000;
804 CALL GROW_SHARED_DATA ;; Allocate room for the table ;AN000;
805 .IF <BUILD_STATE EQ YES> ;; ;AN000;
806 MOV CX,AX ;; Number of bytes to copy ;AN000;
807 PUSH SI ;; Save parse pointer ;AN000;
808 MOV SI,[BX].TAB_OFFSET ;; Source pointer ;AN000;
809 ADD DI,BP ;; make DI an absolute pointer (dest) ;AN000;
810 REP MOVSB ;; Move it! ;AN000;
811 POP SI ;; ;AN000;
812 .IF <PRINTBOX_MATCH EQ YES> ;; Establish pointer to table ONLY ;AN000;
813 MOV DI,BLOCK_START ;; Establish pointer in DISPLAYMODE;AN000;
814 MOV [BP+DI].PATTERN_TAB_PTR,DX ;; info ;AN000;
815 MOV AL,[BX].NB_INT ;; Number of table entries (intens);AN000;
816 MOV [BP+DI].NUM_PATTERNS,AL ;; ;AN000;
817 .ENDIF ;; ;AN000;
818 .ENDIF ;; ;AN000;
819 .ENDIF ;; ;AN000;
820 .ENDIF ;; ;AN000;
821 .ENDIF ;; ;AN000;
822 .ENDIF ;; ;AN000;
823 RET ;; ;AN000;
824 ;; ;AN000;
825 ;; ;AN000;
826PARSE_PRINTBOX ENDP ;AN000;
827 ;AN000;
828 ;; ;AN000;
829;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
830;; ;AN000;
831;; Module Name: ;AN000;
832;; PARSE_VERB ;AN000;
833;; ;AN000;
834;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
835 ;; ;AN000;
836VERB_PARSE_PARMS LABEL WORD ;; Parser control blocks to parse verb ;AN000;
837 DW VERB_P ;; Parser control blocks to parse verb ;AN000;
838 DB 2 ;; # of lists ;AN000;
839 DB 0 ;; # items in delimeter list ;AN000;
840 DB 1 ;; # items in end-of-line list ;AN000;
841 DB ';' ;; ';' used for comments ;AN000;
842 ;; ;AN000;
843VERB_P DB 0,1 ;; Required, max parms ;AN000;
844 DW VERB_P1 ;; ;AN000;
845 DB 0 ;; # Switches ;AN000;
846 DB 0 ;; # keywords ;AN000;
847 ;; ;AN000;
848VERB_P1 DW 2000H ;; simple string ;AN000;
849 DW 0002H ;; Capitalize using character table ;AN000;
850 DW RESULT_BUFFER ;; Result buffer ;AN000;
851 DW VERB_P1V ;; Value list ;AN000;
852 DB 0 ;; Synomyms ;AN000;
853 ;; ;AN000;
854VERB_P1V DB 3 ;; # of value lists ;AN000;
855 DB 0 ;; # of range numerics ;AN000;
856 DB 0 ;; # of discrete numerics ;AN000;
857 DB 9 ;; # of strings ;AN000;
858 DB 0 ;; tag: index into verb jump table ;AN000;
859 DW PRINTER_STRING ;; string offset ;AN000;
860 DB 2 ;; tag ;AN000;
861 DW DISPLAYMODE_STRING ;; string offset ;AN000;
862 DB 4 ;; tag ;AN000;
863 DW PRINTBOX_STRING ;; string offset ;AN000;
864 DB 6 ;; tag ;AN000;
865 DW SETUP_STRING ;; string offset ;AN000;
866 DB 8 ;; tag ;AN000;
867 DW RESTORE_STRING ;; string offset ;AN000;
868 DB 10 ;; tag ;AN000;
869 DW GRAPHICS_STRING ;; string offset ;AN000;
870 DB 12 ;; tag ;AN000;
871 DW COLORPRINT_STRING ;; string offset ;AN000;
872 DB 14 ;; tag ;AN000;
873 DW COLORSELECT_STRING ;; string offset ;AN000;
874 DB 16 ;; tag ;AN000;
875 DW DARKADJUST_STRING ;; string offset ;AN000;
876PRINTER_STRING DB 'PRINTER',0 ;; ;AN000;
877DISPLAYMODE_STRING DB 'DISPLAYMODE',0 ;; ;AN000;
878PRINTBOX_STRING DB 'PRINTBOX',0 ;; ;AN000;
879SETUP_STRING DB 'SETUP',0 ;; ;AN000;
880RESTORE_STRING DB 'RESTORE',0 ;; ;AN000;
881GRAPHICS_STRING DB 'GRAPHICS',0 ;; ;AN000;
882COLORPRINT_STRING DB 'COLORPRINT',0 ;; ;AN000;
883COLORSELECT_STRING DB 'COLORSELECT',0 ;; ;AN000;
884DARKADJUST_STRING DB 'DARKADJUST',0 ;; ;AN000;
885 ;; ;AN000;
886 ;; ;AN000;
887PARSE_VERB PROC ;; ;AN000;
888 ;; ;AN000;
889 MOV DI,OFFSET VERB_PARSE_PARMS ;; parse parms ;AN000;
890 MOV SI,OFFSET STMT_BUFFER ;; the line to parse ;AN000;
891 XOR DX,DX ;; ;AN000;
892 XOR CX,CX ;; ;AN000;
893 CALL SYSPARSE ;; ;AN000;
894 .IF <AX EQ 0> ;; ;AN000;
895 MOV BL,RESULT_TAG ;; ;AN000;
896 XOR BH,BH ;; return tag in BX ;AN000;
897 .ELSE ;; ;AN000;
898 .IF <AX NE -1> ;; syntax error ;AN000;
899 OR STMT_ERROR,INVALID ;; set error flag for caller ;AN000;
900 .ENDIF ;; ;AN000;
901 .ENDIF ;; ;AN000;
902 RET ;AN000;
903PARSE_VERB ENDP ;AN000;
904 ;; ;AN000;
905;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
906 ;AN000;
907LIMIT LABEL NEAR ;; ;AN000;
908CODE ENDS ;; ;AN000;
909 END ;AN000;
910;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;