1		ifndef   bitfuncsinc    ; avoid multiple inclusion
2bitfuncsinc     equ      1
3
4                save
5                listing off   ; no listing over this file
6
7;****************************************************************************
8;*                                                                          *
9;*   AS 1.42 - File BITFUNCS.INC                                            *
10;*   								            *
11;*   Contains Functions For Bit Manipulation                                *
12;*									    *
13;****************************************************************************
14
15		if	 mompass=1
16		 message "Standard Bit Manipulation Functions (C) 1993 Alfred Arnold"
17		endif
18
19;----------------------------------------------------------------------------
20; some sub-functions for a start:
21
22; delivers a mask with 'bits' bits set, starting at position 'start', used for
23; masking individual bits:
24
25mask            function start,bits,((1<<bits)-1)<<start
26
27; the same in inverted form to clear bit groups:
28
29invmask         function start,bits,~mask(start,bits)
30
31; delivers the bits from 'start' to 'start'+'bits'-1 from 'x':
32
33cutout          function x,start,bits,x&mask(start,bits)
34
35;----------------------------------------------------------------------------
36; some commonly used bit masks:
37
38; upper byte of a 16 bit word:
39
40hi              function x,(x>>8)&255
41
42; the same for the lower byte:
43
44lo              function x,x&255
45
46; upper half of a 32 bit word:
47
48hiword          function x,(x>>16)&65535
49
50; the same for the lower half:
51
52loword          function x,x&65535
53
54; boolean functions, whether a number is odd or even::
55
56odd             function x,(x&1)=1
57even            function x,(x&1)=0
58
59; delivers bit 'n' from 'x':
60
61getbit          function x,n,(x>>n)&1
62
63;----------------------------------------------------------------------------
64; Shift Functions:
65
66; Shift a word of 'size' bits by 'n' positions to the left or right:
67
68shln            function x,size,n,(x<<n)&mask(0,size)
69shrn            function x,size,n,(x>>n)&mask(0,size-n)
70
71; Rotate a word of 'size' bits by 'n' positions to the left or right;
72; the first sub-term leaves the remaining bits unchanged and may be deleted if undesired:
73
74rotln           function x,size,n,cutout(x,size,32-size)|shln(x,size,n)|shrn(x,size,size-n)
75rotrn           function x,size,n,cutout(x,size,32-size)|shrn(x,size,n)|shln(x,size,size-n)
76
77                restore                 ; allow listing again
78
79                endif			; bitfuncsinc
80
81