Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <cstdint>
- using namespace std;
- int BIT(int value, int shift) { return (value >> shift) & 1; }
- uint32_t lres;
- int32_t sres;
- uint32_t sr_n;
- uint32_t sr_z;
- uint32_t sr_s;
- uint32_t sr_c;
- uint16_t update_nzsc(uint16_t r0, uint16_t r1, uint16_t c)
- {
- sr_n = 0;
- sr_z = 0;
- sr_c = 0;
- sr_s = 0;
- uint16_t value = r0 + r1 + c;
- if (BIT(value, 15))
- sr_n = 1;
- if (uint16_t(value) == 0)
- sr_z = 1;
- if (BIT(~value & (r0 | r1), 15) | BIT(r0 & r1, 15))
- sr_c = 1;
- if (sr_c ^ BIT(r0 ^ r1, 15))
- sr_s = 1;
- return value;
- }
- int main(int argc, char* argv[])
- {
- uint16_t r0 = 0;
- do
- {
- uint16_t r1 = 0;
- if ((r0 & 0xff) == 0)
- printf("%04x\r", r0);
- do
- {
- lres = update_nzsc(r0, r1, 0);
- sres = (int16_t)r0 + (int16_t)r1;
- if ((lres ^ sres) & 0xffff)
- printf("add r0 %d r1 %d lres %d sres %d\n", lres, sres);
- else if (sr_s != (sres < 0))
- printf("add r0 %d r1 %d lres %d c %d s %d sres %d\n", r0, r1, lres, sr_c, sr_s, sres);
- else
- {
- int ov1 = (short)(~(r0 ^ r1) & (r0 ^ (lres))) < 0;
- int ov2 = sr_s != sr_n;
- if (ov1 != ov2)
- 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);
- }
- lres = update_nzsc(r0, ~r1, 1);
- sres = (int16_t)r0 - (int16_t)r1;
- if ((lres ^ sres) & 0xffff)
- printf("sub r0 %d r1 %d lres %d sres %d\n", lres, sres);
- else if (sr_s != (sres < 0))
- printf("sub r0 %d r1 %d lres %d c %d s %d sres %d\n", r0, r1, lres, sr_c, sr_s, sres);
- else
- {
- int ov1 = (short)((r0 ^ r1) & (r0 ^ lres)) < 0;
- int ov2 = sr_s != sr_n;
- if (ov1 != ov2)
- 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);
- }
- for (uint32_t c = 0; c < 2; c++)
- {
- int oc = c;
- lres = update_nzsc(r0, r1, c);
- sres = (int16_t)r0 + (int16_t)r1 + (int16_t)c;
- if ((lres ^ sres) & 0xffff)
- printf("adc r0 %d r1 %d lres %d c %d sres %d\n", lres, c, sres);
- else if (sr_s != (sres < 0))
- 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);
- lres = update_nzsc(r0, ~r1, c);
- sres = (int16_t)r0 - (int16_t)r1 - (int16_t)!c;
- if ((lres ^ sres) & 0xffff)
- printf("sbc r0 %04x r1 %04x lres %08x c %d sres %08x\n", r0, r1, lres, c, sres);
- else if (sr_s != (sres < 0))
- 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);
- }
- r1++;
- } while (r1 != 0);
- r0++;
- } while (r0 != 0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement