; Routines to set, test and reset a bit within a byte
;
; Declarations are as follows:
;
;    type       byte = 0..255;
;
;    procedure  bset( var x: byte; y: byte ); external;
;    procedure reset( var x: byte; y: byte ); external;
;    function   test(     x: byte; y: byte ): boolean; external;
;
; If these routines are passed an integer instead of a byte (reference
; parameters only) these routines will set/reset the low order byte.
;
        entry    bset,reset,test

bset:   pop      d              ; get return address
        pop      b              ; get variable size & bit to set
        pop      h              ; get variable address
        dcr      b              ; check for var of size 1
        cnz      sizpatch       ; otherwise fix the pointer
        xra      a              ; clear acc
        stc                     ; set carry
        mov      b,c            ; counter (0..7) to b
        inr      b              ; increment counter ( now between 1 & 8 )
setloop:adc      a              ; shift left 1 bit
        djnz     setloop        ; now A has the bit in the correct position
        ora      m              ; set the new bit
        mov      m,a            ; return to the var
        xchg                    ; hl <- return address
        xra      a              ; clear acc
        pchl                    ; return

reset:  pop      d              ; get return address
        pop      b              ; get variable size & bit to reset
        pop      h              ; get variable address
        dcr      b              ; check for var of size 1
        cnz      sizpatch       ; otherwise fix the pointer
        xra      a              ; clear acc
        stc                     ; set carry
        mov      b,c            ; counter (0..7) to b
        inr      b              ; increment counter ( now between 1 & 8 )
rstloop:adc      a              ; shift left 1 bit
        djnz     rstloop        ; now A has the bit in the correct position
        cma                     ; complement accumulator
        ana      m              ; set the new bit
        mov      m,a            ; return to the var
        xchg                    ; hl <- return address
        xra      a              ; clear acc
        pchl                    ; return

test:   pop      h              ; get return address
        pop      d              ; get variable and bit to test
        xra      a              ; clear acc
        stc                     ; set carry
        mov      b,e
        inr      b              ; increment counter ( now between 1 & 8 )
tstloop:adc      a              ; shift left 1 bit
        djnz     tstloop        ; now A has the bit in the correct position
        ana      d              ; set the new bit
        jrz      testdone       ; test is done if we have a zero
        xra      a              ; clear acc
        stc                     ; and set carry to indicate true
testdone:
        pchl                    ; return



sizpatch:
        dcx      h              ; point to the low byte of a two byte number
        ret                     ; and return.

        end
