File: TU58NS.PA of Tape: OS8/OS8-Latest/new-13
(Source file text)
/TU58NS NON-SYSTEM HANDLER - ASYNC LINK / / / / / / / / /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. / / / / / / / / / / /WVDM - DP - ZUERICH - 1-JAN-80 /DEFINITIONS OF ASYNC IOT'S TUVER= "M&77 DEVR= 360 /DEVICECODE OF RECEIVE CHANNEL DEVT= 370 /DEVICECODE OF TRANSMIT CHANNEL KCFX= 6000+DEVR /CLEAR RECEIVE FLAG KSFX= 6001+DEVR /SKIP ON RECEIVE FLAG KCCX= 6002+DEVR /CLEAR RECEIVE FLAG, CLEAR AC KRSX= 6004+DEVR /OR IN RECEIVE CHAR KIEX= 6005+DEVR /SET/CLEAR INTENA KRBX= 6006+DEVR /JAM IN RECEIVE CHAR, CLEAR FLAG TSFX= 6001+DEVT /SKIP ON TRANSMIT FLAG TCFX= 6002+DEVT /CLEAR TRANSMIT FLAG TLSX= 6006+DEVT /CLEAR FLAG, SEND CHAR /NOTES ON THIS HANDLER: /THIS HANDLER READS AND WRITES THE TAPE IN "12-BIT" MODE, IN WHICH /ONLY 6 BITS OF EVERY 8-BIT BYTE ARE USED. A TU58 DECTAPE II /CONTAINS 512 OS/8 BLOCKS UNDER THIS METHOD AC0002=CLL CLA CML RTL /SET AC TO 0002 AC0004=CLL CLA IAC RTL /SET AC TO 0004 AC4000=CLL CLA CML RAR /SET AC TO 4000 AC7776=CLL CLA CMA RAL /SET AC TO 7776 AC7775=CLL CLA CMA RTL /SET AC TO 7775 / /BUILD DATA *0 / -2 /TWO ENTRY POINTS DEVICE TU58 /DEVICE GROUP NAME DEVICE TUA0 /ENTRY POINT NAME 4370 /CODE FOR TU58 TYPE TUA0&177+4000 /ENTRY POINT OFFSET 0 0 DEVICE TU58 /DEVICE GROUP NAME DEVICE TUA1 /ENTRY POINT NAME 4370 /CODE FOR TU58 TYPE TUA1&177+4000 /ENTRY POINT OFFSET 0 0 *200 / / INIT CODE / INIGO, HLT /ADDR OF SECOND PAGE AT INIT TIME LCDI0, CIF CDF 0 /SET DF TO ZERO FOR INDIRECTS CNT1, JMS I INIGO /GO TO SECOND PAGE TO INIT / / LIST OF VECTORS TO SECOND PAGE / LCOMAN, COMAND-. LCHKS, CHKSEN-. LPACK, PACKG-. LACK, ACK-. LSEND, SEND-. LWRITE, WRITE2-. LGETC, TUGET-. LCC, CHKCHK-. VCOUNT=LCOMAN-. /FALLS THRU TO NEXT, HERE IS VECTOR COUNT / BUFF1, JMP INIEND /THIS IS POINTED AT BY LLBUF / WRITE, TAD BUFCDF /BUFFER FIELD IN AC JMS I LWRITE /ON END WILL RETURN TO 'ENDPACK' SNA CLA /IS IT END OR DATA? JMP ENDPCK /COULD ALSO BE DATA !NO ROOM! ERROR, ISZ RETRY /3 TRIES FOR ASYNC LINE JMP BREAK /INITIALIZE TU58 FATAL, AC4000 /SET ERROR STATUS JMP EXIT /BAD, ERROR RETURN / COMAND, 2 /READ/WRITE PACKET SKELETON 12 /BYTE COUNT FN, 2 /READ/WRITE : 2/3 0 /MODIFIER UNIT, 0 /OR 1 0 BRKCNT, 0 /RETURNS TO 0 0 0 /LOW ORDER BYTE COUNT PAGES, 0 /REALLY HIGH-ORDER BYTE COUNT BLKL, 0 /LOW ORDER BLOCK NUMBER BLKH, 0 /HIGH ORDER BLOCK NUMBER LCDF0, CDF 0 /CDF FOR NEGATIVE ENDPACKET / RBEGIN, JMS I LGETC /GET BYTE COUNT CIA DCA CNT1 /STORE AS COUNTER RLOOP, JMS I LGETC /GET EVEN BYTE MQL /IN LOW ORDER JMS I LGETC /GET ODD BYTE BSW /IN HIGH ORDER MQA /MERGE BUFCDF, HLT /TO BUFFER FIELD DCA I BUFF1 /STORE 12-BIT ISZ BUFF1 /NEXT LOC L70, 70 /SKIP PROTECTION ISZ CNT1 /2 BYTES PER WORD ISZ CNT1 /MORE FROM THIS PACKET? JMP RLOOP /YES JMS I LCC /VERIFY CHECKSUM, IF ERROR TO ERROR JMP ERROR /GOTJA READ, JMS I LACK /GET FLAG: DATA OR END SZA CLA /WAS IT END OR DATA? JMP ERROR /WAS CONTINUE OR RUBBISH SNL /WAS IT DATA? JMP RBEGIN /YES, START READING ENDPCK, JMS I LGETC /IGNORE BYTE COUNT JMS I LGETC /IGNORE ENDPACKET ID JMS I LGETC /GET ERROR STATUS CLL RAR /DON'T LOOK AT RETRIES SZA CLA /ERROR? JMP ERROR /TRY SOME MORE? ISZ TUA0 /OK, NO ERROR EXIT, HLT JMP I TUA0 /RETURN TO USER / IFZERO .&177-101&4000 <_ERROR_> / / ENTRY POINTS ARE AT 100, 104 / *.&7600+100 / TUA0, TUVER CLA CLL JMP TUCOM /JUMP TO COMMON START L3700, 3700 / BUF, TUA1, TUVER CLA CLL CML /SET LINK=1 TAD TUA1 /GET ARG POINTER UNIT 1 DCA TUA0 /MAKE TUA0 COMMON POINTER TUCOM, RAL /GET UNIT FROM LINK. ALSO CONSTANT X004 DCA UNIT /SET UNIT TO 0 OR 1 RDF /GET CALLER'S FIELD TAD LCDI0 /BUILD CIF CDF DCA EXIT /STORE FOR RETURN AC4000 /SET LINK=0, AC=4000 TAD I TUA0 /CARRY READ-WRITE BIT TO LINK AND L70 /KEEP FIELD FOR BUFFER TAD LCDF0 /MAKE CDF TO BUFFER FIELD DCA BUFCDF /PLACE INTO I/O LOOP IAC RAL /MAKE FUNCTION CODE, 3=WRITE, 2=READ DCA FN /IN MESSAGE TAD I TUA0 /MAKE LOOP CONTROL COUNT AND L3700 SNA AC4000 /40 PAGES FOR WHOLE FIELD BSW DCA PAGES /NUMBER OF PAGES IN MESSAGE ISZ TUA0 /NEXT TAD I TUA0 /IS BUFFER ADDRESS DCA BUF ISZ TUA0 /NEXT TAD I TUA0 /GET BLOCK NUMBER ISZ TUA0 /MOVE POINTER TO ERROR EXIT SPA /IF NEGATIVE ERROR JMP FATAL /SOMEBODY IS HAVING FUN DCA BLKL /SAVE BLOCK# (ALSO LOW-ORDER WHEN MASKED) TAD BLKL /PICK OUT HIGH-ORDER CLL RTR /SHIFT TO 6-BIT BOUNDARY AND L3700 /TAKE WHAT'S LEFT BSW /AND POSITION RIGHT JUSTIFIED DCA BLKH /SAVE HIGH ORDER BLOCK INIEND, JMP INIT /GETS WIPED OUT AC7775 /STORE -3 DCA RETRY /FOR ERROR RETRIES BREAK, TLSX /NOW GENERATE A BREAK ISZ BRKCNT /24MS... GOOD FOR ALL BAUD RATES JMP .-2 /4096*6MMS ON A PDP8-A AC0004 /SEND INIT=4 TWO TIMES JMS I LSEND AC0004 /AGAIN JMS I LSEND /'ACK' RESETS DATA-FIELD JMS I LACK /WAIT FOR ^P CONTINUE RESPONSE JMP BREAK /SOMETHING WRONG, TRY AGAIN TAD LCOMAN /NOW SEND COMMAND PACKET JMS I LPACK /PACKG SETS CHECKSUM TO 0 JMS I LCHKS /SEND CHECKSUM OF PACKET TAD BUF /'BUF' IS UNCHANGED DCA BUFF1 /RESET BUFFER POINTER TAD FN /IS IT READ OR WRITE? RAR /WRITE IS 3: SETS LINK SNL CLA JMP READ /NO, IS READ JMP WRITE /YES, WRITE / *.&7600+176 /FORCE TO END OF PAGE / INIT, DCA INIEND /KILL 'JMP INIT' RETRY, JMS INIGO /LEAVE ADDR OF SECOND PAGE / / / VARIABLES, ALSO INIT CODE LIVES HERE / / LLBUF, 0 /THIS CONTAINS ADDRESS OF 'BUFF1' CHECKH, 0 /HIGH ORDER CHECKSUM CHECKL, 0 /LOW ORDER CHECKSUM FLIPPY, 0 /HIGH-LOW FLIPFLOP BUFF2, 0 /PAGE 2 BUFFER POINTER CNT2, 0 /PAGE 2 BYTE COUNTER TEMP, 0 /STRING POINTER CHAR, 0 /IN OR OUT CHAR / IFNZRO .&177-10&4000 <_ERROR> /ENOUGH ROOM FOR INIT? / *.&7600 / / INIT TIME: FILL VECTOR TABLE / THERE, 0 /FILLED BY JMS, POINTS TO VECTOR ILOOP, TAD THERE /POINTER IS ALSO OFFSET! TAD I THERE /MAKING VECTOR DCA I THERE ISZ THERE /MOVE TO NEXT VECTOR ISZ TUGET /CONTROL COUNT ON THIS PAGE JMP ILOOP JMP I THERE /BACK TO FIRST PAGE / XYZ=(77 /FOR L377 / / CHECK FOR CONTROL C, WAIT FOR CHAR FROM TU58 / TUGET, VCOUNT /INIT COUNTER LLCDF0, CDF 0 /DATA FIELD HERE IN CASE CONTROL C TO MONITOR KCCX /CLEAR AC AND KILL OLD CHARS TSTTU, KSFX /IS TU58 TALKING? JMP TSTTT /NOPE, GO CHECK TTY KRBX /YES, GET CHARACTER JMS CHECKS /CHECKSUM IT TAD CHAR /GET CHAR BACK (MASKED) JMP I TUGET /OR RUBBISH TSTTT, TAD L7600 /FORCE TOP BITS TO BE 1 TO ELIMINATE 3,203 KRS /AMBIGUITY ON TEST TAD L175 /IS IT A CONTROL C SNA CLA /SKIP IF NOT / KSF /SKIP IF A TTY CHARACTER HAS HAPPENED JMP I L7600 /EXIT TO MONITOR !SORRY NO FLAG CHECK! JMP TSTTU /NO, GO CHECK FOR TU58 CHAR / JMP I L7600 /EXIT TO MONITOR / SEND, 0 /SEND A CHAR TO TU58 TSFX JMP .-1 /FLAG WAS SET BY BREAK TLSX JMS CHECKS JMP I SEND CHECKS, 0 AND L377 DCA CHAR /SAVE CHAR FOR 'TUGET' TAD CHAR CLL /CLEAR LINK FOR OVERFLOW ISZ FLIPPY /HIGH OR LOW-ORDER? JMP CLOW /LOW ORDER FIRST (FLIPPY STARTS 0) CHI, TAD L7400 /TRANSPORT OVERFLOW TO LINK TAD CHECKH /ACCUMULATE HIORD CHECKSUM AND L377 /KEEP ONLY 8 BITS DCA CHECKH /UPDATE IT AND ROTATE LINK INTO RAL /AC, IF ZERO 'CLOW' IS NOP CLOW, TAD L7400 /IF LINK WAS NON-ZERO, THEN TAD CHECKL /MAKE END-AROUND CARRY AND L377 /AGAIN KEEP ONLY 8-BITS DCA CHECKL /AND ACCUMULATE LOWORD CHECKSUM RAL /ROTATE OVERFLOW INTO AC SZA /DID THIS OVERFLOW? JMP CHI /YES, MAKE BYTE TO BYTE CARRY CEX, TAD FLIPPY /LOW: 1 TO -1 CIA /HI : 0 TO 0 DCA FLIPPY /FLIPFLIPPY JMP I CHECKS / / ACK, 0 /CHECK IF CONTINUE, DATA OR END DCA CHECKL DCA CHECKH DCA FLIPPY /IN CASE OF CHECKSUM ACCUMULATION JMS TUGET TAD (-20 /IS IT 'CONTINUE'? SNA JMP ACKEX /YES TAD (20-1 /CODE - 1 CLL RAR /DATA: AC=0,L=0 END: AC=0,L=1 SKP /ALL OTHER CODES AC NE 0 ACKEX, ISZ ACK /SECOND RETURN IS CONTINUE JMP I ACK / CHKCHK, 0 /CHECK RECEIVE CHECKSUM TAD CHECKH DCA TEMP /SAVE A WHILE (GETS DESTROYED) JMS TUGET /GET LOW-ORDER CHECKSUM JMS TUGET /GET HI-ORDER CHECKSUM CIA /SORRY! ONLY CHECKING HIGH-ORDER! TAD TEMP /COMPARE TO ACCUMULATED SNA CLA /OK? ISZ CHKCHK /YES, SECOND RETURN JMP I CHKCHK / CHKSEN, 0 /SEND SEND-CHECKSUM TAD CHECKH DCA TEMP /SAVE FOR SAME REASON TAD CHECKL JMS SEND /SEND LO-ORDER TAD TEMP JMS SEND /SEND HI-ORDER JMP I CHKSEN / PACKG, 0 DCA TEMP /STORE STRING ADDRESS DCA CHECKL /INITIALIZE CHECKSUM DCA CHECKH DCA FLIPPY /SET TO LOW ORDER PCKLP, TAD I TEMP SPA /- IS END OF STRING JMP L7600 JMS SEND ISZ TEMP JMP PCKLP L7600, 7600 JMP I PACKG / / WRITE2, 0 DCA BCDF2 /STORE CDF BUFFER DATA, 1 /DATA PACKET TAD I LLBUF /GET BUFFER POINTER AND 200 BYTE COUNT L7400, 7400 /END PACKET AND NOP DCA BUFF2 /STORE HERE WACK, JMS ACK /WAIT FOR 'CONTINUE', RESET CDF 0 JMP I WRITE2 /SOMETHING ELSE, END PACKET? TAD LLBUF /CONTENT: BUFF1, TAD (DATA-BUFF1 /RELOCATES 'DATA' JMS PACKG /SEND 'DATA' PACKET, CLEAR CSUM TAD L7600 /-200 FOR DCA CNT2 /BYTE COUNT SET BCDF2, HLT /BUFFER FIELD TAD I BUFF2 /GET WORD L377, AND (77 /ONLY 6-BIT BYTE JMS SEND /LOW ORDER FIRST TAD I BUFF2 BSW AND (77 /THEN HIGH ORDER JMS SEND ISZ BUFF2 /NEXT LOC L175, 175 /PROTECTION ISZ CNT2 ISZ CNT2 /PACKET DONE? JMP BCDF2 /NOT YET JMS CHKSEN /SEND CHECKSUM JMP WACK /MORE TO DO? / PAGE $-$-$