duskos

dusk os fork
git clone git://git.alexwennerberg.com/duskos
Log | Files | Refs | README | LICENSE

commit 6d37181369052b92f1aa59e129d86562a0066b61
parent c67fc35682103fff78f9e9b9281ac77dd4a1ed11
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Wed, 23 Nov 2022 08:48:33 -0500

emul/uxn: CC was fine, it was me who was stupid

Diffstat:
Mfs/emul/uxn/vm.c | 41+++++++++++++----------------------------
1 file changed, 13 insertions(+), 28 deletions(-)

diff --git a/fs/emul/uxn/vm.c b/fs/emul/uxn/vm.c @@ -37,13 +37,12 @@ static void error(int code) { abort(); } -// TODO: have pointer arithmetics strong enough to use something like this: -// static unsigned short gw(unsigned short *a) { return *a<<8|*(a+1); } -// static void sw(unsigned short *a, unsigned short val) { -// *a = val>>8; *(a+1) = val; } +static unsigned short gw(unsigned char *a) { return *a<<8|*(a+1); } +static void sw(unsigned char *a, unsigned short val) { + *a = val>>8; *(a+1) = val; } static unsigned short signext(unsigned short val) { - // TODO: allow sign-extending through typecasting + // TODO: allow sign-extending through typecasting if (val >= $80) return val - $100; else return val; } @@ -52,13 +51,12 @@ static void push8(Stack *s, unsigned char val) { } static void push16(Stack *s, unsigned short val) { if (s->ptr >= $fe) { error(2); } else { - s->dat[s->ptr] = val >> 8; - s->dat[s->ptr+1] = val; + sw(&s->dat[s->ptr], val); s->ptr += 2 ; } } static void pushs(Stack *s, unsigned short val) { - if (bs) push16(s, val); else push8(s, val); } + if (bs) push16(s, val); else push8(s, val); } static void push(unsigned short val) { pushs(src, val); } static unsigned char pop8() { @@ -68,29 +66,16 @@ static unsigned short pop16() { unsigned short val; if (*sp <= 1) { error(0); } else { *sp -= 2; - val = src->dat[*sp] << 8; - val |= src->dat[*sp+1]; - return val; + return gw(&src->dat[*sp]); } } static unsigned short pop() { if (bs) return pop16(); else return pop8(); } static void poke(unsigned short addr, unsigned short val) { - if (bs) { - ram[addr] = val >> 8; - ram[addr+1] = val; - } else { - ram[addr] = val; - } -} + if (bs) sw(&ram[addr], val); else ram[addr] = val; } static unsigned short peek(unsigned short addr) { - if (bs) { - return (ram[addr] << 8) | ram[addr+1]; - } else { - return ram[addr]; - } -} + if (bs) return gw(&ram[addr]); else return ram[addr]; } static void warp(unsigned short addr) { if (bs) { @@ -150,13 +135,13 @@ static void DEI() { Device *d = &dev[port>>4]; port &= $f; if (bs) { - val = d->dei(d, port++) << 8; + val = d->dei(d, port++) << 8; port &= $f; - val |= d->dei(d, port); + val |= d->dei(d, port); } else { - val = d->dei(d, port); + val = d->dei(d, port); } - push(val); + push(val); } static void DEO() { unsigned char port = pop8();