; *************************************************************************** ; 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. * ; *************************************************************************** ; --------------------------------------------------------------------------- ; @routine ili9341SetAddressWindow ; ; @param r5:r4 X0 ; @param r7:r6 Y0 ; @param r9:r8 W ; @param r11:r10 H ; @clobbers R16, r20, r21 ili9341SetAddressWindow: ; calc XEnd (=X+W-1) mov r20, r8 mov r21, r9 add r20, r4 adc r21, r5 subi r20, 1 sbci r21, 0 ; send column address ldi r16, ILI9341_CMD_CASET rcall ili9341SendCommand ; X0 mov r16, r5 rcall ili9341SendData mov r16, r4 rcall ili9341SendData ; X1 mov r16, r21 rcall ili9341SendData mov r16, r20 rcall ili9341SendData ; calc YEnd (=Y+H-1) mov r20, r10 mov r21, r11 add r20, r6 adc r21, r7 subi r20, 1 sbci r21, 0 ; send row address ldi r16, ILI9341_CMD_PASET rcall ili9341SendCommand ; Y0 mov r16, r7 rcall ili9341SendData mov r16, r6 rcall ili9341SendData ; Y1 mov r16, r21 rcall ili9341SendData mov r16, r20 rcall ili9341SendData ret ; @end ; --------------------------------------------------------------------------- ; @routine ILI9341_FillRect ; @param r3:r2 color ; @param r5:r4 X0 ; @param r7:r6 Y0 ; @param r9:r8 X1/W ; @param r11:r10 Y1/H ILI9341_FillRect: push r15 in r15, SREG cli rcall ili9341BeginSpi ; (R16, R17) rcall ili9341SetAddressWindow ; (R16, r20, r21) mov r18, r2 ; color mov r19, r3 mov r22, r10 ; H low mov r23, r11 ; H high ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM rcall ili9341SendCommand cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) ILI9341_FillRect_loopH: mov r24, r8 ; W low mov r25, r9 ; W high ILI9341_FillRect_loopW: mov r16, r19 rcall SPIHW_MasterTransfer mov r16, r18 rcall SPIHW_MasterTransfer sbiw r25:r24, 1 brne ILI9341_FillRect_loopW mov r24, r22 ; H low mov r25, r23 ; H high sbiw r25:r24, 1 ; dec mov r22, r24 ; save in r23:r22 mov r23, r25 brne ILI9341_FillRect_loopH sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high rcall ili9341EndSpi out SREG, r15 pop r15 ret ; @end ; --------------------------------------------------------------------------- ; @routine ili9341BitBlit ; @param r5:r4 X (dest) ; @param r7:r6 Y (dest) ; @param r9:r8 W ; @param r11:r10 H ; @param X source data pointer (RAM) ; @clobbers r16, r22, r23, r24, r25, X (r17, r20, r21) ili9341BitBlit: push r15 in r15, SREG cli rcall ili9341BeginSpi ; (r16, r17) rcall ili9341SetAddressWindow ; (R16, R20, R21) ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM rcall ili9341SendCommand mov r22, r10 mov r23, r11 cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) ili9341BitBlit_loopH: mov r24, r8 mov r25, r9 ili9341BitBlit_loopW: ld r18, X+ ld r19, X+ mov r16, r19 rcall SPIHW_MasterTransfer ; (R16) mov r16, r18 rcall SPIHW_MasterTransfer ; (R16) sbiw r25:r24, 1 brne ili9341BitBlit_loopW mov r24, r22 mov r25, r23 sbiw r25:r24, 1 mov r22, r24 mov r23, r25 brne ili9341BitBlit_loopH sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high rcall ili9341EndSpi ; (R16) out SREG, r15 pop r15 ret ; @end ; --------------------------------------------------------------------------- ; @routine ili9341BitBlitStretch2 ; @param r5:r4 X (dest) ; @param r7:r6 Y (dest) ; @param r9:r8 W ; @param r11:r10 H ; @param X source data pointer (RAM) ; @clobbers r16, r22, r23, r24, r25, X (r17, r18, r19, r20, r21) ili9341BitBlitStretch2: push r15 in r15, SREG cli push r8 push r9 push r10 push r11 ; width lsl r8 ; x2 rol r9 ; height lsl r10 ; x2 rol r11 rcall ili9341BeginSpi ; (r16, r17) rcall ili9341SetAddressWindow ; (R16, R20, R21) pop r11 pop r10 pop r9 pop r8 ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM rcall ili9341SendCommand mov r22, r10 mov r23, r11 cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) ldi r17, 2 ili9341BitBlitStretch2_loopH: mov r20, xl ; preserve for next run mov r21, xh rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) mov xl, r20 mov xh, r21 rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) mov r24, r22 mov r25, r23 sbiw r25:r24, 1 mov r22, r24 mov r23, r25 brne ili9341BitBlitStretch2_loopH sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high rcall ili9341EndSpi ; (R16) out SREG, r15 pop r15 ret ; @end ; --------------------------------------------------------------------------- ; @routine ili9341BitBlitStretch4 ; @param r5:r4 X (dest) ; @param r7:r6 Y (dest) ; @param r9:r8 W ; @param r11:r10 H ; @param X source data pointer (RAM) ; @clobbers r16, r22, r23, r24, r25, X (r17, r20, r21) ili9341BitBlitStretch4: push r15 in r15, SREG cli push r8 push r9 push r10 push r11 ; width lsl r8 ; x2 rol r9 lsl r8 ; x4 rol r9 ; height lsl r10 ; x2 rol r11 lsl r10 ; x4 rol r11 rcall ili9341BeginSpi ; (r16, r17) rcall ili9341SetAddressWindow ; (R16, R20, R21) pop r11 pop r10 pop r9 pop r8 ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM rcall ili9341SendCommand mov r22, r10 mov r23, r11 ldi r17, 4 cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) ili9341BitBlitStretch4_loopH: mov r20, xl ; preserve for next run mov r21, xh rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) mov xl, r20 mov xh, r21 rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) mov xl, r20 mov xh, r21 rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) mov xl, r20 mov xh, r21 rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) mov r24, r22 mov r25, r23 sbiw r25:r24, 1 mov r22, r24 mov r23, r25 brne ili9341BitBlitStretch4_loopH sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high rcall ili9341EndSpi ; (R16) out SREG, r15 pop r15 ret ; @end ; --------------------------------------------------------------------------- ; @routine ili9341BitBlitStretchNWriteLine ; @param r9:r8 width ; @param r17 repeat factor ; @param X source position of line ; @clobbers r16, r17, r18, r19, r24, r25, X ili9341BitBlitStretchNWriteLine: mov r24, r8 mov r25, r9 ili9341BitBlitStretchNWriteLine_loop1: ld r18, X+ ld r19, X+ push r17 ili9341BitBlitStretchNWriteLine_loop2: mov r16, r19 rcall SPIHW_MasterTransfer ; (R16) mov r16, r18 rcall SPIHW_MasterTransfer ; (R16) dec r17 brne ili9341BitBlitStretchNWriteLine_loop2 pop r17 sbiw r25:r24, 1 brne ili9341BitBlitStretchNWriteLine_loop1 ret ; @end