Advertisement
tahg

flagtest

Feb 9th, 2020
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.55 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <cstdint>
  3.  
  4. using namespace std;
  5.  
  6. int BIT(int value, int shift) { return (value >> shift) & 1; }
  7.  
  8. uint32_t lres;
  9. int32_t sres;
  10. uint32_t sr_n;
  11. uint32_t sr_z;
  12. uint32_t sr_s;
  13. uint32_t sr_c;
  14.  
  15. uint16_t update_nzsc(uint16_t r0, uint16_t r1, uint16_t c)
  16. {
  17. sr_n = 0;
  18. sr_z = 0;
  19. sr_c = 0;
  20. sr_s = 0;
  21.  
  22. uint16_t value = r0 + r1 + c;
  23.  
  24. if (BIT(value, 15))
  25. sr_n = 1;
  26.  
  27. if (uint16_t(value) == 0)
  28. sr_z = 1;
  29.  
  30. if (BIT(~value & (r0 | r1), 15) | BIT(r0 & r1, 15))
  31. sr_c = 1;
  32.  
  33. if (sr_c ^ BIT(r0 ^ r1, 15))
  34. sr_s = 1;
  35.  
  36. return value;
  37.  
  38. }
  39.  
  40.  
  41. int main(int argc, char* argv[])
  42. {
  43. uint16_t r0 = 0;
  44.  
  45. do
  46. {
  47. uint16_t r1 = 0;
  48.  
  49. if ((r0 & 0xff) == 0)
  50. printf("%04x\r", r0);
  51.  
  52. do
  53. {
  54. lres = update_nzsc(r0, r1, 0);
  55. sres = (int16_t)r0 + (int16_t)r1;
  56.  
  57. if ((lres ^ sres) & 0xffff)
  58. printf("add r0 %d r1 %d lres %d sres %d\n", lres, sres);
  59. else if (sr_s != (sres < 0))
  60. printf("add r0 %d r1 %d lres %d c %d s %d sres %d\n", r0, r1, lres, sr_c, sr_s, sres);
  61. else
  62. {
  63. int ov1 = (short)(~(r0 ^ r1) & (r0 ^ (lres))) < 0;
  64. int ov2 = sr_s != sr_n;
  65.  
  66. if (ov1 != ov2)
  67. printf("add r0 %d r1 %d lres c %d s %d ov1 %d ov2 %d\n", r0, r1, lres, sr_c, sr_s, ov1, ov2);
  68. }
  69.  
  70. lres = update_nzsc(r0, ~r1, 1);
  71. sres = (int16_t)r0 - (int16_t)r1;
  72.  
  73. if ((lres ^ sres) & 0xffff)
  74. printf("sub r0 %d r1 %d lres %d sres %d\n", lres, sres);
  75. else if (sr_s != (sres < 0))
  76. printf("sub r0 %d r1 %d lres %d c %d s %d sres %d\n", r0, r1, lres, sr_c, sr_s, sres);
  77. else
  78. {
  79. int ov1 = (short)((r0 ^ r1) & (r0 ^ lres)) < 0;
  80. int ov2 = sr_s != sr_n;
  81.  
  82. if (ov1 != ov2)
  83. printf("sub r0 %d r1 %d lres c %d s %d ov1 %d ov2 %d\n", r0, r1, lres, sr_c, sr_s, ov1, ov2);
  84. }
  85.  
  86. for (uint32_t c = 0; c < 2; c++)
  87. {
  88. int oc = c;
  89. lres = update_nzsc(r0, r1, c);
  90. sres = (int16_t)r0 + (int16_t)r1 + (int16_t)c;
  91.  
  92. if ((lres ^ sres) & 0xffff)
  93. printf("adc r0 %d r1 %d lres %d c %d sres %d\n", lres, c, sres);
  94. else if (sr_s != (sres < 0))
  95. printf("adc r0 %d r1 %d %d lres %d c %d s %d sres %d\n", r0, r1, c, lres, sr_c, sr_s, sres);
  96.  
  97. lres = update_nzsc(r0, ~r1, c);
  98. sres = (int16_t)r0 - (int16_t)r1 - (int16_t)!c;
  99.  
  100. if ((lres ^ sres) & 0xffff)
  101. printf("sbc r0 %04x r1 %04x lres %08x c %d sres %08x\n", r0, r1, lres, c, sres);
  102. else if (sr_s != (sres < 0))
  103. printf("sbc r0 %d r1 %d %d lres %d c %d s %d sres %d\n", r0, r1, c, lres, sr_c, sr_s, sres);
  104. }
  105.  
  106. r1++;
  107. } while (r1 != 0);
  108.  
  109. r0++;
  110. } while (r0 != 0);
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement