@; rectangle plotting function
@; ---------------------------

@; params:
@; dst    r0
@; x1     r1
@; y1     r2
@; x2     r3
@; y2     r4  [sp. #0]
@; colour r5  [sp, #4]
@; regs:
@; start  r6
@; width  r7
@; height r8

@; line_width r10


.set LOG2WIDTH, 7 @; width = 128

    .text
    .align 2

    .global rectangle
rectangle:
    stmfd   sp!, {r4-r11, lr} @; 9 regs
    ldr     r4, [sp, #36]  @; y2
    ldr     r5, [sp, #40]  @; colour

@; set up frame size and adjust parameters
    mov     r11, #LOG2WIDTH
    mov     r10, #1
    mov     r10, r10, lsl r11

    cmp     r3, r1
    ldmeqfd sp!, {r4-r11, pc} @; width = 0, exit
    eormi   r3, r1, r3       @; if width < 0
    eormi   r1, r1, r3       @; swap co-ordinates
    eormi   r3, r1, r3

    cmp     r4, r2
    ldmeqfd sp!, {r4-r11, pc} @; height = 0, exit
    eormi   r4, r2, r4       @; if height < 0
    eormi   r2, r2, r4       @; swap co-ordinates
    eormi   r4, r2, r4
@; now have, r1 = min x, r2 = min y, r3 = max x, r4 = max y

    add     r6, r1, r2, lsl r11
    sub     r8, r4, r2       @; height
rect_loop_y:
    sub     r7, r3, r1         @; width
    add     r9, r0, r6
rect_loop_x:
    strb    r5, [r9], #1
    subs    r7, r7, #1
    bne     rect_loop_x
    add     r6, r6, r10
    subs    r8, r8, #1
    bne     rect_loop_y
    ldmfd   sp!, {r4-r11, pc} @; exit

    .align 2

