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
22  DIM T$[72],U$[72],C$[72]
30  FILES *
31  ASSIGN F$,1,F3
40  I=1
45  E1=0
49  READ #1,1
50  M=29
60  MAT I=ZER
70  T$="REALOAADDSUBMULDVQSTOPRTBONHLTUCBPSCDVRNOP"
80  U$="ZACBOZBOPPADBSARTCSCRSNRSNLRALPCLENDORGDS DSA"
90  REM RE ENTRY FOR GETTING NEXT STATEMENT
100  READ #1;A$
110  F[I]=1
120  FOR J=1 TO 14
121  C$[J,J]=" "
122  NEXT J
130  GOTO 1070
830  STOP 
840  REM GOSUB SUBROUTINE TO FIND VALUE OF N FROM STRING
850  C=F=N=0
860  FOR J=Y TO Z STEP -1
870  X=0
880  FOR G=1 TO 10
890  IF A$[J,J]=" " THEN 960
900  IF A$[J,J]=B$[G,G] THEN 970
910  X=X+1
920  NEXT G
930  PRINT "ILLEGAL ITEM COLUMN",J,"RE-ENTER LINE"
940  F=1
950  GOTO 1000
960  X=0
970  N=N+X*10^C
980  C=C+1
990  NEXT J
1000  RETURN 
1070  IF A$[1,1] <> "*" THEN 1100
1080  PRINT A$
1090  GOTO 90
1100  IF A$[5,5]="+" THEN 1230
1110  IF A$[5,5]="-" THEN 1230
1120  FOR J=1 TO M
1130  IF J>14 THEN 1160
1140  IF A$[5,7]=T$[3*J-2,3*J] THEN 1360
1150  GOTO 1180
1160  K=J-14
1170  IF A$[5,7]=U$[3*K-2,3*K] THEN 1360
1180  NEXT J
1190  PRINT "NEXT STATEMENT HAS INVALID OP CODE. RE-INPUT LINE."
1200  GOTO 1770
1220  REM HANDLE POS OR NEGATIVE CONSTANTS
1230  Y=10
1240  Z=6
1250  GOSUB 850
1260  IF F=1 THEN 1760
1270  IF A$[5,5]="+" THEN 1300
1280  F[I]=4
1290  GOTO 1310
1300  F[I]=5
1310  C$[5,5]=A$[5,5]
1320  I[I,1]=INT(N/1000)
1330  I[I,2]=N-I[I,1]*1000
1340  GOTO 1880
1350  REM OP CODE IS NOW J-1
1360  K=J-1
1370  IF K=M-4 THEN 1430
1375  IF K=M-1 THEN 1405
1380  IF K>M-4 THEN 1460
1390  I[I,1]=K
1400  GOTO 1480
1404  REM DSA  SET OP CODE PORTION TO 00
1405  I[I,1]=0
1406  GOTO 1480
1410  REM OP CODE  END SET LOCATION TO 000
1430  I[I,1]=-2
1440  GOTO 1480
1450  REM OP CODE  ORG OR DS SET OPCODE TO -1
1460  I[I,1]=-1
1470  REM CHECK COL9-10 FOR LEGAL LABLE
1480  IF A$[9,9] <= "9" THEN 1690
1490  FOR J=1 TO L-1
1500  IF J>36 THEN 1540
1510  REM USE FIRST LABEL TABLE
1520  IF A$[9,10]=L$[2*J-1,2*J] THEN 1660
1530  GOTO 1600
1540  IF J>72 THEN 1590
1550  REM USE SECOND LABEL TABLE
1560  IF A$[9,10]=M$[2*(J-36)-1,2*(J-36)] THEN 1660
1570  GOTO 1600
1580  REM USE THIRD LABEL TABLE
1590  IF A$[9,10]=N$[2*(J-72)-1,2*(J-72)] THEN 1660
1600  NEXT J
1610  PRINT "NEXT STATEMENT HAS INVALID OPERAND. RE-INPUT LINE."
1620  GOTO 1770
1650  REM J IS THE LABEL LOCATION L(J) IS STATEMENT LOCATION
1660  I[I,2]=L[J]
1670  GOTO 1800
1680  REM IMMEDIATE INSTRUCTION COLUMNS 9-10 NUMERIC
1690  F[I]=3
1700  Y=10
1710  Z=8
1720  GOSUB 850
1730  IF F=1 THEN 1760
1740  I[I,2]=N
1750  GOTO 1800
1760  PRINT "1234567890"
1770  PRINT A$
1780  INPUT A$
1790  GOTO 1070
1800  IF A$[8,8]="*" THEN 1820
1810  GOTO 1880
1820  IF F[I]=1 THEN 1850
1830  IF F[I]=3 THEN 1870
1840  GOTO 1880
1850  F[I]=2
1860  GOTO 1880
1870  F[I]=1
1880  IF I[I,1] <> -2 THEN 1900
1885  X=Y=Z=0
1888  GOTO 1930
1890  REM STWEIP ADDRESS AND CONVERT TO CHARACTERS
1900  X=INT(I/100)
1910  Y=INT((I-X*100)/10)
1920  Z=I-X*100-Y*10
1930  C$[1,1]=B$[X+1,X+1]
1940  C$[2,2]=B$[Y+1,Y+1]
1950  C$[3,3]=B$[Z+1,Z+1]
1959  W=25
1960  FOR J=15 TO W
1961  IF A$[J-14,J-14] <> " " THEN 1964
1962  C$[J,J]=" "
1963  GOTO 1965
1964  C$[J,J]=A$[J-14,J-14]
1965  NEXT J
1970  IF I[I,1]=-1 THEN 2030
1990  IF F[I]=2 THEN 2130
2000  IF F[I]=3 THEN 2160
2010  GOTO 2170
2020  REM DS OR ORG  OPCODE=13
2030  I[I,1]=13
2035  F[I]=1
2040  IF K=M-3 THEN 2070
2050  I=I+I[I,2]
2060  GOTO 2290
2070  I=I[I,2]
2080  C$[1,3]="   "
2090  GOTO 2290
2120  REM  INDIRECT * CODE IN COL 5
2130  C$[5,5]="*"
2140  GOTO 2170
2150  REM IMMEDIATE # CODE IN COL 5
2160  IF ((K=9 OR K=14) OR K=17) OR (K=19 OR K=20) THEN 2170
2165  C$[5,5]="#"
2170  X=INT(I[I,2]/100)
2180  Y=INT((I[I,2]-X*100)/10)
2190  Z=I[I,2]-X*100-Y*10
2200  C$[8,8]=B$[X+1,X+1]
2210  C$[9,9]=B$[Y+1,Y+1]
2220  C$[10,10]=B$[Z+1,Z+1]
2230  IF I[I,1]=-2 THEN 2320
2240  X=INT(I[I,1]/10)
2250  Y=I[I,1]-X*10
2260  C$[6,6]=B$[X+1,X+1]
2270  C$[7,7]=B$[Y+1,Y+1]
2280  I=I+1
2290  PRINT C$
2300  GOTO 90
2310  REM END STATEMENT READ END OF SECOND PASS
2320  C$[6,6]="1"
2330  C$[7,7]="0"
2340  PRINT C$
2420  IF E1=0 THEN 2450
2430  CHAIN "STPAL"
2440  REM GOOD ASSEMBLY TRY EXECUTION
2450  PRINT "ASSEMBLY COMPLETE, BEGINNING EXECUTION"
2451  PRINT '10'10'10
2460  I=I[I,2]
2470  CHAIN "STPAL2"
2480  END 
