comparison src/color_processor.asm @ 0:11d4fc797f74

init
author heinrichsweikamp
date Wed, 24 Apr 2013 19:22:45 +0200
parents
children 653a3ab08062
comparison
equal deleted inserted replaced
-1:000000000000 0:11d4fc797f74
1 ;=============================================================================
2 ;
3 ; File File color_processor.asm
4 ;
5 ; Decompress and draw an image.
6 ;
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
8 ;=============================================================================
9 ; HISTORY
10 ; 2010-12-13 : [jDG] Creation.
11 ; 2010-12-30 : [jDG] Revised to put temp into ACCESSRAM0
12 ;
13 ; RATIONALS: The OSTC have a nice color screen, and a std geek attitude impose
14 ; to show off ... ;-)
15 ;
16 ; Inputs: TBLPTR points to the image description block.
17 ; win_top, win_leftx2 the Top/Leftx2 corner here to put the image.
18 ; Ouputs: None.
19 ; Trashed: TBLPTR, TABLAT, FSR2, PROD, win_width, win_height
20 ;
21 ; ImageBloc:
22 ; db widthx2, height
23 ; db nbColors, 0 ; Unused yet... Should be 0 to keep packing happy.
24 ; dw color0, color1, color2, color3, ...
25 ; db ...packed pixels...
26 ;
27 ; Limitations:
28 ; * nbColors should be <= 15.
29 ; * image width should be even.
30 ; * image left border should be on even position too.
31 ; Compressed format:
32 ; - Upper nibble = color, lower nibble = count-1.
33 ; - All bytes F* accumulates to make count larger than 16.
34 ; Eg. 00 is 1 pixel color 0
35 ; 07 is 8 pixels color 0
36 ; 70 is 1 pixel color 7
37 ; bf is 16 pixels of color .11
38 ; F1 F2 F3 04 is 0x1235 pixels of color 0.
39 ;
40 ;-----------------------------------------------------------------------------
41
42 #include "ostc3.inc"
43 #include "tft.inc"
44
45 ;-----------------------------------------------------------------------------
46 ; Temporary overlay (in bank 1).
47
48 CBLOCK tmp ; Data overlay in reserved tmp area.
49 img_colors:1
50 img_pixels:3
51 img_count:2
52 ; Reserved to tmp+0x07...
53 ENDC
54
55 ;-----------------------------------------------------------------------------
56 ;
57 ; Note: Some variables (win_width, win_height) are in BANK0 !
58 basic CODE
59 global color_image
60 color_image:
61 banksel win_width ; Bank1, just to be sure...
62
63 ;---- Get image parameters -------------------------------------------
64 tblrd*+
65 movff TABLAT,win_width
66 tblrd*+
67 movff TABLAT,win_height
68 tblrd*+
69 movff TABLAT,img_colors
70 tblrd*+ ; Skip one byte (future flags ?)
71 ;---- Copy color table -----------------------------------------------
72 movf img_colors,W
73 lfsr FSR2,buffer
74 get_colors_loop:
75 tblrd*+
76 movff TABLAT,POSTINC2
77 tblrd*+
78 movff TABLAT,POSTINC2
79 decfsz WREG
80 bra get_colors_loop
81
82 ; Compute width * height * 2 : the number of pixels to write.
83 clrf img_pixels+2
84 movf win_width,W ; Compute number of pixels to draw
85 mulwf win_height ; 0 .. 160x240
86 bcf STATUS,C ; BEWARE: mulwf does not reset carry flag !
87 rlcf PRODL ; x2 --> 0 .. 320x240, might be > 0xFFFF
88 rlcf PRODH
89 movff PRODL, img_pixels+0
90 movff PRODH, img_pixels+1
91 rlcf img_pixels+2 ; Get the upper bit in place.
92
93 clrf WREG ; Decrement count to ease end detection.
94 decf img_pixels+0,F
95 subwfb img_pixels+1,F
96 subwfb img_pixels+2,F
97
98 ;---- Send window command --------------------------------------------
99 clrf win_width+1 ; x2 on width, for the true box size.
100 rlcf win_width+0
101 rlcf win_width+1
102 call TFT_box_write
103 Index_out 0x22
104
105 ;---- Decode pixels --------------------------------------------------
106 color_image_loop_xy:
107 ; Get pixel count
108 clrf img_count+0
109 clrf img_count+1
110
111 ;---- Decode repetition count
112 color_image_decode_1:
113 tblrd*+ ; Get one byte
114
115 btfss TABLAT,7 ; High bit cleared ?
116 bra color_image_decode_2 ; YES: this is a color byte.
117
118 rlcf TABLAT,F ; Drop high bit.
119 movlw .7 ; Move 7 bits
120 color_image_decode_3:
121 rlcf TABLAT,F ; Get bit into carry
122 rlcf img_count+0,F ; Push into pixel count
123 rlcf img_count+1,F
124 decfsz WREG
125 bra color_image_decode_3 ; and loop foreach 7 bits.
126
127 bra color_image_decode_1 ; Decode next byte.
128
129 color_image_decode_2:
130 ;---- Get pixel color into PROD
131 movf TABLAT,W ; Get color index.
132 addwf WREG ; *2
133 lfsr FSR2,buffer ; Reinitialize color table.
134 movff WREG,FSR2L ; LOW(buffer) == 0
135 movff POSTINC2,PRODL
136 movff POSTINC2,PRODH
137
138 ; Substract count-1 from the number of pixel we should do.
139 movf img_count+0,W ; Make a 24bit substraction.
140 subwf img_pixels+0,F
141 movf img_count+1,W
142 subwfb img_pixels+1,F
143 movlw 0
144 subwfb img_pixels+2,F
145
146 color_image_not_over:
147 infsnz img_count+0 ; Increment count.
148 incf img_count+1
149
150 ; Loop sending pixel color
151 incf img_count+1 ; Because we decrement first, should add one here !
152 bsf tft_rs,0 ; RS_H ; Data
153 movff PRODH,PORTA ; Move high byte to PORTA
154 movff PRODL,PORTH ; Move low byte to PORTH
155 color_image_loop_pixel:
156 bcf tft_nwr,0 ; WR_L
157 bsf tft_nwr,0 ; WR_H ; Tick
158 decfsz img_count+0
159 bra color_image_loop_pixel
160 decfsz img_count+1
161 bra color_image_loop_pixel
162
163 ; And count (on a 24bit counter)
164 clrf WREG ; Make a 24bit decrement.
165 decf img_pixels+0
166 subwfb img_pixels+1,F
167 subwfb img_pixels+2,F
168
169 bnn color_image_loop_xy ; Not finished ? loop...
170
171 ;---- Closeup --------------------------------------------------------
172 Index_out 0x00
173 return
174
175 end