DSP: fixed compiler warnings and 2 crash bugs
made the dsp_code test use our lable table rather than the table which was there before (and had few mistakes). The other tests need to be fixed as well. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3063 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
9e427a4e59
commit
92e6d7c283
|
@ -77,10 +77,10 @@ static const char *err_string[] =
|
||||||
"Number out of range"
|
"Number out of range"
|
||||||
};
|
};
|
||||||
|
|
||||||
DSPAssembler::DSPAssembler(const AssemblerSettings &settings)
|
DSPAssembler::DSPAssembler(const AssemblerSettings &settings) :
|
||||||
: current_param(0),
|
m_cur_addr(0),
|
||||||
cur_addr(0),
|
m_cur_pass(0),
|
||||||
cur_pass(0),
|
m_current_param(0),
|
||||||
settings_(settings)
|
settings_(settings)
|
||||||
{
|
{
|
||||||
gdg_buffer = NULL;
|
gdg_buffer = NULL;
|
||||||
|
@ -128,11 +128,11 @@ void DSPAssembler::ShowError(err_t err_code, const char *extra_info)
|
||||||
else
|
else
|
||||||
buf_ptr += sprintf(buf_ptr, "ERROR: %s : %s\n", err_string[err_code], extra_info);
|
buf_ptr += sprintf(buf_ptr, "ERROR: %s : %s\n", err_string[err_code], extra_info);
|
||||||
|
|
||||||
if (current_param == 0)
|
if (m_current_param == 0)
|
||||||
buf_ptr += sprintf(buf_ptr, "ERROR: %s Line: %d : %s\n", err_string[err_code], code_line, extra_info);
|
buf_ptr += sprintf(buf_ptr, "ERROR: %s Line: %d : %s\n", err_string[err_code], code_line, extra_info);
|
||||||
else
|
else
|
||||||
buf_ptr += sprintf(buf_ptr, "ERROR: %s Line: %d Param: %d : %s\n",
|
buf_ptr += sprintf(buf_ptr, "ERROR: %s Line: %d Param: %d : %s\n",
|
||||||
err_string[err_code], code_line, current_param, extra_info);
|
err_string[err_code], code_line, m_current_param, extra_info);
|
||||||
last_error_str = error_buffer;
|
last_error_str = error_buffer;
|
||||||
last_error = err_code;
|
last_error = err_code;
|
||||||
}
|
}
|
||||||
|
@ -236,7 +236,7 @@ s32 DSPAssembler::ParseValue(const char *str)
|
||||||
u16 value;
|
u16 value;
|
||||||
if (labels.GetLabelValue(ptr, &value))
|
if (labels.GetLabelValue(ptr, &value))
|
||||||
return value;
|
return value;
|
||||||
if (cur_pass == 2)
|
if (m_cur_pass == 2)
|
||||||
ShowError(ERR_UNKNOWN_LABEL, str);
|
ShowError(ERR_UNKNOWN_LABEL, str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -532,7 +532,7 @@ bool DSPAssembler::VerifyParams(const opc_t *opc, param_t *par, int count, bool
|
||||||
if (ext) fprintf(stderr, "(ext) ");
|
if (ext) fprintf(stderr, "(ext) ");
|
||||||
if (par[i].val >= 0x1e && par[i].val <= 0x1f) {
|
if (par[i].val >= 0x1e && par[i].val <= 0x1f) {
|
||||||
fprintf(stderr, "%i : %s", code_line, cur_line.c_str());
|
fprintf(stderr, "%i : %s", code_line, cur_line.c_str());
|
||||||
fprintf(stderr, "WARNING: $ACM%d register used instead of $ACC%d register Line: %d Param: %d\n",
|
fprintf(stderr, "WARNING: $ACM%d register used instead of $ACC%d register Line: %d Param: %d Ext: %d\n",
|
||||||
(par[i].val & 1), (par[i].val & 1), code_line, current_param, ext);
|
(par[i].val & 1), (par[i].val & 1), code_line, current_param, ext);
|
||||||
}
|
}
|
||||||
else if (par[i].val >= 0x1c && par[i].val <= 0x1d) {
|
else if (par[i].val >= 0x1c && par[i].val <= 0x1d) {
|
||||||
|
@ -683,7 +683,7 @@ bool DSPAssembler::VerifyParams(const opc_t *opc, param_t *par, int count, bool
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
current_param = 0;
|
m_current_param = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -691,20 +691,20 @@ bool DSPAssembler::VerifyParams(const opc_t *opc, param_t *par, int count, bool
|
||||||
// Merge opcode with params.
|
// Merge opcode with params.
|
||||||
void DSPAssembler::BuildCode(const opc_t *opc, param_t *par, u32 par_count, u16 *outbuf)
|
void DSPAssembler::BuildCode(const opc_t *opc, param_t *par, u32 par_count, u16 *outbuf)
|
||||||
{
|
{
|
||||||
outbuf[cur_addr] |= opc->opcode;
|
outbuf[m_cur_addr] |= opc->opcode;
|
||||||
for (u32 i = 0; i < par_count; i++)
|
for (u32 i = 0; i < par_count; i++)
|
||||||
{
|
{
|
||||||
// Ignore the "reverse" parameters since they are implicit.
|
// Ignore the "reverse" parameters since they are implicit.
|
||||||
if (opc->params[i].type != P_ACC_D && opc->params[i].type != P_ACCM_D)
|
if (opc->params[i].type != P_ACC_D && opc->params[i].type != P_ACCM_D)
|
||||||
{
|
{
|
||||||
u16 t16 = outbuf[cur_addr + opc->params[i].loc];
|
u16 t16 = outbuf[m_cur_addr + opc->params[i].loc];
|
||||||
u16 v16 = par[i].val;
|
u16 v16 = par[i].val;
|
||||||
if (opc->params[i].lshift > 0)
|
if (opc->params[i].lshift > 0)
|
||||||
v16 <<= opc->params[i].lshift;
|
v16 <<= opc->params[i].lshift;
|
||||||
else
|
else
|
||||||
v16 >>= -opc->params[i].lshift;
|
v16 >>= -opc->params[i].lshift;
|
||||||
v16 &= opc->params[i].mask;
|
v16 &= opc->params[i].mask;
|
||||||
outbuf[cur_addr + opc->params[i].loc] = t16 | v16;
|
outbuf[m_cur_addr + opc->params[i].loc] = t16 | v16;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -722,7 +722,7 @@ void DSPAssembler::InitPass(int pass)
|
||||||
aliases["S16"] = "SET16";
|
aliases["S16"] = "SET16";
|
||||||
aliases["S40"] = "SET40";
|
aliases["S40"] = "SET40";
|
||||||
}
|
}
|
||||||
cur_addr = 0;
|
m_cur_addr = 0;
|
||||||
cur_segment = SEGMENT_CODE;
|
cur_segment = SEGMENT_CODE;
|
||||||
segment_addr[SEGMENT_CODE] = 0;
|
segment_addr[SEGMENT_CODE] = 0;
|
||||||
segment_addr[SEGMENT_DATA] = 0;
|
segment_addr[SEGMENT_DATA] = 0;
|
||||||
|
@ -744,11 +744,11 @@ bool DSPAssembler::AssembleFile(const char *fname, int pass)
|
||||||
|
|
||||||
printf("Pass %d\n", pass);
|
printf("Pass %d\n", pass);
|
||||||
code_line = 0;
|
code_line = 0;
|
||||||
cur_pass = pass;
|
m_cur_pass = pass;
|
||||||
|
|
||||||
#define LINEBUF_SIZE 1024
|
#define LINEBUF_SIZE 1024
|
||||||
char linebuffer[LINEBUF_SIZE];
|
char linebuffer[LINEBUF_SIZE];
|
||||||
while (!feof(fsrc) && !failed)
|
while (!failed && !feof(fsrc))
|
||||||
{
|
{
|
||||||
int opcode_size = 0;
|
int opcode_size = 0;
|
||||||
memset(linebuffer, 0, LINEBUF_SIZE);
|
memset(linebuffer, 0, LINEBUF_SIZE);
|
||||||
|
@ -758,8 +758,8 @@ bool DSPAssembler::AssembleFile(const char *fname, int pass)
|
||||||
//printf("A: %s", linebuffer);
|
//printf("A: %s", linebuffer);
|
||||||
code_line++;
|
code_line++;
|
||||||
|
|
||||||
param_t params[10] = {0};
|
param_t params[10] = {{0}};
|
||||||
param_t params_ext[10] = {0};
|
param_t params_ext[10] = {{0}};
|
||||||
|
|
||||||
for (int i = 0; i < LINEBUF_SIZE; i++)
|
for (int i = 0; i < LINEBUF_SIZE; i++)
|
||||||
{
|
{
|
||||||
|
@ -870,7 +870,7 @@ bool DSPAssembler::AssembleFile(const char *fname, int pass)
|
||||||
if (label)
|
if (label)
|
||||||
{
|
{
|
||||||
// there is a valid label so lets store it in labels table
|
// there is a valid label so lets store it in labels table
|
||||||
u32 lval = cur_addr;
|
u32 lval = m_cur_addr;
|
||||||
if (opcode)
|
if (opcode)
|
||||||
{
|
{
|
||||||
if (strcmp(opcode, "EQU") == 0)
|
if (strcmp(opcode, "EQU") == 0)
|
||||||
|
@ -922,7 +922,7 @@ bool DSPAssembler::AssembleFile(const char *fname, int pass)
|
||||||
if (strcmp("ORG", opcode) == 0)
|
if (strcmp("ORG", opcode) == 0)
|
||||||
{
|
{
|
||||||
if (params[0].type == P_VAL)
|
if (params[0].type == P_VAL)
|
||||||
cur_addr = params[0].val;
|
m_cur_addr = params[0].val;
|
||||||
else
|
else
|
||||||
ShowError(ERR_EXPECTED_PARAM_VAL);
|
ShowError(ERR_EXPECTED_PARAM_VAL);
|
||||||
continue;
|
continue;
|
||||||
|
@ -932,12 +932,12 @@ bool DSPAssembler::AssembleFile(const char *fname, int pass)
|
||||||
{
|
{
|
||||||
if (params[0].type == P_STR)
|
if (params[0].type == P_STR)
|
||||||
{
|
{
|
||||||
segment_addr[cur_segment] = cur_addr;
|
segment_addr[cur_segment] = m_cur_addr;
|
||||||
if (strcmp("DATA", params[0].str) == 0)
|
if (strcmp("DATA", params[0].str) == 0)
|
||||||
cur_segment = SEGMENT_DATA;
|
cur_segment = SEGMENT_DATA;
|
||||||
if (strcmp("CODE", params[0].str) == 0)
|
if (strcmp("CODE", params[0].str) == 0)
|
||||||
cur_segment = SEGMENT_CODE;
|
cur_segment = SEGMENT_CODE;
|
||||||
cur_addr = segment_addr[cur_segment];
|
m_cur_addr = segment_addr[cur_segment];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ShowError(ERR_EXPECTED_PARAM_STR);
|
ShowError(ERR_EXPECTED_PARAM_STR);
|
||||||
|
@ -975,20 +975,21 @@ bool DSPAssembler::AssembleFile(const char *fname, int pass)
|
||||||
if (pass == 2)
|
if (pass == 2)
|
||||||
{
|
{
|
||||||
// generate binary
|
// generate binary
|
||||||
((u16 *)gdg_buffer)[cur_addr] = 0x0000;
|
((u16 *)gdg_buffer)[m_cur_addr] = 0x0000;
|
||||||
BuildCode(opc, params, params_count, (u16 *)gdg_buffer);
|
BuildCode(opc, params, params_count, (u16 *)gdg_buffer);
|
||||||
if (opc_ext)
|
if (opc_ext)
|
||||||
BuildCode(opc_ext, params_ext, params_count_ext, (u16 *)gdg_buffer);
|
BuildCode(opc_ext, params_ext, params_count_ext, (u16 *)gdg_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_addr += opcode_size;
|
m_cur_addr += opcode_size;
|
||||||
};
|
};
|
||||||
if (gdg_buffer == NULL)
|
if (gdg_buffer == NULL)
|
||||||
{
|
{
|
||||||
gdg_buffer_size = cur_addr;
|
gdg_buffer_size = m_cur_addr;
|
||||||
gdg_buffer = (char *)malloc(gdg_buffer_size * sizeof(u16) + 4);
|
gdg_buffer = (char *)malloc(gdg_buffer_size * sizeof(u16) + 4);
|
||||||
memset(gdg_buffer, 0, gdg_buffer_size * sizeof(u16));
|
memset(gdg_buffer, 0, gdg_buffer_size * sizeof(u16));
|
||||||
}
|
}
|
||||||
fclose(fsrc);
|
if (! failed)
|
||||||
|
fclose(fsrc);
|
||||||
return !failed;
|
return !failed;
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,8 +117,8 @@ private:
|
||||||
std::string include_dir;
|
std::string include_dir;
|
||||||
std::string cur_line;
|
std::string cur_line;
|
||||||
|
|
||||||
u32 cur_addr;
|
u32 m_cur_addr;
|
||||||
u8 cur_pass;
|
u8 m_cur_pass;
|
||||||
|
|
||||||
LabelMap labels;
|
LabelMap labels;
|
||||||
|
|
||||||
|
@ -133,8 +133,8 @@ private:
|
||||||
|
|
||||||
segment_t cur_segment;
|
segment_t cur_segment;
|
||||||
u32 segment_addr[SEGMENT_MAX];
|
u32 segment_addr[SEGMENT_MAX];
|
||||||
int current_param;
|
int m_current_param;
|
||||||
const AssemblerSettings settings_;
|
const AssemblerSettings settings_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _DSP_ASSEMBLE_H
|
#endif // _DSP_ASSEMBLE_H
|
||||||
|
|
|
@ -1,72 +1,9 @@
|
||||||
; This is the trojan program we send to the DSP from DSPSpy to figure it out.
|
; This is the trojan program we send to the DSP from DSPSpy to figure it out.
|
||||||
|
REGS_BASE: equ 0x0f80
|
||||||
|
MEM_HI: equ 0x0f7E
|
||||||
|
MEM_LO: equ 0x0f7F
|
||||||
|
|
||||||
; A lot of constant definitions.
|
;
|
||||||
DSCR: equ 0xffc9 ; DSP DMA Control Reg
|
|
||||||
DSBL: equ 0xffcb ; DSP DMA Block Length
|
|
||||||
DSPA: equ 0xffcd ; DSP DMA DMEM Address
|
|
||||||
DSMAH: equ 0xffce ; DSP DMA Mem Address H
|
|
||||||
DSMAL: equ 0xffcf ; DSP DMA Mem Address L
|
|
||||||
|
|
||||||
ACSAH: equ 0xffd4
|
|
||||||
ACSAL: equ 0xffd5
|
|
||||||
ACEAH: equ 0xffd6
|
|
||||||
ACEAL: equ 0xffd7
|
|
||||||
ACCAH: equ 0xffd8
|
|
||||||
ACCAL: equ 0xffd9
|
|
||||||
AMDM: equ 0xffef ; ARAM DMA Request Mask
|
|
||||||
|
|
||||||
DIRQ: equ 0xfffb ; DSP Irq Request
|
|
||||||
DMBH: equ 0xfffc ; DSP Mailbox H
|
|
||||||
DMBL: equ 0xfffd ; DSP Mailbox L
|
|
||||||
CMBH: equ 0xfffe ; CPU Mailbox H
|
|
||||||
CMBL: equ 0xffff ; CPU Mailbox L
|
|
||||||
|
|
||||||
R00: equ 0x00
|
|
||||||
R01: equ 0x01
|
|
||||||
R02: equ 0x02
|
|
||||||
R03: equ 0x03
|
|
||||||
R04: equ 0x04
|
|
||||||
R05: equ 0x05
|
|
||||||
R06: equ 0x06
|
|
||||||
R07: equ 0x07
|
|
||||||
R08: equ 0x08
|
|
||||||
R09: equ 0x09
|
|
||||||
R0A: equ 0x0a
|
|
||||||
R0B: equ 0x0b
|
|
||||||
R0C: equ 0x0c
|
|
||||||
R0D: equ 0x0d
|
|
||||||
R0E: equ 0x0e
|
|
||||||
R0F: equ 0x0f
|
|
||||||
R10: equ 0x10
|
|
||||||
R11: equ 0x11
|
|
||||||
R12: equ 0x12
|
|
||||||
R13: equ 0x13
|
|
||||||
R14: equ 0x14
|
|
||||||
R15: equ 0x15
|
|
||||||
R16: equ 0x16
|
|
||||||
R17: equ 0x17
|
|
||||||
R18: equ 0x18
|
|
||||||
R19: equ 0x19
|
|
||||||
R1A: equ 0x1a
|
|
||||||
R1B: equ 0x1b
|
|
||||||
R1C: equ 0x1c
|
|
||||||
R1D: equ 0x1d
|
|
||||||
R1E: equ 0x1e
|
|
||||||
R1F: equ 0x1f
|
|
||||||
|
|
||||||
ACH0: equ 0x10
|
|
||||||
ACH1: equ 0x11
|
|
||||||
ACL0: equ 0x1e
|
|
||||||
ACL1: equ 0x1f
|
|
||||||
|
|
||||||
DSP_CR_IMEM: equ 2
|
|
||||||
DSP_CR_TO_CPU: equ 1
|
|
||||||
|
|
||||||
|
|
||||||
REGS_BASE: equ 0x0f80
|
|
||||||
MEM_HI: equ 0x0f7E
|
|
||||||
MEM_LO: equ 0x0f7F
|
|
||||||
|
|
||||||
; CODE STARTS HERE.
|
; CODE STARTS HERE.
|
||||||
|
|
||||||
; Interrupt vectors 8 vectors, 2 opcodes each
|
; Interrupt vectors 8 vectors, 2 opcodes each
|
||||||
|
@ -104,17 +41,17 @@ main:
|
||||||
si @DIRQ, #0x0001
|
si @DIRQ, #0x0001
|
||||||
|
|
||||||
call wait_for_cpu_mbox
|
call wait_for_cpu_mbox
|
||||||
lrs $ACL0, @CMBL
|
lrs $AC0.M, @CMBL
|
||||||
andi $acl1, #0x7fff
|
andi $ac1.m, #0x7fff
|
||||||
|
|
||||||
sr @MEM_HI, $ACL1
|
sr @MEM_HI, $AC1.M
|
||||||
sr @MEM_LO, $ACL0
|
sr @MEM_LO, $AC0.M
|
||||||
|
|
||||||
lri $r18, #0
|
lri $ax0.l, #0
|
||||||
lri $r19, #0 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
|
lri $ax1.l, #0 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
|
||||||
lri $r1a, #0x2000
|
lri $ax0.h, #0x2000
|
||||||
lr $r1c, @MEM_HI
|
lr $ac0.l, @MEM_HI
|
||||||
lr $r1e, @MEM_LO
|
lr $ac0.m, @MEM_LO
|
||||||
call do_dma
|
call do_dma
|
||||||
|
|
||||||
|
|
||||||
|
@ -126,54 +63,54 @@ main:
|
||||||
si @DIRQ, #0x0001
|
si @DIRQ, #0x0001
|
||||||
|
|
||||||
call wait_for_cpu_mbox
|
call wait_for_cpu_mbox
|
||||||
lrs $ACL0, @CMBL
|
lrs $AC0.M, @CMBL
|
||||||
andi $acl1, #0x7fff
|
andi $ac1.m, #0x7fff
|
||||||
|
|
||||||
sr @MEM_HI, $ACL1
|
sr @MEM_HI, $AC1.M
|
||||||
sr @MEM_LO, $ACL0
|
sr @MEM_LO, $AC0.M
|
||||||
|
|
||||||
lri $r18, #REGS_BASE
|
lri $ax0.l, #REGS_BASE
|
||||||
lri $r19, #0 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
|
lri $ax1.l, #0 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
|
||||||
lri $r1a, #0x80
|
lri $ax0.h, #0x80
|
||||||
lr $r1c, @MEM_HI
|
lr $ac0.l, @MEM_HI
|
||||||
lr $r1e, @MEM_LO
|
lr $ac0.m, @MEM_LO
|
||||||
call do_dma
|
call do_dma
|
||||||
|
|
||||||
; Read in all the registers from RAM
|
; Read in all the registers from RAM
|
||||||
|
|
||||||
lri $r00, #REGS_BASE+1
|
lri $ar0, #REGS_BASE+1
|
||||||
lrri $r01, @$r00
|
lrri $ar1, @$ar0
|
||||||
lrri $r02, @$r00
|
lrri $ar2, @$ar0
|
||||||
lrri $r03, @$r00
|
lrri $ar3, @$ar0
|
||||||
lrri $r04, @$r00
|
lrri $ix0, @$ar0
|
||||||
lrri $r05, @$r00
|
lrri $ix1, @$ar0
|
||||||
lrri $r06, @$r00
|
lrri $ix2, @$ar0
|
||||||
lrri $r07, @$r00
|
lrri $ix3, @$ar0
|
||||||
lrri $r08, @$r00
|
lrri $r08, @$ar0
|
||||||
lrri $r09, @$r00
|
lrri $r09, @$ar0
|
||||||
lrri $r0a, @$r00
|
lrri $r10, @$ar0
|
||||||
lrri $r0b, @$r00
|
lrri $r11, @$ar0
|
||||||
lrri $r0c, @$r00
|
lrri $st0, @$ar0
|
||||||
lrri $r0d, @$r00
|
lrri $st1, @$ar0
|
||||||
lrri $r0e, @$r00
|
lrri $st2, @$ar0
|
||||||
lrri $r0f, @$r00
|
lrri $st3, @$ar0
|
||||||
lrri $r10, @$r00
|
lrri $ac0.h, @$ar0
|
||||||
lrri $r11, @$r00
|
lrri $ac1.h, @$ar0
|
||||||
lrri $r12, @$r00
|
lrri $cr, @$ar0
|
||||||
lrri $r13, @$r00
|
lrri $sr, @$ar0
|
||||||
lrri $r14, @$r00
|
lrri $prod.l, @$ar0
|
||||||
lrri $r15, @$r00
|
lrri $prod.m1, @$ar0
|
||||||
lrri $r16, @$r00
|
lrri $prod.h, @$ar0
|
||||||
lrri $r17, @$r00
|
lrri $prod.m2, @$ar0
|
||||||
lrri $r18, @$r00
|
lrri $ax0.l, @$ar0
|
||||||
lrri $r19, @$r00
|
lrri $ax1.l, @$ar0
|
||||||
lrri $r1a, @$r00
|
lrri $ax0.h, @$ar0
|
||||||
lrri $r1b, @$r00
|
lrri $ax1.h, @$ar0
|
||||||
lrri $r1c, @$r00
|
lrri $ac0.l, @$ar0
|
||||||
lrri $r1d, @$r00
|
lrri $ac1.l, @$ar0
|
||||||
lrri $r1e, @$r00
|
lrri $ac0.m, @$ar0
|
||||||
lrri $r1f, @$r00
|
lrri $ac1.m, @$ar0
|
||||||
lr $r00, @REGS_BASE
|
lr $ar0, @REGS_BASE
|
||||||
|
|
||||||
; Right here we are at a specific predetermined state.
|
; Right here we are at a specific predetermined state.
|
||||||
; Ideal environment to try instructions.
|
; Ideal environment to try instructions.
|
||||||
|
@ -189,7 +126,7 @@ main:
|
||||||
lris $AC1.M, #0xcc
|
lris $AC1.M, #0xcc
|
||||||
nop
|
nop
|
||||||
|
|
||||||
mrr $r00, $r13
|
mrr $ar0, $sr
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
set40
|
set40
|
||||||
|
@ -198,7 +135,7 @@ main:
|
||||||
lris $AC1.M, #0xcc
|
lris $AC1.M, #0xcc
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
mrr $r00, $r13
|
mrr $ar0, $sr
|
||||||
call send_back
|
call send_back
|
||||||
|
|
||||||
cw 0xa100
|
cw 0xa100
|
||||||
|
@ -454,60 +391,60 @@ dead_loop:
|
||||||
jmp dead_loop
|
jmp dead_loop
|
||||||
|
|
||||||
; Utility function to do DMA.
|
; Utility function to do DMA.
|
||||||
; r1c:r1e - external address.
|
; ac0.l:ac0.m - external address.
|
||||||
; r18 - address in DSP
|
; ax0.l - address in DSP
|
||||||
do_dma:
|
do_dma:
|
||||||
sr @DSMAH, $r1c
|
sr @DSMAH, $ac0.l
|
||||||
sr @DSMAL, $r1e
|
sr @DSMAL, $ac0.m
|
||||||
sr @DSPA, $r18
|
sr @DSPA, $ax0.l
|
||||||
sr @DSCR, $r19
|
sr @DSCR, $ax1.l
|
||||||
sr @DSBL, $r1a ; This kicks off the DMA.
|
sr @DSBL, $ax0.h ; This kicks off the DMA.
|
||||||
|
|
||||||
; Waits for said DMA to complete by watching a bit in DSCR.
|
; Waits for said DMA to complete by watching a bit in DSCR.
|
||||||
wait_dma:
|
wait_dma:
|
||||||
LRS $ACL1, @DSCR
|
LRS $AC1.M, @DSCR
|
||||||
andcf $acl1, #0x0004
|
andcf $ac1.m, #0x0004
|
||||||
JLZ wait_dma
|
JLZ wait_dma
|
||||||
RET
|
RET
|
||||||
|
|
||||||
; This waits for a mail to arrive in the DSP in-mailbox.
|
; This waits for a mail to arrive in the DSP in-mailbox.
|
||||||
wait_for_dsp_mbox:
|
wait_for_dsp_mbox:
|
||||||
lrs $ACL1, @DMBH
|
lrs $AC1.M, @DMBH
|
||||||
andcf $acl1, #0x8000
|
andcf $ac1.m, #0x8000
|
||||||
jlz wait_for_dsp_mbox
|
jlz wait_for_dsp_mbox
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; This waits for the CPU to grab a mail that we just sent from the DSP.
|
; This waits for the CPU to grab a mail that we just sent from the DSP.
|
||||||
wait_for_cpu_mbox:
|
wait_for_cpu_mbox:
|
||||||
lrs $ACL1, @cmbh
|
lrs $AC1.M, @cmbh
|
||||||
andcf $acl1, #0x8000
|
andcf $ac1.m, #0x8000
|
||||||
jlnz wait_for_cpu_mbox
|
jlnz wait_for_cpu_mbox
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; IRQ handlers. Not entirely sure what good they do currently.
|
; IRQ handlers. Not entirely sure what good they do currently.
|
||||||
irq0:
|
irq0:
|
||||||
lri $acl0, #0x0000
|
lri $ac0.m, #0x0000
|
||||||
jmp irq
|
jmp irq
|
||||||
irq1:
|
irq1:
|
||||||
lri $acl0, #0x0001
|
lri $ac0.m, #0x0001
|
||||||
jmp irq
|
jmp irq
|
||||||
irq2:
|
irq2:
|
||||||
lri $acl0, #0x0002
|
lri $ac0.m, #0x0002
|
||||||
jmp irq
|
jmp irq
|
||||||
irq3:
|
irq3:
|
||||||
lri $acl0, #0x0003
|
lri $ac0.m, #0x0003
|
||||||
jmp irq
|
jmp irq
|
||||||
irq4:
|
irq4:
|
||||||
lri $acl0, #0x0004
|
lri $ac0.m, #0x0004
|
||||||
jmp irq
|
jmp irq
|
||||||
irq5:
|
irq5:
|
||||||
; No idea what this code is doing.
|
; No idea what this code is doing.
|
||||||
set16
|
set16
|
||||||
mrr $r0d, $r1c
|
mrr $st1, $ac0.l
|
||||||
mrr $r0d, $r1e
|
mrr $st1, $ac0.m
|
||||||
clr $acc0
|
clr $acc0
|
||||||
mrr $r1e, $r0d
|
mrr $ac0.m, $st1
|
||||||
mrr $r1c, $r0d
|
mrr $ac0.l, $st1
|
||||||
nop ; Or why there's a nop sled here.
|
nop ; Or why there's a nop sled here.
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
|
@ -516,22 +453,22 @@ irq5:
|
||||||
nop
|
nop
|
||||||
rti
|
rti
|
||||||
|
|
||||||
lri $acl0, #0x0005
|
lri $ac0.m, #0x0005
|
||||||
jmp irq
|
jmp irq
|
||||||
irq6:
|
irq6:
|
||||||
lri $acl0, #0x0006
|
lri $ac0.m, #0x0006
|
||||||
jmp irq
|
jmp irq
|
||||||
irq7:
|
irq7:
|
||||||
lri $acl0, #0x0007
|
lri $ac0.m, #0x0007
|
||||||
jmp irq
|
jmp irq
|
||||||
|
|
||||||
irq:
|
irq:
|
||||||
lrs $ACL1, @DMBH
|
lrs $AC1.M, @DMBH
|
||||||
andcf $acl1, #0x8000
|
andcf $ac1.m, #0x8000
|
||||||
jlz irq
|
jlz irq
|
||||||
si @DMBH, #0x8BAD
|
si @DMBH, #0x8BAD
|
||||||
sr @DMBL, $r0b
|
sr @DMBL, $r11
|
||||||
;sr @DMBL, $acl0
|
;sr @DMBL, $ac0.m
|
||||||
si @DIRQ, #0x0001
|
si @DIRQ, #0x0001
|
||||||
halt
|
halt
|
||||||
|
|
||||||
|
@ -541,56 +478,56 @@ send_back:
|
||||||
; make state safe.
|
; make state safe.
|
||||||
set16
|
set16
|
||||||
; store registers to reg table
|
; store registers to reg table
|
||||||
sr @REGS_BASE, $r00
|
sr @REGS_BASE, $ar0
|
||||||
lri $r00, #(REGS_BASE + 1)
|
lri $ar0, #(REGS_BASE + 1)
|
||||||
srri @$r00, $r01
|
srri @$ar0, $ar1
|
||||||
srri @$r00, $r02
|
srri @$ar0, $ar2
|
||||||
srri @$r00, $r03
|
srri @$ar0, $ar3
|
||||||
srri @$r00, $r04
|
srri @$ar0, $ix0
|
||||||
srri @$r00, $r05
|
srri @$ar0, $ix1
|
||||||
srri @$r00, $r06
|
srri @$ar0, $ix2
|
||||||
srri @$r00, $r07
|
srri @$ar0, $ix3
|
||||||
srri @$r00, $r08
|
srri @$ar0, $r08
|
||||||
srri @$r00, $r09
|
srri @$ar0, $r09
|
||||||
srri @$r00, $r0a
|
srri @$ar0, $r10
|
||||||
srri @$r00, $r0b
|
srri @$ar0, $r11
|
||||||
srri @$r00, $r0c
|
srri @$ar0, $st0
|
||||||
srri @$r00, $r0d
|
srri @$ar0, $st1
|
||||||
srri @$r00, $r0e
|
srri @$ar0, $st2
|
||||||
srri @$r00, $r0f
|
srri @$ar0, $st3
|
||||||
srri @$r00, $r10
|
srri @$ar0, $ac0.h
|
||||||
srri @$r00, $r11
|
srri @$ar0, $ac1.h
|
||||||
srri @$r00, $r12
|
srri @$ar0, $cr
|
||||||
srri @$r00, $r13
|
srri @$ar0, $sr
|
||||||
srri @$r00, $r14
|
srri @$ar0, $prod.l
|
||||||
srri @$r00, $r15
|
srri @$ar0, $prod.m1
|
||||||
srri @$r00, $r16
|
srri @$ar0, $prod.h
|
||||||
srri @$r00, $r17
|
srri @$ar0, $prod.m2
|
||||||
srri @$r00, $r18
|
srri @$ar0, $ax0.l
|
||||||
srri @$r00, $r19
|
srri @$ar0, $ax1.l
|
||||||
srri @$r00, $r1a
|
srri @$ar0, $ax0.h
|
||||||
srri @$r00, $r1b
|
srri @$ar0, $ax1.h
|
||||||
srri @$r00, $r1c
|
srri @$ar0, $ac0.l
|
||||||
srri @$r00, $r1d
|
srri @$ar0, $ac1.l
|
||||||
srri @$r00, $r1e
|
srri @$ar0, $ac0.m
|
||||||
srri @$r00, $r1f
|
srri @$ar0, $ac1.m
|
||||||
|
|
||||||
; Regs are stored. Prepare DMA.
|
; Regs are stored. Prepare DMA.
|
||||||
lri $r18, #0x0000
|
lri $ax0.l, #0x0000
|
||||||
lri $r19, #1 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
|
lri $ax1.l, #1 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
|
||||||
lri $r1a, #0x200
|
lri $ax0.h, #0x200
|
||||||
lr $r1c, @MEM_HI
|
lr $ac0.l, @MEM_HI
|
||||||
lr $r1e, @MEM_LO
|
lr $ac0.m, @MEM_LO
|
||||||
|
|
||||||
lri $r01, #8+8
|
lri $ar1, #8+8
|
||||||
|
|
||||||
; Now, why are we looping here?
|
; Now, why are we looping here?
|
||||||
bloop $r01, dma_copy
|
bloop $ar1, dma_copy
|
||||||
call do_dma
|
call do_dma
|
||||||
addi $r1e, #0x200
|
addi $ac0.m, #0x200
|
||||||
mrr $r1f, $r18
|
mrr $ac1.m, $ax0.l
|
||||||
addi $r1f, #0x100
|
addi $ac1.m, #0x100
|
||||||
mrr $r18, $r1f
|
mrr $ax0.l, $ac1.m
|
||||||
nop
|
nop
|
||||||
|
|
||||||
dma_copy:
|
dma_copy:
|
||||||
|
@ -604,43 +541,43 @@ dma_copy:
|
||||||
|
|
||||||
; wait for the CPU to recieve our response before we execute the next op
|
; wait for the CPU to recieve our response before we execute the next op
|
||||||
call wait_for_cpu_mbox
|
call wait_for_cpu_mbox
|
||||||
lrs $ACL0, @CMBL
|
lrs $AC0.M, @CMBL
|
||||||
andi $acl1, #0x7fff
|
andi $ac1.m, #0x7fff
|
||||||
|
|
||||||
; Restore all regs again so we're ready to execute another op.
|
; Restore all regs again so we're ready to execute another op.
|
||||||
lri $r00, #REGS_BASE+1
|
lri $ar0, #REGS_BASE+1
|
||||||
lrri $r01, @$r00
|
lrri $ar1, @$ar0
|
||||||
lrri $r02, @$r00
|
lrri $ar2, @$ar0
|
||||||
lrri $r03, @$r00
|
lrri $ar3, @$ar0
|
||||||
lrri $r04, @$r00
|
lrri $ix0, @$ar0
|
||||||
lrri $r05, @$r00
|
lrri $ix1, @$ar0
|
||||||
lrri $r06, @$r00
|
lrri $ix2, @$ar0
|
||||||
lrri $r07, @$r00
|
lrri $ix3, @$ar0
|
||||||
lrri $r08, @$r00
|
lrri $r08, @$ar0
|
||||||
lrri $r09, @$r00
|
lrri $r09, @$ar0
|
||||||
lrri $r0a, @$r00
|
lrri $r10, @$ar0
|
||||||
lrri $r0b, @$r00
|
lrri $r11, @$ar0
|
||||||
lrri $r0c, @$r00
|
lrri $st0, @$ar0
|
||||||
lrri $r0d, @$r00
|
lrri $st1, @$ar0
|
||||||
lrri $r0e, @$r00
|
lrri $st2, @$ar0
|
||||||
lrri $r0f, @$r00
|
lrri $st3, @$ar0
|
||||||
lrri $r10, @$r00
|
lrri $ac0.h, @$ar0
|
||||||
lrri $r11, @$r00
|
lrri $ac1.h, @$ar0
|
||||||
lrri $r12, @$r00
|
lrri $cr, @$ar0
|
||||||
lrri $r13, @$r00
|
lrri $sr, @$ar0
|
||||||
lrri $r14, @$r00
|
lrri $prod.l, @$ar0
|
||||||
lrri $r15, @$r00
|
lrri $prod.m1, @$ar0
|
||||||
lrri $r16, @$r00
|
lrri $prod.h, @$ar0
|
||||||
lrri $r17, @$r00
|
lrri $prod.m2, @$ar0
|
||||||
lrri $r18, @$r00
|
lrri $ax0.l, @$ar0
|
||||||
lrri $r19, @$r00
|
lrri $ax1.l, @$ar0
|
||||||
lrri $r1a, @$r00
|
lrri $ax0.h, @$ar0
|
||||||
lrri $r1b, @$r00
|
lrri $ax1.h, @$ar0
|
||||||
lrri $r1c, @$r00
|
lrri $ac0.l, @$ar0
|
||||||
lrri $r1d, @$r00
|
lrri $ac1.l, @$ar0
|
||||||
lrri $r1e, @$r00
|
lrri $ac0.m, @$ar0
|
||||||
lrri $r1f, @$r00
|
lrri $ac1.m, @$ar0
|
||||||
lr $r00, @REGS_BASE
|
lr $ar0, @REGS_BASE
|
||||||
|
|
||||||
ret ; from send_back
|
ret ; from send_back
|
||||||
|
|
||||||
|
@ -652,23 +589,23 @@ send_back_40:
|
||||||
set40
|
set40
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; This one's odd. Doesn't look like it should work since it uses acl0 but
|
; This one's odd. Doesn't look like it should work since it uses ac0.m but
|
||||||
; increments acm0... (acc0)
|
; increments acm0... (acc0)
|
||||||
dump_memory:
|
dump_memory:
|
||||||
lri $r02, #0x0000
|
lri $ar2, #0x0000
|
||||||
lri $acl0, #0x1000
|
lri $ac0.m, #0x1000
|
||||||
|
|
||||||
lri $r01, #0x1000
|
lri $ar1, #0x1000
|
||||||
bloop $r01, _fill_loop2
|
bloop $ar1, _fill_loop2
|
||||||
|
|
||||||
mrr $r03, $acl0
|
mrr $ar3, $ac0.m
|
||||||
nx'ld : $AX0.H, $AX1.H, @$AR0
|
nx'ld : $AX0.H, $AX1.H, @$AR0
|
||||||
|
|
||||||
mrr $r1f, $r00
|
mrr $ac1.m, $ar0
|
||||||
mrr $r00, $r02
|
mrr $ar0, $ar2
|
||||||
srri @$r00, $r1b
|
srri @$ar0, $ax1.h
|
||||||
mrr $r02, $r00
|
mrr $ar2, $ar0
|
||||||
mrr $r00, $r1f
|
mrr $ar0, $ac1.m
|
||||||
|
|
||||||
addis $acc0, #0x1
|
addis $acc0, #0x1
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue