source file: bfields.fts
\ 23.11.2012 mOleg
\ Copyright [C] 2012 mOleg mOlegg@ya.ru
\ описание битовых полей
math/ asmadd.fts
math/ double.fts
\ по смещению disp битового поля длиной # бит определить маску для битового
\ поля, таким образом, что AND с данной маской оставит только нужные биты
: mask ( disp # --> mask ) BIT 1 - SWAP LSHIFT ;
\ создать описатель битового поля длиной # бит со смещением boff бит влево
: FLD[] ( boff # / name --> boff ) >L
CREATE DUP 32 /MOD , L@ mask , L> +
( base --> mask addr )
DOES> D@ ROT + ;
\ создать описатель битового поля длиной 1 бит со смещением boff бит влево
: BIT[] ( boff / name --> boff ) 1 FLD[] ;
?DEFINED test{ \EOF -- тестовая секция ---------------------------------------
test{
\ описание структуры битового поля
0 \ начальное битовое смещение
BIT[] first \ поле размером в один бит (битовый флаг)
3 FLD[] second \ поле размером в три бита
BIT[] thrid
BIT[] fourth
2 FLD[] fifth
2 FLD[] sixth
8 FLD[] seventh
2 FLD[] eighth
BIT[] nineth
DROP
10 first 10 <> THROW 0x00000001 <> THROW
10 second 10 <> THROW 0x0000000E <> THROW
10 thrid 10 <> THROW 0x00000010 <> THROW
10 fourth 10 <> THROW 0x00000020 <> THROW
10 fifth 10 <> THROW 0x000000C0 <> THROW
10 sixth 10 <> THROW 0x00000300 <> THROW
10 seventh 10 <> THROW 0x0003FC00 <> THROW
10 eighth 10 <> THROW 0x000C0000 <> THROW
10 nineth 10 <> THROW 0x00100000 <> THROW
}test