mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2024-09-10 05:54:28 +00:00
265 lines
5.9 KiB
ArmAsm
265 lines
5.9 KiB
ArmAsm
MoveLeft
|
|
clc
|
|
adc StartX ; Increment the virtual X-position
|
|
jsr SetBG0XPos
|
|
|
|
lda StartX
|
|
lsr
|
|
jsr SetBG1XPos
|
|
|
|
jsr DoFrame
|
|
rts
|
|
|
|
MoveRight
|
|
pha
|
|
lda StartX
|
|
sec
|
|
sbc 1,s
|
|
bpl *+5
|
|
lda #0
|
|
jsr SetBG0XPos
|
|
|
|
lda StartX
|
|
lsr
|
|
jsr SetBG1XPos
|
|
|
|
jsr DoFrame
|
|
pla
|
|
rts
|
|
|
|
MoveUp
|
|
clc
|
|
adc StartY ; Increment the virtual Y-position
|
|
jsr SetBG0YPos
|
|
|
|
lda StartY
|
|
lsr
|
|
jsr SetBG1YPos
|
|
|
|
jsr DoFrame
|
|
rts
|
|
|
|
MoveDown
|
|
pha
|
|
lda StartY
|
|
sec
|
|
sbc 1,s
|
|
bpl *+5
|
|
lda #0
|
|
jsr SetBG0YPos
|
|
|
|
lda StartY
|
|
lsr
|
|
jsr SetBG1YPos
|
|
|
|
jsr DoFrame
|
|
pla
|
|
rts
|
|
|
|
; Very simple, scroll as fast as possible
|
|
oldOneSecondCounter ds 2
|
|
frameCount ds 2
|
|
lastTick ds 2
|
|
Demo
|
|
lda OneSecondCounter
|
|
sta oldOneSecondCounter
|
|
stz frameCount
|
|
|
|
; Set a timer to fire every 16 ticks
|
|
|
|
lda #6
|
|
sta Timers
|
|
sta Timers+2
|
|
lda #UpdateBG1Offset
|
|
sta Timers+4
|
|
|
|
; Every 3 ticks (20 fps) cycle some colors
|
|
|
|
lda #3
|
|
sta Timers+8
|
|
sta Timers+10
|
|
lda #DoColorCycle
|
|
sta Timers+12
|
|
:loop
|
|
PushLong #0
|
|
_GetTick
|
|
pla
|
|
plx
|
|
|
|
cmp lastTick ; Throttle to 60 fps
|
|
beq :loop
|
|
tax ; Calculate the increment
|
|
sec
|
|
sbc lastTick
|
|
stx lastTick
|
|
jsr _DoTimers
|
|
|
|
; lda #1
|
|
; jsr MoveLeft
|
|
jsr DoFrame
|
|
|
|
inc frameCount
|
|
|
|
ldal KBD_STROBE_REG
|
|
bit #$0080
|
|
beq :nokey
|
|
and #$007F
|
|
cmp #'s'
|
|
bne :nokey
|
|
|
|
rts
|
|
|
|
:nokey
|
|
lda OneSecondCounter
|
|
cmp oldOneSecondCounter
|
|
beq :loop
|
|
|
|
sta oldOneSecondCounter
|
|
lda ScreenWidth
|
|
cmp #150
|
|
bcs :loop
|
|
|
|
lda #FPSStr
|
|
ldx #0 ; top-left corner
|
|
ldy #$7777
|
|
jsr DrawString
|
|
|
|
lda frameCount
|
|
ldx #4*4
|
|
jsr DrawWord
|
|
|
|
stz frameCount
|
|
bra :loop
|
|
|
|
FPSStr str 'FPS'
|
|
|
|
; Move some colors around
|
|
DoColorCycle
|
|
ldal $E19E00
|
|
tax
|
|
ldal $E19E02
|
|
stal $E19E00
|
|
txa
|
|
stal $E19E02
|
|
rts
|
|
|
|
; Triggered timer to sway the background
|
|
UpdateBG1Offset
|
|
lda BG1OffsetIndex
|
|
inc
|
|
inc
|
|
cmp #32 ; 16 entries x 2 for indexing
|
|
bcc *+5
|
|
sbc #32
|
|
sta BG1OffsetIndex
|
|
rts
|
|
|
|
; A collection of 8 timers that are triggered when their countdown
|
|
; goes below zero. Each time taks up 8 bytes
|
|
;
|
|
; +0 counter decremented by the number of ticks since last run
|
|
; +2 reset copied into counter when triggered. 0 turns off the timer.
|
|
; +4 addr address of time routine
|
|
; +6 reserved
|
|
MAX_TIMERS equ 4
|
|
Timers ds 8*MAX_TIMERS
|
|
|
|
; Countdown the timers
|
|
;
|
|
; A = number of elapsed ticks
|
|
_DoTimers
|
|
pha
|
|
ldx #0
|
|
:loop
|
|
lda Timers,x
|
|
beq :skip
|
|
|
|
sec
|
|
sbc 1,s ; subtract the number of ticks
|
|
sta Timers,x
|
|
|
|
beq :fire ; getting to zero triggers
|
|
bpl :skip
|
|
|
|
:fire lda Timers+2,x ; Reset the timer
|
|
sta Timers,x
|
|
|
|
phx ; Save our index
|
|
jsr (Timers+4,x)
|
|
plx
|
|
|
|
:skip txa
|
|
clc
|
|
adc #8
|
|
tax
|
|
cpx #8*MAX_TIMERS
|
|
bcc :loop
|
|
|
|
pla
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|