Update zelda demo to use tool interface

This commit is contained in:
Lucas Scharenbroich 2022-07-06 08:53:50 -05:00
parent 58705653c4
commit 41539ae606
6 changed files with 264 additions and 167 deletions

View File

@ -3,15 +3,14 @@
REL REL
DSK MAINSEG DSK MAINSEG
use Load.Macs.s use Locator.Macs
use Locator.Macs.s use Load.Macs
use Misc.Macs.s use Mem.Macs
use EDS.GSOS.MACS.s use Misc.Macs
use Tool222.Macs.s use Tool222.Macs.s
use Util.Macs.s use Util.Macs
use CORE.MACS.s use EDS.GSOS.Macs
use ../../src/GTE.s use GTE.Macs
use ../../src/Defs.s
mx %00 mx %00
@ -25,20 +24,37 @@ RIGHT_ARROW equ $15
UP_ARROW equ $0B UP_ARROW equ $0B
DOWN_ARROW equ $0A DOWN_ARROW equ $0A
StartX equ 4
StartY equ 6
TSet EXT
; Typical init ; Typical init
phk phk
plb plb
jsl EngineStartUp stz StartX
stz StartY
lda #^MyPalette ; Fill Palette #0 with our colors sta MyUserId ; GS/OS passes the memory manager user ID for the application into the program
ldx #MyPalette _MTStartUp ; GTE requires the miscellaneous toolset to be running
ldy #0
jsl SetPalette
ldx #256 ; 32 x 22 playfield (704 tiles, $580 tiles) jsr GTEStartUp ; Load and install the GTE User Tool
ldy #176
jsl SetScreenMode ; Load a tileset
pea #^TSet
pea #TSet
_GTELoadTileSet
pea $0000
pea #^MyPalette
pea #MyPalette
_GTESetPalette
pea #256
pea #176
_GTESetScreenMode
; Set up our level data ; Set up our level data
jsr BG0SetUp jsr BG0SetUp
@ -51,90 +67,105 @@ DOWN_ARROW equ $0A
stz MapScreenY stz MapScreenY
; Add a sprite to the engine and save its sprite ; Add a sprite to the engine and save its sprite
SPRITE_ID equ {SPRITE_16X16+1} HERO_DOWN_ID equ {SPRITE_16X16+1}
OKTOROK equ {SPRITE_16X16+79} HERO_DOWN_VBUFF equ VBUFF_SPRITE_START+0*VBUFF_SPRITE_STEP
HERO_SIDE_ID equ {SPRITE_16X16+5}
HERO_SIDE_VBUFF equ VBUFF_SPRITE_START+1*VBUFF_SPRITE_STEP
HERO_UP_ID equ {SPRITE_16X16+9}
HERO_UP_VBUFF equ VBUFF_SPRITE_START+2*VBUFF_SPRITE_STEP
lda PlayerX HERO_SLOT equ 0
xba OKTOROK_ID equ {SPRITE_16X16+79}
ora PlayerY OKTOROK_VBUFF equ VBUFF_SPRITE_START+3*VBUFF_SPRITE_STEP
tay ; (x, y) position OKTOROK_SLOT_1 equ 1
ldx #0 OKTOROK_SLOT_2 equ 2
lda #SPRITE_ID ; 16x16 sprite OKTOROK_SLOT_3 equ 3
jsl AddSprite OKTOROK_SLOT_4 equ 4
sta PlayerID
; Create the sprite stamps for this scene
pea HERO_DOWN_ID ; sprint id
pea HERO_DOWN_VBUFF ; vbuff address
_GTECreateSpriteStamp
pea HERO_SIDE_ID ; sprint id
pea HERO_SIDE_VBUFF ; vbuff address
_GTECreateSpriteStamp
pea HERO_UP_ID ; sprint id
pea HERO_UP_VBUFF ; vbuff address
_GTECreateSpriteStamp
pea OKTOROK_ID ; sprint id
pea OKTOROK_VBUFF ; vbuff address
_GTECreateSpriteStamp
pea HERO_DOWN_ID
lda PlayerX
pha
lda PlayerY
pha
pea HERO_SLOT
_GTEAddSprite
; Add 4 octoroks ; Add 4 octoroks
lda #OKTOROK pea OKTOROK_ID
ldx #1 pea #0
ldy #{32*256}+48 pea #{32*256}+48
jsl AddSprite pea OKTOROK_SLOT_1
_GTEAddSprite
lda #OKTOROK
ldx #2
ldy #{32*256}+96
jsl AddSprite
lda #OKTOROK
ldx #3
ldy #{96*256}+56
jsl AddSprite
lda #OKTOROK
ldx #4
ldy #{96*256}+72
jsl AddSprite
; Draw the initial screen ; Draw the initial screen
lda #DIRTY_BIT_BG0_REFRESH ; Redraw all of the tiles on the next Render _GTERender
tsb DirtyBits
jsl Render
; Set up a very specific test. First, we draw a sprite into the sprite plane, and then ; Set up a very specific test. First, we draw a sprite into the sprite plane, and then
; leave it alone. We are just testing the ability to merge sprite plane data into ; leave it alone. We are just testing the ability to merge sprite plane data into
; the play field tiles. ; the play field tiles.
EvtLoop EvtLoop
jsl ReadControl pha
_GTEReadControl
pla
; Check the buttons first ; Check the buttons first
pha pha
bit #$0100 bit #$0100
beq :no_sword beq :no_sword
:no_sword :no_sword
; Enable/disable v-sync ; Enable/disable v-sync
lda 1,s lda 1,s
bit #$0400 bit #$0400
beq :no_key_down beq :no_key_down
and #$007F and #$007F
cmp #'v' cmp #'v'
bne :not_v bne :not_v
lda #$0001 lda #$0001
eor vsync eor vsync
sta vsync sta vsync
:not_v :not_v
:no_key_down :no_key_down
pla pla
and #$007F ; Ignore the buttons for now and #$007F ; Ignore the buttons for now
cmp #'q' cmp #'q'
bne :not_q bne :not_q
brl Exit brl Exit
:not_q :not_q
cmp #'d' cmp #'d'
bne :not_d bne :not_d
inc PlayerX inc PlayerX
lda PlayerX lda PlayerX
cmp #128-8 cmp #128-8
bcc *+5 bcc *+5
jsr TransitionRight jsr TransitionRight
lda PlayerID pea HERO_SLOT
ldx #SPRITE_16X16+5 pea $0000 ; no flags
jsl UpdateSprite pea HERO_SIDE_VBUFF ; and use this stamp
_GTEUpdateSprite
bra :do_render bra :do_render
:not_d :not_d
@ -145,9 +176,10 @@ EvtLoop
bpl *+5 bpl *+5
jsr TransitionLeft jsr TransitionLeft
lda PlayerID pea HERO_SLOT
ldx #SPRITE_16X16+SPRITE_HFLIP+5 pea SPRITE_HFLIP
jsl UpdateSprite pea HERO_SIDE_VBUFF
_GTEUpdateSprite
bra :do_render bra :do_render
:not_a :not_a
@ -155,33 +187,39 @@ EvtLoop
cmp #'s' cmp #'s'
bne :not_s bne :not_s
inc PlayerY inc PlayerY
lda PlayerID
ldx #SPRITE_16X16+1 pea HERO_SLOT
jsl UpdateSprite pea $0000
pea HERO_DOWN_VBUFF
_GTEUpdateSprite
bra :do_render bra :do_render
:not_s :not_s
cmp #'w' cmp #'w'
bne :not_w bne :not_w
dec PlayerY dec PlayerY
lda PlayerID pea HERO_SLOT
ldx #SPRITE_16X16+9 pea $0000
jsl UpdateSprite pea HERO_UP_VBUFF
_GTEUpdateSprite
bra :do_render bra :do_render
:not_w :not_w
:do_render :do_render
lda PlayerID pea HERO_SLOT
ldx PlayerX lda PlayerX
ldy PlayerY pha
jsl MoveSprite ; Move the sprite to the current position lda PlayerY
pha
_GTEMoveSprite
; Based on the frame count, move an oktorok ; Based on the frame count, move an oktorok
jsl GetVBLTicks
pha jsr _GetVBLTicks
and #$0003 pha
asl and #$0003
tax asl
tax
pla pla
and #$007C and #$007C
@ -199,35 +237,35 @@ EvtLoop
pla pla
inc inc
inc inc
jsl MoveSprite ; jsl MoveSprite
; Let's see what it looks like! ; Let's see what it looks like!
lda vsync ; lda vsync
beq :no_vsync ; beq :no_vsync
:vsyncloop jsl GetVerticalCounter ; 8-bit value ;:vsyncloop jsl GetVerticalCounter ; 8-bit value
cmp ScreenY0 ; cmp ScreenY0
bcc :vsyncloop ; bcc :vsyncloop
sec ; sec
sbc ScreenY0 ; sbc ScreenY0
cmp #4 ; cmp #4
bcs :vsyncloop ; Wait until we're within the top 8 scanlines ; bcs :vsyncloop ; Wait until we're within the top 8 scanlines
lda #1 ; lda #1
jsl SetBorderColor ; jsl SetBorderColor
:no_vsync ;:no_vsync
jsl RenderDirty _GTERenderDirty
lda vsync ; lda vsync
beq :no_vsync2 ; beq :no_vsync2
lda #0 ; lda #0
jsl SetBorderColor ; jsl SetBorderColor
:no_vsync2 :no_vsync2
brl EvtLoop brl EvtLoop
; Exit code ; Exit code
Exit Exit
jsl EngineShutDown _GTEShutDown
_QuitGS qtRec _QuitGS qtRec
@ -249,7 +287,10 @@ TransitionRight
bcs :out bcs :out
clc clc
adc #4 adc #4
jsl SetBG0XPos pha
lda StartY
pha
_GTESetBG0Origin
lda PlayerX lda PlayerX
sec sec
@ -257,13 +298,15 @@ TransitionRight
bmi :nosprite bmi :nosprite
sta PlayerX sta PlayerX
lda PlayerID pea HERO_SLOT
ldx PlayerX lda PlayerX
ldy PlayerY pha
jsl MoveSprite lda PlayerY
pha
_GTEMoveSprite
:nosprite :nosprite
jsl Render ; Do full renders since the playfield is scrolling _GTERender ; Do full renders since the playfield is scrolling
bra :loop bra :loop
:out :out
@ -289,7 +332,9 @@ TransitionLeft
beq :out beq :out
sec sec
sbc #4 sbc #4
jsl SetBG0XPos pha
pei StartY
_GTESetBG0Origin
lda PlayerX lda PlayerX
clc clc
@ -298,20 +343,25 @@ TransitionLeft
bcs :nosprite bcs :nosprite
sta PlayerX sta PlayerX
lda PlayerID pea HERO_SLOT
ldx PlayerX lda PlayerX
ldy PlayerY pha
jsl MoveSprite lda PlayerY
pha
_GTEMoveSprite
:nosprite :nosprite
jsl Render _GTERender
bra :loop bra :loop
:out :out
; lda #128-8 ; Move the player back to the right edge ; lda #128-8 ; Move the player back to the right edge
; sta PlayerX ; sta PlayerX
dec MapScreenX ; Move the index to the next screen dec MapScreenX ; Move the index to the next screen
:done :done
rts rts
ToolPath str '1/Tool160'
MyUserId ds 2
; Color palette ; Color palette
;MyPalette dw $068F,$0EDA,$0000,$0000,$0BF1,$00A0,$0EEE,$0456,$0FA4,$0F59,$0E30,$01CE,$02E3,$0870,$0F93,$0FD7 ;MyPalette dw $068F,$0EDA,$0000,$0000,$0BF1,$00A0,$0EEE,$0456,$0FA4,$0F59,$0E30,$01CE,$02E3,$0870,$0F93,$0FD7
MyPalette dw $0FDA,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$023E,$01CE,$02E3,$0870,$0F93,$0FD7 MyPalette dw $0FDA,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$023E,$01CE,$02E3,$0870,$0F93,$0FD7
@ -337,6 +387,65 @@ qtRec adrl $0000
vsync dw $8000 vsync dw $8000
_GetVBLTicks
PushLong #0
_GetTick
pla
plx
rts
; Load the GTE User Tool and install it
GTEStartUp
pea $0000
_LoaderStatus
pla
pea $0000
pea $0000
pea $0000
pea $0000
pea $0000 ; result space
lda MyUserId
pha
pea #^ToolPath
pea #ToolPath
pea $0001 ; do not load into special memory
_InitialLoad
bcc :ok1
brk $01
:ok1
ply
pla ; Address of the loaded tool
plx
ply
ply
pea $8000 ; User toolset
pea $00A0 ; Set the tool set number
phx
pha ; Address of function pointer table
_SetTSPtr
bcc :ok2
brk $02
:ok2
clc ; Give GTE a page of direct page memory
tdc
adc #$0100
pha
pea #0 ; Fast Mode
lda MyUserId ; Pass the userId for memory allocation
pha
_GTEStartUp
bcc :ok3
brk $03
:ok3
rts
PUT gen/App.TileMapBG0.s PUT gen/App.TileMapBG0.s
ANGLEBNK ENT ANGLEBNK ENT

View File

@ -7,37 +7,9 @@
; Segment #1 -- Main execution block ; Segment #1 -- Main execution block
ASM App.Main.s ASM App.Main.s
DS 0 ; Number of bytes of 0's to add at the end of the Segment
KND #$1100 ; Type and Attributes ($11=Static+Bank Relative,$00=Code)
ALI None ; Boundary Alignment (None)
SNA Main SNA Main
; Segment #2 -- Core GTE Code ; Segment #2 -- Tileset
ASM ..\..\src\Core.s
SNA Core
; Segment #3 -- 64KB Tile Memory
ASM gen\App.TileSet.s ASM gen\App.TileSet.s
DS 0 SNA TSET
KND #$1001 ; Type and Attributes ($11=Static+Bank Relative,$01=Data)
SNA Tiles
; Segment #4 -- 64KB Sprite Plane Data
ASM SprData.s
KND #$1001 ; Type and Attributes ($11=Static+Bank Relative,$01=Data)
SNA SPRDATA
; Segment #5 -- 64KB Sprite Mask Data
ASM SprMask.s
KND #$1001 ; Type and Attributes ($11=Static+Bank Relative,$01=Data)
SNA SPRMASK
; Segment #6 -- 64KB Tile Store
ASM TileStore.s
KND #$1001 ; Type and Attributes ($11=Static+Bank Relative,$01=Data)
SNA TSTORE

View File

@ -5,14 +5,19 @@
BG0SetUp BG0SetUp
lda #64 pea #64
sta TileMapWidth pea #44
lda #44 pea #^Tile_Layer_1
sta TileMapHeight pea #Tile_Layer_1
lda #Tile_Layer_1 _GTESetBG0TileMapInfo
sta TileMapPtr ; lda #64
lda #^Tile_Layer_1 ; sta TileMapWidth
sta TileMapPtr+2 ; lda #44
; sta TileMapHeight
; lda #Tile_Layer_1
; sta TileMapPtr
; lda #^Tile_Layer_1
; sta TileMapPtr+2
rts rts
Tile_Layer_1 Tile_Layer_1

View File

@ -2,7 +2,7 @@
; Palette: ; Palette:
; $0F0F,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$023E ; $0F0F,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$023E
; Converting to BG0 format... ; Converting to BG0 format...
tiledata ENT TSet ENT
; Reserved space (tile 0 is special... ; Reserved space (tile 0 is special...
ds 128 ds 128

View File

@ -111,6 +111,9 @@ _GTEFillTileStore MAC
_GTERefresh MAC _GTERefresh MAC
UserTool $2600+GTEToolNum UserTool $2600+GTEToolNum
<<< <<<
_GTERenderDirty MAC
UserTool $2700+GTEToolNum
<<<
; EngineMode definitions ; EngineMode definitions
; Script definition ; Script definition

View File

@ -90,6 +90,7 @@ _CallTable
adrl _TSGetTileDataAddr-1 adrl _TSGetTileDataAddr-1
adrl _TSFillTileStore-1 adrl _TSFillTileStore-1
adrl _TSRefresh-1 adrl _TSRefresh-1
adrl _TSRenderDirty-1
_CTEnd _CTEnd
_GTEAddSprite MAC _GTEAddSprite MAC
UserTool $1000+GTEToolNum UserTool $1000+GTEToolNum
@ -282,6 +283,13 @@ _TSRender
jsr _Render jsr _Render
_TSExit #0;#0 _TSExit #0;#0
; RenderDirty()
_TSRenderDirty
_TSEntry
jsr _RenderDirty
_TSExit #0;#0
; LoadTileSet(Pointer) ; LoadTileSet(Pointer)
_TSLoadTileSet _TSLoadTileSet
TSPtr equ FirstParam TSPtr equ FirstParam