aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/lib/flags.frt
diff options
context:
space:
mode:
Diffstat (limited to 'amforth-6.5/common/lib/flags.frt')
-rw-r--r--amforth-6.5/common/lib/flags.frt54
1 files changed, 54 insertions, 0 deletions
diff --git a/amforth-6.5/common/lib/flags.frt b/amforth-6.5/common/lib/flags.frt
new file mode 100644
index 0000000..43fb38b
--- /dev/null
+++ b/amforth-6.5/common/lib/flags.frt
@@ -0,0 +1,54 @@
+\ 2008-01-01 EW w4_flags.fs
+
+\ die bits einer Variablen als "flags" benutzen
+
+\ flag@ ( var bitnum -- f ) und flag! ( flag var bitnum -- )
+
+\ variable mainFlags
+\ mainFlags 0 flag: Fdebug
+\ Fdebug fset ( set bit 0 in Variable mainFlags )
+\ Fdebug fclr ( clear bit )
+\ Fdebug fset? ( true if bit is set )
+\ Fdebug fclr? ( true if bit is NOT set )
+
+\ compile time: store address and bitmask into pfa
+\ run time: fetch bitmask and address to stack
+: flag: create ( addr bit -- )
+ 1 swap lshift , ,
+does> ( -- bitmask addr )
+ dup @i swap 1+ @i
+;
+
+\ bitvalue, convert number of bit [0..7] to mask
+: bv ( bitnumber -- bitmask )
+ 1 swap lshift
+;
+
+: fset ( bitmask addr -- )
+ dup @ ( mask addr value )
+ rot ( addr value mask )
+ or ( addr new-value )
+ swap !
+;
+
+: fclr ( bitmask addr -- )
+ dup @ ( mask addr value )
+ rot ( addr value mask )
+ invert and ( addr new-value )
+ swap !
+;
+
+
+: fset? ( bitmask addr -- t/f )
+ @ and 0<>
+;
+
+: fclr? ( bitmask addr -- t/f )
+ @ and 0=
+;
+
+: ftgl ( bitmask addr -- )
+ over over ( mask addr mask addr )
+ fset?
+ if fclr else fset then
+;