mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2024-11-25 00:30:48 +00:00
655 lines
16 KiB
ArmAsm
655 lines
16 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
|
|
|
|
; Typical init
|
|
phk
|
|
plb
|
|
|
|
sta MyUserId ; GS/OS passes the memory manager user ID for the application into the program
|
|
_MTStartUp ; GTE requires the miscellaneous toolset to be running
|
|
|
|
jsr GTEStartUp ; Load and install the GTE User Tool
|
|
|
|
; Initialize the graphics screen to a 256x160 playfield
|
|
|
|
pea #320
|
|
pea #200
|
|
_GTESetScreenMode
|
|
|
|
; Load a tileset
|
|
|
|
pea #^TSZelda
|
|
pea #TSZelda
|
|
_GTELoadTileSet
|
|
|
|
; Set the palette
|
|
ldx #11*2
|
|
:ploop
|
|
lda palette,x
|
|
stal $E19E00,x
|
|
dex
|
|
dex
|
|
bpl :ploop
|
|
bra sprt
|
|
|
|
palette dw $0000,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$023E
|
|
sprt
|
|
|
|
; 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
|
|
|
|
; Create sprites
|
|
stz Tmp0
|
|
stz Tmp1
|
|
|
|
ldx Tmp0
|
|
:sloop
|
|
pea HERO_SPRITE ; sprite id
|
|
lda PlayerX,x
|
|
pha
|
|
lda PlayerY,x
|
|
pha
|
|
pei Tmp1
|
|
_GTEAddSprite
|
|
|
|
pei Tmp1 ; update the sprite in this slot
|
|
pea $0000 ; with these flags (h/v flip)
|
|
pea VBUFF_SPRITE_START ; and use this stamp
|
|
_GTEUpdateSprite
|
|
|
|
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
|
|
|
|
; lda #TILE_DYN_BIT+TILE_PRIORITY_BIT+0 ; fill the screen the the dynamic tile slot 0
|
|
lda #TILE_DYN_BIT+0 ; fill the screen the the dynamic tile slot 0
|
|
jsr _fillTileStore
|
|
; brl :no_trees
|
|
|
|
ldx #0
|
|
ldy #0
|
|
jsr _drawTree
|
|
|
|
ldx #3
|
|
ldy #0
|
|
jsr _drawTreeH
|
|
|
|
ldx #0
|
|
ldy #3
|
|
jsr _drawTreeV
|
|
|
|
ldx #3
|
|
ldy #3
|
|
jsr _drawTreeHV
|
|
|
|
ldx #9
|
|
ldy #0
|
|
jsr _drawTree
|
|
|
|
ldx #9
|
|
ldy #3
|
|
jsr _drawTree
|
|
|
|
ldx #12
|
|
ldy #0
|
|
jsr _drawTree
|
|
|
|
ldx #12
|
|
ldy #3
|
|
jsr _drawTree
|
|
|
|
ldx #6
|
|
ldy #0
|
|
jsr _drawTreeFront
|
|
|
|
ldx #6
|
|
ldy #3
|
|
jsr _drawTreeFront
|
|
|
|
ldx #6
|
|
ldy #6
|
|
jsr _drawTreeFront
|
|
|
|
ldx #3
|
|
ldy #6
|
|
jsr _drawTreeFront
|
|
|
|
ldx #0
|
|
ldy #6
|
|
jsr _drawTreeFront
|
|
:no_trees
|
|
; Set up the dynamic tile
|
|
lda #65
|
|
sta DTile
|
|
|
|
pei DTile
|
|
pea $0000
|
|
_GTECopyTileToDynamic ; Copy DTile into the first dynamic tile slot
|
|
|
|
; Initialize the frame counter
|
|
|
|
stz FrameCount
|
|
|
|
; Set the screen coordinates
|
|
|
|
lda #128
|
|
sta ScreenX
|
|
lda #128
|
|
sta ScreenY
|
|
|
|
stz Selected
|
|
stz Flips
|
|
|
|
; Very simple actions
|
|
:evt_loop
|
|
pha ; space for result, with pattern
|
|
_GTEReadControl
|
|
pla
|
|
and #$00FF
|
|
cmp #'q'
|
|
bne :2
|
|
brl :exit
|
|
:2
|
|
; cmp KeyState
|
|
; beq :evt_loop
|
|
; sta KeyState
|
|
; cmp #0
|
|
; beq :evt_loop
|
|
|
|
; cmp #' '
|
|
; bne :evt_loop ; only advance one frame at a time
|
|
; brl :next
|
|
|
|
:3
|
|
cmp #'1'
|
|
bcc :3a
|
|
cmp #'9'
|
|
bcs :3a
|
|
sec
|
|
sbc #'1'
|
|
asl
|
|
sta Selected
|
|
brl :next
|
|
|
|
:3a
|
|
cmp #'r'
|
|
bne :3b
|
|
lda Flips
|
|
clc
|
|
adc #SPRITE_HFLIP
|
|
and #SPRITE_VFLIP+SPRITE_HFLIP
|
|
sta Flips
|
|
|
|
pei Selected ; update the sprite in this slot
|
|
pei Flips ; with these flags (h/v flip)
|
|
pea VBUFF_SPRITE_START ; and use this stamp
|
|
_GTEUpdateSprite
|
|
|
|
:3b
|
|
cmp #'x'
|
|
bne :3d
|
|
ldx Selected
|
|
lda PlayerX,x
|
|
clc
|
|
adc PlayerU,x
|
|
sta PlayerX,x
|
|
|
|
lda PlayerY,x
|
|
clc
|
|
adc PlayerV,x
|
|
sta PlayerY,x
|
|
brl :next
|
|
:3d
|
|
cmp #'z'
|
|
bne :3e
|
|
ldx Selected
|
|
lda PlayerX,x
|
|
sec
|
|
sbc PlayerU,x
|
|
sta PlayerX,x
|
|
|
|
lda PlayerY,x
|
|
sec
|
|
sbc PlayerV,x
|
|
sta PlayerY,x
|
|
brl :next
|
|
:3e
|
|
cmp #'s'
|
|
bne :4
|
|
ldx Selected
|
|
inc PlayerY,x
|
|
brl :next
|
|
:4
|
|
cmp #'w'
|
|
bne :5
|
|
ldx Selected
|
|
dec PlayerY,x
|
|
brl :next
|
|
:5
|
|
cmp #'d'
|
|
bne :6
|
|
ldx Selected
|
|
inc PlayerX,x
|
|
brl :next
|
|
:6
|
|
cmp #'a'
|
|
bne :7
|
|
ldx Selected
|
|
dec PlayerX,x
|
|
brl :next
|
|
:7
|
|
cmp #$15 ; left = $08, right = $15, up = $0B, down = $0A
|
|
bne :8
|
|
inc ScreenX
|
|
bra :next
|
|
|
|
:8 cmp #$08
|
|
bne :9
|
|
dec ScreenX
|
|
brl :next
|
|
|
|
:9 cmp #$0B
|
|
bne :10
|
|
inc ScreenY
|
|
brl :next
|
|
|
|
:10 cmp #$0A
|
|
bne :11
|
|
dec ScreenY
|
|
brl :next
|
|
|
|
:11 cmp #'y'
|
|
bne :12
|
|
lda DTile
|
|
inc
|
|
and #$007F
|
|
sta DTile
|
|
pha
|
|
pea $0000
|
|
_GTECopyTileToDynamic
|
|
brl :next
|
|
|
|
:12 cmp #'f'
|
|
bne :13
|
|
pea $0000
|
|
_GTEFillTileStore
|
|
brl :next
|
|
|
|
:13 cmp #'m'
|
|
bne :next
|
|
_GTERefresh
|
|
|
|
:next
|
|
; inc ScreenX
|
|
|
|
pei ScreenX
|
|
pei ScreenY
|
|
_GTESetBG0Origin
|
|
|
|
; brl no_animate
|
|
|
|
stz Tmp0
|
|
stz Tmp1
|
|
|
|
ldx Tmp0
|
|
loopX
|
|
lda PlayerX,x
|
|
clc
|
|
adc PlayerU,x
|
|
sta PlayerX,x
|
|
bpl is_posx
|
|
cmp #-15
|
|
bcs do_y
|
|
lda PlayerU,x
|
|
eor #$FFFF
|
|
inc
|
|
sta PlayerU,x
|
|
bra do_y
|
|
is_posx cmp #128
|
|
bcc do_y
|
|
lda PlayerU,x
|
|
eor #$FFFF
|
|
inc
|
|
sta PlayerU,x
|
|
|
|
do_y
|
|
lda PlayerY,x
|
|
clc
|
|
adc PlayerV,x
|
|
sta PlayerY,x
|
|
bpl is_posy
|
|
cmp #-15
|
|
bcs do_z
|
|
lda PlayerV,x
|
|
eor #$FFFF
|
|
inc
|
|
sta PlayerV,x
|
|
bra do_z
|
|
is_posy cmp #160
|
|
bcc do_z
|
|
lda PlayerV,x
|
|
eor #$FFFF
|
|
inc
|
|
sta PlayerV,x
|
|
do_z
|
|
inc Tmp1
|
|
ldx Tmp0
|
|
inx
|
|
inx
|
|
stx Tmp0
|
|
cpx #MAX_SPRITES*2
|
|
bcc loopX
|
|
|
|
no_animate
|
|
stz Tmp0
|
|
stz Tmp1
|
|
ldx Tmp0
|
|
loopY
|
|
pei Tmp1
|
|
lda PlayerX,x
|
|
pha
|
|
lda PlayerY,x
|
|
pha
|
|
_GTEMoveSprite
|
|
|
|
inc Tmp1
|
|
ldx Tmp0
|
|
inx
|
|
inx
|
|
stx Tmp0
|
|
cpx #MAX_SPRITES*2
|
|
bcc loopY
|
|
|
|
_GTERender
|
|
inc FrameCount
|
|
|
|
; Debug stuff
|
|
pha
|
|
_GTEGetSeconds
|
|
pla
|
|
cmp LastSecond
|
|
beq :no_fps
|
|
sta LastSecond
|
|
|
|
lda FrameCount
|
|
ldx #0
|
|
ldy #$FFFF
|
|
jsr DrawWord
|
|
|
|
stz FrameCount
|
|
:no_fps
|
|
|
|
; tdc
|
|
; ldx #160*32
|
|
; jsr DrawWord
|
|
|
|
brl :evt_loop
|
|
|
|
; Shut down everything
|
|
:exit
|
|
_GTEShutDown
|
|
_QuitGS qtRec
|
|
qtRec adrl $0000
|
|
da $00
|
|
|
|
; Array of sprite positions and velocities
|
|
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
|
|
|
|
; 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 #ENGINE_MODE_DYN_TILES+ENGINE_MODE_TWO_LAYER ; Enable Dynamic Tiles and Two Layer
|
|
lda MyUserId ; Pass the userId for memory allocation
|
|
pha
|
|
_GTEStartUp
|
|
bcc :ok3
|
|
brk $03
|
|
|
|
:ok3
|
|
rts
|
|
|
|
_fillTileStore
|
|
sta Tmp2
|
|
stz Tmp0
|
|
:oloop
|
|
stz Tmp1
|
|
:iloop
|
|
pei Tmp1
|
|
pei Tmp0
|
|
pei Tmp2
|
|
_GTESetTile
|
|
|
|
lda Tmp2
|
|
eor #TILE_PRIORITY_BIT
|
|
sta Tmp2
|
|
|
|
lda Tmp1
|
|
inc
|
|
sta Tmp1
|
|
cmp #41
|
|
bcc :iloop
|
|
|
|
lda Tmp0
|
|
inc
|
|
sta Tmp0
|
|
cmp #26
|
|
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
|
|
|
|
MyUserId ds 2
|
|
ToolPath str '1/Tool160'
|
|
FrameCount ds 2
|
|
LastSecond dw 0
|
|
|
|
PUT App.Msg.s
|
|
PUT font.s
|