diff --git a/libb/6502.b b/libb/6502.b index 234b283b..dc19cd61 100644 --- a/libb/6502.b +++ b/libb/6502.b @@ -40,11 +40,30 @@ realloc(ptr, size) { with the `divmod` test */ _div(a, b) { - auto d; + auto d, sign; + sign = 0; + if (a < 0) { + sign = !sign; + a = -a; + } + if (b < 0) { + sign = !sign; + b = -a; + } + d = 0; while(a >= b) { a = a - b; d++; } + if (sign) d = -d; + return (d); +} +_udiv(a, b) { + auto d; + d = 0; while(a >= b | a < 0) { + a = a - b; + d++; + } return (d); } @@ -58,18 +77,29 @@ _rem (a, b) { } return (a); } +_urem(a, b) { + auto d; + while(a >= b | a < 0) { + a = a - b; + } + return (a); +} printn(n, b, sign) { - auto a, c, d; + auto a, c, d, __div, __rem; + + /* use correct div/rem based on sign */ + __div = sign ? &_div : &_udiv; + __rem = sign ? &_rem : &_urem; if (sign & n < 0) { putchar('-'); n = -n; } - if(a=_div(n, b)) /* assignment, not test for equality */ + if(a=__div(n, b)) /* assignment, not test for equality */ printn(a, b, 0); /* recursive */ - c = _rem(n,b) + '0'; + c = __rem(n,b) + '0'; if (c > '9') c += 7; putchar(c); } @@ -106,7 +136,7 @@ printf(str, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15) { while (c = char(*arg, j++)) { putchar(c); } - } else if (c == 'z') { /* hack for %zu */ + } else if ((c == 'z') | (c == 'l')) { /* hack for %zu %lu, % */ c = '%'; goto while_end; } else { diff --git a/tests.json b/tests.json index ab054f6f..cd4807ec 100644 --- a/tests.json +++ b/tests.json @@ -830,14 +830,14 @@ "comment": "" }, "uxn": { - "expected_stdout": "69\n1000000\n123456789987654321\n", + "expected_stdout": "69\n16960\n64177\n", "state": "Enabled", - "comment": "" + "comment": "Since uxn word size is 16 we expect such big literals to get truncated accordingly. 1000000 == 0xf4240 -> 16960 == 0x4240. 123456789987654321 == 0x1b69b4be052fab1 -> 64177 == 0xfab1" }, "6502": { - "expected_stdout": "69\r\n1000000\r\n123456789987654321\r\n", + "expected_stdout": "69\r\n16960\r\n64177\r\n", "state": "Enabled", - "comment": "" + "comment": "Since 6502 word size is 16 we expect such big literals to get truncated accordingly. 1000000 == 0xf4240 -> 16960 == 0x4240. 123456789987654321 == 0x1b69b4be052fab1 -> 64177 == 0xfab1" }, "gas-x86_64-darwin": { "expected_stdout": "69\n1000000\n123456789987654321\n",