172 lines
4.0 KiB
NASM
172 lines
4.0 KiB
NASM
; -*-asm-*-
|
|
include(`common.m4')
|
|
|
|
BRA r :reset ; RESB
|
|
NOP i ; IRQ
|
|
|
|
;; reset stack
|
|
reset: LDX # ff
|
|
TXS i
|
|
|
|
;; Set pins 0-2 on Port A to Output
|
|
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
|
|
|
|
;; 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
|
|
|
|
;; Set DDRAM Address:
|
|
;; D7 D6 D5 D4 D3 D2 D1 D0
|
|
;; 1 A6 A5 A4 A3 A2 A1 A0
|
|
LDA # hh(C_DDRAM|0)
|
|
JSR a :lcd-w-rs0
|
|
|
|
;; Write Data:
|
|
;; D7 D6 D5 D4 D3 D2 D1 D0
|
|
;; D D D D D D D D
|
|
LDA # 0
|
|
JSR a :lcd-w-rs1
|
|
|
|
;; Write Data:
|
|
;; D7 D6 D5 D4 D3 D2 D1 D0
|
|
;; D D D D D D D D
|
|
LDA # 1
|
|
JSR a :lcd-w-rs1
|
|
|
|
;; Set CGRAM Address:
|
|
;; D7 D6 D5 D4 D3 D2 D1 D0
|
|
;; 0 1 AC5 AC4 AC3 AC2 AC1 AC0
|
|
LDA # hh(C_CGRAM|0)
|
|
JSR a :lcd-w-rs0
|
|
|
|
;; data is at e000
|
|
LDA # 00
|
|
STA zp 00
|
|
LDA # e0
|
|
STA zp 01
|
|
|
|
;; 16
|
|
LDX # 16
|
|
LDY # 0
|
|
|
|
loop: LDA (zp),y 00
|
|
|
|
;; Write Data to CGRAM
|
|
;; D7 D6 D5 D4 D3 D2 D1 D0
|
|
;; D D D D D D D D
|
|
;; RS:1 RW:0
|
|
STA a PORTB
|
|
JSR a :lcd-w-rs1
|
|
|
|
INY i
|
|
DEX i
|
|
BNE r :loop
|
|
|
|
|
|
;; Display ON/OFF:
|
|
;; D7 D6 D5 D4 D3 D2 D1 D0
|
|
;; 0 0 0 0 0 D C B
|
|
;; (Display, Cursor, Blink)
|
|
LDA # %00001100
|
|
JSR a :lcd-w-rs0
|
|
|
|
;; Set CGRAM Address
|
|
;; D7 D6 D5 D4 D3 D2 D1 D0
|
|
;; 0 1 AC5 AC4 AC3 AC2 AC1 AC0
|
|
loop2: LDA # hh(C_CGRAM|9)
|
|
JSR a :lcd-w-rs0
|
|
|
|
;; Write Data to CGRAM
|
|
;; D7 D6 D5 D4 D3 D2 D1 D0
|
|
;; D D D D D D D D
|
|
LDA # %00110
|
|
JSR a :lcd-w-rs1
|
|
|
|
;; Set CGRAM Address
|
|
;; D7 D6 D5 D4 D3 D2 D1 D0
|
|
;; 0 1 AC5 AC4 AC3 AC2 AC1 AC0
|
|
LDA # hh(C_CGRAM|9)
|
|
JSR a :lcd-w-rs0
|
|
|
|
;; Write Data to CGRAM
|
|
;; D7 D6 D5 D4 D3 D2 D1 D0
|
|
;; D D D D D D D D
|
|
LDA # %00000
|
|
JSR a :lcd-w-rs1
|
|
|
|
JMP a :loop2
|
|
|
|
stop: JMP a :stop
|
|
|
|
|
|
;; write "instruction"
|
|
lcd-w-rs0: JSR a :lcd-wait
|
|
|
|
STA a PORTB
|
|
LDA # 0
|
|
STA a PORTA
|
|
LDA # hh(C_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(C_RS)
|
|
STA a PORTA
|
|
LDA # hh(C_RS|C_E)
|
|
STA a PORTA
|
|
LDA # hh(C_RS)
|
|
STA a PORTA
|
|
RTS s
|
|
|
|
;; wait BF
|
|
lcd-wait: PHA s
|
|
|
|
LDA # %00000000 ;; Set pins 0-7 on Port B to Input
|
|
STA a DDRB
|
|
|
|
_lcd_wait: LDA # hh(C_RW)
|
|
STA a PORTA
|
|
LDA # hh(C_E|C_RW)
|
|
STA a PORTA
|
|
LDA a PORTB
|
|
AND # %10000000
|
|
BNE r :_lcd_wait
|
|
|
|
LDA # hh(C_RW)
|
|
STA a PORTA
|
|
|
|
LDA # %11111111 ;; Set pins 0-7 on Port B to Output
|
|
STA a DDRB
|
|
|
|
PLA s
|
|
RTS s
|