; setbit.s
%pragma once
bits 16

; Setbit :: bitmap *seg:addr -> int16 bitno -> bool value -> void
Setbit:
    enter 0,0
    pusha
    chseg(es,[bp+4])

    mov si,[bp+6]   ; si=bitmap addr
    mov ax,[bp+8]   ; ax=bitno
    mov bx,[bp+10]   ; bl=new val

    xor dx,dx
    mov di,0x0008
    div di          ; ax=byte no
                    ; dx=bit pos
    add si,ax
    xor cx,cx
    mov byte cl,es:[si]
                    ; cl=byte val
    mov ax,0x0001
    xchg cx,dx      ; cl=bit pos, dl=byte val
    shl al,cl       ; al=mask
    
    cmp byte bl,0x00
    jz .unset

 .set:
    or dl,al
    jmp .end
 .unset:
    not al
    and dl,al
 .end:
    mov byte es:[si],dl
    xor ax,ax
    sret(es)
    popa

    clc
    leave
    ret
