-
Notifications
You must be signed in to change notification settings - Fork 0
/
print-msg-4bit-mode.s
124 lines (110 loc) · 1.47 KB
/
print-msg-4bit-mode.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
ORB = $6000
ORA = $6001
DDRB = $6002
DDRA = $6003
E = $10
RW = $20
RS = $40
.org $8000
reset:
LDX #$ff ;set pointer
TXS
LDA #$ff ;set VIA as autput
STA DDRB
JSR lcd_init
LDA #$28 ;4bit-2lines
JSR lcd_instruction
LDA #$0F ; Display on, cursor on, blinking on
JSR lcd_instruction
LDA #$06 ; Increment,shift
JSR lcd_instruction
LDA #$01 ;clear Display
JSR lcd_instruction
LDX #$00
print:
LDA msg,x
BEQ loop
JSR write_char
INX
JMP print
loop:
JMP loop
msg: .asciiz "Hello, there! "
lcd_wait:
PHA ;save A
LDA #$F0 ;set VIA as in/out
STA DDRB
lcd_busy:
LDA #RW
STA ORB
LDA #(RW | E)
STA ORB
LDA ORB ;upper nibble
PHA
LDA #RW
STA ORB
LDA #(RW | E)
STA ORB
LDA ORB
PLA
AND #$08
BNE lcd_busy
LDA #RW ;Clear E bit
STA ORB
LDA #$FF ;set VIA as output
STA DDRB
PLA
RTS
lcd_init:
LDA #$02 ;4bit mode
STA ORB
ORA #E
STA ORB
AND #$0F
STA ORB
RTS
lcd_instruction:
JSR lcd_wait
PHA
LSR
LSR
LSR
LSR
STA ORB ; set upper nibble
ORA #E
STA ORB
EOR #E
STA ORB
PLA ; set lower nibble
AND #$0F
STA ORB
ORA #E
STA ORB
EOR #E
STA ORB
RTS
write_char:
JSR lcd_wait
PHA
LSR
LSR
LSR
LSR
ORA #RS
STA ORB ; set upper nibble
ORA #E
STA ORB
EOR #E
STA ORB
PLA ; set lower nibble
AND #$0F
ORA #RS
STA ORB
ORA #E
STA ORB
EOR #E
STA ORB
RTS
.org $fffc
.word reset
.word $0000