File KL8ISR.PA (PAL assembler source file)

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

/DECNET/8 V1A KL8J, KL8M AND KL8A INTERRUPT SERVICE ROUTINE
	IFDEF DDCMP <XLIST>
/
/
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  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.
/
/
/
/
/
/
/
/
/
/
	IFDEF DDCMP <XLIST>

/J. ROTH 26-APR-76 /JR 20-OCT-76 ADDED MODEM CONTROL /JR 9-NOV-76 ADDED HALF DUPLEX SUPPORT / / DECNET/8 RELEASE VERSION 1 / DECNET/8 PATCH LEVEL A / APRIL 8,1977 / VERSION=01 PATCH="A / / / IF ONLY ONE KL8J (OR KL8A) COMMUNICATION LINE IS PRESENT, / THEN THE FOLLOWING PARAMETERS CAN BE EDITED / DIRECTLY INTO THIS SOURCE, IN WHICH CASE, / NO LINE CONTROL FILE IS NECESSARY. / ALTERNATIVELY, A LINE CONTROL FILE CAN BE CREATED WHICH / HAS THESE EQUATES. / / LINE= /DDCMP LINE NUMBER / ISRFLD= /FIELD OF THIS ISR (TIMES 10) / ISRLOC= /STARING ADDRESS OF THIS ISR / BUFFLD= /FIELD OF BUFFER / BUFLOC= /LOCATION OF ISR BUFFER / BUFLEN= /LENGTH OF BUFFER IN WORDS / ISRDEV= /KL8JA DEVICE CODE OR KL8A LINE NUMBER+100 /E.G. 31 FOR KL8J (IOT 6310) / 102 FOR KL8A LINE 2 / KLMDEV= /KL8M DEVICE CODE FOR MODEM CONTROL / KL8AMD= /KL8A MODEM CONTROL SERVICE FOR LINE 3 IF SET TO 1 / KL8HDX= /DEFINE EQUAL TO 1 IF HDX SUPPORT NEEDED / PSEUDO= /DEFINE EQUAL TO 1 IF PSEUDO HALF DUPLEX MODEM / TASK= /DEFINE IF PSEUDO HDX MODEM / INIWT= 0 /DEFINE IF PSEUDO HDX MODEM
/THE FOLLOWING LIST SUMMARIZES THE DEVICE DEPENDANT PARAMETERS /AND OPTIONS AVAILABLE FOR THE KL8ISR. /NOTE THAT PARAMETERS NOT RELATED TO THE OPTION YOU SELECT /MUST BE LEFT UNDEFINED. (NOT SET TO 0, FOR EXAMPLE) /1 FULL DUPLEX KL8JA OR KL8E WITHOUT MODEM CONTROL /THIS OPTION IS USED FOR LOCALIZED INTERMACHINE CONNECTIONS /VIA A DIRECT WIRE. A NULL MODEM MAY BE USED. /ISRDEV=XX WHERE XX IS THE KL8JA OR KL8E RECEIVER DEVICE / CODE. THE TRANSMITTER CODE IS ASSUMED TO BE ONE GREATER. /2 FULL DUPLEX KL8A WITHOUT MODEM CONTROL /THIS OPTION IS USED AS ABOVE, BUT WITH THE PDP8A 4 LINE MULTIPLEXOR /ISRDEV=100+X WHERE X IS A KL8A LINE NUMBER. X BEGINS AT 0 AND / RANGES FROM 0-3 FOR THE FIRST KL8A BOARD, / 4-7 FOR THE SECOND AND SO ON. /NOTE THAT YOU MUST ASSEMBLE RTS/8 WITH THE KL8A SUPPORT /OPTION IF YOU SELECT THIS FEATURE. /3 FULL DUPLEX KL8JA WITH KL8M MODEM CONTROL OPTION /THIS OPTION IS USED WITH FULL DUPLEX ASYNCHRONOUS MODEMS /SUCH AS BELL 103 SERIES FOR DIAL UP OPERATION OR /202 FOR FOUR WIRE LEASED LINE OPERATION /ISRDEV=XX DEFINE AS YOU WOULD IN CASE 1 /KLMDEV=YY DEFINE THE DEVICE CODE FOR YOUR KL8M INTERFACE /THIS ISR ALWAYS ASSERTS REQUEST TO SEND AND DATA TERMINAL READY WITH /THIS OPTION. IN ADDITION, THIS ISR DOES NOT USE THE RING DETECTED /SIGNAL. YOUR MODEM SHOULD BE STRAPPED TO AUTO ANSWER IF DIAL UP OPERATION /IS DESIRED. /4 FULL DUPLEX KL8A WITH MODEM CONTROL (LINE 3 OPTION) /THIS OPTION IS USED AS IN CASE 3, EXCEPT THE PDP8A 4 LINE MULTIPLEXOR /IS USED. NOTE THAT ONLY LINE 3 ON THE KL8A INTERFACE /HAS MODEM CONTROL FEATURES. /ISRDEV=100+X WHERE X IS A MODEM CONTROLLED LINE ON YOUR KL8A / X MUST BE 3, 7, OR 13, ETC. /KL8AMD=1 THIS FLAG INDICATES THAT LINE 3 MODEM CONTROL IS DESIRED
/5 HALF DUPLEX KL8JA+KL8M OR KL8A /THIS OPTION PROVIDES HALF DUPLEX ASYNCHRONOUS OPERATION /ON A MODEM CONTROLLED LINE. /KL8HDX=1 YOU MUST SET THIS FLAG TO REQUEST HDX FEATURES /YOUR HALF DUPLEX MODEM (SUCH AS 202 SERIES) SHOULD BE STRAPPED /FOR A FAIRLY LONG (APPROX 200 MSEC) TURN AROUND DELAY TO AVOID PROBLEMS /WITH LONG LINES ECHO SUPPRESSORS AND TO ALLOW RESPONSE /MESSAGES TO ACCUMULATE FROM NSP. NORMALLY, IN THE ABSENCE OF /TRAFFIC, DDCMP CONTINUOUSLY TURNS THE LINE BACK AND FORTH SENDING ACK MESSAGES /UNTIL DATA NEEDS TO BE SENT. A MODERATE CLEAR TO SEND DELAY /REDUCES SUCH OVERHEAD WITHOUT SERIOUSLY IMPAIRING /DATA THROUGHPUT. /IN THIS MODE DDCMP CONTINUOUSLY ASSERTS DATA TERMINAL READY. /IF DIAL UP OPERATION IS DESIRED, YOU SHOULD STRAP THE MODEM /FOR AUTO ANSWER SERVICE. NOTE THAT MOST MODEMS WILL RELEASE AN /INCOMING LINE WHEN AN OPEN CIRCUIT INTERVAL IS DETECTED (SUCH AS /WHEN THE CALLING PARTY HANGS UP) THIS ISR DOES NOT USE THE /RING DETECTED FLAG FROM THE MODEM. /6 HALF DUPLEX PSEUDO ISR (PRIMARILY FOR DEC IN-HOUSE TESTING) /THIS ISR OPERATES WITHOUT A PHYSICAL MODEM (AS IN OPTIONS /1 AND 2) BUT INCORPERATES A MINIATURE TASK WHICH SIMULATES A PHYSICAL /MODEM WITH CLEAR TO SEND DELAYS. /KL8HDX=1 SET THIS FLAG TO REQUEST HALF DUPLEX FEATURES /PSEUDO=1 THIS FLAG IS DEFINED TO REQUEST THE PSEUDO MODEM /TASK=KLTSK1 THIS PARAMETER MUST DEFINE THE TASK NUMBER FOR THE / PSEUDO TASK. THIS TASK NUMBER SHOULD BE DEFINED IN YOUR / RTS/8 PARAMETER FILE THE SAME AS ANY NORMAL TASK /INIWT=0 THIS SETS THE INITIAL WAIT STATE FOR YOUR TASK /THE PSEUDO TASK IS MAINLY FOR HALF DUPLEX CHECKOUT ON A LOCAL SYSTEM
/DEFAULT DEFINITIONS IFNDEF NOMAP <NOMAP=0> IFNDEF LINE <LINE=0> IFNDEF BUFFLD <BUFFLD=10> IFNDEF BUFLOC <BUFLOC=4000> IFNDEF ISRDEV <ISRDEV=36> IFNDEF KL8AMD <KL8AMD=0> IFNDEF BUFLEN <BUFLEN=176> IFNDEF ISRFLD <ISRFLD=10> IFNDEF ISRLOC <ISRLOC=200> ISRIOT=ISRDEV IFNZRO ISRIOT&6000 <ISRIOT=ISRIOT&770%10> ISRTYP= 1 /DEFINE KL8JA/KL8E ASYNC TYPE IFNZRO ISRIOT&100 <ISRTYP=2> /? KL8A TYPE IFDEF KLMDEV <ISRTYP=3> CUR= ISRFLD KL8J= ISRIOT / 'ISRIOT' DEFINES DEVICE CODE FOR READ FUNCTION. / DEVICE CODE FOR WRITE FUNCTION MUST BE ONE HIGHER. LCB= LINE^LCBSIZ+LCBTAB
/SYMBOLIC CHARACTER DEFINITIONS 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 QSYNC= 100 SELECT= 200 /TIMER TICKS AND THRESHOLD COUNTS THRVAL= 12 /INIT VAL OF THRESHOLD COUNTERS TSYNCS= 4 /NUMBER OF LEADING SYNCS TO SEND MAXREP= 12 /MAX OF 10. CONSEC REPS BEFORE FAILURE MAXSTR= 12 /MAX CONSEC STRTS BEFORE FAILURE ACKTKS= 12 /TIMER TICKS BFORE ANOTHER ACK REQUESTED QTMTKS= 144 /TIMER TICKS BETWEEN IDLING REPS CHRTKS= 2 /TICKS BETWEEN CHARACTERS /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= 22 /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 HDXFLG= 10 /SET IF THIS LINE IS HDX CTSFLG= 1000 /SET IF CTS INTERRUPT EXPECTED /IOT DEFINES IFZERO ISRIOT&100 < KSF1= ISRIOT^10+6001 KRB1= ISRIOT^10+6006 TSF1= ISRIOT^10+6011 TCF1= ISRIOT^10+6012 TSK1= ISRIOT^10+6015 / PDP-8/E ONLY TLS1= ISRIOT^10+6016 > IFNZRO ISRIOT&100 < IFNDEF KL8ADV <KL8ADV=40> TLS1= KL8ADV^10+6004 > FIELD CUR%10
IFDEF KLMDEV < /KL8M IOT DEFINES MCCI= KLMDEV^10+6000 /CLEAR INTERFACE MCLC= KLMDEV^10+6001 /LOAD AC0-3 TO CONTROL REGISTER MCST= KLMDEV^10+6002 /LOAD AC4 TO SECONDARY TRANSMIT REGISTER MCRF= KLMDEV^10+6003 /SKIP ON RING FLAG AND CLEAR IT MCSS= KLMDEV^10+6004 /SKIP ON SECONDARY TRANSMIT FLAG AND CLEAR IT MCSC= KLMDEV^10+6005 /SKIP ON CARRIER INTERRUPT FLAG AND CLEAR IT MCSR= KLMDEV^10+6006 /SKIP ON SECONDARY RECEIVE FLAG AND CLEAR IT MCRS= KLMDEV^10+6007 /READ STATUS REGISTER INTO AC /KL8M CONTROL REGISTER DEFINES MINTEN= 4000 /SET TO ENABLE INTERRUPTS RS= 2000 /SET TO ASSERT REQUEST TO SEND DTR= 1000 /SET TO ASSERT DATA TERMINAL READY SPDSEL= 400 /SET STATE OF CH/CI SPEED SELECT CKT SECXMT= 200 /SET TO TURN ON SECONDARY TRANSMIT CKT CARINT= 100 /CARRIER CHANGED STATE INTERRUPT SECINT= 40 /SECONDARY RECEIVE INTERRUPT CTSINT= 20 /CLEAR TO SEND INTERRUPT DSTAT= 10 /DATA SET READY FLAG CSTAT= 4 /CARRIER RECEIVED FLAG SRSTAT= 2 /SECONDARY RECEIVE FLAG CTSTAT= 1 /CLEAR TO SEND STATUS FLAG > IFNZRO KL8AMD< /SPECIAL KL8A MODEM CONTROL IOTS FOR LINE 3 MCCD= KL8ADV^10+6010 /CLEAR DEVICE MSLC= KL8ADV^10+6011 /LOAD LINE 3 CONTROL REGISTER MSLB= KL8ADV^10+6012 /LOAD BRANCH ADDRESS REGISTER MSSB= KL8ADV^10+6013 /SKIP OF RING INTERRUPT AND CLEAR IT MSSS= KL8ADV^10+6014 /SKIP IF CLEAR TO SEND INTERRUPT AND CLEAR IT MSSC= KL8ADV^10+6015 /SKIP IF CARRIER INTERRUPT AND CLEAR IT MSSV= KL8ADV^10+6016 /SKIP IF SECONDARY RECEIVE INTERRUPT AND CLEAR IT MSRB= KL8ADV^10+6017 /READ STATUS REGISTER B INTO AC /STATUS REGISTER B BIT DEFINES CTS= 4000 /CLEAR TO SEND LINE RS= 2000 /SET TO REQUEST TO SEND DTR= 1000 /SET TO SAY DATA TERMINAL READY SPDSEL= 400 /SET STATE OF CH/CI SPEED SELECT LINE SECXMT= 200 /SET TO TURN ON SECONDARY TRANSMIT CHANNEL CARINT= 100 /CARRIER INTERRUPT FLAG SECINT= 40 /SECONDARY RECEIVE INTERRUPT FLAG CTSINT= 20 /CLEAR TO SEND INTERRUPT FLAG DSTAT= 10 /DATA SET STATUS LINE CSTAT= 4 /CARRIER STATUS LINE SRSTAT= 2 /SECONDARY RECEIVER STATUS LINE INTEN= 1 /INTERRUPT ENABLE LINE >
/OUTPUT INITIATOR /ENTRY DF = DDCFLD *ISRLOC STRTO, 0 SZA CLA IFNDEF KL8HDX <HLT> /UNREACHABLE IN FDX IFDEF KL8HDX <JMP I (HDXRS /ASSERT RS IF AC = -1> TAD OUTMVI DCA OUTMV /SET UP PARAMETER COPY LOOP TAD HDRSTI DCA HDRSTR TAD (HDRBUF-OUTCNT-1 HDRSTI, DCA OUTHCT OUTMVL, ISZ OUTMV /BUMP SOURCE PTR ISZ HDRSTR /BUMP TARGET PTR OUTMV, 0 /TAD I OUTTBL+N HDRSTR, 0 /DCA HDRBUF+N ISZ OUTHCT /BUMP COUNT JMP OUTMVL /LOOP IF MORE TAD (-TSYNCS /PICK UP NUMBER OF LEADING SYNCS DCA OUTHCT /STORE IN COUNTER TAD (TSYNBG /INIT COROUTINE ENTRY POINT DCA PCH IFZERO ISRIOT&100 < TAD (DEL> /SEND THE FIRST CHAR IFNZRO ISRIOT&100 < TAD (ISRIOT&77^400+DEL> TLS1 /INTERRUPTS WILL PROPAGATE THE REST OUTXIT, CLA CLL /CLEAN UP CIF CDF DDCFLD /BACK TO DDCFLD JMP I STRTO
/TRANSMITTER INTERRUPT LEVEL CODE TSYNL, TAD (DEL JMS PCH /SEND ANOTHER SYN TSYNBG, ISZ OUTHCT /BUMP COUNTER JMP TSYNL /LOOP IF MORE TAD (-10 /ELSE INIT HEADER COUNT DCA OUTHCT TAD TADHDR DCA HDRTAD /INIT PICKUP INSTR HDRTAD, 0 /TAD HDRBUF+N JMS PCH /SEND THE CHAR ISZ HDRTAD ISZ OUTHCT JMP HDRTAD TADHDR, TAD HDRBUF /SEE WHAT WE SENT TAD (-ENQ SNA CLA /SNA IF NOT ENQ JMP TXFIN /ELSE WE'RE COMPLETE TAD OCDF DCA OUTCD /INIT BUFFER CHAINING CDF INSTR INLINE
/CHAINED BUFFER TRANSMIT CODE OUTCD, 0 /SET TO CDF BUFFLD ISZ OUTPTR /PRE INCREMENT POINTER TAD I OUTPTR SMA /SMA IF CDF LINK JMP OUTGTC /ELSE GOT A CHAR DCA OUTCD /STORE INLINE ISZ OUTPTR TAD I OUTPTR /NOW GET THE NEW PTR ADDR DCA OUTPTR JMP OUTCD /ITERATE OUTGTC, CDF DDCFLD /GOT A CHAR, BACK TO DDCFLD JMS PCH /SEND IT OUT ISZ OUTCNT JMP OUTCD /LOOP IF MORE TAD DCRCL /NOW SEND BCC CHARS JMS PCH TAD DCRCH JMS PCH TXFIN, IFDEF KL8HDX <JMP I (HDXCS /CHECK IF SELECT SET> /FALL INTO OUTPUT POST CODE OPOST, TAD I (ATNINP/STORE THIS LINE'S NUMBER IN THE Q DCA ATNPTR TAD (LINE DCA I ATNPTR TAD ATNPTR IAC AND (7767 /BUMP PTR MOD 10 DCA I (ATNINP /RESTORE IT JMP PCHDS /NOW POST AND DISMISS /TRANSMIT INTERRUPT COROUTINE PCH, PCHDS+1 IFNZRO ISRIOT&100 < AND (377 /PROTECTION TAD (ISRIOT&77^400 > TLS1 PCHSKP, SKP CLA PCHDS, TAD (DDCEF CIF POSTDS /DISMISS INTERRUPT NXTDV2, IFZERO ISRIOT&100 < 0;0 /SKIPCHAIN LINKAGE TSF1 /CHECK FLAG JMP I NXTDV2 /NOT US TCF1 /OK, CLEAR LFAG > CIF CUR /RESET IF,DF CDF DDCFLD OUTMVI, TAD I PLCB4 /SEE IF LINE IDLE RTR SMA SNL CLA JMP PCHSKP /JMP IF STATE=0 TO AVOID BUFFER RELEASE RACE JMP I PCH /RETURN
/INTERRUPT LEVEL DATA ATNPTR, /TEMP PTR OUTHCT, 0 /TEMPORARY COUNTER (MUST PRECEDE HDRBUF) HDRBUF, 0 0 0 0 0 0 CRCL, 0 CRCH, 0 DCRCL, 0 DCRCH, 0 OCDF, 0 OUTPTR, 0 OUTCNT, 0 /TABLE TO MAP OUTPUT MESSAGE TO HDRBUF PLCB4, LCB+4 /MUST PRECEDE OUTTBL OUTTBL, OHDR /OHDR OHDR+1 /OCNTL OHDR+2 /OCNTH OHDR+3 /ORES OHDR+4 /ONUM OHDR+5 /OA0 OCRCL /OCRCL OCRCL+1 /OCRCH ODCRCL /ODCRCL ODCRCL+1 /ODCRCH OUTCDF /OUTCDF OUTCDF+1 /OUTPTR OUTCDF+2 /OUTCNT PAGE
/RECEIVER RESYNCH CODE /LOOKS FOR AT LEAST 1 DEL TO ACHIEVE FRAMING RES1, JMS I (GCH /GET NEXT CHAR FROM SKIPCHAIN ROUTINE RES5, TAD (-DEL /SEE IF SYN SZA CLA JMP RES1 /NO, RESET SYNC COUNT TAD DDCPT /IN CHAR SYNC NOW, SEE IF NODE ASSIGNED SZA CLA JMP RES6 /YES, GET THE HEADER TAD I (FREHD /NO, ASSIGN ONE NOW SNA /SNA IF ANYTHING TO ASSIGN JMP RES1 /ELSE STALL BY SYNCING AGAIN (**TEMP**) JMS SETBF /SET IT UP NOW RES6, TAD DDCEP /MAKE SURE DDCPTR INITIALIZED IAC DCA DDCPTR /(IN CASE IF RESYNC CALL DURING DATA) RES3, JMS I (GCH /GET NEXT CHAR RES4, TAD (-DEL SNA /SNA IF NOT EXTRA SYN JMP RES3 /ELSE JUT TOSS IT TAD (DEL-ENQ /SEE IF ENQ SNA JMP GOTENQ /YES TAD (ENQ-SOH /CHECK IF SOH SNA JMP GOTSOH /YES TAD (SOH-DLE /CHECK IF DLE SNA CLA JMP GOTDLE /YES JMP RES1 /RESYNC NOW
/LOW LEVEL HEADER CHECK CODE /ACQUIRES HEADER, PASSES TO DDCMP GOTENQ, TAD (ENQ /FIRST STORE ENQ JMS DDCPUT JMS I (GETHDR /NOW PICK UP HEADER PSTMSG, JMS LINKBF /LINK THIS NODE ON DDCMP'S INPUT Q TAD (DDCEF /NOW POST Q EF JMS I (GCH JMP RES4 /LOOP WITH ANOTHER CHAR GOTDLE, TAD (DLE-SOH /BIAS FOR BOOT MESSAGE GOTSOH, TAD (SOH /STORE SOH FIRST JMS DDCPUT JMS I (GETHDR /NOW GET REST OF HEADER AC0002 /OFFSET TO COUNT BYTES TAD DDCEP DCA DDCPTR TAD I DDCPTR /PICK UP LOW BYTE DCA T1 /STORE IN TEMP ISZ DDCPTR TAD I DDCPTR /LOOK AT NEXT AND (7774-QSYNC-SELECT /IGNORE CONTROL BITS SZA CLA JMP MS2LNG /FORMAT ERROR IF TOO BIG - 10 BIT COUNT MAX TAD I DDCPTR AND (7777-QSYNC-SELECT /GET REST OF COUNT CLL RTR RTR RAR TAD T1 /SHIFT AND PUT IN PLACE SNA JMP MS2LNG /ERROR IF ZERO CIA /MAKE NEGATIVE COUNT CDF CUR /FUDGE DF DCA I (INCNT /STORE IN DATA BUFF ROUTINE CDF DDCFLD JMS LINKBF /LINK ON THE Q TAD (DDCEF JMS I (GCH /POST DDCMP JMP I (STRTDT /ENTER BUF LOOP WITH FIRST CHAR IN AC MS2LNG, JMP RES1 /**DEBUG** T1, 0
/ROUTINE TO LINK NODE IN DDCMP INPUT Q /ENTRY AC = ERROR STATUS (IF ANY) LINKBF, 0 TAD (LINE /MULTIPLEX IN LINE NUMBER TO RH DCA I DDCEP /STORE ERROR STATUS DCA I DDCPT /CLEAR THREAD WORD TAD I (DDCTL /GET TAIL POINTER TO A TEMP DCA S1 TAD DDCPT /NOW STORE CURRENT PACKET VIA TAIL PTR DCA I S1 TAD DDCPT DCA I (DDCTL /UPDATE TAIL POINTER IN DDCFLD NOW TAD I (FREHD /SEE IF ANOTHER PACKET AVAILABLE SZA JMP GOT1 /OK IF ONE TO ASSIGN HLT /TEMP HLT** GOT1, JMS SETBF /SET BUFFER UP JMP I LINKBF /DONE /ROUTINE TO SETUP BUFFER POINTERS PRIOR TO USE /ENTRY AC = ADDRESS OF PACKET TO USE SETBF, 0 DCA DDCPT /STORE NODE ADDRESS TAD DDCPT IAC DCA DDCEP /STORE POINTER TO ERROR/LINE WORD DCA I DDCEP /INIT CLEAR IT TAD DDCEP IAC DCA DDCPTR /INIT WORK PTR TAD I DDCPT /UNLINK FROM FREELIST NOW DCA I (FREHD /BY UPDATING HEAD POINTER JMP I SETBF /DONE
/STORE AND INDEX ROUTINE DDCPUT, 0 DCA I DDCPTR ISZ DDCPTR JMP I DDCPUT /FAIR ENOUGH? DDCPT, 0 DDCEP, 0 DDCPTR, 0 S1, 0 PAGE
/LOOP TO STORE USER DATA STRTDT, DCA CHAR /STORE CHAR PASSED IN AC TAD BUFCDF /NOW PUT BUFFER MARK IN THE NODE JMS I (DDCPUT TAD BUFPTR JMS I (DDCPUT TAD INCNT /ALSO PASS NEG COUNT JMS I (DDCPUT /DOING THIS NOW SPREADS INTERRUPT LEVEL /COMPUTATION OVER 2 CHARACTER TIMES... JMP BONHED /JUMP INTO THE LOOP DATALP, JMS GCH DCA CHAR /STORE NEXT CHAR BONHED, TAD I (LCB+20 DCA SVPT /STORE BUFFER MARK FOR WRAP AROUND CHECK BUFCDF, CDF BUFFLD /ENTER BUFFER DF ISZ BUFPTR /PRE INCREMENT POINTER / NOP TAD I BUFPTR CMA /SEE IF EMPTY, CDF OR BUSY SNA JMP MTSLOT /-1 MEANS AVAIL LOC SPA SNA CLA JMP BUFOVR /NEGATIVE MEANS IN USE TAD I BUFPTR /ELSE IT'S A CDF LINK DCA BUFCDF /SO STORE IT ISZ BUFPTR /BUMP PTR / NOP TAD I BUFPTR /PICK UP NEW PTR DCA BUFPTR /STORE IT JMP BUFCDF /TRY AGAIN MTSLOT, TAD BUFPTR /NOW DO WRAP AROUND CHECK CIA TAD SVPT SNA CLA JMP BUFOVR /JMP IF FAILED TAD CHAR /GET CHAR BACK DCA I BUFPTR /STORE IT CDF DDCFLD /BACK TO NET FIELD ISZ INCNT /CHECK COUNT JMP DATALP /LOOP IF MORE JMS GCH /NOW GET BLOCK CHECK CHARS JMS I (DDCPUT JMS GCH JMS I (DDCPUT TAD BUFCDF JMS I (DDCPUT /NOW STORE NEW BUFFER MARK TAD BUFPTR JMS I (DDCPUT JMP I (PSTMSG /POST MESSAGE COMPLETE BUFOVR, CDF DDCFLD /FIX BUFFER OVER FLOW BUG STA /REALIGN POINTER TAD BUFPTR DCA BUFPTR TAD (BFOERR JMS I (LINKBF /LINK ON THE QUEUE TAD (DDCEF JMP IGNORE /GO INTO IGNORE MODE BUFPTR, BUFLOC-1 CHAR, 0 INCNT, 0 SVPT, 0
/ROUTINE TO READ HEADER CHARS TO NODE GETHDR, 0 TAD (-7 /7 CHARACTERS DCA INCNT GETHLP, JMS GCH JMS I (DDCPUT /STORE IT ISZ INCNT JMP GETHLP /LOOP IF MORE JMP I GETHDR /DONE
/RECEIVER INTERRUPT SERVICE INITIATOR /ENTRY AC = FUNCTION / -1: SKIPCHAIN AND BUFFER INIT / 0: ENTER RESYNC MODE / 1: ENTER INHIBIT MODE /ENTRY DF = DDCFLD STRTI, 0 SNA JMP RESFUN /RESYNC FUNCTION SMA CLA JMP INHFUN /INHIBIT FUNCTION /INIT FUNCTION JMS I (CLRBUF /GO CLEAR BUFFER IFZERO ISRIOT&100 < CAL /NOW INSERT THE SKIPS SKPINS NXTDEV CAL SKPINS NXTDV2 > IFNZRO ISRIOT&100 < CIF 0 CDF CUR IOF TAD (ISRIOT&77^4 JMS I (KL8ACT NXTDEV NXTDV2 > IFDEF KLMDEV < CAL /NOW INSERT SKIP CHAIN ENTRY FOR KL8M SKPINS NXTDV3 MCCI /CLEAR AND INITIALIZE THE DEVICE IFNDEF KL8HDX < TAD (MINTEN+RS+DTR /ENABLE INTERRUPTS> IFDEF KL8HDX < TAD (MINTEN+DTR /DONT SET RS IF HDX> MCLC /AND SAY DATA TERMINAL READY AND REQUEST TO SEND CLA CLL > IFNZRO KL8AMD< CAL SKPINS NXTDV3 IFNDEF KL8HDX < TAD (RS+DTR /ASSERT REQUEST TO SEND AND DATA TERMINAL READY> IFDEF KL8HDX < TAD (DTR /ONLY ASSERT DTR IF HDX> MSLC CLA CLL > STRTIX, CIF CDF DDCFLD /GET SET TO RETURN JMP I STRTI
/RESYNC MODE FUNCTION RESFUN, TAD I (LCB+20 DCA BUFPTR TAD I (LCB+21 DCA BUFCDF TAD (RES5 DCA GCH JMP STRTIX /DONE /INHIBIT INPUT FUNCTION INHFUN, TAD (IGNORE+1 DCA GCH /SET INT RTN TO IGNORE ALL TAD BUFPTR DCA I (LCB+20 /PASS BUFFER POINTER IN LCB FOR 'PURGE' TAD BUFCDF DCA I (LCB+21 JMP STRTIX /DONE
/RECEIVER SKIPCHAIN COROUTINE IGNORE, JMS GCH /INHIBIT LOOP GCHIGN, SKP CLA /JUST TOSS IT GCH, RES5 /INIT IN SYNC MODE GCHDS, CIF POSTDS NXTDEV, IFZERO ISRIOT&100 < 0;0 KSF1 /CHECK FLAG JMP I NXTDEV CIF CUR KRB1 > CDF DDCFLD /BE SURE DF = DDCFLD AND (377 /JUST IN CASE AND ALSO TO KILL KL8A ERROR BITS IFDEF KL8HDX < GCHSWT, NOP /SKP/NOP SWITCH IN HDX > JMP I GCH /RETURN WITH CHAR IN AC IFDEF KL8HDX < JMP GCHIGN /IGNORE IF TRANSMITTING > PAGE
CLRBUF, 0 CLRCDF, CDF BUFFLD STA /FIRST STORE -1 IN ALL BUF LOCS DCA I CLR1 ISZ CLR1 / NOP ISZ CLR2 JMP CLRCDF /CLEAR ANOTHER TAD CLRCDF /NOW SET THE WRAP AROUND CDF DCA I CLR1 ISZ CLR1 TAD (BUFLOC-1 DCA I CLR1 /FINALLY THE ADDR-1 / CDF CUR JMP I CLRBUF /DONE CLR1, BUFLOC CLR2, -BUFLEN+2
/PSEUDO HALF DUPLEX MODEM TASK IFDEF PSEUDO < START, CAL /WAKE UP WHEN REQUEST TO SEND OCCURS WAITE KL8EF CAL /SET TIMER FOR 200 MSEC TURNAROUND SENDW CLOCK KL8TIM CIF CUR /DISABLE INTERRUPTS CDF DDCFLD /GET INTO DDCMP FIELD TAD I (ATNINP /PICK UP RING BUFFER POINTER DCA CTSPTR /STORE ON-PAGE TAD (LINE DCA I CTSPTR /STORE LINE IN QUEUE TAD CTSPTR IAC /BUMP POINTER AND (7767 /MOD SIZE OF BUFFER DCA I (ATNINP TAD (DDCEF /NOW WAKE UP DDMCP CAL POST CDF DDCFLD ISZ KL8EF /MAKE EF BUSY AGAIN JMP START /LOOP FOR NEXT REQUEST TO SEND CTSPTR, 0 KL8EF, 1 KL8TIM, ZBLOCK 3 0 0;SHERTZ%5 /200 MSEC INTERVAL >
/MODEM CONTROL SKIP CHAIN MODULES IFDEF KLMDEV < NXTDV3, 0;0 MCRF /SKIP AND CLEAR RING FLAG NOP MCSR /SKIP AND CLEAR SECONDARY RECEIVE INTERRUPT NOP MCSC /SKIP AND CLEAR CARRIER INTERRUPT NOP MCSS /SKIP AND CLEAR CLEAR TO SEND FLAG JMP I NXTDV3 IFNDEF KL8HDX < JMP I NXTDV3 /RETURN> IFDEF KL8HDX < CIF CDF CUR CDF DDCFLD TAD I (LCB+4 /LOOK AT STATE AND (CTSFLG /IS CTS EXPECTED? SNA CLA JMP I (GCHDS /NO, IGNORE IT MCRS /YES, READ STATUS RAR SNL CLA /CTS BIT TO LINK JMP I (GCHDS /IGNORE IF NOT UP JMP I (OPOST /POST DDCMP IF SET> > IFNZRO KL8AMD < NXTDV3, 0;0 MSSB /SKIP IF RING SET AND CLEAR IT NOP MSSV /SKIP IF SECONDARY RECEIVE INTERRUPT AND CLEAR IT NOP MSSC /SKIP IF CARRIER INTERRUPT AND CLEAR IT NOP MSSS /SKIP IF CLEAR TO SEND INTERRUPT AND CLEAR IT JMP I NXTDV3 IFNDEF KL8HDX < JMP I NXTDV3 /RETURN> IFDEF KL8HDX < CIF CDF CUR CDF DDCFLD TAD I (LCB+4 AND (CTSFLG SNA CLA JMP I (GCHDS MSRB /READ STATUS BITS TO AC SMA CLA /CTS IS SIGN BIT JMP I (GCHDS /IGNORE IF NOT CTS JMP I (OPOST /POST DDCMP IF CTS GOTTEN > > IFDEF KL8HDX < /ROUTINE TO HANDLE SELECT BIT AT END OF MESSAGE HDXCS, CDF CUR TAD I (HDRBUF+2 /LOOK AT SELECT BIT CDF DDCFLD AND (SELECT SNA CLA JMP I (OPOST /NOT ON, JUST POST DDCMP TAD (DEL JMS I (PCH /FLUSH OUT UART NOW TAD (DEL JMS I (PCH IFDEF KLMDEV < TAD (MINTEN+DTR /NOW TURN OFF RS MCLC> IFNZRO KL8AMD < TAD (DTR /NOW TURN OFF RS MSLC> CLA CLL CDF CUR TAD (NOP /RE ENABLE RECEIVER NOW DCA I (GCHSWT CDF DDCFLD /RESTORE DF JMP I (OPOST /NOW POST IT /ROUTINE TO HANDLE HDX REQ TO SEND COMMAND HDXRS, CIF CUR /INHIBIT INTERRUPTS TAD I (LCB+4 /CONSISTANCY CHECK COMMAND AND (CTSFLG SNA CLA HLT /***TEMPORARY*** IFDEF KLMDEV < TAD (MINTEN+RS+DTR /ASSERT RS MCLC> IFNZRO KL8AMD < TAD (RS+DTR /ASSERT RS MSLC> IFDEF PSEUDO < TAD (KL8EF CAL POST CDF CUR /POST CTS ONE SHOT TASK> CLA CLL CDF CUR TAD (SKP CLA /BLIND RECEIVER WHILE TRANSMITTING DCA I (GCHSWT JMP I (OUTXIT /DONE, EXIT RESETS DF > ERRTAB, ISRTYP /LINE TYPE VERSION /DRIVER VERSION NUMBER PATCH /PATCH LEVEL /NEXT ARE 14. CUMULATIVE ERROR COUNTERS ZBLOCK 16 ZBLOCK 12 /PADDING FOR TIME ON-LINE, ETC PAGE FIELD DDCFLD%10 *LCB CDF CUR ERRTAB STRTI STRTO IFNDEF KL8HDX <0> /CLEAR HDX BIT IF FDX IFDEF KL8HDX <HDXFLG> /SET HDX BIT IF HDX *LCB+20 BUFLOC-1 /INITIAL BUFFER PTR CDF BUFFLD IFNZRO NOMAP-7777 < FIELD BUFFLD%10 *BUFLOC ZBLOCK BUFLEN /MARK BUFFER IN BITMAP IF DESIRED > $



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