110
|
1 ;=============================================================================
|
|
2 ;
|
|
3 ; File color_processor.asm
|
|
4 ;
|
|
5 ; Decompress and draw an image.
|
|
6 ;
|
|
7 ; This program is free software: you can redistribute it and/or modify
|
|
8 ; it under the terms of the GNU General Public License as published by
|
|
9 ; the Free Software Foundation, either version 3 of the License, or
|
|
10 ; (at your option) any later version.
|
|
11 ;
|
|
12 ; This program is distributed in the hope that it will be useful,
|
|
13 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15 ; GNU General Public License for more details.
|
|
16 ;
|
|
17 ; You should have received a copy of the GNU General Public License
|
|
18 ; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19 ;
|
|
20 ; Copyright (c) 2010, JD Gascuel.
|
|
21 ;=============================================================================
|
|
22 ; HISTORY
|
123
|
23 ; 2010-12-13 : [jDG] Creation.
|
|
24 ; 2010-12-30 : [jDG] Revised to put temp into ACCESSRAM0
|
110
|
25 ;
|
|
26 ; RATIONALS: The OSTC have a nice color screen, and a std geek attitude impose
|
|
27 ; to show off ... ;-)
|
|
28 ;
|
|
29 ; Inputs: TBLPTR points to the image description block.
|
|
30 ; win_top, win_leftx2 the Top/Leftx2 corner here to put the image.
|
|
31 ; Ouputs: None.
|
|
32 ; Trashed: TBLPTR, TABLAT, FSR2, PROD, aa_width, aa_height
|
|
33 ;
|
|
34 ; ImageBloc:
|
|
35 ; db widthx2, height
|
|
36 ; db nbColors, 0 ; Unused yet... Should be 0 to keep packing happy.
|
|
37 ; dw color0, color1, color2, color3, ...
|
|
38 ; db ...packed pixels...
|
|
39 ;
|
|
40 ; Limitations:
|
|
41 ; * nbColors should be <= 15.
|
|
42 ; * image width should be even.
|
|
43 ; * image left border should be on even position too.
|
|
44 ; Compressed format:
|
|
45 ; - Upper nibble = color, lower nibble = count-1.
|
|
46 ; - All bytes F* accumulates to make count larger than 16.
|
|
47 ; Eg. 00 is 1 pixel color 0
|
|
48 ; 07 is 8 pixels color 0
|
|
49 ; 70 is 1 pixel color 7
|
|
50 ; bf is 16 pixels of color .11
|
|
51 ; F1 F2 F3 04 is 0x1235 pixels of color 0.
|
|
52 ;
|
123
|
53 ;Temporary overlay (in bank 0), ACCESS area
|
|
54 CBLOCK 0x000
|
|
55 img_colors
|
142
|
56 img_width:2 ; SHOULD be @1, because of PLED_box_write
|
123
|
57 img_pixelsL
|
|
58 img_pixelsH
|
|
59 img_pixelsU
|
|
60 img_countL
|
|
61 img_countH
|
|
62 colorTable:.30
|
|
63 ENDC
|
110
|
64
|
|
65 ;-----------------------------------------------------------------------------
|
|
66 color_image:
|
142
|
67 movlb HIGH(win_height) ; Switch to bank 0.
|
110
|
68
|
|
69 ;---- Get image parameters -------------------------------------------
|
|
70 tblrd*+
|
|
71 movff TABLAT,img_width
|
|
72 tblrd*+
|
123
|
73 movff TABLAT,win_height
|
110
|
74 tblrd*+
|
|
75 movff TABLAT,img_colors
|
|
76 tblrd*+
|
|
77 ;---- Copy color table -----------------------------------------------
|
|
78 movf img_colors,W
|
|
79 lfsr FSR2,colorTable
|
|
80 get_colors_loop:
|
|
81 tblrd*+
|
|
82 movff TABLAT,POSTINC2
|
|
83 tblrd*+
|
|
84 movff TABLAT,POSTINC2
|
|
85 decfsz WREG
|
|
86 bra get_colors_loop
|
|
87
|
|
88 ; Compute width * height * 2 : the number of pixels to write.
|
|
89 clrf img_pixelsU
|
123
|
90 movf img_width,W,ACCESS ; Compute number of pixels to draw
|
|
91 mulwf win_height ; 0 .. 160x240
|
110
|
92 bcf STATUS,C ; BEWARE: milw does not reset carry flag !
|
|
93 rlcf PRODL ; x2 --> 0 .. 320x240, might by > 0xFFFF
|
|
94 rlcf PRODH
|
|
95 movff PRODL, img_pixelsL
|
|
96 movff PRODH, img_pixelsH
|
|
97 rlcf img_pixelsU ; Get the upper bit in place.
|
|
98
|
|
99 ;---- Send window command --------------------------------------------
|
|
100 clrf img_width+1 ; x2 on width, for the true box size.
|
|
101 rlcf img_width+0
|
|
102 rlcf img_width+1
|
142
|
103 call PLED_box_write
|
110
|
104 AA_CMD_WRITE 0x22
|
|
105
|
|
106 ;---- Decode pixels --------------------------------------------------
|
|
107 color_image_loop_xy:
|
|
108 ; Get pixel count
|
|
109 clrf img_countL
|
|
110 clrf img_countH
|
|
111
|
|
112 color_image_loop_count:
|
|
113 tblrd*+ ; Get one byte
|
|
114
|
|
115 movlw 0x0F ; Get count bits
|
|
116 andwf TABLAT,W
|
|
117 swapf WREG ; On top-4 bits of W
|
|
118 rlcf WREG ; Push topmost bit into img_count:2
|
|
119 rlcf img_countL
|
|
120 rlcf img_countH
|
|
121 rlcf WREG ; Push topmost bit into img_count:2
|
|
122 rlcf img_countL
|
|
123 rlcf img_countH
|
|
124 rlcf WREG ; Push topmost bit into img_count:2
|
|
125 rlcf img_countL
|
|
126 rlcf img_countH
|
|
127 rlcf WREG ; Push topmost bit into img_count:2
|
|
128 rlcf img_countL
|
|
129 rlcf img_countH
|
|
130
|
|
131 movf TABLAT,W ; Does the color-bits mark a big-count ?
|
|
132 andlw 0xF0
|
|
133 xorlw 0xF0
|
|
134 bz color_image_loop_count ; YES: loop for more count bits.
|
|
135
|
|
136 ; Get pixel color into PROD
|
|
137 xorlw 0xF0 ; Get back index.
|
|
138 swapf WREG ; Get color index to lower bits.
|
|
139 addwf WREG ; x2
|
123
|
140 addlw LOW(colorTable) ; 0x60 + 2 * .15 < 0x80.
|
110
|
141 movff WREG,FSR2L
|
|
142 movff POSTINC2,PRODL
|
|
143 movff POSTINC2,PRODH
|
|
144
|
|
145 ; Substract count-1 from the number of pixel we should do.
|
|
146 movf img_countL,W ; Make a 24bit substraction.
|
|
147 subwf img_pixelsL,F
|
|
148 movf img_countH,W
|
|
149 subwfb img_pixelsH,F
|
|
150 movlw 0
|
|
151 subwfb img_pixelsU,F
|
|
152
|
|
153 incf img_countL ; Get back the true count.
|
|
154 addwfc img_countH
|
|
155
|
|
156 ; Loop sending pixel color
|
|
157 incf img_countH ; Because we decrement first, should add one here !
|
|
158 color_image_loop_pixel:
|
|
159 AA_DATA_WRITE_PROD
|
|
160 decfsz img_countL
|
|
161 bra color_image_loop_pixel
|
|
162 decfsz img_countH
|
|
163 bra color_image_loop_pixel
|
|
164
|
|
165 ; And count (on a 17bit counter)
|
|
166 clrf WREG ; Make a 24bit decrement.
|
|
167 decf img_pixelsL
|
|
168 subwfb img_pixelsH,F
|
|
169 subwfb img_pixelsU,F
|
|
170
|
|
171 movf img_pixelsL,W ; Test if img_pixels == 0
|
|
172 iorwf img_pixelsH,W
|
|
173 iorwf img_pixelsU,W
|
|
174 bnz color_image_loop_xy ; NO: loop...
|
|
175
|
|
176 ;---- Closeup --------------------------------------------------------
|
|
177 AA_CMD_WRITE 0x00
|
|
178 return
|