2 TITLE DOS
- GRAPHICS Command
- Profile
Load Modules
#2 ;AN000;
4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
5 ;; DOS - GRAPHICS Command
6 ;; (C) Copyright 1988 Microsoft
8 ;; File Name: GRLOAD.ASM ;AN000;
11 ;; Description: ;AN000;
12 ;; ------------ ;AN000;
13 ;; This file contains the modules used to load the ;AN000;
14 ;; GRAPHICS profile into resident memory. ;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;
25 ;; Documentation Reference: ;AN000;
26 ;; ------------------------ ;AN000;
27 ;; PLACID Functional Specifications ;AN000;
28 ;; OASIS High Level Design ;AN000;
29 ;; OASIS GRAPHICS I1 Overview ;AN000;
31 ;; Procedures Contained in This File: ;AN000;
32 ;; ---------------------------------- ;AN000;
33 ;; LOAD_PROFILE - Main module for profile loading ;AN000;
35 ;; Include Files Required: ;AN000;
36 ;; ----------------------- ;AN000;
37 ;; ?????????? - Externals for profile loading modules ;AN000;
39 ;; External Procedure References: ;AN000;
40 ;; ------------------------------ ;AN000;
43 ;; Linkage Instructions: ;AN000;
44 ;; --------------------- ;AN000;
45 ;; Refer to GRAPHICS.ASM ;AN000;
47 ;; Change History: ;AN000;
48 ;; --------------- ;AN000;
51 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
54 CODE SEGMENT PUBLIC 'CODE' BYTE ;; ;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;
68 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
70 ;; Public Symbols ;AN000;
72 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;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;
80 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
82 ASSUME
CS:CODE,DS:CODE ;; ;AN000;
84 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
87 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
89 ;; Profile Load Variables ;AN000;
91 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;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;
104 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
106 ;; Module Name: ;AN000;
107 ;; PARSE_GRAPHICS ;AN000;
109 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;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;
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;
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;
130 GRAPHICS_P1V
DB 3 ;; # of value lists ;AN000;
131 DB 1 ;; # of range numerics ;AN000;
133 DD 0,255 ;; range 0..255 ;AN000;
134 DB 0 ;; 0 - no actual numerics ;AN000;
135 DB 2 ;; 2 STRING VALUES ;AN000;
137 DW LOWCOUNT_STR
;; ptr ;AN000;
139 DW HIGHCOUNT_STR
;; ptr ;AN000;
141 lowcount_str db 'LOWCOUNT',0 ;; ;AN000;
142 HIGHcount_str db 'HIGHCOUNT',0 ;; ;AN000;
145 LOWCOUNT_FOUND
DB NO
;; ;AN000;
146 HIGHCOUNT_FOUND
DB NO
;; ;AN000;
149 PARSE_GRAPHICS PROC
;; ;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;
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;
165 MOV LOWCOUNT_FOUND
,NO
;; Flags to indicate whether the LOW ;AN000;
166 MOV HIGHCOUNT_FOUND
,NO
;; and HIGHCOUNT parms were found ;AN000;
168 OR STMTS_DONE
,GR
;; Indicate GRAPHICS found ;AN000;
170 MOV AX,PREV_STMT
;; Terminate any preceeding groups ;AN000;
171 OR GROUPS_DONE
,AX ;; ;AN000;
173 MOV DI,OFFSET GRAPHICS_PARSE_PARMS
;; parse parms ;AN000;
174 ;; SI => the line to parse ;AN000;
178 CALL SYSPARSE
;; ;AN000;
180 .IF <AX EQ 0> NEAR ;; If PARM is valid ;AN000;
181 MOV BL,RESULT_TAG
;; ;AN000;
183 .WHEN
<BL EQ 1> ;; Escape byte ;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;
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;
197 .WHEN
<BL EQ 2> ;; LOWCOUNT ;AN000;
198 .IF <LOWCOUNT_FOUND
EQ NO
> ;; ;AN000;
199 MOV LOWCOUNT_FOUND
,YES
;; ;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;
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;
209 MOV [BP+DI].LOW_BYT_COUNT_PTR
,AX ;AN000;
211 MOV BYTE PTR[BP+DI],0 ;; Store 0 in place of count ;AN000;
217 OR STMT_ERROR
,INVALID
;; Duplicate LOWCOUNT parms ;AN000;
218 MOV PARSE_ERROR
,YES
;; ;AN000;
219 MOV BUILD_STATE
,NO
;; ;AN000;
221 .WHEN
<BL EQ 3> ;; HIGHCOUNT ;AN000;
222 .IF <HIGHCOUNT_FOUND
EQ NO
> ;; ;AN000;
223 MOV HIGHCOUNT_FOUND
,YES
;; ;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;
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;
235 MOV BYTE PTR[BP+DI],0 ;; Store 0 in place of count ;AN000;
240 OR STMT_ERROR
,INVALID
;; Duplicate HIGHCOUNT parms ;AN000;
241 MOV PARSE_ERROR
,YES
;; ;AN000;
242 MOV BUILD_STATE
,NO
;; ;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;
252 .UNTIL
<AX EQ -1> NEAR ;; ;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;
263 PARSE_GRAPHICS ENDP
;; ;AN000;
265 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
267 ;; Module Name: ;AN000;
268 ;; PARSE_COLORSELECT ;AN000;
270 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;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;
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;
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;
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;
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;
306 COLORSELECT_P1V
DB 1 ;; # of value lists ;AN000;
307 DB 1 ;; # of range numerics ;AN000;
309 DD 1,255 ;; range 1..255 ;AN000;
313 SEQ_LENGTH_PTR
DW 0 ;; Number of colorselect statements ;AN000;
317 PARSE_COLORSELECT PROC
;; ;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;
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;
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;
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;
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;
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;
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;
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;
382 PUSH ES ;; We got a band id........ ;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;
392 MOV BL,NUM_BANDS
;; ;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;
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;
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;
415 CALL SYSPARSE
;; ;AN000;
416 .IF <AX EQ 0> ;; If esc byte is valid ;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;
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;
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;
437 .UNTIL
<AX EQ -1> NEAR ;; ;AN000;
442 PARSE_COLORSELECT ENDP
;; ;AN000;
444 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
446 ;; Module Name: ;AN000;
447 ;; PARSE_COLORPRINT ;AN000;
449 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;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;
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;
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;
474 COLORPRINT_P0V
DB 1 ;; # of value lists ;AN000;
475 DB 1 ;; # of range numerics ;AN000;
477 DD 0,63 ;; range 0..63 ;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;
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;
506 MAX_BANDS EQU
8 ;; ;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;
519 PARSE_COLORPRINT PROC
;; ;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;
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;
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;
540 MOV CUR_PRINTER_TYPE
,COLOR
;; ;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;
551 .IF <BUILD_STATE
EQ YES
> ;; ;AN000;
552 INC [BP].NUM_PRT_COLOR
;; Inc number of selects ;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;
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;
566 MOV DI,OFFSET COLORPRINT_PARSE_PARMS
;; parse parms ;AN000;
567 ;; SI => the line to parse ;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;
577 .IF <BUILD_STATE
EQ YES
> ;; ;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;
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;
592 .IF <BUILD_STATE
EQ YES
> ;; ;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;
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;
607 .IF <BUILD_STATE
EQ YES
> ;; ;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;
616 .IF <BUILD_STATE
EQ YES
> ;; ;AN000;
618 MOV DI,BLOCK_START
;; ;AN000;
619 MOV [BP+DI].SELECT_MASK
,0 ;; Initialize band select mask ;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;
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;
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;
642 .UNTIL
<AX EQ -1> NEAR ;; ;AN000;
646 PARSE_COLORPRINT ENDP
;; ;AN000;
648 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
651 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
653 ;; Module Name: ;AN000;
654 ;; PARSE_DARKADJUST ;AN000;
656 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;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;
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;
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;
678 DARKADJUST_P0V
DB 1 ;; # of value lists ;AN000;
679 DB 1 ;; # of range numerics ;AN000;
681 DD -63,63 ;; range -63,63 ;AN000;
682 ;;;;***********************************;; ;AN000;
685 PARSE_DARKADJUST PROC
;; ;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;
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;
700 MOV DI,OFFSET DARKADJUST_PARSE_PARMS
;; parse parms ;AN000;
701 ;; SI => the line to parse ;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;
711 .IF <BUILD_STATE
EQ YES
> ;; ;AN000;
712 MOV AL,RESULT_VAL
;; ;AN000;
713 MOV [BP].DARKADJUST_VALUE
,AL ;; ;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;
725 PARSE_DARKADJUST ENDP
;; ;AN000;
727 LIMIT
LABEL NEAR ;; ;AN000;