console.s
changeset 89 1b3cea759eff
parent 88 c923295ee520
child 90 13c2deb919d1
--- a/console.s	Mon Jun 02 18:27:08 2014 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,270 +0,0 @@
-.nolist
-.include "m168def.inc"      ; Same family as 328P
-.list
-
-.include "macros.inc"
-
-;; Load a 16-bit *word* address into the given register a a byte address
-.macro loadp_16_i
-		ldi			@0, high(2 * @2)
-		ldi			@1, low(2 * @2)
-.endm
-
-.macro load_16_i
-		ldi			@0, high(@2)
-		ldi			@1, low(@2)
-.endm
-
-;; Data
-.dseg
-buffer:	.byte 0
-
-;; Interrupt Vector
-.cseg
-.org 0x0000
-        rjmp        Main
-
-;; Libraries
-.include "div.inc"			; Division routines
-
-;; Serial
-.set SERIAL_BAUD = 103		; 9.6k @ 16Mhz
-
-;; Initialize the UART for 
-Serial_Init:
-	; Set up control registers
-		; Single-speed
-		poke		[UCSR0A, r16, (0 << U2X0)]
-
-		; Async
-		; n parity
-		; 1 stop
-		; 8 bits
-		poke		[UCSR0C, r16, (0b00 << UMSEL00) | (0b00 << UPM00) | (0 << USBS0) | (0b11 << UCSZ00)]
-
-		; Baud rate
-		poke		[UBRR0L, r16:r17, SERIAL_BAUD]
-		
-		; Enable RX
-		; Enable TX
-		; 8 bits
-		poke		[UCSR0B, r16, (1 << RXEN0) | (1 << TXEN0) | (0 << UCSZ02)]
-		
-	; Done
-		ret
-
-;; Send a single byte on serial port
-; Input byte in r16
-Serial_Send:
-	; Wait for idle
-		lds			r0, UCSR0A
-		sbrs		r0, UDRE0
-		rjmp		Serial_Send
-
-	; Copy byte to buffer
-		sts			UDR0, r16
-
-	; Done
-		ret
-
-;; Read a single byte from serial port
-; Output byte in r16
-Serial_Recv:
-	; Wait for recv
-		lds			r0, UCSR0A
-		sbrs		r0, RXC0
-		rjmp		Serial_Recv
-
-	; Copy byte from buffer
-		lds			r16, UDR0
-
-	; Done
-		ret
-
-;; Write nul-terminated string from program mem to serial port
-; Input string in Z
-Serial_pprint:
-	; Load byte to r16
-		lpm			r16, Z+
-
-	; Quit if nul
-		tst			r16
-		breq		_serial_pprint_end
-
-	; Write it
-		rcall		Serial_Send
-
-	; Continue
-		rjmp		Serial_pprint
-
-_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_bprint:
-		; ASCII offset for '0'
-		ldi			r17, 48
-		mov			r4, r17	
-	
-	; Convert
-		ldi			r17, 100
-		call		div8u
-		add			r16, r4
-		rcall		Serial_Send
-		mov			r16, r15
-
-		ldi			r17, 10
-		call		div8u
-		add			r16, r4
-		rcall		Serial_Send
-		mov			r16, r15
-
-		add			r16, r4
-		rcall		Serial_Send
-		
-	ret
-
-;; Program
-message:	.db "Hello World", 13, 10, 0
-
-Main:
-; Initialization
-	; Stack
-		poke		[SPL, r16:r17, RAMEND]
-
-    ; Enable interrupts
-        sei
-
-	; Init
-		rcall		Serial_Init
-
-; Main program
-		ldi			ZH, high(message * 2)
-		ldi			ZL, low(message * 2)
-		
-		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
-		out			PORTB, r20
-		
-		; read
-		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_bprint
-		
-		; ' '
-		ldi			r16, 32
-		rcall		Serial_Send
-
-		; length
-		mov			r16, XL
-		rcall		Serial_bprint
-
-		; ' '
-		ldi			r16, 32
-		rcall		Serial_Send
-		
-		; output buffer
-		ldi			ZH, high(buffer)
-		ldi			ZL, low(buffer)
-		rcall		Serial_sprintln
-		
-		; toggle
-		com			r20
-		
-		; continue
-		rjmp		Main_Echo
-