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

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / GRAPHICS / GRLOAD3.ASM
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;
54 CODE 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 GRLOAD2.EXT ;; ;AN000;
64 INCLUDE GRPARSE.EXT ;; ;AN000;
65 INCLUDE GRPATTRN.STR ;; ;AN000;
66 INCLUDE GRPATTRN.EXT ;; ;AN000;
67 ;; ;AN000;
68 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
69 ;; ;AN000;
70 ;; Public Symbols ;AN000;
71 ;; ;AN000;
72 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
73 ;; ;AN000;
74 PUBLIC PARSE_GRAPHICS ;; ;AN000;
75 PUBLIC PARSE_COLORSELECT ;; ;AN000;
76 PUBLIC PARSE_COLORPRINT ;; ;AN000;
77 PUBLIC PARSE_DARKADJUST ;; ;AN000;
78 PUBLIC LIMIT ;; ;AN000;
79 ;; ;AN000;
80 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
81 ;; ;AN000;
82 ASSUME CS:CODE,DS:CODE ;; ;AN000;
83 ;; ;AN000;
84 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
85 ;; ;AN000;
86 ;; ;AN000;
87 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
88 ;; ;AN000;
89 ;; Profile Load Variables ;AN000;
90 ;; ;AN000;
91 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
92 ;; ;AN000;
93 NO EQU 0 ;; ;AN000;
94 YES EQU 1 ;; ;AN000;
95 ;; ;AN000;
96 RESULT_BUFFER LABEL BYTE ;; general purpose result buffer ;AN000;
97 DB ? ;; operand type ;AN000;
98 RESULT_TAG DB 0 ;; operand tag ;AN000;
99 DW ? ;; pointer to synonym/keyword ;AN000;
100 RESULT_VAL DB ?,?,?,? ;; returned numeric value ;AN000;
101 ;; ;AN000;
102 ;; ;AN000;
103 ;; ;AN000;
104 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
105 ;; ;AN000;
106 ;; Module Name: ;AN000;
107 ;; PARSE_GRAPHICS ;AN000;
108 ;; ;AN000;
109 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
110 ;; ;AN000;
111 GRAPHICS_PARSE_PARMS LABEL WORD ;; Parser control blocks ;AN000;
112 DW GRAPHICS_P ;; ;AN000;
113 DB 2 ;; # of lists ;AN000;
114 DB 0 ;; # items in delimeter list ;AN000;
115 DB 1 ;; # items in end-of-line list ;AN000;
116 DB ';' ;; ';' used for comments ;AN000;
117 ;; ;AN000;
118 GRAPHICS_P DB 0,1 ;; Required, max parms ;AN000;
119 DW GRAPHICS_P1 ;; ;AN000;
120 DB 0 ;; # Switches ;AN000;
121 DB 0 ;; # keywords ;AN000;
122 ;; ;AN000;
123 GRAPHICS_P1 DW 0A000H ;; Numeric OR string ;AN000;
124 DW 2 ;; Capitalize ;AN000;
125 DW RESULT_BUFFER ;; Result buffer ;AN000;
126 DW GRAPHICS_P1V ;; Value list ;AN000;
127 DB 0 ;; Synomyms ;AN000;
128 ;; ;AN000;
129 ;; ;AN000;
130 GRAPHICS_P1V DB 3 ;; # of value lists ;AN000;
131 DB 1 ;; # of range numerics ;AN000;
132 DB 1 ;; tag ;AN000;
133 DD 0,255 ;; range 0..255 ;AN000;
134 DB 0 ;; 0 - no actual numerics ;AN000;
135 DB 2 ;; 2 STRING VALUES ;AN000;
136 DB 2 ;; tag ;AN000;
137 DW LOWCOUNT_STR ;; ptr ;AN000;
138 DB 3 ;; tag ;AN000;
139 DW HIGHCOUNT_STR ;; ptr ;AN000;
140 ;; ;AN000;
141 lowcount_str db 'LOWCOUNT',0 ;; ;AN000;
142 HIGHcount_str db 'HIGHCOUNT',0 ;; ;AN000;
143 ;; ;AN000;
144 ;; ;AN000;
145 LOWCOUNT_FOUND DB NO ;; ;AN000;
146 HIGHCOUNT_FOUND DB NO ;; ;AN000;
147 ;; ;AN000;
148 ;; ;AN000;
149 PARSE_GRAPHICS PROC ;; ;AN000;
150 ;; ;AN000;
151 MOV CUR_STMT,GR ;; ;AN000;
152 .IF <BIT STMTS_DONE NAND DISP> ;; ;AN000;
153 OR STMT_ERROR,MISSING ;; ;AN000;
154 MOV PARSE_ERROR,YES ;; ;AN000;
155 MOV BUILD_STATE,NO ;; ;AN000;
156 .ENDIF ;; ;AN000;
157 ;; ;AN000;
158 .IF <BUILD_STATE EQ YES> ;; ;AN000;
159 MOV DI,BLOCK_START ;; ;AN000;
160 MOV AX,BLOCK_END ;; ;AN000;
161 MOV [BP+DI].GRAPHICS_ESC_PTR,AX ;; Set pointer to GRAPHICS seq ;AN000;
162 MOV [BP+DI].NUM_GRAPHICS_ESC,0 ;; Init sequence size ;AN000;
163 .ENDIF ;; ;AN000;
164 ;; ;AN000;
165 MOV LOWCOUNT_FOUND,NO ;; Flags to indicate whether the LOW ;AN000;
166 MOV HIGHCOUNT_FOUND,NO ;; and HIGHCOUNT parms were found ;AN000;
167 ;; ;AN000;
168 OR STMTS_DONE,GR ;; Indicate GRAPHICS found ;AN000;
169 ;; ;AN000;
170 MOV AX,PREV_STMT ;; Terminate any preceeding groups ;AN000;
171 OR GROUPS_DONE,AX ;; ;AN000;
172 ;; ;AN000;
173 MOV DI,OFFSET GRAPHICS_PARSE_PARMS ;; parse parms ;AN000;
174 ;; SI => the line to parse ;AN000;
175 XOR DX,DX ;; ;AN000;
176 .REPEAT ;; ;AN000;
177 XOR CX,CX ;; ;AN000;
178 CALL SYSPARSE ;; ;AN000;
179 ;; ;AN000;
180 .IF <AX EQ 0> NEAR ;; If PARM is valid ;AN000;
181 MOV BL,RESULT_TAG ;; ;AN000;
182 .SELECT ;; ;AN000;
183 .WHEN <BL EQ 1> ;; Escape byte ;AN000;
184 PUSH AX ;; ;AN000;
185 MOV AX,1 ;; Add a byte to the sequence ;AN000;
186 CALL GROW_SHARED_DATA ;; Update block end ;AN000;
187 .IF <BUILD_STATE EQ YES> ;; ;AN000;
188 PUSH DI ;; ;AN000;
189 MOV DI,BLOCK_START ;; ;AN000;
190 INC [BP+DI].NUM_GRAPHICS_ESC ;; Bump number of bytes in sequence ;AN000;
191 MOV DI,BLOCK_END ;; ;AN000;
192 MOV AL,RESULT_VAL ;; Get esc byte from result buffer ;AN000;
193 MOV [BP+DI-1],AL ;; Store at end of sequence ;AN000;
194 POP DI ;; ;AN000;
195 .ENDIF ;; ;AN000;
196 POP AX ;; ;AN000;
197 .WHEN <BL EQ 2> ;; LOWCOUNT ;AN000;
198 .IF <LOWCOUNT_FOUND EQ NO> ;; ;AN000;
199 MOV LOWCOUNT_FOUND,YES ;; ;AN000;
200 PUSH AX ;; ;AN000;
201 MOV AX,1 ;; Add a byte to the sequence ;AN000;
202 CALL GROW_SHARED_DATA ;; Update block end ;AN000;
203 .IF <BUILD_STATE EQ YES> ;; ;AN000;
204 PUSH DI ;; ;AN000;
205 MOV DI,BLOCK_START ;; ;AN000;
206 INC [BP+DI].NUM_GRAPHICS_ESC ;; Bump number of bytes in seq. ;AN000;
207 MOV AX,BLOCK_END ;; Save pointer to low byte ;AN000;
208 DEC AX ;; ;AN000;
209 MOV [BP+DI].LOW_BYT_COUNT_PTR,AX ;AN000;
210 MOV DI,AX ;; ;AN000;
211 MOV BYTE PTR[BP+DI],0 ;; Store 0 in place of count ;AN000;
212 POP DI ;; ;AN000;
213 .ENDIF ;; ;AN000;
214 POP AX ;; ;AN000;
215 ;; ;AN000;
216 .ELSE ;; ;AN000;
217 OR STMT_ERROR,INVALID ;; Duplicate LOWCOUNT parms ;AN000;
218 MOV PARSE_ERROR,YES ;; ;AN000;
219 MOV BUILD_STATE,NO ;; ;AN000;
220 .ENDIF ;; ;AN000;
221 .WHEN <BL EQ 3> ;; HIGHCOUNT ;AN000;
222 .IF <HIGHCOUNT_FOUND EQ NO> ;; ;AN000;
223 MOV HIGHCOUNT_FOUND,YES ;; ;AN000;
224 PUSH AX ;; ;AN000;
225 MOV AX,1 ;; Add a byte to the sequence ;AN000;
226 CALL GROW_SHARED_DATA ;; Update block end ;AN000;
227 .IF <BUILD_STATE EQ YES> ;; ;AN000;
228 PUSH DI ;; ;AN000;
229 MOV DI,BLOCK_START ;; ;AN000;
230 INC [BP+DI].NUM_GRAPHICS_ESC ;; Bump number of bytes in sequen;AN000;
231 MOV AX,BLOCK_END ;; Save pointer to high byte ;AN000;
232 DEC AX ;; Block end always points 1 ahead ;AN000;
233 MOV [BP+DI].HGH_BYT_COUNT_PTR,AX ;AN000;
234 MOV DI,AX ;; ;AN000;
235 MOV BYTE PTR[BP+DI],0 ;; Store 0 in place of count ;AN000;
236 POP DI ;; ;AN000;
237 .ENDIF ;; ;AN000;
238 POP AX ;; ;AN000;
239 .ELSE ;; ;AN000;
240 OR STMT_ERROR,INVALID ;; Duplicate HIGHCOUNT parms ;AN000;
241 MOV PARSE_ERROR,YES ;; ;AN000;
242 MOV BUILD_STATE,NO ;; ;AN000;
243 .ENDIF ;; ;AN000;
244 .ENDSELECT ;; ;AN000;
245 .ELSE NEAR ;; ;AN000;
246 .IF <AX NE -1> ;; ;AN000;
247 OR STMT_ERROR,INVALID ;; parm is invalid ;AN000;
248 MOV PARSE_ERROR,YES ;; ;AN000;
249 MOV BUILD_STATE,NO ;; ;AN000;
250 .ENDIF ;; ;AN000;
251 .ENDIF ;; ;AN000;
252 .UNTIL <AX EQ -1> NEAR ;; ;AN000;
253 ;; ;AN000;
254 .IF <LOWCOUNT_FOUND EQ NO> OR ;; ;AN000;
255 .IF <HIGHCOUNT_FOUND EQ NO> ;; Missing LOWCOUNT/HIGHCOUNT parms ;AN000;
256 OR STMT_ERROR,INVALID ;; ;AN000;
257 MOV PARSE_ERROR,YES ;; ;AN000;
258 MOV BUILD_STATE,NO ;; ;AN000;
259 .ENDIF ;; ;AN000;
260 ;; ;AN000;
261 RET ;; ;AN000;
262 ;; ;AN000;
263 PARSE_GRAPHICS ENDP ;; ;AN000;
264 ;; ;AN000;
265 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
266 ;; ;AN000;
267 ;; Module Name: ;AN000;
268 ;; PARSE_COLORSELECT ;AN000;
269 ;; ;AN000;
270 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
271 ;; ;AN000;
272 COLORSELECT_PARSE_PARMS LABEL WORD ;; Parser control blocks ;AN000;
273 DW COLORSELECT_P ;; ;AN000;
274 DB 2 ;; # of lists ;AN000;
275 DB 0 ;; # items in delimeter list ;AN000;
276 DB 1 ;; # items in end-of-line list ;AN000;
277 DB ';' ;; ';' used for comments ;AN000;
278 ;; ;AN000;
279 ;; ;AN000;
280 COLORSELECT_P LABEL BYTE ;; ;AN000;
281 CS_NUM_REQ DB 1,1 ;; Required, max parms ;AN000;
282 COLORSELECT_PARM LABEL WORD ;; ;AN000;
283 CS_POSITIONAL DW ? ;; Pointer to our positional ;AN000;
284 DB 0 ;; # Switches ;AN000;
285 DB 0 ;; # keywords ;AN000;
286 ;; ;AN000;
287 COLORSELECT_P0 DW 2000H ;; sTRING - display type ;AN000;
288 DW 2 ;; Capitalize ;AN000;
289 DW RESULT_BUFFER ;; Result buffer ;AN000;
290 DW COLORSELECT_P0V ;; Value list ;AN000;
291 DB 0 ;; Synomyms ;AN000;
292 ;; ;AN000;
293 COLORSELECT_P0V DB 0 ;; # of value lists ;AN000;
294 ; DB 0 ;; # of range numerics ;AN000;
295 ; DB 0 ;; # of discrete numerics ;AN000;
296 ; DB 1 ;; # of strings ;AN000;
297 ; DB 1 ;; tag ;AN000;
298 ;COLORSELECT_P0V1 DW ? ;; string ;AN000;
299 ;; ;AN000;
300 COLORSELECT_P1 DW 8001H ;; Numeric - escape sequence byte ;AN000;
301 DW 0 ;; No Capitalize ;AN000;
302 DW RESULT_BUFFER ;; Result buffer ;AN000;
303 DW COLORSELECT_P1V ;; Value list ;AN000;
304 DB 0 ;; Synomyms ;AN000;
305 ;; ;AN000;
306 COLORSELECT_P1V DB 1 ;; # of value lists ;AN000;
307 DB 1 ;; # of range numerics ;AN000;
308 DB 1 ;; tag ;AN000;
309 DD 1,255 ;; range 1..255 ;AN000;
310 ;; ;AN000;
311 ;; ;AN000;
312 ;; ;AN000;
313 SEQ_LENGTH_PTR DW 0 ;; Number of colorselect statements ;AN000;
314 ;; ;AN000;
315 ;; ;AN000;
316 ;; ;AN000;
317 PARSE_COLORSELECT PROC ;; ;AN000;
318 ;; ;AN000;
319 MOV CUR_STMT,COLS ;; ;AN000;
320 .IF <BIT STMTS_DONE NAND PRT> ;; PRINTER statemnet must have been ;AN000;
321 OR STMT_ERROR,MISSING ;; processed ;AN000;
322 MOV PARSE_ERROR,YES ;; ;AN000;
323 MOV BUILD_STATE,NO ;; ;AN000;
324 .ENDIF ;; ;AN000;
325 ;; ;AN000;
326 .IF <BIT STMTS_DONE AND DISP+COLP> ;; DISDPLAYMODE and COLORPRINT stmts ;AN000;
327 OR STMT_ERROR,SEQUENCE ;; should NOT have been processed ;AN000;
328 MOV PARSE_ERROR,YES ;; ;AN000;
329 MOV BUILD_STATE,NO ;; ;AN000;
330 .ENDIF ;; ;AN000;
331 ;; ;AN000;
332 .IF <BIT GROUPS_DONE AND COLS> ;; Check for a previous group of ;AN000;
333 OR STMT_ERROR,SEQUENCE ;; COLORSELECTS within this PTD ;AN000;
334 MOV PARSE_ERROR,YES ;; ;AN000;
335 MOV BUILD_STATE,NO ;; ;AN000;
336 .ENDIF ;; ;AN000;
337 ;; ;AN000;
338 .IF <BIT STMTS_DONE NAND COLS> ;; If first COLORSELECT... ;AN000;
339 MOV NUM_BANDS,0 ;; Init number of COLORSELECT bands ;AN000;
340 .IF <BUILD_STATE EQ YES> ;; Update count and pointer in the ;AN000;
341 MOV AX,BLOCK_END ;; Shared Data Area header ;AN000;
342 MOV [BP].COLORSELECT_PTR,AX ;; Set pointer to COLORSELECT info ;AN000;
343 MOV [BP].NUM_PRT_BANDS,0 ;; Init NUMBER OF COLORSELECTS ;AN000;
344 .ENDIF ;; ;AN000;
345 .ENDIF ;; ;AN000;
346 ;; ;AN000;
347 OR STMTS_DONE,COLS ;; Indicate found ;AN000;
348 .IF <PREV_STMT NE COLS> THEN ;; Terminate any preceeding groups ;AN000;
349 MOV AX,PREV_STMT ;; except for COLORSELECT ;AN000;
350 OR GROUPS_DONE,AX ;; ;AN000;
351 .ENDIF ;; ;AN000;
352 ;; ;AN000;
353 MOV AX,1 ;; Make room for sequence length field ;AN000;
354 CALL GROW_SHARED_DATA ;; ;AN000;
355 .IF <BUILD_STATE EQ YES> ;; ;AN000;
356 INC [BP].NUM_PRT_BANDS ;; Inc number of selects ;AN000;
357 MOV DI,BLOCK_END ;; ;AN000;
358 MOV BYTE PTR [BP+DI-1],0 ;; Init sequence length field ;AN000;
359 LEA AX,[DI-1] ;; ;AN000;
360 MOV SEQ_LENGTH_PTR,AX ;; Save pointer to length of sequence ;AN000;
361 .ENDIF ;; ;AN000;
362 ;; ;AN000;
363 MOV DI,OFFSET COLORSELECT_PARSE_PARMS ;; parse parms ;AN000;
364 MOV CS_NUM_REQ,1 ;; Change to 1 required parameters ;AN000;
365 MOV AX,OFFSET COLORSELECT_P0 ;; Point to control block for the band ;AN000;
366 MOV CS_POSITIONAL,AX ;; ID. (Dealing with only 1 positional ;AN000;
367 ;; parameter at a time was the only way ;AN000;
368 ;; I could get SYSPARSE to handle ;AN000;
369 ;; the COLORSELECT syntax!) ;AN000;
370 ;; SI => the line to parse ;AN000;
371 XOR DX,DX ;; ;AN000;
372 XOR CX,CX ;; ;AN000;
373 ;; ;AN000;
374 CALL SYSPARSE ;; PARSE the band ID ;AN000;
375 .IF <AX NE 0> ;; ;AN000;
376 OR STMT_ERROR,INVALID ;; ;AN000;
377 MOV PARSE_ERROR,YES ;; ;AN000;
378 MOV BUILD_STATE,NO ;; ;AN000;
379 RET ;; statement. ;AN000;
380 .ENDIF ;; ;AN000;
381 ;; ;AN000;
382 PUSH ES ;; We got a band id........ ;AN000;
383 PUSH DI ;; ;AN000;
384 ;; ;AN000;
385 LES DI,DWORD PTR RESULT_VAL ;; Get pointer to the parsed band id ;AN000;
386 .IF <<BYTE PTR ES:[DI+1]> NE 0> ;; Make sure the band id is only ;AN000;
387 OR STMT_ERROR,INVALID ;; one byte long ;AN000;
388 MOV PARSE_ERROR,YES ;; ;AN000;
389 MOV BUILD_STATE,NO ;; ;AN000;
390 .ENDIF ;; ;AN000;
391 ;; ;AN000;
392 MOV BL,NUM_BANDS ;; ;AN000;
393 XOR BH,BH ;; ;AN000;
394 .IF <BX EQ MAX_BANDS> THEN ;; Watch out for too many COLORSELECTs ;AN000;
395 OR STMT_ERROR,SEQUENCE ;; ;AN000;
396 MOV PARSE_ERROR,YES ;; ;AN000;
397 MOV BUILD_STATE,NO ;; ;AN000;
398 .ELSE ;; ;AN000;
399 SHL BX,1 ;; calc index to store band in value list;AN000;
400 MOV AL,ES:[DI] ;; get BAND ID FROM PARSEr ;AN000;
401 MOV BAND_VAL_LIST[BX],AL ;; ;AN000;
402 INC NUM_BANDS ;; bump number of bands ;AN000;
403 .ENDIF ;; ;AN000;
404 ;; ;AN000;
405 POP DI ;; ;AN000;
406 POP ES ;; ;AN000;
407 ;; ;AN000;
408 ;; ;AN000;
409 MOV AX,OFFSET COLORSELECT_P1 ;; Switch to numeric positional parm!!! ;AN000;
410 MOV CS_POSITIONAL,AX ;; ;AN000;
411 MOV CS_NUM_REQ,0 ;; Change to 0 required parameters ;AN000;
412 XOR DX,DX ;; PARSE the sequence of escape bytes ;AN000;
413 .REPEAT ;; ;AN000;
414 XOR CX,CX ;; ;AN000;
415 CALL SYSPARSE ;; ;AN000;
416 .IF <AX EQ 0> ;; If esc byte is valid ;AN000;
417 PUSH AX ;; ;AN000;
418 MOV AX,1 ;; Add a byte to the sequence ;AN000;
419 CALL GROW_SHARED_DATA ;; Update block end ;AN000;
420 .IF <BUILD_STATE EQ YES> ;; ;AN000;
421 PUSH DI ;; ;AN000;
422 MOV DI,SEQ_LENGTH_PTR ;; ;AN000;
423 INC byte ptr [BP+DI] ;; Bump number of bytes in sequence ;AN000;
424 MOV DI,BLOCK_END ;; ;AN000;
425 MOV AL,RESULT_VAL ;; Get esc byte from result buffer ;AN000;
426 MOV [BP+DI-1],AL ;; Store at end of sequence ;AN000;
427 POP DI ;; ;AN000;
428 .ENDIF ;; ;AN000;
429 POP AX ;; ;AN000;
430 .ELSE ;; ;AN000;
431 .IF <AX NE -1> ;; ;AN000;
432 OR STMT_ERROR,INVALID ;; parm is invalid ;AN000;
433 MOV PARSE_ERROR,YES ;; ;AN000;
434 MOV BUILD_STATE,NO ;; ;AN000;
435 .ENDIF ;; ;AN000;
436 .ENDIF ;; ;AN000;
437 .UNTIL <AX EQ -1> NEAR ;; ;AN000;
438 ;; ;AN000;
439 ;; ;AN000;
440 RET ;; ;AN000;
441 ;; ;AN000;
442 PARSE_COLORSELECT ENDP ;; ;AN000;
443 ;; ;AN000;
444 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
445 ;; ;AN000;
446 ;; Module Name: ;AN000;
447 ;; PARSE_COLORPRINT ;AN000;
448 ;; ;AN000;
449 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
450 ;; ;AN000;
451 COLORPRINT_PARSE_PARMS LABEL WORD ;; Parser control blocks ;AN000;
452 DW COLORPRINT_P ;; ;AN000;
453 DB 2 ;; # of lists ;AN000;
454 DB 0 ;; # items in delimeter list ;AN000;
455 DB 1 ;; # items in end-of-line list ;AN000;
456 DB ';' ;; ';' used for comments ;AN000;
457 ;; ;AN000;
458 ;; ;AN000;
459 COLORPRINT_P LABEL BYTE ;; ;AN000;
460 DB 3,4 ;; Required,MAX ;AN000;
461 DW COLORPRINT_P0 ;; Numeric: Red value ;AN000;
462 DW COLORPRINT_P0 ;; Green value ;AN000;
463 DW COLORPRINT_P0 ;; Blue value ;AN000;
464 DW COLORPRINT_P1 ;; Band ID ... REPEATING ;AN000;
465 DB 0 ;; # Switches ;AN000;
466 DB 0 ;; # keywords ;AN000;
467 ;; ;AN000;
468 COLORPRINT_P0 DW 8000H ;; Numeric - RGB value ;AN000;
469 DW 0 ;; No Capitalize ;AN000;
470 DW RESULT_BUFFER ;; Result buffer ;AN000;
471 DW COLORPRINT_P0V ;; Value list ;AN000;
472 DB 0 ;; Synomyms ;AN000;
473 ;; ;AN000;
474 COLORPRINT_P0V DB 1 ;; # of value lists ;AN000;
475 DB 1 ;; # of range numerics ;AN000;
476 DB 1 ;; tag ;AN000;
477 DD 0,63 ;; range 0..63 ;AN000;
478 ;; ;AN000;
479 COLORPRINT_P1 DW 2001H ;; sTRING - Band ID ;AN000;
480 DW 2 ;; Capitalize ;AN000;
481 DW RESULT_BUFFER ;; Result buffer ;AN000;
482 DW COLORPRINT_P1V ;; Value list ;AN000;
483 DB 0 ;; Synomyms ;AN000;
484 ;; ;AN000;
485 COLORPRINT_P1V DB 3 ;; # of value lists ;AN000;
486 DB 0 ;; 0 - no range numerics ;AN000;
487 DB 0 ;; 0 - no actual numerics ;AN000;
488 NUM_BANDS DB 0 ;; number of band values ;AN000;
489 DB 01H ;; tag: TAGS ARE BAND MASKS ;AN000;
490 DW BAND_PTR_1 ;; ptr ;AN000;
491 DB 02H ;; tag ;AN000;
492 DW BAND_PTR_2 ;; ptr ;AN000;
493 DB 04H ;; tag ;AN000;
494 DW BAND_PTR_3 ;; ptr ;AN000;
495 DB 08H ;; tag ;AN000;
496 DW BAND_PTR_4 ;; ptr ;AN000;
497 DB 10H ;; tag ;AN000;
498 DW BAND_PTR_5 ;; ptr ;AN000;
499 DB 20H ;; tag ;AN000;
500 DW BAND_PTR_6 ;; ptr ;AN000;
501 DB 40H ;; tag ;AN000;
502 DW BAND_PTR_7 ;; ptr ;AN000;
503 DB 80H ;; tag ;AN000;
504 DW BAND_PTR_8 ;; ptr ;AN000;
505 ;; ;AN000;
506 MAX_BANDS EQU 8 ;; ;AN000;
507 ;; ;AN000;
508 BAND_VAL_LIST LABEL BYTE ;; ;AN000;
509 BAND_PTR_1 DB ?,0 ;; ;AN000;
510 BAND_PTR_2 DB ?,0 ;; ;AN000;
511 BAND_PTR_3 DB ?,0 ;; ;AN000;
512 BAND_PTR_4 DB ?,0 ;; ;AN000;
513 BAND_PTR_5 DB ?,0 ;; ;AN000;
514 BAND_PTR_6 DB ?,0 ;; ;AN000;
515 BAND_PTR_7 DB ?,0 ;; ;AN000;
516 BAND_PTR_8 DB ?,0 ;; ;AN000;
517 ;; ;AN000;
518 ;; ;AN000;
519 PARSE_COLORPRINT PROC ;; ;AN000;
520 ;; ;AN000;
521 MOV CUR_STMT,COLP ;; ;AN000;
522 .IF <BIT STMTS_DONE NAND PRT> ;; PRINTER statemnet must have been ;AN000;
523 OR STMT_ERROR,MISSING ;; processed ;AN000;
524 MOV PARSE_ERROR,YES ;; ;AN000;
525 MOV BUILD_STATE,NO ;; ;AN000;
526 .ENDIF ;; ;AN000;
527 ;; ;AN000;
528 .IF <BIT STMTS_DONE AND DISP> ;; DISPLAYMODE stmts ;AN000;
529 OR STMT_ERROR,SEQUENCE ;; should NOT have been processed ;AN000;
530 MOV PARSE_ERROR,YES ;; ;AN000;
531 MOV BUILD_STATE,NO ;; ;AN000;
532 .ENDIF ;; ;AN000;
533 ;; ;AN000;
534 .IF <BIT GROUPS_DONE AND COLP> ;; Check for a previous group of ;AN000;
535 OR STMT_ERROR,SEQUENCE ;; COLORPRINTS within this PTD ;AN000;
536 MOV PARSE_ERROR,YES ;; ;AN000;
537 MOV BUILD_STATE,NO ;; ;AN000;
538 .ENDIF ;; ;AN000;
539 ;; ;AN000;
540 MOV CUR_PRINTER_TYPE,COLOR ;; ;AN000;
541 ;; ;AN000;
542 .IF <BIT STMTS_DONE NAND COLP> ;; If first COLORPRINT... ;AN000;
543 .IF <BUILD_STATE EQ YES> ;; Update count and pointer in the ;AN000;
544 MOV AX,BLOCK_END ;; Shared Data Area header ;AN000;
545 MOV [BP].COLORPRINT_PTR,AX ;; Set pointer to COLORPRINT info ;AN000;
546 MOV [BP].PRINTER_TYPE,COLOR ;; ;AN000;
547 MOV [BP].NUM_PRT_COLOR,0 ;; Init NUMBER OF COLORPRINTS ;AN000;
548 .ENDIF ;; ;AN000;
549 .ENDIF ;; ;AN000;
550 ;; ;AN000;
551 .IF <BUILD_STATE EQ YES> ;; ;AN000;
552 INC [BP].NUM_PRT_COLOR ;; Inc number of selects ;AN000;
553 .ENDIF ;; ;AN000;
554 ;; ;AN000;
555 OR STMTS_DONE,COLP ;; Indicate found ;AN000;
556 .IF <PREV_STMT NE COLP> THEN ;; Terminate any preceeding groups ;AN000;
557 MOV AX,PREV_STMT ;; except for COLORPRINT ;AN000;
558 OR GROUPS_DONE,AX ;; ;AN000;
559 .ENDIF ;; ;AN000;
560 ;; ;AN000;
561 MOV AX,BLOCK_END ;; Start a new block ;AN000;
562 MOV BLOCK_START,AX ;; ;AN000;
563 MOV AX,SIZE COLORPRINT_STR ;; Make room for COLORPRINT info ;AN000;
564 CALL GROW_SHARED_DATA ;; ;AN000;
565 ;; ;AN000;
566 MOV DI,OFFSET COLORPRINT_PARSE_PARMS ;; parse parms ;AN000;
567 ;; SI => the line to parse ;AN000;
568 XOR DX,DX ;; ;AN000;
569 XOR CX,CX ;; ;AN000;
570 ;; ;AN000;
571 CALL SYSPARSE ;; PARSE the RED value ;AN000;
572 .IF <AX NE 0> ;; ;AN000;
573 OR STMT_ERROR,INVALID ;; ;AN000;
574 MOV PARSE_ERROR,YES ;; ;AN000;
575 MOV BUILD_STATE,NO ;; ;AN000;
576 .ELSE ;; ;AN000;
577 .IF <BUILD_STATE EQ YES> ;; ;AN000;
578 PUSH DI ;; ;AN000;
579 MOV DI,BLOCK_START ;; ;AN000;
580 MOV AL,RESULT_VAL ;; Store RED value in COLORPRINT info ;AN000;
581 MOV [BP+DI].RED,AL ;; ;AN000;
582 POP DI ;; ;AN000;
583 .ENDIF ;; ;AN000;
584 .ENDIF ;; ;AN000;
585 ;; ;AN000;
586 CALL SYSPARSE ;; PARSE the GREEN value ;AN000;
587 .IF <AX NE 0> ;; ;AN000;
588 OR STMT_ERROR,INVALID ;; ;AN000;
589 MOV PARSE_ERROR,YES ;; ;AN000;
590 MOV BUILD_STATE,NO ;; ;AN000;
591 .ELSE ;; ;AN000;
592 .IF <BUILD_STATE EQ YES> ;; ;AN000;
593 PUSH DI ;; ;AN000;
594 MOV DI,BLOCK_START ;; ;AN000;
595 MOV AL,RESULT_VAL ;; Store GREEN value in COLORPRINT info ;AN000;
596 MOV [BP+DI].GREEN,AL ;; ;AN000;
597 POP DI ;; ;AN000;
598 .ENDIF ;; ;AN000;
599 .ENDIF ;; ;AN000;
600 ;; ;AN000;
601 CALL SYSPARSE ;; PARSE the BLUE value ;AN000;
602 .IF <AX NE 0> ;; ;AN000;
603 OR STMT_ERROR,INVALID ;; ;AN000;
604 MOV PARSE_ERROR,YES ;; ;AN000;
605 MOV BUILD_STATE,NO ;; ;AN000;
606 .ELSE ;; ;AN000;
607 .IF <BUILD_STATE EQ YES> ;; ;AN000;
608 PUSH DI ;; ;AN000;
609 MOV DI,BLOCK_START ;; ;AN000;
610 MOV AL,RESULT_VAL ;; Store BLUE value in COLORPRINT info ;AN000;
611 MOV [BP+DI].BLUE,AL ;; ;AN000;
612 POP DI ;; ;AN000;
613 .ENDIF ;; ;AN000;
614 .ENDIF ;; ;AN000;
615 ;; ;AN000;
616 .IF <BUILD_STATE EQ YES> ;; ;AN000;
617 PUSH DI ;; ;AN000;
618 MOV DI,BLOCK_START ;; ;AN000;
619 MOV [BP+DI].SELECT_MASK,0 ;; Initialize band select mask ;AN000;
620 POP DI ;; ;AN000;
621 .ENDIF ;; ;AN000;
622 XOR DX,DX ;; For each band found "OR" the item ;AN000;
623 .REPEAT ;; tag into the select mask ;AN000;
624 MOV CX,3 ;; Avoid getting too many parms error ;AN000;
625 CALL SYSPARSE ;; from parser ;AN000;
626 .IF <AX EQ 0> ;; ;AN000;
627 .IF <BUILD_STATE EQ YES> ;; ;AN000;
628 PUSH DI ;; ;AN000;
629 MOV DI,BLOCK_START ;; ;AN000;
630 MOV AL,RESULT_TAG ;; ;AN000;
631 OR [BP+DI].SELECT_MASK,AL ;; OR the mask for this band into the ;AN000;
632 ;; select mask for this color ;AN000;
633 POP DI ;; ;AN000;
634 .ENDIF ;; ;AN000;
635 .ELSE ;; ;AN000;
636 .IF <AX NE -1> ;; ;AN000;
637 OR STMT_ERROR,INVALID ;; parm is invalid ;AN000;
638 MOV PARSE_ERROR,YES ;; ;AN000;
639 MOV BUILD_STATE,NO ;; ;AN000;
640 .ENDIF ;; ;AN000;
641 .ENDIF ;; ;AN000;
642 .UNTIL <AX EQ -1> NEAR ;; ;AN000;
643 ;; ;AN000;
644 RET ;; ;AN000;
645 ;; ;AN000;
646 PARSE_COLORPRINT ENDP ;; ;AN000;
647 ;; ;AN000;
648 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
649 ;; ;AN000;
650 ;; ;AN000;
651 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
652 ;; ;AN000;
653 ;; Module Name: ;AN000;
654 ;; PARSE_DARKADJUST ;AN000;
655 ;; ;AN000;
656 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
657 ;AN000;
658 DARKADJUST_PARSE_PARMS LABEL WORD ;; Parser control blocks ;AN000;
659 DW DARKADJUST_P ;; ;AN000;
660 DB 2 ;; # of lists ;AN000;
661 DB 0 ;; # items in delimeter list ;AN000;
662 DB 1 ;; # items in end-of-line list ;AN000;
663 DB ';' ;; ';' used for comments ;AN000;
664 ;; ;AN000;
665 ;; ;AN000;
666 DARKADJUST_P LABEL BYTE ;; ;AN000;
667 DB 1,1 ;; Required,MAX ;AN000;
668 DW DARKADJUST_P0 ;; Numeric: adjust value ;AN000;
669 DB 0 ;; # Switches ;AN000;
670 DB 0 ;; # keywords ;AN000;
671 ;; ;AN000;
672 DARKADJUST_P0 DW 4000H ;; Signed Numeric - adjust value ;AN000;
673 DW 0 ;; No Capitalize ;AN000;
674 DW RESULT_BUFFER ;; Result buffer ;AN000;
675 DW DARKADJUST_P0V ;; Value list ;AN000;
676 DB 0 ;; Synomyms ;AN000;
677 ;; ;AN000;
678 DARKADJUST_P0V DB 1 ;; # of value lists ;AN000;
679 DB 1 ;; # of range numerics ;AN000;
680 DB 1 ;; tag ;AN000;
681 DD -63,63 ;; range -63,63 ;AN000;
682 ;;;;***********************************;; ;AN000;
683 ;; ;AN000;
684 ;AN000;
685 PARSE_DARKADJUST PROC ;; ;AN000;
686 ;; ;AN000;
687 MOV CUR_STMT,DARK ;; ;AN000;
688 .IF <BIT STMTS_DONE NAND PRT> ;; PRINTER statemnet must have been ;AN000;
689 OR STMT_ERROR,MISSING ;; processed ;AN000;
690 MOV PARSE_ERROR,YES ;; ;AN000;
691 MOV BUILD_STATE,NO ;; ;AN000;
692 .ENDIF ;; ;AN000;
693 ;; ;AN000;
694 ;; ;AN000;
695 OR STMTS_DONE,DARK ;; Indicate found ;AN000;
696 ;; Terminate any preceeding groups ;AN000;
697 MOV AX,PREV_STMT ;; ;AN000;
698 OR GROUPS_DONE,AX ;; ;AN000;
699 ;; ;AN000;
700 MOV DI,OFFSET DARKADJUST_PARSE_PARMS ;; parse parms ;AN000;
701 ;; SI => the line to parse ;AN000;
702 XOR DX,DX ;; ;AN000;
703 XOR CX,CX ;; ;AN000;
704 ;; ;AN000;
705 CALL SYSPARSE ;; PARSE the ADJUST VALUE ;AN000;
706 .IF <AX NE 0> ;; ;AN000;
707 OR STMT_ERROR,INVALID ;; ;AN000;
708 MOV PARSE_ERROR,YES ;; ;AN000;
709 MOV BUILD_STATE,NO ;; ;AN000;
710 .ELSE ;; ;AN000;
711 .IF <BUILD_STATE EQ YES> ;; ;AN000;
712 MOV AL,RESULT_VAL ;; ;AN000;
713 MOV [BP].DARKADJUST_VALUE,AL ;; ;AN000;
714 .ENDIF ;; ;AN000;
715 CALL SYSPARSE ;; CHECK FOR EXTRA PARMS ;AN000;
716 .IF <AX NE -1> ;; ;AN000;
717 OR STMT_ERROR,INVALID ;; ;AN000;
718 MOV PARSE_ERROR,YES ;; ;AN000;
719 MOV BUILD_STATE,NO ;; ;AN000;
720 .ENDIF ;; ;AN000;
721 .ENDIF ;; ;AN000;
722 ;; ;AN000;
723 RET ;; ;AN000;
724 ;; ;AN000;
725 PARSE_DARKADJUST ENDP ;; ;AN000;
726 ;AN000;
727 LIMIT LABEL NEAR ;; ;AN000;
728 CODE ENDS ;; ;AN000;
729 END ;AN000;