X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2FDraw.s;h=46be65f1b98204e4f4ce2b86cd0e17381043b0dc;hb=b6d7ac70909e29ba8f40d6eaee53dd5b1bb71e52;hp=3a3da814d7753e105d274d853a60e59ec4046ab4;hpb=9839d126cc1cf782fad713f4fbc3611cba628ade;p=picodrive.git diff --git a/Pico/Draw.s b/Pico/Draw.s index 3a3da81..46be65f 100644 --- a/Pico/Draw.s +++ b/Pico/Draw.s @@ -1,9 +1,9 @@ @ vim:filetype=armasm -@ assembly "optimized" version of some funtions from draw.c +@ ARM assembly versions of some funtions from draw.c @ this is highly specialized, be careful if changing related C code! -@ (c) Copyright 2007, Grazvydas "notaz" Ignotas +@ (c) Copyright 2007-2008, Grazvydas "notaz" Ignotas @ All Rights Reserved .include "port_config.s" @@ -11,11 +11,12 @@ .extern Pico .extern PicoOpt .extern HighCol -.extern Scanline +.extern DrawScanline .extern HighSprZ .extern rendstatus .extern DrawLineDest .extern DrawStripInterlace +.extern HighCacheS_ptr @ helper @@ -64,10 +65,8 @@ .endif ldreqb r4, [r1,#\offs] orrne r4, r3, r4 - strneb r4, [r1,#\offs] - tsteq r4, #0x80 andeq r4, r4, #0x3f - streqb r4, [r1,#\offs] + strb r4, [r1,#\offs] .endm @ TileNormShHP (r1=pdest, r2=pixels8, r3=pal) r4: scratch, r12: register with helper pattern 0xf, touches r3 high bits @@ -155,24 +154,17 @@ .else ands r4, r12, r2 .endif - beq 3f + beq 0f cmp r4, #0xe - beq 2f - bgt 1f - orr r4, r3, r4 - strb r4, [r1,#\ofs] - b 3f -1: - ldrb r4, [r1,#\ofs] @ 2ci - orr r4, r4, #0xc0 - strb r4, [r1,#\ofs] - b 3f -2: - ldrb r4, [r1,#\ofs] @ 2ci - bic r4, r4, #0xc0 - orr r4, r4, #0x80 + ldrgeb r4, [r1,#\ofs] + orrlt r4, r3, r4 @ normal + + biceq r4, r4, #0xc0 @ hilight + orreq r4, r4, #0x80 + orrgt r4, r4, #0xc0 @ shadow + strb r4, [r1,#\ofs] -3: +0: .endm @ TileFlipSh (r1=pdest, r2=pixels8, r3=pal) r4,r7: scratch, r0=sx, r12: register with helper pattern 0xf @@ -199,6 +191,80 @@ TileDoShGenPixel 16, 7 @ #0x000f0000 .endm +.macro TileDoShGenPixel_noop shift ofs +.if \shift + and r4, r12, r2, lsr #\shift +.else + and r4, r12, r2 +.endif + sub r7, r4, #1 + cmp r7, #0xd + orrcc r4, r3, r4 @ 0-0xc (was 1-0xd) + strccb r4, [r1,#\ofs] +.endm + +.macro TileFlipSh_noop + TileDoShGenPixel_noop 16, 0 @ #0x000f0000 + TileDoShGenPixel_noop 20, 1 @ #0x00f00000 + TileDoShGenPixel_noop 24, 2 @ #0x0f000000 + TileDoShGenPixel_noop 28, 3 @ #0xf0000000 + TileDoShGenPixel_noop 0, 4 @ #0x0000000f + TileDoShGenPixel_noop 4, 5 @ #0x000000f0 + TileDoShGenPixel_noop 8, 6 @ #0x00000f00 + TileDoShGenPixel_noop 12, 7 @ #0x0000f000 +.endm + +.macro TileNormSh_noop + TileDoShGenPixel_noop 12, 0 @ #0x0000f000 + TileDoShGenPixel_noop 8, 1 @ #0x00000f00 + TileDoShGenPixel_noop 4, 2 @ #0x000000f0 + TileDoShGenPixel_noop 0, 3 @ #0x0000000f + TileDoShGenPixel_noop 28, 4 @ #0xf0000000 + TileDoShGenPixel_noop 24, 5 @ #0x0f000000 + TileDoShGenPixel_noop 20, 6 @ #0x00f00000 + TileDoShGenPixel_noop 16, 7 @ #0x000f0000 +.endm + +.macro TileDoShGenPixel_onlyop_lp shift ofs +.if \shift + ands r7, r12, r2, lsr #\shift +.else + ands r7, r12, r2 +.endif + ldrneb r4, [r1,#\ofs] + tstne r4, #0x40 + beq 0f + + cmp r7, #0xe + biceq r4, r4, #0xc0 @ hilight + orreq r4, r4, #0x80 + orrgt r4, r4, #0xc0 @ shadow + strgeb r4, [r1,#\ofs] +0: +.endm + +.macro TileFlipSh_onlyop_lp + TileDoShGenPixel_onlyop_lp 16, 0 @ #0x000f0000 + TileDoShGenPixel_onlyop_lp 20, 1 @ #0x00f00000 + TileDoShGenPixel_onlyop_lp 24, 2 @ #0x0f000000 + TileDoShGenPixel_onlyop_lp 28, 3 @ #0xf0000000 + TileDoShGenPixel_onlyop_lp 0, 4 @ #0x0000000f + TileDoShGenPixel_onlyop_lp 4, 5 @ #0x000000f0 + TileDoShGenPixel_onlyop_lp 8, 6 @ #0x00000f00 + TileDoShGenPixel_onlyop_lp 12, 7 @ #0x0000f000 +.endm + +.macro TileNormSh_onlyop_lp + TileDoShGenPixel_onlyop_lp 12, 0 @ #0x0000f000 + TileDoShGenPixel_onlyop_lp 8, 1 @ #0x00000f00 + TileDoShGenPixel_onlyop_lp 4, 2 @ #0x000000f0 + TileDoShGenPixel_onlyop_lp 0, 3 @ #0x0000000f + TileDoShGenPixel_onlyop_lp 28, 4 @ #0xf0000000 + TileDoShGenPixel_onlyop_lp 24, 5 @ #0x0f000000 + TileDoShGenPixel_onlyop_lp 20, 6 @ #0x00f00000 + TileDoShGenPixel_onlyop_lp 16, 7 @ #0x000f0000 +.endm + @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -250,7 +316,7 @@ DrawLayer: ldreqb r12, [r11, #2] ldrneb r12, [r11, #4] - ldr r2, =Scanline @ trying to make good use of pipeline here + ldr r2, =DrawScanline @ trying to make good use of pipeline here ldr lr, =(Pico+0x10000) @ lr=Pico.vram moveq r12, r12, lsl #10 @@ -264,7 +330,7 @@ DrawLayer: mov r4, r8, lsr #8 @ pvid->reg[13] mov r4, r4, lsl #10 @ htab=pvid->reg[13]<<9; (halfwords) tst r7, #2 - addne r4, r4, r2, lsl #2 @ htab+=Scanline<<1; // Offset by line + addne r4, r4, r2, lsl #2 @ htab+=DrawScanline<<1; // Offset by line tst r7, #1 biceq r4, r4, #0x1f @ htab&=~0xf; // Offset by tile add r4, r4, r0, lsl #1 @ htab+=plane @@ -444,10 +510,10 @@ DrawLayer: .DrawStrip_vsscroll: rsb r8, r3, #0 mov r8, r8, lsr #3 @ r8=tilex=(-ts->hscroll)>>3 - bic r8, r8, #0xff000000 - orr r8, r8, r5, lsl #25 @ r8=(xmask[31:25]|had_output[24]|tilex[23:0]) + bic r8, r8, #0x3fc00000 + orr r8, r8, r5, lsl #25 @ r8=(xmask[31:25]|had_output[24]|tilex[21:0]) - ldr r4, =Scanline + ldr r4, =DrawScanline orr r5, r1, r10, lsl #24 ldr r4, [r4] sub r1, r3, #1 @@ -504,9 +570,9 @@ DrawLayer: ldrh r7, [r7] @ r7=vscroll bic r10,r10,#0xff @ clear old ty - and r4, r5, #0xff0000 - add r4, r4, r7, lsl #16 - and r4, r4, r5, lsl #16 @ r4=line<<16 + and r4, r5, #0xff0000 @ scanline + add r4, r4, r7, lsl #16 @ ... += vscroll + and r4, r4, r5, lsl #16 @ ... &= ymask and r7, r4, #0x70000 orr r10,r10,r7, lsr #15 @ new ty @@ -529,7 +595,7 @@ DrawLayer: beq .DrawStrip_vs_samecode @ we know stuff about this tile already mov r9, r7 @ remember code - orr r8, r8, #1<<24 @ seen non hi-prio tile + orr r8, r8, #(1<<24)@ seen non hi-prio tile movs r2, r9, lsl #20 @ if (code&0x1000) mov r2, r2, lsl #1 @@ -603,7 +669,7 @@ DrawLayer: b .dsloop_vs .dsloop_vs_exit: - tst r8, #1<<24 @ seen non hi-prio tile + tst r8, #(1<<24) @ seen non hi-prio tile ldreq r1, =rendstatus mov r0, #0 ldreq r2, [r1] @@ -624,7 +690,7 @@ DrawLayer: movne r7, r7, lsl #5 @ Find the line in the name table - add r2, r7, r2, lsl #22 @ r2=(vscroll+(Scanline<<1))<<21 (11 bits); + add r2, r7, r2, lsl #22 @ r2=(vscroll+(DrawScanline<<1))<<21 (11 bits); orr r1, r1, #0x80000000 and r2, r2, r1, ror #10 @ &((ymask<<1)|1)<<21; mov r2, r2, lsr #21 @@ -798,39 +864,25 @@ DrawTilesFromCache: b .dtfc_loop .dtfc_shadow_blank: - ldrb r4, [r1] @ 1ci - ldrb r12,[r1,#1] - tst r4, #0x80 - andeq r4, r4,#0x3f - streqb r4, [r1] - tst r12,#0x80 - ldrb r4, [r1,#2] - andeq r12,r12,#0x3f - streqb r12,[r1,#1] - tst r4, #0x80 - ldrb r12,[r1,#3] - andeq r4, r4,#0x3f - streqb r4, [r1,#2] - tst r12,#0x80 - ldrb r4, [r1,#4] - andeq r12,r12,#0x3f - streqb r12,[r1,#3] - tst r4, #0x80 - ldrb r12,[r1,#5] - andeq r4, r4,#0x3f - streqb r4, [r1,#4] - tst r12,#0x80 - ldrb r4, [r1,#6] - andeq r12,r12,#0x3f - streqb r12,[r1,#5] - tst r4, #0x80 - ldrb r12,[r1,#7] - andeq r4, r4,#0x3f - streqb r4, [r1,#6] - tst r12,#0x80 - andeq r12,r12,#0x3f - streqb r12,[r1,#7] - mov r12, #0xf + tst r1, #1 + ldrneb r4, [r1] + mov r6, #0x3f + and r4, r4, #0x3f + strneb r4, [r1], #1 + ldrh r4, [r1] + orr r6, r6, r6, lsl #8 + and r4, r4, r6 + strh r4, [r1], #2 + ldrh r4, [r1] + and r4, r4, r6 + strh r4, [r1], #2 + ldrh r4, [r1] + and r4, r4, r6 + strh r4, [r1], #2 + ldrh r4, [r1] + and r4, r4, r6 + streqh r4, [r1] + strneb r4, [r1] b .dtfc_loop .dtfc_cut_tile: @@ -865,38 +917,29 @@ DrawTilesFromCache: str r2, [r1] add r1, r11,#8 - mov r3, #320/4 - mov r7, #0x80 - orr r7, r7, r7, lsl #8 - orr r7, r7, r7, lsl #16 + mov r3, #320/4/4 mov r6, #0x3f orr r6, r6, r6, lsl #8 orr r6, r6, r6, lsl #16 .dtfc_loop_shprep: + ldmia r1, {r2,r4,r5,r7} subs r3, r3, #1 - bmi .dtfc_loop @ done - ldr r2, [r1] - tst r2, r7 - andeq r2, r2, r6 - streq r2, [r1], #4 - beq .dtfc_loop_shprep - tst r2, #0x80000000 - biceq r2, r2, #0xc0000000 - tst r2, #0x00800000 - biceq r2, r2, #0x00c00000 - tst r2, #0x00008000 - biceq r2, r2, #0x0000c000 - tst r2, #0x00000080 - biceq r2, r2, #0x000000c0 - str r2, [r1], #4 - b .dtfc_loop_shprep + and r2, r2, r6 + and r4, r4, r6 + and r5, r5, r6 + and r7, r7, r6 + stmia r1!,{r2,r4,r5,r7} + bne .dtfc_loop_shprep + + mvn r5, #0 @ r5=prevcode=-1 + b .dtfc_loop .pool @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -.global DrawSpritesFromCache @ int *hc, int sh +.global DrawSpritesFromCache @ int *hc, int maxwidth, int prio, int sh DrawSpritesFromCache: stmfd sp!, {r4-r11,lr} @@ -911,7 +954,7 @@ DrawSpritesFromCache: mov r12,#0xf .endif ldr lr, =(Pico+0x10000) @ lr=Pico.vram - mov r6, r1, lsl #31 + mov r6, r3, lsl #31 orr r6, r6, #1<<30 mov r10, r0 @@ -998,6 +1041,9 @@ DrawSpritesFromCache: b .dsfc_inloop .dsfc_shadow: + tst r9, #0x80000000 + beq .dsfc_shadow_lowpri + cmp r2, r2, ror #4 beq .dsfc_singlec_sh @@ -1025,6 +1071,18 @@ DrawSpritesFromCache: TileSingleSh b .dsfc_inloop +.dsfc_shadow_lowpri: + tst r9, #0x10000 + bne .dsfc_TileFlip_sh_lp + +.dsfc_TileNorm_sh_lp: + TileNormSh_onlyop_lp + b .dsfc_inloop + +.dsfc_TileFlip_sh_lp: + TileFlipSh_onlyop_lp + b .dsfc_inloop + .pool @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -1032,13 +1090,14 @@ DrawSpritesFromCache: @ + 0 : hhhhvvvv ab--hhvv yyyyyyyy yyyyyyyy // a: offscreen h, b: offs. v, h: horiz. size @ + 4 : xxxxxxxx xxxxxxxx pccvhnnn nnnnnnnn // x: x coord + 8 -.global DrawSprite @ unsigned int *sprite, int **hc, int sh +.global DrawSprite @ unsigned int *sprite, int sh, int acc_sprites DrawSprite: stmfd sp!, {r4-r9,r11,lr} + orr r8, r2, r1, lsl #4 ldr r3, [r0] @ sprite[0] - ldr r7, =Scanline + ldr r7, =DrawScanline mov r6, r3, lsr #28 sub r6, r6, #1 @ r6=width-1 (inc later) mov r5, r3, lsr #24 @@ -1048,33 +1107,37 @@ DrawSprite: ldr r7, [r7] ldr r9, [r0, #4] - sub r7, r7, r4, asr #16 @ r7=row=Scanline-sy + sub r7, r7, r4, asr #16 @ r7=row=DrawScanline-sy - tst r2, r2 mov r2, r9, asr #16 @ r2=sx - bic r9, r9, #0xfe000000 - orrne r9, r9, #1<<31 @ r9=code|(sh<<31) + mov r9, r9, lsl #16 + mov r9, r9, lsr #16 + orr r9, r9, r8, lsl #27 @ r9=code|sh[31]|as[27] tst r9, #0x1000 movne r4, r5, lsl #3 subne r4, r4, #1 subne r7, r4, r7 @ if (code&0x1000) row=(height<<3)-1-row; // Flip Y - mov r8, r9, lsl #21 - mov r8, r8, lsr #21 - add r8, r8, r7, lsr #3 @ tile+=row>>3; // Tile number increases going down - + add r8, r9, r7, lsr #3 @ tile+=row>>3; // Tile number increases going down tst r9, #0x0800 mlane r8, r5, r6, r8 @ if (code&0x0800) { tile+=delta*(width-1); rsbne r5, r5, #0 @ delta=-delta; } // r5=delta now - mov r8, r8, lsl #4 + mov r8, r8, lsl #21 + mov r8, r8, lsr #17 and r7, r7, #7 add r8, r8, r7, lsl #1 @ tile+=(row&7)<<1; // Tile address tst r9, #0x8000 - bne .dspr_cache @ if(code&0x8000) // high priority - cache it - + tsteq r9, #(1<<27) + bne .dspr_cache @ if(code&0x8000) || as + tst r9, #0x4000 + tstne r9, #0x2000 + tstne r9, #(1<<31) + bne .dspr_cache @ (sh && pal == 0x30) + +.dspr_continue: @ cache some stuff to avoid mem access .if OVERRIDE_HIGHCOL ldr r11,=HighCol @@ -1089,11 +1152,10 @@ DrawSprite: mov r5, r5, lsl #4 @ delta<<=4; // Delta of address and r4, r9, #0x6000 orr r9, r9, r4, lsl #16 - orr r9, r9, #0x10000000 @ r9=scc1 ???? ... (s=shadow/hilight, cc=pal) + orrs r9, r9, #0x10000000 @ r9=scc1 a??? ... (s=shadow/hilight, cc=pal, a=acc_spr) - tst r9, #1<<31 mov r3, r4, lsr #9 @ r3=pal=((code>>9)&0x30); - orrne r3, r3, #0x40 @ shadow by default + orrmi r3, r3, #0x40 @ shadow by default add r6, r6, #1 @ inc now adds r0, r2, #0 @ mov sx to r0 and set ZV flags @@ -1137,6 +1199,10 @@ DrawSprite: TileFlip r12 b .dspr_loop +.dspr_singlec_sh: + cmp r2, #0xe0000000 + bcs .dspr_loop @ operator tileline, ignore + .dspr_SingleColor: and r4, r2, #0xf orr r4, r3, r4 @@ -1159,44 +1225,38 @@ DrawSprite: @ (r1=pdest, r2=pixels8, r3=pal) r4: scratch, r12: helper pattern .dspr_TileNorm_sh: - TileNormSh + TileNormSh_noop b .dspr_loop .dspr_TileFlip_sh: - TileFlipSh - b .dspr_loop - -.dspr_singlec_sh: - cmp r2, #0xe0000000 - bcc .dspr_SingleColor @ normal tileline - tst r2, #0x10000000 - bne .dspr_sh_sh - TileSingleHi - b .dspr_loop - -.dspr_sh_sh: - TileSingleSh + TileFlipSh_noop b .dspr_loop .dspr_cache: - @ *(*hc)++ = (tile<<16)|((code&0x0800)<<5)|((sx<<6)&0x0000ffc0)|((code>>9)&0x30)|((sprite[0]>>24)&0xf); + @ *HighCacheS_ptr++ = ((code&0x8000)<<16)|(tile<<16)|((code&0x0800)<<5)|((sx<<6)&0x0000ffc0)|pal|((sprite[0]>>16)&0xf); + ldr r1, =HighCacheS_ptr mov r4, r8, lsl #16 @ tile tst r9, #0x0800 orrne r4, r4, #0x10000 @ code&0x0800 - mov r2, r2, lsl #22 - orr r4, r4, r2, lsr #16 @ (sx<<6)&0x0000ffc0 - and r2, r9, #0x6000 - orr r4, r4, r2, lsr #9 @ (code>>9)&0x30 + mov r0, r2, lsl #22 + orr r4, r4, r0, lsr #16 @ (sx<<6)&0x0000ffc0 + and r0, r9, #0x6000 + orr r4, r4, r0, lsr #9 @ (code>>9)&0x30 mov r3, r3, lsl #12 - ldr r2, [r1] orr r4, r4, r3, lsr #28 @ (sprite[0]>>24)&0xf - str r4, [r2], #4 - str r2, [r1] + ldr r0, [r1] + tst r9, #0x8000 + orrne r4, r4, #0x80000000 @ prio - ldmfd sp!, {r4-r9,r11,lr} - bx lr + str r4, [r0], #4 + str r0, [r1] + + and r0, r9, #(1<<27) @ as + teqne r0, #(1<<27) @ (code&0x8000) && !as + ldmnefd sp!, {r4-r9,r11,pc} + b .dspr_continue @ draw anyway if accurate sprites enabled @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -1206,7 +1266,7 @@ DrawWindow: stmfd sp!, {r4-r11,lr} ldr r11, =(Pico+0x22228) @ Pico.video - ldr r10, =Scanline + ldr r10, =DrawScanline ldrb r12, [r11, #3] @ pvid->reg[3] ldr r10, [r10] @@ -1226,19 +1286,18 @@ DrawWindow: ldr r6, =rendstatus ldr lr, =(Pico+0x10000) @ lr=Pico.vram - ldrb r6, [r6] + ldr r6, [r6] @ fetch the first code now ldrh r7, [lr, r12] ands r6, r6, #2 @ we care about bit 1 only orr r6, r6, r2 - bne .dw_no_sameprio - cmp r2, r7, lsr #15 - ldmnefd sp!, {r4-r11,pc} @ assume that whole window uses same priority + eoreq r8, r2, r7, lsr #15 @ do prio bits differ? + cmpeq r8, #1 + ldmeqfd sp!, {r4-r11,pc} @ yes, assume that whole window uses same priority -.dw_no_sameprio: orr r6, r6, r3, lsl #8 @ shadow mode sub r8, r1, r0 @@ -1255,11 +1314,11 @@ DrawWindow: mov r8, r8, lsl #1 @ cells mvn r9, #0 @ r9=prevcode=-1 .endif - add r1, r11, r0, lsl #4 @ r1=pdest + add r1, r11, r0, lsl #4 @ r1=pdest mov r0, #0xf b .dwloop_enter - @ r4,r5 & r7 are scratch in this loop + @ r4,r5 are scratch in this loop .dwloop: add r1, r1, #8 .dwloop_nor1: @@ -1325,24 +1384,13 @@ DrawWindow: orreq r3, r3, #0x40 beq .dw_shadow_done ldr r4, [r1] - tst r4, #0x00000080 - biceq r4, r4, #0x000000c0 - tst r4, #0x00008000 - biceq r4, r4, #0x0000c000 - tst r4, #0x00800000 - biceq r4, r4, #0x00c00000 - tst r4, #0x80000000 - biceq r4, r4, #0xc0000000 + mov r5, #0x3f + orr r5, r5, r5, lsl #8 + orr r5, r5, r5, lsl #16 + and r4, r4, r5 str r4, [r1] ldr r4, [r1,#4] - tst r4, #0x00000080 - biceq r4, r4, #0x000000c0 - tst r4, #0x00008000 - biceq r4, r4, #0x0000c000 - tst r4, #0x00800000 - biceq r4, r4, #0x00c00000 - tst r4, #0x80000000 - biceq r4, r4, #0xc0000000 + and r4, r4, r5 str r4, [r1,#4] b .dw_shadow_done @@ -1452,23 +1500,29 @@ FinalizeLineBGR444: bne .fl_loopcpBGR444_hi sub r3, r4, #0x40*3*2 + mov r6, #1 .fl_noshBGR444: + ldr r12,=rendstatus + eors r6, r6, #1 @ sh is 0 + ldr r12,[r12] + mov lr, #0xff + tstne r12,#(1<<2) @ and PDRAW_ACC_SPRITES + .if OVERRIDE_HIGHCOL ldr r1, =HighCol - mov lr, #0xff + movne lr, #0x3f ldr r1, [r1] mov lr, lr, lsl #1 add r1, r1, #8 .else ldr r1, =(HighCol+8) - mov lr, #0xff + movne lr, #0x3f mov lr, lr, lsl #1 .endif .fl_loopBGR444: - ldr r12, [r1], #4 subs r2, r2, #1 @@ -1478,11 +1532,10 @@ FinalizeLineBGR444: ldrh r5, [r3, r5] and r6, lr, r12, lsr #15 ldrh r6, [r3, r6] + and r12,lr, r12, lsr #23 + ldrh r12,[r3, r12] @ 1c.i. orr r4, r4, r5, lsl #16 - - and r5, lr, r12, lsr #23 - ldrh r5, [r3, r5] @ 2c.i. - orr r5, r6, r5, lsl #16 + orr r5, r6, r12,lsl #16 stmia r0!, {r4,r5} bne .fl_loopBGR444 @@ -1617,8 +1670,16 @@ FinalizeLineRGB555: bne .fl_loopcpRGB555_hi sub r3, r3, #0x40*2 + mov r6, #1 .fl_noshRGB555: + ldr r12,=rendstatus + eors r6, r6, #1 @ sh is 0 + ldr r12,[r12] + mov lr, #0xff + tstne r12,#(1<<2) @ and PDRAW_ACC_SPRITES + movne lr, #0x3f + .if OVERRIDE_HIGHCOL ldr r1, =HighCol ldr r0, =DrawLineDest @@ -1632,7 +1693,6 @@ FinalizeLineRGB555: .endif ldrb r12, [r8, #12] - mov lr, #0xff mov lr, lr, lsl #1 tst r12, #1