added feedback filter
feedback of bit7 to the emu diag register will cause an unwanted diag stop (since emu version 0.83). Added a filter to compensate.
This commit is contained in:
parent
a06e3b95d6
commit
04de059478
|
@ -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 16-aug-2013
|
; version 15-aug-2014
|
||||||
; 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/
|
||||||
|
@ -49,6 +49,7 @@
|
||||||
; 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
|
; 16-aug-2013 added error report to standard output option
|
||||||
|
; 15-aug-2014 added filter to feedback (bit 7 will cause diag stop in emu)
|
||||||
|
|
||||||
|
|
||||||
; 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
|
||||||
|
@ -67,6 +68,7 @@ I_ddr = 0 ;feedback DDR address, 0 = no DDR
|
||||||
I_drive = 1 ;0 = totem pole, 1 = open collector
|
I_drive = 1 ;0 = totem pole, 1 = open collector
|
||||||
IRQ_bit = 0 ;bit number of feedback to IRQ
|
IRQ_bit = 0 ;bit number of feedback to IRQ
|
||||||
NMI_bit = 1 ;bit number of feedback to NMI, -1 if not available
|
NMI_bit = 1 ;bit number of feedback to NMI, -1 if not available
|
||||||
|
I_filter = $7f ;filtering bit 7 = diag stop
|
||||||
|
|
||||||
;typical IO chip port B - set i_drive = 0 to avoid pullup resistors
|
;typical IO chip port B - set i_drive = 0 to avoid pullup resistors
|
||||||
;I_port = $bfb2 ;feedback port address
|
;I_port = $bfb2 ;feedback port address
|
||||||
|
@ -74,9 +76,10 @@ NMI_bit = 1 ;bit number of feedback to NMI, -1 if not available
|
||||||
;I_drive = 1 ;0 = totem pole, 1 = open collector
|
;I_drive = 1 ;0 = totem pole, 1 = open collector
|
||||||
;IRQ_bit = 0 ;bit number of feedback to IRQ
|
;IRQ_bit = 0 ;bit number of feedback to IRQ
|
||||||
;NMI_bit = 1 ;bit number of feedback to NMI, -1 if not available
|
;NMI_bit = 1 ;bit number of feedback to NMI, -1 if not available
|
||||||
|
;I_filter = $ff ;no bits filtered
|
||||||
|
|
||||||
;decimal mode flag during IRQ, NMI & BRK
|
;decimal mode flag during IRQ, NMI & BRK
|
||||||
D_clear = 1 ;0 = not cleared (NMOS), 1 = cleared (CMOS)
|
D_clear = 0 ;0 = not cleared (NMOS), 1 = cleared (CMOS)
|
||||||
|
|
||||||
;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, 6 consecutive Bytes required
|
;zero_page memory start address, 6 consecutive Bytes required
|
||||||
|
@ -242,7 +245,7 @@ ld_vect lda vec_init,x
|
||||||
if I_drive = 0 ;totem pole (push/pull, 0 -> I_port to force interrupt)
|
if I_drive = 0 ;totem pole (push/pull, 0 -> I_port to force interrupt)
|
||||||
I_set macro ibit ;ibit = interrupt bit
|
I_set macro ibit ;ibit = interrupt bit
|
||||||
lda I_port ;turn on interrupt by bit
|
lda I_port ;turn on interrupt by bit
|
||||||
and #$ff-(1<<\1)
|
and #I_filter-(1<<\1)
|
||||||
plp ;set flags
|
plp ;set flags
|
||||||
pha ;save to verify
|
pha ;save to verify
|
||||||
php
|
php
|
||||||
|
@ -250,12 +253,14 @@ I_set macro ibit ;ibit = interrupt bit
|
||||||
endm
|
endm
|
||||||
I_clr macro ibit ;ibit = interrupt bit
|
I_clr macro ibit ;ibit = interrupt bit
|
||||||
lda I_port ;turn off interrupt by bit
|
lda I_port ;turn off interrupt by bit
|
||||||
|
and #I_filter
|
||||||
ora #(1<<ibit)
|
ora #(1<<ibit)
|
||||||
sta I_port
|
sta I_port
|
||||||
endm
|
endm
|
||||||
I_clr IRQ_bit ;turn off IRQ
|
I_clr IRQ_bit ;turn off IRQ
|
||||||
if I_ddr != 0 ;with DDR
|
if I_ddr != 0 ;with DDR
|
||||||
lda I_ddr ;set DDR for IRQ to enabled
|
lda I_ddr ;set DDR for IRQ to enabled
|
||||||
|
and #I_filter
|
||||||
ora #(1<<IRQ_bit)
|
ora #(1<<IRQ_bit)
|
||||||
sta I_ddr
|
sta I_ddr
|
||||||
endif
|
endif
|
||||||
|
@ -263,6 +268,7 @@ I_clr macro ibit ;ibit = interrupt bit
|
||||||
if I_ddr != 0 ;with DDR
|
if I_ddr != 0 ;with DDR
|
||||||
I_set macro ibit ;ibit = interrupt bit
|
I_set macro ibit ;ibit = interrupt bit
|
||||||
lda I_ddr ;turn on interrupt by bit
|
lda I_ddr ;turn on interrupt by bit
|
||||||
|
and #I_filter
|
||||||
ora #(1<<\1)
|
ora #(1<<\1)
|
||||||
plp ;set flags
|
plp ;set flags
|
||||||
pha ;save to verify
|
pha ;save to verify
|
||||||
|
@ -271,16 +277,17 @@ I_set macro ibit ;ibit = interrupt bit
|
||||||
endm
|
endm
|
||||||
I_clr macro ibit ;ibit = interrupt bit
|
I_clr macro ibit ;ibit = interrupt bit
|
||||||
lda I_ddr ;turn off interrupt by bit
|
lda I_ddr ;turn off interrupt by bit
|
||||||
and #$ff-(1<<ibit)
|
and #I_filter-(1<<ibit)
|
||||||
sta I_ddr
|
sta I_ddr
|
||||||
endm
|
endm
|
||||||
I_clr IRQ_bit ;turn off IRQ
|
I_clr IRQ_bit ;turn off IRQ
|
||||||
lda I_port ;precharge IRQ
|
lda I_port ;precharge IRQ
|
||||||
and #$ff-(1<<IRQ_bit)
|
and #I_filter-(1<<IRQ_bit)
|
||||||
sta I_port
|
sta I_port
|
||||||
else ;no DDR
|
else ;no DDR
|
||||||
I_set macro ibit ;ibit = interrupt bit
|
I_set macro ibit ;ibit = interrupt bit
|
||||||
lda I_port ;turn on interrupt by bit
|
lda I_port ;turn on interrupt by bit
|
||||||
|
and #I_filter
|
||||||
ora #(1<<\1)
|
ora #(1<<\1)
|
||||||
plp ;set flags
|
plp ;set flags
|
||||||
pha ;save to verify
|
pha ;save to verify
|
||||||
|
@ -289,7 +296,7 @@ I_set macro ibit ;ibit = interrupt bit
|
||||||
endm
|
endm
|
||||||
I_clr macro ibit ;ibit = interrupt bit
|
I_clr macro ibit ;ibit = interrupt bit
|
||||||
lda I_port ;turn off interrupt by bit
|
lda I_port ;turn off interrupt by bit
|
||||||
and #$ff-(1<<ibit)
|
and #I_filter-(1<<ibit)
|
||||||
sta I_port
|
sta I_port
|
||||||
endm
|
endm
|
||||||
I_clr IRQ_bit ;turn off IRQ
|
I_clr IRQ_bit ;turn off IRQ
|
||||||
|
@ -300,9 +307,9 @@ I_clr macro ibit ;ibit = interrupt bit
|
||||||
I_set macro ibit ;ibit = interrupt bit
|
I_set macro ibit ;ibit = interrupt bit
|
||||||
lda I_port ;turn on interrupt by bit
|
lda I_port ;turn on interrupt by bit
|
||||||
if ibit > 7 ;set both NMI & IRQ
|
if ibit > 7 ;set both NMI & IRQ
|
||||||
and #$ff-(1<<IRQ_bit|1<<NMI_bit)
|
and #I_filter-(1<<IRQ_bit|1<<NMI_bit)
|
||||||
else
|
else
|
||||||
and #$ff-(1<<\1)
|
and #I_filter-(1<<\1)
|
||||||
endif
|
endif
|
||||||
plp ;set flags
|
plp ;set flags
|
||||||
pha ;save to verify
|
pha ;save to verify
|
||||||
|
@ -311,6 +318,7 @@ I_set macro ibit ;ibit = interrupt bit
|
||||||
endm
|
endm
|
||||||
I_clr macro ibit ;ibit = interrupt bit
|
I_clr macro ibit ;ibit = interrupt bit
|
||||||
lda I_port ;turn off interrupt by bit
|
lda I_port ;turn off interrupt by bit
|
||||||
|
and #I_filter
|
||||||
ora #(1<<ibit)
|
ora #(1<<ibit)
|
||||||
sta I_port
|
sta I_port
|
||||||
endm
|
endm
|
||||||
|
@ -318,6 +326,7 @@ I_clr macro ibit ;ibit = interrupt bit
|
||||||
I_clr NMI_bit
|
I_clr NMI_bit
|
||||||
if I_ddr != 0 ;with DDR
|
if I_ddr != 0 ;with DDR
|
||||||
lda I_ddr ;set DDR for IRQ & NMI to enabled
|
lda I_ddr ;set DDR for IRQ & NMI to enabled
|
||||||
|
and #I_filter
|
||||||
ora #(1<<IRQ_bit|1<<NMI_bit)
|
ora #(1<<IRQ_bit|1<<NMI_bit)
|
||||||
sta I_ddr
|
sta I_ddr
|
||||||
endif
|
endif
|
||||||
|
@ -325,6 +334,7 @@ I_clr macro ibit ;ibit = interrupt bit
|
||||||
if I_ddr != 0 ;with DDR
|
if I_ddr != 0 ;with DDR
|
||||||
I_set macro ibit ;ibit = interrupt bit
|
I_set macro ibit ;ibit = interrupt bit
|
||||||
lda I_ddr ;turn on interrupt by bit
|
lda I_ddr ;turn on interrupt by bit
|
||||||
|
and #I_filter
|
||||||
if ibit > 7 ;set both NMI & IRQ
|
if ibit > 7 ;set both NMI & IRQ
|
||||||
ora #(1<<IRQ_bit|1<<NMI_bit)
|
ora #(1<<IRQ_bit|1<<NMI_bit)
|
||||||
else
|
else
|
||||||
|
@ -337,17 +347,18 @@ I_set macro ibit ;ibit = interrupt bit
|
||||||
endm
|
endm
|
||||||
I_clr macro ibit ;ibit = interrupt bit
|
I_clr macro ibit ;ibit = interrupt bit
|
||||||
lda I_ddr ;turn off interrupt by bit
|
lda I_ddr ;turn off interrupt by bit
|
||||||
and #$ff-(1<<ibit)
|
and #I_filter-(1<<ibit)
|
||||||
sta I_ddr
|
sta I_ddr
|
||||||
endm
|
endm
|
||||||
I_clr IRQ_bit ;turn off IRQ & NMI
|
I_clr IRQ_bit ;turn off IRQ & NMI
|
||||||
I_clr NMI_bit
|
I_clr NMI_bit
|
||||||
lda I_port ;precharge IRQ & NMI
|
lda I_port ;precharge IRQ & NMI
|
||||||
and #$ff-(1<<IRQ_bit|1<<NMI_bit)
|
and #I_filter-(1<<IRQ_bit|1<<NMI_bit)
|
||||||
sta I_port
|
sta I_port
|
||||||
else ;no DDR
|
else ;no DDR
|
||||||
I_set macro ibit ;ibit = interrupt bit
|
I_set macro ibit ;ibit = interrupt bit
|
||||||
lda I_port ;turn on interrupt by bit
|
lda I_port ;turn on interrupt by bit
|
||||||
|
and #I_filter
|
||||||
if ibit > 7 ;set both NMI & IRQ
|
if ibit > 7 ;set both NMI & IRQ
|
||||||
ora #(1<<IRQ_bit|1<<NMI_bit)
|
ora #(1<<IRQ_bit|1<<NMI_bit)
|
||||||
else
|
else
|
||||||
|
@ -360,7 +371,7 @@ I_set macro ibit ;ibit = interrupt bit
|
||||||
endm
|
endm
|
||||||
I_clr macro ibit ;ibit = interrupt bit
|
I_clr macro ibit ;ibit = interrupt bit
|
||||||
lda I_port ;turn off interrupt by bit
|
lda I_port ;turn off interrupt by bit
|
||||||
and #$ff-(1<<ibit)
|
and #I_filter-(1<<ibit)
|
||||||
sta I_port
|
sta I_port
|
||||||
endm
|
endm
|
||||||
I_clr IRQ_bit ;turn off IRQ & NMI
|
I_clr IRQ_bit ;turn off IRQ & NMI
|
||||||
|
|
Loading…
Reference in New Issue