; *************************************************************************** ; copyright : (C) 2026 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_GUI2_KEYPAD_ASM #define AQH_AVR_GUI2_KEYPAD_ASM ; *************************************************************************** ; defines .equ KEYPAD_OFFS_BEGIN = WIDGET_SIZE .equ KEYPAD_OFFS_KEYWIDTH = KEYPAD_OFFS_BEGIN+0 .equ KEYPAD_OFFS_KEYHEIGHT = KEYPAD_OFFS_BEGIN+1 .equ KEYPAD_OFFS_KEYHDIST = KEYPAD_OFFS_BEGIN+2 .equ KEYPAD_OFFS_KEYVDIST = KEYPAD_OFFS_BEGIN+3 .equ KEYPAD_OFFS_TXTOFFS_X = KEYPAD_OFFS_BEGIN+4 .equ KEYPAD_OFFS_TXTOFFS_Y = KEYPAD_OFFS_BEGIN+5 .equ KEYPAD_OFFS_KEYSPERROW = KEYPAD_OFFS_BEGIN+6 .equ KEYPAD_OFFS_ROWS = KEYPAD_OFFS_BEGIN+7 .equ KEYPAD_OFFS_KEYS_LO = KEYPAD_OFFS_BEGIN+8 .equ KEYPAD_OFFS_KEYS_HI = KEYPAD_OFFS_BEGIN+9 .equ KEYPAD_OFFS_SELECTEDKEY = KEYPAD_OFFS_BEGIN+10 .equ KEYPAD_SIZE = KEYPAD_OFFS_BEGIN+11 ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine KeyPad_new @global ; ; @return CFLAG set of okay, cleared otherwise ; @return Y address of newly created object ; @param X parent widget ; @param r16 value for OBJECT_OFFS_OPTS ; @param r17 value for WIDGET_OFFS_PACK ; @param r20 number of keys per row ; @param r21 number of rows ; @param r23:r22 pointer to null-terminated string containing keys ; @clobbers any KeyPad_new: push r20 push r21 push r22 push r23 ldi r24, LOW(KEYPAD_SIZE) ldi r25, HIGH(KEYPAD_SIZE) bigcall Object_Alloc ; (!r16, !r17, !X) pop r23 pop r22 pop r21 pop r20 brcc KeyPad_new_ret rcall KeyPad_Init sec KeyPad_new_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine KeyPad_Init @global ; ; @param Y address of newly created object ; @param X parent widget ; @param r16 value for OBJECT_OFFS_OPTS ; @param r17 value for WIDGET_OFFS_PACK ; @param r20 number of keys per row ; @param r21 number of rows ; @param r23:r22 pointer to null-terminated string containing keys ; @clobbers any KeyPad_Init: push r20 push r21 push r22 push r23 ; call base class bigcall Widget_Init ; (r16, r17, X) pop r23 pop r22 pop r21 pop r20 std Y+KEYPAD_OFFS_KEYSPERROW, r20 std Y+KEYPAD_OFFS_ROWS, r21 std Y+KEYPAD_OFFS_KEYS_LO, r22 std Y+KEYPAD_OFFS_KEYS_HI, r23 ; set input and timer opts ldd r16, Y+OBJECT_OFFS_OPTS sbr r16, (1<