File DDCMP.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/DECNET/8 V1A DDCMP TASK
/
/
/
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1974,1975,1976,1977 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.
/
/
/
/
/
/
/
/
/
/

/ DDCMP IMPLEMENTED AT SPEC LEVEL 3.03 / /J. ROTH 10-NOV-75 /JR ADDED SEPARATE ISR 26-APR-76 /JR ADDED HALF DUPLEX 2-NOV-76 / / DECNET/8 RELEASE VERSION 1 / DECNET/8 PATCH LEVEL A / APRIL 8,1977 / VERSION=01 PATCH="A / /TASK DEFINES TASK= DDCMP CUR= DDCFLD / START= DDSTRT IFNDEF OS8 <INIWT= 0> IFDEF OS8 <INIWT= RUNWT> /SYMBOLIC CHARACTER DEFINITIONS QSYNC= 100 /QUICK SYNC BIT SELECT= 200 /SELECT BIT DEL= 377 SOH= 201 ENQ= 005 DLE= 220 SYN= 226 FIL= 000 ACK= 001 NAK= 002 REP= 003 /RES= 004 /RESAK= 005 STRT= 006 STACK= 007 /TIMER TICKS AND THRESHOLD COUNTS DHERTZ= 1 /RATE TO RUN MARK TIME ROUTINE MAXREP= 12 /MAX OF 10 CONSEC REPS BEFORE FAILURE MAXSTR= 12 /MAX CONSEC STRTS BEFORE FAILURE ACKTKS= 3 /TIMER TICKS BFORE ANOTHER ACK REQUESTED /NOTE THAT HALF DUPLEX STATIONS MUST HAVE DIFFERING SELECT TIMERS /TO MINIMIZE ERROR RECOVERY TIME (CASE WHERE EACH STATION /SELECTS WHILE THE OTHER STATION IS ALSO SELECTED...) IFNDEF SELTKS < SELTKS= 3 /TIMER TICKS IN SELECTION INTERVAL > QTMTKS= 36 /TIMER TICKS BETWEEN IDLING REPS /ERROR DEFINES BCCHDR= 01 /REASON FOR NAK: CRC ERROR ON HEADER BCCDTA= 02 /REASON FOR NAK: CRC ERROR ON DATA REPRSP= 03 /REASON FOR NAK: REP'D MESSAGE NOT RECEIVED NOSPAC= 10 /BUFFER UNAVL AT INTERRUPT LEVEL NAKFMT= 21 /HEADER FORMAT ERROR DETECTED (A MULTITUDE OF THINGS) BFOERR= 1000 /INT SVC: BUFFER OVERFLOWED QELERR= 0100 /INT SVC: QUEUE ELEMENT UNAVALIABLE TMOERR= 0400 /INT SVC: INTER CHARACTER TIMEOUT BFMERR= 0200 /INT SVC: BAD FORMAT ERROR (MULTITUDES) /STATE BITS XMTFLG= 2000 /SET IF TRANSMIT INTERRUPT EXPECTED CTSFLG= 1000 /SET IF CTS INTERRUPT EXPECTED OT2= 100 /LOW BIT OF 3 BIT TRANSMITTER WATCHDOG TIMEOUT OTBTS= 700 /ALL 3 TIMER BITS SELFLG= SELECT%10 /SET IF SELECT WAS SET IN MESSAGE JUST RECEIVED SELFG2= 40 /SET IF SELECT WAS SET IN MESSAGE JUST SENT HDXFLG= 10 /HALF DUPLEX ATTRIBUTE BIT /WARNING: THE ABOVE BIT MUST BE PERMANENT /OUTPUT REQUEST BIT DEFINES /ORDERED ACCORDING TO PRIORITY OF REQUEST NDMNT= 1 /NEED MAINT MESSAGE NDSTAK= 2 /NEED STACK MESSAGE NDSTRT= 4 /NEED STRT MESSAGE NDNAK= 10 /NEED NAK MESSAGE NDREP= 20 /NEED REP MESSAGE NDMSG= 40 /NEED NUMBERED MESSAGE NDACK= 100 /NEED ACK MESSAGE /ERRTAB EQUATES NMBCNT= 7 /NUMBER OF ERROR/THRESHOLD COUNTERS NOPUNCH *0 /DUMMY SECTION TO DEFINE OFFSETS LINTYP, 0 /LINE TYPE (ISR TYPE) LINVER, 0 /ISR VERSION LINPAT, 0 /ISR PATCH LEVEL NAKHCR, 0 /NAK TYPE 1 RECEIVED NAKDCR, 0 /NAK TYPE 2 RECEIVED NAKREP, 0 /NAK TYPE 3 RECEIVED NAKBU, 0 /NAK TYPE 10 RECEIVED NAKDO, 0 /NAK TYPE 11 RECEIVED NAKMTL, 0 /NAK TYPE 20 RECEIVED NAKHFE, 0 /NAK TYPE 21 RECEIVED MSGHCR, 0 /NAK TYPE 1 SENT MSGDCR, 0 /NAK TYPE 2 SENT MSGREP, 0 /REP RESPONSE TIMEOUT MSGBU, 0 /NAK TYPE 10 TRANSMITTED MSGDO, 0 /NAK TYPE 11 TRANSMITTED MSGMTL, 0 /NAK TYPE 20 TRANSMITTED MSGHFE, 0 /NAK TYPE 21 TRANSMITTED ONLINL, 0 /TODL LINK WENT ONLINE ONLINH, 0 /TODH LINK WENT ONLINE ONLIND, 0 /DATE LINK WENT ONLINE MSGSNC, ZBLOCK 2 /NUMBER OF MESSAGES SENT SINCE ONLINE MSGRCC, ZBLOCK 2 /NUMBER OF MESSAGES RECEIVED SINCE ONLINE RSTSUC, 0 /NUMBER OF SUCCESSFULL RESTARTS RSTATT, 0 /NUMBER OF RESTARTS ATTEMPTED ERRLEN, 0 /SYMBOL DEFINES ERRORTAB LENGTH ENPUNCH FIELD CUR%10
*10 /RESERVE THREE AUTO INDEX REGISTERS FOR DDCMP DDCSXR, 0 DDCTXR, 0 DDCMXR, 0 /DDCMP PAGE ZERO DATA /NOTE THAT A *L IN THE COMMENT FIELD OF ANY VARIABLE /INDICATES THAT IT IS SET TO POINT INTO AN LCB BY 'GETLCB' /THESE WORDS MUST NOT BE ALTERED BY ANY OTHER ROUTINE /A *I INDICATES AN INTERRUPT LEVEL WORD FOR ISR LINKAGE *30 /**TEMPORARY!! STATE, 0 /*L PROTOCOL STATE WORD /0: DOWN /1: STARTING PHASE 1 (SENDING SRTRS) /2: STARTING PHASE 2 (SENDING STACKS) /3: UP AND RUNNING /BIT 0 SET IF START PASSED TO NSP /BIT 1 SET IF TRANSMITTER BUSY LSTACK, 0 /*L LAST ACKNOWLEDGE FROM OTHER SIDE LSTXMT, 0 /*L LAST MESSAGE IN THE PIPE LSTRCV, 0 /*L LAST MESSAGE I ACK'D MTIMER, 0 /*L MESSAGE LEVEL TIMER (NONZERO IF TIMING) MTMODE, 0 /*L MESSAGE TIMER MODE: 0=REP TIMING /*L 7777=ACK TIMING CSCREP, 0 /*L REP, STRT, STACK THRESHOLD COUNTER WFPHD, 0 /*L HEAD OF LIST WAITING TO BE POSTED WFTHD, 0 /*L HEAD OF LIST WAITING TO BE TRANSMITTED QUETL, 0 /*L TAIL IF PENDING QUEUE SVDBPT, 0 /*L INPUT BUFFER MARK SVDBCD, 0 /*L INIT MYTHICAL CHAR BEFORE BUFFER OUTBTS, 0 /*L OUTPUT DE-QUEUE REQUEST BITS RNAK, 0 /*L GETS REASON FOR NAK (IF ANY) DDCEF, 0 /*I DDCMP EVENT FLAG FREHD, HEADPK /*I HEAD OF INPUT PACKET FREE LIST DDCTL, DDCHD /*I POINTS TO TAIL OF INPUT QUEUE DDCHD, 0 /*I POINTS TO HEAD OF INPUT QUEUE (EXEC LEVEL) ATNINP, ATNBEG /*I OUTPUT ATTENTION INPUT POINTER ATNOUP, ATNBEG /OUTPUT ATTENTION OUTPUT POINTER SVCFLD, 0 /*L CDF OF ISR ON CURRENT LINE OHDR, /OUTPUT BUILD BUFFER (OVERLAYS INPUT BUF) HDR, 0 /BUFFER FOR CURRENT HEADER/PROTOCOL MESSAGE CNTL, 0 /ALSO HOLDS MESSAGE TYPE CNTH, 0 /GETS NAK REASON (IF ANY) RES, 0 /ACKNOWLEDGE FIELD NUM, 0 /MESSAGE NUMBER FIELD A0, 0 /STATION ADDRESS (MULTI DROP) OCRCL, 0;0 /GET THE CRC CHARACTERS (LO ORDER FIRST) ODCRCL, 0;0 OUTCDF, 0 /CDF TO NSP DATA OUTPTR, 0 /ADDRESS OF NSP DATA-1 OUTCNT, 0 /-COUNT OF NSP DATA BYTES 0;0 /MUST BE ZERO LSTNUM, 0 /*L FUDGE FOR CIRCUMSPECT RECEPTION OF MESSAGES LSTSNT, 0 /*L LAST MESSAGE TRANS STARTED ON THRCT1, 0 /*L COUNTS RECEIVED NAK ERRORS THRCT2, 0 /*L COUNTS CONSEC RECEIVED ERRORS ERRTAB, 0 /*L POINTS TO ERRTAB POINTER IN LCB OUTPKT, 0 /*L POINTS TO CURRENT BUSY OUTPUT PACKET OR ZERO IF NONE RPTR, 0 /POINTER TO STATUS/LINE WORD OF MESSAGE TO BE POSTED BY 'R8POST'
/START OF DDCMP IFDEF NSPFLD < FIELD NSPFLD%10 /INSERT VERSION NUMBER IN NETTAB *NETTAB+2 VERSION PATCH > FIELD DDCFLD%10 *DDCLOC /DEFINE ORIGIN OF DDCMP /INTERFACE TO ALLOW NSP (OR ANY TASK) /IN ANOTHER FIELD TO SEND DDCMP PACKETS /OUT OF THE NODE POOL /ENTRY DF = CALLING DF /CALL+1 = ADDRESS OF MESSAGE TO SEND /EXIT TO CALL+2 DDCFNC, 0 RDF /READ DF OF CALLER TAD CIFCDF /BUILD EXIT CIF CDF DCA DDCFNX /STORE INLINE TAD I DDCFNC /PICK UP MESSAGE ADDRESS ISZ DDCFNC /SKIP PAST IT DCA DDCMSG /STORE IN RTS8 SEND CALL CAL SEND DDCMP DDCMSG, 0 DDCFNX, HLT /GETS RETURN CIF CDF JMP I DDCFNC
/DDCMP EXECUTIVE LISTEN LOOP /HERE, ALL CONDITIONS THAT CAN WAKE DDCMP UP /ARE CHECKED FOR /THEY ARE TIMERS, RTS/8 MESSAGES AND INPUT/OUTPUT MESSAGE COMPLETIONS DDCLP, TAD ATNOUP /SEE IF ANY TRANSMIT COMPLETED CIA TAD ATNINP SZA CLA JMP I (OUTCMP /HANDLE IT IF YES TAD (4000+DDCMP /NO MESSAGES SEEN, WAIT FOR ONE DCA DDCEF CIFCDF, CIF CDF TAD I (DDCMP^2+MSGTBL /CHECK THE RTS8 MESSAGE Q CIF CDF CUR SZA CLA /SZA IF NONE WAITING JMP I (GETR8M /ELSE PULL IT IN TAD I (TIMOUX /SEE IF THE CLOCK HAS STRUCK SNA CLA JMP I (GOTTCK /YES PERFORM TIMER DUTIES TAD (4000+DDCMP DCA I (TIMOUX CIF WAITM EORMWT /WAIT FOR SOMETHING TO HAPPEN JMP LSNRDY /OK, SKIP INTO THE 'LISTEN' ROUTINE
/ROUTINE ENTERED TO GET NEXT INPUT PACKET LISTEN, DDCIN+2 TAD LISTEN DCA I PLISTN /SAVE ROUTINE RETURN POINT LSTNLP, TAD I (SCHOUT /SEE IF OUTPUT REQUESTED SNA CLA JMP LSNRDY /DO NOTHING IF NONE DCA I (SCHOUT /ELSE CLEAR FLAG TAD (XMTFLG+HDXFLG /LOOK AT TRANSMITTER BUSY BIT AND I STATE SNA CLA JMP I (DISPAT /SEND MESSAGE IF IDLE LSNRDY, TAD I (TMRCNT /SEE IF IN MIDST OF TIMER SCAN LOOP SZA CLA JMP I (TMRSUM /YES, RE ENTER IT IOF /DISABLE MUTUAL Q UPDATES TAD DDCHD /CHECK HEAD OF INPUT Q SNA JMP DDCLP /EMPTY, LOOK FOR SOMETHING ELSE DCA DDCTXR /ELSE SET 'TAKING' XR TAD I DDCHD /CHECK THREAD WORD SNA CLA /IF SET, DONT UPDATE TAIL OF LIST TAD (DDCHD /ELSE POINT TAIL AT HEAD SZA DCA DDCTL TAD DDCHD DCA FRELK /SET LINK FOR 'FREEBF' TAD I DDCHD ION DCA DDCHD /UPDATE LISTHEAD TAD I DDCTXR /PICK UP PACKET STATUS WORD DCA STATWD /STORE IN A TEMP TAD STATWD AND (40 /CHECK IGNORE BIT SZA CLA JMP DUMPIT /IGNORE IF MARKED BY NAK ROUTINE TAD STATWD /GET STATUS/LINE WORD JMS I (GETLCB /GO GET LCB POINTERS TAD I PLISTN DCA LISTEN /NOW RESTORE COROUTINE EXIT ADDR TAD STATWD AND (7700 SNA JMP I LISTEN /RETURN IF NO ISR ERRORS JMP I (HIOERR /TAKE ERROR EXIT OTHERWISE, AC = REASON DUMPIT, JMS FREEBF /RETURN PACKET TO FREE LIST JMP LSNRDY /TRY FOR MORE PLISTN, 0 /*L POINTS TO LISTEN COROUTINE RETURN ADDR
/RETURN A BUFFER TO THE FREELIST FREEBF, 0 TAD FRELK /DO WE HAVE A BUFFER? SNA CLA JMP I FREEBF /NO, RETURN CIF CUR /MUTEX TAD FREHD DCA I FRELK TAD FRELK DCA FREHD DCA FRELK /MARK BUFFER RETURNED JMP I FREEBF /DONE FRELK, 0 /GETS SET BY 'LISTEN' TO CURRENT BUFFER /CHECK STATE OF THE PROTOCOL /USED FOR RCVD ACK, REP, OR SOH... /BRINGS LINK ON-LINE IF WE WERE IN PHASE-2 /EXIT TO CALL+1 TO IGNORE /EXIT TO CALL+2 TO PROCESS STCHEK, 0 TAD I STATE /GET STATE BITS TO LINK,SIGN RTR SZL /SKP IF DEAD OR PHASE-1 ISZ STCHEK /POINT AT CALL+2 IF NOT CML SMA SNL CLA JMS I (STRPST /MAKE LIVE IF PHASE-2 ONLY JMP I STCHEK /RETURN STATWD= STCHEK /ROUTINE WHICH DIDN'T FIT IN 'DOWN' SUBROUTINE DCROCK, 0 DCA I OUTBTS DCA I OUTPKT TAD (DDCBGN DCA I PLISTN JMS I (PURGE /BE SURE INPUT BUFFERS ARE CLEANED UP JMP I DCROCK PAGE
/OUTPUT ATTENTION RING BUFFER /MUST BEGIN ON PAGE BOUNDRY ATNBEG, ZBLOCK 10 ATNEND= . /HANDLE RECEIVED RTS8 MESSAGES GETR8M, ION /RE ENABLE INTERRUPTS AFTER WAITM LOOP CAL RECEIV STATPT, 0 /GETS MESSAGE ADDRESS CLA /ASSUME IN DDCFLD TAD STATPT /TENTATIVELY COPY TO PAGE 0 FOR 'POSTR8' DCA RPTR TAD I STATPT /GET LINE IN LOW BITS JMS I (GETLCB /SET LCB POINTERS TAD I SVCFLD /SEE IF ISR REALLY LOADED SMA CLA /SHOULD BE CDF IF YES JMP R8SERR /BOUNCE CALL IF NOT TAD STATPT /OFFSET TO FUNCTION IAC DCA NEWPT TAD I NEWPT /PICK UP FUNCTION WORD RTR SPA CLA JMP R8STRT /FUNCTION=1, STARTUP LINK SNL JMP R8SEND /FUNCTION=0, SEND MESSAGE R8HALT, CLA IAC /FUNCTION=2, SHUTDOWN LINK JMS I (DOWN /PURGE ALL WAITING FOR ACKNOWLEDGE MESSAGES JMP R8POST /NOW POST REQUESTOR
/PROCESS STARTUP REQUEST R8STRT, TAD I STATE /CHECK PROTOCOL STATE ON THIS LINE RTR SMA SNL JMP DWNST /HANDLE DEAD START SMA CLA SZL CLA JMP HOOKIN /HOOK IN Q IF PENDING START IN PROGRESS JMP R8POST /SIMPLY POST IF ALREADY LIVE R8SERR, CLA IAC /POST IMMEDIATE ERROR HERE R8POST, JMS POSTR8 /POST THE MESSAGE JMP I (LSTNLP /RETURN TO MAIN LOOP DWNST, AC3777 /DEAD START, CLEAR START RECEIVED FLAG AND I STATE IAC DCA I STATE /ADVANCE TO PHASE-1 JMS I (CLRERT /FIRST CLEAR OUT THE ERROR TABLE DCA I LSTACK /CLEAR CURRENT ACK FROM LINE DCA I LSTXMT /ALSO CLEAR TRANSMIT MESSAGE COUNTER DCA I LSTRCV /AND CLEAR LAST RECEIVED MESSAGE DCA I LSTSNT /ALSO INIT NEXT TO SEND COUNTER TAD (-MAXSTR DCA I CSCREP /INIT STRT THRESHOLD COUNT DCA I MTMODE JMS I (SCHOUT /SCHEDULE A STRT TO BE SENT NDSTRT JMS I (REQSND /TURN ON TRANSMITTER IF HDX JMP HOOKIN /NOW HOOK IN THE WAITING Q Q1, 0
/PROCESS SEND REQUESTS R8SEND, TAD I STATE CMA RTR SPA SZL CLA JMP R8SERR /DON'T SEND MESSAGES UNLESS IN UP STATE JMS I (SCHOUT /NOW SCHEDULE THE MESSAGE NDMSG /HERE TO HOOK INTO THE WAITFOR QUEUE HOOKIN, STA /OK, POINT AT LINK WORD TAD STATPT DCA NEWLK DCA I NEWLK /CLEAR LINK WORD TAD I WFPHD /IS WAITING LIST EMPTY? SZA CLA JMP R8SEN1 TAD NEWLK /YES, INITIALIZE IT DCA I WFPHD TAD I WFTHD /CONSISTANCY CHECK THE QUEUE SZA CLA HLT /UNREACHABLE JMP R8SEN2 R8SEN1, TAD I QUETL DCA Q1 TAD NEWLK /NO, LINK ONTO LIST DCA I Q1 R8SEN2, TAD I WFTHD /IS TRANSMIT LIST EMPTY? SZA CLA JMP R8SEN3 TAD NEWLK /YES, SET IT DCA I WFTHD R8SEN3, TAD NEWLK DCA I QUETL JMP I (LSTNLP /EXIT
/POST NON QUEUED RTS8 MESSAGE /AC=STATUS /RPTR = STATUS/LINE WORD ADDRESS POSTR8, 0 CLL RTL /SHIFT STATUS OVER TO LEFT HALF RTL RTL TAD I RPTR /ADD TO STATUS/LINE WORD DCA I RPTR /STORE STATUS AC7775 /OFFSET TO EVENT FLAG TAD RPTR DCA BACKEF DCA I BACKEF /CLEAR IT CAL SEND DDCUSR BACKEF, 0 /SEND IT BACK TO NSP JMP I POSTR8 NEWPT, 0 NEWLK, 0 /TABLE OF LEGAL NAK REASON CODES NAKTAB, -1;-2;-3;-10;-11;-20;-21;0 PAGE
/DDCMP EXECUTIVE RECEIVED MESSAGE LOOP DIOERR, HIOERR, AND (BFOERR+QELERR /AC=INT SVC ERROR FLAGS HERE SZA CLA /SZA IF NOT 'BUF UNAVAIL' ERR NOSERR, TAD (NOSPAC-NAKFMT /ELSE NAK 'NOSPAC' FMTERR, TAD (NAKFMT-BCCDTA /HEADER FORMAT ERROR BADATA, IAC /BLOCK CHECK ON DATA=2 BADHDR, IAC /BLOCK CHECK ON HDR=1 PURGIT, JMS I (PURGE /NAK THE BAD STUFF /FALL INTO THE LOOP SKP /DONT PROCESS CONTROL BITS DDCIN, JMS I (SELCLR /IF CRC IS GOOD, HANDLE CONTROL BITS /THIS TURNS LINE AROUND IF WE WERE SELECTED JMS I (FREEBF /MAKE SURE BUFFER FREED JMS I (LISTEN /GET A HEADER ELEMENT DDCBGN, TAD M10 DCA HDRCNT TAD PHDR DCA DDCSXR TAD I DDCTXR /COPY THE HEADER INTO THE WORK AREA NOW DCA I DDCSXR ISZ HDRCNT JMP .-3 TAD HDR /CHECK IF INPUT QUEUE MESSED UP SPA CLA HLT /UNREACHABLE JMS I (CRC16 CRCONH, CRCAD1 /POINTS TO DESCRIPTOR ODCRCL /GETS RESIDUE TAD ODCRCL TAD ODCRCL+1 SZA CLA JMP BADHDR /BAD CHECK ON HEADER JMS I (FREEBF /OK FREE BUFFER JMS I (SELSET /SET CONTROL FLAGS TAD HDR TAD (-SOH SNA JMP DDCSOH /IF SOH, HANDLE THE DATA TAD (SOH-ENQ SZA CLA BRAJMP, JMP I BRATAB /TREAT ALL ELSE BUT ENQ AS FORMAT ERROR /FALL INTO THE ENQ HANDLER /PROCESS RECEIVED PROTOCOL MESSAGES DDCENQ, TAD CNTL /CHECK TYPE AND M10 SNA CLA /SKP+STORE JMP TO FMTERR IF OUT OF RANGE TYPE TAD CNTL TAD BRAJMP DCA .+1 0 BRATAB, FMTERR /--- DDCACK /ACK DDCNAK /NAK DDCREP /REP FMTERR /RES FMTERR /RESAK DDCSTRT /STRT DDCSTAK /STACK CRCAD1, CDF CUR PHDR, HDR-1 M10, -10 HDRCNT, 0;0 /MUST BE ZERO
/PROCESS RECEIVED SOH DDCSOH, JMS I (STCHEK /CHECK STATE OF PROTOCOL JMP PURGIT /IGNORE IF WRONG STATE JMS I (CKACK /ELSE CHECK ACKNOWLEDGE TAD NUM /SAVE NUM FOR CIRCUMSPECT RECEIVES DCA I LSTNUM JMS I (LISTEN /GET DATA IAC TAD DDCTXR DCA CRCOND /SET DESCRIPTOR POINTER JMS I (CRC16 CRCOND, 0 /GETS MESSAGE DESCRIPTOR ODCRCL /GETS RESIDUE TAD ODCRCL SNA TAD ODCRCL+1 SZA CLA JMP BADATA /BAD DATA SEEN TAD I LSTRCV /SEE IF DATA WE'RE GETTING IS EXPECTED CMA TAD I LSTNUM AND (377 SZA CLA JMP TOSDTA /TOSS IT IF NOT (AS OPPOSED TO NAKING IT) TAD I LSTNUM /NOW UPDATE LAST RECVD MSG NUM DCA I LSTRCV JMS I (SCHOUT /OK, SCHEDULE AN ACKNOWLEDGE NDACK JMS I (SNDNSP /SEND IT TO NSP DCA I THRCT2 /CLEAR THRESHOLD COUNT 2 SINCE MESSAGE GOT OK STL JMS I (BUMP /INCREMENT COUNT OF MESSAGES RECEIVED MSGRCC MRKBUF, ISZ DDCTXR /SKIP DATA CRC CHARS ISZ DDCTXR TAD I DDCTXR /MARK BUFFER DCA I SVDBCD TAD I DDCTXR DCA I SVDBPT JMP DDCIN /EXIT TOSDTA, TAD I DDCTXR /COPY DESCRIPTOR TO CLEAR ROUTINE DCA I (BCDF TAD I DDCTXR DCA I (BPTR TAD I DDCTXR DCA DDCMXR TOSDTL, JMS I (PSUB /CLEAR ANOTHER LOCATION TAD DDCMXR SZA CLA /SKP IF THROUGH JMP TOSDTL /LOOP OTHERWISE JMP MRKBUF /MARK BUFFER AND RETURN PAGE
/PROCESS RECEIVED STACKS DDCSTAK,TAD RES SNA CLA /IGNORE IF BAD FORMAT TAD I STATE AND (3 /MASK ONLY PROTOCOL STATE BITS SNA JMP I (DDCIN /IGNORE IF DOWN OR ACK INCORRECT CLL RAR SNA CLA JMP STRT2 /PHASE-1 SNL /SNL IF LIVE JMS STRPST /ELSE WAS PHASE-2, POST START REQUESTS JMS I (SCHOUT /ACK IF PHASE-2 OR RUNNING... NDACK JMP I (DDCIN /EXIT STRPST, 0 ISZ I STATE /MAKE LIVE NOW DCA I WFTHD /MAKE SURE TRANS HEAD CLEAR JMS I (QTIME /SETUP QUIESCENT INTERVAL TIMER JMS I (SETTIM /SET TOD LINK WENT ON-LINE CLL JMS I (BUMP /INCREMENT SECCESSFUL RESTARTS RSTSUC STRPSL, TAD I WFPHD /LOOK AT LIST HEAD SNA CLA JMP I STRPST /RETURN IF DONE JMS I (REMOVE /ELSE REMOVE IT (SEND BACK TO NSP) JMP STRPSL /ITERATE
/PROCESS RECEIVED START MESSAGES DDCSTR, TAD I STATE /LOOK AT PROTOCOL STATE CLL RTR /BITS TO LINK AND SIGN SMA CLA JMP STDCHK /PHASE-2 OR DOWN SZL CLA /SZL IF PHASE-1 JMP STRDWN /WAS IN UP STATE STRT2, ISZ I STATE /ENTER PHASE-2 JMS I (SCHOUT NDSTAK JMP I (DDCIN /EXIT STRDWN, CLA IAC JMS I (DOWN /LINE WENT DOWN, PURGE ALL CLL STDCHK, TAD I STATE SPA SZL CLA /SKP IF NO STRT AND NOT PHASE 2 JMP I (DDCIN /IF SO IGNORE AC4000 TAD I STATE DCA I STATE CLA IAC JMS I (SNDNSP /SEND 'START RECEIVED' TO NSP JMP I (DDCIN /EXIT
/HANDLE RECEIVED ACK'S DDCACK, JMS I (STCHEK /CHECK STATE JMP I (DDCIN /IGNORE IF WRONG STATE JMS I (CKACK /OK, CHECK ACK OUT DCA I THRCT2 /CLEAR RECEIVED ERR THRESHOLD COUNTER JMP I (DDCIN /EXIT /HANDLE RECEIVED REP'S DDCREP, JMS I (STCHEK /CHECK STATE JMP I (DDCIN /IGNORE IF WRONG STATE TAD CNTH AND (77 /MASK OUT QSYNC AND SELECT BITS TAD RES /CHECK FOR FILLS SZA CLA JMP I (FMTERR /NOT FILLS: FORMAT ERROR DCA I THRCT2 /CLEAR RECEIVED ERR THRESHOLD COUNTER TAD NUM CIA TAD I LSTRCV /COMPARE HIS NUM TO LAST WE GOT SZA CLA JMP REPNAK /NO MATCH, NAK IT JMS I (SCHOUT /MATCHES, JUST ACK IT NDACK JMP I (DDCIN /EXIT REPNAK, TAD (REPRSP /JUST NAK IT JMS I (SCHOUT /DON'T BOTHER CLEARING BUFFERS NDNAK JMP I (DDCIN /HANDLE RECEIVED NAK'S DDCNAK, TAD I STATE /CHECK PROTOCOL STATE CMA RTR SPA SZL CLA JMP I (DDCIN /IGNORE IF NOT RUNNING JMS I (CKACK /CHECK THE ACK FIELD TAD CNTH /NOW GO BUMP THRESHOLD COUNT AND (77 /MASK OUT QSYNC AND SELECT BITS JMS I (INCERR JMP I (FMTERR /ERROR IF UNDEFINED NAK TYPE NOP /***TEMPORARY*** DCA I THRCT2 /CLEAR RECEIVED ERR THRESHOLD COUNTER TAD I LSTACK /RESET "NUM" TO OLD VALUE DCA I LSTSNT TAD I WFPHD /ANY PENDING MESSAGES? SNA JMP I (DDCIN /NO, EXIT DCA I WFTHD JMS I (SCHOUT /YES, RESEND THEM NDMSG JMP I (DDCIN /EXIT
/THE NETWORK IS DOWN!!! /AC=STATUS TO POST WITH DOWN, 0 DCA DSTAT CIF CUR /CLEAR THE WORLD! TAD I STATE AND (HDXFLG /CLEAR ALL BUT HDX ATTRIBUTE BIT DCA I STATE DCA I MTMODE DCA I MTIMER DCA I CSCREP DCA I WFTHD JMS I (DCROCK /CALL NON FITTING CODE OFF PAGE PSTLP, TAD I WFPHD SNA CLA JMP I DOWN /DONE TAD DSTAT /GET STATUS JMS I (REMOVE /REMOVE THIS MESSAGE JMP PSTLP /TRY AGAIN DSTAT, 0 PAGE
/DDCMP MARK TIME ROUTINE GOTTCK, ION /RE-ENABLE INTERRUPTS AFTER WAITM LOOP TAD (-MAXLIN DCA TMRCNT /INITIALIZE THE LOOP COUNTER TAD (LCBTAB+10 DCA TMRPTR /INIT THE ROVING TIMER POINTER TMRLUP, TAD TMRPTR /POINT AT STATE TAD (-4 DCA STAPTR TAD I STAPTR RTL SMA SNL CLA /SKP IF OUTPUT INTERRUPT IS EXPECTED JMP RESTIM /ELSE JUST DO RESPONSE TIMING TAD I STAPTR /BUMP 3 BIT COUNT TAD (OT2 DCA STATMP TAD STATMP AND (OTBTS SNA CLA /SKP IF NO OVERFLOW JMP XMTDWN /ELSE MARK LINE DOWN IF TRANSMITTER FAILED TAD STATMP /STORE UPDATED COUNT DCA I STAPTR /BACK IN THE LCB RESTIM, TAD I TMRPTR /SEE IF RUNNING SZA CLA ISZ I TMRPTR /AND IF EXPIRED JMP NXTTMR /NO, JUST DO THE NEXT TAD (MAXLIN /CALC THE LINE NUMBER TO AC TAD TMRCNT JMS I (GETLCB /GET THE LCB POINTERS TAD I STATE /NO QUIESC TIMER IF HDX AND (HDXFLG SNA TAD I MTMODE /SEE WHAT TIMER MODE SZA CLA /SZA IF QUIESCENT INTERVAL JMP NTQUIE /ELSE HANDLE ACTIVE EVENT REPRQ, TAD (-MAXREP /INITIALIZE REP THRESHOLD COUNTER DCA I CSCREP ACKRQ, JMS I (SCHOUT /SCHEDULE A REP NDREP JMP SNDREQ /START SENDING IT (SINCE SCHOUT.NE.0 NOW) /WE'LL RETURN TO NXTTMR SINCE TMRCNT.NE.0
NTQUIE, DCA I MTMODE TAD I STATE /BUILD DISPATCH ON PROTOCOL STATE AND (3 TAD (JMP TMRFNS DCA .+1 /STORE IN LINE 0 TMRFNS, JMP NXTTMR /DO NOTHING IF DOWN STATE JMP STRTTM /SEND STRT IF PHASE-1 JMP STCKTM /SEND STACK IF PHASE-2 TAD I CSCREP /LIVE STATE, SEE IF REP RESPONSE SNA CLA JMP REPRQ /NO, ONE NEEDED NOW ISZ I CSCREP /YES, SEE IF TOO MANY SENT JMP ACKRQ /NO, SEND ANOTHER JMP LINDWN XMTDWN, TAD (MAXLIN TAD TMRCNT JMS I (GETLCB /GET LCB IF TRANSMITTER FAILED LINDWN, AC0002 /YES, LINE MUST BE DEAD JMS I (DOWN /MARK LINE DOWN AC0002 JMS I (SNDNSP /SEND LINE DOWN MESSAGE TO NSP /END OF TIMER SCAN LOOP /COME BACK HERE FROM LISTEN LOOP IF MORE LCB'S TO CHECK /(INDICATED BY NONZERO TMRCNT) TMRSUM, NXTTMR, TAD TMRPTR TAD (LCBSIZ DCA TMRPTR /OFFSET TO NEXT MTIMER WORD ISZ TMRCNT /BUMP THE COUNT JMP TMRLUP /LOOP IF MORE TO GO GETTCK, CAL /OTHERWISE SET ANOTHER INTERVAL RUNNING SEND CLOCK TIMOUX JMP I (LSNRDY /RETURN TO MAIN LOOP
STRTTM, ISZ I CSCREP /BUMP START THRESHOLD COUNT SKP JMP LDEAD /UNABLE TO START IF NO RESPONSE JMS I (SCHOUT /ELSE SCHEDULE ANOTHER STRT NDSTRT JMP SNDREQ /GO SEND IT (WE'LL RETURN TO NXTTMR) STCKTM, ISZ I CSCREP /BUMP STACK THRESHOLD COUNT JMP NTHRSK /SEND ANOTHER IF MORE ALLOWED LDEAD, AC0002 /SET AC = DEAD LINE STATUS JMS I (DOWN /MARK LINE DEAD (NSP WILL BE POSTED IF IT REQUESTED IT) JMP NXTTMR /HANDLE THE NEXT LCB NTHRSK, JMS I (SCHOUT /SCHEDULE AND SEND A STACK NDSTAK SNDREQ, TAD I STATE AND (HDXFLG /CHECK LINE ATTRIBUTES SNA CLA JMP I (LSTNLP /NORMAL HANDLING IF FDX JMS I (REQSND /ASSERT RS IF HDX DCA I (SCHOUT /CLEAR OUTPUT REQUEST FLAG JMP NXTTMR /LOOP, CTS WILL PROPAGATE TRANSFER TIMOUX, ZBLOCK 3 /TIME OUT MESSAGE FOR CLOCK HANDLER 0 0;SHERTZ%DHERTZ /RUNS AT DHERTZ RATE TMRPTR, 0 TMRCNT, 0 STAPTR, 0 STATMP, 0 QTIME, 0 /START TIMER FOR PERIODIC REP DCA I CSCREP /RESET THRESHOLD COUNTER DCA I MTMODE /RESET TIMER MODE TAD (-QTMTKS DCA I MTIMER /START TIMER JMP I QTIME PAGE
/CHECK OUT ACKNOWLEDGE (RES FIELD) /POSTS ANY ACK'D MESSAGES /IF ACK OUT IF RANGE, ASSUMES HEADER FORMAT ERROR /INTERLOCK PREVENTS MESSAGES ACTIVELY BEING RETRANSMITTED FROM BEING POSTED /IF A BELATED ACK COMES IN CKACK, 0 TAD I LSTACK /RANGE CHECK HIS ACKNOWLEDGE CIA TAD RES AND (377 /MOD 400 SNA JMP NULACK /NEW SAME AS THE OLD CIA DCA POSTCT /ELSE SETUP COUNT TO POST TAD I LSTACK CIA TAD I LSTXMT AND (377 /NUM WAITING (MOD 400) TAD POSTCT /COUNT IN RANGE? SPA CLA /SPA IF YES JMP I (FMTERR /ELSE 'HEADER FORMAT ERROR' DCA I THRCT1 /WE GOT ACK FOR AT LEAST 1 OUTSTANDING MESSAGE ACKLP, TAD I WFPHD SNA HLT /UNREACHABLE! CIA TAD I OUTPKT /SEE IF BEING TRANSMITTED SNA CLA JMP ACKSKP /YES, SKIP IT BY PRETENDING IT WASN'T ACKNOWLEDGED TAD I LSTACK /INCREMENT THE LAST ACK RECEIVED NOW IAC AND (377 DCA I LSTACK JMS REMOVE /WE CAN POST IT STL JMS I (BUMP /BUMP COUNT OF MESSAGES SENT ACROSS MSGSNC ISZ POSTCT /BUMP COUNT JMP ACKLP /LOOP IF MORE / TAD RES /NOW UPDATE LAST RECEIVED ACK / DCA I LSTACK ACKSKP, DCA I CSCREP /CLEAR THRESHOLD COUNTER TAD I STATE AND (HDXFLG /SEE IF NEED TO DO REP TIMING SZA CLA JMP I CKACK /NO IF HDX TAD I WFTHD CIA TAD I WFPHD /ANY MORE MESSAGES WAITING? SNA CLA JMP QINTVL /NO, ENTERING A QUIESCENT INTERVAL STA /YES, TIME THE NEXT ACK DCA I MTMODE TAD (-ACKTKS DCA I MTIMER JMP I CKACK /EXIT NULACK, TAD I WFPHD /NULL ACK, ANY MESSAGES WAITING? SNA CLA /EXIT IF MESSAGE WAITING /(ITS TIMER IS RUNNING) QINTVL, JMS I (QTIME JMP I CKACK /EXIT POSTCT, 0 /GETS COUNT OF MESSAGES TO POST THIS GO ROUND
/REMOVES PENDING NSP MESSAGES FROM WAITING LIST /AC=STATUS TO POST IT WITH /(CODE TO CANCEL MESSAGES HAS BEEN REMOVED - JR) REMOVE, 0 DCA I (POSTR8 /HOLD STATUS IN SUBROUTINE HEADER TAD I WFPHD SNA HLT /UNREACHABLE! DCA RPTR /POINT AT THREAD WORD TAD I RPTR /COPY IT DCA RTMP ISZ RPTR /OFFSET TO STATUS/LINE TAD I (POSTR8 /PICK UP STATUS JMS I (POSTR8 /GO INTO SEND ROUTINE WITH IT TAD I WFPHD /CHECK IF ACK FOR MESSAGE ABOUT TO BE RESENT CIA TAD I WFTHD /WFTHD = 0 IF CALLED OUTSIDE CKACK ROUTINE - BE CAREFUL SZA CLA JMP NOSKIP /JMP IF NOT TAD RTMP /OTHERWISE, UPDATE WFTHD TO SKIP IT DCA I WFTHD TAD I LSTSNT /ALSO, MAKE CORRESPONDING INCREASE IN LSTSNT IAC AND (377 DCA I LSTSNT TAD I WFTHD /SEE IF ANY MESSAGES TO BE SENT NOW SZA CLA JMP NOSKIP TAD (7777-NDMSG /CLEAR 'NEED MESSAGE' BIT IF NONE AND I OUTBTS DCA I OUTBTS /JR THIS FIXES BUG IN QUEUE HANDLING NOSKIP, TAD RTMP /UPDATE HEAD POINTER DCA I WFPHD JMP I REMOVE /DONE RTMP, 0
/SCHEDULES OUTPUT /AC=REASON FOR NAK (IF ANY) /CALL+1 = REQUEST BIT TO SET ON /THIS ROUTINE INCREMENTS ERROR COUNTERS /(UNLESS WE ARE NAKING A REP MESSAGE) AND OBSERVES /THE PROPER PRECEDANCE OF NAK TYPE CODES /THE ENTRY POINT OF THIS ROUTINE IS A FLAG IF NONZERO - BEWARE SCHOUT, 0 SNA JMP SCHGO /DON'T BUMP ERROR COUNTER IF NOT NAK DCA RTMP /STORE A SEC TAD I STATE /CHECK IF ON-LINE CMA RTR SPA SZL CLA /SKP IF STATE=3 JMP SCHNOP /ELSE JUST EXIT (NO NAKS SENT IF NOT ONLINE) /NOR IS ERROR LOGGING DONE DURING STARTUP TAD RTMP CIA TAD I RNAK /COMPARE PRECEDANCE OF TYPES SMA CLA JMP .+3 /JMP IF OLD.GE.NEW TAD RTMP DCA I RNAK /STORE MAX(PREV REASON,NEW REASON) AC7775 TAD RTMP /SEE IF NAKING A REP MESSAGE SNA CLA JMP SCHGO /JMP IF SO, THIS IS NOT COUNTED AC4000 /FLAG TRANSMISSION COUNT TAD RTMP /USE CURRENT REASON JMS I (INCERR /INCREMENT COUNTS HLT /UNREACHABLE NOP /***TEMPORARY**** SCHGO, TAD I SCHOUT /GET DECISION BRANCH CMA AND I OUTBTS TAD I SCHOUT /SET THE REQUEST BIT DCA I OUTBTS SCHNOP, ISZ SCHOUT JMP I SCHOUT /DONE PAGE
/SEND A MESSAGE TO NSP /AC=STATUS WORD /DDCTXR->DESCRIPTOR (IF NECESSARY) /OTHERWISE IT FETCHES GARBAGE /AN ERROR HALT IS TAKEN IF THE NODE POOL IS /EXHAUSTED AT THIS POINT SNDNSP, 0 TAD (4 /BIAS FOR MESSAGE GOT DCA CURTYP /HOLD IT IOF /PICK A NODE TAD FREHD SNA NODHLT, HLT /**TEMPORARY!! DCA CURNSM TAD I FREHD /GET THREAD WORD ION /PREP TO REEN INTS DCA FREHD /UPDATE LISTHEAD TAD CURNSM DCA DDCMXR /SET AUTO PTR DCA I CURNSM /CLEAR EF DCA I DDCMXR /CLEAR CDF DCA I DDCMXR /CLEAR PTR TAD I (LINE /PICK UP LINE NUMBER DCA I DDCMXR /CLEAR STAT+STORE LINE TAD CURTYP /NOW STORE TYPE DCA I DDCMXR DCA I DDCMXR /CLEAR CHAN TAD I DDCTXR /NOW COPY DESCRIPTOR DCA I DDCMXR TAD I DDCTXR DCA I DDCMXR TAD I DDCTXR DCA I DDCMXR CAL SEND /NOW SEND IT DDCUSR CURNSM, 0 JMP I SNDNSP /DONE CURTYP, 0
/CLEAR ALL INPUT BUFFERS IN PREP FOR RESYNC /CALLED IF A NAK MUST BE SENT /ENTRY AC = NAK TYPE IF ONE TO BE SENT PURGE, 0 DCA NAKFLG /SAVE NAK TYPE TAD I SVDBPT /COPY BUFFER MARK FIRST DCA BPTR TAD I SVDBCD DCA BCDF TAD BPTR /BOTH INLINE AND TO SAVE AREA DCA HLDPTR TAD BCDF DCA HLDCDF TAD I RCVINI DCA STRTI /COPY ISR ENTRY POINT ONTO PAGE IAC /CONVERT TO CIF TAD I SVCFLD DCA PCIF PCIF, 0 CLA IAC /CALL INITIATOR WITH INHIBIT FUNCTION JMS I STRTI /THIS LOCKS ACCESS TO THE BUFFER WHILE WE ACCESS IT /IT ALSO COPIES CURRENT BUFFER MARK TO LCB PRGLP, TAD BPTR /NOW CLEAR THE RING BUFFER CIA TAD I SVDBPT /SEE IF WE ARE DONE SZA CLA JMP CLRIT TAD BCDF CIA TAD I SVDBCD SNA CLA JMP PRGDN /YES IF BOTH ADDR AND DF MATCH CLRIT, JMS PSUB /GO CLEAR LOCATION JMP PRGLP PSUB, 0 BCDF, 0 /GETS CDF TO BUFFER ISZ BPTR /PRE INCREMENT POINTER TAD I BPTR /LOOK AT NEXT LOC SMA JMP PGOTC /JMP IF CONTAINS A CHARACTER CMA SNA JMP PGOTC /IGNORE ALREADY CLEAR LOCS (DP8E) CMA /OTHERWISE ASSUME ITS A CDF DCA BCDF ISZ BPTR TAD I BPTR /NOW UPDATE ADDRESS DCA BPTR JMP PRGLP2 /ITERATE PGOTC, STA /RELEASE ANOTHER LOCATION DCA I BPTR ISZ DDCMXR /INDICATE THAT WE DID NOP /(USED FOR IGNORING OUT OF SEQUENCE MSGS) PRGLP2, CDF CUR JMP I PSUB PRGDN, TAD HLDCDF /NOW RESET LCB BUFFER MARK DCA I SVDBCD TAD HLDPTR DCA I SVDBPT TAD DDCHD /MARK ALL PACKETS IN INPUT Q TO BE IGNORED PRGLP3, DCA P1 TAD P1 /LOOK AT THREAD WORD SNA JMP PRGDN2 /JMP IF END OF LIST IAC DCA P2 /ELSE POINT AT LINE WORD TAD I P2 CIA TAD I (LINE /SEE IF MATCH AND NOT YET MARKED TO IGNORE AND (77 SZA CLA JMP PRGSKP /JMP IF NOT TAD (40 /ELSE SET THE 'IGNORE' BIT TAD I P2 DCA I P2 PRGSKP, TAD I P1 /CHAIN TO NEXT ONE JMP PRGLP3 PRGDN2, TAD PCIF /STORE CIF INLINE DCA .+1 0 JMS I STRTI /NOW LET ISR REENTER RESYNC MODE TAD NAKFLG SNA JMP I PURGE /RETURN IF NO NAK TO BE SENT JMS I (SCHOUT /OTHERWISE SCHEDULE IT TO BE SENT NDNAK JMP I PURGE STRTI, 0 RCVINI, 0 /*L POINTS TO ENTRY POINT OF RECEIVER INITIATOR NAKFLG, 0 BPTR, 0 HLDPTR, 0 HLDCDF, 0 P1= HLDPTR P2= HLDCDF PAGE
/ROUTNE TO SET POINTERS INTO LCB /LINE = PHYSICAL LINK NUMBER /ALL WORDS IN DCATAB ARE FLAGGED IN THE LISTING WITH *L /IF THE LINE IS SAME AS LAST CALL, JUST RETURN /EXIT SVCFLD = ADDRESS OF LCB GETLCB, 0 AND (37 /MASK ONLY LINE BITS DCA LINE TAD LINE /MULTIPLY LINE BY LCBSIZ CLL RAL TAD LINE CLL RTL TAD LINE CLL RAL IFNZRO LCBSIZ-32 <__ASSEMBLY ERROR__> TAD (LCBTAB DCA DDCMXR /SET LCB PTR TAD DDCMXR CIA TAD SVCFLD SNA CLA /SNA IF NOT SAME LINE AS LAST CALL JMP I GETLCB /ELSE SPEEDY EXIT TAD (DCATAB-DCATND DCA DDCSXR /SET COUNTER TAD (DCA I DCATAB DCA LCBDCA /BUILD INSTR IN-LINE (BARBARIC!!!) LCBLUP, TAD DDCMXR /PICK UP ADDRESS LCBDCA, 0 /STORE IT WHERE APPROPRIATE ISZ DDCMXR ISZ LCBDCA ISZ DDCSXR JMP LCBLUP /GO AGAIN IF MORE TAD I SVCFLD /STORE CDF INLINE DCA ISRCDF+1 JMP I GETLCB /RETURN /TABLE OF LOCATIONS TO SET POINTERS INTO DCATAB, SVCFLD /CDF TO INT SVC FIELD ERRTAB /ADDR OR ERROR TABLE RCVINI /ADDR OF RECEIVE INITIATOR TRNINI /ADDR OF TRANSMIT INITIATOR STATE /LCB STATUS WORD LSTACK /LAST ACK FROM OTHER SIDE LSTXMT /LAST MESSAGE I SENT LSTRCV /LAST MESSAGE RECEIVED ACK FOR MTIMER /LINE REP TIMER MTMODE /TIMER MODE WORD CSCREP /COUNTS CONSEC REPS WFPHD /WAIT FOR POST LISTHEAD WFTHD /WAIT FOR TRANSMIT LISTHEAD QUETL /TAIL OF ABOVE Q OUTBTS /OUTPUT REQUEST BITS RNAK /REASON TO SEND NAK SVDBPT /RING BUFFER MARK FOR PURGING SVDBCD /CDF FOR ABOVE PLISTN /LISTEN COROUTINE EXIT ADDR OUTCH1 /FIRST CHARACTER TO BE SENT BY TRANSMITTER OUTCH2 /SECOND CHAR (USED BY HEADER REVEIW ROUTINE) LSTNUM /HOLDS NUM ACROSS RECEPTION OF DATA LSTSNT /HOLDS NUMBER OF LAST MSG TRANS STARTED ON / OUTNUM /HOLDS NUM FIELD OF NUMBERED MESSAGE BEING TRANSMITTED OUTPKT /POINTS TO MESSAGE PACKET IF IT IS BEING TRANSMITTED NOW PTHCT1, THRCT1 /THRESHOLD COUNTER FOR NAK'S RECEIVED THRCT2 /THRESHOLD COUNT FOR NAK'S AND REP'S SENT DCATND= . /END OF THE TABLE LINE, 0 /ROUTINE TO INCREMENT ERROR COUNTERS /ENTRY AC = NAK CODE IF NAK RECEIVED /ENTRY AC = 4000+NAK CODE IF NAK SENT /EXIT TO CALL+1 IF UNNNOWN NAK TYPE /EXIT TO CALL+2 IF THRESHOLD OVERFLOW /EXIT TO CALL+3 IF NOT OVERFLOW /THIS ROUTINE ASSUMES THE FOLLOWING NAK CODES /1 BCC ON HEADER /2 BCC ON DATA /3 REP RESPONSE /10 BUF UNAVL /11 RECEIVER OVERRUN /20 MESSAGE TOO LONG /21 HEADER FORMAT ERROR INCERR, 0 DCA R /STORE CODE TAD (NAKTAB-1 /SET POINTER TO TABLE OF LEGAL CODES DCA DDCMXR TAD I PTHCT1 /SET POINTER TO THRESHOLD 1 TENTATIVELY DCA T ERSRCH, TAD I DDCMXR SNA JMP I INCERR /RETURN TO CALL+1 IF ILLEGAL CODE TAD R CLL RAL /NAK SENT BIT TO LINK SZA CLA JMP ERSRCH /ITERATE IF NOT MATCH ISZ INCERR /POINT AT CALL+2 IF FOUND SZL ISZ T /POINT AT COUNT 2 IF NAK SENT SZL TAD (7 /BIAS IF NAK SENT TAD DDCMXR TAD (-NAKTAB+NAKHCR TAD I ERRTAB /CALCULATE TABLE ENTRY ADDR IN ISR DCA EPTR JMS ISRCDF CLL IAC TAD I EPTR SZA /COUNTS STICK AT 4095 DCA I EPTR /STORE INCREMENTED CUMULATIVE COUNT CDF CUR /BACK TO NSPFLD TAD R CIA TAD I T /SEE IF THRESHOLD SAME AS LAST AND (77 /LOW 6 BITS HAVE TYPE SZA CLA JMP NEWCT /NEW COUNT IF NO MATCH TAD I T CLL TAD (100 /INCREMENT COUNT IN HIGH 6 BITS SNL INCOUT, ISZ INCERR /EXIT TO CALL+3 IF NOT OVERFLOWED DCA I T /STORE UPDATED COUNTER JMP I INCERR /RETURN TO CALLER NEWCT, AC3777 /MASK OUT SIGN BIT AND R TAD (-1200 /SET INIT THRESHOLD COUNT JMP INCOUT T, 0 EPTR, 0 R, 0 /TEMPORARY /ROUTINE TO SET DF TO ISR DF ISRCDF, 0 0 /GETS CDF ISRFLD JMP I ISRCDF OHCDF, CDF CUR OHDR-1 -6 0;0 /MUST BE ZERO PAGE
/TRANSMISSION COMPLETE HEADER REVEIW ROUTINE /INCREMENTS MESSAGE NUMBERS, STARTS REP TIMERS /TESTS CONTROL BITS, STARTS TRANSMISSION IF CTS GRANTED OUTCMP, ION /RE ENABLE INTERRUPTS AFTER WAITM LOOP TAD I ATNOUP /READ LINE FROM RING BUFFER JMS I (GETLCB /PICK UP LCB POINTERS TAD ATNOUP /BUMP ATTENTION POINTERS IAC AND (7767 DCA ATNOUP TAD (7777-XMTFLG-OTBTS /CLEAR OUTPUT BUSY BIT AND XMT TIMEOUT AND I STATE DCA I STATE TAD I STATE /CHECK IF LINE IS ACTIVE (IN CASE LINE WENT OFFLINE) RTR SMA SNL CLA /SKP IF YES JMP I (LSNRDY /OTHERWISE DO NOTHING JMS I (CTLCHK /CHECK SELECT BITS IF HDX /EXITS TO DISPAT IF CTS WAS GRANTED ON HDX TAD I OUTCH1 /CHECK IF WE JUST TRANSMITTED A MESSAGE TAD (-SOH SZA CLA /SKP IF YES JMP NOTSOH /ELSE IT WAS A PROTOCOL MESSAGE / TAD I LSTXMT /SEE IF THIS MESSAGE GREATER THAN HIGHEST NUM SENT / CMA / TAD I OUTNUM / AND (377 / SZA CLA / JMP ACKTM /JMP IF NOT / TAD I OUTNUM / DCA I LSTXMT /ELSE UPDATE LSTXMT / ABOVE CODE EXECUTED AT MESSAGE BUILD TIME / BUT PROBABLY SHOULD BE DONE AT TRANSIMIT INTERRUPT LEVEL, AS / THE LAST CHARACTER IS CLOCKED OUT - JR DCA I OUTPKT /UNLOCK THE MESSAGE FOR POSTING NOW / THE ABOVE INSTRUCTION COULD ALSO BE DONE MORE TIMELY AT INTERRUPT LEVEL JMP ACKTM /GO TIME THE AWAITED ACKNOWLEDGE NOTSOH, TAD I OUTCH2 /PICK UP THE PROTOCOL MESSAGE TYPE TAD (JMP JMPTAB DCA .+1 /STORE A JUMP ON IT INLINE / 0 /GOOD ENOUGH JMPTAB, HLT /UNREACHABLE (---) JMP I (TSTSEL / (ACK) JMP I (TSTSEL / (NAK) JMP ACKTM / (REP) HLT /UNREACHABLE (RES) HLT /UNREACHABLE (RESAK) JMP STRTM /TIME STRT RESPONSE (STRT) JMP STRTM /TIME STACK RESPONSE (STACK) ACKTM, TAD I MTMODE /CHECK THE TIMER MODE SZA CLA JMP I (TSTSEL /IF NONZERO ALREADY TIMING A RESPONSE STRTM, TAD I STATE /CHECK IF HDX AND (HDXFLG SZA CLA JMP I (TSTSEL /NO REP TIMER IF YES STA /ELSE SET TO RESPONSE TIMING DCA I MTMODE TAD (-ACKTKS /ACK TIMOUT INTERVAL DCA I MTIMER JMP I (TSTSEL /GO LOOK FOR ANOTHER REQUEST OUTCH1, 0 /*L FIRST CHAR OF HEADER OUTCH2, 0 /*L SECOND CHAR OF HEADER /OUTNUM, 0 /*L NUM FIELD OF HEADER
/CALL THE CRC16 TASK TO CHECKSUM THE DATA CRCDAT, JMS I (CRC16 ODCRCM, OUTCDF ODCRCL TAD (SOH DCA HDR /NOW STORE SOH TAD OUTCNT CIA AND (377 DCA CNTL /STORE LOW COUNT BYTE TAD OUTCNT CIA RTL RTL RAL AND (17 DCA CNTH /NOW SET THE HIGH BYTE TAD I LSTRCV DCA RES /SET RES FIELD TAD I LSTSNT DCA NUM /SET NUM FIELD /THE FOLLOWING CODE SHOULD PROPERLY BE /DONE AT INTERRUPT LEVEL, BUT THIS IS SAFE TAD I LSTXMT /UPDATE NUMBER OF HIGHEST MESSAGE SENT CMA TAD I LSTSNT /IF ONE GREATER THAN PREV AND (377 SZA CLA JMP .+3 TAD I LSTSNT DCA I LSTXMT /FALL INTO TRANSMIT ROUTINE
/ROUTINE TO CALCULATE CRC ON HEADER, SET CONTROL BITS /AND INITIATE TRANSMISSION XMITIT, CLA IAC DCA A0 /SET STATION ADDRESS TO 1 TAD I STATE /CLEAR SELECT SENT FLAG AND (7777-SELFG2 DCA I STATE TAD I OUTBTS /SET SELECT IF NOTHING MORE IN QUEUE SZA CLA JMP NOSEL /NO NEED TO SET SELECT TAD (SELFG2 TAD I STATE DCA I STATE /SET SELECT TRANSMITTED FLAG TAD (SELECT NOSEL, TAD (QSYNC /ALWAYS SET QSYNC TAD CNTH DCA CNTH /ALWAYS SET QSYNC JMS I (CRC16 OHCRCM, OHCDF OCRCL TAD HDR /STORE FIRST 2 CHARACTERS DCA I OUTCH1 /FOR HEADER REVEIW ROUTINE TAD CNTL DCA I OUTCH2 / TAD NUM /SAVE THIS MSG NUMBER FOR HEADER REVEIW / DCA I OUTNUM AC2000 /SET OUTPUT BUSY BIT NOW TAD I STATE AND (7777-OTBTS /BE SURE TRANSMITTER TIMEOUT CLEARED DCA I STATE TAD I SVCFLD /STORE CIF TO ROUTINE IN-LINE IAC /CONVERT TO CIF DCA .+1 STRTO, 0 TAD I TRNINI /NOW STORE ENTRY ADDR FOR INITIATOR DCA STRTO JMS I STRTO /CALL THE INITIATOR JMP I (LSNRDY /RETURN TO IDLE LOOP TRNINI, 0 /*L POINTS TO ENTRY POINT OF TRANSMIT INITIATOR PAGE
/ENTER HERE FROM OUTCMP AFTER A MESSAGE HAS BEEN SENT /IF SELECT WAS SENT, EXIT, WE ARE NO LONGER SELECTED TSTSEL, TAD I STATE AND (SELFG2 SNA JMP DISPAT /SELECT NOT SENT, SEE IF MORE TO SEND CMA AND I STATE /WAS SET, CLEAR IT DCA I STATE TAD I STATE AND (HDXFLG /SEE IF HDX SNA CLA JMP DISPAT /NO, PROCEED TAD (-SELTKS /YES, SET SELECT TIMER DCA I MTIMER JMP I ODISPT /EXIT /OUTPUT DEQUEING DISPATCHER /ENTER WITH LCB POINTERS SET UP /LINE REMOVED FROM Q /AFTER A HEADER IS BUILT, CRC WILL BE CALCULATED AND /TRANSMISSION INITIATED DISPAT, TAD CLRTBL DCA HDR /ASSUME A PROTOCOL MESSAGE (ENQ) DCA CNTH DCA RES DCA NUM /ASSUME THESE FIELDS HAVE FILLS TAD DISPAT DCA CLRMSK /SET MASK CLEARING INSTR UP TAD DJMP DCA OJMPD /SET DISPATCH JMP UP TAD I OUTBTS /NOW SEE IF ANY OUTPUT TO DO SNA DJMP, JMP I ODISPT /JMP IF NOTHING TO IDLE LOOP OSRCH, ISZ OJMPD /PRE INCREMENT BOTH POINTERS ISZ CLRMSK CLL RAR SNL JMP OSRCH /LOOP IF REQUEST NOT SEEN YET CLA CLL /CLEAR ANY REMAINING BITS CLRMSK, 0 /GETS TAD CLRTBL+N AND I OUTBTS DCA I OUTBTS /ZERO OUT THIS (AND POSSIBLY OTHER) REQUEST(S) OJMPD, 0 /GETS JMP I ODISPT+N DOMNT= OJMPD /HANG IF MAINT REQUEST (UNIMPLEMENTED) ODISPT, LSNRDY /EXIT ADDR IF NOTHING DOMNT /MAINT MESSAGE IS HIGHEST PRIORITY DOSTAK /STACK IS NEXT DOSTRT /STRT IS NEXT DONAK /NAK IS NEXT DOREP /REP IS NEXT DOMSG /NUMBERED MESSAGE IS NEXT DOACK /LOWEST OF ALL IS THE ACK CLRTBL, ENQ /UNNUMBERED MESSAGE TYPE IS 'ENQ' -1-NDMNT /CLEARS MAINT REQUEST / -1-NDSTAK-NDSTRT /CLEARS STACK AND ANY BELATED STRT REQS 0 / -1-NDSTRT /CLEARS STRT REQ 0 -1-NDACK-NDNAK /CLEARS NAK AND IMPLIED ACK REQS -1-NDREP /CLEARS REP REQUEST -1-NDMSG-NDACK /CLEARS MESSAGE AND IMPLIED ACK -1-NDACK /CLEARS ACK REQ DOACK, TAD I LSTRCV /SET RES TO LAST MSG RECEIVED DCA RES JMP FNACK /FINISH OFF ACK BUILD DONAK, TAD I RNAK DCA CNTH /STORE REASON FOR NAK IN SUBTYP FIELD DCA I RNAK /ZERO OUT REASON (TO ALLOW ANOTHER) TAD I LSTRCV DCA RES /STORE LAST MESSAGE GOT IN RES FIELD JMP FNNAK /FINISH OFF NAK BUILD DOREP, TAD I LSTSNT /STORE LAST MESSAGE JUST SENT IN NUM FIELD DCA NUM JMP FNREP /FINISH REP BUILD DOSTAK, IAC /SIMPLY STORE MESSAGE TYPE = 7 DOSTRT, TAD (3 /SIMPLY STORE MESSAGE TYPE = 6 FNREP, IAC /REP = 3 FNNAK, IAC /NAK = 2 FNACK, IAC /ACK = 1 DCA CNTL /STORE TYPE CODE JMP I (XMITIT /GO CRC AND START OUTPUT
/HANDLE REQUEST FOR NUMBERED MESSAGES /CODE FOR TAKING MESSAGES BACK HAS BEEN REMOVED DOMSG, / AC0002 /OFFSET TO FUNCTION/CANCEL WORD / TAD I WFTHD / DCA WFTPT / TAD I WFTPT / SPA CLA /SIGN BIT ON IF CANCELED / JMP DOKLG /YES, CANCEL IT BY ADVANCING TO NEXT TAD I WFTHD SNA HLT /CONSISTANCY CHECK THE QUEUE DCA I OUTPKT /MARK BUSY BEING SENT TO INTERLOCK CKACK ROUTINE TAD I OUTPKT TAD (3 /POINT TO DESCRIPTOR DCA DDCMXR TAD I DDCMXR /PICK UP CDF WAITING FOR TRANSMISSION DCA OUTCDF /TO THE OUTPUT INTERRUPT SVC ROUTINE TAD I DDCMXR /PICK UP POINTER DCA OUTPTR TAD I DDCMXR /PICK UP NEG BYTE COUNT DCA OUTCNT /OUT THERE ALSO TAD I WFTHD /CHECK THE THREAD WORD DCA WFTPT /STORE IN TEMP TAD I WFTPT /UPDATE LISTHEAD DCA I WFTHD TAD I LSTSNT /NOW INCREMENT LSTSNT IAC AND (377 /(SINCE WE ARE INCREMENTING WFTHD) DCA I LSTSNT TAD I WFTHD /SEE IF ANOTHER SZA CLA /SKP IF NO MORE TAD (NDMSG TAD I OUTBTS /NOW FLAG ANOTHER REQUEST DCA I OUTBTS JMP I (CRCDAT /AND HANDLE THE CURRENT ONE /DOKLG, TAD I WFTHD /HANDLE MESSAGE CANCELLATIONS BY SKIPPING THEM / DCA WFTPT /WFTPT POINTS AT CURRENT CANCELLED ONE / TAD I WFTPT /GET IT'S THREAD WORD / DCA I WFTHD /NOW STORE IN TRANS HEAD WORD / TAD I WFTPT /SEE IF ANOTHER IN LIST / SZA CLA / JMP DOMSG /TRY AGAIN IF ANOTHER WAITING / JMP I (DISPAT /ELSE RETURN TO DISPATCH SCANNER WFTPT, 0 /TEMP POINTER /BUMP ERRTAB COUNTERS /LINK = 1 IF DOUBLE WORD COUNTER /LINK = 0 IF SINGLE WORD COUNTER TO STICK AT 7777 /CALL+1 = OFFSET TO COUNTER IN ERRTAB BUMP, 0 TAD I BUMP ISZ BUMP TAD I ERRTAB DCA BUMPPT /POINT AT COUNTER (OR LOW PART OF COUNTER) JMS I (ISRCDF /GET OVER INTO ISR FIELD ISZ I BUMPPT JMP BUMPDN /JMP IF NO OVERFLOW SZL /SKP IF SINGLE WORD MODE JMP BUMP2 /ELSE BUMP 2 WORD COUNTER STA /MAKE COUNT STICK DCA I BUMPPT JMP BUMPDN /EXIT BUMP2, ISZ BUMPPT /POINT AT HI ORDER ISZ I BUMPPT NOP BUMPDN, CDF CUR /BACK TO OUR FIELD JMP I BUMP /DONE BUMPPT= WFTPT /REUSE TEMPORARY PAGE
/HALF DUPLEX SUPPORT ROUTINES /SEE IF WE SHOULD TURN LINE AROUND SELCLR, 0 TAD I STATE /CHECK IF HDX LINE AND (HDXFLG SNA CLA JMP I SELCLR /NO, RETURN TAD I STATE AND (SELFLG SZA CLA /SKP IF SELECT NOT SET IN MESSAGE JUST PROCESSED JMP TRNRND /JMP IF WE WERE SELECTED TAD (-SELTKS DCA I MTIMER /RE INIT SELECT TIMER JMP I SELCLR /DONE TRNRND, JMS REQSND /ASSERT REQUEST TO SEND TAD I WFPHD /SEE IF ANY UNACKD MESSAGES CIA TAD I WFTHD SNA CLA JMP I SELCLR /NO, DONE JMS I (SCHOUT /YES, REQUEST A REP NDREP JMP I SELCLR /DONE /SET SELECT BIT IN STATE IF SET IN CURRENT MESSAGE /ALLOWS SAVING ACROSS SOH-DATA RECEIVES SELSET, 0 TAD I STATE /DONT SET IF DOWN TO ALLOW CLEAN STARTUP AND (3 SNA CLA JMP I SELSET /JMP IF DOWN TAD I STATE AND (7777-SELFLG /CLEAR PREV BIT FROM STATE DCA I STATE TAD CNTH /PICK UP BYTE CONTAINING FLAGS AND (SELECT CLL RAR /SHIFT INTO PLACE RTR IFNZRO SELECT%10-SELFLG <__SELECT BIT DEFINED WRONG__> TAD I STATE /PUT IN STATE WORD DCA I STATE JMP I SELSET /DONE /ROUTINE TO ASSERT REQUEST TO SEND IF HDX REQSND, 0 TAD I STATE /CHECK IF HDX AND (HDXFLG SNA CLA JMP I REQSND /NO, RETURN TAD I STATE /CONSISTANCY CHECK IF TRANSMITTER ON AND (XMTFLG+CTSFLG SZA CLA HLT /***TEMPORARY*** DCA I MTIMER /OK, CLEAR SELECT TIMER TAD (XMTFLG+CTSFLG /SAY TRANSMIT BUSY AND EXPECT CTS TAD I STATE AND (7777-OTBTS /BE SURE TIMEOUT BITS CLEARED DCA I STATE TAD I SVCFLD /NOW BUILD CIF INLINE IAC DCA .+1 STRTO2, 0 TAD I (TRNINI /COPY TRANSMIT INITIATOR IN LINE DCA STRTO2 TAD I STRTO2 DCA STRTO2 STA /AC = -1 ON ENTRY FOR RS JMS I STRTO2 /CALL ISR JMP I REQSND /DONE /TEST IF CTS GRANTED FOR HDX /(THIS IS NOT A CLOSED SUBROUTINE) CTLCHK, 0 TAD I STATE /CHECK IF CTS GRANTED AND (CTSFLG SNA JMP I CTLCHK /NO, EXIT CMA AND I STATE /YES, CLEAR IT FROM STATE DCA I STATE JMS I (SCHOUT /ALWAYS REQUEST AN ACK NDACK TAD I MTIMER /CONSISTANCY CHECK TIMER WORD SZA CLA HLT /***TEMPORARY*** JMP I (DISPAT /DONE, EXIT TO DISPAT /SET TIME OF DAY LINE WENT UP SETTIM, 0 TAD (TODL-1 /POINT AT TOD IN EXEC DCA DDCSXR /ADJACENCY OF THESE WORDS ASSUMED! TAD I ERRTAB TAD (ONLINL-1 /POINT AT ENTRY IN TABLE DCA DDCTXR AC7775 /MOVE 3 WORDS DCA CTLCHK SETLP, CDF TAD I DDCSXR /GET WORD FROM FIELD 0 JMS I (ISRCDF DCA I DDCTXR /PUT WORD IN ISR FIELD ISZ CTLCHK JMP SETLP CDF CUR /BACK TO DDCFLD JMP I SETTIM /DONE /CLEAR THE ERROR TABLE /CALLED FROM NSP DEAD-START REQUEST ROUTINE CLRERT, 0 TAD I ERRTAB TAD (NAKHCR-1 DCA DDCTXR /POINT AT ERROR COUNTERS TAD (NAKHCR-RSTSUC DCA CTLCHK JMS I (ISRCDF DCA I DDCTXR /CLEAR THEM OUT ISZ CTLCHK JMP .-2 CDF CUR JMP I CLRERT PAGE
/CRC16 ROUTINE /TECHNIQUE DESCRIBED BY S. WECKER FOR PDP11 /MODIFIED FOR PDP8 BY J. ALDERMAN /MODIFIED FOR 32 WORD TABLE BY J. ROTH 13-APR-75 /MODIFIED FOR KG8E HARDWARE BY J. ROTH 23-NOV-75 /MODIFIED FOR STRAIGHT-LINE CODE SCR 2/77 /GETS ARGUMENT IN THE FORM: /DESCRIPTOR WORD /POINTER TO RESIDUE DOUBLEWORD /DESCRIPTOR FORMAT: /CDF DATA /ADDR-1 DATA /-COUNT DATA /RH DATA CRC /LH DATA CRC /RESIDUE DOUBLEWORD: /RIGHT HALF OF CRC RESIDUE /LEFT HALF OF CRC RESIDUE /SETTING DATA CRC TO 0 CALCULATES CRC /SETTING DATA CRC TO RECEIVED CRC LEAVES RESIDUE IN 'RESIDUE' /AN ERROR HALT IS TAKEN AT "CRCDEB" IF INCORRECT BUFFER CDF SEEN /KG8E IOT'S / KG8E= 6110 /SET TO KG8E IOT SKELETON IFDEF KG8E< RCTV= KG8E+0 /TEST VRC+SKIP RCRH= KG8E+1 /READ HI ORDER BCC RCRL= KG8E+2 /READ LO ORDER BCC RCCV= KG8E+3 /COMPUTE VRC RCGB= KG8E+4 /GENERATE BCC RCLC= KG8E+5 /LOAD CONTROL REGISTER RCCB= KG8E+6 /CLEAR BCC REGISTER RCTC= KG8E+7 /MAINT INSTRUCTION (TEST CLOCK) /TO COMPUTE CRC16, LOAD 0100 INTO CONTROL REG (RCLC) >
/CRC 16 ROUTINE /ENTRY DF = NSPFLD /CALL+1 = ARGUMENT LIST / / SOFTWARE CRC MECHANISM / / XOR INCOMING CHAR WITH CRCLOW PORTION, GIVING MASTER BIT PATTERN / / XOR MASTER BIT PATTERN WITH MASTER*2, GIVING 9 BIT PATTERN / / COLLECT TOTAL PARITY OF MASTER BIT PATTERNS, FROM 252 BITS OF 9 BIT PATTERN / / NEW CRC HIGH PORTION IS TOP 7 BITS OF 9 BIT PATTERN / / NEW CRC LOW PORTION IS BOTTOM 2 BITS OF 9BIT PATTERN, *100, XOR OLD CRCHIGH / / / AFTER ALL CHARACTERS DONE, IF PARITY IS ODD, XOR 300 TO CRC HI, XOR 1 TO CRC LO / / / IMPLEMENTATIOIN DOESN'T FOLLOW THIS EXACT ORDER / CRC16, 0 TAD I CRC16 /GET DESCRIPTOR ADDRESS ISZ CRC16 DCA CRCARG TAD I CRCARG /FETCH ARGUMENT ISZ CRCARG /MOVE POINTER TO NEXT DCA CRCCDF TAD I CRCARG /FETCH ARGUMENT ISZ CRCARG /MOVE POINTER TO NEXT DCA CRCPTR TAD I CRCARG /FETCH ARGUMENT ISZ CRCARG /MOVE POINTER TO NEXT DCA CRCCNT IFNDEF KG8E< IFZERO EAE< DCA CRCHI DCA CRCLO /CLEAR CRC ACCUMULATOR CLL /CLEAR LINK FOR TEST AT CRCLOO+4 DCA CRCPAR /CLEAR PARITY COLLECTOR > IFNZRO EAE< STA /COMPLEMENT OF CRCLO TO MQ MQL STA CLL /LINK CLEAR FOR TEST AT CRCLOO+4 DCA CRCHI /COMPLEMENT OF CRCHI TO CRCHI DCA CRCPAR /CLEAR PARITY COLLECTOR > > IFDEF KG8E< TAD (100 /INIT KG8E HARDWARE OR CRC16 RCLC CLA CLL /RCLC DOESN'T CLEAR AC, FORCE LINK CLEAR RCCB /CLEAR KG8E ACCUMULATOR > / MAIN COMPUTATION LOOP CRCCDF, 0 /PLACE DATA CDF, USE ONCE CRCLOO, ISZ CRCPTR /PRE INDEX THE POINTER. ENTER WITH LINK CLEAR! TAD I CRCPTR /FETCH A CHAR TAD (7400 /CHECK FOR BITS IN POSITIONS 0-3 SZL /SKIP IF NONE. LOOPS TAKE CARE OF 7400 BITS! JMP NOTCHR /SOME ILLEGAL BITS, CHECK FOR CDF / LOOP FOR KG HARDWARE IFDEF KG8E< AND (377 /STRIP THE 7400 BITS FOR KG RCGB ISZ CRCCNT JMP CRCLOO > / SOFTWARE LOOP, NO EAE AVAILABLE IFNDEF KG8E< IFZERO EAE< AND CRCLO /XOR DATA AND LH CRC AC.... /ALSO MUST CLEAR 7400 BITS CLL RAL CIA TAD I CRCPTR TAD CRCLO DCA CRCM /.....GIVING MASTER BIT PATTERN TAD CRCM /OLD HIGH WITH 2 BITS OF 9BIT PATTRN GIVES NEW LOW IFNZRO PDP8E< IAC RTR /NASTY! LINK HAS XOR OF TWO LOW MASTER BITS, AC0 /HAS COMPLEMENT OF LOW BIT. SINCE 9BIT PATTERN NOT /YET, COMPUTED, THIS WILL DO FOR ITS TWO LOW BITS! > IFZERO PDP8E< IAC /MUST SEPARATE FOR OLD MACHINES RTR > SMA CLA /XOR LOW BIT WITH 100 BIT OF CRC HIGH TAD (400 /REMEMBER HI SHIFTED UP 2 TAD CRCHI /BRING IN OLD CRC HIGH AND (774 /KILL TWO LOW GARBAGE BITS AND CARRY SZL /XOR LINK INTO 200 POSITION (SHIFTED) TAD (1000 /200 POSITION ALWAYS 0 CLL RTR /RIGHT JUSTIFY 8 BIT RESULT DCA CRCLO /WHICH IS NEW LOW PORTION TAD CRCM /MAKE 9BIT PATTER FROM MASTER.XOR.MASTER*2 CLL RAL AND CRCM CIA TAD CRCM /MAKING POSITIVE RESULT CLL RAL /SO LINK IS CLEAR FOR CRCLOO+4 TAD CRCM DCA CRCHI /STORE ALL 9 AS HI, INSTEAD OF 7, FIX AT END TAD CRCHI /OVERALL PARITY. NOTE XOR WITH SELF*2 GENERATES AND (252 /PARITY IN THE ALTERNATE BITS! TAD CRCPAR /COLLECTING IN THE 252 BITS AND (252 /REMOVE GARBAGE DCA CRCPAR /SAVE FOR END PROCESSING ISZ CRCCNT /CHAR COUNT, INDEPENDENT OF FIELDS JMP CRCLOO /LOOP IF MORE CHARS TO GO > >
/ SOFTWARE LOOP USING MQ, BUT NOT EAE FUNCTIONS / ACL=7701 / IFNDEF KG8E< IFNZRO EAE< MQA /IOR CHAR WITH COMPLEMENT OF CRCLO /FORCES 7400 BITS TO BE SET CMA /BUILD EQUIVALENCE FOR CHAR AND NOT CRCLO SWP /SAVING BITS FOR MATCHING 0'S IN MQ AND I CRCPTR /HAVING BITS FOR MATCHIN 1'S IN AC MQA /AC NOW HAS CHAR.XOR.LO=MASTER MQL /COPIES TO MQ AND AC ACL /WANT MASTER.XOR.2MASTER CLL RAL /XOR== 2*IOR-OP1-OP2 MQA /HERE IS IOR CMA /LOGICAL SUBTRACT SINCE BIT IS ALWAYS THERE MQA /GIVING -(IOR-MASTER) DCA CRCCDF /TEMPORARY, SAFE SINCE EXECUTED ONLY ONCE ACL /SHIFT DOWN TO GIVE 8 BITS IN AC, ONE IN LINK IFNZRO PDP8E< CLL IAC RAR /IAC BECAUSE OF 1'S AND 2'S COMPLEMENT OPERATION MIX > IFZERO PDP8E< CLL IAC /SEPARATE FOR OLD MACHINE RAR > TAD CRCCDF /COMPLEMENT OF MASTER.XOR.MASTER/2 SZL /SPLIT CASES BY LOWEST BIT JMP CRSIMP /NO XOR OF 100 BIT, SIMPLE CASE CLL CML RAR /NEXT BIT TO LINK, 7 BITS FOR CRCHI IN AC MQL /7 BITS, SAVE A COPY ACL AND (525 /COLLECT PARITY ON ORIGINAL 1,3,5,7,9 BITS TAD CRCPAR /COLLECT 1,3,5,7,9 PARITY AND (525 DCA CRCPAR IFNZRO PDP8E< IAC BSW /GET 100 OCTAL > IFZERO PDP8E< TAD (100 > TAD CRCHI /CRCHI HAS COMPLEMENT OF HI SNL /AC0 AND LINK TELL HOW MUCH TO ADD JMP CR76 /ADD IN -200 SMA TAD (7400 /OR -400 HERE JMP CRJOIN /JOIN OTHER BRANCH TO FINISH CRSIMP, CLL CML RAR /NEXT BIT TO LINK MQL /COMPLEMENT OF NEW CRCHI, 7 BITS ACL AND (125 /COLLECT PARITY. 125 HERE AND 525 ON TAD CRCPAR /OTHER BRANCH 'KNOW' WHAT THE MISSING AND (525 /BIT WAS. NOTE, COMPLEMENT OF 5 BIT NUMBER DCA CRCPAR /CHANGES ITS PARITY, WHICH IS WHY 125 HERE /AND NOT AT OTHER BRANCH. TAD CRCHI /COMPLEMENT OF OLD CRCHI SNL /SKIP IF NO NEED TO CHANGE 200 BIT CR76, TAD (7600 /COMPLEMENT 200 BIT THIS BRANCH. OTHER BRANCH /REJOINS WITH TWO DIFFERENT BIT PATTERNS CRJOIN, SWP /NEW LO IN MQ, NEW HI IN AC , BOTH COMPLEMENTED DCA CRCHI /SAVE COMPLEMENT OF NEW HI CLL /FOR TEST AT CRCLOO+4 ISZ CRCCNT /MORE TO DO JMP CRCLOO /YUP > >
/ FINISH UP CRC COMPUTATION CDF CUR /BACK TO PRESENT FIELD TAD I CRC16 /GET POINTER TO RESIDUE DOUBLE WORD DCA CRCPTR /THIS POINTER WORD NO LONGER USED ISZ CRC16 /POINT AT CALL+3 IFDEF KG8E< RCRL /READ OUT OUR CHECKSUM DCA CRCLO RCRH DCA CRCHI > IFNDEF KG8E< IFZERO EAE< TAD CRCHI /SHIFT OUT 2 LOW IRRELEVANT BITS CLL RAR CLL RAR DCA CRCHI TAD CRCPAR /COLLECT PARITY TAD (146 AND (210 /PARITY IN TWO BITS TAD (170 AND (200 /PARITY IN THE 200 POSITION SNA /SKIP IF MORE WORK TO DO JMP CRDONE RAR /GIVING LITERAL 100 TAD CRCHI /XOR 100 TO CRCHI AND (177 TAD (200 /XOR 200 TO CRCHI, BIT NOT PREVIOUSLY SET! DCA CRCHI /SAVE FINAL RESULT TAD CRCLO /XOR 1 TO CRCLO CLL RAR CML RAL DCA CRCLO /FINAL HERE ALSO > > IFNDEF KG8E< IFNZRO EAE< IFNZRO PDP8E< TAD CRCPAR /5 BITS OF PARITY IN BITS 525 TAD (3463 /3 BITS OF PARITY IN BITS 4104 SPA /COLLECT 4000 BIT ONTO 100 BIT TAD (100 AND (104 /2 BITS OF PARITY IN BITS 104 TAD (74 AND (100 /1 BIT OF PARITY AT 100 SNA /SKIP IF MORE WORK TO DO JMP CRDONE /NO, JUST GIVE BACK RESULT CIA /NEED TO SUBTRACT 100 > IFZERO PDP8E< TAD (7773 /LOOP SO NON-PDP8E CASE FITS DCA CRCCDF /SAFE TEMPORARU TAD CRCPAR /COLLECT PARITY CRCPL, SPA /NEED TO COLLECT THIS BIT TO NEXT IAC /DO SO RTR /SET UP NEXT TEST ISZ CRCCDF /CONTROL JMP CRCPL CRC77, SMA CLA /ODD PARITY CONTINUE TO XOR JMP CRDONE /EVEN, NO FURTHER WORK TAD CRC77 /LITERAL 7700 > TAD CRCHI /COMING IN AS COMPLEMENT! AND (7577 /FORCE OFF 200 BIT DCA CRCHI ACL RAR CML RAL /COMPLEMENT LOW BIT MQL > >
/ RETURN INFORMATION TO CALLER CRDONE=. IFDEF KG8E< TAD I CRCARG /FETCH ARGUMENT ISZ CRCARG /MOVE POINTER TO NEXT CIA TAD CRCLO > IFZERO EAE< IFNDEF KG8E< TAD I CRCARG /FETCH ARGUMENT ISZ CRCARG /MOVE POINTER TO NEXT CIA TAD CRCLO > > IFNZRO EAE< IFNDEF KG8E< ACL TAD I CRCARG /FETCH ARGUMENT ISZ CRCARG /MOVE POINTER TO NEXT CMA /LOW CAME AS ONE'S COMPLEMENT > > DCA I CRCPTR /STORE LH RESIDUE ISZ CRCPTR TAD I CRCARG /FETCH ARGUMENT IFDEF KG8E< CIA TAD CRCHI > IFZERO EAE< IFNDEF KG8E< CIA TAD CRCHI > > IFNDEF KG8E< IFNZRO EAE< TAD CRCHI /COME IN AS COMPLEMENT CMA > > DCA I CRCPTR /STORE RH RESIDUE JMP I CRC16
/ CODE TO ACCESS NEXT FRAGMENT OF FRAGMENTED MESSAGE NOTCHR, TAD (-CDF-7400 /CHECK IF IT IS A CDF AND (7707 /ALL EXCEPT FIELD BITS SZA /SKIP IF OK CRCDEB, HLT /FATAL DATA, BITS IN 0-3 /BUT NOT A CDF TAD I CRCPTR /PLACE THE NEW CDF DCA CRCCDF ISZ CRCPTR /GO GET NEXT DATA POINTER TAD I CRCPTR DCA CRCPTR /STORE, NEEDS AN INCREMENT TO FETCH DATA JMP CRCCDF /SET CDF AND RE-ENTER LOOP / STORAGE AND LITERALS CRCARG, 0 CRCPTR, 0 CRCCNT, 0 CRCHI, 0 IFDEF KG8E< CRCLO, 0 > IFNDEF KG8E< IFZERO EAE< CRCLO, 0 CRCM, 0 > CRCPAR, 0 > PAGE
*HEADPK /ONCE ONLY CODE TO FORMAT THE NODE POOL HEADPK, .+PKSIZE START, TAD FMTPKP TAD FMTSIZ DCA I FMTPKP TAD I FMTPKP DCA FMTPKP ISZ FMTPKC JMP START DCA I FMTPKP JMP ILP FMTSIZ, PKSIZE FMTPKC, -MAXPKT+1 /COUNTER FOR FORMATTING FREELIST .+PKSIZE /SKIP THE THREAD WORD FMTPKP, HEADPK ZBLOCK 12 /PAD OUT TO END OF PACKET /ONCE ONLY CODE TO INITIALIZE THE ISR /RING BUFFERS AND SKIPCHAIN LINKS .+PKSIZE ILP, TAD I IPTR /BUILD CIF ISRFLD IN LINE ISZ IPTR /OFFSET TO INPUT INIT WORD ISZ IPTR SNA JMP NXTISR /IGNORE IF ISR NOT LOADED /DDCMP WILL ALSO BOUNCE REQUESTS FOR THIS LINE IAC /CONVERT TO CIF DCA ICIF TAD I IPTR /NOW PICK UP ENTRY ADDR FOR INITIATOR ICIF, 0 /SET CIF NOW DCA ICIF /STORE ENTRY ADDRESS SKP /SKIP THREAD WORD .+PKSIZE STA /SET AC = INITIALIZE FUNCTION JMS I ICIF /GO INIT IT NXTISR, TAD IDEL TAD IPTR DCA IPTR /ADVANCE TO NEXT LCB ISZ ICTR /TEST COUNT JMP ILP /LOOP IF MORE JMP I .+1 /ELSE GO, WE'RE READY LSNRDY ICTR, -MAXLIN IPTR, LCBTAB .+PKSIZE IDEL, LCBSIZ-2 /DEFINE LINE CONTROL BLOCK SKELETONS HERE *LCBTAB / ZBLOCK MAXLIN^LCBSIZ *LCBTAB+22 IFNZRO MAXLIN&10 < DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 > IFNZRO MAXLIN&4 < DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 > IFNZRO MAXLIN&2 < DDCBGN;*.+LCBSIZ-1 DDCBGN;*.+LCBSIZ-1 > IFNZRO MAXLIN&1 < DDCBGN;*.+LCBSIZ-1 > PAGE $$$$$$



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search