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
|
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
clear_memory_start:
lda #0
ldx #$FF
ldy #0
clear_memory_loop:
sta $0, y
iny
dex
bne clear_memory_loop
ldx #0
msg_loop:
lda message_memory_clear, x
beq msg_end
jsr lcd_send_data
inx
jmp msg_loop
msg_end:
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_clear:
.asciiz "memory cleared"
.org #$fffa
.word nmi
.word reset
.word irq
|