iigs-game-engine/demos/tool/App.Main.s

496 lines
12 KiB
ArmAsm

REL
DSK MAINSEG
use Locator.Macs
use Load.Macs
use Mem.Macs
use Misc.Macs
use Util.Macs
use EDS.GSOS.Macs
use GTE.Macs
mx %00
TSZelda EXT ; tileset buffer
MAX_SPRITES equ 16
ScreenX equ 0
ScreenY equ 2
Tmp0 equ 4
Tmp1 equ 6
KeyState equ 8
Selected equ 10
Flips equ 12
DTile equ 14
Tmp2 equ 16
ScreenWidth equ 18
ScreenHeight equ 20
SpriteFlags equ 22
frameCount equ 24
OldOneSecondCounter equ 26
SpriteAddr equ 28
RenderMode equ 30
; Control modes
DefaultMode equ RENDER_WITH_SHADOWING
SlowSprites equ 0
; Typical init
phk
plb
sta MyUserId ; GS/OS passes the memory manager user ID for the application into the program
tdc
sta MyDirectPage ; Keep a copy for the overlay callback
_MTStartUp ; GTE requires the miscellaneous toolset to be running
lda #ENGINE_MODE_USER_TOOL ; +ENGINE_MODE_TWO_LAYER
jsr GTEStartUp ; Load and install the GTE User Tool
; Init local variables
stz frameCount
lda #DefaultMode
sta RenderMode
; Initialize the graphics screen to a 256x160 playfield
pea #160
pea #200
_GTESetScreenMode
; Load a tileset
pea 0
pea 360
pea #^TSZelda
pea #TSZelda
_GTELoadTileSet
; Set the palette
pea $0000
pea #^palette
pea #palette
_GTESetPalette
jsr SetLimits
lda #193 ; Tile ID of '0'
jsr InitOverlay ; Initialize the status bar
pha
_GTEGetSeconds
pla
sta OldOneSecondCounter
jsr UdtOverlay
; Create stamps for the sprites we are going to use
HERO_SPRITE equ SPRITE_16X16+1
pea HERO_SPRITE ; sprint id
pea VBUFF_SPRITE_START ; vbuff address
_GTECreateSpriteStamp
DO SlowSprites
lda #SPRITE_16X16
sta SpriteFlags
lda #VBUFF_SPRITE_START
sta SpriteAddr
ELSE
lda #SPRITE_16X16+SPRITE_COMPILED
sta SpriteFlags
pha ; Space for result
pea SPRITE_16X16
pea VBUFF_SPRITE_START
_GTECompileSpriteStamp
pla
sta SpriteAddr
FIN
; Create sprites
stz Tmp0
stz Tmp1 ; Slot number
ldx Tmp0
:sloop
pei Tmp1 ; Put the sprite in this slot
pei SpriteFlags ; with these flags (h/v flip)
pei SpriteAddr
lda PlayerX,x
pha
lda PlayerY,x
pha
_GTEAddSprite
inc Tmp1
ldx Tmp0
inx
inx
stx Tmp0
cpx #MAX_SPRITES*2
bcc :sloop
; Manually fill in the 41x26 tiles of the TileStore with a test pattern of trees
jsr _fillTileStore
; Set the screen coordinates
lda #0
sta ScreenX
lda #0
sta ScreenY
stz Selected
stz Flips
; Very simple actions
:evt_loop
pha ; space for result, with pattern
_GTEReadControl
pla
jsr HandleKeys ; Do the generic key handlers
bcs :do_more
brl :do_render
:do_more
and #$007F
cmp #'a' ; Put in single-step advance mode
bne :skip_a
:a_loop
jsr :next_frame
:a_spin
pha ; space for result, with pattern
_GTEReadControl
pla
bit #PAD_KEY_DOWN
bne :a_spin
and #$007F
cmp #'r' ; resume?
beq :do_render
cmp #'s'
beq :toggle_sort
cmp #'a'
beq :a_loop
bra :a_spin
:toggle_sort lda RenderMode
eor #RENDER_SPRITES_SORTED
sta RenderMode
pei RenderMode
_GTERender
bra :a_spin
:skip_a
:do_render jsr :next_frame
brl :evt_loop
:next_frame
jsr _moveSprites
inc ScreenX
inc ScreenY
pei ScreenX
pei ScreenY
_GTESetBG0Origin
pei RenderMode
_GTERender
; Update the performance counters
inc frameCount
pha
_GTEGetSeconds
pla
cmp OldOneSecondCounter
beq :noudt
sta OldOneSecondCounter
jsr UdtOverlay
stz frameCount
:noudt
rts
; Shut down everything
Exit
_GTEShutDown
_QuitGS qtRec
qtRec adrl $0000
da $00
; Array of sprite positions and velocities
DO 1
PlayerX dw 8,14,29,34,45,67,81,83,92,101,39,22,7,74,111,9
PlayerY dw 72,24,13,56,35,72,23,8,93,123,134,87,143,14,46,65
PlayerU dw 1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4
PlayerV dw 1,1,1,1,2,2,2,4,3,3,3,3,4,4,4,4
ELSE
PlayerX dw 2,12,22,32,42,52,62,72,2,12,22,32,42,52,62,72,
PlayerY dw 24,24,24,24,24,24,24,24,44,44,44,44,44,44,44,44
PlayerU dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PlayerV dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
FIN
_moveSprites
stz Tmp0
:loop
ldx Tmp0
lda PlayerX,x
clc
adc PlayerU,x
sta PlayerX,x
bpl :chk_xpos
eor #$FFFF
inc
sta PlayerX,x
bra :rev_x
:chk_xpos
cmp ScreenWidth
bcc :ok_x
sbc ScreenWidth
eor #$FFFF
inc
clc
adc ScreenWidth
sta PlayerX,x
:rev_x
lda PlayerU,x ; reverse the velocity
eor #$FFFF
inc
sta PlayerU,x
:ok_x
lda PlayerY,x
clc
adc PlayerV,x
sta PlayerY,x
bpl :chk_ypos
eor #$FFFF
inc
sta PlayerY,x
bra :rev_y
:chk_ypos
cmp ScreenHeight
bcc :ok_y
sbc ScreenHeight
eor #$FFFF
inc
clc
adc ScreenHeight
sta PlayerY,x
:rev_y
lda PlayerV,x ; reverse the velocity
eor #$FFFF
inc
sta PlayerV,x
:ok_y
txa
lsr
pha
lda PlayerX,x
pha
lda PlayerY,x
pha
_GTEMoveSprite
lda Tmp0
inc
inc
sta Tmp0
cmp #2*MAX_SPRITES
bcc :loop
rts
; Called by StartUp function callbacks when the screen size changes
SetLimits
pha ; Allocate space for x, y, width, height
pha
pha
pha
_GTEGetScreenInfo
pla
pla ; Discard screen corner
pla
sec
sbc #8
sta ScreenWidth ; Pre-adjust to keep sprites on the visible playfield (for compiled sprites)
pla
sec
sbc #16
sta ScreenHeight
rts
_fillTileStore
sta Tmp2
stz Tmp0
:oloop
stz Tmp1
:iloop
ldx Tmp1
ldy Tmp0
jsr _drawTree
lda Tmp1
clc
adc #2
sta Tmp1
cmp #40
bcc :iloop
lda Tmp0
clc
adc #2
sta Tmp0
cmp #25
bcc :oloop
rts
; Tile 65 Tile 66
; Tile 97 Tile 98
_drawTreeFront
phx
phy
pea #65+TILE_PRIORITY_BIT
inx
phx
phy
pea #66+TILE_PRIORITY_BIT
iny
phx
phy
pea #98+TILE_PRIORITY_BIT
dex
phx
phy
pea #97+TILE_PRIORITY_BIT
_GTESetTile
_GTESetTile
_GTESetTile
_GTESetTile
rts
_drawTree
phx
phy
pea #65
inx
phx
phy
pea #66
iny
phx
phy
pea #98
dex
phx
phy
pea #97
_GTESetTile
_GTESetTile
_GTESetTile
_GTESetTile
rts
_drawTreeH
phx
phy
pea #66+TILE_HFLIP_BIT
inx
phx
phy
pea #65+TILE_HFLIP_BIT
iny
phx
phy
pea #97+TILE_HFLIP_BIT
dex
phx
phy
pea #98+TILE_HFLIP_BIT
_GTESetTile
_GTESetTile
_GTESetTile
_GTESetTile
rts
_drawTreeV
phx
phy
pea #97+TILE_VFLIP_BIT
inx
phx
phy
pea #98+TILE_VFLIP_BIT
iny
phx
phy
pea #66+TILE_VFLIP_BIT
dex
phx
phy
pea #65+TILE_VFLIP_BIT
_GTESetTile
_GTESetTile
_GTESetTile
_GTESetTile
rts
_drawTreeHV
phx
phy
pea #98+TILE_VFLIP_BIT+TILE_HFLIP_BIT
inx
phx
phy
pea #97+TILE_VFLIP_BIT+TILE_HFLIP_BIT
iny
phx
phy
pea #65+TILE_VFLIP_BIT+TILE_HFLIP_BIT
dex
phx
phy
pea #66+TILE_VFLIP_BIT+TILE_HFLIP_BIT
_GTESetTile
_GTESetTile
_GTESetTile
_GTESetTile
rts
MyDirectPage ds 2
MyUserId ds 2
palette dw $0000,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$0FD7,$0F59,$0000,$01CE,$0EDA,$0EEE
PUT ../kfest-2022/StartUp.s
PUT ../shell/Overlay.s
; PUT App.Msg.s
; PUT font.s