a weird interactive console...
authorTero Marttila <terom@fixme.fi>
Fri, 07 May 2010 04:18:58 +0300
changeset 14 1ebd5fc73d86
parent 13 a18180e37d57
child 15 c8f3a514bbef
a weird interactive console...
console.s
--- 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