* LCDPRINT.ASM
*
* sample printing to Handy Board LCD from assembly language
*
* contributed by "Charles Hacker EAS" <C.Hacker@ste.gu.edu.au>
* Wed Jul 22 09:45:50 1998
*
* HC11 - Equates
*
PORTA	EQU	$00			; Port A data register
PORTB	EQU	$04			; Port B data register
PORTC	EQU	$03			; Port C latched data register
PORTD   EQU	$08			; Port D data register
PORTE	EQU	$0A			; Port E data register
DDRC	EQU	$07			; Data Direction register for port C
HPRIO	EQU	$3C			; Highest Priority Interrupt and misc.
*
* Display Equates
*
LCDtmpA	EQU	$09
LCDrout	EQU	$10
*
*   Serial output / 9600 Baud
*
SPCR	EQU	$1028		; SPI Control Register
SPSR	EQU	$1029	
SPDR	EQU	$102A		; SCI Data Register
BAUD	EQU	$102B		; SCI Baud Rate Control Register
SCCR1	EQU	$102C		; SCI Control Register 1
SCCR2	EQU	$102D		; SCI Control Register 2
SCSR	EQU	$102E		; SCI Status Register
SCDR	EQU     $102F		; SCI Data 
TDRE	EQU	$80		; Transmit Data Register Empty
TRENA	EQU	$0C		; Transmit, Receive ENAble
RDRF	EQU	$20		; Receive Data Register Full
SCIINT	EQU	$D6		; SCI serial system
SPIINT	EQU	$D8		; SPI serial system
PD_WOM	EQU	$20
B9600	EQU	$B0
*
	ORG	$BFFE
	FDB	$8000         ;org to the reset vector
*
*  Start of Prog
*
	ORG	$8000        
	LDS	#$E000
*
	LDX	#$1000
	BCLR	SPCR,X PD_WOM
	LDAA	#B9600
	STAA	BAUD,X
	LDAA	#TRENA
	STAA	SCCR2,X
*
*  Do Print to screen
*
	JSR	CPYprt
*
	LDAA	#$00			
	LDAB	#$0C			; Display On /  Cursor Off / Flash Off
	JSR	LCDrout
*
	LDAA	#$00			
	LDAB	#$38			; Two Display
	JSR	LCDrout
*
	LDAA	#$00			
	LDAB	#$03			; Home and Clear Display
	JSR	LCDrout
*
	LDX	#Line1
	STX	SCRend
PL1	LDAA	#$02			; Tell to Print
	LDX	SCRend
	LDAB	$00,X
	INX
	STX	SCRend
	JSR	LCDrout
	LDX	SCRend
	CPX	#Line2
	BNE	PL1
*
	LDAA	#24
NewL	STAA	SCRend
	LDAA	#$02			; Tell to Get to Next Line
	LDAB	#40
	JSR	LCDrout
	LDAA	SCRend
	DECA
	BNE	NewL
*
	LDX	#Line2
	STX	SCRend
PL2	LDAA	#$02			; Tell to Print
	LDX	SCRend
	LDAB	$00,X
	INX
	STX	SCRend
	JSR	LCDrout
	LDX	SCRend
	CPX	#Lend
	BNE	Pl2
*
AGAIN	LDAA	#$FA
	STAA	$7000
*
	LDX	#$8000		; Delay for count
LOP1	DEX
	BNE	LOP1
*
	LDAA	#$F5
	STAA	$7000
*
	LDX	#$8000		; Delay for count
LOP2	DEX
	BNE	LOP2
*
	JMP	AGAIN
*
Line1	FCC	'Print Line 1 !!!'
Line2	FCC	'This is Line 2 !'
Lend	FCB	$00
*
*
*  Copy print routine to Zero Page
*
CPYprt	LDX	#SCRbeg
	LDY	#LCDrout
LCDloop
	LDAA	0,X
	STAA	0,Y
	INX
	INY
	CPX	#SCRend
	BNE	LCDloop
	RTS
*
*   Print Routine:  A - Command, B - Data
*     Copied to Zero Page memory and Run there
*
SCRbeg	SEI				; disable interrupts
	LDX	#$1000
	BCLR	HPRIO,X %00100000	; put into single chip mode
	BCLR	PORTA,X %00010000	; turn off LCD E line
	STAA	LCDtmpA			; Temp A store
	CLR	DDRC,X			; make port C input
LCDBsy	LDAA	#1
	STAA	PORTB,X			; read operation from LCD (AKF-added ',X')
	BSET	PORTA,X %00010000	; frob LCD on
	LDAA	PORTC,X			; get status
	BCLR	PORTA,X %00010000	; frob LCD off
	ANDA	#$80			; bit 7 is busy flag
	BNE	LCDBsy
	LDAA	#$FF
	STAA	DDRC,X			; make port C output
	LDAA	LCDtmpA			; Temp A store
	STAA	PORTB,X			; high byte is control
	STAB	PORTC,X			; low byte is data
	BSET	PORTA,X %00010000
	BCLR	PORTA,X %00010000	; frob LCD
	BSET	HPRIO,X %00100000	; put into expanded chip mode
	CLI				; enable interrupts
	RTS				; return to monitor command loop
SCRend	RMB	2
TempA	RMB	1
