************************************************************** ** MAIN ENTRY POINT - KERMIT ONLY RUNS AS A SERVER SINCE ** ** THE SPERRY 90/60 CAN NOT INITIATE ** ** USE OF AN RTIO LINE OTHER THAN THE ** ** TERMINAL LINE ITSELF ** ** MCC TABLES AND TRANSLATION MODULES MODIFIED IN SYSTEM ** ** THIS IS NECESSARY TO INSURE THAT ALL THE CHARACTERS ** ** IN THE PRINTABLE ASCII RANGE AND THE ^A HAVE VALUES ** ** WITHIN THE EBCDIC REPRESENTATION (SEE ATOE TABLE) ** ************************************************************** SERVER CSECT STM 14,12,12(13) SAVE CALLER REGISTERS BALR 12,0 SET UP A BASE REGISTER USING *,12 ST 13,SAVE+4 SAVE MY CALLERS SAVE AREA ADR LA 13,SAVE SET UP MY SAVE AREA TO CALL SETBF 200,N WAIT LA 1,=A(PKNAK,REC) SET UP PARAMATER LIST ERRSEN L 15,=V(PACKETIO) GET READY TO GO BALR 14,15 GO DO A TRANSFER LA 1,=A(REC) ADDRESS OF PACKET RECIEVED LA 14,CHCK RETURN ADDRESS FOR FOLLOWING CHCK CLI RECTYP,C'S' IS IT A SEND INIT PACKET BNE SKIPSEND CHECK NEXT PACKET TYPE L 15,=V(RECFILE) REMOTE IS SENDING US A FILE BR 15 GO TAKE FILE FROM REMOTE TO DISK SKIPSEND CLI RECTYP,C'R' IS IT A RECIEVE INIT PACKET BNE SKIPREC NO GO TO CHECK OTHER TYPES L 15,=V(SENFILE) ROUTINE TO SEND FILE TO REMOTE BR 15 AND OFF WE GO SKIPREC CLI RECTYP,C'I' CHECK FOR AN INIT PACKET BNE SKIPINIT L 15,=V(KRMTINI) ADDRESS OF INIT HANDLER BR 15 SKIPINIT CLI RECTYP,C'G' BNE SKIPGEN CLI RECDAT,C'L' IS THIS A LOGOUT BNE SKIPGEN LA 1,=A(PKYAK,0) L 15,=V(PACKETIO) BALR 14,15 ACK THE LOGOFF COMMAND CMAND '/LOGOFF' SKIPGEN CLI RECTYP,C'Y' IS THIS AN EXTRA ACK BE WAIT YES SEND A NAK AND WAIT CLI RECTYP,C'E' BE WAIT LA 1,=A(PKERR,REC) B ERRSEN PKERR DS 0F PKELEN DC X'1B' PKESEQ DC X'00' PKETYP DC C'E' PKEDAT DC C'FUNCTION NOT IMPLEMENTED' PKNAK DS 0F DC X'03' LENGTH OF NAK PACKET TO SEND DC X'00' SEQUENCE NUMBER DC C'N' PKYAK DC X'03' PACKET LENGTH DC X'00' PACKET NUMBER DC C'Y' PACKET DATA REC DS 0F RECLEN DS XL1 RECSEQ DS XL1 RECTYP DS XL1 RECDAT DS CL150 SAVE DS 18F END KRMTINI CSECT STM 14,12,12(13) SAVE CALLER REGISTERS BALR 12,0 SET UP MY BASE REGISTER USING *,12 ST 13,SAVE+4 SAVE CALLERS SAVE ADDRESS LOCAL LA 13,SAVE SET UP A SAVE AREA FOR OTHER CALLS *************************************************************** **KERMIT INIT PACKER HANDLER ** ** ARGUMENTS (1) - 1 ADDRESS OF PACKET ** ** RECIEVED INIT PACKET ON INPUT ** ** NEXT PACKET ON RETURN ** ** EXTERNAL REFF POINT - (KRMTPARM) START OF KERMIT ** PARAM LIST ** *************************************************************** L 2,0(1) ADDRESS OF PACKET IC 3,0(2) LENGTH OF PACKET MVI PARMPKT,C' ' BLANK OUT THE LOCAL PACKET MVC PARMPKT+1(152),PARMPKT BCTR 3,0 DECREMENT FOR AN EX MOVE EX 3,MOVEPKT MOVE IT TO PARMPKT MVI CALLTYP,C' ' NORMAL CALL CLI PARMTYP,C'R' IS THIS AN INIT REMOTE RECIEVE BE WESTART IF SO WE START THE INIT SETMAXL SR 11,11 CLEAR A REGISTER IC 11,PARMDAT GET MAX LENGTH L 3,=V(ETOA) NEED PACKETIO TRANS TABLE IC 11,0(11,3) CHANGE CHARACTER TO ASCII SH 11,=H'32' LOWER FROM PRINTABLE RANGE STC 11,PARMMAXL STORE AMOUNT IN PARM TABLE SETTIME SR 11,11 IC 11,=X'10' SET TIME TO WAIT TO 16 SECONDS AH 11,=H'32' SET UP IN PRINTABLE RANGE L 4,=V(ATOE) TRANS FROM PACKETIO TO EBCDIC IC 11,0(11,4) CHANGE TIME TO EBCDIC STC 11,PARMDAT+1 PUT IN PACKET TO SEND SETPAD SR 11,11 IC 11,PARMDAT+2 GET NUMBER OF PADDING CHARS IC 11,0(11,3) CONVERT IT TO ASCII BITS SH 11,=H'32' ADJUST DOWN FROM PRINTABLE STC 11,PARMNPAD STORE IN MY PARM LIST LH 11,=H'0' PUT SOME FILL CHARS IN AH 11,=H'32' GET UP TO PRINTABLE RANGE IC 11,0(11,4) TRANSLATE TO EBCDIC STC 11,PARMDAT+2 PUT IN PACKET TO SEND SETPADC SR 11,11 IC 11,PARMDAT+3 GET CHARACTER THEY ASKED FOR IC 11,0(11,3) TRANSLATE TO ASCII X 11,XORWRD USE CTL FUNCTION TO MOVE DOWN IC 11,0(11,4) TRANSLATE BACK TO EBCDIC STC 11,PARMPADC PUT IN PARM LIST SR 11,11 X 11,XORWRD USE CTL FUNCTION TO MOVE UP IC 11,0(11,4) SET TO EBCDIC CHAR STC 11,PARMDAT+3 TELL HIM I WANT NULLS(WHO CARES) SETEOL SR 11,11 IC 11,PARMDAT+4 GET EOL CHAR THEY WANT TO SEND IC 11,0(11,3) TRANSLATE TO ASCII SH 11,=H'32' IC 11,0(11,4) TRANSLATE BACK TO EBCDIC STC 11,PARMEOL PUT IN PARM LIST IC 11,=X'15' PUT IN MY CHARACTER IC 11,0(11,3) TRANSLATE TO ASCII AH 11,=H'32' SET UP TO PRINTABLE IC 11,0(11,4) TRANSLATE BACK TO EBCDIC STC 11,PARMDAT+4 SETQCTL IC 11,PARMDAT+5 GET QUOTE CHARACTER FOR CTL STC 11,PARMQCTL GOOD FOR ME TOO SETQBIN MVI PARMDAT+6,C'N' WE DONT DO 8 BIT QUOTING MVI PARMDAT+7,C'1' WE ONLY DO 1 BYTE CHECKSUMS SEQREPT IC 11,PARMDAT+8 GET A REPT QUOTE CHARACTER STC 11,PARMREPT GOOD ENOUGH FOR M MVI PARMDAT+9,X'00' WE HAVE NO EXTENSIONS MVI PARMTYP,C'Y' CHANGE PACKET TO AN ACK CLI CALLTYP,C'R' IS THIS INIT CAUSED BY A R PACKET BE ENDCALL WE ALREADY SENT OUT INIT PARAMS LA 1,ARGLIST L 15,=V(PACKETIO) CALL PACKET I/O FOR MESS SWAP BALR 14,15 ENDCALL L 11,=V(PIOINIT) GET PARAM LOCATION IN PACKETIO MVC 0(3,11),PARMNPAD MOVE NPAD, PADC, AND EOL CHARS GOBACK SR 11,11 CLEAR IT IC 11,PARMLEN GET THE LENGTH BCTR 11,0 DECREMENT BY 1 FOR EX MOVE EX 11,MOVEBK MOVE IT BACK TO CALLER RETURN L 13,SAVE+4 LM 14,12,12(13) SR 15,15 BR 14 WESTART LA 1,=A(PKINIT,PARMPKT) L 15,=V(PACKETIO) SEND BASIC INIT START BALR 14,15 CLI PARMTYP,C'E' BE GOBACK CLI PARMTYP,C'I' BE ISOK CLI PARMTYP,C'Y' BE ISOK B GOBACK ISOK MVI CALLTYP,C'R' THIS IS AN R PACKET INIT B SETMAXL GO UP AND GET PARAM ARGLIST DC A(PARMPKT) DC A(PARMPKT) XORWRD DC F'64' MOVEPKT MVC PARMPKT(1),0(2) MOVEBK MVC 0(1,2),PARMPKT CALLTYP DS CL1 SAVE DS 18F PARMPKT DS 0F PARMLEN DS XL1 PARMSEQ DS XL1 PARMTYP DS XL1 PARMDAT DS CL150 ENTRY KRMTPARM KRMTPARM EQU * PARMMAXL DS XL1 PARMTIME DS XL1 PARMNPAD DS XL1 PARMPADC DS CL1 PARMEOL DS CL1 PARMQCTL DS CL1 PARMQBIN DS CL1 PARMCHKT DS CL1 PARMREPT DS CL1 PARMCAPS DS X'00' PKINIT DS 0F PKILEN DC X'0C' PKISEQ DC X'00' PKITYP DC C'S' PKIMAXL DC X'FF' PKITIM DC C'-' PKINPAD DC C' ' PKIPADC DC C'@' PKIEOL DC C'-' PKIQCTL DC C'#' PKIQBIN DC C'N' PKICKTYP DC C'1' PKIQREPT DC C'_' END KRMTUC CSECT STM 14,12,12(13) BALR 12,0 USING *,12 ST 13,SAVE+4 LA 13,SAVE **************************************************** * ROUTINE TO CONVERT A 54 CHAR FIELD TO UPPER CS * **************************************************** L 2,0(1) GET ADDRESS OF THE FIELD LA 3,54 GET A COUNT IN REG 3 LOOPUC CLI 0(2),X'81' CHECK LOWER RANGE TO CHANGE BL NOCHNG IF LOW NO CHANGE CLI 0(2),X'A9' CHECK THE UPPER RANGE BH NOCHNG IF HIGH NO CHANGE OI 0(2),X'40' SET THE BIT FOR UPPER CASE NOCHNG LA 2,1(2) INCREMENT 2 BY 1 CLI 0(2),X'40' IS IS A BLANK BE RETURN IF SO NO MORE TO CHECK BCT 3,LOOPUC GO CHECK NEXT CHAR RETURN L 13,SAVE+4 GET THE SAVE AREA LM 14,12,12(13) SET REGISTERS BACK SR 15,15 ALL OK BR 14 AND BACK WE GO SAVE DS 18F END PACKETIO CSECT STM 14,12,12(13) BALR 12,0 USING *,12 ************************************************************** ** KERMIT I/O HANDELER ** ** USE: ** ** CONVERTS A PACKET FROM SIMPLE INTERNAL FORMAT ** ** TO KERMIT FORMAT AND SENDS IT ** ** RECIEVES THE ANS PACKET AND CONVERTS IT TO SIMPLE ** ** INTERNAL FORMAT ** ** RETRANSMITS FOR I/O ERRORS UNTIL TRANSACTION FINISH ** ** CALL FORMAT: ** ** STANDARD LINKAGE USAGE ** ** ARG #1 - ADDRESS OF PACKET TO SEND ** ** ARG #2 - ADDRESS OF PACKET TO RECIEVE ** ** INTERNAL PACKET FORMAT: ** ** BINARY LENGTH INCLUSIVE ** ** PACKET SEQUENCE NUMBER IN BINARY ** ** CHARACTER REPRESENTING PACKET TYPE ** ** VARIABLE LENGTH DATA FIELD ** ** LENGTH OF FIELD = -3 ** ** PROCEDURE: ** ** A) PREFIX PACKET WITH A ^A FOR START OF PACKET ** ** B) PREFIX PACKET WITH LENGTH AND STUFF FOR A ** ** UNIVAC V TYPE RECORD ** ** C) CONVERT & TO CHAR ADJUSTED FORM ** ** D) CALCULATE A CHECK SUM BASED ON ASCII REP ** ** F) SUFFIX PACKET WITH A CARRAGE RETURN ** ** EBCDIC X'15' = ASCII X'0D' ** ** G) SEND THE PACKET AND GET THE RETURN PACKET ** ** H) CONVERT THE RETURN PACKET TO SIMPLE FORM ** ** I) RETURN THE PACKET TO THE CALLER ** ** ERRORS: ** ** ALL ERRORS CAUSE THE ORIGINAL PACKET TO BE SENT ** ** AGAIN. (THIS SHOULD BE OK; DUPE PACKETS ARE DROP)** ** ERRORS WHICH ARE INTERCEPTED ARE: ** ** RTIO ERROR - UNIVAC BUFFER OVERRUN ** ** CHECKSUM - ERROR ON CHECKSUM ON RETURNING PACK ** ** NAK - PACKET SENT WAS NAK'ED BY REMOTE ** ************************************************************** SPACE SPACE ************************************************************** ** BUILD THE PACKET TO GO OUT ** ************************************************************** L 3,0(1) GET ADDRESS PACKET TO SEND L 4,4(1) GET ADDRESS OF PACKET SR 5,5 CLEAR A REG FOR ERROR COUNT SENDAGN SR 11,11 CLEAR OUT A TEMP REG C 5,=F'50' CHECK FOR ERROR ABORT BH TERMD LETS GET THAT DUMP IC 11,0(3) GET THE LENGTH OF PACKET EX 11,MOVEPK MOVE TO LOCAL(YES 1 EXTRA CHAR) MVI SENDMRK,X'27' MOVE IN ^A FOR START OF PACKET LA 11,8(11) GET LENGTH FOR V RECORD STH 11,SENDVREC STORE IT IN BEGINNING OF BUFFER MVC SENDFIL,=X'4040' BLANKS TO KEEP UNIVAC HAPPY MVI SENDNUL,X'00' MOVE IN A NUL AT START OF LINE SR 11,11 CLEAR IT AGAIN IC 11,SENDLEN GET THE LENGTH AGAIN STC 11,SAVELEN SAVE LENGTH FOR LATER USE AH 11,=H'32' MOVE UP TO PRINTABLE STC 11,SENDLEN PUT BACK IN PACKET TR SENDLEN,ATOE TRANS TO EBCDIC FOR LATER ASCII SR 11,11 CLEAR 11 FOR SAME TO SEQUENCE IC 11,SENDSEQ GET THE SEQUENCE NUMBER AH 11,=H'32' ADJUST UP TO PRINTABLE STC 11,SENDSEQ PUT BACK IN PACKET RECORD TR SENDSEQ,ATOE TRANS TO EBCDIC FOR LATER ASCII CVT SR 11,11 CLEAR TEMP REGISTER AGAIN IC 11,SAVELEN GET ORIGINAL BINARY LENGTH EX 11,MOVETS MOVE PACKET TO TEMP STORAGE EX 11,TRANTS TRANSLATE TEMPORARY TO ASCII SR 10,10 CLEAR ANOTHER REGISTER FOR TEMP SR 9,9 CLEAR A REGISTER FOR SUM LR 8,11 POINT TO LAST CHAR (CHECKSUM) LOOPCKSM IC 10,TEMPS-1(8) GET NEXT CHAR IN STRING AR 9,10 ADD TO SUM BCT 8,LOOPCKSM GO BACK FOR MORE CHARS N 9,ZAPHIGH GET RID OF HIGH 3 BYTES LR 8,9 COPY TO 8 SRL 8,6 SHIFT RIGHT 6 BITS TO LEAVE HIGH 2 AR 9,8 ADD IT TO THE SUM N 9,ZAPBUT6 ZAP ALL BUT LAST 6 BITS AH 9,=H'32' MOVE UP TO PRINTABLE RANGE IC 9,ATOE(9) CONVERT TO EBCDIC STC 9,SENDLEN(11) PUT AT END OF PACKET IC 8,CARRET GET A CARRAGE RETURN/NEW LINE STC 8,SENDLEN+1(11) PUT AFTER THE CHECK SUM ************************************************************** ** NOW THAT A PACKET IS READY TO GO WE WILL SEND IT TO ** ** THE REMOTE DEVICE VIA TERMINAL LINE AND WAIT FOR THE ** ** RETURN PACKET FROM THE REMOTE ** SR 11,11 CLEAR REG IC 11,NPAD GET NUMBER OF PAD CHARS LTR 11,11 SEE IF ZERO BZ WTRD DO THE WRITE NOW MVC TEMPS(1),PADC MOVE IN PAD CHARACTER MVC TEMPS+1(150),TEMPS AH 11,=H'5' ADD FOR RECLEN STH 11,TEMPS PUT IN THE RECORD MVC TEMPS+2(2),=C' ' PUT IN BLANKS KEEP UNI HAPPY WROUT TEMPS,X'16' WRITE OUT THE NULLS (NO CR) WTRD LTR 4,4 CHECK RETURN PACKET ADDR BZ SENDONLY IF ZERO WE SEND AND RETURN WRTRD SENDPK,X'16',TEMPS,X'16',150,RTIOERR ************************************************************** ** INPUT BUFFER (TEMPS) SHOULD HAVE A PACKET. FIRST WE MUST ** ** FIND THE ^A TO START THE PACKET AND DROP TRASH ** ************************************************************** TRT TEMPS+4(L'TEMPS-4),TABCTLA BZ RTIOERR ^A NOT FOUND LA 11,TEMPS-1 ADDRESS OF START OF PACKET LH 10,TEMPS LENGTH OF STRING (V REC) LR 9,1 ADDRESS OF ^A N 9,ZAPADDR N 11,ZAPADDR GET RID OF FIRST BY ADDRESS CONST SR 9,11 AMOUNT OF TRASH BEFORE ^A AR 11,9 ADD LENGHT OF TRASH TO START SR 10,9 GET LENGHTOF GOOD DATA LR 8,10 SAVE LENGHT OF GOOD DATA(TEMP) BCTR 10,0 DECREMENT BY 1 FOR EX TYPE MOVE EX 10,MOVEGT MOVE IT TO THE "GET" PACKET *************************************************************** ** THE GOOD PART OF THE PACKET IS IN THE "GET" AREA ** ** MUST BE CHECKED FOR CHECKSUM OR NAK ** *************************************************************** SR 11,11 CLEAR OUT A TEMP REG IC 11,GETLEN GET THE EBCDIC LENGTH(NOT READY) IC 11,ETOA(11) TRANSLATE CHAR TO ASCII SH 11,=H'32' DOWN FROM PRINTABLE TO BINARY BM RTIOERR THIS PACKET LENGTH IS BAD SR 8,11 GET DIFF BETWEEN V LEN AND PACKET C 8,=F'5' IS THE DIFF MORE THAN 5 BH RTIOERR C 8,=F'-5' IS DIFF LESS THAN 5 BL RTIOERR EX 11,MOVEGTP MOVE IT TO TEMP STORAGE EX 11,TRANTS TRANSLATE IT TO ASCII LR 10,11 POINT TO LAST CHAR SR 9,9 CLEAR FOR SUM SR 8,8 CLEAR FOR TEMP USE LOOPCK IC 8,TEMPS-1(10) GET A CHARACTER AR 9,8 ADD IT TO THE SUM BCT 10,LOOPCK GO BACK FOR MORE CHARS? N 9,ZAPHIGH CLEAR ALL BUT LAST BYTE LR 10,9 COPY TO REG 10 SRL 10,6 MOVE HIGH 2 BITS OF BYTE TO LOW BITS AR 9,10 ADD THOSE BITS TO THE SUM N 9,ZAPBUT6 CLEAR ALL BUT LAST 6 BITS AH 9,=H'32' ADD TO COMPAIR IN PRINTABLE RANGE IC 10,TEMPS(11) GET THE CHECKSUM RECIEVED CR 9,10 ARE THEY THE SAME BNE RTIOERR IF NOT LETS TRY AGAIN ************************************************************** ** THIS LOOKS LIKE A GOOD PACKET. NEXT TO CHANGE THE BINARY ** ** FIELDS FROM THEIR EBCDIC CHAR TRANSLATION ** ************************************************************** CLI GETTYP,C'N' IS THE PACKET A NAK BE RTIOERR IF SO LETS TRY AGAIN SR 11,11 CLEAR IT IC 11,TEMPS+1 GET ASCII REP FOR SEQUENCE SH 11,=H'32' MOVE IT DOWN STC 11,GETSEQ PUT IT IN THE PACKET TO RETURN IC 11,TEMPS GET THE ASCII REP FOR LENGTH SH 11,=H'32' MOVE IT DOWN FROM PRINTABLE STC 11,GETLEN PUT IN PACKET TO RETURN BCTR 11,0 DECREMENT IT FOR THE MOVE EX 11,MOVEBK MOVE IT BACK TO CALLER RETURN LM 14,12,12(13) RESTORE CALLERS REGISTERS SR 15,15 ALL IS OK BR 14 AND BACK TO THE CALLER RTIOERR LA 5,1(5) INCREMENT I/O ERROR COUNT B SENDAGN GO BACK AND SEND AGAIN SENDONLY WROUT SENDPK,X'16' B RETURN AND BACK WE GO TERMD TERMD ENTRY ATOE,ETOA ATOE DC X'00270303030303030303030303150303' DC X'03030303030303030303030303030303' DC X'405A7F7B5B6C507D4D5D5C4E6B604B61' DC X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F' DC X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6' DC X'D7D8D9E2E3E4E5E6E7E8E9B4BCB56A6D' DC X'4A818283848586878889919293949596' DC X'979899A2A3A4A5A6A7A8A9C04FD0FF07' DC X'03030303030303030303030303030303' DC X'03030303030303030303030303030303' DC X'03030303030303030303030303030303' DC X'03030303030303030303030303030303' DC X'03030303030303030303030303030303' DC X'03030303030303030303030303030303' DC X'03030303030303030303030303030303' DC X'03030303030303030303030303030303' ETOA DC X'000303030303037F0303030303030303' DC X'03030303030D03030303030303030303' DC X'03030303030303010303030303030303' DC X'03030303030303030303030303030303' DC X'20030303030303030303602E3C282B7C' DC X'2603030303030303030321242A293B03' DC X'2D2F03030303030303035E2C255F3E3F' DC X'030303030303030303033A2340273D22' DC X'03616263646566676869030303030303' DC X'026A6B6C6D6E6F707172030303030303' DC X'0303737475767778797A030303030303' DC X'030303035B5D0303030303035C030303' DC X'7B414243444546474849030303030303' DC X'7D4A4B4C4D4E4F505152030303030303' DC X'0303535455565758595A030303030303' DC X'3031323334353637383903030303037E' TABCTLA DC 256X'00' ORG TABCTLA+X'27' CTRLA DC X'27' ORG SAVELEN DS CL1 ENTRY PIOINIT PIOINIT EQU * NPAD DS XL1 PADC DS CL1 CARRET DC X'15' MOVETS MVC TEMPS(1),SENDLEN MOVEGTP MVC TEMPS(1),GETLEN TRANTS TR TEMPS(1),ETOA MOVEPK MVC SENDLEN(1),0(3) MOVEGT MVC GETLEN(1),1(11) MOVEBK MVC 0(1,4),GETLEN DS 0F ZAPHIGH DC X'000000FF' ZAPBUT6 DC X'0000003F' ZAPADDR DC X'00FFFFFF' LTORG SENDPK DS 0F SENDVREC DS H SENDFIL DS XL2 SENDNUL DS XL1 SENDMRK DS CL1 SENDLEN DS CL1 SENDSEQ DS CL1 SENDTYP DS CL1 SENDDATA DS CL150 SAFE1 DS CL256 DS 0F TEMPS DS CL150 SAFE2 DS CL256 GETPK DS 0F GETLEN DS CL1 GETSEQ DS CL1 GETTYP DS CL1 GETDATA DS CL150 SAFE3 DS CL256 END SENFILE CSECT STM 14,12,12(13) BALR 12,0 USING *,12 ST 13,SAVE+4 LA 13,SAVE *********************************************************** ** ROUTINE TO SEND A FILE ** *********************************************************** L 3,0(1) GET THE ADDRESS OF PACKET SR 11,11 CLEAR IT IC 11,0(3) GET THE LENGTH BCTR 11,0 DECREMENT BY 1 FOR MVC EX 11,MOVELCL MOVE THE PACKET TO LOCAL MVI INFCB+X'2E',C' ' MVC INFCB+X'2F'(53),INFCB+X'2E' SH 11,=H'3' SUBTRACT FOR LEN,SEQ,TYP EX 11,MOVEFIL MOVE THE FILE NAME TO FCB LA 1,=A(INFCB+X'2E') L 15,=V(KRMTUC) BALR 14,15 MVC FILECMD+12(54),INFCB+X'2E' LA 1,=A(PACKET) SET UP PARM FOR SUB CALL L 15,=V(KRMTINI) GET READY TO DO AN INIT BALR 14,15 AND OFF WE GO CLI PKTYP,C'E' BE RETURN CLI PKTYP,C'Y' IS IT AN ACK FOR INIT BE ISOKACK YES WE CAN GO ON B RETURN ABORT TERMD ISOKACK MVI PKTYP,C'F' START BUILDING A FILE PACKET MVC PKDAT(54),FILECMD+12 LA 11,PKDAT+53 POINT TO THE END OF PACKET LOOKEND CLI 0(11),C' ' IS THIS A BLANK CHAR BNE HAVEEND BCT 11,LOOKEND LOOK FOR THE END OF FILENAME HAVEEND LA 10,PACKET GET START OF PACKET SR 11,10 GET LENGTH IN 11 LA 11,1(11) INCREMENT TO MAKE INCLUSIVE STC 11,PKLEN PUT IT IN THE LENGTH BAL 14,INCSEQ SR 10,10 CLEAR A TEMP REGISTER SR 11,11 CLEAR A SECOND TEMP REGISTER LA 1,ARGLIST SEND ARG LIST OF PACKET,PACKET L 15,=V(PACKETIO) BALR 14,15 SEND THE F PACKET CLI PKTYP,C'Y' DID WE GET FILE ACK BNE RETURN PRINT NOGEN FILECMD FILE DUMMYFILE PRINT GEN OPEN INFCB,INPUT OPEN THE INPUT FILE L 11,=V(KRMTPARM) SR 7,7 IC 7,0(11) GET MAX PACKET LENGTH SH 7,=H'3' SUBTRACT LEN,TYP,SEQ *************************************************************** ** WE HAVE SENT AN INIT PACKET (SEE KRMTINI) ** ** ALSO HAVE SENT AN F PACKET WITH THE FILE NAME IN IT ** ** AND THE FILE SHOULD BE OPEN FOR INPUT AT THIS POINT ** *************************************************************** SR 11,11 SR 4,4 CLEAR A POINTER TO RECORD SR 5,5 CLEAR A POINTER TO DATA SR 9,9 GETREC GET INFCB,RECLEN GET A RECORD FROM THE FILE LH 6,RECLEN GET LENGTH OF RECORD SH 6,=H'4' SUBTRACT LENGTH OF V REC FORMAT MOVECHR IC 11,RECORD(4) GET NEXT CHARACTER FROM RECORD L 8,=V(ETOA) NEED ADDRESS OF TRANSLATION TABLE IC 10,0(11,8) GET ASCII VALUE OF CHARACTER EX 10,TESTBAD CHECK FOR A NON PRINTABLE CHAR BNE NOZAP NOT CHANGED TO TILD ZAPIT IC 11,=X'6D' MAKE THIS A TILD CHARACTER NOZAP STC 11,TESTCHR PUT IT IN MEMORY CLI TESTCHR,X'00' GET RID OF NULLS BE ZAPIT CLI TESTCHR,X'0D' IS IT A DEL CHARACTER BE ZAPIT GET RID OF THAT ALSO CLI TESTCHR,X'01' IS IT A CONTROL A BE ZAPIT CLI TESTCHR,X'FF' BE ZAPIT CLI TESTCHR,C'#' IS THIS A # BNE NORMCH NO PROCESS NORMAL STC 11,PKDAT(5) PUT IN FIRST # LA 5,1(5) INCREMENT IN BUFFER CR 5,7 WILL THERE BE ROOM FOR NEXT # BL STORECH YES GO PUT IT IN BCTR 5,0 TAKE OFF THE ONE WE PUT IN BAL 2,WRITEPK WRITE THE SHORT PACKET IC 11,=C'#' GET BACK THE # STC 11,PKDAT(5) PUT ONE IN LA 5,1(5) INCREMENT POINTER B STORECH PUT IN THE SECOND ONE NORMCH CLC TESTCHR,LASTCHR IS THIS THE SAME AS LAST BE INCCNT IF SO INC THE REPT COUNT SR 9,9 SET CHAR COUNT TO ZERO MVC LASTCHR,TESTCHR MOVE THIS TO LAST INCCNT LA 9,1(9) INCREMENT BY 1 CH 9,=H'4' HOW MANY DO WE HAVE BL STORECH NOT ENOUGH STC 11,PKDAT-1(5) PUT THE CHAR IN IC 11,=X'FF' GET A TILD STC 11,PKDAT-3(5) PUT TILD IN FOR QUOTE L 8,=V(ATOE) TRANS TO EBCDIC CHAR IC 11,32(8,9) GET ASCII VALUE OF AMT STC 11,PKDAT-2(5) CH 9,=H'94' BL INCDPTR MVI LASTCHR,X'FE' B INCDPTR STORECH STC 11,PKDAT(5) PUT THE CHARACTER IN OUTPUT LA 5,1(5) INCREMENT DATA POINTER INCDPTR LA 4,1(4) INCREMENT RECORD POINTER CR 5,7 IS MORE ROOM IN PACKET BL CHECKREC IF YES IS MORE DATA IN REC SKIPWRT BAL 2,WRITEPK WRITE A PACKET CHECKREC CR 4,6 IS MORE DATA IN CURRENT RECORD BL MOVECHR PROCESS REST OF RECORD SR 9,9 SET REPT COUNT TO ZERO LR 11,5 GET LENGTH USED IN PACKET LA 11,4(11) WILL THERE BE ROOM FOR QUOTED CHAR CR 11,7 BNL SKIPWRT WE HAVE ROOM NO NEED TO WRITE IC 11,=C'#' GET A PREFIX CHAR STC 11,PKDAT(5) PUT IT IN THE RECORD IC 11,=C'M' GET A 'M' FOR ^M LA 5,1(5) INCREMENT BY 1 STC 11,PKDAT(5) PUT IT IN THE RECORD IC 11,=C'#' QUOTE AGAIN LA 5,1(5) GO TO NEXT POSITION STC 11,PKDAT(5) LA 5,1(5) IC 11,=C'J' STC 11,PKDAT(5) LA 5,1(5) RECORD IS FINISHED SR 4,4 CLEAR RECORD POINTER FOR NEXT CR 5,7 DID WE FILL THE BUFFER BL GETREC BAL 2,WRITEPK GO TO LOCAL RTN TO WRITE PACKET B GETREC GO GET ANOTHER RECORD INCSEQ IC 11,PKSEQ LA 11,1(11) STC 11,PKSEQ NI PKSEQ,63 BR 14 WRITEPK MVI PKTYP,C'D' SET PACKET TYPE TO DATA SR 11,11 BAL 14,INCSEQ LA 5,3(5) ADD FOR LEN,TYPE,SEQ STC 5,PKLEN STORE IT IN THE LENGTH LA 1,ARGLIST GET ADDRESS LIST FOR SUB CALL L 15,=V(PACKETIO) GET ROUTINE TO WRITE PACKET BALR 14,15 AND WRITE IT OUT CLI PKTYP,C'Y' DID WE GET AN ACK BNE ERRCLS NO ABORT THIS RUN SR 5,5 THE NEW PACKET IS EMPTY SR 9,9 REPT COUNT IS ZERO BR 2 GO BACK TO CALLER EOF LTR 5,5 WAS THERE DATA IN A PACKET BZ WRITEZ NO CLOSE THE TRANSMISSION BAL 2,WRITEPK WRITE LAST PACKET WRITEZ MVI PKTYP,C'Z' END OF FILE PACKET CLOSE INFCB REMEMBER TO CLOSE THE INPUT SR 11,11 BAL 14,INCSEQ MVI PKLEN,X'03' SET LENGTH TO 3 LA 1,ARGLIST GET READY TO CALL PACKETIO L 15,=V(PACKETIO) BALR 14,15 SEND THAT PACKET GET AN ACK CLI PKTYP,C'E' BE RETURN CLI PKTYP,C'Y' WAS IT AN ACK BNE RETURN LETS GET A DUMP MVI PKTYP,C'B' BUILD A BREAK PACKET BAL 14,INCSEQ MVI PKLEN,X'03' SET THE LENGTH TO 3 L 15,=V(PACKETIO) BALR 14,15 CLI PKTYP,C'E' BE RETURN CLI PKTYP,C'Y' THE BREAK SHOULD BE ACKED BNE RETURN IF NOT ABORT AGAIN RETURN SR 11,11 IC 11,PKLEN GET THE LENGTH BCTR 11,0 DECREMENT BY 1 EX 11,MOVEBK MOVE THE PACKET BACK TO CALLER L 13,SAVE+4 GET WHERE I PUT CALLERS REGISTERS LM 14,12,12(13) RESTORE THOSE REGISTERS SR 15,15 ALL OK BR 14 NOFILE LA 1,=A(D33ERR,PACKET) L 15,=V(PACKETIO) BALR 14,15 B RETURN ERRCLS CLOSE INFCB B RETURN SAVE DS 18F D33ERR DC YL1(ED33-*) D33PKN DC X'00' D33PKT DC C'E' D33PKD DC C'OPEN ERROR OCCURED ON FILE OPEN' ED33 EQU * ARGLIST DC A(PACKET) DC A(PACKET) PACKET DS 0F PKLEN DS XL1 PKSEQ DS XL1 PKTYP DS CL1 PKDAT DS CL150 MOVELCL MVC PACKET(1),0(3) TARGET MOVE TO GO TO LOCAL STORAGE MOVEBK MVC 0(1,3),PACKET TARGET MOVE TO GOT BACK TO CALLER MOVEFIL MVC INFCB+X'2E'(1),PKDAT TESTBAD CLI BADCHR,X'00' BADCHR DC X'03' TESTCHR DS CL1 LASTCHR DS CL1 PRINT NOGEN DS 0D INFCB FCB LINK=KRMOUT,FCBTYPE=SAM,RECFORM=V,EXIT=EXLST EXLST EXLST COMMON=NOFILE,EOFADDR=EOF UNIREC DS 0F RECLEN DS H REDFIL DS CL2 RECORD DS CL1000 END RECFILE CSECT STM 14,12,12(13) BALR 12,0 USING *,12 ST 13,SAVE+4 LA 13,SAVE SET UP MY SAVE AREA *********************************************************** ** ROUTINE TO RECIEVE A FILE FROM REMOTE KERMIT ** ** FIRST WE MUST CHECK FOR AN S TYPE PACKET WHICH WOULD ** ** REQUIRE WE ACK WITH INIT PARAMS USING KRMTINI ROUTINE ** *********************************************************** L 2,0(1) GET ADDRESS OF PACKET IC 11,0(2) GET THE LENGTH OF THE PACKET BCTR 11,0 DECREMENT BY 1 FOR MVC EX 11,MOVELCL MOVE TO LOCAL STORAGE CLI PKTYP,C'S' IS IT THE INIT PACKET BNE SKIPINI IF NOT WE DONT NEED INIT LA 1,=A(PACKET) SET UP AN ARG LIST FOR CALL L 15,=V(KRMTINI) GET ADDRESS OF INIT ROUTINE BALR 14,15 OFF WE GO FOR THE INIT CLI PKTYP,C'E' BE RETURN ************************************************************ ** HAVING INIT THE CONNECTION IT IS TIME TO SET UP THE ** ** FILE TO BE TRANSFERED ** ************************************************************ SKIPINI CLI PKTYP,C'F' SHOULD BE A FILE NAME BNE RETURN WE REALLY NEED A FILE NAME L 11,=V(KRMTPARM) GET ADDRESS OF INIT PARAM MVC CTLCHR,5(11) GET THE CONTROL QUOTE CHAR MVC REPTCHR,8(11) GET THE REPT QUOTE CHAR MVI FILEFCB+X'2E',C' ' MVC FILEFCB+X'2F'(53),FILEFCB+X'2E' IC 11,PKLEN GET LENGTH OF PACKET SH 11,=H'4' SUBTRACT LEN,SEQ,TYP,+1 EX 11,MOVENAME MOVE NAME IN CLEAN FIELD LA 1,=A(FILEFCB+X'2E') L 15,=V(KRMTUC) BALR 14,15 CONVERT FILENAME TO UPPER CASE MVC FILECMD+12(54),FILEFCB+X'2E' FILECMD FILE DUMMYFILE OPENFL OPEN FILEFCB,OUTPUT OPEN THE FILE ************************************************************* ** FILE IS OPEN AND WE ARE READY TO START THE TRANSFER ** ** WE SHOULD BE PROCESSING 'D' PACKETS AT THIS TIME ** ** P.S. SORRY ABOUT THE SLOPPY WAY OF REFF FILE NAME IN ** ** UNIVAC FCB = FCB+X'2E' IT WASN'T WORTH THE COMPILE** ** TIME TO INCLUDE THE IDFCB AND COVER IT WITH A REG ** ************************************************************* MVC PKASEQ,PKSEQ LA 1,=A(PKACK,PACKET) L 15,=V(PACKETIO) ACK FILE NAME GET FIRST D BALR 14,15 CLI PKTYP,C'D' BNE ERRCLS SR 10,10 CLEAR RECORD POINTER SR 8,8 CLEAR TEMP REG SR 9,9 START AT BEG OF DATA FIELD SR 11,11 CLEAR REG FOR COUNT IC 11,PKLEN PUT IN THE LENGTH SH 11,=H'3' REMOVE LEN TYP AND SEQ FIELDS LOOPCHR BAL 4,GETNEXT GET THE NEXT CHARACTER IN 8 EX 8,TESTCTL TEST FOR A CONTROL PREFIX BE PROCCTL PROCESS A CONTROL CHAR EX 8,TESTREPT TEST FOR REPT BE PROCREPT PROCESS THE REPT CHAR EX 8,TESTEND BE PROCEND PROCESS AN END OF FILE TAKECHR STC 8,RECORD(10) PUT IT IN THE RECORD LA 10,1(10) INCREMENT RECORD POINTER C 10,=F'2000' HAVE WE REACHED THE END OF REC BE ENDFILE PRETEND WE HAD A LINE FEED B LOOPCHR GO FOR MORE PROCCTL BAL 4,GETNEXT GET NEXT CHARACTER STC 8,TEMPCHR PUT IN MEMORY FOR CLI CLI TEMPCHR,C'M' IS IT A CARRAGE RETURN ^M BE LOOPCHR WE DONT NEED IT CLI TEMPCHR,C'J' IS IT A LINE RETURN BE ENDREC YES WRITE THE RECORD CLI TEMPCHR,C'#' IS THIS A # SIGN QUOTED WITH A # BE TAKECHR WELL WE WILL KEEP IT IC 8,=X'FF' GIVE THEM A FLAG OF BAD CHAR B TAKECHR PUT IT IN THE OUTPUT REC ENDREC LTR 10,10 IS THERE ANY LENGTH TO REC BNZ WRITEOK YES NO BLANK NEEDED LA 10,1(10) ADD 1 TO LENGTH IC 1,=C' ' STC 1,RECORD(10) PUT A BLANK IN THE RECORD WRITEOK AH 10,=H'4' ADD FOR UNIVAC V REC STH 10,RECLEN PUT IT IN THE LENGTH MVC RECFIL,=C' ' PUT IN V FILL CHARS PUT FILEFCB,RECLEN WRITE THE RECORD (USING MOVE MODE) SR 10,10 CLEAR THE RECORD POINTER B LOOPCHR GO PROCESS MORE CHARACTERS PROCREPT BAL 4,GETNEXT GET THE NEXT CHAR(REPT COUNT) L 5,=V(ETOA) NEED IT IN ASCII IC 8,0(5,8) CHANGE IT SH 8,=H'32' MOVE IT DOWN FROM PRINTABLE LR 7,8 HOLD THAT COUNT BAL 4,GETNEXT AND WHAT CHAR DO WE NEE EX 8,TESTCTL IS THE REPT CHAR A CTL BNE LOOPINS GOOD NO INSERT IT BAL 4,GETNEXT WHAT IS THE UNCTL CHAR STC 8,TEMPCHR PUT IN MEMORY CLI TEMPCHR,C'J' IS IT A LINEFEED BE WRITEBLK WRITE THIS AND BLANK LINES CLI TEMPCHR,C'#' IS THIS A LOUSY # SIGN BE LOOPINS WELL WE WILL KEEP IT IC 8,=X'FF' CHANGE IT TO FLAG CHAR LOOPINS STC 8,RECORD(10) PUT IT IN THE RECORD LA 10,1(10) GO UP BY 1 BCT 7,LOOPINS KEEP DOING IT FOR COUNT IN 7 B LOOPCHR GO FOR MORE WRITEBLK AH 10,=H'4' MAKE THE UNIVAC V RECORD LENGHT STH 10,RECLEN PUT IN RECORD MVC RECFIL,=C' ' AND BLANKS PUT FILEFCB,RECLEN WRITE IT BCT 7,LOOPBLK GO FOR MORE(REPT OF 1 LOOSER) B LOOPCHR LOOPBLK PUT FILEFCB,BLKREC WRITE A PREFORMATTED BLANK REC BCT 7,LOOPBLK GO BACK FOR MORE B LOOPCHR GO FOR MORE CHARS. *********************************************************** ** ROUTINE (GETNEXT) TO GET THE NEXT CHARACTER FROM INPUT** ** IF NECESSARY IT WILL ACK THE LAST PACKET AND GET NEXT** *********************************************************** GETNEXT CR 9,11 ARE THERE MORE IN BUFFER BL TAKENEXT YES GO GET THE NEXT CHAR ACKPACK MVC PKASEQ,PKSEQ MOVE THE SEQ NUMBER TO ACK LA 1,=A(PKACK,PACKET) L 15,=V(PACKETIO) GO FOR ANOTHER PACKER BALR 14,15 CLI PKTYP,C'E' BE ERRCLS SR 9,9 SET POINTER TO BEG OF PACKET IC 11,PKLEN PUT LENGTH IN 11 SH 11,=H'3' DECREMENT FOR LEN,TYP,SEQ TAKENEXT CLI PKTYP,C'D' IS THIS A DATA PACKET BNE ENDFILE YES SEND A ^B TO END FILE IC 8,PKDAT(9) GIVE HIM THE CHARACTER LA 9,1(9) INCREMENT DATA POINTER BR 4 GO BACK TO CALLER ENDFILE IC 8,=X'02' GIVE HIM A ^B BR 4 AND GO BACK *********************************************************** ** ROUTINE ON END OF FILE ** *********************************************************** PROCEND LTR 10,10 IS ANYTHING IN BUFFER BZ SKIPWRT NOTHING TO WRITE AH 10,=H'4' ADD FOR V TYPE REC STH 10,RECLEN PUT IN THE RECORD MVC RECFIL,=C' ' PUT IN BLANK FOR FILL PUT FILEFCB,RECLEN AND WRITE IT TO THE FILE SKIPWRT CLOSE FILEFCB CLOSE THE FILE CLI PKTYP,C'Z' IS THIS A REAL END OF FILE BNE RETURN DONT KNOW WHAT ELSE IT IS MVC PKASEQ,PKSEQ ACK THE END OF FILE LA 1,=A(PKACK,PACKET) L 15,=V(PACKETIO) GET THE NEXT PACKET BALR 14,15 CLI PKTYP,C'E' BE RETURN DONEXT CLI PKTYP,C'F' IS THIS A NEW FILE HEADER BE SKIPINI START ANOTHER FILE CLI PKTYP,C'B' IS THIS A BREAK IN TRANS BNE RETURN MVC PKASEQ,PKSEQ GET READY TO ACK BREAK LA 1,=A(PKACK,PACKET) L 15,=V(PACKETIO) BALR 14,15 RETURN IC 11,PKLEN GET THE LENGTH OF PACKET BCTR 11,0 DECREMENT BY 1 EX 11,MOVEBK MOVE IT BACK (REM REG 2) L 13,SAVE+4 GET ADDRESS OF OUT REGS LM 14,12,12(13) RESTORE THE REGISTERS SR 15,15 ALL IS OK BR 14 BACK WE GO TO CALLER BADOPN LA 1,=A(BADPK,PACKET) L 15,=V(PACKETIO) BALR 14,15 B RETURN ERRCLS CLOSE FILEFCB B RETURN ABORT TERMD LTORG SAVE DS 18F TEMPCHR DS CL1 MOVEBK MVC 0(1,2),PACKET TESTCTL CLI CTLCHR,X'00' TESTREPT CLI REPTCHR,X'00' TESTEND CLI ENDCHR,X'00' MOVELCL MVC PACKET(0),0(2) MOVENAME MVC FILEFCB+X'2E'(1),PKDAT CTLCHR DC C'#' REPTCHR DC C'_' ENDCHR DC X'02' BADPK DC YL1(ENDBAD-*) DC X'00' DC C'E' DC C'OPEN FAILED FOR OUTPUT FILE' ENDBAD EQU * PACKET DS 0F PKLEN DS XL1 PKSEQ DS XL1 PKTYP DS XL1 PKDAT DS CL150 PKACK DS 0F PKALEN DC X'03' PKASEQ DS XL1 PKATYP DC C'Y' BLKREC DC H'5' DC C' ' EXPRM EXLST COMMON=BADOPN,OPENER=BADOPN FILEFCB FCB FCBTYPE=SAM,LINK=KRMFL,RECFORM=V,EXIT=EXPRM RECLEN DS H RECFIL DS CL2 RECORD DS CL2000 END .