; Extracted from the SAILDART page-dump (SAILDART [SW,BGB]) by stripping the ; per-line record markers, leaving the MACRO-10 / SAIL source as listed. ; Upstream: saildart.org. Provenance: see README in this folder. ; TITLE SW SPACE WAR PROGRAM FOR STANFORD A.I. PROJECT SUBTTL DEFINITIONS COMMENT/ REVISED SEPTEMBER 5,1971 R.E. GORIN FEB 1972 R TAYLOR THIS PROGRAM IS BASED UPON A TRADITIONAL PROGRAM WRITTEN FOR THE PDP-1. ANY RESEMBLENCE TO OTHER PROGRAMS, LIVING OR DEAD, IS PURELY COINCIDENTAL / IFDEF FOR,MACRO==1 ;SELECT ASSEMBLER IFE MACRO,< DEFINE DEF(A,B)< A_B> DEFINE SDEF(A,B)< A__B> > IFG MACRO,< DEFINE DEF(A,B)< A=B> DEFINE SDEF(A,B)< A==B> > DEF(F,0) DEF(A,1) DEF(B,2) DEF(C,3) DEF(D,4) DEF(W,5) DEF(X,6) DEF(Y,7) DEF(SHIP,10) DEF(R11,11) DEF(R12,12) DEF(BFP,13) DEF(R14,14) DEF(R15,15) DEF(R16,16) DEF(P,17) SDEF(VBRT,4000) ;LVW BRIGHTNESS FIELD SDEF(VSIZ,1000) ;LVW SIZE FIELD SDEF(VABS,100) ;LVW ABSOLUTE FIELD SDEF(VENDP,20) ;LVW ENDPOINT FIELD SDEF(VINVIS,40) ;LVW INVISIBLE FIELD ; SWITCHES SDEF(FAST,1) ;SET FOR FAST ACTION SDEF(HYPERS,0) ;SET FOR HYPERSSPACE SDEF(NHYP,1) ;SET FOR NEW HYPERSPACE IFG NHYP,< SDEF(HYPERS,0) ;CAN'T HAVE BOTH> SDEF(NMINE,4) ;SET TO THE MAXIMUM NUMBER OF MINES SDEF(NSHIP,5) ;SET FOR NUMBER OF SHIPS SDEF(PARM,1) ;FOR RUN TIME PARAMETER MODIFICATION SDEF(TEAMS,1) ;ON FOR TEAM SCORING IFL NSHIP-4,< SDEF(TEAMS,0) > ;TEAM SCORE ONLY FOR 4 SHIPS SDEF(GALAX,1) ;SET TO SHOW GALAXY'S SCORE ; PARAMETERS SDEF(PDLEN,10) ;PUSHDOWN LENGTH SDEF(NTORPM,40) ;MAXIMUM NUMBER OF TORPEDOES/PLAYER SDEF(LTBL,NSHIP*22) ;TORPEDO TABLE LENGTH ;SEE COMMENT BELOW SDEF(NSTAR,144) ;NUMBER OF STARS TO PUT OUT DEFINE LVW(X,Y,TYPE,MODE,BRT,SIZ)< IFIDN ,SDEF(MD,0) IFIDN ,SDEF(TT,0) IFIDN <>,SDEF(BQ,BRT) IFIDN <>,SDEF(SQ,SIZ) BYTE(11),(3)BQ,SQ(2)MD,TT(4)6 > COMMENT/ A LONG VECTOR WORD (LVW) FOR THE III DISPLAY HAS THE FOLLOWING FORMAT BITS 0-10 X COORDINATE BITS 11-21 Y COORDINATE BITS 22-24 BRT BRIGHTNESS. 0=NO CHANGE, 1-7 INCREASING BRIGHTNESS BITS 25-27 SIZ SIZE. 0=NO CHANGE, 1-7 INCREASING BRIGHTNESS BIT 29 M MODE. 0=RELATIVE TO LAST, 1=ABSOLUTE FROM CENTER BITS 30-31 T TYPE. 0=VISIBLE, 1=ENDPOINT, 2=INVISIBLE BITS 32-35 6. DENOTES LVW IN DISPLAY PROCESSOR / ; OPDEFS OPDEF UPGIOT [703B8] ;DISPLAY A PIECE OF GLASS OPDEF SPCWAR [CALLI 400000] ;READ SW BUTTONS OPDEF SPCWGO [CALLI 400003] ;INITIATE A SPACE WAR MODULE OPDEF EIOTM [CALLI 400005] ;ENTER IOT USER MODE OPDEF LIOTM [CALLI 400006] ;LEAVE IOT USER MODE OPDEF DISMIS [CALLI 400024] ;DISMISS SW MODULE OPDEF RESET [CALLI 0] ;IO AND SW RESET OPDEF SLEEP [CALLI 31] ;SLEEP UUO OPDEF CORE [CALLI 11] ;CORE UUO OPDEF EXIT [CALLI 12] ;STOP MY JOB OPDEF TTCALL [51B8] ;TELETYPE IO COMMENT/ SPCWGO: SET AC = XWD BITS,,ADR ADR IS THE ADDRESS OF THE SW MODULE BITS IS: BIT 0 = RUN THIS ON THE PDP-10 BIT 1 = RUN THIS ON THE PDP-6 BITS 14-17 = NUMBER OF TICKS BETWEEN STARTUPS UPGIOT: AC = PIECE OF GLASS NUMBER. ADDRESS IS FOR A TWO WORD BLOCK WORD0: ADDRESS OF DPY PROGRAM WORD1: LENGTH OF DPY PROGRAM PROGRAM IS RUN ON THE PIECE OF GLASS NAMED / COMMENT $ REGARDING THE SPACE ALLOWED FOR CERTAIN THINGS: 1. THE NUMBER OF TORPEDOES THAT A SHIP CAN HAVE ACTIVE IS BOUNDED BY 2+2*[TLIFE/TRELOD]. 2. ASSUMING THAT TLIFE 200 AND TRELOD 20 THEN EACH SHIP CAN HAVE < 18. TORPEDOES ACTIVE. 3. THEREFORE, LTBL = 18 * NSHIP 4. EACH SHIP MUST BE 150 (OCTAL) POINTS, INCLUDING FLAME 5. MINES ARE USUALLY 2 DPY WORDS. IN CASE OF EXPLOSION, THEY ARE 10. WORDS. 6. THE MAIN BUFFER LENGTH, THEREFORE IS GIVEN BY THE EXPRESSION: 1+12*NMINE+150*NSHIP+LTBL $ DEF(BUFLEN,1+12*NMINE+150*NSHIP+LTBL) EXTERN JOBREL,JOBFF,JOBDDT SUBTTL ONCE-ONLY INITIALIZATION STRT: RESET ;RESET SPACEWAR MOVEI 1,DISTAB DAC 1,137 ;SAVE POINTER TO DATA LAC P,PDP ;GET A PDL PUSHJ P,SETP ;SET ALL THE PARAMETERS TTCALL 3,[BYTE(7)14,14,14,15] ;CLEAR SCREEN SETO A, ;SET FOR THIS JOB'S LINE TTCALL 6,A ;GET OUR LINE NUMBER CAR A,A ;WIPE OUT ALL BUT THE NUMBER CAIG A,25 ;SKIP IF NOT A III CAIGE A,20 ;SKIP IF A DPY EXIT ;THIS FOOL'S NOT AT A III SUBI A,20 ;NORMALIZE TRO A,100 ;TURN ON A BIT DAC A,LINE ;SAVE AS OUR LINE NUMBER LAC A,TRELOD ;GET THE RELOAD TIME LSH A,-1 ;HALVE IT SKIPN TUBES ;SKIP IF WE HAVE TWO TUBES DAC A,LATNCY ;SAVE AS LATENCY TIME MOVEI SHIP,0 ;FOR ALL SHIPS MOVEI BFP,CNTTBL ;ADDRESS OF COUNT TABLE PUSH BFP,GLOC ;POINTER TO GALAXY COUNT LOCATOR PUSH BFP,[+1] ;GALAXY SCORE STRT0: PUSH BFP,COUNTP(SHIP) ;LVW TO POSITION COUNT PUSH BFP,[+1] ;INITIAL TEXT DZM ZOWSW(SHIP) ;SET INITIALLY TO NEUTRAL DZM NUMWN(SHIP) ;AND NO WINS CAMGE SHIP,NSHIPX ;DONE ENOUGH? AOJA SHIP,STRT0 ;NO: LOOP MOVSI R11,-200 ;CREATE -COS,,SIN TABLE SETZB SHIP,GALAXY ;SIN/COS FOR 0 TO 2, 200(OCTAL) STEPS STRT1: LAC A,SHIP ;GET THE ARGUMENT PUSHJ P,COS ;GET THE COSINE FIX A,200000 ;CONVERT TO INTEGER MOVNM A,TAB(R11) ;SAVE IN THE TABLE LAC A,SHIP ;GET THE SAME ARGUMENT PUSHJ P,SIN ;GET THE SINE FIX A,200000 ;FIX IT HLRM A,TAB(R11) ;SAVE IT FAD SHIP,[0.049087] ;2/128 AOBJN R11,STRT1 ;LOOP FOR MORE MOVSI A,1000 ;THIS HACK FIXES THE ONE ENTRY DAC A,TAB+100 ;IN THE TABLE THAT LOSES OTHERWISE SETOM QRSTRT ;SET TO INITIALIZE A GAME SKIPE TENSW ;DO WE USE THE 10 ONLY? GO PDP10G ;YES. INITIATE SW MODULE SKIPE DEBUG ;ARE WE DEBUGGING GO SW6GO ;YES: DON'T START SPACE WAR MODULE SETOM SIXSW ;CORE CELL FOR PDP6 STATUS LAC A,[XWD 400000,ONETIK] ;ONE TICK TO DISCOVER PDP6 STATE SPCWGO A, ;RUN IN PDP-10 SW MODE FOR ONE TICK. SKIPGE SIXSW ;WAIT FOR SW TICK TO HAPPEN GO .-1 ;KEEP WAITING SKIPE SIXSW ;OK. IS PDP-6 ALIVE? GO PDP10G ;NO: RUN EVERYTHING ON THE PDP-10 LAC A,[XWD 200003,SW6GO] ;THREE TICK SERVICE ON THE PDP-6 SPCWGO A, ;REQUEST SERVICE LAC A,[XWD 400002,SW10GO] ;TWO TICK SERVICE ON THE PDP-10 GO PDP10H ;REQUEST USUAL SERVICE ON PDP-10 PDP10G: SETOM TENSW ;FLAG TO SAY USE THE 10 ONLY LAC A,[XWD 400003,SW6GO] ;RUN EVERYTHING FROM PDP10 PDP10H: SPCWGO A, ;SET UP MODULE IFE PARM,< MOVEI A,2 ;GO INTO A SLEEP LOOP SLEEP A, ;SNOOZE GO .-2 ;AND SNOOZE MORE > IFG PARM,< DZM LPARM ;ZERO LAST PARM CELL PARMS: LAC P,UPDL ;LOAD USER MODE PDL PUSHJ P,RPARM ;READ PARAMETERS GO PARMS ;LOOP > ONETIK: MOVMM 5,SIXSW ;0 OK, 1 PDP6 SICK DISMIS ;DISMIS THE SW JOB. SETP: SKIPE CLOBR ;HAS HI CORE BEEN CLOBBERED? POPJ P, ;YES. CAN'T CHANGE ANYTHING GO SETALL ;NO. WE CAN SET ALL THE STUFF SUBTTL THE PDP-10 SPACE WAR MODULE SW10GO: SKIPN SIXDON ;SKIP IF PDP-6 IS READY GO NORUN1 ;NOT READY. DON'T RUN THIS MODULE. DZM SIXDON ;ZERO PDP-6 FLAG SKIPN DDSW GO SW10G1 ;DON'T READ KEYBOARD SKIPE DEBUG ;ARE WE AT USER MODE EIOTM ;YES, ENTER IOT USER MODE DATAO 310,LINE ;SELECT KEYBOARD NUMBER DATAI 310,A ;READ THE BITS FROM HIS LINE TRC A,1700 DAC A,BITS SKIPE DEBUG ;IF DEBUGGING THEN LEAVE IOT MODE LIOTM ;LEAVE IOT MODE SW10G1: GO 3,@[.+1] ;JUMP AND SET USER SKIPN STARFG ;ARE THE STARS OUT YET? GO SW10ST ;STARS DONE ALREADY SOSGE A,CDOWN ;ARE WE DONE WITH COUNT DOWN? GO ST.NOW ;YES. TIME TO SHOW THE STARS LSH A,-2 ;DIVIDE BY 8 IORI A,141 ;MAKE INTO A DIGIT WITH LSB DAC A,CTIM ;SAVE IT LAC A,SELWRD DAC A,CTIM1 UPGIOT 10,CTIME ;DISPLAY UPGIOT 11,CTIME GO SW10ST ;SKIP DISPLAY OF STARS ST.NOW: UPGIOT 10,STADR ;TIME TO DRAW THEM. DZM STARFG ;TELL PDP-6 THAT STARS ARE OUT SW10ST: AOSN SHIPFG ;MUST WE DRAW THE SHIPS? UPGIOT 11,BPTRX ;YUP AOSN CNTFG ;TIME TO SHOW NEW COUNTS? UPGIOT 12,CNTPNT ;DISPLAY THEM SW10DN: SETOM TENDON ;SET TO INDICATE THE TEN HAS FINISHED. NORUN1: SKIPN TENSW SKIPE DEBUG ;ARE WE DEBUGGING? CPOPJ: POPJ P, ;YES RETURN. DISMIS ;NO DEBUGGING: DISMISS SW SUBTTL CREATE STARS AND WON COUNTS STARS: LAC A,RCONST ;INITIALIZE RANDOM NUMBERS LAC D,RANDX ;LOAD OLD RANDOM THING MOVEI W,NSTAR-1 ;NUMBER OF STARS TO MAKE SL1: ADD D,A ;MAKE A RANDOM NUMBER LAC C,A ;SAVE IT IN C ADD A,D ;MAKE ANOTHER RANDOM NUMBER PUSHJ P,PLT1 ;CONVERT C TO LVW COORDINATES IORI C,526 ;TURN ON END POINT AND LVW BITS SIZ=1 DPB A,[POINT 3,C,24] ;DEPOSIT A RANDOM BRIGHTNESS DAC C,STARBF(W) ;STUFF THIS IN THE STAR TABLE SOJGE W,SL1 ;BACK UNTIL THE TABLE IS FULL DAC A,RANDX ;SAVE UPDATED NUMBER FOR NEXT TIME SETOM STARFG ;SEND OUT STARS MOVEI A,60 DAC A,CDOWN LAC A,NSHIPX ;FOR ALL SHIPS, SKIPN ZOWSW(A) ;DID HE LOSE? SOJGE A,.-1 ;LOOK FOR ONE LOSER JUMPL A,CNT4 ;NO LOSERS LAC A,NSHIPX ;COMPUTE SCORES AT RESTART LAC B,SURBEN ;SURVIVORS BENEFIT CNT3: SKIPN ZOWSW(A) ;SKIP IF THIS GUY LOST ADDM B,NUMWN(A) ;WINNER, INCREASE HIS SCORE. SOJGE A,CNT3 ;LOOP CNT4: LAC B,NSHIPX ;UPDATE ALL SCORES CNT5: LAC C,NUMWN(B) ;LOAD A SCORE SKIPN DOTEAM ;REALLY DOING TEAMS? GO CNT5A ;NOPE ADD C,NUMWN-1(B) ;GET THE OTHER GUY'S SCORE SUBI B,1 ;DECREMENT B AN EXTRA TIME CNT5A: LAC W,B LSH W,1 ADD W,[POINT 7,CNTTBL+4] ;ADD IN THE BYTE POINTER PUSHJ P,DECDPX ;WRITE SCORES SOJGE B,CNT5 ;LOOP CNT6: LAC C,GALAXY ;GET OVERHEAD COUNT LAC W,[POINT 7,CNTTBL+2] ;TEXT POINTER PUSHJ P,DECDPX ;COUNT GALATIC OVERHEAD LAC B,NSHIPX ;COMPUTE LENGTH OF COUNT TABLE LSH B,1 ADDI B,5 SKIPN GSCORE SUBI B,2 ;NO GALATIC SCORE DAC B,CNTPNT+1 ;SAVE AS LENGTH TO DISPLAY MOVEI B,CNTTBL ;GET TABLE ADDRESS SKIPN GSCORE ADDI B,2 ;POINT PAST GALAXY SCORE DAC B,CNTPNT ;SET POINTER SKIPE CNTR ;SKIP IF NO COUNTS SETOM CNTFG ;ANNOUNCE THAT COUNTS ARE THERE POPJ P, ;RETURN TO GAME DECDPX: MOVEI D,1 ;SET TEXT BIT DAC D,(W) ;IN THE WORD JUMPGE C,DECDPB ;GO PRINT MOVEI D,"-" ;IF THIS IS EVER NEEDED IDPB D,W ;WE'LL HAVE IT MOVM C,C ;GET ABS C DECDPB: IDIVI C,12 ;ROUTINE USED TO DISPLAY THE HRLM D,(P) ;WIN COUNTS JUMPE C,.+2 ;THIS SAVES DIGITS ON THE STACK PUSHJ P,DECDPB ;BY WIPING THE FLAGS CDR D,(P) ;WHICH IS FASTER THAN PUSHIMG ADDI D,"0" ;THIS DEPOSITS TEXT USING IDPB D,W ;W. ASSUMES LESS THAN 5 CHARACTERS POPJ P, ;IN DECIMAL EXPANSION SUBTTL INITIALIZE THE NEXT MATCH GAME: PUSHJ P,STARS ;MAKE THE STARS COME OUT SETZB A,GOBEG ;ZERO STUFF FOR NEW PLAY LAC B,[XWD GOBEG,GOBEG+1] ;LOAD A BLT POINTER BLT B,GOEND ;ZERO THROUGH HERE SETOM MINSTR ;MAKE THE MINES GET MADE LAC SHIP,NSHIPX ;FOR EVERY SHIP,... GAME1: PUSHJ P,GAME2 ;INITIALIZE A SHIP SOJGE SHIP,GAME1 ;LOOP POPJ P, ;RETURN GAME2: LAC B,NTORPS ;GET TORPEDO COUNT LAC C,NSHIPX ;RESET EVERYONE'S TORP COUNT DAC B,TPCN(C) ;SET TORPEDO COUNT SOJGE C,.-1 ;LOOP SKIPN RSPSWT ;DO WE WANT RANDOM START GO STDPSS ;NO USE STANDARD LAC C,RCONST LAC D,C ADDB C,RANDX ;GET A RANDOM NUMBER ADDB D,RANDX ;ANOTHER ONE ANDI D,177 ;A DIRECTION MOVSM D,SRA(SHIP) ;SHIP ROTATION ROT C,-12 ;WANT MORE RANDOMNESS HERE TSC C,C ;AND YET MORE ADD C,D ;AND STILL MORE ANDI C,177 ;GET A DIRECTION LAC C,TAB(C) ;GET MULTIPLIER IMULI C,240 ;LAC THE GUY DAC C,SP(SHIP) ;SAVE SHIP POS GO PUTSTF ;GO DO REST STDPSS: LAC C,IROT(SHIP) ;GET INITIAL ORIENTATION MOVSM C,SRA(SHIP) ;SAVE LAC C,IPOS(SHIP) ;GET INITIAL POSITION DAC C,SP(SHIP) ;SAVE SHIP POSITION PUTSTF: HLRE D,C ;GET -2Y INTO D HRRE C,C ;2X IN C FSC C,223 ;FLOAT POSITIONS FSC D,223 ;FLOAT POSITIONS DAC C,SX(SHIP) ;SAVE X POSITION MOVNM D,SY(SHIP) ;SAVE --Y POSITION LAC C,ALLBIT(SHIP) ANDCAM C,DMASK ;INITIALIZE DAMAGE MASK DZM ZOWSW(SHIP) ;SHIP NOT EXPLODED DZM HYPER(SHIP) ;NOT IN HYPER SPACE DZM TCNT0(SHIP) ;TUBE 0 READY NOW DZM TCNT1(SHIP) ;TUBE 1 READY NOW DZM UTUBE(SHIP) ;TUBE 0 UP NEXT DZM SV(SHIP) ;NO VELOCITY DZM SVX(SHIP) ;... DZM SVY(SHIP) ;... DZM ZORCHP(SHIP) ;ZORCH IS UNBEGUN DZM HYPCNT(SHIP) ;RESET HYPERSPACE COUNT POPJ P, ;RETURN SUBTTL THE PDP-6 SPACE WAR MODULE SW6GO: LAC P,PDP ;GET A PDL SKIPE DEBUG SPCWAR A, ;READ BUTTONS IF NOT SPACEWAR TRC A,2 ;AS OF 27 JAN 73, THIS BIT IS INVERTED (BECAUSE OF A N.O. SWITCH). DAC A,SWBUT ;SAVE SW BUTTON SKIPN TENSW SKIPE DEBUG ;ARE WE ON THE PDP-10 PUSHJ P,SW10GO ;YES: FAKE THE 10 SW MODULE LAC B,TENDON ;IS PDP-10 READY? JUMPE B,NORUN2 ;NOT YET. HOLD THIS UP DZM TENDON ;CLEAR PDP-10 FLAG LAC A,SWBUT ;GET BUTTONS INTO A SKIPN DDSW GO SW6GO1 LSH A,14 ;SHIFT SW BITS 8 PLACES CAR B,BITS ;GET LINE BITS TRZ B,770000 ;SHUT OFF SPURIOUS BITS IOR A,B ;OR THE BUTTON BITS WITH SW BITS SW6GO1: AOSN QRSTRT ;TEST THE RESTART FLAG PUSHJ P,GAME ;TIME FOR A NEW GAME SKIPN STARFG ;ARE THE STARS OUT YET GO SWG1 ;YES, ALL OK NORUN2: SETOM SIXDON ;TELL PDP-10 WE ARE READY SKIPE DEBUG ;ARE WE DEBUGGING? GO SW6GO ;YES: WE'LL SOON FORCE THE STARS DISMIS ;NO. INTERLOCK WITH PDP-10 ;UNTIL HE FINISHES WITH STABLE SWG1: LAC SHIP,NSHIPX ;SHUT OFF BITS FROM ANYONE ZAPPED SWG1.1: IFN NHYP,< ;COMPILE FOR NEW HYPER SPACE SKIPLE HYPER(SHIP) ;IF IN NEW HYPERSPACE TDZ A,ALLBIT(SHIP) ;ZERO ALL HIS BITS > SKIPN ZOWSW(SHIP) ;EXPLODED? GO SWG1.2 ;NOT EXPLODED TDZ A,ALLBIT(SHIP) ;ZERO HIS BITS AOSE RESTAR(SHIP) ;INCREMENT HIS RESTART DELAY GO SWG1.2 ;NOT READY TO RESTART SKIPL QRSTRT ;SET TO RESTART GAME? PUSHJ P,GAME2 ;NO: RESTART THIS PLAYER SWG1.2: SOJGE SHIP,SWG1.1 ;LOOP PUSHJ P,JS ;GO DOWN AND INTERPRET THE BUTTONS MOVEI BFP,BUF-1 ;INITIALIZE BUFFER DEPOSIT POINTER PUSH BFP,ZERO ;START THE BUFFER WITH A ZERO LAC SHIP,NSHIPX ;FOR ALL SHIPS DO: SWG2: IFN HYPERS,< ;IF HYPER SPACE IS AVAILABLE LAC W,HYPEN ;RELOAD PENALTY FOR HYPERSPACE LAC X,UTUBE(SHIP) ;GET HIS NEXT TUBE NUMBER SOSN HYPER(SHIP) ;DECREASE HYPER COUNT DAC W,@RDELAY(X) ;PENALIZE HIS RELOAD DELAY > IFN NHYP,< SOSLE B,HYPER(SHIP) ;DECREMENT HYPERTIME GO SWG2.1 ;STILL IN HYPERSPACE JUMPL B,SWG2.0 ;NOT IN HYPERSPACE AT ALL MOVEI B,4 ;EXPLOSION CODE SKIPL HYPCNT(SHIP) ;SKIP IF EXPLODE IN HYPER-SPACE GO SWG2.0 ;OK THIS GUY LIVES STILL DAC B,ZOWSW(SHIP) ;POOF! PUSHJ P,QRST0 ;SET UP A RESTART > SWG2.0: SOS TCNT0(SHIP) ;DEC SHIP n TUBE 0 DELAY SOS TCNT1(SHIP) ;DEC SHIP n TUBE 1 DELAY LAC F,SRX(SHIP) ;GET ROTATIONAL INCREMENT FIX F,211000 ;FIX ON THE 10 ADDB F,SRA(SHIP) ;UPDATE SHIP ORIENTATION TLZ F,777600 ;ZERO ALL BUT INDEX BITS HLRZM F,SR(SHIP) ;SAVE ORIENTATION INDEX PUSHJ P,STCOL ;COMPUTE POSSIBLE COLLISIONS PUSHJ P,GRAV ;COMPUTE GRAVITATIONAL INFLUENCE SWG2.1: SOJGE SHIP,SWG2 ;FOR SHIP=1 AND SHIP=0 PUSHJ P,MINE ;DO ALL MINE CALCULATIONS LAC SHIP,NSHIPX ;THE NEXT SECTION FOR SHIP = 1, 0 SWG3: LAC R16,SP(SHIP) ;GET THE SHIP POSITION LAC R15,SR(SHIP) ;GET THE SHIP ORIENTATION INDEX LAC W,TAB(R15) ;GET THE CORRESPONDING COS-SIN IMUL W,SPTAB(SHIP) ;MULTIPLY BY MAJIC NUMBER ADD R16,W ;ADD IT IN DAC R16,STEMP(SHIP) ;SAVE THE NOSE OF SHIP POSITION LAC R14,SPICT(SHIP) ;GET ADDRESS OF PICTURE PUSHJ P,XDRAW ;DRAW THE SHIP TDNE A,TPBIT(SHIP) ;IS HE FIRING TORPEDOES? PUSHJ P,CTORP ;TRY TO LAUNCH A TORPEDO SKIPG HYPER(SHIP) ;NO FLAME FROM HYPER SPACE SKIPN STX(SHIP) ;ANY THRUST GO SWG4 ;NO FLAME LAC R15,SR(SHIP) ;GET THE SHIP ORIENTATION LAC R15,TAB(R15) ;GET THE COS-SIN TABLE ENTRY LAC R16,SP(SHIP) ;GET THE BASIC POSITION IMUL R15,TFTAB(SHIP) ;MULTIPLY BY MAJIC NUMBER SUB R16,R15 ;SUBTRACT FROM THE BASIC POSITION LAC R15,SR(SHIP) ;GET ORIENTATION LAC W,RAND ;GET RANDOM NUMBER ROT W,1 ;ROTATE IT DAC W,RAND ;REPLACE THIS IN CORE TLO W,777760 ;TURN ON BITS: MAKE A RANDOM LENGTH HRRI W,100 ;SET ORIENTATION=100, DOWN MOVEI R14,W ;R14 POINTS TO W MOVEI X,0 ;W+1 IS ZERO TERMINATES LIST PUSHJ P,DRAW ;DRAW THE FLAME SWG4: SOJGE SHIP,SWG3 ;DO ALL THAT FOR SHIP=1 AND 0 ZAC W, ;UPDATE TORPEDOES. SWG5: CAML W,TPNT ;ARE WE STILL IN TABLE? GO SWG6 ;NOPE: ALL DONE SKIPG TL(W) GO Z6 ;TORP EXPIRED SOS Y,TL(W) ;DECREMENT TORP LIFE TRNN Y,-1 ;SKIP IF TIME >0 GO Z6 ;THIS TORPEDO HAS EXPIRED LAC X,TP(W) ;GET THE POSITION ADD X,TV(W) ;ADD THE VELOCITY LAC C,X ;SAVE NEW POSTION IN C PUSHJ P,PLT1 ;FOR CALL ON PLT1 IORI C,11126 ;LVW WITH ENDPOINT,SIZ=BRT=2 CAIGE Y,10 ;IS THIS ABOUT TO EXPIRE? IORI C,37400 ;YES: TURN ON BRIGHT AND BIG SIZE PUSH BFP,C ;SAVE THIS IN THE DPY BUFFER EXCH X,TP(W) ;SWAP NEW-OLD POSITION XOR X,TP(W) ;XOR NEW AND OLD TDNN X,[XWD 400000,400000] ;IF THESE BITS SET THEN SKIP AOJA W,SWG5 ;LOOK AT NEXT TORP LAC F,TV(W) ;POSSIBLE WRAP OVER. GET VELOCITY XOR F,TP(W) ;XOR WITH NEW POSITION AND X,F ;AND WITH THE XOR OF OLD-NEW TDNE X,[XWD 400000,400000] ;IF THESE ARE STILL SET PUSHJ P,TCOL ;THEN WE HAVE WRAPPED. CHECK TCOL AOJA W,SWG5 ;LOOK FOR MORE Z6: SOS X,TPNT ;TORP HAS EXPIRED CAML W,X ;THIS THE LAST IN TABLE? GO SWG6 ;YES: OUT OF THE LOOP LAC Y,TP(X) ;GET LAST FROM TABLE DAC Y,TP(W) ;USE IT TO WIPE THIS ONE LAC Y,TV(X) ;... DAC Y,TV(W) ;... LAC Y,TL(X) ;... DAC Y,TL(W) ;... LAC Y,TVX(X) ;... DAC Y,TVX(W) ;... LAC Y,TVY(X) ;... DAC Y,TVY(W) ;... GO SWG5 ;LOOK FOR MORE. DONT CHANGE W. SWG6: HLRZM BFP,BPTRX+1 ;STORE NUMBER OF WORDS TO DISPLAY SETOM SHIPFG ;TELL PDP-10 WE HAVE A DISPLAY READY SETOM SIXDON SKIPN DEBUG ;ARE WE USING DDT? DISMIS ;NOPE: DISMISS THIS SW MODULE ZAC B, ;GO TO SLEEP FOR A WHILE SLEEP B, ;SLEEP 1 TICK GO SW6GO ;A GO TO WORK AGAIN SUBTTL THE MINE CALCULATIONS IFE NMINE,< MINE: POPJ P, ;NO MINES > IFG NMINE,< MINE: LAC SHIP,NMINEX ;ALL THE CALCULATIONS FOR THE MINES ADDI SHIP,NSHIP-1 ;ADD TO INDEX THE MINE TABLES LAC R15,BFP ;SAVE BFP TO LEARN IF ANY ARE ALIVE MINE1: CAIG SHIP,NSHIP-1 ;ARE WE DONE YET? GO MINE6 ;YES. TO EXIT STUFF SKIPN C,SP(SHIP) ;GET MINE POSITION SOJA SHIP,MINE1 ;MINE IS DEAD HLRE B,C ;GET MINE -2Y HRRE C,C ;GET MINE 2X MOVEI R12,1 ;1 = TORPS, 0 = MINES LAC R11,TPNT ;GET TORPEDO COUNT GO MINE3 ;CHECK MINE-TORPEDO COLISION MINE2: MOVEI R11,-1(SHIP) ;GET INDEX OF THIS MINE SUBI R11,NSHIP-1 ;LOOK AT MINE- LOWER MINES MINE3: SOJL R11,MINE4 ;ALL DONE WITH THESE OBJECTS HLRE W,@STTB2(R12) ;GET OBJECT POSITION -2Y HRRE X,@STTB2(R12) ;GET OBJECT POSITION +2X SUB W,B ;GET DY SUB X,C ;GET DX FSC W,223 ;FLOAT DIFFERENCE FSC X,223 ;FLOAT FMP W,W ;SQUARE FMP X,X ;SQUARE FAD W,X ;GET R^2 CAMLE W,MTCOLR ;COMPARE TO COLISION RADIUS GO MINE3 ;OK. LOOK FOR MORE DZM @STTB3(R12) ;ZERO A MINE OR TORP LIFE LAC C,SP(SHIP) ;GET MINE POSITION DZM SP(SHIP) ;MINE IS NOW GONE AWAY GO MINE5 ;MAKE IT FLASH MINE4: SOJE R12,MINE2 ;LOOK FOR MINE-MINE COLISIONS PUSHJ P,GRAV ;COMPUTE GRAVITY FOR MINE SKIPN C,SP(SHIP) ;GET POSITION GO MINE5 ;THIS IS A LOSER PUSHJ P,PLT1 ;MAKE IT A VECTOR SUB C,[BYTE(11)20,14] ;CENTER IT IORI C,6+VINVIS+VABS+VSIZ+4*VBRT ;INVIS, ABS, SIZE 1, BRT 4 PUSH BFP,C ;SEND OUT VECTOR PUSH BFP,[+1] ;SEND TEXT SOJA SHIP,MINE1 ;NEXT MINE MINE5: PUSHJ P,FLASH0 ;MAKE A FLASH SOJA SHIP,MINE1 ;LOOP MINE6: CAME R15,BFP ;ANY TEXT DONE THIS TIME? POPJ P, ;YES. RETURN SKIPGE MINSTR ;MINE RESTART SET? GO MINE7 ;YES: COUNT IT DOWN LAC R11,RSTARD ;GET RESTART DELAY MOVNM R11,MINSTR ;SET IT POPJ P, ;RETURN MINE7: AOSE MINSTR ;INCREMENT AND TEST IT POPJ P, ;RETURN ;FALL INTO MINE LAYING LAYMIN: LAC R12,RANDX ;LAY THE MINES LAC W,NMINEX ;GET THE NUMBER OF MINES TO MAKE LAY1: SOJL W,CPOPJ ;DECREMENT COUNT. RETURN WHEN DONE ADD R12,RCONST ;LOAD THE RANDOM BASE DAC R12,RANDX ;GET A RANDOM NUMBER DAC R12,MINEP(W) ;SAVE AS THE MINE POSITION HRRE X,R12 ;GET 2X HLRE Y,R12 ;GET -2Y FSC X,223 ;FLOAT X FSC Y,223 ;FLOAT Y DAC X,MINEX(W) ;SAVE X POSITION MOVNM Y,MINEY(W) ;SAVE Y POSITION MOVN Y,Y ;GET +Y POSITION LAC D,X ;GET X FMP D,D ;X^2 LAC B,Y ;GET Y FMP B,B ;Y^2 FADB B,D ;R^2 PUSHJ P,SQRT ;GET R FMP B,D ;B _ R^3 LAC C,GG ;GRAV CONSTANT FDVM C,B ;B _ GG/R^3 PUSHJ P,SQRT ;GET SQRT(GG/R^3) LAC C,B ;SQRT(GG/R) IN C AND B FMP C,X ;Y VELOCITY FMP B,Y ;X VELOCITY MOVNM C,MINEVY(W) ;SAVE -Y VELOCITY DAC B,MINEVX(W) ;SAVE +X VELOCITY FIX B,223000 FIX C,223000 HRL B,C ;GET Y VELOCITY INTO B DAC B,MINEV(W) ;SAVE THE MINE VELOCITY (FIXED POINT) TRNE R12,1000 ;TEST A RANDOM BIT GO LAY1 ;KEEP THIS VELOCITY SENSE MOVNS MINEV(W) ;NEGATE SENSE OF VELOCITIES MOVNS MINEVX(W) ;NEGATE SENSE OF VELOCITIES MOVNS MINEVY(W) ;NEGATE SENSE OF VELOCITIES GO LAY1 ;LOOP > SUBTTL LAUNCH A TORPEDO CTORP: LAC W,TPNT ;GET COUNT OF ACTIVE TORPS LAC X,UTUBE(SHIP) ;GET THE TUBE NUMBER FOR THIS CAMGE W,TTBMAX ;IS THERE ROOM IN THE TABLE? SKIPL @RDELAY(X) ;YES: CHECK RELOAD DELAY POPJ P, ;TABLE FULL OR NOT RELOADED SOSLE W,TPCN(SHIP) ;DECREMENT TORPEDO COUNT GO TRLD ;LAUNCH IT LAC W,NSHIPX ;CHECK ALL OTHER SHIPS SKIPLE TPCN(W) ;ANY TORPS LEFT FOR THIS? POPJ P, ;SOMEBODY HAS TORPEDOES SOJGE W,.-2 ;LOOK FOR SOMEONE WITH TORPS LAC X,RSTARD ;USE RSTARD AS GAME RESET DELAY MOVNM X,QRSTRT ;ALL EMPTY: SET TO RESTART POPJ P, ;RETURN TRLD: LAC W,TRELOD ;GET THE RELOAD TIME DAC W,@RDELAY(X) ;RESET DELAY ON THIS TUBE TRC X,1 ;SET UP THE OTHER TUBE NUMBER DAC X,UTUBE(SHIP) ;USE OTHER TUBE NEXT TIME LAC W,LATNCY ;LOAD THE LATENCY PERIOD CAML W,@RDELAY(X) ;SKIP IF EXISTING DELAY > LATENCY DAC W,@RDELAY(X) ;USE LATENCY AS MINIMUM LAC W,SR(SHIP) ;GET THE SHIP ORIENTATION HLRE X,TAB(W) ;GET THE COSINE MUL X,ITV ;MULTIPLY BY TORP VELOCITY HRRE W,TAB(W) ;GET THE SINE MUL W,ITV ;Y COMPONENT OF VELOCITY HLR Y,X ;RELATIVE VELOCITY OF TORP ADD Y,SV(SHIP) ;PLUS SHIP VELOCITY LAC W,TPNT ;GET NUMBER OF TORPS DAC Y,TV(W) ;SAVE THE ABSOLUTE TORP VELOCITY LAC X,STEMP(SHIP) ;GET THE SHIP NOSE POINT DAC X,TP(W) ;SAVE AS THE INITIAL TORP POSIT. LAC X,TLIFE ;GET THE LIFE HRL X,SHIP DAC X,TL(W) ;SHIP NUMBER,,LIFE TIME AOS TPNT ;COUNT A NEW TORPEDO TCOL: LAC X,TPNT ;DOES TORP EVER COLLIDE WITH ANOTHER? HRRE B,TV(W) ;ACTIVE TORPS IN X. GET THIS VELOCITY FSC B,223 ;FLOAT THIS NUMBER DAC B,TVX(W) ;SAVE X COMPONENT OF T. VELOCITY HLRE C,TV(W) ;GET -2Y VELOCITY FSC C,223 ;MAKE IT FLOAT DAC C,TVY(W) ;SAVE Y COMPONENT OF VELOCITY HRRE R11,TP(W) ;GET 2X POSITION FSC R11,223 ;FLOAT IT HLRE R12,TP(W) ;GET -2Y POSITION FSC R12,223 ;FLOAT IT HRLO R16,TL(W) ; TL,,-1 IN R16 TCL1: SOJL X,TCBASH ;LOOK AT NEXT TORPEDO IN TABLE CAMN W,X ;IS THIS US? GO TCL1 ;YES: SKIP THE CALCULATION HRRE B,TP(X) ;GET THE 2X POSITION FSC B,223 ;FLOAT IT FSBM R11,B ;GET DELTA X IN B HLRE C,TP(X) ;GET -2Y POSITION FSC C,223 ;FLOAT IT FSB C,R12 ;FORM DELTA Y IN C LAC Y,TVX(W) ;Y _ VX1-VX2 FSB Y,TVX(X) ;... MOVN R15,TVY(W) ;R15 _ VY1-VY2 FAD R15,TVY(X) ;... LAC D,B ;D _"B" =2((X1-X2)(VX1-VX2)+(Y1-Y2)(VY1-VY2)) FMP D,Y LAC F,C FMP F,R15 FAD D,F FMP B,B ;B _ "C" = (X1-X2)^2 + (Y1-Y2)^2 - R^2 FMP C,C FAD B,C FSB B,TR2 JUMPLE B,TBAM ;IMMEDIATE DISINTEGRATION OF TORPS FMP Y,Y ;Y _ "A" = (VX1-VX2)^2 + (VY1-VY2)^2 FMP R15,R15 FAD Y,R15 JUMPE Y,TCL1 FMP B,Y ;B = "B"^2 - 4*"A"*"C" LAC C,D FMP C,C FSBM C,B JUMPLE B,TCL1 ;DISCRIMINANANT IS < 0, SO NO COLLISION. PUSHJ P,SQRT ;FINISH QUADRATIC FORMULA. MOVN D,D ;B _ -"B"-SQRT(DISC.) FSBM D,B FDV B,Y MULI B,400 ;FIX RELATIVE TIME OF COLLISION. ASH C,-243(B) JUMPL C,TCL1 ;IF NEG TIME JUMPE C,TBAM ;INSTANT EXPLOSION CAR B,TL(W) ;GET LIFTIME CAR D,TL(X) ;GET LIFTIME CAMG C,D ;WILL BOTH TORPS BE ALIVE THEN? CAMLE C,B ;NOPE: FORGET IT GO TCL1 ;NO COLISION HRL C,C HRR C,X CAMG C,R16 ;IS THIS COLLISION SOONER THAN OUR SOONEST? LAC R16,C ;YES GO TCL1 ;LOOP TCBASH: HLRM R16,TL(W) ;SAVE THE EXPECTED LIFE TRNN R16,700000 ;R16 CONTAINS THE GUY WE COLIDE WITH HLRM R16,TL(R16) ;SO SAVE THIS AS HIS TL POPJ P, TBAM: DZM TL(W) ;MAKE BOTH TORPS. GO AWAY. DZM TL(X) POPJ P, SUBTTL XDRAW AND DRAW XDRAW: SKIPE R12,ZOWSW(SHIP) ;IS THIS GUY GONE? GO ZORCH ;YES. SKIPG R12,HYPER(SHIP) ;IS THIS SHIP IN HYPERSPACE? GO XDRAW2 ;NO. DRAW IT IFN NHYP,< CAILE R12,60 ;TIME FOR THE STAR OF THE EAST? POPJ P, ;NOPE LAC C,SP(SHIP) ;GET CENTER OF SHIP PUSHJ P,PLT1 ;MAKE LVW IORI C,6+7*VBRT+VENDP+VABS ;BRIGHT ENDPOINT ABSOLUTE PUSH BFP,C ;STUFF IN BUFFER PUSH BFP,C ;SECOND TIME FOR A VERY BRIGHT STAR > POPJ P, ;RETURN XDRAW2: LAC R12,UTUBE(SHIP) ;GET THE NEXT TUBE TO USE SKIPGE @RDELAY(R12) ;SKIP IF TUBE IS UNREADY SKIPGE TPCN(SHIP) ;TUBE READY. ANY TORPS LEFT? GO DRAW ;NOT READY OR EMPTY LAC R12,TPNT ;GET ACTIVE COUNT CAML R12,TTBMAX ;LESS THAN MAX GO DRAW ;NO: GUN IS JAMMED LAC C,SP(SHIP) ;GET SHIP CENTER PUSHJ P,PLT1 ;MAKE LVW IORI C,6+7*VBRT+VABS+VENDP ;DISPLAY RELOAD LITE PUSH BFP,C ;STUFF IN THE BUFFER PUSH BFP,C ;SECOND TIME FOR VERY BRIGHT DRAW: LAC C,R16 ;GET SHIP NOSE POSITION PUSHJ P,PLT1 ;MAKE LVW IORI C,34146 ;INVISIBLE, ABSOLUTE, BRITE PUSH BFP,C ;STUFF THE LVW L2: SKIPN R12,(R14) ;R14 POINTS TO SHIP TABLE POPJ P, ;NO MORE SHIP TABLE HLRE F,R12 ;GET THE STEP COUNT ADD R12,R15 ;ADD THE ORIENTATION ANDI R12,177 ;MAKE IT AN INDEX LLL: ADD R16,TAB(R12) ;ADD ORIENTATION TO POSITION LAC C,R16 ;LOAD NEW POINT PUSHJ P,PLT1 ;MAKE LVW IORI C,14126 ;TURN ON ENDPOINT, BRITE PUSH BFP,C ;STUFF IT AOJL F,LLL ;LOOP UNTIL NO MORE STEPS AOJA R14,L2 ;GET NEXT PART OF SHIP TABLE PLT1: LDB B,[POINT 10,C,27] ;GET BITS 18-27: X POSITION ASH C,-1 ;SHIFT -2Y TO -Y SETCM C,C ;ONES COMPLEMENT: MAKE +Y LSHC B,-12 ;SHIFT X INTO C ASH C,-1 ;ONE MORE PLACE FOR 11 BIT FIELD TRZ C,37777 ;SHUT OF ALL BUT X,Y BITS POPJ P, ;AND RETURN ZORCH: SKIPLE ZORCHP(SHIP) ;IS THIS FIRST TIME THRU? GO ZORCH1 ;NOPE, PUSHJ P,FLASH ;FIRST TIME: MAKE A FLASH LAC R14,RCONST ADDB R14,RANDX ;MAKE A NEW RANDOM NUMBER DAC R14,HYPCNT(SHIP) ;HYPCNT ISN'T NEEDED ANYMORE. ZORCH1: AOS R14,ZORCHP(SHIP) ;COUNT TIMES THRU SKIPL ZOWSW(SHIP) ;QUICK RETURN FOR FALL IN THE SUN CAIL R14,60 ;IS THIS ENOUGH? POPJ P, ;RETURN LSH R14,-3 ;DIVIDE BY 32 SUBI R14,13 ;14 IS MAX NUMBER OF FRAGS LAC R12,[POINT 3,HYPCNT(SHIP)] ;POINTER TO A DOZEN VELOCITIES LAC R11,[POINT 7,HYPCNT(SHIP),6] ;POINTER THAT SLIDES ZORCH2: ILDB B,R12 ;GET A VELOCITY IMUL B,ZORCHP(SHIP) ;TIMES THE TIME ASH B,-2 ;SCALE IT DOWN LDB C,R11 ;GET A DIRECTION ADD C,R15 ;ADD IN BASE DIRECTION ANDI C,177 ;MAKE INDEX TO TAB MUL B,TAB(C) ;MULTIPLY BY FRAGMENT DIRECTION SUB R11,[XWD 20000,0] ;SLIDE THE DIRECTION OVER TWO BITS ADD C,R16 ;ADD IN THE BASIC POSITION PUSHJ P,PLT1 ;MAKE LVW LAC B,RCONST ;GET A RANDOM NUMBER ADDB B,RANDX ;FOR THE BRIGHTNESS ANDI B,7*VBRT ;AND OUT ALL BUT BRT IORI C,6+VABS+VENDP(B) ;OR THE MAJIC BITS PUSH BFP,C ;STUFF IT TRNE B,VBRT PUSH BFP,C AOJLE R14,ZORCH2 ;LOOP FOR EACH PARTICLE POPJ P, ;RETURN FLASH: LAC C,R16 ;MAKE A FLASH. GET OBJECT POSITION FLASH0: PUSHJ P,PLT1 ;MAKE LVW IORI C,6+7*VBRT+VABS+VINVIS+2*VSIZ FLASHX: MOVEI B,FLASHL-1 ;GET TABLE SIZE FLASH1: PUSH BFP,C ;STUFF VECTOR PUSH BFP,FLASHT(B) ;STUFF CHARACTER SOJGE B,FLASH1 ;LOOP POPJ P, ;RETURN FLASHT: +1 ;TABLE OF CHARACTERS +1 +1 +1 +1 SDEF(FLASHL,.-FLASHT) ;FLASH TABLE LENGTH SUBTTL SIN, COS AND SQRT COS: FSB A,[4.712389] SIN: MOVNI F,10 LAC Y,[1.0] LAC C,[1.0] JFCL 10,.+1 LAC W,A MOVN D,A FMP D,A L1: FAD Y,[1.0] FMP C,Y FAD Y,[1.0] FMP C,Y FMP W,D LAC X,W FDV X,C JFCL 10,CPOPJ FAD A,X AOJL F,L1 POPJ P, SQRT: ASHC B,-33 SUBI B,201 ROT B,-1 PUSH P,B LSH B,-43 ASH C,-10 FSC C,177(B) DAC C,1(P) ;WATCH OUT FOR THE BUM WHO WROTE THIS FMP C,SQ1(B) FAD C,SQ2(B) LAC B,1(P) FDV B,C FAD C,B FSC C,-1 LAC B,1(P) FDV B,C FADR B,C POP P,C FSC B,(C) POPJ P, SQ1: 0.8125 ;CONSTANTS FOR SQRT ROUTINE 0.578125 SQ2: 0.302734 0.421875 SUBTTL GRAV: CALCULATE SHIP POSITION GRAV: CAILE SHIP,NSHIP-1 ;SKIP IF A SHIP GO GRAV1 ;IS A MINE SKIPGE ZOWSW(SHIP) ;LOOK AT SHIP'S ZOWSW POPJ P, ;DID COLLIDE WITH THE SUN GRAV1: LAC B,SX(SHIP) ;GET X POSITION LAC C,SY(SHIP) ;GET Y POSITION FMP B,B ;X^2 FMP C,C ;Y^2 FAD B,C ;R^2 MOVN X,B ;X _ -R^2 PUSHJ P,SQRT ;GET R CAMG B,SCR ;ARE WE TOO CLOSE TO THE SUN? GO ZOWIE1 ;YES: MAKE OBJECT DISAPPEAR FMP B,X ;B _ -R^3 LAC C,GG ;GET GRAVITY CONSTANT IN C FDVB C,B ;-GG/R^3 IN C AND B FMP B,SX(SHIP) ;-GG*X/R^3 IN B = X ACCELERATION FMP C,SY(SHIP) ;-GG*Y/R^3 IN C = Y ACCELERATION CAIG SHIP,NSHIP-1 ;IS THIS A MINE? SKIPN STX(SHIP) ;IS HE THRUSTING? GO GINT ;NO THRUST FROM A SHIP, OR A MINE LAC D,SR(SHIP) ;GET THE SHIP ORIENTATION HRRE W,TAB(D) ;GET THE -COS FSC W,206 ;FLOAT IT FMP W,STX(SHIP) ;MULTIPLY WITH THE THRUST FAD B,W ;ADD THIS TO THE X ACCELERATION HLRE W,TAB(D) ;GET THE SIN FSC W,206 ;FLOAT IT FMP W,STX(SHIP) ;MULTIPLY BY THE THRUST FSB C,W ;SUBTRACT FROM THE Y ACCELERATION GINT: FMP B,GDT ;MULTIPLY ACCELERATION BY DELTA T FMP C,GDT ;THE PRODUCT IS DELTA VELOCITY FADB B,SVX(SHIP) ;ADD DELTA TO EXISTING VELOCITY FADB C,SVY(SHIP) ;... FMP B,GDT ;TAKE VELOCITY*DELTA T FMP C,GDT ;FORMS A DELTA X AND Y LAC W,C ;DELTA Y IN W MULI W,400 TSC W,W ASH X,-211(W) MOVNM X,SV(SHIP) ;SAVE -2Y IN SHIP VELOCITY LAC W,B ;GET DELTA X INTO W MULI W,400 ;FIX IT TSC W,W ASH X,-211(W) HLRM X,SV(SHIP) ;-2*DELTA Y,,2*DELTA X IN SV FAD B,SX(SHIP) ;ADD THE POSITION FAD C,SY(SHIP) ;... CAML B,[511.0] ;CHECK THE POSITION ON THE SCREEN FSB B,[1024.0] CAMG B,[-512.0] FAD B,[1024.0] CAML C,[511.0] FSB C,[1024.0] CAMG C,[-512.0] FAD C,[1024.0] DAC B,SX(SHIP) DAC C,SY(SHIP) ;SAVE (REVISED) POSITIONS MULI C,400 ;FIX THE POSITIONS TSC C,C ASH D,-211(C) MOVNM D,SP(SHIP) MULI B,400 TSC B,B ASH C,-211(B) HLRM C,SP(SHIP) ;SAVE FIXED POSITIONS IN SP POPJ P, SUBTTL SHIP - TORPEDO AND SHIP - MINE COLISION STCOL: SKIPE ZOWSW(SHIP) ;THIS SHIP DEAD? POPJ P, ;YES, CAN'T COLLIDE WITH ANYTHING LAC W,SR(SHIP) ;GET SHIP ORIENTATION MOVN X,TAB(W) ;GET --COS HRLZ Y,TAB(W) ;AND +SIN MOVN W,SP(SHIP) ;GET --Y POS. HRLZ D,SP(SHIP) ;AND X POS. MOVEI R12,1 ;1 FOR TORPS, 0 FOR MINES STL0: LAC R11,@STTB1(R12) ;GET TPNT OR NMINEX STL1: SOJL R11,STL2 ;ALL DONE WITH TORPS-DO MINES LAC B,@STTB2(R12) ;GET POS. OF TORP (OR MINE) JUMPE B,STL1 ;EXPIRED MINE LAC F,R12 ;WE MAY INTERPOLATE IF F > 0 STL1.1: MOVN C,B ;LOAD C WITH 2Y POSITION OF TORP MOVS B,B ;SWAP B. X POSITION OF OBJECT SUB B,D ;GET DELTA X FROM TORP TO SHIP CAMG B,[25B9] ;IS IT EVEN CLOSE? CAMGE B,[-25B9] ;.... GO STL1 ;NO SUB C,W ;GET DELTA Y CAMG C,[25B9] ;IS IT CLOSE? CAMGE C,[-25B9] ;..... GO STL1 ;NO LAC R14,B ;R14 _ DELTA X MUL R14,X ;GET dx cos (phi) LAC R15,C ;R15 _ DELTA Y MUL R15,Y ;GET dY sin(phi) SUB R14,R15 ;x' = dx cos(phi)-dy sin(phi) DAC R14,SAVSID ;REMEMBER SIDE WERE ON MOVM R14,R14 ;GET ABS(X'). (SHIP IS SYMMETRIC) CAML R14,[13B17] ;IN BOUNDS? GO STINTR ;NOPE: SEE ABOUT INTERPOLATING LAC R15,C ;NOW ROTATE DY INTO SHIP COORDINATES MUL R15,X ;DY COS(PHI) MUL B,Y ;DX SIN(PHI) ADD R15,B ;Y' = DXSIN(PHI)+DY COS(PHI) CAMG R15,[25B17] ;Y VALUE IN BOUNDS? CAMGE R15,[-27B17] ;... GO STINTR ;NOPE: SEE ABOUT INTERPOLATION CAML R15,[-12B17] ;SKIP IF TORP IN WIDE TAIL CAMG R14,[4B17] ;SKIP UNLESS TORP IN NARROW BODY GO STX2 ;WE HAVE A COLISION STINTR: SOJL F,STL1 ;NO INTERPOLATION: SECOND TRY OR MINES MOVN B,TV(R11) ;GET -(THE TORPEDO VELOCITY) HRRE C,B ;GET RIGHT SIDE ASH B,-1 ;HALVE LEFT OF B ASH C,-1 ;HALVE RIGHT OF C HRR B,C ;RELOAD B WITH HALF OF RIGHT SIDE ADD B,TP(R11) ;ADD TO TORPEDO POSITION GO STL1.1 ;B CONTAINS INTERPOLATED POSITION STL2: SOJGE R12,STL0 ;AFTER TORPS, DO MINES, THEN POPJ P, ;RETURN STX2: SKIPE DAMHIT ;PARTIAL DAMAGE ALLOWED? CAMG R14,[4B17] ;DIRECT HIT? GO STX3 ;NO PARTIAL DAMAGE OR KILLED DEAD DZM @STTB3(R12) ;KILL OBJECT SKIPL SAVSID ;CHECK SIDE SKIPA R14,ROTLBT(SHIP) ;HIT RIGHT LAC R14,ROTRBT(SHIP) ;HIT LEFT TDOE R14,DMASK ;SET BIT IN THE DAMAGE LIST GO STX3 ;KILL GUY IORM R14,DMASK ;SET BIT IN DAMAGE LIST LAC C,@STTB2(R12) ;GET WHERE PUSHJ P,PLT1 ;LVW IORI C,7*VBRT+VSIZ+VINVIS+VABS+6; GO FLASHX ;FLASH & RETURN STX3: ZAC R14, EXCH R14,@STTB3(R12) MOVEI F,2(R12) ;ZERO OBJECT. SET XPLOSION TYPE DAC F,ZOWSW(SHIP) ;SAVE EXPLOSION TYPE JUMPE R12,QRST0 ;JUMP IF SHIP-MINE LAC R11,KILLBN ;KILLER'S REWARD CDR R14,R14 ;GET THE NAME OF THE KILLER IN R14 SKIPE KILLER ADDM R11,NUMWN(R14) ;INCREASE HIS SCORE GO QRST1 ;GO THINK ABOUT RESTARTING ZOWIE1: DZM SP(SHIP) ;ZERO POSITION MEANS DIED IN SUN CAIG SHIP,NSHIP-1 ;SKIP IF A MINE SKIPE ZOWSW(SHIP) ;SKIP IF SHIP WAS ALIVE POPJ P, ;MINE- SUN COLISION SKIPN KILSUN ;DO WE HAVE KILLER SUN? GO ZOWMAP ;AND, IT'S ONLY OUR PAPER SUN SETOM ZOWSW(SHIP) ;SIGNIFIES DEATH BY THE SUN QRST0: AOS GALAXY ;COUNT ONE FOR GALACTIC OVERHEAD QRST1: LAC R14,RSTARD ;LOAD RESTART DELAY MOVNM R14,RESTAR(SHIP) ;SAVE IT MOVN R14,DIEPEN ;PENALTY FOR DYING ADDM R14,NUMWN(SHIP) ;UPDATE SCORE PUSHJ P,CNT4 ;DISPLAY SCORE SKIPE DOTEAM ;ARE WE DOING TEAM SCORES? GO QRST2 ;YES COMPUTE IF ONE TEAM WIPED OUT LAC R14,NSHIPX ;ARE THERE ANY LEFT? SETO F, ;COUNT NUMBER LEFT SKIPN ZOWSW(R14) ;IS THIS STILL HERE ADDI F,1 ;YES: COUNT IT SOJGE R14,.-2 ;LOOP JUMPG F,CPOPJ ;JUMP IF >1 LEFT GO QRST3 ;OK. SET THE RESTART TIME QRST2: LAC R14,NSHIPX ;LOOK AT ALL SHIPS QRST2A: SUBI R14,1 ;DECREMENT SKIPE ZOWSW(R14) ;SKIP IF STILL ALIVE SKIPN ZOWSW+1(R14) ;DEAD. SKIP IF TEAMMATE LIVES SOJGE R14,QRST2A ;ONE TEAM IS PARTIALLY LIVE JUMPL R14,CPOPJ ;RETURN IF BOTH TEAMS THERE QRST3: LAC F,TLIFE ;TIME TO RESTART MOVNM F,QRSTRT ;SET RESTART TIME POPJ P, ;RETURN ZOWMAP: LAC F,[XWD 377777,377777] DAC F,SP(SHIP) MOVEI F,377777 FSC F,223 DAC F,SX(SHIP) DAC F,SY(SHIP) POPJ P, JS: DZM JSTB ;ZERO TABLE BEGINNING LAC B,[XWD JSTB,JSTB+1] ;LOAD BLT POINTER BLT B,JSTBX ;RUN THRU TABLE WITH ZEROES TDZ A,DMASK ;ASSESS DAMAGES LAC F,BTX ;GET STANDARD THRUST LAC B,BRX ;GET STANDARD ROTATION LAC C,HYTIME ;STANDARD HYPERSPACE DURATION LAC SHIP,NSHIPX ;FOR THIS MANY SHIPS BITLOP: TDNE A,THRUBT(SHIP) ;IS HE THRUSTING? DAC F,STX(SHIP) ;YES. GIVE HIM SOME TDNE A,ROTRBT(SHIP) ;ROTATING RIGHT? DAC B,SRX(SHIP) ;YES TDNE A,ROTLBT(SHIP) ;ROTATING LEFT? MOVNM B,SRX(SHIP) ;YES GIVE HIM NEGATIVE TDC A,HYPRBT(SHIP) ;SET-UP FOR HYPER TEST TDCE A,HYPRBT(SHIP) ;IS HE HYPER SPACING? GO JS1 ;NO DZM SRX(SHIP) ;DON'T LET HIM ROTATE BOTH WAYS SKIPN HYPON GO JS1 ;HYPERSPACE OFF IFN HYPERS,< ;ORIGINAL HYPERSPACE? DAC C,HYPER(SHIP) ;SET HIS HYPER TIME > IFN NHYP,< ;NEW HYPERSPACE? PUSHJ P,SETHYP ;SET UP FOR HYPERSPACE > JS1: SOJGE SHIP,BITLOP ;LOOP FOR EVERY SHIP POPJ P, ;ALL DONE SUBTTL INSERT LOSER INTO NEW HYPERSPACE IFN NHYP,< SETHYP: LAC C,RCONST ADDB C,RANDX DAC C,SP(SHIP) HLRE B,C ;GET -2Y HRRE C,C ;GET 2X FSC B,223 ;FLOAT IT FSC C,223 ;FLOAT Y DAC C,SX(SHIP) ;SAVE X MOVNM B,SY(SHIP) ;SAVE Y DZM SV(SHIP) ;NO VELOCITY FOR SHIP DZM SVX(SHIP) DZM SVY(SHIP) LAC C,RANDX ;GET RANDOM NUMBER LAC B,C ;IN BOTH ANDI B,177 ;GIVE HIM A RANDOM ORIENTATION DAC B,SR(SHIP) ;... ADDI B,100 ;MAKE SURE HE STAYS OUT A WHILE DAC B,HYPER(SHIP) ;SAVE TIME TO SPEND THERE LSH C,-5 ;TAKE A RANDOM FIELD ANDI C,3 ;AND WITH 7 AOS B,HYPCNT(SHIP) ;INCREMENT HIS TIMES IN H SPACE CAMGE C,B ;SKIP IF HE WILL SURVIVE SETOM HYPCNT(SHIP) ;HE SHALL LOSE POPJ P, ;HE WINS THIS TIME > SUBTTL CODE FOR RUNTIME PARAMETER MODIFICATION IFG PARM,< SDEF(DIGF,1) SDEF(LETF,2) SDEF(NEGF,4) SDEF(CNGF,10) SDEF(PNTF,20) LPARM: 0 ;CELL TO REMEMBER WHERE RPARM: SETO A, ;GET OUR LINE CHARACTERISTICS TTCALL 6,A ;INTO A TLO A,100 ;SET SPECIAL ACTIVATION MODE TTCALL 7,A ;TTY WILL WAKE ON WORD BY WORD TTCALL 14, ;WAIT FOR A WORD TO COME IN SETO A, ;FOR OUR LINE TTCALL 6,A ;GET LINE CHARACTERISTICS TLZ A,100 ;SHUT OFF SPECIAL BIT TTCALL 7,A ;RESET LINE MODE PUSHJ P,GETNAM ;GET THE NAME OF A CELL CAIE A,"/" ;/ IS THE ACTIVATOR GO QWERT ;LOSE CAIE B,45 ;CODE FOR .? GO RPARM0 ;NOPE SKIPN D,LPARM GO QWERT GO RPARM2 ;WE HAVE IT RPARM0: CAMN B,[RADIX50 0,LIST] ;COMMAND TO LIST? GO RPARML ;YE CAMN B,[RADIX50 0,CLEAR] ;CLEAR SCREEN? GO RPMC ;YES MOVEI D,PTAB ;GET ADDRESS OF TABLE RPARM1: LAC C,(D) ;GET SYMBOL CELL FROM TABLE TLZ C,740000 ;SHUT OFF CODE BITS CAMN B,C ;MATCH? GO RPARM2 ;YES! ADDI D,2 ;PRESS AHEAD CAIGE D,PTABX ;END OF TABLE? GO RPARM1 ;NO. LOOP. QWERT: TTCALL 11,0 ;I DON'T UNDERSTAND TTCALL 3,[ASCIZ/? /] POPJ P, ;GIVE UP RPARM2: CAR A,1(D) ;LOAD ADDRESS OF PARAMETER DAC D,LPARM ;REMEMBER . LAC A,(A) ;GET WHOLE PARAMETER LDB B,[POINT 3,0(D),3] ;GET CODE BITS TTCALL 3,[ASCIZ/ /] ;WRITE TAB CAR C,IOTAB(B) PUSHJ P,(C) TTCALL 3,[ASCIZ/ /] ;AND A TAB CDR C,IOTAB(B) PUSHJ P,(C) GO QWERT TRNN F,CNGF POPJ P, ;NO CHANGE CDR B,1(D) JUMPE B,RPARM4 ;READY TO STUFF LAC C,(D) TLNE C,400000 GO RPARM3 ;TEST FOR LOWER BOUND CAML B,W GO RPARM4 RPARMX: TTCALL 3,[ASCIZ/OUT OF BOUNDS /] POPJ P, RPARM3: CAMLE B,W GO RPARMX RPARM4: CAR C,1(D) DAC W,(C) POPJ P, RPARML: MOVEI D,PTAB TTCALL 3,[ASCIZ/ /] RPML1: LAC W,(D) ;GET RADIX 50 TLZ W,740000 PUSHJ P,R5OUT ;WRITE RADIX50 LDB B,[POINT 3,0(D),3] ;GET BITS TTCALL 3,[ASCIZ/ /] CAR A,1(D) LAC A,(A) CAR C,IOTAB(B) PUSHJ P,(C) TTCALL 3,[ASCIZ/ /] ADDI D,2 CAIGE D,PTABX GO RPML1 POPJ P, R5OUT: IDIVI W,50 HRLM X,(P) JUMPE W,.+2 PUSHJ P,R5OUT CDR W,(P) JUMPG W,R5OUT1 TTCALL 3,[ASCIZ/ /] POPJ P, R5OUT1: CAILE W,12 GO R5OUT2 ADDI W,"0"-1 TTCALL 1,W POPJ P, R5OUT2: CAILE W,44 GO R5OUT3 ADDI W,"A"-13 TTCALL 1,W POPJ P, R5OUT3: SUBI W,2 CAIN A,43 MOVEI W,"." TTCALL 1,W POPJ P, RPMC: TTCALL 3,[BYTE(7)15,14,14,14] POPJ P, GETNAM: ZAC B, ;ZERO B. WE ACCUMULATE RADIX 50 GETNM1: PUSHJ P,GETLET ;GET A LETTER AND SKIP POPJ P, ;B WILL CONTAIN THE NAME. A HAS BREAK PUSHJ P,R50 ;A IS CONVERTED TO RADIX 50 IMULI B,50 ;MAKING RADIX 50 ADD B,A ;ADD IN CHARACTER GO GETNM1 ;LOOP GETCHR: TTCALL 0,A ;GET A CHARACTER TRZ F,LETF+DIGF ;ZERO FLAGS CAIL A,"a" ;SKIP IF NOT LOWER CASE CAILE A,"z" ;SKIP IF LOWER CASE GO GETCH1 ;LOOK FOR MORE TRZ A,40 ;MAKE UPPER CASE GO GETCH2 ;GO TURN ON LETF AND RETURN GETCH1: CAIL A,"A" ;SKIP IF NOT LETTER CAILE A,"Z" ;SKIP IF LETTER GO GETCH3 ;TEST FOR DIGITS GETCH2: TRO F,LETF ;TURN ON FLAG POPJ P, ;RETURN GETCH3: CAIL A,"0" ;SKIP IF NOT DIGIT CAILE A,"9" ;SKIP IF DIGIT GO GETCH4 ;NOT DIGIT TRO F,DIGF ;SET FLAG POPJ P, ;RETURN GETCH4: CAIN A,15 ;IS IT CR? GO GETCHR ;YES. GET NEXT CAIN A,175 ;TEST FOR ALTMODE MOVEI A,12 ;CONVERT TO LF POPJ P, ;RETURN GETLET: PUSHJ P,GETCHR ;GET A LETTER. FIRST GET CHARACTER TRNE F,LETF+DIGF ;ANY FLAGS SET? GO CPOPJ1 ;YES: DO A SKIP RETURN CAIE A,"$" CAIN A,"%" GO CPOPJ1 CAIN A,"." CPOPJ1: AOS (P) POPJ P, R50: TRNE F,LETF ;IS THIS A LETTER SUBI A,"A"-13 ;CONVERT TO R 50 TRNE F,DIGF ;IS IT A DIGIT SUBI A,"0"-1 TRNE F,LETF+DIGF POPJ P, ADDI A,2 CAIN A,"."+2 MOVEI A,45 POPJ P, DECOUT: LAC W,A ;GET ARGUMENT MOVEI Y,12 ;GET RADIX GO ALLRAD ;DO FOR ALL RADIX OCTOUT: LAC W,A ;GET ARGUMENT MOVEI Y,10 ;SET RADIX GO ALLRAD ;DO ALL OHOUT: CDR W,A ;GET FIRST HALF MOVEI Y,10 ;SET RADIX PUSHJ P,ALLRAD ;DO FIRST HALF TTCALL 3,[ASCIZ/,,/] ;WRITE SEPARATION CAR W,A ;GET OTHER SIDE ALLRAD: JUMPGE W,ARADIX TTCALL 3,[ASCIZ/-/] MOVN W,W ARADIX: IDIV W,Y HRLM X,(P) JUMPE W,.+2 PUSHJ P,ARADIX CDR W,(P) ADDI W,"0" TTCALL 1,W POPJ P, FLOUT: JUMPN A,FLOUT1 ;JUMP UNLESS ARGUMENT IS 0 TTCALL 3,[ASCIZ/0.0/] POPJ P, FLOUT1: MOVM W,A ;GET |ARG| INTO W JUMPG A,FLOUT2 ;JUMP PAST KLUGE IF ARG POSITIVE TTCALL 3,[ASCIZ/-/] FLOUT2: ZAC Y, ;POSITION OF THE POINT FLOUT3: CAML W,[1.0] ;LESS THAN 1.0 GO FLOUT4 ;NO FMPR W,[10.0] ;MULTIPLY BY 10.0 SOJA Y,FLOUT3 ;COUNT THE POINT SHIFT FLOUT4: CAMGE W,[10.0] ;COMPARE TO 10.0 GO FLOUT5 ;WE ARE SCALED FDVR W,[10.0] ;SCALE DOWN AOJA Y,FLOUT3 ;COUNT AND LOOP FLOUT5: CAML Y,[-2] ;ARE WE IN BOUNDS? CAILE Y,6 ;IN BOUNDS? GO FLOUTE ;NO: WRITE IN EXPONENT FORM AOJG Y,FLOUTX ;PREPARE FOR BIG NUMBER TTCALL 3,[ASCIZ/0./] ;WRITE BEGINNING OF NUMBER JUMPE Y,FLOUTX ;JUMP IF NO MORE 0'S TTCALL 3,[ASCIZ/0/] ;WRITE PLACE HOLDER ZEROES AOJL Y,.-1 ;LOOP FLOUTX: FMPR W,[1000000.0] ;MULTIPLY BY BIG NUMBER MULI W,400 ;SPLIT EXPONENT/FRACTION ASH X,-243(W) ;FIX THE NUMBER LAC W,X ;LOAD IT INTO W FDOUT: IDIVI W,12 HRLM X,(P) JUMPE W,.+2 PUSHJ P,FDOUT CDR W,(P) ADDI W,"0" TTCALL 1,W SOJN Y,CPOPJ TTCALL 3,[ASCII/./] POPJ P, FLOUTE: PUSH P,Y ;SAVE FRACTION COUNT MOVEI Y,1 ;MAKE POINT COME AFTER 1 DIGIT PUSHJ P,FLOUTX ;CALL OTHER STUFF TTCALL 3,[ASCII/'/] ;WRITE FOR EXPONENT POP P,A ;RECOVER THE FRACTION COUNT GO DECOUT ;WRITE DECIMAL AND RETURN RADIN: SETZB W,X ;NUMBER IN W. -POINT COUNT IN X TRZ F,CNGF+NEGF+PNTF ;ZERO FLAGS RADIN1: PUSHJ P,GETCHR TRNN F,DIGF GO RADIN2 ;NOT DIGIT CAIL A,"0"(Y) ;IS LEGAL POPJ P, ;ILLEGAL DIGIT IMUL W,Y ADDI W,-"0"(A) TRNE F,PNTF ;POINT SEEN YET? SUBI X,1 ;YES: COUNT IN X TRO F,CNGF ;MARK ATTEMPT TO CHANGE GO RADIN1 ;LOOP RADIN2: CAIE A,"." ;DECIMAL POINT GO RADIN3 ;NOPE TROE F,PNTF ;TURN ON POINT POPJ P, ;IT WAS SET BEFORE GO RADIN1 ;LOOP RADIN3: CAIE A,"-" ;IS IT THE SIGN? GO RADIN4 TRNN F,CNGF+PNTF ;ANYTHING SEEN YET? TROE F,NEGF ;TURN ON FLAG POPJ P, ;LOSE GO RADIN1 ;WIN RADIN4: TRZE F,NEGF MOVN W,W ;NEGATE GO CPOPJ1 ;SKIP RETURN TO WIN! OCTIN: MOVEI Y,10 GO INRAD DECIN: MOVEI Y,12 INRAD: PUSHJ P,RADIN POPJ P, ;LOSER CAIN A,12 ;MUST SEE LF JUMPE X,CPOPJ1 ;AND NO DIGITS PAST POINT POPJ P, ;LOSE FLIRT: MOVEI Y,12 ;SET RADIX PUSHJ P,RADIN POPJ P, CAIE A,"'" GO FLIRT1 ;NO EXPONENT PUSH P,W ;SAVE STUFF PUSH P,X PUSHJ P,DECIN GO FLIRTL ;LOSSAGE FROM FLIRT POP P,X ;GET OLD POINT COUNT ADD X,W ;MAKE REAL EXPONENT POP P,W ;GET DIGITS PART FLIRT1: CAIE A,12 ;END OF LINE? POPJ P, ;NOPE. LOSE FSC W,233 JUMPE X,CPOPJ1 ;IF NO EXPONENT LAC Y,[10.0] JUMPG X,FLIRT2 LAC Y,[0.1] MOVM X,X FLIRT2: FMPR W,Y SOJG X,.-1 GO CPOPJ1 FLIRTL: POP P,(P) POP P,(P) POPJ P, OHIN: MOVEI Y,10 PUSHJ P,RADIN POPJ P, JUMPN X,CPOPJ CAIN A,12 GO CPOPJ1 CAIE A,"," POPJ P, TTCALL 0,A CAIE A,"," POPJ P, LAC C,W PUSHJ P,OCTIN POPJ P, HRL W,C GO CPOPJ1 SUBTTL TABLES FOR THE PARAMETER MODIFICATION COMMENT/ ENTRIES ARE: RADIX50 N,SYMBOL BOUND,,ADDRESS WHERE N HAS THE FOLLOWING SIGNIFIGANCE IF N40 THEN THE BOUND IS A LOWER BOUND. TAKE N MOD 40 FOR N=0 FLOATING POINT N=4 OCTAL N=10 DECIMAL N=14 OCTAL HALF WORDS IF BOUND = 0 THEN THERE IS NO RESTRICTION / PTAB: RADIX50 0,BTX XWD 0,BTX RADIX50 0,GDT XWD 0,GDT RADIX50 0,BRX XWD 0,BRX RADIX50 0,GG XWD 0,GG RADIX50 0,MTCOLR XWD 0,MTCOLR RADIX50 0,TR2 XWD 0,TR2 RADIX50 0,SCR XWD 0,SCR RADIX50 4,NTORPS XWD NTORPM,NTORPS RADIX50 4,TTBMAX XWD LTBL,TTBMAX RADIX50 4,LATNCY XWD 0,LATNCY RADIX50 4,TLIFE XWD 200,TLIFE RADIX50 14,ITV XWD 0,ITV RADIX50 44,TRELOD XWD 20,TRELOD RADIX50 4,RSTARD XWD 0,RSTARD IFG HYPERS,< RADIX50 4,HYTIME XWD 0,HYTIME RADIX50 4,HYPEN XWD 0,HYPEN > RADIX50 4,DOTEAM XWD 0,DOTEAM RADIX50 10,SURBEN XWD 0,SURBEN RADIX50 10,KILLBN ;KILLER'S BENEFIT, WAGES OF SIN XWD 0,KILLBN RADIX50 10,DIEPEN ;PENALTY FOR DYING XWD 0,DIEPEN RADIX50 10,GSCORE ;SET TO DISPLAY GALAXY SCORE XWD 0,GSCORE SDEF(PTABX,.-1) ;DEFINE END OF TABLE IOTAB: XWD FLIRT,FLOUT XWD OCTIN,OCTOUT XWD DECIN,DECOUT XWD OHIN,OHOUT SDEF(UPDLEN,30) ;USER PUSHDOWN LENGTH UPDL: IOWD UPDLEN,UPDLST UPDLST: BLOCK UPDLEN > ;END OF IFG PARM SUBTTL DATA STORAGE FOR SPACEWAR TENDON: 0 ;SET -1 BY PDP-10 WHEN DONE. ;TESTED BY PDP-6. ZEROED WHEN PDP-6 RUNS SIXDON: 0 ;SET -1 WHEN PDP-6 FINISHES. ;TESTED AND CLEARED BY PDP-10 CTIME: CTMX 4 CTMX: 0 CTIM1: 0 ;SAVE DPY SELECT WORD HERE LVW(0,0,i,a,7,7) ;SELECT CENTER, BIG BRIGHT CTIM: 0 CDOWN: 0 DMASK: 0 ;DAMAGE MASK SAVSID: 0 ;USED BY DAMAGE ASSESSMENT DEBUG: 0 ;SET 0 TO FAKE SPACEWAR SWBUT: 0 ;SAVE OLD SW BUTTONS HERE NSHIPX: NSHIP-1 ;NUMBER OF SHIPS-1 TO USE DDSW: 0 ;SET 0 FOR NEW BUTTONS TUBES: 0 ;SET 0 FOR TWO TUBES DAMHIT: 0 ;SET 0 FOR PARTIAL DAMAGE RSPSWT: 0 ;SET 0 FOR RANDOM STARTS KILSUN: -1 ;SET =0 FOR NON-KILLER SUN CNTR: 0 ;SET 0 FOR SCORES HYPON: 0 ;SET 0 TO USE ALLOW HYPERSPACE KILLER: 0 ;SET 0 FOR KILLER SCORES TENSW: 0 ;SET 0 FOR SW ON THE 10 SIXSW: 0 ;0 means PDP-6 is running. RCONST: 532473734251 ;A RANDOM CONSTANT RANDX: 352716643514 ;A RANDOM NUMBER RAND: 717271471534 ;YET ANOTHER RANDOM NUMBER DISTAB: STARFG: 0 ;SET -1 TO DISPLAY STARS SHIPFG: 0 ;SET -1 TO DISPLAY SHIPS CNTFG: 0 ;SET -1 TO DISPLAY COUNTS STADR: SUN ;ADDRESS OF STAR TABLE NSTAR+STARBF-SUN ;LENGTH OF STAR TABLE BPTRX: BUF ;ADDRESS OF DPY BUFFER 0 ;CLOBBER THIS TO BUFFER LENGTH CNTPNT: CNTTBL ;ADDRESS OF COUNT TABLE 1+2*NSHIP ;SIZE OF COUNT TABLE BITS: 0 ;KBD BITS OLINE: 0 LINE: 0 ;DPY LINE NUMBER GSCORE: 0 ;SET 0 FOR GALAXY SCORE MINSTR: 0 ;>0 TIME BEFORE RELAYING MINES PDP: IOWD PDLEN,PDLIST ;THE PUSH DOWN POINTER TAB: BLOCK 200 ;TABLE OF SINES AND COSINES CLOBR: 0 ;SET 0 AFTER HI CORE IS CLOBBERED PDLIST: BLOCK PDLEN ;STORAGE FOR PUSH DOWN LIST CNTTBL: BLOCK 3+2*NSHIP ;TABLE TO DISPLAY SCORES WITH TV: BLOCK LTBL ;TORPEDO VELOCITY -2Y,,2X TP: BLOCK LTBL ;TORPEDO POSITION -2Y,,2X TL: BLOCK LTBL ;TORPEDO REMAINING LIFE TVX: BLOCK LTBL ;TORPEDO X VELOCITY (FLOATING POINT) TVY: BLOCK LTBL ;TORPEDO Y VELOCITY (FLOATING POINT) NUMWN: BLOCK NSHIP ;WINS FOR EACH PLAYER SDEF(GOBEG,.) ;AREA TO ZERO AT GAME BEGINNING TPNT: 0 ;ACTIVE TORP COUNT QRSTRT: 0 ;<0 TIME BEFORE RESTART ZOWSW: BLOCK NSHIP ;NON ZERO DENOTING EXPLOSION HYPER: BLOCK NSHIP ;POSITIVE IN HYPERSPACE TCNT0: BLOCK NSHIP ;RELOAD DELAY: SHIP n TUBE 0 TCNT1: BLOCK NSHIP ;RELOAD DELAY: SHIP n TUBE 1 UTUBE: BLOCK NSHIP ;TUBE SELECT TOGGLE ZORCHP: BLOCK NSHIP ;SHIP'S ZORCH PROGRESS TPCN: BLOCK NSHIP ;REMAINING TORPEDO COUNT STEMP: BLOCK NSHIP ;NOSE POSITIONS SRA: BLOCK NSHIP ;LEFTSIDE BITS=ORIENTATION RESTAR: BLOCK NSHIP ;FOR AUTO RESTART COUNTS HYPCNT: BLOCK NSHIP ;# OF TIMES IN H-SPACE. & ;RANDOM NUMBER DURING ZORCH SR: BLOCK NSHIP ;BASIC ORIENTATION (ROT) 0-177 SV: BLOCK NSHIP ;BASIC VELOCITY -2Y,,2X MINEV: BLOCK NMINE SP: BLOCK NSHIP ;BASIC POSITION -2Y,,2X MINEP: BLOCK NMINE SX: BLOCK NSHIP ;X POSITION FLOATING MINEX: BLOCK NMINE SY: BLOCK NSHIP ;Y POSITION (FLOATING) MINEY: BLOCK NMINE SVX: BLOCK NSHIP ;X VELOCITY (FLOATING) MINEVX: BLOCK NMINE SVY: BLOCK NSHIP ;Y VELOCITY (FLOATING) MINEVY: BLOCK NMINE SDEF(GOEND,.-1) ;END OF STUFF ZEROED BY GAME SDEF(JSTB,.) ;ZERO BEFORE READING BUTTONS STX: BLOCK NSHIP ;THRUST INCREMENT FOR SHIPS SRX: BLOCK NSHIP ;DELTA OMEGA (ROTATION) SDEF(JSTBX,.-1) ;END OF STUFF ZEROED BY JS IFN FAST,< BTX: 1.6 ;THRUST BRX: 2.0 ;ANGULAR VELOCITY OF ROTATION GG: 32.0 ;GRAVITATIONAL CONSTANT HYTIME: 100 ;TIME TO SPEND IN HYPERSPACE HYPEN: 100 ;HYPERSPACE RELOAD PENALTY ITV: 3400000 ;TORP VELOCITY TRELOD: 60 ;NORMAL RELOAD TIME > IFE FAST,< ;SLOW DEFAULTS BTX: 0.8 ;THRUST BRX: 1.0 ;ROTATIONAL D OMEGA/DT GG: 16.0 ;GRAV CONSTANT HYTIME: 200 ;HYPERSPACE-1 DURATION HYPEN: 40 ;HYPERSPACE-1 PENALTY ITV: 1600000 ;INITIAL TORPEDO VELOCITY TRELOD: 30 ;TUBE RELOAD DELAY > RSTARD: 400 ;RESTART DELAY MTCOLR: 100.0 TR2: 36.0 ;TORPEDO RADIUS ^ 2 DOTEAM: 0 ;SET 0 IF USING TEAM SCORING SURBEN: 1 ;SURVIVAL BENEFIT DIEPEN: 0 ;PENALTY FOR DYING: DEATH PENALTY KILLBN: 0 ;REWARD FOR KILLING, WAGES OF SIN GALAXY: 0 ;SCORE FOR OVERHEAD GDT: 6.0 ;DELTA T FOR INTEGRATION SCR: 10.0 ;SUN COLISION RADIUS NTORPS: NTORPM ;NUMBER OF TORPS/PLAYER NMINEX: NMINE ;MAXIMUM NUMBER OF MINES NMINE TTBMAX: LTBL ;MAXIMUM TORPS IN TABLE LTBL LATNCY: 10 ;MIN TIME BETWEEN SHOTS (TUBES) TLIFE: 200 ;TORPEDO LIFE RDELAY: XWD SHIP,TCNT0 ;@RDELAY(X) WILL GET/SET RELOAD XWD SHIP,TCNT1 ;DELAY FOR SHIP'S TUBE (X). STTB1: NMINEX ;NUMBER OF OBJECTS FOR STCOL (MINES) TPNT ;DITTO, TORPEDOES STTB2: XWD R11,MINEP ;STCOL: OBJECT POSITION TABLE ADDRESS XWD R11,TP ;TORPEDOES, (LAST LINE WAS MINES) STTB3: XWD R11,MINEP ;ZERO THIS TO CANCEL OBJECT (MINE) XWD R11,TL ;CANCEL TORPEDO TFTAB: 10 ;FLAME LOCATOR FOR SHIPS 12 ;FLAME POSITION = 13 ;SP(SHIP)-TAB(SR(SHIP))*TFTAB(SHIP) 14 14 SPTAB: 14 ;DIDDLE TO GET SHIP NOSE 14 ;SHIP NOSE POSITION = 14 ;SP(SHIP)+TAB(SR(SHIP))*SPTAB(SHIP) 14 14 SPICT: S1TAB ;TABLE OF PICTURE ADDRESSES S2TAB S3TAB ;ARE ASSEMBLED S4TAB S5TAB TPBIT: 1 ;BIT SIGNIFYING TORP LAUNCH 20 400 10000 200000 ALLBIT: 17 ;BUTTON BITS FOR EACH SHIP 360 7400 170000 3600000 THRUBT: 2 40 1000 20000 400000 ROTRBT: 4 100 2000 40000 1000000 ROTLBT: 10 200 4000 100000 2000000 HYPRBT: 14 300 6000 140000 3000000 IPOS: BLOCK NSHIP ;INITIAL POSITIONS IROT: BLOCK NSHIP COUNTP: BLOCK NSHIP GLOC: LVW(10,10,i,a,5,5) S1TAB: XWD -4,70 ;SHIP 1 PICTURE XWD -21,100 XWD -4,60 XWD -6,0 XWD -4,160 XWD -3,140 XWD -4,120 XWD -6,100 XWD -4,20 XWD -3,40 XWD -3,140 XWD -20,0 XWD -4,10 0 S2TAB: XWD -4,70 XWD -23,100 XWD -3,30 XWD -6,0 XWD -3,150 XWD -3,140 XWD -3,130 XWD -6,100 XWD -3,50 XWD -3,40 XWD -3,140 XWD -22,0 XWD -4,10 ZERO: 0 S3TAB: XWD -4,70 XWD -23,100 XWD -3,40 XWD -6,0 XWD -4,152 XWD -2,140 XWD -4,126 XWD -6,100 XWD -6,40 XWD -3,140 XWD -23,0 XWD -4,10 0 S4TAB: XWD -4,70 XWD -23,100 XWD -4,40 XWD -10,165 XWD -4,140 XWD -10,112 XWD -7,40 XWD -3,140 XWD -23,0 XWD -4,12 0 S5TAB: XWD -4,70 XWD -23,100 XWD -2,60 XWD -4,20 XWD -6,160 XWD -4,140 XWD -6,120 XWD -4,60 XWD -2,20 XWD -4,40 XWD -3,140 XWD -23,0 XWD -4,12 0 LIT SUN: 0 SELWRD: 1 lvw(-12,-10,i,a,7,2) ;CENTER FOR THE SUN +1 ;THE SUN ITSELF STARBF: BUF: BLOCK BUFLEN ;THE BUFFER FOR THE WORLD SUBTTL ONCE ONLY SET PARAMETERS AT STARTUP SETALL: TTCALL 3,[ASCIZ/WELCOME TO SPACEWAR. HOW MANY SHIPS? MAXIMUM IS /] MOVEI A,NSHIP PUSHJ P,%DEC TTCALL 3,[ASCIZ/ /] PUSHJ P,%DIGIN SOJGE A,.+2 MOVEI A,1 ;TWO SHIPS IF CR CAIL A,NSHIP MOVEI A,NSHIP-1 DAC A,NSHIPX CAILE A,1 GO %SDD TTCALL 3,[ASCIZ/KEYBOARD BUTTONS? (ELSE REGULAR). TYPE Y OR N: /] PUSHJ P,%YN TDZA A,A %SDD: MOVEI A,1 DAC A,DDSW ;SAVE DDSW LAC A,NSHIPX CAILE A,1 ;1 OR 2 PERSON GAME? GO %STD1 ;NO ASK ABOUT STANDARD FOR >2 TTCALL 3,[ASCIZ/THE "STANDARD" GAME IS: 1 CONSOLE, 2 TORPEDO TUBES, (NORMAL) SCORING, NO PARTIAL DAMAGE, NO HYPERSPACE, KILLER SUN. SHIPS START IN STANDARD POSITIONS. TYPE Y TO GET A STANDARD GAME: /] PUSHJ P,%YN GO %SELPM GO %STG2 ;STANDARD FOR 2. %STD1: TTCALL 3,[ASCIZ/THE "STANDARD" GAME IS: 1 CONSOLE, 2 TORPEDO TUBES, KILLER SCORING, NO PARTIAL DAMAGE, NO HYPERSPACE, KILLER SUN. SHIPS START IN STANDARD POSITIONS. TYPE Y TO GET A STANDARD GAME: /] PUSHJ P,%YN GO %SELPM ;SELECT PARAMETERS. MOVEI A,1 SETOM KILLER DAC A,KILLBN DAC A,DIEPEN %STG2: MOVEI A,1 DAC A,TUBES DZM DAMHIT DZM DOTEAM DZM HYPON DZM OLINE DZM RSPSWT DAC A,SELWRD MOVEI A,NMINE DAC A,NMINEX SETOM CNTR GO %GO %SELPM: TTCALL 3,[ASCIZ/SECOND CONSOLE? NUMBER ELSE RETURN: /] PUSHJ P,%DIGIN JUMPE A,%NOTHR ;NO OTHER SUBI A,24 ;RESET TO REASONABLENESS JUMPL A,%NOTHR CAILE A,5 GO %NOTHR ; CALCULATE SELECT BIT FOR DPYOUT MOVN B,A MOVSI C,400000 LSH C,(B) TRO C,10 ;MAKE IT A SELECT DAC C,SELWRD ;SAVE SELECTOR WORD TRO A,100 DAC A,OLINE ;SAVE AS THE OTHER LINE NUMBER GO %NOTHX %NOTHR: DZM OLINE MOVEI A,1 DAC A,SELWRD %NOTHX: IFG NMINE,< MOVEI A,NMINE TTCALL 3,[ASCIZ/HOW MANY SPACE-MINES DO YOU WANT? CHOOSE FROM 0 TO /] PUSHJ P,%DEC TTCALL 3,[ASCIZ/ /] PUSHJ P,%DIGIN CAILE A,NMINE MOVEI A,NMINE DAC A,NMINEX > TTCALL 3,[ASCIZ/PARTIAL DAMAGE? /] PUSHJ P,%YN TDZA A,A MOVEI A,1 DAC A,DAMHIT TTCALL 3,[ASCIZ/DISPLAY SCORES? /] PUSHJ P,%YN TDZA A,A MOVEI A,1 DAC A,CNTR TTCALL 3,[ASCIZ/TWO TORPEDO TUBES? /] PUSHJ P,%YN TDZA A,A MOVEI A,1 DAC A,TUBES SKIPN CNTR GO %NK LAC A,NSHIPX CAIE A,3 GO %NTS TTCALL 3,[ASCIZ/TEAM SCORES? /] PUSHJ P,%YN %NTS: TDZA A,A MOVEI A,1 DAC A,DOTEAM TTCALL 3,[ASCIZ/KILLER SCORE? /] PUSHJ P,%YN GO %NK SETOM KILLER MOVEI A,1 DAC A,KILLBN DAC A,DIEPEN %NK: DZM HYPON IFN HYPERS+NHYP,< TTCALL 3,[ASCIZ/HYPERSPACE? /] PUSHJ P,%YN TDZA A,A MOVEI A,1 DAC A,HYPON > TTCALL 3,[ASCIZ /"RANDOM" STARTING POSITIONS?/] PUSHJ P,%YN TDZA A,A MOVEI A,1 DAC A,RSPSWT %GO: LAC A,NSHIPX LAC B,%CDIR(A) LAC C,%IPOS(A) LAC D,%IROT(A) ZAC W, %IL: LAC X,0(B) DAC X,COUNTP(W) LAC X,0(C) DAC X,IPOS(W) LAC X,0(D) DAC X,IROT(W) ADDI B,1 ADDI C,1 ADDI D,1 ADDI W,1 SOJGE A,%IL GO %XIT SUBTTL MORE ONCE ONLY %XIT: SKIPE JOBDDT POPJ P, MOVEI A,SETALL-1 CORE A, ;CUT BACK THE CORE JFCL SETOM CLOBR POPJ P, ;RETURN %YN: TTCALL 4,A TTCALL 11, CAIE A,"Y" CAIN A,"y" AOS (P) POPJ P, %DEC: IDIVI A,12 HRLM B,(P) SKIPE A PUSHJ P,%DEC CDR A,(P) ADDI A,"0" TTCALL 1,A POPJ P, %DIGIN: ZAC A, %DIG1: TTCALL 4,B CAIL B,"0" CAILE B,"9" GO %DIG2 IMULI A,12 ADDI A,-"0"(B) GO %DIG1 %DIG2: TTCALL 11, POPJ P, SUBTTL CONSTANTS %CDIR: %CP124 %CP124 %CP3 %CP124 %CP5 %IPOS: %IP124 %IP124 %IP3 %IP124 %IP5 %IROT: %IRT12 %IRT12 %IRT3 %IRT4 %IRT5 %IP124: XWD -200000,200000 XWD 200000,-200000 XWD -200000,-200000 XWD 200000,200000 %IP3: XWD -240000,0 ;SHIP 1 AT TOP CENTER XWD 110000,220000 ;SHIP 2 AT 4 OCLOCK XWD 110000,-220000 ;SHIP 3 AT 8 OCLOCK %IP5: XWD -240000,0 XWD -50000,230000 XWD 200000,140000 XWD 200000,-140000 XWD -50000,-230000 %IRT4: 120 ;POINT TO THE SUN 20 60 160 %IRT12: 100 0 %IRT3: 100 153 25 %IRT5: 100 131 163 14 46 %CP124: LVW(640,640,i,a,5,5) LVW(-700,-700,i,a,5,5) LVW(-700,640,i,a,5,5) LVW(640,-700,i,a,5,5) %CP3: LVW(-40,640,i,a,5,5) LVW(640,-700,i,a,5,5) LVW(-700,-700,i,a,5,5) %CP5: LVW(-40,640,i,a,5,5) LVW(640,300,i,a,5,5) LVW(500,-700,i,a,5,5) LVW(-540,-700,i,a,5,5) LVW(-700,300,i,a,5,5) END STRT ;FINALLY, THE END