/SERIAL.PA GENERALIZED SERIAL HANDLER FOR VT278 SUPPORTED DEVICES /COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATION /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION 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 DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. VERSION="A&77^100+60 /DEFINE DEVICES FOR ASSEMBLY HERE: /CAN HAVE ONLY ONE DEVICE FROM EACH "LINE" GROUP. DEVLINE=3 /FOR ANY KL8E DEVICE, SLU0, TTY, VDT, 278 CONSOLE. / DEVLINE=30 /FOR VLU2, SLU2 / VLU2=YES / SLU2=YES / DEVLINE=32 /FOR SERIAL LPT, VLU3, SLU3, DP278 COM0. / LPT=YES / VLU3=YES / SLU3=YES / COM0=YES / DEVLINE=34 /FOR DP278 COM1 YES=1 NO=0 NONFILESTRUCTURED=0 FILESTRUCTURED=4000 READONLY=2000 WRITEONLY=1000 NONSYSTEM=0 TWOPAGE=4000 AC0004=CLA CLL IAC RTL AC100=CLA IAC BSW AC4000=CLA STL RAR ACM2=CLL CLA CMA RAL BSW=7002 XON="Q&277 XOFF="S&277 CDFXXX=HLT CDFIFX=HLT RECEIVE=DEVLINE TRANSMIT=RECEIVE+1 XMTSKP=TRANSMIT^10+6001 XMTLOD=TRANSMIT^10+6006 RECSKP=RECEIVE^10+6001 RECLOD=RECEIVE^10+6006 HANDLERS=1 /THESE DEFINITIONS MAY CHANGE! CONSOLE=NO DEVCODE=00 /OS8 UNIQUE DEVICE CODE 0-77. DEVTYPE=NONSYSTEM+NONFILESTRUCTURED *0 -HANDLERS /BEGIN DEVICE CONTROL BLOCK FOR BUILD. IFZERO DEVLINE-3 < CONSOLE=YES DEVICE TTYSERIAL DEVICE TTY > IFZERO DEVLINE-30 < IFDEF VLU2 < DEVICE VLU2 DEVICE VLU2 > IFDEF SLU2 < DEVICE SLU2 DEVICE SLU2 >> IFZERO DEVLINE-32 < IFDEF LPT < DEVICE LPTSERIAL DEVICE LPT DEVTYPE=WRITEONLY DEVCODE=04 > IFDEF VLU3 < DEVICE VLU3 DEVICE VLU3 > IFDEF SLU3 < DEVICE SLU3 DEVICE SLU3 > IFDEF COM0 < DEVICE COM0 DEVICE COM0 >> IFZERO DEVLINE-34 < DEVICE COM1 DEVICE COM1 > DEVTYPE+DEVCODE ENTRY&177+TWOPAGE NONSYSTEM NONSYSTEM *200 RENTRY, ZEROSW, /WHEN CLEAR, BUFFER IS BEING ZEROED PRIOR TO EXIT. BUFRFD,CDFXXX ISZ RXSWITCH /IF -1, FUNCTION IS XMIT JMP RECV0 /INPUT /TRANSMIT ROUTINES. THERE ARE NO "ERROR CONDITIONS" FOR OUTPUT. ALL TERMINATION /WILL RETURN TO CALLER AT +5 (NORMAL EXIT) WITH THE C(AC)=0. POSSIBLE RETURN /CONDITIONS ARE: 1) BUFFER IS EMPTY; 2) ^Z WAS FOUND IN BUFFER. A ^C WILL /RETURN TO MONITOR AT 7600. XON/XOFF IS RECOGNIZED FOR THE OUTPUT DEVICE. XMIT1, ISZ WRDCNT JMP XMIT1A EXIT5, TAD ZEROSW SZA CLA ISZ ENTRY XITFLD,CDFIFX JMP I ENTRY XMIT1A,STL RTL RTL SPA JMP XMIT1B /FOR CHAR3 DCA CHAR3 TAD I BUFRPT JMS I IXMIT TAD I BUFRPT ISZ BUFRPT 7400 /SERVES AS A NOP TO PROTECT ISZ AND .-1 CLL RAL TAD CHAR3 JMP XMIT1A+1 XMIT1B,JMS I IXMIT JMP XMIT1 /FOR ANOTHER PASS BACKSPACE, UMINCR,25-15 CDFCIF,CDF CIF 0 K3700, 3700 IXMIT, XMIT2-PAGE2 IDOCRLF,DOCRLF-PAGE2 IDEVINPUT,DEVINPUT-PAGE2 /INPUT ROUTINES. ACCEPTS INPUT FROM THE DEVICE AND RETURNS 8-BIT ASCII /TO THE CALLING PROGRAM BUFFER. INPUT CHARACTERS ARE SCREENED FOR A /^Z, CR(LF), ^U AND RUBOUTS. ^Z IS THE ONLY CHARACTER THAT WILL CAUSE /AN "ERROR" EXIT. THERE ARE NO FATAL ERRORS. ^Z AND CR WILL ECHO CRLF, PAD /THE CALLING PROGRAM BUFFER WITH ZERO BEFORE EXITING. ^U WILL NOT BACK /UP PAST THE START OF BUFFER. IF ^U IS FOUND, THE BUFFER POINTER IS RESET /TO THE BEGINNING OF THE BUFFER, AND A CRLF ECHOED. SINCE ECHOING OF OUTPUT /CHARACTERS PASSES THROUGH THE OUTPUT PRINTING ROUTINES, ALL PRINTING CHARAC- /TERS ARE COUNTED. WHEN THE INPUT LINE LENGTH IS EXCEEDED, A CRLF WILL BE /ECHOED, BUT NOT INSERTED IN THE BUFFER. RECV0, TAD WRDCNT CLL IAC RAL /INPUT RETURNS 1 8BIT PER 1 12BIT WORD TO CALLER. DCA WRDCNT RECV1, TAD ZEROSW /WHEN ZERO, WE ARE PADDING USER BUFFER PRIOR TO EXIT. SZA CLA JMS I IDEVINPUT /GET A CHARACTER FROM INPUT. RECV1A,DCA I BUFRPT /RETURNS 8BIT ASCII. TAD I BUFRPT /USE THE CALLING BUFFER FOR TEMP STORAGE. TAD CHM377 /MINUS RUBOUT SNA JMP RECV2 /FOUND A RUBOUT. TAD ROMINZ /RUBOUT-^Z (177-32) SNA JMP RECV4 /CONTROL Z TAD ZMINU /^Z-^U (32-25) SNA JMP RECV5 /CONTROL U. JMP INSTRUCTION IS ALSO THE "U" TO PRINT! TAD UMINCR /^U-CR (25-15) SNA CLA JMP RECV6 /CARRIAGE RETURN RECV9, TAD I BUFRPT JMS I IXMIT /ECHO CHARACTER ISZ BUFRPT ZMINU, 32-25 ISZ WRDCNT RECV12,JMP RECV1 /FOR THE NEXT JMP EXIT5 RECV4, DCA ZEROSW /CONTROL Z WILL EXIT AT CALL +4 TAD CH336 JMS I IXMIT AC100 JMP RECV9 CH325, RECV5, TAD CH336 /CONTROL U JMS I IXMIT TAD CH325 /MAKES A PRINTABLE "U" JMS I IXMIT RECV5A,JMS I IDOCRLF TAD BUFRAD RECV5B,DCA BUFRPT /RESET POINTER TO START OF BUFFER JMP RECV1 /FOR A NEW LINE. RECV6, ISZ ENTRY /SINCE A "CLEAR" ZEROSWITCH WON'T BUMP IT FOR EXIT. DCA ZEROSW TAD I BUFRPT JMS I IXMIT /FOR THE CR. ISZ BUFRPT 212 /(LINEFEED; USED TO PROTECT ISZ) TAD .-1 ISZ WRDCNT JMP RECV1A /OTHERWISE, INSERT THE LINE FEED, AND PROCEED NORMALLY. JMP EXIT5 /IF COUNT OVERFLOWS, WILL STILL EXIT AT +5 WITH C(AC)=0. RECV2, TAD BACKSPACE JMS I IXMIT CH336, TAD SPACE JMS I IXMIT TAD BACKSPACE JMS I IXMIT TAD BUFRPT CIA TAD BUFRAD /IF BUFFER IS PAST START SNA CLA JMP RECV5A /DO CRLF AND RESET ALL, SPACE, CMA /ELSE JUST BACK UP THE POINTER TO THE BUFFER TAD BUFRPT JMP RECV5B WRDCNT, 0 K70, 70 BUFRAD, 0 BUFRPT, 0 RXSWITCH, CHAR3, 0 ROMINZ,177-32 /RUBOUT-^Z CHM377,-377 /MINUS 8BIT ASCII RUBOUT. / TRAILING DATA BLOCK FOR HANDLER CALL: / WORD 1 FUNCTION WORD _ _ _ ! _ _ _ ! _ _ _ ! _ _ _ / ! \ / FIELD UNUSED / 4000= WRITE DOUBLE OF IN / 0000= INPUT WORDS ^100 BUFFER OS/78 / WORD 2 ADDRESS OF BUFFER / WORD 3 STARTING BLOCK. IF 0, MAY DO SPECIAL INIT ROUTINES; / OTHERWISE IS IGNORED FOR THIS HANDLER / WORD 4 ERROR. IF AC IS POSITIVE, ERROR IS NOT CONSIDERED FATAL. / WORD 5 NORMAL RETURN. AC IS 0. ENTRY, VERSION AC4000 /FORCE THE WRITE (OUTPUT BIT) INTO THE LINK IF TAD I ENTRY /PRESENT WHEN GETTING THE FUNCTION WORD. MUST BE AND K70 /PRESERVED WHILE FETCHING REST OF DATA BLOCK. TAD CDF0 DCA BUFRFD /GET THE FIELD OF THE BUFFER SZL STA DCA RXSWITCH /0=RECEIVE; -1=XMIT TAD K3700 /AND THE "DOUBLE WORDS". FOR OUTPUT, WILL REPRESENT AND I ENTRY /2 PACKED WORDS OF 3 ASCII CHARS. IF INPUT, WILL BE CMA /DOUBLED TO COUNT 1 8BIT CHARACTER FOR EACH 12BIT WORD. /NOTE: OS/8 ROUTINES CAN REQUEST THE PROCESSING OF A /NULL BUFFER (ZERO DOUBLE WORDS). IF SOME SPECIAL /ACTION IS REQUIRED, E.G. WRITING EOF OR DOING FORM /FEED, THE WORD COUNT WILL BE ZERO. THIS HANDLER MAY /OR MAY NOT HAVE SPECIAL FUNCTIONS, DEPENDING UPON /ASSEMBLY SPECIFICATIONS. DCA WRDCNT ISZ ENTRY TAD I ENTRY /GET THE STARTING ADDRESS OF THE BUFFER. DCA BUFRAD TAD BUFRAD DCA BUFRPT /WILL HAVE CURRENT POSITION OF USER'S BUFFER. ISZ ENTRY /SKIP THE BLOCK NUMBER (THIS IS NON-FILE STRUCTURED) ISZ ENTRY /AND LEAVE RETURN POINTING TO ERROR. RDF /DATA FIELD IS SET TO CALL; INSTRUCTION FIELD IS HERE. TAD CDFCIF DCA XITFLD /WHEN EXITING, IF/DF IS SET TO CALLING ROUTINE. CDF0, CDF 0 /FALL THRU TO NEXT PAGE FOR INDIRECT ADDRESS ADJUSTMENT PAGE /PROCEDURE FOR ADJUSTING THE ABSOLUTE ADDRESSES OF INDIRECT LOCATIONS: /THIS HANDLER IS ASSEMBLED WITH A STARTING LOCATION OF 200. THIS IS PARTLY /ARBITRARY AND PARTLY BECAUSE OF THE REQUIREMENTS OF THE BUILD PROGRAM. /A "MARK" IS ESTABLISHED TO BE USED DURING ASSEMBLY TIME TO SET THE VALUE /OF THE INDIRECT ADDRESS POINTERS TO THE RELATIVE DIFFERENCE BETWEEN THE /POINTER AND THE ROUTINE REQUESTED. FOR CONVENIENCE, THIS MARKER IS CALLED /"PAGE2" AND IS ESTABLISHED AT THE TOP OF THE SECOND PAGE. THE ADJUSTMENT /ROUTINE FINDS THE BASE ABSOLUTE ADDRESS FROM THE "JMS ." THEN ADDS IT /TO THE THE VALUE IN "DIFFTABLE". THE CONTENTS OF DIFFTABLE ARE THE /RELATIVE DIFFERENCES BETWEEN PAGE2 AND THE INDIRECT ADDRESS POINTERS TO /BE MODIFIED. THIS DIFFERENCE PLUS THE BASE ABSOLUTE ADDRESS FORMS AN /ABSOLUTE POINTER TO THE ADDRESS TO BE MODIFIED. THE CONTENTS OF THE AD- /DRESS TO BE MODIFIED IS ALSO THE RELATIVE DIFFERENCE BETWEEN THE MARK /AND THE ADDRESS DESIRED. USING THE TEMPORARY ABSOLUTE POINTER, THIS DIF- /FERENCE IS ADDED TO THE BASE ADDRESS THEN RESTORED TO THE INDIRECT /POINTER AS AN ABSOLUTE VALUE. ENTRY1,NOP /GETS JMP I IRENTRY AFTER INIT. PAGE2A,JMS . /TO FIND OUT WHERE WE ARE. LEAVE 2A SO WE CAN MOVE. PAGE2, ADJUST,TAD DIFFTABLE SNA JMP ALLSET TAD PAGE2A /AS THE BASE. DCA TEMPOINT TAD I TEMPOINT TAD PAGE2A DCA I TEMPOINT ISZ ADJUST JMP ADJUST XMIT8, TAD (11 /MAKES THIS LOCATION NOP-ABLE TO OUTPUT TRUE ESCAPE. JMP XMIT4 XMIT9, ISZ WIDTH JMP XMIT4 /NOT EXCEEDED JMS DOCRLF XMIT9A,TAD RWIDTH /RESET WIDTH DCA WIDTH ISZ DEPTH JMP XMIT4 /PAGE NOT EXCEEDED. ISZ INNER /GETS "JMP XMIT4" FROM "SET [DEV] NO PAUSE" JMP .-1 ISZ OUTER JMP .-3 TAD ROUTER DCA OUTER /RESET OUTER COUNTER BEFORE GOING TAD RDEPTH DCA DEPTH JMP XMIT4 /TO OUTPUT THE NEXT PAGE. ROUTER,-200 /ARBITRARY. THE RXXXXX LOCATIONS GET MODIFIED FROM SET. DECIMAL WIDTH, -80 RWIDTH,-80 DEPTH, -24 RDEPTH,-24 OCTAL XMIT6, 0 XMTLOD XMTSKP JMP .-1 OS8MON,7600 /USE A GROUP 2 CLA TO GET THE MONITOR RETURN POINT. JMP I XMIT6 IEXIT5,EXIT5-PAGE2 IRENTRY,RENTRY-PAGE2 DIFFTA,IXMIT-PAGE2 INNER, IDOCRLF-PAGE2 /THESE DO DOUBLE DUTY AS ONE-TIME POINTERS. OUTER, IDEVINPUT-PAGE2 /KEEP "INNER" AND "OUTER" TOGETHER BECAUSE XMIT3, IEXIT5-PAGE2 /"SET [DEV] PAUSE N" FINDS "ISZ INNER" FROM HERE. XOFFLAG,IRENTRY-PAGE2 /-1 SAYS OFF CONDITION EXISTS /ALSO TERMINATOR FOR DIFFTABLE. XMIT2, 0 /SCREEN CHARACTER BEFORE OUTPUT AND (177 TAD (200 DCA XMIT3 /SAVE CHARACTER. XMIT2B, IFZERO CONSOLE < JMS CHKTTY /FOR ^C JMS DEVIN1 TAD (-XON > IFNZRO CONSOLE < JMS DEVIN1 /CHECK DEVICE FOR XON/OFF SNA JMP XMIT2D /NO FLAG TAD (-203 SNA JMP MONXIT TAD (203-XON > SNA JMP XMIT2A TAD (XON-XOFF SNA CLA JMP XMIT2C /SET XOFF FLAG XMIT2D,ISZ XOFFLAG /WORKING ON XOFF ALREADY? JMP XMIT2A /NO. IGNORE THE INPUT XMIT2C,STA /[RE]SET THE FLAG DCA XOFFLAG JMP XMIT2B /AND KEEP LOOKING. XMIT2A,DCA XOFFLAG /KEEP CLEARED WHEN NOT WORKING ON XOFF. TAD XMIT3 TAD (-233 SNA JMP XMIT8 /FOR ESCAPE IAC SNA JMP I IEXIT5 /FOR CONTROL Z PROCESSING FROM OUTPUT SIDE ONLY. TAD (32-15 /^Z MINUS CR SNA JMP XMIT9A /TO RESET WIDTH AND COUNT FOR DEPTH TAD (15-03 /CHECK FOR ^C FOUND ON INPUT SIDE FROM NON-CONSOLE. SNA JMP MONXIT TAD (3-40 /^C-SPACE SMA CLA JMP XMIT9 /COUNT PRINTING CHARACTERS FOR WIDTH XMIT4, TAD XMIT3 /HERE TO JMS XMIT6 JMP I XMIT2 ALLSET,TAD .+2 DCA ENTRY1 JMP I IRENTRY /BEGIN PROCESSING. TEMPOINT, DEVINPUT,0 JMS DEVIN1 SNA JMP .-2 /WAIT HERE FOR SOME INPUT JMP I DEVINPUT DEVIN1,0 RECSKP JMP I .-2 /NO FLAG. RECLOD AND (177 TAD (200 JMP I DEVIN1 /WITH 8BIT. IFZERO CONSOLE < CHKTTY,0 KSF JMP I .-2 /NO FLAG KRB AND (177 TAD (-3 SZA CLA JMP I CHKTTY /NOT ^C > MONXIT,CDF CIF 0 JMP I OS8MON /BEFORE EXITING TO MONITOR DOCRLF, 0 /OUTPUT A CRLF TAD (215 JMS XMIT6 TAD (212 JMS XMIT6 JMP I DOCRLF