Copyright (c) 1974, Ward Cunningham All Rights Reserved PROGRAM DOTWAR (INPUT=201,OUTPUT=201,SPACE=201, + TAPE5=INPUT,TAPE6=OUTPUT,TAPE1=SPACE) ** DATA STRUCTURE * * GLOBLE (1) IDENT (77) TABLE HEADER * (2) NUMBER OF UPDATES * (3) TIME OF LAST UPDATE * * OBJECT (1,N) NAME OF OBJECT * (2,N) TIME OF CREATION * (3,N) TIME LAST UPDATED * (4,N) R VECTOR * (7,N) V VECTOR * (10,N) A VECTOR * * EVENT (1,N) TIME OF EVENT * (2,N) NAME OF OBJECT * (3,N) NEW A VECTOR COMMON G(10),O(12,20),E(5,40), TIME REAL B(9) * INITIALIZE CALL GETTIM(I1,I2) TIME=FLOAT(I1)*24.+FLOAT(I2)/3600. CALL RANF(TIME) DO 102 I1=1,450 I2=RANF(0) 102 G(I1)=0.0 REWIND 1 READ (1) G, O, E CALL GETUSR(USER) IU=LOCOBJ(USER) G(1)=7700 0000 0000 0000 0000B G(2)=G(2)+1 G(3)=TIME * PROCESS PENDING EVENTS 202 I2=0 TM=TIME DO 204 I1=1,40 IF(E(1,I1).EQ.0.0) GOTO 204 IF(TM.LE.E(1,I1)) GOTO 204 TM=E(1,I1) I2=I1 204 CONTINUE IF(I2.EQ.0) GOTO 207 I1=LOCOBJ(E(2,I2)) CALL MOTION(TM-O(3,I1), O(4,I1), O(7,I1), O(10,I1)) O(3,I1)=TM E(1,I2)=0.0 DO 206 I3=1,3 206 O(I3+9,I1)=E(I3+2,I2) GOTO 202 207 DO 208 I1=1,20 IF(O(1,I1).EQ.0.0) GOTO 208 CALL MOTION(TIME-O(3,I1), O(4,I1), O(7,I1), O(10,I1)) O(3,I1)=TIME 208 CONTINUE * PRINT OBJECT STATUS 302 TM=TIME-O(2,IU) HT=CLOCK(0) HD=DATE(0) PRINT 304, USER, TM,HT,HD, (O(I1,IU),I1=10,12) 304 FORMAT('1STATUS OF OBJECTS RELATIVE TO ',A10/ + ' TIME OF REPORT',G15.8,' HOURS',5X,2A10// + ' THRUST ',3G15.5,' MILES/HOUR/HOUR'// + ' OBJECT',10X,'X',14X,'Y',14X,'Z'/) DO 307 I1=1,20 IF(O(1,I1).EQ.0.0.OR.I1.EQ.IU) GOTO 307 DO 305 I2=1,9 B(I2)=O(3+I2,I1)-O(3+I2,IU) IF(ABS(B(I2)).LT.1.E-6) B(I2)=0.0 305 CONTINUE PRINT 306, O(1,I1), B 306 FORMAT(1X,A10,3G15.5,' MILES'/ + 11X,3G15.5, ' MILES/HOUR'/ + 11X,3G15.5,' MILES/HOUR/HOUR'/) 307 CONTINUE * READ DIRECTIVES CALL REOF(1) 402 CALL RC(I1,500S,500S) IF(I1.EQ.4HNAME) GOTO 630 IF(I1.EQ.5HRESET) GO TO 650 IF(I1.NE.2HAT.AND.I1.NE.2HIN) GO TO 710 CALL RR(TM,500S,500S) IF(I1.EQ.2HIN) TM=TM+TIME-O(2,IU) CALL RC(I2,500S,500S) IF(I2.EQ.5HCLEAR) GO TO 610 IF(I2.NE.4HMOVE) GO TO 710 DO 404 I2=1,40 IF(E(1,I2).EQ.0.0) GOTO 406 404 CONTINUE PRINT 405 405 FORMAT(/' EVENT STORAGE SPACE EXHAUSTED') CALL ABNORML 406 DO 407 I3=3,5 CALL RR(E(I3,I2),500S,500S) 407 E(I3,I2)=AMAX1(AMIN1(E(I3,I2),1.0E6),-1.0E6) E(2,I2)=USER E(1,I2)=AMAX1(TM+O(2,IU),TIME) GOTO 402 * LIST EVENTS 500 PRINT 502 502 FORMAT(//' PENDING COMMANDS'// + ' TIME EVENT'/) DO 506 I1=1,40 IF(E(1,I1).EQ.0.0) GOTO 506 IF(E(2,I1).NE.USER) GOTO 506 TM=E(1,I1)-O(2,IU) PRINT 504, TM, (E(I2,I1),I2=3,5) 504 FORMAT(1X,G15.8,' MOVE',3G15.5) 506 CONTINUE * WRITE NEW FILE 600 REWIND 1 WRITE (1) G, O, E STOP * CLEAR ALL EVENTS. 610 DO 620 I1=1,40 IF(E(1,I1).LT.TM.OR.E(2,I1).NE.USER) GO TO 620 E(1,I1)=0.0 620 CONTINUE GO TO 402 * CHANGE OBJECT SUBNAME 630 CALL RC(I1,500S,500S) I1=ISHIFT(I1,36).AND.6R;;;;;; O(1,IU)=(O(1,IU).AND.4L;;;;).OR.I1 GOTO 402 * RESET TIME 650 O(2,IU)=AINT(TIME) GO TO 402 * COMMAND ERROR 710 PRINT 712 CALL ABNORML 712 FORMAT(//' ILLEGAL COMMAND SYNTAX') END FUNCTION LOCOBJ(OBJ) COMMON G(10),O(12,20),E(5,40), TIME DO 102 L=1,20 IF((O(1,L).AND.4L;;;;).EQ.(OBJ.AND.4L;;;;)) GOTO 202 102 CONTINUE DO 104 L=1,20 IF(O(1,L).EQ.0.0) GOTO 107 104 CONTINUE PRINT 106 106 FORMAT(/' OBJECT STORAGE SPACE EXHAUSTED') CALL ABNORML 107 O(1,L)=OBJ O(2,L)=AINT(TIME) O(3,L)=TIME DO 108 I1=4,9 108 O(I1,L)=(RANF(0)-.5)*10000. DO 109 I1=10,12 109 O(I1,L)=0.0 202 LOCOBJ=L RETURN END SUBROUTINE MOTION(DT,R,V,A) REAL R(3),V(3),A(3) DO 1 I=1,3 R(I)=R(I)+V(I)*DT+.5*A(I)*DT**2 1 V(I)=V(I)+A(I)*DT RETURN END IDENT GETTIM SST LIST -B,-R SPACE 4 ** CALL GETTIM (IDAYS, ISECS) ENTRY GETTIM GETTIM PS 0 RETURN CURRENT TIME AND JULIAN DATE SX1 B0 SB3 B1 SB1 1 RJ BTM SA6 B2 SX1 B0 RJ BDT SA6 B3 EQ GETTIM SPACE 4 ** CALL GETUSR (IUSR) ENTRY GETUSR GETUSR PS 0 GET USER ID RELREAD ACTW MX1 3*6 BX1 X1*X6 RJ SFW SA6 B1 EQ GETUSR SPACE 4 XTEXT COMCBTD XTEXT COMCSFW SPACE 4 END