;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*-

;;drawing line from 2 cordinates
;;#                               *      (X_end, Y_end) #
;;#                                                     #
;;#                         *                           #
;;#                    *                                #
;;# (X_pos, Y_pos)                                      #
;;
;;NOTE THAT X_pos <= X_end, Y_pos >= Y_end. Max 45deg!

.proc line_up
        .include "line.inc"; Defines memory positions, ex X_pos

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

        ;; V = 2*(dx -dy)
        ;; where: dy = Y_pos - Y_end, dx = X_end - X_start
        ;; This logic is comented out because line.s does it woithout any
        ;;extra cost. May be needed in the future so it will stay as coments!
        LDA Y_pos
        SEC
        SBC Y_end
        STA >V
        STA >dy_2;  >dy_2 = dy. Needed for dy_2 (not for V)
        LDA X_end
        SEC
        SBC X_pos
        STA dx
        SEC
        SBC >dy_2
        STA >V; <V = dx - dy
        mult_16 >V, <V; V = 2*(dx -dy)

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

        ;;D = 2*dy - dx + 2*255
        ;;Our D is bigger then wikipedia because D is unsigned.
        LDA >dy_2
        STA >D
        LDA <dy_2
        STA <D
        Add_16 >D, <D, #$ff, #$01
        Sub_16 >D, <D, dx, #$00
for_x:
        jsr pixel_draw
        ;;Increment X until X_pos = X_end and Y_pos = Y_end
        INC X_pos
        LDX X_pos
        CPX X_end
        BEQ end

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