/SPCWAR BY D.E. WREGE VC8E=1 DK8EA=1 M1703=1 EAE=0 / / VERSION 3 / / / / / / / /COPYRIGHT (C) 1974 BY D.E. WREGE & ASSOC. / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY D.E. WREGE & ASSOCIATES. /D.E. WREGE & ASSOCIATES ASSUME NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO GEORGIA TECH. /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF THIS COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY D.E. WREGE /AND ASSOC. / /D.E. WREGE AND ASSOC. ASSUME NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /SPACE WAR. V3 /D.E. WREGE / ADDED VC8I SUPPORT - CHD /CONDITIONAL ASSEMBLY PARAMETERS IFNDEF EAE /FOR AX08 TYPE DISPLAY DEFINE AX08=1 IFNDEF AX08 /FOR TYPE 30G DISPLAY DEFINE T30G=1 IFNDEF T30G /FOR PDP-8/I OR POSIBUS VC8I DISPLAY VC8I=1 IFNDEF VC8I /FOR PDP-8/E VC8E DISPLAY VC8E=1 IFNDEF VC8E /PDP-12 - VR12 IS DEFAULT IFZERO VC8E+VC8I+T30G+AX08 IFNDEF PDP12 /CONDITIONAL ASSEMBLIES FOR CLOCK /FOR DK8-EA (60 CYCLE) DK8EA=1 IFNDEF DK8EA /FOR DK8-EP PROGRAMABLE DK8EP=1 IFNDEF DK8EP /FOR FRED DYER'S FUNNY CLOCK FCLOCK=1 IFNDEF FCLOCK /DEFAULT IS PDP-12 KW12-A IFNZRO PDP12 < IFZERO DK8EA+AX08+DK8EP+FCLOCK < IFNDEF KW12 >> IFNDEF KW12 /DEFS IFNZRO PDP12 < DIS= 140 /DISPLAY A POINT LINC MODE LINC= 6141 /GO TO LINC MODE PDP= 0002 /GO TO 8-MODE> IFNZRO EAE < MUY= 7405 /EAE MULTIPLY DVI= 7407 /EAE DIVIDE NMI= 7411 /EAE NORMALIZE SHL= 7413 /EAE SHIFT LEFT ASR= 7415 /ARITHMETIC SHIFT RIGHT LSR= 7417 /LOGICAL SHIFT RIGHT MQL= 7421 /LOAD MQ;CLEAR AC SCL= 7403 /STEP COUNTER LOAD FROM MEMORY SCA= 7441 /STEP COUNTER TO ACCUMULATOR MQA= 7501 /READ MQ CAM= CLA MQL > D= 10 /DISPLAY BUFFER FIELD DISBUF=4000 /ADDRESS OF DISPLAY BUFFER /PAGE ZERO CONSTANTS AND VARIABLES *1 JMP I .+1 INTRPT *6 QBETA, 0 /FOR PDP-12 QALPHA, 0 /ALPHA REG USED FOR DISPLAY QXR1, 0 /RESERVED XR'S QXR2, 0 QDISXR, 0 /FOR DISPLAY ROUTINE ONLY QXR3, 0 /MUST BE USED WITH IOF *20 /VARIABLES RESERVED QR, 0 /SHIP POSITION RADIAL ALIVE, 0 /=0 WHEN SHIP BLOWN UP /NON-ZERO OTHERWISE QXPOS, 0 /X COORD. QYPOS, 0 /Y COORD. QVX, 0 /X COMPONENT VELOCITY QVY, 0 /Y COMPONENT VELOCITY QPH, 0 /SHIP ANGLE (NOT POSITION DEPENDENT) QPHDOT, 0 /SHIP ANGULAR VELOCITY QPHR, 0 /PRECISION QPH SHIELD, 0 /NON-ZERO WHEN SHIELDS ARE UP. /WHEN SHIELDS ARE UP NO MISSELS /AND NO ACCELLERATION ALLOWED. HYPERS, 0 /NON-ZERO WHEN IN HYPERSPACE MISCNT, 1 /-# MISSLES LEFT ARMED, 0 /INCREMENTS TO 0 BEFORE SHIP /CAN FIRE QSHIP, 0 /POINT TO SHIP PICTURE QSHIPN, 0 /# POINTS TO BE DISPLAYED IN SHIP QSINPH, 0 /SIN(QPH) QCOSPH, 0 /COS(QPH) SHIPSZ=.-QR /#ENTRIES/SHIP QTIME, 3777 /TIME SCALING FACTOR /TEMPS AND VARIABLES QSINTH, 0 /SIN(QTH) QCOSTH, 0 /COS(QTH) BREAKU, 0 /NON-ZERO WHEN SHIP BREAKING UP. DBUFP, 0 /POINTS TO NEXT POS IN DISP BUFF. QTHR, 0 /NON-ZERO WHEN MAIN ROCKETS ON QTHA, 0 /NON-ZERO WHEN ANGULAR THRUST ON CONSER, 0 /NON-ZERO IF CONSERVING ANGULAR /MOMENTUM NUMMIS, 0 /# MISSELS IN MISTBL NNUMMI, 0 /TEMPORORY FOR UPDATING MISSLES MAXMIS, -7777 /NUMBER OF ALLOWABLE MISSELS QTM1, 0 /GENERAL TEMPORARYS QTM2, 0 QCNT1, 0 QCNT2, 0 QCNT3, 0 /MUST BE USED WITH IOF /CONSTANTS QTHRUS, 10 /THRUST QGRAV, 1000 /GRAVITY QRET, 4 /THRUST ANGULAR RETRO'S QTHROC, 1000 /MUSSEL VELOCITY OF ROCKETS /THE FOLLOWING ARE POINTERS & FLAGS PSAUCP, SAUC /POINTER TO SAUCER SHIP GENERATOR MISPNT, MISTBL /POINTS TO WHERE NEXT MISSEL SHOULD /GO IN MISSEL TABLE BOUNCX, NULL BOUNCY, NULL /NEW INSTRUCTIONS MULT=JMS I . XMULT DIVIDE=JMS I . XDIVID DISPLAY=JMS I . XDISPL COS=JMS I . /COSINE LOOKUP XCOSIN SIN=JMS I . /SINE LOOKUP XSINE GGRAV=JMS I . XGGRAV RANDOM=JMS I . XRANDOM ONDECK=JMS I . XONDECK OFDECK=JMS I . XOFDECK DRAW=JMS I . CALPNT NXTPOS=JMS I . NEWPOS NXTANG=JMS I . ANGLES FLAME=JMS I . DFLAME DSTARS=JMS I . SUN DSUN=JMS I . POLARS FIRE=JMS I . FIRONE /THESE DEFS ARE ONLY FOR INTERMEDIATE /STAGES OF DEVELOPMENT. IFDEF XXXXXX < /OR IFPASS2 IFNDEF XONDECK IFNDEF XOFDECK IFNDEF CALPNT IFNDEF NEWPOS IFNDEF ANGLES IFNDEF DFLAME IFNDEF SUN IFNDEF FIRONE IFNDEF SAUC IFNDEF XGGRAV IFNDEF BOUNX IFNDEF BOUNY IFNDEF MISTBL IFNDEF SPCWAR > XXXXXX=. HLT PAGE /SO WE HAVE START AT 200 JMP I .+1 SPCWAR /SIGNED MULTIPLY ROUTINE. /THIS ROUTINE DOES A INTEGER MULTIPLY OF /TWO SIGNED NUMBERS (11 BITS OF SIGNIF). /RESULT IS A SINGLE 12-BIT SIGNED NUMBER. /CALL: TAD (MLTCAND / JMS MULT / MLTPLR XMULT, 0 CLL /WILL SAVE IN LINK SPA /MULTIPLICAND POSITIVE? CMA CML IAC /NO: MAKE POS. REMEMBER SIGN IN LINK MQL /LOAD MULTIPLICAND INTO MQ TAD I XMULT /PICK UP MULTIPLIER ISZ XMULT /POINT TO RETURN SPA /POSITIVE?? CMA CML IAC /NO: MAKE POS AND REMEMBER SIGN DCA XMULT1 /FOR THE MULTIPLY CMA RAL /AC=-1 IF NEG;-2 IF POS. DCA XMULTS /SAVE IT FOR LATER MUY /EAE MULTIPLY XMULT1, 0 /MULTIPLYER GOES HERE SHL /WANT CORRECT NORMALIZATION 0 /ONE SHIFT ONLY DCA XMULT1 /REMEMBER HIGH ORDER MQA /READ LOW ORDER SPA CLA /SKIP IF NO ROUND UP IAC /ROUND UP ONE TAD XMULT1 /MAKE ROUNDED RESULT ISZ XMULTS /WILL SKIP IF NEG SIGN JMP I XMULT /DONE: AC=RESULT CIA /NEGATE JMP I XMULT /AND RETURN XMULTS, 0 /SAVES SIGN OF RESULT /DIVISION OF SIGNED DIVIDEND BY UNSIGNED DIVISOR. /EXIT WITH 12-BIT SIGNED RESULT. /DIVIDE OVERFLOW ONLY OCCURS WHEN DIVISOR=0 /CALL: TAD (DIVIDEND / DIVIDE / DIVISOR / ERROR /DIVISION BY 0 / NORMAL RET. /AC=SIGNED RESULT XDIVID, 0 CLL /FOR SIGN SPA /IS IT POSITIVE? CIA CML /NO:MAKE POS. MQL /PUT IN LOW ORDER CMA RAL /AC=-1 IF NEG. DCA XMULTS /SAVE SIGN TAD I XDIVID /GET DIVISOR ISZ XDIVID /POINT TO ERROR EXIT SNA /SKIP IF NOT ZERO JMP I XDIVID /TAKE DIV BY 0 RETURN ISZ XDIVID /POINT TO NORMAL RETURN DCA .+2 /STORE DIVISOR DVI /DO THE DIVISION 0 /HOLDS THE DIVISOR CLA;MQA /GET RESULT ISZ XMULTS /SKIP IF NEG JMP I XDIVID /POS=RETURN CIA /NEG=NEGATE JMP I XDIVID /AND RETURN /DISPLAY ROUTINE. REFRESHES OUT OF BUFFER IN FIELD D. /THIS IS FOR PDP-12 DISPLAY. USES QALPHA FOR REGISTER. /CALL: TAD (ADDR-1 /ADDR=ADDRESS OF BUFFER IN FIELD D / DISPLA /OF X,Y PAIRS. / -# POINTS XDISPL, 0 DCA QDISXR /ADDRESS INTO XR TAD I XDISPL /PICK UP # X,Y PAIRS ISZ XDISPL /POINT TO RETURN SNA /IF ZERO POINTS THEN EXIT JMP I XDISPL STL RAR //2 FOR POINT PAIRS DCA QCNT1 /STASH FOR COUNT CDF D /TO DISPLAY BUFFER FIELD IOF /FOR LINK MODE IFNZRO PDP12 < XDISL, TAD I QDISXR /GET THE X TAD (400 /0 IS CENTER OF SCREEN DCA QALPHA /STICK IN ALPHA REGISTER TAD I QDISXR /GET Y-POSITION LINC DIS QALPHA /DISPLAY THE POINT PDP /BACK TO 8-MODE CLA CLL /GET RID OF THE Y > IFNZRO T30G < TAD (3 /MAX INTENSITY 6074 /SET MAX INTENSITY CLA CLL XDISL, TAD I QDISXR /GET X CLL RAL /512 RESOLUTION TAD (1000 /TO CENTER OF SCREEN 6053 /CLEAR AND LOAD X CLA CLL TAD I QDISXR /GET Y CLL RAL /512 RESOLUTION TAD (1000 /TO CENTER OF SCREEN 6067 /CLEAR AND LOAD Y;DISPLAY CLA CLL 6161 /WAIT TILL DONE JMP .-1> IFNZRO VC8E < 6050 /CLEAR ALL FLAGS XDISL, TAD I QDISXR /GET X CLL RAL /512 RESOLUTION 6053 /CLEAR AND LOAD X CLA CLL TAD I QDISXR /GET Y CLL RAL /512 RESOLUTION 6054 /CLEAR AND LOAD Y CLA CLL 6052 /WAIT TILL DONE JMP .-1 6055 /INTENSIFY > IFNZRO VC8I < 6077 /MAX INTENSITY CLA CLL XDISL, TAD I QDISXR /GET X CLL RAL /512 RESOLUTION TAD (1000 /TO CENTER OF SCREEN 6052 /LOAD X CLA CLL TAD I QDISXR /GET Y CLL RAL /512 RESOLUTION TAD (1000 /TO CENTER OF SCREEN 6066 /LOAD Y; DISPLAY CLA CLL> IFNZRO AX08 < XDISL, TAD I QDISXR TAD (400 6303 /LOAD X CLA CLL TAD I QDISXR /GET Y 6317 /LOAD Y AND INTENS. CLA CLL > ISZ QCNT1 /SKIP WHEN DONE JMP XDISL /LOOP CDF 0 /BACK TO THIS FIELD JMP I XDISPL /AND RETURN /SINE LOOKUP ROUTINE. ANGLES ARE IN /FRACTIONS OF A CIRCLE. I.E. IN 256THS OF A CIRCL. /THUS PI RADIANS=200(8) /THE RESULT IS A SIGNED NUMBER -2048 JMS I (WARSUB /DO THE CALCS TAD HYPERS SZA CLA /SKIP IF NOT IN HYPERSPACE JMP WAR1E /IGNORE CHECKING JMS I (COLIDE /CHECK FOR COLLISION WITH SUN JMS I (BANG /START EXPLOSION WAR1E, TAD (SHIP1-1 OFDECK FLAME /DISPLAY FLAME /NOW FOR SHIP2 WARS2, TAD (SHIP2-1 ONDECK /NOW DO SHIP 2 TAD ALIVE /NOW TO SEE IF HE EXISTS SNA CLA /SKIP IF ALIVE JMP WARS3 /NOPE:GO TO SHIP2 TAD (-100 DCA STOVER /SOMEONE STILL ALIVE LAS /GET SWITCHES IFDEF M1703 < 6144 / USE M1703 INPUT > LSR;7 /OVER FOR WARSUB JMS I (WARSUB /DO THE CALCULATIONS TAD HYPERS SZA CLA /SKIP IF NOT IN HYPERSPACE JMP WAR2E /NO MORE CHECKING JMS I (COLIDE /COLLISION WITH SUN FIRST SKP JMS I (COLID1 /CHECK COLLISIONS JMS I (BANG /START THE EXPLOSION WAR2E, TAD (SHIP2-1 OFDECK FLAME /NOW FOR THE MISSLES WARS3, IOF JMS I (MISSLS /INTERRUPTS CAN BOMB HERE ION /AND ANY BREAKUP TAD BREAKUP SZA CLA /SKIP IF ANY JMS I (SCATTER /DO IT /NOW TO DISPLAY IT WARDIS, TAD DBUFP CIA TAD (DISBUF IOF /NO INTS IN LINC MODE DCA WARDX /FOR DISPLAY ROUTINE TAD (DISBUF-1 DISPLAY WARDX, 0 D1=DSUN D2=DSTARS DSUN /DISPLAY THE UNIVERSE OR SUN ION ISZ STOVER /DELAY FOR AUTO RESTART SKP JMP I (SPCWAR /START OVER IFNZRO FCLOCK+KW12+AX08+DK8EA+DK8EP < TAD WAIT SNA CLA JMP .-2 DCA WAIT> JMP WAR WAIT, 0 /-1 WHEN READY /SET BY INTERRUPT ROUTINE STOVER, 0 /DELAY FOR AUTO RESTART PAGE /SUBROUTINE TO DO ALL OF THE SHIP CALCULATIONS. /ENTER WITH BITS SET ACCORDING TO OPTIONS WARSUB, 0 DCA I (SWITCHES TAD I (SWITCHES RAR /ROCKET BIT TO LINK SZL CLA /SKIP IF NOT ON TAD QTHRUST /COPY THRUST INTO QTHR DCA QTHR /IF ROCKETS ON DCA HYPERS /TAKE OUT OF HYPERSPACE TAD I (SWITCHES AND (6 /MASK ROT BITS SNA /SKIP IF ANY ON JMP WAR1 DCA QTM1 /SAVE TAD QTM1 TAD (-6 /TO SEE IF HYPERSPACE SNA CLA /SKIP IF NOT HYPERSPACE JMS I (HYPER /GO INTO HYPERSPACE TAD HYPERS /IF IN HYPERSPACE DON'T DO SZA CLA /THE CALCULATIONS JMP I WARSUB TAD QTM1 RTR /GET CLOCKWISE INTO LINK CLA /GET RID OF OTHER BIT TAD QRET /RETRO CONSTANT SNL /SKIP IF CC CIA WAR1, DCA QTHA /SET RETRO THRUST TAD ARMED /TO SEE IF ALREADY ARMED SNA CLA /SKIP IF NOT YET JMP .+3 /ALREADY ARMED ISZ ARMED /UPDATE TIME DELAY JMP WAR2 /NOT ARMED. TAD I (SWITCHES /IS ARMED SO CHECK AND (10 /FIRE BIT. SZA CLA /SKIP IF NOT FIRING FIRE /FIRE A MISSLE. WAR2, NXTPOS /CALC NEW POSITION NXTANG /AND SHIP ANGLE DRAW /SET DISPLAY BUFFER PSAUC1, JMS I (SAUC /OR NOP FOR SHIPS JMP I WARSUB PAGE /COME HERE FROM INTERRUPT SAVAC, 0 SAVLK, 0 INTRPT, DCA SAVAC /SAVE ACCUMULATOR RAR DCA SAVLK /AND LINK KSF /KEYBOARD? JMP .+4 KRB /READ THE CHAR DCA ICHAR /STORE JMP I OPTIONS TSF /TELEPRINTER JMP CLKINT /NO CHECK CLOCK TCF /CLEAR THAT FLAG DCA TELSW /SET NOT IN PROGRESS SWITCH JMP I OPTIONS TELSW, 0 ICHAR, 0 DELAY1, 0 CLKINT, IFNZRO KW12+DK8EP < CLSK /SKIP IF CLOCK JMP INTEXT /QUIT (UNDEFINED INT?) CLSA /CLEAR THE FLAGS > IFNZRO FCLOCK < 6131 /SKIP IF NOT FLAG SKP JMP INTEXT /NOPE 6132 /RECONNECT TO INT > IFNZRO DK8EA < 6133 /SKIP ON CLOCK JMP INTEXT /NOPE 6131 /MAKE SURE INT STILL ENABLED ISZ DELAY1 /WANT 30/SEC JMP INTEXT /NOPE: NEXT TIME CLL STA RTL /-2 DCA DELAY1 /RESET DELAY1 > IFNZRO AX08 < 6321 /SKIP IF CLOCK JMP INTEXT /WHO??? 6352 /CLEAR CLOCK ISZ DELAY1 JMP INTEXT /NOT YET TAD CLKLIM /RESET INTRPS DCA DELAY1 /DELAY INTERVAL > STA /AND SET WAITING DCA I (WAIT INTEXT, 6402 /LINK 6412 IFNZRO T30G <6161;NOP> CLA CLL TAD SAVLK /GET LINK RAL CLL TAD SAVAC /AND AC. RMF /RESTORE FIELDS ION /AND RESTOR INTERRUPTS JMP I 0 /RETURN TO PROGRAM /GO BACK TO SPCWAR OPTION, KBOARD JMP INTEXT IFNZRO KW12+DK8EP < /SUBROUTINE TO START UP CLOCK /MAY BE HARDWARE DEPENDENT /THIS IS FOR KW12A CLOCK - PDP12 /OR PROGRAMABLE PDP8E CLOCK DK8EP CLSK=6131 /SKIP IF CLOCK CLLR=6132 /LOAD CONTROL CLAB=6133 /AC TO BUFFER PRESET CLEN=6134 /LOAD ENABLE CLSA=6135 /BIT RESET FLAGS STCLK, 0 CLA CLL /JUST IN CASE IFNZRO PDP12 TAD (-40 /ABOUT 30CPS CLAB /LOAD PRSET CLA CLL IFNZRO PDP12 < TAD (0100 /1KC - PRESET TIME CLLR /LOAD CONTROL CLSA /CLEAR STATUS AND POSSIBLE OVERFLOW CLA CLL TAD (300 /INTERRUPT ON OVERFLOW CLEN CLA CLL TAD (4100 /AND START UP CLOCK > IFNZRO DK8EP < /TAD (5300 /INTR ON CLOCK - 1KC TAD (5310 /INTR ON CLOCK - 1KC (Josh Dersch) > CLLR CLA CLL JMP I STCLK> IFNZRO FCLOCK < /DYER'S FUNNY CLOCK STCLK, 0 6132 JMP I STCLK> IFNZRO DK8EA < /DK8EA (LINE CLOCK) STCLK, 0 CLL STA RTL /-2 DCA DELAY1 /RESET DELAY1 6131 /ENABLE INTERRUPTS JMP I STCLK> IFNZRO AX08 < STCLK, 0 CLA CLL TAD (400 6346 /START CRYSTAL CLOCK TAD CLKLIM /INITIALIZE CLOCK DCA DELAY1 JMP I STCLK CLKLIM, 7400 > IFZERO KW12+AX08+FCLOCK+DK8EA+DK8EP < STCLK, 0 JMP I STCLK> PAGE KBOARD, JMS GETC /GET THE CHAR JMS DISPCH /DISPATCH ON CHAR -"P;OPHLAT -"C;OCURVE -"F;OSTARS /FIELD OF STARS -"Z;OSUN /POLARIS ONLY -"B;OBOUNCE /BOUNCE MODE -"W;OWRAP /WRAP AROUND -"A;OANGUL /ANGULAR MOMENT CONSERVE -"N;ONORM /NO ANG MOM CONS. -"G;OGRAV /RESET GRAVITY -"M;OMISSL /RESET NUMB MISSLES -"R;ORETRO /RESET RETRO CONSTANT -"T;OTHRUS /RESET THRUST CONSTANT -"S;OSHIPS /DISPLAY SHIPS -"V;OVELOC /MUSSEL VELOCITY OF MISSILES -"U;OUFO /DISPLAY UFO'S -"O;OOPTION /LIST OPTIONS -203;7600 /^C RETURN TO MONITOR 0 /END OF LIST JMP I (SPCWAR /START OVER /DISPATCH ON ACCUMULATOR DISPCH, 0 DCA OTM1 /TEMP STASH TAD I DISPCH /GET COMPARISON ISZ DISPCH SNA /0 MEANS DONE JMP I DISPCH /NOT IN LIST TAD OTM1 /CHECK AGAINST CAHR SNA CLA /SKIP IF NO MATCH JMP .+3 /MATCH ISZ DISPCH /TO NEXT CHAR JMP DISPCH+2 /CONTINUE TAD I DISPCH /FOUND IT DCA DISPCH /DO DOUBLE INDIRECT JMP I DISPCH OTM1, 0 /PRINT A MESSAGE PRMSG, 0 TAD I PRMSG /GET ADD OF MESSAGE DCA OTM1 /STORE POINTER ISZ PRMSG /NORMAL EXIT PRST1, TAD I OTM1 RTR;RTR;RTR /OVER FOR PRINT JMS PRCHR /PRINT LEFT HALF TAD I OTM1 JMS PRCHR /PRINT RIGHT HALF ISZ OTM1 /NEXT WORD JMP PRST1 /LOOP PRCHR, 0 AND (77 SNA JMP I PRMSG /IF ZERO QUIT TAD (-40 /FOR EXTEND SPA /SKIP IF NEUMERIC TAD (100 /IS ALPHA TAD (240 /BACK TO CORRECT JMS PCH /PRINT ROUTINE JMP I PRCHR /PRINT A CHARACTER ROUTINE PCH, 0 TLS /OUTPUT IT DCA I (TELSW /SET TTY INPROGRESS JMS I (OPTIONS /AND WAIT TILL FINISHED TAD I (TELSW /KEYBOARD INTERRUPT SZA JMP .-3 /NOT YET JMP I PCH /DONE. /GET AN INPUT CHARACTER GETC, 0 TAD I (ICHAR /FROM INTERRUPT SERVICE SZA /GOT ONE? JMP .+3 /YEP JMS I (OPTIONS /WAIT SOME MORE JMP GETC+1 DCA CHAR DCA I (ICHAR TAD CHAR JMP I GETC /AND RETURN WITH CHAR CHAR, 0 CRLF, 0 TAD (215 JMS PCH TAD (212 JMS PCH JMP I CRLF REINITIALIZE, JMS I (OPTIONS JMP KBOARD /TURN ON BOUNCE OBOUNC, TAD (BOUNX DCA BOUNCX TAD (BOUNY DCA BOUNCY JMS PRMSG /TELL HIME MBOUNC JMS CRLF JMP REINIT PAGE /ROUTINE TO DISABLE BOUNCE OWRAP, TAD (NULL DCA BOUNCX TAD (NULL DCA BOUNCY JMS I (PRMSG MWRAP JMS I (CRLF JMP I (REINIT /ROUTINE TO CONSERVE ANGULAR MOM OANGUL, CLA IAC DCA CONSER JMS I (PRMSG MANGCON JMS I (CRLF JMP I (REINIT ONORM, DCA CONSER JMS I (PRMSG MNORMAL JMS I (CRLF JMP I (REINIT /ROUTINE TO INPUT AN OCTAL NUMBER FROM THE KEYBOARD. /CALL: JMS OCTAL / RET1 /NO INPUT / RET2 /AC=OCTAL NUMBER OCTALX, 0 DCA NUMB DCA INPUT OCTALL, JMS I (GETC JMS I (PCH /AND PRINT IT TAD I (CHAR TAD (-"8 SMA /SKIP IF <"8 JMP NUMBEX /EXIT TAD ("8-"0 /NOW CHECK FOR OCTAL SPA /SKIP IF OK JMP NUMBEX /NO=QUIT DCA INPUT /SAVE NUMBER TAD NUMB /GET LAST NUMBER CLL RAL;CLL RAL;CLL RAL TAD INPUT /STICK IN NEW NUMBER DCA NUMB ISZ INPUT /MAKE SURE NON-ZERO JMP OCTALL NUMBEX, CLA CLL TAD INPUT /TO SEE IF ANY SZA CLA ISZ OCTALX /TAKE YES RETURN JMS I (CRLF TAD NUMB /STICK NUMBER IN AC JMP I OCTALX /AND RETURN NUMB, 0 INPUT, 0 OGRAV, JMS I (PRMSG /TELL HIM WHAT OPTION IS MGRAVY JMS OCTALX /GET NEW VALUE JMP I (REINIT /NO INPUT DCA QGRAV /SET VALUE TAD (KBOARD /REINITIALIZE DCA I (OPTIONS JMS I (SETGRV /SET UP TABLE TAD QGRAV /NOW TO SEE IF ANTI-GRAV. SMA CLA /SKIP IF YES JMP I (WAR-2 JMS I (PRMSG MAGRAV /ANTI GRAVITY JMS I (CRLF TAD (KBOARD DCA I (OPTIONS JMP I (WAR-2 OMISSL, JMS I (PRMSG MMISSLS JMS OCTALX /GET A NUMBER JMP I (REINIT CIA /SET MISSEL CONSTANT DCA MAXMIS /SET CONSTANT JMP I (REINIT /DONE /ROUTINE TO READJUST THRUST OTHRUS, JMS I (PRMSG MTHRUS JMS OCTALX JMP I (REINIT CLL RTL DCA QTHRUS JMP I (REINIT /ROUTINE TO SET RETRO CONSTANT ORETRO, JMS I (PRMSG MRETRO JMS OCTALX JMP I (REINIT DCA QRET JMP I (REINIT /ROUTINE TO PRINT LOTS OF MESSAGES MMESG, 0 JMS I (CRLF /NEW LINE TAD I MMESG /GET START OF MESSAGE SNA /SKIP IF MORE TO COME JMP I MMESG DCA .+2 JMS I (PRMSG /PRINT IT 0 ISZ MMESG /NEXT LINE JMP MMESG+1 /MORE /PRINT OPTIONS PAGE OOPTIO, JMS I (MMESG MOPTA MOPTB MOPTBA MOPTC MOPTD MOPTE MOPTF MCURVE MPHLAT MSTARS MSUN MBOUNC MWRAP MANGCO MNORMA MMISSL MTHRUS MRETRO MVELOX 0 JMP I (REINIT /DISPLAY SAUCERS (UFO'S) OUFO, JMS I (PRMSG MUFO JMS I (CRLF TAD (JMS I PSAUCP DCA I (PSAUC1 TAD (NOP DCA I (PSAUC2 TAD (SAUC1 DCA I (SHIP1+QSHIP-QR TAD (SAUC1E-SAUC1 DCA I (SHIP1+QSHIPN-QR TAD (SAUC2 DCA I (SHIP2+QSHIP-QR TAD (SAUC2E-SAUC2 DCA I (SHIP2+QSHIPN-QR OUFOR, TAD (KBOARD DCA I (OPTIONS JMP I (WAR-2 /DISPLAY SHIPS OSHIPS, JMS I (PRMSG MSHIPS JMS I (CRLF TAD OSHIPJ DCA I (PSAUC2 TAD (NOP DCA I (PSAUC1 TAD (SHIP1C DCA I (SHIP1+QSHIP-QR TAD (SHIP1E-SHIP1C DCA I (SHIP1+QSHIPN-QR TAD (SHIP2C DCA I (SHIP2+QSHIP-QR TAD (SHIP2E-SHIP2C DCA I (SHIP2+QSHIPN-QR JMP OUFOR OSHIPJ, PSAUC2+3&177+5200 PAGE /RESET MUSSEL VELOCITY OF ROCKETS OVELOC, JMS I (PRMSG MVELOX JMS I (OCTALX JMP I (REINIT CLL RAR DCA QTHROC /RESET MUSSLE VELOCITY JMP I (REINIT /SELECT FLAT OR CURVED SPACE OPHLAT, JMS I (PRMSG MPHLAT JMS I (CRLF CLA TAD (3777 DCA QTIME /NO TIME CURVE ON OUTLINE TAD (SC DCA I (NEWPO7+1 TAD (SC DCA I (NEWPO7+11 JMP I (REINIT OCURVE, JMS I (PRMSG MCURVE JMS I (CRLF CLA TAD (SC1 DCA I (NEWPO7+1 TAD (SC2 DCA I (NEWPO7+11 JMP I (REINIT /DISPLAY OPTIONAL SUN OR UNIVERSE OSTARS, JMS I (PRMSG MSTARS JMS I (CRLF CLA TAD (D2 DCA I (WARDX+1 JMP I (REINIT OSUN, JMS I (PRMSG MSUN JMS I (CRLF CLA TAD (D1 DCA I (WARDX+1 JMP I (REINIT PAGE MVELOX, TEXT \VELOCITY INITIAL OF MISSLES(2000):\ MOPTA, TEXT \OPTIONS ARE DESIGNATED BY FIRST CHARACTER\ MOPTB, TEXT \THE NUMBER IN PARENS ARE "NORMAL" VALUES\ MOPTBA, TEXT \INPUT NUMBERS ARE OCTAL\ MOPTC, TEXT \AVAILABLE OPTIONS ARE:\ MOPTD, TEXT \U DISPLAY UFO'S\ MOPTE, TEXT \S DISPLAY SHIPS\ MSUN, TEXT 'Z POLARIS ONLY' MOPTF, TEXT \G RESET GRAVITY CONSTANT(1000)\ MUFO, TEXT \DISPLAY UFO'S\ MSHIPS, TEXT \DISPLAY SHIPS\ MCURVE, TEXT 'CURVED SPACE' MPHLAT, TEXT 'PHLAT SPACE' MSTARS, TEXT 'FIELD OF STARS' MBOUNC, TEXT \BOUNCE ON\ MWRAP, TEXT \WRAP-AROUND ON\ MANGCO, TEXT \ANGULAR MOMENTUM\ MNORMA, TEXT \NON-ANGULAR MOMENTUM\ MGRAVY, TEXT \STRENGTH OF GRAVITY(1000):\ MAGRAV, TEXT \ANTI-GRAVITY\ MMISSL, TEXT \MAX NUMBER MISSLES:\ MTHRUS, TEXT \THRUST CONSTANT (2):\ MRETRO, TEXT \RETRO-THRUST (4):\ PAGE IFNZRO D < XXX=. FIELD D%10 *1000> DECIMAL BIGSUN, 0;0 6;4; -6;-4; 0;7; 0;-7; -6;4; 6;-4 -14;0; 14;0; -7;-12; 7;12; 7;-12; -7;12 0;-21; 0;21; 19;-11; -19;11; 19;11; -19;-11 14;-25; -14;25; 28;0; -28;0; 14;25; -14;-25 0;35; 0;-35; 20;30; -20;-30; -20;30; 20;-30 0;0 ESUN=. IFNZRO 0 < -2;12; 0;12; 3;12; -4;11; -1;11; 1;11; 4;11; 6;11 -6;10; -3;10; 2;10; 4;10; 8;10; -8;9; -4;9; -2;9; 0;9 4;9; 6;9; 7;9; -8;8; -6;8; -3;8; 2;8; 6;8; 8;8; 10;8; -10;7 8;7; 9;7; -8;6; -5;6; 0;6; 3;6; 10;6; 11;6; -11;5; -9;5 -2;5; 5;5; 7;5; 9;5; 11;5; -7;4; 3;4; 12;4; -10;3 -4;3; -1;3; 1;3; 7;3; 10;3; 11;3; -12;2 -11;2; -6;2; 4;2; 12;2; 13;2 -11;1; -10;1; -8;1; -2;1; 1;1; 8;1; 11;1; -12;0; 10;0 -5;0; 6;0; 13;0; -11;-1; -3;-1; 0;-1; 3;-1; 9;-1; 12;-1; -12;-2; -10;-2 -8;-1; -6;-2; -1;-2; 7;-2; 11;-2; 12;-2; -9;-3; -4;-3 4;-3; 11;-3; -11;-4; -9;-4; -7;-4; -1;-4; 2;-4; 7;-4 10;-4; 12;-4; 11;-5; -11;-6; -9;-6 -8;-6; -6;-6; 4;-6; 6;-6; 8;-6; 9;-6; 11;-6; -10;-7 -8;-7; -2;-7; 1;-7 -8;-8; -6;-8; 6;-8; 8;-8; 9;-8; -8;-9; -6;-9; -4;-9; 4;-9; 7;-9 -6;-10; -2;-10; 0;-10; 2;-10; 4;-10; 5;-10; 7;-10; -5;-11; -3;-11; -1;-11 2;-11; 5;-11; -3;-12; -1;-12; 1;-12; 3;-12 ESUN=. > PAGE SUNPT1, /STAR FIELD /ORION SIGNUS URSIA MAJOR SCORPIO 18;-174; 62;108; -102;31; -128;250 47;-171; 106;85; -88;20; -128;242 33;-194; 91;91; -91;9; -139;225 40;-191; 71;88; -91;-23; -146;216 /SOME MISC. -149;-213 /IN PUPPIS -84;-168 /PROCYON 113;-46 /IN ANDROMEDA -11;77 /ELTANIN /ORION SIGNUS URSIA MAJOR SCORPIO 47;-188; 73;74; -73;-20; -153;213 26;-211; 47;85; -102;-9; -164;194 66;-199; 29;74; -88;-3; -175;196 55;120; -182;199 /PLUS SOME MISCELLANEOUS -117;188 -168;71 /ARCTURUS 6;6;-6;-6 /SOME SUN SPOTS 208;-105 /NECK OF CETUS 208;102 /IN AQUARIUS -241;17 /SPICA /CASEOPEA CANUS MAJOR PLEIADES 62;-23; -18;-253; 117;-110 73;-20; -29;-239; 117;-108 73;-11; -18;-228; 113;-111 88;-9; -44;-222; 113;-108 80;0; -51;-213 -102;-239 -77;-239 -66;-248 -66;-219 -57;-222 /PLUS SOME MISCELLANEOUS 6;-6;-6;6 /MORE SUN SPOTS -230;159 /IN LIBRA -200;-139 /ALPHARD SUNPT2, 0;1; 0;-1; 1;0; -1;0 0;2; 0;-2; 2;0; -2;0 0;4; 0;-4; 4;0; -4;0 0;6; 0;-6; 6;0; -6;0 /VAIRABLES START HERE /BRIGHT STARS 146;-29 /IN ANDROMEDA 80;-143 /ALDEBARAN IN TAURUS -109;100 /ALPHECCA IN CORONA BOREALIS 153;-68 /IN ARIES /LEO SAGITARIUS GEMINI PEGASIS -200;-17; -18;250; -55;-114; 168;102 -222;-43; 4;250; -69;-120; 160;40 -200;-43; 15;242; -73;-128; 193;46 10;0;0;10;-10;0;0;-10 /MORE SUN -186;-37; 40;242; -58;-125; 164;0 /BRIGHT STARS -190;145 /IN LIBRA 11;105 /LYRA 69;-63 /MIRFAK IN PERSEUS 164;-63 /IN ARIES /LEO SAGITARIUS GEMINI PEGASIS -200;-71; 51;239; -44;-122; 200;0 -168;-71; 66;228; -33;-117 -182;-85; 51;228; -58;-151 -171;-83; 62;246; -58;-137 /BRIGHT STARS -168;-240 /IN PUPPIS -222;137 /IN LIBRA -208;29 /IN VIRGO 88;157 /ALTAIR 0;12;12;0;-12;0;0;-12 /MOR SUN /LEO SAGITARIUS GEMINI PEGASIS -146;-85; 66;239; -29;-137 -146;-77; -22;-154 -33;-159 /AURIGA 26;-88;47;-114;29;-128;4;-97 4;4;4;-4;-4;4;-4;-4 /MORE SUN 0;0 IFZERO EAE < OCTAL FIELD 0 / DIGITAL-8-17 EAE EMULATION FOLLOWS. / (PAGE ZERO LAYOUT IS CHANGED AND CODE RELOCATED.) *160 MQL=JMS I . PSDMQL DVI=JMS I . PSDDVI MUY=JMS I . PSDMUY NMI=JMS I . PSDNMI SHL=JMS I . PSDSHL ASR=JMS I . PSDASR LSR=JMS I . PSDLSR SCA=JMS I . PSDSCA MQA=JMS I . PSDMQA CAM=JMS I . PSDCAM /FIXTAB / PSDMQL /*67 SUDOMQ, 0 SUDOSC, 0 / PSDMQL / PSDDVI / MQLDVI / PSDMUY / MQLMUY / PSDNMI / PSDSHL / PSDASR / PSDLSR / PSDSCA / PSDMQA / PSDCAM *7300 PSDNMI, 0 /NMI DCA PSDSCA /SAVE AC DCA SUDOSC /CLEAR STEP COUNTER. TAD PSDSCA SZA JMP .+5 TAD SUDOMQ SNA CLA JMP I PSDNMI /0 AC AND MQ. NMIBK2, TAD PSDSCA RAL SZL JMP NMIOUT /AC0=1 SPA JMP NMIOUT+2 /AC0=0 AND AC1=1 CLA /AC0=AC1=0 NMIBCK, TAD SUDOMQ CLL RAL DCA SUDOMQ TAD PSDSCA RAL DCA PSDSCA ISZ SUDOSC JMP NMIBK2 NMIOUT, SPA JMP .+3 /AC0=AC1=1 RAR /AC0 DOES NOT EQUAL AC1 JMP I PSDNMI /EXIT RAR /TEST IF NUMBER 6000 0000 TAD .+11 SZA CLA JMP NMIBCK /NOT 6000 TAD SUDOMQ SZA JMP NMIBCK+1 /NOT 0000 CML /RESTORE LINK TAD PSDSCA /RESTORE 6000 JMP I PSDNMI /EXIT -6000 PSDSCA, 0 /SCA DCA PSDMQA /INCLUSIVE OR TAD PSDMQA /STEP COUNTER CMA /AND AC AND SUDOSC TAD PSDMQA JMP I PSDSCA PSDMQA, 0 /MQA DCA PSDSCA /INCLUSIVE OR TAD PSDSCA /MQ CMA /AND AC AND SUDOMQ TAD PSDSCA JMP I PSDMQA *PSDNMI+100 PSDMQL, 0 /MQL DCA Z SUDOMQ JMP I PSDMQL PSDCAM, 0 /CAM (CLA!MQL) CLA DCA Z SUDOMQ JMP I PSDCAM MQLMUY, 0 /MQL!MUY DCA Z SUDOMQ TAD MQLMUY /SET UP DCA PSDMUY /FOR MUY SUBROUTINE JMP PSDMUY+1 MQLDVI, 0 /MQL!DVI DCA Z SUDOMQ TAD MQLDVI /SET UP DCA PSDDVI /FOR DVI SUBROUTINE JMP PSDDVI+1 37 PSDSHL, 0 /SHL DCA PSDCAM /SAVE AC TAD I PSDSHL /SHIFT COUNT ISZ PSDSHL /EXIT POINT AND PSDSHL-1 /5 BIT COUNTER CMA DCA SUDOSC TAD SUDOMQ /SHIFT COMBINED CLL RAL /AC AND MQ DCA SUDOMQ /1 BIT TO THE TAD PSDCAM /LEFT RAL DCA PSDCAM ISZ SUDOSC JMP .-7 /MORE SHIFTING TAD PSDCAM JMP I PSDSHL /EXIT PSDLSR, 0 /LSR DCA PSDCAM /SAVE AC TAD PSDLSR /USE ASR DCA PSDASR /ROUTINE CLL JMP PSDASR+5 PSDASR, 0 /ASR CLL /SET LINK=SIGN SPA CML DCA PSDCAM /SAVE AC TAD I PSDASR /SHIFT COUNT ISZ PSDASR /EXIT POINT AND PSDSHL-1 /5 BIT COUNTER CMA DCA SUDOSC TAD PSDCAM /RESTORE AC JMP .+4 TAD PSDCAM SPA CML RAR DCA PSDCAM TAD SUDOMQ RAR DCA SUDOMQ CLL ISZ SUDOSC JMP .-12 /MORE SHIFTING TAD PSDCAM SPA CML /LINK=AC0 JMP I PSDASR 7763 PSDDVI, 0 /DVI DCA PSDCAM /SAVE HIGH ORDER DIVIDEND TAD I PSDDVI /DIVISOR ISZ PSDDVI /EXIT POINT CLL CMA IAC DCA MQLMUY /2'S COMPLEMENT OF DIVISOR TAD PSDCAM /HIGH ORDER DIVIDEND TAD MQLMUY SZL CLA JMP I PSDDVI /DIVIDE OVERFLOW TAD PSDDVI-1 /7763 DCA PSDLSR /COUNTER JMP .+11 TAD PSDCAM RAL DCA PSDCAM TAD PSDCAM TAD MQLMUY SZL DCA PSDCAM CLA TAD SUDOMQ RAL DCA SUDOMQ ISZ PSDLSR JMP .-14 TAD PSDCAM /COUNT EXHAUSTED JMP I PSDDVI /EXIT PSDMUY, 0 /MUY CLA CLL DCA MQLDVI /CLEAR PRODUCT (MOST SIG.) REGISTER TAD PSDDVI-1 DCA PSDLSR /LOOP COUNTER TAD I PSDMUY DCA PSDMQL /OPERAND ISZ PSDMUY /EXIT POINT JMP .+10 TAD MQLDVI SNL JMP .+3 CLL TAD PSDMQL RAR DCA MQLDVI TAD SUDOMQ RAR DCA SUDOMQ /LOW ORDER PRODUCT ISZ PSDLSR JMP .-13 TAD MQLDVI /HIGH ORDER PRODUCT JMP I PSDMUY /EXIT /PAUSE > $