@ vim:filetype=armasm @ FIXME: handle dual issue .global clut_line2x2 @ void *dest, void *src, unsigned short *pal, int pixels_mask clut_line2x2: stmfd sp!, {r4-r11,lr} and lr, r3, #0xff0000 mov lr, lr, lsr #15 @ mask mov r3, r3, lsr #3 and r3, r3, #0xff @ counter add r11,r0, #800*2 clut_line_2x2_loop: ldmia r1!, {r10,r12} and r4, lr, r10, lsl #1 ldrh r4, [r2, r4] and r5, lr, r10, lsr #7 ldrh r5, [r2, r5] orr r4, r4, r4, lsl #16 and r6, lr, r10, lsr #15 ldrh r6, [r2, r6] orr r5, r5, r5, lsl #16 and r7, lr, r10, lsr #23 ldrh r7, [r2, r7] orr r6, r6, r6, lsl #16 and r8, lr, r12, lsl #1 ldrh r8, [r2, r8] orr r7, r7, r7, lsl #16 and r9, lr, r12, lsr #7 ldrh r9, [r2, r9] orr r8, r8, r8, lsl #16 and r10,lr, r12, lsr #15 ldrh r10,[r2, r10] orr r9, r9, r9, lsl #16 and r12,lr, r12, lsr #23 ldrh r12,[r2, r12] orr r10,r10,r10, lsl #16 subs r3, r3, #1 orr r12,r12,r12, lsl #16 stmia r0!, {r4-r10,r12} stmia r11!,{r4-r10,r12} bne clut_line_2x2_loop ldmfd sp!, {r4-r11,pc} @ 00 01 11 22 23 33 @ r4 r5 r6 r7 r8 r9 .macro do_4_to_12 rs and r4, lr, \rs, lsl #1 and r6, lr, \rs, lsr #7 and r7, lr, \rs, lsr #15 and r9, lr, \rs, lsr #23 ldrh r4, [r2, r4] ldrh r6, [r2, r6] ldrh r7, [r2, r7] ldrh r9, [r2, r9] orr r5, r4, r6, lsl #16 orr r4, r4, r4, lsl #16 orr r6, r6, r6, lsl #16 orr r8, r7, r9, lsl #16 orr r7, r7, r7, lsl #16 orr r9, r9, r9, lsl #16 .endm .global clut_line3x2 @ void *dest, void *src, unsigned short *pal, int pixels_mask clut_line3x2: stmfd sp!, {r4-r11,lr} and lr, r3, #0xff0000 mov lr, lr, lsr #15 @ mask mov r3, r3, lsr #3 and r3, r3, #0xff @ counter add r11,r0, #800*2 clut_line3x2_loop: ldmia r1!, {r10,r12} do_4_to_12 r10 stmia r0!, {r4-r9} stmia r11!,{r4-r9} do_4_to_12 r12 subs r3, r3, #1 stmia r0!, {r4-r9} stmia r11!,{r4-r9} bne clut_line3x2_loop ldmfd sp!, {r4-r11,pc}