X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=sw%2Fspacewar%2Fhachti%2FSPACE.PA;fp=sw%2Fspacewar%2Fhachti%2FSPACE.PA;h=f93b2270a7aad4a1d13b125fcedd74d33ba36588;hb=038c5eb837b64393d02d3b0729c5d2ebb87a97e4;hp=0000000000000000000000000000000000000000;hpb=834f78cb89c269555ab80c4056eb1e023cc51f5a;p=pdp8.git diff --git a/sw/spacewar/hachti/SPACE.PA b/sw/spacewar/hachti/SPACE.PA new file mode 100644 index 0000000..f93b227 --- /dev/null +++ b/sw/spacewar/hachti/SPACE.PA @@ -0,0 +1,2437 @@ +/ SPACE WAR +/ +/ INTERPLANETARY DEATH AND DESTRUCTION ON YOUR +/ LAB-8/E +/ +/ HACHTI VARIANT FOR LAB-8/E +/ +/ EVAN SUITS +/ +/ THIS VERSION WORKS OFF EITHER THE BLUE RIBBON CONNECTOR OR THE +/ SR. WHEN THE PROGRAM IS STARTED (AT 0200) OR RESTARTED THE +/ SR WILL BE TESTED AND IF =0000 WILL BE USED FOR THE COMMAND +/ INPUT. OTHERWISE, THE BLUE RIBBON CONNECTOR (AX08 * C0-C7 * +/ XR OPTION ONLY) CONTINGENCY INPUTS WILL BE USED. +/ +/ WHEN THE PROGRAM IS STARTED THE TWO SHIPS SHOULD +/ APPEAR ON THE SCREEN WITH SHIP 'ONE' ON THE LEFT, SHIP +/ 'TWO' ON THE RIGHT. +/ +/ THE COMMAND WORD BIT ASSIGNMENTS ARE: +/ +/ SR BIT: C: FUNCTION: +/ +/ 0 0 SHIP ONE ROTATES LEFT +/ +/ 1 1 SHIP ONE ROTATES RIGHT +/ +/ 2 2 SHIP ONE ACCELERATES +/ +/ 3 3 SHIP ONE FIRES +/ +/ +/ +/ 8 4 SHIP TWO ROTATES LEFT +/ +/ 9 5 SHIP TWO ROTATES RIGHT +/ +/ 10 6 SHIP TWO ACCELERATES +/ +/ 11 7 SHIP TWO FIRES +/ +/ +/ +/ NOTE THAT TURNING RIGHT AND LEFT SIMULTANEOUSLY THROWS +/ THE SHIP INTO HYPERSPACE. IN THE CURRENT VERSION THE ODDS +/ ARE IN FAVOR OF YOUR MAKING IT BACK SAFELY. THE GAME IS OVER +/ WHEN ONE OR BOTH OF THE SHIPS HAVE BEEN DESTROYED AND THE +/ WINNER (IF ANY) IS IN NORMAL SPACE. WHEN THE WINNER +/ HAS BEEN ANNOUNCED, HIT ANY TTY KEY TO RESTART. +/ + + +/**************************************************************** + +/*************************** +/ CLOCK OPERATIONS + +CLZE=6130 / CLEAR CLOCK ENABLE REGISTER PER AC +CLSK=6131 / SKIP ON CLOCK FLAG +CLOE=6132 / SET CLOCK ENABLE REGISTER PER AC +CLAB=6133 / AC REGISTER TO CLOCK COUNTER REGISTER +CLEN=6134 / CLOCK ENABLE REGISTER TO AC +CLSA=6135 / STATUS TO AC +CLBA=6136 / CLOCK BUFFER REGISTER TO AC +CLCA=6137 / CLOCK COUNTER REGISTER TO AC + +/ BITS IN CLOCK ENABLE REGISTER +CREXT=0100 / EXTERNAL SOURCE +CR2=0200 / 10**2 per second +CR3=0300 / 10**3 per second +CR4=0400 / 10**4 per second +CR5=0500 / 10**5 per second +CR6=0600 / 10**6 per second + +COVSTAT=4000 +CMFREE=0000 / 4096 FIXED FREE RUN +CMPROG=1000 / PROGRAMMED DELAY + +CADC=0040 / START ADC ON OVERFLOW +CINH=0020 / INHIBIT CLOCK +CION=0010 / INTERRUPT ENABLE + +CEV3=0004 / EVENT 3 ENABLED +CEV2=0002 / EVENT 2 ENABLED +CEV1=00001 / EVENT 1 ENABLED + +/ VC8-E OPCODES +DIXY=6055 / INTENSIFY +DILX=6053 / LOAD X +DILY=6054 / LOAD Y +DILE=6056 / LOAD ENABLES FROM A +DISD=6052 / TEST FOR READY + +/**************************************************************** +/ SYMBOL DEFINITIONS FOR PAL8-PAL10 + +XRIN=NOP / DIGITAL INPUT? +XRCL=NOP + +/DSB=XXXX / SET BRIGHTNESS - MUST BE COMMENTED OUT!!! + +DXC=JMS I IVCLDX / X VALUE CONTROL? +DYC=JMS I IVCLDY / Y VALUE CONTROL? + +DXL=0000 / X VALUE LOAD FLAG? +DYL=0000 / Y VALUE LOAD FLAG? +DIS=0000 / ANOTHER STRANGE FLAG + +/CRF=NOP / WHICH FLAG??? +/CCF=NOP / ?? + + +/**************************************************************** +/ +/ THIS PROGRAM RELIES ON THE PROGRAM INTERUPT FACILITY FOR +/ REAL WORLD TIMING PURPOSES. +/ + + *0 + + 0 /EFFECTIVE JMS 0 ON PROGRAM INTERUPT + JMP I 2 /EXIT IMMEDIATLY TO SERVICE ROUTINE + INTSER + +EMPTY, 0 /THESE LOCATIONS ARE RESERVED FOR +ODT1, 0 /DEBUGGERS, ETC. +ODT2, 0 +ODT3, 0 + +/ +/ ALL THE AUTO INDEX REGISTERS ARE NAMED BUT NOT ALL OF +/ THEM ARE USED. THE STATUS OF ANY GIVEN REGISTER CANNOT +/ BE DETERMINED AT ANY TIME EXCEPT BY CAREFUL INSPECTION OF +/ THE CODE. +/ + + *10 + +AUTO10, 0 +AUTO11, 0 +AUTO12, 0 +AUTO13, 0 +AUTO14, 0 +AUTO15, 0 +AUTO16, 0 +AUTO17, 0 + +/ +/ THE FOLLOWING ARE THE DATA FILES FOR THE TWO SPACE SHIPS +/ AS WELL AS CERTAIN OTHER PARAMETERS FOR CALCULATING POSITIONS +/ AND SO ON. THE ORDER OF THE LOCATIONS MUST BE PRESERVED +/ ALTHOUGH THE SIZE OF THE TABLES MAY BE VARIED +/ + + *20 + +ONEOUT, 0 /IF NON-ZERO CONTAINS REAMINING TIME OF EXPLOSION +ONECNT, 0 /NUMBER OF POINTS IN FIGURE TO BE DISPLAYED +ONEFLG, 0 /IN OR OUT OF NORMAL SPACE +ONETHE, 0 /ANGLE OF ORIENTATION ON SCREEN +ONEVEX, 0 /X COMPONENT OF VELOCITY +ONEVEY, 0 /Y COMPONENT OF VELOCITY +ONEPEX, 0 /X POSITION (12 BITS) +ONEPEY, 0 /Y POSITION (12 BITS) +ONESIN, 0 /SINE OF ANGLE +ONECOS, 0 /COSINE OF ANGLE +ONEFIN, 0 /SET WHEN EXPLOSION DIES OUT + +TWOOUT, 0 /SAME CONTENT AND ORDER +TWOCNT, 0 /AS ABOVE +TWOFLG, 0 +TWOTHE, 0 +TWOVEX, 0 +TWOVEY, 0 +TWOPEX, 0 +TWOPEY, 0 +TWOSIN, 0 +TWOCOS, 0 +TWOFIN, 0 + + +/ +/ THESE LOCATIONS ARE USED BY THE "VECTOR GENERATOR" IN +/ DISPLAYING THE FIGURES. A FOUR DOT VECTOR WILL BE DRAWN +/ FROM XONE,YONE TO XTWO,YTWO WITH STEPS OF SIZE DIXTEM,DIYTEM +/ + +XONEDS, 0 +YONEDS, 0 +XTWODS, 0 +YTWODS, 0 +DIXTEM, 0 +DIYTEM, 0 +DISCNT, 0 + + +/ +/ THE NEXT LOCATIONS ARE USED BY CALPOS TO DO A FAST +/ MULTIPLY TO HELP CALCULATE THE DISPLAY FILES. +/ +T10SIN, 0 +T20SIN, 0 +T30SIN, 0 +T10COS, 0 +T20COS, 0 +T30COS, 0 + +CALSIN, 0 +CALCOS, 0 + +/ +/ NOW COME THE VARIOUS ODDS AND ENDS ONE USUALLY FINDS ON +/ PAGE ZERO +/ + +SINE, SINEIN +COSINE, COSINI +MULT, MULTI +RSHIFT, SHIFTR +VECTOR, DISPLY +CALPOS, POSCAL +INTWRD, 0 +INTCNT, 0 +/CLOCK, 0 +HYPER, HYPSET +MESOUT, CHARS +THEADJ, THEAJI +VEESCL, VEELIM +ISHFT, DISHFT +RESET1, RESE1 +GAMOVR, 0 +ACCFLG, 0 +ACCPER, -30 +MEXP, -400 + +PROX, 0 +PROY, 0 +PROLIF, -360 +BUFTMP, 0 +ONEFIL, DISBUF +TWOFIL, DISBUF+40 + +P5, 5 +P10, 10 +P17, 17 +P20, 20 +P37, 37 +P40, 40 +P100, 100 +P132, 132 +P200, 200 +P400, 400 +P550, 550 +P3777, 3777 + +M4, -4 +M6, -6 +M10, -10 +M11, -11 +M264, -264 +M200, -200 +M400, -400 +M550, -550 + +IVCLDX, VCLDX +IVCLDY, VCLDY + +/ +/ THE PROGRAM MAY BE STARTED OR RESTARTED AT ANYTIME AT 0200. +/ THE DATA FILE ON PAGE ZERO IS CLEARED, ALL FLAGS INITIALIZED, +/ AND THE SR EXAMINED. IF THE SR=0 THE DISPLAY UPDATE ROUTINES +/ ARE SET TO PICK UP THE STATUS WORD FROM THE SR. IF THE SR +/ DOES NOT EQUAL ZERO, THE STATUS WORD IS READ FROM THE EIGHT +/ CONTINGENCY INPUTS ON THE BLUE RIBBON CONNECTOR OF THE AX08 +/ (XR OPTION ONLY). JUMP IS THEN TO THE DISPLAY +/ FILE UPDATE TO START OFF THE GAME. +/ + +CDI=6201 + + *200 + + CDI 0 / SET FIELD0 + +START, CAF /START OR RESTART HERE ANY OLD TIME + + DIXY /TO GET THE VC8-E STARTED ONCE + LAS /SR +/TMP SNA CLA + TAD SWRD /USE THE SR + TAD XROPT /USE THE BLUE RIBBON CONNECTOR + DCA COLDST /AND LEAVE IN THE TRAP LOCATION + +RESTRT, CLA CMA + XRCL + CLA CLL + + TAD P17 /FIRST CLEAR THE POSITION AND DATA + DCA AUTO10 /TABLES OF THE TWO SHIPS + TAD TABLEN + DCA AUTO11 + DCA I AUTO10 + ISZ AUTO11 + JMP .-2 + + TAD STRT1 /SET THE STARTING POSITIONS OF THE + DCA ONEPEX /TWO SHIPS + TAD STRT2 + DCA TWOPEX + TAD P37 /SET TRIG FUNCTIONS JUST IN CASE + DCA ONECOS + TAD P37 + DCA TWOCOS /ZERO DEGREES IS POINTING STRAIGHT UP + TAD ACCPER /SET COUNT FOR VELOCITY INCREASE + DCA ACCFLG + DCA ONEFIN /CLEAR ALL GAME END FLAGS + DCA TWOFIN + DCA GAMOVR + JMS I BUFSET /RESET ALL PROJECTILE DISPLAY BUFFERS + + + TCF /CLEAR OTHER REMAINING LIKELY FLAGS + PCF +/ RRB + + 6405 / CLEAR INTERRUPT ENABLE OF KERMIT'S SER PORT :-( + + CLA CMA / ALL ONES + CLZE / CLEAR CLOCK CONFIG REGISTER + CLA + TAD CDELY / LOAD NEG DELAY + CLAB / LOAD TO CLOCK BUFFER + CLA + TAD CCNF / LOAD CLOCK CONFIG + CLOE / SET CONFIG BITS + + CLA CLL + JMP COLDST /AND GO TO IT + +CCNF, CR4+CMPROG+CION+COVSTAT / CLOCK CONFIGURATION +CDELY, -310 / COUNTER PRESET (200) + +/ +/ UPDATE IS REACHED WHENEVER THE PROGRAM IS STARTED OR THE +/ CLOCK COUNT OVERFLOWS INDICATING TIME TO RECALCULATE THE +/ THE DISPLAY FILES AND REFRESH THE DISPLAY. THE INTERUPT +/ COUNT IS RESTORED, THE STATUS WORD IS PICKED UP FROM EITHER +/ THE SR OR BRC, AND THE RECALCULATION PROCESS BEGUN. +/ + +UPDATE, CLA CLL /HERE ON CLOCK COUNT OVERFLOW. + /START NEXT SWEEP +COLDST, 0 /TRAP TO READ SR OR BRC + LAS /HERE FOR SR + DCA INTWRD /STORE TEMPORARILY + TAD INTWRD /MASK OUT LEFTMOST 4 BITS + RTR /FOR NUMBER ONE + RTR + AND LFTHAF + DCA INTTEM /AND STORE + TAD INTWRD /MASK OUT RIGHTMOST BITS FOR NUMBER TWO + AND RYTHAF + TAD INTTEM /ADD TOGETHER + JMP .+3 /AND CONTINUE + +CODST, XRIN /HERE FOR BRC - PICK UP AND CLEAR + XRCL + DCA INTWRD /CONTINUE + TAD M550 /RESTORE INTERUPT COUNT BEFORE NEXT + DCA INTCNT /UPDATE + ION /GET READY FOR THE NEXT CYCLE + TAD ACCFLG /ALLOW VELOCITY INCREASE THIS TIME? + IAC /ONLY WHEN ACCFLG=0 + SMA SZA + TAD ACCPER /IF ZERO, RESET COUNT + DCA ACCFLG + + JMP I .+1 /NOW GET DOWN TO WORK. + ONEUP + +BUFSET, SETBUF +TABLEN, AUTO17-CALCOS +INTTEM, 0 +LFTHAF, 0360 +RYTHAF, 0017 +STRT1, 1000 +STRT2, -1000 +SWRD, 2000-CODST +XROPT, JMP CODST + + + +/ +/ THIS IS THE INTERUPT SERVICE ROUTINE. MOST OF THE +/ INTERUPTS WILL BE FROM THE CRYSTAL CLOCK WHICH WILL BE +/ COUNTED AND UNLESS THE COUNT OVERFLOWS THE INTERUPT IS +/ DISMISSED IMMEDIATLY. IF THE COUNT OVER FLOWS, JMP IS TO +/ UPDATE WITH IOF. +/ +/ SPECIAL CASE IS KEYBOARD INTERUPT WHEN THE GAMOVR FLAG IS +/ SET IN WHICH CASE THE GAME IS RESTARTED. +/ +/ UNEXPECTED INTERUPTS ARE COUNTED AND AFTER ENOUGH OF THEM +/ HAPPEN THE PROGRAM HALTS. IF THIS HAPPENS RELOAD OR FIND THE +/ STRANGE FLAG +/ + +INTSER, DCA INTACC /HERE RIGHT AFTER INTERUPT - STORE + RAR /AC AND LINK + DCA INTLNK /FOR POSSIBLE CONTINUATION + + CLSK /WAS IT THE CRYSTAL CLOCK? + JMP INTBUS /NO TRY SOMETHING ELSE + + CLA IAC RTR /LOAD 4000 + CLSA /GET CLOCKSTATUS AND RESET FLAG + CLA CLL + JMP UPDATE /YES, GO TO IT + +INTBUS, /HERE ON NON-CLOCK INTERUPT + + KSF + JMP NOKEY /NOT THE KEYBOARD, THAT'S BAD! + +KBDIN, KCC /CLEAR KEYBOARD FLAG + + KRB / RESET FLAG, CLEAR AC, READ DATA + AND KPAR / MASK OUT PARITY + TAD NCTRLC / ADD -3 (CTRL-C) + SNA CLA + JMP I KBOOT / REBOOT! + + TAD GAMOVR /IS THE GAMEOVER + SZA CLA + JMP RESTRT /YES, RESTART + + KRB + AND KPAR + TAD NCTRLD + SNA CLA + JMP RESTRT + + JMP INTRET + +NOKEY, / STILL NOT FOUND INTERRUPT SOURCE :-( + TSF / SKIP IF PRINTER FLAG SET + JMP BADDIE / NOT THE PRINTER, NO NEW IDEAS - BAD + TCF / CLEAR THAT FLAG + JMP INTRET / AND GO HOME + +KBOOT, 7600 +KPAR, 177 / ANTI-PARITY MASK +NCTRLC, 7775 / -3 (CTRL-C) +NCTRLD, 7774 / -3 (CTRL-D) + + +BADDIE, ISZ INTGLH /COUNT ONE BADDIE + SKP + HLT /HALT IF TOO MANY BADDIES + +INTRET, CLA CLL /HERE TO DISMISS THE INTERUPT + + PCF +/ RRB + + TAD INTLNK + RAL + TAD INTACC + ION + JMP I 0 + +INTACC, 0 +INTLNK, 0 +INTGLH, 0 + + + +/ +/ NOW BEGINS THE GREAT UPDATE PROCEEDURE, FIRST FOR SHIP +/ NUMBER ONE (THE DELTA SHAPED SHIP WHICH APPEARS ON +/ THE LEFT AT THE START OF THE GAME). IF ALIVE THE STATUS +/ WORD (INTWRD) IS TESTED FOR REQUESTS FOR LEFT TURN, +/ RIGHT TURN, THRUST ON, AND LAUNCH PROJECTILE. THESE ACTIONS +/ MAY OR MAY NOT BE ACTED UPON DEPENDING ON COUNTS AND FLAGS. +/ WHEN THIS IS COMPLETE THE SAME OPERATION IS PERFORMED FOR +/ NUMBER TWO. +/ + + *400 + +ONEUP, TAD ONEFLG /FIRST SEE IF IT'S IN NORMAL SPACE + SNA + JMP ONEOK /YES IT IS + IAC /NO, BUT IS IT JUST COMING OUT? + SNA + TAD ONEFIN /YES, THROW BACK IN IF ALREADY DESTROYED + DCA ONEFLG /OTHERWISE JUST COUNT ONE + JMP I ITWOUP /AND GO TO FIX UP NUMBER TWO + +ONEOK, TAD ONEOUT /IN NORMAL SPACE - IS IT EXPLODING? + SZA CLA + JMP ONEFIG /IF YES, ALLOW NO CONTROLS + TAD TWOFIN /HAS THE ENEMY BEEN VANQUISHED? + SZA CLA + JMS I ONEWN /YES, SIGNAL VICTORY + TAD INTWRD /NOW BEGIN TEST OF REQUEST + AND OP300 /LEFT AND RIGHT TURN TOGETHER MEAN HYPERSPACE! + TAD OM300 /TEST BITS 4 AND 5 + SZA CLA + JMP ONELEF /NOPE, CONTINUE + CMA /YES, CALL HYPER WITH AC=-1 FOR NUMBER ONE + JMP I HYPER +ONELEF, TAD INTWRD /REQUEST FOR LEFT TURN? + AND P200 /TEST BIT 4 + SNA CLA + JMP ONERYT /NO + CLA CLL CMA /YES DECREMENT ANGLE + JMP ONEFIG + +ONERYT, TAD INTWRD /HOW ABOUT RIGHT TURN + AND P100 /TEST BIT 5 + SZA CLA + IAC /YES, INCREMENT ANGLE + +ONEFIG, TAD ONETHE /PICK UP AND ADJUST ANGLE (MAYBE) + JMS I THEADJ /BRING BACK WITHIN LIMITS OF TRIG FUNCTIONS + DCA ONETHE /AND STORE + TAD ONETHE /FIND THEM TRIG FUNCTIONS + JMS I SINE /AND STORE ONCE AND FOR ALL + DCA ONESIN /IN THE APPROPRIATE PLACES + TAD ONETHE + JMS I COSINE + DCA ONECOS + TAD ONEOUT /DO NOT ALLOW THRUST IF EXPLODING + SZA CLA + JMP ONEVEL + + + + +ONEMOV, TAD ACCFLG /ALLOW ANY VELOCITY INCREASE THIS CYCLE? + SZA CLA + JMP ONEVEL /NOPE + TAD INTWRD /YES, ANY REQUESTED? + AND P40 /TEST BIT 6 + SNA CLA + JMP ONEVEL /NONE REQUESTED + TAD ONECOS /YES, ADD IN VELOCITY INCREMENT DEPENDING + TAD ONEVEY /ON ORIENTATION + JMS I VEESCL /BUT DO NOT ALLOW TO EXCEED MAXIMUM + DCA ONEVEY /AND STORE + TAD ONESIN /DO THE SAME FOR THE OTHER (X) COMPONENT + TAD ONEVEX + JMS I VEESCL + DCA ONEVEX + + + +ONEVEL, TAD ONEVEX /NOW UPDATE THE POSITION WITH THE + JMS I ISHFT /VELOCITY COMPONENTS DIVIDED BY 4 + JMS I ISHFT /THIS MAINTAINS MAXIMUM RESOLUTION + TAD ONEPEX + DCA ONEPEX /IGNORE ANY OVERFLOW + TAD ONEVEY /DO THE SAME FOR Y COORDINATE + JMS I ISHFT /AND VELOCITY COMPONENT + JMS I ISHFT + TAD ONEPEY + DCA ONEPEY + TAD ONEOUT /DO NOT ALLOW PROJECTILE LAUNCH IF + SZA CLA /EXPLODING + JMP I ITWOUP + + + + +ONELNC, TAD LNC1FG /OTHERWISE, SEE IF RELOAD IS FINISHED + SNA CLA + JMP .+3 + ISZ LNC1FG /NO, CONTINUE RELOADING + JMP I ITWOUP /AND EXIT + TAD INTWRD /YES, READY TO LAUNCH, TRIGGER BEEN PULLED? + AND P20 /TEST BIT7 + SNA CLA + JMP I ITWOUP /NO, WAIT FOR A BETTER SHOT + /.....I GUESS..... + TAD PROLIF /YES, SET CYCLE COUNT FOR THIS LAUNCH + DCA I AUTO16 /AUTO16 ALWAYS POINTS AT THE NEXT SLOT IN THE FILE + TAD ONEVEX /ADD SHIPS VELOCITY (SCALED OF COURSE) + JMS I ISHFT /TO ORIENTATION TO EXTABLISH X VELOCITY + JMS I RSHIFT /COMPONENT OF PROJECTILE + TAD ONESIN + JMS I RSHIFT /AND STICK IT IN THE FILE + DCA I AUTO16 + TAD ONESIN /MOVE THE LAUNCH POINT OUTSIDE THE + CLL RTL /SHIP OF ORIGIN + TAD ONEPEX + DCA I AUTO16 /AND STORE X POSITION + TAD ONEVEY /NOW DO THE SAME FOR THE Y VELOCITY AND + JMS I ISHFT /POSITION + JMS I RSHIFT + TAD ONECOS + JMS I RSHIFT + DCA I AUTO16 + TAD ONECOS + CLL RTL + TAD ONEPEY + DCA I AUTO16 + TAD M200 /START RELOAD CYCLE + DCA LNC1FG + JMS I RESET1 /RESET AUTO16 TO NEXT HOLE + + JMP I .+1 /NOW TO FIX IT UP WITH NUMBER TWO +ITWOUP, TWOUP + +LNC1FG, 0 /PROJECTILE LAUNCH ENABLE + +OP300, 300 /HYPERSPACE REQUEST CODE BITS 4 AND 5 +OM300, -300 +ONEWN, ONEWIN /POINTER TO VICTORY MESSAGE + + + +/ +/ HERE BEGINS THE UPDATE PROCEEDURE FOR SHIP NUMBER TWO. +/ OPERATION IS THE SAME AS FOR NUMBER ONE ABOVE. +/ + + *600 + +TWOUP, TAD TWOFLG /FIRST SEE IF IT'S IN NORMAL SPACE + SNA + JMP TWOOK /YES, CONTINUE + IAC /NO, BUMP COUNT AND TEST FOR REENTRY + SNA + TAD TWOFIN /IF RE-ENTERING THROW BACK OUT IF FINISHED + DCA TWOFLG /AND CONTINUE + JMP I IONEST + +TWOOK, TAD TWOOUT /HERE WHEN READY TO UPDATE IN NORMAL SPACE + SZA CLA /IS IT EXPLODING? + JMP TWOFIG /YES DO NOT ALLOW HYPERSPACE + TAD ONEFIN /DID WE JUST WIN? + SZA CLA + JMS I TWOWN /YES ENABLE END OF GAME MESSAGE + TAD INTWRD /TEST FOR HYPERSPACE REQUEST + AND OP14 + TAD OM14 /BITS 8 AND 9 MUST BE SET + SNA CLA + JMP I HYPER /8 AND 9 SET. ENTER HYPER ROUTINE WITH AC=0 + /FOR SHIP NUMBER 2 +TWOLEF, TAD INTWRD /TEST FOR LEFT TURN - BIT 8 + AND P10 + SNA CLA + JMP TWORYT /NOT SET + CLA CLL CMA /SET, DECREMENT TWOTHE BY 1 DEGREE + JMP TWOFIG /SKIP TEST FOR RIGHT TURN + +TWORYT, CLA CLL IAC RTL /TEST FOR RIGHT TURN - BIT 9 + AND INTWRD + SZA CLA + IAC /IF SET INCREMENT TWOTHE BY 1 DEGREE + +TWOFIG, TAD TWOTHE /UPDTAE TWOTHE + JMS I THEADJ /BRING TO WITHIN LIMITS OF SINE,COSINE + DCA TWOTHE /AND STORE + TAD TWOTHE + JMS I SINE /CALCULATE SINE AND COSINE FUNCTIONS + DCA TWOSIN /AND STORE IN DATA TABLE + TAD TWOTHE + JMS I COSINE + DCA TWOCOS + TAD TWOOUT /DO NOT ALLOW VELOCITY CHANGE IF EXPLODING + SZA CLA + JMP TWOVEL + + + + +TWOMOV, TAD ACCFLG /NOW FOR ACCELERATION. TEST TO SEE IF ALLOWED + SZA CLA /DURING THIS UPDATE CYCLE + JMP TWOVEL /NOPE + CLL IAC RAL /YES, TEST FOR BIT 2 SET + AND INTWRD + SNA CLA + JMP TWOVEL /NOT SET + + TAD TWOSIN /UPDATE X VELOCITY COMPONENT BY SINE OF + TAD TWOVEX /ANGLE OF ORIENTATION + JMS I VEESCL /AND SCALE TO NOT EXCEED MAX + DCA TWOVEX /UPDATE Y COMPONENT WITH COSINE + + TAD TWOCOS + TAD TWOVEY + JMS I VEESCL + DCA TWOVEY + + + +TWOVEL, TAD TWOVEX /NOW UPDATE THE POSITION WITH THE VELOCITY + JMS I ISHFT /COMPONENTS/16 + JMS I ISHFT + TAD TWOPEX + DCA TWOPEX + TAD TWOVEY + JMS I ISHFT + JMS I ISHFT + TAD TWOPEY + DCA TWOPEY + TAD TWOOUT + SZA CLA + JMP I IONEST + + + + +TWOLNC, TAD LNC2FG /NOW CHECK FOR PROJECTILE LAUNCH. FIRST + SNA CLA /TEST TO SEE IF RELOAD COMPLETE + JMP .+3 + ISZ LNC2FG /NO, COUNT ONE CYCLE AND EXIT + JMP I IONEST + IAC /YES, TEST TRIGGER BIT 11 + AND INTWRD + SNA CLA + JMP I IONEST /NOT SET, HELL WITH IT + + TAD PROLIF /OK, SET PROJECTILE LIFE + DCA I AUTO16 /AUTO16 IS ALWAYS POINTING AT THE NEXT SLOT + TAD TWOVEX /ADD SHIPS VELOCITY + JMS I ISHFT /(ADJUSTED) + JMS I RSHIFT + TAD TWOSIN /TO THAT OF PROJECTILE - AGAIN X COMPONENT + JMS I RSHIFT /FROM SINE OF ANGLE OF ORIENTATION + DCA I AUTO16 + TAD TWOSIN /SET INITIAL POSITION TO BE JUST AHEAD + CLL RTL /OF THE SHIP + TAD TWOPEX /X COMPONENT + DCA I AUTO16 + TAD TWOVEY /NOW THE Y COMPONENTS FROM Y VELOCITY + JMS I ISHFT /Y POSITION AND COSINE + JMS I RSHIFT + TAD TWOCOS + JMS I RSHIFT + DCA I AUTO16 + TAD TWOCOS + CLL RTL + TAD TWOPEY + DCA I AUTO16 + TAD M200 + DCA LNC2FG /200 CYCLES OF RELOAD + JMS I RESET1 /DRINK LEADEN DEATH, NUMBER ONE! + + JMP I .+1 /FINAL EXIT TO DISPLAY FILE CALCULATIONS +IONEST, ONESET + +LNC2FG, 0 /RELOAD COUNT + +OP14, 14 /HYPERSPACE CODE +OM14, -14 +TWOWN, TWOWIN + + + +/ +/ HERE BEGINS THE DISPLAY CALCULATIONS FOR THE TWO SHIPS. AT +/ THIS POINT ONLY THE POSITION AND ORIENTATION OF EACH VESSEL +/ IS ONF INTEREST SINCE THE VELOCITY AND ALL THAT HAVE ALREADY +/ BEEN TAKEN CARE OF. FOR THE BOTH SHIPS THE DISPLAY FILES ARE +/ CALCULATED AS A SERIES OF PAIRS OF X,Y COORDINATES. BETWEEN +/ EACH PAIR OF POINTS A FOUR POINT VECTOR WILL BE DRAWN. THE +/ ACTUAL COORDINATES ARE CALCULATED AS DISPLACEMENTS +/ FROM THE CENTRAL PSOTION OF THE SHIP, TAKING INTO ACCOUNT THE +/ ANGLE OF ORIENTATION. THE FORMULAS FOLLOWED ARE: +/ +/ X(POINT)=X(BASE)+X(REL)*COS[THE]+Y(REL)*SINE[THE] +/ +/ Y(POINT)=Y(BASE)+Y(REL)*COS[THE]-X(REL)*SINE[THE] +/ +/ WHERE SINE[THE] AND COS[THE] ARE THE FUNCTIONS OF THE +/ ANGLE OF ORIENTATION, X(BASE) AND Y(BASE) ARE THE +/ COORDINATES OF THE SHIPS POSITION AND X(REL) AND Y(REL) +/ CORRESPOND TO DISPLACEMENT PAIRS DEPENDING ON THE SHAPE +/ OF THE FIGURE. ALL X AND Y RELS LIE WITHIN THE RANGE 0-3 AND +/ THERE FORE ALL NECESSARY DISPLACEMENTS FROM BASE COORDINATES +/ MAY BE CALCULATEDFROM DIFFERENT COMBINATIONS OF T10SIN, T20COS +/ ETC. THESE VALUES ARE CALCULATED BY A CALL TO POSCAL WITH THE SINE +/ AND COSINE OF THE ANGLE OF INTEREST IN CALSIN AND CALCOS. +/ +/ FOLLOWING THIS METHOD ANY FIGURE DESCRIBABLE WITH A 7 BY 7 +/ MATRIX OF POINTS MAY BE QUICKLY CALCULATED. +/ +/ BEGINNING AT ONESET DIFFERENT DISPLACEMENT PAIRS ARE CALCULATED +/ AND DEPOSITIED THROUGH AUTO10 TO FORM THE DISPLAY FILE FOR SHIP NUMBER ONE. +/ + + + *1000 + +ONESET, CLA CLL /BEGIN DISPLAY FILE FOR NUMBER ONE + TAD ONEFLG /DONT BOTHER IF NOT IN NORMAL SPACE + SZA CLA + JMP I ITWOST + TAD ONESIN /SET UP FOR MATRIX COMPONENT CALCULATIONS + DCA CALSIN + TAD ONECOS + DCA CALCOS + JMS I CALPOS /CALL THE CALCULATOR + +/ +/ CONSIDER THE 7 BY 7 MATRIX OF DISPLACEMENT POINTS WITH THE +/ CENTER AT 0,0 CORRESPONDING TO THE SHIPS POSITION. A SERIES +/ OF POINTS IS NOW DESCRIBED AROUND THIS CENTER USING THE +/ MULTIPLES OF THE TRIG FUNCTIONS JUST CALCULATED +/ SO THAT ANY POINT ON THE OUTLINE IS DESCRIBABLE AS X,Y +/ DISPLACED BY X,Y OF THE SHIP ITSELF +/ + + TAD ONEFIL /SET UP AUTO10 AS THE DISPLAY FILE + DCA AUTO10 /POINTER + TAD ONEPEX /THE FIRST POINT OF THE OUTLINE IS + TAD T30SIN + DCA I AUTO10 / 0,3 OR TOP CENTER + TAD ONEPEY + TAD T30COS + DCA I AUTO10 + + TAD T10COS + CIA /THE SECOND IS + TAD ONEPEX + DCA I AUTO10 / -1,0 + TAD T10SIN /OR JUST LEFT OF DEAD CENTER + TAD ONEPEY /AND SO ON + DCA I AUTO10 + + TAD T30SIN + TAD T30COS /THE THIRD POINT IS + CIA + TAD ONEPEX / -3,-3 + DCA I AUTO10 + TAD T30COS /OR BOTTOM LEFT HAND CORNER + CIA + TAD T30SIN + TAD ONEPEY + DCA I AUTO10 + + + + + TAD T10SIN + CIA /FOURTH POINT + TAD ONEPEX + DCA I AUTO10 / 0,-1 + TAD T10COS + CIA /OR JUST BELOW CENTER + TAD ONEPEY + DCA I AUTO10 + +FLAM1, TAD INTWRD /TEST FOR POWER ON. IF ON, DRAW THE + AND P40 /FLAME WITH AN EXTRA POINT SOME + SNA CLA /DISTANCE DIRECTLY BELOW THE SHIP + JMP ONECON /POWER NOT ON - CONTINUE + TAD ONEOUT /DO NOT ALLOW IF EXPLODING + SZA CLA + JMP ONECON + + TAD ONFG1 /USE ONFG1 TO TURN THE FLAME ON AND + SNA /OFF TO MAKE IT FLICKER. DISPLAY THE + CLA CLL CMA RAL /FLAME ONE TIME OUT OF THREE + DCA ONFG1 + + ISZ ONFG1 + JMP ONECON /ONE OUT OF THREE TIMES THIS WILL SKIP + + TAD ONFG2 /VARY ALSO THE LENGHT OF THE FLAME + CMA /WITH LONG SHORT LONG SHORT + DCA ONFG2 + + TAD ONFG2 /TIP OF FLAME AT EITHER + SNA CLA + TAD T10SIN / 0,-4 OR + TAD T30SIN / 0,-3 + CIA + TAD ONEPEX + DCA I AUTO10 + TAD ONFG2 + SNA CLA + TAD T10COS + TAD T30COS + CIA + TAD ONEPEY + DCA I AUTO10 + + TAD T10SIN + CIA + TAD ONEPEX /RETURN DISPLAY TO 0,-1 + DCA I AUTO10 + TAD T10COS + CIA + TAD ONEPEY + DCA I AUTO10 + CLA CLL CMA RAL /ADD -2 TO POINT COUNT + + + + +ONECON, TAD M6 /SET POINT COUNT TO -6 OR -8 + DCA ONECNT + + TAD T30SIN /CONTINUE WITH DISPLAY FILE - THIS POINT + CIA + TAD T30COS / AT 3,-3 + TAD ONEPEX / + DCA I AUTO10 /OR LOWER RIGHT HAND CORNER + TAD T30SIN + TAD T30COS + CIA + TAD ONEPEY + DCA I AUTO10 + + TAD T10COS /NEXT + TAD ONEPEX / + DCA I AUTO10 / 1,0 + TAD T10SIN / + CIA / OR JUST RIGHT OF CENTER + TAD ONEPEY + DCA I AUTO10 + + TAD T30SIN /FINALLY BACK TO + TAD ONEPEX / + DCA I AUTO10 / 0,3 + TAD T30COS / + TAD ONEPEY / TOP CENTE + DCA I AUTO10 + + JMP I ITWOST /NOW FOR NUMBER TWO +ITWOST, TWOSET + +ONFG1, 0 /USED TO COUNT FLICKERS +ONFG2, 0 /SHORT OR LONG FLAG + + + +/ +/ HERE BEGINS THE DISPLAY FILE GENERATOR FOR SHIP TWO. +/ IT WORKS JUST LIKE THE ONE FOR NUMBER ONE BUT WITH +/ DIFFERENT DISPLACEMENT PAIRS AND TWO EXTRA POINTS +/ + + *1200 + +TWOSET, CLA CLL /DONT BOTHER IF NOT IN NORMAL SPACE + TAD TWOFLG + SZA CLA + JMP I IFILDS + TAD TWOSIN /SET UP TO HAVE DISPLACEMENT INCREMENTS + DCA CALSIN /CALCULATED + TAD TWOCOS + DCA CALCOS + JMS I CALPOS + + TAD TWOFIL /SET AUTO10 TO POINT TO SECOND DISPLAY + DCA AUTO10 /FILE + TAD T30SIN /FIRST POINT AT + TAD TWOPEX / + DCA I AUTO10 / 0,3 + TAD T30COS / + TAD TWOPEY / OR TOP CENTER + DCA I AUTO10 + + TAD T20COS + CIA + TAD T20SIN + TAD TWOPEX + DCA I AUTO10 + TAD T20SIN + TAD T20COS /SECOND POINT + TAD TWOPEY / -2,2 + DCA I AUTO10 + + TAD T20COS /THIRD POINT + CIA / -2,0 + TAD TWOPEX + DCA I AUTO10 + TAD T20SIN + TAD TWOPEY + DCA I AUTO10 + + + + TAD T20COS + TAD T30SIN + CIA + TAD TWOPEX /FOURTH POINT + DCA I AUTO10 / -2,-3 + TAD T30COS + CIA + TAD T20SIN + TAD TWOPEY + DCA I AUTO10 + + + + + TAD T20SIN + CIA /NEXT + TAD TWOPEX / 0,-2 + DCA I AUTO10 + TAD T20COS + CIA + TAD TWOPEY + DCA I AUTO10 + +FLAM2, CLA CLL IAC RAL /NOW THE FLAME BIT. CHECK FOR POWER ON + AND INTWRD + SNA CLA + JMP TWOCON /NO, FORGET IT + TAD TWOOUT /NOT ALLOWED IF EXPLODING + SZA CLA + JMP TWOCON + + TAD TWFG1 /SET THE 1-3 FLICKER AS WITH #1 + SNA + CLA CLL CMA RAL + DCA TWFG1 + + ISZ TWFG1 /ALSO THE LENGHT VARIATION + JMP TWOCON + + TAD TWFG2 /EVERY OTHER TIME LONG + CMA + DCA TWFG2 + /FLAME TIP AT EITHER + TAD TWFG2 / 0,-3 + SNA CLA /OR + TAD T20SIN / 0,-5 + TAD T30SIN + CIA + TAD TWOPEX + DCA I AUTO10 + TAD TWFG2 + SNA CLA + TAD T20COS + TAD T30COS + CIA + TAD TWOPEY + DCA I AUTO10 + + TAD T20SIN /NOW BACK UP TO THE SHIP + CIA + TAD TWOPEX + DCA I AUTO10 + TAD T20COS + CIA + TAD TWOPEY + DCA I AUTO10 + + CLA CLL CMA RAL /ADD -2 TO POINT COUNT + + + + +TWOCON, TAD M10 /SET POINT COUNT TO -8 OR -10 + DCA TWOCNT + + TAD T30SIN /CONTINUE WITH DISPLAY FILE + CIA /NEXT POINT AT 2,-3 + TAD T20COS + TAD TWOPEX + DCA I AUTO10 + TAD T30COS + TAD T20SIN + CIA + TAD TWOPEY + DCA I AUTO10 + + + + TAD T20COS /NEXT POINT + TAD TWOPEX / + DCA I AUTO10 / 2,0 + TAD T20SIN + CIA + TAD TWOPEY + DCA I AUTO10 + + TAD T20COS /AND THE NEXT AT + TAD T20SIN + TAD TWOPEX / 2,2 + DCA I AUTO10 + TAD T20SIN + CIA + TAD T20COS + TAD TWOPEY + DCA I AUTO10 + + TAD T30SIN + TAD TWOPEX + DCA I AUTO10 + TAD T30COS /AND THE LAST AT + TAD TWOPEY / + DCA I AUTO10 / 0,3 + + JMP I IFILDS /NOW TO DISPLAY THE WHOLE MESS +IFILDS, FILDIS + +TWFG1, 0 /FLIK THE FLAME +TWFG2, 0 /LONG OR SHORT + + + +/ +/ HERE TO DISPLAY THE TWO SHIPS. CHECK FIRST FOR COLLISION +/ AND THEN SET THE TWO PAIRS OF COORDENATES FOR THE END +/ POINTS AND CALL THE "VECTOR GENERATOR" TO DRAW THE DOTS +/ IN BETWEEN. WHEN THE COUNT OVERFLOWS DO THE SAME FOR +/ NUMBER TWO. THEN EXIT TO DISPLAY ALL THE PROJECTILES. +/ + + *1400 + +FILDIS, CLA CLL /ALL SET TO GO + JMS I COLIDE /TEST FOR COLLISION FIRST +/ DSB 1 /IF NO COLLISION + TAD ONEFLG /SKIP NUMBER ONE IF NOT IN NORMAL + SZA CLA /SPACE + JMP TWODIS + + TAD ONEFIL /SET UP POINTERS TO DISPLAY FILE + DCA AUTO10 /FOR NUMBER ONE + TAD ONECNT /ALONG WITH VECTOR COUNT + DCA AUTO11 + TAD I AUTO10 /SET OUT THE FIRST POINT PAIR + DCA XONEDS + TAD I AUTO10 + DCA YONEDS + TAD ONEOUT /NORMAL DISPLAY OR EXPLOSION? + SZA CLA + JMP I IONEEX /GO ELSE WHERE FOR EXPLOSION + +FILONE, TAD I AUTO10 /STEP TO NEXT PAIR OF POINTS + DCA XTWODS /SET X AND Y TO NEW POINT + TAD I AUTO10 + DCA YTWODS + JMS I VECTOR /CALL THE DOT DRAWING MACHINE + ISZ AUTO11 + SKP /COUNT + JMP TWODIS /DO NUMBER TWO ON OVERFLOW + TAD XTWODS /SWAP POINTS FOR NEXT PAIR + DCA XONEDS + TAD YTWODS /THE GENERATOR DRAWS FROM ONE + DCA YONEDS /TOWARDS TWO + JMP FILONE + + + + +TWODIS, TAD TWOFLG /HERE TO DO NUMBER TWO + SZA CLA /BUT NOT IF IN HYPER SPACE + JMP I IPRODS + + TAD TWOFIL /SET UP FILE POINTER AS IN ONE + DCA AUTO10 + TAD TWOCNT /AND THE COUNT + DCA AUTO11 + TAD I AUTO10 /I SUPPOSE THIS COULD BE A SUBROUTINE TOO + DCA XONEDS + TAD I AUTO10 + DCA YONEDS + TAD TWOOUT /IS IT EXPLODING? + SZA CLA + JMP I ITWOEX /YES, HOW EXCITING + +TWDLOP, TAD I AUTO10 /NO HOW DULL, STICK IN NEXT PAIR OF + DCA XTWODS /POINTS + TAD I AUTO10 + DCA YTWODS /AND CALL THE VECTOR SEQUENCE + JMS I VECTOR + ISZ AUTO11 + JMP .+3 + + JMP I .+1 /WHEN COUNT OVERFLOWS GO ON TO +IPRODS, PRODIS /DO THE PROJECTILE THING + + TAD XTWODS /OTHERWISE SWAP ON TO THE NEXT PAIR + DCA XONEDS /OF POINTS + TAD YTWODS + DCA YONEDS + JMP TWDLOP + +COLIDE, COLLID +IONEEX, ONEEXP +ITWOEX, TWOEXP + + + +/ +/ THIS IS THE SO CALLED "VECTOR GENERATOR" WHICH DRAWS A +/ SERIES OF DOTS FROM XONEDS,YONEDS TO XTWODS,YTWODS. +/ THE COORDINATE COMPONENTS ARE DIVIDED INTO FOURTHS AND +/ FOUR DOTS DRAWN ON THE SCOPE SCREEN. NOTE THAT NO DOT +/ IS DRAWN AT XONEDS,YONEDS. THIS IS COMPENSATED FOR ELSEWHERE. +/ + +DISPLY, 0 /ENTER TO DRAW A FOUR POINT VECTOR + CLA + TAD XONEDS /FROM XONEDS,YONEDS + CIA /TO XTWODS,YTWODS + TAD XTWODS /DIVIDE COORDINATE DIFERENCES INTO + JMS DISHFT /FOURTHS + DCA DIXTEM /AND STORE INCREMENT + TAD YONEDS + CIA + TAD YTWODS + JMS DISHFT /FOURTHS + DCA DIYTEM + TAD M4 /FOR FOUR DOTS + DCA DISCNT + +DISLOP, TAD XONEDS /ADD INCREMENT TO CURRENT X AND Y + TAD DIXTEM + DCA XONEDS /NOTE THAT THIS ROUTINE DESTROYS + TAD YONEDS /XONEDS AND YONEDS + TAD DIYTEM + DCA YONEDS + TAD XONEDS +/ RTR /DIVIDE BY 8 TO FIT SCREEN SIZE +/ RAR + DXC DXL /SET X VALUE + CLA + TAD YONEDS /DO THE SAME FOR Y +/ RTR +/ RAR + DYC DYL DIS /AT LAST SOMETHING TO SEE!! + CLA + ISZ DISCNT /DONE YET? + JMP DISLOP /NOPE + JMP I DISPLY /YUP + + +DISHFT, 0 /A GENERALIZED SHIFT ROUTINE CALLED + CLL /FROM EVERYWHERE TO DIVIDE THE + SPA /AC BY FOUR WITH AN ASR RIGHT + CML IAC /NOTE THAT NEGATIVE NUMBERS ARE + RAR /ROUNDED UPWARDS (TOWARD ZERO) + CLL /TO MAKE IT COME OUT RIGHT + SPA + CML IAC /EVEN SO THERE ARE SOME ROUNDING ERRORS + RAR /SOMEWHERE. SO MUCH FOR 12 BIT MACHINES + JMP I DISHFT + + + +/ +/ HERE TO DISPLAY ALL THE PROJECTILES AND TEST FOR HITS. +/ THE PROJECTILE DISPLAY FILE IS SEARCHED FOR PROJECTILES WITH +/ NON-ZERO COUNTS AND WHEN ONE IS FOUND THE POSITION IS +/ UPDATED BY THE VELOCITY, THE POINT DISPLAYED AND TESTED FOR +/ A HIT. +/ + + *1600 + +PRODIS, CLA CLL / BEGIN DISPLAY OF THE PROJECTILES + TAD BUFST /POINT TO BEGINNING OF DISPLAY FILE + DCA BUFTMP +/ DSB 2 /SET EXTRA BRIGHT FOR SINGLE POINTS + +PROLOP, TAD I BUFTMP /PICK UP NEXT COUNT + SNA + JMP EXPIRE /THIS ONE IS DEAD - GO TO THE NEXT + IAC /INCREMENT COUNT AND REPLACE + DCA I BUFTMP + ISZ BUFTMP /BUMP POINTER TO X VELOCITY + TAD I BUFTMP + ISZ BUFTMP /THEN TO XPOSITION AND UPDATE X POSITION + TAD I BUFTMP /WITH THE VELOCITY WHICH IS CONSTANT + DCA I BUFTMP + TAD I BUFTMP + DCA PROX /AND STORE X POSITION FOR DISPLAY AND TEST + ISZ BUFTMP /NOW TO Y POSITION AND VELOCITY + TAD I BUFTMP + ISZ BUFTMP + TAD I BUFTMP /SAME LITTLE GAME + DCA I BUFTMP + TAD I BUFTMP + DCA PROY /STORE THE NEW Y VALUE + + TAD PROX /DISPLAY THE POINT WITH +/ RTR /THE SAME SHIFT AS FOR THE SHIPS +/ RAR /FOR THE SMALL SCREEN + DXC DXL + CLA + TAD PROY +/ RTR / +/ RAR + DYC DYL DIS /THERE IT IS!! + CLA + JMS I CHKOUT /TEST FOR A HIT + ISZ BUFTMP /MOVE POINTER ON AND TEST FOR END + TAD BUFTMP /OF BUFFER + TAD BUFLIM + SZA CLA + JMP PROLOP /NOT AT END - CONTINUE + + +/ +/ HERE AT THE END OF THE PROJECTILE DISPLAY. IF THE GAMOVR +/ FLAG IS SET, GO ON TO THE MESSAGE DISPLAY - VICTORY LAP +/ SECTION. OTHERWISE PICK UP THE REMAINING CLOCK COUNT +/ TO GIVE THE FANS SOMETHING TO LOOK AT, AND MOVE THE +/ ELECTRON BEAM TO A LOWER CORNER. THE COUNT DISPLAYED +/ IN THE AC IS THE NUMBER OF 100 USEC CLOCK TICKS REMAINING +/ WHEN THIS CODE IS REACHED BEFORE THE NEXT UPDATE WOULD +/ BEGIN. TURNS OUT THAT ROUGHLY 2/3 OF THE CPU IS LEFT +/ OVER SHOULD ANYONE WANT TO DO ANYTHING VERY FANCY. +/ + + +FINISH, TAD GAMOVR /IS THIS THE VICTORY LAP OR WHAT? + SZA CLA + JMP I ENDGAM /YES, GO TO PUT UP THE MESSAGE +/ TAD M400 /MOVE THE BEAM OFF SCREEN +/ DYC DYL + CLA CLL +/ DXC DXL + TAD INTCNT /PICK UP THE COUNT + CIA + JMP . + +ENDGAM, JOBLOP + + +EXPIRE, TAD BUFTMP /HERE TO ADVANCE THE BUFFER + TAD P5 /POINTER TO THE NEXT PROJECTILE + DCA BUFTMP /UNLESS THE END + TAD BUFTMP /OF THE BUFFER + TAD BUFLIM /IS REACHED + SZA CLA /IN WHICH CASE + JMP PROLOP /IT + JMP FINISH /QUITS + +BUFST, DISBUF+101 +BUFLIM, -DISBUF-175 +CHKOUT, CHECK + +RESE1, 0 /THIS IS CALLED TO SET THE POINTER + TAD MRES /(AUTO16) TO THE NEXT FREE SLOT + DCA RESCNT /FOR A PROJECTILE LAUNCH. 12 POSSIBLE + +RESLOP, TAD RESPNT /MOVE THE POINTER TO THE NEXT SLOT + TAD P5 + DCA RESPNT + TAD RESPNT /RESTE IF AT END OF BUFFER + TAD BUFLIM + SZA CLA + JMP RESCON + TAD BUFST + DCA RESPNT + +RESCON, TAD I RESPNT /FIND A HOLE YET? + SNA CLA + JMP RESFND /YES, SET UP AUTO16 + ISZ RESCNT /NO COUNT + JMP RESLOP /AND TRY AGAIN + HLT /NO HOLES AT ALL? + +RESFND, CMA /BACK THE POINTER FOR AUTO INDEXING + TAD RESPNT + DCA AUTO16 + JMP I RESE1 + +MRES, -14 +RESCNT, 0 +RESPNT, 0 + +SETBUF, 0 + CMA /THIS ROUTINE IS CALLED FROM THE + TAD BUFST /STARTING SEQUENCE TO INITIALIZE ALL + DCA AUTO16 /THE BUFFER POINTERS AND SO ON + TAD BUFST + DCA BUFTMP + TAD BUFST + DCA RESPNT + TAD BUFST + DCA SETPNT +SETLOP, DCA I SETPNT + ISZ SETPNT + TAD SETPNT + TAD BUFLIM + SZA CLA + JMP SETLOP + JMP I SETBUF + +SETPNT, 0 + + + +/ +/ THIS HERE NOW THING CHECKS THE COORDINATES OF THE MOST RECENTLY +/ DISPLAYED PROJECTILE AGAINST THOSE OF THE SHIPS ON THE SCREEN. +/ IF WITH A COLLISION LIMIT A HIT IS RECORDED AND THE LIFE +/ COUNT OF THE PROJECTILE ZEROED TO REMOVE IT. A HIT SHIP +/ IS SUITABLY FLAGGED +/ + + *2000 + +CHECK, 0 /HERE TO TEST FOR A PROJECTILE HIT + TAD ONEFLG /CANT HIT SOMETHING IN HYPERSPACE + SZA CLA + JMP CHECK2 + TAD ONEOUT /OR SOMETHING THAT'S BEEN HIT + SZA CLA + JMP CHECK2 + + TAD PROX /CHECK X COORDINATES OF SHIP ONE + CIA /AND PROJECTILE + TAD ONEPEX /THIS SORT OF THING IS WHY THE + SPA /COORDINATES HAVE TO BE MAINTAINED TO 12 + CIA /BITS + TAD LIMIT /CLOSE ENOUGH? + SMA CLA + JMP CHECK2 /IF X ISN' CLOSE ENOUGH THEN NO HIT + TAD PROY /X WAS CLOSE ENOUGH, HOW ABOUT Y? + CIA + TAD ONEPEY + SPA + CIA + TAD LIMIT + SMA CLA + JMP CHECK2 /NO HIT + + TAD MEXP /DEPOSIT EXPLOSION COUNT IN ONEOUT + DCA ONEOUT /ALL THAT IS NECESSARY + JMS CUTOUT /REMOVE PROJECTILE + + + + +CHECK2, TAD TWOFLG /NO HIT ON NUMBER ONE, TRY NUMBER TWO + SZA CLA + JMP I CHECK /BUT NOT IF IN HYPERSPACE + TAD TWOOUT /OR IF ALREADY HIT + SZA CLA + JMP I CHECK + + TAD PROX /CHECK X'S FIRST + CIA + TAD TWOPEX + SPA /GET ABSOLUTE VALUE OF DIFFERENCE + CIA + TAD LIMIT /AND TEST MAGNITUDE AGAINST PROXIMITY + SMA CLA /LIMIT + JMP I CHECK /NOWHERE NEAR CLOSE + + TAD PROY /NYAH, NYAH + CIA /TRY THE Y'S + TAD TWOPEY + SPA + CIA /ABSOLUTE VALUE OF DIFFERENCE + TAD LIMIT + SMA CLA + JMP I CHECK /CLEAN MISS! + + TAD MEXP /HIT ON TWO - END EVERYTHING BY SETTING + DCA TWOOUT /TWOOUT TO NON-ZERO EXPLOSION COUNT + JMS CUTOUT + JMP I CHECK /EXIT AFTER DESTOYING PROJECTILE + +LIMIT, -120 /PROXIMITY LIMIT FOR WHAT CONSTITUTES A HIT + +CUTOUT, 0 /THIS ROUTINE ZEROES OUT THE MOST RECENTLY + TAD M4 /DISPLAYED PROJECTILE BY ZEROEING THE + TAD BUFTMP /COUNT + DCA CUTPNT + DCA I CUTPNT + JMP I CUTOUT + +CUTPNT, 0 + + + +/ +/ THIS ROUTINE IS CALLED TO TEST FOR A COLLISION BETWEEN THE +/ TWO SHIPS. THE COORDINATES OF BOTH ARE COMPARED +/ AND IFF SUFFICIENTLY CLOSE BOTH ARE DESTROYED BY SETTING +/ THEIR EXPLOSION COUNTS NON-ZERO. +/ + + +COLLID, 0 /HERE TO TEST FOR COLLISION + TAD ONEFLG /NO TEST IF EITHER SHIP IS IN + SZA CLA /HYPERSPACE OR EXPLODING + JMP I COLLID + TAD TWOFLG + SZA CLA + JMP I COLLID + TAD ONEOUT + SZA CLA + JMP I COLLID + TAD TWOOUT + SZA CLA + JMP I COLLID + + TAD ONEPEX /BOTH SHIPS AVAILABLE FOR COLLISION + CIA /CHECK X COORDINATES FIRST + TAD TWOPEX + SPA /GET ABSOLUTE VALUE OF DIFFERENCE + CIA + TAD COLLIM /CLOSE ENOUGH? + SMA CLA + JMP I COLLID /NOPE, FORGET IT + + TAD ONEPEY /YES, NOW TRY THE Y COORDINATES + CIA + TAD TWOPEY + SPA + CIA /GET MAGNITUDE ONLY + TAD COLLIM + SMA CLA /CLOSE ENOUGH? + JMP I COLLID + TAD MEXP /YES, SET BOTH EXPLOSION COUNTS + DCA ONEOUT + TAD MEXP + DCA TWOOUT + JMP I COLLID + +COLLIM, -300 + + +/ +/ THIS ROUTINE IS CALLED TO SET ONE OF THE TWO SHIPS INTO +/ HYPERSPACE. ON ENTRY THE AC=-1 FOR SHIP #1, 0 FOR SHIP +/ NUMBER 2. THE LOCATION CLOCK IS USED FOR A RANDOM +/ ADDRESS POINTER FROM WHICH WILL BE DRAWN THE +/ VARIOUS PARAMETERS FOR REENTRY. +/ + + *2200 + +HYPSET, DCA RTNFLG /HERE WITH AC=-1 OR 0 + TAD RTNFLG /SET UP LIST POINTER + SZA CLA + TAD ONEDIF /TO APPROPRIATE SHIP FILE + TAD TWOLST + DCA AUTO15 + + CLCA /SET UP "RANDOM NUMBER GENERATOR" + /USE CLOCK COUNTER FOR THAT PURPOSE + DCA AUTO17 + TAD I AUTO17 /PICK UP FIRST THE AMOUNT OF TIME + AND TIMOUT /OUT OF NOMAL SPACE LIMITED TO -777 + CIA /UPDATE CYCLES ( ABOUT 15 SECONDS) + DCA I AUTO15 /AND STORE IN ONEOUT OR TWO OUT + + TAD I AUTO17 /THE NEXT RANDOM NUMBER BECOMES THE + JMS I THEADJ /ANGLE OR ORIENTATION ON REENTRY + DCA I AUTO15 + TAD I AUTO17 /AND THE NEXT BECOMES THE X VELOCITY + JMS VEESET /COMPONENT + DCA I AUTO15 + TAD I AUTO17 /AND THEN THE Y COMPONENT + JMS VEESET + DCA I AUTO15 + TAD I AUTO17 + DCA I AUTO15 + + TAD I AUTO17 + DCA I AUTO15 + + TAD I AUTO17 /FINALLY SEE IF RETURN WILL BE SUCCESSFLY + AND TIMOUT + TAD MHYP /ABOUT 3/4 CHANCE + SMA CLA + JMP HYPRET /OK + TAD RTNFLG /THIS IS THE ONE TIME IN FOUR. SET + SZA CLA /UP FOR EXPLOSION ON REENTRY + TAD ONEDIF + TAD OUTLOC + DCA VEESET + TAD MEXP + DCA I VEESET + +HYPRET, ISZ RTNFLG + JMP I TWORTN + JMP I ONERTN + +TIMOUT, 777 +ONEDIF, ONEFLG-TWOFLG +TWOLST, TWOFLG-1 +RTNFLG, 0 +ONERTN, TWOUP +TWORTN, ONESET +OUTLOC, TWOOUT +MHYP, -200 + + + + +VEESET, 0 /HERE TO LIMIT VELOCITY COMPONENTS + CLL + SPA /GET MAGNITUDE + CML + AND HM177 /LIMIT TO 177 + SZL CLL + CIA + JMP I VEESET /AND EXIT + +HM177, 177 + +ONEEXP, CLA CLL /HERE TO DISPLAY SHIP NUMBER ONE AS + TAD ONETHE /AN EXPLOSION + TAD INCONE /FIRST ROTATE IT BY A GOOD DOLLOP + DCA ONETHE + JMS I IXPDIS /THEN CALL THE EXPLOSION GENERATOR + ISZ ONEOUT /DONE WITH THE EXPLOSION? + JMP I NOWTWO /NO, NORMAL RETURN + + IAC /YES, SET INTO PSEUDO HYPER SPACE + DCA ONEFLG + IAC /DISABLE RETURN FROM HYPER SPACE + DCA ONEFIN + + TAD TWOFIN /IS NUMBER TWO STILL AROUND? + SNA CLA + JMP I NOWTWO /YES, RETURN + JMP I TIEUP /NO, TIE BALL GAME + + + +TWOEXP, CLA CLL /HERE TO DISPLAY SHIP NUMBER TWO + TAD TWOTHE /AS AN EXPLOSION. BASH IT AROUND + TAD INCTWO + DCA TWOTHE + JMS I IXPDIS /THEN DISPLAY IT + ISZ TWOOUT /DONE WITH EXPLOSION? + JMP I NOWPRO /NO, NORMAL RETURN + + IAC /YES, SEND INTO PSEUDO HYPER SPACE + DCA TWOFLG + IAC /DISABLE NORMAL RETURN FROM HYPERSPACE + DCA TWOFIN + /CHECK NUMBER ONE + TAD ONEFIN + SZA CLA /STILL ALIVE AND WELL? + JMP I TIEUP /NO, TIE GAME + JMP I NOWPRO /YES, CONTINUE ON +NOWTWO, TWODIS +NOWPRO, PRODIS +TIEUP, NOWIN +IXPDIS, EXPDIS +INCONE, 55 +INCTWO, 55 + + + +/ +/ HERE TO DISPLAY THE FIGURE POINTED TO BY AUTO10 AS +/ AN EXPLOSION. THIS WORKS THE SAME WAY AS THE NORMAL +/ DISPLAY ROUTINE EXCEPT THAT THE COORDINATE INCREMENTS +/ ARE INVERTED TURNING THE FIGURE INSIDE OUT FOR S +/ A SORT OF CLOBBY EXPLOSION. +/ + + *2400 + +EXPDIS, 0 /HERE TO DISPLAY A FIGURE INSIDE OUT + TAD I AUTO10 /WITH THE POINTERS AND COUNTS ALREADY + DCA XTWODS /SET UP BY FILDIS OR TWODIS + TAD I AUTO10 /STICK NEXT TWO POINTS INTO LINE + DCA YTWODS + + TAD XTWODS + CIA /CALCULATE INCREMENT THE WRONG WAY + TAD XONEDS + DCA DIXTEM /AND STORE + TAD YTWODS + CIA + TAD YONEDS + DCA DIYTEM /SAME FOR Y + + TAD M4 /4 DOTS IN THE VECTOR" + DCA DISCNT /COULD HAVE CALLED THE OTHER + /VECTOR GENERATOR I SUPPOSE +EXPLOP, TAD XONEDS + TAD DIXTEM /ADD X AND Y INCREMENTS TO THE RUNNING + DCA XONEDS /TOTALS AND DISPLAY THE RUNNING + TAD YONEDS /TOTALS NORMAL SIZE + TAD DIYTEM + DCA YONEDS + + TAD XONEDS +/ RTR /COULD MAKE TWICE AS BIG BY NOP-ING +/ RAR /THE RAR'S BUT THE SCREEN IS SMALL ENOUGH + JMS I IVCLDX /AS IT IS + CLA + TAD YONEDS +/ RTR +/ RAR + JMS I IVCLDY +/ DISD +/ JMP .-1 +/ DIXY + + CLA + ISZ DISCNT /DONE 4 DOTS? + JMP EXPLOP /NO + + ISZ AUTO11 /DONE ALL VECTORS IN THE FILE? + SKP + JMP I EXPDIS /YES, EXIT + + TAD XTWODS /NO SWAP TO NEXT PAIR OF POINTS + DCA XONEDS + TAD YTWODS + DCA YONEDS + JMP EXPDIS+1 + + + + +/ +/ VEELIM IS THE SCALING ROUTINE FOR VELOCITY COMPONENTS. +/ THE COMPONENTS ARE SCALED TO REMAIN IN THE RANGE 140 +/ TO -140. THIS IS NECESSARY TO AVOID ASTRONOMICAL SPPED +/ BUILDUP ON THE SMALL SCREEN. UNFORTUNATELY THE X AND Y +/ COMPONENTS ARE SCALED SEPARATELY WHICH GIVES SLIGHT BUT +/ NOTICABLE DISTORTIONS IN DIAGONAL FLIGHT PATHS. IN THE +/ NORMAL HEAT OF THE BATTLE NO ONE WILL REALLY NOTICE. +/ + + +VEELIM, 0 /ENTER TO SCALE VELOCITY HELD IN + DCA VEEHLD /AC + TAD VEEHLD + SMA /BRANCH FOR POSITIVE OR NEGATIV + JMP VEEPOS + TAD VEEMAX + SMA CLA /GREATER THAN MAXIMUM POSITIVE? + JMP VEECLR /NO + TAD VEEMIN /I MEAN MAXIMUM NEGATIVE - YES SET + JMP I VEELIM /TO MAX NEGATIV + +VEEPOS, TAD VEEMIN /GREATER THAN MAX? + SPA CLA + JMP VEECLR /NO + TAD VEEMAX /YES SET TO MAX + JMP I VEELIM + +VEECLR, TAD VEEHLD /IT WAS IN RANGE ALL ALONG + JMP I VEELIM + +VEEHLD, 0 +VEEMIN, -140 +VEEMAX, 140 + +THEAJI, 0 /HERE TO ADJUST THE ANGLE TO A RANGE + SMA /0-550 OR 0-360 DEGREES. THIS IS + JMP .+3 /NECESSARY TO INSURE THAT PUSHDOWN OVERFLOW + TAD P550 /WILL NOT HAPPEN IN THE SINE AND COSINE + JMP .-3 /ROUTINES. THIS SIMPLY TAKES THE AC + TAD M550 /MODULO 360 AND EXITS + SMA + JMP .-2 + TAD P550 /FOLLOW IT THROUGH AND SEE IF IT DOESN'T + JMP I THEAJI + + + +/ +/ ONE OF THESE ROUTINE IS ENTERED WHEN A WINNER IS DECLARED. +/ THE ADDRESS OF THE VICTORY MESSAGE IS PLACED IN MESS AND +/ THE GAMOVR FLAG SET TO CAUSE A BRANCH TO JOBLOP WHEN THE +/ DISPLAY CYCLE IS COMPLETED. THE ROUTINE WILL THEN DISPLAY +/ THE APPROPRIATE MESSAGE OVER THE REMAINING SHIPS IF +/ ANY UNTIL THE KEYBOARD IS MOLESTED OR THE CLOCK RUNS OUT +/ AND THE NEXT DISPLAY UPDATE CYCLE IS SET. AT ANY RATE THE +/ PROGRAM WILL REACH HERE ONLY WHEN SOMEONE HAS BITTEN THE +/ INTERGALACTIC DUST. +/ + + +ONEWIN, 0 /THIS IS CALLED WHEN TWOFIN IS SET + TAD MES1 /AND ONE FIN IS NOT. SET ONE TO VICTOR + DCA MESS /AND SET GAMOVR FLAG + IAC + DCA GAMOVR + JMP I ONEWIN /THEN RETURN TO UPDATE CYCLE + +TWOWIN, 0 /THIS IS CALLED WHEN ONEFIN IS SET + TAD MES2 /AND TWO FIN IS NOT + DCA MESS /SET ALSO GAMOVR + IAC + DCA GAMOVR + JMP I TWOWIN + +NOWIN, TAD MES4 /GET HERE WHEN BOTH ONEFIN AND TWOFIN + DCA MESS /ARE SET . + IAC + DCA GAMOVR /NOBODY EVER REALLY WINDS + /UP THE WINNER IN THESE THINGS +JOBLOP, +/ DSB 1 /THIS IS ENTERED FROM FINISH WHEN + TAD MES0 /GAMOVR IS SET AND SERVES TO DISPLAY + JMS I MESOUT /THE VICTORY MESSAGE ON THE SCREEN + TAD MESS /USING THE CHARACTER GENERATOR SOMEWHAT + JMS I MESOUT /FURTHER ON UNTIL THE GAME IS RESTARTED + TAD MES5 /OR UNTIL THE INTERRUPT COUNT OVERFLOWS + JMS I MESOUT /AND THE UPDATE CYCLE IS RESTARTED + TAD MES3 + JMS I MESOUT +FINITO, JMP JOBLOP + +MES0, MESS0 +MES1, MESS1 +MES2, MESS2 +MES3, MESS3 +MES4, MESS4 +MES5, MESS5 +MESS, 0 + + + +/ +/ THE FOLLOWING ARE THE SINE AND COSINE ROUTINES CUSTOMIZED +/ FOR THIS PROGRAM FROM ANOTHER I WORKED ON. CALL EITHER +/ SINE OR COSINE WITH ANGLE IN DEGREES IN AC. THE ARGUEMENT +/ IS REDUCED THROUGH RECURSION UNTIL BETWEEN 0-89 DEGREES +/ AND THEN A TABLE LOOKUP DONE TO OBTAIN THE VALUE. IT TAKES +/ UP A FAIR AMOUNT OF SPACE BUT IT WORKS JUST FASTER +/ THAN SHEEP. THE COSINE CALL JUST TRANSFORMS THE ARGUEMENT +/ THROUGH SOME TRIGONOMETRIC GARBAGE AND CALLS THE SINE +/ ROUTINE. NOTE THAT CALLING EITHER ROUTINE WITH TOO +/ LARGE AN ARGUEMENT WILL CAUSE PUSHDOWN OVERFLOW AND THEN +/ ALL HELL WILL BREAK LOOSE. THE ORIGINAL ROUTINE FROM WHICH +/ THIS WAS STOLEN HAD FULL WORD PRECISION. +/ + + *6400 + +SINEIN, 0 /I REALLY CANT BRING MYSELF TO COMMENT + DCA SINARG /THIS. IT'S VERY STRAIGHFORWARD + TAD SINEIN + DCA I SINPSH + ISZ SINPSH + TAD SINARG + SZA + JMP SINNG2 + +SINPOP, CLA CLL CMA + TAD SINPSH + DCA SINPSH + TAD I SINPSH + DCA SINEIN + TAD SINARG + JMP I SINEIN + +SINNG2, SMA + JMP SINPOS + CIA + JMS SINEIN + +SINNEG, CIA + DCA SINARG + JMP SINPOP + +SINPOS, TAD M264 + SPA + JMP .+2 + JMP SINNEG-1 + TAD P132 + SPA + JMP SINELK + SZA CLA + JMP .+3 + TAD P37 + JMP SINNEG+1 + + TAD SINARG + TAD M264 + JMP SINNEG-1 + +SINELK, TAD P132 + TAD SINTAB + DCA SINEIN + TAD I SINEIN + DCA SINARG + JMP SINPOP + + + + +SINARG, 0 +SINPSH, SINLST +SINLST, 0 + 0 + 0 + 0 + 0 + 0 + +SINTAB, SINES-1 + +COSINI, 0 + CIA + TAD P132 + JMS SINEIN + JMP I COSINI + + + + +SINES, 00 /1 + 01 /2 + 01 /3 + 02 /4 + 02 /5 + 03 /6 + 03 /7 + 04 /8 + 05 /9 + 05 /10 + 06 /11 + 06 /12 + 07 /13 + 07 /14 + 10 /15 + 10 /16 + 11 /17 + 11 /18 + 12 /19 + 12 /20 + 13 /21 + 13 /22 + 14 /23 + 15 /24 + 15 /25 + 16 /26 + 16 /27 + 17 /28 + 17 /29 + 20 /30 + 20 /31 + 20 /32 + 21 /33 + 21 /34 + 22 /35 + 22 /36 + 23 /37 + 23 /38 + 24 /39 + 24 /40 + 25 /41 + 25 /42 + 25 /43 + 26 /44 + 26 /45 + 27 /46 + 27 /47 + 27 /48 + 30 /49 + 30 /50 + 30 /51 + 31 /52 + 31 /53 + 31 /54 + 32 /55 + 32 /56 + 32 /57 + 33 /58 + 33 /59 + 33 /60 + 33 /61 + 34 /62 + 34 /63 + 34 /64 + 35 /65 + 35 /66 + 35 /67 + 35 /68 + 35 /69 + 36 /70 + 36 /71 + 36 /72 + 36 /73 + 36 /74 + 36 /75 + 37 /76 + 37 /77 + 37 /78 + 37 /79 + 37 /80 + 37 /81 + 37 /82 + 37 /83 + 37 /84 + 37 /85 + 37 /86 + 37 /87 + 37 /88 + 37 /89 + + + + +MULTI, 0 /THIS IS STANDARD SINGLE PRECISION + CLL /MULTIPLY ROUTINE WHICH WAS ONCE + SPA /USED. I'VE LEFT IT IN SINCE + CMA CML IAC /THERE IS LOTS OF CORE LEFT OVER AND + DCA MULMP1 /MAYBLE SOMEDAY I'LL NEED IT TO PUT + DCA MULMP5 /IN A SUN OR SOMETHING. THIS IS THE + TAD I MULTI /STANDARD DEC SUBROUTINE WITH DIFFERENT + SNA /LABELS + JMP MULPSN+2 + SPA + CMA CML IAC + DCA MULMP2 + TAD MULTHR + DCA MULMP3 + +MULMP4, TAD MULMP1 + RAR + DCA MULMP1 + TAD MULMP5 + SZL + TAD MULMP2 + CLL RAR + DCA MULMP5 + ISZ MULMP3 + JMP MULMP4 + TAD MULMP1 + RAR +MULPSN, SZL + JMP MULCMP + DCA MULMP1 + TAD MULMP5 +MULMPZ, ISZ MULTI + JMP I MULTI + +MULCMP, CMA CLL IAC + DCA MULMP1 + TAD MULMP5 + CMA + SZL + IAC + JMP MULMPZ + +MULTHR, 7764 +MULMP1, 0 +MULMP5, 0 +MULMP2, 0 +MULMP3, 0 + + + +/ +/ SHIFTR DIVIDES THE AC BY TWO WHETHER POSITIVE OR NEGATIVE +/ AND IS CALLED FROM VARIOUS PLACES. NOT ENTIRELY MYSTERIOUS +/ + + +SHIFTR, 0 + CLL + SPA + CML IAC + RAR + JMP I SHIFTR + + +/ +/ POSCAL IS CALLED TO CALCULATE THE COORDINATE INCREMENTS +/ NECESSARY TO PRODUCE THE SHIP FIGURES. RATHER THAN DOING +/ A LOT OF EXPENSIVE MATH THIS DOES A QUICK PRODUCTION +/ OF 1, 2, AND 3 TIMES THE SIN AND COSINE VALUES FOUND +/ IN CALSIN AND CALCOS LEAVING THEM IN THE TABLE FOR +/ ONESET AND TWOSET. IF THE SCOPE WERE ANY BETTER +/ THIS PROBABLY WOULDN'T BE NEAR GOOD ENOUGH BUT.... +/ + +POSCAL, 0 + TAD CALSIN + + DCA T10SIN + TAD T10SIN + CLL RAL + DCA T20SIN + TAD T10SIN + TAD T20SIN + DCA T30SIN + + TAD CALCOS + + DCA T10COS + TAD T10COS + CLL RAL + DCA T20COS + TAD T10COS + TAD T20COS + DCA T30COS + JMP I POSCAL + +/**************************************************************** +/ VC8-E ROUTINES + + +VDIV, 0 + SMA / SKIP IF MINUS + JMP VPLUS +VMINUS, CMA IAC / COMPLEMENT + RTR / DIVIDE BY FOUR + AND P1777 / DELETE UPPER TWO BITS + CMA IAC + JMP I VDIV / RETURN + +VPLUS, RTR + AND P1777 + JMP I VDIV + +/***** + +VCLDX, 0 / INTENSIFY LAST POINT AND LOAD NEW X VALUE + JMS VDIV / DIVIDE BY FOUR + DISD / DISPLAY READY? + JMP .-1 / WAIT. + DIXY / INTENSIFY + DILX / LOAD NEW X VALUE + JMP I VCLDX / RETURN + +VCLDY, 0 + JMS VDIV / DIVIDE BY FOUR + DILY / LOAD NEW Y VALUE + JMP I VCLDY + +P1777, 1777 + + +/**************************************************************** + + + *7000 + +/GENERAL PURPOSE SYMBOL GENERATOR +/ +CHARS, 0 /ENTRY TO PLOT CHARACTER STRING + DCA ADDR /STORE STRING ADDRESS + TAD I ADDR /FETCH DOUBLE CHARACTER + RTR /SHIFT + RTR / FOR FIRST + RTR / CHARACTER + JMS CHAR /PLOT CHARACTER + SKP /NORMAL RETURN -- SKIP + JMP I CHARS /TERMINATION RETURN -- EXIT + TAD I ADDR /RECALL DOUBLE CHARACTER + ISZ ADDR /ADVANCE STRING ADDRESS + JMS CHAR /PLOT CHARACTER + JMP CHARS+2 /NORMAL RETURN -- REPEAT + JMP I CHARS /TERMINATION RETURN -- EXIT +/ +CHAR, 0 /ENTRY TO PLOT SINGLE CHARACTER + AND K77 /MASK OUT UPPER BITS + CLL RAL /MULTIPLY CODE BY TWO + TAD TABLE /ADD TABLE BASE ADDRESS + DCA POINT /CONSTRUCT POINTER TO 24-BIT CODE + CMA /INITIALIZE COUNTER FOR + DCA COUNT2 / TWO PLOT WORDS + TAD I POINT /FETCH FIRST PLOT WORD + ISZ POINT /INCREMENT POINTER FOR NEXT ONE + SNA /SKIP IF NOT SPECIAL CHARACTER + JMP SPCHAR /ELSE GO PROCESS IT + DCA CURPLT /SAVE CURRENT PLOT BITS +XPLOT, TAD KM6 /INITIALIZE 6-BIT + DCA COUNT6 / COUNTER + TAD YVALUE /RESET Y TEMPORARY + DCA YTEMP / VALUE FOR CHARACTER + TAD XVALUE /OUTPUT CURRENT + DILX /X-VALUE TO CRT + TAD XINCR /INCREMENT + DCA XVALUE / ABSCISSA +YPLOT, TAD CURPLT /RECALL CURRENT PLOT BITS + CLL RAL /GET NEXT BIT + DCA CURPLT /SAVE REMAINING PLOT BITS + SNL /SKIP IF POINT TO PLOT + JMP CNTINU /ELSE JUMP AHEAD + TAD YTEMP /OUTPUT CURRENT + DILY /Y-VALUE TO CRT + DISD / READY TO DISPLAY THE POINT? + JMP .-1 / NO, WE'LL WAIT. + DIXY / SHOOT THE BEAM! + + CLA CLL /CLEAR AC + TAD CURPLT /RECALL CURRENT PLOT BITS + SNA CLA /SKIP IF POINTS REMAINING + JMP WRDEND /ELSE WORD IS FINISHED +CNTINU, TAD YTEMP /INCREMENT TEMPORARY + TAD YINCR / Y-VALUE FOR NEXT + DCA YTEMP / CHARACTER STEP + ISZ COUNT6 /SKIP IF 6 BITS PLOTTED + JMP YPLOT /ELSE PLOT NEXT ONE + JMP XPLOT /GO UPDATE X-VALUE +WRDEND, ISZ COUNT2 /SKIP IF ANOTHER BIT WORD + JMP EXIT /ELSE EXIT + TAD I POINT /FETCH SECOND BIT WORD + SZA /SKIP IF NO PLOT POINTS + JMP XPLOT-1 /ELSE GO PLOT THEM +EXIT, TAD XVALUE /INCREMENT ABSCISSA + TAD XINCR / FOR SPACE BETWEEN + DCA XVALUE / SYMBOLS + JMP I CHAR /EXIT FROM CHAR +/ +SPCHAR, TAD I POINT /FETCH TRANSFER VECTOR + DCA POINT /STORE AS INDIRECT ADDRESS + + JMP I POINT /GO TO APPROPRIATE ROUTINE +SPACE, TAD XINCR /FETCH BASIC ABSCISSA INCREMENT + CLL RTL /MULTIPLY BY FOUR AND + JMP EXIT / GO CREATE SPACE +CRLF, TAD INITX /"CARRIAGE RETURN" RESETS X + DCA XVALUE / TO ITS ORIGINAL VALUE +LF, TAD YINCR /"LINE FEED" + CLL RTL / DECREMENTS THE + CLL CIA RAL / Y-VALUE BY + TAD YVALUE / EIGHT SCALE + DCA YVALUE / STEPS + JMP I CHAR /EXIT FROM CHAR +RESET, TAD INITX /"RESET" RESETS + DCA XVALUE / X AND Y TO + TAD INITY / THEIR ORIGINAL + JMP RESET-2 / VALUES +TERM, ISZ CHAR /TERMINATE CODE CAUSES + JMP I CHAR / EXIT TO P+2 +/ +INITX, 0 /INITIAL X-VALUE +INITY, 327 /INITIAL Y-VALUE +XVALUE, 0 /CURRENT X-VALUE +YVALUE, 0 /CURRENT Y-VALUE +XINCR, 6 /BASIC X INCREMENT VALUE +YINCR, 10 /BASIC Y INCREMENT VALUE +YTEMP, 0 /TEMPORARY Y-VALUE +CURPLT, 0 /CURRENT PLOT BITS +ADDR, 0 /CURRENT STRING ADDRESS +COUNT6, 0 /6-BIT COUNTER +COUNT2, 0 /2-WORD COUNTER +KM6, -6 /CONSTANT FOR COUNT6 +K77, 77 /CHARACTER CODE MASK +POINT, 0 /TABLE POINTER +/ + + +/ +TABLE, .+1 /TABLE BASE ADDRESS + 0 /SPECIAL CHARACTER (00) + TERM /TERMINATION CODE + 7611 / A + 1176 + 7745 / B + 4532 + 3641 / C + 4122 + 7741 / D + 4136 + 7745 / E + 4541 + 7705 / F + 501 + 7741 / G + 5173 + 7710 / H + 1077 + 4177 / I + 4100 + 2040 / J + 4037 + 7714 / K + 2241 + 7740 / L + 4040 + 7702 / M + 277 + 7706 / N + 3077 + 7741 / O + 4177 + 7705 / P + 502 + 3641 / Q + 6176 + 7715 / R + 2542 + 2245 / S + 5122 + 177 / T + 100 + 3740 / U + 4037 + 1720 / V + 4037 + 7730 / W + 3077 + 4136 / X + 3641 + 374 / Y + 7403 + 6151 / Z + 4543 + 7741 / [ + 0 + 204 / \ + 1020 + 4177 / ] + 0 + 436 / ^ + 400 + 0 /SPECIAL CHARACTER (37) + RESET /RESET + 0 /SPECIAL CHARACTER (40) + SPACE /SPACE + 5600 / ! + 0 + 303 / " + 0 + 1477 / # + 7714 + 2277 / MARKER + 2200 + 2313 / % + 6462 + 7777 / BLOCK + 7777 + 300 / ' + 0 + 3641 / ( + 0 + 4136 / ) + 0 + 4040 / UNDERSCORE (52) + 4040 + 1034 / + + 1000 + 0 /SPECIAL CHARACTER (54) + LF /LINE FEED + 1010 / - + 1000 + 4000 / . + 0 + 2010 / / + 402 + 3641 / 0 + 4136 + 4442 / 1 + 7740 + 4261 / 2 + 5146 + 2145 / 3 + 5321 + 1710 / 4 + 1077 + 4745 / 5 + 4531 + 7750 / 6 + 5070 + 6111 / 7 + 503 + 2255 / 8 + 5522 + 705 / 9 + 577 + 2400 / : + 0 + 0 /SPECIAL CHARACTER (73) + CRLF /CARRIAGE RETURN; LINE FEED + 1024 / > + 4200 + 1212 / = + 1200 + 4224 / < + 1000 + 255 / ? + 300 + + + +/ +/ HERE FOLLOW THE PACKED ASCII TEXTS FOR THE VARIOUS +/ VICTORY MESSAGES. PERSONS ADVENTEROUS TO FIND THIS MIGH CARE +/ TO TOGGLE IN SOME CUTE LITTLE MESSAGES OF THEIR OWN. +/ + +MESS0, 3773 +MESS5, 7340 + 4040 + 4040 + 4000 + +MESS1, 1716 + 0500 + +MESS2, 2427 + 1700 + +MESS3, 2711 + 1623 + 4100 + +MESS4, 1617 + 0217 + 0431 + 0000 + + + + *7400 + +DISBUF, 0 + +/ THE DISPLAY BUFFERS BEGIN HERE AND EXTEND UP SOMEWHERE TO +/ AROUND 7575 OR SO. +/ +/ +/ +/ +/ + + + + + $ + +//////////////////////////// +/ +/ THIS IS THE END +/ +/////////////////////////// + + + + + +