annotate code_part1/OSTC_code_asm_part1/color_processor.asm @ 642:2cecac640202

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