.model medium, basic


BPset64 PROTO :WORD, :WORD, :WORD, :WORD
BDoAA64 PROTO :WORD, :WORD
ptPixel PROTO :WORD

CircleSize2 MACRO wXp, wYp, wColour
    
    ; X + 1 , Y + 1 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 2 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 3 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 4 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 1 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 2 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 3 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 4 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 1 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 2 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 3 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 4 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 1 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 2 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 3 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
ENDM

CircleSize3 MACRO wXp, wYp, wColour
    
    ; X + 1 , Y + 1 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 2 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 3 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 4 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 5 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 1 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 2 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 3 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 4 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 5 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 1 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 2 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 3 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 4 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 5 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 6 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 6 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 1 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 2 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 3 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 4 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 5 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 1 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 2 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 3 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 4 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 5 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 6 , Y + 2 
    mov ax, wXp
    add ax, 6 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 6 , Y + 3 
    mov ax, wXp
    add ax, 6 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 6 , Y + 4 
    mov ax, wXp
    add ax, 6 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
ENDM

CircleSize4 MACRO wXp, wYp, wColour
    
    ; X + 1 , Y + 2 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 3 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 4 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 5 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 1 , Y + 6 
    mov ax, wXp
    add ax, 1 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 6 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 2 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 3 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 4 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 5 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 2 , Y + 6 
    mov ax, wXp
    add ax, 2 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 6 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 1 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 2 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 3 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 4 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 5 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 6 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 6 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 3 , Y + 7 
    mov ax, wXp
    add ax, 3 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 7 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 1 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 2 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 3 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 4 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 5 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 6 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 6 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 4 , Y + 7 
    mov ax, wXp
    add ax, 4 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 7 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 1 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 1 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 2 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 3 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 4 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 5 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 6 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 6 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 5 , Y + 7 
    mov ax, wXp
    add ax, 5 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 7 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 6 , Y + 2 
    mov ax, wXp
    add ax, 6 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 6 , Y + 3 
    mov ax, wXp
    add ax, 6 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 6 , Y + 4 
    mov ax, wXp
    add ax, 6 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 6 , Y + 5 
    mov ax, wXp
    add ax, 6 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 6 , Y + 6 
    mov ax, wXp
    add ax, 6 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 6 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 7 , Y + 2 
    mov ax, wXp
    add ax, 7 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 2 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 7 , Y + 3 
    mov ax, wXp
    add ax, 7 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 7 , Y + 4 
    mov ax, wXp
    add ax, 7 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 7 , Y + 5 
    mov ax, wXp
    add ax, 7 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 7 , Y + 6 
    mov ax, wXp
    add ax, 7 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 6 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 8 , Y + 3 
    mov ax, wXp
    add ax, 8 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 3 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 8 , Y + 4 
    mov ax, wXp
    add ax, 8 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 4 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour
    
    ; X + 8 , Y + 5 
    mov ax, wXp
    add ax, 8 
    mov wXtmp, ax
    mov ax, wYp
    add ax, 5 
    mov wYtmp, ax
    invoke BPset64,  wLayer, wXtmp, wYtmp, wColour

ENDM


; ##########################################################################
; # cpyword MACRO                                                          #
; ##########################################################################

cpyword MACRO destination, source
    push ax
    mov ax, source
    mov destination, ax
    pop ax
ENDM


; ##########################################################################
; # return MACRO                                                           #
; ##########################################################################

return MACRO arg
    mov ax, arg
    ret
ENDM


; ##########################################################################
; # ArrayGet2D MACRO                                                       #
; ##########################################################################

ArrayGet2D MACRO wSegment, wIndex1, wIndex2, wPitch

   ; Set segment to wSegment (ES)
   mov ax, wSegment
   mov es, ax

   ; Set offset DI to (wIndex1 + wIndex1) + (wIndex2 * wPitch)

   ; di = (wIndex1 + wIndex1)
   mov di, wIndex1
   add di, wIndex1

   ; + (wIndex2 * wSize)
   mov ax, wPitch
   mov bx, wIndex2
   mul bx
   add di, ax

   mov ax, es:[di]
   
ENDM


; ##########################################################################
; # ArrayGet MACRO                                                         #
; ##########################################################################

ArrayGet MACRO wSegment, wIndex

   ; Set segment to wSegment (ES)
   mov ax, wSegment
   mov es, ax

   ; Set offset to DI to wIndex + wIndex
   
   ; di = (wIndex + wIndex)
   mov di, wIndex
   add di, wIndex

   mov ax, es:[di]
   
ENDM


; ##########################################################################
; # SetOffset MACRO                                                        #
; ##########################################################################

SetOffset MACRO wX, wY

    ; Set's DI (offset) accordingly for wX, wY
    mov bx, wY
    shl bx, 6
    mov di, bx
    shl bx, 2
    add di, bx
    add di, wX

ENDM

; ##########################################################################
; # AAPixel MACRO                                                          #
; ##########################################################################

AAPixel MACRO
   
   xor dx, dx
   xor bx, bx

   ; Right pixel
   add di, 1
   mov dl, es:[di]
   and dl, 63
   add bx, dx
   
   ; Left pixel
   sub di, 2
   mov dl, es:[di]
   and dl, 63
   add bx, dx

   ; Below pixel
   add di, 321
   mov dl, es:[di]
   and dl, 63
   add bx, dx

   ; Above pixel
   sub di, 640
   mov dl, es:[di]
   and dl, 63
   add bx, dx

   ; Div by 4
   shr bx, 2

   cmp bx, 0
   je SkipAA

   ; Find base colour
   add di, 320
   mov dl, es:[di]
   and dl, 192
   
   ; Add totals, and store final result
   add bx, dx
   mov es:[di], bx

SkipAA:

ENDM


; ##########################################################################
; # SetPixel MACRO                                                         #
; ##########################################################################

SetPixel MACRO wColour

    invoke ptPixel,  wColour

ENDM

.data
.code
.386


public BInit64, BPSet64, BBoxF64, BCircP64, BDrawLight64, FindFreePart


; ##########################################################################
; # FindFreePart                                                           #
; ##########################################################################

FindFreePart PROC ArraySeg:WORD
    
    mov ax, ArraySeg
    mov es, ax

    mov cx, 2

ForI:    ; ## ForI ##########

    xor bx, bx
    
    mov di, cx
    mov bx, es:[di]

    cmp bx, 0
    je FoundSlot
    
    add cx, 2
    cmp cx, 5800
jl ForI  ; ## NextI #########

    return 0

FoundSlot:

    return cx
    
FindFreePart ENDP

; ##########################################################################
; # ptPixel                                                                #
; ##########################################################################

ptPixel PROC wColour:WORD

    push cx

    xor cx, cx

    ; Calcuate the base colour and store it in BL
    mov bx, wColour
    and bl, 192

    ; Find the hue of the pixel currently in the memory, and store in DL
    mov dl, es:[di]
    and dl, 63

    ; Find the hue of wColour and add it to the hue of the current pixel, storing in DX
    mov ax, wColour
    and al, 63
    add dl, al

    ; If the hue is greater than 63, overflow into the surrounding pixels.
    .IF dl > 62
;        mov cl, dl
;        and cl, 63
;        shr cl, 2
;        add cl, bl
        mov dl, 62
    .ENDIF

    ; Add the base colour to the new hue, and write the final result
    add dl, bl
    mov es:[di], dl

;    .IF cx > 0
;        add di, 1
;        invoke ptPixel,  cx
;        sub di, 2
;        invoke ptPixel,  cx
;        add di, 321
;        invoke ptPixel,  cx
;        sub di, 640
;        invoke ptPixel,  cx
;        add di, 320
;    .ENDIF       

    pop cx

    ret

ptPixel ENDP

; ##########################################################################
; # BInit64                                                                #
; ##########################################################################

BInit64 PROC ArraySeg:WORD

    LOCAL wTest :WORD

    ; Set segment/offset for the different luts
    ;cpyword wClrS, wClr
    ;cpyword wAngS, wAng
    ;cpyword wCosS, wCos
    ;cpyword wSinS, wSin
    ;

    ArrayGet2D ArraySeg, 6, 9, 30
    mov wTest, ax
    return wTest

BInit64 ENDP


; ##########################################################################
; # BPset64                                                                #
; ##########################################################################

BPSet64 PROC wLayer:WORD, wXpos:WORD, wYpos:WORD, wColour:WORD

    ; Handle clipping
    cmp wXpos, 319
    ja SkipPixel

    cmp wYpos, 199
    ja SkipPixel

    ; Set the segment and store in ES
    mov ax, wLayer
    mov es, ax

    ; Calculate the offset and store in DI
    SetOffset wXpos, wYpos

    ; Draw/blend the pixel
    SetPixel wColour

SkipPixel:

    ret
    
BPSet64 ENDP

; ##########################################################################
; # BDoAA64                                                                #
; ##########################################################################

BDoAA64 PROC wXpos:WORD, wYpos:WORD

    ; Handle clipping
    cmp wXpos, 319
    ja SkipPixel

    cmp wYpos, 199
    ja SkipPixel

    ; Calculate the offset and store in DI
    SetOffset wXpos, wYpos

    ; Anti-aliase
    AAPixel

SkipPixel:

    ret
    
BDoAA64 ENDP


; ##########################################################################
; # BBoxF64                                                                #
; ##########################################################################

BBoxF64 PROC wLayer:WORD, wX1:WORD, wY1:WORD, wX2:WORD, wY2:WORD, wColour:WORD

    ; Add 1 to the x/y size
    add wX2, 1
    add wY2, 1

    ; Make sure the box isn't completely off the screen
    .IF wX1 > 319
        cmp wX2, 319
        jg SkipBox
    .ENDIF

    .IF wY1 > 199
        cmp wY2, 199
        jg SkipBox
    .ENDIF

    .IF wX2 < 0
        cmp wX1, 0
        jl SkipBox
    .ENDIF

    .IF wY2 < 0
        cmp wY1, 0
        jl SkipBox
    .ENDIF

    ; Do other clipping stuff
    .IF wX1 > 319
        mov wX1, 319
    .ENDIF

    .IF wX1 < 0
        mov wX1, 0
    .ENDIF

    .IF wX2 > 319
        mov wX2, 319
    .ENDIF

    .IF wX2 < 0
        mov wX2, 0
    .ENDIF

    .IF wY1 > 199
        mov wY1, 199
    .ENDIF

    .IF wY1 < 0
        mov wY1, 0
    .ENDIF

    .IF wY2 > 199
        mov wY2, 199
    .ENDIF

    .IF wY2 < 0
        mov wY2, 0
    .ENDIF

    ; If Y1 is greater then Y2, bail out
    mov ax, wY2
    cmp wY1, ax
    jg SkipBox

    ; If X1 is greater than X2, bail out
    mov ax, wX2
    cmp wX1, ax
    jg SkipBox

    ; Set the segment and store in ES
    mov ax, wLayer
    mov es, ax

    ; Calculate the offset and store in DI
    SetOffset wX1, wY1

    mov cx, wX2
    sub cx, wX1

    ; Exit routine if the box's width is 0
    jz SkipBox

    mov ax, 320
    sub ax, cx
    
    mov cx, wY2
    sub cx, wY1

    ; Exit the routine if the box's height is 0
    jz SkipBox
    
ForY:        ; ## For Y ##########

    push cx
    push ax

    mov cx, wX2
    sub cx, wX1

ForX:        ; ## For X ##########

    SetPixel wColour
    inc di
    dec cx

jnz ForX     ; ## Next X #########

    pop ax
    pop cx

    add di, ax
    dec cx

jnz ForY     ; ## Next Y #########

SkipBox :

    ret

BBoxF64 ENDP

BCircP64 PROC wLayer:WORD, wXpos:WORD, wYpos:WORD, wSize:WORD, wColour:WORD

   LOCAL wXtmp :WORD
   LOCAL wYtmp :WORD
   
   mov ax, wLayer
   mov es, ax

   .IF wSize == 2
        CircleSize2 wXpos, wYpos, wColour
   .ENDIF
   .IF wSize == 3
        CircleSize3 wXpos, wYpos, wColour
   .ENDIF
   .IF wSize == 4
        CircleSize4 wXpos, wYpos, wColour
   .ENDIF

   ret

BCircP64 ENDP

BDrawLight64 PROC wLayer:WORD, wXpos:WORD, wYpos:WORD, wSize:WORD, wColour:WORD, wClr:WORD, wAng:WORD, wCos:WORD, wSin:WORD

   LOCAL wAngStep    :WORD
   LOCAL wBaseColour :WORD
   LOCAL wXNew       :WORD
   LOCAL wYNew       :WORD
   LOCAL wTemp       :WORD

   shr wSize, 1

   mov dx, wSize
   mov wTemp, dx

ForSz:    ; ## ForSz ########
  
   dec wTemp

   ; wBaseColour = ClrFix(wSize, wTemp) + wColour
   ArrayGet2D wClr, wSize, wTemp, 52

   add ax, wColour
   mov wBaseColour, ax
   sub ax, wColour
   jz SkipRing
       
   ; wAngStep = AngStep(wTemp)
   ArrayGet wAng, wTemp
   mov wAngStep, ax

       
   mov cx, 360
ForAng:   ; ## ForAng #######
   sub cx, wAngStep
       
   ArrayGet2D wCos, wTemp, cx, 52
   add ax, wXpos
   mov wXNew, ax
       
   ArrayGet2D wSin, wTemp, cx, 52
   add ax, wYpos
   mov wYNew, ax

   push cx
   invoke BPset64,  wLayer, wXNew, wYNew, wBaseColour
   pop cx

   cmp cx, 0
   jg ForAng ; ## NextAng ######

SkipRing:

   cmp wTemp, 0
jg ForSz ; ## NextSz #######

   mov dx, wColour
   add dx, 62
   invoke BPset64,  wLayer, wXpos, wYpos, dx

   ret

BDrawLight64 ENDP

end
