File: XONOF.PA of Tape: OS8/OS8-Latest/new-12
(Source file text)
/ASYNC XONOF COMMUNICATION V40 / / / / / / / / / /COPYRIGHT (C) 1980 BY DATAPLAN GMBH, LAUDA, BRD / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DATAPLAN GMBH. /DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR ANY ERRORS THAT MAY APPEAR /IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DATAPLAN'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DATAPLAN. / /DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY /OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DATAPLAN. / / / / / / / / / / / /W.V.D.MARK, DP CONSULTING, ZUERICH. /JAN-1980 *0 -1 DEVICE XONF;DEVICE COMM;600;COM&177+4000;ZBLOCK 2 /TWO-PAGE COMMUNICATION HANDLER FOR OS/8 V3. /ON INPUT, RECOGNIZES ^Z, ^U FROM LINE, ^C FROM KEYBOARD /^Z MEANS END OF INPUT, INSERT ^Z IN BUFFER, / PAD WITH ZEROES /^C FROM KEYBOARD:MEANS ABORT JOB / RETURN TO OS/8 VIA LOC 7600 TO SAVE CORE /^U MEANS DELETE THE LAST LINE / (LINE STARTS AT BEGIN OF BUFFER AND IS TERMINATED BY A LF) / LF IS ENTERED INTO BUFFER, BUFFER IS THEN PADDED WITH NULLS. /^S WHEN THE HANDLER RETURNS DATA TO THE PROGRAM, / I.E. WHEN IT IS UNABLE TO REACT TO CHARACTERS / COMING FROM THE LINE, IT SENDS A ^S JUST AFTER / HAVING ACCEPTED THE LAST CHARACTER. /^Q WHEN THE PROGRAM RETURNS TO THE HANDLER AFTER / HAVING TREATED THE DATA, THE HANDLER WILL FIRST / SEND A ^Q TO RESUME RECEIVING. /ON OUTPUT RECOGNIZES ^O, ^S, ^Q FROM LINE AND ^C FROM KEYBOARD /^C FROM KEYBOARD:CAUSES JOB TO ABORT / RETURN TO OS/8 VIA LOCATION 7600 TO SAVE CORE. /^O CAUSES TRANSMIT BY THE HANDLER TO CEASE, TILL / ANY OTHER CHARACTER RESUMES THE TRANSMISSION. /^S CAUSES THE HANDLER TO STOP SENDING TO LINE, / BEFORE THE CURRENT CHARACTER GOES OFF. / THIS ALLOWS THE RECEIVER TO DO OTHER THINGS. /^Q RESUMES HANDLER SENDING TO RECEIVER. / THE FIRST CHARACTER SENT IS THE ONE WHICH / WAS INHIBITED BY THE PRECEDING ^S. / ALWAYS IGNORES NULLS / HANDLES TABS CORRECTLY (INCLUDING COLUMN COUNTING) / DOES AUTOMATIC CR/LF AT END OF LINE WIDTH. COMVERSION="M&77 LINCOD=30 / THE DEVICE CODE OF THE FULL-DUPLEX INTERFACE / (V24 OR CURRENT LOOP) WHICH IS INSTALLED IN / YOUR SYSTEM FOR THIS APPLICATION. / LINCOD=30 IS FOR THE SLU2 PORT OF VT78. TLSL=LINCOD^10+6016 TSFL=LINCOD^10+6011 KRBL=LINCOD^10+6006 KSFL=LINCOD^10+6001 /CROSS PAGE LINKAGE: /THIS CODE MUST BE ABLE TO LOAD INTO ANY TWO PAGES OF CORE /THE ENTRY POINT IS AT THE NEXT LOCATION TO THE END OF THE FIRST PAGE /AT THE END OF THE FIRST PAGE WE JMS TO PLINK, /THIS LEAVES THE ADDRESS OF THE FIRST LOCATION OF THE NEXT PAGE /IN LOCATION 'PLINK' . THIS JUST HAPPENS TO BE THE ADDRESS /OF BOTH COMPCH AND COMGCH. /COMPCH AND COMGCH SHARE THE SAME ENTRY POINT. /IF IT IS CALLED WITH A 0 AC, IT IS A CALL TO COMGCH, /IF IT IS CALLED WITH A NON-ZERO AC, IT IS A CALL TO COMPCH. /COMGCH JUST GETS THE CHARACTER FROM THE LINE AND CHECKS THE /KEYBOARD FOR ^C,IF NOT, IT RETURNS THE CHAR TO PAGE 1. /COMPCH TAKES RETURN 1 IF IT WANTS THE HANDLER TO GO AWAY, /I.E IF IT SAW A ^Z. /IT NORMALLY TAKES RETURN 2 /AND TAKES RETURN 3 IF THE LINE OVERFLOWED. WIDTH=210 *200 L3700, 3700 /*200 PUNCH, 0 /MAKE SURE AC NON-ZERO JMS I PLINK /CALL COMPCH JMP COMRTN /RETURN ON OUTPUT JMP I PUNCH /DID WE REACH END OF COM LINE?:NO JMS CRLF /YES, PERFORM CR/LF JMP I PUNCH /RETURN TMP, CRLF, 0 TAD COM215 JMS I PLINK /CALL COMPCH TO PRINT CR COM70, 70 /*212 *EOF AND EOL IMPOSSIBLE COM240, TAD COM212 JMS I PLINK /CALL COMPCH TO PRINT LF CIFCDF, CIF CDF 0 /*215 *EOF AND EOL IMPOSSIBLE JMP I CRLF /RETURN COMCA, 0 COMWC, 0 BUFSIZ, 0 BUFSTRT,0 COMCDF, CDF 0 COM5, 5 M232, -232 PLINK, 0 /GETS ADDRESS OF COMPCH AND COMGCH (START OF NEXT PAGE) STL CLA RAR /4000 TAD I COM /RETRIEVE FUNCTION WORD, BUT PUT R/W BIT IN LINK COM200, AND L3700 /EXTRACT NUMBER OF DOUBLE-WORDS TO TRANSFER CMA /GET COUNT+1 COM221, DCA BUFSIZ /STORE AWAY RDF /FIND OUT THE USER'S DATA FIELD COM215, TAD CIFCDF /FORM OUR EXIT CIF CDF DCA COMXIT /STORE AWAY FOR EXIT ROUTINE TAD I COM /GET FUNCTION WORD COM212, AND COM70 /ISOLATE FIELD OF BUFFER COM223, TAD COMCDF /FORM CDF TO FIELD OF BUFFER DCA CMCDBF /STORE WHERE IT WILL BE USEFUL /AT SAME TIME, INITIALIZE COMEOF ISZ COM /POINT TO BUFFER ADDRESS TAD I COM /AND GET IT DCA BUFSTRT /AND SAVE IT ISZ COM /POINT TO BLOCK # ISZ COM /POINT TO ERROR RETURN SHIFT, /OUTPUT SHIFT REGISTER COMEOF, /0 IF SAW CR OR ^Z AND WISH TO PAD BUFFER WITH 0'S CMCDBF, HLT / : CDF BUFFER FIELD JMP COMKLG COMLP, SNL CLA /LINK=1 MEANS OUTPUT JMP COMGET /INPUT IS FROM COM: /LINK MUST BE SET FIRST TIME THROUGH HERE. /IT ACTS AS A GUARD BIT IN THE SHIFT REGISTER ROTL, RTL RTL SPA /DO WE HAVE 8 BITS SHIFTED IN? JMP TELP DCA SHIFT /SAVE SHIFT REGISTER TAD I BUFSTRT SZA /PREVENT ZERO KILLER JMS PUNCH /PRINT A CHARACTER TAD I BUFSTRT ISZ BUFSTRT /BUMP INPUT POINTER CM7400, 7400 /PROTECT ISZ AND CM7400 CLL RAL TAD SHIFT /SHIFT HIGH ORDER 4 BITS INTO JMP ROTL /SHIFT REGISTER TELP, JMS PUNCH /PRINT 3RD CHARACTER OF DOUBLE-WORD STL /*KLUDGE COMKLG, ISZ BUFSIZ /DONE? JMP COMLP /NOT YET COMX, TAD COMEOF /IF INPUT AND WE WERE PADDING WITH 0'S SZA CLA /TAKE SOFT ERROR EXIT COMRTN, ISZ COM /POINT TO NORMAL RETURN /CAN'T GET ERROR OR END-OF-FILE ON OUTPUT COMXIT, HLT /RETURN TO USER'S FIELD JMP I COM /RETURN TO USER XOFF, 0 /LITTLE ROUTINE TO SEND XOFF TAD COMEOF /IF COMEOF = 0 ALREADY DONE SNA CLA JMP I XOFF TAD COM223 JMS PUNCH JMP I XOFF COMGET, TAD COM221 /WE ARE BACK FOR RECEIVE JMS PUNCH /SO SEND XON TO TRANSMITTER TAD BUFSTRT DCA COMCA /POINT TO START OF BUFFER TAD BUFSIZ CLL RAL /CONVERT DOUBLE-WORDS TO WORDS DCA COMWC /SET SIZE OF BUFFER TSTEND, TAD COMEOF SNA CLA JMP ZERO JMS I PLINK /CALL COMGCH TO GET A CHARACTER ZERO, TAD COM200 /SET BIT 200 CONVENTION DCA I COMCA /STORE AWAY TEMPORARILY /USING USER'S BUFFER AS A TEMP LOCATION TAD I COMCA /AND AGAIN FOR CTRL Z TEST TAD M232 SNA JMS XOFF /INHIBIT RECEIVE SNA DCA COMEOF /EOF: SET ZERO FILL TAD COM5 /^Z-^U SNA /IS IT ^U? JMP COMGET /REPEAT TAD COM12 DCA TMP ISZ COMCA /NO COM12, 12 ISZ COMWC /IS BUFFER FULL? JMP COMNEN JMS XOFF /END OF BUFFER INHIBIT RECEIVE JMP COMX /GET OUT COMNEN, ISZ TMP /WAS LAST CHAR A LF? JMP TSTEND /NO JMS XOFF /INHIBIT RECEIVE DCA COMEOF /YES, SET "PAD WITH 0'S" FLAG ISZ COM /POINT TO NORMAL RETURN /LF IS NOT AN ERROR OR END-OF-FILE JMP ZERO /REJOIN PROCESSING ZBLOCK 373-. COM, COMVERSION /ENTRY POINT TO HANDLER CLA CLA CLA JMS PLINK /SET UP CROSS PAGE LINKAGE IFNZRO COM-373 <ENTERR,QQQQ> PAGE /INTERLUDE: /USA STANDARD CODE FOR INFORMATION INTERCHANGE: / XX XX0 XX1 XX2 XX3 XX4 XX5 XX6 XX7 / 000 001 010 011 100 101 110 111 / / 00 0000 NUL SOH STX ETX EOT ENQ ACK BEL / / 01 0001 BS HT LF VT FF CR SO SI / / 02 0010 DLE DC1 DC2 DC3 DC4 NAK SYN ETB / (XON) (XOFF) / / 03 0011 CAN EM SUB ESC FS GS RS US / / 04 0100 SP ! " # $ % & ' / / 05 0101 ( ) * + , - . / / / 06 0110 0 1 2 3 4 5 6 7 / / 07 0111 8 9 : ; < = > ? / / 10 1000 @ A B C D E F G / / 11 1001 H I J K L M N O / / 12 1010 P Q R S T U V W / / 13 1011 X Y Z [ \ ] ^ _ / / 14 1100 ` a b c d e f g / / 15 1101 h i j k l m n o / / 16 1110 p q r s t u v w / / 17 1111 x y z { | } ~ DEL / /MUST BE AT TOP OF PAGE COMPCH, /ENTRY POINT TO COM PRINT ROUTINE COMGCH, 0 /ENTRY POINT TO COM GET CHAR ROUTINE SNA JMP CMGCH /ZERO AC-MEANT CALL TO COMGCH AND CM177 /REDUCE TO 7 BIT TAD (-32 /TEST CTRL Z SZA /IF 0:EOF; LEAVE RETURN AT EOF ISZ COMPCH /SET TO NORMAL RETURN SNA DCA TABCTR /DISABLE OVERFLOW ON EOF TAD CM32 DCA TCHAR /THIS IS OUR CHAR JMS COMTST /GET KEYBOARD CHAR AND CLA TAD COMTLS SNA CLA JMP ECHO /NO CHAR ON LINE TAD CMC /CHAR ON LINE DCA ECHO /RESTORE ^O KLUDGE TAD COMTLS /GET INPUT CHAR TAD (-17 SNA /^O? DCA ECHO /YES, SET *KLUDGE FOR EXIT TAD CMM4 /NO (17-23=-4) M140, SZA CLA /^S? JMP ECHO /NO, IGNORE CHAR JMS COMTST TAD COMTLS TAD (-21 /ONLY ^Q ACCEPTED SZA CLA JMP .-4 ECHO, TAD TCHAR /*K* OR 0 TO RETURN ON ^O SNA JMP I COMPCH /IGNORE NULLS TAD (-17 /AT CR+2=SO+1 COM100, CLL TAD CM7 SNL CLL STA RAL /-2 WILL BECOME +2 FOR 'TNORM' CMA /CONTROL -, NORMAL +1 CLL RAL /CONTROL -2*, NORMAL +2 TAD CMJUMP /'JMP CMSET' DCA COMTLS /AND FALL INTO JUMP COMTLS, 0 TLSL CM7600, 7600 /CLEAR AC TSFL JMP .-1 ISZ TABCTR /END OF LINE? JMP I COMTLS /NO: NORMAL RETURN ISZ COMPCH /YES: EOL RETURN JMP I COMTLS TCHAR, 0 LINSIZ, -WIDTH-1 /-1 BECAUSE CR WILL INC ONCE TABCTR, -WIDTH CMGCH, DCA TABCTR /NO LINE CONTROL ON INPUT JMS COMTST /GET CHAR AND CLA TAD COMTLS SNA JMP CMGCH /NULL IS NONE JMP I COMGCH /TAKE ONLY RETURN COMTST, 0 KSFL /ONLY READ IF FLAG SKP CLA KRBL /FLAG IS UP AND CM177 DCA COMTLS /KEEP INPUT KSF JMP I COMTST TAD CM7600 KRS TAD (-7603 SZA CLA JMP I COMTST /NO CIF CDF 0 /BRANCH TO OS/8 MONITOR AT 07600 JMP I CM7600 CM177, 177 /'SO' ENTRY POINT CM11, 11 /FALL THRU TO 'CR' CR, TAD LINSIZ /CR AND SO RESET COLUMN COUNTER CMJUMP, JMP CMSET FF, SKP NOP CM7, 7 /'VT' ENTRY POINT CM32, 32 /VT FALL ON LF LF, STA /LF NO MOVE OF 'TABCTR' JMP BS+1 TAB, JMP COMTAB CMM4, -4 BS, CLL STA RAL /-2 TAD TABCTR CMSET, DCA TABCTR JMP PRIN TNORM, TAD TCHAR /NORMAL ENTRY: GET BACK CHAR AND COM140 /HIGH ORDER BITS IRRELEVANT SNA CLA IFNDEF TEST < JMP LF> IFDEF TEST < JMP CMUPA> /XMIT ^X CMC, PRIN, TAD TCHAR JMS COMTLS JMP I COMPCH COMTAB, TAD CM7 COM140, CMA CLL /MAKES 7770 MASK AND TABCTR /GO BACK TO THIS TAB STOP TAD CM7 /ADD 7 AND... DCA TABCTR JMP PRIN /1 FROM TAB TO NEXT TAB STOP JMP I COMPCH /YES, GET OUT IFDEF TEST < CMUPA, TAD COMUPA JMS COMTLS TAD COM100 JMP PRIN COMUPA, "^> $$$