iigs-game-engine/demos/kfest-2022/demo-3/App.Main.s
2023-01-02 20:44:40 -06:00

371 lines
9.4 KiB
ArmAsm

; Test driver to exercise graphics routines.
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
tiledata EXT ; tileset buffer
TileSetPalette EXT
; Keycodes
LEFT_ARROW equ $08
RIGHT_ARROW equ $15
UP_ARROW equ $0B
DOWN_ARROW equ $0A
; Dynamic Tile Animations. Add 4 for each offset
;
; Tile IDs = 128,129,130,131
; 160,161,162,163
; 192,193,194,195
; 224,225,226,227
;
; Direct page space
MyUserId equ 0
BankLoad equ 2
StartX equ 4
StartY equ 6
TileMapWidth equ 8
TileMapHeight equ 10
ScreenWidth equ 12
ScreenHeight equ 14
MaxGlobalX equ 16
MaxGlobalY equ 18
MaxBG0X equ 20
MaxBG0Y equ 22
OldOneSecondCounter equ 26
appTmp0 equ 28
appTmp1 equ 30
appTmp2 equ 32
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_DYN_TILES ; Engine in Fast Mode
jsr GTEStartUp ; Load and install the GTE User Tool
; Initialize local variables
stz StartX
stz StartY
stz frameCount
; Initialize the graphics screen playfield
pea #320
pea #200
_GTESetScreenMode
; Load a tileset
pea #^tiledata
pea #tiledata
_GTELoadTileSet
pea $0000
pea #^TileSetPalette
pea #TileSetPalette
_GTESetPalette
; Set up our level data
jsr BG0SetUp
jsr SetLimits
lda #193 ; Tile ID of '0'
jsr InitOverlay ; Initialize the status bar
pha
_GTEGetSeconds
pla
sta OldOneSecondCounter
jsr UdtOverlay
; 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
; the play field tiles.
EvtLoop
pha
_GTEReadControl
pla
jsr HandleKeys ; Do the generic key handlers
bcs :do_more
brl :do_render
:do_more
cmp #'d'
bne :not_d
lda StartX
cmp MaxBG0X
bcc *+5
brl :do_render
inc StartX
pei StartX
pei StartY
_GTESetBG0Origin
brl :do_render
:not_d
cmp #'a'
bne :not_a
lda StartX
bne *+5
brl :do_render
dec StartX
pei StartX
pei StartY
_GTESetBG0Origin
brl :do_render
:not_a
cmp #'s'
bne :not_s
lda StartY
cmp MaxBG0Y
bcs :do_render
inc StartY
pei StartX
pei StartY
_GTESetBG0Origin
bra :do_render
:not_s
cmp #'w'
bne :not_w
lda StartY
beq :do_render
dec StartY
pei StartX
pei StartY
_GTESetBG0Origin
bra :do_render
:not_w
:do_render
jsr SetDynTiles
pea $0000
_GTERender
; Update the performance counters
inc frameCount
pha
_GTEGetSeconds
pla
cmp OldOneSecondCounter
beq :noudt
sta OldOneSecondCounter
jsr UdtOverlay
stz frameCount
:noudt
brl EvtLoop
; Exit code
Exit
_GTEShutDown
Quit
_QuitGS qtRec
bcs Fatal
Fatal brk $00
qtRec adrl $0000
da $00
; Color palette
MyDirectPage ds 2
; Pick the correct shift for each of the 16 background tiles over 32 horizontal positions
SetDynTiles
lda StartX
and #$001F
asl
sta appTmp0
stz appTmp1
stz appTmp2
jsr setDynRow
lda appTmp1
clc
adc #4
sta appTmp1
lda appTmp2
clc
adc #32
sta appTmp2
jsr setDynRow
lda appTmp1
clc
adc #4
sta appTmp1
lda appTmp2
clc
adc #32
sta appTmp2
jsr setDynRow
lda appTmp1
clc
adc #4
sta appTmp1
lda appTmp2
clc
adc #32
sta appTmp2
jmp setDynRow
setDynRow
ldx appTmp0
lda tile128,x
clc
adc appTmp2
inc
pha
lda appTmp1
clc
adc #0
pha
_GTECopyTileToDynamic
ldx appTmp0
lda tile129,x
clc
adc appTmp2
inc
pha
lda appTmp1
clc
adc #1
pha
_GTECopyTileToDynamic
ldx appTmp0
lda tile130,x
clc
adc appTmp2
inc
pha
lda appTmp1
clc
adc #2
pha
_GTECopyTileToDynamic
ldx appTmp0
lda tile131,x
clc
adc appTmp2
inc
pha
lda appTmp1
clc
adc #3
pha
_GTECopyTileToDynamic
rts
tile128 dw 128,132,136,140,144,148,152,156
tile131 dw 131,135,139,143,147,151,155,159
tile130 dw 130,134,138,142,146,150,154,158
tile129 dw 129,133,137,141,145,149,153,157
dw 128,132,136,140,144,148,152,156
dw 131,135,139,143,147,151,155,159
dw 130,134,138,142,146,150,154,158
;tile129 dw 129,133,137,141,145,149,153,157
; dw 128,132,136,140,144,148,152,156
; dw 131,135,138,143,147,151,155,159
; dw 130,134,138,142,146,150,154,158
SetLimits
pha ; Allocate space for width (in tiles), height (in tiles), pointer
pha
pha
pha
_GTEGetBG0TileMapInfo
pla
sta TileMapWidth
pla
sta TileMapHeight
pla
pla ; discard the pointer
pha ; Allocate space for x, y, width, height
pha
pha
pha
_GTEGetScreenInfo
pla
pla ; Discard screen corner
pla
sta ScreenWidth
pla
sta ScreenHeight
lda TileMapWidth
asl
asl
sta MaxGlobalX
sec
sbc ScreenWidth
sta MaxBG0X
lda TileMapHeight
asl
asl
asl
sta MaxGlobalY
sec
sbc ScreenHeight
sta MaxBG0Y
; Check if the current StartX and StartY are out of bounds
lda StartX
cmp MaxBG0X
bcc :x_ok
lda MaxBG0X
:x_ok pha
lda StartY
cmp MaxBG0Y
bcc :y_ok
lda MaxBG0Y
:y_ok pha
_GTESetBG0Origin
rts
frameCount equ 24
PUT ../StartUp.s
PUT ../../shell/Overlay.s
PUT gen/App.TileMapBG0.s