!* MODIFIED 19/10/76  11.45
!*
!*
SYSTEMROUTINE  AMEND(INTEGER  INPUT SET)
!* INPUT SET=0   NO INPUT FILE
!*          =1   INPUT FILE DEFINED
SYSTEMINTEGERMAPSPEC  COMREG(INTEGER  I)
ROUTINESPEC  EXTRACT NO(INTEGERNAME  A,B)
ROUTINESPEC  READCARD(BYTEINTEGERARRAYNAME  A,INTEGER  J)
ROUTINESPEC  WRITECARD(BYTEINTEGERARRAYNAME  A)
INTEGERFNSPEC        INPUTB
ROUTINESPEC        OUTPUTA(INTEGER  A)
ROUTINESPEC        OUTPUTB(INTEGER  A)
ROUTINESPEC        SIMFAILIN
ROUTINESPEC        SIMFAILOUT
BYTEINTEGER        ERFLAG
SYSTEMROUTINESPEC  SIM2(INTEGER  A,B,C,INTEGERNAME  D)
SYSTEMROUTINESPEC  FILL(INTEGER  L,AT,WIDTH)
BYTEINTEGERARRAY  CDIN,EDITCD(0:86)
OWNBYTEINTEGER  FLAG=0
CONSTSTRING (2) ARRAY  SEQNOS(73:80)=C 
'73','74','75','76','77','78','79','80'

CONSTBYTEINTEGERARRAY  ITOI(0:255)=C 
                  32(10),10,32(14),25,26,32(5),
                  32,124,34,35,35,37,38,39,40,41,42,43,44,45,46,47,
                  48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
                  64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
                  80,81,82,83,84,85,86,87,88,89,90,36,92,33,92,95,
                  96,97,98,99,100,101,102,103,104,105,106,107,108,109,
                  110,111,112,113,114,115,116,117,118,119,
                  120,121,122,123,92,125,126,32,
                  26(5),10,26(10),
                  26(16),
                  26,91,93,123,125,26(9),92,38,
                  26(11),35,26(4),
                  26(16),
                  26(9),35,26(5),94,
                  26(32);
INTEGER  EOF
INTEGER   I,CDNUM,CARDNO,N1,N2,FLNUM,L,SEQ,SQNO,K,J,KK,NUM,LSEQ,C 
         RSEQ,N,SEQBEG,ENDMARK,CNT,ADR1,ADR2,STEP,EXOPT,IBMFL,SQBRFL,C 
         CARDHELD,LFLAG,RFLAG,OPTION,LENTH,INFL,OUTFL,CCARD
INTEGER  LISTINP
SWITCH  SW(0:9),SSW(3:18)
ROUTINE  ICARD(BYTEINTEGERARRAYNAME  A)
         INTEGER  I,J,L
BYTEINTEGERARRAY  TEMP(1:9)
!         %IF SEQBEG=2 %THEN SEQBEG=1 %AND -> NR3
FILL(80,ADDR(A(1)),' ')
         SIM2(0,ADDR(A(1)),0,I)
         IF  A(1)=25 THENSTART 
            ENDMARK=1
            RETURN 
         FINISH 
         A(I)=' '
         RETURN 
!NR3:     %IF A(1)='*' %AND A(2)='*' %THEN %RETURN
!         %IF SEQBEG=1 %THENSTART
!            %CYCLE I=1,1,9
!               %UNLESS X'30'<=A(I)<=X'39' %THEN -> NR2
!               TEMP(I)=A(I)
!            %REPEAT
!NR2:        %IF I=1 %THEN %RETURN
!            I=I-1
!           %CYCLE J=1,1,72
!              A(J)=A(I+J+1)
!           %REPEAT
!           %IF (RSEQ-LSEQ+1) < I %THEN RSEQ=80 %AND LSEQ=73
!           %CYCLE J=LSEQ,1,RSEQ
!              A(J)='0'
!           %REPEAT
!           L=0
!           %CYCLE J=I,-1,1
!              A(RSEQ-L)=TEMP(J)
!              L=L+1
!           %REPEAT
!        %FINISH
END   ;! ICARD
!*
!*
         NEWLINES(3)
         LFLAG=0; RFLAG=0; OPTION=0; LENTH=0; CARDHELD=0;LISTINP=0
         ERFLAG=0; IBMFL=0; SQBRFL=0
         OPTION=5
         CCARD=0
         EOF=0
         STEP=100;  INFL=1;  OUTFL=0;  SQNO=1
         LSEQ=73;  RSEQ=80;  SEQBEG=0;  ENDMARK=0
         EXOPT=0;N1=0;CARDNO=0;K=0;CDNUM=0;FLNUM=0
         ADR1=ADDR(EDITCD(0));  ADR2=ADDR(CDIN(0));  
         EDITCD(0)=10;CDIN(0)=10
         CYCLE  I=80,1,86
            EDITCD(I)=' '
            CDIN(I)=' '
         REPEAT 
SW(0):
         READCARD(EDITCD,0)
         IF  ENDMARK=1 THEN  -> CLOSEFILE
         IF  CCARD=0 THEN  ->NR502
NR101:    EDITCD(0)=10
          OUTPUTA(ADR1)
          ->SW(OPTION)
!*
!******  FILE
SW(2):   INFL=0
NR200:   ICARD(EDITCD)
         IF  ENDMARK=1 THEN  -> FILEND
      IF  (EDITCD(1)='*' AND  EDITCD(2)='*' AND  EDITCD(3)='E' ANDC 
EDITCD(4)='N' AND  EDITCD(5)='D' ) THEN  -> FILEND
         CYCLE  I=1,1,72
            -> NR300 UNLESS  EDITCD(I)=' '
         REPEAT 
         -> NR200
NR300:   IF  IBMFL#0 THEN  START 
            CYCLE  I=1,1,72
               EDITCD(I)=ITOI(EDITCD(I))
            REPEAT 
         FINISH 
         IF  SQBRFL#0 THEN  START 
            CYCLE  I=1,1,72
               IF  EDITCD(I)='/' THEN  START 
                  IF  I>1 AND  EDITCD(I-1)='(' THEN  EDITCD(I-1)=' ' C 
                     AND  EDITCD(I)='['
                  IF  I<72 AND  EDITCD(I+1)=')' THEN  EDITCD(I)=']' C 
                     AND  EDITCD(I+1)=' '
               FINISH 
            REPEAT 
         FINISH 
         IF  RFLAG=1 THENSTART 
            CDNUM=CDNUM+STEP
            J=CDNUM
            KK=-1
            CYCLE  I=RSEQ,-1,LSEQ
               IF  KK=0 THEN  N=0 ELSE  START 
                   KK = J//10
                  N=J-KK*10
               FINISH 
               EDITCD(I)='0'+N
               J=KK
            REPEAT 
         FINISH 
         OUTPUTB(ADR1)
         IF  LFLAG=1 THEN  OUTPUTA(ADR1)
         ->NR200
!*
!****** INSERT
SW(7):   ->FAIL IF  K>N1 OR  (K=N1 AND  EXOPT#8)
         CARDNO=N1
SW(5):
SW(9):
NR500:   READCARD(EDITCD,0)
         IF  ENDMARK=1 THEN  -> CLOSEFILE
         ->NR101 IF  CCARD=1
!*
!******  DELETE
SW(8):   IF  EXOPT=4 THEN  EXOPT=0 AND  -> NR502
       ->FAIL IF  N1<=K AND  (OPTION=8 OR  OPTION=5)
NR502:   IF  CARDHELD=0 THENSTART 
            CARDHELD=1;  IF  EXOPT=8 THEN  EXOPT=0
            IF  INPUTB#0 THEN  RETURN 
            IF  CDIN(1)=25 THENSTART 
               EOF=10;  ->SSW(OPTION+10)
            FINISH 
            SEQ=0
            KK=1
            CYCLE  I=RSEQ,-1,LSEQ
               J=BYTEINTEGER(ADR2+I)-X'30'
               NUM=J*KK+SEQ
               KK=KK*10
               SEQ=NUM
            REPEAT 
          FINISH 
          ->FAIL IF  OPTION=7 AND  EXOPT#8 AND  N1=SEQ
          ->SSW(OPTION+10) IF  EOF#0
          IF  N1<=SEQ THEN  ->SSW(OPTION)
          K=SEQ
          WRITECARD(CDIN)
          IF  LFLAG=1 THENSTART 
          OUTPUTA(ADR2)
          FINISH 
          CARDHELD=0 UNLESS  CDIN(1)=25;  ->NR502
SSW(5):   IF  N1=SEQ THENSTART 
             EDITCD(86)='R';  CARDHELD=0;  ->NR506
          FINISH 
SSW(15):
          EDITCD(86)='I'
NR506:    WRITECARD(EDITCD)
          IF  FLAG=1 THEN  ->INSERTFAIL
          OUTPUTA(ADR1)
         ->NR500
SSW(17):
SSW(7):   IF  RFLAG=1 THEN  ->SSW(5+EOF)
          CDNUM=CARDNO; CARDNO=CARDNO+STEP; !INSERT NOT SEQUENCED
          ->SSW(5+EOF)
SSW(18):
          IF  EOF#0 THEN  ->FAIL
SSW(8):                                     !DELETE: PRINTCARDS DELETED
          IF  N2>=SEQ THENSTART 
          CARDNO=CDNUM
         IF  LFLAG=0 THENSTART 
            CDIN(86)='D'
            OUTPUTA(ADR2)
           CDNUM=CARDNO
         FINISH 
         IF  INPUTB#0 THEN  RETURN 
         IF  CDIN(1)=25 THENSTART 
            EOF=10;  ->NR500
         FINISH 
         SEQ=0
         KK=1
         CYCLE  I=RSEQ,-1,LSEQ
            J=BYTEINTEGER(ADR2+I)-X'30'
            NUM=J*KK+SEQ
            KK=KK*10
            SEQ=NUM
         REPEAT 
         ->SSW(8)
         FINISH 
         ->NR500
!***********LISTON N1
SW(3): -> NR502
SSW(3): LFLAG=1
         -> NR500
!***********LISTOFF N1
SW(4): -> NR502
SSW(4):      LFLAG=0
         EXOPT=4
         -> NR500
!*
!*
CLOSEFILE: IF  OPTION=2 THEN  ->FILEND
         SELECT OUTPUT(102) IF  OUTFL=0
         IF  CARDHELD=1 THEN  ->NR901
NR900:   IF  INPUTB#0 THEN  RETURN 
NR901:   ->FILEND IF  CDIN(1)=25
         IF  RFLAG=1 THENSTART 
            CDNUM=CDNUM+STEP
            KK=-1
            J=CDNUM
            CYCLE  I=RSEQ,-1,LSEQ
               IF  KK=0 THEN  N=0 ELSESTART 
                  KK=J//10
                  N=J-KK*10
               FINISH 
               CDIN(I)='0'+N
               J=KK
            REPEAT 
         FINISH 
         OUTPUTB(ADR2)
         IF  LFLAG=1 THEN  OUTPUTA(ADR2);  ->NR900
FAIL:    SELECT OUTPUT(99);OUTFL=0
         SPACES(30)
         PRINTSTRING('***CARD OUT OF SEQUENCE***        ')
         ERFLAG=1
         IF  OPTION=5 THENSTART 
            WRITE(N1,8)
            IF  EXOPT=7 THEN  OPTION=7
            EXOPT=0
            ->NR500
         FINISH 
         NEWLINE
         IF  OPTION=8 THEN  ->NR500
NR903:   READCARD(EDITCD,0)
         IF  ENDMARK=1 THEN  -> CLOSEFILE
         ->NR903 UNLESS  CCARD=1 OR  OPTION=5
         IF  CCARD=1 THEN  ->NR101
         ->SW(8)
!*
INSERTFAIL:FLAG=0
         SELECT OUTPUT (99);  OUTFL=0
         SPACES(30)
         PRINTSTRING('***ATTEMPT TO INSERT TOO MANY CARDS***')
         NEWLINE
         ERFLAG=1
         ->NR903
!*
!----------------------------------------------------------------------
ROUTINE  READCARD(BYTEINTEGERARRAYNAME  A,INTEGER  J)
STRING (50) P,W,R,RIGHT,LEFT
INTEGER  ERR,X,PTR,RESULT,I,L,NUM,KK,LOOP
         CDNUM=CDNUM//STEP*STEP
         IF  J=1 THEN  ->SW1
         SELECT INPUT(108) IF  INFL=1;  INFL=0
!*
SW0:     ICARD(A)
         IF  ENDMARK=1 THEN  RETURN 
         CYCLE  I=1,1,72
            -> NR310 UNLESS  A(I)=' '
         REPEAT 
NR310:   IF  A(1)='*'AND  A(2)='*' THEN  -> SW1
SW01:    CNT=0
         CYCLE  I=LSEQ,1,RSEQ
            IF  A(I)=' ' THEN  CNT=CNT+1 ELSESTART 
               UNLESS  '0'<=A(I)<='9' THEN  ->NR100
            FINISH 
         REPEAT 
NR400:   IF  CNT=RSEQ-LSEQ+1 THEN  START 
            X=0
            IF  OPTION#7 THEN  -> FAIL1
            CCARD=0
            RETURN 
         FINISH 
         KK=1
         X=0
         CYCLE  I=RSEQ,-1,LSEQ
            L=A(I)-'0'
            NUM=L*KK+X
            KK=KK*10
            X=NUM
         REPEAT 
         CCARD=0
         RETURN  IF  X=0
         N1=X
         IF  OPTION=7 OR  OPTION=8 THEN  EXOPT=OPTION
         OPTION=5
         RETURN 
!*
SW1:  A(0)=50;  P=STRING(ADDR(A(0)))
         CCARD=1
      ->SW2 IF  P->('**FILE').W
      ->SW3 IF  P->('**ALTER').W
      ->SW4 IF  P->('**INSERT').W
      ->SW5 IF  P->('**DELETE').W
      ->SW6 IF  P->('**LISTON').W
      ->SW7 IF  P->('**LISTOFF').W
      ->SW8 IF  P->('**LIST').W
     ->SW9 IF  P->('**SEQ').W
     ->SW10 IF  P->('**SSEQ').W
     ->SW11 IF  P->('**ESEQ').W
     ->SW12 IF  P->('**END').W
      ->SW01
!*
!******  **FILE
SW2:  OPTION=2
      RFLAG=1
      RFLAG=0 IF  P->R.("N").W
      LFLAG=1 IF  P->R.(' L').W
      IBMFL=1 IF  P->R.('IBM').W
      SQBRFL=1 IF  P->R.('1900').W
      RETURN 
!*
!******  **ALTER
SW3:  EXOPT=OPTION;  OPTION=5;  N1=0
         IF  P->R.(',R').W THEN  RFLAG=1
      IF  P->R.(' R').W THEN  RFLAG=1
         IF  P->R.(',L').W THEN  LFLAG=1
      IF  P->R.(' L').W THEN  LFLAG=1
      RETURN 
!*
!******  **INSERT
SW4:     EXOPT=OPTION;  OPTION=7
SW41:    IF  OPTION=4 THEN  LOOP=10 ELSE  LOOP=9
        CYCLE  I=LOOP,1,LOOP+12;  !12 SPACES
            IF  A(I)#' ' THEN  ->SW42
         REPEAT 
         IF  OPTION=3 THEN  -> SW61
         IF  OPTION=4 THEN  -> SW71
         ->FAIL1
SW42:    PTR=ADDR(A(I));  EXTRACT NO(PTR,N1)
         ->FAIL1 IF  N1<0
IF  OPTION=3 OR  OPTION=4 THENRETURN 
         CARDNO=N1//STEP*STEP
         IF  BYTEINTEGER(PTR)=',' THENSTART 
            CYCLE  I=1,1,12
               IF  BYTEINTEGER(PTR+I)#' ' THEN  ->SW43
            REPEAT 
SW43:       PTR=PTR+I;  EXTRACT NO(PTR,N2);
            ->FAIL1 IF  N2<0
            IF  OPTION=7 AND  RFLAG#1 THEN  STEP=N2
            IF  CARDNO=N1 THEN  CARDNO=CARDNO-STEP
            RETURN 
         FINISH 
         IF  OPTION=8 THEN  N2=N1 ELSE  STEP=100
         RETURN 
!*
!******  **DELETE
SW5:     OPTION=8;  ->SW41
!*
!******  **LISTON
SW6: OPTION=3
         -> SW41
SW61: LFLAG=1
      RETURN 
!*
!******  **LISTOFF
SW7:      OPTION=4
         -> SW41
SW71: LFLAG=0
RETURN 
!*
!******  **LIST
SW8:     OPTION=9
         IF  LISTINP=0 THEN  OUTPUTA(ADR2)
      LISTINP=1
         RETURN 
!*
!******  **SEQ
SW9:     OPTION=5
B0:      IF  W->(" ").W THEN  -> B0
         UNLESS  W->LEFT.(",").W THEN  -> FAIL1
B1:      IF  W->(" ").W THEN  -> B1
         UNLESS  W->RIGHT.(" ").W THEN  -> FAIL1
         CYCLE  I=73,1,80
            IF  LEFT=SEQNOS(I) THEN  LSEQ=I
            IF  RIGHT=SEQNOS(I) THEN  RSEQ=I
         REPEAT 
         IF  RSEQ-LSEQ<5 THEN  STEP=10
         RFLAG=1
         RETURN 
!*
!******  **SSEQ
SW10:    SEQBEG=1; OPTION=5; RETURN 
!*
!******  **ESEQ
SW11:    SEQBEG=0; OPTION=5; RETURN 
!*
!******  **END
SW12:    ENDMARK=1; RETURN 
FAIL1:   SELECT OUTPUT(99) IF  OUTFL=1;  OUTFL=0
         SPACES(26)
         PRINTSTRING('***INVALID CONTROL CARD***')
         NEWLINE
         ERFLAG=1
         ->SW0
NR100:   CYCLE  I=LSEQ,1,RSEQ
            UNLESS  A(I)=' ' THEN  -> NR200
         REPEAT 
         -> NR300
NR200:   SELECT OUTPUT(99) IF  OUTFL=1;  OUTFL=0
         SPACES(30)
         PRINTSTRING('***INVALID SEQ NUMBER***');  NEWLINE
         ERFLAG=1
         ->SW0
NR300:    IF  OPTION=7 THEN  ->NR400;  ->FAIL1
END 
!***********************************************************************
ROUTINE  EXTRACT NO(INTEGERNAME  PTR,RESULT)
INTEGER  X
INTEGER  I
         RESULT=0
         CYCLE  PTR=PTR,1,PTR+8
            X=BYTEINTEGER(PTR)
            RETURN  IF  X=',' OR  X=' '
            RESULT=RESULT*10+(X-'0')
         REPEAT 
         RESULT=-1
END 
!---------------------------------------WRITECARD----------------------
ROUTINE  WRITECARD(BYTEINTEGERARRAYNAME  A)
INTEGER  I,KK,J,NUM,N
         IF  RFLAG=1 THENSTART 
            KK=0
            K=1
            CYCLE  I=RSEQ,-1,LSEQ
               J=A(I)-'0'
               NUM=J*KK+K
               KK=KK*10
               K=NUM
            REPEAT 
               CDNUM=CDNUM+STEP;  ->NR1
         FINISH 
         IF  OPTION=7 AND  (N1<=SEQ OR  EOF#0) THEN  ->NR1 ELSE  ->NR4
NR1:     KK=-1
         J=CDNUM
         CYCLE  I=RSEQ,-1,LSEQ
            IF  KK=0 THEN  N=0 ELSESTART 
               KK=J//10
               N=J-KK*10
            FINISH 
            A(I)='0'+N
            J=KK
         REPEAT 
NR4:     IF  OPTION#7 THEN  ->NR6
         IF  RFLAG=1 THEN  ->NR5
         IF  SEQ<=CDNUM AND  EOF=0 THENSTART 
            FLAG=1;  CDNUM=CDNUM-STEP
            RETURN 
         FINISH 
NR5:     K=N1
NR6:     OUTPUTB(ADDR(A(0)))
         K=N1 IF  RFLAG=0
END 
!*
ROUTINE            SIMFAILIN
         SELECT OUTPUT(99);  NEWLINE
         PRINTSTRING('***INPUT FILE DOES NOT EXIST***');  NEWLINES(2)
END 
!*
!******************************************************************
ROUTINE            OUTPUTA(INTEGER  A)
         SELECT OUTPUT(99) IF  OUTFL=1;  OUTFL=0
         L=0
         SIM2(1,A,87,L)
         IF  L<0 THEN  SIMFAILOUT
         BYTEINTEGER(A+86)=' '
END 
!-----------------------------------------------------------------------
ROUTINE            OUTPUTB(INTEGER  A)
!OUTPUT TO STREAM2
         SELECT OUTPUT(102) IF  OUTFL=0;  OUTFL=1
         L=0
         SIM2(1,A,81,L)
         IF  L<0 THEN  SIMFAILOUT
END 
!-----------------------------------------------------------------------
ROUTINE            SIMFAILOUT
         SELECT OUTPUT(99)
         PRINTSTRING('***OUTPUT FILE CAPACITY EXCEEDED***')
         NEWLINES(2)
         STOP 
END 
!-----------------------------------------------------------------------
INTEGERFN     INPUTB
         INTEGER  I,L
!INPUT FROM DISC
         IF  INFL=0 THENSTART 
            IF  INPUT SET=0 THEN  SIMFAILIN AND  RESULT =1
            SELECTINPUT(101)
            INFL=1
         FINISH 
FILL(80,ADDR(CDIN(1)),' ')
         SIM2(0,ADDR(CDIN(1)),0,I)
          CDIN(I)=' '
IF  LISTINP=1 THEN  START 
SELECT OUTPUT(99) IF  OUTFL=1; OUTFL=0
SIM2(1,ADDR(CDIN(0)),I,L)
FINISH 
!         SEQBEG=2
!         ICARD(CDIN)
         RESULT =0
END 
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
FILEND:   SELECT OUTPUT(99)
          NEWLINES(4)
          PRINTSTRING('END OF AMEND RUN')
END 
ENDOFFILE