1000  COM Q[100,3],I$[72],S$[37],Q,T,F,F1
1001  REM  ****  hp basic program library  *****************************
1002  REM
1003  REM         turing:  turing machine simulator  (tm*run, part 5 of 5)
1004  REM
1005  REM         36743 rev a -- 10/73
1006  REM
1007  REM  ****  contributed program  *************************************
1010  DIM W$[72]
1020  FILES TTAPE,TWORM
1030  IF F1#0 THEN 4210
1040  F1=1
1043  IF  END #1 THEN 4210
1046  IF  END #2 THEN 4210
1050  GOTO F OF 2000,2000,4000
2000  REM.....
2010  REM.....TURING MACHINE
2020  REM.....
2030  REM.....RUN  ( F=1 -- TRACE     F=2 -- NO TRACE )
2040  REM.....
2050  PRINT "INITIAL STATE";
2060  INPUT S
2070  IF S<0 OR S>99 OR S#INT(S) THEN 2050
2080  PRINT "INITIAL TAPE POSITION";
2090  INPUT P
2095  IF P<10 OR P>T-10 OR P#INT(P) THEN 2080
2100  IF F#1 THEN 2160
2110  PRINT 
2120  PRINT "QUINTUPLES---     TAPE-------------------"
2130  PRINT 
2140  PRINT "*** START ***";
2150  GOSUB 2900
2160  READ #1,1
2170  FOR I=0 TO P
2180  READ #1;T$
2190  NEXT I
2200  FOR I=1 TO 36
2210  IF S$[I,I]=T$ THEN 2250
2220  NEXT I
2230  PRINT '7'7'7"GOOF"
2240  GOTO 4210
2250  I=I-1
2260  N=S*100+I
2270  FOR I=1 TO Q
2280  IF Q[I,3]<0 THEN 2300
2290  IF Q[I,1]=N THEN 2370
2300  NEXT I
2310  N=INT(N/100)*100+36
2320  FOR I=1 TO Q
2330  IF Q[I,3]<0 THEN 2350
2340  IF Q[I,1]=N THEN 2370
2350  NEXT I
2360  GOTO 2230
2370  IF Q[I,2]-INT(Q[I,2]/100)*100=36 THEN 2580
2380  READ #1,1
2390  READ #2,1
2400  FOR J=0 TO P-1
2410  READ #1;T$
2420  PRINT #2;T$
2430  NEXT J
2440  K=1+Q[I,2]-INT(Q[I,2]/100)*100
2450  T$=S$[K,K]
2460  PRINT #2;T$
2470  READ #1;T$
2480  FOR J=P+1 TO T
2490  READ #1;T$
2500  PRINT #2;T$
2510  NEXT J
2520  READ #1,1
2530  READ #2,1
2540  FOR J=0 TO T
2550  READ #2;T$
2560  PRINT #1;T$
2570  NEXT J
2580  IF Q[I,3]#21 THEN 2600
2590  P=P-1
2600  IF Q[I,3]#27 THEN 2620
2610  P=P+1
2620  IF P<10 OR P>T-10 THEN 2230
2630  S=INT(Q[I,2]/100)
2640  J=I
2650  IF F#1 THEN 2870
2660  C=INT(Q[J,1]/100)
2670  M=INT(C/10)
2680  PRINT S$[M+1,M+1];
2690  M=C-M*10
2700  PRINT S$[M+1,M+1];
2710  PRINT " ";
2720  C=Q[J,1]-C*100
2730  PRINT S$[C+1,C+1];
2740  PRINT "  ";
2750  C=INT(Q[J,2]/100)
2760  M=INT(C/10)
2770  PRINT S$[M+1,M+1];
2780  M=C-M*10
2790  PRINT S$[M+1,M+1];
2800  PRINT " ";
2810  C=Q[J,2]-C*100
2820  PRINT S$[C+1,C+1];
2830  PRINT "  ";
2840  C=Q[J,3]
2850  PRINT S$[C+1,C+1];
2860  GOSUB 2900
2870  IF Q[J,1]#Q[J,2] OR Q[J,3]#12 THEN 2160
2880  PRINT 
2890  GOTO 4210
2900  READ #1,1
2910  PRINT TAB(18);
2920  FOR I=0 TO P+10
2930  READ #1;T$
2940  IF I<P-10 THEN 2990
2950  IF I=P THEN 2980
2960  PRINT T$;
2970  GOTO 2990
2980  PRINT " ";T$;" ";
2990  NEXT I
3000  PRINT P
3010  RETURN 
4000  REM.....
4010  REM.....TURING MACHINE
4020  REM.....
4030  REM.....RUN VERY FAST WITH IN CORE TAPE
4040  REM.....
4050  READ #1,1
4060  FOR I=1 TO 72
4070  READ #1;W$[I,I]
4080  NEXT I
4090  PRINT "INITIAL STATE";
4100  INPUT S
4110  IF S<0 OR S>99 OR S#INT(S) THEN 4090
4120  PRINT "INITIAL TAPE POSITION";
4130  INPUT P
4140  IF P<10 OR P>61 OR P#INT(P) THEN 4120
4150  P=P+1
4160  T$=W$[P,P]
4170  FOR I=1 TO 36
4180  IF S$[I,I]=T$ THEN 4220
4190  NEXT I
4200  PRINT '7'7'7"GOOF"
4210  READ #1,1
4211  READ #2,1
4215  CHAIN "TM"
4220  I=I-1
4230  N=S*100+I
4240  FOR I=1 TO Q
4250  IF Q[I,3]<0 THEN 4270
4260  IF Q[I,1]=N THEN 4340
4270  NEXT I
4280  N=INT(N/100)*100+36
4290  FOR I=1 TO Q
4300  IF Q[I,3]<0 THEN 4320
4310  IF Q[I,1]=N THEN 4340
4320  NEXT I
4330  GOTO 4200
4340  IF Q[I,2]-INT(Q[I,2]/100)*100=36 THEN 4380
4350  K=1+Q[I,2]-INT(Q[I,2]/100)*100
4360  T$=S$[K,K]
4370  W$[P,P]=T$
4380  IF Q[I,3]#21 THEN 4400
4390  P=P-1
4400  IF Q[I,3]#27 THEN 4420
4410  P=P+1
4420  IF P<1 OR P>72 THEN 4200
4430  S=INT(Q[I,2]/100)
4440  J=I
4450  IF Q[I,1]#Q[I,2] OR Q[I,3]#12 THEN 4160
4460  PRINT 
4470  PRINT W$
4480  GOTO 4210
4490  END 
