First cut at timer
[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
616eebe0 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
JW
107 ld c, $07
108 ld a, $07 ;start timer, 4.096KHz
109 ld [c], a
110
616eebe0
JW
111 ld c, $51
112 ld a, $00
113 ld [c],a
114
06ad3a30
JW
115.loop1:
116 push bc
117 call testa
118 pop bc
616eebe0
JW
119 ld c, $51
120 ld b, $0
616eebe0
JW
121 ld a,[c]
122 cp b
9a5394d1 123 jr z,.loop1
616eebe0
JW
124.loop2:
125 ld a,[c]
126 cp b
9a5394d1 127 jr nz,.loop2
616eebe0
JW
128 ret
129
130waitswstr:
06ad3a30
JW
131 db "Diagnostic ROM complete; flip switches to nonzero and then to zero to reset. Expect A.",$0D,$0A,0
132
133testa:
134 ld c, $0F
135 ld a, [c]
136 ld b, $00
137 cp b
138 ret z
139 xor a
140 ld [c], a
141 ld hl, $D000
142 ld c, [hl]
143 inc bc
144 ld [hl], c
145 ld a, c
146 ld c, $50
147 ld [c], a
148 ret
616eebe0 149
20204e79
JW
150; Core instruction basic acceptance tests.
151insntest:
152 ld hl, .insnteststr
153 call puts
154
155 ; Test PUSH and POP.
156 ld b, $12
157 ld c, $34
158 ld d, $56
159 ld e, $78
160 push bc
161 pop de
162 ld hl, .pushpopfail
163 ld a, d
164 cp b
9a5394d1 165 jr nz,.fail
20204e79
JW
166 ld a, e
167 cp c
9a5394d1 168 jr nz,.fail
20204e79
JW
169
170 ; Test ALU (HL).
171 ld hl, .ff
172 ld a, $FF
173 xor [hl]
174 ld hl, .xorhlfail
9a5394d1 175 jr nz, .fail
20204e79 176
722e486a
JW
177 ; Test JP (HL)
178 ld hl, .jphl
179 jp [hl]
180 ld hl, .jphlfail
9a5394d1 181 jr .fail
722e486a
JW
182 rst $00
183.jphl:
184
185 ; Test JR
186 ld a, $FF
187 ld b, $00
188 cp b
189 jr nz,.jr
190 ld hl, .jrfail
9a5394d1 191 jr .fail
722e486a
JW
192 rst $00
193.jr:
dadf7990
JW
194
195 ; Test inc16
196 ld d, $12
197 ld e, $FF
198 ld hl, .inc16fail
199 inc de
200 ld a, $13
201 cp d
202 jr nz, .fail
203 ld a, $00
204 cp e
205 jr nz, .fail
722e486a 206
20204e79
JW
207 ; Test CP.
208 ld hl, .cpfail
209 ld a, $10
210 ld b, $20
211 cp b
9a5394d1 212 jr nc,.fail
20204e79
JW
213 ld a, $20
214 ld b, $10
215 cp b
9a5394d1 216 jr c,.fail
20204e79
JW
217
218 ; Test CPL
219 ld hl, .cplfail
220 ld a, $55
221 ld b, $AA
222 cpl
223 cp b
9a5394d1 224 jr nz,.fail
20204e79
JW
225
226 ld hl, .ok
227 call puts
228 ret
229.fail:
611e4a90
JW
230 call puts
231 ld hl, .testfailed
20204e79
JW
232 call puts
233 ret
234.insnteststr:
611e4a90 235 db "Testing instructions... ",0
20204e79 236.pushpopfail:
611e4a90 237 db "PUSH/POP",0
20204e79
JW
238.ff:
239 db $FF
240.xorhlfail:
611e4a90 241 db "XOR [HL]",0
722e486a 242.jphlfail:
611e4a90 243 db "JP [HL]",0
722e486a 244.jrfail:
611e4a90 245 db "JR",0
20204e79 246.cpfail:
611e4a90 247 db "CP",0
20204e79 248.cplfail:
611e4a90 249 db "CPL",0
dadf7990
JW
250.inc16fail:
251 db "INC16",0
611e4a90 252.testfailed:
f26748f7 253 db " test failed.",$0D,$0A,0
20204e79
JW
254.ok:
255 db "OK!",$0D,$0A,0
256
257; Serial port manipulation functions.
616eebe0 258putc:
616eebe0
JW
259 ld b, 0
260 ld c, $50
261.waitport:
262 ld a,[c]
263 cp b
9a5394d1 264 jr nz,.waitport
616eebe0
JW
265 ld [c],a
266 ret
267
268puts:
269 ld a, [hli]
270 ld b, $00
271 cp b
f26748f7 272 ret z
616eebe0 273 call putc
9a5394d1 274 jr puts
This page took 0.04368 seconds and 4 git commands to generate.