/2. 8 TO 8 MODEM LINK SLAVE. 5/7/79 /COSMETIC UPDATE 5/7/79 D.S.H. DSH=1 /FOR DON'S LAB IFNDEF VNUM< VNUM="2 /VERSION NUMBER VLET="A /VERSION LETTER JULY 26,1977 > / IFZERO VLET-301< V1A=1> / / IN VERSIONS 1A,2A, ETC USE OLD STYLE CKSUM / THIS V1A SW IS USED FOR COMPATABILITY REASONS WITH / VERSIONS OF THE LINK SOFTWARE WITH NO VERSION NUMBER FALSE=0 /IGNORE FALSE LINE HITS.. 177 RCV'D IFZERO VNUM-261 < BLKSIZ=200> /OLD STYLE BLOCK SIZE IFNDEF BLKSIZ /NEW STYLE BLKSIZ, FOR PHONE LINES / / IFNDEF MONIT /SET TO 1 FOR MONITOR ROUTINES /THE MONITOR ROUTINES LIVE IN FIELD 2 / DLY=0 /SET TO DELAY AFTER EACH CHAR / S6000=CLA CLL CML IAC RTR S7775=CLA CLL CMA RTL S7776=CLA CLL CMA RAL S7777=CLA CMA IFNDEF XDEV /DEFAULT DEVICE ADDRESS IS 40 XKSF=XDEV+1 XKCC=XDEV+2 XKRB=XDEV+6 XTSF=XDEV+11 XTCF=XDEV+12 XTLS=XDEV+16 / / THESE CONSTANTS MUST AGREE WITH THOSE IN MASTER NACK=130 ACK=NACK-1 RESTR=153 ABORT=RESTR-3 / PT08=XDEV / / / / PAGE ZERO CONSTANTS: *10 DEVNAM, TXTTAB-1 /INITIALIZATION ONLY, HANDLER NAMES ENTHND, ENTTAB-1 /INITIALIZATION ONLY, HANDLER ENTRY TABLE VERS, VERNAM-1 /POINTER TO VERSION NAME *20 MCC, -3 TIME, 0 RETRYS, 0 ADDR, 0 WC2, 0 CKSUM, 0 RETURN, ERROR /UPON RETURN, SEND AN ABORT AND RESTART EVERYTHING TIMOUT, 0 /BECOMES JMP LOCATION FOR TIMEOT TIMET, 0 /ZERO TERMINATES THE TABLE. K77, 77 CKSUMX, 0 /PRESERVED CKSUM FOR MONITOR / / BUFFER FOR COMMANDS: DEVNO, 0 /DEVICE INDEX BECOMES HANDLER ENTRY POINT FCNWRD, 0 /FCN WORD FROM MASTER BLKWRD, 0 /BLOCK NUMBER WORD FROM MASTER NXTLOC, 0 /NEXT LOCATION FOR BUFFER INSERTION/REMOVAL PAGCNT, 0 /PAGES TO TRANSFER RETRYC, -3 /RETRY COUNT NORESP, 0 /SET BEFORE EACH RECEIVE CALL /SET TO -1 TO NOT SEND ACK RESP, BUT STILL SEND NAK NREST, 0 /RETRY COUNTER FOR SLAVE SENDING RESTR TO MAS / / NUMHND, -NNHAND /-NUMBER OF ENTRY POINTS / DEVICE NAMES KNOWN TO SYSTEM GO HERE: TXTTAB, / SLAVE FOR ALL SEASONS... INCLUDE EVERYTHING IN THE WORLD / UPDATE MASTER AS NEEDED TO USE ALL THESE DEVICES / / / THIS VERSION HAS THE RECONFIGURATION ROUTINES IN IT / WHEN A MASTER WANTS TO RECONFIGURE THE SLAVE, / HE SENDS OVER 1 PAGE CONSISTING OF THE WAY HE / WANTS NUMHND AND HANTXT TO BE(MAX OF 15 NAMES) / THE SLAVE THEN READS IN THE APPROPRIATE HANDLERS. / THE MASTER HAD BETTER KNOW WHAT HE WANTS / / IFDEF DSH< /FOR DON HARMER'S MACHINES DEVICE LTA0 DEVICE LTA1 DEVICE DTA0 DEVICE DTA1 DEVICE MTA DEVICE D8I DEVICE D12 DEVICE DSCI DEVICE PTR DEVICE PTP DEVICE MTA0 DEVICE MTA1 > IFNDEF DSH< DEVICE RXA0 DEVICE RXA1 DEVICE DYN6 > NNHAND=.-TXTTAB%2 /NUMBER OF HANDLERS ZBLOCK 20-NNHAND^2 /LEAVE ROOM FOR MORE HANDERS AT RECONFIG TIME PAGE / / / NEW FORMAT SLAVE PROGRAM: START, NOP /IN CASE OF CHAIN TO PROGRAM ICALL, JMS I [INIT /READ IN HANDLERS FROM OS8 NXTCOM, S7775 /RETRY COUNT -3 DCA NREST /... CONTIN, KSF /CHAR ON KEYBOARD? SKP CLA /SKIP NOT KRS / AND [177 CIF CDF 00 /MAKE SURE IN FIELD 0 TAD [-3 /CHECK FOR ^C SNA CLA /SKIP IF NOT ^C JMP I [7600 /EXIT TO MONITOR TAD [NXTCOM /SET TIMOUT LOCATION FOR READ DCA TIMOUT /TO GO BACK TO NXTCOM JMS I [READC /READ A CHAR JMP .-1 /COULD NOT BE START OF MSG RDCOM, TAD RETURN /SET TIMEOUT TO GIVE ERROR DCA TIMOUT / TAD [FCNWRD /READ 2 WORD MSG DCA ADDR / CLA CMA /DONT SEND ACK UNTIL MSG DECODE DCA NORESP / FOR ZERO LEN, DONT SEND ACK UNTIL THRU S7776 /SET AC=-2 JMS I [READ /READ A BUFFER JMP ERROR /NEW TRY FOR COMMAND, TEST NREST / / PRINT OUT PREAMBLE MSG IFNZRO MONIT< CIF 20 /MONITOR IS IN FIELD 2 JMS I [MONPRE /NOW PRINT MSG ON TTY> / / NOW EXAMINE DEVNO FOR VALIDITY TAD DEVNO /PICK UP DEVICE NUMBER TAD NUMHND /CHECK FOR MAX HANDLER NUMBER SMA SZA CLA /MUST BE <=0 JMP ERROR /GARBLED MSG, BAD ENTRY POINT TAD DEVNO /GET DEVICE NUMBER BACK TAD [ENTTAB /DEVICE TABLE IS OFFSET DCA DEVNO /SAVE AS POINTER INTO TABLE TAD I DEVNO /GET HANDLER ENTRY POINT SNA /SKIP IF THERE IS A HANDLER JMP HANERR /GIVE HANDLER ERR IF NO HANDLER DCA DEVNO /ANDDSAVE TAD FCNWRD /FROOM MASTER AND [7707 /ZAP MEMORY FIELD BITS TAD [10 /MY BUFFER IS FIELD 1 DCA HANFCN /SAVE IN HANDLER CALL TAD BLKWRD /BLOCK FORR TRANSFER DCA HANBLK /SAVE IN HANDLER DCA NXTLOC /RESET MY BUFFER ADDRESS TAD HANFCN /CALCULATE NUMBER OF PAGES TO XFER AND [3700 /SCRUB TO # PAGES CLL RTR;RTR /RIGHT JUSTIFY IFZERO BLKSIZ-200 SNA /SKIP IF NON-NULL XFER JMP HANCAL /CALL HAND DIRECTLY IF NULL CIA /NEGATE FOR COUNTER DCA PAGCNT /.... AND SAVE FOR LATER / / / NOW SEND ACK ON FIRST SMALL MSG WITH CONTROL PARAMS TAD [ACK JMS I [SENDC /... / IF DOOING A WRITE, FILL BUFFER FROM MASTER TAD FCNWRD SMA CLA /SKIP IF DOING A WRITE JMP HANCAL /CALL HANDLER NOW IF DOING A READ / / / NXTGET, TAD RETRYC /SET RETRY COUNT DCA RETRYS /FOR N-TIME TRY NXTG1, TAD NXTLOC /SET BUFFER LOC DCA ADDR DCA CKSUM /ZAP CHECKSUM TAD PAGCNT /CHECK FOR LAST PAGE IAC SNA CLA /DONT SEND ACK/NACK CLA CMA DCA NORESP /IF THIS IS THE LAST PAGE / I NEED TIME TO WRITE TAD [-BLKSIZ /READ 1 BLOCK CDF 10 /BUFF IS IN FIELD 1 JMS I [READ /CALL READ ROUTINE JMP RDPERR /PAGE READ ERROR TAD ADDR /GET ADDR BUMPED BY 200 DCA NXTLOC ISZ PAGCNT /TEST FOR LAST PAGE JMP NXTGET /NOT DONE YET / / I HAVE JUST READ PAGCNT PAGES FROM MASTER, NOW WRITE / / HANCAL, CIF CDF 0 /FIELD SETUP JMS I DEVNO /CALL HANDLER IN FIELD 0 HANFCN, 0 /MODIFIED FCN WORD FROM MASTER 0 /START AT LOC 0 FIELD 1 HANBLK, 0 /BLOCK NUMBER FROM MASTER JMP HANERR /GIVE HANDLER ERROR / / / IF NULL TRANSFER, JUST GIVE ACK NOW, TO COMPLETE CNTRL MSG HANDON, TAD FCNWRD /CHECK FOR NULL XFER, NON-FILED DEVICE AND [3700 / SNA CLA /SKIP IF NORMAL JMP LSTACK /ZERO LNGTH, SEND ACK / IF MASTER IS DOING A READ, I MUST SEND DATA TO HIM TAD FCNWRD /TEST READ/WRITE SPA CLA /SKP IF MASTER READ OPERATION JMP LSTACK /SEND THE FINAL ACK TO MASTER / / NOW SEND PAGCNT PAGES TO MASTER NXTSEN, TAD RETRYC /SET RETRY COUNT DCA RETRYS NXTS1, TAD NXTLOC /SET BUFFER ADDR DCA ADDR DCA CKSUM /ZAP CHECKSUM TAD [-BLKSIZ /WRITE 1 BUFFER OUT CDF 10 /USE FIELD 1 JMS I [SEND /SEND A WHOLL BUFFER JMP SEPERR /SEND PAGE ERROR TAD ADDR /GET ADDR INCR BY 200 DCA NXTLOC ISZ PAGCNT /CHECK PAGE COUNTER JMP NXTSEN /NOT DONE YET JMP NXTCOM /DONE SEPERR, ISZ RETRYC /BUMP RETRY COUNT SKP CLA /RETRY COUNT NOT DONE YET JMP ERROR /RESTART MASTER NREST TIMES... IFZERO MONIT< /NORMAL SEQUENCE TAD [NACK /SEND A NACK TO MASTER JMS I [SENDC JMP NXTS1 /THEN RESEND THE MESSAGE > IFNZRO MONIT< CIF 20 /MONITOR IS IN FIELD 2 JMP I [SENDPE /SEND MSG > / / /SEND FINAL ACK TO MASTER FOR THE COMPLETION OF A WRITE LSTACK, TAD [ACK /I KNOW THIS IS THE WRITE CHARACTER JMS I [SENDC /TELL MASTER IM DONE WITH WRITE JMP NXTCOM /GO AWAIT NEXT COMMND / / RDPERR, ISZ RETRYC /READ PAGE ERR, TEST RETRY SKP CLA /SKP HERE IF MORE RETRYS LEFT JMP ERROR /RESTART MASTER NREST TIMES, THEN GIVE HANERR IFZERO MONIT< TAD [NACK /NOW SEND NACK TO MASTER JMS I [SENDC /AND TRY READ AGAIN JMP NXTG1 // IFNZRO MONIT< CIF 20 /GIVE MSG TO USR ON TTY JMP I [READPE > / / / /HANERR, REPORTS EXHAUSTION OF RETRYS OR GENUINE HANDLER ERROR HANERR, CLA CLL /SEND HANDLER ERR CODE TAD [ABORT /SEND ABORT TO MASTER, GIVE HND ERR JMS I [SENDC JMP NXTCOM /GET SET FOR A NEW COMMAND /ERROR WILL RESTART MASTER NREST TIMES, THEN GIVE HANERR ERROR, XKCC /CLEAR READER FLAG ISZ NREST /RESTART COUNT EXCEEDED? SKP CLA JMP HANERR /YES, GIVE HANDLER ERR TAD [RESTR /RESTORE MASTER JMS I [SENDC /SEND 1 CHARACTER JMP CONTIN /GET NEXT COMMAND, DONT RESET NREST PAGE / / READC,SENDC - READ/SEND SINGLE CHARACTERS / KEEPING TRACK OF CHECKSUM / / /READ/SEND - READ AND SEND BUFFERS / ENTER WITH AC=-COUNT / ADDRX=BUFFER ADDRESS / EXIT TO CALL+1 IF ERROR / EXIT TO CALL+2 IF CHECKSUM OK / / /DIFFERENCES: / SEND / JMPS TO ERROR IF NEITHER ACK OR NAK / / READ / DECODES DEVNO FORMAT BYTE WHEN IT READS IT / THEN JUMPS TO READ REST OF 2 WORD MSG / WHEN A TIME OUT IS DETECTED: JMP I TIMOUT / / / READC, 0 S7775 /SET TIMEOUT DCA TIME DCA TIMET /ABOUT 100 MS RC0, IFNZRO MONIT XKSF JMP RC1 XKRB AND [177 /USE 7 BITS ONLY DCA SENDC IFNZRO FALSE< TAD SENDC /GET CHAR TAD [-177 /CHECK FOR FALSE HIT SNA CLA /IGNORE IT IF FALSE, GOOD CHAR COMES LATER JMP RC0 /PICK UP NEXT CHAR AS IT COMES ALONG> TAD SENDC TAD CKSUM IFZERO V1A /BUMP CKSUM ONCE PER CHAR IF NOT V1A DCA CKSUM TAD SENDC AND [160 /SCRUB OFF DEVICE BITS TAD [-100 /CHECK FOR STARTUP SNA CLA JMP FNDINI /FOUND INITIAL CHAR, RESTART TAD SENDC JMP I READC FNDINI, TAD SENDC /GET CHAR BACK TAD [-100 /SCRUB OFF SPECIAT DCA DEVNO /AND SAVE AS DEVNO TAD SENDC /RESET CHECKSUM TOO DCA CKSUM / JMP I [RDCOM /BEGIN WITH NEW ORDER RC1, ISZ TIMET JMP RC0 ISZ TIME JMP RC0 JMP I TIMOUT /NO RESPONSE IN 180 MS, TIMEOUT SENDC, 0 XTLS TAD CKSUM IFZERO V1A /BUMP CKSUM ONCE PER CHARACTER IF NOT V1A DCA CKSUM SENDC1, IFNZRO MONIT XTSF /WAIT FOR FLAG FOR MODEM FINISH JMP SENDC1 /NOT DONE YET IFNZRO DLY< DCA READC /GO THRU FULL LOOP ISZ READC JMP .-1 > XTCF /CLEAR TRANSMIT FLAG AFTER SEND OF CHAR / / / /CHECK FOR ^C KSF /CHAR ON KEYBOARD?? SKP CLA /JUMP NOT KRS /READ STATIC AND K177 /SCRUB TO 7 BITS TAD MCC /CHK FOR ^C SZA CLA /SKIP IF ^C JMP I SENDC /NOT ^C, DONE CIF CDF 00 /RETURN TO MONITOR JMP I K7600 /DONE SEND2, 0 DCA READ2 TAD READ2 CLL RTR RTR RTR AND K77 JMS SENDC TAD READ2 AND K77 JMS SENDC JMP I SEND2 READ2, 0 JMS READC AND K77 CLL RTL RTL RTL DCA SEND2 JMS READC AND K77 TAD SEND2 JMP I READ2 SEND, 0 DCA WC2 SENDA, TAD I ADDR JMS SEND2 ISZ ADDR K177, 177 ISZ WC2 JMP SENDA CDF 00 TAD CKSUM CMA /NOTE: ISEND 1'S COMPLEMENT OF THE CHECKSUM IFNZRO MONIT< /SAVE CKSUM I SEND IF MONITORING DCA CKSUMX TAD CKSUMX> /DONT FORGET TO RESTORE IT TOO JMS SEND2 JMS READC /GET RESPONSE FROM MASTER TAD [-NACK /CHECK FOR NAK SNA JMP I SEND /BAD DEAL, NAK ISZ SEND /TAKE NEXT RETURN NOW TAD [NACK-ACK /CHECK FOR ACK SNA CLA / JMP I SEND /BUFFER GOT THRU OK JMP I RETURN /UNKNOWN RESPONSE, RETRY WHOLE SEQUENCE READ, 0 DCA WC2 READA, JMS READ2 DCA I ADDR ISZ ADDR K7600, 7600 ISZ WC2 JMP READA CDF 00 TAD CKSUM /GET CKSUM SO FAR DCA SEND /SAVE IN TEMP JMS READ2 /GET MASTERS CKSUM IFNZRO MONIT /DONT FORGET TO RESTORE TO AC TAD SEND /SHOULD BE 7777 CLL CML IAC /NOTE:LINK=0 IF AC=0 SZL CLA /SKIP IF CKSUM GOOD JMP I READ /ERROR RETURN IF CHKSUM BAD ISZ READ /TAKE GOOD RETURN NOW TAD [ACK /SEND ACK RESPONSE ISZ NORESP /SKIP SENDING ACK/NACK SNDFIN, /NOW SEND THE CHAR JMS SENDC /SEND ACK/NACK IN AC CLA /RETURN WITH CLEAR AC JMP I READ /AND RETURN PAGE / / INITIALIZATION / THE TABLE DEVTXT CONTAINS THE DEVICE NAMES TO BE USED /ON THE SLAVE DEVICE / TO CHANGE DEVICES, CHANGE THIS TABLE ONLY / INIT0, 0 /SECONDARY ENTRY POINT, CALLED FROM CONFIG /SET UP AUTO INDEX LOCATIONS- TAD [ENTTAB /START WITH ENTRY 1 DCA ENTHND /SET UP AUTO INDEX LOC TAD [TXTTAB-1 DCA DEVNAM /POINTER TO TEXT TAD NUMHND /NUMBER OF HANDLERS DCA NHAND /TO MY COUNTER TEMP TAD [1001 /STARTING ADDRESS FOR HANDLERS DCA HANLOC / BECAUSE IT GETS CHANGED DURING INITIALIZATION / CDF 00 /MAKE SURE OF CALLING FIELD CIF 10 /FETCH USR INTO CORE JMS I [7700 10 INIT1, CLA CLL / TAD I DEVNAM /GET HANDLER TEXT DCA HANTXT /AND MOVE TO HANDLER CALL TAD I DEVNAM DCA HANTXT+1 TAD HANLOC /GET LOCATION FOR HANDLER DCA HANPAG /AND INSRT INTO CALL CIF 10 JMS I [200 1 /FETCH HANDLER HANTXT, 0;0 /BECOMES DEVICE NAME TEXT HANPAG, 0 JMP USESYS /IF HANDLER FETCH ERR, USE SYS HAND / / CHECK TO SEE IF HANDLER IS ON SAME PAGE AS ENTRY POINT / IF NOT ON SAME PAGE, DONT INCR NEXT HAND ADDR TAD HANPAG /GET ENTRY POINT AND [7600 /SCRUB TO PAGE # CMA /ONES COMPLEMENT, HANLOC IS 1 TOO BIG TAD HANLOC /CHECK PAGE CORRESPONDENCE SZA CLA /SKIP IF ON SAME PAGE JMP GETHAN /NOT ON SAME PAGE, DONT INCR HANLOC TAD [400 /ALWAYS ASSUME 2 PAGE HANDLER TAD HANLOC /UPDATE POINTER DCA HANLOC /FOR NEXT TIME GETHAN, TAD HANPAG /GGET ENNRY POINT FOR HHND DCAHAN, DCA I ENTHND /STORE ENTRY INTO TABLE ISZ NHAND /CHECK FOR END OF INIT JMP INIT1 /JUMP IF NOT TAD [RECNFG /RECONFIGURATION HANDER ENTRY DCA ENTTAB /SAVE AS ENTRY ZERO INITX, CIF 10 /GET RID OF USR JMS I [200 11 /BY USING OF USROUT FCN JMP I INIT0 /DONE USESYS, CLA CLL /I KNOW WHAT TO DO WITH A NON-EXISTANT HANDLER, GIVE ERR TAD [7607 /BUT FOR DON'S MACHINES, USE SYS HAND / ON PDP12,D12 BECOMES SYSTEMS DEVICE. (ETC) JMP DCAHAN /GOES INTO TABLE HANLOC, 1001 /LOCATION FOR HANDLERS TO START ENTTAB, ZBLOCK 20 /MAXIMUM OF 16 HANDLER LOCATIONS NHAND, -NNHAND /NUMBER OF HANDLERS TO TRY FOR / / / / /RECONFIGURE THE SLAVE- / THIS ROUTINE IS A FAKED HANDLER ENTRY / MY BUFFER AREA IS TO BE READ/WRITTEN ACCORDINGLY / ON A WRITE CALL, CHANGE NUMHND AND TXTTAB, THEN CALL INIT / ON A READ CALL, MERELY MOVE NUMHND AND TXTTAB INTO BUFFER AREA RECNFG, 0 /CONTAINS ENTRY POINT CDF 10 /POINT TO BUFFER AREA CLA CMA /SET UP AUTO INDEX FOR MOVE DCA DEVNAM /START WITH LOC 0 TAD FCNWRD /CHECK FOR READ/WRITE SMA CLA /SKIP IF DOING A WRITE JMP SNDCNF /ITS A READ, SEND CONFIGURATION TO MASTER TAD I [0 /GET NUMBER OF HANDLERS SMA /SHOULD BE NEGATIVE... JMP CNFERR /GOOFED UP, RETURN HANDLER ERROR TAD [17 /MAX OF 15 BASE TEN HANDLERS SPA SZA CLA JMP CNFERR CLA CMA /CALCULATE # OF WORDS TO MOVE TAD I [0 CLL RAL IAC DCA NHAND /2 TIMES # HANDLERS +1 WORDS TO MOVE TAD [DCA NUMHND /MOVE INSTRUCTION DCA TMOVE2 /SAVE IN MOVE SEQUENCE TMOVE1, TAD I DEVNAM /GET WORD TO MOVE TMOVE2, DCA NUMHND /MOVE IT ISZ TMOVE2 /POINT TO NEXT WORD ISZ NHAND /TEST COUNT OF # OF WORDS TO MOVE JMP TMOVE1 / JMS INIT0 /EVERYTHING MOVED JMP I [HANDON /RETURN IN DF 0 CNFERR, CDF 00 /BACK TO FIELD 0 JMP I [HANERR /REPORT HANDLER ERROR SNDCNF, TAD [TAD NUMHND /MOVE INFO TO FIELD 1 DCA FMOVE1 /SAVE FOR FETCH FROM FIELD 0 TAD [-40 DCA NHAND /MOVE ENUF WORDS.. FMOVE1, TAD NUMHND /FETCH WORD FROM MY TABLES ISZ FMOVE1 /POINT TO NEXT WORD DCA I DEVNAM /STORE IN FIELD 1 ISZ NHAND /CHECK COUNT OF WORDS MOVED JMP FMOVE1 /JMP NOT DONE JMP I [HANDON /RETURN TO NORMAL SEQUENCE PAGE / THIS AREA IS OVERWRITTEN WITH HANDLERS VERNAM, /VERSION MESSAGE IN SCRATCH SPACE "S;"L;"A;"V;"E;" ;"V;VNUM;VLET;",;" "D;"E;"V;"I;"C;"E;" ;"A;"D;"D;"R;"= XDEV%100&7+"0;XDEV%10&7+"0 212;200;200;200;215;200;200;200;0 /CR;LF WITH NULLS VERPRN, 0 /VERSION PRINTING SUBROUTINE CLA CLL TAD I VERS /GET NEXT CHAR THRU AUTO INDEX SNA JMP I VERPRN /EXIT IF NO CHARACTER TLS TSF JMP .-1 JMP VERPRN+1 /DO NEXT CHARACTER INIT, 0 /INITIALIZATION CALLED FROM LOC 200 JMS VERPRN /PRINT OUT VERSION NAME DCA I (ICALL /ZAP CALL TO INIT XKCC /CLEAR MODEM INPUT FLAG TAD INIT /MOVE MY RETURN ADDR TO INIT0 DCA I (INIT0 /... JMP I (INIT0+1 /AND DO REST OF INIT $$$$