;;; -*- 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
        ;; Look at line_down for referense
        .include "line.inc"; Defines memory positions, ex X_pos

        LDA #$00
        STA <V
        STA <dy_2
        STA $FD

        SEC
        LDA dx
        SBC dy
        STA >V
        Mult_16 >V, <V

        Mult_16 >dy_2, <dy_2

        Mov_16 >D, <D, >dy_2, <dy_2
        Add_16 >D, <D, #$ff, #$01, !
        Sub_16 >D, <D, dx, #$00

selfmod:
        LDA >dy_2
        STA case_2 +1
        LDA <dy_2
        STA case_2 +7
        LDA >V
        STA case_1 +1
        LDA <V
        STA case_1 +7
end_selfmod:
        jsr pixel_draw
        Sub_16 >btp_mem_pos, <btp_mem_pos, #$01, #$00 ;; Y has always a offset of at least 1
        LDY #$01
        LDX dx
for_x:
        LDA byte_to_paint
        ORA (>btp_mem_pos), Y
        STA (>btp_mem_pos), Y
increment_pixel_x:
        LSR byte_to_paint
        BCC increment_pixel_x_end
move_8px_left:
        Add_16 >btp_mem_pos, <btp_mem_pos, #$07, #$00,!
        LDA #%10000000
        STA byte_to_paint
increment_pixel_x_end:
        DEX
        ;CPX X_end
        BEQ end
        Lag_16 >D, <D, #$00, #$02, case_2
case_1:
        Sub_16_A >D, <D, #>V, #<V,!
decrement_y_pos:
        DEY
        BNE for_x
move_8px_up:
        LDY #$08
        Sub_16 >btp_mem_pos, <btp_mem_pos, #$40, #$01, !
        jmp for_x
decrement_y_pos_end:
case_2:
        Add_16 >D, <D, #>dy_2, #<dy_2,!
        JMP for_x
end:
        RTS
.endproc