DSPTool: make existing tests pass
Disassemble code without the additional text for humans, like the current PC and opcode hex values, so that it can be reassembled. I'm not updating any commented-out tests here.
This commit is contained in:
parent
b9b3b1dc19
commit
1580b6e627
|
@ -6,6 +6,7 @@
|
||||||
#include "Common/FileUtil.h"
|
#include "Common/FileUtil.h"
|
||||||
#include "Common/StringUtil.h"
|
#include "Common/StringUtil.h"
|
||||||
#include "Core/DSP/DSPCodeUtil.h"
|
#include "Core/DSP/DSPCodeUtil.h"
|
||||||
|
#include "Core/DSP/DSPDisassembler.h"
|
||||||
#include "Core/DSP/DSPHost.h"
|
#include "Core/DSP/DSPHost.h"
|
||||||
#include "Core/DSP/DSPTables.h"
|
#include "Core/DSP/DSPTables.h"
|
||||||
|
|
||||||
|
@ -38,13 +39,27 @@ void DSP::Host::UpdateDebugger()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool RoundTrippableDissassemble(const std::vector<u16>& code, std::string& text)
|
||||||
|
{
|
||||||
|
DSP::AssemblerSettings settings;
|
||||||
|
settings.ext_separator = '\'';
|
||||||
|
settings.decode_names = true;
|
||||||
|
settings.decode_registers = true;
|
||||||
|
// These two prevent roundtripping.
|
||||||
|
settings.show_hex = false;
|
||||||
|
settings.show_pc = false;
|
||||||
|
DSP::DSPDisassembler disasm(settings);
|
||||||
|
|
||||||
|
return disasm.Disassemble(0x0000, code, 0x0000, text);
|
||||||
|
}
|
||||||
|
|
||||||
// This test goes from text ASM to binary to text ASM and once again back to binary.
|
// This test goes from text ASM to binary to text ASM and once again back to binary.
|
||||||
// Then the two binaries are compared.
|
// Then the two binaries are compared.
|
||||||
static bool RoundTrip(const std::vector<u16>& code1)
|
static bool RoundTrip(const std::vector<u16>& code1)
|
||||||
{
|
{
|
||||||
std::vector<u16> code2;
|
std::vector<u16> code2;
|
||||||
std::string text;
|
std::string text;
|
||||||
if (!DSP::Disassemble(code1, false, text))
|
if (!RoundTrippableDissassemble(code1, text))
|
||||||
{
|
{
|
||||||
printf("RoundTrip: Disassembly failed.\n");
|
printf("RoundTrip: Disassembly failed.\n");
|
||||||
return false;
|
return false;
|
||||||
|
@ -74,7 +89,8 @@ static bool SuperTrip(const char* asm_code)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
printf("First assembly: %i words\n", (int)code1.size());
|
printf("First assembly: %i words\n", (int)code1.size());
|
||||||
if (!DSP::Disassemble(code1, false, text))
|
|
||||||
|
if (!RoundTrippableDissassemble(code1, text))
|
||||||
{
|
{
|
||||||
printf("SuperTrip: Disassembly failed\n");
|
printf("SuperTrip: Disassembly failed\n");
|
||||||
return false;
|
return false;
|
||||||
|
@ -84,6 +100,7 @@ static bool SuperTrip(const char* asm_code)
|
||||||
printf("Disass:\n");
|
printf("Disass:\n");
|
||||||
printf("%s", text.c_str());
|
printf("%s", text.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!DSP::Assemble(text, code2))
|
if (!DSP::Assemble(text, code2))
|
||||||
{
|
{
|
||||||
printf("SuperTrip: Second assembly failed\n");
|
printf("SuperTrip: Second assembly failed\n");
|
||||||
|
|
|
@ -76,7 +76,7 @@ MEM_LO: equ 0x0f7F
|
||||||
jmp irq5
|
jmp irq5
|
||||||
jmp irq6
|
jmp irq6
|
||||||
jmp irq7
|
jmp irq7
|
||||||
|
|
||||||
; Main code at 0x10
|
; Main code at 0x10
|
||||||
CW 0x1302
|
CW 0x1302
|
||||||
CW 0x1303
|
CW 0x1303
|
||||||
|
@ -86,11 +86,11 @@ MEM_LO: equ 0x0f7F
|
||||||
|
|
||||||
s40
|
s40
|
||||||
lri $r12, #0x00ff
|
lri $r12, #0x00ff
|
||||||
|
|
||||||
main:
|
main:
|
||||||
|
|
||||||
cw 0x8900
|
cw 0x8900
|
||||||
cw 0x8100
|
cw 0x8100
|
||||||
|
|
||||||
; get address of memory dump and copy it
|
; get address of memory dump and copy it
|
||||||
|
|
||||||
|
@ -177,8 +177,8 @@ main:
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cw 0x8600
|
cw 0x8600
|
||||||
|
|
||||||
call send_back
|
call send_back
|
||||||
|
@ -188,223 +188,223 @@ main:
|
||||||
|
|
||||||
; call dump_memory
|
; call dump_memory
|
||||||
; call send_back
|
; call send_back
|
||||||
|
|
||||||
|
|
||||||
; 0x041e
|
|
||||||
;
|
|
||||||
|
|
||||||
cw 0x00de
|
|
||||||
cw 0x03f1
|
; 0x041e
|
||||||
|
;
|
||||||
|
|
||||||
|
cw 0x00de
|
||||||
|
cw 0x03f1
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x0200
|
cw 0x0200
|
||||||
cw 0x0a60
|
cw 0x0a60
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x1c7e
|
cw 0x1c7e
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x8100
|
cw 0x8100
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x8900
|
cw 0x8900
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x009f
|
cw 0x009f
|
||||||
cw 0x00a0
|
cw 0x00a0
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x00de
|
cw 0x00de
|
||||||
cw 0x03f1
|
cw 0x03f1
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x5d00
|
cw 0x5d00
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x0e50
|
cw 0x0e50
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x0750
|
cw 0x0750
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x0270
|
cw 0x0270
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x5d00
|
cw 0x5d00
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x00da
|
cw 0x00da
|
||||||
cw 0x03f2
|
cw 0x03f2
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x8600
|
cw 0x8600
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
JNS g_0c4d
|
JGE g_0c4d
|
||||||
; cw 0x0290
|
; cw 0x0290
|
||||||
; cw 0x0c4d
|
; cw 0x0c4d
|
||||||
; call send_back JX0
|
; call send_back JX0
|
||||||
|
|
||||||
cw 0x00de
|
cw 0x00de
|
||||||
cw 0x03f3
|
cw 0x03f3
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x5c00
|
cw 0x5c00
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
JLE g_0c38
|
JLE g_0c38
|
||||||
; cw 0x0293
|
; cw 0x0293
|
||||||
; cw 0x0c38 JX3
|
; cw 0x0c38 JX3
|
||||||
; call send_back
|
; call send_back
|
||||||
|
|
||||||
JMP g_0c52
|
JMP g_0c52
|
||||||
|
|
||||||
; cw 0x029f
|
; cw 0x029f
|
||||||
; cw 0x0c52
|
; cw 0x0c52
|
||||||
; call send_back
|
; call send_back
|
||||||
|
|
||||||
g_0c38:
|
g_0c38:
|
||||||
cw 0x00db
|
cw 0x00db
|
||||||
cw 0x03f7
|
cw 0x03f7
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x009e
|
cw 0x009e
|
||||||
cw 0x8000
|
cw 0x8000
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x4600
|
cw 0x4600
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
JMP g_0c44
|
JMP g_0c44
|
||||||
; cw 0x029f
|
; cw 0x029f
|
||||||
; cw 0x0c44
|
; cw 0x0c44
|
||||||
; call send_back
|
; call send_back
|
||||||
|
|
||||||
g_0c3f:
|
g_0c3f:
|
||||||
cw 0x00db
|
cw 0x00db
|
||||||
cw 0x03f7
|
cw 0x03f7
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x009e
|
cw 0x009e
|
||||||
cw 0x8000
|
cw 0x8000
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x5600
|
cw 0x5600
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
g_0c44:
|
g_0c44:
|
||||||
cw 0x00fe
|
cw 0x00fe
|
||||||
cw 0x03f5
|
cw 0x03f5
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x1fda
|
cw 0x1fda
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x7c00
|
cw 0x7c00
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x1f5e
|
cw 0x1f5e
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x00fe
|
cw 0x00fe
|
||||||
cw 0x03f2
|
cw 0x03f2
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
JMP g_0c52
|
JMP g_0c52
|
||||||
; cw 0x029f
|
; cw 0x029f
|
||||||
; cw 0x0c52
|
; cw 0x0c52
|
||||||
; call send_back
|
; call send_back
|
||||||
|
|
||||||
g_0c4d:
|
g_0c4d:
|
||||||
|
|
||||||
cw 0x00de
|
cw 0x00de
|
||||||
cw 0x03f4
|
cw 0x03f4
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x5d00
|
cw 0x5d00
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
JLE g_0c3f
|
JLE g_0c3f
|
||||||
; cw 0x0293
|
; cw 0x0293
|
||||||
; cw 0x0c3f
|
; cw 0x0c3f
|
||||||
; call send_back
|
; call send_back
|
||||||
|
|
||||||
g_0c52:
|
g_0c52:
|
||||||
cw 0x8900
|
cw 0x8900
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x00dd
|
cw 0x00dd
|
||||||
cw 0x03f5
|
cw 0x03f5
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x1501
|
cw 0x1501
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x8100
|
cw 0x8100
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x00dc
|
cw 0x00dc
|
||||||
cw 0x03f6
|
cw 0x03f6
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x008b
|
cw 0x008b
|
||||||
cw 0x009f
|
cw 0x009f
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x0080
|
cw 0x0080
|
||||||
cw 0x0a00
|
cw 0x0a00
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x0900
|
cw 0x0900
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
BLOOPI #0x50, g_0c65
|
BLOOPI #0x50, g_0c65
|
||||||
; cw 0x1150
|
; cw 0x1150
|
||||||
; cw 0x0c65
|
; cw 0x0c65
|
||||||
; call send_back
|
; call send_back
|
||||||
|
|
||||||
|
|
||||||
cw 0x1878
|
cw 0x1878
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x4c00
|
cw 0x4c00
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x1cfe
|
cw 0x1cfe
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x001f
|
cw 0x001f
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x1fd9
|
cw 0x1fd9
|
||||||
call send_back
|
call send_back
|
||||||
g_0c65:
|
g_0c65:
|
||||||
cw 0x1b18
|
cw 0x1b18
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x009f
|
cw 0x009f
|
||||||
cw 0x0a60
|
cw 0x0a60
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x1fc3
|
cw 0x1fc3
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x5c00
|
cw 0x5c00
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x00fe
|
cw 0x00fe
|
||||||
cw 0x03f1
|
cw 0x03f1
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x00fc
|
cw 0x00fc
|
||||||
cw 0x03f6
|
cw 0x03f6
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0x008b
|
cw 0x008b
|
||||||
cw 0xffff
|
cw 0xffff
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ende:
|
ende:
|
||||||
|
|
||||||
|
@ -415,9 +415,9 @@ ende:
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dead_loop:
|
dead_loop:
|
||||||
jmp dead_loop
|
jmp dead_loop
|
||||||
|
|
||||||
|
@ -445,7 +445,7 @@ wait_for_cpu_mbox:
|
||||||
andcf $acl1, #0x8000
|
andcf $acl1, #0x8000
|
||||||
jlnz wait_for_cpu_mbox
|
jlnz wait_for_cpu_mbox
|
||||||
ret
|
ret
|
||||||
|
|
||||||
irq0:
|
irq0:
|
||||||
lri $acl0, #0x0000
|
lri $acl0, #0x0000
|
||||||
jmp irq
|
jmp irq
|
||||||
|
@ -455,7 +455,7 @@ irq1:
|
||||||
irq2:
|
irq2:
|
||||||
lri $acl0, #0x0002
|
lri $acl0, #0x0002
|
||||||
jmp irq
|
jmp irq
|
||||||
|
|
||||||
irq3:
|
irq3:
|
||||||
lri $acl0, #0x0003
|
lri $acl0, #0x0003
|
||||||
jmp irq
|
jmp irq
|
||||||
|
@ -477,7 +477,7 @@ irq5:
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
rti
|
rti
|
||||||
|
|
||||||
lri $acl0, #0x0005
|
lri $acl0, #0x0005
|
||||||
jmp irq
|
jmp irq
|
||||||
irq6:
|
irq6:
|
||||||
|
@ -486,20 +486,20 @@ irq6:
|
||||||
irq7:
|
irq7:
|
||||||
lri $acl0, #0x0007
|
lri $acl0, #0x0007
|
||||||
jmp irq
|
jmp irq
|
||||||
|
|
||||||
irq:
|
irq:
|
||||||
lrs $ACL1, @DMBH
|
lrs $ACL1, @DMBH
|
||||||
andcf $acl1, #0x8000
|
andcf $acl1, #0x8000
|
||||||
jlz irq
|
jlz irq
|
||||||
si @DMBH, #0x8BAD
|
si @DMBH, #0x8BAD
|
||||||
sr @DMBL, $r0b
|
sr @DMBL, $r0b
|
||||||
;sr @DMBL, $acl0
|
;sr @DMBL, $acl0
|
||||||
si @DIRQ, #0x0001
|
si @DIRQ, #0x0001
|
||||||
halt
|
halt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
send_back:
|
send_back:
|
||||||
|
|
||||||
; store registers to reg table
|
; store registers to reg table
|
||||||
|
@ -536,7 +536,7 @@ send_back:
|
||||||
srri @$r00, $r1d
|
srri @$r00, $r1d
|
||||||
srri @$r00, $r1e
|
srri @$r00, $r1e
|
||||||
srri @$r00, $r1f
|
srri @$r00, $r1f
|
||||||
|
|
||||||
|
|
||||||
lri $r18, #0x0000
|
lri $r18, #0x0000
|
||||||
lri $r19, #1 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
|
lri $r19, #1 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
|
||||||
|
@ -545,7 +545,7 @@ send_back:
|
||||||
lr $r1e, @MEM_LO
|
lr $r1e, @MEM_LO
|
||||||
|
|
||||||
lri $r01, #8+8
|
lri $r01, #8+8
|
||||||
|
|
||||||
bloop $r01, dma_copy
|
bloop $r01, dma_copy
|
||||||
call do_dma
|
call do_dma
|
||||||
addi $r1e, #0x200
|
addi $r1e, #0x200
|
||||||
|
@ -555,19 +555,19 @@ send_back:
|
||||||
nop
|
nop
|
||||||
dma_copy:
|
dma_copy:
|
||||||
nop
|
nop
|
||||||
|
|
||||||
call wait_for_dsp_mbox
|
call wait_for_dsp_mbox
|
||||||
si @DMBH, #0x8888
|
si @DMBH, #0x8888
|
||||||
si @DMBL, #0xfeeb
|
si @DMBL, #0xfeeb
|
||||||
si @DIRQ, #0x0001
|
si @DIRQ, #0x0001
|
||||||
|
|
||||||
; wait for answer before we execute the next op
|
; wait for answer before we execute the next op
|
||||||
call wait_for_cpu_mbox
|
call wait_for_cpu_mbox
|
||||||
lrs $ACL0, @CMBL
|
lrs $ACL0, @CMBL
|
||||||
andi $acl1, #0x7fff
|
andi $acl1, #0x7fff
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
lri $r00, #REGS_BASE+1
|
lri $r00, #REGS_BASE+1
|
||||||
lrri $r01, @$r00
|
lrri $r01, @$r00
|
||||||
lrri $r02, @$r00
|
lrri $r02, @$r00
|
||||||
|
@ -601,39 +601,39 @@ dma_copy:
|
||||||
lrri $r1e, @$r00
|
lrri $r1e, @$r00
|
||||||
lrri $r1f, @$r00
|
lrri $r1f, @$r00
|
||||||
lr $r00, @REGS_BASE
|
lr $r00, @REGS_BASE
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
send_back_16:
|
|
||||||
|
|
||||||
cw 0x8e00
|
|
||||||
call send_back
|
|
||||||
cw 0x8f00
|
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
send_back_16:
|
||||||
|
|
||||||
|
cw 0x8e00
|
||||||
|
call send_back
|
||||||
|
cw 0x8f00
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
dump_memory:
|
dump_memory:
|
||||||
|
|
||||||
lri $r02, #0x0000
|
lri $r02, #0x0000
|
||||||
lri $acl0, #0x1000
|
lri $acl0, #0x1000
|
||||||
|
|
||||||
lri $r01, #0x1000
|
lri $r01, #0x1000
|
||||||
bloop $r01, _fill_loop2
|
bloop $r01, _fill_loop2
|
||||||
|
|
||||||
mrr $r03, $acl0
|
mrr $r03, $acl0
|
||||||
cw 0x80f0
|
cw 0x80f0
|
||||||
|
|
||||||
mrr $r1f, $r00
|
mrr $r1f, $r00
|
||||||
mrr $r00, $r02
|
mrr $r00, $r02
|
||||||
srri @$r00, $r1b
|
srri @$r00, $r1b
|
||||||
mrr $r02, $r00
|
mrr $r02, $r00
|
||||||
mrr $r00, $r1f
|
mrr $r00, $r1f
|
||||||
|
|
||||||
addis $acc0, #0x1
|
addis $AC0.M, #0x1
|
||||||
|
|
||||||
_fill_loop2:
|
_fill_loop2:
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
ret
|
||||||
|
|
Loading…
Reference in New Issue