! FILE 'ROLLS' !********************** !* ROLLS/ROLLY * !* DATE: 29.MAY.81 * !********************* %CONSTSTRING (7) VSN = "VSN001B" !! STACK = 300, STREAMS = 1 %CONTROL K'100001' %RECORDFORMAT XF(%BYTEINTEGER UNIT,FSYS,%BYTEINTEGERARRAY FNAME(0:5)) %CONSTRECORD (XF) %NAME NULL = 0 %SYSTEMROUTINESPEC ALARM(%INTEGER TICKS) %BEGIN %OWNINTEGER MON = 0 %RECORDFORMAT RJEF(%BYTEINTEGERARRAY DATA(0:239)) %RECORDFORMAT NSI1F(%BYTEINTEGER FN,SUFL,ST,SS,FLAG,UFLAG, %C %RECORD(RJEF) RJE) %RECORDFORMAT NSI2F(%BYTEINTEGER FN,SUFL,ST,SS,%C FLAG, UFL, %C %BYTEINTEGERARRAY A(0:239)) %RECORDFORMAT MEF(%RECORD(MEF)%NAME LINK,%BYTEINTEGER LEN,TYPE, %C %RECORD(NSI1F) NSL) %RECORDFORMAT ME2F(%RECORD(ME2F)%NAME LINK,%BYTEINTEGER LEN,TYPE, %C %RECORD(NSI2F) NSL) %RECORDFORMAT PF(%BYTEINTEGER SERVICE,REPLY,FN,PORT, %C %RECORD(MEF)%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 %OWNSTRING (127) USER, PASS, FILE, DISC %OWNSTRING (5) USERN = "USER " %OWNSTRING (5) PASSN = "PASS " %OWNSTRING (5) FILEN = "FILE " %OWNSTRING (5) RL01N = "RL01" %OWNSTRING (5) RK05N = "RK05" %OWNSTRING (5) RX02N = "RX02" %OWNSTRING (5) TESTN = "TEST" %OWNSTRING (5) DOLLAR = "$$$$$" %CONSTBYTEINTEGERNAME ID = K'160030' %CONSTBYTEINTEGERNAME INT = K'160060' %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 %OWNINTEGER BLEXT = 0 %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, FACILITY, FLAG, NODE, TERM) %RECORD (P3F) %NAME P3 P3 == P 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(P) %END %ROUTINE GET NEXT DISC BLOCK %INTEGER I, J, K %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 ") TO GATE(CLOSE CALL, NULL, 0) STATE = CLOSING %RETURN %FINISH P_SER = DISC SER; P_REPLY = ID P_A = 0; P_B == BUFF(0); P_C = BLOCK!BLEXT PONOFF(P) %IF P_A # 0 %START PRINTSTRING("Failed to read Block"); WRITE(BLOCK, 2) PRINTSTRING(" from the disc - "); WRITE(P_A, 1) NEWLINE BUFF(I) = 0 %FOR I = 0, 1, 511 %IF P_A = 4 %THEN -> END OF DISC %FINISH BLOCK = BLOCK+1 %IF GOAH # 0 %THEN GET BUFFER(0, 0) STATE = READY %END %ROUTINE DO TITLE(%RECORD (MEF) %NAME MES) %RECORD (RJEF) %NAME RJE %INTEGER PT, OPT, I %ROUTINE PLANT(%STRINGNAME 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(FILEN, PT); PLANT(FILE, PT) RJE_DATA(OPT) = PT-OPT-1 OPT = PT; PT=PT+1 PLANT(DOLLAR, PT) RJE_DATA(OPT) = PT-OPT-1 MES_LEN = PT+6 MES_NSL_UFLAG = 5; ! ISO TO GATE(PUT OUTPUT, MES, 0) STATE = GETTING GET NEXT DISC BLOCK %END %ROUTINE DO BLOCK(%RECORD (MEF) %NAME MES, %INTEGER CNSL) %INTEGER I, J, K %RECORD (NSI2F) %NAME NSI %RECORD (RJEF) %NAME RJE %INTEGER A, B, C, LEN %IF CNSL # 0 %THEN DO TITLE(MES) %AND %RETURN RJE == MES_NSL_RJE PKTS = PKTS+1 A = PT+199 %IF A > 511 %THEN A = 511 LEN = A-PT+1 B = 2 RJE_DATA(0) = 128; RJE_DATA(1) = LEN %CYCLE PT = PT, 1, A RJE_DATA(B) = BUFF(PT) B = B+1 %REPEAT MES_LEN = LEN+2+6 MES_NSL_UFLAG = 1; ! BINARY TO GATE(PUT OUTPUT, MES, 0) GOAH = 0 %IF PT = 511 %START STATE = GETTING GET NEXT DISC BLOCK PT = 0 %ELSE PT = PT+1 %END %ROUTINE READ LINE(%STRINGNAME 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 MAP VIRT(BUFFER MANAGER,4, 3) MAP VIRT(BUFFER MANAGER, 5, 4) MAP VIRT(BUFFER MANAGER, 6, 5) PRINTSTRING("Roll Disc Image to the 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(DISC) = LENGTH(DISC)-1 %IF DISC = TESTN %START LAST BLOCK = 100 PROMPT("Node?"); READ(NODE) PROMPT("Term?"); READ(TERM) PROMPT("Fac?"); READ(STRM) %FINISH %IF DRIVE = 0 %START DISC SER = 3; BLEXT = 0 %ELSE %IF DRIVE # 1 %START PRINTSTRING("Only Drive 0 or 1 ") %STOP %FINISH DISC SER = 3; BL EXT = K'20000' %FINISH %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 %CONTINUE %FINISH %IF MON = 2 %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("Call Accepted by Filestore ") CONN OK = 1 GET BUFFER(1, 0); ! GET BUFFER FOR TITLE %CONTINUE %FINISH %IF P_FN=CALL ABORTED %START; ! MY END I HOPE PRINTSTRING("CALL GONE ") %STOP %FINISH %IF P_FN = CALL CLOSED %START PRINTSTRING("File closed successfully ") P_SERVICE = 0; POFF(P); ! CATCH THE TIMER %STOP %FINISH %IF P_FN = OUTPUT TRANSMITTED %START GOAH = 1 GET BUFFER(0, 0) %IF STATE = READY %CONTINUE %FINISH %IF P_FN = INPUT RECD %START PKTS = PKTS+1 PRINTSTRING("Input ??? ") %CONTINUE %FINISH PRINTSTRING("FUNNY FN"); WRITE(P_FN, 1); NEWLINE %CONTINUE %FINISH %REPEAT %ENDOFPROGRAM