| then |
then |
| loop |
loop |
| swap 0<> ABORT" dispense: value does not fit into masked bits" ; |
swap 0<> ABORT" dispense: value does not fit into masked bits" ; |
| : embed ( x1-accu x2-val x3-mask -- x4-result ) |
: embed ( x2-val x1-accu x3-mask -- x4-result ) |
| \ encode 'val' into bits set given by mask, replacing corresponding bits in |
\ encode 'val' into bits given by mask, replacing these bits in 'accu' |
| \ 'accu' |
tuck invert and -rot \ delete corresponding bits in accu |
| dup >r dispense \ dispense value over masked bits |
dispense or ; \ dispense value over masked bits, onto accu ; |
| swap r> invert and \ delete corresponding bits in accu |
|
| or ; \ and add dispensed bits |
|
| |
|
| : mask ( +n -- mask ) \ get bitmask for lowest #n bits |
: mask ( +n -- mask ) \ get bitmask for lowest #n bits |
| 0 invert swap lshift invert ; |
0 invert swap lshift invert ; |
| |
|
| : maskinto ( "x-mask" -- runtime: x1-val x1-accu -- x2-masked ) |
: maskinto ( "x-mask" -- runtime: x1-val x1-accu -- x2-masked ) |
| \ for backwards compatability with old bitmask code |
\ for backwards compatability with old bitmask code |
| ]] swap [[ parse-word s>number drop ]]L embed [[ ; IMMEDIATE |
parse-word s>number drop ]]L embed [[ ; IMMEDIATE |