gavrasm Gerd's AVR assembler version 2.1 (C)2006 by DG4FAC
----------------------------------------------------------
Source file: hello.serial.io.45.asm
Hex file:    hello.serial.io.45.hex
Eeprom file: hello.serial.io.45.eep
Compiled:    15.11.2007, 22:27:49
Pass:        2
     1: ;
     2: ; hello.serial.i0.45.asm
     3: ;
     4: ; 9600 baud serial echo program
     5: ;
     6: ; Neil Gershenfeld
     7: ; CBA MIT 10/15/07
     8: ;
     9: ; (c) Massachusetts Institute of Technology 2007
    10: ; Permission granted for experimental and personal use;
    11: ; license for commercial sale available from MIT.
    12: ;
    13: .include "tn45def.inc"
 -> Warning 009: Include defs not necessary, using internal values!
   File: hello.serial.io.45.asm, Line: 13
   Source line: .include "tn45def.inc"
    14: ;
    15: ; pin definitions
    16: ;
    17: .equ tx_pin = PB2; transmit pin
    18: .equ rx_pin = PB3; receive pin
    19: ;
    20: ; register definitions
    21: ;
    22: .def bit_count = R16; bit counter
    23: .def temp = R17; temporary storage
    24: .def temp1 = R18; temporary storage
    25: .def txbyte = R19; transmit byte
    26: .def rxbyte = R20; receive byte
    27: ;
    28: ; print macro
    29: ; 
    30: .macro print
    31:    ldi zl,low(@0*2)
    32:    ldi zh,high(@0*2)
    33:    rcall print_db
    34:    .endmacro
    35: ;
    36: ; code segment
    37: ;
    38: .cseg
    39: .org 0
    40: 000000   C028  rjmp reset
    41: ;
    42: ; bit delay
    43: ; serial bit delay
    44: ;
    45: .equ b = 13 ; 9600 baud (clock /8)
    46: ;.equ b = 8 ; 115200 baud (clock /1)
    47: bit_delay:
    48: 000001   E01D  ldi temp, b
    49:    bitloop:
    50: 000002   951A  dec temp
    51: 000003   F7F1  brne bitloop
    52: 000004   9508  ret
    53: ;
    54: ; putchar
    55: ; assumes no line driver (doesn't invert bits)
    56: ;
    57: .equ sb = 1; number of stop bits
    58: putchar:
    59: 000005   E00A  ldi bit_count, 9+sb; 1+8+sb
    60: 000006   9530  com txbyte; invert everything
    61: 000007   9408  sec; set start bit
    62:    putchar0:
    63: 000008   F410  brcc putchar1; if carry set
    64: 000009   9AC2  sbi PORTB, tx_pin; send a '0'
    65: 00000A   C002  rjmp putchar2; else	
    66:    putchar1:
    67: 00000B   98C2  cbi PORTB, tx_pin	; send a '1'
    68: 00000C   0000  nop ; even out timing
    69:    putchar2:
    70: 00000D   DFF3  rcall bit_delay; one bit delay
    71: 00000E   DFF2  rcall bit_delay
    72: 00000F   9536  lsr txbyte; get next bit
    73: 000010   950A  dec bit_count; if not all bits sent
    74: 000011   F7B1  brne putchar0; send next bit
    75: 000012   9508  ret;
    76: ;
    77: ; getchar
    78: ; assumes no line driver (doesn't invert bits)
    79: ;
    80: getchar:
    81: 000013   E009  ldi bit_count,9 ; 8 data bit + 1 stop bit
    82:    getchar1:
    83: 000014   9BB3  sbis PINB, rx_pin ; wait for start bit
    84: 000015   CFFE  rjmp getchar1
    85: 000016   DFEA  rcall bit_delay ; 0.5 bit delay
    86:    getchar2:
    87: 000017   DFE9  rcall bit_delay ; 1 bit delay
    88: 000018   DFE8  rcall bit_delay ;
    89: 000019   9488  clc ; clear carry
    90: 00001A   9BB3  sbis PINB, rx_pin ; if RX pin high skip
    91: 00001B   9408  sec ; otherwise set carry
    92: 00001C   950A  dec bit_count
    93: 00001D   F011  breq getchar3 ; return if all bits read
    94: 00001E   9547  ror rxbyte ; otherwise shift bit into receive byte
    95: 00001F   CFF7  rjmp getchar2 ; go get next bit
    96:    getchar3:
    97: 000020   9508  ret
    98: ;
    99: ; print_db
   100: ; prints a null-terminated .db string
   101: ;
   102: print_db:
   103:    print_loop:
   104: 000021   95C8  lpm
   105: 000022   2D30  mov txbyte,R0
   106: 000023   3030  cpi txbyte,0
   107: 000024   F019  breq return
   108: 000025   DFDF  rcall putchar
   109: 000026   9631  adiw zl, 1
   110: 000027   CFF9  rjmp print_loop
   111:    return:
   112: 000028   9508  ret
   113: ;
   114: ; main program
   115: ;
   116: reset:
   117:    ;
   118:    ; set stack pointer to top of RAM
   119:    ;
   120: 000029   E011  ldi temp, high(RAMEND)
   121: 00002A   BF1E  out SPH, temp
   122: 00002B   E51F  ldi temp, low(RAMEND)
   123: 00002C   BF1D  out SPL, temp
   124:    ;
   125:    ; init transmit pin for output
   126:    ;
   127: 00002D   9AC2  sbi PORTB, tx_pin
   128: 00002E   9ABA  sbi DDRB, tx_pin
   129:    ;
   130:    ; main loop
   131:    ;
   132:    main_loop:
   133: 00002F   DFE3  rcall getchar
   134:       print message
   135:          message: .db "received character: ",0
 -> Warning 004: Number of bytes on line is odd, added 00 to fit program memory!
   File: hello.serial.io.45.asm, Line: 135
   Source line:          message: .db "received character: ",0
        000033 6572 6563 7669 6465
        000037 6320 6168 6172 7463
        00003B 7265 203A 0000
   136: 00003E   2F34  mov txbyte, rxbyte
   137: 00003F   DFC5  rcall putchar
   138: 000040   E03A  ldi txbyte,10
   139: 000041   DFC3  rcall putchar
   140: 000042   CFEC  rjmp main_loop
 -> Warning 001: 1 symbol(s) defined, but not used!

Program             :       56 words.
Constants           :       11 words.
Total program memory:       67 words.
Eeprom space        :        0 bytes.
Data segment        :        0 bytes.
Compilation completed, no errors.
Compilation endet 15.11.2007, 22:27:49
