;
; hello7.2.asm
; Neil Gershenfeld CBA MIT 11/12/05
; 16x2 44780 LCD hello-world
; slave processor
;

.include "tn13def.inc"

.def byte = R17
.def bitcnt = R18
.def temp = R19

.equ DB7 = PB2
.equ DB6 = PB1
.equ DB5 = PB0
.equ DB4 = PB3

.equ rxpin = PB4
		
.cseg
.org 0
rjmp reset

;
; getchar
; assumes no line driver (doesn't invert bits)
;
getchar:
   ldi bitcnt,9 ; 8 data bit + 1 stop bit
   getchar1:
      sbis PINB, rxpin ; wait for start bit
      rjmp getchar1
   rcall bit_delay ; 0.5 bit delay
   getchar2:
      rcall bit_delay ; 1 bit delay
      rcall bit_delay ;
      clc ; clear carry
      sbis PINB, rxpin ; if RX pin high skip
         sec ; otherwise set carry
      dec bitcnt
      breq getchar3 ; return if all bits read
      ror byte ; otherwise shift bit into receive byte
      rjmp getchar2 ; go get next bit
   getchar3:
      ret
;
; bit delay
;
.equ b = 17 ; 9600 bps
bit_delay:
   ldi temp, b
   bitloop:
      dec temp
      brne bitloop
   ret
;
; reset routine
;
reset:
   ;
   ; set stack pointer to top of RAM
   ;
   ldi temp, low(RAMEND)
   out SPL, temp
   ;
   ; init I/O pins
   ;
   cbi PORTB, DB4
   sbi DDRB, DB4
   cbi PORTB, DB5
   sbi DDRB, DB5
   cbi PORTB, DB6
   sbi DDRB, DB6
   cbi PORTB, DB7
   sbi DDRB, DB7
   ;
   ; infinite main loop
   ;
   main:
      rcall getchar
      out PORTB, byte
      rjmp main
