; std.s
%pragma once
bits 16

; Multiply :: int16 -> int16 -> int16
Multiply:
    enter 0,0
    push bx
    push dx

    mov ax,[bp+4]
    mov bx,[bp+6]

    xor dx,dx
    mul bx

    pop dx
    pop bx

    clc
    leave
    ret


; BROKEN
; Divmod64 :: int64 *seg:number -> int16 divisor -> bool ismod
;   -> int64 *seg:addr
Divmod64:
    ; number = 0x hhggffee:ddccbbaa
 %assign stack 16
    enter stack,0
    %define src_bbaa    bp-2
    %define src_ddcc    bp-4
    %define src_ffee    bp-6
    %define src_hhgg    bp-8
    %define res_hhgg    bp-10
    %define res_ffee    bp-12
    %define res_ddcc    bp-14
    %define res_bbaa    bp-16
    push bx
    push cx
    push di
    push si

    mov dx,[bp+4]      ; dx=src seg
    mov si,[bp+6]      ; si=src addr
                       ; bl=ismod bit
                       ; cx=divisor

    chseg(ds,dx)
        mov word bx,ds:[si+0]
            mov word ss:[src_bbaa],bx
        mov word bx,ds:[si+2]
            mov word ss:[src_ddcc],bx
        mov word bx,ds:[si+4]
            mov word ss:[src_ffee],bx
        mov word bx,ds:[si+6]
            mov word ss:[src_hhgg],bx
    sret(ds)

    mov cx,[bp+8]      ; cx=divisor
    xor dx,dx
    mov bx,[bp+10]     ; bl=ismod bit
        and bx,1

    mov word ax,ss:[src_hhgg]
    div cx
    mov word ss:[res_hhgg],ax

    mov word ax,ss:[src_ffee] 
    div cx
    mov word ss:[res_ffee],ax

    mov word ax,ss:[src_ddcc]
    div cx
    mov word ss:[res_ddcc],ax

    mov word ax,ss:[src_bbaa]
    div cx
    mov word ss:[res_bbaa],ax

    xchg ax,bx                      ; al=ismod bit, bx=quota low
    test al,1
    jnz .end

 .modulus:
    xor cx,cx
    mov word ss:[res_hhgg],cx
    mov word ss:[res_ffee],cx
    mov word ss:[res_ddcc],cx
    mov word ss:[res_bbaa],dx
    jmp .pastend

 .end:
    mov dx,ss
 .pastend:
    lea ax,ss:[res_bbaa]
    pop si
    pop di
    pop cx
    pop bx
    add sp,stack

    clc
    leave
    ret
