Cut 1 at interrupt support for CPU
[fpgaboy.git] / rom.asm
CommitLineData
616eebe0 1 SECTION "a",HOME
20204e79 2
616eebe0 3main:
20204e79 4 ld c, $51 ; Note that we are alive.
616eebe0
JW
5 ld a, $FF
6 ld [c],a
62940da0 7
20204e79
JW
8 ld sp, $DFFF
9
10 ld hl, signon
616eebe0
JW
11 call puts
12
13 call memtest
20204e79
JW
14
15 call insntest
16
616eebe0 17 call waitsw
20204e79 18
9a5394d1 19 jr main
616eebe0 20
20204e79 21signon:
97d31911 22 db $0D,$0A,$1B,"[1mFPGABoy Diagnostic ROM",$1B,"[0m",$0D,$0A,0
616eebe0 23
20204e79 24; Memory tester: writes h ^ l to all addresses from C000 to DF80.
616eebe0
JW
25memtest:
26 ld hl,memteststr
27 call puts
28
20204e79 29 ld hl, $C000 ; Write loop
616eebe0
JW
30.wr:
31 ld a,h
32 xor l
33 ld [hli],a
34 ld a, $DF
35 cp h
9a5394d1 36 jr nz, .wr
616eebe0
JW
37 ld a, $80
38 cp l
9a5394d1 39 jr nz, .wr
616eebe0 40
20204e79 41 ld hl, $C000 ; Read loop
616eebe0
JW
42.rd:
43 ld a,h
44 xor l
45 ld b,a
46 ld a, [hli]
47 cp b
9a5394d1 48 jr nz, .memfail
616eebe0
JW
49
50 ld a, $DF
51 cp h
9a5394d1 52 jr nz, .rd
616eebe0
JW
53 ld a, $80
54 cp l
9a5394d1 55 jr nz, .rd
616eebe0 56
20204e79 57 ld hl, testokstr ; Say we're OK
616eebe0
JW
58 call puts
59 ret
20204e79
JW
60.memfail: ; Say we failed (sadface)
61 ; decrement hl the easy way
616eebe0
JW
62 ld a,[hld]
63 push hl
64 ld hl, failatstr
65 call puts
66 pop hl
67 ld a, h
68 call puthex
69 ld a, l
70 call puthex
71 ld a, $0A
72 call putc
73 ld a, $0D
74 call putc
75 ret
616eebe0
JW
76memteststr:
77 db "Testing memory from $C000 to $DF80...",0
78testokstr:
79 db " OK!",$0D,$0A,0
80failatstr:
81 db " Test failed at $",0
20204e79
JW
82
83puthex: ; Put two hex nibbles to the serial console.
616eebe0
JW
84 push af
85 rra
86 rra
87 rra
88 rra
89 ld b,$0F
90 and b
91 ld b,$30
92 add b
93 call putc
94 pop af
95 ld b,$0F
96 and b
97 ld b,$30
98 add b
99 call putc
100 ret
101
20204e79 102; Wait for switches to be flipped on and off again.
616eebe0
JW
103waitsw:
104 ld hl,waitswstr
105 call puts
106
06ad3a30 107 ld c, $07
62940da0 108 ld a, $04 ;start timer, 4.096KHz
06ad3a30
JW
109 ld [c], a
110
616eebe0
JW
111 ld c, $51
112 ld a, $00
113 ld [c],a
114
3785d05a
JW
115 ld e, a
116
06ad3a30
JW
117.loop1:
118 push bc
119 call testa
120 pop bc
616eebe0
JW
121 ld c, $51
122 ld b, $0
616eebe0
JW
123 ld a,[c]
124 cp b
9a5394d1 125 jr z,.loop1
616eebe0
JW
126.loop2:
127 ld a,[c]
128 cp b
9a5394d1 129 jr nz,.loop2
616eebe0
JW
130 ret
131
132waitswstr:
06ad3a30
JW
133 db "Diagnostic ROM complete; flip switches to nonzero and then to zero to reset. Expect A.",$0D,$0A,0
134
135testa:
136 ld c, $0F
137 ld a, [c]
138 ld b, $00
139 cp b
140 ret z
141 xor a
142 ld [c], a
62940da0
JW
143 ld a, $41
144 call putc
3785d05a
JW
145 ld a, 1
146 add e
147 ld c, $51
148 ld [c], a
149 ld e, a
06ad3a30 150 ret
616eebe0 151
20204e79
JW
152; Core instruction basic acceptance tests.
153insntest:
154 ld hl, .insnteststr
155 call puts
156
157 ; Test PUSH and POP.
158 ld b, $12
159 ld c, $34
160 ld d, $56
161 ld e, $78
162 push bc
163 pop de
164 ld hl, .pushpopfail
165 ld a, d
166 cp b
9a5394d1 167 jr nz,.fail
20204e79
JW
168 ld a, e
169 cp c
9a5394d1 170 jr nz,.fail
20204e79
JW
171
172 ; Test ALU (HL).
173 ld hl, .ff
174 ld a, $FF
175 xor [hl]
176 ld hl, .xorhlfail
9a5394d1 177 jr nz, .fail
20204e79 178
722e486a
JW
179 ; Test JP (HL)
180 ld hl, .jphl
181 jp [hl]
182 ld hl, .jphlfail
9a5394d1 183 jr .fail
722e486a
JW
184 rst $00
185.jphl:
186
187 ; Test JR
188 ld a, $FF
189 ld b, $00
190 cp b
191 jr nz,.jr
192 ld hl, .jrfail
9a5394d1 193 jr .fail
722e486a
JW
194 rst $00
195.jr:
dadf7990
JW
196
197 ; Test inc16
198 ld d, $12
199 ld e, $FF
200 ld hl, .inc16fail
201 inc de
202 ld a, $13
203 cp d
204 jr nz, .fail
205 ld a, $00
206 cp e
207 jr nz, .fail
722e486a 208
20204e79
JW
209 ; Test CP.
210 ld hl, .cpfail
211 ld a, $10
212 ld b, $20
213 cp b
9a5394d1 214 jr nc,.fail
20204e79
JW
215 ld a, $20
216 ld b, $10
217 cp b
9a5394d1 218 jr c,.fail
20204e79
JW
219
220 ; Test CPL
221 ld hl, .cplfail
222 ld a, $55
223 ld b, $AA
224 cpl
225 cp b
9a5394d1 226 jr nz,.fail
20204e79
JW
227
228 ld hl, .ok
229 call puts
230 ret
231.fail:
611e4a90
JW
232 call puts
233 ld hl, .testfailed
20204e79
JW
234 call puts
235 ret
236.insnteststr:
611e4a90 237 db "Testing instructions... ",0
20204e79 238.pushpopfail:
611e4a90 239 db "PUSH/POP",0
20204e79
JW
240.ff:
241 db $FF
242.xorhlfail:
611e4a90 243 db "XOR [HL]",0
722e486a 244.jphlfail:
611e4a90 245 db "JP [HL]",0
722e486a 246.jrfail:
611e4a90 247 db "JR",0
20204e79 248.cpfail:
611e4a90 249 db "CP",0
20204e79 250.cplfail:
611e4a90 251 db "CPL",0
dadf7990
JW
252.inc16fail:
253 db "INC16",0
611e4a90 254.testfailed:
f26748f7 255 db " test failed.",$0D,$0A,0
20204e79
JW
256.ok:
257 db "OK!",$0D,$0A,0
258
259; Serial port manipulation functions.
616eebe0 260putc:
616eebe0
JW
261 ld b, 0
262 ld c, $50
62940da0 263 push af
616eebe0
JW
264.waitport:
265 ld a,[c]
266 cp b
9a5394d1 267 jr nz,.waitport
62940da0 268 pop af
616eebe0
JW
269 ld [c],a
270 ret
271
272puts:
273 ld a, [hli]
274 ld b, $00
275 cp b
62940da0 276 jr z, .done
616eebe0 277 call putc
9a5394d1 278 jr puts
62940da0
JW
279.done:
280 ret
This page took 0.045175 seconds and 4 git commands to generate.