! ! KMC11 ASSEMBLER V2 ! STARTED GJB 28/03/78 ! UPDATED GJB 29/09/78 ! !%CONTROL K'101011' %BEGIN %OWNINTEGER FAULTS,LPTR,CLOC,DLOC,TYPE,VALUE,PRINT,LMAX,INST,PPTR,I,COUNT %OWNINTEGER CORD,SPTR,J,MACLEV,MTPTR,IN1,IN2,IN3,K,TOELSE,POSN %OWNINTEGER ASL=-1,LS=3 %RECORDFORMAT TF(%BYTEINTEGERARRAY NAME(0:5),%INTEGER TYPE,VALUE) %RECORD(TF)%ARRAY TAG(0:259) %RECORDFORMAT T1F(%BYTEINTEGERARRAYNAME NAME) %RECORDFORMAT T2F(%RECORD(TF)%ARRAYNAME NAME) %RECORD(T1F) T1 %RECORD(T2F)%NAME T2 %OWNBYTEINTEGERARRAY TTAG(0:2559) = %C 66, 0, 0, 0, 0, 0, 7, 0, 255, 255, 67, 0, 0, 0, 0, 0, 5, 0, 0, 0, 90, 0, 0, 0, 0, 0, 5, 0, 1, 0, 66, 82, 71, 0, 0, 0, 1, 0, 0, 97, 73, 70, 0, 0, 0, 0, 5, 0, 11, 0, 68, 69, 70, 0, 0, 0, 5, 0, 19, 0, 69, 78, 68, 0, 0, 0, 5, 0, 22, 0, 65, 78, 68, 0, 0, 0, 5, 0, 32, 0, 83, 80, 48, 0, 0, 0, 3, 0, 0, 6, 83, 80, 49, 0, 0, 0, 3, 0, 1, 6, 83, 80, 50, 0, 0, 0, 3, 0, 2, 6, 83, 80, 51, 0, 0, 0, 3, 0, 3, 6, 83, 80, 52, 0, 0, 0, 3, 0, 4, 6, 83, 80, 53, 0, 0, 0, 3, 0, 5, 6, 83, 80, 54, 0, 0, 0, 3, 0, 6, 6, 83, 80, 55, 0, 0, 0, 3, 0, 7, 6, 83, 80, 56, 0, 0, 0, 3, 0, 8, 6, 83, 80, 57, 0, 0, 0, 3, 0, 9, 6, 77, 65, 82, 0, 0, 0, 2, 0, 0, 16, 78, 80, 82, 0, 0, 0, 1, 0, 136, 162, 68, 65, 84, 65, 0, 0, 5, 0, 18, 0, 79, 82, 0, 0, 0, 0, 5, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 73, 83, 67, 0, 0, 1, 0, 153, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 68, 69, 83, 84, 1, 0, 0, 0, 80, 65, 71, 69, 0, 0, 2, 0, 0, 8, 80, 65, 71, 69, 48, 0, 5, 0, 6, 0, 80, 65, 71, 69, 49, 0, 5, 0, 7, 0, 80, 65, 71, 69, 50, 0, 5, 0, 8, 0, 80, 65, 71, 69, 51, 0, 5, 0, 9, 0, 82, 69, 80, 69, 65, 84, 5, 0, 16, 0, 69, 76, 83, 69, 0, 0, 5, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 73, 78, 73, 83, 72, 5, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 89, 67, 76, 69, 0, 5, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 72, 73, 76, 69, 0, 5, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 84, 82, 76, 0, 0, 5, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 77, 79, 82, 89, 1, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 85, 77, 80, 0, 0, 5, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 80, 49, 48, 0, 0, 3, 0, 10, 6, 83, 80, 49, 49, 0, 0, 3, 0, 11, 6, 67, 83, 82, 48, 0, 0, 1, 0, 0, 162, 67, 83, 82, 49, 0, 0, 1, 0, 17, 162, 65, 68, 82, 48, 0, 0, 1, 0, 0, 36, 65, 68, 82, 49, 0, 0, 1, 0, 17, 36, 85, 83, 82, 48, 0, 0, 1, 0, 136, 36, 85, 83, 82, 49, 0, 0, 1, 0, 153, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 67, 82, 79, 0, 5, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71, 83, 72, 82, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 80, 49, 50, 0, 0, 3, 0, 12, 6, 83, 80, 49, 51, 0, 0, 3, 0, 13, 6, 67, 83, 82, 50, 0, 0, 1, 0, 34, 162, 67, 83, 82, 51, 0, 0, 1, 0, 51, 162, 65, 68, 82, 50, 0, 0, 1, 0, 34, 36, 65, 68, 82, 51, 0, 0, 1, 0, 51, 36, 85, 83, 82, 50, 0, 0, 1, 0, 170, 36, 85, 83, 82, 51, 0, 0, 1, 0, 187, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 80, 49, 52, 0, 0, 3, 0, 14, 6, 83, 80, 49, 53, 0, 0, 3, 0, 15, 6, 67, 83, 82, 52, 0, 0, 1, 0, 68, 162, 67, 83, 82, 53, 0, 0, 1, 0, 85, 162, 65, 68, 82, 52, 0, 0, 1, 0, 68, 36, 65, 68, 82, 53, 0, 0, 1, 0, 85, 36, 85, 83, 82, 52, 0, 0, 1, 0, 204, 36, 85, 83, 82, 53, 0, 0, 1, 0, 221, 36, 76, 73, 83, 84, 0, 0, 5, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 83, 82, 54, 0, 0, 1, 0, 102, 162, 67, 83, 82, 55, 0, 0, 1, 0, 119, 162, 65, 68, 82, 54, 0, 0, 1, 0, 102, 36, 65, 68, 82, 55, 0, 0, 1, 0, 119, 36, 85, 83, 82, 54, 0, 0, 1, 0, 238, 36, 85, 83, 82, 55, 0, 0, 1, 0, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 %CONSTINTEGER MAX LABS=15 %OWNINTEGERARRAY PENDING(0:MAX LABS) %OWNINTEGERARRAY CONTROL(0:1023)=K'160000'(*) %CONSTINTEGER MAX LINE=140 %OWNBYTEINTEGERARRAY LINE(0:MAX LINE) %ownbyteintegerarray oline(0:max line) %OWNINTEGERARRAY DATA(0:1023)=-1(*) %CONSTINTEGER UNKNOWN=0,DEST=1,MEM=2,SP=3,CONST=4,KEYWORD=5,MACRO=6,MEMORY=7 %CONSTINTEGER C=0,BRG7=5,PAGE0=6,PAGE3=9,JUMP=10,IF=11,ELSE=12 %CONSTINTEGER FINISH=13,CYCLE=14,WHILE=15,REPEAT=16,CTRL=17,DTA=18,DEF=19 %CONSTINTEGER MAC=20,LST=21,MEND=22,AIF=23,AELSE=24,AFINISH=25,AND=32,OR=33 %CONSTINTEGER SRC MASK=K'160360',MEM MASK=K'14000',DEST MASK=K'3417' %CONSTINTEGER SPM=6,BREG=K'400' %RECORDFORMAT LF(%INTEGER DATA,PTR) %CONSTINTEGER MAX CELL=256 %RECORD(LF)%ARRAY LIST(0:MAX CELL-1) %INTEGERNAME LAST %RECORDFORMAT NF(%INTEGER TYPE,VAL1,VAL2) %CONSTINTEGER NEST MAX=10 %RECORD(NF)%ARRAY NEST(1:NEST MAX) %CONSTINTEGER PARMAX=6 %RECORDFORMAT MF(%INTEGER PTR,COND,TPTR,%INTEGERARRAY PARS(1:PAR MAX)) %CONSTINTEGER MACMAX=5 %RECORD(MF)%ARRAY MSTACK(1:MAC MAX) %RECORDFORMAT PF(%BYTEINTEGERARRAY NAME(0:5),%INTEGER LEN) %RECORD(PF)%ARRAY PARAM(1:PAR MAX) %CONSTINTEGER TEXT MAX=8192 %BYTEINTEGERARRAY STORE(0:TEXT MAX) %SWITCH KEY(JUMP:AFINISH) ! %CONSTBYTEINTEGERARRAY INCMAR(0:9)=',','M','A','R','=','M','A','R','+','1' %CONSTBYTEINTEGERARRAY OPRTR(3:29)=1,'+',0,1,'-',0,2,'!','!',1,'!',0,1,'&',0, 2,'>','>',2,'<','<',1,'*',0,1,'/',0 %CONSTBYTEINTEGERARRAY PRIOR(0:9)=5,1,1,3,3,3,4,4,2,2 %CONSTBYTEINTEGERARRAY REL(0:17)=1,'#',0,1,'=',0,2,'<','=',2,'>','=', 1,'<',0,1,'>',0 %ROUTINE DUMP(%INTEGER VAL) PRINT ch(VAL>>8); PRINT ch(VAL&K'377') %END %ROUTINE PRINT LINE %INTEGER I SPACES(2) PRINT SYMBOL(oLINE(I)) %FOR I=0,1,LMAX-1 PRINT=1 %END %ROUTINE ERROR(%INTEGER TYPE,NUMBER) %CONSTSTRING(19)%ARRAY MESSAGE(1:10)= %C "LIMIT EXCEEDED", "INVALID ASS EXPR", "INVALID RUN EXPR", "INVALID COND", "INVALID ASSIGN", "INVALID JUMP", "BAD TERMINATOR", "NESTING", "DIRECTIVE", "MACRO CALL" SPACES(13) %AND PRINT LINE %IF PRINT=0 SPACES(LPTR+15); PRINT SYMBOL('|'); NEWLINE PRINT STRING("************** ERROR : ") PRINT STRING(MESSAGE(TYPE)); PRINT STRING(" [") WRITE(NUMBER,0); PRINT STRING(" ]"); NEWLINE FAULTS=FAULTS+1 %END %integerfn MATCH(%BYTEINTEGERARRAYNAME MASTER,%INTEGER ADDRESS,LEN,MLEN,SP) %INTEGER I,J J=LPTR %CYCLE I=ADDRESS,1,ADDRESS+LEN-1 %result = 0 %UNLESS LINE(J)=MASTER(I) J=J+1 %UNTIL SP=0 %OR LINE(J)#' ' %REPEAT %CYCLE I=ADDRESS+LEN,1,ADDRESS+MLEN-1 %result = 0 %UNLESS MASTER(I)=0 %REPEAT LPTR=J %result = 1 %END %ROUTINE CODE DUMP(%INTEGER WORD,LOC) %INTEGER I,J %IF LOC=-2 %THEN I=8 %ELSE I=0 %IF LOC<0 %THEN LOC=CLOC %AND CLOC=(CLOC+1)&K'1777' %AND J=0 %ELSE J=1 CONTROL(LOC)=WORD %IF (LS>1 %OR (LS=1 %AND MACLEV=0)) %AND (PRINT=J=0 %OR LS>2) %START WRITE(LOC,6) %IF J=1 %THEN PRINT STRING("* ") %ELSE SPACES(2) %CYCLE I=12,-4,I J=WORD>>I&15 %IF J<10 %THEN PRINT SYMBOL(J+'0') %ELSE PRINT SYMBOL(J-10+'A') %REPEAT PRINT STRING("__") %IF I=8 %IF PRINT=0 %THEN PRINT LINE %ELSE NEWLINE %FINISH %END %ROUTINE DATA DUMP(%INTEGER BYTE,LOC) %INTEGER I %IF LOC=-1 %THEN LOC=DLOC %AND DLOC=(DLOC+1)&K'1777' %AND I=0 %ELSE I=1 DATA(LOC)=BYTE %IF (LS>1 %OR (LS=1 %AND MACLEV=0)) %AND (PRINT=I=0 %OR LS>2) %START PRINT STRING("@@"); WRITE(LOC,4) %IF I=1 %THEN PRINT SYMBOL('*') %ELSE SPACE %IF BYTE<0 %THEN PRINT STRING(" ___") %ELSE WRITE(BYTE,4) %IF PRINT=0 %THEN PRINT LINE %ELSE NEWLINE %FINISH %END %INTEGERFN CELL(%INTEGER DATA,PTR) %INTEGER I %RESULT=0 %IF ASL=-1 %IF PTR<-1 %START LAST=-2-PTR; LIST(LAST)_DATA=DATA; %RESULT=LAST %FINISH ERROR(1,3) %AND %STOP %IF ASL=MAX CELL I=ASL; ASL=LIST(I)_PTR LIST(I)_DATA=DATA %IF PTR=-1 %THEN LIST(I)_PTR=I %ELSE LIST(I)_PTR=LIST(PTR)_PTR %AND %C LIST(PTR)_PTR=I %RESULT=I %END %INTEGERFN CONVERT(%INTEGER VAL) %RESULT=VAL<<3&MEM MASK!VAL&K'377' %END %ROUTINE ASSIGN(%INTEGER VAL,END,ALL) %INTEGER I,J I=LIST(END)_PTR; LIST(END)_PTR=-ALL-1 %WHILE LIST(I)_PTR#-1 %CYCLE J=LIST(I)_DATA %IF J<1024 %START %UNLESS 4#CONTROL(J)>>13<6 %START CODE DUMP(CONTROL(J)&K'163400'!CONVERT(VAL),J) %FINISH %ELSE CODE DUMP(CONTROL(J)&K'177400'!VAL&K'377',J) %FINISH %ELSE DATA DUMP(VAL&K'377',J-1024) J=LIST(I)_PTR; %EXIT %IF J<0 LIST(I)_PTR=ASL; ASL=I; I=J %REPEAT LIST(I)_PTR=ASL; ASL=I %END %integerfn VALID RHS %INTEGER I %IF TYPE=CONST %START I=VALUE!1<<8; VALUE=3<<13 %FINISH %ELSE %IF TYPE=SP %START I=3<<13!1<<8!8<<4!VALUE&15; VALUE=3<<13 %FINISH %ELSE %IF TYPE=DEST %AND VALUE>>13#0 %START %result = 1 %IF 2<=VALUE>>13<=3 I=VALUE&SRC MASK!1<<8; VALUE=3<<13 %FINISH %ELSE %IF TYPE=MEMORY %AND VALUE>=0 %START I=VALUE&K'377'!2<<11; VALUE=2<<13 %FINISH %ELSE %result = 0 IN1=I %result = 1 %END %integerfn MSTORE(%INTEGER VAL) ERROR(1,7) %AND %result = 0 %IF MTPTR=TEXT MAX STORE(MTPTR)=VAL; MTPTR=MTPTR+1 %result = 1 %END %integerfn LINE END %result = 0 %IF ';'#LINE(LPTR)#NL %result = 1 %END %INTEGERFN READ LINE %integer i,j %on %event 9 %start %result = 1 %finish LMAX=1 %CYCLE %IF MACLEV=0 %THEN READ SYMBOL(I) %ELSE %START I=STORE(MSTACK(MACLEV)_PTR) MSTACK(MACLEV)_PTR=MSTACK(MACLEV)_PTR+1 %FINISH %IF I&K'200'#0 %START %IF I=255 %START J=MSTACK(MACLEV)_COND ASSIGN(CLOC,J,1) %IF J>=0 MTPTR=MSTACK(MACLEV)_TPTR MACLEV=MACLEV-1 %CONTINUE %FINISH J=MSTACK(MACLEV)_PARS(I&K'177') %IF J=-1 %THEN ERROR(10,1) %ELSE %START MACLEV=MACLEV+1 MSTACK(MACLEV)_COND=-1; MSTACK(MACLEV)_TPTR=MTPTR MSTACK(MACLEV)_PTR=J %FINISH %FINISH %ELSE %START oline(lmax-1) = i %if 'a' <= i <= 'z' %then i = i-'a'+'A' LINE(LMAX-1)=I; %EXIT %IF I=NL %RESULT=1 %IF I=4 LMAX=LMAX+1 %IF LMAX=0 %THEN TYPE=CONST %ELSE %C TYPE=-1 %AND LPTR=J %FINISH %ELSE %IF 'A'<=LINE(LPTR)<='Z' %START J=LPTR IDENTIFIER(TEMP,I) K=LPTR; LPTR=J; J=K VALUE=TEMP(2)>>1&15!(TEMP(3)&30)<<3 K=VALUE %IF CORD=0 %THEN L=CLOC %ELSE L=DLOC+1024 %UNTIL K=VALUE %CYCLE ->OUT %IF TAG(K)_NAME(0)=0 %OR MATCH(TAG(K)_NAME,0,I,6,0)=1 K=(K+1)&K'377' %REPEAT ERROR(1,1); %STOP out: %IF TAG(K)_NAME(0)=0 %START TYPE=UNKNOWN TAG(K)_NAME(I)=TEMP(I) %FOR I=0,1,5 TAG(K)_TYPE=UNKNOWN; TAG(K)_VALUE=CELL(L,-1) VALUE=K; LAST==TAG(K)_VALUE %FINISH %ELSE %START TYPE=TAG(K)_TYPE %IF TYPE=UNKNOWN %START TAG(K)_VALUE=CELL(L,TAG(K)_VALUE) VALUE=K; LAST==TAG(K)_VALUE %FINISH %ELSE VALUE=TAG(K)_VALUE %FINISH POSN=K %IF LINE(J)='.' %AND (TYPE=SP %OR (TYPE=DEST %AND VALUE>>13#0)) %START %CYCLE I=4,1,7 %IF LINE(J+1)=BIT(I) %START J=J+2 TYPE=KEYWORD %AND VALUE=3<<13!I<<8!8<<4!VALUE&15 %AND %EXIT %IF TYPE=SP TYPE=KEYWORD VALUE=VALUE&SRC MASK!I<<8 %AND %EXIT %UNLESS 1#VALUE>>13#5 VALUE=2<<13!I<<8!9<<4 %AND %EXIT %IF VALUE>>13=2 VALUE=I-2+C; %EXIT %FINISH %REPEAT %FINISH LPTR=J SKIP SPACES %IF TYPE=MEMORY %AND VALUE=-1 %AND LINE(LPTR)='(' %START LPTR=LPTR+1; GET TAG; VALUE=GET ASS EXPR VALUE=-1 %UNLESS LINE(LPTR)=')' LPTR=LPTR+1; SKIP SPACES TYPE=MEMORY %FINISH %FINISH %ELSE TYPE=-1 %END %INTEGERFN GET ASS EXPR %INTEGER I,OPTR,PTR; %INTEGERARRAY OP(1:5),STACK(1:6) %ROUTINE EVAL %INTEGER LH,RH,OPR; %SWITCH SW(1:9) RH=STACK(PTR); OPR=OP(OPTR); OPTR=OPTR-1 %IF OPR=0 %THEN STACK(PTR)=\RH %ELSE %START PTR=PTR-1; LH=STACK(PTR) ->SW(OPR) SW(1):STACK(PTR)=LH+RH; %RETURN SW(2):STACK(PTR)=LH-RH; %RETURN SW(3):STACK(PTR)=LH!!RH; %RETURN SW(4):STACK(PTR)=LH!RH; %RETURN SW(5):STACK(PTR)=LH&RH; %RETURN SW(6):STACK(PTR)=LH>>RH; %RETURN SW(7):STACK(PTR)=LH<0 %AND OP(OPTR)=0 %THEN OPTR=OPTR-1 %ELSE %C OPTR=OPTR+1 %AND OP(OPTR)=0 LPTR=LPTR+1 GET TAG %REPEAT %IF TYPE=CONST %START PTR=PTR+1; STACK(PTR)=VALUE %FINISH %ELSE %IF TYPE=UNKNOWN %AND PTR=0 %START GET TAG; %RESULT=-2 %FINISH %ELSE %IF TYPE=-1 %AND LINE(LPTR)='(' %START LPTR=LPTR+1; GET TAG I=GET ASS EXPR %RESULT=-1 %IF I<0 ERROR(7,3) %AND %RESULT=-1 %UNLESS TYPE=-1 %AND LINE(LPTR)=')' LPTR=LPTR+1 PTR=PTR+1; STACK(PTR)=I %FINISH %ELSE ERROR(2,1) %AND %RESULT=-1 GET TAG %IF TYPE=-1 %START %CYCLE I=1,1,9 %if match (OPRTR,3*I+1,OPRTR(3*I),2,0) = 1 %START EVAL %WHILE OPTR>0 %AND PRIOR(I)<=PRIOR(OP(OPTR)) OPTR=OPTR+1; OP(OPTR)=I ->OUT %FINISH %REPEAT %FINISH EVAL %WHILE OPTR>0 %RESULT=STACK(1)&K'1777' OUT:GET TAG %REPEAT %END %INTEGERFN GET RUN EXPR(%INTEGER IN) %INTEGER I,RESULT; %SWITCH SW(1:5) %IF TYPE=DEST %START %IF 2<=VALUE>>13<=3 %THEN %RESULT=VALUE&SRC MASK!9<<4 %UNLESS 1#VALUE>>13#5 %OR IN#1 %THEN %RESULT=VALUE&SRC MASK %if valid rhs = 1 %THEN %RESULT=VALUE ERROR(2,1); %RESULT=-1 %FINISH RESULT=VALUE&15 %CYCLE I=1,1,5 GET TAG %AND ->SW(I) %if match (OPRTR,3*I+1,OPRTR(3*I),2,0) = 1 %REPEAT %RESULT=3<<13!8<<4!RESULT SW(1): ! + %IF TYPE=SP %AND VALUE&15=RESULT&15 %START %RESULT=RESULT!3<<13!5<<4 %UNLESS LINE(LPTR)='+' LPTR=LPTR+1; GET TAG %RESULT=RESULT!3<<13!6<<4 %IF TYPE=KEYWORD %AND VALUE=C ERROR(3,2); %RESULT=-1 %FINISH %IF TYPE=KEYWORD %AND VALUE=C %THEN %RESULT=RESULT!3<<13!4<<4 %IF TYPE=CONST %AND VALUE=1 %THEN %RESULT=RESULT!3<<13!3<<4 %if valid rhs = 1 %START RESULT=RESULT!VALUE&SRC MASK %RESULT=RESULT %UNLESS LINE(LPTR)='+' LPTR=LPTR+1 GET TAG %IF TYPE=KEYWORD %AND VALUE=C %THEN %RESULT=RESULT!1<<4 ERROR(3,2); %RESULT=-1 %FINISH ERROR(3,1); %RESULT=-1 SW(2): ! - %IF TYPE=CONST %AND VALUE=1 %THEN %RESULT=3<<13!RESULT!7<<4 %if valid rhs = 1 %START RESULT=RESULT!VALUE&SRC MASK %RESULT=RESULT!14<<4 %UNLESS LINE(LPTR)='-' LPTR=LPTR+1 GET TAG %IF TYPE=CONST %AND VALUE=1 %THEN %RESULT=RESULT!15<<4 %IF TYPE=-1 %AND LINE(LPTR)='\' %START LPTR=LPTR+1 GET TAG %IF TYPE=KEYWORD %AND VALUE=C %THEN %RESULT=RESULT!2<<4 ERROR(3,2); %RESULT=-1 %FINISH ERROR(3,1); %RESULT=-1 %FINISH ERROR(3,1); %RESULT=-1 SW(3): ! !! %if valid rhs = 1 %START %RESULT=RESULT!VALUE&SRC MASK!13<<4 %FINISH ERROR(3,1); %RESULT=-1 SW(4): ! ! %if valid rhs = 1 %START %RESULT=RESULT!VALUE&SRC MASK!12<<4 %FINISH %IF TYPE=-1 %AND LINE(LPTR)='\' %START LPTR=LPTR+1 GET TAG %if valid rhs = 1 %START %RESULT=RESULT!VALUE&SRC MASK!10<<4 %FINISH ERROR(3,1); %RESULT=-1 %FINISH ERROR(3,1); %RESULT=-1 SW(5): ! & %if valid rhs = 1 %START %RESULT=RESULT!VALUE&SRC MASK!11<<4 %FINISH ERROR(3,1); %RESULT=-1 %END %INTEGERFN GET EXPRESSION(%INTEGER IN) GET TAG %AND %RESULT=2<<13!9<<4 %IF TYPE=MEMORY %AND VALID RHS=1 %IF TYPE=DEST %OR TYPE=SP %THEN I=GET RUN EXPR(IN) %AND GET TAG %ELSE %C I=GET ASS EXPR %RESULT=I %END %INTEGERFN CONDITION(%INTEGER TORF,ADDR,%INTEGERNAME FORWARD) %INTEGER I,J,K,JPTR %RECORDFORMAT JF(%INTEGER INST,ADDR) %RECORD(JF)%ARRAY JUMP(1:30) %ROUTINE PUSH(%INTEGER INST,ADDR) ERROR(1,8) %AND JPTR=0 %IF JPTR=30 JPTR=JPTR+1; JUMP(JPTR)_INST=INST; JUMP(JPTR)_ADDR=ADDR %END JPTR=0 %CYCLE GET TAG %IF TYPE=KEYWORD %AND (C<=VALUE<=BRG7 %OR VALUE>>8#0) %START %IF C<=VALUE<=BRG7 %THEN I=(VALUE-C+2)<<8 %ELSE %START I=VALUE&X'700' PUSH(VALUE&X'E0FF'!1<<8,-1) %FINISH K=0 %UNLESS '='#LINE(LPTR)#'#' %START K=1 %IF LINE(LPTR)='=' LPTR=LPTR+1; GET TAG ERROR(4,2) %AND %RESULT=-1 %UNLESS TYPE=CONST %AND VALUE=0 %FINISH %FINISH %ELSE %IF TYPE=SP %START %CYCLE I=0,1,5 ->OUT %if match (REL,3*I+1,REL(3*I),2,0) = 1 %REPEAT ERROR(4,1); %RESULT=-1 OUT:J=VALUE&15; GET TAG %IF TYPE=CONST %AND VALUE=0 %AND (I<3 %OR I=6) %START PUSH(3<<13!7<<4!J,-1) %FINISH %ELSE %START K=IN1; IN1=0 %if valid rhs = 1 %START PUSH(IN1,-1) %IF IN1#0; IN1=K %IF I<3 %OR I=6 %THEN PUSH(VALUE&SRC MASK!15<<4!J,-1) %ELSE %C PUSH(VALUE&SRC MASK!14<<4!J,-1) %FINISH %ELSE ERROR(4,4) %AND %RESULT=-1 %FINISH K=(I+1)&1 %IF I<2 %THEN I=3<<8 %ELSE I=2<<8 %FINISH %ELSE ERROR(4,3) %AND %RESULT=-1 GET TAG %IF TYPE=KEYWORD %AND ((K=0 %AND VALUE=AND) %OR (K=1 %AND VALUE=OR)) %START PUSH(4<<13!I!CONVERT(CLOC+JPTR+2),-1) %IF TORF=K %START %IF ADDR>>10&1#0 %START FORWARD=CELL(CLOC+JPTR,FORWARD) PUSH(ADDR&K'160000'!1<<8,-2) %FINISH %ELSE %IF ADDR>=0 %THEN PUSH(4<<13!1<<8,ADDR) %ELSE %C PUSH(ADDR!1<<8,-1) %FINISH %ELSE PUSH(4<<13!1<<8,0) %FINISH %ELSE %IF TYPE=KEYWORD %AND ((K=0 %AND VALUE=OR) %OR (K=1 %AND VALUE=AND)) %START %IF TORF=K %THEN PUSH(4<<13!I,0) %ELSE %START %IF ADDR>>10&1#0 %START FORWARD=CELL(CLOC+JPTR,FORWARD) PUSH(ADDR&K'160000'!I,-2) %FINISH %ELSE %IF ADDR>=0 %THEN PUSH(4<<13!I,ADDR) %ELSE %C PUSH(ADDR!I,-1) %FINISH %FINISH %ELSE %START %IF TORF=K %START PUSH(4<<13!I!CONVERT(CLOC+JPTR+2),-1) %IF ADDR>>10&1#0 %START FORWARD=CELL(CLOC+JPTR,FORWARD) PUSH(ADDR&K'160000'!1<<8,-2) %FINISH %ELSE %IF ADDR>=0 %THEN PUSH(4<<13!1<<8,ADDR) %ELSE %C PUSH(ADDR!1<<8,-1) %FINISH %ELSE %START %IF ADDR>>10&1#0 %START FORWARD=CELL(CLOC+JPTR,FORWARD) PUSH(ADDR&K'160000'!I,-2) %FINISH %ELSE %IF ADDR>=0 %THEN PUSH(4<<13!I,ADDR) %ELSE %C PUSH(ADDR!I,-1) %FINISH J=CLOC+JPTR %CYCLE I=1,1,JPTR JUMP(I)_INST=JUMP(I)_INST!CONVERT(J+JUMP(I)_ADDR) %AND %C JUMP(I)_ADDR=-1 %IF JUMP(I)_ADDR>=0 CODE DUMP(JUMP(I)_INST,JUMP(I)_ADDR) %REPEAT %RESULT=0 %FINISH %REPEAT %END %integerfn BREG NEEDED %IF I=2 %OR I=4 %START %result = 1 %IF COUNT>>13=0 %AND COUNT&15#INST&15 %result = 1 %IF 2<=COUNT>>13<=3 %AND COUNT&15#0 %result = 0 %FINISH %IF I>=6 %AND 1#COUNT>>13#5 %AND INST&15#COUNT&15 %START %result = 1 %IF COUNT>>13=0 %result = 1 %IF COUNT>>4&15#9 %result = 0 %FINISH %result = 1 %IF I=5 %AND COUNT>>13=2 %AND IN1#IN3#0 %result = 0 %END %ROUTINE SKIP TEXT(%INTEGER TERM) %CYCLE %IF LINE(LPTR)=NL %START SPACES(13) %AND PRINT LINE %IF LS=4 %AND PRINT=0 ERROR(8,6) %AND %STOP %IF READ LINE=1 %FINISH %ELSE LPTR=LPTR+1 SKIP SPACES %IF LINE(LPTR)='$' %START LPTR=LPTR+1; GET TAG %RETURN %IF TYPE=KEYWORD %AND VALUE=FINISH TOELSE=2 %AND %RETURN %IF TYPE=KEYWORD %AND TERM=1 %AND VALUE=ELSE %FINISH LPTR=LPTR+1 %WHILE %not line end=1 %REPEAT %END %ROUTINE FILL IN(%INTEGER VAL1,VAL2) %INTEGER I %WHILE PPTR>0 %CYCLE PPTR=PPTR-1; I=PENDING(PPTR) ASSIGN(VAL2,TAG(I)_VALUE,0) TAG(I)_TYPE=VAL1; TAG(I)_VALUE=VAL2 %REPEAT %END LIST(I)_PTR=I+1 %FOR I=0,1,MAX CELL-1 j = 0 %cycle i = 0, 1, 255 %cycle asl = 0, 1, 5 tag(i)_name(asl) = ttag(j); j=j+1 %repeat tag(i)_type = ttag(j)!ttag(j+1)<<8; j=j+2 tag(i)_value = ttag(j)!ttag(j+1)<<8; j=j+2 %repeat SELECT INPUT(1); SELECT OUTPUT(4) NEWLINES(3) ASL=0 %CYCLE %EXIT %IF READ LINE=1 SKIP SPACES %WHILE LINE(LPTR)#NL %CYCLE CORD=0; IN1=0; IN2=0; IN3=0 GET TAG %WHILE TYPE=UNKNOWN %AND LINE(LPTR)=':' %CYCLE ERROR(1,2) %AND ->END %IF PPTR=MAX LABS PENDING(PPTR)=VALUE; PPTR=PPTR+1 LPTR=LPTR+1; GET TAG %REPEAT %IF TYPE=MEMORY %AND VALUE>=0 %THEN TYPE=DEST %AND %C IN3=VALUE&K'377'!2<<11 %AND VALUE=5<<8 %IF DEST<=TYPE<=SP %START FILL IN(CONST,CLOC) INST=VALUE&(MEM MASK!DEST MASK) %IF LINE(LPTR)#'=' %THEN ERROR(5,1) %AND ->END %CYCLE LPTR=LPTR+1 GET TAG %EXIT %UNLESS LINE(LPTR)='=' %IF TYPE=MEMORY %AND VALUE>=0 %THEN TYPE=DEST %AND %C IN2=VALUE&K'377'!2<<11 %AND VALUE=5<<8 %IF TYPE=MEM %START %IF INST&MEM MASK=0 %THEN INST=INST!VALUE %ELSE ERROR(5,2) %AND ->END %FINISH %ELSE %IF TYPE=DEST %OR TYPE=SP %START %IF INST&DEST MASK=0 %THEN INST=INST!VALUE&DEST MASK %AND %CONTINUE %IF (VALUE&DEST MASK)>>8=SPM %AND INST&DEST MASK=BREG %THEN %C INST=INST!VALUE %AND %CONTINUE %IF VALUE&DEST MASK=BREG %AND (INST&DEST MASK)>>8=SPM %THEN %C INST=INST!BREG %C %ELSE ERROR(5,3) %AND ->END %FINISH %ELSE ERROR(5,4) %AND ->END %REPEAT COUNT=GET EXPRESSION(1); ->END %IF COUNT=-1 COUNT=COUNT&K'377' %IF COUNT>>13=0 %IF COUNT=-2 %THEN COUNT=(INST+1)&15 %AND J=-2 %ELSE J=-1 I=(INST&DEST MASK)>>8 IN2=1<<8!COUNT %AND COUNT=3<<13!9<<4 %if breg needed=1 INST=INST!COUNT %IF TYPE=-1 %AND MATCH(INCMAR,0,10,10,1) =1 %START %IF INST&MEM MASK=0 %THEN INST=INST!3<<11 %ELSE ERROR(5,5) %AND ->END GET TAG %FINISH %IF TYPE=KEYWORD %AND VALUE=IF %START K=LAST COUNT=0; COUNT=1 %IF IN1#0; COUNT=COUNT+1 %IF IN2#0 COUNT=COUNT+1 %IF IN3#0 I=CONDITION(0,COUNT+1,I); ->END %IF I=-1 LAST=K %FINISH CODE DUMP(IN1,-1) %IF IN1#0 %IF IN2#0 %START CODE DUMP(IN2,J); J=-1 %AND LIST(LAST)_DATA=(CLOC-1)&K'1777' %IF J=-2 %FINISH CODE DUMP(IN3,-1) %IF IN1#IN3#0 LIST(LAST)_DATA=CLOC %IF J=-2 CODE DUMP(INST,J) %FINISH %ELSE %IF TYPE=KEYWORD %AND JUMP<=VALUE<=REPEAT %START FILL IN(CONST,CLOC) ->KEY(VALUE) KEY(JUMP):IN1=0 GET TAG %IF TYPE=KEYWORD %AND PAGE0<=VALUE<=PAGE3 %START ERROR(6,2) %AND ->END %IF LINE(LPTR)#':' INST=(VALUE-PAGE0)<<11 LPTR=LPTR+1; GET TAG COUNT=1 %FINISH %ELSE INST=CLOC<<3&MEM MASK %AND COUNT=0 I=GET EXPRESSION(0); ->END %IF I=-1 %IF I=-2 %THEN I=INST>>3 %AND J=-2 %ELSE J=-1 %IF 2<=I>>13<=3 %THEN INST=INST!I+4<<13 %ELSE %START I=CONVERT(I) %IF INST&MEM MASK#I&MEM MASK %START ERROR(6,1) %AND ->END %IF COUNT=1 INST=0 %FINISH INST=INST!4<<13!I %FINISH %IF TYPE=KEYWORD %AND VALUE=IF %START K=LAST %IF IN1=0 %START %IF J=-2 %THEN LAST=-2-LAST %AND I=CONDITION(1,INST!1<<10,LAST) %ELSE %C I=CONDITION(1,INST,I) %IF I=-1 %THEN ->END %ELSE ->TERM %FINISH %ELSE %START %IF IN1=0 %THEN COUNT=0 %ELSE COUNT=1 I=CONDITION(0,COUNT+1,I); ->END %IF I=-1 %FINISH LAST=K %FINISH CODE DUMP(IN1,-1) %IF IN1#0 LIST(LAST)_DATA=CLOC %IF J=-2 CODE DUMP(INST!1<<8,J) ->TERM KEY(IF):ERROR(1,4) %AND ->END %IF SPTR=NEST MAX SPTR=SPTR+1; NEST(SPTR)_TYPE=1 NEST(SPTR)_VAL1=-1; NEST(SPTR)_VAL2=-1 I=CONDITION(0,4<<13!1<<10,NEST(SPTR)_VAL2) NEST(SPTR)_VAL2=-1 %AND ->END %IF I=-1 NEST(SPTR)_VAL1=-1 ->TERM KEY(ELSE):ERROR(8,2) %AND ->END %IF SPTR=0 %OR NEST(SPTR)_TYPE#1 %OR %C NEST(SPTR)_VAL2=-1 NEST(SPTR)_VAL1=CELL(CLOC,NEST(SPTR)_VAL1) CODE DUMP(4<<13!1<<8,-2) ASSIGN(CLOC,NEST(SPTR)_VAL2,1) GET TAG %IF TYPE=KEYWORD %AND VALUE=IF %START NEST(SPTR)_VAL2=-1 I=CONDITION(0,4<<13!1<<10,NEST(SPTR)_VAL2) NEST(SPTR)_VAL2=-1 %AND ->END %IF I=-1 %FINISH %ELSE NEST(SPTR)_VAL2=-1 ->TERM KEY(FINISH):ERROR(8,2) %AND ->END %IF SPTR=0 %OR NEST(SPTR)_TYPE#1 ASSIGN(CLOC,NEST(SPTR)_VAL1,1) %IF NEST(SPTR)_VAL1#-1 ASSIGN(CLOC,NEST(SPTR)_VAL2,1) %IF NEST(SPTR)_VAL2#-1 SPTR=SPTR-1 GET TAG ->TERM KEY(CYCLE):ERROR(1,4) %AND ->END %IF SPTR=NEST MAX SPTR=SPTR+1; NEST(SPTR)_TYPE=2 NEST(SPTR)_VAL1=CLOC; NEST(SPTR)_VAL2=-1 GET TAG ->TERM KEY(WHILE):ERROR(1,4) %AND ->END %IF SPTR=NEST MAX SPTR=SPTR+1; NEST(SPTR)_TYPE=2 NEST(SPTR)_VAL1=CLOC NEST(SPTR)_VAL2=-1 I=CONDITION(0,4<<13!1<<10,NEST(SPTR)_VAL2) NEST(SPTR)_VAL2=-1 %AND ->END %IF I=-1 ->TERM KEY(REPEAT):ERROR(8,3) %AND ->END %IF SPTR=0 %OR NEST(SPTR)_TYPE#2 GET TAG %IF TYPE=KEYWORD %AND VALUE=IF %START I=CONDITION(1,4<<13!CONVERT(NEST(SPTR)_VAL1),I); ->END %IF I=-1 %FINISH %ELSE CODE DUMP(4<<13!1<<8!CONVERT(NEST(SPTR)_VAL1),-1) ASSIGN(CLOC,NEST(SPTR)_VAL2,1) %IF NEST(SPTR)_VAL2#-1 SPTR=SPTR-1 %FINISH %ELSE %IF TYPE=MACRO %START ERROR(1,6) %AND ->END %IF MACLEV=MACMAX MSTACK(MACLEV+1)_PTR=VALUE MSTACK(MACLEV+1)_PARS(I)=-1 %FOR I=1,1,PARMAX MSTACK(MACLEV+1)_TPTR=MTPTR %CYCLE I=1,1,PAR MAX %EXIT %if line end = 1 %or test if = 1 %IF LINE(LPTR)#',' %START MSTACK(MACLEV+1)_PARS(I)=MTPTR; J=0 %WHILE LINE(LPTR)#NL %CYCLE %EXIT %UNLESS J=1 %OR ('!'#LINE(LPTR)#';' %AND %NOT TEST IF=1) %IF LINE(LPTR)='[' %AND J=0 %START J=1 %FINISH %ELSE %IF LINE(LPTR)=']' %AND J=1 %START J=0 %FINISH %ELSE %START ->END %UNLESS (J=0 %AND LINE(LPTR)=' ') %OR MSTORE(LINE(LPTR))=1 %FINISH LPTR=LPTR+1 LPTR=LPTR+1 %AND %EXIT %IF J=0 %AND LINE(LPTR)=',' %REPEAT ->END %UNLESS MSTORE(255)=1 ERROR(7,4) %AND ->END %IF J=1 %FINISH %ELSE LPTR=LPTR+1 %REPEAT GET TAG %IF TYPE=KEYWORD %AND VALUE=IF %START MSTACK(MACLEV+1)_COND=-1 I=CONDITION(0,5<<13!1<<10,MSTACK(MACLEV+1)_COND); ->END %IF I=-1 %FINISH %ELSE MSTACK(MACLEV+1)_COND=-1 %IF LINE(LPTR)='!' %START LPTR=LPTR+1 %UNTIL LINE END=1 %FINISH ERROR(7,1) %AND ->TERM %UNLESS LINE(LPTR)=NL SPACES(13) %AND PRINT LINE %IF LS=1 %AND MACLEV=0 %AND PRINT=0 MACLEV=MACLEV+1 %FINISH %ELSE %IF TYPE=-1 %AND LINE(LPTR)='$' %START LPTR=LPTR+1; GET TAG ->KEY(VALUE) %IF TYPE=KEYWORD %AND CTRL<=VALUE<=LST ->KEY(VALUE-IF+AIF) %IF TYPE=KEYWORD %AND IF<=VALUE<=FINISH printstring("type ="); write(type, 1) printstring(" value ="); write(value, 1); newline ERROR(9,1); ->END KEY(CTRL):GET TAG; I=GET ASS EXPR ->END %IF I=-1 CLOC=I&1023 ->TERM KEY(DTA):GET TAG; I=GET ASS EXPR ->END %IF I=-1 DLOC=I&1023 ->TERM KEY(DEF):%CYCLE GET TAG ERROR(9,2) %AND ->END %UNLESS POSN>=0 %AND LINE(LPTR)='=' I=POSN ASSIGN(0,TAG(I)_VALUE,0) %IF TYPE=UNKNOWN LPTR=LPTR+1; GET TAG ERROR(9,3) %AND ->END %IF TYPE=UNKNOWN %IF TYPE=CONST %START VALUE=GET ASS EXPR; ->END %IF VALUE=-1 TYPE=CONST %FINISH TAG(I)_TYPE=TYPE; TAG(I)_VALUE=VALUE %EXIT %UNLESS LINE(LPTR)=',' LPTR=LPTR+1 %REPEAT GET TAG ->TERM KEY(MAC):GET TAG ERROR(9,4) %AND ->END %IF TYPE#UNKNOWN TAG(VALUE)_TYPE=MACRO; TAG(VALUE)_VALUE=MTPTR COUNT=0 %CYCLE SKIP SPACES; %EXIT %if line end = 1 COUNT=COUNT+1 IDENTIFIER(PARAM(COUNT)_NAME,PARAM(COUNT)_LEN) SKIP SPACES %EXIT %UNLESS LINE(LPTR)=',' LPTR=LPTR+1 ERROR(1,5) %AND ->END %IF COUNT=PARMAX %REPEAT ERROR(7,1) %unless line end = 1 %CYCLE %IF LINE(LPTR)=NL %START SPACES(13) %AND PRINT LINE %IF LS>0 ERROR(8,1) %AND %STOP %IF READ LINE=1 %FINISH %ELSE LPTR=LPTR+1 J=LPTR SKIP SPACES %IF LINE(LPTR)='$' %START LPTR=LPTR+1; GET TAG %IF TYPE=KEYWORD %START ERROR(9,5) %AND ->END %IF VALUE=MAC %EXIT %IF VALUE=MEND %FINISH %FINISH LPTR=J %CYCLE %CYCLE I=1,1,COUNT %if match (PARAM(I)_NAME,0,PARAM(I)_LEN,6,0) = 1 %START %IF MSTORE(1<<7!I)=1 %THEN ->ESC %ELSE ->END %FINISH %REPEAT ->END %UNLESS MSTORE(LINE(LPTR))= 1 %EXIT %if line end = 1; LPTR=LPTR+1 ESC:%REPEAT %REPEAT SPACES(13) %AND PRINT LINE %IF LS>0 ->END %UNLESS MSTORE(255)=1 GET TAG ->TERM KEY(LST):GET TAG; I=GET ASS EXPR ERROR(9,6) %AND ->END %UNLESS 0<=I<=4 LS=I ->TERM KEY(AIF):ERROR(9,7) %AND ->END %UNLESS TOELSE=0 GET TAG; I=TYPE %IF TYPE=CONST %START J=GET ASS EXPR; ->END %IF J=-1 %FINISH %ELSE J=VALUE ERROR(9,8) %AND ->END %IF '='#LINE(LPTR)#'#' COUNT=LINE(LPTR) LPTR=LPTR+1; GET TAG; I=TYPE-I %IF TYPE=CONST %START VALUE=GET ASS EXPR; ->END %IF VALUE=-1 %FINISH J=VALUE-J %IF (COUNT='=' %AND I=J=0) %OR (COUNT='#' %AND %NOT I=J=0) %START TOELSE=1 GET TAG ->TERM %FINISH ERROR(7,1) %unless line end = 1 SPACES(13) %AND PRINT LINE %IF LS>0 SKIP TEXT(1) GET TAG ->TERM KEY(AELSE):ERROR(9,9) %AND ->END %UNLESS TOELSE=1; TOELSE=0 ERROR(7,1) %unless line end = 1 SPACES(13) %AND PRINT LINE %IF LS>0 SKIP TEXT(0) GET TAG ->TERM KEY(AFINISH):ERROR(9,9) %AND ->END %UNLESS TOELSE>0; TOELSE=0 GET TAG %FINISH %ELSE %IF TYPE#-1 %OR (LINE(LPTR)#'!' %AND %not line end=1) %START CORD=1; FILL IN(MEMORY,DLOC) LIST(TAG(VALUE)_VALUE)_DATA=DLOC+1024 %IF TYPE=UNKNOWN %CYCLE I=GET ASS EXPR; ->END %IF I=-1 I=I&K'377' %UNLESS I=-2 %IF TYPE=-1 %AND LINE(LPTR)='(' %START ERROR(2,2) %AND ->END %IF I=-2 LPTR=LPTR+1; GET TAG COUNT=GET ASS EXPR; ->END %IF COUNT=-1 %IF TYPE=-1 %AND LINE(LPTR)#')' %THEN ERROR(7,2) %AND ->END LPTR=LPTR+1; GET TAG %FINISH %ELSE COUNT=1 DATA DUMP(I,-1) %FOR VALUE=1,1,COUNT %EXIT %UNLESS TYPE=-1 %AND LINE(LPTR)=',' LPTR=LPTR+1; GET TAG %REPEAT %FINISH TERM:ERROR(7,1) %IF TYPE#-1 %OR (LINE(LPTR)#'!' %AND %not line end=1) END:LPTR=LPTR+1 %WHILE %not line end=1 %EXIT %IF LINE(LPTR)=NL LPTR=LPTR+1 %REPEAT SPACES(13) %AND PRINT LINE %IF (LS>1 %OR (LS=1 %AND MACLEV=0)) %AND PRINT=0 %REPEAT NEWLINE ERROR(8,3+NEST(SPTR)_TYPE) %AND SPTR=SPTR-1 %WHILE SPTR>0 %CYCLE I=0,1,255 %IF TAG(I)_TYPE=UNKNOWN %AND TAG(I)_NAME(0)#0 %START FAULTS=FAULTS+1 %cycle j = 0, 1, 5 %exit %if tag(i)_name(j) = 0 PRINT SYMBOL(TAG(I)_NAME(J)) %repeat PRINT STRING(" Undefined"); newline %FINISH %REPEAT NEWLINES(2) SELECT OUTPUT(0); NEWLINE %IF FAULTS>0 %START PRINT STRING("Program contains"); WRITE(FAULTS,0) PRINT STRING(" Faults"); NEWLINE %FINISH %ELSE %START PRINT STRING("Assembly successful"); NEWLINE SELECT OUTPUT(3) DUMP(7<<13) COUNT=0 %CYCLE I=0,1,1023 %IF CONTROL(I)#K'160000' %START DUMP(6<<13!CONVERT(I)) %AND COUNT=1 %IF COUNT=0 DUMP(CONTROL(I)) %FINISH %ELSE COUNT=0 %REPEAT COUNT=0 %CYCLE I=0,1,1023 %IF DATA(I)#-1 %START DUMP(4<<13!CONVERT(I)) %AND COUNT=1 %IF COUNT=0 DUMP(DATA(I)) %FINISH %ELSE COUNT=0 %REPEAT DUMP(7<<13) %FINISH %ENDOFPROGRAM