diff --git a/avr/modules/uart_hw/comonuart0.asm b/avr/modules/uart_hw/comonuart0.asm index d247859..7ae4d25 100644 --- a/avr/modules/uart_hw/comonuart0.asm +++ b/avr/modules/uart_hw/comonuart0.asm @@ -10,7 +10,7 @@ .equ COMONUART0_IFACENUM = 1 .equ COMONUART0_READ_TIMEOUT = 3 - +.equ COMONUART0_MSG_INTERVAL = 1 @@ -243,7 +243,7 @@ comOnUart0ActOnAttn_end: ; @clobbers R16 (R17, R24, R25, X) comOnUart0StartReading: - rcall comOnUart0EnsureReadBuffer ; (R16, R17, R24, R25, X) + rcall UART_HW_Interface_EnsureReadBuffer ; (R16, R17, R24, R25, X) brcs comOnUart0EnterReading_okay ; no buffer, missed message ldi r16, NET_IFACE_OFFS_ERR_MISSED_LOW @@ -260,63 +260,6 @@ comOnUart0EnterReading_okay: -; --------------------------------------------------------------------------- -; @routine comOnUart0EnterReadSkipping -; -; @clobbers R16 - -comOnUart0EnterReadSkipping: - rcall UART_HW_Uart0_StopRx ; (R16) - rcall UART_HW_Uart0_Flush ; (R16) - ldi r16, UART_HW_WRITEMODE_IDLE ; go into IDLE mode, enter reading on next neg edge of ATTN - std Y+UART_HW_IFACE_OFFS_READMODE, r16 - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine comOnUart0EnterReadIdle -; -; @clobbers R16 (R17, R24, R25, X) - -comOnUart0EnterReadIdle: - rcall UART_HW_Uart0_StopRx ; (R16) - ldi r16, UART_HW_READMODE_IDLE - std Y+UART_HW_IFACE_OFFS_READMODE, r16 - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine comOnUart0EnsureReadBuffer -; -; @clobbers R16 (R17, R24, R25, X) - -comOnUart0EnsureReadBuffer: - ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM - cpi r16, 0xff - breq comOnUart0EnsureReadBuffer_alloc -comOnUart0EnsureReadBuffer_secRet: - sec -comOnUart0EnsureReadBuffer_ret: - ret -comOnUart0EnsureReadBuffer_alloc: - rcall NET_Buffer_Alloc ; (R16, R17, X) - brcc comOnUart0EnsureReadBuffer_ret - rcall UART_HW_Interface_SetReadBuffer ; (R17) - rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17) - rjmp comOnUart0EnsureReadBuffer_secRet -comOnUart0EnsureReadBuffer_noBuf: - ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW - rcall NET_Interface_IncCounter16 ; (R24, R25) - clc - ret -; @end - - - ; --------------------------------------------------------------------------- ; @routine ComOnUart0_SendBuffer @global ; @@ -416,20 +359,19 @@ comOnUart0RunWriteModes: comOnUart0RunWriteIdle: ldd r16, Y+NET_IFACE_OFFS_WRITETIMER - cpi r16, TTYONUART1_MSG_INTERVAL ; wait a bit between messages + cpi r16, COMONUART0_MSG_INTERVAL ; wait a bit between messages brcs comOnUart0RunWriteIdle_end - sbis COM_ATTN_INPUT, COM_ATTN_PIN ; ATTN low? - rjmp comOnUart0RunWriteIdle_end ; yes, jmp + rcall NET_Interface_PeekNextOutgoingMsgNum ; r16=msgNum + brcc comOnUart0RunWriteIdle_end ; no outmsg in queue + + sbis COM_ATTN_INPUT, COM_ATTN_PIN ; ATTN low? + rjmp comOnUart0RunWriteIdle_end ; yes, line busy, jmp - rcall NET_Interface_GetNextOutgoingMsgNum ; (R17, R18, X) - brcc comOnUart0RunWriteIdle_end - rcall NET_Buffer_Locate ; (R17) - brcc comOnUart0RunWriteIdle_end - - rcall UART_HW_Uart0_SetAttnLow - - rcall ComOnUart0_SendBuffer ; (R16, R17) + rcall UART_HW_Uart0_SetAttnLow ; reserve bus as soon as possible + rcall NET_Buffer_Locate ; (R17) + rcall ComOnUart0_SendBuffer ; (R16, R17) + rcall NET_Interface_GetNextOutgoingMsgNum ; take msg from queue (R17, R18, X) comOnUart0RunWriteIdle_end: ret @@ -521,6 +463,8 @@ comOnUart0RunReadIdle: ; @clobbers none comOnUart0RunReading: + ret + ldd r16, Y+NET_IFACE_OFFS_READTIMER cpi r16, COMONUART0_READ_TIMEOUT brcs comOnUart0RunReading_end @@ -546,6 +490,13 @@ comOnUart0RunReading_end: ; @clobbers R16 comOnUart0RunSkipping: + ldi r17, 0xff + ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM + std Y+UART_HW_IFACE_OFFS_READBUFNUM, r17 + cp r16, r17 + breq comOnUart0RunSkipping_checkAttn + rcall NET_Buffer_ReleaseByNum ; (R16, X) +comOnUart0RunSkipping_checkAttn: sbis COM_ATTN_INPUT, COM_ATTN_PIN ; ATTN low? rjmp comOnUart0RunSkipping_end ; yes, jmp ; ATTN ishigh, skipped message finished @@ -563,7 +514,18 @@ comOnUart0RunSkipping_end: ; @clobbers R16 (R17, R18, R24, R25) comOnUart0RunMsgReceived: - rcall comOnUart0EnterReadIdle + ldi r17, 0xff + ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM + std Y+UART_HW_IFACE_OFFS_READBUFNUM, r17 + rcall NET_AddIncomingMsgNum ; (R17, R18, X) + brcs comOnUart0RunMsgReceived_enterIdle + ; could not add msg + rcall NET_Buffer_ReleaseByNum ; (R16, X) + ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW + rcall NET_Interface_IncCounter16 ; (R24, R25) +comOnUart0RunMsgReceived_enterIdle: + ldi r17, UART_HW_READMODE_IDLE + std Y+UART_HW_IFACE_OFFS_READMODE, r17 ; set read mode ret ; @end diff --git a/avr/modules/uart_hw/lowlevel.asm b/avr/modules/uart_hw/lowlevel.asm index 33412ec..8c2fc81 100644 --- a/avr/modules/uart_hw/lowlevel.asm +++ b/avr/modules/uart_hw/lowlevel.asm @@ -81,3 +81,32 @@ UART_HW_Interface_SetWriteBuffer: + +; --------------------------------------------------------------------------- +; @routine UART_HW_Interface_EnsureReadBuffer +; +; @clobbers R16 (R17, R24, R25, X) + +UART_HW_Interface_EnsureReadBuffer: + ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM + cpi r16, 0xff + breq UART_HW_Interface_EnsureReadBuffer_alloc +UART_HW_Interface_EnsureReadBuffer_secRet: + sec +UART_HW_Interface_EnsureReadBuffer_ret: + ret +UART_HW_Interface_EnsureReadBuffer_alloc: + rcall NET_Buffer_Alloc ; (R16, R17, X) + brcc UART_HW_Interface_EnsureReadBuffer_ret + rcall UART_HW_Interface_SetReadBuffer ; (R17) + rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17) + rjmp UART_HW_Interface_EnsureReadBuffer_secRet +UART_HW_Interface_EnsureReadBuffer_noBuf: + ldi r16, NET_IFACE_OFFS_ERR_MISSED_LOW + rcall NET_Interface_IncCounter16 ; (R24, R25) + clc + ret +; @end + + + diff --git a/avr/modules/uart_hw/lowlevel_uart0.asm b/avr/modules/uart_hw/lowlevel_uart0.asm index ee4db9e..58073d3 100644 --- a/avr/modules/uart_hw/lowlevel_uart0.asm +++ b/avr/modules/uart_hw/lowlevel_uart0.asm @@ -100,34 +100,34 @@ UART_HW_Uart0_RxCharIsr: ; check for errors lds r16, UCSR0A ; check for errors andi r16, (1<