'===========================================================================
' Subject: BIT MANIPULATORS LIBRARY           Date: 10-05-92 (12:35)       
'  Author: Luis Espinoza                      Code: ASM, QB, PDS           
'  Origin: QBTIPS_H.DOC                     Packet: ASMCODE.ABC
'===========================================================================
' Bitman.Bi
' Bit Manipulators Library
' Written By: Luis Espinoza
' This Library is PUBLIC DOMAIN
' All functions return the result
' Bit% range 0-15
' Byte% is a 16 bit word (Integer) to look at
' Byte2% is an integer for the math functions (Band,Bor,Bxor)

declare function LShift%(ByVal Byte%,ByVal Bit%)        'Shift Left
declare function RShift%(ByVal Byte%,ByVal Bit%)        'Shift Right
declare function ReadBit%(ByVal Byte%,ByVal Bit%)       'Read Bit in Byte
declare function ResetBit%(ByVal Byte%,ByVal Bit%)      'Reset Bit in Byte (0)
declare function SetBit%(ByVal Byte%,ByVal Bit%)        'Set Bit in Byte (1)
declare function ToggleBit%(ByVal Byte%,ByVal Bit%)     'Toggle Bit
declare function Band%(ByVal Byte1%,ByVal Byte2%)       'Binary And
declare function Bor%(ByVal Byte1%,ByVal Byte2%)        'Binary Or
declare function BXor%(ByVal Byte1%,ByVal Byte2%)       'Binary Xor
declare function BOC%(ByVal Byte1%)                     'Ones Compliment

;Written in TASM

.Model Medium, Basic
.Code BITMAN

LSHIFT  proc, ByteVal:Word, Bit:Word

        mov     ax,[ByteVal]
        mov     cx,[Bit]
        shl     ax,cl
        ret

LSHIFT  endp

RSHIFT  proc, ByteVal:Word, Bit:Word

        mov     ax,[ByteVal]
        mov     cx,[Bit]
        shr     ax,cl
        ret

RSHIFT  endp

READBIT proc, ByteVal:Word, Bit:Word

        mov     ax,[ByteVal]
        mov     dx,1
        mov     cx,[Bit]
        shl     dx,cl
        test    dx,ax
        je      @1
        mov     ax,1
        jmp     @2
@1:
        xor     ax,ax
@2:
        ret
READBIT endp
	

RESETBIT proc, ByteVal:Word, Bit:Word

        mov     ax,1
        mov     cx,[Bit]
        shl     ax,cl
        mov     dx,[ByteVal]
        not     dx
        and     ax,dx
        ret

RESETBIT endp

SETBIT  proc, ByteVal:Word, Bit:Word

        mov     ax,1
        mov     cx,[Bit]
        shl     ax,cl
        or      ax,[ByteVal]
        ret

SETBIT  endp

TOGGLEBIT proc, ByteVal:Word, Bit:Word

        mov     ax,1
        mov     cx,[Bit]
        shl     ax,cl
        xor     ax,[ByteVal]
        ret

TOGGLEBIT endp

BAND    proc, ByteVal1:Word, ByteVal2:Word

        mov     ax,[ByteVal1]
        and     ax,[ByteVal2]
        ret

BAND    endp

BOR     proc, ByteVal1:Word, ByteVal2:Word

        mov     ax,[ByteVal1]
        or      ax,[ByteVal2]
        ret

BOR     endp

BXOR    proc, ByteVal1:Word, ByteVal2:Word

        mov     ax,[ByteVal1]
        xor     ax,[ByteVal2]
        ret

BXOR    endp

BOC     proc, ByteVal1:Word

        mov     ax,[ByteVal1]
        not     ax
        ret

BOC     endp

        public  READBIT
        public  TOGGLEBIT
        public  RESETBIT
        public  SETBIT
        public  RSHIFT
        public  LSHIFT
        public  BXOR
        public  BOR
        public  BAND
        public  BOC
        end



CLS:?STRING$(50,177):?"Creating: BITMAN.OBJ with Postit!"
DEFINT A-Z:FOR A=0 TO 6:P(A)=2^A:NEXT:OPEN "B",1,"BITMAN.OBJ"
T$="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789()"
G"aYaakiusu1uqo5sqt1eOiccaaaav1jNyVbsqZnxzTjgBLjhiGyvzYnxAV5giY4s
G"nXiiIsaaqPhdJVJHccLevnfKtUe0unvkIdaaqPZKLcaaaOH4aaauOuAPeaSGqjr
G"vtb50xuvewurWqprurpJ5baGeaaiWabmHLmaqbFruqufebefevbjmMhaasaaabf
G"eWdw2aagiusu1uqorWqprur9H5baGeQayWbbmMLiaGbeDKupvfulQjbaGW)cKfK
G"paaadGGufnvrujusuTdaaKlKkaaadmGqpneNaaa8qQaaamWac9Kuccaa7dzdaaW
G"agmvrujusuffaa4dKlaaadqGqy9KupcaauczdaaWagi1uiLKru9aaaShKlaaadq
G"Gqb5er1baaudPdaaWahivrbrKqjrLhaaWpq2aaamGbmnfsjzevaaaaqcjeaaWaj
G"q1thDetfjusungaaafIeaaqIgqKGYkadaaavTi7lAecl6KbtdExktaavTi7lAec
G"l6KbtJExktaavTi7lAec6gaal6KbtlEHqtxb4gaaRlWma3LYeaqvlYoUbaWIozW
G"0GVOviCV0JiCxktaavTi74gaal6Kbtd(cgHqxktaavTi74gaal6Kbtd(mgHqxkt
G"aavTi7lAecJyKbDPmbau1ISVOriSGrg0LYeaqvlY(IgHWmgzqxktaavTi7lAKb3
G"dDxklaaGROaaaaD"
N=531:K=255:IF LEN(C$)<>708 THEN ?"Incomplete script file!":BEEP:END
FOR A=1 TO N:LOCATE 1:?STRING$(50*(A/N),8):IF L=0 THEN GOSUB G:L=6
W=T\P(6-L):GOSUB G:W=W OR T*P(L):L=L-2:B$=CHR$(W AND K):PUT 1,,B$:NEXT
?:IF C<>86 THEN ?"Bad checksum!":BEEP:END ELSE ?"Success!":END
G:I=I+1:T=INSTR(T$,MID$(C$,I,1))-1:C=(C+T)*2:C=C\256+(C AND
255):RETURN
SUB G(A$):SHARED C$:C$=C$+LEFT$(A$,63):END SUB
