* m68hc11/sci-inout.S: Supports -mlong-calls.
        * m68hc11/sim-valid-m68hc11.ld (.tramp): New section for trampolines.
        (.text): Mark the .installN and .finiN section with KEEP.
        (.vectors): Likewise for .vectors.
        (.gcc_except_table): New section.
        * m68hc11/sim-valid-m68hc12.ld (.tramp): New section for trampolines.
        (.text): Mark the .installN and .finiN section with KEEP.
        (.vectors): Likewise for .vectors.
        (.gcc_except_table): New section.
		
	
		
			
				
	
	
		
			154 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* 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
 |