mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2024-11-22 11:34:14 +00:00
496 lines
12 KiB
ArmAsm
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
|