mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-08-21 09:49:01 +00:00
Add external interrupt tests
This commit is contained in:
parent
94169b3c7d
commit
6641f75ffb
11 changed files with 509 additions and 4 deletions
|
@ -26,6 +26,8 @@ public:
|
|||
virtual void Reset() = 0;
|
||||
virtual u32 CheckMailTo() = 0;
|
||||
virtual void SendMailTo(u32 mail) = 0;
|
||||
virtual void SetInterrupt() = 0;
|
||||
virtual bool CheckInterrupt() = 0;
|
||||
|
||||
// Yeah, yeah, having a method here makes this not a pure interface - but
|
||||
// the implementation does nothing but calling the virtual methods above.
|
||||
|
|
|
@ -25,6 +25,9 @@
|
|||
#include <ogc/consol.h>
|
||||
#include <unistd.h>
|
||||
|
||||
// From libogc's timesupp.c (not in the header :|)
|
||||
extern "C" u32 gettick(void);
|
||||
|
||||
#ifdef _MSC_VER
|
||||
// Just for easy looking :)
|
||||
#define HW_RVL // HW_DOL
|
||||
|
@ -420,6 +423,35 @@ void handle_dsp_mail(void)
|
|||
DumpDSP_ROMs(dspbufP, &dspbufP[0x1000]);
|
||||
}
|
||||
|
||||
// Request for an interrupt
|
||||
else if (mail == 0x88881111)
|
||||
{
|
||||
if (real_dsp.CheckInterrupt())
|
||||
{
|
||||
CON_PrintRow(4, 25, "Already has interrupt?");
|
||||
}
|
||||
else
|
||||
{
|
||||
const u32 now = gettick();
|
||||
real_dsp.SetInterrupt();
|
||||
u32 end = gettick();
|
||||
u32 tries = 0;
|
||||
while (real_dsp.CheckInterrupt() && end - now < 1000000)
|
||||
{
|
||||
end = gettick();
|
||||
tries++;
|
||||
}
|
||||
if (end - now < 1000000)
|
||||
{
|
||||
CON_PrintRow(4, 25, "Interrupt after %d ticks / %d tries", end - now, tries);
|
||||
}
|
||||
else
|
||||
{
|
||||
CON_PrintRow(4, 25, "No interrupt after %d ticks / %d tries", end - now, tries);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SDK status mails
|
||||
/*
|
||||
// GBA ucode
|
||||
|
|
|
@ -51,3 +51,16 @@ void RealDSP::SendMailTo(u32 mail)
|
|||
{
|
||||
DSP_SendMailTo(mail);
|
||||
}
|
||||
|
||||
void RealDSP::SetInterrupt()
|
||||
{
|
||||
u32 level;
|
||||
_CPU_ISR_Disable(level);
|
||||
_dspReg[5] = (_dspReg[5] & ~(DSPCR_AIINT | DSPCR_ARINT | DSPCR_DSPINT)) | DSPCR_PIINT;
|
||||
_CPU_ISR_Restore(level);
|
||||
}
|
||||
|
||||
bool RealDSP::CheckInterrupt()
|
||||
{
|
||||
return (_dspReg[5] & DSPCR_PIINT) != 0;
|
||||
}
|
||||
|
|
|
@ -8,8 +8,10 @@
|
|||
class RealDSP : public IDSP
|
||||
{
|
||||
public:
|
||||
virtual void Init();
|
||||
virtual void Reset();
|
||||
virtual u32 CheckMailTo();
|
||||
virtual void SendMailTo(u32 mail);
|
||||
void Init() override;
|
||||
void Reset() override;
|
||||
u32 CheckMailTo() override;
|
||||
void SendMailTo(u32 mail) override;
|
||||
void SetInterrupt() override;
|
||||
bool CheckInterrupt() override;
|
||||
};
|
||||
|
|
57
Source/DSPSpy/tests/external_interrupt.ds
Normal file
57
Source/DSPSpy/tests/external_interrupt.ds
Normal file
|
@ -0,0 +1,57 @@
|
|||
; This test needs to manually specify IRQs
|
||||
jmp irq0
|
||||
jmp irq1
|
||||
jmp irq2
|
||||
jmp irq3
|
||||
jmp irq4
|
||||
jmp irq5
|
||||
jmp irq6
|
||||
jmp external_irq
|
||||
|
||||
incdir "tests"
|
||||
include "dsp_base_noirq.inc"
|
||||
|
||||
test_main:
|
||||
CLR $ACC0
|
||||
SBCLR #2
|
||||
SBCLR #3
|
||||
SBCLR #4
|
||||
SBCLR #5
|
||||
SBCLR #6
|
||||
|
||||
LRI $AR0, #0
|
||||
|
||||
LRIS $AX0.H, #1
|
||||
CALL send_back
|
||||
|
||||
SI @DMBH, #0x8888
|
||||
SI @DMBL, #0x1111
|
||||
|
||||
wait_cpu_read:
|
||||
LRS $AC1.M, @DMBH
|
||||
ANDCF $AC1.M, #0x8000
|
||||
JLZ wait_cpu_read
|
||||
|
||||
CLR $ACC1
|
||||
second_loop:
|
||||
INC $ACC1
|
||||
CMPIS $AC1.M, #1
|
||||
JNZ second_loop
|
||||
|
||||
SBSET #6
|
||||
SBSET #5
|
||||
LRI $AR0, #2
|
||||
LRI $AR0, #3
|
||||
LRI $AR0, #4
|
||||
LRI $AR0, #5
|
||||
LRI $AR0, #6
|
||||
|
||||
LRIS $AX0.H, #2
|
||||
CALL send_back
|
||||
|
||||
JMP end_of_test
|
||||
|
||||
external_irq:
|
||||
LRIS $AX0.H, #3
|
||||
CALL send_back
|
||||
RTI
|
55
Source/DSPSpy/tests/external_interrupt_delay.ds
Normal file
55
Source/DSPSpy/tests/external_interrupt_delay.ds
Normal file
|
@ -0,0 +1,55 @@
|
|||
; This test needs to manually specify IRQs
|
||||
jmp irq0
|
||||
jmp irq1
|
||||
jmp irq2
|
||||
jmp irq3
|
||||
jmp irq4
|
||||
jmp irq5
|
||||
jmp irq6
|
||||
jmp external_irq
|
||||
|
||||
incdir "tests"
|
||||
include "dsp_base_noirq.inc"
|
||||
|
||||
test_main:
|
||||
CLR $ACC0
|
||||
SBCLR #5
|
||||
SBCLR #6
|
||||
|
||||
LRI $AR0, #0
|
||||
|
||||
LRIS $AX0.H, #1
|
||||
CALL send_back
|
||||
|
||||
SI @DMBH, #0x8888
|
||||
SI @DMBL, #0x1111
|
||||
|
||||
wait_cpu_read:
|
||||
LRS $AC1.M, @DMBH
|
||||
ANDCF $AC1.M, #0x8000
|
||||
JLZ wait_cpu_read
|
||||
|
||||
; Wait a while (0x10000 increments)
|
||||
CLR $ACC1
|
||||
second_loop:
|
||||
INC $ACC1
|
||||
CMPIS $AC1.M, #1
|
||||
JNZ second_loop
|
||||
|
||||
SBSET #6
|
||||
SBSET #5
|
||||
LRI $AR0, #2
|
||||
LRI $AR0, #3
|
||||
LRI $AR0, #4
|
||||
LRI $AR0, #5
|
||||
LRI $AR0, #6
|
||||
|
||||
LRIS $AX0.H, #2
|
||||
CALL send_back
|
||||
|
||||
JMP end_of_test
|
||||
|
||||
external_irq:
|
||||
LRIS $AX0.H, #3
|
||||
CALL send_back
|
||||
RTI
|
77
Source/DSPSpy/tests/external_interrupt_nested.ds
Normal file
77
Source/DSPSpy/tests/external_interrupt_nested.ds
Normal file
|
@ -0,0 +1,77 @@
|
|||
; This test needs to manually specify IRQs
|
||||
jmp irq0
|
||||
jmp irq1
|
||||
jmp irq2
|
||||
jmp irq3
|
||||
jmp irq4
|
||||
jmp irq5
|
||||
jmp irq6
|
||||
jmp external_irq
|
||||
|
||||
incdir "tests"
|
||||
include "dsp_base_noirq.inc"
|
||||
|
||||
test_main:
|
||||
CLR $ACC0
|
||||
SBCLR #2
|
||||
SBCLR #3
|
||||
SBCLR #4
|
||||
SBCLR #5
|
||||
SBCLR #6
|
||||
|
||||
LRI $AR0, #0
|
||||
|
||||
LRIS $AX0.H, #1
|
||||
CALL send_back
|
||||
|
||||
SI @DMBH, #0x8888
|
||||
SI @DMBL, #0x1111
|
||||
|
||||
wait_cpu_read:
|
||||
LRS $AC1.M, @DMBH
|
||||
ANDCF $AC1.M, #0x8000
|
||||
JLZ wait_cpu_read
|
||||
|
||||
CLR $ACC1
|
||||
second_loop:
|
||||
INC $ACC1
|
||||
CMPIS $AC1.M, #1
|
||||
JNZ second_loop
|
||||
|
||||
SBSET #6
|
||||
SBSET #5
|
||||
LRI $AR0, #2
|
||||
LRI $AR0, #3
|
||||
LRI $AR0, #4
|
||||
LRI $AR0, #5
|
||||
LRI $AR0, #6
|
||||
|
||||
LRIS $AX0.H, #2
|
||||
CALL send_back
|
||||
|
||||
JMP end_of_test
|
||||
|
||||
external_irq:
|
||||
INCM $AC0.M
|
||||
LRIS $AX0.H, #3
|
||||
CALL send_back
|
||||
|
||||
; Only trigger a nested interrupt the first time through
|
||||
CMPIS $AC0.M, #1
|
||||
RTINZ
|
||||
|
||||
SI @DMBH, #0x8888
|
||||
SI @DMBL, #0x1111
|
||||
|
||||
wait_cpu_read_irq:
|
||||
LRS $AC1.M, @DMBH
|
||||
ANDCF $AC1.M, #0x8000
|
||||
JLZ wait_cpu_read_irq
|
||||
|
||||
CLR $ACC1
|
||||
second_loop_irq:
|
||||
INC $ACC1
|
||||
CMPIS $AC1.M, #1
|
||||
JNZ second_loop_irq
|
||||
|
||||
RTI
|
57
Source/DSPSpy/tests/external_interrupt_no_delay.ds
Normal file
57
Source/DSPSpy/tests/external_interrupt_no_delay.ds
Normal file
|
@ -0,0 +1,57 @@
|
|||
; This test needs to manually specify IRQs
|
||||
jmp irq0
|
||||
jmp irq1
|
||||
jmp irq2
|
||||
jmp irq3
|
||||
jmp irq4
|
||||
jmp irq5
|
||||
jmp irq6
|
||||
jmp external_irq
|
||||
|
||||
incdir "tests"
|
||||
include "dsp_base_noirq.inc"
|
||||
|
||||
test_main:
|
||||
CLR $ACC0
|
||||
SBCLR #5
|
||||
SBCLR #6
|
||||
|
||||
LRI $AR0, #0
|
||||
|
||||
LRIS $AX0.H, #1
|
||||
CALL send_back
|
||||
|
||||
SI @DMBH, #0x8888
|
||||
SI @DMBL, #0x1111
|
||||
|
||||
wait_cpu_read:
|
||||
LRS $AC1.M, @DMBH
|
||||
ANDCF $AC1.M, #0x8000
|
||||
JLZ wait_cpu_read
|
||||
|
||||
; Wait a while (0x10000 increments)
|
||||
CLR $ACC1
|
||||
|
||||
SBSET #6
|
||||
SBSET #5
|
||||
|
||||
second_loop:
|
||||
INC $ACC1
|
||||
CMPIS $AC1.M, #1
|
||||
JNZ second_loop
|
||||
|
||||
LRI $AR0, #2
|
||||
LRI $AR0, #3
|
||||
LRI $AR0, #4
|
||||
LRI $AR0, #5
|
||||
LRI $AR0, #6
|
||||
|
||||
LRIS $AX0.H, #2
|
||||
CALL send_back
|
||||
|
||||
JMP end_of_test
|
||||
|
||||
external_irq:
|
||||
LRIS $AX0.H, #3
|
||||
CALL send_back
|
||||
RTI
|
|
@ -0,0 +1,85 @@
|
|||
; This test needs to manually specify IRQs
|
||||
jmp irq0
|
||||
jmp irq1
|
||||
jmp irq2
|
||||
jmp irq3
|
||||
jmp irq4
|
||||
jmp accov_irq
|
||||
jmp irq6
|
||||
jmp external_irq
|
||||
|
||||
incdir "tests"
|
||||
include "dsp_base_noirq.inc"
|
||||
|
||||
test_main:
|
||||
; Use the accelerator to generate an IRQ by setting the start and end address to 0
|
||||
; This will result in an interrupt on every read
|
||||
SI @0xffda, #0 ; pred_scale
|
||||
SI @0xffdb, #0 ; yn1
|
||||
SI @0xffdc, #0 ; yn2
|
||||
SI @0xffd1, #0 ; SampleFormat
|
||||
SI @ACSAH, #0
|
||||
SI @ACCAH, #0
|
||||
SI @ACSAL, #0
|
||||
SI @ACCAL, #0
|
||||
SI @ACEAH, #0
|
||||
SI @ACEAL, #0
|
||||
|
||||
CLR $ACC0
|
||||
SBCLR #2
|
||||
SBSET #3
|
||||
SBCLR #4
|
||||
SBCLR #5
|
||||
SBCLR #6
|
||||
|
||||
LRI $AR0, #0
|
||||
|
||||
LRIS $AX0.H, #1
|
||||
CALL send_back
|
||||
|
||||
SI @DMBH, #0x8888
|
||||
SI @DMBL, #0x1111
|
||||
|
||||
wait_cpu_read:
|
||||
LRS $AC1.M, @DMBH
|
||||
ANDCF $AC1.M, #0x8000
|
||||
JLZ wait_cpu_read
|
||||
|
||||
CLR $ACC1
|
||||
second_loop:
|
||||
INC $ACC1
|
||||
CMPIS $AC1.M, #1
|
||||
JNZ second_loop
|
||||
|
||||
SBSET #6
|
||||
SBSET #5
|
||||
; Trigger an interrupt at the same time as external interrupts become enabled
|
||||
LRS $AX0.L, @ARAM
|
||||
LRI $AR0, #3
|
||||
LRI $AR0, #4
|
||||
LRI $AR0, #5
|
||||
LRI $AR0, #6
|
||||
|
||||
LRIS $AX0.H, #2
|
||||
CALL send_back
|
||||
|
||||
JMP end_of_test
|
||||
|
||||
accov_irq:
|
||||
INCM $AC0.M
|
||||
|
||||
; Restore registers, otherwise no new interrupt will be generated
|
||||
SI @0xffda, #0 ; pred_scale
|
||||
SI @0xffdb, #0 ; yn1
|
||||
SI @0xffdc, #0 ; yn2
|
||||
|
||||
LRIS $AX0.H, #3
|
||||
CALL send_back
|
||||
|
||||
RTI
|
||||
|
||||
external_irq:
|
||||
INCM $AC0.M
|
||||
LRIS $AX0.H, #4
|
||||
CALL send_back
|
||||
RTI
|
61
Source/DSPSpy/tests/external_interrupt_toggle.ds
Normal file
61
Source/DSPSpy/tests/external_interrupt_toggle.ds
Normal file
|
@ -0,0 +1,61 @@
|
|||
; This test needs to manually specify IRQs
|
||||
jmp irq0
|
||||
jmp irq1
|
||||
jmp irq2
|
||||
jmp irq3
|
||||
jmp irq4
|
||||
jmp irq5
|
||||
jmp irq6
|
||||
jmp external_irq
|
||||
|
||||
incdir "tests"
|
||||
include "dsp_base_noirq.inc"
|
||||
|
||||
test_main:
|
||||
CLR $ACC0
|
||||
SBCLR #5
|
||||
SBCLR #6
|
||||
|
||||
LRI $AR0, #0
|
||||
|
||||
LRIS $AX0.H, #1
|
||||
CALL send_back
|
||||
|
||||
SI @DMBH, #0x8888
|
||||
SI @DMBL, #0x1111
|
||||
|
||||
wait_cpu_read:
|
||||
LRS $AC1.M, @DMBH
|
||||
ANDCF $AC1.M, #0x8000
|
||||
JLZ wait_cpu_read
|
||||
|
||||
; Wait a while (0x10000 increments)
|
||||
CLR $ACC1
|
||||
second_loop:
|
||||
INC $ACC1
|
||||
CMPIS $AC1.M, #1
|
||||
JNZ second_loop
|
||||
|
||||
SBSET #6
|
||||
SBSET #5
|
||||
SBCLR #5
|
||||
SBSET #5
|
||||
SBCLR #5
|
||||
SBSET #5
|
||||
SBCLR #5
|
||||
SBSET #5
|
||||
SBCLR #5
|
||||
SBSET #5
|
||||
LRI $AR0, #2
|
||||
LRI $AR0, #3
|
||||
LRI $AR0, #4
|
||||
|
||||
LRIS $AX0.H, #2
|
||||
CALL send_back
|
||||
|
||||
JMP end_of_test
|
||||
|
||||
external_irq:
|
||||
LRIS $AX0.H, #3
|
||||
CALL send_back
|
||||
RTI
|
64
Source/DSPSpy/tests/external_interrupt_toggle_2.ds
Normal file
64
Source/DSPSpy/tests/external_interrupt_toggle_2.ds
Normal file
|
@ -0,0 +1,64 @@
|
|||
; This test needs to manually specify IRQs
|
||||
jmp irq0
|
||||
jmp irq1
|
||||
jmp irq2
|
||||
jmp irq3
|
||||
jmp irq4
|
||||
jmp irq5
|
||||
jmp irq6
|
||||
jmp external_irq
|
||||
|
||||
incdir "tests"
|
||||
include "dsp_base_noirq.inc"
|
||||
|
||||
test_main:
|
||||
CLR $ACC0
|
||||
SBCLR #5
|
||||
SBCLR #6
|
||||
|
||||
LRI $AR0, #0
|
||||
|
||||
LRIS $AX0.H, #1
|
||||
CALL send_back
|
||||
|
||||
SI @DMBH, #0x8888
|
||||
SI @DMBL, #0x1111
|
||||
|
||||
wait_cpu_read:
|
||||
LRS $AC1.M, @DMBH
|
||||
ANDCF $AC1.M, #0x8000
|
||||
JLZ wait_cpu_read
|
||||
|
||||
; Wait a while (0x10000 increments)
|
||||
CLR $ACC1
|
||||
second_loop:
|
||||
INC $ACC1
|
||||
CMPIS $AC1.M, #1
|
||||
JNZ second_loop
|
||||
|
||||
SBSET #6
|
||||
SBSET #5
|
||||
SBCLR #5
|
||||
LRI $AR0, #2
|
||||
SBSET #5
|
||||
SBCLR #5
|
||||
LRI $AR0, #3
|
||||
SBSET #5
|
||||
SBCLR #5
|
||||
LRI $AR0, #4
|
||||
SBSET #5
|
||||
SBCLR #5
|
||||
LRI $AR0, #5
|
||||
SBSET #5
|
||||
LRI $AR0, #6
|
||||
LRI $AR0, #7
|
||||
|
||||
LRIS $AX0.H, #2
|
||||
CALL send_back
|
||||
|
||||
JMP end_of_test
|
||||
|
||||
external_irq:
|
||||
LRIS $AX0.H, #3
|
||||
CALL send_back
|
||||
RTI
|
Loading…
Add table
Add a link
Reference in a new issue