; Use the GET directive to include register definitions as if typed here

        GET     h.RegNames

        AREA    |C$$Code|, CODE, READONLY


        EXPORT  mc_fill_rectangle



mc_fill_rectangle  ROUT
;on entry       r0 -> output
;               r1 =  size x
;               r2 =  size y
;               r3 =  pixels per line
;             sp+0 =  pixel value
          CMP       r1, #1
          CMPEQ     r2, #1
          BEQ       mc_fill_rectangle_1x1

          STMFD     r13!,{r0-r12,r14}
          LDR       r4, [r13,#4*14]

          CMP       r1, #0
          CMPLE     r2, #0
          LDMLEFD   r13!,{r0-r12,pc}^

          MOV       r4,r4,LSL#16
          MOV       r4,r4,LSR#16
          ORR       r6,r4,r4,LSL#16
          MOV       r7,r6
          MOV       r8,r6
          MOV       r9,r6
          MOV       r5,r4,LSR#8

          MOV       r10,r1
10
            MOV     r1,r10
            BL      mc_fill_rectangle_line
          SUB       r0,r0,r10,LSL#1
          ADD       r0,r0,r3,LSL#1
          SUBS      r2,r2,#1
          BGT       %B10
          LDMFD     r13!,{r0-r12,pc}^


mc_fill_rectangle_line        ROUT
          ;on entry r0->output
          ;         r1=no. of pixels
          ;         r4,r5,r6-r9 pixelvalue
          TST       r0,#3
          BEQ       %F00
          STRB      r4,[r0],#1
          STRB      r5,[r0],#1
          SUBS      r1,r1,#1
          MOVEQS    pc,r14
00
08
            CMP     r1, #8
            BLT     %F04
            STMIA   r0!,{r6-r9}
            SUBS    r1,r1,#8
          BGE       %B08

04
            CMP     r1, #4
            BLT     %F02
            STMIA   r0!,{r6-r7}
            SUBS    r1,r1,#4
          BGE       %B04

02
            CMP     r1, #2
            BLT     %F01
            STR     r6,[r0],#4
            SUBS    r1,r1,#2
          BGE       %B02

01
          CMP       r1,#1
          MOVLTS    pc,r14
          STRB      r4,[r0],#1
          STRB      r5,[r0],#1
          MOVS      pc,r14


mc_fill_rectangle_1x1
          LDR       r4, [r13]
          STRB      r4,[r0],#1
          MOV       r4,r4,LSR#8
          STRB      r4,[r0],#1
          MOVS      pc,r14



        END
