123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #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);
- 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 {
- 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
|