1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-08 01:11:18 +00:00
Files
PDP-10.its/src/spcwar/tvwar.20
Lars Brinkhoff 4d32246eea Spacewar! game.
Build for both standalone and timesharing.
2018-02-19 08:21:59 -08:00

897 lines
16 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE SWR--SPACE WAR FOR TVS
A=1 ;SUN BEING CONSIDERED
N=2 ;SHIP BEING CONSIDERED
X=3 ;POSITION
XT=4
Y=5
YT=6
T1=10 ;TEMPORARIES
T2=11
TT=12
T3=13
T4=14
T5=15
D=16
SP=17 ;STACK POINTER
IN=1 ;INPUT CHANNEL
TYO=3 ;OUTPUT CHANNEL
TVBFR=24000 ;TOP OF TV
NDIREC==100
INCH==2 ;INPUT CHNL FOR DISK
MAXSHP==3
MAXSUN==2
TORP==1
MAXOBJ==600
LOC 42
JSR TSINT ;OLD-STYLE INTERRUPT HANDLER IN THIS LOCATION.
LOC 100
ST: .OPEN IN,OPNIN ;TTY INPUT, NO-WAIT MODE
.VALUE
.OPEN TYO,OPNOUT ;TTY OUTPUT, 3 LINE ECHO AREA
.VALUE
.CALL TVSCRN ;TV BUFFER MAP
.VALUE
.CALL INSHIP ;OPEN THE DISK AND READ IN THE SHIP PATTERNS
.VALUE [ASCIZ/:NO SHIP FILES/]
.IOT INCH,PNTR
.CLOSE INCH,
.CALL INSINE ;OPEN THE DISK AND READ IN THE SINE WAVE
.VALUE [ASCIZ/:NO SINE WAVE FILE/]
.IOT INCH,PNTR1
.CLOSE INCH,
.RTIME TT, ;INITIALIZE THE RANDOM NUMBER
MOVEM TT,RANNUM
MOVE TT,TVBFR+20000 ;GET TV ALU
MOVEM TT,TVALU
RESTRT: MOVE TT,TVALU
MOVEM TT,TVBFR+20000 ;RESTORE TV ALU TO ORIGINAL
HRRZI TT,442.*18.-1 ;CLEAR THE SCREEN
SETZM TVBFR(TT)
SOJG TT,.-1
HRLZI TT,22000 ;TV SCREEN INTO XOR MODE
XORM TT,TVBFR+20000
NEWGAM: MOVEI SP,STACK
SETZM OBJLEN
SKIPG N,NSHIP
JRST NOSHPS
RANL: SETZM SWITCH-1(N)
SKIPN RANPOS
JRST NORAN
PUSHJ SP,RAND
MOVE X,TT
PUSHJ SP,RAND
MOVE Y,TT
PUSHJ SP,RAND
MOVE XT,TT
PUSHJ SP,RAND
MOVE YT,TT
ANDI X,77777
ANDI Y,77777
ASH XT,-34
ASH YT,-34
PUSHJ SP,BORDER
PUSHJ SP,RAND
ANDI TT,777
JRST RANSTR
NORAN: MOVE X,IPX-1(N)
MOVE Y,IPY-1(N)
MOVE XT,IVX-1(N)
MOVE YT,IVY-1(N)
SETZ TT,
RANSTR: MOVEM TT,DIRECT-1(N)
MOVEM X,PX-1(N)
MOVEM Y,PY-1(N)
MOVEM XT,VX-1(N)
MOVEM YT,VY-1(N)
SOJG N,RANL
NOSHPS: SKIPN A,NSUN ;PUT SUN(S) ON THE SCREEN
JRST PUTS
INITSN: SKIPN RANSUN
JRST NORANS
PUSHJ SP,RAND
MOVE X,TT
PUSHJ SP,RAND
MOVE Y,TT
ANDI X,77777
ANDI Y,77777
MOVEI XT,1000
MOVEI YT,1000
PUSHJ SP,BORDER
JRST RSNSTR
NORANS: MOVE X,IGRVX-1(A)
MOVE Y,IGRVY-1(A)
RSNSTR: MOVEM X,GRVX-1(A)
MOVEM Y,GRVY-1(A)
PUSHJ SP,PUTSUN
SOJG A,INITSN
PUTS: SKIPG N,NSHIP ;PUT SHIPS ON THE SCREEN
JRST SETINT
PUTLP: PUSHJ SP,PUTSHP
SETOM SHPSTS-1(N)
SOJG N,PUTLP
SKIPG N,NSHIP
JRST SETINT
SKIPE TALLY-1(N)
JRST REHANG
SOJG N,.-2
SETINT: SKIPE TEST ;SHOULD REALTIME BE SET UP?
JRST TSINT+2
HRLZI TT,710000 ;SET THE REALTIME INTERRUPT
HRRI TT,TIME
.SUSET [.SMASK,,INTMSK] ;INTERRUPT FOR REALTIME
.REALT TT,
.VALUE [ASCIZ/:.REALT FAILED TO SKIP.VP /]
JRST RHJFCL
REHANG: SKIPE TEST ;IN REALTIME MODE?
JRST TSTSLP
.DISMISS TSINT+1
.VALUE [ASCIZ/:GACK! THESE OLD TIME INTERRUPTS ARE WIERD!/]
RHJFCL: JFCL
.HANG
INTMSK: %PIRLT
TSINT: 0 ;PC, ETC. GO HERE
0
PUSHJ SP,CRASH ;CHECK FOR COLLISIONS
PUSHJ SP,SMACK
PUSHJ SP,HIT
PUSHJ SP,DFND
SOS SHOTTM
SOS SHOTTM+1
PUSHJ SP,SCORE
MOVE N,NSHIP
LOOP: SKIPGE SHPSTS-1(N)
JRST LOPOK
SKIPG SHPSTS-1(N)
JRST LOPEND
SOS SHPSTS-1(N)
JRST LOPDED
LOPOK: PUSHJ SP,REPOS ;DO ANOTHER TIME INCREMENT
PUSHJ SP,CLRSHP
PUSHJ SP,VELPOS
PUSHJ SP,PUTSHP
LOPEND: SOJG N,LOOP
PUSHJ SP,DISOBL
SKIPE TEST ;IN REALTIME MODE?
JRST TSTSLP
.DISMISS TSINT+1
.VALUE [ASCIZ/:GACK! THESE OLD TIME INTERRUPTS ARE WIERD!/]
TSTSLP: MOVE TT,TIME ;NOT IN REALTIME, SO JUST SLEEP ON IT
.SLEEP TT,
JRST TSINT+2
LOPDED: PUSHJ SP,REPOS
PUSHJ SP,VELPOS
MOVE TT,SHPSTS-1(N)
TRNN TT,1
JRST PUTDWN
JRST PUTUP
PUTDWN: PUSHJ SP,CLRSHP
JRST LOPEND
PUTUP: PUSHJ SP,PUTSHP
JRST LOPEND
SCORE: SKIPG N,NSHIP
JRST SCRL
SCRLP: MOVE TT,SHPSTS-1(N)
CAIE TT,1
JRST SCRNXT
SKIPG TT,NSHIP
JRST SCRNXT
SKIPGE SHPSTS-1(TT)
AOS TALLY-1(TT)
SOJG TT,.-2
SCRNXT: SOJG N,SCRLP
SCRL: SKIPG N,NSHIP
JRST SCRXIT
SETO TT,
SCRXL: SKIPE SHPSTS-1(N)
AOJG TT,SCROK
SOJG N,SCRXL
SCRXIT: POP SP,
.IOT TYO,[15]
.IOT TYO,[12]
.IOT TYO,[12]
SKIPG N,NSHIP
JRST SCRXIT
SCRPL: .IOT TYO,[40]
.IOT TYO,[40]
MOVE T1,TALLY-1(N)
PUSHJ SP,PRNUM
SOJG N,SCRPL
MOVE TT,SCRTIM
.SLEEP TT,
MOVE TT,TVALU
MOVEM TT,TVBFR+20000 ;RESTORE TV ALU TO ORIGINAL
HRRZI TT,407.*18.-1 ;CLEAR THE SCREEN
SETZM TVBFR(TT)
SOJG TT,.-1
HRLZI TT,22000 ;TV SCREEN INTO XOR MODE
XORM TT,TVBFR+20000
JRST NEWGAM
SCROK: POPJ SP,
DISOBL: SETZ T2, ;DISPLAY THE TORPS
SKIPN OBJLEN
POPJ SP,
MOVE X,OBJCL(T2)
CAIE X,TORP
JRST NOTRP
SOSL X,OBJCL+5(T2)
JRST NOTRP
MOVE X,OBJCL+1(T2)
MOVE Y,OBJCL+2(T2)
PUSHJ SP,DISPLY
PUSHJ SP,DELTRP
JRST DISOLP
NOTRP: ADDI X,1
CAML X,TRPLIF
JRST DIS1
MOVE X,OBJCL+1(T2)
MOVE Y,OBJCL+2(T2)
PUSHJ SP,DISPLY
DIS1: MOVE X,OBJCL+1(T2) ;ADD TORP VELOCITY TO POSITION
MOVE Y,OBJCL+2(T2)
MOVE XT,OBJCL+3(T2)
MOVE YT,OBJCL+4(T2)
ADD X,XT
ADD Y,YT
PUSHJ SP,BORDER ;CHECK FOR WRAP OR BOUNCE
MOVEM X,OBJCL+1(T2) ;MAKE THE NEW POSITION AND VELOCITY PERMANENT
MOVEM Y,OBJCL+2(T2)
MOVEM XT,OBJCL+3(T2)
MOVEM YT,OBJCL+4(T2)
PUSHJ SP,DISPLY
ADDI T2,6
DISOLP: CAMGE T2,OBJLEN ;FINISHED WITH THE TORPS YET?
JRST DISOBL+1
POPJ SP,
DELTRP: HRLI TT,OBJCL+6(T2) ;DELETE TORP(T2) FROM THE OBJCL LIST
HRRI TT,OBJCL(T2)
BLT TT,MAXOBJ+OBJCL-7
MOVE TT,OBJLEN
SUBI TT,6
MOVEM TT,OBJLEN
POPJ SP,
DISPLY: LSH X,-6 ;PUT A 2X2 POINT AT X,Y (USUALLY A TORP)
LSH Y,-6
IMULI Y,18.
IDIVI X,32.
ADD Y,X
MOVNS XT
HRLZI T4,600000
LSH T4,(XT)
TRZN T4,17
JRST .+4
HRLZI T5,400000
MOVEM T5,TVBFR+1(Y)
MOVEM T5,TVBFR+19.(Y)
MOVEM T4,TVBFR(Y)
MOVEM T4,TVBFR+18.(Y)
POPJ SP,
MKTRP1: SETZ T1, ;GENERATE A TORPEDO AND ENTER IT ON THE OBJCL LIST
SKIPLE SHOTTM
POPJ SP,
MOVE TT,RLDTIM
MOVEM TT,SHOTTM
JRST MKALL
MKTRP2: HRRZI T1,1
SKIPLE SHOTTM+1
POPJ SP,
MOVE TT,RLDTIM
MOVEM TT,SHOTTM+1
MKALL: SKIPL SHPSTS(T1)
POPJ SP,
MOVE TT,OBJLEN
CAIL TT,MAXOBJ
POPJ SP,
MOVE TT,DIRECT(T1)
PUSHJ SP,DXDY
MOVNS Y
MOVE XT,X
MOVE YT,Y
IMUL XT,TRPVEL
IMUL YT,TRPVEL
IMUL X,XPLODR
IMUL Y,XPLODR
ASH X,-7
ASH Y,-7
ASH XT,-3
ASH YT,-3
SUB X,XT
SUB Y,YT
ADD X,PX(T1)
ADD Y,PY(T1)
ADD XT,VX(T1)
ADD YT,VY(T1)
MOVEI T5,TORP
MOVE T2,OBJLEN
MOVEM T5,OBJCL(T2)
MOVEM X,OBJCL+1(T2)
MOVEM Y,OBJCL+2(T2)
MOVEM XT,OBJCL+3(T2)
MOVEM YT,OBJCL+4(T2)
MOVE YT,TRPLIF
MOVEM YT,OBJCL+5(T2)
ADDI T2,6
MOVEM T2,OBJLEN
POPJ SP,
CRASH: SKIPG N,NSHIP ;CRASH=SHIP-TO-SUN COLLISION
POPJ SP,
CRSHP: SKIPL SHPSTS-1(N)
JRST NOSUN
SKIPG A,NSUN
POPJ SP,
CRSHPL: MOVE X,PX-1(N)
SUB X,GRVX-1(A)
MOVMS X
CAML X,SUNRAD
JRST CRNXT
MOVE Y,PY-1(N)
SUB Y,GRVY-1(A)
MOVMS Y
CAML Y,SUNRAD
JRST CRNXT
MOVE XT,XPLDTM
ADDM XT,SHPSTS-1(N)
SKIPA
CRNXT: SOJG A,CRSHPL
NOSUN: SOJG N,CRSHP
POPJ SP,
SMACK: SKIPG N,NSHIP ;SMACK=SHIP-TO-SHIP COLLISION
POPJ SP,
SMK: SKIPN SHPSTS-1(N) ;IF THE SHIP FLIES OR DIES, ITS VALID
JRST SMKNXT
MOVE A,N
SOJLE A,SMACK+1 ;IF THERE AREN'T TWO SHIPS, THEY CAN'T HIT
SMKRPT: SKIPN SHPSTS-1(A)
JRST SMKLP
MOVE XT,PX-1(N) ;SEE IF THEY REALLY HIT
SUB XT,PX-1(A)
MOVMS XT
CAML XT,XPLODR
JRST SMKLP
MOVE YT,PY-1(N)
SUB YT,PY-1(A)
MOVMS YT
CAML YT,XPLODR
JRST SMKLP
MOVE XT,VX-1(N) ;AVERAGE THE TWO VELOCITIES
MOVE X,VX-1(A)
ASH XT,-1
ASH X,-1
SKIPGE SHPSTS-1(A)
ADDM XT,VX-1(A)
SKIPGE SHPSTS-1(N)
ADDM X,VX-1(N)
MOVE YT,VY-1(N)
MOVE Y,VY-1(A)
ASH YT,-1
ASH Y,-1
SKIPGE SHPSTS-1(A)
ADDM YT,VY-1(A)
SKIPGE SHPSTS-1(N)
ADDM Y,VY-1(N)
SKIPGE SHPSTS-1(N) ;MAKE THEM DISAPPEAR
PUSHJ SP,CLRSHP
EXCH A,N
SKIPGE SHPSTS-1(N)
PUSHJ SP,CLRSHP
EXCH A,N
MOVE XT,XPLDTM ;THEY HIT, SO MAKE THEM EXPLODE
SKIPGE SHPSTS-1(N) ;BUT ONLY IF THEY AREN'T ALREADY
MOVEM XT,SHPSTS-1(N)
SKIPGE SHPSTS-1(A)
MOVEM XT,SHPSTS-1(A)
SMKLP: SOJG A,SMKRPT
SMKNXT: SOJG N,SMK
POPJ SP,
HIT: SETZ T2, ;HIT=TORP-TO-SHIP COLLISION
CAML T2,OBJLEN
POPJ SP,
SKIPG N,NSHIP
POPJ SP,
HITSHL: SKIPN SHPSTS-1(N)
JRST HITNXT
MOVE X,PX-1(N)
SUB X,OBJCL+1(T2)
MOVMS X
CAML X,XPLODR
JRST HITNXT
MOVE Y,PY-1(N)
SUB Y,OBJCL+2(T2)
MOVMS Y
CAML Y,XPLODR
JRST HITNXT
MOVE XT,XPLDTM
ADDM XT,SHPSTS-1(N)
MOVE X,OBJCL+3(T2)
ASH X,-2
ADD X,VX-1(N)
MOVE Y,OBJCL+4(T2)
ASH Y,-2
ADD Y,VY-1(N)
MOVEM X,VX-1(N)
MOVEM Y,VY-1(N)
MOVE X,OBJCL+1(T2)
MOVE Y,OBJCL+2(T2)
PUSHJ SP,DISPLY
PUSHJ SP,DELTRP
SKIPA
HITNXT: SOJG N,HITSHL
ADDI T2,6
JRST HIT+1
DFND: SETZ T1, ;DFND=TORP-TO-TORP COLLISION
MOVE T2,T1
DFNDL: ADDI T2,6
CAML T2,OBJLEN
JRST DFNDXT
MOVE X,OBJCL+1(T1)
SUB X,OBJCL+1(T2)
MOVMS X
CAML X,XPLODR
JRST DFNDL
MOVE Y,OBJCL+2(T1)
SUB Y,OBJCL+2(T2)
MOVMS Y
CAML Y,XPLODR
JRST DFNDL
MOVE X,OBJCL+3(T1)
ADD X,OBJCL+3(T2)
ASH X,-1
MOVEM X,OBJCL+3(T1)
MOVE Y,OBJCL+4(T1)
ADD Y,OBJCL+4(T2)
ASH Y,-1
MOVEM Y,OBJCL+4(T1)
SETZM OBJCL+5(T1)
MOVE X,OBJCL+1(T2)
MOVE Y,OBJCL+2(T2)
PUSHJ SP,DISPLY
PUSHJ SP,DELTRP
JRST DFNDL
DFNDXT: ADDI T1,6
CAML T1,OBJLEN
POPJ SP,
JRST DFNDL-1
REPOS: SKIPN A,NSUN ;CALCULATE ACCELERATION ON SHIP#N
POPJ SP, ;NO SUNS TO CHANGE VELOCITY
RPSLP: MOVE X,PX-1(N)
MOVE Y,PY-1(N)
SUB X,GRVX-1(A)
SUB Y,GRVY-1(A)
MOVE XT,X
MOVE YT,Y
IMUL XT,XT
IMUL YT,YT
MOVE T1,XT
ADD T1,YT
MOVE D,T1
PUSHJ SP,ISQRT
MOVE TT,GRAV
IMUL TT,GRVK-1(A)
IDIV T1,TT
HRLZ X,X
HRLZ Y,Y
IDIV X,T1
IDIV Y,T1
LSH D,-2
IDIV X,D
IDIV Y,D
SUB X,VX-1(N)
SUB Y,VY-1(N)
MOVNM X,VX-1(N)
MOVNM Y,VY-1(N)
MOVMS X
MOVMS Y
CAML X,MAXVEL
SETZM VX-1(N)
CAML Y,MAXVEL
SETZM VY-1(N)
SOJG A,RPSLP
POPJ SP,
VELPOS: .IOT IN,TT ;INPUT ANY COMMANDS
CAIN TT,":
PUSHJ SP,MKTRP1
CAIN TT,"
PUSHJ SP,MKTRP2
CAIN TT,"[
MOVEM TT,SWITCH
CAIN TT,"]
MOVEM TT,SWITCH
CAIN TT,"\
MOVEM TT,SWITCH
CAIN TT,"/
MOVEM TT,SWITCH
CAIN TT,"Z
MOVEM TT,SWITCH+1
CAIN TT,"X
MOVEM TT,SWITCH+1
CAIN TT,"C
MOVEM TT,SWITCH+1
CAIN TT,"V
MOVEM TT,SWITCH+1
MOVE TT,SWITCH-1(N)
MOVE T1,DIRECT-1(N)
CAIE N,1 ;PERFORM THE LAST COMMAND OF SHIP #N
JRST VLPS2
CAIN TT,"[
ADD T1,SHPSPN
CAIN TT,"]
SUB T1,SHPSPN
CAIN TT,"\
PUSHJ SP,SPEED
JRST VLPALL
VLPS2: CAIN TT,"Z
ADD T1,SHPSPN
CAIN TT,"X
SUB T1,SHPSPN
CAIN TT,"C
PUSHJ SP,SPEED
VLPALL: ANDI T1,777 ;DIRECTION IS A 9 BIT NUMBER
MOVEM T1,DIRECT-1(N)
MOVE X,PX-1(N) ;REPOSITION AND CHECK FOR WRAP OR BOUNCE
MOVE Y,PY-1(N)
ADD X,VX-1(N)
ADD Y,VY-1(N)
MOVE XT,VX-1(N)
MOVE YT,VY-1(N)
PUSHJ SP,BORDER
STASH: MOVEM X,PX-1(N) ;MAKE IT PERMANENT
MOVEM Y,PY-1(N)
MOVEM XT,VX-1(N)
MOVEM YT,VY-1(N)
POPJ SP,
BORDER:
CHKXL: CAML X,LEFTF ;CHECK FOR WRAP OR BOUNCE
JRST CHKXR
SKIPE BOUNCE
JRST .+3
ADD X,WIDE
JRST CHKXL
MOVMS XT
JUMPG XT,.+2
ADDI XT,1
ADD X,XT
CHKXLP: ADD X,XT
CAMGE X,LEFTF
JRST CHKXLP
CHKXR: CAMG X,RITEF
JRST CHKYT
SKIPE BOUNCE
JRST .+3
SUB X,WIDE
JRST CHKXR
MOVMS XT
JUMPG XT,.+2
ADDI XT,1
MOVNS XT
ADD X,XT
CHKXRP: ADD X,XT
CAMLE X,RITEF
JRST CHKXRP
CHKYT: CAML Y,TOPF
JRST CHKYB
SKIPE BOUNCE
JRST .+3
ADD Y,HIGH
JRST CHKYT
MOVMS YT
JUMPG YT,.+2
ADDI YT,1
ADD Y,YT
CHKYTP: ADD Y,YT
CAMGE Y,TOPF
JRST CHKYTP
CHKYB: CAMG Y,BTMF
POPJ SP,
SKIPE BOUNCE
JRST .+3
SUB Y,HIGH
JRST CHKYB
MOVMS YT
JUMPG YT,.+2
ADDI YT,1
MOVNS YT
ADD Y,YT
CHKYBP: ADD Y,YT
CAMLE Y,BTMF
JRST CHKYBP
POPJ SP,
SPEED: MOVE TT,DIRECT-1(N) ;CALCULATE SHIP'S ACCELERATION DUE TO ENGINES
PUSHJ SP,DXDY
IMUL X,SHPACC
IMUL Y,SHPACC
LSH X,-12
LSH Y,-12
MOVNS Y
HRRES X
HRRES Y
ADDM X,VX-1(N)
ADDM Y,VY-1(N)
POPJ SP,
ISQRT: HRRZI T4,30 ;INTEGER SQUARE-ROOT SUBR., T1 TO T1
MOVE T2,T1
MOVE T3,T1
MOVE T1,10000
ISQRTL: IDIV T2,T1
ADD T1,T2
LSH T1,-1
MOVE T2,T3
SOJG T4,ISQRTL
POPJ SP,
DXDY: MOVE T5,TT ;SINE AND COSINE LOOKUP
ANDI T5,777 ;TT CONTAINS ANGLE, 9 BIT = FULL CIRCLE
MOVE Y,SIN(T5)
ADDI T5,200
ANDI T5,777
MOVE X,SIN(T5)
POPJ SP,
RANMSK: 401020003045
RANNUM: 0
RAND: MOVE TT,RANNUM ;GENERATE RANDOM #,USING FEEDBACK S-R
AND TT,RANMSK
SETZ T1,
JUMPGE TT,.+2
SETCA T1,
LSH TT,1
JUMPN TT,.-3
ANDI T1,1
MOVE TT,RANNUM
LSH TT,1
IOR TT,T1
MOVEM TT,RANNUM
POPJ SP,
PRNUM: MOVEI T3,4
PRLP: IDIVI T1,10.
PUSH SP,T2
SOJG T3,PRLP
MOVEI T3,4
PRL: POP SP,T1
.IOT TYO,[40]
JUMPN T1,PRN
SOJG T3,PRL
PRN: ADDI T1,60
.IOT TYO,T1
POP SP,T1
SOJG T3,PRN
JRST (T1)
PUTSUN: LSH X,-6 ;DISPLAY A SUN AT X,Y
LSH Y,-6
IMULI Y,18.
ADDI X,16.
IDIVI X,32.
ADD Y,X
MOVNS XT
MOVEI T1,31.
ADDI Y,16.*18.
PUTLOP: MOVE T3,SUN(T1)
SETZ T4,
LSHC T3,(XT)
LSH T3,4
MOVEM T3,TVBFR-1(Y)
MOVEM T4,TVBFR(Y)
SUBI Y,18.
SOJGE T1,PUTLOP
POPJ SP,
CLRSHP: MOVE T3,N ;DISPLAY SHIP IN CLRS BUFFER (ERASES TOO)
SUBI T3,1
IMULI T3,70.
MOVE T1,CLRS(T3)
SUBI T1,1
MOVEI T4,32.
CLRLP: SKIPE T2,CLRS+1(T3)
MOVEM T2,TVBFR(T1)
SKIPE T2,CLRS+2(T3)
MOVEM T2,TVBFR+1(T1)
ADDI T3,2
ADDI T1,18.
SOJG T4,CLRLP
POPJ SP,
PUTSHP: MOVE T3,N ;REGENERATE A CLRS FIELD
SUBI T3,1
MOVE T4,T3
IMULI T3,70.
IMULI T4,NDIREC*10
ADD T4,DIRECT-1(N)
LSH T4,-3
IMULI T4,32.
SETZM CLRS+1(T3)
HRRZI TT,CLRS+2(T3)
HRLI TT,CLRS+1(T3)
BLT TT,CLRS+64.(T3)
MOVE T1,PX-1(N)
LSH T1,-6
ADDI T1,16.
IDIVI T1,32.
MOVNS T2
MOVE TT,PY-1(N)
LSH TT,-6
SUBI TT,16.
IMULI TT,18.
ADD T1,TT
MOVEM T1,CLRS(T3)
MOVEI TT,32.
PUTSLP: SETZ XT,
MOVE X,SHPBFR(T4)
LSHC X,-4(T2)
LSH X,4
MOVEM X,CLRS+1(T3)
MOVEM XT,CLRS+2(T3)
ADDI T3,2
ADDI T4,1
SOJG TT,PUTSLP
JRST CLRSHP
TIME: 4 ;REPEAT FRAME TIME (60THS), OR DELAY TIME
2 ;WHEN REALTIME IS SUPPRESSED
0
0
TEST: -1 ;TEST-MODE SWITCH, SUPPRESSES REALTIME
OPNIN: 1044,,646471 ;TTY INPUT NO-WAIT ECHO AREA
OPNOUT: 15,,646471 ;TTY OUTPUT, 3 LINE ECHO AREA
PNTR: -32.*MAXSHP*NDIREC,,SHPBFR ;DISK INPUT OF SHIPS POINTER
INSHIP: SETZ ;DISK OPEN INFO FOR SHIPS PATERNS
SIXBIT /OPEN/
[6,,INCH]
[SIXBIT /DSK/]
[SIXBIT /SWR/]
[SIXBIT /SHIPS/]
SETZ [SIXBIT /GJD/]
PNTR1: -512.,,SIN
INSINE: SETZ ;DISK OPEN INFO FOR SINE WAVE
SIXBIT /OPEN/
[6,,INCH]
[SIXBIT /DSK/]
[SIXBIT /SINE/]
[SIXBIT /BINARY/]
SETZ [SIXBIT /GJD/]
TVALU: 0 ;TV ALU BEFORE CHANGING IT
TVSCRN: SETZ ;TV MAPPING INFO
SIXBIT /CORBLK/
1000,,600000
1000,,-1
TMP
1000,,-2
SETZ TMP2
TMP: -11,,TVBFR/2000 ;8.K TV MEM, START AT PAGE 12 IN PDP10
TMP2: 0
IPX: 40000 ;SHIP STARTING POSITIONS
50000
50000
IPY: 30000
40000
30000
IVX: 300 ;SHIP STARTING VELOCITIES
0
200
IVY: 0
250
100
PX: BLOCK MAXSHP ;SHIP DATA DURING A GAME
PY: BLOCK MAXSHP
VX: BLOCK MAXSHP
VY: BLOCK MAXSHP
DIRECT: BLOCK MAXSHP
IGRVX: 40000 ;SUN STARTING LOCATIONS
20000
IGRVY: 40000
40000
GRVX: BLOCK MAXSUN ;SUN GAME LOCATIONS
GRVY: BLOCK MAXSUN
GRVK: 2 ;SUN RELATIVE MASSES
1
GRAV: 100 ;GRAVITY CONSTANT
LEFTF: 4000 ;FRINGE POSITIONS, FOR WRAP & BOUNCE
RITEF: 72000
TOPF: 4000
BTMF: 60000
WIDE: 66000 ;THE UNIVERSE'S DIMENSIONS
HIGH: 54000
BOUNCE: 0 ;-1=BOUNCE, 0=WRAP
RANPOS: -1 ;RANDOM SHIP POSITIONING
RANSUN: -1 ;RANDOM SUN POSITIONING
NSUN: 1 ;NUMBER OF SUNS IN THIS GAME
NSHIP: 2 ;NUMBER OF SHIPS STARTING THIS GAME
SHPACC: 40 ;SHIP ACCELERATION WHEN ENGINES ARE ON
SHPSPN: 20 ;RATE OF SPIN WHEN TURNING
XPLODR: 1400 ;PROXIMITY FUSE FOR TORPS
XPLDTM: 30 ;EXPLOSION TIME
SUNRAD: 1400 ;PROXIMITY RADIUS FOR SUNS
TRPVEL: 20 ;TORPEDO VELOCITY
TRPLIF: 50 ;TORPEDO LIFETIME BEFORE AUTO-DETINATION
RLDTIM: 4 ;TORPEDO RELOAD TIME IN FRAMES
SCRTIM: 20 ;SCORE DISPLAY TIME AT END OF GAME IN 30ths
MAXVEL: 2000 ;MAXIMUM VELOCITY OF THE SHIPS
SWITCH: BLOCK MAXSHP ;SHIP COMMAND STORAGE
SHPSTS: BLOCK MAXSHP ;0=SHIP NOT ACTIVE, >0=SHIP EXPLODING, -1=SHIP ALIVE
SHOTTM: BLOCK MAXSHP ;TORPEDO RELOAD TIME
TALLY: BLOCK MAXSHP
CLRS: BLOCK MAXSHP*2*40. ;STORAGE BUFFER FOR EACH SHIP ON THE TV
RADIX 2
SUN: 000000000000000000000000000000000000 ;A TYPICAL SUN
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000001000010000000000000000
000000000000001000100000000000000000
000000000000100101000111000000000000
000000000000010110111000000000000000
000000000000001111000000000000000000
000000000000001110110000000000000000
000000000000111010001000000000000000
000000000011010001000000000000000000
000000000000100000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
000000000000000000000000000000000000
RADIX 1000
SIN: BLOCK 512. ;SINEWAVE TABLE, 512. ENTRIES, TO +/-255.
STACK: BLOCK 20 ;STACK AREA, OBVIOUSLY
OBJLEN: 0 ;OBJCL POINTER
OBJCL: BLOCK MAXOBJ ;STORAGE AREA FOR TORPEDOS
SHPBFR: BLOCK 32.*MAXSHP*NDIREC
EOM1: SIXBIT/EOM1/ ;A KLUDGE
;THEN COMES THE TV AREA STARTING AT PAGE 12
END ST