| /* M68HC11/M68HC12 serial line operations |
| * Copyright (C) 1999, 2001, 2003, 2004 Stephane Carrez (stcarrez@nerim.fr) |
| * |
| * The authors hereby grant permission to use, copy, modify, distribute, |
| * and license this software and its documentation for any purpose, provided |
| * that existing copyright notices are retained in all copies and that this |
| * notice is included verbatim in any distributions. No written agreement, |
| * license, or royalty fee is required for any of the authorized uses. |
| * Modifications to this software may be copyrighted by their authors |
| * and need not follow the licensing terms described here, provided that |
| * the new terms are clearly indicated on the first page of each file where |
| * they apply. |
| */ |
| |
| #ifdef __HAVE_SHORT_INT__ |
| .mode mshort |
| #else |
| .mode mlong |
| #endif |
| |
| #if defined(__USE_RTC__) |
| .macro ret |
| #if defined(mc68hc12) |
| rtc |
| #else |
| jmp __return_32 |
| #endif |
| .endm |
| #else |
| .macro ret |
| rts |
| .endm |
| #endif |
| #ifdef mc68hc12 |
| SC0CR1 = 0xC2 |
| SC0CR2 = 0xC3 |
| SC0SR1 = 0xC4 |
| SC0DRL = 0xC7 |
| SC0BD = 0xC0 |
| |
| .sect .data |
| .globl _m68hc12_ports |
| _m68hc12_ports: .word 0 |
| |
| .sect .text |
| .globl outbyte |
| ;;; |
| ;;; int outbyte(char c); |
| ;;; |
| ;;; B : Character to send |
| ;;; |
| outbyte: |
| bsr _sci_init |
| L1: |
| ldaa SC0SR1,x |
| bge L1 |
| stab SC0DRL,x |
| ldab SC0CR2,x |
| orab #0x8 |
| stab SC0CR2,x |
| ret |
| |
| .sect .text |
| .globl inbyte |
| ;;; |
| ;;; char inbyte(void); |
| ;;; |
| inbyte: |
| bsr _sci_init |
| ldaa SC0SR1,x |
| bita #0x20 |
| beq inbyte |
| ldab SC0CR2,x |
| ret |
| |
| .globl _sci_init |
| .sect .text |
| _sci_init: |
| ldx _m68hc12_ports |
| beq do_init |
| dex |
| rts |
| do_init: |
| ldx #0x1 |
| stx _m68hc12_ports |
| dex |
| ldd #26 |
| std SC0BD,x |
| ldaa #0 |
| staa SC0CR1,x |
| ldaa #0xC |
| staa SC0CR2,x |
| rts |
| #else |
| BAUD = 0x2b |
| SCCR1= 0x2c |
| SCCR2= 0x2d |
| SCSR = 0x2e |
| SCDR = 0x2f |
| |
| .sect .data |
| .globl _m68hc11_ports |
| _m68hc11_ports: .word 0 |
| |
| .sect .text |
| .globl outbyte |
| ;;; |
| ;;; int outbyte(char c); |
| ;;; |
| ;;; B : Character to send |
| ;;; |
| outbyte: |
| bsr _sci_init |
| L1: |
| ldaa SCSR,x |
| bge L1 |
| stab SCDR,x |
| ldab SCCR2,x |
| orab #0x8 |
| stab SCCR2,x |
| ret |
| |
| .sect .text |
| .globl inbyte |
| ;;; |
| ;;; char inbyte(void); |
| ;;; |
| inbyte: |
| bsr _sci_init |
| ldaa SCSR,x |
| bita #0x20 |
| beq inbyte |
| ldab SCDR,x |
| ret |
| |
| .globl _sci_init |
| .sect .text |
| _sci_init: |
| ldx _m68hc11_ports |
| beq do_init |
| rts |
| do_init: |
| ldx #0x1000 |
| stx _m68hc11_ports |
| ldaa #0x30 |
| staa BAUD,x |
| clra |
| staa SCCR1,x |
| ldaa #0xC |
| staa SCCR2,x |
| rts |
| |
| #endif |