Mercurial > hg > Members > kono > nitros9-code
comparison 3rdparty/utils/view/view_save.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 * Save current picture to a file | |
3 * DoSave: - Save current screen to file in specified format | |
4 * Currently supports VEFFormat, VEFSqFormat, MGEFormat, CM3Format | |
5 * Note: Since SetSave does not clear a file (DoSave resets the filesize to | |
6 * zero when it starts), VIEW can be used to convert a file in place | |
7 * by just saving back to the original file. | |
8 * | |
9 | |
10 ifp1 | |
11 use /dd/defs/os9defs.a | |
12 endc | |
13 | |
14 check macro | |
15 pshs b,cc | |
16 ldb #\1 | |
17 os9 F$PErr | |
18 puls b,cc | |
19 endm | |
20 | |
21 StdIn equ 0 | |
22 StdOut equ 1 | |
23 StdErr equ 2 | |
24 | |
25 psect view_save_a,0,0,0,0,0 | |
26 | |
27 vsect dp | |
28 SaveFormat: rmb 1 Also used in view_setsave.a | |
29 SavePath: rmb 1 | |
30 LineSize rmb 2 | |
31 endsect | |
32 | |
33 | |
34 * | |
35 * Do the actual save. | |
36 * | |
37 DoSave: | |
38 pshs a,b,x,y,u | |
39 lda #$ff | |
40 sta <abort Set to abort on signal. | |
41 | |
42 * Set up line buffer for screen I/O | |
43 lbsr setbuffer | |
44 | |
45 * First, set file size to zero, in case it was pre-existing. | |
46 lda SavePath | |
47 lbeq DoSaveEnd | |
48 | |
49 ldb #SS.Size | |
50 ldx #0 | |
51 tfr x,u | |
52 os9 I$SetStt | |
53 lbcs _error | |
54 | |
55 | |
56 * We'll need to know the size in bytes of one line, so figure that out | |
57 lda <type | |
58 ldb #80 Types 5 and 6 are 80 bytes/line | |
59 cmpa #7 | |
60 blo Dosize | |
61 ldb #160 Types 7 and 8 are 160 bytes/line | |
62 Dosize | |
63 clra | |
64 std LineSize | |
65 | |
66 lda SaveFormat If MGE Format save, write an MGE format header. | |
67 cmpa #MGE640Format | |
68 beq DoMGE1 | |
69 cmpa #MGEFormat | |
70 bne DoMGE | |
71 DoMGE1 | |
72 lbsr MGEHeader | |
73 DoMGE | |
74 | |
75 lda SaveFormat If VEF Format save, write a VEF format header. | |
76 cmpa #VEFFormat | |
77 beq DoVEF1 | |
78 cmpa #VEFSqFormat | |
79 bne DoVEF | |
80 DoVEF1 | |
81 lbsr VEFHeader | |
82 DoVEF | |
83 | |
84 lda SaveFormat | |
85 cmpa #CM3Format | |
86 bne DoCM3 | |
87 lbsr CM3Header | |
88 DoCM3 | |
89 | |
90 * Now output rest of file | |
91 ldd #0 | |
92 DoOut | |
93 lbsr fetchline | |
94 lbsr comline | |
95 lbsr putline Copy the line back to the screen, for visual feedback. | |
96 lbsr comline | |
97 lbsr outline | |
98 lbsr putline | |
99 addd #1 | |
100 cmpd #192 | |
101 bne DoOut | |
102 | |
103 lda SaveFormat For MGE format, add 8 blank lines to end of file. | |
104 cmpa #MGE640Format | |
105 beq DoMGE11 | |
106 cmpa #MGEFormat | |
107 bne DoMGE10 | |
108 DoMGE11 | |
109 lbsr Save8 | |
110 DoMGE10 | |
111 | |
112 * Now close the file | |
113 lda SavePath | |
114 os9 I$Close | |
115 lbcs _error | |
116 | |
117 * Print message on successful completion | |
118 leax str1done,pcr Output first part of message | |
119 lbsr O_Write | |
120 | |
121 ldb SaveFormat | |
122 leax strVEF,pcr | |
123 cmpb #VEFFormat Is it VEF? | |
124 beq DoneSave | |
125 | |
126 leax strMGE,pcr | |
127 cmpb #MGEFormat Is it MGE? | |
128 bne DoneSave1 | |
129 ldb <type | |
130 cmpb #6 Type 6/8 are MGE | |
131 beq DoneSave | |
132 cmpb #8 | |
133 beq DoneSave | |
134 leax str640,pcr Types 5/7 are 640. | |
135 bra DoneSave | |
136 DoneSave1 | |
137 | |
138 leax str640,pcr | |
139 cmpb #MGE640Format Is it 640? | |
140 bne DoneSave2 | |
141 ldb <type | |
142 cmpb #8 Type 8 is MGE | |
143 bne DoneSave | |
144 leax strMGE,pcr | |
145 bra DoneSave | |
146 DoneSave2 | |
147 | |
148 leax strVEFSq,pcr | |
149 cmpb #VEFSqFormat Is it VEF Squashed? | |
150 beq DoneSave | |
151 | |
152 leax strCM3,pcr | |
153 cmpb #CM3Format CM3 format | |
154 bne DoneSave3 | |
155 ldb <type | |
156 cmpb #6 Type 6/8 are normal CM3 | |
157 beq DoneSave | |
158 cmpb #8 | |
159 beq DoneSave | |
160 leax strCM3640,pcr Types 5/7 are 640 across CM3. | |
161 bra DoneSave | |
162 DoneSave3 | |
163 | |
164 * Add other formats here | |
165 DoneSave | |
166 lbsr O_Write | |
167 | |
168 leax str2done,pcr Output second part. | |
169 lbsr O_Write | |
170 | |
171 DoSaveEnd | |
172 puls a,b,x,y,u,pc | |
173 | |
174 strVEF fcc "normal VEF" | |
175 fcb 0 | |
176 strMGE fcc "MGE" | |
177 fcb 0 | |
178 str640 fcc "640 (MGE 640x200)" | |
179 fcb 0 | |
180 strVEFSq fcc "VEF Squashed" | |
181 fcb 0 | |
182 strCM3 fcc "CM3" | |
183 fcb 0 | |
184 strCM3640 fcc "CM3 (640x192)" | |
185 fcb 0 | |
186 str1done fcc "Picture saved in " | |
187 fcb 0 | |
188 str2done fcc " format." | |
189 fcb $0d,0 | |
190 | |
191 * Clear out linebuff | |
192 clrline | |
193 pshs a,b,x | |
194 leax linebuff,y | |
195 clra | |
196 ldb #200 | |
197 DoClear | |
198 sta ,x+ | |
199 decb | |
200 bne DoClear | |
201 puls a,b,x,pc | |
202 | |
203 * Complement linebuff | |
204 comline | |
205 pshs b,x | |
206 ldb #160 | |
207 leax linebuff,y | |
208 comline1 | |
209 com ,x+ | |
210 decb | |
211 bne comline1 | |
212 puls b,x,pc | |
213 | |
214 * Output an MGE header | |
215 MGEHeader | |
216 pshs a,b,x,y,u | |
217 leax altbuff,y | |
218 clr ,x+ Initial 0 byte. | |
219 lbsr copypals | |
220 clr ,x+ Mark RGB | |
221 lda #$ff | |
222 sta ,x+ We're not using MGE compression (blech!) | |
223 leau MGEname,pcr Give this a generic name. | |
224 ldb #30 | |
225 MGEhead1 | |
226 lda ,u+ | |
227 sta ,x+ | |
228 decb | |
229 bne MGEhead1 | |
230 ldd <cyclerate | |
231 stb ,x+ Save cycle rate | |
232 lda <cyclestart | |
233 lsla | |
234 lsla | |
235 lsla | |
236 lsla | |
237 ora <cycleend | |
238 sta ,x+ Save first/last palette rotation values. | |
239 | |
240 leax altbuff,y Write the actual header. | |
241 lda SavePath | |
242 ldy #51 | |
243 os9 I$Write | |
244 puls a,b,x,y,u,pc | |
245 | |
246 MGEname fcc "OS9 picture" | |
247 fcb 0 | |
248 | |
249 * Output a CM3 header | |
250 CM3Header | |
251 pshs a,b,x,y,u | |
252 leax altbuff,y | |
253 lda #1 Single screen w/o patterns | |
254 sta ,x+ | |
255 lbsr copypals 16 palette values | |
256 ldd <cyclerate | |
257 bne CM3head0 | |
258 ldb #1 | |
259 CM3head0 | |
260 stb ,x+ Cycle rate | |
261 ldd <extrarate | |
262 bne CM3head1 | |
263 ldb #1 | |
264 CM3head1 | |
265 stb ,x+ Extra rate | |
266 leau extrapals,y | |
267 ldd ,u++ | |
268 std ,x++ Copy extrapals to header | |
269 ldd ,u++ | |
270 std ,x++ | |
271 ldd ,u++ | |
272 std ,x++ | |
273 ldd ,u++ | |
274 std ,x++ | |
275 lda <cycle | |
276 beq CM3head2 | |
277 lda #$80 | |
278 CM3head2 | |
279 sta ,x+ Cycle enable flag | |
280 lda <extranum | |
281 beq CM3head3 | |
282 lda #$80 | |
283 CM3head3 | |
284 sta ,x+ Extra enable flag | |
285 lda #192 | |
286 sta ,x+ Number lines in picture | |
287 | |
288 pshs y | |
289 lda SavePath | |
290 leax altbuff,y Now, save the header. | |
291 ldy #30 | |
292 os9 I$Write | |
293 lbcs _error | |
294 puls y | |
295 | |
296 leax alt2buff,y CM3 uses alt2buff to store last line data | |
297 ldy #500 | |
298 clra | |
299 clrb | |
300 CM3head4 | |
301 std ,x++ | |
302 leay -1,y | |
303 bne CM3head4 | |
304 | |
305 puls a,b,x,y,u,pc | |
306 | |
307 * Output a VEF header | |
308 VEFHeader | |
309 pshs a,b,x,y,u | |
310 leax altbuff,y | |
311 clra For normal format | |
312 ldb SaveFormat | |
313 cmpb #VEFFormat Plain vanilla?? | |
314 beq Do1 | |
315 lda #$80 For Squashed format | |
316 Do1 | |
317 sta ,x+ | |
318 lda #9 | |
319 suba <type Get VEF screen type | |
320 cmpa #2 | |
321 bhi Do2 | |
322 deca | |
323 Do2 | |
324 sta ,x+ | |
325 | |
326 bsr copypals Now copy the palettes. | |
327 | |
328 * Now save the header out to the file. | |
329 leax altbuff,y | |
330 lda SavePath | |
331 pshs y | |
332 ldy #18 | |
333 os9 I$Write | |
334 lbcs _error | |
335 puls y | |
336 bsr Save8 | |
337 puls a,b,x,y,u,pc | |
338 | |
339 * Write out 8 blank lines to file. | |
340 Save8 | |
341 pshs b | |
342 lbsr clrline | |
343 ldb #8 | |
344 DoBlank | |
345 lbsr outline | |
346 decb | |
347 bne DoBlank | |
348 puls b,pc | |
349 | |
350 * | |
351 * Copy palettes to X, advance X by 16 bytes. | |
352 * | |
353 copypals | |
354 pshs a,b | |
355 lda <outpath | |
356 ldb #SS.Palet | |
357 os9 I$GetStt | |
358 leax 16,x | |
359 puls a,b,pc | |
360 | |
361 * | |
362 * Output linebuff to file | |
363 outline | |
364 pshs a | |
365 lda SaveFormat | |
366 cmpa #VEFSqFormat | |
367 bne outline1 | |
368 puls a | |
369 lbra outsqline Only VEF Squashed format uses outsqline | |
370 outline1 | |
371 cmpa #VEFFormat | |
372 bne outline2 | |
373 puls a | |
374 lbra outVEFline Unsquashed VEF line. | |
375 outline2 | |
376 cmpa #MGEFormat | |
377 bne outline3 | |
378 puls a | |
379 bra outMGEline Unsquashed MGE line. | |
380 outline3 | |
381 cmpa #MGE640Format | |
382 bne outline4 | |
383 puls a | |
384 bra outMGEline Unsquashed MGE line. | |
385 outline4 | |
386 cmpa #CM3Format | |
387 bne outline5 | |
388 puls a | |
389 bra outCM3line Output CM3 line. | |
390 outline5 | |
391 * Additional formats go here. | |
392 outlineend | |
393 puls a | |
394 rts | |
395 | |
396 * | |
397 * Output linebuff to file in normal MGE format | |
398 * | |
399 outMGEline | |
400 pshs a,b,x,y,u | |
401 lbsr MGEsame | |
402 leax altbuff,y | |
403 lda <type | |
404 cmpa #5 | |
405 bne outMGE1 | |
406 lbsr MGE57 Convert type 5 to type 7. | |
407 bra outMGE3 | |
408 outMGE1 | |
409 cmpa #6 | |
410 bne outMGE2 | |
411 ldb SaveFormat | |
412 cmpb #MGE640Format | |
413 beq outMGE11 | |
414 lbsr MGE68 For MGE, convert type 6 to type 8. | |
415 bra outMGE3 | |
416 outMGE11 | |
417 lbsr MGE67 For 640, convert type 6 to type 7. | |
418 bra outMGE3 | |
419 outMGE2 | |
420 * Other conversions here. | |
421 outMGE3 | |
422 lda SavePath | |
423 leax altbuff,y | |
424 ldy #160 After conversion, we always have 160 bytes/line | |
425 os9 I$Write | |
426 lbcs _error | |
427 puls a,b,x,y,u,pc | |
428 | |
429 * | |
430 * Output linebuff to file in CM3 format | |
431 * | |
432 outCM3line | |
433 pshs a,b,x,y,u | |
434 lbsr MGEsame copy data to altbuff | |
435 leax altbuff,y | |
436 lda <type | |
437 cmpa #5 | |
438 bne outCM31 | |
439 lbsr MGE57 Convert type 5 -> type 7 | |
440 bra outCM33 | |
441 outCM31 | |
442 cmpa #6 | |
443 bne outCM32 | |
444 lbsr MGE68 Convert type 6 -> type 8 | |
445 bra outCM33 | |
446 outCM32 | |
447 outCM33 | |
448 | |
449 lbsr CM3compress compress data from linebuff into altbuff | |
450 | |
451 lda SavePath | |
452 leax altbuff,y Output line data. | |
453 ldy ,x++ Get size of data. | |
454 os9 I$Write | |
455 lbcs _error | |
456 puls a,b,x,y,u,pc | |
457 | |
458 * | |
459 * Output linebuff to file in normal VEF format | |
460 * | |
461 outVEFline | |
462 pshs a,b,x,y,u | |
463 lda SavePath | |
464 leax linebuff,y | |
465 ldy LineSize | |
466 os9 I$Write | |
467 lbcs _error | |
468 puls a,b,x,y,u,pc | |
469 | |
470 * | |
471 * Output linebuff to file in Squashed VEF format | |
472 * | |
473 outsqline | |
474 pshs a,b,x,y,u | |
475 ldd LineSize | |
476 lsrb | |
477 rora Divide by two. | |
478 leax linebuff,y | |
479 lbsr VEFSquash Squash the first half of the line | |
480 bsr sqoutline output the packet | |
481 leax d,x | |
482 lbsr VEFSquash Squash the second half | |
483 bsr sqoutline output it. | |
484 puls a,b,x,y,u,pc | |
485 | |
486 * | |
487 * Output packet in Altbuff to SavePath | |
488 sqoutline | |
489 pshs a,b,x,y | |
490 leax altbuff,y | |
491 ldb ,x | |
492 incb | |
493 clra | |
494 tfr d,y | |
495 lda SavePath | |
496 os9 I$Write | |
497 lbcs _error | |
498 puls a,b,x,y,pc | |
499 | |
500 | |
501 endsect |