; ***************************************************************************
; copyright   : (C) 2025 by Martin Preuss
; email       : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome".                              *
; * Please see toplevel file COPYING of that project for license details.   *
; ***************************************************************************

#ifndef AQH_AVR_ILI9341_FONT12X20_ASM
#define AQH_AVR_ILI9341_FONT12X20_ASM



; ***************************************************************************
; code

.cseg


; ---------------------------------------------------------------------------
; @routine ili9341Font12x20MonoHandlerFn
;
; Handler for 12x20 Mono Fonts
;

ili9341Font12x20MonoHandlerFn:
  cpi r23, FONT_FN_RENDER
  breq ili9341Font12x20MonoRenderChar
  bigjmp FONT_GenericHandler
; @end




; ---------------------------------------------------------------------------
; @routine ili9341Font12x20RenderCharacter

; @param R16    character to write
; @param R1:R0  background color
; @param R3:R2  foreground color
; @param Z      pointer to font
; @return r18   char width in pixel
; @return r19   char height in pixel
; @clobbers r17, r18, r19, r23, r24, r25, x

ili9341Font12x20MonoRenderChar:
  push zl
    push zh
      rcall ili9341Font12x20GetCharPosInFont         ; (; (r16, r17, r18, r24, r25)
      ldi r25, 20   ; 20 bytes height
ili9341Font12x20MonoRenderChar_loop1:
        ldi r24, 12   ; 12 bits
        ldi r23, 8    ; bit counter
        lpm r17, Z+   ; current font byte
ili9341Font12x20MonoRenderChar_loop2:
          dec r23
          brne ili9341Font12x20MonoRenderChar_haveByte
          lpm r17, Z+
          ldi r23, 8
ili9341Font12x20MonoRenderChar_haveByte:
          lsr r17
          brcs ili9341Font12x20MonoRenderChar_writeForeground
          mov r18, r0
          mov r19, r1
          rjmp ili9341Font12x20MonoRenderChar_sendToDisplay
ili9341Font12x20MonoRenderChar_writeForeground:
          mov r18, r2
          mov r19, r3
ili9341Font12x20MonoRenderChar_sendToDisplay:
          mov r16, r19
          rcall SPIHW_MasterTransfer          ; (R16)
          mov r16, r18
          rcall SPIHW_MasterTransfer          ; (R16)
ili9341Font12x20MonoRenderChar_loop2end:
          dec r24
        brne ili9341Font12x20MonoRenderChar_loop2
        dec r25
      brne ili9341Font12x20MonoRenderChar_loop1
      ldi r18, 12
      ldi r19, 20
    pop zh
  pop zl
  ret
; @end



; ---------------------------------------------------------------------------
; @routine ili9341Font12x20GetCharPosInFont

; @param  R16     character to write
; @param  Z pointer to font
; @return Z pointer to begin of char data
; @clobbers 

ili9341Font12x20GetCharPosInFont:
  mov r24, r16
  adiw zh:zl, FONT_OFFS_FIRSTCHAR
  lpm r24, Z+  ; first char num
  lpm r25, Z   ; num of chars
  sbiw zh:zl, FONT_OFFS_FIRSTCHAR+1
  sub r16, r24
  brcs ili9341Font12x20GetCharPosInFont_ret
  cp r16, r25
  brcc ili9341Font12x20GetCharPosInFont_ret

  mov r24, r16
  clr r25

  lsl r24      ; x2
  rol r25

  lsl r24      ; x4
  rol r25

  add r24, r16 ; x5
  adc r25, r16
  sub r25, r16

  lsl r24      ; x10
  rol r25

  lsl r24      ; x20
  rol r25

  lsl r24      ; x40
  rol r25

  adiw zh:zl, FONT_OFFS_RESSOURCEID_LO
  lpm r16, Z+
  lpm r17, Z
  ldi zl, LOW(RESSOURCE_ADDR*2)
  ldi zh, HIGH(RESSOURCE_ADDR*2)
  bigcall RES_GetRessource             ; (r16, r17, r18)
  ; ignore error here

  add zl, r24
  adc zh, r25
ili9341Font12x20GetCharPosInFont_ret:
  ret
; @end



#endif ; AQH_AVR_ILI9341_FONT12X20_ASM

