/25 COMMUNICATIONS HANDLER FOR THE VAX -JVZ- / THIS HANDLER ALLOWS A PDP8/12 TO COMMUNICATE WITH THE /VAX TERMINAL HANDLER, USING THE XON/XOFF PROTOCOL (TT- /SYNC AND HOSTSYNC) TO CONTROL TRANSMISSION. LINEFEEDS /ARE SUPPRESSED DURING OUTPUT TO AVOID 'DOUBLE-SPACING' /SINCE THE VAX DOES NOT HANDLE CR/LF PROPERLY! UP TO 8 /CHARACTERS ARE SAVED BETWEEN CALLS, SO PROGRAMS WHICH /SWAP HANDLERS (I.E. FORTRAN IV), COULD LOSE CHARACTERS /ONCE IN A WHILE DURING INPUT. CTRL/Z -IS SENT- DURING /OUTPUT (WHICH CLOSES THE VAX FILE), & INPUT IS STARTED /BY SENDING A 'NULL' TO TERMINATE THE DCL COMMAND LINE. /THE 'END-OF-FILE' IS DETERMINED BY A TIME-OUT LOOP, SO /TO AVOID GETTING THE COMMAND PROMPT IN THE FILE, IT IS /CONVENIENT TO HAVE A 'WAIT' COMMAND FOLLOWING THE COPY /WHICH WILL CAUSE THE HANDLER TO TIME-OUT AFTER RECEIPT /OF JUST THE DATA FILE. THIS SET OF COMMANDS CAN THEN /BE EQUATED TO THE SYMBOL 'SEND8' FOR CONVENIENT USAGE: / $ COPY 'P1 TT: / $ WAIT 0::2 /REMEMBER NOT TO TERMINATE THE 'SEND8' COMMAND (I.E. DO /NOT TYPE 'RETURN'!). THE HANDLER WILL SEND THE TERMI- /NATOR WHEN IT IS READY FOR THE DATA. VERSION="B&77 IFNDEF INDVC /STANDARD SLU DEVICE CODE IFNDEF OUTDVC KKSF= INDVC^10+IOT 1 /SKIP ON INPUT FLAG KKCC= INDVC^10+IOT 2 /CLEAR I.F. AND A.C. KKRS= INDVC^10+IOT 4 /'OR' INPUT DATA WITH A.C. KKRB= KKCC KKRS /COMBINATION OF '2' AND '4' TTSF= OUTDVC^10+IOT 1 /SKIP ON DONE FLAG TTCF= OUTDVC^10+IOT 2 /CLEAR D.F. TTLS= OUTDVC^10+IOT 6 /XMIT CHAR, LEAVE IN THE A.C. PAGE 0 -1 /ONE ENTRY POINT DEVICE VAX DEVICE VAX 410 /DCB WORD (R/W/NONFILE, DEV 41) VAX&177+4000 /ENTRY POINT (PLUS 2-PAGE FLAG) ZBLOCK 2 PAGE 1 VAX, VERSION /START AT THE VERY TOP CLA STL RTL /2=CDI-CDF RDF TAD CDF0 DCA CDIX /SAVE RETURN 'CDI' STL RAR /4000 TAD I VAX /PUT R/W BIT IN THE LINK XON, AND V70 /GET BUFFER FIELD TAD CDF0 DCA TEMP /PUT INLINE FOR ONCE-ONLY USE TAD V3700 AND I VAX /STRIP PAGE COUNT ISZ VAX /BUMP TO BUFFER ADDRESS SNA JMP VXIT /IGNORE INITIALIZATION CALLS CIA DCA DWC /SAVE DOUBLE-WORD COUNT / WE FALL THROUGH THE CONSTANTS BELOW WITH AC=0 IFNZRO .&177-21 <'XON' & 'XOFF' WILL BE WRONG> V70, 70 XSW, -7623 /OR -7621 V177, 177 TAD I VAX /GET BUFFER ADDRESS DCA BAD TEMP, HLT /CDF TO B.F. SNL /READ OR WRITE? JMP READ WRIT, RTL /SHIFT GUARD BIT RTL SPA /TEST IT JMP WNO3 /TIME FOR THE THIRD BYTE DCA TEMP TAD I BAD /GET FIRST OR SECOND BYTE JMS PUTC TAD I BAD /EXTRACT PART OF THIRD ISZ BAD V7400, 7400 /NOP AND .-1 CLL RAL /PACK THE BITS TOGETHER TAD TEMP JMP WRIT /SHIFT INTO PROPER POSITION WNO3, JMS PUTC /AC HAS SHIFT REGISTER ISZ DWC /DONE? JMP WRIT /NO JMP VXIT /YES INP, 0 /HOLDS ADDRESS OF INPUT ROUTINE JMS I INP /GET BYTE NO. 1 DCA I BAD JMS I INP /GET BYTE NO. 2 DCA PUTC JMS I INP /GET BYTE NO. 3 JMS SAVE /STORE FIRST WORD TAD PUTC DCA I BAD TAD TEMP JMS SAVE /STORE SECOND WORD ISZ DWC JMP INP+1 /DO THREE MORE TAD XOFF JMS PUTC JMS I INP /TEST IF WE SHOULD SEND XOFF VXIT, ISZ VAX /MOVE PAST BUFFER ADDRESS ISZ VAX / " " BLOCK NUMBER ISZ VAX / " " ERROR RETURN / TTCF /BE NICE TO 'ION' PROGRAMS CDIX, HLT /CDF CIF C.F. JMP I VAX IFNZRO .&177-100 <'V3700' WON'T BE CORRECT> BAD, 0 /BUFFER ADDRESS DWC, 0 /BUFFER SIZE (%2) SAVE, 0 /STORE 1-1/2 BYTES IN 1 WORD RTL RTL /SHIFT HALF-BYTE TO BITS 0-3 DCA TEMP TAD TEMP AND V7400 TAD I BAD /MERGE WITH BITS 4-11 V3700, DCA I BAD ISZ BAD M7603, -7603 /CTRL/C TEST PROTECTS 'ISZ' CLL JMP I SAVE PUTC, 0 /OUTPUT ROUTINE DCA SAVE /SAVE CHARACTER TAD SAVE XOFF, AND V177 SZA TAD MLF /CHECK FOR LF, NULLS SNA CLA JMP PXIT /DON'T SEND EITHER ONE TAD SAVE /SEND IT AWAY TTLS AND V177 TAD M32 /CTRL/Z? SNA CLA JMP VXIT /LOGICAL END OF BUFFER EXON, TAD V7600 /WATCH FOR ^C, ^X, ^Q KRS /'OR' TAD M7603 SNA CLA /CTRL/C? KSF /YES: FLAG UP? JMP V7600 /NO CDF0, CDF /BE SURE TO DO THIS! JMP I V7600 /RECALL OS/8 K.B.M. V7600, 7600 TAD V7600 /SAME IDEA KKRS TAD XSW /EITHER '-XOFF' OR '-XON' SNA CLA KKSF JMP PCHK TAD XSW /TOGGLE BETWEEN THE TWO CLL RTR CML RTL /SORT OF CLEVER WAY TO DO IT DCA XSW PCHK, STL RTL /2 AND XSW /CHECK FOR 'XOFF' CONDITION SNA CLA TTSF JMP EXON /VAX IS BUSY AT THE MOMENT PXIT, STL /SET GUARD BIT JMP I PUTC MLF, -12 M32, -32 *VAX!174 /PUT THIS AT THE VERY END READ, TAD XON JMS PUTC /START THE VAX TALKING TO US STL RAR /4000 JMS INP /PUTS ADDRESS OF PAGE 2 IN INP PAGE /THIS PAGE HAS THE INPUT ROUTINE WHICH HAS TO RECOGNIZE /WHEN THE VAX HAS FINISHED SENDING DATA SO IT CAN PUT A /CTRL/Z IN THE BUFFER, FILL IT OUT WITH NULLS, AND TAKE /THE ERROR RETURN WITHOUT SENDING 'XOFF'. THIS ROUTINE /ALSO TURNS MULTIPLE LF'S INTO MULTIPLE CRLF'S AND BUF- /FERS ANY EXTRA CHARACTERS WHICH ARE RECEIVED AFTER THE /VAX HAS BEEN SENT AN 'XOFF'. /THERE IS ONE PROBLEM: THE VAX TURNS FORMFEEDS INTO THE /PROPER NUMBER OF LINEFEEDS (BASED ON THE PAGE SIZE) SO /WE DO NOT GET BACK EXACTLY WHAT WE SENT. (BEST TO USE /A PAGE SIZE OF 0.) NOTE: THIS HAS BEEN FIXED IN V2.0! /JUST SET THE 'MECHFORM' OPTION FOR YOUR TERMINAL. GETC, (177 /GETS US V377 SZA JMP NO1 /FIRST CALL SZL JMP EOB /END OF BUFFER TAD CHAR SPA CLA /READ FROM SILO? ISZ .+1 HOLD, HLT /'TAD SILO' SNA BOB, JMS FETCH AND V377 /ONLY KEEP 8 BITS CLL JMP I GETC /RETURN CHARACTER NO1, DCA CHAR /4000 TAD EOB DCA HOLD /INITIALIZE SILO TAD FETCH /FIRST CALL AFTER EOF? SZA CLA JMP HOLD-1 /RETURN SAVED CHARACTERS DCA HOLD TTLS /TERMINATE VAX COMMAND GET2, JMS CTRLC /SKIP THE COMMAND LINE JMP .-1 KKRB V377, AND (177 /FOUND THE LF YET? TAD (-12 SZA CLA JMP GET2 JMS CTRLC /WAIT FOR FIRST CHARACTER JMP .-1 JMP BOB /IT TAKES A WHILE SOMETIMES... EOB, TAD CHAR /REACHED EOF YET? SNA CLA JMP DONE /YES TAD NO1 DCA INST /GET SILO POINTER BLOOP, JMS FETCH /GET THE NEXT CHARACTER DCA HOLD TAD HOLD /REACHED THE END YET? SZA ISZ .+1 INST, HLT /'DCA SILO' TAD HOLD SZA CLA /DONE? JMP BLOOP JMP I GETC /NO DONE, DCA FETCH /SET EOF FLAG TAD (21 /YES TTLS /SEND 'XON' ISZ GETC /TAKE THE ERROR EXIT JMP I GETC CTRLC, 0 KKSF SKP CLA ISZ CTRLC TAD (7600 KRS /CHECK KEYBOARD TAD (-7603 SNA CLA KSF JMP I CTRLC CDF JMP I (7600 IFNZRO .&177-100 DELAY, -1 /ADJUST THIS IF NECESSARY FETCH, 0 TAD CHAR /CHECK FOR EOF ISZ FLAG /TURN CRLF,LF INTO CRLF,CRLF SNA CLA JMP I FETCH DCA TIMOUT /INITIALIZE TIMEOUT LOOP TAD DELAY DCA TIMER WAIT, JMS CTRLC JMP LOOP KKRB /GET CHARACTER DCA CHAR TAD CHAR AND (177 /KEEP NULLS OUT OF BUFR SNA JMP WAIT-3 TAD (-12 /WATCH THOSE LINEFEEDS! SZA CLA JMP LOOP-2 STL CMA TAD FLAG /WAS LAST CHAR A LF TOO? SNA CLA STL CMA DCA FLAG /YES, REPLACE WITH CR/LF SZL TAD (3 /CR-LF TAD CHAR JMP I FETCH LOOP, ISZ TIMER /ROUGHLY 100 MSEC JMP WAIT ISZ TIMOUT JMP WAIT-2 DCA CHAR /SET EOF FLAG TAD (32 JMP I FETCH /RETURN CTRL/Z TIMER, 0 TIMOUT, 0 FLAG, 0 /MULTIPLE-LF FLAG CHAR, 0 /JUST BEFORE SILO SILO, ZBLOCK 20 /SHOULD BE ENOUGH $END$