! FILE 'ROLBS' !********************** !* ROLBES/ROLBEY * !* DATE: 26.jan.82 * !* RING VSN * !********************* %CONSTSTRING (7) VSN = "VSN001B" !! STACK = 300, STREAMS = 1 %CONTROL K'100001' %include "deimosperm" %RECORDFORMAT XF(%BYTEINTEGER UNIT,FSYS,%BYTEINTEGERARRAY FNAME(0:5)) %begin %OWNINTEGER MON = 0 %RECORDFORMAT RJEF(%BYTEINTEGERARRAY DATA(0:239)) %RECORDFORMAT NSI1F(%INTEGER ST, DS, RC, TC, UFLAG, %C %RECORD(RJEF) RJE) %RECORDFORMAT MEF(%RECORD(MEF)%NAME LINK,%BYTEINTEGER LEN,TYPE, %C %RECORD(NSI1F) NSL) %RECORDFORMAT ME2F(%RECORD(ME2F)%NAME LINK,%BYTEINTEGER LEN,TYPE, %C %RECORD(NSI1F) NSL) %RECORDFORMAT PF(%BYTEINTEGER SERVICE,REPLY,FN,PORT, %C %RECORD(*)%NAME MES,%BYTEINTEGER LEN,S1) %RECORDFORMAT P2F(%BYTEINTEGER SERVICE,REPLY,FN,PORT,%RECORD(ME2F)%NAME MES, %C %BYTEINTEGER LEN,S1) %RECORDFORMAT P3F(%BYTEINTEGER SERVICE,REPLY,FN,PORT,FACILITY,FLAG,NODE,TERM) %RECORD(PF) P %CONSTINTEGER CONNECTED = 1 %CONSTINTEGER TITLE = 2 %CONSTINTEGER GETTING = 3 %CONSTINTEGER READY = 4 %CONSTINTEGER CLOSING = 5 %CONSTINTEGER WAITING = 6, %C INPUT = 7, %C SKIPPING = 8, %C CLOSE I = 9 %OWNSTRING (127) USER, PASS, FILE, DISC %OWNSTRING (5) USERN = "USER " %OWNSTRING (5) PASSN = "PASS " %OWNSTRING (3) GON = "GO*" %OWNSTRING (7) LISTN = "LIST " %OWNSTRING (9) LP155N = ",.LP155*" %OWNSTRING (5) RL01N = "RL01" %OWNSTRING (5) RK05N = "RK05" %OWNSTRING (5) RX02N = "RX02" %OWNSTRING (5) TESTN = "TEST" %OWNSTRING (5) DOLLAR = "$$$$$" %CONSTINTEGER TT SER=1, GATE SER=16, BUFFER MANAGER=17 %CONSTINTEGER RD=0, ECHO OFF=10 %CONSTINTEGER REQUEST BUFFER=0, RELEASE BUFFER=1 %CONSTINTEGER ENABLE FACILITY=1, DISABLE FACILITY=2, CALL REPLY=3 %CONSTINTEGER ENABLE INPUT=4, PUT OUTPUT=5, CLOSE CALL=6 %CONSTINTEGER ABORT CALL=7, OPEN CALL=8, OPEN MESSAGE=9 %CONSTINTEGER OPEN CALL REPLY=1, INCOMING CALL=2, INPUT RECD=3 %CONSTINTEGER OUTPUT TRANSMITTED=4, CALL CLOSED=5, CALL ABORTED=6 %CONSTINTEGER OPEN REPLY A=7, OPEN REPLY B=8, MESSAGE IN=9, MESSAGE REPLY=10 %INTEGER I, NODE, TERM, STRM, K, FLAG %OWNINTEGER INITF %OWNINTEGER USERS, STA, CPU, PKTS, SBR, BYT, RJEI, TIM, RJEO %OWNINTEGER CONN OK, G PORT, POWER, KILL IT, MAXC %OWNBYTEINTEGERARRAY BUFF(0:511) %OWNINTEGER PT, BLOCK, LAST BLOCK, DRIVE, GOAH, DISC SER, STATE, PTI %OWNINTEGER BLEXT = 0, TIM2 %CONSTINTEGERARRAY DSER(0:4) = 3, 3, 8, 14, 28 %ROUTINE GET BUFFER(%INTEGER REASON, R2) P_SERVICE=BUFFER MANAGER; P_REPLY=ID P_FN=REQUEST BUFFER; P_LEN=0; P_S1=REASON P_PORT = R2 PON(P) %END %ROUTINE FREE BUFFER(%RECORD(MEF)%NAME MES) P_SERVICE=BUFFER MANAGER; P_REPLY=ID P_FN=RELEASE BUFFER; P_MES==MES PON(P) %END %ROUTINE TO GATE(%INTEGER FN, %RECORD (MEF) %NAME MES, %C %INTEGER FLAG) P_SERVICE = GATE SER; P_REPLY = ID P_FN = FN; P_PORT = G PORT; P_MES == MES; P_S1 = FLAG PON(P) %END %ROUTINE DO CONNECT(%INTEGER TYPE) %RECORDFORMAT P3F(%BYTEINTEGER SER, REPLY, %C FN, PORT, NODE, FLAG, TERM, FACILITY) %RECORD (P3F) P3 P3_SER = GATE SER; P3_REPLY = ID P3_FN = OPEN CALL; P3_PORT = TYPE P3_NODE = NODE; P3_TERM = TERM P3_FLAG = POWER P3_FACILITY = STRM PON(P3) %END %ROUTINE PUT NEXT DISC BLOCK %INTEGER I, J, K %CONSTINTEGERNAME NULL == 0 %RECORDFORMAT PF(%BYTEINTEGER SER, REPLY, %C %INTEGER A, %BYTEINTEGERNAME B, %INTEGER C) %RECORD (PF) P %IF BLOCK = 0 %START; ! DISC CHECK TURN OFF REQUIRED P_SER = DISC SER; P_REPLY = ID P_A = 0; P_B == NULL PONOFF(P) %IF P_A # 9 %START PRINTSTRING("Failed to turn Disc check off") WRITE(P_A, 1); NEWLINE %STOP %FINISH %FINISH %IF BLOCK > LAST BLOCK %START END OF DISC: PRINTSTRING("Whole disc written ") STATE = SKIPPING %RETURN %FINISH P_SER = DISC SER; P_REPLY = ID P_A = 1; P_B == BUFF(0); P_C = BLOCK!BLEXT PONOFF(P) %IF P_A # 0 %START PRINTSTRING("Failed to write Block"); WRITE(BLOCK, 2) PRINTSTRING(" from the disc - "); WRITE(P_A, 1) NEWLINE %IF P_A = 4 %THEN -> END OF DISC %FINISH BLOCK = BLOCK+1 STATE = INPUT %END %ROUTINE DO TITLE(%RECORD (MEF) %NAME MES) %RECORD (RJEF) %NAME RJE %INTEGER PT, OPT, I %ROUTINE PLANT(%STRING(*) %NAME S, %INTEGERNAME PTX) %INTEGER LEN LEN = LENGTH(S) %RETURN %IF LEN = 0 %CYCLE I = 1, 1, LEN RJE_DATA(PTX) = CHARNO(S, I) PTX = PTX+1 %REPEAT %END RJE == MES_NSL_RJE PT = 3; OPT = 2 RJE_DATA(0)=1; RJE_DATA(1) = NL; ! PLANT A BLANK LINE PLANT(USERN, PT); PLANT(USER, PT) RJE_DATA(OPT) = PT-OPT-1 OPT = PT; PT = PT+1 PLANT(PASSN, PT); PLANT(PASS, PT) RJE_DATA(OPT) = PT-OPT-1 OPT = PT; PT = PT+1 PLANT(GON, PT) RJE_DATA(OPT) = PT-OPT-1 OPT = PT; PT=PT+1 PLANT(LISTN, PT); PLANT(FILE, PT) PLANT(LP155N, PT) RJE_DATA(OPT) = PT-OPT-1 MES_LEN = PT+2 MES_NSL_UFLAG = 5; ! ISO TO GATE(PUT OUTPUT, MES, 0) STATE = READY %END %ROUTINE DO BLOCK(%RECORD (MEF) %NAME MES, %INTEGER CNSL) %INTEGER I, J, K %RECORD (RJEF) %NAME RJE %RECORD (NSI1F) %NAME NSI %INTEGER A, B, C, LEN %IF CNSL # 0 %THEN DO TITLE(MES) %AND %RETURN PRINTSTRING("FAULT! ") %END %ROUTINE INPUT BLOCK(%RECORD (MEF) %NAME MES) %RECORD (RJEF) %NAME RJE %OWNINTEGER SKIP = 4 %INTEGER I, J, N, LEN, RPT LEN = MES_LEN-2; ! -6 FOR NSI %IF MON # 0 %START PRINTSTRING("LEN ="); WRITE(LEN, 1); NEWLINE %FINISH N = 0; RPT = 0 RJE == MES_NSL_RJE %CYCLE %IF N = 0 %START N = RJE_DATA(RPT); RPT = RPT+1 %IF N&X'80' # 0 %START N = RJE_DATA(RPT); RPT = RPT+1 %FINISH %IF MON # 0 %START PRINTSTRING("RECORD LEN ="); WRITE(N, 1); WRITE(RPT, 1) NEWLINE %FINISH %EXIT %IF RPT > LEN %FINISH I = RJE_DATA(RPT); RPT = RPT+1 %IF SKIP # 0 %START %IF I = '$' %THEN SKIP = SKIP-1 %IF SKIP = 0 %START PRINTSTRING("Data Phase Starting ") RPT = RPT+1; N = N-1; ! SKIP THE NL %FINISH %ELSE BUFF(PTI) = I; PTI = PTI+1 %IF PTI = 512 %START PUT NEXT DISC BLOCK PTI = 0 %FINISH %FINISH N = N-1 %REPEAT %END %ROUTINE READ LINE(%STRING(*) %NAME S) %INTEGER I LENGTH(S) = 0 %CYCLE READSYMBOL(I) S = S.TO STRING(I) %IF I = NL %THEN %RETURN %REPEAT %END CHARNO(DOLLAR, 5) = NL CHARNO(GON, 3) = NL; CHARNO(LP155N, 8) = NL I = MAP VIRT(BUFFER MANAGER,4, 3) I = MAP VIRT(BUFFER MANAGER, 5, 4) I = MAP VIRT(BUFFER MANAGER, 6, 5) PRINTSTRING("Roll Disc Image from Filestore ") NODE = 90; TERM = 90; ! FILESTORE STRM = 13 POWER = X'30'; ! ASK FOR 3 NSI SEND AHEADS PROMPT("Disc Type?"); READ LINE(DISC) PROMPT("Disc Drive?"); READ(DRIVE); SKIPSYMBOL PROMPT("User Name?"); READ LINE(USER) PROMPT("User Pass?"); READ LINE(PASS) PROMPT("File Name?"); READ LINE(FILE) LENGTH(FILE) = LENGTH(FILE)-1; ! DELETE THE DELIMETER LENGTH(DISC) = LENGTH(DISC)-1 %IF DISC = TESTN %START PROMPT("Node?"); READ(NODE) PROMPT("Term?"); READ(TERM) PROMPT("Fac?"); READ(STRM); SKIPSYMBOL LAST BLOCK = 100 %FINISH %IF DRIVE = 0 %START PRINTSTRING("This program is about to overwrite drive 0 !!! Please change the disc now! ") PRINTSTRING("Please confirm when ready?") READSYMBOL(I) %STOP %UNLESS I = 'Y' %FINISH PRINTSTRING("Please use NSIW to loggon T155 to the Filestore ") %IF DRIVE < 0 %OR DRIVE > 4 %START PRINTSTRING("Only Drive 0, 1 or 2 ") %STOP %FINISH DISC SER = DSER(DRIVE); BL EXT = 0 %IF DRIVE = 1 %THEN BL EXT = K'020000' %IF DISC = RK05N %THEN LAST BLOCK = 4700 %IF DISC = RX02N %THEN LAST BLOCK = 999 %IF DISC = RL01N %START LAST BLOCK = 9301 %FINISH %IF LAST BLOCK = 0 %START PRINTSTRING(" Discs - RL01, RK05 and RX02 ") %STOP %FINISH STA = 1 DO CONNECT(0) ALARM(4*50) %CYCLE P_SERVICE = 0; POFF(P) %IF P_REPLY = 0 %START; ! CLOCK %IF INT = 'A' %START KILL IT = -1 PRINTSTRING("KILLING IT ") TO GATE(ABORT CALL, NULL, 0) %IF CONN OK # 0 INT = 0 %CONTINUE %FINISH ALARM(50); ! 1 SECS %IF 'M' <= INT <= 'P' %START MON = INT-'O'; INT = 0 %FINISH %IF INT='?' %START WRITE(PKTS, 1) WRITE(BLOCK, 4); NEWLINE INT = 0 %FINISH %IF TIM2 # 0 %START TIM2 = TIM2-1 %IF TIM2 = 0 %AND STATE = WAITING %START PRINTSTRING("?? Are you sure the file exists? ") TIM2 = 5*60; ! 5 MINS %FINISH %FINISH %CONTINUE %FINISH %IF MON < 0 %START SELECT OUTPUT(1) PRINTSTRING("POFF:"); WRITE(P_REPLY, 1) WRITE(P_FN, 1); WRITE(P_PORT, 1); WRITE(P_LEN, 1); WRITE(P_S1, 1) NEWLINE SELECT OUTPUT(0) %FINISH %IF P_REPLY = BUFFER MANAGER %START %IF KILL IT < 0 %THEN FREE BUFFER(P_MES) %AND %CONTINUE DO BLOCK(P_MES, P_S1) %CONTINUE %FINISH %IF P_REPLY = GATE SER %START %IF P_FN = OPEN REPLY A %START; ! 1ST REPLY I = P_PORT; ! MY PORT NUMBER K = P_S1; ! GATE PORT NUMBER %IF K = 0 %START PRINTSTRING("MCON: GATE REFUSED ") %STOP %FINISH %CONTINUE; ! WAIT FOR REPLY B %FINISH %IF P_FN = OPEN REPLY B %START; ! 2ND REPLY %STOP %IF KILL IT < 0 I = P_PORT; ! GATE PORT NUMBER !! G PORT = I FLAG = P_S1 %IF P_S1 # 0 %START; ! FAILED %IF TIM = 0 %START PRINTSTRING("FAILED"); WRITE(P_S1, 1); NEWLINE %FINISH TIM = TIM+1 DO CONNECT(0); ! TRY AGAIN %CONTINUE %FINISH PRINTSTRING("Command File Going to Filestore ") GOAH = 2 CONN OK = 1 GET BUFFER(1, 0); ! GET BUFFER FOR TITLE %CONTINUE %FINISH %IF P_FN=CALL ABORTED %START; ! MY END I HOPE %IF KILL IT < 0 %START PRINTSTRING("CALL GONE ") %STOP %FINISH ! CALL HAS BEEN ABANDONED PRINTSTRING("File has been abandoned after") WRITE(BLOCK, 1); PRINTSTRING(" blocks ") TO GATE(ABORT CALL, NULL, 0) P_SERVICE = 0; POFF(P); ! CATCH THE TIMER %STOP %FINISH %IF P_FN = CALL CLOSED %START %IF STATE = SKIPPING %START; ! 'NORMAL' PRINTSTRING("Eof received from Filestore ") STOP IT: WRITE(BLOCK, 1); PRINTSTRING(" blocks written ") TO GATE(CLOSE CALL, NULL, 0) P_SERVICE = 0; POFF(P); ! CATCH CLOCK TICK %STOP %FINISH %IF STATE = CLOSING %START PRINTSTRING("Command File gone It may take the Filestore a while to copy the file! ") TIM2 = 1*60 TO GATE(ENABLE FACILITY, NULL, 4); ! ENABLE FILE STATE = WAITING %CONTINUE %FINISH PRINTSTRING("Unexpected close rec'd ") -> STOP IT %FINISH %IF P_FN = OUTPUT TRANSMITTED %START GOAH = GOAH+1 %IF MON # 0 %START SELECT OUTPUT(1) PRINTSTRING("OT - GOAH ="); WRITE(GOAH, 1); NEWLINE SELECT OUTPUT(0) %FINISH %IF STATE = READY %START STATE = CLOSING TO GATE(CLOSE CALL, NULL, 0) %FINISH %CONTINUE %FINISH %IF P_FN = INCOMING CALL %START PRINTSTRING("Start of File ") %UNLESS 11 <= P_LEN <= 12 %START PRINTSTRING("File is not from filestore ! Addr =") WRITE(P_LEN, 1); NEWLINE TO GATE(CALL REPLY, NULL, 0) TO GATE(DISABLE FACILITY, NULL, 4) %STOP %FINISH G PORT = P_PORT TO GATE(CALL REPLY, NULL, 1) TO GATE(DISABLE FACILITY, NULL, 4); ! NO MORE CALLS THANK YOU STATE = INPUT %CONTINUE %FINISH %IF P_FN = INPUT RECD %START PKTS = PKTS+1 %IF MON # 0 %START SELECT OUTPUT(1) PRINTSTRING("Input Recd ") SELECT OUTPUT(0) %FINISH !DEAL WITH IT INPUT BLOCK(P_MES) %IF STATE = INPUT FREE BUFFER(P_MES) TO GATE(ENABLE INPUT, NULL, 0) %CONTINUE %FINISH PRINTSTRING("FUNNY FN"); WRITE(P_FN, 1); NEWLINE %CONTINUE %FINISH %REPEAT %ENDOFPROGRAM