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