Top level Atosm chip and its initial firmware
[AtosmChip.git] / tests / cpu_test.asm
blob51a1d7e516094e4b8639f241ea4ed0329c7ebf87
1 ;; Atosm Chip
2 ;; Copyright (C) 2008 Tomasz Malesinski <tmal@mimuw.edu.pl>
3 ;;
4 ;; This program is free software; you can redistribute it and/or modify
5 ;; it under the terms of the GNU General Public License as published by
6 ;; the Free Software Foundation; either version 2 of the License, or
7 ;; (at your option) any later version.
8 ;;
9 ;; This program is distributed in the hope that it will be useful,
10 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 ;; GNU General Public License for more details.
14 ;; You should have received a copy of the GNU General Public License
15 ;; along with this program; if not, write to the Free Software
16 ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 testres = $ee00
19 testfin = $ee01
20 testline = $ee02
21 testseq = $ee04
23 a_val = $17
24 x_val = $25
25 y_val = $3e
26 s_val = $f1
28 abs_adr = $0222
29 abs_val = $44
30 absx_val = $58
31 absy_val = $69
33 zp_adr = $3f
34 zp_val = $7b
35 zpx_val = $8e
36 zpy_val = $90
38 ind_adr = zp_adr - x_val - 2
39 indx_val = $a3
40 indy_val = $b6
42 .macro start_test seq
43 lda #<seq
44 sta testseq
45 lda #>seq
46 sta testseq + 1
47 ldx #$ff
48 txs
49 jsr setup_test
50 ldx #s_val
51 txs
52 ldx #x_val
53 .endmacro
55 .macro end_test
56 jsr save_regs
57 tsx
58 stx reg_s
59 .endmacro
61 .macro test_ok
62 lda #1
63 sta testres
64 .endmacro
66 .macro test_fail
67 lda #0
68 sta testres
69 .endmacro
71 .macro expect_a val
72 lda reg_a
73 cmp #val
74 jsr test_eq
75 .endmacro
77 .macro expect_x val
78 lda reg_x
79 cmp #val
80 jsr test_eq
81 .endmacro
83 .macro expect_y val
84 lda reg_y
85 cmp #val
86 jsr test_eq
87 .endmacro
89 .macro expect_s val
90 lda reg_s
91 cmp #val
92 jsr test_eq
93 .endmacro
95 .macro expect_eq
96 lda reg_f
97 and #2
98 jsr test_ne
99 .endmacro
101 .macro expect_ne
102 lda reg_f
103 and #2
104 jsr test_eq
105 .endmacro
107 .macro expect_pl
108 lda reg_f
109 and #$80
110 jsr test_eq
111 .endmacro
113 .macro expect_mi
114 lda reg_f
115 and #$80
116 jsr test_ne
117 .endmacro
119 .macro expect_cc
120 lda reg_f
121 and #1
122 jsr test_eq
123 .endmacro
125 .macro expect_cs
126 lda reg_f
127 and #1
128 jsr test_ne
129 .endmacro
131 .code
133 start:
134 ;; LDA
135 start_test 1
136 lda #0
137 end_test
138 expect_a 0
139 expect_x x_val
140 expect_y y_val
141 expect_s s_val
142 expect_eq
143 expect_pl
144 expect_cc
146 start_test 2
147 lda #$55
148 end_test
149 expect_a $55
150 expect_ne
151 expect_pl
152 expect_cc
154 start_test 3
155 lda #$aa
156 end_test
157 expect_a $aa
158 expect_ne
159 expect_mi
160 expect_cc
162 start_test 4
163 lda abs_adr
164 end_test
165 expect_a abs_val
167 start_test 5
168 lda abs_adr,x
169 end_test
170 expect_a absx_val
172 start_test 6
173 lda abs_adr,y
174 end_test
175 expect_a absy_val
177 start_test 7
178 lda zp_adr
179 end_test
180 expect_a zp_val
182 start_test 8
183 lda zp_adr,x
184 end_test
185 expect_a zpx_val
187 start_test 9
188 lda zp_adr,y
189 end_test
190 expect_a zpy_val
192 start_test 10
193 lda (ind_adr,x)
194 end_test
195 expect_a indx_val
197 start_test 11
198 lda (ind_adr),y
199 end_test
200 expect_a indy_val
202 ;; ADC
203 ;; TODO: v, decimal mode
204 start_test 12
205 lda #2
206 adc #3
207 end_test
208 expect_a 5
209 expect_x x_val
210 expect_y y_val
211 expect_s s_val
212 expect_ne
213 expect_pl
214 expect_cc
216 start_test 13
217 lda #2
218 adc #$ff
219 end_test
220 expect_a 1
221 expect_ne
222 expect_pl
223 expect_cs
225 start_test 14
226 lda #$40
227 adc #$50
228 end_test
229 expect_a $90
230 expect_ne
231 expect_mi
232 expect_cc
234 start_test 15
236 lda #$11
237 adc #$22
238 end_test
239 expect_a $34
240 expect_ne
241 expect_pl
242 expect_cc
244 start_test 16
245 adc abs_adr
246 end_test
247 expect_a (a_val + abs_val) & $ff
249 start_test 17
250 adc abs_adr,x
251 end_test
252 expect_a (a_val + absx_val) & $ff
254 start_test 18
255 adc abs_adr,y
256 end_test
257 expect_a (a_val + absy_val) & $ff
259 start_test 19
260 adc zp_adr
261 end_test
262 expect_a (a_val + zp_val) & $ff
264 start_test 20
265 adc zp_adr,x
266 end_test
267 expect_a (a_val + zpx_val) & $ff
269 start_test 21
270 adc zp_adr,y
271 end_test
272 expect_a (a_val + zpy_val) & $ff
274 start_test 22
275 adc (ind_adr,x)
276 end_test
277 expect_a (a_val + indx_val) & $ff
279 start_test 23
280 adc (ind_adr),y
281 end_test
282 expect_a (a_val + indy_val) & $ff
284 ;; SBC
285 ;; TODO: v, decimal mode
286 start_test 24
288 lda #3
289 sbc #2
290 end_test
291 expect_a 1
292 expect_x x_val
293 expect_y y_val
294 expect_s s_val
295 expect_ne
296 expect_pl
297 expect_cs
299 start_test 25
301 lda #2
302 sbc #$ff
303 end_test
304 expect_a 3
305 expect_ne
306 expect_pl
307 expect_cc
309 start_test 26
311 lda #$40
312 sbc #$90
313 end_test
314 expect_a $b0
315 expect_ne
316 expect_mi
317 expect_cc
319 start_test 27
321 lda #$22
322 sbc #$11
323 end_test
324 expect_a $10
325 expect_ne
326 expect_pl
327 expect_cs
329 start_test 28
331 sbc abs_adr
332 end_test
333 expect_a (a_val - abs_val) & $ff
335 start_test 29
337 sbc abs_adr,x
338 end_test
339 expect_a (a_val - absx_val) & $ff
341 start_test 30
343 sbc abs_adr,y
344 end_test
345 expect_a (a_val - absy_val) & $ff
347 start_test 31
349 sbc zp_adr
350 end_test
351 expect_a (a_val - zp_val) & $ff
353 start_test 32
355 sbc zp_adr,x
356 end_test
357 expect_a (a_val - zpx_val) & $ff
359 start_test 33
361 sbc zp_adr,y
362 end_test
363 expect_a (a_val - zpy_val) & $ff
365 start_test 34
367 sbc (ind_adr,x)
368 end_test
369 expect_a (a_val - indx_val) & $ff
371 start_test 35
373 sbc (ind_adr),y
374 end_test
375 expect_a (a_val - indy_val) & $ff
377 ;; CMP
378 ;; TODO: test V, with negative numbers, with carry initially set
379 start_test 36
380 cmp #a_val
381 end_test
382 expect_eq
383 expect_pl
384 expect_cs
385 expect_a a_val
386 expect_x x_val
387 expect_y y_val
388 expect_s s_val
390 start_test 37
391 cmp #a_val - 1
392 end_test
393 expect_ne
394 expect_pl
395 expect_cs
397 start_test 38
398 cmp #a_val + 1
399 end_test
400 expect_ne
401 expect_mi
402 expect_cc
404 start_test 39
405 lda #abs_val
406 cmp abs_adr
407 end_test
408 expect_eq
410 start_test 40
411 lda #absx_val
412 cmp abs_adr,x
413 end_test
414 expect_eq
416 start_test 41
417 lda #absy_val
418 cmp abs_adr,y
419 end_test
420 expect_eq
422 start_test 42
423 lda #zp_val
424 cmp zp_adr
425 end_test
426 expect_eq
428 start_test 43
429 lda #zpx_val
430 cmp zp_adr,x
431 end_test
432 expect_eq
434 start_test 44
435 lda #zpy_val
436 cmp zp_adr,y
437 end_test
438 expect_eq
440 start_test 45
441 lda #indx_val
442 cmp (ind_adr,x)
443 end_test
444 expect_eq
446 start_test 46
447 lda #indy_val
448 cmp (ind_adr),y
449 end_test
450 expect_eq
452 ;; CPX
453 ;; TODO: test V, with negative numbers, with carry initially set
454 ;; rest of addressing modes
455 start_test 47
456 cpx #x_val
457 end_test
458 expect_eq
459 expect_pl
460 expect_cs
461 expect_a a_val
462 expect_x x_val
463 expect_y y_val
464 expect_s s_val
466 start_test 48
467 cpx #x_val - 1
468 end_test
469 expect_ne
470 expect_pl
471 expect_cs
473 start_test 49
474 cpx #x_val + 1
475 end_test
476 expect_ne
477 expect_mi
478 expect_cc
480 start_test 50
481 ldx #abs_val
482 cpx abs_adr
483 end_test
484 expect_eq
486 ;; CLC/SEC
487 start_test 51
490 end_test
491 expect_cc
492 expect_a a_val
493 expect_x x_val
494 expect_y y_val
495 expect_s s_val
497 start_test 52
500 end_test
501 expect_cs
502 expect_a a_val
503 expect_x x_val
504 expect_y y_val
505 expect_s s_val
507 ;; DEX
508 start_test 53
509 ldx #10
511 end_test
512 expect_x 9
513 expect_a a_val
514 expect_y y_val
515 expect_s s_val
516 expect_pl
517 expect_ne
519 start_test 54
520 ldx #1
522 end_test
523 expect_x 0
524 expect_pl
525 expect_eq
527 start_test 55
528 ldx #0
530 end_test
531 expect_x $ff
532 expect_mi
533 expect_ne
535 ;; TAX
536 start_test 56
538 end_test
539 expect_a a_val
540 expect_x a_val
541 expect_y y_val
542 expect_s s_val
543 expect_pl
544 expect_ne
545 expect_cc
547 start_test 57
548 lda #0
550 end_test
551 expect_x 0
552 expect_pl
553 expect_eq
554 expect_cc
556 start_test 58
557 lda #$ff
559 end_test
560 expect_x $ff
561 expect_mi
562 expect_ne
563 expect_cc
565 ;; TXA
566 start_test 59
568 end_test
569 expect_a x_val
570 expect_x x_val
571 expect_y y_val
572 expect_s s_val
573 expect_pl
574 expect_ne
575 expect_cc
577 start_test 60
578 ldx #0
580 end_test
581 expect_a 0
582 expect_pl
583 expect_eq
584 expect_cc
586 start_test 61
587 ldx #$ff
589 end_test
590 expect_a $ff
591 expect_mi
592 expect_ne
593 expect_cc
595 ;; TAY
596 start_test 62
598 end_test
599 expect_a a_val
600 expect_y a_val
601 expect_x x_val
602 expect_s s_val
603 expect_pl
604 expect_ne
605 expect_cc
607 start_test 63
608 lda #0
610 end_test
611 expect_y 0
612 expect_pl
613 expect_eq
614 expect_cc
616 start_test 64
617 lda #$ff
619 end_test
620 expect_y $ff
621 expect_mi
622 expect_ne
623 expect_cc
625 ;; TYA
626 start_test 65
628 end_test
629 expect_a y_val
630 expect_y y_val
631 expect_x x_val
632 expect_s s_val
633 expect_pl
634 expect_ne
635 expect_cc
637 start_test 66
638 ldy #0
640 end_test
641 expect_a 0
642 expect_pl
643 expect_eq
644 expect_cc
646 start_test 67
647 ldy #$ff
649 end_test
650 expect_a $ff
651 expect_mi
652 expect_ne
653 expect_cc
655 sta testfin
656 wait: jmp wait
658 setup_test:
659 lda #abs_val
660 sta abs_adr
661 lda #absx_val
662 sta abs_adr + x_val
663 lda #absy_val
664 sta abs_adr + y_val
666 lda #zp_val
667 sta zp_adr
668 lda #zpx_val
669 sta zp_adr + x_val
670 lda #zpy_val
671 sta zp_adr + y_val
673 lda #$30
674 sta ind_adr + x_val
675 lda #2
676 sta ind_adr + x_val + 1
677 lda #indx_val
678 sta $230
680 lda #$44
681 sta ind_adr
682 lda #2
683 sta ind_adr + 1
684 lda #indy_val
685 sta $244 + y_val
691 lda #a_val
692 ldy #y_val
695 save_regs:
696 sta reg_a
697 stx reg_x
698 sty reg_y
701 sta reg_f
704 test_eq:
705 beq @ok
706 test_fail
708 @ok: test_ok
711 test_ne:
712 bne @ok
713 test_fail
715 @ok: test_ok
718 int: rti
720 .data
721 .byte $70
723 .segment "ZEROPAGE"
724 reg_a: .res 1
725 reg_x: .res 1
726 reg_y: .res 1
727 reg_s: .res 1
728 reg_f: .res 1
730 .segment "VECTORS"
731 .word int
732 .word start
733 .word int