; 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 .