summaryrefslogtreecommitdiff
path: root/roms/simple_ram_test2.asm
blob: 9803056bfe322c13661b99f218f329f1c26a7210 (plain)
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