include(`common.m4') ;;; begin lcd_init ;; Set Port A to Output lcd_init: LDA # hh(L_DDR_MASK) STA a VIA0_DDRA ;; Function Set: ;; D7 D6 D5 D4 D3 D2 D1 D0 ;; 0 0 1 B L F x x ;; (Bits 8/4, Lines 2/1, Font 5x11/5x8) LDA # %00111000 JSR a :lcd_w_rs0 ;; Display ON/OFF: ;; D7 D6 D5 D4 D3 D2 D1 D0 ;; 0 0 0 0 0 D C B ;; (Display, Cursor, Blink) LDA # %00001110 JSR a :lcd_w_rs0 ;; Clear Display: ;; D7 D6 D5 D4 D3 D2 D1 D0 ;; 0 0 0 0 0 0 0 1 LDA # %00000001 JSR a :lcd_w_rs0 ;; Entry Mode Set: ;; D7 D6 D5 D4 D3 D2 D1 D0 ;; 0 0 0 0 0 1 I/D S ;; (Increment/Decrement, Shift) LDA # %00000110 JSR a :lcd_w_rs0 RTS s ;;; end lcd_init ;; write "instruction" lcd_w_rs0: JSR a :lcd_wait STA a VIA0_PORTB LDA # 0 STA a VIA0_PORTA LDA # hh(C_E) STA a VIA0_PORTA LDA # 0 STA a VIA0_PORTA RTS s ;; write "data" to lcd lcd_w_rs1: JSR a :lcd_wait STA a VIA0_PORTB LDA # hh(C_RS) STA a VIA0_PORTA LDA # hh(C_RS|C_E) STA a VIA0_PORTA LDA # hh(C_RS) STA a VIA0_PORTA RTS s ;; wait BF lcd_wait: PHA s LDA # %00000000 ;; Set pins 0-7 on Port B to Input STA a VIA0_DDRB _lcd_wait: LDA # hh(C_RW) STA a VIA0_PORTA LDA # hh(C_E|C_RW) STA a VIA0_PORTA LDA a VIA0_PORTB AND # %10000000 BNE r :_lcd_wait LDA # hh(C_RW) STA a VIA0_PORTA LDA # %11111111 ;; Set pins 0-7 on Port B to Output STA a VIA0_DDRB PLA s RTS s