(bunnymark) Optimizations

This commit is contained in:
Devine Lu Linvega 2024-01-15 08:23:10 -08:00
parent 6fbf4ff535
commit 950a5085ee
1 changed files with 118 additions and 190 deletions

View File

@ -1,239 +1,173 @@
( bunnymark.tal ) ( bunnymark.tal )
( November 2021, Kira Oakley ) ( November 2021, Kira Oakley )
( March 2022, Devine Lu Linvega ) ( March 2022, Devine Lu Linvega )
|00 @System &vector $2 &pad $6 &r $2 &g $2 &b $2 &debug $1 &halt $1 |00 @System &vector $2 &pad $6 &r $2 &g $2 &b $2 &debug $1 &halt $1
|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1 |20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1
|90 @Mouse &vector $2 &x $2 &y $2 &state $1 &wheel $1 |90 @Mouse &vector $2 &x $2 &y $2 &state $1 &wheel $1
|c0 @Date &year $2 &month $1 &day $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1 |c0 @DateTime &year $2 &month $1 &day $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1
|0000 |0000
@frames $2 @frames $2
@last $1 @last $1
|0100 ( -> ) |0100
( set system colors ) @on-reset ( -> )
( | theme )
#2ce9 .System/r DEO2 #2ce9 .System/r DEO2
#01c0 .System/g DEO2 #01c0 .System/g DEO2
#2ce5 .System/b DEO2 #2ce5 .System/b DEO2
( | interrupts )
( interrupts )
;on-frame .Screen/vector DEO2 ;on-frame .Screen/vector DEO2
( | draw "FPS:" and "BUNNIES:" and instructions labels )
( draw "FPS:" and "BUNNIES:" and instructions labels ) .Screen/width DEI2 #0046 SUB2 #0008 ;text/fps #42 <draw-str>
.Screen/width DEI2 #0046 SUB2 #0008 ;text/fps #42 draw-str #0004 #0008 ;text/bunnies #42 <draw-str>
#0004 #0008 ;text/bunnies #42 draw-str .Screen/width DEI2 #01 SFT2 #0050 SUB2 #0008 ;text/instructions #43 <draw-str>
.Screen/width DEI2 #01 SFT2 #0050 SUB2 #0008 ;text/instructions #43 draw-str #0028 #0008 #0000 <draw-dec>
#0028 #0008 #0000 draw-dec ( seed prng ) prng-init BRK
( seed prng )
#04 ;rand/a STA
BRK
@on-frame ( -> ) @on-frame ( -> )
( frames++ ) .frames LDZ2k INC2 ROT STZ2
( frames++ ) .DateTime/second DEI .last LDZ EQU ?&post-fps-update
.frames LDZ2k INC2 ROT STZ2
.Date/second DEI .last LDZ EQU ?&post-fps-update
( fps update ) ( fps update )
( update last-secs ) .Date/second DEI .last STZ ( update last-secs ) .DateTime/second DEI .last STZ
( update fps label ) .Screen/width DEI2 #002b SUB2 #0008 .frames LDZ2 draw-dec ( update fps label ) .Screen/width DEI2 #002b SUB2 #0008 .frames LDZ2 <draw-dec>
( reset frames counter ) #0000 .frames STZ2 ( reset frames counter ) #0000 .frames STZ2
&post-fps-update ( mouse input to add/remove bunnies )
&post-fps-update
( mouse input to add/remove bunnies )
.Mouse/state DEI #01 EQU ?&add .Mouse/state DEI #01 EQU ?&add
.Mouse/state DEI #01 GTH ?&remove .Mouse/state DEI #01 GTH ?&remove
!&done !&done
&add &add add-bunny !&done
add-bunny !&done &remove remove-bunny !&done
&remove &done ( loop from 0 to ;sprite/length to make all ;draw-bunny calls )
remove-bunny !&done ;sprite/length LDA2 #0000
&done &loop ( -- )
( loop from 0 to ;sprite/length to make all ;draw-bunny calls )
[ ;sprite/length LDA2 ] #0000
&loop
EQU2k ?&bail EQU2k ?&bail
DUP2 draw-bunny DUP2 draw-bunny INC2 !&loop
INC2 !&loop &bail POP2 POP2 BRK
&bail
POP2 POP2
BRK
@draw-bunny ( idx -- ) @draw-bunny ( idx -- )
( compute the offset to the beginning of this bunny's data ) #30 SFT2 ;sprite/array ADD2
( compute the offset to the beginning of this bunny's data )
[ #30 SFT2 ;sprite/array ADD2 ]
( clear the old sprite location ) ( clear the old sprite location )
( top ) ( top ) LDA2k #05 SFT2 .Screen/x DEO2
[ LDA2k ] #05 SFT2 .Screen/x DEO2 INC2k INC2 LDA2 #05 SFT2 .Screen/y DEO2
[ INC2k INC2 LDA2 ] #05 SFT2 .Screen/y DEO2 <clear-sprite>
clear-sprite ( move the sprite by its velocity ) LDA2k OVR2 #0004 ADD2 LDA2 ADD2 OVR2 STA2
INC2k INC2 LDA2 OVR2 #0006 ADD2 LDA2 ADD2 OVR2 INC2 INC2 STA2
( move the sprite by its velocity ) ( check for right wall collision + bounce x ) DUP2 #0004 ADD2 LDA2 #0f SFT2 #0001 EQU2 ?&skip-max-x
[ LDA2k ] [ OVR2 #0004 ADD2 LDA2 ] ADD2 OVR2 STA2 LDA2k #05 SFT2 #0008 ADD2 .Screen/width DEI2 LTH2 ?&skip-max-x
[ INC2k INC2 LDA2 ] [ OVR2 #0006 ADD2 LDA2 ] ADD2 OVR2 INC2 INC2 STA2 DUP2 #0004 ADD2 LDA2 #ffff MUL2 OVR2 #0004 ADD2 STA2
&skip-max-x ( check for left wall collision + bounce x )
( check for right wall collision + bounce x ) LDA2k #0f SFT2 #0000 EQU2 ?&skip-min-x
[ DUP2 #0004 ADD2 LDA2 ] #0f SFT2 #0001 EQU2 ?&skip-max-x DUP2 #0004 ADD2 LDA2 #ffff MUL2 OVR2 #0004 ADD2 STA2
[ LDA2k ] #05 SFT2 #0008 ADD2 [ .Screen/width DEI2 ] LTH2 ?&skip-max-x &skip-min-x ( check for bottom wall collision + bounce y )
[ DUP2 #0004 ADD2 LDA2 ] #ffff MUL2 [ OVR2 #0004 ADD2 STA2 ] DUP2 #0006 ADD2 LDA2 #0f SFT2 #0001 EQU2 ?&skip-max-y
&skip-max-x INC2k INC2 LDA2 #05 SFT2 #0008 ADD2 .Screen/height DEI2 LTH2 ?&skip-max-y
( check for left wall collision + bounce x ) DUP2 #0006 ADD2 LDA2 #ffff MUL2 OVR2 #0006 ADD2 STA2
[ LDA2k ] #0f SFT2 #0000 EQU2 ?&skip-min-x
[ DUP2 #0004 ADD2 LDA2 ] #ffff MUL2 [ OVR2 #0004 ADD2 STA2 ]
&skip-min-x
( check for bottom wall collision + bounce y )
[ DUP2 #0006 ADD2 LDA2 ] #0f SFT2 #0001 EQU2 ?&skip-max-y
[ INC2k INC2 LDA2 ] #05 SFT2 #0008 ADD2 [ .Screen/height DEI2 ] LTH2 ?&skip-max-y
[ DUP2 #0006 ADD2 LDA2 ] #ffff MUL2 [ OVR2 #0006 ADD2 STA2 ]
!&skip-gravity !&skip-gravity
&skip-max-y &skip-max-y ( check for top wall collision + bounce x )
( check for top wall collision + bounce x ) INC2k INC2 LDA2 #0f SFT2 #0000 EQU2 ?&skip-min-y
[ INC2k INC2 LDA2 ] #0f SFT2 #0000 EQU2 ?&skip-min-y DUP2 #0006 ADD2 LDA2 #ffff MUL2 OVR2 #0006 ADD2 STA2
[ DUP2 #0006 ADD2 LDA2 ] #ffff MUL2 [ OVR2 #0006 ADD2 STA2 ]
!&skip-gravity !&skip-gravity
&skip-min-y &skip-min-y ( apply gravity )
DUP2 #0006 ADD2 LDA2 #0004 ADD2 OVR2 #0006 ADD2 STA2
( apply gravity ) &skip-gravity ( draw the sprite )
[ DUP2 #0006 ADD2 LDA2 ] #0004 ADD2 OVR2 #0006 ADD2 STA2 ( top ) LDA2k #05 SFT2 .Screen/x DEO2
&skip-gravity INC2 INC2 LDA2 #05 SFT2 .Screen/y DEO2
( draw ) [ LIT2 15 -Screen/auto ] DEO
( draw the sprite )
( top )
[ LDA2k ] #05 SFT2 .Screen/x DEO2
[ INC2 INC2 LDA2 ] #05 SFT2 .Screen/y DEO2
( draw )
[ LIT2 15 -Screen/auto ] DEO
;bunny-chr .Screen/addr DEO2 ;bunny-chr .Screen/addr DEO2
#85 .Screen/sprite DEO [ LIT2 85 -Screen/sprite ] DEO
[ LIT2 00 -Screen/auto ] DEO [ LIT2 00 -Screen/auto ] DEO
JMP2r JMP2r
@clear-sprite ( -- ) @<clear-sprite> ( -- )
[ LIT2 11 -Screen/auto ] DEO
;fill-icn .Screen/addr DEO2 ;fill-icn .Screen/addr DEO2
#00 .Screen/sprite DEO [ LIT2 11 -Screen/auto ] DEO
[ LIT2 00 -Screen/sprite ] DEO
[ LIT2 00 -Screen/auto ] DEO [ LIT2 00 -Screen/auto ] DEO
JMP2r JMP2r
@add-bunny ( -- ) @add-bunny ( -- )
;sprite/length LDA2 ;sprite/length LDA2
( cap bunny count at 65535 ) ( cap bunny count at 65535 ) DUP2 #ffff EQU2 ?&bail
DUP2 #ffff EQU2 ?&bail ( compute the offset to the beginning of this new bunny's data ) DUP2 #30 SFT2 ;sprite/array ADD2
( compute the offset to the beginning of this new bunny's data ) ( populate the new bunny's x/y/xvel/yvel with random values ) #00 [ rand ] OVR2 STA2
DUP2 #30 SFT2 ;sprite/array ADD2
( populate the new bunny's x/y/xvel/yvel with random values )
#00 [ rand ] OVR2 STA2
[ rand #1f AND ] [ rand ] OVR2 INC2 INC2 STA2 [ rand #1f AND ] [ rand ] OVR2 INC2 INC2 STA2
#00 [ rand #7f AND ] OVR2 #0004 ADD2 STA2 #00 [ rand #7f AND ] OVR2 #0004 ADD2 STA2
#00 [ rand #7f AND ] OVR2 #0006 ADD2 STA2 #00 [ rand #7f AND ] OVR2 #0006 ADD2 STA2
( pop ptr to bunny data ) POP2 ( pop ptr to bunny data ) POP2
( write new increased array length ) ( write new increased array length ) INC2 DUP2 ;sprite/length STA2
INC2 DUP2 ;sprite/length STA2 ( update label ) STH2k #0028 #0008 STH2r <draw-dec>
( update label ) &bail ( pop sprite/length )
STH2k #0028 #0008 STH2r draw-dec POP2 JMP2r
&bail
( pop sprite/length ) POP2
JMP2r
@draw-str ( x* y* text* color -- )
@<draw-str> ( x* y* text* color -- )
[ LIT2 01 -Screen/auto ] DEO [ LIT2 01 -Screen/auto ] DEO
STH STH
SWP2 .Screen/y DEO2 SWP2 .Screen/y DEO2
SWP2 .Screen/x DEO2 SWP2 .Screen/x DEO2
&loop &loop ( -- )
LDAk #20 SUB #00 SWP #30 SFT2 ;font ADD2 .Screen/addr DEO2 LDAk #20 SUB #00 SWP #30 SFT2 ;font ADD2 .Screen/addr DEO2
STHkr .Screen/sprite DEO STHkr .Screen/sprite DEO
INC2 LDAk ?&loop INC2 LDAk ?&loop
POP2 POP2 STHr POP [ LIT2 00 -Screen/auto ] DEO
STHr POP
[ LIT2 00 -Screen/auto ] DEO
JMP2r JMP2r
@draw-dec ( x* y* num* -- ) @<draw-dec> ( x* y* num* -- )
[ LIT2 01 -Screen/auto ] DEO [ LIT2 01 -Screen/auto ] DEO
SWP2 .Screen/y DEO2 SWP2 .Screen/y DEO2
SWP2 .Screen/x DEO2 SWP2 .Screen/x DEO2
#2710 DIV2k DUP2 NIP ,&digit JSR MUL2 SUB2 #2710 DIV2k DUP2 NIP <draw-digit>
#03e8 DIV2k DUP2 NIP ,&digit JSR MUL2 SUB2 MUL2 SUB2 #03e8 DIV2k DUP2 NIP <draw-digit>
#0064 DIV2k DUP2 NIP ,&digit JSR MUL2 SUB2 NIP MUL2 SUB2 #0064 DIV2k DUP2 NIP <draw-digit>
#0a DIVk DUP ,&digit JSR MUL SUB MUL2 SUB2 NIP #0a DIVk DUP <draw-digit>
,&digit JSR MUL SUB <draw-digit>
[ LIT2 00 -Screen/auto ] DEO [ LIT2 00 -Screen/auto ] DEO
JMP2r JMP2r
&digit ( num -- )
@<draw-digit> ( num -- )
#30 SFT #00 SWP ;font/num ADD2 .Screen/addr DEO2 #30 SFT #00 SWP ;font/num ADD2 .Screen/addr DEO2
#41 .Screen/sprite DEO #41 .Screen/sprite DEO
JMP2r JMP2r
@remove-bunny ( -- ) @remove-bunny ( -- )
;sprite/length LDA2 ;sprite/length LDA2
( don't let length go below 0 ) ( don't let length go below 0 ) ORAk #00 EQU ?&bail
ORAk #00 EQU ?&bail ( clear the old sprite location ) DUP2 #0001 SUB2 #30 SFT2 ;sprite/array ADD2
( clear the old sprite location ) ( top ) LDA2k #05 SFT2 .Screen/x DEO2
DUP2 #0001 SUB2 #30 SFT2 ;sprite/array ADD2 INC2k INC2 LDA2 #05 SFT2 .Screen/y DEO2
( top ) ( clear ) <clear-sprite>
[ LDA2k ] #05 SFT2 .Screen/x DEO2 POP2 #0001 SUB2 DUP2 ;sprite/length STA2
[ INC2k INC2 LDA2 ] #05 SFT2 .Screen/y DEO2 ( update label ) STH2k #0028 #0008 STH2r <draw-dec>
( clear ) &bail POP2 JMP2r
clear-sprite
POP2
#0001 SUB2 DUP2 ;sprite/length STA2
( update label )
STH2k #0028 #0008 STH2r draw-dec
&bail
POP2
(
@|random )
@prng-init ( -- )
[ LIT2 00 -DateTime/second ] DEI [ LIT2 00 -DateTime/minute ] DEI #60 SFT2 EOR2 [ LIT2 00 -DateTime/hour ] DEI #c0 SFT2 EOR2 ,prng/x STR2
[ LIT2 00 -DateTime/hour ] DEI #04 SFT2 [ LIT2 00 -DateTime/day ] DEI #10 SFT2 EOR2 [ LIT2 00 -DateTime/month ] DEI #60 SFT2 EOR2 .DateTime/year DEI2 #a0 SFT2 EOR2 ,prng/y STR2
JMP2r JMP2r
( PRNG code taken from flappy.tal -- thanks! ) @prng ( -- number* )
[ LIT2 &x $2 ] DUP2 #50 SFT2 EOR2 DUP2 #03 SFT2 EOR2 [ LIT2 &y $2 ] DUP2 ,&x STR2
DUP2 #01 SFT2 EOR2 EOR2 ,&y STR2k POP JMP2r
@rand ( -- number ) @rand ( -- number )
prng ADD JMP2r
( local vars )
#04 JMP
&x $1 &y $1 &z $1 &a $1
( 8-bit PRNG https://github.com/edrosten/8bit_rng )
( t = x ^ (x << 4) )
,&x LDR DUP #40 SFT EOR
( x = y )
,&y LDR ,&x STR
( y = z )
,&z LDR ,&y STR
( z = a )
,&a LDR DUP ,&z STR
( a = z ^ t ^ (z >> 1) ^ (t << 1) )
DUPk ADD EOR SWP DUP #01 SFT EOR EOR
DUP ,&a STR
JMP2r
( static string data ) ( static string data )
@text (
&fps "FPS: 00 @|assets )
&bunnies "BUNS: 00
&instructions "CLICK 20 "TO 20 "ADD 20 "BUNNIES! 00 @text &fps "FPS: $1
&bunnies "BUNS: $1
&instructions "CLICK 20 "TO 20 "ADD 20 "BUNNIES! $1
@font ( atari8.uf1 ) @font ( atari8.uf1 )
[
0000 0000 0000 0000 6060 6060 6000 6000 0000 0000 0000 0000 6060 6060 6000 6000
6666 6600 0000 0000 006c fe6c 6cfe 6c00 6666 6600 0000 0000 006c fe6c 6cfe 6c00
183e 603c 067c 1800 0066 6c18 3066 4600 183e 603c 067c 1800 0066 6c18 3066 4600
@ -241,8 +175,7 @@ JMP2r
0e1c 1818 181c 0e00 7038 1818 1838 7000 0e1c 1818 181c 0e00 7038 1818 1838 7000
0066 3cff 3c66 0000 0018 187e 1818 0000 0066 3cff 3c66 0000 0018 187e 1818 0000
0000 0000 0030 3060 0000 007e 0000 0000 0000 0000 0030 3060 0000 007e 0000 0000
0000 0000 0018 1800 0206 0c18 3060 4000 0000 0000 0018 1800 0206 0c18 3060 4000 ] &num [
&num
3c66 6e76 6666 3c00 1838 1818 1818 7e00 3c66 6e76 6666 3c00 1838 1818 1818 7e00
3c66 060c 1830 7e00 7e0c 180c 0666 3c00 3c66 060c 1830 7e00 7e0c 180c 0666 3c00
0c1c 3c6c 7e0c 0c00 7e60 7c06 0666 3c00 0c1c 3c6c 7e0c 0c00 7e60 7c06 0666 3c00
@ -264,20 +197,15 @@ JMP2r
7e18 1818 1818 1800 6666 6666 6666 3e00 7e18 1818 1818 1800 6666 6666 6666 3e00
6666 6666 663c 1800 c6c6 c6d6 feee c600 6666 6666 663c 1800 c6c6 c6d6 feee c600
6666 3c18 3c66 6600 6666 663c 1818 1800 6666 3c18 3c66 6600 6666 663c 1818 1800
7e06 0c18 3060 7e00 7860 6060 6060 7800 7e06 0c18 3060 7e00 7860 6060 6060 7800 ]
@fill-icn @fill-icn [ ffff ffff ffff ffff ]
ffff ffff ffff ffff
@bunny-chr @bunny-chr [
2466 6600 2424 003c 4200 007e 7e7e 7e7e 2466 6600 2424 003c 4200 007e 7e7e 7e7e
1818 3c3c 1800 0000 ff66 4242 667e 4242 1818 3c3c 1800 0000 ff66 4242 667e 4242 ]
( beginning of sprite pixel data + array ) ( beginning of sprite pixel data + array )
@sprite @sprite &length $2
&length $2 &array &x 0600 &y 0500 &xvel 0060 &yvel 0010
&array
&x 0600
&y 0500
&xvel 0060
&yvel 0010