commit db7de45483f5e2f2be3507be4c2dbc83989b7283
parent ff183d43f10bcea2870e39b941990dbe7be2da27
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Tue, 20 Sep 2022 15:38:13 -0400
cc: implement > <= >= != operators
Diffstat:
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, ;