duskos

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

commit f97be3fe255702eaaecff865fc5d7cfa5d5237fb
parent 9321c6237597b156433238fc40917a83e1fdc729
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Thu,  9 Mar 2023 21:36:16 -0500

hal: add flag guarantees to a few ops

Diffstat:
Mfs/doc/hal.txt | 8++++----
Mfs/xcomp/bootlo.fs | 3+--
Mposix/vm.c | 16++++++++--------
3 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/fs/doc/hal.txt b/fs/doc/hal.txt @@ -21,8 +21,8 @@ Compiler words: ps+, n -- rs+, n -- -W+n, n -- -A+n, n -- +W+n, n -- *Z* +A+n, n -- *Z* W>A, -- A>W, -- W<>A, -- @@ -32,10 +32,10 @@ Width-aware compiler words: @, op -- !, op -- @!, op -- -+, op -- ++, op -- *Z* [@], op -- [!], op -- -[+n], n op -- +[+n], n op -- *Z* lea, op -- (width aware, but has the same behavior in all widths) Conditions diff --git a/fs/xcomp/bootlo.fs b/fs/xcomp/bootlo.fs @@ -265,8 +265,7 @@ code []= ( a1 a2 u -- f ) PSP) @!, W>A, begin \ P+4=a1 P+0=u A=a2 PSP) 4 +) 8b [@], A) 8b cmp, 0 Z) branchC, 8 ps+, 0 LIT>W, exit, then - 1 A+n, 1 PSP) 4 +) [+n], -1 PSP) [+n], - PSP) @, =0>Z, NZ) branchC, drop + 1 A+n, 1 PSP) 4 +) [+n], -1 PSP) [+n], NZ) branchC, drop 8 ps+, 1 LIT>W, exit, : s= ( s1 s2 -- f ) over c@ 1+ []= ; : [if] not if S" [then]" begin word over s= until drop then ; diff --git a/posix/vm.c b/posix/vm.c @@ -180,8 +180,8 @@ static void PSADD() { vm.PSP += gpc(); } // 0x08 static void RSADD() { vm.RSP += gpc(); } static void WLIT() { vm.W = gpc(); } static void ALIT() { vm.A = gpc(); } -static void WADDN() { vm.W += gpc(); } -static void AADDN() { vm.A += gpc(); } +static void WADDN() { vm.W += gpc(); vm.Z = vm.W == 0;} +static void AADDN() { vm.A += gpc(); vm.Z = vm.A == 0;} static void W2A() { vm.A = vm.W; } static void WSWAPA() { dword n = vm.A; vm.A = vm.W; vm.W = n; } @@ -202,29 +202,29 @@ static dword readop() { static void WFETCH() { vm.W = gd(readop()); } // 0x10 static void WSTORE() { sd(readop(), vm.W); } static void WSWAP() { dword a, n; a = readop(); n = gd(a); sd(a, vm.W); vm.W = n; } -static void MADDN() { dword a = readop(); dword n=gpc(); sd(a, gd(a)+n); } +static void MADDN() { dword a = readop(); dword n=gpc(); n += gd(a); sd(a, n); vm.Z = n == 0; } static void WCMP() { vm.Z = gd(readop()) == vm.W; } static void WIFETCH() { vm.W = gd(gd(readop())); } static void WISTORE() { sd(gd(readop()), vm.W); } -static void WADD() { vm.W += gd(readop()); } +static void WADD() { vm.W += gd(readop()); vm.Z = vm.W == 0; } static void WFETCH16() { vm.W = gw(readop()); } // 0x18 static void WSTORE16() { sw(readop(), vm.W); } static void WSWAP16() { dword a, n; a = readop(); n = gw(a); sw(a, vm.W); vm.W = n; } -static void MADDN16() { dword a = readop(); dword n=gpc(); sw(a, gw(a)+(word)n); } +static void MADDN16() { dword a = readop(); dword n=gpc(); n += gw(a); sw(a, n); vm.Z = (n&0xffff) == 0; } static void WCMP16() { vm.Z = gw(readop()) == (vm.W & 0xffff); } static void WIFETCH16() { vm.W = gw(gd(readop())); } static void WISTORE16() { sw(gd(readop()), vm.W); } -static void WADD16() { vm.W += gw(readop()); } +static void WADD16() { vm.W += gw(readop()); vm.Z = vm.W == 0; } static void WFETCH8() { vm.W = gb(readop()); } // 0x20 static void WSTORE8() { sb(readop(), vm.W); } static void WSWAP8() { dword a, n; a = readop(); n = gb(a); sb(a, vm.W); vm.W = n; } -static void MADDN8() { dword a = readop(); dword n=gpc(); sb(a, gb(a)+(byte)n); } +static void MADDN8() { dword a = readop(); dword n=gpc(); n += gb(a); sb(a, n); vm.Z = (n&0xff) == 0; } static void WCMP8() { vm.Z = gb(readop()) == (vm.W & 0xff); } static void WIFETCH8() { vm.W = gb(gd(readop())); } static void WISTORE8() { sb(gd(readop()), vm.W); } -static void WADD8() { vm.W += gb(readop()); } +static void WADD8() { vm.W += gb(readop()); vm.Z = vm.W == 0; } static void WLEA() { vm.W = readop(); } // 0x28 static void BOOTRD() { ppush(fgetc(fp)); }