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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
PORTB = $6000
PORTA = $6001
DDRB = $6002
DDRA = $6003
E = %10000000
RW = %01000000
RS = %00100000
.org #$f800
reset:
ldx #$FF ; initialize call stack to $1FF
txs
lda #%11111111 ; set output on all pins of PORTB
sta DDRB
lda #%11100000 ; set output on LCD control pins of PORTA
sta DDRA
lda #%00111000 ; set 8-bit, 2-line display, 5x8 font
jsr lcd_send_command
lda #%00001110 ; display on, cursor on, no blink
jsr lcd_send_command
lda #%00000001 ; clear display
jsr lcd_send_command
lda #%00000010 ; return home
jsr lcd_send_command
lda #%00000110 ; set entry mode: increment, no shift
jsr lcd_send_command
set_memory:
ldy #$0
ldx #$FF
set_memory_loop:
sty $0, x
iny
dex
bne set_memory_loop
test_memory:
ldy #$0
ldx #$FF
test_memory_loop:
tya
pha
lda $0, x
cmp $1FF ; stack was empty so Y is now on top of stack
bne test_memory_bad
pla
tay
iny
dex
bne test_memory_loop
jmp test_memory_ok
test_memory_bad:
ldx #0
msg_loop_bad:
lda message_memory_bad, x
beq msg_end_bad
jsr lcd_send_data
inx
jmp msg_loop_bad
msg_end_bad:
jmp finish
test_memory_ok:
ldx #0
msg_loop_ok:
lda message_memory_ok, x
beq msg_end_ok
jsr lcd_send_data
inx
jmp msg_loop_ok
msg_end_ok
finish:
jmp finish
term:
jmp term
lcd_wait:
pha
lda #%00000000 ; port B to all input
sta DDRB
lcd_wait_loop:
lda #RW
sta PORTA
lda #(RW | E)
sta PORTA
lda PORTB
and #%10000000
bne lcd_wait_loop
lda #RW
sta PORTA
lda #%11111111 ; port B back to output
sta DDRB
pla
rts
lcd_send_command:
jsr lcd_wait
sta PORTB
lda #$0 ; clear RS/RW/E
sta PORTA
lda #E ; clear RS/RW, set E, send instruction
sta PORTA
lda #$0 ; clear RS/RW/E
sta PORTA
rts
lcd_send_data:
jsr lcd_wait
sta PORTB ; data to send to port B
lda #RS ; clear RW, E, set RS for data
sta PORTA
lda #( E | RS ) ; clear RW, set E/RS, send data
sta PORTA
lda #RS ; clear RS, E, keep RS
sta PORTA
rts
nmi:
rti
irq:
rti
message_memory_bad:
.asciiz "mem bad"
message_memory_ok:
.asciiz "mem ok"
.org #$fffa
.word nmi
.word reset
.word irq
|