; ***************************************************************************
; 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.   *
; ***************************************************************************


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

.cseg



#if 0
; ---------------------------------------------------------------------------
; @routine ili9341_WriteCharacterX1At

; @param  R16    character to write
; @param  r5:r4  X
; @param  r7:r6  Y
; @param  r1:r0  background color
; @param  r3:r2  foreground color
; @param  Z      pointer to font (byte address for LPM!)
; @param  X      pointer to RAM to store data to
; @return r5:r4  new X (advanced by character width)
; @clobbers r16 (r17, r20, r21, r22, r23, r24, r25, X)

ili9341_WriteCharacterX1At:
  push xl
    push xh
      rcall ili9341FontRenderChar      ; (r16, r17, r24, r25, z)
      rcall ili9341BitBlit             ; (r16, r17, r20, r21, r22, r23, r24, r25, X)
      ; advance X (add char width to X)
      add r4, r8
      adc r5, r9
    pop xh
  pop xl
  ret
; @end




; ---------------------------------------------------------------------------
; @routine ili9341_WriteCharacterX2At

; @param  R16    character to write
; @param  r5:r4  X
; @param  r7:r6  Y
; @param  r1:r0  background color
; @param  r3:r2  foreground color
; @param  Z      pointer to font (byte address for LPM!)
; @param  X      pointer to RAM to store data to
; @return r5:r4  new X (advanced by character width)
; @clobbers r16 (r17, r18, r19, r20, r21, r22, r23, r24, r25, X)

ili9341_WriteCharacterX2At:
  rcall ili9341FontRenderChar      ; (r16, r17, r24, r25, z)
  rcall ili9341BitBlitStretch2     ; (r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, X)
  ; advance X (add double char width to X)
  lsl r8      ; Wx2
  rol r9
  add r4, r8  ; add to X
  adc r5, r9
  ret
; @end



; ---------------------------------------------------------------------------
; @routine ili9341_WriteCharacterX4At

; @param  R16    character to write
; @param  r5:r4  X
; @param  r7:r6  Y
; @param  r1:r0  background color
; @param  r3:r2  foreground color
; @param  Z      pointer to font (byte address for LPM!)
; @param  X      pointer to RAM to store data to
; @return r5:r4  new X (advanced by character width)
; @clobbers r16, r17, r18, r19, r24, r25, x, z

ili9341_WriteCharacterX4At:
  rcall ili9341FontRenderChar ; (r16, r17, r24, r25, z)
  rcall ili9341BitBlitStretch4     ; (r16, r17, r20, r21, r22, r23, r24, r25, X)
  ; advance X (add quad char width to X)
  lsl r8      ; Wx2
  rol r9
  lsl r8      ; Wx4
  rol r9
  add r4, r8  ; add to X
  adc r5, r9
  ret
; @end





; ---------------------------------------------------------------------------
; @routine ili9341FontRenderChar

; @param  R16     character to write
; @param  Z       pointer to font
; @param  X       pointer to RAM to store data to
; @return r9:r8   character width in points
; @return r11:r10 character height in points
; @clobbers r16 (r17, r24, r25, z)

ili9341FontRenderChar:
  ; render character
  push xl
    push xh
      rcall FONT_RenderChar
    pop xh
  pop xl

  ; set src width and height
  mov r8, r18
  clr r9
  mov r10, r19
  clr r11
  ret
; @end



; ---------------------------------------------------------------------------
; @routine textNibbleToAscii
;
; Convert a nibble to an ASCII char.
; @return R16 ASCII representation of that nibble (e.g. '0' for 0)
; @param  R16 byte (in bits 0-3)
; @clobbers r16, r17

textNibbleToAscii:
  andi r16, 0xf
  cpi r16, 10
  brcs textNibbleToAscii_l1
  ldi r17, 7
  add r16, r17
textNibbleToAscii_l1:
  ldi r17, '0'
  add r16, r17
  ret
; @end



#if 0
; ---------------------------------------------------------------------------
; @routine ili9341_WriteCharacterX4At

; @param  R16    byte to write
; @param  r5:r4  X
; @param  r7:r6  Y
; @param  r1:r0  background color
; @param  r3:r2  foreground color
; @param  Z      pointer to font (byte address for LPM!)
; @param  X      pointer to RAM to store data to
; @return r5:r4  new X (advanced by character width)
; @clobbers r16, r17, r18, r19, r24, r25, x, z


ili9341_WriteHexByte:
  push r16
    swap r16
    rcall textNibbleToAscii ; write high nibble (r16, r17)
    push xl
      push xh
        rcall ili9341_WriteCharacterX2At ; (r16, r17, r18, r19, r20, r24, r25, x, z)
      pop xh
    pop xl
  pop r16
  rcall textNibbleToAscii ; write high nibble (r16, r17)
  rcall ili9341_WriteCharacterX2At ; (r16, r17, r18, r19, r20, r24, r25, x, z)
  ret
; @end



Debug_WriteHexByte:
  push r16
  ; set Xpos
    ldi r16, LOW(50)
    mov r4, r16
    ldi r16, HIGH(50)
    mov r5, r16
    
  ; setYpos
    ldi r16, LOW(200)
    mov r6, r16
    ldi r16, HIGH(200)
    mov r7, r16
    
  ; set font pos
    ldi zl, LOW(font2_6x8*2)
    ldi zh, HIGH(font2_6x8*2)
    
  ; set buffer pos
  ;  ldi xl, LOW(ILI9341_buffer)
  ;  ldi xh, HIGH(ILI9341_buffer)
    ldi xl, LOW(0x260)
    ldi xh, HIGH(0x260)
  pop r16
  rjmp ili9341_WriteHexByte




; @param X=ptr
; @param r17 size
Debug_WriteHexBuffer:
; set Xpos
  ldi r16, LOW(50)
  mov r4, r16
  ldi r16, HIGH(50)
  mov r5, r16
  
; setYpos
  ldi r16, LOW(200)
  mov r6, r16
  ldi r16, HIGH(200)
  mov r7, r16

; set foreground color
  ldi r16, 0b00000000 ; black
  mov r2, r16
  mov r3, r16
  
; set font
  ldi zl, LOW(font2_6x8*2)
  ldi zh, HIGH(font2_6x8*2)

Debug_WriteHexBuffer_loop:
    push r17
      ld r16, X+
      push xl
        push xh
          ldi xl, LOW(0x260)
          ldi xh, HIGH(0x260)
          rcall ili9341_WriteHexByte
      
          ldi r16, 32
          rcall ili9341_WriteCharacterX2At ; (r16, r17, r18, r19, r24, r25, x, z)
        pop xh
      pop xl
    pop r17
    dec r17
  brne Debug_WriteHexBuffer_loop
  ret

#endif


#endif ; if 0
