console.s
author Tero Marttila <terom@fixme.fi>
Fri, 07 May 2010 04:18:58 +0300
changeset 14 1ebd5fc73d86
parent 13 a18180e37d57
child 18 79b25e81721f
permissions -rw-r--r--
a weird interactive console...
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
.nolist
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
.include "m168def.inc"      ; Same family as 328P
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
.list
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
.macro poke
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
		.message	"No parameters"
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
.endm
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
.macro poke_i_8_i
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
		ldi			@1, @2
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
		sts			@0, @1
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
.endm
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
.macro poke_i_16_i
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
		ldi			@1, low(@3)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
		sts			@0+0, @1
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
		
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
		ldi			@2, high(@3)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
		sts			@0+1, @2
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
.endm
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
;; Load a 16-bit *word* address into the given register a a byte address
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
.macro loadp_16_i
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
		ldi			@0, high(2 * @2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
		ldi			@1, low(2 * @2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
.endm
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
.macro load_16_i
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
		ldi			@0, high(@2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
		ldi			@1, low(@2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
.endm
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
    33
;; Data
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
    34
.dseg
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
    35
buffer:	.byte 0
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
    36
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
;; Interrupt Vector
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
    38
.cseg
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    39
.org 0x0000
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        rjmp        Main
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    42
;; Libraries
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    43
.include "div.inc"			; Division routines
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    44
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
;; Serial
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
.set SERIAL_BAUD = 103		; 9.6k @ 16Mhz
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
;; Initialize the UART for 
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
Serial_Init:
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
	; Set up control registers
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
		; Single-speed
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
		poke		[UCSR0A, r16, (0 << U2X0)]
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
		; Async
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
		; n parity
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
		; 1 stop
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
		; 8 bits
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
		poke		[UCSR0C, r16, (0b00 << UMSEL00) | (0b00 << UPM00) | (0 << USBS0) | (0b11 << UCSZ00)]
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
		; Baud rate
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
		poke		[UBRR0L, r16:r17, SERIAL_BAUD]
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
		
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
		; Enable RX
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
		; Enable TX
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
		; 8 bits
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    66
		poke		[UCSR0B, r16, (1 << RXEN0) | (1 << TXEN0) | (0 << UCSZ02)]
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
		
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
	; Done
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
		ret
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
;; Send a single byte on serial port
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
; Input byte in r16
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
Serial_Send:
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
	; Wait for idle
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
		lds			r0, UCSR0A
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
		sbrs		r0, UDRE0
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
		rjmp		Serial_Send
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
	; Copy byte to buffer
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
		sts			UDR0, r16
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
	; Done
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
		ret
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    85
;; Read a single byte from serial port
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    86
; Output byte in r16
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    87
Serial_Recv:
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    88
	; Wait for recv
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    89
		lds			r0, UCSR0A
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    90
		sbrs		r0, RXC0
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    91
		rjmp		Serial_Recv
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    92
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    93
	; Copy byte from buffer
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    94
		lds			r16, UDR0
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    95
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    96
	; Done
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    97
		ret
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    98
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
    99
;; Write nul-terminated string from program mem to serial port
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
; Input string in Z
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   101
Serial_pprint:
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
	; Load byte to r16
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
		lpm			r16, Z+
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
	; Quit if nul
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
		tst			r16
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   107
		breq		_serial_pprint_end
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
	; Write it
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
		rcall		Serial_Send
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
	; Continue
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   113
		rjmp		Serial_pprint
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   115
_serial_pprint_end:
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   116
		ret
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   117
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   118
;; Write nul-terminated string from sram and \r\n to serial port
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   119
; Input string in Z
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   120
Serial_sprintln:
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   121
	; Load byte to r16
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   122
		ld			r16, Z+
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   123
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   124
	; Quit if nul
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   125
		tst			r16
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   126
		breq		_serial_sprintln_end
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   127
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   128
	; Write it
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   129
		rcall		Serial_Send
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   130
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   131
	; Continue
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   132
		rjmp		Serial_sprintln
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   133
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   134
_serial_sprintln_end:
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   135
	; \r\n
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   136
		ldi			r16, 13
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   137
		rcall		Serial_Send
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   138
		ldi			r16, 10
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   139
		rcall		Serial_Send
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   140
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   141
	; Done
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
		ret
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   144
;; Write char to serial port
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   145
; Input byte in r16
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   146
Serial_bprint:
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   147
		; ASCII offset for '0'
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   148
		ldi			r17, 48
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   149
		mov			r4, r17	
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   150
	
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   151
	; Convert
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   152
		ldi			r17, 100
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   153
		call		div8u
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   154
		add			r16, r4
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   155
		rcall		Serial_Send
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   156
		mov			r16, r15
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   157
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   158
		ldi			r17, 10
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   159
		call		div8u
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   160
		add			r16, r4
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   161
		rcall		Serial_Send
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   162
		mov			r16, r15
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   163
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   164
		add			r16, r4
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   165
		rcall		Serial_Send
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   166
		
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   167
	ret
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   168
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
;; Program
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
message:	.db "Hello World", 13, 10, 0
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
Main:
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
; Initialization
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
	; Stack
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
		poke		[SPL, r16:r17, RAMEND]
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
    ; Enable interrupts
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
        sei
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
	; Init
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
		rcall		Serial_Init
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
; Main program
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
		ldi			ZH, high(message * 2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
		ldi			ZL, low(message * 2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
		
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   187
		rcall		Serial_pprint
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   188
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   189
; Echo out
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   190
		sbi			DDRB, PORTB5
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   191
		ldi			r20, 0
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   192
		ldi			r21, 0
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   193
		ldi			r22, 0
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   194
		
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   195
		; pointer to memory buffer
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   196
		ldi			XH, high(buffer)
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   197
		ldi			XL, low(buffer)
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   198
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   199
		st			X, r22		; '\0'
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   200
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   201
Main_Echo:
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   202
		; blink LED
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   203
		out			PORTB, r20
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   204
		
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   205
		; read
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   206
		rcall		Serial_Recv
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   207
		push		r16
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   208
		
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   209
		; display
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   210
		rcall		Serial_bprint
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   211
		ldi			r16, 32
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   212
		rcall		Serial_Send
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   213
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   214
		pop			r16
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   215
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   216
		; test for control chars
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   217
		cpi			r16, 127	; DEL
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   218
		breq		backspace
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   219
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   220
		cpi			r16, 13		; '\r'
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   221
		breq		cr
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   222
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   223
		cpi			r16, 10		; '\n'
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   224
		breq		Main_Echo	; ignore
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   225
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   226
		rjmp		char		; buffer char
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   227
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   228
; Erase last char
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   229
backspace:
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   230
		; ignore if already at zero
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   231
		cpi			XL, low(buffer)
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   232
		ldi			r23, high(buffer)
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   233
		cpc			XH, r23
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   234
		breq		echo
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   235
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   236
		; use pre-decrement to store nul
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   237
		st			-X, r22		; '\0'
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   238
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   239
		rjmp		echo
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   240
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   241
; Erase line
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   242
cr:
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   243
		; seek to start
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   244
		ldi			XH, high(buffer)
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   245
		ldi			XL, low(buffer)
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   246
		
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   247
		; store nul
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   248
		st			X, r22		; '\0'
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   249
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   250
		rjmp 		echo
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   251
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   252
char:
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   253
		; buffer char
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   254
		st			X+, r16
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   255
		st			X, r22		; '\0'
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   256
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   257
echo:		
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   258
		; running counter
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   259
		inc			r21
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   260
		mov			r16, r21
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   261
		rcall		Serial_bprint
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   262
		
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   263
		; ' '
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   264
		ldi			r16, 32
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   265
		rcall		Serial_Send
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   266
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   267
		; length
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   268
		mov			r16, XL
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   269
		rcall		Serial_bprint
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   270
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   271
		; ' '
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   272
		ldi			r16, 32
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   273
		rcall		Serial_Send
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   274
		
14
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   275
		; output buffer
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   276
		ldi			ZH, high(buffer)
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   277
		ldi			ZL, low(buffer)
1ebd5fc73d86 a weird interactive console...
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   278
		rcall		Serial_sprintln
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   279
		
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   280
		; toggle
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   281
		com			r20
13
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   282
		
a18180e37d57 Serial_Write_c + use in main
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   283
		; continue
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   284
		rjmp		Main_Echo
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   285