GTE: Fix MVMVA flags, mx3 and tv2

aaaaaand. GTE is done.
This commit is contained in:
Blue 2021-02-27 09:45:01 +01:00
parent c5325ff4a8
commit 4b53de2741
2 changed files with 34 additions and 16 deletions

View file

@ -288,14 +288,6 @@ namespace ProjectPSX {
load = bus.LoadFromBios(maskedPC);
}
//if (PC == 0x8002cdf4) {
// if (GPR[3] != GPR[2]) {
// Console.ForegroundColor = ConsoleColor.Yellow;
// Console.WriteLine($"Got {GPR[3]:x8} expected {GPR[2]:x8}");
// Console.ResetColor();
// }
//}
PC_Now = PC;
PC = PC_Predictor;
PC_Predictor += 4;

View file

@ -87,6 +87,7 @@ namespace ProjectPSX {
internal void execute(uint command) {
//Console.WriteLine($"GTE EXECUTE {(command & 0x3F):x2}");
currentCommand = command;
sf = (int)((command & 0x80_000) >> 19) * 12;
lm = ((command >> 10) & 0x1) != 0;
FLAG = 0;
@ -348,7 +349,6 @@ namespace ProjectPSX {
IR[3] = setIR(3, MAC3, lm);
}
//int matrix;
private void MVMVA() { //WIP
//Mx = matrix specified by mx; RT / LLM / LCM - Rotation, light or color matrix
//Vx = vector specified by v; V0, V1, V2, or[IR1, IR2, IR3]
@ -369,9 +369,14 @@ namespace ProjectPSX {
} else if (mxIndex == 1) {
mx = LM;
} else if (mxIndex == 2) {
mx = RT;
} else {
mx = LRGB;
} else {
mx = new Matrix();
mx.v1.x = (short)-(RGBC.r << 4);
mx.v1.y = (short)(RGBC.r << 4);
mx.v1.z = IR[0];
mx.v2.x = mx.v2.y = mx.v2.z = RT.v1.z;
mx.v3.x = mx.v3.y = mx.v3.z = RT.v2.y;
}
if (mvIndex == 0) {
@ -393,9 +398,32 @@ namespace ProjectPSX {
ty = GBK;
tz = BBK;
} else if (tvIndex == 2) {
//This vector is not added correctly by the hardware
tx = RFC;
ty = GFC;
tz = BFC;
long mac1 = setMAC(1, tx * 0x1000 + mx.v1.x * vx.x);
long mac2 = setMAC(2, ty * 0x1000 + mx.v2.x * vx.x);
long mac3 = setMAC(3, tz * 0x1000 + mx.v3.x * vx.x);
setIR(1, (int)(mac1 >> sf), false);
setIR(2, (int)(mac2 >> sf), false);
setIR(3, (int)(mac3 >> sf), false);
mac1 = setMAC(1, setMAC(1, (long)mx.v1.y * vx.y) + (long)mx.v1.z * vx.z);
mac2 = setMAC(2, setMAC(2, (long)mx.v2.y * vx.y) + (long)mx.v2.z * vx.z);
mac3 = setMAC(3, setMAC(3, (long)mx.v3.y * vx.y) + (long)mx.v3.z * vx.z);
MAC1 = (int)(mac1 >> sf);
MAC2 = (int)(mac2 >> sf);
MAC3 = (int)(mac3 >> sf);
IR[1] = setIR(1, MAC1, lm);
IR[2] = setIR(2, MAC2, lm);
IR[3] = setIR(3, MAC3, lm);
return;
} else {
tx = ty = tz = 0;
}
@ -405,15 +433,13 @@ namespace ProjectPSX {
//MAC3 = (Tx3 * 1000h + Mx31 * Vx1 + Mx32 * Vx2 + Mx33 * Vx3) SAR(sf * 12)
//[IR1, IR2, IR3] = [MAC1, MAC2, MAC3]
MAC1 = (int)setMAC(1, (long)(tx * 0x1000 + mx.v1.x * vx.x + mx.v1.y * vx.y + mx.v1.z * vx.z) >> sf);
MAC2 = (int)setMAC(2, (long)(ty * 0x1000 + mx.v2.x * vx.x + mx.v2.y * vx.y + mx.v2.z * vx.z) >> sf);
MAC3 = (int)setMAC(3, (long)(tz * 0x1000 + mx.v3.x * vx.x + mx.v3.y * vx.y + mx.v3.z * vx.z) >> sf);
MAC1 = (int)(setMAC(1, setMAC(1, setMAC(1, tx * 0x1000 + mx.v1.x * vx.x) + (long)mx.v1.y * vx.y) + (long)mx.v1.z * vx.z) >> sf);
MAC2 = (int)(setMAC(2, setMAC(2, setMAC(2, ty * 0x1000 + mx.v2.x * vx.x) + (long)mx.v2.y * vx.y) + (long)mx.v2.z * vx.z) >> sf);
MAC3 = (int)(setMAC(3, setMAC(3, setMAC(3, tz * 0x1000 + mx.v3.x * vx.x) + (long)mx.v3.y * vx.y) + (long)mx.v3.z * vx.z) >> sf);
IR[1] = setIR(1, MAC1, lm);
IR[2] = setIR(2, MAC2, lm);
IR[3] = setIR(3, MAC3, lm);
//Console.WriteLine("[GTE] MVMVA " + ++matrix);
}
private void GPL() {