
00AC           ReceiveString:
00AC 7800              mov     r0,#RxBuffer            ; Initialize receiver pointer
               
00AE           GetNextChar:                            ; Come here to get each new character
00AE 3098FD            jnb     RI0,$                   ; Wait for incoming character
00B1 C298              clr     RI0                     ; Clear flag
00B3 E599              mov     A,SBUF                  ; Got it
00B5 20E7F6            jb      acc.7,GetNextChar       ; It's unprintable (>= 80h) - ignore it
               
00B8 B42000            cjne    a,#20h,$+3              ; Is it a control character (<20h)?
00BB 400E              jc      ControlChars            ;  Yes - process separately
00BD B80907            cjne    r0,#BUFFER_END,SaveChar ;  No - go store if no overflow
               
00C0           BeepAndGet:
00C0 7407              mov     a,#BEEP_CHR             ; Buffer overflow if we get here
00C2           TxAndGet:
00C2 1200E4            call    TxChar                  ; Make the terminal beep
00C5 80E7              sjmp    GetNextChar             ; Go get next character
               
00C7           SaveChar:                               ; Printable character if we get here
00C7 F6                mov     @r0,a                   ; Put character in buffer       
00C8 08                inc     r0                      ; Advance buffer pointer
00C9 80F7              sjmp    TxAndGet                ; Go echo character, then get another
               
00CB           ControlChars:                           ; Control character if we get here
00CB B40810            cjne    a,#BS_CHR,NotBackSpace  ; Not backspace - press on
00CE B80002            cjne    r0,#RxBuffer,EatChar    ; Is backspace - go eat if no underflow 
00D1 80ED              sjmp    BeepAndGet              ; Go beep, then get next character
               
00D3           EatChar:                                ; Process backspace here
00D3 18                dec     r0                      ; Remove the character from the buffer
00D4           EatLoop:
00D4 1200E4            call    TxChar                  ; Send BS-SPACE-BS to terminal to erase
00D7 6428              xrl     a,#BS_CHR XOR SPACE_CHR ;  the most recently typed character
00D9 B408F8            cjne    a,#BS_CHR,EatLoop
00DC 80E4              sjmp    TxAndGet                ; Go get next character
               
00DE           NotBackSpace:                           ; Control char, but not backspace
00DE B40DCD            cjne    a,#CR_CHR,GetNextChar   ; If not CR, go get next character
               
00E1 7600              mov     @r0,#0                  ; Got CR - terminate the string
00E3 22                ret                             ; Done
               
00E4           TxChar:
00E4 F599              mov     SBUF,A                  ; Send the character
00E6 3099FD            jnb     TI0,$                   ; Spin until it's sent
00E9 C299              clr     TI0                     ; Reset done flag
00EB 22                ret                             ; Done
               
00EC                   end
