.title Putbit (Re)Set a bit in a bit vector .ident /000001/ ; ;+ ; ; Index Getbit() ; Index Putbit() ; ; Usage ; ; int abit; /* 0 or 1 */ ; char bits[...]; /* bit vector */ ; ; putbit(bits,bitnumber,abit); ; ; Description ; ; The complement of Getbit() is Putbit(). ; Together they define a way of handling bit vectors that is ; somewhat independent of your computer architecture. ; ; Putbit() sets a nominated bit to 1 or 0. ; The first bit of the vector is ordinated 0. ; ; Bugs ; Written because DECUS C would not compile putbit.c correctly. ; ;- ; Edit history ; ; 000001 Original DLE .psect c$code ; C$PMTR (R5): 1st arg bit vector address ; C$PMTR+2(R5) 2nd arg bit number ; C$PMTR+4(R5) 3rd arg bit value PUTBIT:: jsr r5,csv$ .if eq,0 mov c$pmtr+2(r5),r1 sxt r0 div #8.,r0 ; r0:byte_number r1:bit_number .iff mov c$pmtr+2(r5),r1 mov r1,r0 bic #177770,r1 ; r1:bit_number asr r0 asr r0 asr r0 .endc bic #160000,r0 ; r0:byte_number add c$pmtr(r5),r0 ; r0:byte_address mov #1,r2 ash r1,r2 ; r2:mask movb @r0,r3 ; r3:byte bicb r2,r3 ; knock it down bit #1,c$pmtr+4(r5) ; EQ if we want 0 beq 10$ bisb r2,r3 ; woops, knock it up 10$: movb r3,@r0 jmp cret$ .end