Front Page All Articles Recent Changes Random Article

Contents

Concatenative language

  • ACL
  • Ait
  • Aocla
  • Breeze
  • Callisto
  • Cat
  • Cognate
  • colorForth
  • Concata
  • CoSy
  • Deque
  • DSSP
  • dt
  • Elymas
  • Enchilada
  • ETAC
  • F
  • Factor
  • Fiveth
  • Forth
  • Fourth
  • Freelang
  • Gershwin
  • hex
  • iNet
  • Joy
  • Joy of Postfix App
  • kcats
  • Kitten
  • lang5
  • Listack
  • LSE64
  • Lviv
  • Meow5
  • min
  • Mirth
  • mjoy
  • Mlatu
  • Ode
  • OForth
  • Om
  • Onyx
  • Plorth
  • Popr
  • Porth
  • PostScript
  • Prowl
  • Quest32
  • Quackery
  • r3
  • Raven
  • Retro
  • RPL
  • SPL
  • Staapl
  • Stabel
  • Tal
  • Titan
  • Trith
  • Uiua
  • Worst
  • xs
  • XY
  • 5th
  • 8th

Concatenative topics

  • Compilers
  • Interpreters
  • Type systems
  • Object systems
  • Quotations
  • Variables
  • Garbage collection
  • Example programs

Concatenative meta

  • People
  • Communities

Other languages

  • APL
  • C++
  • Erlang
  • FP trivia
  • Haskell
  • Io
  • Java
  • JavaScript
  • Lisp
  • ML
  • Oberon
  • RPL
  • Self
  • Slate
  • Smalltalk

Meta

  • Search
  • Farkup wiki format
  • Etiquette
  • Sandbox

Pong

Pong is a virtual table tennis arcade video game, featuring simple two-dimensional graphics. Each player controls one paddle on either side of the screen

[Tal|Uxntal]], 631 bytes compiled

{[|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1

80 @Controller &vector $2 &button $1 &key $1
000 @position $2 @score $2
100 @on-reset ( -> )

( | theme )

#0f08 DEOk INC INC DEOk INC INC DEO

;on-frame .Screen/vector DEO2

[ LIT2 02 -Screen/auto ] DEO

.Screen/width DEI2 .Screen/height DEI2

( | court )

;court-icn .Screen/addr DEO2

OVR2 #01 SFT2 .Screen/x DEO2

#0000 .Screen/y DEO2

DUP2 #03 SFT2 SWP SUB

&>l ( -- )

[ LIT2 01 -Screen/sprite ] DEO

INC DUP ?&>l

POP

( | bounds )

#03 SFT2 DUP #01 SUB ;on-frame/b STA

#05 SUB ;<move>/b STA

POP #03 SFT2 #01 SUB ;on-frame/r STA

POP ;fill-icn .Screen/addr DEO2

<draw-score>

<reset-ball>

BRK

@on-frame ( -> )

[ LIT &f $1 ] INCk ,&f STR

( 30 fps ) #01 AND ?{ BRK }

( | ball )

[ LIT2 00 &y $1 ] DUP2 #30 SFT2 .Screen/y DEO2

[ LIT2 00 &x $1 ] DUP2 #30 SFT2 .Screen/x DEO2

[ LIT2 40 -Screen/sprite ] DEO

DUP [ LIT &r $1 ] NEQ ?{ OVR2 #01 hit [ LIT2 ff &dx ] STR }

DUP ?{ OVR2 #00 hit [ LIT2 01 &dx ] STR }

[ LIT &dx 01 ] ADD DUP ,&x STR

#30 SFT2 .Screen/x DEO2

DUP [ LIT &b $1 ] NEQ ?{ [ LIT2 ff &dy ] STR }

DUP ?{ [ LIT2 01 &dy ] STR }

[ LIT &dy 01 ] ADD DUP ,&y STR

#30 SFT2 .Screen/y DEO2

[ LIT2 41 -Screen/sprite ] DEO

( | controls )

[ LIT2 ff -Controller/button ] DEI EOR

DUP #10 AND ?{ #ff00 <move> }

DUP #20 AND ?{ #0100 <move> }

DUP #01 AND ?{ #ff01 <move> }

DUP #02 AND ?{ #0101 <move> }

POP

( | paddles )

.Screen/width DEI2 #0008 SUB2 .Screen/x DEO2

#0000 .Screen/y DEO2

.position LDZ2 <draw-paddle>

#0000 DUP2 .Screen/x DEO2

.Screen/y DEO2

<draw-paddle>

BRK

@on-frame-hit ( -> )

[ LIT &f $1 ] INCk ,&f STR

#40 NEQ ?{ ;on-frame .Screen/vector DEO2

<reset-ball> }

BRK

@<reset-ball> ( -- )

#00 ;on-frame/x LDA #30 SFT2 .Screen/x DEO2

#00 ;on-frame/y LDA #30 SFT2 .Screen/y DEO2

[ LIT2 40 -Screen/sprite ] DEO

.Screen/width DEI2 #04 SFT2 ;on-frame/x STA

POP .Screen/height DEI2 #04 SFT2 ;on-frame/y STA

POP JMP2r

@<move> ( offset id -- )

( top ) DUP2 LDZ ADD INCk ?{ POP POP2 JMP2r }

( bottom ) [ LIT &b $1 ] NEQ ?{ POP2 JMP2r }

STHk LDZ ADD STHr STZ

JMP2r

@<draw-paddle> ( y -- )

STH

;on-frame/b LDA #00

&>l ( -- )

DUP STHkr GTH OVR STHkr #06 ADD LTH AND .Screen/sprite DEO

INC GTHk ?&>l

POP2 POPr JMP2r

@hit ( y id -- )

ROT POP STHk LDZ SUB #05 GTH ?{ POPr JMP2r }

STHr #00 EQU .score ADD LDZk INC SWP STZ

;on-frame-hit .Screen/vector DEO2

#00 ;on-frame-hit/f STA

( >> )

@<draw-score> ( -- )

#0010 .Screen/y DEO2

[ LITr -Screen/width ] DEI2r [ LITr 01 ] SFT2r

DUP2r [ LIT2r 0030 ] SUB2r [ LITr -Screen/x ] DEO2r

.score LDZ2 SWP <draw-number>

[ LIT2r 0010 ] ADD2r [ LITr -Screen/x ] DEO2r

( >> )

@<draw-number> ( num -- )

( clip ) #0a DIVk MUL SUB

( seg. ) #00 SWP #20 SFT ;num-lut ADD2

LDAk <draw-col>

INC2 LDAk <draw-col>

INC2 LDAk <draw-col>

INC2 LDA

( >> )

@<draw-col> ( bitmap -- )

( save ) [ LITr -Screen/y ] DEI2kr STH

#0800

&>l ( -- )

STHkr OVR SFT #01 AND .Screen/sprite DEO

INC GTHk ?&>l

POP2 POPr

.Screen/x DEI2k #0008 ADD2 ROT DEO2

( restore ) ROTr DEO2r

JMP2r

@num-lut [

ff81 81ff 0000 ff00 f989 898f 8989 89ff

0f08 08ff 8f89 89f9 ff88 88f8 0101 01ff

ff89 89ff 0f09 09ff ]

@fill-icn [ ffff ffff ffff ffff ]

@court-icn [ 0080 8000 0080 8000 ]

}]

This revision created on Sat, 23 Mar 2024 21:47:06 by neauoire

Latest Revisions Edit

All content is © 2008-2024 by its respective authors. By adding content to this wiki, you agree to release it under the BSD license.