10  COM B$[15],L$[72],M$[72],N$[72]
11  COM I,E,L[108],F[200],E[100],I[200,2]
12  COM L,X,Y,Z
20  COM A$[72]
21  COM F$[6],F1
24  FILES *
25  PRINT "PROGRAM FILE NAME";
26  INPUT F$
27  B$="0123456789+-* #"
28  IF F$="//STOP" THEN 9999
29  GOTO 900
31  REM ASSEMBLY LANGUAGE PROGRAM WRITTEN BY TIES INSTRUCTIONAL STAFF
32  REM  OCTOBER 1970.  TO BE USED IN TEACHING COMPUTER SCIENCE CONCEPTS.
33  REM A$, B$, C$ ARE STRING WORK AREAS
34  REM T$, U$ ARE THE MNEMONIC OP CODE TABLE
35  REM L$, M$, N$ ARE THE LABEL TABLE
36  REM F(I) IS THE FLAG BIT ON EACH LOCATION, I THE LOCATION COUNTER
37  REM I(I,1) IS THE OP CODE, I(I,2) IS THE OPERAND
38  REM THE EXECUTION OF THE INPUT STATEMENTS IS HANDLED IN THREE
39  REM CHAINS   STPAL  HANDLES FIRST PASS,  STPAL1 HANDLES  PASS 2
40  REM  STPAL2 HANDLES THE EXECUTION OF THE TRANSLATED PROGRAM
41  REM EACH USER MUST   OPEN  THE  FILE  FILSAL   TO  AT LEAST
42  REM   5  SECTORS.  EACH 10 LINES OF ASSEMBLY STATEMENTS USES
43  REM  APPROXIMATELY ONE SECTOR, THUS 5 SECTORS ALLOWS 50 STATEMENTS
44  REM AFTER COMPLETING THE WORK FILSAL MAY BE KILLED IF ROOM IS 
45  REM NEEDED IN THE STORAGE OF OTHER PROGRAMS
46  REM STPAL3 IS A MACHINE PROGRAM IF THE PROGRAM IS TO BE WRITTEN
47  REM IN THE TRANSLATED LANGUAGE
48  PRINT '10'10'10"TYPE YES IF THIS  IS AN ASSEMBLY PROGRAM"
49  INPUT A$
50  IF A$[1,3]="YES" THEN 60
51  PRINT "ENTER MACHINE LANGUAGE STATEMENTS"
52  CHAIN "STPAL3"
60  L1=108
70  L$[1,2]="SQ"
80  L$[3,4]="TR"
90  L[1]=999
100  L[2]=998
110  A8=0
140  MAT F=ZER
150  MAT E=ZER
160  S=I=0
170  E=1
180  L=3
185  PRINT '10'10
190  PRINT "BEGINNING ASSEMBLY"
191  PRINT "TYPE 0 FOR NEW PROGRAM, 1 FOR RE-ASSEMBLE OLD PROGRAM.";
192  INPUT A9
193  IF A9=0 THEN 200
194  IF A9 <> 1 THEN 191
195  READ #1;A$
196  GOTO 220
200  IF A8 <> 0 THEN 210
204  PRINT '10"INPUT ASSEMBLY STATEMENTS"
208  A8=1
210  INPUT A$
220  IF A$[1,1]="*" THEN 530
230  I=I+1
240  IF A$[2,2]=" " THEN 280
250  IF A$[2,2]<"0" THEN 290
260  IF A$[2,2] <= "9" THEN 290
270  GOTO 320
280  IF A$[3,3]=" " THEN 480
290  PRINT "IMPROPER LABEL.  RE-INPUT STATEMENT."
300  I=I-1
310  GOTO 210
320  IF L <= L1 THEN 350
330  PRINT "LABEL TABLE FILLED, MUST RESTART"
340  GOTO 140
350  IF L<36 THEN 450
360  IF L>72 THEN 400
365  REM SECOND LABEL TABLE 
370  K=L-36
380  M$[2*K-1,2*K]=A$[2,3]
390  GOTO 460
400  REM THIRD LABEL TABLE
410  K=L-72
420  N$[2*K-1,2*K]=A$[2,3]
430  GOTO 460
440  REM FIRST LABEL TABLE
450  L$[2*L-1,2*L]=A$[2,3]
460  L[L]=I
470  L=L+1
480  IF A$[5,5]="+" THEN 580
490  IF A$[5,5]="-" THEN 580
500  IF A$[5,7]="ORG" THEN 650
510  IF A$[5,7]="DS " THEN 680
520  IF A$[5,7]="END" THEN 800
530  REM PUT INPUT STATEMENT INTO FILE SAVE AREA
531  IF A9=1 THEN 545
540  PRINT #1;A$[1,10]
545  IF A$[1,1]="*" THEN 193
550  F[I]=1
560  GOTO 193
570  REM POSITIVE OR NEGATIVE CONSTANT  FILL ZERO IF BLANK
580  FOR J=6 TO 10
590  IF A$[J,J]=" " THEN 610
600  GOTO 620
610  A$[J,J]="0"
620  NEXT J
630  GOTO 530
640  REM HANDLE ORG AND DS PSEUDO OPERATIONS
650  O1=I
660  I=0
670  GOTO 690
680  O1=I
690  C=N=0
692  FOR J=10 TO 8 STEP -1
693  X=0
694  FOR M=1 TO 10
695  IF A$[J,J]=" " THEN 702
696  IF A$[J,J]=B$[M,M] THEN 703
697  X=X+1
698  NEXT M
699  PRINT "ILLEGAL ITEM IN COLUMN",J,"RE-ENTER LINE"
700  PRINT A$
701  GOTO 210
702  X=0
703  N=N+X*10^C
704  C=C+1
705  NEXT J
730  I=I+N-1
740  IF I<O1 THEN 760
750  GOTO 530
760  PRINT "IMPROPER ORG OR DS AT",I,O1,"EXECUTION MAY BE MEANINGLESS"
770  GOTO 530
800  REM HANDLE END STATEMENT   END OF FIRST PASS"
801  IF A9=1 THEN 820
810  PRINT #1;A$[1,10]
820  READ #1,1
830  E1=0
840  I=1
850  P=1
851  PRINT '10
852  PRINT "LOC  OPADD   LAB  OP OPER"
853  PRINT 
860  CHAIN "STPAL1"
900  ASSIGN F$,1,F3
940  IF F3=0 THEN 48
960  PRINT "TYPE     OPEN-"F$",2 (RETURN),  THEN TYPE  RUN"
990  STOP 
1000  GOTO 900
9999  END 
