annotate 3rdparty/utils/viewgif/viewgif.c @ 3210:6353bb024571

Created makefile and defsfile for NoCan RAMMER module driver and descriptor Updated rammer.asm in the NoCan driver folder to build the NoCan version of the Driver Updated r0.asm file to create the 6MB version of the descriptor. The makefile creates a disk image with two sets of the required drivers for the 6309 and 6809's in their respective module folders. /NITROS9/6309_L2/MODULES/RBF for the 6309 files and /NITROS9/6809_L2/MODULES/RBF for the 6809 files. This will make it easier for doing a dsave from this disk image into a normal distro disk image so people have these drivers ready for when new memory upgrades allow compatible usage of the NoCan registers.
author David Ladd <drencor-xeen@users.sourceforge.net>
date Wed, 20 Dec 2017 15:15:49 -0600
parents aaae5eac20e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1188
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1 /* OS-9 ViewGIF 2.0 Copyright (C) 1989 by Vaughn Cato */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
3 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
4 * This program was specifically written for OS-9 on the Tandy Color
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
5 * Computer 3 as its graphics routines will only work on that system.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
6 * The GIF decoding routines were originally taken from the Apollo
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
7 * workstation version of viewgif by Ben Samit. As noted in the source
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
8 * code provided by Ben, most of his code was taken from a GIF to
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
9 * PostScript converter by Scott Hemphill. Because of their consideration
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
10 * in providing the source code with their respective programs I am doing
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
11 * the same.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
12 *
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
13 * I encourage you to send any enhancements in the Color Computer version
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
14 * you wish to be publicly distributed to me so that I may update the
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
15 * program and re-release it. In this way, a standard version of the
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
16 * program can be maintained.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
17 *
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
18 * My address is:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
19 * Vaughn Cato
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
20 * 1244 E. Piedmont Rd. NE
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
21 * Marietta, Ga. 30062
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
22 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
23
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
24 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
25 * Any portion of this program may be freely used in any software provided
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
26 * the source for that program is made freely available to the public and
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
27 * credit is given to me, Ben Samit, and Scott Hemphill.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
28 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
29
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
30 #define EXTERN /* force a defining instance of global variables */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
31
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
32 #include <string.h>
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
33 #include "viewgif.h"
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
34
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
35 void showdata();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
36 char *mapgpb();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
37 extern int errno;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
38
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
39 DIRECT int pauselen = -1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
40 DIRECT bool global;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
41
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
42 main(argc, argv)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
43 int argc;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
44 char *argv[];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
45 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
46 register char *p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
47 register bool *cscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
48 char opt;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
49 bool quit;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
50 int x, argnum;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
51
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
52 dfactor = D_DITHER;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
53 magfact = D_MAG;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
54 britefac = D_BRITE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
55 infomode = D_INFO;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
56 graytype = D_GRAY;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
57 myheight = D_HEIGHT;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
58
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
59 zapmap = aligned = realrand = vefon = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
60 flicker = newscrn = dispon = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
61
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
62 for (cscan = &coloruse[MGCLUT]; cscan > coloruse; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
63 *--cscan = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
64
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
65 screen[0].winpath = screen[1].winpath = -1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
66
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
67 for (argnum = 1; argnum < argc; ++argnum) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
68 if (argv[argnum][0] == '-') {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
69 p = &argv[argnum][1];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
70 while (opt = *p++) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
71 if (*p == '=')
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
72 ++p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
73 switch (opt) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
74 case 'd':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
75 if (*p == '\0')
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
76 dfactor = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
77 else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
78 dfactor = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
79 if (dfactor < -MAXTOL1 || dfactor > MAXDITH1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
80 error("Invalid dithering factor", 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
81 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
82 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
83 case 'u':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
84 usefname = p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
85 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
86 case 'm':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
87 magfact = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
88 if (magfact < MINMAG || magfact > MAXMAG)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
89 error("Invalid magnification", 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
90 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
91 case 'x':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
92 startx = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
93 if (startx < MINCOORD || startx > MAXCOORD)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
94 error("Invalid start x coordinate", 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
95 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
96 case 'y':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
97 starty = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
98 if (starty < MINCOORD || starty > MAXCOORD)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
99 error("Invalid start y coordinate", 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
100 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
101 case 'g':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
102 switch (*p) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
103 case '2':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
104 graytype = MAX_GRAY;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
105 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
106 case '3':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
107 graytype = NTSC_GRAY;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
108 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
109 default:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
110 graytype = AVG_GRAY;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
111 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
112 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
113 case 'a':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
114 aligned = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
115 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
116 case 'z':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
117 dispon = zapmap = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
118 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
119 case 'v':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
120 dispon = vefon = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
121 if (*p != '\0')
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
122 vefname = p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
123 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
124 case 'r':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
125 realrand = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
126 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
127 case 's':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
128 infomode = NO_INFO;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
129 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
130 case 'i':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
131 if (newscrn)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
132 infomode = MUCH_INFO;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
133 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
134 case 'n':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
135 if (vefname == NULL)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
136 dispon = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
137 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
138 case 'p':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
139 pauselen = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
140 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
141 case 'c':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
142 newscrn = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
143 infomode = NO_INFO;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
144 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
145 case 'f':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
146 flicker = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
147 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
148 case 'b':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
149 britefac = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
150 if (britefac < MINBRITE || britefac > MAXBRITE)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
151 error("Invalid brightness factor", 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
152 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
153 case '?':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
154 usage();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
155 default:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
156 fatal("Unknown option");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
157 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
158 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
159 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
160 for (x = argnum + 1; x < argc; ++x)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
161 argv[x - 1] = argv[x];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
162 --argc;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
163 --argnum;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
164 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
165 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
166
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
167 if (argc < 2)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
168 usage();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
169
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
170 if ((infile = fopen(argv[1], "r")) == NULL)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
171 error("Cannot open input file", errno);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
172
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
173 if (flicker) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
174 maxdith = MAXDITH2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
175 minmod = SCALE2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
176 approx = approx2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
177 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
178 maxdith = MAXDITH1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
179 minmod = SCALE1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
180 approx = approx1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
181 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
182 if (dfactor > maxdith)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
183 dfactor = maxdith;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
184 low0 = minmod / 2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
185 up0 = low0 + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
186
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
187 checksig();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
188 readscrn();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
189 if (!realrand)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
190 makerand();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
191
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
192
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
193 quit = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
194 framenum = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
195 do {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
196 switch (getc(infile)) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
197 case '\0':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
198 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
199 case ',':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
200 ++framenum;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
201 readimag();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
202 waituser();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
203 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
204 case ';':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
205 quit = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
206 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
207 case '!':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
208 readext();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
209 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
210 default:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
211 quit = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
212 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
213 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
214 if (!dispon && vefname == NULL && (usefname == NULL || !newuse))
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
215 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
216 } while (!quit);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
217
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
218 if (dispon) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
219 if (zapmap) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
220 if ((infile = freopen(argv[1], "r+", infile)) == NULL)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
221 error("Cannot rewrite global map", errno);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
222 else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
223 zapglobmap();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
224 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
225 killwind();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
226 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
227
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
228 actwin = 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
229 select();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
230 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
231 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
232
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
233 makerand()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
234 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
235 register char *rscan1, *rscan2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
236 int x, f2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
237 char temp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
238 bool oddrow, oddrc;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
239
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
240 f2 = maxdith / 2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
241
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
242 /* initialize */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
243 x = 256;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
244 for (rscan2 = &randtab[16][0]; (rscan2 -= 16) >= &randtab[0][0]; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
245 for (rscan1 = rscan2 + 16; rscan1 > rscan2; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
246 *--rscan1 = (--x * f2) >> 8;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
247
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
248 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
249 * permute randomly (I don't think the original made all
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
250 * permutations equally likely, alas)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
251 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
252 rscan1 = &randtab[0][0];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
253 for (x = 256; x > 0; x--) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
254 rscan2 = rscan1 + (rand() % x);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
255 temp = *rscan1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
256 *rscan1++ = *rscan2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
257 *rscan2 = temp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
258 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
259
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
260 oddrow = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
261 for (rscan2 = &randtab[16][0]; (rscan2 -= 16) >= &randtab[0][0]; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
262 oddrc = oddrow = !oddrow;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
263 for (rscan1 = rscan2 + 16; --rscan1 >= rscan2; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
264 if (oddrc = !oddrc)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
265 *rscan1 += maxdith;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
266 if (oddrow)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
267 *rscan1 += f2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
268 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
269 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
270 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
271
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
272 readuse()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
273 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
274 char newname[64];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
275 register char *ep;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
276 int usefile;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
277
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
278 getusename(newname);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
279 if ((usefile = open(newname, 1)) == -1) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
280 for (ep = &coloruse[MGCLUT]; --ep >= coloruse; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
281 *ep = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
282 newuse = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
283 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
284 read(usefile, coloruse, MGCLUT * sizeof(bool));
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
285 close(usefile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
286 if (infomode != NO_INFO)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
287 printf("Using usage file\n");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
288 newuse = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
289 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
290 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
291
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
292 getusename(buffer)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
293 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
294 if (framenum > 1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
295 sprintf(buffer, "%s%d", usefname, framenum);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
296 else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
297 strcpy(buffer, usefname);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
298 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
299
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
300 writeuse()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
301 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
302 register char *cp, *gp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
303 int usecount, usefile;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
304 char newname[64];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
305
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
306 usecount = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
307 for (gp = &globuse[globcolors], cp = &coloruse[globcolors];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
308 --gp, --cp >= coloruse; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
309 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
310 if (*cp) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
311 *gp = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
312 ++usecount;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
313 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
314 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
315 if (infomode != NO_INFO)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
316 printf("%d out of %d colors used.\n", usecount, globcolors);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
317 if (usefname != NULL) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
318 getusename(newname);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
319 if (newuse) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
320 if ((usefile = creat(newname, 3)) == -1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
321 error("Cannot create usage file", errno);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
322 else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
323 write(usefile, coloruse, globcolors);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
324 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
325 close(usefile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
326 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
327 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
328
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
329 zapglobmap()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
330 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
331 register rgbcolor *gp, *used;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
332 register int i;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
333
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
334 for (i = 0; i < globcolors; i++) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
335 if (globuse[i]) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
336 used = &globclut[i];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
337 for (gp = &globclut[i = globcolors]; --i, --gp >= globclut; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
338 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
339 if (!globuse[i]) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
340 gp->red = used->red;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
341 gp->green = used->green;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
342 gp->blue = used->blue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
343 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
344 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
345 fseek(infile, clutpos, 0);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
346 fwrite(globclut, sizeof(rgbcolor), globcolors, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
347 return;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
348 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
349 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
350 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
351
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
352 saveimag()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
353 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
354 register cocoscreen *sscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
355 char newname[64];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
356 int file, x, scrnum, scrntype = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
357
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
358 for (scrnum = 0; scrnum <= flicker; ++scrnum) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
359 sscan = &screen[scrnum];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
360 strcpy(newname, vefname);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
361 if (framenum > 1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
362 sprintf(newname + strlen(newname), "%d", framenum);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
363 if (scrnum == 1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
364 strcat(newname, ".2");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
365 actwin = sscan->winpath;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
366 select();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
367 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
368 if ((file = creat(newname, 3)) == -1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
369 error("Cannot create vef file", errno);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
370 else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
371 write(file, &scrntype, sizeof(scrntype));
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
372 write(file, sscan->pal, MCCLUT * sizeof(colorcode));
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
373 for (x = 0; x < 8; ++x)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
374 write(file, gpbufptr, 160);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
375 for (x = 0; x < MROWS; ++x) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
376 getblk(groupnum, bufnum, 0, x, MCOLS - 1, 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
377 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
378 write(file, gpbufptr, 160);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
379 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
380 close(file);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
381 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
382 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
383 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
384
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
385 readext()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
386 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
387 char buf[255];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
388 int count;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
389
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
390 (void) getc(infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
391 while (count = getc(infile))
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
392 fread(buf, 1, count, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
393 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
394
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
395 DIRECT int real_x, real_y;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
396 DIRECT int x_coord, y_coord;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
397
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
398 typedef struct {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
399 int ilv_r0; /* starting row */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
400 int ilv_dr; /* step size */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
401 } ilvspec;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
402
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
403 static ilvspec ilvdat[] = {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
404 {1, 2}, /* .|.|.|.|.|.|.|.|. */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
405 {2, 4}, /* ..|...|...|...|.. */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
406 {4, 8}, /* ....|.......|.... */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
407 {0, 8}, /* |.......|.......| */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
408 };
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
409
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
410 readimag()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
411 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
412 BYTE buf[9];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
413 unsigned left, top, width, height;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
414 bool local, intrlevd;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
415 int lclbits;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
416 int row, rowoffset;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
417 register int n;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
418 int lineread, hold, xpos, x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
419 register ilvspec *ilvscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
420
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
421 readuse();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
422 newwind();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
423
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
424 /* read header info */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
425 fread(buf, sizeof(BYTE), sizeof(buf) / sizeof(BYTE), infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
426 left = arith(buf[0]) | (buf[1] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
427 top = arith(buf[2]) | (buf[3] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
428 imagwid = width = arith(buf[4]) | (buf[5] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
429 imaghigh = height = arith(buf[6]) | (buf[7] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
430
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
431 if (infomode != NO_INFO)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
432 printf("gif dimensions: %d x %d pixels\n", imagwid, imaghigh);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
433
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
434 local = buf[8] & 0x80;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
435 intrlevd = buf[8] & 0x40;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
436
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
437 if (local) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
438 char tempbuf[3];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
439
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
440 lclbits = (buf[8] & 0x7) + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
441 for (x = 1 << lclbits; --x >= 0; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
442 fread(tempbuf, 3, 1, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
443 } else if (!global)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
444 fatal("no CLUT present for image");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
445
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
446 ilevtab[MROWS] = ILEVEND;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
447 for (x = MROWS; --x >= 0; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
448 ilevtab[x] = ILEVMISS;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
449
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
450 if (!aligned)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
451 n = myheight;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
452 else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
453 for (n = imaghigh; n > 200; n /= 2)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
454 ;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
455 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
456 n *= magfact;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
457
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
458 rowoffset = 3 * starty * magfact;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
459 lineread = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
460 if (intrlevd) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
461 for (ilvscan = &ilvdat[elements(ilvdat)]; --ilvscan >= ilvdat; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
462 for (x = ilvscan->ilv_r0; x < imaghigh; x += ilvscan->ilv_dr) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
463 row = (long) x * n / imaghigh - rowoffset;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
464 if (row >= 0 && row < MROWS)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
465 ilevtab[row] = lineread;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
466 ++lineread;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
467 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
468 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
469 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
470 for (x = 0; x < imaghigh; ++x) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
471 row = (long) x * n / imaghigh - rowoffset;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
472 if (row >= 0 && row < MROWS)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
473 ilevtab[row] = lineread;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
474 ++lineread;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
475 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
476 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
477
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
478 x = startx * (imagwid / 64);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
479 hold = xpos = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
480 while (xpos < mywidth) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
481 for (hold += mywidth * magfact; hold >= imagwid; hold -= imagwid)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
482 xtab[xpos++] = x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
483 x++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
484 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
485
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
486 real_x = real_y = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
487 x_coord = y_coord = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
488
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
489 if (dispon || (usefname != NULL && newuse)) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
490 readrast(width, height);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
491 writeuse();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
492 if (vefname != NULL)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
493 saveimag();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
494 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
495 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
496
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
497 DIRECT int datum;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
498 DIRECT int bits;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
499 char buf[255];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
500
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
501 readrast(width, height)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
502 unsigned width, height;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
503 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
504 register char *ch;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
505 register codetype *cscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
506 int count, code;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
507
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
508 datasize = getc(infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
509 codesize = datasize + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
510 codemask = (1 << codesize) - 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
511 clear = 1 << datasize;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
512 eoi = clear + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
513 bits = 16;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
514
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
515 /* initialize code table */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
516 for (cscan = &codetab[code = clear]; --cscan, --code >= 0; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
517 cscan->prefix = (codetype *) NULL;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
518 cscan->first = cscan->suffix = code;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
519 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
520
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
521 while ((count = getc(infile)) > 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
522 fread(buf, sizeof(*buf), count, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
523 for (ch = buf; --count >= 0; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
524 addbyte(*ch++);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
525 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
526
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
527 datum >>= bits;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
528 for (bits = 16 - bits; x_coord != 0 && bits >= codesize; bits -= codesize) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
529 process(datum & codemask);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
530 datum >>= codesize;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
531 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
532 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
533
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
534 addbyte(c)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
535 char c;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
536 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
537 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
538 * datum += (long)(*ch & 0xff) << bits;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
539 * bits += 8;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
540 * while (bits >= codesize) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
541 * code = datum & codemask;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
542 * datum >>= codesize;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
543 * bits -= codesize;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
544 * if (code == eoi)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
545 * goto exitloop;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
546 * process(code);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
547 * }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
548 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
549 #asm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
550 ldb 5,s
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
551 lda <bits+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
552 suba #7
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
553 bls _addb3
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
554 sta <bits+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
555 lda <datum
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
556 sta <datum+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
557 stb <datum
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
558 lda #1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
559 bra _addb4
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
560 _addb3
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
561 lda #8
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
562 _addb1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
563 lsrb
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
564 ror <datum
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
565 ror <datum+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
566 _addb4
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
567 dec <bits+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
568 bne _addb2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
569 * pshs d
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
570 tfr d,u
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
571 ldd <codesize
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
572 std <bits
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
573 ldd <datum
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
574 anda <codemask
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
575 andb <codemask+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
576 pshs d
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
577 lbsr process
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
578 leas 2,s
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
579 * puls d
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
580 tfr u,d
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
581 _addb2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
582 deca
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
583 bne _addb1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
584 #endasm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
585 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
586
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
587 process(code)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
588 int code;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
589 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
590 register codetype *p, *cp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
591 static DIRECT int avail;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
592 static DIRECT codetype *oldcp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
593
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
594 if (code == clear) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
595 /* clear table */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
596 codesize = datasize + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
597 codemask = (1 << codesize) - 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
598 avail = clear + 2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
599 oldcp = NULL;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
600 } else if (code < avail) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
601 outcode(cp = &codetab[code]); /* output the code */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
602 if (oldcp != NULL) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
603 /* add new entry */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
604 p = &codetab[avail++];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
605 /* prefix is previous code, first is prefix's first */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
606 p->first = (p->prefix = oldcp)->first;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
607 p->suffix = cp->first; /* suffix is first of current */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
608 if ((avail & codemask) == 0 && avail < MCODE) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
609 /* increase code size */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
610 codesize++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
611 codemask += avail;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
612 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
613 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
614 oldcp = cp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
615 } else if (code == avail && oldcp != NULL) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
616 /* repeat of last code */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
617 p = &codetab[avail++];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
618 /* prefix is previous code, first is prefix's first */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
619 p->first = (p->prefix = oldcp)->first;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
620 p->suffix = p->first; /* Suffix is first of last */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
621 outcode(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
622 if ((avail & codemask) == 0 && avail < MCODE) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
623 /* increase code size */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
624 codesize++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
625 codemask += avail;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
626 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
627 oldcp = &codetab[code];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
628 } else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
629 fatal("illegal code in raster data");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
630 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
631
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
632 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
633 * outcode() -- we finally get the data out of the LZ decompression, and
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
634 * fill a buffer until we get a line's worth of data. The loop with x0
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
635 * and x is intended to take advantage of the mostly increasing nature
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
636 * of ilevtab[], replacing an O(n**2) loop that was there before. Timing,
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
637 * however, shows that the change doesn't affect display time, so the
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
638 * performance bottleneck must be elsewhere. Rats.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
639 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
640 outcode(p)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
641 codetype *p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
642 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
643 register BYTE *sp = &codestk[0];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
644 register int x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
645 static DIRECT int x0 = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
646
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
647 for (; p; p = p->prefix)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
648 *sp++ = p->suffix;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
649
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
650 while (--sp >= &codestk[0]) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
651 coloruse[arith(*sp)] = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
652 if (real_x == 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
653 y_coord = -1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
654 x = x0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
655 do {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
656 if (++x >= myheight)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
657 x = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
658 if (ilevtab[x] == real_y) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
659 x0 = y_coord = x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
660 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
661 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
662 } while (x != x0);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
663 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
664 if (y_coord >= 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
665 while (xtab[x_coord] == real_x)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
666 linestor[x_coord++] = arith(*sp);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
667 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
668 if (++real_x >= imagwid) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
669 if (y_coord >= 0 && dispon) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
670 do {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
671 doline();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
672 } while (ilevtab[++y_coord] == ILEVMISS);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
673 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
674 real_x = x_coord = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
675 ++real_y;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
676 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
677 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
678 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
679
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
680 DIRECT int bitcount, pixperbyte;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
681 DIRECT char *byteptr;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
682
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
683 doline()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
684 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
685 register xlate *p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
686 register char *rrow;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
687 register int x, addval, scrnum;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
688 cocoscreen *sscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
689
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
690 rrow = &randtab[y_coord & 15][0];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
691
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
692 for (sscan = &screen[scrnum = (flicker ? 2 : 1)]; --sscan, --scrnum >= 0;)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
693 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
694 actwin = sscan->winpath;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
695 bitcount = pixperbyte;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
696 byteptr = gpbufptr;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
697 if (dfactor > 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
698 for (x = 0; x < mywidth; ++x) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
699 addval = (realrand) ? rand85(y_coord + x)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
700 : rrow[x & 15];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
701 for (p = &transtab[linestor[x]][1]; p->addval <= addval; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
702 p++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
703 --p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
704 addpixel(p->clutval[scrnum]);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
705 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
706 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
707 for (x = 0; x < mywidth; ++x)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
708 addpixel(transtab[linestor[x]][0].clutval[scrnum]);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
709 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
710 if (flicker)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
711 select();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
712 putblk(groupnum, bufnum, 0, y_coord);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
713 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
714 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
715 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
716
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
717 addpixel(c)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
718 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
719 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
720 * *byteptr = (*byteptr << (gmode ? 2 : 4)) | c;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
721 * if (--bitcount == 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
722 * byteptr++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
723 * bitcount = pixperbyte;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
724 * }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
725 *
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
726 * (The spelling discrepancy here is due to the 6809's chopping off
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
727 * identifier lengths at a different point than the assembler appears to!)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
728 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
729 #asm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
730 ldx <byteptr
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
731 ldb ,x
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
732 lda <gmode+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
733 bne _addpix1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
734 lslb
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
735 lslb
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
736 _addpix1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
737 lslb
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
738 lslb
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
739 orb 5,s
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
740 stb ,x
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
741 dec <bitcount+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
742 bne _addpix2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
743 leax 1,x
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
744 stx <byteptr
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
745 lda <pixperby+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
746 sta <bitcount+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
747 _addpix2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
748 #endasm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
749 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
750
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
751 rand85(n)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
752 int n;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
753 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
754 register unsigned result;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
755
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
756 result = rand() % maxdith;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
757 if (n & 1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
758 result += maxdith + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
759 return result;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
760 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
761
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
762 readscrn()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
763 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
764 char buf[7];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
765 int x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
766 register rgbcolor *rp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
767
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
768 fread(buf, sizeof(*buf), 7, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
769 imagwid = arith(buf[0]) | (buf[1] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
770 imaghigh = arith(buf[2]) | (buf[3] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
771 if (infomode != NO_INFO)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
772 printf("%d x %d screen\n", imagwid, imaghigh);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
773 global = (buf[4] & 0x80) != 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
774 if (global) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
775 globbits = (buf[4] & 0x07) + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
776 globcolors = 1 << globbits;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
777 if (infomode != NO_INFO)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
778 printf("global bitmap: %d colors\n", globcolors);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
779 clutpos = ftell(infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
780 fread(globclut, 3, globcolors, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
781 if (infomode == MUCH_INFO) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
782 for (rp = globclut, x = 0; x < globcolors; rp++, x++) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
783 printf("color %d = %3d,%3d,%3d\n", x,
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
784 arith(rp->red), arith(rp->green), arith(rp->blue));
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
785 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
786 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
787 } else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
788 fatal("cannot handle non-global bitmaps");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
789 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
790
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
791 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
792 * newwind() -- the big banana; determine the CoCo CLUT(s) that will
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
793 * best display the GIF image given the GIF CLUT.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
794 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
795
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
796 newwind()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
797 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
798 register cocoscreen *sscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
799 register bool *bscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
800 register colorcode *cscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
801 rgbcolor *rgbp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
802 bool first;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
803 char blip;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
804 int x, hival, loval, midval;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
805
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
806 fixgmap();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
807
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
808 if (infomode != NO_INFO) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
809 printf("Analyzing..");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
810 fflush(stdout);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
811 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
812
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
813 loval = -MAXTOL1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
814 midval = hival = dfactor;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
815
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
816 while (loval <= hival) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
817 dfactor = midval;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
818 if (setmap()) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
819 loval = midval + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
820 blip = '+';
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
821 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
822 hival = midval - 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
823 blip = '-';
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
824 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
825 if (infomode != NO_INFO) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
826 putchar(blip);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
827 fflush(stdout);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
828 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
829 midval = (loval + hival) / 2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
830 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
831
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
832 if (dfactor != hival) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
833 dfactor = hival;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
834 setmap();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
835 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
836
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
837 if (infomode != NO_INFO) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
838 putchar('\n');
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
839 showdata();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
840 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
841
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
842 if (screen[0].clutsize <= 4 && !vefon) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
843 gmode = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
844 mywidth = 640;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
845 pixperbyte = 4;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
846 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
847 gmode = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
848 mywidth = 320;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
849 pixperbyte = 2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
850 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
851
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
852 first = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
853 for (sscan = &screen[(flicker ? 2 : 1)]; --sscan >= screen; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
854 if (dispon)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
855 sscan->winpath = initwin(first, sscan->winpath);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
856 for (cscan = &sscan->pal[x = sscan->clutsize]; --cscan, --x >= 0; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
857 *cscan = colorval(&sscan->clut[x]);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
858 if (dispon)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
859 palette(x, *cscan);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
860 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
861 if (dispon) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
862 border(0);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
863 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
864 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
865 first = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
866 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
867 for (bscan = &coloruse[globcolors]; --bscan >= coloruse; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
868 *bscan = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
869 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
870
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
871 /* colorval() -- encode an RGB222 value the way the GIME likes it */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
872
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
873 colorval(color)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
874 register rgbcolor *color;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
875 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
876 static char cocode[] = {'\000', '\001', '\010', '\011'};
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
877
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
878 return (((cocode[color->red & 3] << 1) |
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
879 cocode[color->green & 3]) << 1) | cocode[color->blue & 3];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
880 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
881
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
882 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
883 * showdata() -- display a bunch of information on the CLUTs used
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
884 * if it's been asked for
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
885 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
886 void
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
887 showdata()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
888 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
889 register rgbcolor *rscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
890 register cocoscreen *sscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
891 int x, y;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
892
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
893 if (dfactor > 0)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
894 printf("Dithering factor = %d\n", dfactor);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
895 else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
896 printf("Color tolerance = %d\n", -dfactor);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
897 fputs("Resulting coco CLUT: ", stdout);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
898 printf("%d colors", screen[0].clutsize);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
899 if (flicker)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
900 printf(" + %d colors\n", screen[1].clutsize);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
901 else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
902 putchar('\n');
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
903 if (infomode == MUCH_INFO) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
904 for (x = 0; x < (flicker ? 1 : 2); x++) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
905 sscan = &screen[x];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
906 for (rscan = sscan->clut, y = 0; y < sscan->clutsize; y++) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
907 printf("%2d:%d,%d,%d=%d\n", y,
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
908 rscan->red, rscan->green, rscan->blue, colorval(rscan));
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
909 rscan++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
910 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
911 putchar('\n');
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
912 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
913 fputs("Translation table:\n", stdout);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
914 for (x = 0; x < globcolors; ++x) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
915 if (coloruse[x]) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
916 printf("%3d:", x);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
917 for (y = 0; y < 4 && transtab[x][y].addval != BOGUSDITH; ++y) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
918 printf(" %3d=%3d",
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
919 transtab[x][y].addval, transtab[x][y].clutval[0]);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
920 if (flicker)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
921 printf(",%3d", transtab[x][y].clutval[1]);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
922 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
923 putchar('\n');
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
924 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
925 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
926 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
927 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
928
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
929 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
930 * fixgmap() -- scale colors in the GIF image global CLUT in accordance
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
931 * with the brightness specification, and in passing, convert to gray
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
932 * if requested (either using the average of the components or their
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
933 * maximum).
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
934 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
935 fixgmap()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
936 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
937 register rgbcolor *rscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
938 int x, r, g, b;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
939
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
940 for (rscan = &globclut[x = globcolors]; --rscan, --x >= 0; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
941 if (coloruse[x]) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
942 r = arith(rscan->red);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
943 g = arith(rscan->green);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
944 b = arith(rscan->blue);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
945 switch (graytype) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
946 case AVG_GRAY:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
947 r = g = b = (r + g + b) / 3;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
948 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
949 case NTSC_GRAY:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
950 r = g = b = (30 * r + 59 * g + 11 * b) / 100;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
951 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
952 case MAX_GRAY:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
953 if (g > r)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
954 r = g;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
955 if (b > r)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
956 r = b;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
957 g = b = r;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
958 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
959 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
960 rscan->red = (britefac * r) >> 4;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
961 rscan->green = (britefac * g) >> 4;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
962 rscan->blue = (britefac * b) >> 4;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
963 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
964 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
965 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
966
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
967 killwind()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
968 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
969 mapgpb(screen[flicker].winpath, groupnum, bufnum, 0);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
970 killbuf(groupnum, bufnum);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
971 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
972
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
973 waituser()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
974 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
975 char c;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
976 int x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
977 register cocoscreen *sscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
978
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
979 if (dispon) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
980 if (pauselen < 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
981 for (x = 5; --x >= 0; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
982 bell();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
983 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
984 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
985 if (flicker) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
986 pauselen *= 30;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
987 do {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
988 for (sscan = &screen[2]; --sscan >= screen; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
989 actwin = sscan->winpath;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
990 select();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
991 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
992 sleep(2);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
993 if (ready(actwin)) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
994 read(actwin, &c, 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
995 if (c == '\n')
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
996 return;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
997 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
998 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
999 } while (pauselen < 0 || --pauselen >= 0);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1000 } else if (pauselen > 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1001 sleep(60 * pauselen);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1002 } else if (pauselen < 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1003 do {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1004 read(screen[0].winpath, &c, 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1005 } while (c != '\n');
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1006 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1007 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1008 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1009
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1010 ready(path)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1011 int path;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1012 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1013 #asm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1014 lda 5,s
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1015 ldb #SS.Ready
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1016 os9 I$GetStt
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1017 bcc _ready1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1018 ldd #0
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1019 bra _ready2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1020 _ready1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1021 ldd #1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1022 _ready2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1023 #endasm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1024 }