duskos

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

commit db7de45483f5e2f2be3507be4c2dbc83989b7283
parent ff183d43f10bcea2870e39b941990dbe7be2da27
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Tue, 20 Sep 2022 15:38:13 -0400

cc: implement > <= >= != operators

Diffstat:
Mfs/app/cos/tools/blkpack.c | 18+++++++++---------
Mfs/asm/i386.fs | 1+
Mfs/cc/gen.fs | 12++++++------
Mfs/cc/vm/forth.fs | 10+++++++++-
Mfs/cc/vm/i386.fs | 4++++
5 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/fs/app/cos/tools/blkpack.c b/fs/app/cos/tools/blkpack.c @@ -1,6 +1,5 @@ // This doesn't actually work, I'm just drafting how it would look. -// TODO: add while -// TODO: have support for 8/16 bit wide operations +// all ast errors are fixed, we're down to vm error. #[ 10 const BUMP_GRANULARITY ]# @@ -51,13 +50,14 @@ extern void blkpack() { while (1) { blkid = expectmarker(line); if ((blkid == 0) && (prevblkid >= 0)) { - blkoff = (prevblkid / BUMP_GRANULARITY + 1) * BUMP_GRANULARITY; + blkoff = (prevblkid / #[ BUMP_GRANULARITY c]# + 1) * #[ BUMP_GRANULARITY c]# ; fprintf( blkoff, "Block 0 encountered. Bumping current blkid to %d.\n", ConsoleOut()); } - blkid += blkoff; + // TODO: add += + blkid = blkid + blkoff; if (blkid <= prevblkid) { fprintf( blkid, lineno, @@ -70,18 +70,18 @@ extern void blkpack() { lineno++; line = readline(); cnt = strlen(line); - if (cnt <= 0) break; // EOF + if (cnt <= 0) { break; } // EOF if (cnt > 65) { fprintf( lineno, blkid, "Line %d too long (blk %d)\n", ConsoleOut()); abort(); } - if (getmarker(line) >= 0) break; // we have a marker early - line[cnt-1] = '\0'; // remove newline + if (getmarker(line) >= 0) { break; } // we have a marker early + line[0]--; // remove newline puts(line); // pad line to 64 chars - for (i=cnt-1; i<64; i++) stdout(' '); + for (i=cnt-1; i<64; i++) { stdout(' '); } } if (blkline == 16) { lineno++; @@ -91,7 +91,7 @@ extern void blkpack() { // fill to 16 lines emptylines(16-blkline); } - if (!cnt) return; // EOF + if (!cnt) { return; } // EOF prevblkid = blkid; } } diff --git a/fs/asm/i386.fs b/fs/asm/i386.fs @@ -212,6 +212,7 @@ $04e9 op jmp, $02e8 op call, $0400f7 op mul, $0600f7 op div, $0300f7 op neg, $0200f7 op not, $0100ff op dec, $0000ff op inc, $000f9f op setg, $000f9c op setl, $000f97 op seta, $000f92 op setb, +$000f9d op setge, $000f9e op setle, $000f93 op setae, $000f96 op setbe, $000f94 op setz, $000f95 op setnz, $000f92 op setc, $000f93 op setnc, $020f01 op lgdt, $030f01 op lidt, diff --git a/fs/cc/gen.fs b/fs/cc/gen.fs @@ -100,12 +100,12 @@ BOPSCNT wordtbl bopgentblpost ( -- ) :w ( / ) abort" TODO" ; 'w vm<<, 'w vm>>, -'w vm<, ( < ) -:w ( > ) abort" TODO" ; -:w ( <= ) abort" TODO" ; -:w ( >= ) abort" TODO" ; -'w vm==, ( == ) -:w ( != ) abort" TODO" ; +'w vm<, +'w vm>, +'w vm<=, +'w vm>=, +'w vm==, +'w vm!=, :w ( & ) vm&, ; :w ( ^ ) vm^, ; :w ( | ) vm|, ; diff --git a/fs/cc/vm/forth.fs b/fs/cc/vm/forth.fs @@ -157,9 +157,17 @@ binop vm|, or or binop vm^, xor xor binop vm<<, lshift lshift binop vm>>, rshift rshift -: s< $80000000 + swap $80000000 + swap < ; +: _s $80000000 + swap $80000000 + swap ; +: s< _s < ; binop vm<, s< < +: s> _s > ; +binop vm>, s> > +: s<= _s <= ; +binop vm<=, s<= <= +: s>= _s >= ; +binop vm>=, s>= >= binop vm==, = = +binop vm!=, <> <> binop vm&&, and and binop vm||, or and diff --git a/fs/cc/vm/i386.fs b/fs/cc/vm/i386.fs @@ -254,7 +254,11 @@ struct+[ VMOp vmop :>reg vmop :compile vmop^ :compile cmp, vmop^ :init vmop :compile 0 i) mov, ; : vm<, _ vmop :compile vmop type typeunsigned? if setb, else setl, then ; +: vm>, _ vmop :compile vmop type typeunsigned? if seta, else setg, then ; +: vm<=, _ vmop :compile vmop type typeunsigned? if setbe, else setle, then ; +: vm>=, _ vmop :compile vmop type typeunsigned? if setae, else setge, then ; : vm==, _ vmop :compile setz, ; +: vm!=, _ vmop :compile setnz, ; : _ ( 'w -- ) vmop :compile vmop^ :compile execute vmop^ :init vmboolify, ;