Files
aqhomecontrol/avr/modules/com2w_router/iface.asm
2026-02-16 01:12:25 +01:00

176 lines
5.1 KiB
NASM

; ***************************************************************************
; 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 AVR_MOD_COM2WROUTER_IFACE_ASM
#define AVR_MOD_COM2WROUTER_IFACE_ASM
; ***************************************************************************
; defines
.equ COM2WR_BUFFERSIZE = NET_BUFFERS_SIZE-1
.equ COM2WR_MODE_IDLE = 0
.equ COM2WR_MODE_SKIPPING = 1
.equ COM2WR_MODE_READING = 2
.equ COM2WR_MODE_WRITING = 3
.equ COM2WR_MODE_NUM = 4
.equ COM2WR_IFACE_OFFS_BEGIN = NET_IFACE_SIZE
.equ COM2WR_IFACE_OFFS_MODE = COM2WR_IFACE_OFFS_BEGIN+0
.equ COM2WR_IFACE_OFFS_MODECOUNTER = COM2WR_IFACE_OFFS_BEGIN+1
.equ COM2WR_IFACE_OFFS_CURRBYTE = COM2WR_IFACE_OFFS_BEGIN+2
.equ COM2WR_IFACE_OFFS_BITCOUNTER = COM2WR_IFACE_OFFS_BEGIN+3
.equ COM2WR_IFACE_OFFS_BUFPOS_LO = COM2WR_IFACE_OFFS_BEGIN+4
.equ COM2WR_IFACE_OFFS_BUFPOS_HI = COM2WR_IFACE_OFFS_BEGIN+5
.equ COM2WR_IFACE_OFFS_BUFUSED = COM2WR_IFACE_OFFS_BEGIN+6
.equ COM2WR_IFACE_OFFS_BUFLEFT = COM2WR_IFACE_OFFS_BEGIN+7
.equ COM2WR_IFACE_OFFS_BUFFER = COM2WR_IFACE_OFFS_BEGIN+8
.equ COM2WR_IFACE_SIZE = COM2WR_IFACE_OFFS_BUFFER+COM2WR_BUFFERSIZE
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine COM2WR_Iface_StartReading
;
; @param Y pointer to interface data in SDRAM
; @clobbers r16, X
COM2WR_Iface_StartReading:
rcall com2wrResetReadBuffer
ldi r16, COM2WR_MODE_READING
std Y+COM2WR_IFACE_OFFS_MODE, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine COM2WR_Iface_StartSkipping
;
; @param Y pointer to interface data in SDRAM
; @clobbers r16, X
COM2WR_Iface_StartSkipping:
ldi r16, COM2WR_MODE_SKIPPING
std Y+COM2WR_IFACE_OFFS_MODE, r16
rcall com2wrResetReadBuffer
ret
; @end
; ---------------------------------------------------------------------------
; @routine COM2WR_Iface_RecvHandleBit
;
; @param Y pointer to interface data in SDRAM
; @param R18 current CLK bit
; @param R19 current DATA bit
; @clobbers
COM2WR_Iface_RecvHandleBit:
ldd r16, Y+COM2WR_IFACE_OFFS_MODE
cpi r16, COM2WR_MODE_READING
breq COM2WR_Iface_RecvHandleBit_reading
cpi r16, COM2WR_MODE_IDLE
breq COM2WR_Iface_RecvHandleBit_idle
rjmp COM2WR_Iface_RecvHandleBit_ret
COM2WR_Iface_RecvHandleBit_reading:
tst r18 ; CLK now HIGH?
breq COM2WR_Iface_RecvHandleBit_ret ; nope, ignore
; TODO: read bit
rjmp COM2WR_Iface_RecvHandleBit_ret
COM2WR_Iface_RecvHandleBit_idle:
tst r18 ; CLK became LOW?
brne COM2WR_Iface_RecvHandleBit_ret ; nope, ignore
rcall COM2WR_Iface_StartReading ; (R16, X)
COM2WR_Iface_RecvHandleBit_ret:
ret
; @end
com2wrRecvBit:
ldd r16, Y+COM2WR_IFACE_OFFS_CURRBYTE
lsr r19 ; databit to carryflag
ror r16 ; carryflag to current byte
std Y+COM2WR_IFACE_OFFS_CURRBYTE, r16
ldd r17, Y+COM2WR_IFACE_OFFS_BITCOUNTER
dec r17
std Y+COM2WR_IFACE_OFFS_BITCOUNTER, r17
brne com2wrRecvBit_ret
; byte complete, test counter for remaining bytes
ldd r17, Y+COM2WR_IFACE_OFFS_BUFLEFT
tst r17
breq com2wrRecvBit_overrun
dec r17
std Y+COM2WR_IFACE_OFFS_BUFLEFT, r17
; store current byte
ldd xl, Y+COM2WR_IFACE_OFFS_BUFPOS_LO
ldd xh, Y+COM2WR_IFACE_OFFS_BUFPOS_HI
st X+, r16
std Y+COM2WR_IFACE_OFFS_BUFPOS_LO, xl
std Y+COM2WR_IFACE_OFFS_BUFPOS_HI, xh
; increment byte counter, check for size, adjust remaining byte counter if msgsize received
ldd r18, Y+COM2WR_IFACE_OFFS_BUFUSED
inc r18
std Y+COM2WR_IFACE_OFFS_BUFUSED, r18
cpi r18, 2 ; two bytes (DESTADDR, MSGLEN)?
brne com2wrRecvBit_ret ; no, jmp
inc r16 ; last recvd byte contains remaining msg size, add CRC byte
std Y+COM2WR_IFACE_OFFS_BUFLEFT, r16 ; set remaining bytes counter (TODO: check size!)
rjmp com2wrRecvBit_ret
com2wrRecvBit_overrun:
; TODO
com2wrRecvBit_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine com2wrResetReadBuffer
;
; @param Y pointer to interface data in SDRAM
; @clobbers r16, X
com2wrResetReadBuffer:
ldi r16, 8
std Y+COM2WR_IFACE_OFFS_BITCOUNTER, r16
clr r16
std Y+COM2WR_IFACE_OFFS_BUFUSED, r16
std Y+COM2WR_IFACE_OFFS_MODECOUNTER, r16
ldi xl, COM2WR_IFACE_OFFS_BUFFER
clr xh
add xl, yl
adc xh, yh
std Y+COM2WR_IFACE_OFFS_BUFPOS_LO, xl
std Y+COM2WR_IFACE_OFFS_BUFPOS_HI, xh
ldi r16, COM2WR_BUFFERSIZE
std Y+COM2WR_IFACE_OFFS_BUFLEFT, r16
ret
; @end
#endif ; AVR_MOD_COM2WROUTER_IFACE_ASM