1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-13 11:34:04 +00:00

Spacewar! game.

Build for both standalone and timesharing.
This commit is contained in:
Lars Brinkhoff
2018-02-15 10:23:18 +01:00
committed by Eric Swenson
parent 23300c98fa
commit 4d32246eea
12 changed files with 13256 additions and 1 deletions

95
src/spcwar/340def.4 Normal file
View File

@@ -0,0 +1,95 @@
SUBTTL 340 Display Definitions
;Command Operation Codes
;----- Valid in Any Mode
GTOPRM==BIT2.9 ;this command is guarenteed to place the display
;into parameter mode regardless of the current mode
;----- Valid in Parameter and Point Commands
PARM== 0 ;next command is parameter mode
POINT== BIT2.5 ; " " " point "
VECT== BIT2.7 ; " " " vector "
VECTC== BIT2.7+BIT2.5 ; " " " vector-continue mode
CHAR== BIT2.6+BIT2.5 ; " " " character mode
INCR== BIT2.7+BIT2.6 ; " " " increment "
;----- Valid in Vector, Vector-Continue, and Increment Modes
ESCAPE==BIT2.9 ;return display to parameter mode
;Specific Bits/Values for Different Command Types
;----- Parameter Mode
DISHLT==<GTOPRM,,BIT2.2+BIT2.1> ;stop this display list
;----- Point Mode
DISPNT==BIT2.2 ;intensify the current point
;----- Vector and Vector-Continue Modes
DISVCT==BIT2.8 ;make this vector visible
NEGX== BIT1.8 ;if on, X shift is negative
NEGY== BIT2.7 ;if on, Y shift is negative
;----- Character Mode (Any Case)
CHRESC==37 ;escape from character mode
CHRUC== 35 ;shift to upper-case
CHRLC== 36 ; " " lower-case
CHRLF== 33 ;line-feed
CHRCR== 34 ;carriage-return
CHRSP== 40 ;space
;Macros to Generate Display Commands
;SCALE(VALUE)
; Function:
; Generates a parameter mode command to set the display scaling factor.
; Inputs:
; VALUE: The scaling factor as a value from 0 to 3.
DEFINE SCALE (VALUE
<BIT1.7+<VALUE&3>_4>TERMIN
;INTSTY(VALUE)
; Function:
; Generates a parameter mode display command to set the display intesity.
; Inputs:
; VALUE: The intensity as a value from 0 through 7.
DEFINE INTSTY (VALUE
<BIT1.4+<VALUE&7>>TERMIN
;SETY(VALUE)
; Function:
; Generates a point mode command to set the Y ordinate.
; Inputs:
; VALUE: The Y ordinate as a value from 0 through 1777(8).
DEFINE SETY (VALUE
<BIT2.8+<VALUE&1777'>>TERMIN
;SETX(VALUE)
; Function:
; Generates a point mode command to set the X ordinate.
; Inputs:
; VALUE: The X ordinate as a value from 0 through 1777(8).
DEFINE SETX (VALUE
<VALUE&1777'>TERMIN
;VECTOR(XVALUE,YVALUE)
; Function:
; Generates a vector or vector-continue command to create a vector.
; Inputs:
; XVALUE: The magnitude (positive) of the X shift. It is in the range 0
; through 177(8).
; YVALUE: The magnitude of the Y shift. It is treated identically to XVALUE.
DEFINE VECTOR (XVALUE,YVALUE
<<XVALUE&177'>+<<YVALUE&177'>_8.>>TERMIN

50
src/spcwar/acsdef.1 Normal file
View File

@@ -0,0 +1,50 @@
SUBTTL Accumuator Definitions
FLGS=0 ;flag word for bit testing
P=1 ;PDL pointer
MBP=2 ;PDL pointer for display buffer being filled
IDX1=3 ;index of objects currently being processed
IDX2=4
A=5 ;temporaries -- other names defined below
B=6
C=7
D=10
T1=11
T2=12
T3=13
T4=14
T5=15
DCP=16 ;display chain pointer (wired)
DLP=17 ;BLKO pointer of list being output (wired)
; Other names used for the AC's
TYP1==C ;types of objects in IDX1 and IDX2
TYP2==D
X==T1 ;X/Y coordinates built by DISPNT macro
Y==T2
PTCMND==T4 ;point command placed here by DISPNT
SDLP==T3 ;PDL pointer for building sun display
.XCREF FLGS,P,MBP,IDX1,IDX2,A,B,C,D,T1,T2,T3,T4,T5,DCP,DLP
.XREF X,Y,PTCMND,SDLP
; Accumulator names used in older code (CREF'ed to find and eliminate)
F==FLGS
T==T1
TT==T2
MP1==IDX1
MP2==IDX2
R==T3
XFLAG==T4
S==T5

89
src/spcwar/arith.1 Normal file
View File

@@ -0,0 +1,89 @@
SUBTTL Arithmentic Mode Conversion Macros
;SPCWAR uses three modes of arithmetic - integers (fixed), floating-point, and
;fractionals.
;
;Integer and floating-point numbers are the standard hardware representations.
;
;A fractional number is represented as an integer with a conceptual binary
;point (ala FIXED BINARY in PL/1). The binary point is to the left of bit
;2.9 of the value. That is, the left half of the word is the integer part,
;and the right half is the fraction.
;FLOAT AC
; Function:
; Converts an integer to a floating point value. The integer must be less than
; 27. bits.
; Inputs:
; AC: The accumulator containing the number. The result will be in placed here.
DEFINE FLOAT AC
FSC AC,233
IFDEF $PDP6, FADR AC,[0.0] ;PDP-6 FSC does not normalize.
TERMIN
;FIX AC
; Function:
; Convert a floating point number (positive or negative) to an integer.
; Inputs:
; AC: The accumulator containing the floating value.
; Outputs:
; AC+1: The result is placed in this accumulator. The contents of AC are lost.
DEFINE FIX AC
MULI AC,400
TSC AC,AC
ASH AC+1,-200-35.(AC)
TERMIN
;FIXP AC
; Function:
; This macro is identical to FIX. The only difference is that the value too convert
; must be positive.
DEFINE FIXP AC
MULI AC,400
ASH AC+1,-200-35.(AC)
TERMIN
;FRACT AC
; Function:
; Convert a floating-point number to a fractional value. The input may have any sign.
; The calling sequence and results are identical to FIX above.
DEFINE FRACT AC
MULI AC,400
TSC AC,AC
ASH AC+1,-200-17.(AC)
TERMIN
;FRACTP AC
; Function:
; This macro is identical to FRACT above, but the input must be positive.
DEFINE FRACTP AC
MULI AC,400
ASH AC+1,-200,-17.(AC)
TERMIN
;FRCSCL AC,SCALE
; Function:
; Convert a floating-point number to a fractional value with an arbitrary binary point.
; Inputs:
; AC: See FIX above.
; SCALE: The result will have SCALE bits of fraction in its representation.
; Outputs:
; See FIX above.
DEFINE FRCSCL AC,SCALE
MULI AC,400
TSC AC,AC
ASH AC+1,-200-35.+SCALE(AC)
TERMIN

101
src/spcwar/frgmts.10 Normal file
View File

@@ -0,0 +1,101 @@
SUBTTL Ship Fragments Defintion
;Macros
;ICBYTE VALUE
; Function:
; Internal macro used to generate a fragment display list.
DEFINE ICBYTE VALUE
%%BYTS==%%BYTS+1
%%WORD==%%WORD+<VALUE&17'>_<16.-4*%%BYTS>
IFE %%BYTS-4,{
%%WORD+%%DISP
%%WORD==0 ? %%BYTS==0
}
TERMIN
;FRAGMENT [MOVES]
; Function:
; Generate the display list for a fragment. The form of the frgament is determined
; by the list MOVES. A display-list pointer for the list is left in the FRGMTS
; array. The first worf of the list is a parameter mode command (RH) to set the
; intensity and scale; the second word is a command to set the location of the
; fragment (Y in LH, X in RH).
; Inputs:
; MOVES: Controls the appearence of this fragment. It is composed of a sequence
; of symbols which are interpreted as follows:
; ON: Make points visible
; OFF: Make points invisible
; U: Move up one point
; UR: Move up and to the right one point
; R: Move right one point
; DR: Move down and right one point
; D: Move down one point
; DL: Move down and left one point
; L: Move left one point
; UL: Move up and left one point
DEFINE FRAGMENT MOVES
IF1, $FRGMTS==$FRGMTS+1
%FRLOC==.
%%DISP==0
%%WORD==0
%%BYTS==0
.BYTE 18.
GTOPRM
SCALE(0)+INTSTY(0)+POINT
SETY(0)+POINT
SETX(0)+INCR
IRPS MOVE,,[MOVES]
IFSE [MOVE][ON] %%DISP==200000
IFSE [MOVE][OFF] %%DISP==0
IFSE [MOVE][U] ICBYTE 02'
IFSE [MOVE][UR] ICBYTE 12'
IFSE [MOVE][R] ICBYTE 10'
IFSE [MOVE][DR] ICBYTE 13'
IFSE [MOVE][D] ICBYTE 03'
IFSE [MOVE][DL] ICBYTE 17'
IFSE [MOVE][L] ICBYTE 14'
IFSE [MOVE][UL] ICBYTE 16'
TERMIN
IFN %%BYTS, %%WORD
ESCAPE
.WALGN
.BYTE
%FRLTH==.-%FRLOC
%%.==.
IF2,{
LOC FRGMTS+%FRGMTS
-%FRLTH,,%FRLOC-1
LOC %%.
%FRGMTS==%FRGMTS+1
}
TERMIN
IF1,{
$FRGMTS==0 ;have yet to define any fragments
%FRGMTS==0
}
;Definition of The Fragments
FRAGMENT [U,U,U,U,ON DR,DR,DR,DR
DL,DL,DL,DL UL,UL,UL,UL
UR,UR,UR,UR]
;Fragment Defintions Tables
FRGMTS: BLOCK $FRGMTS ;contains display pointers for fragments

4013
src/spcwar/newwar.164 Normal file

File diff suppressed because it is too large Load Diff

BIN
src/spcwar/setmac.12 Normal file

Binary file not shown.

3991
src/spcwar/spcwar.163 Normal file

File diff suppressed because it is too large Load Diff

3996
src/spcwar/spcwar.164 Normal file

File diff suppressed because it is too large Load Diff

897
src/spcwar/tvwar.20 Normal file
View File

@@ -0,0 +1,897 @@
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