.TITLE SPACE WAR BY RCW & MAB .ENABL ABS DL11IV=300 DL11OV=304 DL11IS=175610 DL11IB=175612 DL11OS=175614 DL11OB=175616 KBIV=60 KBIS=177560 KBIB=177562 STACK=37776 .MACRO FIX REG ASR REG ASR REG ASR REG ASR REG ASR REG ASR REG BIC #176000,REG .ENDM .PAGE ;SYSTEM DESCRIPTION PARAMETERS SUNX=1000 ;SUN X POSS SUNY=1000 ;SUN Y POSS LS=5 ;SCALE OF LARG EXPLOSION SS=3 ;SCALE OF SMALL EXPLOSION SHIPX=-500 ;SHIP POSS REL TO SUN (INITIAL) SHIPY=0 SHPS=6 ;SCALE OF SHIP DRAWING GX=40 ;POSSITION OF GRAPHS IN CORNERS SUNR=36 ;RADIUS OF SUN SHLDR=3*;RADIUS OD SHEILD DAMR=2*SHPS ;DAMAGE RADIUS KILLR=SHPS ;DESTROY RADIUS BRATE=^D9600 ;RATE OF INTERFACE USED BY TIMER CRATE=^D20 ;NUMBER OF CALCULATIONS PER SECOND FRATE=INT7/20 ;FADE RATE INT7=1600 ;SHOWS LOCATION OF INTESITY BITS INTMSK=174177 ;COMPLIMENT LAC=10 ;BASIC LINEAR ACCELERATION AAC=20 ;ANGULAR MTIME=200 ;LIFETIME OF A MISSLE MAXAV=4*100 ;MAX SHIP ANGULAR VELOCITY MINAV=AAC*14 ;LOWER THRESHHOLD FOR ANGULAR VELOCITY ;THIS NEXT GROUP CONTROLS USE OF RECOURCES. E.TRN=0 E.SHL=10 E.SHLH=1000 E.ACC=10 P.SHLU=77*400/2 P.TRN=77*400/ P.SHLH=77*400/3 PTSHL=77*400/4 M.MISF=77*400/30 .PAGE ;THIS REINITIALIZES THE SYSTEM. .=760 BEGIN: MOV #17,MIN CLR SEC JMP START0 .=1000 JMP RESTRT START0: TST 177570 BNE START CLR CT1 MOV #SCOPE3,SCOPE2+2 START: MOV #340,PSW MOV #STACK,SP CLR SECCTR MOV #STARS1,STARPT MOV #DIRTBL,DIRPTR CLR DIWFLG CLR ENTERD CLR WINFLG CLR CT2 CLR KLINGD CLR WINCT CLR DDD ;FIX SHIPS MOV #SHIP1+SDRAW-2,SHIP1+SDEST-2 BIS #INT7,SHIP1+SHEXPL MOV #SHIP1+XPOSS,R1 ADD #^D317,RANDOM MOV RANDOM,R2 BIC #176001,R2 MOV (R2)+,(R1)+ SWAB -2(R1) MOV (R2)+,(R1)+ SWAB -2(R1) MOV (R2)+,(R1)+ SWAB -2(R1) CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ MOV #INT7,(R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ MOV #77*400,(R1)+ MOV #77*400,(R1)+ MOV #77*400,(R1)+ CLR (R1)+ ;NOW SHIP2 MOV #SHIP2+SDRAW-2,SHIP2+SDEST-2 BIS #INT7,SHIP2+SHEXPL MOV #SHIP2+XPOSS,R1 MOV (R2)+,(R1)+ SWAB -2(R1) MOV (R2)+,(R1)+ SWAB -2(R1) MOV (R2)+,(R1)+ SWAB -2(R1) CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ MOV #INT7,(R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ CLR (R1)+ MOV #77*400,(R1)+ MOV #77*400,(R1)+ MOV #77*400,(R1)+ CLR (R1)+ ;NOW THE MISSLES MOV #M,R5 MOV #M+MEND,R4 LOOP MOV R4,MEXIST-2(R5) MOV R4,MEXPL-2(R5) CLR MPOSS(R5) CLR MPOSS+2(R5) BIS #INT7,MEXPL(R5) CLR MPX(R5) CLR MPY(R5) CLR MVX(R5) CLR MVY(R5) MOV #INT7,MFADE(R5) MOV #MTIME,MTOUT(R5) MOV R4,R5 ADD #MEND,R4 CMP R5,#MENDS WHILE LO ;NOW THW IO RESTRT: MOV #340,KBIV+2 MOV #KBIN,KBIV MOV #340,DL11IV+2 MOV #DL11IN,DL11IV MOV #340,DL11OV+2 MOV #TIMER,DL11OV MOV #101,KBIS MOV #101,DL11IS MOV #100,DL11OS CLR DL11OB SEXEC #SCOPEP CLR PSW BB2: TST TOCT BEQ BB1 TST SIGNL BNE .-4 DEC SIGNL DEC TOCT BNE BB2 JMP TO3 BB1: TST CT1 BLE DP TST 177570 BNE BB1 CMP SCOPE2+2,#INITMS BNE 1$ CLR CT1 MOV #SCOPE3,SCOPE2+2 JMP DP 1$: TST SIGNL BNE .-4 DEC SIGNL DEC CT1 BNE BB1 MOV #SCOPE3,SCOPE2+2 JMP DP .PAGE ;THIS IS THE MAIN SCOPE PROGRAM SCOPEP: SCOPE2: SJMP INITMS SCOPE3: SJSR SUN SJSR STARS SJSR S SJSR M SCOPE1: SJMP SCOPEP .PAGE ;THIS IS THE MAIN CALCULATION LOOP RANDOM: .WORD 0 SECCTR: 0 SEC: 0 MIN: 0 CT1:500 CT2: 0 DIGITS: CLR R0 DIG2: CMP R1,#12 BLO DIG1 SUB #12,R1 INC R0 BR DIG2 DIG1: ADD #60,R0 ADD #60,R1 RTS PC DP: LOOP LOOP TST SIGNL WHILE NE DEC SIGNL INC RANDOM BIC #40000,@STARPT CMP STARPT,#STARS1 BNE .+12 BIS #40000,STARS2 BR STRS1 SUB #4,STARPT BIS #40000,@STARPT ADD #4,STARPT STRS1: ADD #4,STARPT CMP STARPT,#STARS2 BLE .+10 MOV #STARS1,STARPT MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) ADD #2,DIRPTR CMP DIRPTR,#DIREND BLE .+10 MOV #DIRTBL,DIRPTR MOV @DIRPTR,R0 JSR PC,UVECT ASR R0 ASR R0 ASR R0 ASR R1 ASR R1 ASR R1 TST R0 BPL .+10 NEG R0 BIS #20000,R0 TST R1 BPL .+10 NEG R1 BIS #20000,R1 BIC #116000,R0 BIC #116000,R1 BIS #40000,R0 BIS #40000,R1 MOV R0,RAY MOV R1,RAY+2 MOV #20000,R2 BIT R2,R0 BEQ XOR1 BIC R2,R0 BR XOR2 XOR1: BIS R2,R0 XOR2: BIT R2,R1 BEQ XOR3 BIC R2,R1 BR XOR4 XOR3: BIS R2,R1 XOR4: MOV R0,RAY1 MOV R1,RAY1+2 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 INC SECCTR CMP SECCTR,#24 BLO AA1 CLR SECCTR TST SEC BNE AA2 MOV #74,SEC DEC MIN BGE AA2 JMP TIMOUT AA2: DEC SEC MOV MIN,R1 JSR PC,DIGITS MOVB R0,TIME1 MOVB R1,TIME1+1 MOV SEC,R1 JSR PC,DIGITS MOVB R0,TIME2 MOVB R1,TIME2+1 AA1: TST DDD BEQ DD1 INC WINCT CMP WINCT,# BLE DD1 TST ENTERD BEQ KLINGW TST KLINGD BEQ ENTERW JMP START KLINGW: INC KLING MOV #KLINGM,SCOPEA+2 BR ANYW ENTERW: INC ENTER MOV #ENTERM,SCOPEA+2 ANYW: MOV ENTER,R1 JSR PC,DIGITS MOVB R0,E1 MOVB R1,E1+1 MOV KLING,R1 JSR PC,DIGITS MOVB R0,K1 MOVB R1,K1+1 MOV #120,CT1 MOV #SCORMS,SCOPE2+2 JMP START DIRTBL: 0 100*100 40*100 DIREND: 140*100 DIRPTR: 0 DD1: JSR PC,SUNP JSR PC,SHIPP JSR PC,MISSLP ENDL J .PAGE ;THIS CALCULATES WHAT IF ANYTHING IS HITTING THE SUN ;FIRST CHECK THE SHIPS SUNP: MOV #S,R5 LOOP MOV #SUNX*100,R0 MOV #SUNY*100,R1 MOV XPOSS(R5),R2 MOV YPOSS(R5),R3 JSR PC,DIST CMP R0,#SHLDR IF LE CLR SHLDUP(R5) ENDF CMP R0,#KILLR IF LE BIT #7,RANDOM AND EQ MOV #1,DAMG(R5) ENDF CMP R0,#2 IF LE MOV #1,DESTY(R5) ENDF CMP R0,#2 IF LE CLR XVEL(R5) CLR YVEL(R5) CLR AVEL(R5) ENDF ADD #SEND,R5 CMP R5,#SHIP2+SEND WHILE LT ;NOW CHECK MISSLES MOV #M,R5 MOV #M+MEND,R4 LOOP CMP R4,MEXIST-2(R5) IF NE MOV #SUNX*100,R0 MOV #SUNY*100,R1 MOV MPX(R5),R2 MOV MPY(R5),R3 JSR PC,DIST CMP R0,#2 IF LE CLR MVX(R5) CLR MVY(R5) MOV R5,R3 ADD #MEXPL,R3 MOV R3,MEXPL-2(R5) ENDF ENDF MOV R4,R5 ADD #MEND,R4 CMP R5,#MENDS WHILE LT RTS PC .PAGE ;THIS UPDATES INFORMATION ON THE SHIPS SHIPP: ;FIRST WE SEE IF THE SHIPS ARE COLLIDING TST SHIP1+DESTY IF EQ TST SHIP2+DESTY AND EQ MOV SHIP1+XPOSS,R0 MOV SHIP1+YPOSS,R1 MOV SHIP2+XPOSS,R2 MOV SHIP2+YPOSS,R3 JSR PC,DIST CMP R0,#2*DAMR IF LT MOV #1,SHIP1+DESTY MOV #1,SHIP2+DESTY ENDF TST SHIP1+SHLDUP IF NE TST SHIP2+SHLDUP AND NE CMP R0,#2*SHLDR IF LE CLR SHIP1+SHLDUP CLR SHIP2+SHLDUP ENDF ELSE CMP R0,#SHLDR+DAMR IF LE CLR SHIP1+SHLDUP CLR SHIP2+SHLDUP ENDF ENDF ENDF ;NOW LOOK AT EACHSHIP MOV #S,R5 LPS: ;UPDATE SOME RESOURCE VALUES TST PV(R5) IF LT CLR PV(R5) ENDF SUB #E.TRN,EV(R5) TST EV(R5) IF GT ADD #P.TRN,PV(R5) CMP PV(R5),#77*400 IF GT MOV #77*400,PV(R5) ENDF ENDF ;NOW COMPUTE NEW POSSITION CLR XACC(R5) CLR YACC(R5) CLR AACC(R5) ;ANGULAR THRUST TST ANACC(R5) IF NE IF GT MOV #AAC*4,R0 ELSE MOV #-AAC*4,R0 ENDF SUB #E.ACC,EV(R5) MOVB PV+1(R5),R1 JSR PC,MULB SWAB R0 MOVB R0,R1 MOV R1,AACC(R5) ENDF ;LINEAR THRUST MOV APOSS(R5),R0 JSR PC,UVECT ;WE NEED THESE LATER TOO MOV R0,XUV(R5) MOV R1,YUV(R5) TST LACC(R5) IF NE IF GT MOV #LAC*4,R0 ELSE MOV #-LAC*4,R0 ENDF SUB #E.ACC,EV(R5) MOVB PV+1(R5),R1 JSR PC,MULB SWAB R0 MOVB R0,R2 ASL R2 ASL R2 MOV XUV(R5),R0 MOV R2,R1 JSR PC,MULB SWAB R0 MOVB R0,R1 MOV R1,XACC(R5) MOV YUV(R5),R0 MOV R2,R1 JSR PC,MULB SWAB R0 MOVB R0,R1 MOV R1,YACC(R5) ENDF ;GRAV THRUST MOV XPOSS(R5),R0 MOV YPOSS(R5),R1 JSR PC,GRAV ADD R0,XACC(R5) ADD R1,YACC(R5) ;UPDATE POSSITION ADD XACC(R5),XVEL(R5) ADD #100000,XPOSS(R5) ADD XVEL(R5),XPOSS(R5) IF VS ASR XVEL(R5) ASR XVEL(R5) ASR YVEL(R5) ASR YVEL(R5) ASR XVEL(R5) ASR YVEL(R5) ENDF ADD #100000,XPOSS(R5) ADD YACC(R5),YVEL(R5) ADD #100000,YPOSS(R5) ADD YVEL(R5),YPOSS(R5) IF VS ASR XVEL(R5) ASR XVEL(R5) ASR YVEL(R5) ASR YVEL(R5) ASR XVEL(R5) ASR YVEL(R5) ENDF ADD #100000,YPOSS(R5) ADD AACC(R5),AVEL(R5) MOV AVEL(R5),R0 IF LT NEG R0 ENDF CMP R0,#MAXAV IF GT MOV #MAXAV,R0 TST AVEL(R5) IF LT NEG R0 ENDF MOV R0,AVEL(R5) ELSE CMP R0,#MINAV IF LT TST ANACC(R5) AND EQ CLR AVEL(R5) ENDF ENDF ADD AVEL(R5),APOSS(R5) BIC #140000,APOSS(R5) ;CHECK SHEILD STATUS MOV SHLDUP(R5),TEMP1 ADD VANISH(R5),TEMP1 TST TEMP1 IF NE SUB #E.SHL,EV(R5) CMP #PTSHL,PV(R5) IF GT CLR VANISH(R5) CLR SHLDUP(R5) ELSE TST SHLDUP(R5) BEQ VA1 MOV R5,R4 ADD #SDEST,R4 CMP R4,SDEST-2(R5) IF NE MOV R4,SDEST-2(R5) SUB #P.SHLU,PV(R5) ENDF ENDF ELSE TST DESTY(R5) IF EQ MOV R5,R4 ADD #SDRAW-2,R4 MOV R4,SDEST-2(R5) ENDF ENDF BR VA2 VA1: MOV R5,R4 ADD #SGRAPH,R4 CMP R4,SDEST-2(R5) BEQ VA2 MOV R4,SDEST-2(R5) SUB #P.SHLU,PV(R5) ;CHECK FOR MISSLE FIREING VA2: TST MISSL(R5) IF NE TST MV(R5) AND GT CLR MISSL(R5) TST SHLDUP(R5) AND EQ SUB #M.MISF,MV(R5) ;FIND MISSLE SPOT MOV #M,R4 MOV #M+MEND,R3 LOOP CMP R3,MEXIST-2(R4) UNTIL EQ MOV R3,R4 ADD #MEND,R3 CMP R4,#MENDS WHILE NE CMP R4,#MENDS IF NE ;CREATE NEW MISSLE MOV R4,R3 ADD #MEXIST,R3 MOV R3,MEXIST-2(R4) MOV XVEL(R5),MVX(R4) MOV YVEL(R5),MVY(R4) MOV XPOSS(R5),MPX(R4) MOV YPOSS(R5),MPY(R4) MOV XUV(R5),R1 MOV #SHPS,R0 JSR PC,MULB ADD R0,MPX(R4) ASL R0 ADD R0,MPX(R4) MOV YUV(R5),R1 MOV #SHPS,R0 JSR PC,MULB ADD R0,MPY(R4) ASL R0 ADD R0,MPY(R4) MOV XUV(R5),R0 ASL R0 ASL R0 ASL R0 ADD R0,MVX(R4) MOV YUV(R5),R0 ASL R0 ASL R0 ASL R0 ADD R0,MVY(R4) ENDF ENDF ;SEE IF SHIP IS DESTOYED TST DESTY(R5) IF NE CLR EV(R5) CLR PV(R5) CLR MV(R5) CMP R5,#S BNE KK1 MOV #1,ENTERD BR KK2 KK1: MOV #1,KLINGD KK2: TST WINFLG BNE KK4 MOV ENTERD,CT2 ADD KLINGD,CT2 CMP CT2,#2 ; BOTH DESTROYED? BNE KK3 MOV #-74,WINCT INC WINFLG KK4: KK3: MOV #1,DDD MOV R5,R4 ADD #SHEXPL,R4 CMP R4,SDEST-2(R5) IF NE CLR SSR MOV R4,SDEST-2(R5) ELSE SUB #FRATE/2,SFADE(R5) TST SFADE(R5) IF LE CLR SFADE(R5) ENDF MOV SFADE(R5),R0 BIC #INTMSK,R0 BIC #INT7,SHEXPL(R5) BIS R0,SHEXPL(R5) ENDF ELSE ;CHECK FOR DAMAGE IF SO PICK A PROBLEM TO MAKE TST DAMG(R5) IF NE CLR SSR CLR DAMG(R5) MOV RANDOM,R0 BIC #177761,R0 CASET R0,10 CASE 1 CASE 2 SUB #10*M.MISF,MV(R5) CASE 3 SUB #20*M.MISF,MV(R5) CASE 4 ASR PV(R5) CASE 5 ASR EV(R5) CASE 6 SUB #30*E.ACC,EV(R5) CASE 7 MOV #1,ANACC(R5) CASE 10 MOV #1,DESTY(R5) ENDC ENDF ENDF ;NOW WE PREPARE A NEW DISPLAY, FIRST THE GRAPHS TST EV(R5) IF LE CLR PV(R5) CLR EV(R5) ENDF MOVB EV+1(R5),EG+2(R5) MOVB EV+1(R5),EG+6(R5) TST PV(R5) IF LT CLR PV(R5) ENDF MOVB PV+1(R5),PG+2(R5) MOVB PV+1(R5),PG+6(R5) TST MV(R5) IF LT CLR MV(R5) ENDF MOVB MV+1(R5),MG+2(R5) MOVB MV+1(R5),MG+6(R5) CMP R5,#S BNE NOTDIW TST DIWFLG BNE NOTDIW TST EV(R5) BNE NOTDIW TST MV(R5) BNE NOTDIW MOV R5,-(SP) ADD #SEND,R5 TST EV(R5) BNE NDIW1 TST MV(R5) BNE NDIW1 INC DIWFLG MOV #-74,WINCT INC ENTERD INC KLINGD MOV #1,DDD NDIW1: MOV (SP)+,R5 NOTDIW: ;NOW DRAW THE NEW SHIP,GET NEW POSSITON MOV XPOSS(R5),R0 FIX R0 MOV R0,SPOSS(R5) MOV YPOSS(R5),R0 FIX R0 MOV R0,SPOSS+2(R5) ;NOW GET OVX AND OVY MOV XUV(R5),R1 MOV #SHPS*4,R0 JSR PC,MULB SWAB R0 MOVB R0,R3 MOV YUV(R5),R1 MOV #SHPS*4,R0 JSR PC,MULB SWAB R0 MOVB R0,R4 ;NOW COMPUTE ALL OFF THE VECTORS IN TEMP MOV R3,R0 ADD R3,R0 ADD R3,R0 MOV R0,TEMP MOV R4,R1 ADD R4,R1 ADD R4,R1 MOV R1,TEMP+2 MOV R4,R2 ADD R0,R2 NEG R2 MOV R2,TEMP+4 MOV R3,R2 SUB R1,R2 MOV R2,TEMP+6 MOV R4,R2 SUB R3,R2 MOV R2,TEMP+10 MOV R2,TEMP+16 MOV R4,R2 ADD R3,R2 MOV R2,TEMP+14 NEG R2 MOV R2,TEMP+12 MOV R0,R2 SUB R4,R2 MOV R2,TEMP+20 MOV R3,R2 ADD R1,R2 MOV R2,TEMP+22 NEG R0 MOV R0,TEMP+24 NEG R1 MOV R1,TEMP+26 ;NOW MOV THESE INTO THE SCOPE CODE CLR R3 MOV R5,R4 ADD #SDRAW,R4 LOOP TST TEMP(R3) IF LT NEG TEMP(R3) BIS #020000,TEMP(R3) ENDF BIS #40000,TEMP(R3) MOV TEMP(R3),(R4)+ TST (R3)+ CMP R3,#30 WHILE LT CMP R5,#SHIP1 IF EQ BIC #40000,-4(R4) BIC #40000,-30(R4) ENDF ;NOW GO TO NEXT SHIP ADD #SEND,R5 CMP R5,#SHIP2+SEND IF LT JMP LPS ENDF RTS PC .PAGE TEMP: .BLKW 14 ;FINALLY WE UPDATE INFORMATION ON THE MISSLES. ENTERD: 0 KLINGD: 0 ENTER: 0 KLING: 0 WINCT: 0 WINFLG: 0 DIWFLG: 0 TEMP1: 0 DDD: 0 MISSLP: MOV #M,R5 MOV #M+MEND,R4 LOOP CMP R4,MEXIST-2(R5) IF EQ JMP SKIP1 ;TOO BIG FOR IF ENDF MOV MPX(R5),R0 MOV MPY(R5),R1 JSR PC,GRAV ADD R0,MVX(R5) ADD R1,MVY(R5) MOV MPX(R5),R0 FIX R0 MOV R0,MPOSS(R5) MOV MPY(R5),R0 FIX R0 MOV R0,MPOSS+2(R5) ADD MVX(R5),MPX(R5) ADD MVY(R5),MPY(R5) MOV MVX(R5),R0 IF LT NEG R0 FIX R0 BIS #20000,R0 ELSE FIX R0 ENDF BIS #40000,R0 MOV R0,MVEL(R5) MOV MVY(R5),R0 IF LT NEG R0 FIX R0 BIS #20000,R0 ELSE FIX R0 ENDF MOV R0,MVEL+2(R5) BIT #1777,MVEL(R5) IF EQ BIT #1777,MVEL+2(R5) AND EQ BIS #40000,MPOSS(R5) ENDF ;CHECK IF EXPLODED CMP R4,MEXPL-2(R5) IF NE ;IE EXPLODED SUB #FRATE,MFADE(R5) TST MFADE(R5) IF LE MOV R4,MEXIST-2(R5) MOV R4,MEXPL-2(R5) BIS #INT7,MEXPL(R5) CLR MPX(R5) CLR MPY(R5) CLR MVX(R5) CLR MVY(R5) MOV #INT7,MFADE(R5) MOV #MTIME,MTOUT(R5) ENDF BIC #40000,MVEL(R5) BIC #40000,MPOSS(R5) MOV MFADE(R5),R0 BIC #INTMSK,R0 BIC #INT7,MEXPL(R5) BIS R0,MEXPL(R5) ELSE ;NOT EXPLODED DEC MTOUT(R5) IF LE MOV R5,R3 ADD #MEXPL,R3 MOV R3,MEXPL-2(R5) ENDF MOV #S,R3 LOOP MOV R3,-(SP) MOV MPX(R5),R0 MOV MPY(R5),R1 MOV XPOSS(R3),R2 MOV YPOSS(R3),R3 JSR PC,DIST MOV (SP)+,R3 CMP R0,#SHLDR IF LE TST SHLDUP(R3) AND NE ;HIT ON SHEILD ASR MVX(R5) ASR MVY(R5) MOV R5,R2 ADD #MEXPL,R2 MOV R2,MEXPL-2(R5) SUB #E.SHLH,EV(R3) SUB #P.SHLH,PV(R3) ENDF CMP R0,#DAMR IF LE ;POSSIBLE DAMAGE BIT #7,RANDOM AND EQ MOV #1,DAMG(R3) ASR MVX(R5) ASR MVX(R5) ASR MVY(R5) ASR MVY(R5) MOV R5,R2 ADD #MEXPL,R2 MOV R2,MEXPL-2(R5) ENDF CMP R0,#KILLR IF LE MOV #1,DESTY(R3) MOV XVEL(R3),MVX(R5) MOV YVEL(R3),MVY(R5) MOV R5,R2 ADD #MEXPL,R2 MOV R2,MEXPL-2(R5) ENDF ADD #SEND,R3 CMP R3,#SHIP2+SEND IF GE OUTOF ENDF ENDL J ENDF SKIP1: MOV R4,R5 ADD #MEND,R4 CMP R5,#MENDS IF GE OUTOF ENDF ENDL J RTS PC .=22000 ;THIS IS THE TABLE OF DATA FOR THE TW0 SHIPS ;AND THEIR DISPLAYS. INITMS: SGM PNT PNT 10,650,HIDE SGM CHAR,4 .ASCII/ WELCOME TO SPACE WAR. YOU ARE INVOLVED IN A SERIES/<15><12> .ASCII/ OF BATTLES TO DETERMINE THE NEXT RULER OF THE GALAXY./<15><12> .ASCII/ THE GOOD GUYS (U.S.S. ENTERPRISE, THE SHIP WITH THE LINE/<15><12> .ASCII/ DOWN THE CENTER, CONTROLLED FROM THE TERMINET) ARE/<15><12> .ASCII/ ENGAGED IN HOSITILITIES WITH THE KLINGONS/<15><12> .ASCII/ (THE SHIP WITH NO LINE, CONTROLLED FROM THE GT40 KEYBOARD)./<15><12> .ASCII/ THIS WAR WILL LAST FOR 15 MINUTES; AT THAT TIME, AN/<15><12> .ASCII/ INTERGALACTIC COUNCIL WILL DECLARE A WINNER. GOOD LUCK./<15><12> .EVEN SJMP SCOPE2 STARS: SGM PNT,3 STARS1: PNT 150,1400 PNT 1350,320 PNT 1200,1200 PNT 1400,170 PNT 400,700 PNT 200,300 PNT 1030,1600 PNT 1450,1620 PNT 730,110 PNT 1605,1550 PNT 100,1000 PNT 1750,1050 PNT 250,776 PNT 1600,450 PNT 234,1245 PNT 775,330 PNT 220,1750 PNT 240,1000 PNT 630,1150 PNT 440,300 PNT 1400,740 PNT 1005,130 PNT 40,650 PNT 550,110 PNT 1150,1430 PNT 620,1330 PNT 1250,207 PNT 530,370 STARS2: PNT 430,1360 SRTS S: SHIP1: SGM PNT SPOSS=.-S PNT SUNX+SHIPX,SUNY+SHIPY,HIDE SJMP S+SDRAW-2 SDEST=.-S SJSR SHLD SGM LVEC,4,SOLID SDRAW=.-S OVX=0 OVY=SHPS LVEC 3*OVX,3*OVY,HIDE LVEC -3*OVX-OVY,-3*OVY+OVX LVEC OVY-OVX,-OVX-OVY LVEC OVX+OVY,OVY-OVX LVEC 3*OVX-OVY,3*OVY+OVX LVEC -3*OVX,-3*OVY,HIDE SJMP S+SGRAPH SHEXPL=.-S SGM RPNT,7,SDASH RPNT -LS,-LS SINTH JIGGLE SJSR LEXPL SGRAPH=.-S SGM PNT PNT 1700-GX,GX,HIDE SGM CHAR,4 .BYTE 'E,40,'P,40,'M,0 SGM LVEC,4,SOLID LVEC -100,30,HIDE EG=.-S LVEC 0,77 LVEC 34,-77,HIDE PG=.-S LVEC 0,77 LVEC 34,-77,HIDE MG=.-S LVEC 0,77 LVEC 34,-77,HIDE SJMP S+SEND XPOSS=.-S *100 YPOSS=.-S *100 APOSS=.-S 0 XVEL=.-S 0 YVEL=.-S 0 AVEL=.-S 0 XACC=.-S 0 YACC=.-S 0 AACC=.-S 0 XUV=.-S 0 YUV=.-S 0 SFADE=.-S INT7 SHLDUP=.-S 0 LACC=.-S 0 ANACC=.-S 0 MISSL=.-S 0 DESTY=.-S 0 DAMG=.-S 0 EV=.-S 77*400 PV=.-S 77*400 MV=.-S 77*400 VANISH=.-S 0 SEND=.-S SHIP2: SGM PNT PNT SUNX-SHIPX,SUNY-SHIPY,HIDE SJMP SHIP2+SDRAW-2 SJSR SHLD SGM LVEC,4,SOLID OVX=0 OVY=-SHPS LVEC 3*OVX,3*OVY LVEC -3*OVX-OVY,-3*OVY+OVX LVEC OVY-OVX,-OVX-OVY LVEC OVX+OVY,OVY-OVX LVEC 3*OVX-OVY,3*OVY+OVX LVEC -3*OVX,-3*OVY SJMP SHIP2+SGRAPH SGM RPNT,4,SDASH RPNT -LS,-LS SINTH JIGGLE SJSR LEXPL SGM PNT PNT GX,GX,HIDE SGM CHAR,4 .BYTE 'E,40,'P,40,'M,0 SGM LVEC,4,SOLID LVEC -100,30,HIDE LVEC 0,77 LVEC 34,-77,HIDE LVEC 0,77 LVEC 34,-77,HIDE LVEC 0,77 LVEC 34,-77,HIDE SJMP SHIP2+SEND *100 *100 .WORD 200*100,0,0,0,0,0,0,0,0,INT7,0,0,0,0,0,0,77*400,77*400,77*400 .WORD 0 SRTS .PAGE ;THIS IS THE TABLE OF MISSLES AND EXPLOSIONS SCORMS: SGM PNT,4 PNT 200,750,HIDE SGM CHAR .ASCII/VICTORY GOES TO THE / SCOPEA: SJMP ENTERM SCOPEB: SGM PNT PNT 20,500,HIDE SGM CHAR,4 .ASCII/U.S.S. ENTERPRISE -- / E1: .BYTE 0,0 SGM PNT PNT 20,400,HIDE SGM CHAR,4 .ASCII/B.K.E. MORONI-CAMORAH -- / K1: .BYTE 0,0 SJMP SCOPEP ENTERM: SGM CHAR,4,BLK .ASCII/ENTERPRISE/ SGM CHAR,4,NOBLK SJMP SCOPEB KLINGM: SGM CHAR,4,BLK .ASCII/MORONI-CAMORAH/ SGM CHAR,4,NOBLK SJMP SCOPEB TMS: SGM CHAR,4,BLK .ASCII/A TIE / SGM CHAR,,NOBLK SJMP DMS M: SJMP M+MEND MEXIST=.-M SGM PNT,3 MPOSS=.-M PNT SUNX,SUNY,HIDE SGM LVEC,3,SOLID MVEL=.-M LVEC 0,0 SJMP M+MEND MEXPL=.-M SGM RPNT,7 RPNT -SS,-SS SINTH JIGGLE SJSR SEXPL SJMP M+MEND MPX=.-M 0 MPY=.-M 0 MVX=.-M 0 MVY=.-M 0 MFADE=.-M INT7 MTOUT=.-M MTIME MEND=.-M ;NOW WE HAVE A WHOLE BUNCH OF SIMMILAR DATA- ;DISPLAY BLOCKS .REPT 37 MZ=. SJMP MZ+MEND SGM PNT,4 PNT SUNX,SUNY SGM LVEC,3,SOLID LVEC 0,0 SJMP MZ+MEND SGM RPNT,7 RPNT -SS,-SS SINTH JIGGLE SJSR SEXPL SJMP MZ+MEND .WORD 0,0,0,0,INT7,MTIME .ENDM MENDS: SRTS .PAGE ;HERE ARE SOME SIMPLE SCOPE SUBROUTINES. LEXPL: ;LARGE EXPLOSION (SHIPS SUN) SGM LVEC,,SDASH LVEC 3*LS,0,HIDE LVEC -5*LS,-2*LS LVEC 2*LS,5*LS LVEC 2*LS,-5*LS LVEC -5*LS,2*LS LVEC 5*LS,2*LS LVEC -2*LS,-5*LS LVEC -2*LS,5*LS LVEC 5*LS,-2*LS SRTS SEXPL: ;SMALL EXPLOSION SAME AS LARGE SS FOR LS SGM SVEC,,SDASH SVEC 3*SS,0,HIDE SVEC -5*SS,-2*SS SVEC 2*SS,5*SS SVEC 2*SS,-5*SS SVEC -5*SS,2*SS SVEC 5*SS,2*SS SVEC -2*SS,-5*SS SVEC -2*SS,5*SS SVEC 5*SS,-2*SS SRTS SHLD: ;SHEILD FOR A SHIP T=SHLDR/3 SGM SVEC,2,SOLID SVEC 2*T,2*T,HIDE SVEC T,-2*T SVEC -T,-2*T SVEC -2*T,-T SVEC -2*T,T SVEC -T,2*T SVEC T,2*T SVEC 2*T,T SVEC 2*T,-T SVEC -2*T,-2*T,HIDE SRTS SUN: ;THE SUN DISPLAY SGM PNT PNT SUNX,SUNY,HIDE SGM LVEC,4,SOLID RAY: LVEC 0,0 SGM PNT PNT SUNX,SUNY,HIDE SGM LVEC,4,SOLID RAY1: LVEC 0,0 SGM PNT RAYEND: PNT SUNX,SUNY,HIDE SGM PNT PNT 740,GX,HIDE SGM CHAR,4 TIME1: .BYTE 61,65,40,': TIME2: .BYTE 60,60,40,40 SRTS ENDMS: SGM PNT,5 PNT 100,600,HIDE SGM CHAR,4 .ASCII/THE NEW RULER OF THE UNIVERSE IS/ SGM PNT PNT 200,400,HIDE ENDA: SJMP EMS EMS: SGM CHAR,4,BLK .ASCII/THE U.S.S. ENTERPRISE / SGM CHAR,4,NOBLK SJMP DMS KMS: SGM CHAR,4,BLK .ASCII/THE B.K.E. MORONI-CAMORAH / SGM CHAR,4,NOBLK SJMP DMS DMS: SGM PNT PNT 100,50,HIDE SGM CHAR,3 .ASCII/(DISP WILL BE AUTOMATICALLY RELOADED/<15><12> .ASCII/ IN A FEW SECONDS)/ SJMP ENDMS .PAGE ;THIS CUTE LITLE PROGRAM MAKES EXLOPSIONS ;LOOK BETTER BY CUASEING THEM TO FUZZ BY JIGGLING ;IT JUST BINARY COUNTS ON THE SIGN BITS ;OF THE PRECEDING RPNT OR SVEC. JIGGLE: MOV R5,-(SP) MOV SPC,R5 SREXEC ;START UP SCOPE AGAIN CLR PSW SUB #4,R5 BIT #100,(R5) IF EQ BIS #100,(R5) ELSE BIC #100,(R5) BIT #20000,(R5) IF EQ BIS #20000,(R5) ELSE BIC #20000,(R5) ENDF ENDF MOV (SP)+,R5 RTI .PAGE ;HERE ARE SOME UTILLITY ROUTINES ;THEY SIMULATE MULTIPLICATION AND DIVISION ;MULB: R0=R0*R1 MULB: MOV R2,-(SP) MOV R0,R2 CLR R0 TST R1 IF LT NEG R2 ;WANT POSSITIVE MULTIPLIER NEG R1 ENDF ;NOW WE ARE SET UP DO A SET OF SHIFTS AND ADDS BR LPST2 LOOP ASL R2 LPST2: ASR R1 IF CS ADD R2,R0 ENDF WHILE NE ;NOW WE ARE DONE MOV (SP)+,R2 RTS PC .PAGE ;DIV: R0=R1/R0 REMAINDER IN R1 DIV: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R0,R2 MOV #1,R3 ;THIS KEEPS TRACK OF SHIFTING CLR R0 TST R2 IF NE ;NOOP ZERODIVIDE IF LT ;WANT POSITIVE NUMBERS NEG R2 ENDF TST R1 IF LT NEG R1 ENDF ;NOW WE ARE READY TO SHIFT AND SUBTRACT. ;FIND NUMBER OF BITS IN QUOTIENT LOOP CMP R2,R1 UNTIL GT ASL R3 ASL R2 WHILE PL ASR R2 ASR R3 BIC #100000,R3 ;NOW SHIFT AND SUBTRACT LOOP CMP R2,R1 IF LE BIS R3,R0 SUB R2,R1 ENDF ASR R2 ASR R3 WHILE NE ENDF ;NOW WE ARE DONE MOV (SP)+,R3 MOV (SP)+,R2 TST (SP)+ IF LT NEG R1 NEG R0 ENDF TST (SP)+ IF LT NEG R0 ENDF RTS PC .PAGE ;GRAV: THIS ROUTINE TAKES A (16,6) POSSITION VECTOR ;IN (R0,R1) AND RETURNS THE ACCELERATION DUE TO ;GRAVITATIONAL ATTRACTION OF THE SUN IN (R0,R1) GRAV: MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) ;GET HIGH ORDER 8 BITS OF POSSITON SWAB R0 BIC #177400,R0 SWAB R1 BIC #177400,R1 ;GET 7 BIT DISTANCE FROM SUN SUB #SUNX/4,R0 SUB #SUNY/4,R1 ;NEGATE VECTO AND SAVE IN (R3,R4) NEG R0 NEG R1 MOV R1,R4 MOV R0,R3 ;FIND LENGTH OF VECTOR SQUARED AND PUT IN R2 MOV R0,R1 JSR PC,MULB MOV R0,R2 MOV R4,R0 MOV R4,R1 JSR PC,MULB ADD R0,R2 ;NOW MULTIPLY (R3,R4) BY G G=400 IS ONLY REASONABLE CHOICE SWAB R3 SWAB R4 BIC #377,R3 BIC #377,R4 ;NOW DEVIDE VECTOR BY LENGTH SQUARED TO GET RESULT ;NOTE WE ARE USING 1/R FORCE LAW. MOV R2,R0 MOV R4,R1 JSR PC,DIV MOV R0,R4 MOV R2,R0 MOV R3,R1 JSR PC,DIV MOV R4,R1 ;NOW DONE MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 RTS PC .PAGE ;DIST: THIS ROUTINE COMPUTES THE CITY BLOCK ;METRIC DISTANCE BETWEEN TWO VECTORS. ;THE (16,6) VECTORS ARE (R0,R1),(R2,R3) ;THE INTEGER RESULT IN R0 ;MAKE INTEGERS (WE DON'T CARE ABOUT TWO LOST BITS) DIST: SWAB R0 SWAB R1 SWAB R2 SWAB R3 BIC #177400,R0 BIC #177400,R1 BIC #177400,R2 BIC #177400,R3 ;GET DIFFERENCE SUB R2,R0 SUB R3,R1 ;TAKES ABSOLUTE VALUE TST R0 IF LT NEG R0 ENDF TST R1 IF LT NEG R1 ENDF ;GET METRIC (AND PUT TWO BITS BACK) ADD R1,R0 ASL R0 ASL R0 RTS PC .PAGE ;UVECT: THIS ROUTINE DOSE SIN AND COS, IT RETURNS IN (R0,R1) ;A (15,6) UNIT VECTOR IN THE DIRECTION SPECIFIED BY THE ANGLE ;IN R0 (16,6) (THE ANGLE IS IN FRAMITS 256FRAMITS=360DEGREES) UVECT: FIX R0 MOV R0,-(SP) BIC #177700,R0 MOVB SINTAB(R0),R1 NEG R0 ADD #100,R0 MOVB SINTAB(R0),R0 BIT #200,(SP) IF NE NEG R0 NEG R1 ENDF BIT #100,(SP)+ IF NE MOV R0,-(SP) MOV R1,R0 MOV (SP)+,R1 NEG R0 ENDF RTS PC ;THIS IS THE SIN TABLE SINTAB: .BYTE 0, 1, 3, 4, 6,10,12,13 .BYTE 14,16,17,21,23,24,26,27 .BYTE 30,32,34,35,36,37,41,42 .BYTE 43,45,46,47,50,51,53,54 .BYTE 55,56,57,61,61,63,63,65 .BYTE 65,66,67,70,70,71,72,73 .BYTE 73,74,74,75,75,76,76,77 .BYTE 77,77,77,77,100,100,100,100,100,0 .PAGE ;TIMER: THIS ROUTINE USES DL11O IN ORDER TO TIME INTERVALS. ;THROUGH SIGNL IT TELLS THE DYNAMIC CALCULATORS WHEN TO RUN ;THE ROUTINE IS ENTERED ON EVER INTERUPT FROM DL11O SIGNL: .WORD 0 CNTER: .WORD 0 TIMER: CLR DL11OB ;SET FOR MORE TIMEING DEC CNTER IF LE CLR SIGNL MOV #/CRATE,CNTER ENDF RTI .PAGE ;KBIN: THIS ROUTINE MONETORS KBI IN ORDER TO GET THE CONTROL ;SIGNALS FOR SHIP1, IT JUST TRANSLATES THEM INTO BIT SETTINGS. ;THAT THE DYNAMIC ROUTINES WILL ACT ON LATER. KBIN: MOV #101,KBIS MOV KBIB,INP BIC #177600,INP CMP INP,#140 BLE KBIN1 SUB #40,INP KBIN1: CMPB INP,#3 BNE .+6 JMP TO3 CMPB INP,#4 BNE .+6 JMP TO3 CMPB INP,#<' > IF EQ MOV #1,SHIP1+MISSL ENDF CMPB INP,#'L BNE EKB1 COM SHIP1+SHLDUP BEQ EKB1 CLR SHIP1+VANISH EKB1: CMPB INP,#'J IF EQ CLR SHIP1+LACC CLR SHIP1+ANACC ENDF CMPB INP,#'U IF EQ MOV #1,SHIP1+LACC ENDF CMPB INP,#'M IF EQ MOV #-1,SHIP1+LACC ENDF CMPB INP,#'H IF EQ MOV #1,SHIP1+ANACC ENDF CMPB INP,#'K IF EQ MOV #-1,SHIP1+ANACC ENDF CMPB INP,#'G BNE EKB COM SHIP1+VANISH BEQ EKB CLR SHIP1+SHLDUP EKB: RTI INP: 0 STARPT: 0 .PAGE ;DL11IN: THIS ROUTINE IS IDENTICAL TO KBIN BUT FOR SHIP2 DL11IN: MOV #101,DL11IS MOV R0,-(SP) MOV DL11IB,R0 BIC #177600,R0 CMPB R0,#17 BNE .+10 TST (SP)+ JMP 166000 CMPB R0,#<' > IF EQ MOV #1,SHIP2+MISSL ENDF CMPB R0,#'L BNE EDL1 COM SHIP2+SHLDUP BEQ EDL1 CLR SHIP2+VANISH EDL1: CMPB R0,#'J IF EQ CLR SHIP2+LACC CLR SHIP2+ANACC ENDF CMPB R0,#'U IF EQ MOV #1,SHIP2+LACC ENDF CMPB R0,#'M IF EQ MOV #-1,SHIP2+LACC ENDF CMPB R0,#'H IF EQ MOV #1,SHIP2+ANACC ENDF CMPB R0,#'K IF EQ MOV #-1,SHIP2+ANACC ENDF CMPB R0,#'G BNE EDL COM SHIP2+VANISH BEQ EDL CLR SHIP2+SHLDUP EDL: MOV (SP)+,R0 RTI TOCT: 0 TIMOUT: CMP KLING,ENTER BHI KRULE BLO ERULE MOV #TMS,ENDA+2 BR TO2 KRULE: MOV #KMS,ENDA+2 BR TO2 ERULE: MOV #EMS,ENDA+2 TO2: MOV #ENDMS,SCOPE1+2 MOV #350,TOCT JMP START TO3: CLR 175614 TSTB 175614 BPL .-4 MOV #17,175616 TSTB 175614 BPL .-4 CLR 175616 TSTB 175614 BPL .-4 CLR 15776 JMP 166000 .END BEGIN