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: 33 jmp init_crc 34 35 36; Reports that all tests passed 37tests_passed: 38 jsr print_filename 39 print_str newline,"Passed" 40 lda #0 41 jmp exit 42 43 44; Reports "Done" if set_test has never been used, 45; "Passed" if set_test 0 was last used, or 46; failure if set_test n was last used. 47tests_done: 48 ldx test_code 49 jeq tests_passed 50 inx 51 bne test_failed 52 jsr print_filename 53 print_str newline,"Done" 54 lda #0 55 jmp exit 56 57 58; Reports that the current test failed. Prints code and 59; name last set with set_test, or just "Failed" if none 60; have been set yet. 61test_failed: 62 ldx test_code 63 64 ; Treat $FF as 1, in case it wasn't ever set 65 inx 66 bne :+ 67 inx 68 stx test_code 69: 70 ; If code >= 2, print name 71 cpx #2-1 ; -1 due to inx above 72 blt :+ 73 lda test_name+1 74 beq :+ 75 jsr print_newline 76 sta addr+1 77 lda test_name 78 sta addr 79 jsr print_str_addr 80 jsr print_newline 81: 82 jsr print_filename 83 84 ; End program 85 lda test_code 86 jmp exit 87 88 89; If checksum doesn't match expected, reports failed test. 90; Clears checksum afterwards. 91; Preserved: A, X, Y 92.macro check_crc expected 93 jsr_with_addr check_crc_,{.dword expected} 94.endmacro 95 96check_crc_: 97 pha 98 jsr is_crc_ 99 bne :+ 100 jsr reset_crc 101 pla 102 rts 103 104: jsr print_newline 105 jsr print_crc 106 jmp test_failed 107