asm-test/aoc/lcd.asm.in
2022-04-05 14:07:50 -07:00

86 lines
2.2 KiB
NASM

include(`common.m4')
;;; begin lcd_reset
;; Set pins 0-2 on Port A to Output
lcd_reset: LDA # %00000111
STA a 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
;; 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
;; 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
RTS s
;;; end lcd_reset
;; write "instruction"
lcd_w_rs0: JSR a :lcd_wait
STA a PORTB
LDA # 0
STA a PORTA
LDA # hh(L_E)
STA a PORTA
LDA # 0
STA a PORTA
RTS s
;; write "data" to lcd
lcd_w_rs1: JSR a :lcd_wait
STA a PORTB
LDA # hh(L_RS)
STA a PORTA
LDA # hh(L_RS|L_E)
STA a PORTA
LDA # hh(L_RS)
STA a PORTA
RTS s
;;; begin lcd_wait
lcd_wait: PHA s
LDA # %00000000 ;; Set pins 0-7 on Port B to Input
STA a DDRB
_lcd_wait: LDA # hh(L_RW)
STA a PORTA
LDA # hh(L_E|L_RW)
STA a PORTA
LDA a PORTB
AND # %10000000
BNE r :_lcd_wait
LDA # hh(L_RW)
STA a PORTA
LDA # %11111111 ;; Set pins 0-7 on Port B to Output
STA a DDRB
PLA s
RTS s
;;; end lcd_wait