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