1; Utilities for writing test ROMs
2
3; In NVRAM so these can be used before initializing runtime,
4; then runtime initialized without clearing them
5nv_res test_code ; code of current test
6nv_res test_name,2 ; address of name of current test, or 0 of none
7
8
9; Sets current test code and optional name. Also resets
10; checksum.
11; Preserved: A, X, Y
12.macro set_test code,name
13	pha
14	lda #code
15	jsr set_test_
16	.ifblank name
17		setb test_name+1,0
18	.else
19		.local Addr
20		setw test_name,Addr
21		seg_data "RODATA",{Addr: .byte name,0}
22	.endif
23	pla
24.endmacro
25
26set_test_:
27	sta test_code
28	jmp reset_crc
29
30
31; Initializes testing module
32init_testing = init_crc
33
34
35; Reports that all tests passed
36tests_passed:
37	jsr print_filename
38	print_str newline,"Passed"
39	lda #0
40	jmp exit
41
42
43; Reports "Done" if set_test has never been used,
44; "Passed" if set_test 0 was last used, or
45; failure if set_test n was last used.
46tests_done:
47	ldx test_code
48	jeq tests_passed
49	inx
50	bne test_failed
51	jsr print_filename
52	print_str newline,"Done"
53	lda #0
54	jmp exit
55
56
57; Reports that the current test failed. Prints code and
58; name last set with set_test, or just "Failed" if none
59; have been set yet.
60test_failed:
61	ldx test_code
62
63	; Treat $FF as 1, in case it wasn't ever set
64	inx
65	bne :+
66	inx
67	stx test_code
68:
69	; If code >= 2, print name
70	cpx #2-1        ; -1 due to inx above
71	blt :+
72	lda test_name+1
73	beq :+
74	jsr print_newline
75	sta addr+1
76	lda test_name
77	sta addr
78	jsr print_str_addr
79	jsr print_newline
80:
81	jsr print_filename
82
83	; End program
84	lda test_code
85	jmp exit
86
87
88; If checksum doesn't match expected, reports failed test.
89; Clears checksum afterwards.
90; Preserved: A, X, Y
91.macro check_crc expected
92	jsr_with_addr check_crc_,{.dword expected}
93.endmacro
94
95check_crc_:
96	pha
97	jsr is_crc_
98	bne :+
99	jsr reset_crc
100	pla
101	rts
102
103:       jsr print_newline
104	jsr print_crc
105	jmp test_failed
106