test_misc2_gen.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. static FILE *f;
  5. #define bswap16(x) (x=(unsigned short)((x<<8)|(x>>8)))
  6. #define bswap32(x) (x=((x<<24)|((x<<8)&0xff0000)|((x>>8)&0x00ff00)|((unsigned)x>>24)))
  7. static void write_op(unsigned short op, unsigned short word0, unsigned short word1, unsigned short word2)
  8. {
  9. bswap16(op);
  10. bswap16(word0);
  11. bswap16(word1);
  12. bswap16(word2);
  13. fwrite(&op, 1, sizeof(op), f);
  14. fwrite(&word0, 1, sizeof(word0), f);
  15. fwrite(&word1, 1, sizeof(word1), f);
  16. fwrite(&word2, 1, sizeof(word2), f);
  17. }
  18. static void write32(unsigned int a)
  19. {
  20. bswap32(a);
  21. fwrite(&a, 1, sizeof(a), f);
  22. }
  23. static int op_check(unsigned short op)
  24. {
  25. if ((op&0xf000) == 0x6000) return 0; // Bxx
  26. if ((op&0xf0f8) == 0x50c8) return 0; // DBxx
  27. if ((op&0xff80) == 0x4e80) return 0; // Jsr
  28. if ((op&0xf000) == 0xa000) return 0; // a-line
  29. if ((op&0xf000) == 0xf000) return 0; // f-line
  30. if ((op&0xfff8)==0x4e70&&op!=0x4e71&&op!=0x4e76) return 0; // reset, rte, rts
  31. if ((op&0x3f) >= 0x28) op = (op&~0x3f) | (rand() % 0x28);
  32. return 1;
  33. }
  34. static unsigned short safe_rand(void)
  35. {
  36. unsigned short op;
  37. /* avoid branch opcodes */
  38. do
  39. {
  40. op = rand();
  41. }
  42. while (!op_check(op));
  43. return op;
  44. }
  45. int main()
  46. {
  47. int i, op;
  48. srand(time(0));
  49. f = fopen("test_misc2.bin", "wb");
  50. if (!f) return 1;
  51. write32(0x00ff8000); // stack
  52. write32(0x300); // IP
  53. for (i=0x100/4-2; i; i--)
  54. {
  55. write32(0x200+i*4); // exception vectors
  56. }
  57. for (i=0x100/4; i; i--)
  58. {
  59. write32(0); // pad
  60. }
  61. for (i=0x100/4; i; i--)
  62. {
  63. write32(0x4e734e73); // fill with rte instructions
  64. }
  65. for (op = 0; op < 0x10000; op++)
  66. {
  67. if ((op&0xf000) == 0x6000) // Bxx
  68. {
  69. if ((op&0x00ff) == 0)
  70. write_op(op, 6, 0, 0);
  71. }
  72. else if ((op&0xf0f8)==0x50c8) // DBxx
  73. {
  74. write_op(op, 6, 0, 0);
  75. }
  76. else if ((op&0xff80)==0x4e80) // Jsr
  77. {
  78. int addr = 0x300 + op*8 + 8;
  79. if ((op&0x3f) == 0x39)
  80. write_op(op, addr >> 16, addr & 0xffff, 0);
  81. }
  82. else if ((op&0xf000)==0xa000 || (op&0xf000)==0xf000) // a-line, f-line
  83. {
  84. if (op != 0xa000 && op != 0xf000) continue;
  85. }
  86. else if ((op&0xfff8)==0x4e70&&op!=0x4e71&&op!=0x4e76); // rte, rts, stop, reset
  87. else
  88. {
  89. write_op(op, safe_rand(), safe_rand(), safe_rand());
  90. }
  91. }
  92. // jump to the beginning
  93. write_op(0x4ef8, 0x300, 0x4ef8, 0x300);
  94. write_op(0x4ef8, 0x300, 0x4ef8, 0x300);
  95. fclose(f);
  96. return 0;
  97. }