From 9da3616c1d7649a4c28c5390eb955523f334b126 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sun, 22 May 2022 23:54:47 -0500 Subject: [PATCH] Start working to bring sprites rendering back into the pipeline --- macros/GTE.Macs.s | 39 +++++++++++++++++++--------- src/Defs.s | 2 ++ src/Memory.s | 6 ++--- src/Render.s | 2 +- src/Sprite.s | 5 ++-- src/Tool.s | 59 ++++++++++++++++++++++++++++++++++++++++++ src/blitter/Blitter.s | 5 ++++ src/blitter/SCB.s | 4 +-- src/blitter/Vert.s | 9 ++++--- src/static/TileStore.s | 7 ++++- 10 files changed, 112 insertions(+), 26 deletions(-) diff --git a/macros/GTE.Macs.s b/macros/GTE.Macs.s index abc3758..2932fcf 100644 --- a/macros/GTE.Macs.s +++ b/macros/GTE.Macs.s @@ -4,38 +4,53 @@ GTEToolNum equ $A0 _GTEBootInit MAC - UserTool $100+GTEToolNum + UserTool $0100+GTEToolNum <<< _GTEStartUp MAC - UserTool $200+GTEToolNum + UserTool $0200+GTEToolNum <<< _GTEShutDown MAC - UserTool $300+GTEToolNum + UserTool $0300+GTEToolNum <<< _GTEVersion MAC - UserTool $400+GTEToolNum + UserTool $0400+GTEToolNum <<< _GTEReset MAC - UserTool $500+GTEToolNum + UserTool $0500+GTEToolNum <<< _GTEStatus MAC - UserTool $600+GTEToolNum + UserTool $0600+GTEToolNum <<< _GTEReadControl MAC - UserTool $900+GTEToolNum + UserTool $0900+GTEToolNum <<< _GTESetScreenMode MAC - UserTool $A00+GTEToolNum + UserTool $0A00+GTEToolNum <<< _GTESetTile MAC - UserTool $B00+GTEToolNum + UserTool $0B00+GTEToolNum <<< _GTESetBG0Origin MAC - UserTool $C00+GTEToolNum + UserTool $0C00+GTEToolNum <<< _GTERender MAC - UserTool $D00+GTEToolNum + UserTool $0D00+GTEToolNum <<< _GTELoadTileSet MAC - UserTool $E00+GTEToolNum + UserTool $0E00+GTEToolNum <<< +_GTECreateSpriteStamp MAC + UserTool $0F00+GTEToolNum + <<< +_GTEAddSprite MAC + UserTool $1000+GTEToolNum + <<< +_GTEMoveSprite MAC + UserTool $1100+GTEToolNum + <<< +_GTEUpdateSprite MAC + UserTool $1200+GTEToolNum + <<< +_GTERemoveSprite MAC + UserTool $1300+GTEToolNum + <<< \ No newline at end of file diff --git a/src/Defs.s b/src/Defs.s index 6c5070c..31823ef 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -238,3 +238,5 @@ Timers EXT DefaultPalette EXT ScreenModeWidth EXT ScreenModeHeight EXT +_SpriteBits EXT +_SpriteBitsNot EXT diff --git a/src/Memory.s b/src/Memory.s index 6a05700..c4c449d 100644 --- a/src/Memory.s +++ b/src/Memory.s @@ -97,6 +97,7 @@ InitMemory lda EngineMode sta BTableHigh+]step+{208*2},x ; 16 lines per bank ]step equ ]step+2 --^ + lda BlitBuff,y sta BTableLow,x sta BTableLow+{208*2},x @@ -110,10 +111,12 @@ InitMemory lda EngineMode --^ txa + clc adc #16*2 ; move to the next chunk of BTableHigh and BTableLow tax tya + clc adc #4 ; move to the next bank address tay cmp #4*13 @@ -153,9 +156,6 @@ InitMemory lda EngineMode :exit rts -;Buff00 ds 4 -;Buff01 ds 4 - ; Bank allocator (for one full, fixed bank of memory. Can be immediately deferenced) AllocOneBank PushLong #0 diff --git a/src/Render.s b/src/Render.s index d86fff1..6adb306 100644 --- a/src/Render.s +++ b/src/Render.s @@ -74,7 +74,7 @@ _Render ; ldy ScreenHeight ; jsr _BltSCB - lda StartY ; Restore the fields back to their original state + lda StartYMod208 ; Restore the fields back to their original state ldx ScreenHeight jsr _RestoreBG0Opcodes diff --git a/src/Sprite.s b/src/Sprite.s index 506ed77..f23c77b 100644 --- a/src/Sprite.s +++ b/src/Sprite.s @@ -117,7 +117,6 @@ _AddSprite sta _Sprites+SPRITE_X,x ; X coordinate jsr _PrecalcAllSpriteInfo ; Cache sprite property values (simple stuff) -; jsr _DrawSpriteSheet ; Render the sprite into internal space ; Mark the dirty bit to indicate that the active sprite list needs to be rebuilt in the next ; render call @@ -535,7 +534,7 @@ _DoPhase2 ; can be drawn to the screen. This routine is also responsible for setting the specific ; VBUFF address for each sprite's tile sheet position - jmp _MarkDirtySprite +; jmp _MarkDirtySprite :out rts @@ -867,7 +866,7 @@ _RemoveSprite ; Update the sprite's flags. We do not allow the size of a sprite to be changed. That requires ; the sprite to be removed and re-added. ; -; A = Sprite ID +; A = Sprite slot ; X = New Sprite Flags ; Y = New Sprite Stamp Address _UpdateSprite diff --git a/src/Tool.s b/src/Tool.s index 86b28ea..e528672 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -51,6 +51,7 @@ _CallTable adrl _TSSetBG0Origin-1 adrl _TSRender-1 adrl _TSLoadTileSet-1 + adrl _TSCreateSpriteStamp-1 _CTEnd ; Helper function to set the data back to the toolset default @@ -222,6 +223,8 @@ xPos equ FirstParam+2 lda xPos,s jsr _SetBG0XPos lda yPos,s + bpl *+5 + lda #0 jsr _SetBG0YPos _TSExit #0;#4 @@ -245,6 +248,60 @@ TSPtr equ FirstParam _TSExit #0;#4 +; CreateSpriteStamp(spriteId: Word, vbuffAddr: Word) +_TSCreateSpriteStamp +:vbuff equ FirstParam +:spriteId equ FirstParam+2 + + _TSEntry + + lda :vbuff,s + tay + lda :spriteId,s + jsr _CreateSpriteStamp + + _TSExit #0;#4 + +_TSAddSprite +:spriteSlot equ FirstParam+0 +:spriteY equ FirstParam+2 +:spriteX equ FirstParam+4 +:spriteId equ FirstParam+6 + + _TSEntry + + lda :spriteY,s + and #$00FF + xba + sta :spriteY,s + lda :spriteX,s + and #$00FF + ora :spriteY,s + tay + + lda :spriteSlot,s + tax + + lda :spriteId,s + jsr _AddSprite + + _TSExit #0;#8 + +_TSUpdateSprite +:vbuff equ FirstParam+0 +:spriteFlags equ FirstParam+2 +:spriteSlot equ FirstParam+4 + _TSEntry + + lda :spriteFlags,s + tax + lda :vbuff,s + tay + lda :spriteSlot,s + jsr _UpdateSprite + + _TSExit #0;#6 + ; Insert the GTE code put Math.s @@ -253,6 +310,8 @@ TSPtr equ FirstParam put Timer.s put Graphics.s put Tiles.s + put Sprite.s + put SpriteRender.s put Render.s put tiles/DirtyTileQueue.s put tiles/FastRenderer.s diff --git a/src/blitter/Blitter.s b/src/blitter/Blitter.s index 0c5b4ad..44d5f36 100644 --- a/src/blitter/Blitter.s +++ b/src/blitter/Blitter.s @@ -51,6 +51,11 @@ _BltRange lda #FULL_RETURN ; this is the offset of the return code sta [:exit_ptr],y ; patch out the low byte of the JMP/JML +; lda StartYMod208 +; cmp #63 +; bne *+4 +; brk $40 + ; Now we need to set up the Bank, Stack Pointer and Direct Page registers for calling into ; the code field diff --git a/src/blitter/SCB.s b/src/blitter/SCB.s index f43e02c..361018a 100644 --- a/src/blitter/SCB.s +++ b/src/blitter/SCB.s @@ -28,10 +28,10 @@ _BltSCB lda SCBArrayPtr+2 bpl :bind_to_bg0 - lda BG1StartY + lda BG1StartYMod208 bra :bind_to_bg1 :bind_to_bg0 - lda StartY + lda StartYMod208 :bind_to_bg1 clc adc SCBArrayPtr diff --git a/src/blitter/Vert.s b/src/blitter/Vert.s index 0679cd3..042cce3 100644 --- a/src/blitter/Vert.s +++ b/src/blitter/Vert.s @@ -91,8 +91,9 @@ _ApplyBG0YPos sta :lines_left jne :loop - plb + +:out rts ; Unrolled copy routine to move RTable intries into STK_ADDR position. @@ -145,7 +146,7 @@ CopyRTableToStkAddr :x14 ldal RTable+26,x sta STK_ADDR+$D000,y :x13 ldal RTable+24,x - sta: STK_ADDR+$C000,y + sta STK_ADDR+$C000,y :x12 ldal RTable+22,x sta STK_ADDR+$B000,y :x11 ldal RTable+20,x @@ -153,7 +154,7 @@ CopyRTableToStkAddr :x10 ldal RTable+18,x sta STK_ADDR+$9000,y :x09 ldal RTable+16,x - sta: STK_ADDR+$8000,y + sta STK_ADDR+$8000,y :x08 ldal RTable+14,x sta STK_ADDR+$7000,y :x07 ldal RTable+12,x @@ -161,7 +162,7 @@ CopyRTableToStkAddr :x06 ldal RTable+10,x sta STK_ADDR+$5000,y :x05 ldal RTable+08,x - sta: STK_ADDR+$4000,y + sta STK_ADDR+$4000,y :x04 ldal RTable+06,x sta STK_ADDR+$3000,y :x03 ldal RTable+04,x diff --git a/src/static/TileStore.s b/src/static/TileStore.s index 7f65abb..ec7ff57 100644 --- a/src/static/TileStore.s +++ b/src/static/TileStore.s @@ -308,7 +308,6 @@ RTable ENT ; Array of addresses for the banks that hold the blitter. BlitBuff ENT - dw $5a5a ds 4*13 ; The blitter table (BTable) is a double-length table that holds the full 4-byte address of each @@ -374,5 +373,11 @@ ScreenModeWidth ENT ScreenModeHeight ENT dw 200,192,200,176,160,160,160,128,144,192,102,1 +; Convert sprite index to a bit position +_SpriteBits ENT + dw $0001,$0002,$0004,$0008,$0010,$0020,$0040,$0080,$0100,$0200,$0400,$0800,$1000,$2000,$4000,$8000 +_SpriteBitsNot ENT + dw $FFFE,$FFFD,$FFFB,$FFF7,$FFEF,$FFDF,$FFBF,$FF7F,$FEFF,$FDFF,$FBFF,$F7FF,$EFFF,$DFFF,$BFFF,$7FFF + blt_return stk_save \ No newline at end of file