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

342 lines
11 KiB
ArmAsm
Raw Normal View History

; Test driver to exercise graphics routines.
REL
DSK MAINSEG
use Load.Macs.s
use Locator.Macs.s
use Misc.Macs.s
use EDS.GSOS.MACS.s
use Tool222.Macs.s
use Util.Macs.s
use CORE.MACS.s
use ../../src/GTE.s
use ../../src/Defs.s
mx %00
; Feature flags
NO_INTERRUPTS equ 0 ; turn off for crossrunner debugging
NO_MUSIC equ 1 ; turn music + tool loading off
; Keycodes
LEFT_ARROW equ $08
RIGHT_ARROW equ $15
UP_ARROW equ $0B
DOWN_ARROW equ $0A
; Typical init
phk
plb
jsl EngineStartUp
lda #^MyPalette ; Fill Palette #0 with our colors
ldx #MyPalette
ldy #0
jsl SetPalette
2022-02-21 16:29:57 +00:00
ldx #256 ; 32 x 22 playfield (704 tiles, $580 tiles)
ldy #176
jsl SetScreenMode
; Set up our level data
jsr BG0SetUp
; Initialize the sprite's global position (this is tracked outside of the tile engine)
2022-02-21 16:29:57 +00:00
lda #64
sta PlayerX
sta PlayerY
stz MapScreenX
stz MapScreenY
2022-02-21 16:29:57 +00:00
; Add a sprite to the engine and save its sprite
SPRITE_ID equ {SPRITE_16X16+1}
OKTOROK equ {SPRITE_16X16+79}
lda PlayerX
xba
ora PlayerY
tay ; (x, y) position
ldx #0
2022-02-21 16:29:57 +00:00
lda #SPRITE_ID ; 16x16 sprite
jsl AddSprite
sta PlayerID
; Add 4 octoroks
lda #OKTOROK
ldx #1
ldy #{32*256}+48
jsl AddSprite
2022-02-19 02:43:55 +00:00
lda #OKTOROK
ldx #2
ldy #{32*256}+96
jsl AddSprite
2022-02-19 02:43:55 +00:00
lda #OKTOROK
ldx #3
ldy #{96*256}+56
jsl AddSprite
2022-02-19 02:43:55 +00:00
lda #OKTOROK
ldx #4
ldy #{96*256}+72
jsl AddSprite
; Draw the initial screen
lda #DIRTY_BIT_BG0_REFRESH ; Redraw all of the tiles on the next Render
tsb DirtyBits
jsl Render
2022-02-19 02:43:55 +00:00
; 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
jsl ReadControl
; Check the buttons first
pha
bit #$0100
beq :no_sword
:no_sword
; Enable/disable v-sync
lda 1,s
bit #$0400
beq :no_key_down
and #$007F
cmp #'v'
bne :not_v
lda #$0001
eor vsync
sta vsync
:not_v
:no_key_down
pla
and #$007F ; Ignore the buttons for now
cmp #'q'
bne :not_q
brl Exit
:not_q
2022-02-21 16:29:57 +00:00
cmp #'d'
bne :not_d
inc PlayerX
lda PlayerX
cmp #128-8
bcc *+5
jsr TransitionRight
lda PlayerID
ldx #SPRITE_16X16+5
jsl UpdateSprite
bra :do_render
:not_d
cmp #'a'
bne :not_a
dec PlayerX
bpl *+5
jsr TransitionLeft
lda PlayerID
ldx #SPRITE_16X16+SPRITE_HFLIP+5
jsl UpdateSprite
bra :do_render
:not_a
cmp #'s'
bne :not_s
inc PlayerY
lda PlayerID
ldx #SPRITE_16X16+1
jsl UpdateSprite
bra :do_render
:not_s
cmp #'w'
bne :not_w
dec PlayerY
lda PlayerID
ldx #SPRITE_16X16+9
jsl UpdateSprite
bra :do_render
:not_w
:do_render
lda PlayerID
ldx PlayerX
ldy PlayerY
jsl MoveSprite ; Move the sprite to the current position
; Based on the frame count, move an oktorok
jsl GetVBLTicks
pha
and #$0003
asl
tax
pla
and #$007C
lsr
tay
lda OktorokX,x
clc
adc OktorokDelta,y
phx
ldy OktorokY,x
tax
pla
inc
inc
jsl MoveSprite
; Let's see what it looks like!
lda vsync
beq :no_vsync
:vsyncloop jsl GetVerticalCounter ; 8-bit value
2022-02-21 21:58:16 +00:00
cmp ScreenY0
bcc :vsyncloop
sec
2022-02-21 21:58:16 +00:00
sbc ScreenY0
cmp #4
2022-02-04 18:37:05 +00:00
bcs :vsyncloop ; Wait until we're within the top 8 scanlines
lda #1
jsl SetBorderColor
:no_vsync
jsl RenderDirty
lda vsync
beq :no_vsync2
lda #0
jsl SetBorderColor
:no_vsync2
brl EvtLoop
; Exit code
Exit
jsl EngineShutDown
_QuitGS qtRec
bcs Fatal
Fatal brk $00
TransitionRight
lda MapScreenX ; Only two screens
cmp #1
bcs :done
lda StartX ; Scroll 128 bytes to the right
clc
adc #128
sta TransitionX
:loop lda StartX
cmp TransitionX
bcs :out
clc
adc #4
jsl SetBG0XPos
lda PlayerX
sec
sbc #4
bmi :nosprite
sta PlayerX
lda PlayerID
ldx PlayerX
ldy PlayerY
jsl MoveSprite
:nosprite
jsl Render ; Do full renders since the playfield is scrolling
bra :loop
:out
lda #0 ; Move the player back to the left edge
sta PlayerX
inc MapScreenX ; Move the index to the next screen
:done
rts
TransitionLeft
lda MapScreenX
cmp #0
beq :done
lda StartX ; Scroll 128 bytes to the left
sec
sbc #128
sta TransitionX
:loop lda StartX
cmp TransitionX
beq :out
sec
sbc #4
jsl SetBG0XPos
lda PlayerX
clc
adc #4
cmp #128-8+1
bcs :nosprite
sta PlayerX
lda PlayerID
ldx PlayerX
ldy PlayerY
jsl MoveSprite
:nosprite
jsl Render
bra :loop
:out
; lda #128-8 ; Move the player back to the right edge
; sta PlayerX
dec MapScreenX ; Move the index to the next screen
:done
rts
; Color palette
;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
MapScreenX ds 2
MapScreenY ds 2
PlayerID ds 2
PlayerX ds 2
PlayerY ds 2
OktorokX dw 32,32,96,96
OktorokY dw 48,96,56,72
OktorokDelta dw 0,1,2,3,4,5,6,7,6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-7,-6,-5,-4,-3,-2,-1,0,0,0
TransitionX ds 2
TransitionY ds 2
oldOneSecondCounter ds 2
frameCount ds 2
qtRec adrl $0000
da $00
vsync dw $8000
PUT gen/App.TileMapBG0.s
ANGLEBNK ENT