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:
Michael Maltese 2017-05-19 17:07:26 -07:00
parent b9b3b1dc19
commit 1580b6e627
2 changed files with 214 additions and 197 deletions

View File

@ -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");

View File

@ -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