                save
                listing off   ; kein Listing über diesen File

;****************************************************************************
;*                                                                          *
;*   AS 1.39 - Datei BITFUNCS.INC                                           *
;*   								            *
;*   Sinn : enthält Funktionen zur Bitmanipulation                          *
;* 									    *
;*   letzte Änderungen : 30. 5.1993                                         *
;*                       11. 9.1993 Meldung nur im 1.Pass                   *
;*									    *
;****************************************************************************

		ifndef   bitfuncsinc    ; verhindert Mehrfacheinbindung

bitfuncsinc     equ      1

		if	 mompass=1
		 message "Standardbitfunktionen (C) 1993 Alfred Arnold"
		endif

;----------------------------------------------------------------------------
; erstmal einige Unterfunktionen:

; liefert eine Maske in der ab 'start' 'bits' Bit gesetzt sind, z.B. zum
; Ausmaskieren einzelner Bits:

mask            function start,bits,((1<<bits)-1)<<start

; das gleiche invers zum Löschen von Bitgruppen:

invmask         function start,bits,~mask(start,bits)

; liefert die Bits 'start' bis 'start'+'bits'-1 aus 'x':

cutout          function x,start,bits,x&mask(start,bits)

;----------------------------------------------------------------------------
; einige häufig gebrauchte Sondermasken:

; oberes Byte eines 16-Bit-Wortes:

hi              function x,(x>>8)&255

; dito unteres Byte:

lo              function x,x&255

; obere Hälfte aus einem 32-Bit-Wort:

hiword          function x,(x>>16)&65535

; dito untere Hälfte:

loword          function x,x&65535

; Boolean-Funktionen, ob eine Zahl gerade oder ungerade ist:

odd             function x,(x&1)=1
even            function x,(x&1)=0

; liefert Bit 'n' aus 'x':

getbit          function x,n,(x>>n)&1

;----------------------------------------------------------------------------
; Schiebefunktionen:

; Schieben eines 'size'-Bit-Wortes um 'n' Stellen nach links oder rechts:

shln            function x,size,n,(x<<n)&mask(0,size)
shrn            function x,size,n,(x>>n)&mask(0,size-n)

; Rotation eines 'size'-Bit-Wortes um 'n' Stellen nach links oder rechts;
; der erste Term läßt die restlichen Bits unverändert und kann bei Bedarf
; gelöscht werden:

rotln           function x,size,n,cutout(x,size,32-size)|shln(x,size,n)|shrn(x,size,size-n)
rotrn           function x,size,n,cutout(x,size,32-size)|shrn(x,size,n)|shln(x,size,size-n)

                endif

                restore                 ; wieder erlauben

