* LCDPRINT.ASM * * sample printing to Handy Board LCD from assembly language * * contributed by "Charles Hacker EAS" * 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