summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/GRAPHICS/GRLOAD3.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/GRLOAD3.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/GRLOAD3.ASM')
-rw-r--r--v4.0/src/CMD/GRAPHICS/GRLOAD3.ASM729
1 files changed, 729 insertions, 0 deletions
diff --git a/v4.0/src/CMD/GRAPHICS/GRLOAD3.ASM b/v4.0/src/CMD/GRAPHICS/GRLOAD3.ASM
new file mode 100644
index 0000000..ce9d1d4
--- /dev/null
+++ b/v4.0/src/CMD/GRAPHICS/GRLOAD3.ASM
@@ -0,0 +1,729 @@
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 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;
93NO EQU 0 ;; ;AN000;
94YES EQU 1 ;; ;AN000;
95 ;; ;AN000;
96RESULT_BUFFER LABEL BYTE ;; general purpose result buffer ;AN000;
97 DB ? ;; operand type ;AN000;
98RESULT_TAG DB 0 ;; operand tag ;AN000;
99 DW ? ;; pointer to synonym/keyword ;AN000;
100RESULT_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;
111GRAPHICS_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;
118GRAPHICS_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;
123GRAPHICS_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;
130GRAPHICS_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;
141lowcount_str db 'LOWCOUNT',0 ;; ;AN000;
142HIGHcount_str db 'HIGHCOUNT',0 ;; ;AN000;
143 ;; ;AN000;
144 ;; ;AN000;
145LOWCOUNT_FOUND DB NO ;; ;AN000;
146HIGHCOUNT_FOUND DB NO ;; ;AN000;
147 ;; ;AN000;
148 ;; ;AN000;
149PARSE_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;
263PARSE_GRAPHICS ENDP ;; ;AN000;
264 ;; ;AN000;
265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
266;; ;AN000;
267;; Module Name: ;AN000;
268;; PARSE_COLORSELECT ;AN000;
269;; ;AN000;
270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
271 ;; ;AN000;
272COLORSELECT_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;
280COLORSELECT_P LABEL BYTE ;; ;AN000;
281CS_NUM_REQ DB 1,1 ;; Required, max parms ;AN000;
282COLORSELECT_PARM LABEL WORD ;; ;AN000;
283CS_POSITIONAL DW ? ;; Pointer to our positional ;AN000;
284 DB 0 ;; # Switches ;AN000;
285 DB 0 ;; # keywords ;AN000;
286 ;; ;AN000;
287COLORSELECT_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;
293COLORSELECT_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;
300COLORSELECT_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;
306COLORSELECT_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;
313SEQ_LENGTH_PTR DW 0 ;; Number of colorselect statements ;AN000;
314 ;; ;AN000;
315 ;; ;AN000;
316 ;; ;AN000;
317PARSE_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;
442PARSE_COLORSELECT ENDP ;; ;AN000;
443 ;; ;AN000;
444;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
445;; ;AN000;
446;; Module Name: ;AN000;
447;; PARSE_COLORPRINT ;AN000;
448;; ;AN000;
449;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
450 ;; ;AN000;
451COLORPRINT_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;
459COLORPRINT_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;
468COLORPRINT_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;
474COLORPRINT_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;
479COLORPRINT_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;
485COLORPRINT_P1V DB 3 ;; # of value lists ;AN000;
486 DB 0 ;; 0 - no range numerics ;AN000;
487 DB 0 ;; 0 - no actual numerics ;AN000;
488NUM_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;
506MAX_BANDS EQU 8 ;; ;AN000;
507 ;; ;AN000;
508BAND_VAL_LIST LABEL BYTE ;; ;AN000;
509BAND_PTR_1 DB ?,0 ;; ;AN000;
510BAND_PTR_2 DB ?,0 ;; ;AN000;
511BAND_PTR_3 DB ?,0 ;; ;AN000;
512BAND_PTR_4 DB ?,0 ;; ;AN000;
513BAND_PTR_5 DB ?,0 ;; ;AN000;
514BAND_PTR_6 DB ?,0 ;; ;AN000;
515BAND_PTR_7 DB ?,0 ;; ;AN000;
516BAND_PTR_8 DB ?,0 ;; ;AN000;
517 ;; ;AN000;
518 ;; ;AN000;
519PARSE_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;
646PARSE_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;
658DARKADJUST_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;
666DARKADJUST_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;
672DARKADJUST_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;
678DARKADJUST_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;
685PARSE_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;
725PARSE_DARKADJUST ENDP ;; ;AN000;
726 ;AN000;
727LIMIT LABEL NEAR ;; ;AN000;
728CODE ENDS ;; ;AN000;
729 END ;AN000;