asm-test/oled.asm.in

199 lines
4.5 KiB
NASM

; -*-asm-*-
include(`common.m4')
BRA r :reset ; RESB
NOP i ; IRQ
;; reset stack
reset: LDX # ff
TXS i
;; Set pins 0-4 on Port A to Output
LDA # %00011111
STA a DDRA
;; Display ON/OFF:
;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 1 1 1 1 1 D
;;
LDA # %00111111
JSR a :lcd-w-rs0-c2
LDA # %00111111
JSR a :lcd-w-rs0-c1
JSR a :reset-oled
LDA # 0 ; face address
STA zp 0
LDX # 1 ; X page
_face_page: LDA # %01000000 ; Y address
JSR a :lcd-w-rs0-c2
TXA i
ORA # %10111000 ; X page
JSR a :lcd-w-rs0-c2
TXA i
ORA # %10111000 ; X page
JSR a :lcd-w-rs0-c1
PHX s
LDY # 17 ; Y address
LDX zp 0
_face_fill: LDA a,x :_bin_face_start
JSR a :lcd-w-rs1-c2
TYA i
CLC i
ADC # 28
ORA # %01000000 ; Y address
JSR a :lcd-w-rs0-c1
LDA a,x :_bin_face_start
JSR a :lcd-w-rs1-c1
INX i
STX zp 0
DEY i
CPY # 0
BPL r :_face_fill ; BGE 0
PLX s
INX i
CPX # 7
BNE r :_face_page
stop: JMP a :stop
reset-oled: LDY # 00
LDA # %01000000 ; Y address
JSR a :lcd-w-rs0-c2
_next_page: TYA i
ORA # %10111000 ; X page
JSR a :lcd-w-rs0-c2
TYA i
ORA # %10111000 ; X page
JSR a :lcd-w-rs0-c1
LDX # 40
_fill_page: LDA # 00
JSR a :lcd-w-rs1-c2
TXA i
SEC i
SBC # 1
ORA # %01000000 ; Y address
JSR a :lcd-w-rs0-c1
LDA # 00
JSR a :lcd-w-rs1-c1
DEX i
BNE r :_fill_page
INY i
CPY # 8
BNE r :_next_page
RTS s
;; write "instruction"
lcd-w-rs0-c2: JSR a :lcd-wait-c2
STA a PORTB
LDA # hh(G_C2)
STA a PORTA
LDA # hh(G_C2|G_E)
STA a PORTA
LDA # hh(G_C2)
STA a PORTA
RTS s
lcd-w-rs0-c1: JSR a :lcd-wait-c1
STA a PORTB
LDA # hh(G_C1)
STA a PORTA
LDA # hh(G_C1|G_E)
STA a PORTA
LDA # hh(G_C1)
STA a PORTA
RTS s
;; write "data" to lcd
lcd-w-rs1-c2: JSR a :lcd-wait-c2
STA a PORTB
LDA # hh(G_RS|G_C2)
STA a PORTA
LDA # hh(G_RS|G_C2|G_E)
STA a PORTA
LDA # hh(G_RS|G_C2)
STA a PORTA
RTS s
lcd-w-rs1-c1: JSR a :lcd-wait-c1
STA a PORTB
LDA # hh(G_RS|G_C1)
STA a PORTA
LDA # hh(G_RS|G_C1|G_E)
STA a PORTA
LDA # hh(G_RS|G_C1)
STA a PORTA
RTS s
;; wait BF
lcd-wait-c2: PHA s
LDA # %00000000 ;; Set pins 0-7 on Port B to Input
STA a DDRB
_lcd_wait-c2: LDA # hh(G_RW|G_C2)
STA a PORTA
LDA # hh(G_RW|G_C2|G_E)
STA a PORTA
LDA a PORTB
AND # %10000000
BNE r :_lcd_wait-c2
LDA # hh(G_RW|G_C2)
STA a PORTA
LDA # %11111111 ;; Set pins 0-7 on Port B to Output
STA a DDRB
PLA s
RTS s
;; wait BF
lcd-wait-c1: PHA s
LDA # %00000000 ;; Set pins 0-7 on Port B to Input
STA a DDRB
_lcd_wait-c1: LDA # hh(G_RW|G_C1)
STA a PORTA
LDA # hh(G_RW|G_C1|G_E)
STA a PORTA
LDA a PORTB
AND # %10000000
BNE r :_lcd_wait-c1
LDA # hh(G_RW|G_C1)
STA a PORTA
LDA # %11111111 ;; Set pins 0-7 on Port B to Output
STA a DDRB
PLA s
RTS s