Forth
http://www.fforum.winglion.ru/

Описание битовых полей и работа с ними
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2902
Страница 1 из 1

Автор:  mOleg [ Чт дек 06, 2012 19:01 ]
Заголовок сообщения:  Описание битовых полей и работа с ними

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

Автор:  dynamic-wind [ Чт дек 06, 2012 20:39 ]
Заголовок сообщения:  Re: Описание битовых полей и работа с ними

Заметил магическое число 32 :twisted:

Автор:  mOleg [ Чт дек 06, 2012 21:18 ]
Заголовок сообщения:  Re: Описание битовых полей и работа с ними

dynamic-wind писал(а):
Заметил магическое число 32

ну, можно и так:
32 CONSTANT WIDTH
...

или, скажем:
0 >L -1 BEGIN 1 LSHIFT *WHILE 1 L+ REPEAT DROP L> CONSTANT WIDTH

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/