home *** CD-ROM | disk | FTP | other *** search
- ; Use the GET directive to include register definitions as if typed here
-
- GET h.RegNames
-
- AREA |C$$Code|, CODE, READONLY
-
-
- EXPORT mix_alpha16
- EXPORT fill_line_flat_opaque16
- EXPORT fill_line_flat16
- EXPORT fill_line_flat_bitmap16
- EXPORT fill_line_alpha_chn_bitmap16
- EXPORT fill_line_alpha_bitmap16
- EXPORT fill_line_ramp_opaque16
- EXPORT fill_line_ramp16
- EXPORT fill_line_ramp_2_opaque16
- EXPORT fill_line_ramp_2_16
- EXPORT fill_line_radial_ramp16
- EXPORT fill_line_radial_ramp_2_16
- EXPORT get_colour16
- EXPORT alloc_colour16
-
-
- get_colour16
- ;on entry r0 = colour
- ; r1 => Color structure to fill in
- ; +0 r
- ; +0 g
- ; +0 b
- ; +4..7 0
- ;on exit r2,r3 corrupt
- AND r2,r0,#31
- MOV r2,r2,LSL#5
- ORR r2,r2,r2,LSR#5
- MOV r3,r0,LSR#5
- AND r3,r3,#31
- MOV r3,r3,LSL#3
- ORR r3,r3,r3,LSR#5
- ORR r2,r2,r3,LSL#8
- MOV r3,r0,LSR#10
- AND r3,r3,#31
- MOV r3,r3,LSL#3
- ORR r3,r3,r3,LSR#5
- ORR r2,r2,r3,LSL#16
- STR r2,[r1]
- MOVS pc,r14
-
-
- alloc_colour16
- ;on entry r0 => Color structure
- ;on exit r0 = pixel value (dither pattern)
- ; r1-r3 corrupt
- LDR r0,[r0]
- ADRL r1,table8_5_error
-
- AND r2,r0,#2_11111100
- LDR r2,[r1,r2]
-
- AND r3,r0,#2_1111110000000000
- LDR r3,[r1,r3,LSR#8]
- ORR r2,r2,r3,LSL#5
-
- AND r3,r0,#2_111111000000000000000000
- LDR r3,[r1,r3,LSR#16]
- ORR r0,r2,r3,LSL#10
-
- MOVS pc,r14
-
-
- fill_line_radial_ramp_2_16
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 => X
- ; r3 => Y
- ; sp+0 = dx r4
- ; sp+4 = dy r5
- ; sp+8 => ramp r6
- ; sp+12 => square-root table r7
- CMP r1,#0
- MOVLES pc,r14
- STMFD r13!,{r3-r12,r14}
- LDR r4,[r13,#(11+0)*4]
- LDR r5,[r13,#(11+1)*4]
- LDR r6,[r13,#(11+2)*4]
- LDR r7,[r13,#(11+3)*4]
-
- LDR r8,[r2] ;X
- LDR r9,[r3] ;Y
-
- 00
- CMP r1,#0
- BLE %FT01
- MOV r11,r8,ASR#16
- MOV r12,r9,ASR#16
- MUL r10,r11,r11
- MLA r10,r12,r12,r10
- CMP r10,#1<<16
- MOVGE r10,#255
- LDRLTB r10,[r7,r10]
-
- ADD r10,r6,r10,LSL#3 ;pointer to colour
- STMFD r13!,{r0-r2}
- LDRB r2,[r10,#3]
- LDR r1,[r10,#4] ;read colour
- LDR r0,[r0]
- BL mix_alpha16
- MOV r10,r0
- LDMFD r13!,{r0-r2}
- TST r0,#2
- MOVEQ r10,r10,LSR#16
- STRB r10,[r0],#1 ;write colour
- MOV r10,r10,LSR#8
- STRB r10,[r0],#1
-
- ADD r8,r8,r4
- ADD r9,r9,r5
- SUB r1,r1,#1
- B %BT00
-
- 01
- STR r8,[r2]
- STR r9,[r3]
- LDMFD r13!,{r3-r12,pc}^
-
-
-
- fill_line_radial_ramp16
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 => X
- ; r3 => Y
- ; sp+0 = dx r4
- ; sp+4 = dy r5
- ; sp+8 => ramp r6
- ; sp+12 => square-root table r7
- CMP r1,#0
- MOVLES pc,r14
- STMFD r13!,{r3-r12,r14}
- LDR r4,[r13,#(11+0)*4]
- LDR r5,[r13,#(11+1)*4]
- LDR r6,[r13,#(11+2)*4]
- LDR r7,[r13,#(11+3)*4]
-
- LDR r8,[r2] ;X
- LDR r9,[r3] ;Y
-
- 00
- CMP r1,#0
- BLE %FT01
- MOV r11,r8,ASR#16
- MOV r12,r9,ASR#16
- MUL r10,r11,r11
- MLA r10,r12,r12,r10
- CMP r10,#1<<16
- MOVGE r10,#255
- LDRLTB r10,[r7,r10]
-
- ADD r10,r6,r10,LSL#3 ;pointer to colour
- LDR r10,[r10,#4] ;read colour
- TST r0,#2
- MOVEQ r10,r10,LSR#16
- STRB r10,[r0],#1 ;write colour
- MOV r10,r10,LSR#8
- STRB r10,[r0],#1
-
- ADD r8,r8,r4
- ADD r9,r9,r5
- SUB r1,r1,#1
- B %BT00
-
- 01
- STR r8,[r2]
- STR r9,[r3]
- LDMFD r13!,{r3-r12,pc}^
-
-
-
- fill_line_ramp16 ROUT
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 => ramp
- ; r3 = r
- ; sp+0 = dr r4
- ;on exit r0 = r
- CMP r1,#0
- MOVLE r0,r3
- MOVLES pc,r14
- STMFD r13!,{r3-r12,r14}
- LDR r4,[r13,#11*4] ;remaining arg
- MOV r6,r0
- MOV r7,r1
- MOV r8,r2
-
- 00
- MOV r5,r3,ASR#10
- ADD r5,r8,r5,LSL#3 ;pointer to colour
- LDR r1,[r5,#4] ;get colour
- LDRB r2,[r5,#3] ;get alpha
- LDR r0,[r6] ;current pixel
- BL mix_alpha16
-
- TST r6,#2
- MOVEQ r10,r10,LSR#16
- STRB r0,[r6],#1
- MOV r0,r0,LSR#8
- STRB r0,[r6],#1
-
- ADD r3,r3,r4
-
- SUBS r7,r7,#1
- BGT %BT00
- 01
- MOV r0,r3
- LDMFD r13!,{r3-r12,pc}^
-
-
-
-
-
- fill_line_ramp_2_16 ROUT
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 => ramp
- ; r3 = r
- ; sp+0 = dr r4
- ;on exit r0 = r
- CMP r1,#0
- MOVLE r0,r3
- MOVLES pc,r14
- STMFD r13!,{r3-r12,r14}
- LDR r4,[r13,#11*4] ;remaining arg
- MOV r6,r0
- MOV r7,r1
- MOV r8,r2
-
- 00
- MOVS r5,r3,ASR#10
- MOVLT r5,#0
- CMP r5,#255
- MOVGT r5,#255
- ADD r5,r8,r5,LSL#3 ;pointer to colour
- LDR r1,[r5,#4] ;get colour
- LDRB r2,[r5,#3] ;get alpha
- LDR r0,[r6] ;current pixel
- BL mix_alpha16
-
- TST r6,#2
- MOVEQ r0,r0,LSR#16
- STRB r0,[r6],#1
- MOV r0,r0,LSR#8
- STRB r0,[r6],#1
-
- ADD r3,r3,r4
-
- SUBS r7,r7,#1
- BGT %BT00
- 01
- MOV r0,r3
- LDMFD r13!,{r3-r12,pc}^
-
-
-
-
-
- fill_line_ramp_2_opaque16 ROUT
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 => ramp
- ; r3 = r
- ; sp+0 = dr r4
- ;on exit r0 = r
- CMP r1,#0
- MOVLE r0,r3
- MOVLES pc,r14
- STMFD r13!,{r3-r12,r14}
- LDR r4,[r13,#11*4] ;remaining arg
-
- TST r0,#3
- BEQ %FT00
-
- MOVS r5,r3,ASR#10
- MOVLT r5,#0
- CMP r5,#255
- MOVGT r5,#255
- ADD r5,r2,r5,LSL#3 ;pointer to colour
- LDR r5,[r5,#4] ;get colour
- STRB r5,[r0],#1 ;write pixel
- MOV r5,r5,LSR#8
- STRB r5,[r0],#1
- SUB r1,r1,#1
- ADD r3,r3,r4
-
- 00
- CMP r1,#2
- BLT %FT01
-
- MOVS r5,r3,ASR#10
- MOVLT r5,#0
- CMP r5,#255
- MOVGT r5,#255
- ADD r5,r2,r5,LSL#3 ;pointer to colour
- LDR r5,[r5,#4] ;get colour
- MOV r5,r5,LSR#16
- ADD r3,r3,r4
-
- MOVS r6,r3,ASR#10
- MOVLT r6,#0
- CMP r6,#255
- MOVGT r6,#255
- ADD r6,r2,r6,LSL#3 ;pointer to colour
- LDR r6,[r6,#4] ;get colour
- ORR r5,r5,r6,LSL#16
- ADD r3,r3,r4
-
- STR r5,[r0],#4 ;write 2 pixels
-
- SUB r1,r1,#2
- B %BT00
-
- 01
- CMP r1,#0
- MOVLE r0,r3
- LDMLEFD r13!,{r3-r12,pc}^
-
- MOVS r5,r3,ASR#10
- MOVLT r5,#0
- CMP r5,#255
- MOVGT r5,#255
- ADD r5,r2,r5,LSL#3 ;pointer to colour
- LDR r5,[r5,#4] ;get colour
- STRB r5,[r0],#1 ;write pixel
- MOV r5,r5,LSR#8
- STRB r5,[r0],#1
- ADD r0,r3,r4
- LDMFD r13!,{r3-r12,pc}^
-
-
-
-
- fill_line_ramp_opaque16 ROUT
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 => ramp
- ; r3 = r
- ; sp+0 = dr r4
- ;on exit r0 = r
- CMP r1,#0
- MOVLE r0,r3
- MOVLES pc,r14
- STMFD r13!,{r3-r12,r14}
- LDR r4,[r13,#11*4] ;remaining arg
-
- TST r0,#3
- BEQ %FT00
-
- MOV r5,r3,LSR#10
- ADD r5,r2,r5,LSL#3 ;pointer to colour
- LDR r5,[r5,#4] ;get colour
- STRB r5,[r0],#1 ;write pixel
- MOV r5,r5,LSR#8
- STRB r5,[r0],#1
- SUB r1,r1,#1
- ADD r3,r3,r4
-
- 00
- CMP r1,#2
- BLT %FT01
-
- MOV r5,r3,LSR#10
- ADD r5,r2,r5,LSL#3 ;pointer to colour
- LDR r5,[r5,#4] ;get colour
- MOV r5,r5,LSR#16
- ADD r3,r3,r4
-
- MOV r6,r3,LSR#10
- ADD r6,r2,r6,LSL#3 ;pointer to colour
- LDR r6,[r6,#4] ;get colour
- ORR r5,r5,r6,LSL#16
- ADD r3,r3,r4
-
- STR r5,[r0],#4 ;write 2 pixels
-
- SUB r1,r1,#2
- B %BT00
-
- 01
- CMP r1,#0
- MOVLE r0,r3
- LDMLEFD r13!,{r3-r12,pc}^
-
- MOV r5,r3,LSR#10
- ADD r5,r2,r5,LSL#3 ;pointer to colour
- LDR r5,[r5,#4] ;get colour
- STRB r5,[r0],#1 ;write pixel
- MOV r5,r5,LSR#8
- STRB r5,[r0],#1
- ADD r0,r3,r4
- LDMFD r13!,{r3-r12,pc}^
-
-
-
- fill_line_flat_bitmap16 ROUT
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 = colourmap
- ; r3 => bitmap (8bpp)
- ; sp+0 = bytes per line r4
- ; sp+4 = x1 r5
- ; sp+8 = y1 r6
- ; sp+12 = dx r7
- ; sp+16 = dy r8
- ; sp+20 = width r9
- ; sp+24 = height r10
- ; sp+28 = tiled-flag r11
- CMP r1,#0
- MOVLES pc,r14
- STMFD r13!,{r3-r12,r14}
- ADD r12,r13,#11*4 ;remaining args
- LDMIA r12,{r4-r11}
-
- CMP r11,#1
- BEQ fill_line_flat_bitmap16_tiled
- ;clipped
- 00
- SUBS r1,r1,#1
- LDMLTFD r13!,{r3-r12,pc}^
-
- MOVS r11,r5,ASR#16 ;clip to borders
- MOVLT r11,#0
- CMP r11,r9
- SUBGE r11,r9,#1
-
- MOVS r12,r6,ASR#16
- MOVLT r12,#0
- CMP r12,r10
- SUBGE r12,r10,#1
-
- MLA r14,r12,r4,r11 ;pixel no
-
- LDRB r14,[r3,r14] ;pixel value
- ADD r14,r2,r14,LSL#3 ;pointer to colour
- LDR r14,[r14,#4] ;read colour
- TST r0,#2
- MOVEQ r14,r14,LSR#16
- STRB r14,[r0,#0] ;write colour
- MOV r14,r14,LSR#8
- STRB r14,[r0,#1]
- 01
- ADD r5,r5,r7
- ADD r6,r6,r8
- ADD r0,r0,#2
- B %BT00
-
- fill_line_flat_bitmap16_tiled
- 50
- SUBS r1,r1,#1
- LDMLTFD r13!,{r3-r12,pc}^
-
- CMP r5,#0 ;wrap to inside the bitmap
- ADDLT r5,r5,r9,LSL#16
- CMPGE r6,#0
- ADDLT r6,r6,r10,LSL#16
-
- CMP r9,r5,ASR#16
- SUBLT r5,r5,r9,LSL#16
- CMP r10,r6,ASR#16
- SUBLT r6,r6,r10,LSL#16
-
- MOV r14,r6,ASR#16
- MUL r14,r4,r14
- ADD r14,r14,r5,ASR#16 ;pixel no.
- LDRB r14,[r3,r14] ;pixel value
- ADD r14,r2,r14,LSL#3 ;pointer to colour
- LDR r14,[r14,#4] ;read colour
- TST r0,#2
- MOVEQ r14,r14,LSR#16
- STRB r14,[r0,#0] ;write colour
- MOV r14,r14,LSR#8
- STRB r14,[r0,#1]
-
- ADD r5,r5,r7
- ADD r6,r6,r8
- ADD r0,r0,#2
- B %BT50
-
-
-
- fill_line_alpha_chn_bitmap16 ROUT
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 = colourmap
- ; r3 => bitmap (8bpp)
- ; sp+0 = bytes per line r4
- ; sp+4 = x1 r5
- ; sp+8 = y1 r6
- ; sp+12 = dx r7
- ; sp+16 = dy r8
- ; sp+20 => alpha lookup table
- ; sp+24 => alpha channel bitmap
- ; sp+28 = width r11
- ; sp+32 = height r12
- ; sp+36 = tiled-flag
- CMP r1,#0
- MOVLES pc,r14
- STMFD r13!,{r3-r12,r14}
- ADD r9,r13,#11*4 ;remaining args
- LDMIA r9,{r4-r8}
- LDR r11,[r9,#28]
- LDR r12,[r9,#32]
- MOV r10,r0
-
- LDR r0,[r9,#36]
- CMP r0,#1
- BEQ fill_line_alpha_chn_bitmap16_tiled
- ;clipped
- 00
- SUBS r1,r1,#1
- LDMLTFD r13!,{r3-r12,pc}^
-
- STMFD r13!,{r1-r2,r7}
- MOVS r1,r5,ASR#16 ;clip to inside bitmap
- MOVLT r1,#0
- CMP r1,r11
- SUBGE r1,r11,#1
-
- MOVS r2,r6,ASR#16
- MOVLT r2,#0
- CMP r2,r12
- SUBGE r2,r12,#1
-
- MLA r7,r4,r2,r1 ;pixel no.
-
- LDR r1,[r9,#28] ;alpha channel bitmap
- LDRB r2,[r1,r7] ;alpha channel pixel
- LDR r1,[r9,#24] ;alpha table
- LDRB r2,[r1,r2]
-
- LDRB r1,[r3,r7] ;pixel value
- ADD r1,r2,r1,LSL#3 ;pointer to colour
- LDR r1,[r1,#4] ;read colour
-
- LDR r0,[r10] ;read current colour
-
- BL mix_alpha16 ;r0=col1 r1=col2 r2=alpha
- LDMFD r13!,{r1-r2,r7}
- TST r10,#2
- MOVEQ r0,r0,LSR#16
- STRB r0,[r10,#0] ;write colour
- MOV r0,r0,LSR#8
- STRB r0,[r10,#1]
- 01
- ADD r5,r5,r7
- ADD r6,r6,r8
- ADD r10,r10,#2
- B %BT00
-
-
- fill_line_alpha_chn_bitmap16_tiled
- 50
- SUBS r1,r1,#1
- LDMLTFD r13!,{r3-r12,pc}^
-
- CMP r5,#0 ;wrap to inside the bitmap
- ADDLT r5,r5,r11,LSL#16
- CMPGE r6,#0
- ADDLT r6,r6,r12,LSL#16
-
- CMP r11,r5,ASR#16
- SUBLT r5,r5,r11,LSL#16
- CMP r12,r6,ASR#16
- SUBLT r6,r6,r12,LSL#16
-
- STMFD r13!,{r1-r2,r7}
- MOV r7,r6,ASR#16
- MUL r7,r4,r7
- ADD r7,r7,r5,ASR#16 ;pixel no.
-
- LDR r1,[r9,#28] ;alpha channel bitmap
- LDRB r2,[r1,r7] ;alpha channel pixel
- LDR r1,[r9,#24] ;alpha table
- LDRB r2,[r1,r2]
-
- LDRB r1,[r3,r7] ;pixel value
- ADD r1,r2,r1,LSL#3 ;pointer to colour
- LDR r1,[r1,#4] ;read colour
-
- LDR r0,[r10] ;read current colour
-
- BL mix_alpha16 ;r0=col1 r1=col2 r2=alpha
- LDMFD r13!,{r1-r2,r7}
- TST r10,#2
- MOVEQ r0,r0,LSR#16
- STRB r0,[r10,#0] ;write colour
- MOV r0,r0,LSR#8
- STRB r0,[r10,#1]
-
- ADD r5,r5,r7
- ADD r6,r6,r8
- ADD r10,r10,#2
- B %BT50
-
-
-
- fill_line_alpha_bitmap16 ROUT
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 = colourmap
- ; r3 => bitmap (8bpp)
- ; sp+0 = bytes per line r4
- ; sp+4 = x1 r5
- ; sp+8 = y1 r6
- ; sp+12 = dx r7
- ; sp+16 = dy r8
- ; sp+20 => alpha channel bitmap r9
- ; sp+24 = width r10
- ; sp+28 = height r11
- ; sp+32 = tiled-flag
- CMP r1,#0
- MOVLES pc,r14
- STMFD r13!,{r3-r12,r14}
- ADD r12,r13,#11*4 ;remaining args
- LDMIA r12,{r4-r11}
- MOV r12,r0
-
- LDR r0,[r13,#11*4+32]
- CMP r0,#1
- BEQ fill_line_alpha_bitmap16_tiled
- ;clipped
- 00
- SUBS r1,r1,#1
- LDMLTFD r13!,{r3-r12,pc}^
-
- STMFD r13!,{r1-r2}
- MOVS r1,r5,ASR#16 ;clip to inside bitmap
- MOVLT r1,#0
- CMP r1,r10
- SUBGE r1,r10,#1
-
- MOVS r2,r6,ASR#16
- MOVLT r2,#0
- CMP r2,r11
- SUBGE r2,r11,#1
-
- MLA r1,r4,r2,r1 ;pixel no.
-
- LDRB r2,[r9,r1] ;alpha channel pixel
-
- LDRB r1,[r3,r1] ;pixel value
- ADD r1,r2,r1,LSL#3 ;pointer to colour
- LDR r1,[r1,#4] ;read colour
-
- LDR r0,[r12] ;read current colour
-
- BL mix_alpha16 ;r0=col1 r1=col2 r2=alpha
- LDMFD r13!,{r1-r2}
- TST r12,#2
- MOVEQ r0,r0,LSR#16
- STRB r0,[r12,#0] ;write colour
- MOV r0,r0,LSR#8
- STRB r0,[r12,#1]
- 01
- ADD r5,r5,r7
- ADD r6,r6,r8
- ADD r12,r12,#2
- B %BT00
-
- fill_line_alpha_bitmap16_tiled
- 50
- SUBS r1,r1,#1
- LDMLTFD r13!,{r3-r12,pc}^
-
- CMP r5,#0 ;wrap to inside the bitmap
- ADDLT r5,r5,r10,LSL#16
- CMPGE r6,#0
- ADDLT r6,r6,r11,LSL#16
-
- CMP r10,r5,ASR#16
- SUBLT r5,r5,r10,LSL#16
- CMP r11,r6,ASR#16
- SUBLT r6,r6,r11,LSL#16
-
- STMFD r13!,{r1-r2}
- MOV r1,r6,ASR#16
- MUL r1,r4,r1
- ADD r1,r1,r5,ASR#16 ;pixel no.
-
- LDRB r2,[r9,r1] ;alpha channel pixel
-
- LDRB r1,[r3,r1] ;pixel value
- ADD r1,r2,r1,LSL#3 ;pointer to colour
- LDR r1,[r1,#4] ;read colour
-
- LDR r0,[r12] ;read current colour
-
- BL mix_alpha16 ;r0=col1 r1=col2 r2=alpha
- LDMFD r13!,{r1-r2}
- TST r12,#2
- MOVEQ r0,r0,LSR#16
- STRB r0,[r12,#0] ;write colour
- MOV r0,r0,LSR#8
- STRB r0,[r12,#1]
-
- ADD r5,r5,r7
- ADD r6,r6,r8
- ADD r12,r12,#2
- B %BT50
-
-
-
- fill_line_flat_opaque16 ROUT
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 = colour (dither pattern)
- CMP r1,#0
- MOVLES pc,r14
- STMFD r13!,{r3-r10,r14}
-
- TST r0,#3 ;make sure line is word-aligned
- BEQ %FT00
- STRB r2,[r0],#1
- MOV r3,r2,LSR#8
- STRB r3,[r0],#1
- SUB r1,r1,#1
-
- 00
- MOV r4,r2
- MOV r5,r2
- MOV r6,r2
- MOV r7,r2
- MOV r8,r2
- MOV r9,r2
- MOV r10,r2
- 10 ;now write 16 pixels at a time
- CMP r1,#16 ;until there's less than 16 left
- BLT %FT11
- STMIA r0!,{r2,r4-r10}
- SUB r1,r1,#16
- B %BT10
-
- 11
- CMP r1,#2 ;write 2 pixels at a time
- BLT %FT12 ;until there's less than 2 left
- STR r2,[r0],#4
- SUB r1,r1,#2
- B %BT11
-
- 12
- CMP r1,#1
- STREQB r2,[r0],#1 ;write the last pixel (if any)
- MOVEQ r3,r2,LSR#8
- STREQB r3,[r0],#1
- LDMFD r13!,{r3-r10,pc}^
-
-
-
- fill_line_flat16 ROUT
- ;on entry r0 => line
- ; r1 = no. of pixels
- ; r2 = colour (dither pattern)
- ; r3 = alpha
- CMP r1,#0
- MOVLES pc,r14
- STMFD r13!,{r4-r12,r14}
- AND r4,r2,#31 ;prepare r,g,b
- MUL r4,r3,r4
- AND r5,r2,#31<<5
- MOV r5,r5,LSR#5
- MUL r5,r3,r5
- AND r6,r2,#31<<10
- MOV r6,r6,LSR#10
- MUL r6,r3,r6
-
- RSB r3,r3,#256
-
- 01
- CMP r1,#0
- LDMEQFD r13!,{r4-r12,pc}^
-
- LDR r7,[r0]
- AND r8,r7,#31
- MLA r8,r3,r8,r4
- MOVS r8,r8,LSR#8 ;r
- MOVLT r8,#0
- CMP r8,#31
- MOVGT r8,#31
- AND r9,r7,#31<<5
- MOV r9,r9,LSR#5
- MLA r9,r3,r9,r5
- MOVS r9,r9,LSR#8 ;g
- MOVLT r9,#0
- CMP r9,#31
- MOVGT r9,#31
- AND r10,r7,#31<<10
- MOV r10,r10,LSR#10
- MLA r10,r3,r10,r6
- MOVS r10,r10,LSR#8 ;g
- MOVLT r1,#0
- CMP r10,#31
- MOVGT r10,#31
-
- ORR r7,r8,r9,LSL#5
- ORR r7,r7,r10,LSL#10
- STRB r7,[r0],#1
- MOV r7,r7,LSR#8
- STRB r7,[r0],#1
-
- SUBS r1,r1,#1
- BGT %BT01
- LDMFD r13!,{r4-r12,pc}^
-
-
-
-
-
- mix_alpha16 ROUT
- ;on entry r0 = colour1
- ; r1 = colour2 (dither pattern)
- ; r2 = mix level (0->colour1, 255->colour2)
- ;on exit r0 = mixed colour
-
- STMFD r13!,{r3-r8,r14}
- AND r3,r0,#31
- AND r4,r1,#31
- SUB r5,r4,r3
- MUL r5,r2,r5
- ADD r5,r5,r3,LSL#8
- MOVS r5,r5,ASR#7
- MOVLT r5,#0
- CMP r5,#63
- MOVGT r5,#63
-
- AND r3,r0,#31<<5
- AND r4,r1,#31<<5
- MOV r4,r4,LSR#5
- SUB r6,r4,r3,LSR#5
- MUL r6,r2,r6
- ADD r6,r6,r3,LSL#3
- MOVS r6,r6,ASR#7
- MOVLT r6,#0
- CMP r6,#63
- MOVGT r6,#63
-
- AND r3,r0,#31<<10
- AND r4,r1,#31<<10
- MOV r4,r4,LSR#10
- SUB r7,r4,r3,LSR#10
- MUL r7,r2,r7
- ADD r7,r7,r3,LSR#2
- MOVS r7,r7,ASR#7
- MOVLT r7,#0
- CMP r7,#63
- MOVGT r7,#63
-
- ADR r1,table8_5_error
- LDR r0,[r1,r5,LSL#2]
- LDR r2,[r1,r6,LSL#2]
- ORR r0,r0,r2,LSL#5
- LDR r2,[r1,r7,LSL#2]
- ORR r0,r0,r2,LSL#10
- LDMFD r13!,{r3-r8,pc}^
-
-
-
- table8_5_error
- DCD &00000000
- DCD &00010000
- DCD &00010001
- DCD &00020001
- DCD &00020002
- DCD &00030002
- DCD &00030003
- DCD &00040003
- DCD &00040004
- DCD &00050004
- DCD &00050005
- DCD &00060005
- DCD &00060006
- DCD &00070006
- DCD &00070007
- DCD &00080007
- DCD &00080008
- DCD &00090008
- DCD &00090009
- DCD &000A0009
- DCD &000A000A
- DCD &000B000A
- DCD &000B000B
- DCD &000C000B
- DCD &000C000C
- DCD &000D000C
- DCD &000D000D
- DCD &000E000D
- DCD &000E000E
- DCD &000F000E
- DCD &000F000F
- DCD &0010000F
- DCD &00100010
- DCD &00110010
- DCD &00110011
- DCD &00120011
- DCD &00120012
- DCD &00130012
- DCD &00130013
- DCD &00140013
- DCD &00140014
- DCD &00150014
- DCD &00150015
- DCD &00160015
- DCD &00160016
- DCD &00170016
- DCD &00170017
- DCD &00180017
- DCD &00180018
- DCD &00190018
- DCD &00190019
- DCD &001A0019
- DCD &001A001A
- DCD &001B001A
- DCD &001B001B
- DCD &001C001B
- DCD &001C001C
- DCD &001D001C
- DCD &001D001D
- DCD &001E001D
- DCD &001E001E
- DCD &001F001E
- DCD &001F001F
- DCD &001F001F
-
- END
-