#include #if GINT_RENDER_MONO .global _bopti_asm_mono .global _bopti_asm_mono_alpha /* REGISTER ALLOCATION: r0: layer (left) r1: layer (right) r2: (temp) r3: - -- r4: vram (left) r5: vram (right) r6: layer pointer; f(x&31) r7: mask pointer -- @r15: -(x&31) */ _bopti_asm_mono: /* Read data longword and update the layer address pointer */ mov.l @r6, r2 mov.l @r2+, r0 mov.l r2, @r6 mov r0, r1 /* Shift the layer data */ mov.l @r15, r6 shld r6, r0 add #32, r6 shld r6, r1 /* Get the masks and clear the target VRAM area and unwanted image data */ mov.l @r7, r2 and r2, r0 not r2, r2 and r2, r4 mov.l @(4, r7), r2 and r2, r1 not r2, r2 and r2, r5 /* Do the drawing by joining the two */ or r4, r0 rts or r5, r1 /* REGISTER ALLOCATION r0: layer_1 (left) r1: layer_1 (right) r2: layer_2 (left) r3: layer_2 (right) -- r4: vram (left) r5: vram (right) r6: layer pointer; f(x&31); mask (left); mask (right) r7: mask pointer -- @r15: -(x&31) */ _bopti_asm_mono_alpha: /* Read data longwords and update the layer address pointer */ mov.l @r6, r2 mov.l @r2+, r0 mov.l @r2+, r3 mov.l r2, @r6 mov r0, r1 mov r3, r2 /* Shift all layer data */ mov.l @r15, r6 shld r6, r0 shld r6, r2 add #32, r6 shld r6, r1 shld r6, r3 /* Apply the masks on the layer data */ mov.l @r7, r6 and r6, r0 and r6, r2 mov.l @(4, r7), r6 and r6, r1 and r6, r3 /* Blit the clear on the VRAM */ not r0, r0 and r4, r0 not r1, r1 and r5, r1 /* Blit the write on the VRAM */ or r2, r0 rts or r3, r1 #endif /* GINT_RENDER_MONO */