176 lines
5.1 KiB
NASM
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
|
|
|