mkt1.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include <stdio.h>
  2. #include <string.h>
  3. static FILE *fo = NULL;
  4. static void out(int r, int is_last)
  5. {
  6. if (!is_last)
  7. {
  8. fprintf(fo, " or $t%i, $t%i, $a2\n", r, r);
  9. fprintf(fo, " sb $t%i, %i($a0)\n", r, r);
  10. }
  11. else
  12. {
  13. fprintf(fo, " or $t%i, $t%i, $a2\n", r, r);
  14. fprintf(fo, " jr $ra\n");
  15. fprintf(fo, " sb $t%i, %i($a0)\n", r, r);
  16. }
  17. }
  18. unsigned char pattern_db[0x100];
  19. static int check_label(unsigned char i)
  20. {
  21. if (!pattern_db[i]) {
  22. fprintf(fo, "tile%i%i%i%i%i%i%i%i:\n", (i&0x80)?1:0, (i&0x40)?1:0, (i&0x20)?1:0, (i&0x10)?1:0,
  23. (i&0x08)?1:0, (i&0x04)?1:0, (i&0x02)?1:0, (i&0x01)?1:0);
  24. pattern_db[i] = 1;
  25. return 0;
  26. }
  27. return 1;
  28. }
  29. int main()
  30. {
  31. int i;
  32. fo = fopen("out.s", "w");
  33. if (!fo) return 1;
  34. memset(pattern_db, 0, sizeof(pattern_db));
  35. for (i = 0xff; i > 0; i--)
  36. {
  37. if (check_label(i)) continue;
  38. if (i & 0x01) out(0, !(i&0xfe));
  39. check_label(i&0xfe);
  40. if (i & 0x02) out(1, !(i&0xfc));
  41. check_label(i&0xfc);
  42. if (i & 0x04) out(2, !(i&0xf8));
  43. check_label(i&0xf8);
  44. if (i & 0x08) out(3, !(i&0xf0));
  45. check_label(i&0xf0);
  46. if (i & 0x10) out(4, !(i&0xe0));
  47. check_label(i&0xe0);
  48. if (i & 0x20) out(5, !(i&0xc0));
  49. check_label(i&0xc0);
  50. if (i & 0x40) out(6, !(i&0x80));
  51. check_label(i&0x80);
  52. if (i & 0x80) out(7, 1);
  53. }
  54. fclose(fo);
  55. return 0;
  56. }