--- a/console.s Fri May 07 03:16:01 2010 +0300
+++ b/console.s Fri May 07 04:18:58 2010 +0300
@@ -30,7 +30,12 @@
ldi @1, low(@2)
.endm
+;; Data
+.dseg
+buffer: .byte 0
+
;; Interrupt Vector
+.cseg
.org 0x0000
rjmp Main
@@ -91,28 +96,54 @@
; Done
ret
-;; Write nul-terminated string to serial port
+;; Write nul-terminated string from program mem to serial port
; Input string in Z
-Serial_Write_s:
+Serial_pprint:
; Load byte to r16
lpm r16, Z+
; Quit if nul
tst r16
- breq _serial_writes_end
+ breq _serial_pprint_end
; Write it
rcall Serial_Send
; Continue
- rjmp Serial_Write_s
+ rjmp Serial_pprint
-_serial_writes_end:
+_serial_pprint_end:
+ ret
+
+;; Write nul-terminated string from sram and \r\n to serial port
+; Input string in Z
+Serial_sprintln:
+ ; Load byte to r16
+ ld r16, Z+
+
+ ; Quit if nul
+ tst r16
+ breq _serial_sprintln_end
+
+ ; Write it
+ rcall Serial_Send
+
+ ; Continue
+ rjmp Serial_sprintln
+
+_serial_sprintln_end:
+ ; \r\n
+ ldi r16, 13
+ rcall Serial_Send
+ ldi r16, 10
+ rcall Serial_Send
+
+ ; Done
ret
;; Write char to serial port
; Input byte in r16
-Serial_Write_c:
+Serial_bprint:
; ASCII offset for '0'
ldi r17, 48
mov r4, r17
@@ -153,12 +184,19 @@
ldi ZH, high(message * 2)
ldi ZL, low(message * 2)
- rcall Serial_Write_s
+ rcall Serial_pprint
; Echo out
sbi DDRB, PORTB5
ldi r20, 0
ldi r21, 0
+ ldi r22, 0
+
+ ; pointer to memory buffer
+ ldi XH, high(buffer)
+ ldi XL, low(buffer)
+
+ st X, r22 ; '\0'
Main_Echo:
; blink LED
@@ -168,23 +206,76 @@
rcall Serial_Recv
push r16
+ ; display
+ rcall Serial_bprint
+ ldi r16, 32
+ rcall Serial_Send
+
+ pop r16
+
+ ; test for control chars
+ cpi r16, 127 ; DEL
+ breq backspace
+
+ cpi r16, 13 ; '\r'
+ breq cr
+
+ cpi r16, 10 ; '\n'
+ breq Main_Echo ; ignore
+
+ rjmp char ; buffer char
+
+; Erase last char
+backspace:
+ ; ignore if already at zero
+ cpi XL, low(buffer)
+ ldi r23, high(buffer)
+ cpc XH, r23
+ breq echo
+
+ ; use pre-decrement to store nul
+ st -X, r22 ; '\0'
+
+ rjmp echo
+
+; Erase line
+cr:
+ ; seek to start
+ ldi XH, high(buffer)
+ ldi XL, low(buffer)
+
+ ; store nul
+ st X, r22 ; '\0'
+
+ rjmp echo
+
+char:
+ ; buffer char
+ st X+, r16
+ st X, r22 ; '\0'
+
+echo:
; running counter
inc r21
mov r16, r21
- rcall Serial_Write_c
+ rcall Serial_bprint
; ' '
ldi r16, 32
rcall Serial_Send
-
- pop r16
+
+ ; length
+ mov r16, XL
+ rcall Serial_bprint
+
+ ; ' '
+ ldi r16, 32
rcall Serial_Send
- ; '\r\n'
- ldi r16, 13
- rcall Serial_Send
- ldi r16, 10
- rcall Serial_Send
+ ; output buffer
+ ldi ZH, high(buffer)
+ ldi ZL, low(buffer)
+ rcall Serial_sprintln
; toggle
com r20