mirror of https://github.com/bsnes-emu/bsnes.git
228 lines
4.7 KiB
C++
228 lines
4.7 KiB
C++
|
#ifdef CX4_CPP
|
||
|
|
||
|
//Sprite Functions
|
||
|
void Cx4::op00() {
|
||
|
switch(reg[0x4d]) {
|
||
|
case 0x00: op00_00(); break;
|
||
|
case 0x03: op00_03(); break;
|
||
|
case 0x05: op00_05(); break;
|
||
|
case 0x07: op00_07(); break;
|
||
|
case 0x08: op00_08(); break;
|
||
|
case 0x0b: op00_0b(); break;
|
||
|
case 0x0c: op00_0c(); break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Draw Wireframe
|
||
|
void Cx4::op01() {
|
||
|
memset(ram + 0x300, 0, 2304);
|
||
|
C4DrawWireFrame();
|
||
|
}
|
||
|
|
||
|
//Propulsion
|
||
|
void Cx4::op05() {
|
||
|
int32 temp = 0x10000;
|
||
|
if(readw(0x1f83)) {
|
||
|
temp = sar((temp / readw(0x1f83)) * readw(0x1f81), 8);
|
||
|
}
|
||
|
writew(0x1f80, temp);
|
||
|
}
|
||
|
|
||
|
//Set Vector length
|
||
|
void Cx4::op0d() {
|
||
|
C41FXVal = readw(0x1f80);
|
||
|
C41FYVal = readw(0x1f83);
|
||
|
C41FDistVal = readw(0x1f86);
|
||
|
double tanval = sqrt(((double)C41FYVal) * ((double)C41FYVal) + ((double)C41FXVal) * ((double)C41FXVal));
|
||
|
tanval = (double)C41FDistVal / tanval;
|
||
|
C41FYVal = (int16)(((double)C41FYVal * tanval) * 0.99);
|
||
|
C41FXVal = (int16)(((double)C41FXVal * tanval) * 0.98);
|
||
|
writew(0x1f89, C41FXVal);
|
||
|
writew(0x1f8c, C41FYVal);
|
||
|
}
|
||
|
|
||
|
//Triangle
|
||
|
void Cx4::op10() {
|
||
|
r0 = ldr(0);
|
||
|
r1 = ldr(1);
|
||
|
|
||
|
r4 = r0 & 0x1ff;
|
||
|
if(r1 & 0x8000)r1 |= ~0x7fff;
|
||
|
|
||
|
mul(cos(r4), r1, r5, r2);
|
||
|
r5 = (r5 >> 16) & 0xff;
|
||
|
r2 = (r2 << 8) + r5;
|
||
|
|
||
|
mul(sin(r4), r1, r5, r3);
|
||
|
r5 = (r5 >> 16) & 0xff;
|
||
|
r3 = (r3 << 8) + r5;
|
||
|
|
||
|
str(0, r0);
|
||
|
str(1, r1);
|
||
|
str(2, r2);
|
||
|
str(3, r3);
|
||
|
str(4, r4);
|
||
|
str(5, r5);
|
||
|
}
|
||
|
|
||
|
//Triangle
|
||
|
void Cx4::op13() {
|
||
|
r0 = ldr(0);
|
||
|
r1 = ldr(1);
|
||
|
|
||
|
r4 = r0 & 0x1ff;
|
||
|
|
||
|
mul(cos(r4), r1, r5, r2);
|
||
|
r5 = (r5 >> 8) & 0xffff;
|
||
|
r2 = (r2 << 16) + r5;
|
||
|
|
||
|
mul(sin(r4), r1, r5, r3);
|
||
|
r5 = (r5 >> 8) & 0xffff;
|
||
|
r3 = (r3 << 16) + r5;
|
||
|
|
||
|
str(0, r0);
|
||
|
str(1, r1);
|
||
|
str(2, r2);
|
||
|
str(3, r3);
|
||
|
str(4, r4);
|
||
|
str(5, r5);
|
||
|
}
|
||
|
|
||
|
//Pythagorean
|
||
|
void Cx4::op15() {
|
||
|
C41FXVal = readw(0x1f80);
|
||
|
C41FYVal = readw(0x1f83);
|
||
|
C41FDist = (int16)sqrt((double)C41FXVal * (double)C41FXVal + (double)C41FYVal * (double)C41FYVal);
|
||
|
writew(0x1f80, C41FDist);
|
||
|
}
|
||
|
|
||
|
//Calculate distance
|
||
|
void Cx4::op1f() {
|
||
|
C41FXVal = readw(0x1f80);
|
||
|
C41FYVal = readw(0x1f83);
|
||
|
if(!C41FXVal) {
|
||
|
C41FAngleRes = (C41FYVal > 0) ? 0x080 : 0x180;
|
||
|
} else {
|
||
|
double tanval = ((double)C41FYVal) / ((double)C41FXVal);
|
||
|
C41FAngleRes = (short)(atan(tanval) / (PI * 2) * 512);
|
||
|
C41FAngleRes = C41FAngleRes;
|
||
|
if(C41FXVal < 0) {
|
||
|
C41FAngleRes += 0x100;
|
||
|
}
|
||
|
C41FAngleRes &= 0x1ff;
|
||
|
}
|
||
|
writew(0x1f86, C41FAngleRes);
|
||
|
}
|
||
|
|
||
|
//Trapezoid
|
||
|
void Cx4::op22() {
|
||
|
int16 angle1 = readw(0x1f8c) & 0x1ff;
|
||
|
int16 angle2 = readw(0x1f8f) & 0x1ff;
|
||
|
int32 tan1 = Tan(angle1);
|
||
|
int32 tan2 = Tan(angle2);
|
||
|
int16 y = readw(0x1f83) - readw(0x1f89);
|
||
|
int16 left, right;
|
||
|
|
||
|
for(int32 j = 0; j < 225; j++, y++) {
|
||
|
if(y >= 0) {
|
||
|
left = sar((int32)tan1 * y, 16) - readw(0x1f80) + readw(0x1f86);
|
||
|
right = sar((int32)tan2 * y, 16) - readw(0x1f80) + readw(0x1f86) + readw(0x1f93);
|
||
|
|
||
|
if(left < 0 && right < 0) {
|
||
|
left = 1;
|
||
|
right = 0;
|
||
|
} else if(left < 0) {
|
||
|
left = 0;
|
||
|
} else if(right < 0) {
|
||
|
right = 0;
|
||
|
}
|
||
|
|
||
|
if(left > 255 && right > 255) {
|
||
|
left = 255;
|
||
|
right = 254;
|
||
|
} else if(left > 255) {
|
||
|
left = 255;
|
||
|
} else if(right > 255) {
|
||
|
right = 255;
|
||
|
}
|
||
|
} else {
|
||
|
left = 1;
|
||
|
right = 0;
|
||
|
}
|
||
|
ram[j + 0x800] = (uint8)left;
|
||
|
ram[j + 0x900] = (uint8)right;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Multiply
|
||
|
void Cx4::op25() {
|
||
|
r0 = ldr(0);
|
||
|
r1 = ldr(1);
|
||
|
mul(r0, r1, r0, r1);
|
||
|
str(0, r0);
|
||
|
str(1, r1);
|
||
|
}
|
||
|
|
||
|
//Transform Coords
|
||
|
void Cx4::op2d() {
|
||
|
C4WFXVal = readw(0x1f81);
|
||
|
C4WFYVal = readw(0x1f84);
|
||
|
C4WFZVal = readw(0x1f87);
|
||
|
C4WFX2Val = read (0x1f89);
|
||
|
C4WFY2Val = read (0x1f8a);
|
||
|
C4WFDist = read (0x1f8b);
|
||
|
C4WFScale = readw(0x1f90);
|
||
|
C4TransfWireFrame2();
|
||
|
writew(0x1f80, C4WFXVal);
|
||
|
writew(0x1f83, C4WFYVal);
|
||
|
}
|
||
|
|
||
|
//Sum
|
||
|
void Cx4::op40() {
|
||
|
r0 = 0;
|
||
|
for(uint32 i=0;i<0x800;i++) {
|
||
|
r0 += ram[i];
|
||
|
}
|
||
|
str(0, r0);
|
||
|
}
|
||
|
|
||
|
//Square
|
||
|
void Cx4::op54() {
|
||
|
r0 = ldr(0);
|
||
|
mul(r0, r0, r1, r2);
|
||
|
str(1, r1);
|
||
|
str(2, r2);
|
||
|
}
|
||
|
|
||
|
//Immediate Register
|
||
|
void Cx4::op5c() {
|
||
|
str(0, 0x000000);
|
||
|
immediate_reg(0);
|
||
|
}
|
||
|
|
||
|
//Immediate Register (Multiple)
|
||
|
void Cx4::op5e() { immediate_reg( 0); }
|
||
|
void Cx4::op60() { immediate_reg( 3); }
|
||
|
void Cx4::op62() { immediate_reg( 6); }
|
||
|
void Cx4::op64() { immediate_reg( 9); }
|
||
|
void Cx4::op66() { immediate_reg(12); }
|
||
|
void Cx4::op68() { immediate_reg(15); }
|
||
|
void Cx4::op6a() { immediate_reg(18); }
|
||
|
void Cx4::op6c() { immediate_reg(21); }
|
||
|
void Cx4::op6e() { immediate_reg(24); }
|
||
|
void Cx4::op70() { immediate_reg(27); }
|
||
|
void Cx4::op72() { immediate_reg(30); }
|
||
|
void Cx4::op74() { immediate_reg(33); }
|
||
|
void Cx4::op76() { immediate_reg(36); }
|
||
|
void Cx4::op78() { immediate_reg(39); }
|
||
|
void Cx4::op7a() { immediate_reg(42); }
|
||
|
void Cx4::op7c() { immediate_reg(45); }
|
||
|
|
||
|
//Immediate ROM
|
||
|
void Cx4::op89() {
|
||
|
str(0, 0x054336);
|
||
|
str(1, 0xffffff);
|
||
|
}
|
||
|
|
||
|
#endif
|