Mercurial > hg > Members > kono > nitros9-code
comparison 3rdparty/utils/view/view_gifpix.a @ 1706:6b23465701c0
Tim Kientzle's VIEW
author | boisy |
---|---|
date | Tue, 10 Aug 2004 23:46:24 +0000 |
parents | |
children | b7fb6a9aead4 |
comparison
equal
deleted
inserted
replaced
1705:bd792517eea1 | 1706:6b23465701c0 |
---|---|
1 * | |
2 * Setup and Screen support for GIF | |
3 * | |
4 * Globals | |
5 * gifoutinit -- Initialize output machinery | |
6 * gifoutpix -- output one pixel, with scaling, etc. | |
7 * | |
8 ifp1 | |
9 use /dd/defs/os9defs.a | |
10 endc | |
11 | |
12 psect view_gifpix_a,0,0,0,0,0 | |
13 | |
14 * | |
15 * Screen support-- output one GIF pixel to screen, with scaling and dithering. | |
16 * | |
17 vsect dp | |
18 pixpline rmb 2 Number of pixels on a virtual screen line. | |
19 pixscrn rmb 2 Number of pixels on actual screen line. | |
20 pixcnt rmb 2 Count of pixels on actual screen line. | |
21 lineptr rmb 2 Pointer to linebuff, for putting pixels | |
22 pixleft rmb 2 Number of pixels left for this GIF line | |
23 horscale rmb 2 Horizontal scaling counter. | |
24 linecount rmb 2 Current GIF line number | |
25 linenumb rmb 2 Current Coco Line number | |
26 linemax rmb 2 Max Coco line number | |
27 lineinc rmb 2 Increment between lines | |
28 verscale rmb 2 vertical scaling counter. | |
29 endsect | |
30 | |
31 * gifinterlace holds T if we do interlace. | |
32 gifoutinit: | |
33 pshs d,x | |
34 ldd #1 | |
35 tst <gifinterlace | |
36 beq init1 | |
37 ldd #8 | |
38 init1 | |
39 std lineinc | |
40 | |
41 ldd #0 | |
42 std linecount | |
43 std horscale | |
44 std verscale | |
45 | |
46 ldd <Skipcols | |
47 bpl init20 Default value is zero | |
48 ldd #0 | |
49 std <Skipcols | |
50 init20 | |
51 | |
52 ldd <Skiplines | |
53 bpl init21 Default value is zero | |
54 ldd #0 | |
55 std <Skiplines | |
56 init21 | |
57 | |
58 ldd #0 | |
59 subd <Skipcols | |
60 std pixcnt | |
61 | |
62 leax linebuff,y | |
63 stx lineptr | |
64 ldd <gifiwidth | |
65 std pixleft | |
66 | |
67 ldx #320 Type 8 and 6 screens are 320 pixels across. | |
68 lda <type | |
69 cmpa #8 | |
70 beq init8 | |
71 cmpa #6 | |
72 beq init8 | |
73 ldx #640 Type 7 and 5 are 640 pixels across. | |
74 init8 | |
75 stx pixscrn | |
76 stx pixpline | |
77 | |
78 ldd #192 For default size, scale pic to 192 lines. | |
79 std linemax | |
80 | |
81 lda <Size | |
82 bne init98 | |
83 ldx <gifiheight For small, choose divisor of actual height. | |
84 clra | |
85 pshs a | |
86 init92 | |
87 inc ,s | |
88 lda ,s | |
89 lbsr div168 Divide height by number | |
90 cmpd #200 | |
91 bhi init92 If not <200, keep going | |
92 std linemax | |
93 puls a Clear stack | |
94 bra init99 | |
95 init98 | |
96 cmpa #2 | |
97 bne init99 | |
98 ldd <gifiheight Huge is 1:1 height | |
99 std linemax | |
100 ldd <gifiwidth And 1:1 width | |
101 cmpd <pixscrn ... but not less than screen width | |
102 blo init99 | |
103 std pixpline | |
104 init99 | |
105 | |
106 puls d,x,pc | |
107 | |
108 * Output pixel to screen | |
109 * | |
110 * Expects | |
111 * alt2buff holds color translation table | |
112 * A holds pixel to output | |
113 * gifiheight, gifiwidth hold picture dimensions | |
114 gifoutpix: | |
115 pshs a,b,x | |
116 tst verscale | |
117 bmi outpix5 | |
118 ldx lineptr | |
119 ldd horscale | |
120 subd pixpline | |
121 std horscale | |
122 bpl outpix5 | |
123 outpix1 | |
124 ldd pixcnt | |
125 addd #1 | |
126 std pixcnt | |
127 bmi outpix11 | |
128 cmpd pixscrn | |
129 bgt outpix11 | |
130 lda ,s | |
131 sta ,x+ | |
132 outpix11 | |
133 ldd horscale | |
134 addd <gifiwidth | |
135 std horscale | |
136 bmi outpix1 | |
137 stx lineptr | |
138 outpix5 | |
139 ldx pixleft Count down number of GIF pixels on this line. | |
140 leax -1,x | |
141 stx pixleft | |
142 bne outpix9 | |
143 tst verscale | |
144 bmi outpix7 | |
145 lbsr dithline Translate GIF pixels to CoCo colors | |
146 lbsr convline Convert the pixels to bytes. | |
147 lbsr outline If we're done, output the line. | |
148 lbsr clrline | |
149 outpix7 | |
150 lbsr setline | |
151 leax linebuff,y | |
152 stx lineptr | |
153 ldx <gifiwidth | |
154 stx pixleft | |
155 ldx #00 | |
156 stx horscale | |
157 | |
158 ldd #0 | |
159 subd <Skipcols | |
160 std pixcnt | |
161 outpix9 | |
162 puls a,b,x,pc | |
163 | |
164 dithline | |
165 pshs a,b,x,y,u | |
166 leau alt2buff,y Color mapping table. | |
167 ldd pixscrn Number of pixels on this line. | |
168 lsra Divide by 4, since main loop does 4 pixels at a time. | |
169 rorb | |
170 lsra | |
171 rorb | |
172 pshs b Even for a 640-pixel line, this will be less than 256. | |
173 leay linebuff,y Y points to line data. | |
174 | |
175 lda linenumb+1 What line (mod 4) are we on? | |
176 anda #3 | |
177 leax dithtable,pcr | |
178 leax a,x | |
179 jsr a,x | |
180 puls b | |
181 puls a,b,x,y,u,pc | |
182 | |
183 dithtable | |
184 bra dithloop1 Different sub for each line (mod 4). | |
185 bra dithloop2 | |
186 bra dithloop3 | |
187 bra dithloop4 | |
188 | |
189 dithloop1 | |
190 bsr dofastdith | |
191 ldb #$60 | |
192 bsr dodither | |
193 bsr dofastdith | |
194 ldb #$40 | |
195 bsr dodither | |
196 dec 3,s | |
197 bne dithloop1 | |
198 rts | |
199 | |
200 dithloop2 | |
201 ldb #$20 | |
202 bsr dodither | |
203 bsr dofastdith | |
204 ldb #$00 | |
205 bsr dodither | |
206 bsr dofastdith | |
207 dec 3,s | |
208 bne dithloop2 | |
209 rts | |
210 | |
211 dithloop3 | |
212 bsr dofastdith | |
213 ldb #$50 | |
214 bsr dodither | |
215 bsr dofastdither | |
216 ldb #$70 | |
217 bsr dodither | |
218 dec 3,s | |
219 bne dithloop3 | |
220 rts | |
221 | |
222 dithloop4 | |
223 ldb #$10 | |
224 bsr dodither | |
225 bsr dofastdith | |
226 ldb #$30 | |
227 bsr dodither | |
228 bsr dofastdith | |
229 dec 3,s | |
230 bne dithloop4 | |
231 rts | |
232 | |
233 * Dither one pixel. Get GIF color from ,y and convert it into primary | |
234 * color iff B is above the threshold value. | |
235 dodither | |
236 pshs b | |
237 ldb ,y | |
238 clra | |
239 leax d,u | |
240 abx | |
241 abx | |
242 lda ,x Get primary color. | |
243 puls b | |
244 cmpb 2,x Are we above the threshold? | |
245 bhs dodither1 | |
246 lda 1,x If not, choose secondary color. | |
247 dodither1 | |
248 anda #$0f | |
249 sta ,y+ Store the color. | |
250 rts | |
251 | |
252 * Since every other pixel is gauranteed to be a primary color, it seems | |
253 * worthwhile to have a faster version of the dither sub for that case. | |
254 dofastdith | |
255 ldb ,y | |
256 clra | |
257 leax d,u | |
258 abx | |
259 lda d,x Get primary color. | |
260 anda #$0f | |
261 sta ,y+ Store the color. | |
262 rts | |
263 | |
264 convline | |
265 pshs a,b,x,y,u | |
266 lda <type | |
267 cmpa #8 | |
268 bne conv4no | |
269 bsr conv4line Type 8 screen has 4 bits/pixel | |
270 bra conv10 | |
271 conv4no | |
272 cmpa #7 | |
273 beq conv2 | |
274 cmpa #6 | |
275 bne conv2no | |
276 conv2 | |
277 bsr conv2line type 7,6 are 2 bits/pix | |
278 bra conv10 | |
279 conv2no | |
280 bsr conv1line type 5 is 1 bit/pix | |
281 conv10 | |
282 puls a,b,x,y,u,pc | |
283 | |
284 conv4table fcb $00,$10,$20,$30,$40,$50,$60,$70,$80,$90,$a0,$b0,$c0,$d0,$e0,$f0 | |
285 conv4line | |
286 leax linebuff,y | |
287 tfr x,u | |
288 leay conv4table,pcr | |
289 ldb #160 | |
290 pshs b | |
291 conv4loop | |
292 lda ,x+ | |
293 ldb ,x+ | |
294 orb a,y | |
295 stb ,u+ | |
296 dec ,s | |
297 bne conv4loop | |
298 puls b | |
299 rts | |
300 | |
301 conv2table fcb $00,$40,$80,$c0,$00,$10,$20,$30,$00,$04,$08,$0c | |
302 conv2line | |
303 leax linebuff,y | |
304 tfr x,u | |
305 leay conv2table,pcr | |
306 ldd pixscrn | |
307 lsra | |
308 rorb | |
309 lsra | |
310 rorb | |
311 pshs b | |
312 conv2loop | |
313 lda ,x+ | |
314 lda a,y Convert 1st pixel in byte. | |
315 ldb ,x+ | |
316 addb #4 | |
317 ora b,y | |
318 ldb ,x+ | |
319 addb #8 | |
320 ora b,y | |
321 ora ,x+ | |
322 sta ,u+ | |
323 dec ,s | |
324 bne conv2loop | |
325 puls b | |
326 rts | |
327 | |
328 conv1line | |
329 leax linebuff,y | |
330 tfr x,u | |
331 ldy #80 | |
332 conv1loop | |
333 ldb #$80 | |
334 pshs b | |
335 clra | |
336 conv10loop | |
337 tst ,x+ | |
338 beq conv11 | |
339 ora ,s | |
340 conv11 | |
341 ror ,s | |
342 bne conv10loop | |
343 puls b | |
344 sta ,u+ | |
345 leay -1,y | |
346 bne conv1loop | |
347 rts | |
348 | |
349 clrline | |
350 pshs a,b,x,y | |
351 leax linebuff,y | |
352 ldy pixscrn | |
353 clra | |
354 clrline1 | |
355 sta ,x+ | |
356 leay -1,y | |
357 bne clrline1 | |
358 puls a,b,x,y,pc | |
359 | |
360 nextline | |
361 pshs d,x,u | |
362 ldx lineinc | |
363 beq nextline9 | |
364 ldd verscale | |
365 nextline1 | |
366 tsta Actually, test sign of D | |
367 bmi nextline2 | |
368 subd <gifiheight If it's positive, that's another screen line. | |
369 ldu linenumb | |
370 leau 1,u | |
371 stu linenumb | |
372 bra nextline1 | |
373 nextline2 | |
374 addd linemax | |
375 ldu linecount That's another gif line. | |
376 leau 1,u | |
377 stu linecount | |
378 leax -1,x | |
379 bne nextline1 | |
380 std verscale | |
381 nextline9 | |
382 puls d,x,u,pc | |
383 | |
384 setline | |
385 pshs a,b,x | |
386 bsr nextline | |
387 ldd linecount | |
388 cmpd <gifiheight | |
389 blo setline5 | |
390 andb #$7 | |
391 beq setline3 | |
392 ldd lineinc | |
393 lsrb | |
394 std lineinc | |
395 setline3 | |
396 ldd #0 | |
397 std linecount | |
398 std linenumb | |
399 std verscale | |
400 ldd lineinc | |
401 lsrb | |
402 clra | |
403 std lineinc Start off by moving 1/2 of the increment | |
404 bsr nextline | |
405 lslb | |
406 std lineinc Now, set the increment right. | |
407 setline5 | |
408 puls a,b,x,pc | |
409 | |
410 outline | |
411 pshs a,b,x | |
412 ldd linenumb | |
413 subd <Skiplines | |
414 bmi outline1 | |
415 cmpd #192 | |
416 bhs outline1 | |
417 lbsr putline Put the line onto the screen | |
418 outline1 | |
419 puls a,b,x,pc | |
420 | |
421 endsect |