;drawing line from 2 cordinates
.proc line_up_inv
    ;;#                                      (X_end, Y_end) #
    ;;#                                   *                 #
    ;;#                         *                           #
    ;;#                *                                    #
    ;;# (X_pos, Y_pos)                                      #
   ;;NOTE THAT Y_pos >) Y_end, X_pos <= X_end. Min 45deg!
   .include "line.inc"

   ;;We need to clear this memory
    LDA #$00
    STA <V
    STA <dx_2
    STA $FD ; for pixel_draw

    ;; V = 2*(dy -dx)
    ;; where: dy = Y_pos - Y_end, dx = X_end - X_start
    LDA X_end
    SEC
    SBC X_pos
    STA >V
    STA >dx_2;  >dy_2 = dy. Needed for dy_2 (not for V)
    LDA Y_pos
    SEC
    SBC Y_end
    STA dy
    SEC
    SBC >V
    STA >V; <V = dx - dy
    mult_16 >V, <V; V = 2*(dx -dy)

    ;dy_2 = dy*2
    mult_16 >dx_2, <dx_2

    ;;D = 2*dx - dy + 2*255
    ;;Our D is bigger then wikipedia because D is unsigned.
    LDA >dx_2
    STA >D
    LDA <dx_2
    STA <D
    Add_16 >D, <D, #$ff, #$01
    Sub_16 >D, <D, dy, #$00
for_y:
    jsr pixel_draw
    ;;Increment Y until Y_pos = Y_end and X_pos = X_end
    DEC Y_pos
    LDY Y_pos
    CPY Y_end
    BEQ end

    ;;If D <  %00000010 00000000:  case_2
    ;;else case 1.
    Lag_16 >D, <D, #$00, #$02, case_2
case_1:
    INC X_pos
    Sub_16 >D, <D, >V, <V; D = D - V
    JMP for_y
case_2:
    Add_16 >D, <D, >dx_2, <dx_2;D = D + 2*dy
    JMP for_y
end:
    RTS
.endproc