Mercurial > public > hwos_code
view src/color_processor.asm @ 606:8b250afb8bdd
minor
author | heinrichsweikamp |
---|---|
date | Sun, 25 Nov 2018 15:15:27 +0100 |
parents | ca4556fb60b9 |
children | d866684249bd |
line wrap: on
line source
;============================================================================= ; ; File File color_processor.asm ## V2.98c ; ; Decompress and draw an image. ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY ; 2010-12-13 : [jDG] Creation. ; 2010-12-30 : [jDG] Revised to put temp into ACCESSRAM0 ; ; RATIONALS: The OSTC have a nice color screen, and a std geek attitude impose ; to show off ... ;-) ; ; Inputs: TBLPTR points to the image description block. ; win_top, win_leftx2 the Top/Leftx2 corner here to put the image. ; Outputs: None. ; Trashed: TBLPTR, TABLAT, FSR2, PROD, win_width, win_height ; ; ImageBloc: ; db widthx2, height ; db nbColors, 0 ; 0 = unused yet, should remain 0 to keep packing happy ; dw color0, color1, color2, color3, ... ; db packed pixels... ; ; Limitations: ; * nbColors <= 127 ; * image width should be even ; * image left border should be on even position, too ; ; Compressed format: ; - 1-3 bytes pixel count, followed by 1 byte pixel color ; - bit 7 = 1: byte holds pixel count in bits 6-0 ; - bit 7 = 0: byte holds pixel color in bits 6-0 ; - all pixel count bytes accumulate: ; - 1 byte pixel count: 1xxxxxxx -> 7 bit pixel count ; - 2 bytes pixel count: 1yyyyyyy 1xxxxxxx -> 14 bit pixel count ; - 3 bytes pixel count: 1zzzzzzz 1yyyyyyy 1xxxxxxx -> 21 bit pixel count ; ; Pixels are written column by column from left to right, with columns down first. ; ;----------------------------------------------------------------------------- #include "hwos.inc" #include "tft.inc" color_proc CODE ;----------------------------------------------------------------------------- ; Note: some variables (win_width, win_height) are in BANK 0 ! global color_image color_image: banksel common ; Bank 1, just to be sure... ;---- Get image size ----------------------------------------------- tblrd*+ movff TABLAT,win_width tblrd*+ movff TABLAT,win_height ; Compute width * height * 2 : the number of pixels to write. clrf img_pixels+2 movf win_width,W ; Compute number of pixels to draw mulwf win_height ; 0 .. 160x240 bcf STATUS,C ; BEWARE: mulwf does not reset carry flag! rlcf PRODL ; x2 --> 0 .. 320x240, might be > 0xFFFF rlcf PRODH movff PRODL, img_pixels+0 movff PRODH, img_pixels+1 rlcf img_pixels+2 ; Get the upper bit in place clrf WREG ; Decrement count to ease end detection decf img_pixels+0,F subwfb img_pixels+1,F subwfb img_pixels+2,F ;---- Send window command -------------------------------------------- clrf win_width+1 ; x2 on width, for the true box size rlcf win_width+0 rlcf win_width+1 call TFT_box_write Index_out 0x22 ;---- Read the colors ------------------------------------------------ rcall get_colors ;---- Decode pixels -------------------------------------------------- color_image_loop_xy: ; Get pixel count clrf img_count+0 clrf img_count+1 ;---- Decode repetition count color_image_decode_1: tblrd*+ ; Get one byte btfss TABLAT,7 ; High bit cleared ? bra color_image_decode_2 ; YES: this is a color byte rlcf TABLAT,F ; Drop high bit. movlw .7 ; Move 7 bits color_image_decode_3: rlcf TABLAT,F ; Get bit into carry rlcf img_count+0,F ; Push into pixel count rlcf img_count+1,F decfsz WREG bra color_image_decode_3 ; and loop for each 7 bits bra color_image_decode_1 ; Decode next byte color_image_decode_2: ;---- Get pixel color into PROD movf TABLAT,W ; Get color index addwf WREG ; *2 lfsr FSR2,buffer ; Reinitialize color table movff WREG,FSR2L ; LOW(buffer) == 0 movff POSTINC2,PRODL movff POSTINC2,PRODH ; Subtract count-1 from the number of pixel we should do. movf img_count+0,W ; Make a 24bit subtraction subwf img_pixels+0,F movf img_count+1,W subwfb img_pixels+1,F movlw 0 subwfb img_pixels+2,F infsnz img_count+0 ; Increment count incf img_count+1 ; Loop sending pixel color incf img_count+1 ; Because we decrement first, should add one here ! bsf tft_rs,0 ; RS_H Data movff PRODH,PORTA ; Move high byte to PORTA movff PRODL,PORTH ; Move low byte to PORTH bcf INTCON,GIE color_image_loop_pixel: bcf tft_nwr,0 ; WR_L bsf tft_nwr,0 ; WR_H Tick decfsz img_count+0 bra color_image_loop_pixel decfsz img_count+1 bra color_image_loop_pixel bsf INTCON,GIE ; And count (on a 24bit counter) clrf WREG ; Make a 24bit decrement decf img_pixels+0 subwfb img_pixels+1,F subwfb img_pixels+2,F bnn color_image_loop_xy ; Not finished ? loop... ;---- Closeup -------------------------------------------------------- Index_out 0x00 return global get_colors get_colors: tblrd*+ ; read number of image colors movff TABLAT,lo ; store in lo tblrd*+ ; skip one spare byte (future flags ?) movf lo,W lfsr FSR2,buffer ; set up buffer as storage for the colors get_colors_loop: tblrd*+ btfss use_custom_colors ; shall custom colors be used? movff TABLAT,POSTINC2 ; NO tblrd*+ btfss use_custom_colors ; shall custom colors be used? movff TABLAT,POSTINC2 ; NO decfsz WREG bra get_colors_loop bcf use_custom_colors ; clear custom colors request return END