Advertisement
Guest User

Untitled

a guest
Jan 29th, 2010
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.86 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #include "n64.h"
  6.  
  7. unsigned char * SourceBuffer;
  8. unsigned char * TargetBuffer;
  9. unsigned char * TextureBuffer;
  10. int Filesize = 0;
  11. int TexFilesize = 0;
  12.  
  13. char * SourceFilename;
  14. char * TargetFilename;
  15. char * TextureFilename;
  16.  
  17. int OffsetPairs = 0;
  18. unsigned int SourceOffset[512];
  19. unsigned int TargetOffset[512];
  20.  
  21. unsigned int TextureTgtOffset;
  22.  
  23. int ConvertBuffer(unsigned char * Src, unsigned char * Tgt)
  24. {
  25.     // tag OK: command converts correctly
  26.     // tag NG: command doesn't yet convert correctly / conversion is untested / isn't yet covered
  27.     // tag XX: command is deliberately ignored
  28.  
  29.     int Pair = 0;
  30.     int Offset = 0;
  31.  
  32.     unsigned int w0 = 0, w1 = 0;
  33.  
  34.     while(Pair < OffsetPairs) {
  35.         Offset = SourceOffset[Pair];
  36.  
  37.         while(Offset < TargetOffset[Pair]) {
  38.             w0 = (Src[Offset] << 24) + (Src[Offset + 1] << 16) + (Src[Offset + 2] << 8) + Src[Offset + 3];
  39.             w1 = (Src[Offset + 4] << 24) + (Src[Offset + 5] << 16) + (Src[Offset + 6] << 8) + Src[Offset + 7];
  40.  
  41.             switch(Src[Offset]) {
  42.                 case G_SETTIMG:
  43.                     printf("- Found G_SETTIMG at 0x%06X...", Offset);
  44.  
  45.                     Tgt[Offset] = Src[Offset];
  46.                     Tgt[Offset + 1] = Src[Offset + 1];
  47.                     Tgt[Offset + 2] = Src[Offset + 2];
  48.                     Tgt[Offset + 3] = Src[Offset + 3];
  49.  
  50.                     // write address
  51.                     if(Src[Offset + 4] == 0x09) {
  52.                         // if texture originally from RAM segment 0x09 (textures)
  53.                         unsigned int new_w1 = 0x03000000 + (w1 & 0x00FFFFFF) + TextureTgtOffset;
  54.  
  55.                         Tgt[Offset + 4] = (new_w1 & 0xFF000000) >> 24;
  56.                         Tgt[Offset + 5] = (new_w1 & 0x00FF0000) >> 16;
  57.                         Tgt[Offset + 6] = (new_w1 & 0x0000FF00) >> 8;
  58.                         Tgt[Offset + 7] = (new_w1 & 0x000000FF);
  59.                     } else if(Src[Offset + 4] == 0x07) {
  60.                         // if texture originally from RAM segment 0x07 (level display lists)
  61.                         unsigned int new_w1 = 0x03000000 + (w1 & 0x00FFFFFF) + TextureTgtOffset + TexFilesize;
  62.  
  63.                         Tgt[Offset + 4] = (new_w1 & 0xFF000000) >> 24;
  64.                         Tgt[Offset + 5] = (new_w1 & 0x00FF0000) >> 16;
  65.                         Tgt[Offset + 6] = (new_w1 & 0x0000FF00) >> 8;
  66.                         Tgt[Offset + 7] = (new_w1 & 0x000000FF);
  67.  
  68.                         // WARNING: textures must manually be pasted to the end of the converted file!
  69.                     } else {
  70.                         // just write original data, results in garbage
  71.                         Tgt[Offset + 4] = Src[Offset + 4];
  72.                         Tgt[Offset + 5] = Src[Offset + 5];
  73.                         Tgt[Offset + 6] = Src[Offset + 6];
  74.                         Tgt[Offset + 7] = Src[Offset + 7];
  75.                     }
  76.  
  77.                     printf("\t\tOK\n");
  78.                     break;
  79.                 case F3D_VTX:
  80.                     printf("- Found F3D_VTX at 0x%06X...", Offset);
  81.  
  82.                     // write address
  83.                     Tgt[Offset + 4] = 0x03;
  84.                     Tgt[Offset + 5] = Src[Offset + 5];
  85.                     Tgt[Offset + 6] = Src[Offset + 6];
  86.                     Tgt[Offset + 7] = Src[Offset + 7];
  87.  
  88.                     // extract n & v0
  89.                     unsigned int n = _SHIFTR(w0, 20, 4) + 1;
  90.                     unsigned int v0 = _SHIFTR(w0, 16, 4);
  91.  
  92.                     // write n & v0
  93.                     w0 = F3DEX2_VTX << 24;
  94.                     unsigned int new_v0 = (n + v0) << 12;
  95.                     w0 += new_v0;
  96.                     unsigned int new_n = n * 2;
  97.                     w0 += new_n;
  98.                     Tgt[Offset] = (w0 & 0xFF000000) >> 24;
  99.                     Tgt[Offset + 1] = (w0 & 0x00FF0000) >> 16;
  100.                     Tgt[Offset + 2] = (w0 & 0x0000FF00) >> 8;
  101.                     Tgt[Offset + 3] = (w0 & 0x000000FF);
  102.  
  103.                     // write vtx data to target buffer
  104.                     if(Src[Offset + 4] == 0x07) {
  105.                         int vtxoffset = (w1 & 0x00FFFFFF);
  106.                         memcpy(&Tgt[vtxoffset], &Src[vtxoffset], n * 0x10);
  107.                     }
  108.  
  109.                     printf("\t\t\tOK\n");
  110.                     break;
  111.                 case F3D_TRI1:
  112.                     printf("- Found F3D_TRI1 at 0x%06X...", Offset);
  113.  
  114.                     Tgt[Offset] = F3DEX2_TRI1;
  115.                     Tgt[Offset + 1] = (Src[Offset + 5] / 0x0A) * 2;
  116.                     Tgt[Offset + 2] = (Src[Offset + 6] / 0x0A) * 2;
  117.                     Tgt[Offset + 3] = (Src[Offset + 7] / 0x0A) * 2;
  118.  
  119.                     printf("\t\t\tOK\n");
  120.                     break;
  121.                 case F3D_TRI4:
  122.                     printf("- Found F3D_TRI4 at 0x%06X... ", Offset);
  123.  
  124.                     Tgt[Offset] = F3DEX2_SPNOOP;
  125.  
  126.                     printf("\t\t\tXX\n");
  127.                     break;
  128.                 case F3D_TEXTURE:
  129.                     printf("- Found F3D_TEXTURE at 0x%06X... ", Offset);
  130.  
  131.                     Tgt[Offset] = F3DEX2_TEXTURE;
  132.                     Tgt[Offset + 1] = Src[Offset + 1];
  133.                     Tgt[Offset + 2] = Src[Offset + 2];
  134.                     Tgt[Offset + 3] = _SHIFTL(Src[Offset + 3], 1, 7);   // convert "on"
  135.  
  136.                     Tgt[Offset + 4] = Src[Offset + 4];
  137.                     Tgt[Offset + 5] = Src[Offset + 5];
  138.                     Tgt[Offset + 6] = Src[Offset + 6];
  139.                     Tgt[Offset + 7] = Src[Offset + 7];
  140.  
  141.                     printf("\t\tOK\n");
  142.                     break;
  143.                 case F3D_SETGEOMETRYMODE:
  144.                     printf("- Found F3D_SETGEOMETRYMODE at 0x%06X... ", Offset);
  145.  
  146.                     Tgt[Offset] = F3DEX2_GEOMETRYMODE;
  147.                     Tgt[Offset + 1] = 0xFF;
  148.                     Tgt[Offset + 2] = 0xFF;
  149.                     Tgt[Offset + 3] = 0xFF;
  150.  
  151.                     Tgt[Offset + 4] = 0x00;
  152.                     Tgt[Offset + 5] = Src[Offset + 5];
  153.                     Tgt[Offset + 6] = Src[Offset + 6];
  154.                     Tgt[Offset + 7] = Src[Offset + 7];
  155.  
  156.                     printf("\tOK\n");
  157.                     break;
  158.                 case F3D_CLEARGEOMETRYMODE:
  159.                     printf("- Found F3D_CLEARGEOMETRYMODE at 0x%06X... ", Offset);
  160.  
  161.                     Tgt[Offset] = F3DEX2_GEOMETRYMODE;
  162.                     Tgt[Offset + 1] = ~Src[Offset + 5];
  163.                     Tgt[Offset + 2] = ~Src[Offset + 6];
  164.                     Tgt[Offset + 3] = ~Src[Offset + 7];
  165.  
  166.                     printf("\tOK\n");
  167.                     break;
  168.                 case F3D_CULLDL:
  169.                     printf("- Found F3D_CULLDL at 0x%06X... ", Offset);
  170.  
  171.                     Tgt[Offset] = F3DEX2_SPNOOP;
  172.  
  173.                     printf("\t\t\tXX\n");
  174.                     break;
  175.                 case F3D_SETOTHERMODE_H:
  176.                     printf("- Found F3D_SETOTHERMODE_H at 0x%06X... ", Offset);
  177.  
  178.                     Tgt[Offset] = F3DEX2_SETOTHERMODE_H;
  179.                     Tgt[Offset + 1] = Src[Offset + 1];
  180.                     Tgt[Offset + 2] = Src[Offset + 2];
  181.                     Tgt[Offset + 3] = Src[Offset + 3];
  182.  
  183.                     Tgt[Offset + 4] = Src[Offset + 4];
  184.                     Tgt[Offset + 5] = Src[Offset + 5];
  185.                     Tgt[Offset + 6] = Src[Offset + 6];
  186.                     Tgt[Offset + 7] = Src[Offset + 7];
  187.  
  188.                     printf("\t\tNG\n");
  189.                     break;
  190.                 case F3D_SETOTHERMODE_L:
  191.                     printf("- Found F3D_SETOTHERMODE_L at 0x%06X... ", Offset);
  192.  
  193.                     Tgt[Offset] = F3DEX2_SETOTHERMODE_L;
  194.                     Tgt[Offset + 1] = Src[Offset + 1];
  195.                     Tgt[Offset + 2] = Src[Offset + 2];
  196.                     Tgt[Offset + 3] = Src[Offset + 3];
  197.  
  198.                     Tgt[Offset + 4] = Src[Offset + 4];
  199.                     Tgt[Offset + 5] = Src[Offset + 5];
  200.                     Tgt[Offset + 6] = Src[Offset + 6];
  201.                     Tgt[Offset + 7] = Src[Offset + 7];
  202.  
  203.                     printf("\t\tNG\n");
  204.                     break;
  205.                 case F3D_RDPHALF_1:
  206.                     printf("- Found F3D_RDPHALF_1 at 0x%06X... ", Offset);
  207.  
  208.                     Tgt[Offset] = F3DEX2_RDPHALF_1;
  209.                     Tgt[Offset + 1] = Src[Offset + 1];
  210.                     Tgt[Offset + 2] = Src[Offset + 2];
  211.                     Tgt[Offset + 3] = Src[Offset + 3];
  212.  
  213.                     Tgt[Offset + 4] = Src[Offset + 4];
  214.                     Tgt[Offset + 5] = Src[Offset + 5];
  215.                     Tgt[Offset + 6] = Src[Offset + 6];
  216.                     Tgt[Offset + 7] = Src[Offset + 7];
  217.  
  218.                     printf("\t\tOK\n");
  219.                     break;
  220.                 case F3D_MOVEMEM:
  221.                     printf("- Found F3D_MOVEMEM at 0x%06X... ", Offset);
  222.  
  223.                     Tgt[Offset] = F3DEX2_SPNOOP;
  224.  
  225.                     printf("\t\tXX\n");
  226.                     break;
  227.                 case F3D_MOVEWORD:
  228.                     printf("- Found F3D_MOVEWORD at 0x%06X... ", Offset);
  229.  
  230.                     Tgt[Offset] = F3DEX2_SPNOOP;
  231.  
  232.                     printf("\t\t\tXX\n");
  233.                     break;
  234.                 case F3D_DL:
  235.                     printf("- Found F3D_DL at 0x%06X... ", Offset);
  236.  
  237.                     Tgt[Offset] = F3DEX2_DL;
  238.                     Tgt[Offset + 1] = Src[Offset + 1];
  239.                     Tgt[Offset + 2] = Src[Offset + 2];
  240.                     Tgt[Offset + 3] = Src[Offset + 3];
  241.  
  242.                     Tgt[Offset + 4] = 0x03;
  243.                     Tgt[Offset + 5] = Src[Offset + 5];
  244.                     Tgt[Offset + 6] = Src[Offset + 6];
  245.                     Tgt[Offset + 7] = Src[Offset + 7];
  246.  
  247.                     printf("\t\t\tOK\n");
  248.                     break;
  249.                 case F3D_ENDDL:
  250.                     printf("- Found F3D_ENDDL at 0x%06X... ", Offset);
  251.  
  252.                     Tgt[Offset] = F3DEX2_ENDDL;
  253.  
  254.                     printf("\t\tOK\n");
  255.                     break;
  256.                 default:
  257.                     memcpy(&Tgt[Offset], &Src[Offset], 8);
  258.                     break;
  259.             }
  260.  
  261.             Offset += 8;
  262.         }
  263.         Pair++;
  264.     }
  265.  
  266.     return 0;
  267. }
  268.  
  269. int main(int argc, char * argv[])
  270. {
  271.     printf("SM64 Fast3D to Zelda F3DEX2 Converter\nJanuary 2010 by xdaniel\n\n");
  272.  
  273.     // check for argument count and count parity
  274.     if((argc < 7) || ((argc - 1) & 1)) {
  275.         printf("Syntax error!\n\n");
  276.         printf("Usage:\n - <source filename> <target filename> <texture filename>\n   <texture target offset> [<DList start offset> <DList end offset> ...]\n\n");
  277.         return 1;
  278.     }
  279.  
  280.     // get source and target filenames
  281.     SourceFilename = (char*) malloc(sizeof(char) * strlen(argv[1]));
  282.     strcpy(SourceFilename, argv[1]);
  283.     TargetFilename = (char*) malloc(sizeof(char) * strlen(argv[2]));
  284.     strcpy(TargetFilename, argv[2]);
  285.  
  286.     // get texture filename and target offset
  287.     TextureFilename = (char*) malloc(sizeof(char) * strlen(argv[3]));
  288.     strcpy(TextureFilename, argv[3]);
  289.     sscanf(argv[4], "%x", &TextureTgtOffset);
  290.  
  291.     // get amount of offset pairs specified
  292.     OffsetPairs = (argc - 5) / 2;
  293.  
  294.     // check if offset pairs are valid, and if yes add them to the offset arrays
  295.     int i = 0, TempSource = 0, TempTarget = 0;
  296.     while(i < OffsetPairs) {
  297.         sscanf(argv[5 + (i * 2)], "%x", &TempSource);
  298.         sscanf(argv[6 + (i * 2)], "%x", &TempTarget);
  299.         if(TempSource < TempTarget) {
  300.             SourceOffset[i] = TempSource;
  301.             TargetOffset[i] = TempTarget;
  302.         } else {
  303.             printf("Error: source offset 0x%02X greater than target 0x%02X!\n", TempSource, TempTarget);
  304.         }
  305.         i++;
  306.     }
  307.     OffsetPairs = i;
  308.  
  309.     // load texture file
  310.     printf("Loading %s...\n", TextureFilename);
  311.     FILE * file = fopen(TextureFilename, "rb");
  312.     fseek(file, 0, SEEK_END);
  313.     TexFilesize = ftell(file);
  314.     rewind(file);
  315.     TextureBuffer = (unsigned char*) malloc (sizeof(char) * TexFilesize);
  316.     fread(TextureBuffer, 1, TexFilesize, file);
  317.     fclose(file);
  318.  
  319.     // load source file and create buffers
  320.     printf("Loading %s, creating buffers...\n", SourceFilename);
  321.     file = fopen(SourceFilename, "rb");
  322.     Filesize = TextureTgtOffset + TexFilesize;
  323.     SourceBuffer = (unsigned char*) malloc (sizeof(char) * Filesize);
  324.     fread(SourceBuffer, 1, Filesize, file);
  325.     TargetBuffer = (unsigned char*) malloc (sizeof(char) * Filesize);
  326.     memset(TargetBuffer, 0x00, Filesize);
  327.     fclose(file);
  328.  
  329.     // do the conversion!
  330.     printf("Converting F3D to F3DEX2...\n");
  331.     ConvertBuffer(SourceBuffer, TargetBuffer);
  332.  
  333.     // copy texture buffer to the converted buffer
  334.     memcpy(&TargetBuffer[TextureTgtOffset], TextureBuffer, TexFilesize);
  335.  
  336.     // save the converted buffer back to file
  337.     printf("Saving converted buffer to %s...\n", TargetFilename);
  338.     file = fopen(TargetFilename, "wb");
  339.     fwrite(TargetBuffer, 1, Filesize, file);
  340.     fclose(file);
  341.  
  342.     // we're done
  343.     printf("\nDone!\n");
  344.  
  345.     return 0;
  346. }
  347.  
  348. ----
  349.  
  350. #define _SHIFTL( v, s, w )  \
  351.     (((unsigned int)v & ((0x01 << w) - 1)) << s)
  352. #define _SHIFTR( v, s, w )  \
  353.     (((unsigned int)v >> s) & ((0x01 << w) - 1))
  354.  
  355. #define G_SETTIMG               0xFD
  356.  
  357. #define F3D_SPNOOP              0x00
  358. #define F3D_MTX                 0x01
  359. #define F3D_RESERVED0           0x02
  360. #define F3D_MOVEMEM             0x03
  361. #define F3D_VTX                 0x04
  362. #define F3D_RESERVED1           0x05
  363. #define F3D_DL                  0x06
  364. #define F3D_RESERVED2           0x07
  365. #define F3D_RESERVED3           0x08
  366. #define F3D_SPRITE2D_BASE       0x09
  367. #define F3D_TRI1                0xBF
  368. #define F3D_CULLDL              0xBE
  369. #define F3D_POPMTX              0xBD
  370. #define F3D_MOVEWORD            0xBC
  371. #define F3D_TEXTURE             0xBB
  372. #define F3D_SETOTHERMODE_H      0xBA
  373. #define F3D_SETOTHERMODE_L      0xB9
  374. #define F3D_ENDDL               0xB8
  375. #define F3D_SETGEOMETRYMODE     0xB7
  376. #define F3D_CLEARGEOMETRYMODE   0xB6
  377. #define F3D_QUAD                0xB5
  378. #define F3D_RDPHALF_1           0xB4
  379. #define F3D_RDPHALF_2           0xB3
  380. #define F3D_RDPHALF_CONT        0xB2
  381. #define F3D_TRI4                0xB1
  382.  
  383. #define F3DEX2_VTX              0x01
  384. #define F3DEX2_MODIFYVTX        0x02
  385. #define F3DEX2_CULLDL           0x03
  386. #define F3DEX2_BRANCH_Z         0x04
  387. #define F3DEX2_TRI1             0x05
  388. #define F3DEX2_TRI2             0x06
  389. #define F3DEX2_QUAD             0x07
  390. #define F3DEX2_RDPHALF_2        0xF1
  391. #define F3DEX2_SETOTHERMODE_H   0xE3
  392. #define F3DEX2_SETOTHERMODE_L   0xE2
  393. #define F3DEX2_RDPHALF_1        0xE1
  394. #define F3DEX2_SPNOOP           0xE0
  395. #define F3DEX2_ENDDL            0xDF
  396. #define F3DEX2_DL               0xDE
  397. #define F3DEX2_LOAD_UCODE       0xDD
  398. #define F3DEX2_MOVEMEM          0xDC
  399. #define F3DEX2_MOVEWORD         0xDB
  400. #define F3DEX2_MTX              0xDA
  401. #define F3DEX2_GEOMETRYMODE     0xD9
  402. #define F3DEX2_POPMTX           0xD8
  403. #define F3DEX2_TEXTURE          0xD7
  404. #define F3DEX2_DMA_IO           0xD6
  405. #define F3DEX2_SPECIAL_1        0xD5
  406. #define F3DEX2_SPECIAL_2        0xD4
  407. #define F3DEX2_SPECIAL_3        0xD3
  408.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement