( HOCKEY HI-LEVEL MAF JDS KAL PMA JJT 16:09 08/27/87 ) 
( Last change: Screen 027 MAF 10:09 04/09/87 ) 
.NOLIST
-HEADERS 
 
( SQUARE TABLE 1/212:41 02/12/87 ) 
DECIMAL L: SQUARE-TABLE 
00000 , 00001 , 00004 , 00009 , 00016 , 00025 , 00036 , 
00049 , 00064 , 00081 , 00100 , 00121 , 00144 , 00169 , 
00196 , 00225 , 00256 , 00289 , 00324 , 00361 , 00400 , 
00441 , 00484 , 00529 , 00576 , 00625 , 00676 , 00729 , 
00784 , 00841 , 00900 , 00961 , 01024 , 01089 , 01156 , 
01225 , 01296 , 01369 , 01444 , 01521 , 01600 , 01681 , 
01764 , 01849 , 01936 , 02025 , 02116 , 02209 , 02304 , 
02401 , 02500 , 02601 , 02704 , 02809 , 02916 , 03025 , 
03136 , 03249 , 03364 , 03481 , 03600 , 03721 , 03844 , 
03969 , 04096 , 04225 , 04356 , 04489 , 04624 , 04761 , 
04900 , 05041 , 05184 , 05329 , 05476 , 05625 , 05776 , 
05929 , 06084 , 06241 , 06400 , 06561 , 06724 , 06889 , 
07056 , 07225 , 07396 , 07569 , 07744 , 07921 , 08100 , 
08281 , 08464 , 08649 , 08836 , 09025 , 09216 , 09409 , 

( SQUARE TABLE 2/2 12:41 02/12/87 ) 
09604 , 09801 , 10000 , 10201 , 10404 , 10609 , 10816 , 
11025 , 11236 , 11449 , 11664 , 11881 , 12100 , 12321 , 
12544 , 12769 , 12996 , 13225 , 13456 , 13689 , 13924 , 
14161 , 14400 , 14641 , 14884 , 15129 , 15376 , 15625 , 
15876 , 16129 , 16384 , 16641 , 16900 , 17161 , 17424 , 
17689 , 17956 , 18225 , 18496 , 18769 , 19044 , 19321 , 
19600 , 19881 , 20164 , 20449 , 20736 , 21025 , 21316 , 
21609 , 21904 , 22201 , 22500 , 22801 , 23104 , 23409 , 
23716 , 24025 , 24336 , 24649 , 24964 , 25281 , 25600 , 
25921 , 26244 , 26569 , 26896 , 27225 , 27556 , 27889 , 
28224 , 28561 , 28900 , 29241 , 29584 , 29929 , 30276 , 
30625 , 30976 , 31329 , 31684 , 32041 , 32400 , 32761 , 
33124 , 33489 , 33856 , 34225 , 34596 , 34969 , 35344 , 
35721 , 36100 , 36481 , 36864 , 37249 , 37636 , 38025 , 
38416 , 38809 , 39204 , 39601 , 40000 , 

( RAM LOCATIONS FOR GAME PLAY 11:18 02/05/87 ) 
: SQUARE 2* SQUARE-TABLE + @ ; 
END-TABLE-PLUG 3 + EQU PLAYER1 
PLAYER1 15 + EQU PLAYER2
PLAYER2 15 + EQU puck puck15 + EQU SCORE1 
SCORE1 2 + EQU SCORE2 SCORE2 2 + EQU SAVES1
SAVES1 2 + EQU SAVES2 SAVES2 2+ EQU WHIZ-DONE 
WHIZ-DONE 2 + EQU WHIZ-COUNT

( 12:00 02/19/87 ) 
WHIZ-COUNT 2+ EQU DX DX 2+ EQU DY DY 2+ EQU SHOOTFLAG1 
SHOOTFLAG1 2+ EQU SHOOTFLAG2 SHOOTFLAG2 2+ EQU OLDJOY1 
OLDJOY1 1+ EQU OLDJOY2 OLDJOY2 1+ EQU SKILL
SKILL 1+ EQU GOALIE1-Y
GOALIE1-Y 2+ EQU GOALIE2-Y
GOALIE2-Y 2+ EQU CYCLE# 
CYCLE# 2+ EQU OLD-XY 
OLD-XY 4 + EQU END-OF-RAM

( ANIMATION TABLES 13:03 02/12/87 ) 
( ADDRESSED BY ORIENTATION * 4 + ANIMATION 3 AND + ) 
L: PLAYER2-IMAGES 
RPFE C, RPFER C, RPFE C, RPFEL C, 
RPFNE C, RPFNER C, RPFNE C, RPFNEL C, 
RPFN C, RPFNR C, RPFN C, RPFNL C, 
RPFNW C, RPFNWR C, RPFNW C, RPFNWL C,
RPFW C, RPFWR C, RPFW C, RPFWL C, 
RPFSW C, RPFSWR C, RPFSW C, RPFSWL C, 
RPFS C, RPFSR C, RPFS C, RPFSL C, 
RPFSE C, RPFSER C, RPFSE C, RPFSEL C, 

( ANIMATION TABLES 13:03 02/12/87 ) 
( ADDRESSED BY ORIENTATION * 4 + ANIMATION 3 AND + ) 
L: PLAYER1-IMAGES 
BPFE C, BPFER C, BPFE C, BPFEL C, 
BPFNE C, BPFNER C, BPFNE C, BPFNEL C, 
BPFN C, BPFNR C, BPFN C, BPFNL C, 
BPFNW C, BPFNWR C, BPFNW C, BPFNWL C, 
BPFW C, BPFWR C, BPFW C, BPFWL C, 
BPFSW C, BPFSWR C, BPFSW C, BPFSWL C, 
BPFS C, BPFSR C, BPFS C, BPFSL C, 
BPFSE C, BPFSER C, BPFSE C, BPFSEL C,

( 256/ 256*13:46 08/27/87 ) 
CODE 256/( note: ROUNDS & UNSIGNED! jjt) 
TOS 1+ LDY TOS LDA 0< IF INY THEN 
TOS STY 0 # LDA TOS 1+ STA 
NEXT JMP END-CODE 

CODE 256*TOSLDA TOS 1+ STA 
TOS STY NEXT JMP 
END-CODE 

( HOCKEY LIMIT PARAMETERS/EQUATES 13:50 02/19/87 ) 
DECIMAL 4 EQU DIAM ( PUCK DIAMETER ) 
33 EQU LOG(FAT) ( GIRTH OF PLAYER ) 
30 ( 30 ) EQU PUCK-STICK-THRESHOLD 
120 EQU PLAYER-PLAYER-THRESHOLD 
08 256 * EQU LEFT-LINE151 256 * EQU RIGHT-LINE 
40 256 * EQU TOP-LINE 184 256 * EQU BOTTOM-LINE
TOP-LINE 50 256 * + EQU GOAL-TOP
BOTTOM-LINE 52 256 * - EQU GOAL-BOTTOM
LEFT-LINE 5 256 * - EQU GOAL-LEFT 
RIGHT-LINE 5 256 * +EQU GOAL-RIGHT
12 256 * EQU GOAL-HEIGHT ( 24) 
6 EQU GOAL-WIDTH
LEFT-LINE GOAL-WIDTH 256 * + EQU GOAL1-X 
RIGHT-LINE GOAL-WIDTH 1 + 256 * - EQU GOAL2-X

(18:20 05/11/87 ) 
08 EQU LEFT-LINEH151 EQU RIGHT-LINEH 
40 EQU TOP-LINEH 184 EQU BOTTOM-LINEH 
TOP-LINEH 50 + EQU GOAL-TOPH 
BOTTOM-LINEH 52 - EQU GOAL-BOTTOMH 
LEFT-LINEH 5 - EQU GOAL-LEFTH 
RIGHT-LINEH 5 + EQU GOAL-RIGHTH 
oops deleted a word here - tas 11/2/87
EQU GOAL-HEIGHTH ( 24) 

( ANIMATOR1/2 rev. jjt 09:03 08/27/87 ) 
: ANIMATOR 
PLAYER2 @XY V256/ REDD-Y C! REDD-X C! 
PLAYER2 @ORIENTATION 2* 2* PLAYER2-IMAGES +
DX1 C@ DY1 C@ OR PLAYER2 @FLAG 2 AND OR IF 
PLAYER2-FEET C@ DUP 1+ 
PLAYER2-FEET C! 3 AND + 
DUP3 AND 0= WHIZ-COUNT C@ 0= AND IF SKRITCH-SND THEN
THEN ( no skritching while whizzing...) 
PLAYER1 @XY V256/ BLUE-Y C! BLUE-X C! 
PLAYER1 @ORIENTATION 2* 2* PLAYER1-IMAGES + 
DX0 C@ DY0 C@ OR PLAYER1 
@FLAG 2 AND OR IF 
PLAYER1-FEET C@ DUP 1+ PLAYER1-FEET C! 3 AND +
DUP 2+ 3 AND 0= WHIZ-COUNT C@ 0= AND IF SKRITCH-SND THEN 
THEN ( and less often at that! ) 
puck @XY V256/ PUCK-Y C! PUCK-X C! 

( ANIMATOR 2/2 13:10 02/12/87 ) 
BEGIN ?VBLANK UNTIL BLUE-ERASE BLUE-GOALY-ERASE BLUE-PLAYER-FRAME 
BEGIN ?VBLANK 0= UNTIL 
BEGIN ?VBLANK UNTIL 
PUCK-ERASE PUCK-FRAME 
REDD-ERASE REDD-GOALY-ERASE REDD-PLAYER-FRAME ;
 
( GENERATE SQUARE TABLE 13:30 02/05/87 ) 
0 .IF 
VARIABLE LINE# VARIABLE BLOCK# 
: MAKE-SQUARES 179 BLOCK# ! 2 LINE# !
0 BEGINDUP 7 MOD 0= IF 1 LINE# +!
LINE# @ 15 > IF 1 LINE# ! 1 BLOCK# +! THEN THEN 
DUP DUP * 0 <# # # # # # #> ( N ADDR COUNT )
BLOCK# @ BLOCK UPDATE 
LINE# @ 64 * + ( N ADDR COUNT ADDR ) 
3 PICK 7 MOD 8 * + DUP >R SWAP 
CMOVE ASCII , R> 6 + C! 
1+ DUP 200 > UNTIL DROP FLUSH ; 
.THEN 

( ANGLE 11:08 02/05/87 ) 
L: ANGLE-TAB 0 C, 6 C, 0 C, 2 C, 4 C, 6 C, 4 C, 2 C, 
7 C, 7 C, 1 C, 1 C, 5 C, 5 C, 3 C, 3 C,
0 .IF 
: ANGLE ( X1 Y1 X2 Y2 ---- a ) 
( algorithm courtesy Lee Actor) ( Bally Sente ) 
ROT - DY ! SWAP - DX ! ( Calculate deltax, deltay ) 
0 DX @ DUP 0< IF NEGATE DX ! 4 OR ELSE DROP THEN
DY @ DUP 0< IF NEGATE DY ! 2 OR ELSE DROP THEN 
DY @ DX @ > IF 1 OR DY @ DX @ 2* < IF 8 OR THEN 
ELSE  DX @ DY @ 2* < IF 8 OR THEN 
THEN ANGLE-TAB + C@ ; 
.THEN 

( ANGLE JDS 11:10 03/23/87 )
CODE (ANGLE) ( X1 Y1 X2 Y2 ---- a )
SEC TOS LDA TOS 4 + SBC DY STA
TOS 1+ LDA TOS 5 + SBC DY 1+ 
STA ( DELTA Y FOUND ) 
SEC TOS 2+ LDA TOS 6 + SBC DX STA
TOS 3 +LDA TOS 7 + SBC DX 1+ STA ( DELTA X FOUND ) 
TXA CLC 6 # ADC TAX TYA PHA ( PTR BYTE & XTRA STK)
DX 1+ LDA 0< IF SEC TYA DX SBC DX STA TYA DX 1+ SBC DX 1+ STA 
PLA 4 # ORA PHA THEN 
( IF LESS THAN 0 , TURN POSITIVE ) 
DY 1+ LDA 0< IF SEC TYA DY SBC DY STA TYA DY 1+ SBC DY 1+ STA 
PLA 2 # ORA PHA THEN ( IF LESS THAN 0 , TURN POSITIVE ) 
SEC DX LDA DY SBC DX 1+ LDA DY 1+ SBC ( CS: X >= Y ELSE Y > X ) 
CS NOT IF PLA 1 # ORA PHA 
DX 1+ LDA TOS 1+ STA DX LD
A TOS STA TOS ASL TOS 1+ ROL ( DX 2*) 
SEC DY LDA TOS SBC DY 1+ LDA TOS 1+ SBC CS NOT IF ( DY<DX2*)
PLA 8 # ORA PHA THEN ELSE 

( ANGLE JDS 2/2 11:10 03/23/87 ) 
DY 1+ LDA TOS 1+ STA DY LDA TOS STA TOS ASL TOS 1+ ROL ( DY 2*) 
SEC DX LDA TOS SBC DX 
1+ LDA TOS 1+ SBC CS NOT IF ( DX<DY2*)
PLA 8 # ORA PHA THEN THEN 
ANGLE-TAB >HI # LDA TOS 1+ STA
ANGLE-TAB >LO # LDA TOSSTA 
PLA CLC TOS ADC TOS 
STA CS IF TOS 1+ INC THEN 
TOS X) LDA TOS STA TOS 1+ STY RTS END-CODE 

CODE ANGLE ' (ANGLE) >BODY JSR NEXT JMP END-CODE

( structures for players and puck 11:13 02/05/87 ) 
(2 = COMPUTER CONTROL ) 
: @TIMER 10 + C@ ; 
: !TIMER 10 + C! ; 
: @SHOOT-COUNT 12 + C@ ;
: !SHOOT-COUNT 12 + C! ; 
: @POSSESSION 13 + C@ ; 
: !POSSESSION 13 + C! ; 
: @ANIMATION 14 + C@ ; 
: !ANIMATION 14 + C! ; 

13:28 02/20/87 ) 
PROC X2@ ( ADDR -- D )TOS LDA N STA TOS 1+ LDA N 1+ STA 0 # LD
Y DEX DEX N )Y LDA TOS STA INY N )Y LDA TOS 1+ STA
INY N )Y LDA TOS 2+ STA 
INY N )Y LDA TOS 3 + STA
NEXT JMP END-PROC

PROC X2! ( D ADDR -- ) TOS L
DA N STA TOS 1+ LDA N 1+ STA 0 # LDY
INX INX TOS LDA N )Y STA
INX INY TOS LDA N )Y STA 
INX INY TOS LDA N )Y STA
INX INY TOS LDA N )Y STA INX
NEXT JMP END-PROC 

( @XY !XY @VELOCITY !VELOCITY 13:51 02/20/87 ) 
CODE @XY ( : @XY 4 + 2@; 
( PLAYER --- X Y ) 
CLC 4 # LDA TOS ADC TOS STA 
TYA TOS 1+ ADC TOS 1+ STA 
X2@ JMP END-CODE

CODE !XY ( : !XY 4 + 2!; ( X Y PLAYER ---- ) 
CLC 4 # LDA TOS ADC TOS STA 
TYA TOS 1+ ADC TOS 1+ STA 
X2! JMP END-CODE

CODE @VELOCITY X2@ JMP END-CODE
CODE !VELOCITY X2! JMP END-CODE 

( XC@ XC! @OREINTATION !ORIENTATION14:00 02/20/87 ) 
PROC XC@TOS X) LDA TOS STATOS 1+ STY NEXT JMP END-PROC 
PROC XC!NOS LDA TOS X) STAPOP2 JMP END-PROC

CODE @ORIENTATION 
CLC 8 # LDA TOS ADC TOS STA 
CS IF TOS 1+ INC THEN 
XC@ JMP END-CODE 

CODE !ORIENTATION 
CLC 8 # LDA TOS ADC TOS STA 
CS IF TOS 1+ INC THEN 
XC! JMP END-CODE 

( @FLAG !FLAG THUMP DECIMAL-INC 12:24 04/06/87 ) 
CODE @FLAG 
CLC 9 # LDA TOS ADC TOS STA
CS IF TOS 1+ INC THEN
XC@ JMP END-CODE 

CODE !FLAG 
CLC 9 # LDA TOS ADC TOS STA 
CS IF TOS 1+ INC THEN 
XC! JMP END-CODE

oops may have deleted something here tas 11/2/87
X) STA 
INX INX NEXT JMP END-CODE

( RIGHT-LINE-CHECK MAF 10:05 04/09/87 ) 
0 .IF
: RIGHT-LINE-CHECK ( X Y --- RX TRUE/ FALSE )
OVER RIGHT-LINE
U< IF 2DROP 0 EXIT THEN
puck @VELOCITY SWAP NEGATE SWAP puck !VELOCITY 
DUP GOAL-TOP U< IF 2DROP
[ RIGHT-LINE DIAM 256 * - ] LITERAL -1 EXIT THEN 
DUP GOAL-BOTTOM U> IF 2DROP 
[ RIGHT-LI
NE DIAM 256 * - ] LITERAL -1 EXIT THEN 
DROP ( X ) GOAL-RIGHT > IF 0. puck !VELOCITY 
[ GOAL-RIGHT DIAM 256 * - ] LITERAL -1 ELSE 0 THEN ; 

( LEFT-LINE-CHECK 22:13 02/09/87 ) 
: LEFT-LINE-CHECK ( X Y --- LX TRUE/ FALSE )
OVER LEFT-LINE U> IF 2DROP 0 EXIT THEN
puck @VELOCITY SWAP NEGATE SWAP puck !VELOCITY 
DUP GOAL-TOP U< IF 2DROP LEFT-LINE -1 EXIT THEN
DUP GOAL-BOTTOM U> IF 2DROP LEFT-LINE -1 EXIT THEN
DROP ( X ) GOAL-LEFT > IF 0. puck !VELOCITY 
GOAL-LEFT -1 ELSE 0 THEN ;

( CHECK-PUCK-COLLISION MAF 10:05 04/09/87 ) 
: CHECK-PUCK-COLLISION
puck @XY DUP TOP-LINE U< 
IF DROP TOP-LINE 512 + puck !XY
puck @VELOCITY NEGATE puck !VELOCITY BOUNCE-SND ELSE 
DUP BOTTOM-LINE DIAM 256* - U>
IF DROP BOTTOM-LINE DIAM 256* - puck !XY
puck @VELOCITY NEGATE puck
!VELOCITY BOUNCE-SND ELSE 2DUP RIGHT-LINE-CHECK
IF ROT DROP SWAP puck !XY
BOUNCE-SND ELSE 2DUP LEFT-LINE-CHECK 
IF ROT DROP SWAP puck !XY 
BOUNCE-SND ELSE 2DROP THEN THEN THEN THEN ;
.THEN 

( SOUNDS ENTRANT FROM ASSEMBLY 14:48 05/13/87 ) 
PROC (PL/EDGE-SND) 
L-PL/EDGE # LDA ' START-SO
UND >BODY JSR RTS END-PROC 

PROC (BOUNCE-SND) 
L-BOUNCE # LDA ' START-SOUND >BODY JSR RTS END-PROC

( PUCK COLLISION MAF 10:05 04/09/87 )
PROC NEGATE-YVELOCITY 0 # LDY 
0 # LDA SEC OBJECT )Y SBC OBJECT )YSTA IN
Y 0 # LDA OBJECT )Y SBC OBJECT )Y 
STA RTS END-PROC

PROC NEGATE-XVELOCITY 2 # LDY 
0 # LDA SEC OBJECT )Y SBC OBJECT )Y STA
INY0 # LDA OBJECT )Y SBC OBJECT )Y STA
RTS END-PROC 

CODE (NEGATE-YVELOCITY) NEGATE-YVELOCITY JSR NEXT JMP END-CODE 
CODE (NEGATE-XVELOCITY) NEGATE-XVELOCITY JSR NEXT JMP END-CODE 

( PUCK COLLISIONS CONTINUED 11:32 04/08/87 )
 -1 .IF 
CODE CHECK-PUCK-COLLISION 
puck >HI # LDA OBJECT 1+ STA 
puck >LO # LDA OBJECTSTA 
puck 5 + LDA ( Y ) TOP-LINEH # CMP 
CS NOT IF TOP-LINEH # LDA puck 5 + STA 
(BOUNCE-SND) JSR NEGATE-YVELOCITY JSR 
0 # LDY OBJECT )Y LDA SEC 1 # SBC OBJECT )Y STA NEXT JMP THEN 
BOTTOM-LINEH DIAM - # CMP 
CS IF BOTTOM-LINEH DIAM - # LDA puck 5 + STA 
(BOUNCE-SND) JSR NEGATE-YVELOCITY JSR 
0 # LDY OBJECT )Y LDA CLC 1 # ADC OBJECT
 )Y STA NEXT JMP THEN 

( PUCK COLLISION RIGHT SIDE11:35 04/08/87 )
puck 7 + LDA ( X ) RIGHT-LINEH # CMP 
CS IF puck 5 + LDA GOAL-TOPH # CMP ( IN THE GOAL?) 
( NO ) CS NOT IF NEGATE-XVELOCITY JSR 
(BOUNCE-SND) JSRRIGHT-LINEH DIAM - DIAM - # LDA
puck 7 + STA NEXT JMP THEN
GOAL-BOTTOMH # CMP CS IF NEGATE-XVELOCITY JSR (BOUNCE-SND) JSR 
RIGHT-LINEH DIAM - DIAM - # LDA puck 7 + STA NEXT JMP THEN 
( puck 7 + LDA ( X ) ( GOAL-RIGHTH # CMP )
( 0< NOT IF ) 0 # LDA puck STA puck 1+ STA puck 2+ STA
puck 3 + STA ( 0 VELOCITY) RIGHT-LINEH DIAM + # LDA 
puck 7 + STA ( THEN ) THEN 

( PUCK COLLISION LEFT SIDE MAF 10:09 04/09/87 ) 
puck 7 + LDA ( X ) LEFT-LINEH # CMP
CS NOT IF puck 5 + LDA GOAL-TOPH # CMP ( IN THE GOAL?) 
( NO ) CS NOT IF NEGATE-XVELOCITY JSR 
(BOUNCE-SND) JSRLEFT-LINEH # LDA puck 7 + STA 
NEXT JMP THEN GOAL-BOTTOMH # CMP 
CS IF NEGATE-XVELOCITY JSR (BOUNCE-SND) JSR 
LEFT-LINEH # LDA puck 7 + STA NEXT JMP THEN ( GOAL!)
( puck 7 + LDA ( X ) ( GOAL-LEFTH # CMP ) 
( CS IF ) 0 # LDA puck STA puck 1+ STA puck 2+ STA
puck 3 + STA ( 0 VELOCITY) 
GOAL-LEFTH # LDA puck 7 + STA ( THEN ) THEN NEXT JMP END-CODE 
.THEN 

( CHECK-PUCK-GOALIE21:36 02/22/87 ) 
: CHECK-PUCK-GOALIE puck @XY 
DUP GOALIE1-Y @ 1+ U> OVER GOALIE1-Y @ GOAL-HEIGHT + U< AND 
2 PICK GOAL1-X U< AND IF 2DROP puck @VELOCITY SWAP NEGATE SWAP 
puck !VELOCITY SAVES1 DECIMAL-INC UPDATE-SCORE SAVE-SND
puck @XY SWAP DROP GOAL1-X SWAP puck !XY ELSE 
DUP GOALIE2-Y @ 1+ U> SWAP GOALIE2-Y @ GOAL-HEIGHT + U< AND 
SWAP GOAL2-X U> AND IF puck @VELOCITY SWAP NEGATE SWAP 
puck !VELOCITY SAVES2 DECIMAL-INC UPDATE-SCORE SAVE-SND
puck @XY SWAP DROP GOAL2-X SWAP puck !XY
THEN THEN ; 

(11:06 04/09/87 ) 
( : V- ROT SWAP - >R - R> ; )
( : V+ ROT + >R + R> ; ) 
CODE V+ ( V1 V2 ---- V1+V2 )
CLC TOS LDA NOS 2+ ADC NOS 2+ STA
TOS 1+ LDA NOS 3 + ADC NOS 3 + STA 
CLC NOS LDA NOS 4 + ADC NOS 4 + STA
NOS 1+ LDA NOS 5 + ADC NOS 5 + STA 
POP2 JMP END-CODE

CODE V- ( V1 V2 ---- V1-V2 ) 
SEC NOS 2+ LDA TOS SBC NOS 2+ STA
NOS 3 + LDA TOS 1+ SBC NOS 3 + STA
SEC NOS 4 + LDA NOS SBC NOS 4 + STA 
NOS 5 + LDA NOS 1+ SBC NOS 5 + STA 
POP2 JMP END-CODE 

( NORM-SQ as PROC 11:59 04/09/87 )
( : NORM-SQ ABS SQUISH SQUARE SWAP ABS SQUISH SQUARE + ; ) 
PROC (NORM-SQ) TOS 1+ LDA 0< IF ( ABS ) 
SEC TYA TOS SBC TOS STA TYA TOS 1+ SBC TOS 1+ STA THEN 
6 # LDY ( SQUISH- 7 0 DO 2/ LOOP 2* SQUARE + ) 
1$: TOS 1+ LSR TOS ROR DEY 1$ BNE 
TOS LDA 254 # AND TOS STA 
CLC SQUARE-TABLE >LO # LDA TOS ADC N STA 
SQUARE-TABLE >HI # LDA TOS 1+ ADC N 1+ STA
N )Y LDA TOS STA INY N )Y LDA TOS 1+ STA 

(14:32 04/09/87 ) 
NOS 1+
LDA 0< IF SEC 0 # LDY 
TYA NOS SBC NOS STA TYA NOS 1+ SBC 
NOS 1+ STA THEN 6 # LDY ( SQUISH-1 TO GO TO SQUARE )
2$: NOS 1+ LSR NOS ROR DEY 2$ BNE 
NOS LDA 254 # AND NOS STA 
CLC SQUARE-TABLE >LO # LDA NOSADC NSTA
SQUARE-TABLE >HI # LDA NOS 1+ ADC N 1+ STA 
CLC N )Y LDA TOS ADC NOS STA 
INY N )Y LDA TOS 1+ ADC NOS 1+ STA 
INX INX RTS ( POP JMP ) END-PROC 

CODE NORM-SQ (NORM-SQ) JSR NEXT JMP END-CODE 

( NORM-SQ2 14:33 04/09/87 )
( : NORM-SQ2 ABS 256/ SQUARE SWAP ABS 256/ SQUARE + ; ) 
CODE NORM-SQ2 TOS 1+ LDA 0< IF ( ABS ) 
SEC TYA TOS SBC TOS STA TYA TOS 1+ SBC TOS 1+ STA THEN
7 # LDY ( SQUISH- 7 0 DO 2/ LOOP 2* SQUARE + ) 
1$: TOS 1+ LSR TOS ROR DEY 1$ BNE
TOS LDA 254 # AND TOS STA CLC SQUARE-TABLE >LO # LDA TOSADC NSTA 
SQUARE-TABLE >HI # LDA TOS 1+ ADC N 1+ STA 
N )Y LDA TOS STA INY N )Y LDA TOS 1+ STA 

( 14:32 04/09/87 ) 
NOS 1+ LDA 0< IF SEC 0 #
LDY TYA NOS SBC NOS STA TYA NOS 1+ SBC
NOS 1+ STA THEN 
7 # LDY ( SQUISH-1 TO GO TO SQUARE ) 
2$: NOS 1+ LSR NOS ROR DEY 2$ BNE 
NOS LDA 254 # AND NOS STA
CLC SQUARE-TABLE >LO # LDA NOSADC NSTA 
SQUARE-TABLE >HI # LDA NOS 1+ ADC N 1+ STA 
CLC N )Y LDA TOS ADC NOS STA 
INY N )Y LDA TOS 1+ ADC NOS 1+ STA 
POP JMP END-CODE 

( DECAY1 puck decelleration 15:03 04/09/87 )
( : DECAY1 DUP 0< SWAP ABS DUP -4 SHIFT - SWAP IF NEGATE THEN ;)
CODE DECAY1 TOS 1+ LDA 0< IF ( ABS ) 255 # LDA N 3 + STA 
SEC TYA TOS SBC TOS STA TYA TOS 1+ SBC TOS 1+ STA 
ELSE 00 # LDA N 3 + STA THEN
TOS LDA N STA TOS 1+ LDA N 1+ STA
5 # LDY 1$: N 1+ LSR N ROR DEY 1$ BNE
SEC TOS LDA N SBC TOS STA 
TOS 1+ LDA N 1+ SBC TOS 1+ STA 
N 3 + LDA 0< IF ( FIX SIGN UP ) 
SEC TYA TOS SBC TOS STA 
TYA TOS 1+ SBC TOS 1+ STA THEN 
NEXT JMP END-CODE 

( DECAY2 player decelleration as CODE 15:14 04/09/87 )
( : XDECAY2 DUP 0< SWAP ABS DUP 5 SHIFT SWAP 2* 
- -5 SHIFT SWAP IF NEGATE THEN ; ) 
CODE DECAY2 (DECAY2) JSR NEXT JMP END-CODE 

( SLOW-DOWN-PUCK DECAY2 11:10 02/09/87 ) 
: SLOW-DOWN-PUCK puck @VELOCITY 2DUP NORM-SQ 25 >
IF DECAY1 SWAP DECAY1 SWAP 
puck !VELOCITY ELSE 2DROP THEN ;

( DECAY2 player decelleration as PROC 15:14 04/09/87 ) 
( : DECAY2 DUP 0< SWAP ABS DUP 5 SHIFT 
SWAP 2* - -5 SHIFT SWAP IF NEGATE THEN ; ) 
PROC (DECAY2) TOS 1+ LDA 0< IF ( ABS ) 255 # LDA N 3 + STA
SEC TYA TOS SBC TOS STA TYA TOS 1
+ SBC TOS 1+ STAELSE 00 # LDA N 3 + STA THEN 
TOS LDA N STA TOS 1+ LDA N 1+ STA 
4 # LDY 1$: N ASL N 1+ ROL DEY 1$ BNE 
TOS ASL TOS 1+ ROL ( 2* )
SEC N LDA TOS SBC TOS STA
N 1+ LDA TOS 1+ SBC TOS 1+ STA
4 # LDY 2$: TOS 1+ LSR TOS ROR DEY 2$ BNE ( -5 SHIFT )
N 3 + LDA 0< IF ( FIX SIGN UP )
SEC TYA TOS SBC TOS STA 
TYA TOS 1+ SBC TOS 1+ STA THEN RTS END-PROC

( THUMP V256/ rounds it! JJT 09:27 08/27/87 ) 
( : SQUISH 7 0 DO 2/ LOOP ; : UNSQUISH 7 SHIFT ; )
: RANDOM-SOUNDS CYCLE# C@ 63 AND 0= IF (RANDOM-SOUND) THEN ; 
: (RANDOM-SOUND)SYSTIMER C@ 3 AND CASE 
0 OF BUGLE-SND ENDOF 1 OF HIWOLF-SND ENDOF
2 OF LOWOLF-SND ENDOF 3 OF UPWHIS-SND ENDOF UPWHIS-SND ENDCASE ; 

CODE V256/( N1 N2 --- N1/256 N2/256 modified--rounded) 
TOS 1+ LDY TOS LDA 0< IF INY THEN TOS STY 
NOS 1+ LDY NOS LDA 0< IF INY THEN NOS STY 
0 # LDA TOS 1+ STA NOS 1+ STA NEXT JMP END-CODE 

( SCALE VSCALE V* RESOLVE forget this!! 09:27 08/27/87 ) 
0 .IF 
: <IP> ROT * >R * R> + ;
: SCALE ( A B-- A ) 0 DO 2/ LOOP ; 
: VSCALE ( A B C-- A B ) ROT ( B C A ) 
OVER ( B C A C ) SCALE ( B C A ) ROT ( C A B )ROT ( A B C )
SCALE ; ( A B ) : V* ROT OVER * ROT ROT * ; 
: RESOLVE ( EXPANDED IN LINE...SEE NEXT SCREEN ) 
2OVER ROT * >R * R> +
LOG(FAT) 0 DO 2/ LOOP 
ROT OVER * ROT ROT * LOG(FAT) 
ROT OVER 0 DO 2/ LOOP 
ROT ROT 0 DO 2/ LOOP ; 
.THEN

( resolve 17:15 08/24/87 ) 
0 .IF 
/| v / | / |  / |/|/----->-----------------------> 
<a,v>a a 
: RESOLVE ( a v--<a,v>a) 2OVER <IP> LOG(FAT) SCALE 
V* LOG(FAT) VSCALE ; 
( This calculation assumes that the norm or length of ) 
( a = ball diameter. Accuracy of the calculation varies ) 
( to the degree that this assumption is true. ) 
.THEN 

( COLLIDE 17:16 08/24/87 )
( calculate and store new velocities for PLAYER1 AND PLAYER2 
when they collide. Assumed they are currently touching ) 
0 .IF 
: COLLIDE ( -- ) 
PLAYER1 @VELOCITY PLAYER2 @VELOCITY PLAYER2 @XY PLAYER1 @XY 
V- ( vx1 vy1 vx2 vy2 Dx Dy--) 2DUP NEGATE 2
SWAP ( 90-ROT ) >R >R 2SWAP RESOLVE 2SWAP 
( v1 v2 b1 ) R> R> 2SWAP RESOLVE V+ 
( <v2,b1>b1 b2 v1 )PLAYER1 @VELOCITY PLAYER2 @VELOCITY V+ 
2OVER V- PLAYER1 !VELOCITY PLAYER2 !VELOCITY ; 
.THEN 

0 .IF 
: COLLIDE PLAYER1 @VELOCITY PLAYER2 @VELOCITY 
2OVER 2/ SWAP 2/ SWAP 2OVER V+ PLAYER2 !VELOCITY
2/ SWAP 2/ SWAP V+ PLAYER1 !VELOCITY ; 
.THEN 

( COLLIDE new improved and simplified--jjt 09:11 08/27/87 ) 
-1 .IF
: COLLIDE PLAYER1 @VELOCITY 2* 
PLAYER2 @VELOCITY 2* 
PLAYER1 !VELOCITY 
PLAYER2 !VELOCITY ; 
.THEN 

( ORIENTATION TABLES RECTANGLES1 18:48 02/08/87 )
L: RECTANGLES1 ( collision detection tables NO puck )
( ulx uly lrx lry puckx pucky )
2 C, 0 C, 15 C, 19 C, 15 , 16 , ( ORIENTATION 0 ) 
3 C, 2 C, 19 C, 15 C, 19 ,  4 , ( 1 ) 
3 C, 0 C, 13 C, 18 C, 13 , -2 , ( 2 ) 
1 C, 0 C,  9 C, 24 C,  2 ,  0 , ( 3 ) 
0 C, 0 C, 13 C, 19 C, -2 ,  2 , ( 4 ) 
0 C, 2 C, 16 C, 15 C, -2 , 11 , ( 5 ) 
0 C, 2 C, 12 C, 20 C,  1 , 21 , ( 6 ) 
0 C, 2 C, 10 C, 24 C,  8 , 23 , ( 7 ) 

( ORIENTATION TABLES RECTANGLES2 18:48 02/08/87 ) 
L: RECTANGLES2 ( collision detection tables WITH puck ) 
( ulx `E10 lrx lry puckx pucky ) 
2 C, 0 C, 15 DIAM + C, 19 C, 15 , 16 ,  ( ORIENTATION 0 ) 
3 C, 2 C, 19 C, 15 C, 19 , 4 ,          ( 1 ) 
3 C, 0 DIAM - C, 13 C, 18C, 13 , -2 ,   ( 2 ) 
1 C, 0 C, 9 C, 24 C, 2 , 0 ,            ( 3 ) 
0 DIAM - C, 0 C, 13 C, 19 C, -2 , 2 ,   ( 4 ) 
-2 C, 2 C, 16 C, 15 C, -2 , 11 ,        ( 5 ) 
0 C, 2 C, 12 C, 20 DIAM + C, 1 , 21 ,   ( 6 ) 
0 C, 2 C, 10 C, 24 C, 8 , 23 ,          ( 7 ) 

( CALC-RTAB as CODE17:06 04/09/87 )
CODE CALC-RTAB ( PLAYER ---- ) 
CLC 8 # LDA TOS ADC N STA TYA TOS 1+ ADC N 1+ STA 
N )Y LDA N STAN 1+ STY N 
ASL N 1+ ROL N ASL N 1+ ROL 
N ASL N 1+ ROL 
CLC 13 # LDA TOS ADC TOS STA
CS IF TOS 1+ INC THEN
TOS X) LDA 0= IF RECTANGLES1 >LO # LDA RTABSTA 
RECTANGLES1 >HI # LDA RTAB 1+ STA 
ELSE RECTANGLES2 >LO # LDA RTAB
STA RECTANGLES2 >HI # LDA RTAB 1+ STA 
THEN CLC RTAB LDA 
N ADC RTAB STA RTAB 1+ LDA N 1+ ADC RTAB 1+ 
STA POP JMP END-CODE 

( CALC-RTAB px py 19:41 02/08/87 ) 
0 .IF 
: CALC-RTAB ( PLAYER ---- ) DUP >R @ORIENTATION 2 * 2* 2* 
R> @POSSESSION IF RECTANGLES2 ELSE RECTANGLES1 THEN + RTAB !; 
: px ( --- px ) RTAB @ 4 + @ 256* ; 
: py ( --- py ) RTAB @ 6 + @ 256* ; 
.THEN 

( lrx lry 12:21 03/31/87 ) 
CODE lrx DEX DEX TOS STY 2 # LDY 
RTAB )Y LDA TOS 1+ STA NEXT JMP END-CODE

CODE lry DEX DEX TOS STY 3 # LDY 
RTAB )Y LDA TOS 1+ STA NEXT JMP END-CODE

CODE px DEX DEX TOS STY 4 # LDY 
RTAB )Y LDA TOS 1+ STA NEXT JMP END-CODE 

CODE py DEX DEX TOS STY 6 # LDY 
RTAB )Y LDA TOS 1+ STA NEXT JMP END-CODE 

( ulx uly 14:48 02/20/87 ) 
CODE ulx DEX DEX TOS STY 
RTAB )Y LDA TOS 1+ STA NEXT JMP END-CODE 

CODE uly DEX DEX TOS STY 
INY RTAB )Y LDA TOS 1+ STA NEXT JMP END-CODE 

CODE !OBJECT puck >HI # LDA OBJECT 1+ STA 
puck >LO # LDA OBJECTSTA NEXT JMP END-CODE 

( CHECK-PUCK-PLAYER orig 21:37 02/08/87 )
0 .IF 
: CHECK-PUCK-PLAYER DUP >R @POSSESSION ?DUP 
IF 1- ?DUP IF R> !POSSESSION ELSE R> DROP THEN 
ELSE PLAYER1 @POSSESSION PLAYER2 @POSSESSION + 2 <
IF R@ @SHOOT-COUNT 0= IF R@ CALC-RTAB puck @XY R@
@XY px py V+ V- NORM-SQ2 
PUCK-STICK-THRESHOLD U< 
IF R@ @XY px py V+ puck !XY 
0 PLAYER1 !POSSESSION 0 PLAYER2 !POSSESSION 
20 R@!POSSESSION 0. puck !VELOCITY
puck @FLAG 1 OR puck !FLAG PICKUP-SND 
THEN THEN THEN R> DROP THEN ; 
.THEN 

: CHECK-PUCK-PLAYER DUP >R @POSSESSION ?DUP
IF 1- ?DUP IF R> !POSSESSION ELSE R> DROP THEN 
ELSE PLAYER1 @POSSESSION PLAYER2 @POSSESSION + 2 <
IF R@ @SHOOT-COUNT 0= IF R@ CALC-RTAB puck @XY R@ 
@XY px py V+ V- NORM-SQ2 PUCK-STICK-THRESHOLD U< 
IF R@ @XY px py V+ puck !XY (RANDOM-SOUND) 
0 PLAYER1 !POSSESSION 0 PLAYER2 !POSSESSION 
10 R@!POSSESSION 0. puck !VELOCITY 
puck @FLAG 1 OR puck !FLAG PICKUP-SND
ELSE !OBJECT ( PUCK-PLAYER-THRESHOLD= ) 
ulx lrx + 2/ uly lry + 2/ R@ @XY 
V+ puck @XY V- NORM-SQ2 050 U< 
IF BOUNCE-SND (NEGATE-YVELOCITY) 
(NEGATE-XVELOCITY) THEN
THEN THEN THEN R> DROP THEN ;

( MOVE-PUCK 13:31 02/05/87 )
: MOVE-PUCK WHIZ-COUNT C@ 0= IF
puck @FLAG 1 AND IF PLAYER1 @POSSESSION IF PLAYER1 DUP CALC-RTAB 
@XY px py V+ puck !XY 
ELSE PLAYER2 DUP CALC-RTAB 
@XY px py V+ puck !XY THEN 
ELSE puck @VELOCITY puck @XY ( DX DY X Y ) 
V+ OVER [ 200 256 * ] LITERAL U> IF 
SWAP DROP 3 SWAP THEN 
puck !XY CHECK-PUCK-GOALIE CHECK-PUCK-COLLISION 
SLOW-DOWN-PUCK THEN PLAYER1 CHECK-PUCK-PLAYER 
PLAYER2 CHECK-PUCK-PLAYER 
THEN ; 

( CHECK-PLAYER-PLAYER 10:49 02/11/87 ) 
-1 .IF 
: CHECK-PLAYER-PLAYER PLAYER1 @XY PLAYER2 @XY V- ( DX DY ) NORM-SQ2 
PLAYER-PLAYER-THRESHOLD U< IF PL/PLYR-SND COLLIDE THEN ; 
.THEN 

0 .IF ( DO NOT USE YET ) 
: CHECK-PLAYER-PLAYER 
PLAYER1 @XY PLAYER2 @XY V- ( DX DY ) NORM-SQ2 
PLAYER-PLAYER-THRESHOLD U< IF PL/PLYR-SND 
PLAYER1 @VELOCITY PLAYER2 @VELOCITY 
PLAYER1 @XY PLAYER2 @XY 
( v1 v2 c1 c2 ) 8 0 DO 7 PICK LOOP 
COLLIDE1 COLLIDE2 THEN ; 
.THEN

( PLAYER-COLLISION WITH WALLS 00:29 02/05/87 ) 
0 .IF
: CHECK-PLAYER-COLLISION >R R@ @XY DUP 
uly + TOP-LINEU< IF DROP TOP-LINE uly - 2DUP 
R@ !XY PL/EDGE-SND R@ SLOW-DOWN-PLAYER R@ SLOW-DOWN-PLAYER 
R@ @VELOCITY NEGATE R@ !VELOCITY THEN DUP 
lry + BOTTOM-LINE U> IF DROP BOTTOM-LINE lry - 2DUP
R@ !XY PL/EDGE-SND R@ SLOW-DOWN-PLAYER R@ SLOW-DOWN-PLAYER 
R@ @VELOCITY NEGATE R@ !VELOCITY THEN SWAP DUP 
lrx + RIGHT-LINE U> IF DROP RIGHT-LINE lrx - SWAP 2DUP 
R@ !XY PL/EDGE-SND R@ SLOW-DOWN-PLAYER R@ SLOW-DOWN-PLAYER 
R@ @VELOCITY SWAP NEGATE SWAP R@ !VELOCITY THEN 
DUP ulx + LEFT-LINE U< IF DROP LEFT-LINE  ulx - SWAP 2DUP 
R@ !XY PL/EDGE-SND R@ SLOW-DOWN-PLAYER R@ SLOW-DOWN-PLAYER 
R@ @VELOCITY SWAP NEGATE SWAP R@ !VELOCITY THEN 
R> DROP 2DROP ; 
.THEN 

( CHECK-PLAYER-COLLISION 6502 REMAKE MAF/JDS 1/2 04/13/87 ) 
CODE CHECK-PLAYER-COLLISION ( PLAYER --- ) 
TOS LDA OBJECT STA TOS 1+ LDA OBJECT 1+ STA 
5 # LDY OBJECT )Y LDA CLC 1 # LDY RTAB )Y ADC 
TOP-LINEH # CMP CS NOTIF SEC TOP-LINEH # 
LDA RTAB )Y SBC 5 # LDY OBJECT )Y STA NEGATE-YVELOCITY JSR
(PL/EDGE-SND) JSR THEN 5 # LDY OBJECT )Y LDA CL
C 3 # LDY RTAB )Y ADC BOTTOM-LINEH # CMP CS 
IF SEC BOTTOM-LINEH # LDA RTAB )Y SBC 5 # LDY OBJECT )
Y STA NEGATE-YVELOCITY JSR (PL/EDGE-SND) JSR
THEN

( CHECK-PLAYER-COLLISION 6502 CONT. 2/210:22 04/13/87 ) 
7 # LDY OBJECT )Y LDA CLC 2 # LDY RTAB )Y ADC
RIGHT-LINEH # CMP CS
IF SEC RIGHT-LINEH # LDA RTAB )Y SBC 7 # LDY OBJECT )Y STA 
NEGATE-XVELOCITY JSR (PL/EDGE-SND) JSR 
THEN 7 # LDY OBJECT )Y LDA CLC 0 # LDY RTAB )Y ADC 
LEFT-LINEH # CMP CS NOT 
IF SEC LEFT-LINEH # LDA RTAB )Y SBC 7 # LDY OBJECT )Y STA 
NEGATE-XVELOCITY JSR (PL/EDGE-SND) JSR 
THEN POP JMP END-CODE 

( CHECK-PLAYER-GOALIE CODE ... MAF11:57 04/13/87 )
0 .IF 
CODE (CHECK-PLAYER-GOALIE) ( PLAYER---)( misng CALC-RTAB )
TOS LDA OBJECT STA TOS 1+ LDA OBJECT 1+ STA 
7 # LDY CLC OBJECT )Y LDA 0 # LDY RTAB )Y ADC 
LEFT-LINEH GOAL-WIDTH + # CMP ( X:LEFTLINE) CS 
IF 5 # LDY OBJECT )Y LDA CLC 3 # LDY RTAB )Y ADC ( LY ) 
GOALIE1-Y 1+ CMP CS NOT IF 5 # LDY OBJECT )Y LDA 
CLC 1 # LDY RTAB )Y ADC ( UY ) 
N STA CLC GOALIE1-Y 1+ LDA GOAL-HEIGHTH # ADC 
N CMP CS NOT IF (PL-GO-BOUNCE) JSR THEN 
THEN POP JMP THEN 

( CHECK-PLAYER-GOALIE called by hi-level 11:57 04/13/87 ) 
7 # LDY CLC OBJECT )Y LDA 2 # LDY RTAB )Y ADC 
RIGHT-LINEH GOAL-WIDTH 1+ - # CMP CS NOT
IF 5 # LDY OBJECT )Y LDA CLC 3 # LDY RTAB )Y ADC 
GOALIE2-Y 1+ CMP CS NOT IF 
5 # LDY OBJECT )Y LDA CLC 1 # LDY RTAB )Y ADC 
N STA CLC GOALIE2-Y 1+ LDA GOAL-HEIGHTH # ADC 
N CMP CS NOT IF (PL-GO-BOUNCE) JSR THEN 
THEN POP JMP THEN POP JMP END-CODE 

: CHECK-PLAYER-GOALIE ( PLAYER -- ) 
DUP >R CALC-RTAB (CHECK-PLAYER-GOALIE) R> DROP ; 
.THEN 
: CHECK-PLAYER-GOALIE ( PLAYER ) 
DUP >R CALC-RTAB R@ @XY DROP
ulx + [ LEFT-LINE GOAL-WIDTH 256 * + ] LITERAL U< 
IF GOALIE1-Y @ GOAL-HEIGHT + uly R@ @XY SWAP DROP + U> 
GOALIE1-Y @ lry R@ @XY SWAP DROP + 
U< AND IF OLD-XY 2@ R@ !XY 
R@ @VELOCITY SWAP NEGATE SWAP
 NEGATE R@ !VELOCITY THEN ELSE 
R@ @XY DROP lrx + 
[ RIGHT-LINE GOAL-WIDTH 256 * - ] LITERAL U> 
IF uly R@ @XY SWAP DROP + GOALIE2-Y @ GOAL-HEIGHT + U< 
lry R@ @XY SWAP DROP + GOALIE2-Y @ U> AND IF OLD-XY 2@ R@ !XY 
R@ @VELOCITY SWAP NEGATE SWAP NEGATE R@ !VELOCITY THEN 
THEN THEN R> DROP ; 

( CHECK-PLAYER-GOALIE in hi_levelMAF 11:57 04/13/87 )
0 .IF 
PROC (PL-GO-BOUNCE) OLD-XY 1+ LDA 5 # LDY OBJECT )Y STA 
OLD-XY 3 + LDA 7 # LDY OBJECT )Y STA 
NEGATE-XVELOCITY JSR RTS END-PROC 

CODE PL-GO-BOUNCE (PL-GO-BOUNCE) JSR NEXT JMP END-CODE
: CHECK-PLAYER-GOALIE ( PLAYER ) DUP >R CALC-RTAB
R@ @XY DROP ulx + [ LEFT-LINE GOAL-WIDTH 256 * + ] LITERAL U< 
IF GOALIE1-Y @ GOAL-HEIGHT + uly R@ @XY SWAP DROP + U>
GOALIE1-Y @ lry R@ @XY SWAP DROP + U<
AND IF PL-GO-BOUNCE THEN 

( CHECK-PLAYER-GOALIE in 4TH MAF 11:57 04/13/87 ) 
ELSE R@ @XY DROP lrx +
[ RIGHT-LINE GOAL-WIDTH 256 * - ] LITERAL U>
IF uly R@ @XY SWAP DROP + GOALIE2-Y @ GOAL-HEIGHT + U< 
lry R@ @XY SWAP DROP + GOALIE2-Y @ 
U> AND IF PL-GO-BOUNCE THEN 
THEN THEN R> DROP ; 
.THEN 

( SLOW-DOWN-PLAYER as PROC MAF14:01 07/14/87 ) 
0 .IF 
CODE (SLOW-DOWN-PLAYER) ( PLAYER -- ) 
TOSLDA OBJECTSTA( PLAYER to OBJECT ) 
TOS 1+ LDA OBJECT 1+ STA 
DEX DEX OBJECT )Y LDA TOS STA ( @VELOCITY ) 
INY OBJECT )Y LDA TOS 1+ STA 
INY OBJECT )Y LDA TOS 2+ STA
INY OBJECT )Y LDA TOS 3 + STA 
(DECAY2) JSR INX INX (DECAY2) JSR DEX DEX 
( decayed velocity ) 0 # LDY TOS LDA OBJECT )Y STA 
( !VELOCITY ) INY TOS 1+ LDA OBJECT )Y STA
INY TOS 2+ LDA OBJECT )Y STA INY TOS 3 + LDA OBJECT )Y STA 
(NORM-SQ) JSR 

( SLOW-DOWN-PLAYER as COLON 00:27 02/05/87 ) 
TOS LDA TOS 1+ ORA 
0= IF 0 # LDY OBJECT )Y STA
INY OBJECT )Y STA 
INY OBJECT )Y STA
INY OBJECT )Y STA THEN 
INX INX NEXT JMP END-CODE 
.THEN 

: SLOW-DOWN-PLAYER ( PLAYER --- ) 
DUP @VELOCITY 
DECAY2SWAPDECAY2SWAP 
( 2DUP NORM-SQ 0= IF 2DROP 0. THEN) 
ROT !VELOCITY ; 

( NEAREST VELOCITY-TABLE 15:45 02/06/87 ) 
: NEAREST ( START POS GOAL POS ---- NEXT ANGLE )
( Calculates the nearest way to get to a position ) 
2DUP = IF DROP ELSE
2DUP - 5 > ( COUNTERCLOCKWISE ) IF DROP 2+ ELSE( 1 ) 2DUP - 3 > 
( COUNTERCLOCKWISE ) IF DROP 1+ ELSE
2DUP - -5 < ( CLOCKWISE ) 
IF DROP 2- ELSE( 1 ) 
2DUP - -3 < ( CLOCKWISE )
IF DROP 1- ELSE
2DUP > ( TOO FAR ) IF DROP 1- ELSE 
DROP 1+ THEN THEN THEN THEN THEN THEN 7 AND ; 

L: VELOCITY-TABLE ( Y X PER DIRECTION )
0 , 330 , -290 , 290 , -420 ,0 ,
 ( 0 1 2 ) -290 , -290 , 0 , -330 ,290 , -290 ,
 ( 3 4 5 ) 420 ,0 ,290 , 290 
, 0 ,0 , ( 6 7 8 ) ( was 320 400 640 ) 

( 09:42 08/27/87 ) 
L: SHOOT-TABLE ( shoot orientation, idx'd by count)
 -1 , 1 , 1 , -1 , 
( : ZOOM 2* DUP 2* + ; ( velocity multiplier for shooting ) 
: ZOOM 2* 2* 2* ;

( SHOOT SEQUENCE 09:36 02/09/87 )
: SHOOT-SEQUENCE ( PLAYER --- ) 
( DUP ) >R ( @SHOOT-COUNT 1 AND 0= IF ) 
R@ @SHOOT-COUNT 1- 2* SHOOT-TABLE + @ 
R@ @ORIENTATION + 7 AND R@ !ORIENTATION 
R@ @SHOOT-COUNT 3 = R@ @POSSESSION AND
IF ( KICK puck IN ASS ) ( player shoot-count --- ) 
WHACK-SND 0 R@ !POSSESSION ( CLEAR PLAYER FLAG ) 
R@ @ORIENTATION 2* 2* VELOCITY-TABLE + 2@ 
ZOOM SWAP ZOOM SWAP ( R@ @VELOCITY V+ ) puck !VELOCITY 
puck @FLAG 254 AND puck !FLAG THEN ( THEN ) 
R@ @SHOOT-COUNT 1- R> !SHOOT-COUNT ; 

( APPLY-JOYSTICK MOVE-PLAYER 00:46 02/05/87 ) 
( 32) 2700 EQU PLAYER-SPEED-LIMIT-Y 
( 16) 2000 EQU PLAYER-SPEED-LIMIT-X 
-2700 EQU -PLAYER-SPEED-LIMIT-Y 
-2000 EQU -PLAYER-SPEED-LIMIT-X
: APPLY-JOYSTICK ( DIRECTION PLAYER ---- ) 
>R 2* 2* VELOCITY-TABLE + 2@ R@ @VELOCITY D+
DUP 0< IF -PLAYER-SPEED-LIMIT-Y MAX 
ELSE PLAYER-SPEED-LIMIT-Y MIN THEN
SWAP DUP 0< IF -PLAYER-SPEED-LIMIT-X MAX 
ELSE PLAYER-SPEED-LIMIT-X MIN THEN 
SWAP R> !VELOCITY ; 

(12:47 08/29/87 ) 
: MOVE-PLAYER ( PLAYER ---- )
DUP >R @VELOCITY R@ @XY ( DX DY X Y ) 2DUP OLD-XY 2! 
V+ OVER [ 200 256 * ] LITERAL U> IF SWAP DROP 3 SWAP THEN 
R@ !XY R@ CALC-RTAB R@ CHECK-PLAYER-COLLISION 
R@ CHECK-PLAYER-GOALIE 
R> SLOW-DOWN-PLAYER ; 

( READ-JOY1 JDS OPTIMIZED INLINE FORTH 17:04 03/24/87 ) 
: READ-JOY1 ( --- ORIENTATION ) PLAYER1 @FLAG 2 AND
IF [ PLAYER1 10 + ] LITERAL ( TIMER ) C@ 0= 
IF SKILL C@ SCORE2 @ SCORE1 @ - - 0 MAX 2 ( 32) MIN 
 [ PLAYER1 10 + ] LITERAL C! [ PLAYER1 13 + ] LITERAL C@IF 
[ PLAYER1 4 + ] LITERAL 2@ ( XY) OVER 256/ 120 > 
IF 2DROP SHOOTFLAG1 ON 8 ELSE 156 111 2SWAP V256/ ANGLE 4 - 7 AND THEN 
ELSE [ PLAYER1 4 + ] LITERAL 2@ V256/ 
[ puck 4 + ] LITERAL 2@ V256/ ANGLE THENELSE [ PLAYER1 10 + ]
LITERAL C@ 1-[ PLAYER1 10 + ] LITERAL C! 
OLDJOY1 C@ THEN ELSE FB0 C@ IF SHOOTFLAG1 ON THEN
?BLUE-ACTION THEN DUP OLDJOY1 C! ; 

( READ-JOY2 JDS OPTIMIZED INLINE FORTH17:04 03/24/87 ) 
: READ-JOY2 ( --- ORIENTATION )
PLAYER2 @FLAG 2 ANDIF [ PLAYER2 10 + ] LITERAL ( TIMER )
C@ 0= IF SKILL C@ SCORE1 @ SCORE2 @ - - 0 MAX 
2 ( 32) MIN[ PLAYER2 10 + ] LITERAL C! [ PLAYER2 13 + ] 
LITERAL C@IF [ PLAYER2 4 + ] LITERAL 2@ ( XY) 
OVER 256/ 35 < IF 2DROP SHOOTFLAG2 ON 8 
( SHOOT PUCK ) ELSE 05 111 2SWAP V256/ ANGLE 4 - 7 AND THEN 
ELSE [ PLAYER2 4 + ] LITERAL 2@ V256/ [ puck 4 + ] 
LITERAL 2@ V256/ ANGLE THENELSE [ PLAYER2 10 + ]
LITERAL C@ 1-[ PLAYER2 10 + ] LITERAL C! OLDJOY2 C@ THEN 
ELSE FB1 C@ IF SHOOTFLAG2 ON THEN ?REDD-ACTION 
THEN DUP OLDJOY2 C! ; 

( UPDATE SCORE JDS 1/2 11:37 03/24/87 ) 
HEX CODE (UPDATE-SCORE) SCORE1 LDA PHA 0F # AND CLC 48 # ADC 
NUM1-N STA 83 # LDA NUM1-A STAPLA A LSR A LSR A LSR A LSR CLC 
48 # ADC NUM0-N STA 82 # LDA NUM0-A STA  SCORE2 LDA PHA 0F # 
AND CLC 48 # ADC NUM3-N STA 85 # LDA NUM3-A STAPLA A LSR A LSR A 
LSR A LSR CLC 48 # ADC NUM2-N STA 84 # LDA NUM2-A STA SAVES1 
LDA PHA 0F # AND CLC 3E # ADC NUM8-N STA 8A # LDA NUM8-A STA
PLA A LSR A LSR A LSR A LSR CLC 3E # ADC NUM7-N STA 89 # 
LDA NUM7-A STA 

( UPDATE SCORE JDS 2/2 11:37 03/24/87 ) 
SAVES2 LDA PHA 0F # AND CLC 3E # ADC 
NUMA-N STA 8C # LDA NUMA-A STAPLA A LSR A LS
R A LSR A LSR CLC 3E # ADCNUM9-N STA 8B # LDA 
NUM9-A STADEX DL-TABLE-START >HI #LDA TOS STA
DEX DL-TABLE-START >LO #LDA TOS STADEX PLAYERS-ITAB 
 >HI #LDA TOS STADEX PLAYERS-ITAB >LO #LDA TOS STADEX NUMBERS-ETAB 
 >HI #LDA TOS STADEX NUMBERS-ETAB >LO #LDA TOS STA 
 BEGIN MSTAT BIT 0< UNTIL ( THEN WAIT FOR VBLANK )' 
(NEW-GRAPHICS) >BODY JMP ( N N N--) END-CODE

CODE UPDATE-SCORE ' (UPDATE-SCORE) >BODY JSR NEXT JMP END-CODE 
DECIMAL

( WHIZZING LIGHTS 1/3 11:15 03/25/87 ) 
HEX CODE (WHIZ)WHIZ-COUNT LDA 0= IF RTS THEN 0< 
IF WHIZ-COUNT INC WHIZ-COUNT 1+ LDA0= 
IF R-TWIRLB # LDA RUT-I STA
RLT-I STAWHIZ-COUNT 1+ INC 
ELSE 1 # CMP 0= IF R-TWIRLD # LDA RUT-I STA RLT-I STA 
WHIZ-COUNT 1+ INC 
ELSE 2 # CMP 0= 
IF R-TWIRLC # LDA RUT-I STA RLT-I STAWHIZ-COUNT 1+ INC
ELSE WHIZ-COUNT 1+ STY R-TWIRLA # LDA RUT-I STA RLT-I STA
THEN THEN THEN 89 # LDA RUT-A STA RLT-A STA 

( WHIZZING LIGHTS 2/3 12:04 03/25/87 ) 
ELSE WHIZ-COUNT DEC WHIZ-COUNT 1+ LDA 0= 
IF B-TWIRLB # LDA BUT-I STA BLT-I STAWHIZ-COUNT 1+ INC 
ELSE 1 # CMP 0= IF B-TWIRLD # LDA 
BUT-I STA BLT-I STAWHIZ-COUNT 1+ INC ELSE
2 # CMP 0= IF B-TWIRLC # LDA BUT-I STA BLT-I STAWHIZ-COUNT 1+ INC 
ELSE WHIZ-COUNT 1+ STY B-TWIRLA # LDA BUT-I STA BLT-I STA
THEN THEN THEN 88 # LDA 
BUT-A STA BLT-A STA THEN FF # LDA NETPLUG STA 

( WHIZZING LIGHTS 3/3 11:15 03/25/87 ) 
WHIZ-COUNT LDA 0= IF WHIZ-COUNT 1+ STY WHIZ-DONE
DEC THEN DEX DL-TABLE-START >HI #LDA TOS STA
DEX DL-TABLE-START >LO #LDA TOS STA 
DEX PLAYERS-ITAB >HI #LDA TOS STADEX PLAYERS-ITAB 
>LO #LDA TOS STADEX NETGOAL-ETAB >HI #
LDA TOS STADEX NETGOAL-ETAB 
>LO #LDA TOS STABEGIN MSTAT BIT 0< UNTIL ( THEN WAIT FOR VBLANK ) 
' (NEW-GRAPHICS) >BODY JMP 
( N N N--) END-CODE

CODE WHIZ ' (WHIZ) >BODY
JSR NEXT JMP END-CODE 
DECIMAL 

( TWIRLS - WHIZZING DURING ZAMBONI 1/2 11:24 04/14/87 ) 
HEX CODE (TWIRL)WHIZ-COUNT 1+ LDA 0= 
IF B-TWIRLB # LDA BUT-I STA BLT-I STA 
R-TWIRLB # LDA RUT-I STA RLT-I STAWHIZ-COUNT 1+ INC 
ELSE 1 # CMP 0= IF B-TWIRLD # LDA BUT-I STA BLT-I 
STAR-TWIRLD # LDA RUT-I STA 
RLT-I STAWHIZ-COUNT 1+ INC 
ELSE 2 # CMP 0= IF B-TWIRLC # LDA 
BUT-I STA BLT-I STAR-TWIRLC # LDA 
RUT-I STA RLT-I STA WHIZ-COUNT 1+ INC 
ELSE WHIZ-COUNT 1+ STY B-TWIRLA # LDA 
BUT-I STA BLT-I STAR-TWIRLA # LDA RUT-I STA RLT-I STA
THEN THEN THEN 
88 # LDA BUT-A STA BLT-A STA89 # LDA 
RUT-A STA RLT-A STA FF # LDA NETPLUG STA 

( TWIRLS - WHIZZING DURING ZAMBONI 2/2 11:24 04/14/87 ) 
DEX DL-TABLE-START 
>HI #LDA TOS STA
DEX DL-TABLE-START 
>LO #LDA TOS STA
DEX PLAYERS-ITAB 
>HI #LDA TOS STADEX PLAYERS-ITAB 
>LO #LDA TOS STADEX NETGOAL-ETAB >HI #LDA TOS STADEX NETGOAL-ETAB 
>LO #LDA TOS STABEGIN MSTAT BIT 0< UNTIL 
( THEN WAIT FOR VBLANK )
' (NEW-GRAPHICS) >BODY JMP ( N N N--) END-CODE

CODE TWIRL ' (TWIRL) >BODY JSR NEXT JMP END-CODE 

DECIMAL DECIMAL 

( CHECK-FOR-GOAL 23:12 02/09/87 ) 
: CHECK-FOR-GOAL
puck @XY DUP GOAL-TOP U> IF GOAL-BOTTOM U<
IF DUP RIGHT-LINE U> IF DROP -40 WHIZ-COUNT C! 
SCORE1 DECIMAL-INC GOAL-SND ELSE LEFT-LINE U< IF 
40 WHIZ-COUNT C! SCORE2 DECIMAL-INC GOAL-SND 
THEN THEN
WHIZ-COUNT C@ 
IF puck @FLAG 254 AND puck !FLAG0 PLAYER1 !POSSESSION 
0 PLAYER2 !POSSESSION UPDATE-SCORE WHIZ THEN
ELSE DROP ( X---)THEN ELSE 2DROP ( X/Y) THEN ; 

( SERVEfixed per memo. jjt 09:43 08/27/87 ) 
: SERVE 0 puck!
FLAG 0 PLAYER1 !SHOOT-COUNT 0 PLAYER2 
!SHOOT-COUNT
0 PLAYER1 !ORIENTATION 4 PLAYER2 !ORIENTATION
0 PLAYER1 !POSSESSION 0 PLAYER2 !POSSESSION
0 PLAYER1 !TIMER 0 PLAYER
2 !TIMER0 0 PLAYER1 !VELOCITY 57 256* 104 256* 
PLAYER1 !XY0 0 PLAYER2 !VELOCITY 86 256* 102 
256* PLAYER2 !XY 
8 OLDJOY1 C! 8 OLDJOY2 C! 0 SHOOTFLAG1 ! 
0 SHOOTFLAG2 ![ RIGHT-LINE LEFT-LINE - -1 
SHIFT 384 - LEFT-LINE + ] LITERAL 
[ 200 256 * ] LITERAL 0 puck 
!XY INIT-SOUND ANIMATOR 9000 0 
DO LOOP SERVE-SNDSYSTIMER C@ 4 AND 0=
IF TOP-LINE 512 - puck !XY 0 2048
ELSE BOTTOM-LINE 512 + puck !XY 0 -2048 
THEN puck !VELOCITY ANIMATOR ; 

( PLAYER1-PROCESS00:38 02/05/87 ) 
: PLAYER1-PROCESS 
SHOOTFLAG1 C@ IF 4 PLAYER1 !SHOOT-COUNT 
SHOOTFLAG1 OFF THEN
PLAYER1 @SHOOT-COUNT 
IF PLAYER1 SHOOT-SEQUENCE 
ELSE READ-JOY1 DUP 8 = IF 
150 111 PLAYER1 @XY( 156 )V256/ ANGLE 4 - 7 AND 
ELSE DUP THEN PLAYER1 @ORIENTATION SWAP NEAREST
PLAYER1 !ORIENTATION PLAYER1 APPLY-JOYSTICK 
THEN PLAYER1 MOVE-PLAYER ;

( PLAYER2-PROCESS10:43 02/11/87 ) 
: PLAYER2-PROCESS
SHOOTFLAG2 C@ IF 4 PLAYER2 !SHOOT-COUNT SHOOTFLAG2 OFF 
THEN PLAYER2 @SHOOT-COUNT IF PLAYER2 SHOOT-SEQUENCE 
ELSE READ-JOY2 DUP 8 = IF05 111 PLAYER2 @XY V256/ 
ANGLE 4 - 7 AND ELSE DUP THEN 
PLAYER2 @ORIENTATION SWAP NEAREST PLAYER2 
!ORIENTATION PLAYER2 APPLY-JOYSTICK 
THEN PLAYER2 MOVE-PLAYER ;

( UMIN UMAX DRAW-GOALIE1 DRAW-GOALIE216:39 02/22/87 )
: UMIN 2DUP U> 
IF SWAP THEN DROP ;
: UMAX 2DUP U< IF SWAP THEN DROP ; 

CODE DRAW-GOALIE1 TOS 1+ 
LDA BLUE-GOALY-Y STA INX INX N
EXT JMP END-CODECODE DRAW-GOALIE2 TOS 1+ 
LDA REDD-GOALY-Y STA INX INX NEXT JMP END-CODE

( GOALIEN-PROCESS15:51 02/22/87 ) 
L: GOALIE-MOVES ( JOYSTICK -> Y CHANGE ) 
0 , -2048 , -2048 , -2048 , 0 , 2048 , 2048 , 2048 , 0 , 

: GOALIE1-PROCESS 
GOALIE1-Y @ OLDJOY1 C@ 2* 
GOALIE-MOVES + @ + GOAL-TOP UMAX 
[ GOAL-BOTTOM GOAL-HEIGHT - ] LITERAL UMIN 
DUP GOALIE1-Y !( GOAL1-X SWAP V256/) ( ---Y256*) 
DRAW-GOALIE1 ; : GOALIE2-PROCESS
GOALIE2-Y @ OLDJOY2 C@ 2* GOALIE-MOVES + @ + 
GOAL-TOP UMAX [ GOAL-BOTTOM GOAL-HEIGHT - ] 
LITERAL UMIN DUP GOALIE2-Y ! 
( GOAL2-X SWAP V256/ ) ( ---Y256*) 
DRAW-GOALIE2 ; 

( LIGHTEN-ICE DARKEN-ICE 13:26 04/09/87 ) 
CODE (LIGHTEN-ICE) BG-TOP-ICE LDY INY BG-TOP-ICE STY RTS
END-CODE

CODE LIGHTEN-ICE ' (LIGHTEN-ICE) >BODY JSR 
NEXT JMP END-CODECODE (DARKEN-ICE) BG-TOP-ICE 
LDY DEY BG-TOP-ICE STY RTS
END-CODE

CODE DARKEN-ICE ' (DARKEN-ICE) >BODY JSR NEXT JMP END-CODE 
HEX

( TIMER-INIT UPDATE-TIMER SUBROUTINE 1/2 09:04 04/07/87 ) 
CODE TIMER-INIT TIMER STY SECONDS STY SAVES1 STY 
SAVES2 STY SCORE1 STY SCORE2 STY BONUS STY 2 # 
LDY MINUTES STY (INIT-TIMER) JSR NEXT JMP END-CODE 

CODE BONUS-INIT TIMER STY MINUTES STY 20 # LDY 
SECONDS STY BONUS STY (INIT-TIMER) JSR NEXT JMP 
END-CODE 

CODE DEMO-TIMER TIMER STY 
MINUTES STY SAVES1 STY SAVES2 STY SCORE1 STY 
SCORE2 STY BONUS STY 20 # LDY SECONDS STY NEXT JMP END-CODE 

CODE (UPDATE-TIMER) TIMER LDA 3C # CMP CS 
IF SECONDS LDA SED SEC 1 # SBC CLD
SECONDS STA TIMER STY THEN SECONDS LDA 0< 
IF MINUTES LDA SED SEC 1 # SBC CLD
MINUTES STA 59 # LDA SECONDS STA
MINUTES LDA 1 # CMP 0= NOT 
IF' (LIGHTEN-ICE) >BODY JSR THEN THEN

( UPDATE-TIMER SUBROUTINE CONT. 2/2 10:15 04/06/87 ) 
L: (INIT-TIMER)SECONDS LDA PHA 0F # AND CLC 48 # ADC
NUM6-N STA 88 # LDA NUM6-A STA
PLA A LSR A LSR A LSR A LSR CLC 48 # 
ADCNUM5-N STA 87 # LDA
NUM5-A STAMINUTES LDA CLC 48 # 
ADCNUM4-N STA 86 # LDA NUM4-A STA
DEX DL-TABLE-START >HI #LDA TOS STA
DEX DL-TABLE-START >LO #LDA TOS STA
DEX PLAYERS-ITAB >HI #LDA TOS STA
DEX PLAYERS-ITAB >LO #LDA TOS STA
DEX NUMBERS-ETAB >HI #LDA TOS STA 
DEX NUMBERS-ETAB >LO #LDA TOS STA
BEGIN MSTAT BIT 0< UNTIL ( THEN WAIT FOR VBLANK )
' (NEW-GRAPHICS) >BODY JMP 
( N N N--) END-CODE

( UPDATE-TIMER MIN-SEC-CHECK09:03 04/07/87 ) 
CODE UPDATE-TIMER' (UPDATE-TIMER) >BODY JSR NEXT JMP END-CODE 

CODE MIN-SEC-CHECK DEX TOS STY DEX TOS STY
MINUTES LDA 0= IF SECONDS LDA 0= 
IF DEY TOS STY THEN THEN NEXT JMP END-CODE 

CODE OVERTIME-SIGN-ONBEGIN MSTA
T BIT 0< UNTIL ( THEN WAIT FOR VBLANK )
OVERT# LDA BLUE-IMAGE# STA3E # LDA BLUE-X STA 
B8 # LDA BLUE-Y STA8A # LDA BLUE-ALTER STA' 
(PLAYER-FRAME-DISPLAY) 
>BODY JSR NEXT JMP END-CODE

( GAMEOVER-SIGN-ON 14:50 04/08/87 ) 
CODE GAMEOVER-SIGN-ONBEGIN MSTAT BIT 0< UNTIL 
( THEN WAIT FOR VBLANK )GOVER 
# LDA BLUE-IMAGE# STA3E # LDA BLUE-X STAB8 # LDA BLUE-Y STA 
8A # LDA BLUE-ALTER STA' 
(PLAYER-FRAME-DISPLAY) >BODY JSR NEXT JMP END-CODE 

CODE GAMEOVER-SIGN-OFFBEGIN MSTAT BIT 0< UNTIL 
( THEN WAIT FOR VBLANK )PUCK # LDA BLUE-IMAGE# STA
AA # LDA BLUE-X STAB8 # LDA BLUE-Y STA8A
 # LDA BLUE-ALTER STA' 
(PLAYER-FRAME-DISPLAY) >BODY JSR NEXT JMP END-CODE 

( ZAMBONI-MOVE 1/2 INCLUDES DIRECT-RTN 15:55 04/07/87 ) 
CODE ZAMBONI-MOVE ( FELLA-IMAGE#/DX/DY --- ) '
(TWIRL) >BODY JSR BEGIN MSTAT BIT 0< UNTIL 
( THEN WAIT FOR VBLANK ) 0 # LDY DEX DEX 0A # LDA TOS 
STA TOS 1+ STY DEX DEX 03 # LDA TOS STA 
TOS 1+ STY DEX DEX 14 # LDA TOS STA TOS 1+ STY 
' (DIRECT-ERASE) >BODY JSR 0 # LDY 
DEX DEX 0B # LDA TOS STA TOS 1+ STY 
DEX DEX 03 # LDA TO
S STA TOS 1+ STY DEX DEX 
15 # LDA TOS STA TOS 1+ STY ' 
(DIRECT-ERASE) >BODY JSR 
( ZAMBONI-MOVE 2/3 11:34 04/07/87 ) 
BLUE-IMAGE# LDA 1 # EOR BLUE-IMAGE# STA
BLUE-X LDA CLC NOS ADC BLUE-X STA 
BLUE-Y LDA CLC TOS ADC BLU
E-Y STA 8A # LDA BLUE-ALTER 
STA NOS 2+ LDA REDD-IMAGE# STA 
REDD-X LDA CLC NOS ADC REDD-X 
STA REDD-Y LDA CLC TOS ADC REDD-Y 
STA 8B # LDA REDD-ALTER STA 
' (PLAYER-FRAME-DISPLAY) >BODY JSR
' (TWIRL) >BODY JSR 
INX INX INX INX INX INX NEXT JMP END-CODE

( ICE>LEFT 11:34 04/07/87 ) 
CODE ZL ( ICE>LEFT) BLUE-X LDA BLUE-GO
ALY-X STA REDD-GOALY-X STA PUCK-X STA
BLUE-Y LDA BLUE-GOALY-Y STA CLC 8 # ADC 
REDD-GOALY-Y STA CLC 8 # ADC PUCK-Y STA
BLUE-X LDA 1A # CMP CS IF 80 # LDA 
LONG-ICE # LDY ELSE 81 # LDA 
SHORT-ICE # LDY THENBLUE-GOALY-ALTER
STA REDD-GOALY-ALTER STA PUCK-ALTER STA 
BLUE-GOALY-IMAGE# STY REDD-GOALY-IMAGE# 
STY PUCK-IMAGE# STY' 

(PLAYER-FRAME-DISPLAY) 
>BODY JSR NEXT JMP END
-CODE
( ICE>RIGHT 11:34 04/07/87 ) 
CODE ZR ( ICE>R
IGHT) BLUE-Y LDA BLUE-GOALY-Y STA 
CLC 8 # ADC REDD-GOALY-Y STA CLC 8 # ADC PUC
K-Y STABLUE-X LDA 7F # CMP CS 
NOTIF 80 # LDA LONG-ICE # LDY 
BLUE-GOALY-ALTER STAREDD-GOALY
-ALTER STA PUCK-ALTER STA BLUE-GOALY-IMAGE
# STY REDD-GOALY-IMAGE# STY PUCK-IMAGE
# STY BLUE-X LDA SEC 74 # SBC BLUE-GOALY-X 
STA REDD-GOALY-X STA PUCK-X 
STA ELSE 81 # LDA SHORT-ICE # LDY 
BLUE-GOALY-ALTER STA 
REDD-GOALY-ALTER STA PUCK-ALTER STA 
BLUE-GOALY-IMAGE# STY REDD-GOA
LY-IMAGE# STY PUCK-IMAGE# STY ( 83) 
BLUE-X LDASEC 8 # SBC BLUE-GOALY-X STA 
REDD-GOALY-X STA PUCK-X STA 
THEN ' (PLAYER-FRAME-DISPLAY) 
>BODY JSR NEXT JMP END-CODE 

( SETUP-NET-ICE-RIGHT 14:11 05/12/87 ) 
CODE SNIR ( SETUP-NET-ICE-RIGHT) 
BG-TOP-ICE LDA P6C1 STA P6C2
STA P6C3 STA ( PAL 6)98 # LDA 
BLUE-GOALY-X STA REDD-GOALY-X 
STA PUCK-X STA 70 # LDA BLUE-GOALY-Y 
STA CLC 8 # ADC REDD-GOALY-Y STA
CLC 8 # ADC PUCK-Y STA 81 # LDA 
BLUE-GOALY-ALTER STA REDD-GOALY-ALTER STA
PUCK-ALTER STA NET-ICE # LDA BLUE-GOALY-IMAGE# 
STA REDD-GOALY-IMAGE# STA PUCK-IMAGE# STA 
' (PLAYER-FRAME-DISPLAY) >BODY JSR NEXT JMP END-CODE

( SETUP-NET-ICE-LEFT 14:11 05/12/87 ) 
CODE SNIL ( SETUP-NET-ICE-LEFT) 
BG-TOP-ICE LDA P6C1 STA P6C2 STA P6C3 
STA ( PAL 6)FC # LDA BLUE-GOALY-X STA 
REDD-GOALY-X STA PUCK-X STA
58 # LDA BLUE-GOALY-Y STA CLC 8 # ADC 
REDD-GOALY-Y STACLC 8 # ADC PUCK-Y 
STA 81 # LDA BLUE-GOALY-ALTER STA
REDD-GOALY-ALTER STAPUCK-ALTER STA 
NET-ICE # LDA BLUE-GOALY-IMAGE# STA 
REDD-GOALY-IMAGE# STA 
PUCK-IMAGE# STA 
' (PLAYER-FRAME-DISPLAY) >BODY JSR NEXT JMP END-CODE

( ZAMBONI-INIT 11:36 04/07/87 ) 
CODE ZAMBONI-INIT 
( ZAMBONI-X/ZAMBONI-Y --- )ZAM1 # LDA BLUE-IMAGE# STA 
NOS LDA BLUE-X STA TOS LDA BLUE-Y STA 
8A # LDA BLUE-ALTER STA FELLA1 # LDA REDD-IMAGE# 
STA NOS LDA CLC 3 # ADC REDD-X STA 
TOS LDA CLC 6 # ADC REDD-Y STA 
8B # LDA REDD-ALTER STA 
' (PLAYER-FRAME-DISPLAY) >BODY JSR
INX INX INX INX NEXT JMP END-CODE 

( SCOREFLASH-PREP08:44 04/20/87 ) 
: WAIT 50 0 DO 0 DROP LOOP SCOREFLASH-RTN ;
CODE SCOREFLASH-PREP SCOREFLASH STY 
( DELAY COUNTER ) SCORE1 1+ STY 
( PHASE FLAG VIZ. ERASE OR DISPLAY)
SCORE1 LDA SEC SCORE2 SBC SCORE1 STA 
( WHO WON FLAG)0= IF NEXT JMP THEN 
0< IF NUM2-N 1+ LDA SCORE2 STA NUM3-N 
1+ LDA SCORE2 1+ STA ELSE NUM0-N 1+ LDA 
SCORE2 STA NUM1-N 1+ LDA SCORE2 1+ STA THEN NEXT JMP END-CODE

( SCOREFLASH-RTN 1/2 09:27 04/20/87 ) 
CODE (SCOREFLASH-RTN) SCORE1 LDA 0= IF RTS 
THEN SCOREFLASH LDA 04 # CMP CS IF SCOREFLASH STY 
ELSE SCOREFLASH INC RTS THEN SCORE1 1+ 
LDA 0= NOT IF SCORE1 1+ STY SCORE1 LDA 0< 
IF SCORE2 LDA NUM2-N 1+ STA SCORE2 1+ LDA 
NUM3-N 1+ STA84 # LDY NUM2-ASTY INY NUM3-ASTY
ELSE SCORE2 LDA NUM0-N 1+ STA SCORE2 1+ LDA NUM1-N 1+ STA82 #
LDY NUM0-ASTY INY NUM1-ASTY THEN
ELSE DEY SCORE1 1+ STY SCORE1 LDA0< 
IF AA # LDA NUM2-N 1+ STA NUM3-N 1+ STA 84 # 
LDY NUM2-ASTY INY NUM3-ASTY
ELSE AA # LDA NUM0-N 1+ STA NUM1-N 1+ STA 82
# LDY NUM0-ASTY INY NUM1-ASTY THEN THEN

( SCOREFLASH-RTN 2/2 09:32 04/20/87 ) 
DEX DL-TABLE-START >HI #LDA TOS STADEX DL
-TABLE-START >LO #LDA TOS STADEX PLAYERS-ITAB 
>HI #LDA TOS STADEX PLAYERS-ITAB >LO #LDA TOS 
STADEX NUMBERS-ETAB >HI #LDA TOS STA
DEX NUMBERS-ETAB >LO #LDA TOS STA BEGIN 
MSTAT BIT 0< UNTIL ( THEN WAIT FOR VBLANK )' 
(NEW-GRAPHICS) >BODY JMP ( N N N--) END-CODE 

CODE SCOREFLASH-RTN ' (SCOREFLASH-RTN) >BODY JSR NEXT JMP END-CODE 
DECIMAL 

( REDO- ZAMBONI LOOP EXIT TO NEW GAME 1/2 15:25 06/09/87 ) 
: WARM-RESET S0 @ SP! R0 @ RP! 0 SND?-FLAG C! INIT-SOUND 0 
SCORE1 ! 0 SCORE2 ! 0 SAVES1 ! 0 SAVES2 ! 
0 PLAYER1 !FLAG ( SKILL AND AUTOMATION STATE )( REMAIN UNCHANGED) 
BACKGROUND-INIT RED-CHECK MAIN-LOOP ;

( 19:22 08/29/87 ) 
: ?REDO FB0 C@ FB1 C@ OR 
IF WARM-RESET THEN ;: CONSOLE-CHECK GETRAW ?RESET 
IF WARM-RESET THEN ?SELECT 
IF BEGIN GETRAW ?SELECT 0= UNTIL
TITLE-UP WARM-RESET THENGETRAW ?PAUSE IF 
BEGIN GETRAW ?PAUSE 0= UNTIL ( DEBOUNCE ) 
WORKAREA0 C@ -1 WORKAREA0 C! 0 AUDV0 C! 
( AREA0 OFF) WORKAREA1 C@ -1 
WORKAREA1 C! 0 AUDV1 C! ( AREA1 OFF) 
BEGIN GETRAW ?SELECT IF BEGIN GETRAW ?SELECT 0= UNTIL 
TITLE-UP WARM-RESET THEN ?RESET 
IF WARM-RESET ( BYE) THEN ?PAUSE 
UNTIL ( PAUSE ) BEGIN GETRAW ?
PAUSE 0= UNTIL WORKAREA1 C! WORKAREA0 C!
THEN ( DEBOUNCE ) ; 

( ZAMBONI-LOOP 1/2 16:00 04/07/87 ) 
: ZAMBONI-LOOP SCORE
FLASH-PREP PUCK-ERASE BLUE-GOALY-ERASE
REDD-GOALY-ERASE BLUE-ERASE REDD-ERASE 
GAMEOVER-SIGN-ON4000 0 DO 0 DROP LOOP 
09 40 ZAMBONI-INIT SNIR SNIL TURK-SND 2 0 DO65 0 DO FELLA1 
2 0 ZAMBONI-MOVE ZR WAIT CONSOLE-CHECK ( NEXT-JOYS ) ?RED
O LOOP ( I 0= IF TURK-SND THEN )FELLA2 
0 0 ZAMBONI-MOVE WAIT WAIT 24 0 DO FELLA3 
0 1 ZAMBONI-MOVE WAIT CONSOLE-CHEC
K ( NEXT-JOYS) ?REDO LOOPFELLA4 0 0 
ZAMBONI-MOVE WAIT WAIT 65 0 DO FELLA5 -2 0 
ZAMBONI-MOVE ZL WAIT CONSOLE-CHECK( NEXT-JOYS ) 
?REDO LOOP FELLA4 0 0 
ZAMBONI-MOVE WAIT WAIT 
TURK-SND 24 0 DO FELLA3 0 1 
ZAMBONI-MOVE WAIT CONSOLE-CHECK ( NEXT-JOYS) ?REDO LOOPFELLA2 0 0 
ZAMBONI-MOVE WAIT WAIT LOOP 

( ZAMBONI-LOOP 2/216:00 04/07/87 ) 
65 0 DO FELLA1 2 0 
ZAMBONI-MOVE ZR WAIT CONSOLE-CHECK 
( NEXT-JOYS) ?REDO LOOP 
FELLA2 0 0 ZAMBONI-MOVE WAIT WAIT 
24 0 DO FELLA3 0 1 ZAMBONI-MOVE 
WAIT CONSOLE-CHECK ( NEXT-JOYS)
?REDO LOOP FELLA4 0 0 ZAMBONI-MOVE 
WAIT WAIT 65 0 DO FELLA5 -2 0 ZAMBONI-MOVE ZL 
WAIT CONSOLE-CHECK( NEXT-JOYS) ?REDO LOOP ; 

CODE ?BONUS
DEX TOS STY DEX TOS STY BONUS LDA 0= 
IF ( BONUS HASN'T BEEN GIVEN YET) 
SCORE1 LDA SCORE2 CMP 0= IF DEY TOS STY THEN ELSE BONUS STY THEN
NEXT JMP END-CODE 

( USER-CHOICE no exp/nov for 2-plr...jjt 09:57 08/27/87 ) 
HEX CODE USER-CHOICE
BG-FREE2 LDA( DY0 LDA DY1 ORA ) 1 # CMP 0= 
IF 1PLAYERB # LDA BLUE-IMAGE# STA 
( two player ) 2PLAYERR # LDA REDD-IMAGE# STA
EXPERTB # LDA BLUE-GOALY-IMAGE# STA ( turn off )NOVICEB # LDA 
REDD-GOALY-IMAGE# STA ( exp/novice)
0 # LDA PLAYER2 9 + STA 01 # LDA BG-FREE2 STA ELSE 
FF # CMP 0= IF1PLAYERR # LDA BLUE-IMAGE
# STA ( one player)2PLAYERB # LDA REDD-IMAGE#
STA2 # LDA PLAYER2 9 + STA FF # LDA BG-FREE2 STAEXP-NOV JSR 
THEN( DY=0) PLAYER2 9 + LDA 2 # CMP 0= IF EXP-NOV JSR 
THEN THEN 

( USER-CHOICE CONT. REV. jjt 09:58 08/27/87 ) 
82 # LDA BLUE-ALTER STA 83 # LDA REDD-ALTER 
STA 85 # LDA BLUE-GOALY-ALTER STA 84 # LDA 
REDD-GOALY-ALTER STA
' (PLAYER-FRAME-DISPLAY) >BODY JSR NEXT JMPL
: EXP-NOV BG-FREE3 LDA ( DX0 LDA DX1 ORA ) 
L: LBL2 1 # CMP 0= IF NOVICEB # 
LDA REDD-GOALY-IMAGE# STA EXPERTR # LDA 
BLUE-GOALY-IMAGE# STA 
( 3) 0 # LDA SKILL STA 01 # LDA BG-FREE3 
STA LBL1 JMP THEN FF # CMP 0= IF NOVICER # 
LDA REDD-GOALY-IMAGE# STAEXPERTB # LDA 
BLUE-GOALY-IMAGE# STA ( 6) 1 # LDA SKILL 
STA FF # LDA BG-FREE3 STA LBL1 JMP THEN SKILL 
LDA 0= IF 1 # LDA ELSE FF # LDA THEN LBL2 JMP 
L: LBL1 RTS END-CODE 

( DEMO-LOOP ATARI00:38 02/05/87 ) 
: DEMO-LOOP 1 SND?-FLAG C! DEMO-TIMER UPDATE-SCORE
200 0 DO 0 DROP LOOP BEGIN SERVE WHIZ-DONE OFF 
WHIZ-COUNT OFFBEGIN 1 CYCLE# +! 
WHIZ-COUNT @ 0= IF ( NEXT-JOYS )
PLAYER1-PROCESS GOALIE1-PROCESS 
PLAYER2-PROCESS GOALIE2-PROCESS 
RANDOM-SOUNDS CHECK-PLAYER-PLAYER 
MOVE-PUCKTHEN WHIZ-COUNT
C@ IF WHIZ ELSE CHECK-FOR-GOAL 
ANIMATOR UPDATE-TIMER UPDATE-SCORE 
THEN CONSOLE-C
HECKWHIZ-DONE @ MIN-SEC-CHECK OR FB0 C@ 
FB1 C@ OR OR UNTIL MIN-SEC-CHECK FB0 C@ 
FB1 C@ OR OR UNTIL 0 SND?-FLAG C!
INIT-SOUND ; 

( DECIDE-SELECT 09:55 06/10/87 ) 
( PLAYER2 9+ = 2->ONE-PLAYER0->TWO-PLAYER ) 
( SKILL = 1->NOVICE 0->EXPERT ) 
CODE DECIDE-SELECT PLAYER2 9 + LDA 0= 
IF SKILL LDA 0= IF ( 2PLAYER/EXPERT>1PLAYER/NOVICE) 
DEY DX0 STY DY0 STY 
ELSE ( 2PLAYER/NOVICE>2PLAYER/EXPERT) 
INY DX0 STY DY0 STY THEN ELSE SKILL LDA 0
= IF ( 1PLAYER/EXPERT>2PLAYER/NOVICE) INY DY0 STY DEY DEYDX0 STY
ELSE ( 1PLAYER/NOVICE>1PLAYER/EXPERT) DEY 
DY0 STY INY INYDX0 STYTHEN THEN NEXT JMP END-CODE 

( TITLE-SELECT-BUTTON-RTN LIMITED-CONSOLE-09:20 06/10/87 ) 
: LIMITED-CONSOLE-CHECK GETRAW ?PAUSE 
IF BEGIN GETRAW ?PAUSE 0= UNTIL 
( DEBOUNCE ) WORKAREA0 C@ 0FF 
WORKAREA0 C! 0 AUDV0 C! ( AREA0 OFF) 
WORKAREA1 C@ 0FF WORKAREA1 C! 0 AUDV
1 C! ( AREA1 OFF) BEGIN GETRAW ?RESET IF -1 FB0 C!
WORKAREA1 C! WORKAREA0 C!EXIT THEN
?PAUSE UNTIL ( PAUSE ) BEGIN GETRAW ?PAUSE 0= UNTIL 
WORKAREA1 C! WORKAREA0 C! THEN ( DEBOUNCE ) ?RESET FB0 
C! ;: TITLE-SELECT-BUTTON-RTN GETRAW ?SELECT IF BEGIN 
GETRAW ?SELECT 0= UNTIL ( DEBOUNCE ) DECIDE-SELECT THEN ; 

( TITLE/DEMO-LOOP13:48 05/11/87 ) 
: TITLE-RTN USER-CHOICE DY1 C@ DY0 C@ OR ?DUP 
IF BG-FREE2 C! 
THEN DX1 C@ DX0 C@ OR ?DUP IF BG-FREE3 C! 
THEN 0BEGIN ( NEXT-JOYS )
( TITLE-SELECT-BTN AFTER N-JOYS 
SINCE MODIFIES DX0/DY0)LIMITED-CONSOLE-CHECK 
USER-CHOICE 1+TITLE-SELECT-BUTTON-RTN 
DY1 C@ DY0 C@ OR ?DUP IF BG-FREE2 C! 
THEN DX1 C@ DX0 C@ OR ?DUP IF BG-FREE3 C! THEN
DX0 C@ DY0 C@ OR DX1 C@ OR DY1 C@ OR 
IF DROP 0 THEN DUP 750 = FB0 C@ OR FB1 C@ 
OR ?RESET OR UNTIL DROP ;

( TITLE SCREEN MANAGEMENT RTNS 14:49 04/17/87 ) 
: DEMO-RTN FB0 C@ FB1 C@ OR ?RESET OR IF -1 EXIT 
THEN 0 SCORE1 ! 0 SCORE2 ! 0 SAVES1 
! 0 SAVES2 ! 2 PLAYER1 !FLAG 2 PLAYER2 
!FLAG BACKGROUND-INIT RED-CHECK 
DEMO-LOOP 0 400 0 DO 0 DROP LOOP ; 
: TITLE-INIT 7B DUP BG-SCOREAREA C! 
BG-TOP-ICE C!GNE0 18 0F DL-INITGNE17 2 4 DL-INIT 
TITLE-ETAB-ROM PLAYERS-ETAB 30 PLAYERS-ETAB-INIT ; 

CODE FIRST-TITLE FF # LDA DY0 STA 
DX0 STA BG-FREE2 STA BG-FREE3 STA 
NEXT JMP END-CODE CODE REPEAT-TITLE BG-FREE2 LD
A DY0 STA BG-FREE3 LDA DX0 STA 
NEXT JMP END-CODE

( RED-CHECK - DETERMINES RED/COMPUTER DISPLAY 12:23 04/17/87 ) 
CODE RED-CHECK PLAYER2 9 + 
LDA 0= IFBEGIN MSTAT BIT 0< UNTIL 
( THEN WAIT FOR VBLANK )VS-RED # LDA BLUE-IMAGE# STA 
7C # LDA BLUE-X STA0E # LDA BLUE-Y STA
8D # LDA BLUE-ALTER STA
' (PLAYER-FRAME-DISPLAY) >BODY JSR 
THEN NEXT JMP END-CODE 
DECIMAL

( MAIN-LOOP ATARI rev. JJT 17:08 08/27/87 ) 
: MAIN-LOOP TIMER-INITBEGIN UPDATE-SCORE 200 0 DO 0 DROP LOOP 
BEGIN WHIZ-DONE OFF WHIZ-COUNT OFF 
SERVE BEGIN CONSOLE-CHECK 1 CYCLE# +! 
WHIZ-COUNT C@ IF WHIZ ELSE PLAYER1-PROCESS GOALIE1-PROCESS 
PLAYER2-PROCESS GOALIE2-PROCESS 
CHECK-PLAYER-PLAYER MOVE-PUCK
CHECK-FOR-GOAL ANIMATOR THEN 
UPDATE-TIMER UPDATE-SCORE RANDOM-SOUNDS 
WHIZ-DONE @ MIN-SEC-CHECK OR UNTIL 
BONUS C@ ( =20H IF OVERTIME) MIN-SEC-CHECK OR 
UNTIL ?BONUSIF OVERTIME-SIGN-ON 
OVERTIME-SND 30000 0 DO LOOP BONUS-INIT
ELSE ENDGAME-SND ZAMBONI-LOOP TITLE-UP 
TIMER-INIT THENAGAIN ; 

( HOCKEY22:45 02/07/87 ) 
: FOREGRND-TASK 0 SND?-FLAG C! GRAPHICS-MODE 
INIT-SOUND TITLE-INIT FIRST-TITLE TITLE-RTN 
DEMO-RTN IF NEW-GAME ELSE TITLE-UP THEN ;

: TITLE-UP 0 SND?-FLAG C! BEGIN INIT-SOUND TITLE-INIT 
REPEAT-TITLE TITLE-RTN DEMO-RTNUNTIL NEW-GAME ; 

: HOCKEY 0 SNd?-FLAG C! INIT-SOUND 
FANFARE-SNDBEGIN GETRAW ?RESET 0= UNTIL 0 SCORE1 
! 0 SCORE2 ! 0 SAVES1 ! 0 SAVES2 ! 0 
PLAYER1 !FLAG BEGIN CONSOLE-CHECK 
WORKAREA1 C@ WORKAREA0 C@ AND 255 = UNTIL
BACKGROUND-INIT RED-CHECK 
( BEGIN-SNDS ) MAIN-LOOP ; 
' HOCKEY main-loop ! 
' TITLE-UP select-rtn ! 
( ?DIFFR IF 0 ELSE 2 THEN PLAYER2 !FLAG ) 
( ?DIFFL IF 3 ELSE 6 THEN SKILL C! 
HIGHER IS MORE STUPID)

( LAST SCREEN--END OF MC ATARI 7800 23:52 05/22/86 ) 
' FOREGRND-TASK ' ABVAR >BODY ! 
( set the constant ABVAR )
HEX ( reset bootup literals )( NMIRESET IRQ )
FFF9 HERE - ALLOT 47 C,NMI , 
( VIDEO-INT-RTN )RESET , ( ORIGIN ) 
IRQ , ( an RTI ) FF80 79 -1 FILLFORTH DEFINITIONS
LATEST INIT-FORTH !THERE  INIT-DP ! 
( X=14 SCOREBOARDA   X=110 SCOREBOARDB)   
