]> cloudbase.mooo.com Git - avrcpm.git/commitdiff
* avr/sw-uart.asm
authorLeo <erbl259-lmu@yahoo.de>
Fri, 30 Mar 2012 07:16:50 +0000 (07:16 +0000)
committerLeo <erbl259-lmu@yahoo.de>
Fri, 30 Mar 2012 07:16:50 +0000 (07:16 +0000)
  - Empty uart receive buffer on break detection

git-svn-id: svn://cu.loc/avr-cpm/avrcpm/trunk@191 57430480-672e-4586-8877-bcf8adbbf3b7

avr/init.asm
avr/sw-uart.asm

index e0bb269c044dfc690073fee907d97caee8a4cd87..914f399589219703ce5bf0ded3f1669c3b2f3aed 100644 (file)
@@ -1,4 +1,4 @@
-;    Various functions: init, (RAM) disk, mmc, timer
+;    Hardware initialisation, disk, mmc, timer, DRAM test
 ;
 ;    Copyright (C) 2010 Sprite_tm
 ;    Copyright (C) 2010 Leo C.
index 8c2b33f5b7665519e4df66c89eb74e2806632fca..df25d094d94b4b75b9ea08c1edd0bb9b9c247622 100644 (file)
@@ -174,7 +174,11 @@ srxi_1l:
 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:
@@ -424,9 +428,12 @@ srx_to:
        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:
@@ -465,27 +472,34 @@ srxto_ov:                                 ;endif
 ;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
@@ -507,8 +521,7 @@ sputc_l:
        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