mirror of
https://github.com/Klaus2m5/6502_65C02_functional_tests.git
synced 2024-12-27 06:29:19 +00:00
added report to standard output option
This commit is contained in:
parent
12434a8e47
commit
2c6a266d5f
@ -21,7 +21,7 @@
|
|||||||
; addressing modes with focus on propper setting of the processor status
|
; addressing modes with focus on propper setting of the processor status
|
||||||
; register bits.
|
; register bits.
|
||||||
;
|
;
|
||||||
; version 23-jul-2013
|
; version 16-aug-2013
|
||||||
; contact info at http://2m5.de or email K@2m5.de
|
; contact info at http://2m5.de or email K@2m5.de
|
||||||
;
|
;
|
||||||
; assembled with AS65 from http://www.kingswood-consulting.co.uk/assemblers/
|
; assembled with AS65 from http://www.kingswood-consulting.co.uk/assemblers/
|
||||||
@ -65,35 +65,47 @@
|
|||||||
; 02-mar-2013 fixed PLA flags not tested
|
; 02-mar-2013 fixed PLA flags not tested
|
||||||
; 19-jul-2013 allowed ROM vectors to be loaded when load_data_direct = 0
|
; 19-jul-2013 allowed ROM vectors to be loaded when load_data_direct = 0
|
||||||
; added test sequence check to detect if tests jump their fence
|
; added test sequence check to detect if tests jump their fence
|
||||||
; 23-jul-2013 added RAM integrity check
|
; 23-jul-2013 added RAM integrity check option
|
||||||
|
; 16-aug-2013 added error report to standard output option
|
||||||
|
|
||||||
|
|
||||||
; C O N F I G U R A T I O N
|
; C O N F I G U R A T I O N
|
||||||
;
|
|
||||||
;ROM_vectors writable (0=no, 1=yes)
|
;ROM_vectors writable (0=no, 1=yes)
|
||||||
;if ROM vectors can not be used interrupts will not be trapped
|
;if ROM vectors can not be used interrupts will not be trapped
|
||||||
;as a consequence BRK can not be tested but will be emulated to test RTI
|
;as a consequence BRK can not be tested but will be emulated to test RTI
|
||||||
ROM_vectors = 1
|
ROM_vectors = 1
|
||||||
|
|
||||||
;load_data_direct (0=move from code segment, 1=load directly)
|
;load_data_direct (0=move from code segment, 1=load directly)
|
||||||
;loading directly is preferred but may not be supported by your platform
|
;loading directly is preferred but may not be supported by your platform
|
||||||
;0 produces only consecutive object code, 1 is not suitable for a binary image
|
;0 produces only consecutive object code, 1 is not suitable for a binary image
|
||||||
load_data_direct = 1
|
load_data_direct = 1
|
||||||
|
|
||||||
;I_flag behavior (0=force enabled, 1=force disabled, 2=prohibit change, 3=allow
|
;I_flag behavior (0=force enabled, 1=force disabled, 2=prohibit change, 3=allow
|
||||||
;change) 2 requires extra code and is not recommended. SEI & CLI can only be
|
;change) 2 requires extra code and is not recommended. SEI & CLI can only be
|
||||||
;tested if you allow changing the interrupt status (I_flag = 3)
|
;tested if you allow changing the interrupt status (I_flag = 3)
|
||||||
I_flag = 3
|
I_flag = 3
|
||||||
|
|
||||||
;configure memory - try to stay away from memory used by the system
|
;configure memory - try to stay away from memory used by the system
|
||||||
;zero_page memory start address, $50 (80) consecutive Bytes required
|
;zero_page memory start address, $50 (80) consecutive Bytes required
|
||||||
; add 2 if I_flag = 2
|
; add 2 if I_flag = 2
|
||||||
zero_page = $a
|
zero_page = $a
|
||||||
|
|
||||||
;data_segment memory start address, $5B (91) consecutive Bytes required
|
;data_segment memory start address, $5B (91) consecutive Bytes required
|
||||||
data_segment = $200
|
data_segment = $200
|
||||||
if (data_segment & $ff) != 0
|
if (data_segment & $ff) != 0
|
||||||
ERROR ERROR ERROR low byte of data_segment MUST be $00 !!
|
ERROR ERROR ERROR low byte of data_segment MUST be $00 !!
|
||||||
endif
|
endif
|
||||||
|
|
||||||
;code_segment memory start address, 13kB of consecutive space required
|
;code_segment memory start address, 13kB of consecutive space required
|
||||||
; add 2.5 kB if I_flag = 2
|
; add 2.5 kB if I_flag = 2
|
||||||
;parts of the code are self modifying and must reside in RAM
|
;parts of the code are self modifying and must reside in RAM
|
||||||
code_segment = $400
|
code_segment = $400
|
||||||
|
|
||||||
|
;report errors through I/O channel (0=use standard self trap loops, 1=include
|
||||||
|
;report.i65 as I/O channel, add 3.5 kB)
|
||||||
|
report = 0
|
||||||
|
|
||||||
;RAM integrity test option. Checks for undesired RAM writes.
|
;RAM integrity test option. Checks for undesired RAM writes.
|
||||||
;set lowest non RAM or RAM mirror address page (-1=disable, 0=64k, $40=16k)
|
;set lowest non RAM or RAM mirror address page (-1=disable, 0=64k, $40=16k)
|
||||||
;leave disabled if a monitor, OS or background interrupt is allowed to alter RAM
|
;leave disabled if a monitor, OS or background interrupt is allowed to alter RAM
|
||||||
@ -115,6 +127,7 @@ ram_top = -1
|
|||||||
; my_error_handler should pop the calling address from the stack and report it.
|
; my_error_handler should pop the calling address from the stack and report it.
|
||||||
; putting larger portions of code (more than 3 bytes) inside the trap macro
|
; putting larger portions of code (more than 3 bytes) inside the trap macro
|
||||||
; may lead to branch range problems for some tests.
|
; may lead to branch range problems for some tests.
|
||||||
|
if report = 0
|
||||||
trap macro
|
trap macro
|
||||||
jmp * ;failed anyway
|
jmp * ;failed anyway
|
||||||
endm
|
endm
|
||||||
@ -142,9 +155,62 @@ trap_vs macro
|
|||||||
trap_vc macro
|
trap_vc macro
|
||||||
bvc * ;failed overflow clear
|
bvc * ;failed overflow clear
|
||||||
endm
|
endm
|
||||||
|
; please observe that during the test the stack gets invalidated
|
||||||
|
; therefore a RTS inside the success macro is not possible
|
||||||
success macro
|
success macro
|
||||||
jmp * ;test passed, no errors
|
jmp * ;test passed, no errors
|
||||||
endm
|
endm
|
||||||
|
endif
|
||||||
|
if report = 1
|
||||||
|
trap macro
|
||||||
|
jsr report_error
|
||||||
|
endm
|
||||||
|
trap_eq macro
|
||||||
|
bne skip\?
|
||||||
|
trap ;failed equal (zero)
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_ne macro
|
||||||
|
beq skip\?
|
||||||
|
trap ;failed not equal (non zero)
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_cs macro
|
||||||
|
bcc skip\?
|
||||||
|
trap ;failed carry set
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_cc macro
|
||||||
|
bcs skip\?
|
||||||
|
trap ;failed carry clear
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_mi macro
|
||||||
|
bpl skip\?
|
||||||
|
trap ;failed minus (bit 7 set)
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_pl macro
|
||||||
|
bmi skip\?
|
||||||
|
trap ;failed plus (bit 7 clear)
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_vs macro
|
||||||
|
bvc skip\?
|
||||||
|
trap ;failed overflow set
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_vc macro
|
||||||
|
bvs skip\?
|
||||||
|
trap ;failed overflow clear
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
; please observe that during the test the stack gets invalidated
|
||||||
|
; therefore a RTS inside the success macro is not possible
|
||||||
|
success macro
|
||||||
|
jsr report_success
|
||||||
|
endm
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
carry equ %00000001 ;flag bits in status
|
carry equ %00000001 ;flag bits in status
|
||||||
@ -465,7 +531,7 @@ next_test macro ;make sure, tests don't jump the fence
|
|||||||
cmp #test_num
|
cmp #test_num
|
||||||
trap_ne ;test is out of sequence
|
trap_ne ;test is out of sequence
|
||||||
test_num = test_num + 1
|
test_num = test_num + 1
|
||||||
lda #test_num ;*** this tests' number
|
lda #test_num ;*** next tests' number
|
||||||
sta test_case
|
sta test_case
|
||||||
;check_ram ;uncomment to find altered RAM after each test
|
;check_ram ;uncomment to find altered RAM after each test
|
||||||
endm
|
endm
|
||||||
@ -491,7 +557,7 @@ ad1 ds 1 ;operand 1 - accumulator
|
|||||||
ad2 ds 1 ;operand 2 - memory / immediate
|
ad2 ds 1 ;operand 2 - memory / immediate
|
||||||
adrl ds 1 ;expected result bits 0-7
|
adrl ds 1 ;expected result bits 0-7
|
||||||
adrh ds 1 ;expected result bit 8 (carry)
|
adrh ds 1 ;expected result bit 8 (carry)
|
||||||
adrf ds 1 ;expected flags NV0000ZC (-V in decimal mode)
|
adrf ds 1 ;expected flags NV0000ZC (only binary mode)
|
||||||
sb2 ds 1 ;operand 2 complemented for subtract
|
sb2 ds 1 ;operand 2 complemented for subtract
|
||||||
zp_bss
|
zp_bss
|
||||||
zp1 db $c3,$82,$41,0 ;test patterns for LDx BIT ROL ROR ASL LSR
|
zp1 db $c3,$82,$41,0 ;test patterns for LDx BIT ROL ROR ASL LSR
|
||||||
@ -577,6 +643,8 @@ data_bss_end
|
|||||||
code
|
code
|
||||||
org code_segment
|
org code_segment
|
||||||
start cld
|
start cld
|
||||||
|
ldx #$ff
|
||||||
|
txs
|
||||||
lda #0 ;*** test 0 = initialize
|
lda #0 ;*** test 0 = initialize
|
||||||
sta test_case
|
sta test_case
|
||||||
test_num = 0
|
test_num = 0
|
||||||
@ -586,6 +654,11 @@ test_num = 0
|
|||||||
sei
|
sei
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
;initialize I/O for report channel
|
||||||
|
if report = 1
|
||||||
|
jsr report_init
|
||||||
|
endif
|
||||||
|
|
||||||
;initialize BSS segment
|
;initialize BSS segment
|
||||||
if load_data_direct != 1
|
if load_data_direct != 1
|
||||||
ldx #zp_end-zp_init-1
|
ldx #zp_end-zp_init-1
|
||||||
@ -1036,10 +1109,6 @@ br4 php
|
|||||||
bvs nbr12
|
bvs nbr12
|
||||||
bcs nbr13
|
bcs nbr13
|
||||||
beq nbr14
|
beq nbr14
|
||||||
trap_mi
|
|
||||||
trap_vs
|
|
||||||
trap_cs
|
|
||||||
trap_eq
|
|
||||||
bpl br11 ;branches should be taken
|
bpl br11 ;branches should be taken
|
||||||
trap
|
trap
|
||||||
br11 bvc br12
|
br11 bvc br12
|
||||||
@ -1061,22 +1130,151 @@ br14 php
|
|||||||
cmp_flag 0 ;flags off except break (pushed by sw) + reserved?
|
cmp_flag 0 ;flags off except break (pushed by sw) + reserved?
|
||||||
trap_ne
|
trap_ne
|
||||||
;crosscheck flags
|
;crosscheck flags
|
||||||
set_stat carry
|
|
||||||
trap_cc
|
|
||||||
set_stat zero
|
set_stat zero
|
||||||
trap_ne
|
bne brzs1
|
||||||
set_stat overfl
|
beq brzs2
|
||||||
trap_vc
|
brzs1
|
||||||
|
trap ;branch zero/non zero
|
||||||
|
brzs2 bcs brzs3
|
||||||
|
bcc brzs4
|
||||||
|
brzs3
|
||||||
|
trap ;branch carry/no carry
|
||||||
|
brzs4 bmi brzs5
|
||||||
|
bpl brzs6
|
||||||
|
brzs5
|
||||||
|
trap ;branch minus/plus
|
||||||
|
brzs6 bvs brzs7
|
||||||
|
bvc brzs8
|
||||||
|
brzs7
|
||||||
|
trap ;branch overflow/no overflow
|
||||||
|
brzs8
|
||||||
|
set_stat carry
|
||||||
|
beq brcs1
|
||||||
|
bne brcs2
|
||||||
|
brcs1
|
||||||
|
trap ;branch zero/non zero
|
||||||
|
brcs2 bcc brcs3
|
||||||
|
bcs brcs4
|
||||||
|
brcs3
|
||||||
|
trap ;branch carry/no carry
|
||||||
|
brcs4 bmi brcs5
|
||||||
|
bpl brcs6
|
||||||
|
brcs5
|
||||||
|
trap ;branch minus/plus
|
||||||
|
brcs6 bvs brcs7
|
||||||
|
bvc brcs8
|
||||||
|
brcs7
|
||||||
|
trap ;branch overflow/no overflow
|
||||||
|
|
||||||
|
brcs8
|
||||||
set_stat minus
|
set_stat minus
|
||||||
trap_pl
|
beq brmi1
|
||||||
set_stat $ff-carry
|
bne brmi2
|
||||||
trap_cs
|
brmi1
|
||||||
|
trap ;branch zero/non zero
|
||||||
|
brmi2 bcs brmi3
|
||||||
|
bcc brmi4
|
||||||
|
brmi3
|
||||||
|
trap ;branch carry/no carry
|
||||||
|
brmi4 bpl brmi5
|
||||||
|
bmi brmi6
|
||||||
|
brmi5
|
||||||
|
trap ;branch minus/plus
|
||||||
|
brmi6 bvs brmi7
|
||||||
|
bvc brmi8
|
||||||
|
brmi7
|
||||||
|
trap ;branch overflow/no overflow
|
||||||
|
brmi8
|
||||||
|
set_stat overfl
|
||||||
|
beq brvs1
|
||||||
|
bne brvs2
|
||||||
|
brvs1
|
||||||
|
trap ;branch zero/non zero
|
||||||
|
brvs2 bcs brvs3
|
||||||
|
bcc brvs4
|
||||||
|
brvs3
|
||||||
|
trap ;branch carry/no carry
|
||||||
|
brvs4 bmi brvs5
|
||||||
|
bpl brvs6
|
||||||
|
brvs5
|
||||||
|
trap ;branch minus/plus
|
||||||
|
brvs6 bvc brvs7
|
||||||
|
bvs brvs8
|
||||||
|
brvs7
|
||||||
|
trap ;branch overflow/no overflow
|
||||||
|
brvs8
|
||||||
set_stat $ff-zero
|
set_stat $ff-zero
|
||||||
trap_eq
|
beq brzc1
|
||||||
set_stat $ff-overfl
|
bne brzc2
|
||||||
trap_vs
|
brzc1
|
||||||
|
trap ;branch zero/non zero
|
||||||
|
brzc2 bcc brzc3
|
||||||
|
bcs brzc4
|
||||||
|
brzc3
|
||||||
|
trap ;branch carry/no carry
|
||||||
|
brzc4 bpl brzc5
|
||||||
|
bmi brzc6
|
||||||
|
brzc5
|
||||||
|
trap ;branch minus/plus
|
||||||
|
brzc6 bvc brzc7
|
||||||
|
bvs brzc8
|
||||||
|
brzc7
|
||||||
|
trap ;branch overflow/no overflow
|
||||||
|
brzc8
|
||||||
|
set_stat $ff-carry
|
||||||
|
bne brcc1
|
||||||
|
beq brcc2
|
||||||
|
brcc1
|
||||||
|
trap ;branch zero/non zero
|
||||||
|
brcc2 bcs brcc3
|
||||||
|
bcc brcc4
|
||||||
|
brcc3
|
||||||
|
trap ;branch carry/no carry
|
||||||
|
brcc4 bpl brcc5
|
||||||
|
bmi brcc6
|
||||||
|
brcc5
|
||||||
|
trap ;branch minus/plus
|
||||||
|
brcc6 bvc brcc7
|
||||||
|
bvs brcc8
|
||||||
|
brcc7
|
||||||
|
trap ;branch overflow/no overflow
|
||||||
|
brcc8
|
||||||
set_stat $ff-minus
|
set_stat $ff-minus
|
||||||
trap_mi
|
bne brpl1
|
||||||
|
beq brpl2
|
||||||
|
brpl1
|
||||||
|
trap ;branch zero/non zero
|
||||||
|
brpl2 bcc brpl3
|
||||||
|
bcs brpl4
|
||||||
|
brpl3
|
||||||
|
trap ;branch carry/no carry
|
||||||
|
brpl4 bmi brpl5
|
||||||
|
bpl brpl6
|
||||||
|
brpl5
|
||||||
|
trap ;branch minus/plus
|
||||||
|
brpl6 bvc brpl7
|
||||||
|
bvs brpl8
|
||||||
|
brpl7
|
||||||
|
trap ;branch overflow/no overflow
|
||||||
|
brpl8
|
||||||
|
set_stat $ff-overfl
|
||||||
|
bne brvc1
|
||||||
|
beq brvc2
|
||||||
|
brvc1
|
||||||
|
trap ;branch zero/non zero
|
||||||
|
brvc2 bcc brvc3
|
||||||
|
bcs brvc4
|
||||||
|
brvc3
|
||||||
|
trap ;branch carry/no carry
|
||||||
|
brvc4 bpl brvc5
|
||||||
|
bmi brvc6
|
||||||
|
brvc5
|
||||||
|
trap ;branch minus/plus
|
||||||
|
brvc6 bvs brvc7
|
||||||
|
bvc brvc8
|
||||||
|
brvc7
|
||||||
|
trap ;branch overflow/no overflow
|
||||||
|
brvc8
|
||||||
next_test
|
next_test
|
||||||
|
|
||||||
; test PHA does not alter flags or accumulator but PLA does
|
; test PHA does not alter flags or accumulator but PLA does
|
||||||
@ -4912,7 +5110,9 @@ tdad7 cld
|
|||||||
|
|
||||||
lda test_case
|
lda test_case
|
||||||
cmp #test_num
|
cmp #test_num
|
||||||
trap_ne ;test is out of sequence
|
trap_ne ;previous test is out of sequence
|
||||||
|
lda #$f0 ;mark opcode testing complete
|
||||||
|
sta test_case
|
||||||
|
|
||||||
; final RAM integrity test
|
; final RAM integrity test
|
||||||
; verifies that none of the previous tests has altered RAM outside of the
|
; verifies that none of the previous tests has altered RAM outside of the
|
||||||
@ -4925,12 +5125,12 @@ tdad7 cld
|
|||||||
; allowed during previous tests.
|
; allowed during previous tests.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; S U C C E S S ************************************************
|
; S U C C E S S ************************************************
|
||||||
; -------------
|
; -------------
|
||||||
success ;if you get here everything went well
|
success ;if you get here everything went well
|
||||||
; -------------
|
; -------------
|
||||||
; S U C C E S S ************************************************
|
; S U C C E S S ************************************************
|
||||||
|
jmp start ;run again
|
||||||
|
|
||||||
; core subroutine of the decimal add/subtract test
|
; core subroutine of the decimal add/subtract test
|
||||||
; *** WARNING - tests documented behavior only! ***
|
; *** WARNING - tests documented behavior only! ***
|
||||||
@ -5479,7 +5679,7 @@ irq_trap ;BRK test or unextpected BRK or IRQ
|
|||||||
cmp_flag 0 ;break test should have B=1
|
cmp_flag 0 ;break test should have B=1
|
||||||
trap_ne ; - no break flag on stack
|
trap_ne ; - no break flag on stack
|
||||||
pla
|
pla
|
||||||
cmp #$34 ;should have added interrupt disable
|
cmp #fai ;should have added interrupt disable
|
||||||
trap_ne
|
trap_ne
|
||||||
tsx
|
tsx
|
||||||
cpx #$fc ;sp -3? (return addr, flags)
|
cpx #$fc ;sp -3? (return addr, flags)
|
||||||
@ -5498,6 +5698,10 @@ irq_trap ;BRK test or unextpected BRK or IRQ
|
|||||||
rti
|
rti
|
||||||
trap ;runover protection
|
trap ;runover protection
|
||||||
|
|
||||||
|
if report = 1
|
||||||
|
include "report.i65"
|
||||||
|
endif
|
||||||
|
|
||||||
;copy of data to initialize BSS segment
|
;copy of data to initialize BSS segment
|
||||||
if load_data_direct != 1
|
if load_data_direct != 1
|
||||||
zp_init
|
zp_init
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
; This program is designed to test IRQ and NMI of a 6502 emulator. It requires
|
; This program is designed to test IRQ and NMI of a 6502 emulator. It requires
|
||||||
; an internal or external feedback register to the IRQ & NMI inputs
|
; an internal or external feedback register to the IRQ & NMI inputs
|
||||||
;
|
;
|
||||||
; version 19-jul-2013
|
; version 16-aug-2013
|
||||||
; contact info at http://2m5.de or email K@2m5.de
|
; contact info at http://2m5.de or email K@2m5.de
|
||||||
;
|
;
|
||||||
; assembled with AS65 from http://www.kingswood-consulting.co.uk/assemblers/
|
; assembled with AS65 from http://www.kingswood-consulting.co.uk/assemblers/
|
||||||
@ -48,6 +48,8 @@
|
|||||||
;
|
;
|
||||||
; versions:
|
; versions:
|
||||||
; 19-jul-2013 1st version distributed for testing
|
; 19-jul-2013 1st version distributed for testing
|
||||||
|
; 16-aug-2013 added error report to standard output option
|
||||||
|
|
||||||
|
|
||||||
; C O N F I G U R A T I O N
|
; C O N F I G U R A T I O N
|
||||||
;
|
;
|
||||||
@ -86,6 +88,10 @@ data_segment = $200
|
|||||||
;code_segment memory start address
|
;code_segment memory start address
|
||||||
code_segment = $400
|
code_segment = $400
|
||||||
|
|
||||||
|
;report errors through I/O channel (0=use standard self trap loops, 1=include
|
||||||
|
;report.i65 as I/O channel)
|
||||||
|
report = 0
|
||||||
|
|
||||||
noopt ;do not take shortcuts
|
noopt ;do not take shortcuts
|
||||||
|
|
||||||
;macros for error & success traps to allow user modification
|
;macros for error & success traps to allow user modification
|
||||||
@ -98,6 +104,11 @@ code_segment = $400
|
|||||||
; trap ;failed equal (zero)
|
; trap ;failed equal (zero)
|
||||||
;skip\?
|
;skip\?
|
||||||
; endm
|
; endm
|
||||||
|
;
|
||||||
|
; my_error_handler should pop the calling address from the stack and report it.
|
||||||
|
; putting larger portions of code (more than 3 bytes) inside the trap macro
|
||||||
|
; may lead to branch range problems for some tests.
|
||||||
|
if report = 0
|
||||||
trap macro
|
trap macro
|
||||||
jmp * ;failed anyway
|
jmp * ;failed anyway
|
||||||
endm
|
endm
|
||||||
@ -107,9 +118,32 @@ trap_eq macro
|
|||||||
trap_ne macro
|
trap_ne macro
|
||||||
bne * ;failed not equal (non zero)
|
bne * ;failed not equal (non zero)
|
||||||
endm
|
endm
|
||||||
|
; please observe that during the test the stack gets invalidated
|
||||||
|
; therefore a RTS inside the success macro is not possible
|
||||||
success macro
|
success macro
|
||||||
jmp * ;test passed, no errors
|
jmp * ;test passed, no errors
|
||||||
endm
|
endm
|
||||||
|
endif
|
||||||
|
if report = 1
|
||||||
|
trap macro
|
||||||
|
jsr report_error
|
||||||
|
endm
|
||||||
|
trap_eq macro
|
||||||
|
bne skip\?
|
||||||
|
trap ;failed equal (zero)
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_ne macro
|
||||||
|
beq skip\?
|
||||||
|
trap ;failed not equal (non zero)
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
; please observe that during the test the stack gets invalidated
|
||||||
|
; therefore a RTS inside the success macro is not possible
|
||||||
|
success macro
|
||||||
|
jsr report_success
|
||||||
|
endm
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
carry equ %00000001 ;flag bits in status
|
carry equ %00000001 ;flag bits in status
|
||||||
@ -156,26 +190,27 @@ set_stat macro ;setting flags in the processor status register
|
|||||||
endif
|
endif
|
||||||
org zero_page
|
org zero_page
|
||||||
;BRK, IRQ, NMI test interrupt save
|
;BRK, IRQ, NMI test interrupt save
|
||||||
|
zpt
|
||||||
irq_a ds 1 ;a register
|
irq_a ds 1 ;a register
|
||||||
irq_x ds 1 ;x register
|
irq_x ds 1 ;x register
|
||||||
irq_f ds 1 ;flags
|
irq_f ds 1 ;flags
|
||||||
nmi_a ds 1 ;a register
|
nmi_a ds 1 ;a register
|
||||||
nmi_x ds 1 ;x register
|
nmi_x ds 1 ;x register
|
||||||
nmi_f ds 1 ;flags
|
nmi_f ds 1 ;flags
|
||||||
|
zp_bss
|
||||||
|
|
||||||
;fixed stack locations
|
;fixed stack locations
|
||||||
lst_f equ $1fe ;last flags before interrupt
|
lst_f equ $1fe ;last flags before interrupt
|
||||||
lst_a equ $1ff ;last accumulator before interrupt
|
lst_a equ $1ff ;last accumulator before interrupt
|
||||||
|
|
||||||
org data_segment
|
org data_segment
|
||||||
data_bss
|
|
||||||
;concurrent NMI, IRQ & BRK test result
|
;concurrent NMI, IRQ & BRK test result
|
||||||
nmi_count ds 1 ;lowest number handled first, $ff = never
|
nmi_count ds 1 ;lowest number handled first, $ff = never
|
||||||
irq_count ds 1 ;separation-1 = instructions between interrupts
|
irq_count ds 1 ;separation-1 = instructions between interrupts
|
||||||
brk_count ds 1
|
brk_count ds 1
|
||||||
;expected interrupt mask
|
;expected interrupt mask
|
||||||
I_src ds 1 ;bit: 0=BRK, 1=IRQ, 2=NMI
|
I_src ds 1 ;bit: 0=BRK, 1=IRQ, 2=NMI
|
||||||
data_bss_end
|
data_bss
|
||||||
|
|
||||||
code
|
code
|
||||||
org code_segment
|
org code_segment
|
||||||
@ -185,6 +220,11 @@ start cld
|
|||||||
ldx #$ff
|
ldx #$ff
|
||||||
txs
|
txs
|
||||||
|
|
||||||
|
;initialize I/O for report channel
|
||||||
|
if report = 1
|
||||||
|
jsr report_init
|
||||||
|
endif
|
||||||
|
|
||||||
; load system vectors
|
; load system vectors
|
||||||
if load_data_direct != 1
|
if load_data_direct != 1
|
||||||
ldx #5
|
ldx #5
|
||||||
@ -781,6 +821,7 @@ I_clr macro ibit ;ibit = interrupt bit
|
|||||||
; S U C C E S S ************************************************
|
; S U C C E S S ************************************************
|
||||||
; check data_segment +0 to +2 for sequence of concurrent interrupts
|
; check data_segment +0 to +2 for sequence of concurrent interrupts
|
||||||
; e.g. 0x200 = NMI, 0x201 = IRQ, 0x202 = BRK, lower values = earlier
|
; e.g. 0x200 = NMI, 0x201 = IRQ, 0x202 = BRK, lower values = earlier
|
||||||
|
jmp start ;run again
|
||||||
|
|
||||||
; manual tests for the WAI opcode of the 65c02
|
; manual tests for the WAI opcode of the 65c02
|
||||||
|
|
||||||
@ -788,7 +829,7 @@ wai macro
|
|||||||
db $cb ;WAI opcode
|
db $cb ;WAI opcode
|
||||||
endm
|
endm
|
||||||
|
|
||||||
; requires single step operation
|
; requires single step operation, report = 0
|
||||||
; set PC to the 1st instruction of the test
|
; set PC to the 1st instruction of the test
|
||||||
; step to the WAI opcode, then manually tie the IRQ input low
|
; step to the WAI opcode, then manually tie the IRQ input low
|
||||||
; continue to step until you see the PC advance, then remove IRQ
|
; continue to step until you see the PC advance, then remove IRQ
|
||||||
@ -949,6 +990,11 @@ brk_trap
|
|||||||
plp ;should be reversed by rti
|
plp ;should be reversed by rti
|
||||||
rti
|
rti
|
||||||
|
|
||||||
|
if report = 1
|
||||||
|
rep_int = 1
|
||||||
|
include "report.i65"
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
;system vectors
|
;system vectors
|
||||||
if (load_data_direct = 1)
|
if (load_data_direct = 1)
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
; The 6502_functional_test is a prerequisite to this test.
|
; The 6502_functional_test is a prerequisite to this test.
|
||||||
; NMI, IRQ, BRK, STP & WAI are covered in the 6502_interrupt_test.
|
; NMI, IRQ, BRK, STP & WAI are covered in the 6502_interrupt_test.
|
||||||
;
|
;
|
||||||
; version 23-jul-2013
|
; version 16-aug-2013
|
||||||
; contact info at http://2m5.de or email K@2m5.de
|
; contact info at http://2m5.de or email K@2m5.de
|
||||||
;
|
;
|
||||||
; assembled with AS65 from http://www.kingswood-consulting.co.uk/assemblers/
|
; assembled with AS65 from http://www.kingswood-consulting.co.uk/assemblers/
|
||||||
@ -60,39 +60,53 @@
|
|||||||
; 19-jul-2013 1st version distributed for testing
|
; 19-jul-2013 1st version distributed for testing
|
||||||
; 23-jul-2013 fixed BRA out of range due to larger trap macros
|
; 23-jul-2013 fixed BRA out of range due to larger trap macros
|
||||||
; added RAM integrity check
|
; added RAM integrity check
|
||||||
|
; 16-aug-2013 added error report to standard output option
|
||||||
|
|
||||||
|
|
||||||
; C O N F I G U R A T I O N
|
; C O N F I G U R A T I O N
|
||||||
;
|
|
||||||
;ROM_vectors writable (0=no, 1=yes)
|
;ROM_vectors writable (0=no, 1=yes)
|
||||||
;if ROM vectors can not be used interrupts will not be trapped
|
;if ROM vectors can not be used interrupts will not be trapped
|
||||||
;as a consequence BRK can not be tested but will be emulated to test RTI
|
;as a consequence BRK can not be tested but will be emulated to test RTI
|
||||||
ROM_vectors = 1
|
ROM_vectors = 1
|
||||||
|
|
||||||
;load_data_direct (0=move from code segment, 1=load directly)
|
;load_data_direct (0=move from code segment, 1=load directly)
|
||||||
;loading directly is preferred but may not be supported by your platform
|
;loading directly is preferred but may not be supported by your platform
|
||||||
;0 produces only consecutive object code, 1 is not suitable for a binary image
|
;0 produces only consecutive object code, 1 is not suitable for a binary image
|
||||||
load_data_direct = 1
|
load_data_direct = 1
|
||||||
|
|
||||||
;I_flag behavior (0=force enabled, 1=force disabled, 2=prohibit change, 3=allow
|
;I_flag behavior (0=force enabled, 1=force disabled, 2=prohibit change, 3=allow
|
||||||
;change) 2 requires extra code and is not recommended.
|
;change) 2 requires extra code and is not recommended.
|
||||||
I_flag = 3
|
I_flag = 3
|
||||||
|
|
||||||
;configure memory - try to stay away from memory used by the system
|
;configure memory - try to stay away from memory used by the system
|
||||||
;zero_page memory start address, $4e (78) consecutive Bytes required
|
;zero_page memory start address, $4e (78) consecutive Bytes required
|
||||||
; add 2 if I_flag = 2
|
; add 2 if I_flag = 2
|
||||||
zero_page = $a
|
zero_page = $a
|
||||||
|
|
||||||
;data_segment memory start address, $5D (93) consecutive Bytes required
|
;data_segment memory start address, $5D (93) consecutive Bytes required
|
||||||
; + 12 Bytes at data_segment + $f9 (JMP indirect page cross test)
|
; + 12 Bytes at data_segment + $f9 (JMP indirect page cross test)
|
||||||
data_segment = $200
|
data_segment = $200
|
||||||
if (data_segment & $ff) != 0
|
if (data_segment & $ff) != 0
|
||||||
ERROR ERROR ERROR low byte of data_segment MUST be $00 !!
|
ERROR ERROR ERROR low byte of data_segment MUST be $00 !!
|
||||||
endif
|
endif
|
||||||
|
|
||||||
;code_segment memory start address, 10kB of consecutive space required
|
;code_segment memory start address, 10kB of consecutive space required
|
||||||
; add 1 kB if I_flag = 2
|
; add 1 kB if I_flag = 2
|
||||||
;parts of the code are self modifying and must reside in RAM
|
;parts of the code are self modifying and must reside in RAM
|
||||||
code_segment = $400
|
code_segment = $400
|
||||||
|
|
||||||
;added WDC only opcodes WAI & STP (0=test as NOPs, >0=no test)
|
;added WDC only opcodes WAI & STP (0=test as NOPs, >0=no test)
|
||||||
wdc_op = 1
|
wdc_op = 1
|
||||||
|
|
||||||
;added Rockwell & WDC opcodes BBR, BBS, RMB & SMB
|
;added Rockwell & WDC opcodes BBR, BBS, RMB & SMB
|
||||||
;(0=test as NOPs, 1=full test, >1=no test)
|
;(0=test as NOPs, 1=full test, >1=no test)
|
||||||
rkwl_wdc_op = 1
|
rkwl_wdc_op = 1
|
||||||
|
|
||||||
|
;report errors through I/O channel (0=use standard self trap loops, 1=include
|
||||||
|
;report.i65 as I/O channel, add 3 kB)
|
||||||
|
report = 0
|
||||||
|
|
||||||
;RAM integrity test option. Checks for undesired RAM writes.
|
;RAM integrity test option. Checks for undesired RAM writes.
|
||||||
;set lowest non RAM or RAM mirror address page (-1=disable, 0=64k, $40=16k)
|
;set lowest non RAM or RAM mirror address page (-1=disable, 0=64k, $40=16k)
|
||||||
;leave disabled if a monitor, OS or background interrupt is allowed to alter RAM
|
;leave disabled if a monitor, OS or background interrupt is allowed to alter RAM
|
||||||
@ -114,6 +128,7 @@ ram_top = -1
|
|||||||
; my_error_handler should pop the calling address from the stack and report it.
|
; my_error_handler should pop the calling address from the stack and report it.
|
||||||
; putting larger portions of code (more than 3 bytes) inside the trap macro
|
; putting larger portions of code (more than 3 bytes) inside the trap macro
|
||||||
; may lead to branch range problems for some tests.
|
; may lead to branch range problems for some tests.
|
||||||
|
if report = 0
|
||||||
trap macro
|
trap macro
|
||||||
jmp * ;failed anyway
|
jmp * ;failed anyway
|
||||||
endm
|
endm
|
||||||
@ -141,9 +156,62 @@ trap_vs macro
|
|||||||
trap_vc macro
|
trap_vc macro
|
||||||
bvc * ;failed overflow clear
|
bvc * ;failed overflow clear
|
||||||
endm
|
endm
|
||||||
|
; please observe that during the test the stack gets invalidated
|
||||||
|
; therefore a RTS inside the success macro is not possible
|
||||||
success macro
|
success macro
|
||||||
jmp * ;test passed, no errors
|
jmp * ;test passed, no errors
|
||||||
endm
|
endm
|
||||||
|
endif
|
||||||
|
if report = 1
|
||||||
|
trap macro
|
||||||
|
jsr report_error
|
||||||
|
endm
|
||||||
|
trap_eq macro
|
||||||
|
bne skip\?
|
||||||
|
trap ;failed equal (zero)
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_ne macro
|
||||||
|
beq skip\?
|
||||||
|
trap ;failed not equal (non zero)
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_cs macro
|
||||||
|
bcc skip\?
|
||||||
|
trap ;failed carry set
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_cc macro
|
||||||
|
bcs skip\?
|
||||||
|
trap ;failed carry clear
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_mi macro
|
||||||
|
bpl skip\?
|
||||||
|
trap ;failed minus (bit 7 set)
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_pl macro
|
||||||
|
bmi skip\?
|
||||||
|
trap ;failed plus (bit 7 clear)
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_vs macro
|
||||||
|
bvc skip\?
|
||||||
|
trap ;failed overflow set
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
trap_vc macro
|
||||||
|
bvs skip\?
|
||||||
|
trap ;failed overflow clear
|
||||||
|
skip\?
|
||||||
|
endm
|
||||||
|
; please observe that during the test the stack gets invalidated
|
||||||
|
; therefore a RTS inside the success macro is not possible
|
||||||
|
success macro
|
||||||
|
jsr report_success
|
||||||
|
endm
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
carry equ %00000001 ;flag bits in status
|
carry equ %00000001 ;flag bits in status
|
||||||
@ -472,7 +540,7 @@ next_test macro ;make sure, tests don't jump the fence
|
|||||||
cmp #test_num
|
cmp #test_num
|
||||||
trap_ne ;test is out of sequence
|
trap_ne ;test is out of sequence
|
||||||
test_num = test_num + 1
|
test_num = test_num + 1
|
||||||
lda #test_num ;*** this tests' number
|
lda #test_num ;*** next tests' number
|
||||||
sta test_case
|
sta test_case
|
||||||
;check_ram ;uncomment to find altered RAM after each test
|
;check_ram ;uncomment to find altered RAM after each test
|
||||||
endm
|
endm
|
||||||
@ -582,9 +650,12 @@ jxi_tab equ data_segment + $100 - 7 ;JMP (jxi_tab,x) x=6
|
|||||||
ji_tab equ data_segment + $100 - 3 ;JMP (ji_tab+2)
|
ji_tab equ data_segment + $100 - 3 ;JMP (ji_tab+2)
|
||||||
jxp_tab equ data_segment + $100 ;JMP (jxp_tab-255) x=255
|
jxp_tab equ data_segment + $100 ;JMP (jxp_tab-255) x=255
|
||||||
|
|
||||||
|
|
||||||
code
|
code
|
||||||
org code_segment
|
org code_segment
|
||||||
start cld
|
start cld
|
||||||
|
ldx #$ff
|
||||||
|
txs
|
||||||
lda #0 ;*** test 0 = initialize
|
lda #0 ;*** test 0 = initialize
|
||||||
sta test_case
|
sta test_case
|
||||||
test_num = 0
|
test_num = 0
|
||||||
@ -594,6 +665,11 @@ test_num = 0
|
|||||||
sei
|
sei
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
;initialize I/O for report channel
|
||||||
|
if report = 1
|
||||||
|
jsr report_init
|
||||||
|
endif
|
||||||
|
|
||||||
;initialize BSS segment
|
;initialize BSS segment
|
||||||
if load_data_direct != 1
|
if load_data_direct != 1
|
||||||
ldx #zp_end-zp_init-1
|
ldx #zp_end-zp_init-1
|
||||||
@ -2129,7 +2205,9 @@ tdad7 cpx #ad2
|
|||||||
|
|
||||||
lda test_case
|
lda test_case
|
||||||
cmp #test_num
|
cmp #test_num
|
||||||
trap_ne ;test is out of sequence
|
trap_ne ;previous test is out of sequence
|
||||||
|
lda #$f0 ;mark opcode testing complete
|
||||||
|
sta test_case
|
||||||
|
|
||||||
; final RAM integrity test
|
; final RAM integrity test
|
||||||
; verifies that none of the previous tests has altered RAM outside of the
|
; verifies that none of the previous tests has altered RAM outside of the
|
||||||
@ -2142,12 +2220,12 @@ tdad7 cpx #ad2
|
|||||||
; allowed during previous tests.
|
; allowed during previous tests.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; S U C C E S S ************************************************
|
; S U C C E S S ************************************************
|
||||||
; -------------
|
; -------------
|
||||||
success ;if you get here everything went well
|
success ;if you get here everything went well
|
||||||
; -------------
|
; -------------
|
||||||
; S U C C E S S ************************************************
|
; S U C C E S S ************************************************
|
||||||
|
jmp start ;run again
|
||||||
|
|
||||||
; core subroutine of the decimal add/subtract test
|
; core subroutine of the decimal add/subtract test
|
||||||
; *** WARNING - tests documented behavior only! ***
|
; *** WARNING - tests documented behavior only! ***
|
||||||
@ -2530,6 +2608,10 @@ irq_trap
|
|||||||
trap_ne ;check stack for conditions at BRK
|
trap_ne ;check stack for conditions at BRK
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if report = 1
|
||||||
|
include "report.i65"
|
||||||
|
endif
|
||||||
|
|
||||||
;copy of data to initialize BSS segment
|
;copy of data to initialize BSS segment
|
||||||
if load_data_direct != 1
|
if load_data_direct != 1
|
||||||
zp_init
|
zp_init
|
||||||
|
@ -21,7 +21,7 @@ project. You can find it here: http://2m5.de/6502_Emu/index.htm
|
|||||||
A discussion about the tests can be found here:
|
A discussion about the tests can be found here:
|
||||||
http://forum.6502.org/viewtopic.php?f=2&t=2241
|
http://forum.6502.org/viewtopic.php?f=2&t=2241
|
||||||
|
|
||||||
Good luck debugging your emulator, simulator, vhdl core, discrete
|
Good luck debugging your emulator, simulator, fpga core, discrete
|
||||||
logic implementation or whatever you have!
|
logic implementation or whatever you have!
|
||||||
|
|
||||||
|
|
||||||
|
179
report.i65
Normal file
179
report.i65
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
;**** report 6502 funtional test errors to standard I/O ****
|
||||||
|
;
|
||||||
|
;this include file is part of the 6502 functional tests
|
||||||
|
;it is used when you configure report = 1 in the tests
|
||||||
|
;
|
||||||
|
;to adopt the standard output vectors of your test environment
|
||||||
|
;you must modify the rchar and rget subroutines in this include
|
||||||
|
;
|
||||||
|
;I/O hardware may have to be initialized in report_init
|
||||||
|
|
||||||
|
;print message macro - \1 = message location
|
||||||
|
rprt macro
|
||||||
|
ldx #0
|
||||||
|
lda \1
|
||||||
|
loop\?
|
||||||
|
jsr rchar
|
||||||
|
inx
|
||||||
|
lda \1,x
|
||||||
|
bne loop\?
|
||||||
|
endm
|
||||||
|
|
||||||
|
;initialize I/O as required (example: configure & enable ACIA)
|
||||||
|
report_init
|
||||||
|
;nothing to initialize
|
||||||
|
rprt rmsg_start
|
||||||
|
rts
|
||||||
|
|
||||||
|
;show stack (with saved registers), zeropage and absolute memory workspace
|
||||||
|
;after an error was trapped in the test program
|
||||||
|
report_error
|
||||||
|
;save registers
|
||||||
|
php
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
cld
|
||||||
|
;show stack with index to registers at error
|
||||||
|
rprt rmsg_stack
|
||||||
|
tsx
|
||||||
|
inx
|
||||||
|
lda #1 ;address high
|
||||||
|
jsr rhex
|
||||||
|
txa ;address low
|
||||||
|
jsr rhex
|
||||||
|
rstack jsr rspace
|
||||||
|
lda $100,x ;stack data
|
||||||
|
jsr rhex
|
||||||
|
inx
|
||||||
|
bne rstack
|
||||||
|
jsr rcrlf ;new line
|
||||||
|
;show zero page workspace
|
||||||
|
lda #0
|
||||||
|
jsr rhex
|
||||||
|
lda #zpt
|
||||||
|
tax
|
||||||
|
jsr rhex
|
||||||
|
rzp jsr rspace
|
||||||
|
lda 0,x
|
||||||
|
jsr rhex
|
||||||
|
inx
|
||||||
|
cpx #zp_bss
|
||||||
|
bne rzp
|
||||||
|
jsr rcrlf
|
||||||
|
;show absolute workspace
|
||||||
|
lda #hi(data_segment)
|
||||||
|
jsr rhex
|
||||||
|
lda #lo(data_segment)
|
||||||
|
jsr rhex
|
||||||
|
ldx #0
|
||||||
|
rabs jsr rspace
|
||||||
|
lda data_segment,x
|
||||||
|
jsr rhex
|
||||||
|
inx
|
||||||
|
cpx #(data_bss-data_segment)
|
||||||
|
bne rabs
|
||||||
|
;ask to continue
|
||||||
|
rprt rmsg_cont
|
||||||
|
rerr1 jsr rget
|
||||||
|
cmp #'C'
|
||||||
|
bne rerr1
|
||||||
|
;restore registers
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
tax
|
||||||
|
pla
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
|
||||||
|
;show test has ended, ask to repeat
|
||||||
|
report_success
|
||||||
|
if rep_int = 1
|
||||||
|
rprt rmsg_priority
|
||||||
|
lda data_segment ;show interrupt sequence
|
||||||
|
jsr rhex
|
||||||
|
jsr rspace
|
||||||
|
lda data_segment+1
|
||||||
|
jsr rhex
|
||||||
|
jsr rspace
|
||||||
|
lda data_segment+2
|
||||||
|
jsr rhex
|
||||||
|
endif
|
||||||
|
rprt rmsg_success
|
||||||
|
rsuc1 jsr rget
|
||||||
|
cmp #'R'
|
||||||
|
bne rsuc1
|
||||||
|
rts
|
||||||
|
|
||||||
|
;input subroutine
|
||||||
|
;get a character from standard input
|
||||||
|
;adjust according to the needs in your test environment
|
||||||
|
rget ;get character in A
|
||||||
|
;rget1
|
||||||
|
; lda $bff1 ;wait RDRF
|
||||||
|
; and #8
|
||||||
|
; beq rget1
|
||||||
|
;not a real ACIA - so RDRF is not checked
|
||||||
|
lda $bff0 ;read acia rx reg
|
||||||
|
;the load can be replaced by a call to a kernal routine
|
||||||
|
; jsr $ffcf ;example: CHRIN for a C64
|
||||||
|
cmp #'a' ;lower case
|
||||||
|
bcc rget1
|
||||||
|
and #$5f ;convert to upper case
|
||||||
|
rget1 rts
|
||||||
|
|
||||||
|
;output subroutines
|
||||||
|
rcrlf lda #10
|
||||||
|
jsr rchar
|
||||||
|
lda #13
|
||||||
|
bne rchar
|
||||||
|
|
||||||
|
rspace lda #' '
|
||||||
|
bne rchar
|
||||||
|
|
||||||
|
rhex pha ;report hex byte in A
|
||||||
|
lsr a ;high nibble first
|
||||||
|
lsr a
|
||||||
|
lsr a
|
||||||
|
lsr a
|
||||||
|
jsr rnib
|
||||||
|
pla ;now low nibble
|
||||||
|
and #$f
|
||||||
|
|
||||||
|
rnib clc ;report nibble in A
|
||||||
|
adc #'0' ;make printable 0-9
|
||||||
|
cmp #'9'+1
|
||||||
|
bcc rchar
|
||||||
|
adc #6 ;make printable A-F
|
||||||
|
|
||||||
|
;send a character to standard output
|
||||||
|
;adjust according to the needs in your test environment
|
||||||
|
;register X needs to be preserved!
|
||||||
|
rchar ;report character in A
|
||||||
|
; pha ;wait TDRF
|
||||||
|
;rchar1 lda $bff1
|
||||||
|
; and #$10
|
||||||
|
; beq rchar1
|
||||||
|
; pla
|
||||||
|
;not a real ACIA - so TDRF is not checked
|
||||||
|
sta $bff0 ;write acia tx reg
|
||||||
|
;the store can be replaced by a call to a kernal routine
|
||||||
|
; jsr $ffd2 ;example: CHROUT for a C64
|
||||||
|
rts
|
||||||
|
|
||||||
|
rmsg_start
|
||||||
|
db 10,13,"Started testing",10,13,0
|
||||||
|
rmsg_stack
|
||||||
|
db 10,13,"regs Y X A PS PCLPCH",10,13,0
|
||||||
|
rmsg_cont
|
||||||
|
db 10,13,"press C to continue",10,13,0
|
||||||
|
rmsg_success
|
||||||
|
db 10,13,"All tests completed, press R to repeat",10,13,0
|
||||||
|
if rep_int = 1
|
||||||
|
rmsg_priority
|
||||||
|
db 10,13,"interrupt sequence (NMI IRQ BRK) ",0
|
||||||
|
endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user