srxi_1fe:
sts srx_char_to,_0 ; no stop bit --> framing error --> break
sts srx_state,_0
- sbr intstat,(1<<i_break)
+ sbr intstat,(1<<i_break) ;
+ sts rxcount,_0 ;clear rx buffer
+ sts rxidx_w,_0
+ sts rxidx_r,_0
+
rjmp srxi_end2
srxi_1be:
rcall uartputc
#endif
lds temp,srx_dr ;only 0 if timeout after leading edge of start bit.
- tst temp
+ tst temp ; --> break
brne srxto_store
sbr intstat,(1<<i_break)
+ sts rxcount,_0 ;clear rx buffer
+ sts rxidx_w,_0
+ sts rxidx_r,_0
rjmp srxto_ov
srxto_store:
;Fetches a char from the buffer to temp. If none available, waits till one is.
uartgetc:
+ push zh
+ push zl
+ push temp2
+ugetc_w:
lds temp,rxcount ;Number of characters in buffer
tst temp
- breq uartgetc ;Wait for char
+ breq ugetc_w ;Wait for char
- push zh
- push zl
ldi zl,low(rxfifo)
ldi zh,high(rxfifo)
- lds temp,rxidx_r
- add zl,temp
- brcc PC+2
- inc zh
- inc temp
- andi temp,RXBUFMASK
- sts rxidx_r,temp
+ lds temp2,rxidx_r
+ add zl,temp2
+ adc zh,_0
+ inc temp2
+ andi temp2,RXBUFMASK
cli
lds temp,rxcount
- dec temp
+ subi temp,1
+ brcc ugetc_fin
+ sei
+ rjmp ugetc_w
+
+ugetc_fin:
sts rxcount,temp
+ sts rxidx_r,temp2
sei
ld temp,z ;don't forget to get the char
+ pop temp2
pop zl
pop zh
ret
ldi zh,high(txfifo) ;
lds temp,txidx_w ;
add zl,temp ;
- brcc PC+2 ;
- inc zh ;
+ adc zh,_0 ;
inc temp ;
andi temp,TXBUFMASK ;
sts txidx_w,temp ; txidx_w = ++txidx_w % TXBUFSIZE