199 lines
4.5 KiB
NASM
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
|