From 56b66033a755d4a7e430f531474c14d36bb1fb5f Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 22 May 2023 13:55:56 -0500 Subject: [PATCH] Add support for sprite priority --- demos/smb/ppu.s | 2 +- src/SpriteRender.s | 142 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 1 deletion(-) diff --git a/demos/smb/ppu.s b/demos/smb/ppu.s index f6be79c..89e8368 100644 --- a/demos/smb/ppu.s +++ b/demos/smb/ppu.s @@ -1025,7 +1025,7 @@ oam_loop :noflip pla asl - and #$0106 ; Set the vflip bit and palette select bits + and #$0146 ; Set the vflip bit, priority, and palette select bits drawTilePatch jsl $000000 ; Draw the tile on the graphics screen diff --git a/src/SpriteRender.s b/src/SpriteRender.s index d2b493d..c9c72e1 100644 --- a/src/SpriteRender.s +++ b/src/SpriteRender.s @@ -195,11 +195,19 @@ pal_select dw $3333,$6666,$9999,$CCCC _DrawTileToScreen :palette equ 248 + phb pea $0101 plb plb + bit #$0040 + beq :no_prio + bit #$0100 + jeq _DrawPriorityToScreen + jmp _DrawPriorityToScreenV + +:no_prio bit #$0100 jne _DrawTileToScreenV @@ -231,6 +239,73 @@ _DrawTileToScreen plb rtl ; special exit +_DrawPriorityToScreen +:palette equ 248 +:p_tmp equ 144 + + phx + and #$0006 + tax + ldal pal_select,x + sta :palette + plx + clc + +]line equ 0 + lup 8 + ldal tiledata+{]line*4}+2,x + adc :palette + eor: {]line*SHR_LINE_WIDTH}+2,y + sta :p_tmp + +; Convert the screen data to a mask. Zero in screen = zero in mask, else $F + lda: {]line*SHR_LINE_WIDTH}+2,y + bit #$F000 + beq *+5 + ora #$F000 + bit #$0F00 + beq *+5 + ora #$0F00 + bit #$00F0 + beq *+5 + ora #$00F0 + bit #$000F + beq *+5 + ora #$000F + eor #$FFFF + and :p_tmp + andl tiledata+{]line*4}+32+2,x + eor: {]line*SHR_LINE_WIDTH}+2,y + sta: {]line*SHR_LINE_WIDTH}+2,y + + ldal tiledata+{]line*4},x + adc :palette + eor: {]line*SHR_LINE_WIDTH},y + sta :p_tmp + + lda: {]line*SHR_LINE_WIDTH},y + bit #$F000 + beq *+5 + ora #$F000 + bit #$0F00 + beq *+5 + ora #$0F00 + bit #$00F0 + beq *+5 + ora #$00F0 + bit #$000F + beq *+5 + ora #$000F + eor #$FFFF + and :p_tmp + andl tiledata+{]line*4}+32,x + eor: {]line*SHR_LINE_WIDTH},y + sta: {]line*SHR_LINE_WIDTH},y +]line equ ]line+1 + --^ + plb + rtl ; special exit + _DrawTileToScreenV :palette equ 248 phx @@ -261,6 +336,73 @@ _DrawTileToScreenV plb rtl ; special exit +_DrawPriorityToScreenV +:palette equ 248 +:p_tmp equ 144 + + phx + and #$0006 + tax + ldal pal_select,x + sta :palette + plx + clc + +]line equ 0 + lup 8 + ldal tiledata+{{7-]line}*4}+2,x + adc :palette + eor: {]line*SHR_LINE_WIDTH}+2,y + sta :p_tmp + +; Convert the screen data to a mask + lda: {]line*SHR_LINE_WIDTH}+2,y + bit #$F000 + beq *+5 + ora #$F000 + bit #$0F00 + beq *+5 + ora #$0F00 + bit #$00F0 + beq *+5 + ora #$00F0 + bit #$000F + beq *+5 + ora #$000F + eor #$FFFF + and :p_tmp + andl tiledata+{{7-]line}*4}+32+2,x + eor: {]line*SHR_LINE_WIDTH}+2,y + sta: {]line*SHR_LINE_WIDTH}+2,y + + ldal tiledata+{{7-]line}*4},x + adc :palette + eor: {]line*SHR_LINE_WIDTH},y + sta :p_tmp + + lda: {]line*SHR_LINE_WIDTH},y + bit #$F000 + beq *+5 + ora #$F000 + bit #$0F00 + beq *+5 + ora #$0F00 + bit #$00F0 + beq *+5 + ora #$00F0 + bit #$000F + beq *+5 + ora #$000F + eor #$FFFF + and :p_tmp + andl tiledata+{{7-]line}*4}+32,x + eor: {]line*SHR_LINE_WIDTH},y + sta: {]line*SHR_LINE_WIDTH},y +]line equ ]line+1 + --^ + plb + rtl ; special exit + ; Draw a sprite directly to the graphics screen. If sprite is clipped at all, do not draw. ; ; X = sprite record index