Sync up header files and add back CopyToBG1 behavior as a selectable feature
This commit is contained in:
parent
7aec32ced5
commit
b154bcf361
|
@ -135,6 +135,23 @@ extern pascal Word GTEClearOverlay() inline(0x23A0, tool_dispatcher);
|
||||||
#define RENDER_BG1_HORZ_OFFSET 0x0002
|
#define RENDER_BG1_HORZ_OFFSET 0x0002
|
||||||
#define RENDER_BG1_VERT_OFFSET 0x0004
|
#define RENDER_BG1_VERT_OFFSET 0x0004
|
||||||
#define RENDER_BG1_ROTATION 0x0008
|
#define RENDER_BG1_ROTATION 0x0008
|
||||||
|
#define RENDER_PER_SCANLINE 0x0010
|
||||||
|
#define RENDER_WITH_SHADOWING 0x0020
|
||||||
|
#define RENDER_SPRITES_SORTED 0x0040
|
||||||
|
|
||||||
|
/* Overlay flags */
|
||||||
|
#define OVERLAY_MASKED 0x0000 /* Overlay has a mask, so the background must be draw first */
|
||||||
|
#define OVERLAY_SOLID 0x8000 /* Overlay covers the scan line and is fully opaque */
|
||||||
|
#define OVERLAY_ABOVE 0x0000 /* Overlay is drawn above scanline sprites */
|
||||||
|
#define OVERLAY_BELOW 0x4000 /* Overlay is drawn below scanline sprites */
|
||||||
|
|
||||||
|
/* GetAddress table IDs */
|
||||||
|
#define scanlineHorzOffset 0x0001
|
||||||
|
#define scanlineHorzOffset2 0x0002
|
||||||
|
|
||||||
|
/* CopyPicToBG1 flags */
|
||||||
|
#define COPY_PIC_NORMAL 0x0000 /* Copy into BG1 buffer in "normal mode" */
|
||||||
|
#define COPY_PIC_SCANLINE 0x0001 /* Copy in a way to support BG1 + RENDER_PER_SCANLINE. */
|
||||||
|
|
||||||
/* GTE Tile Constants */
|
/* GTE Tile Constants */
|
||||||
#define TILE_PRIORITY_BIT 0x4000 /* Put tile on top of sprite */
|
#define TILE_PRIORITY_BIT 0x4000 /* Put tile on top of sprite */
|
||||||
|
@ -147,6 +164,7 @@ extern pascal Word GTEClearOverlay() inline(0x23A0, tool_dispatcher);
|
||||||
#define TILE_CTRL_MASK 0xFE00
|
#define TILE_CTRL_MASK 0xFE00
|
||||||
|
|
||||||
/* GTE Sprite Constants */
|
/* GTE Sprite Constants */
|
||||||
|
#define GTE_SPRITE_COMPILES 0x4000
|
||||||
#define GTE_SPRITE_HIDE 0x2000
|
#define GTE_SPRITE_HIDE 0x2000
|
||||||
#define GTE_SPRITE_16X16 0x1800
|
#define GTE_SPRITE_16X16 0x1800
|
||||||
#define GTE_SPRITE_16X8 0x1000
|
#define GTE_SPRITE_16X8 0x1000
|
||||||
|
@ -155,7 +173,6 @@ extern pascal Word GTEClearOverlay() inline(0x23A0, tool_dispatcher);
|
||||||
#define GTE_SPRITE_VFLIP 0x0400
|
#define GTE_SPRITE_VFLIP 0x0400
|
||||||
#define GTE_SPRITE_HFLIP 0x0200
|
#define GTE_SPRITE_HFLIP 0x0200
|
||||||
|
|
||||||
|
|
||||||
/* GTE Sprint Stamp Storage Parameters */
|
/* GTE Sprint Stamp Storage Parameters */
|
||||||
#define GTE_VBUFF_STRIDE_BYTES (12 * 4) /* Each line has 4 slots of 16 pixels + 8 buffer pixels */
|
#define GTE_VBUFF_STRIDE_BYTES (12 * 4) /* Each line has 4 slots of 16 pixels + 8 buffer pixels */
|
||||||
#define GTE_VBUFF_TILE_ROW_BYTES (8 * GTE_VBUFF_STRIDE_BYTES) /* Each row is comprised of 8 lines */
|
#define GTE_VBUFF_TILE_ROW_BYTES (8 * GTE_VBUFF_STRIDE_BYTES) /* Each row is comprised of 8 lines */
|
||||||
|
|
|
@ -176,6 +176,10 @@ OVERLAY_BELOW equ $4000 ; Overlay is drawn below scanline sprite
|
||||||
scanlineHorzOffset equ $0001
|
scanlineHorzOffset equ $0001
|
||||||
scanlineHorzOffset2 equ $0002
|
scanlineHorzOffset2 equ $0002
|
||||||
|
|
||||||
|
; CopyPicToBG1 flags
|
||||||
|
COPY_PIC_NORMAL equ $0000 ; Copy into BG1 buffer in "normal mode"
|
||||||
|
COPY_PIC_SCANLINE equ $0001 ; Copy in a way to support BG1 + RENDER_PER_SCANLINE.
|
||||||
|
|
||||||
; Tile constants
|
; Tile constants
|
||||||
; TILE_RESERVED_BIT equ $8000
|
; TILE_RESERVED_BIT equ $8000
|
||||||
TILE_PRIORITY_BIT equ $4000 ; Put tile on top of sprite
|
TILE_PRIORITY_BIT equ $4000 ; Put tile on top of sprite
|
||||||
|
@ -187,7 +191,6 @@ TILE_HFLIP_BIT equ $0200
|
||||||
TILE_ID_MASK equ $01FF
|
TILE_ID_MASK equ $01FF
|
||||||
TILE_CTRL_MASK equ $FE00
|
TILE_CTRL_MASK equ $FE00
|
||||||
|
|
||||||
|
|
||||||
; Sprite constants
|
; Sprite constants
|
||||||
SPRITE_COMPILED equ $4000 ; This is a compiled sprite
|
SPRITE_COMPILED equ $4000 ; This is a compiled sprite
|
||||||
SPRITE_HIDE equ $2000
|
SPRITE_HIDE equ $2000
|
||||||
|
|
|
@ -198,6 +198,10 @@ DIRTY_BIT_SPRITE_ARRAY equ $0040
|
||||||
scanlineHorzOffset equ $0001 ; Table of 416 words, a double-array of scanline offset values. Values must be in range [0, 163]
|
scanlineHorzOffset equ $0001 ; Table of 416 words, a double-array of scanline offset values. Values must be in range [0, 163]
|
||||||
scanlineHorzOffset2 equ $0002 ; Table of 416 words, a double-array of scanline offset values. Values must be in range [0, 163]
|
scanlineHorzOffset2 equ $0002 ; Table of 416 words, a double-array of scanline offset values. Values must be in range [0, 163]
|
||||||
|
|
||||||
|
; CopyPicToBG1 flags
|
||||||
|
COPY_PIC_NORMAL equ $0000 ; Copy into BG1 buffer in "normal mode" treating the buffer as a 164x208 pixmap with stride of 256
|
||||||
|
COPY_PIC_SCANLINE equ $0001 ; Copy in a way to support BG1 + RENDER_PER_SCANLINE. Pixmap is double-width, 327x200 with stride of 327
|
||||||
|
|
||||||
; Script definition
|
; Script definition
|
||||||
YIELD equ $8000
|
YIELD equ $8000
|
||||||
JUMP equ $4000
|
JUMP equ $4000
|
||||||
|
|
73
src/Render.s
73
src/Render.s
|
@ -156,12 +156,10 @@ _DoOverlay
|
||||||
; Use the per-scanline tables to set the screen. This is really meant to be used without the built-in tilemap
|
; Use the per-scanline tables to set the screen. This is really meant to be used without the built-in tilemap
|
||||||
; support and is more of a low-level way to control the background rendering
|
; support and is more of a low-level way to control the background rendering
|
||||||
_RenderScanlines
|
_RenderScanlines
|
||||||
lda BG1YTable ; Make sure we're in the right mode
|
lda BG1YTable ; Make sure we're in the right mode (0 = scanline mode, $1800 = normal mode)
|
||||||
cmp #$00A0
|
|
||||||
beq :ytbl_ok
|
beq :ytbl_ok
|
||||||
lda #1
|
lda #1
|
||||||
jsr _ResetBG1YTable
|
jsr _ResetBG1YTable
|
||||||
lda BG1YTable
|
|
||||||
:ytbl_ok
|
:ytbl_ok
|
||||||
|
|
||||||
jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen
|
jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen
|
||||||
|
@ -173,12 +171,8 @@ _RenderScanlines
|
||||||
jsr _ApplyBG0XPosPre
|
jsr _ApplyBG0XPosPre
|
||||||
jsr _ApplyBG1XPosPre
|
jsr _ApplyBG1XPosPre
|
||||||
|
|
||||||
; jsr _RenderSprites ; Once the BG0 X and Y positions are committed, update sprite data
|
jsr _ApplyScanlineBG0XPos ; Patch the code field instructions with exit BRA opcode
|
||||||
|
jsr _ApplyScanlineBG1XPos
|
||||||
; jsr _ApplyTiles ; This function actually draws the new tiles into the code field
|
|
||||||
|
|
||||||
jsr _ApplyScanlineBG0XPos ; Patch the code field instructions with exit BRA opcode
|
|
||||||
jsr _ApplyScanlineBG1XPos
|
|
||||||
|
|
||||||
jsr _BuildShadowList ; Create the rages based on the sorted sprite y-values
|
jsr _BuildShadowList ; Create the rages based on the sorted sprite y-values
|
||||||
|
|
||||||
|
@ -187,57 +181,8 @@ _RenderScanlines
|
||||||
jsr _DrawDirectSprites ; Draw the sprites directly to the Bank $01 graphics buffer (skipping the render-to-tile step)
|
jsr _DrawDirectSprites ; Draw the sprites directly to the Bank $01 graphics buffer (skipping the render-to-tile step)
|
||||||
|
|
||||||
jsr _ShadowOn ; Turn shadowing back on
|
jsr _ShadowOn ; Turn shadowing back on
|
||||||
; jsr _DrawComplementList ; Alternate drawing scanlines and PEI slam to expose the full fram
|
|
||||||
jsr _DrawFinalPass
|
jsr _DrawFinalPass
|
||||||
|
|
||||||
; jsr _ApplyBG1XPos ; Update the direct page value based on the horizontal position
|
|
||||||
|
|
||||||
; The code fields are locked in now and ready to be rendered. See if there is an overlay or any
|
|
||||||
; other reason to render with shadowing off. Otherwise, just do things quickly.
|
|
||||||
|
|
||||||
; lda Overlays
|
|
||||||
; beq :no_ovrly
|
|
||||||
|
|
||||||
; jsr _ShadowOff
|
|
||||||
|
|
||||||
; Shadowing is turned off. Render all of the scan lines that need a second pass. One
|
|
||||||
; optimization that can be done here is that the lines can be rendered in any order
|
|
||||||
; since it is not shown on-screen yet.
|
|
||||||
|
|
||||||
; ldx Overlays+2 ; Blit the full virtual buffer to the screen
|
|
||||||
; ldy Overlays+4
|
|
||||||
; jsr _BltRange
|
|
||||||
|
|
||||||
; Turn shadowing back on
|
|
||||||
|
|
||||||
; jsr _ShadowOn
|
|
||||||
|
|
||||||
; Now render all of the remaining lines in top-to-bottom (or bottom-to-top) order
|
|
||||||
|
|
||||||
; ldx #0
|
|
||||||
; ldy Overlays+2
|
|
||||||
; beq :skip
|
|
||||||
; jsr _BltRange
|
|
||||||
:skip
|
|
||||||
; jsr _DoOverlay
|
|
||||||
|
|
||||||
; ldx Overlays+4
|
|
||||||
; cpx ScreenHeight
|
|
||||||
; beq :done
|
|
||||||
; ldy ScreenHeight
|
|
||||||
; jsr _BltRange
|
|
||||||
; bra :done
|
|
||||||
|
|
||||||
;:no_ovrly
|
|
||||||
; ldx #0 ; Blit the full virtual buffer to the screen
|
|
||||||
; ldy ScreenHeight
|
|
||||||
; jsr _BltRange
|
|
||||||
;:done
|
|
||||||
|
|
||||||
; ldx #0
|
|
||||||
; ldy ScreenHeight
|
|
||||||
; jsr _BltSCB
|
|
||||||
|
|
||||||
lda StartYMod208 ; Restore the fields back to their original state
|
lda StartYMod208 ; Restore the fields back to their original state
|
||||||
ldx ScreenHeight
|
ldx ScreenHeight
|
||||||
jsr _RestoreScanlineBG0Opcodes
|
jsr _RestoreScanlineBG0Opcodes
|
||||||
|
@ -693,7 +638,6 @@ _DrawFinalPass
|
||||||
bmi :empty
|
bmi :empty
|
||||||
|
|
||||||
lda _Sprites+SPRITE_CLIP_TOP,x ; Load the first object's top edge
|
lda _Sprites+SPRITE_CLIP_TOP,x ; Load the first object's top edge
|
||||||
; sta :curr_top
|
|
||||||
beq :loop ; If it's at the top edge of the screen, proceed. Othrewise _BltRange the top range
|
beq :loop ; If it's at the top edge of the screen, proceed. Othrewise _BltRange the top range
|
||||||
|
|
||||||
ldx #0
|
ldx #0
|
||||||
|
@ -761,6 +705,7 @@ _DrawFinalPass
|
||||||
tax
|
tax
|
||||||
ldy _Sprites+SPRITE_CLIP_TOP,x ; Draw the background in between
|
ldy _Sprites+SPRITE_CLIP_TOP,x ; Draw the background in between
|
||||||
ldx :curr_bottom
|
ldx :curr_bottom
|
||||||
|
; brk $34
|
||||||
jsr _BltRange
|
jsr _BltRange
|
||||||
plx
|
plx
|
||||||
bra :loop
|
bra :loop
|
||||||
|
@ -804,6 +749,8 @@ _DrawFinalPass
|
||||||
adc ScreenX0
|
adc ScreenX0
|
||||||
ldx :curr_top
|
ldx :curr_top
|
||||||
ldy :curr_bottom
|
ldy :curr_bottom
|
||||||
|
; brk $33
|
||||||
|
|
||||||
:disp jsl $000000
|
:disp jsl $000000
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
@ -826,8 +773,6 @@ _DrawComplementList
|
||||||
lda _DirectListTop,x
|
lda _DirectListTop,x
|
||||||
ldy _DirectListBottom,x
|
ldy _DirectListBottom,x
|
||||||
tax
|
tax
|
||||||
; lda #0
|
|
||||||
; jsr DebugSCBs
|
|
||||||
jsr _BltRange
|
jsr _BltRange
|
||||||
plx
|
plx
|
||||||
|
|
||||||
|
@ -841,8 +786,6 @@ _DrawComplementList
|
||||||
phx
|
phx
|
||||||
ldy _DirectListTop,x
|
ldy _DirectListTop,x
|
||||||
tax
|
tax
|
||||||
; lda #1
|
|
||||||
; jsr DebugSCBs
|
|
||||||
jsr _PEISlam
|
jsr _PEISlam
|
||||||
plx
|
plx
|
||||||
bra :blt_range
|
bra :blt_range
|
||||||
|
@ -852,13 +795,11 @@ _DrawComplementList
|
||||||
bcs :out ; screen, then expose that range
|
bcs :out ; screen, then expose that range
|
||||||
tax
|
tax
|
||||||
ldy ScreenHeight
|
ldy ScreenHeight
|
||||||
; lda #1
|
|
||||||
; jsr DebugSCBs
|
|
||||||
jsr _PEISlam
|
jsr _PEISlam
|
||||||
:out
|
:out
|
||||||
rts
|
rts
|
||||||
|
|
||||||
; Helper to set a palette index on a range of SCBs to help show whicih actions are applied to which lines
|
; Helper to set a palette index on a range of SCBs to help show which actions are applied to which lines
|
||||||
DebugSCBs
|
DebugSCBs
|
||||||
phx
|
phx
|
||||||
phy
|
phy
|
||||||
|
|
|
@ -22,7 +22,8 @@ _CopyBinToBG1
|
||||||
sta :src_width
|
sta :src_width
|
||||||
lda #208
|
lda #208
|
||||||
sta :src_height
|
sta :src_height
|
||||||
stz :src_flags
|
lda #COPY_PIC_NORMAL
|
||||||
|
sta :src_flags
|
||||||
|
|
||||||
pla
|
pla
|
||||||
jmp _CopyToBG1
|
jmp _CopyToBG1
|
||||||
|
@ -31,7 +32,7 @@ _CopyBinToBG1
|
||||||
;
|
;
|
||||||
; A = mode
|
; A = mode
|
||||||
; 0 = default (base = $1800, stride = 256)
|
; 0 = default (base = $1800, stride = 256)
|
||||||
; 1 = scanline (base = $A0, stride = 324)
|
; 1 = scanline (base = $0, stride = 327)
|
||||||
_ResetBG1YTable
|
_ResetBG1YTable
|
||||||
:base equ tmp0
|
:base equ tmp0
|
||||||
:stride equ tmp1
|
:stride equ tmp1
|
||||||
|
@ -80,8 +81,9 @@ _CopyPicToBG1
|
||||||
sta :src_stride
|
sta :src_stride
|
||||||
lda #200
|
lda #200
|
||||||
sta :src_height
|
sta :src_height
|
||||||
|
lda #COPY_PIC_NORMAL
|
||||||
|
sta :src_flags
|
||||||
pla
|
pla
|
||||||
stz :src_flags
|
|
||||||
jmp _CopyToBG1
|
jmp _CopyToBG1
|
||||||
|
|
||||||
; Generic routine to copy image data into BG1
|
; Generic routine to copy image data into BG1
|
||||||
|
@ -104,15 +106,27 @@ _CopyToBG1
|
||||||
sty :dstptr+2 ; Everything goes into this bank
|
sty :dstptr+2 ; Everything goes into this bank
|
||||||
sty :dstptr2+2
|
sty :dstptr2+2
|
||||||
|
|
||||||
|
; "Normal" BG1 mode as a stride of 164 bytes and mirrors the BG0 size (328 x 208)
|
||||||
|
; In "Scanline" mode, the BG1 is treated as a 328x200 bitfield with each horizontal line doubled
|
||||||
|
|
||||||
|
lda :src_flags
|
||||||
|
cmp #COPY_PIC_NORMAL
|
||||||
|
bne *+5
|
||||||
|
jmp :_CopyToBG1Normal
|
||||||
|
|
||||||
|
cmp #COPY_PIC_SCANLINE
|
||||||
|
bne *+5
|
||||||
|
jmp :_CopyToBG1SCanline
|
||||||
|
|
||||||
|
rts ; Flag do not match a known copy mode
|
||||||
|
|
||||||
|
:_CopyToBG1SCanline
|
||||||
lda #0 ; Start a byte 1 because odd offsets might go back 1 byte and don't want to wrap around
|
lda #0 ; Start a byte 1 because odd offsets might go back 1 byte and don't want to wrap around
|
||||||
sta :dstptr
|
sta :dstptr
|
||||||
clc
|
clc
|
||||||
adc #164 ; The first part is 1-byte short, the second part is a full 164 bytes
|
adc #164 ; The first part is 1-byte short, the second part is a full 164 bytes
|
||||||
sta :dstptr2
|
sta :dstptr2
|
||||||
|
|
||||||
; "Normal" BG1 mode as a stride of 164 bytes and mirrors the BG0 size (328 x 208)
|
|
||||||
; In "Scanline" mode, the BG1 is treated as a 320x200 bitfield with each horizontal line doubled
|
|
||||||
|
|
||||||
lda :src_width
|
lda :src_width
|
||||||
min #164
|
min #164
|
||||||
sta :src_width
|
sta :src_width
|
||||||
|
@ -164,6 +178,49 @@ _CopyToBG1
|
||||||
bcc :rloop
|
bcc :rloop
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
:_CopyToBG1Normal
|
||||||
|
stz :line_cnt
|
||||||
|
:rloop2
|
||||||
|
lda :line_cnt ; get the pointer to the code field line
|
||||||
|
asl
|
||||||
|
tax
|
||||||
|
|
||||||
|
lda BG1YTable,x
|
||||||
|
sta :dstptr
|
||||||
|
clc
|
||||||
|
adc #164
|
||||||
|
sta :dstptr2
|
||||||
|
|
||||||
|
ldy #0 ; move forward in the image data and image data
|
||||||
|
:cloop2
|
||||||
|
lda [:srcptr],y
|
||||||
|
sta [:dstptr],y
|
||||||
|
|
||||||
|
iny
|
||||||
|
iny
|
||||||
|
|
||||||
|
cpy :src_width
|
||||||
|
bcc :cloop2
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
lda [:dstptr],y ; Duplicate the last couple of words in the extra space at the end of the line
|
||||||
|
sta [:dstptr2],y
|
||||||
|
|
||||||
|
ldy #2
|
||||||
|
lda [:dstptr],y
|
||||||
|
sta [:dstptr2],y
|
||||||
|
|
||||||
|
lda :srcptr
|
||||||
|
clc
|
||||||
|
adc :src_stride
|
||||||
|
sta :srcptr
|
||||||
|
|
||||||
|
inc :line_cnt
|
||||||
|
lda :line_cnt
|
||||||
|
cmp :src_height
|
||||||
|
bcc :rloop2
|
||||||
|
rts
|
||||||
|
|
||||||
_SetBG1XPos
|
_SetBG1XPos
|
||||||
cmp BG1StartX
|
cmp BG1StartX
|
||||||
beq :out ; Easy, if nothing changed, then nothing changes
|
beq :out ; Easy, if nothing changed, then nothing changes
|
||||||
|
|
Loading…
Reference in New Issue