Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8327 maxcodehac 1
#include "math64.h"
2
#include "pxa255_DSP.h"
3
 
4
 
5
 
6
 
7
Boolean pxa255dspAccess(struct ArmCpu* cpu, void* userData, Boolean MRRC, UInt8 op, UInt8 RdLo, UInt8 RdHi, UInt8 acc){
8
 
9
	Pxa255dsp* dsp = userData;
10
 
11
	if(acc != 0 || op != 0) return false;				//bad encoding
12
 
13
	if(MRRC){	//MRA: read acc0
14
 
15
		cpuSetReg(cpu, RdLo, u64_64_to_32(dsp->acc0));
16
		cpuSetReg(cpu, RdHi, (UInt8)u64_get_hi(dsp->acc0));
17
	}
18
	else{		//MAR: write acc0
19
 
20
		dsp->acc0 = u64_from_halves(cpuGetRegExternal(cpu, RdHi) & 0xFF, cpuGetRegExternal(cpu, RdLo));
21
	}
22
 
23
	return true;
24
}
25
 
26
Boolean	pxa255dspOp(struct ArmCpu* cpu, void* userData, Boolean two/* MCR2/MRC2 ? */, Boolean MRC, UInt8 op1, UInt8 Rs, UInt8 opcode_3, UInt8 Rm, UInt8 acc){
27
 
28
	Pxa255dsp* dsp = userData;
29
	UInt64 addend = u64_zero();
30
	UInt32 Vs, Vm;
31
 
32
	if(op1 != 1 || two || MRC || acc != 0) return false;		//bad encoding
33
 
34
	Vs = cpuGetRegExternal(cpu, Rs);
35
	Vm = cpuGetRegExternal(cpu, Rm);
36
 
37
	switch(opcode_3 >> 2){
38
 
39
		case 0:	//MIA
40
			addend = u64_smul3232(Vm, Vs);
41
			break;
42
 
43
		case 1:	//invalid
44
			return false;
45
 
46
		case 2:	//MIAPH
47
			addend = u64_smul3232((Int32)((Int16)(Vm >>  0)), (Int32)((Int16)(Vs >>  0)));
48
			addend = u64_add(addend, u64_smul3232((Int32)((Int16)(Vm >> 16)), (Int32)((Int16)(Vs >> 16))));
49
			break;
50
 
51
		case 3:	//MIAxy
52
			if(opcode_3 & 2) Vm >>= 16;	//X set
53
			if(opcode_3 & 1) Vs >>= 16;	//Y set
54
			addend = u64_smul3232((Int32)((Int16)Vm), (Int32)((Int16)Vs));
55
			break;
56
	}
57
 
58
	dsp->acc0 = u64_and(u64_add(dsp->acc0, addend), u64_from_halves(0xFF, 0xFFFFFFFFUL));
59
 
60
	return true;
61
}
62
 
63
 
64
 
65
Boolean pxa255dspInit(Pxa255dsp* dsp, ArmCpu* cpu){
66
 
67
	ArmCoprocessor cp;
68
 
69
 
70
	__mem_zero(dsp, sizeof(Pxa255dsp));
71
 
72
	cp.regXfer = pxa255dspOp;
73
	cp.dataProcessing = NULL;
74
	cp.memAccess = NULL;
75
	cp.twoRegF = pxa255dspAccess;
76
	cp.userData = dsp;
77
 
78
	cpuCoprocessorRegister(cpu, 0, &cp);
79
 
80
	return true;
81
}