diff code_part1/OSTC_code_asm_part1/aa_wordprocessor.asm @ 706:d68c6a6b1f38

aa fonts processor
author heinrichsweikamp
date Tue, 16 Apr 2013 15:40:27 +0200
parents 55983c4d6b2d
children f32b9ad6244c
line wrap: on
line diff
--- a/code_part1/OSTC_code_asm_part1/aa_wordprocessor.asm	Mon Apr 15 21:13:14 2013 +0200
+++ b/code_part1/OSTC_code_asm_part1/aa_wordprocessor.asm	Tue Apr 16 15:40:27 2013 +0200
@@ -335,7 +335,7 @@
 		movff	aa_temp+1,PRODL         ; DISPLAY is big endian, so swap here.
 aa_decode_12:
 		btfss	aa_color_quart,ACCESS
-		bra		aa_decode_3
+		bra		aa_decode_12b
 
 		; Divide it once again by 2. Max red = 7/31.
 		rrcf	aa_temp+0,W,ACCESS      ; xxRRRxxG
@@ -350,32 +350,45 @@
 		movf	aa_temp+0,W,ACCESS      ; hence composants won't overlap.
 		addwfc	PRODH,F				    ; In right order, to propagate carry.
 
+aa_decode_12b:
         movff   win_flags,WREG          ; BEWARE: bank0 bit-test
         btfss   WREG,1                  ; Display1?
         bra		aa_decode_3			    ; No, Done.
 
-        ; Convert 16Bit RGB b'RRRRRGGG GGGBBBBB' into 24Bit RGB b'00RRRRRR 00GGGGGG 00BBBBBB'
+        ; Convert 16Bit RGB b'RRRRRGGG GGGBBBBB' into 24Bit RGB b'RRRRRR00 GGGGGG00 BBBBBB00'
+                            ; PRODH     PRODL                  win_color4 win_color5 win_color6
         ; Blue
-        movff   PRODH,win_color3
+        movff   PRODL,win_color6
+        bcf     STATUS,C
+        rlcf    win_color6,F            ; = UUBBBBB0
         bcf     STATUS,C
-        rlcf    win_color3,F            ; = U0BBBBB0
-        bcf     win_color3,7            ; = 00BBBBB0
+        rlcf    win_color6,F            ; = UBBBBB00
+        bcf     STATUS,C
+        rlcf    win_color6,F            ; = BBBBB000
+        btfsc   win_color6,7
+        bsf     win_color6,2
+
         ; Green
-        rrcf    PRODL,F
         rrcf    PRODH,F
         rrcf    PRODL,F
         rrcf    PRODH,F
-        rrcf    PRODL,F                 ; = UUURRRRR
-        rrcf    PRODH,F                 ; = GGGGGGUU
-        bcf     STATUS,C
-        rrcf    PRODH,F                 ; = 0GGGGGGU
-        bcf     STATUS,C
-        rrcf    PRODH,F                 ; = 00GGGGGG
+        rrcf    PRODL,F
+        rrcf    PRODH,F                 ; = UUURRRRR
+        rrcf    PRODL,F                 ; = GGGGGGUU
+        bcf     PRODL,1                 ; = GGGGGG0U
+        bcf     PRODL,0                 ; = GGGGGG00
+        movff   PRODL,win_color5
+
         ; Red
         bcf     STATUS,C
-        rlcf    PRODL,F                 ; = UURRRRR0
-        bcf     PRODL,6                 ; = U0RRRRR0
-        bcf     PRODL,7                 ; = 00RRRRR0
+        rlcf    PRODH,F                 ; = UURRRRR0
+        bcf     STATUS,C
+        rlcf    PRODH,F                 ; = URRRRR00
+        bcf     STATUS,C
+        rlcf    PRODH,F                 ; = RRRRR000
+        btfsc   PRODH,7
+        bsf     PRODH,2
+        movff   PRODH,win_color4
 		bra		aa_decode_3			    ; Done.
 
 		; ---- Simple BLACK and WHITE cases ------------------------------
@@ -387,17 +400,42 @@
 		; WHITE pixel (ie. full color)
 		movff	win_color1,PRODH	    ; current draw color
 		movff	win_color2,PRODL	    ; (rem: DISPLAY is big endian)
-        setf    win_color3
-		bra		aa_decode_3
+		bra		aa_decode_12b
 
 aa_decode_2:
 		clrf	PRODH,A				    ; BLACK pixel
 		clrf	PRODL,A
-        clrf    win_color3
+        clrf    win_color4
+        clrf    win_color5
+        clrf    win_color6
 
 aa_decode_3:
 		;---- PIXEL WRITE LOOP -----------------------------------------------
-		AA_DATA_WRITE_PROD
+;		AA_DATA_WRITE_PROD
+    	bsf		DISPLAY_rs					; Data!
+
+        movff   win_flags,WREG          ; Display1? win_flags is in bank0...
+        btfsc   WREG,1                  ; Display1?
+        bra     aa_decode_3_display1    ; Yes.
+
+    	movff	PRODH,PORTD				; Move high byte to PORTD (DISPLAY is bigendian)
+        bcf		DISPLAY_rw
+        bsf		DISPLAY_rw
+        movff	PRODL,PORTD				; Move low byte to PORTD
+        bra     aa_decode_3_done
+
+aa_decode_3_display1:
+    	movff   win_color4,PORTD		; Move high byte to PORTD (DISPLAY is bigendian)
+        bcf		DISPLAY_rw
+        bsf		DISPLAY_rw
+        movff   win_color5,PORTD		; Move low byte to PORTD
+        bcf		DISPLAY_rw
+        bsf		DISPLAY_rw
+        movff   win_color6,PORTD        ; Move low(est) byte to PORTD
+aa_decode_3_done:
+        bcf		DISPLAY_rw
+        bsf		DISPLAY_rw
+
 		decf	aa_bitlen,F,ACCESS
 		bnz		aa_decode_3