//DDCMP / THIS IS A SUBSET OF DDCMP FOR POINT TO POINT HALF DUPLEX. / / JONATHAN R. GROSS / SOCIAL SCIENCES RESEARCH FACILITIES CENTER / 25 BLEGEN HALL / UNIVERSITY OF MINNESOTA WEST BANK / MINNEAPOLIS, MINNESOTA 55455 / (612) 373-5599 / /DEFINE THE STUFF NEEDED BY RTS8 CUR=10 TASK=DDCMP INIWT=0 / / BKREGA=7560 /FIRST DATA BREAK ADDRESS BUFLEN=1000 /MCRFLD= /RESTRT=1 /IF DEFINED ALLOWS RESTART AFTER COMMUNICATIONS LOSS /KG8=1 /IF DEFINED, USES KG8 HARDWARE ////// SSCD=6400 /SKIP IF CHARACTER DETECTED SCSI=6401 /CLEAR SYNCHRONOUS INTERFACE SSRO=6402 /SKIP IF RECEIVE COUNT O'FLOW SSTO=6403 /SKIP IF TRANSMIT WORD COUNT O'FLOW SGRR=6404 /RECEIVE GO SGTT=6405 /TRANSMIT GO SCSD=6406 /CLEAR SYNC DETECT SRTA=6407 /READ TRANSFER ADDRESS SSRG=6410 /SKIP IF RING FLAG SSCA=6411 /SKIP IF CARRIER/AGC FLAG SLCC=6412 /LOAD CONTROL SLFL=6413 /LOAD FIELD SRS2=6414 /READ STATUS 2 SRS1=6415 /READ STATUS 1 SSBE=6416 /SKIP ON BUSS ERROR SRCD=6417 /READ CHARACTER DET*CTED / / LINK CONTROL CHARACTER DEFINITIONS / SYNC=226 ENQ=5 STRT=6 A0=0 STAK=7 SOH=201 ACK=1 NAK=2 REP=3 RES=4 RESAK=5 DLE=220 FINAL=100 SELECT=200 FISEL=FINAL SELECT FILL=0 / TESTC0=BKREGA /DEFINE BREAK ADDRESSES TESTC1=TESTC0+1 TESTC2=TESTC1+1 TESTC3=TESTC2+1 RWC=TESTC3+1 RCA=RWC+1 TWC=RCA+2 TCA=TWC+1 EJECT FIELD CUR%10 *11 XR1, 0 /GENERAL INDEX REGISTER XR2, 0 *50 /AVOID MEMORY IN USE IF PUT IN FIELD 0 HD0, .-HD0+RBUF /POINT INTO THE RECIEVED HEADER HD1, .-HD0+RBUF HD2, .-HD0+RBUF HD3, .-HD0+RBUF HD4, .-HD0+RBUF NTRY, 0 /NUMBER OF TIMES TRIED TRYS, -20 /NUMBER OF TIMES TO TRY P377, 377 LASTR, 0 /NUMBER OF THE LAST GOOD MESSAGE RECIEVED LASENT, 0 /NUMBER OF THE LAST MESSAGE SENT LASGOT, 0 /NUMBER OF THE LAST MESSAGE THEY GOT OK / IFZERO CUR-10 < IFZERO PWRFAL <*200> IFNZRO PWRFAL <*400> > IFNZRO CUR-10 <*? > /TO BE ASSIGNED IF NOT IN FIELD 1 RBUF, 0 *RBUF+BUFLEN SYNC;SYNC;SYNC;SYNC TBUF, SOH ZBLOCK 7 PAGE /START ON A BOUNNDRY / /THIS IS ONCE ONLY CODE SO IT IS PUT IN THE TRANSMIT BUFFER / DP8E, CAL;SKPINS /PUT SKIP INSTRUCTIONS INTO SKIP CHAIN. CHARD CAL;SKPINS AGCHNG CAL;SKPINS XMTOVR CAL;SKPINS RCVOVR CAL;SKPINS RING CAL;SKPINS BUSER CDF 0 /BREAK REG.S ALWAYS IN ZERO TAD (BKREGA-1 DCA XR1 TAD (4000+SYNC /IGNORE LEADIN SYNCS DCA I XR1 TAD (SOH DCA I XR1 /RECOGNIZE HEADERS TAD (ENQ /UNNUMBERED HEADER DCA I XR1 TAD (DLE /BOOTSTRAP DCA I XR1 CDF CUR STRTUP, JMP HANGUP /MAY HAVE TO JUMP OUT OF THE BUFFER EJECT *TBUF+BUFLEN / / THIS IS THE MAIN DDCMP CODE / LISTEN, JMS GETMESS JMP GOTMESS /GOT A MESSAGE, NOW GO DECODE IT JMP TIMO /TIMED OUT HLT /TO LATE TO RING, SYSTEM ERROR / GOTMESS, JMS CKHED /CHECK HEADER CRC JMP HBCCER STARTD, TAD I HD0 /WHAT KIND MESSAGE? JMS JMPTAB SOH;NUMBRD /NUMBERED MESSAGE ENQ;NONUM /UNNUMBERED MESSAGE DLE;BOOT /BOOTSTRAP MESSAGE 0;.+1 /NOT RECOGNIZABLE / FORMER, TAD (21 /HEADER FORMAT ERROR JMS SENDNACK JMP LISTEN / BOOT, HLT /NO CODE YET FOR THIS / / RECIEVED AN UNNUMBERED MESSAGE / NONUM, TAD I HD1 JMS JMPTAB ACK;GOTACK /NO DATA RECIEVED NAK;RESEND /BAD, RESEND LAST MESSAGE REP;RQRPLY /MISSED A MESSAGE, REPLY 0;FORMER /SOMETHING ELSE / GOTACK, TAD I HD3 /GET LAST ONE THEY RECIEVED DCA LASGOT TAD LASGOT /SEE IF THE LAST THING THEY GOT CIA /IS THE LAST THING WE SENT TAD LASENT SZA CLA JMP RESEND /THIS ACK IS A NACK. JMP FORMES /GO TO SEND A MESSAGE BACK / RQRPLY, TAD I HD4 /CHECK NUMBER OF LAST MESSAGE THEY SENT. CIA /AND COMPARE IT TO WHAT WE HAVE TAD LASTR SNA CLA JMP TACK /TRAMSMIT AN ACK CLL CLA CML IAC RAL /3 JMS SENDNACK /SEND NACK SO THEY CAN RESEND JMP LISTEN / TIMO, TAD LASENT /PREPARE A REP MESSAGE DCA REPSEQ JMS GENCRC REPMES 6 TAD TRYS /RESET TRY COUNT DCA NTRY TAGAIN, ISZ NTRY /DID WE LOSE CONTACT? SKP /KEEP TRYING JMP CL /GIVE UP JMS SENDM /SEND IT REPMESS-4 REPMESS+7 / JMS GETMESS /WAIT FOR ACK OR NAK JMP GOTMESS /PROCESS LIKE NORMAL JMP TAGAIN /TIME OUT, SEND IT AGAIN HLT /NO BELLS NOW / HBCCER, CLA IAC /1=BCC HEADER ERROR JMS SENDNAK JMP LISTEN / / SENDACK SENDS AN UPDATED ACK MESSAGE OVER DP8 / SENDACK,0 TAD LASTR /UPDATE MESSAGE WITH LAST GOOD ONE RECIEVED DCA ACKN JMS GENCRC ACKMESS 6 JMS SENDM ACKMESS-4 ACKMESS+7 JMP I SENDACK / SYNC;SYNC;SYNC REPMES, ENQ;REP;FISEL;FILL REPSEQ, 0 A0;ZBLOCK 2 / CL, CAL;SEND /LAST WORDS BEFORE WE DIE TTY;CLMESS IFDEF MCR < /DON'T STOP IF YOU CAN'T BE RESTARTED CAL;SUSPND /STOP MYSELF > JMP I .+1 /OPERATOR SAYS TRY AGAIN IFDEF RESTRT IFNDEF RESTRT / CLMESS, ZBLOCK 3 /RTS8 OVERHEAD 0 /PACKED ASCII 0 /NO INPUT TEXT 'COMMUNICATIONS LOSS' PAGE EJECT / / ROUTINE TO SEARCH A BRANCH TABLE AND BRANCH ON MATCH. / TABLE ENDED WITH A ZERO ENTRY AND WHERE TO GO. / JMPTAB, 0 CIA /NEGATE CHARACTER FOR COMPARE DCA TABCHR /STORE IN A TEMP SKP /DON'T IN POINTER FIRST TIME ONLY JPT1, ISZ JMPTAB /POINT TO NEXT CHARACTER TAD I JMPTAB /GET CHARACTER TO COMPARE ISZ JMPTAB /COMMON CODE SNA /END OF TABLE? JMP JEXIT /YES, NO MATCH EXIT TAD TABCHR SZA CLA JMP JPT1 /NO MATCH THIS TIME JEXIT, TAD I JMPTAB /PICK UP BRANCH ADDRESS DCA JMPTAB JMP I JMPTAB TABCHR, 0 // / GETMESS WAITS FOR: / 1)A MESSAGE TO COME OVER DP8E / OR 2)A TIMEOUT / OR 3)THE PHONE TO RING / AND TAKES THE APPROPRIATE EXUT GETMESS, 0 CDF 0 TAD (RBUF-1 DCA I (RCA /LOAD STARTING ADDRESS (MINUS 1) TAD (-BUFLEN-1 DCA I (RWC /LENGHT TAD (4000+SYNC /SET UP TO IGNORE LEADING SYNCS DCA I (TESTC0 CDF CUR JMS SETIME /START A COUNTER 6^SHERTZ TAD (4400 /TURN LINE AROUND AFTER RECEIVE DCA RSET /TELL INT TO RESET INTERFACE SCSD /CLEAR DETECT CIRCUITS TAD (5000 SLCC /ENABLE DATA BREAK RWAIT, CLA IOF /WAIT ON MULTIPLECONDITIONS TAD (4000+DDCMP DCA RCVFLG TAD (4000+DDCMP DCA TOMESS TAD (4000+DDCMP DCA RNGFLG SGRR /ENABLE RECIEVE CIF 0 WAITM /WAIT FOR SOMETHING EFWT TAD RCVFLG SNA CLA /POSTED? JMP GEXIT /YES TAD TOMESS SNA CLA JMP GEXIT-1 /TAKE SECOND EXIT IAC IAC GEXIT, TAD GETMESS /TAKE EXIT 1-3 DCA GETMESS ION JMS CANCEL /CANCEL THE TIMEOUT JMP I GETMESS /GO BACK / RCVFLG, ZBLOCK 3 /RTS8 EVENT FLAG FOR RECIEVING A DP8 MESSAGE XMTFLG, ZBLOCK 3 /RTS8 EVENT FLAG FOR SENDING MESSAGE AGCFLG, ZBLOCK 3 /CARRIER CHANGED FLAG RNGFLG, ZBLOCK 3 /PHONE RANG FLAG / RCVOVR, ZBLOCK 2 /COMES HERE IN SKIP CHAIN SSRO JMP I .-3 CDF CIF CUR TAD RSET /RESET INTERFACE? SZA SLCC /DISABLE DATA BRAKS AND INTERUPTS /TURN LINE AROUND CLA TAD (RCVFLG CIF 0;POSTDS /POST IT / RSET, 0 /DP8 FLAGS, ELSE ZERO / RING, ZBLOCK 2 /COMES HERE WHEN PHONE RINGS SSRG JMP I .-3 CDF CIF CUR TAD (RNGFLG CIF 0;POSTDS / AGCHNG, ZBLOCK 2 SSCA JMP I .-3 CDF CIF CUR SRS2 /SEE IF CARRIER IS ON SPA CLA JMP OFFON CDF 0 TAD I (TESTC0 /SEE IF WE GOT A HEADER SPA CLA JMP NOISE /NO, DO NOTHING CLA CMA /-1 DCA I (RWC /FORCE AN EARLY TERMINATION NOISE, CDF CUR OFFON, TAD (AGCFLG CIF 0;POSTDS / PAGE / SETIME, 0 /SETS THE TIMEOUT TIMER TAD I SETIME DCA TIMEL /LOW ORDER TIME OUT BITS DCA TOMESS /CLEAR EF FIRST CAL;SEND CLOCK;TOMESS ISZ SETIME /TAKE SECOND EXIT JMP I SETIME / CANCEL, 0 /CANCEL THE TIMEOUT CLOCK ENTRY CAL;SEND CLOCK;CANMES JMP I CANCEL / TOMESS, ZBLOCK 3 /RTS8 ONVERHEAD 0 /POST THIS MESSAGE AFTER SET TIME 0 /AFTER TIMEL, 0 /WAITING TIMEL TICKS / CANMESS, ZBLOCK 3 /RTS8 OVERHEAD 7000+DDCMP /DEQUEUE TIMER REQUEST / CHARD, ZBLOCK 2 /COMES HERE WHEN CHARACTER DETECTED ON SSCD JMP I .-3 CDF CIF CUR SRCD /RECIEVE. READ IT SNA CLA /SYNC IS CHARACTER 0 JMP .+4 /DO NOTHING ON SYNCS CDF CIF 0 /OTHERS ARE HEADER CHARACTERS. SYNCS HAVE TAD (SYNC /MEANING NOW DCA I (TESTC0 CDF CUR /RESET DF CIF 0;POSTDS / BUSER, ZBLOCK 2 /COMES HERE WHEN BUSS OVERLOADED SSBE JMP I .-3 CDF CIF CUR ISZ BUSER /SAY A ERROR HAS OCCURED CIF 0;POSTDS // / SENDM SENDS A CORE BUFFER OVER THE DP8E / CALL FOLLOWED BY FIRST AND LAST ADDRESS OF BUFFER. / SENDM, 0 CLA CMA /-1 TAD I SENDM DCA STAD /SAVE IT ISZ SENDM /GET LAST ADDRESS. TAD I SENDM DCA LAD CDF 0 TAD STAD DCA I (TCA TAD LAD CMA /1'S COMP TAD STAD /COMPUTE COUNT DCA I (TWC CDF CIF CUR DCA RSET /TELL INT HAND TO IGNOR RECIEVES TAD (5400 /ASSERT REQUEST TO SEND (PERHAPS AGAIN) SLCC CLA JMS SETIME /START THE TIMER FOR DEAD SLAVE 50^SHERTZ IOF SGTT /TRANSMITT WHEN READY TAD (4000+DDCMP DCA TOMESS TAD (4000+DDCMP DCA XMTFLG /WAIT FOR TRANSMIT DONE OR TIME OUT CIF 0 WAITM; EFWT TAD XMTFLG SZA CLA /TIME OUT OR DONE? JMP TTO /TIMED OUT ION TAD (-10 DCA TWAIT ISZ TWAIT JMP .-1 /WAIT A LITTLE WHILE BEFORE TAD (5000 /DROPPING CARRIER SLCC CLA JMS CANCEL /CANEL THE TIMER ISZ SENDM JMP I SENDM TWAIT, 0 STAD, 0 /STARTING ADDRESS LAD, 0 /LAST ADDRESS / TTO, CLL CLA CML RAR /4000 SLCC /SET TERMINAL READY, BUT THATS ALL CLA ION JMP CL /PRINT A MESSAGE / XMTOVR, ZBLOCK 2 /COMES HERE ON TRANSMIT DONE SSTO JMP I .-3 CDF CIF CUR TAD (XMTFLG CIF 0;POSTDS /POST THE FLAG PAGE EJECT CKHED, 0 /CHECK THE BCC OF THE HEADER JMS CRC /AND TAKE SECOND EXIT IF OK. RBUF 10 SNA CLA /ZERO? ISZ CKHED JMP I CKHED / / / GENCRC ACEPTS THE ADDRESS AND LENGHT OF A MESSAGE, AND / PUTS THE GENERATED CRC IN THE NEXT TWO LOCATIONS / GENCRC, 0 TAD I GENCRC /CALL TO GENERATE CRC. DCA GEN1 /TWO ARGS ISZ GENCRC /FIRST ADDRESS AND LENGH CLA CLL IAC RAL /2 /ADD TWO TO LAST ADDRES TAD I GENCRC DCA GEN2 /LENGHT TAD I GENCRC ISZ GENCRC TAD GEN1 /CALCULATE ADDRESS OF BCC DCA GEN4 DCA I GEN4 ISZ GEN4 /ZERO OUT BCC DCA I GEN4 JMS CRC GEN1, 0 GEN2, 0 CLA JMP I GENCRC GEN4, 0 / / SENDNACK SENDS A NEGATIVE ACK WHO'S REASON IS IN ACC ON ENTRY. / SENDNACK,0 TAD (FINAL+SELECT /PACK REASON DCA RNAK TAD LASTR /UPDATE LAST RECIEVED DCA NNAK JMS GENCRC NAKMESS 6 JMS SENDM /SEND IT NAKMESS-4 NAKMESS+7 JMP I SENDNAK /TAHT'S ALL / SYNC;SYNC;SYNC;SYNC NAKMESS,ENQ;NAK RNAK, 0 /REASON FOR NAK NNAK, 0;FILL;A0;ZBLOCK 2 / / / WE HAVE RECIEVED A NUMBERED MESSAGE. / NUMBRD, CLL CLA CML IAC RAL /3 AND I HD2 /GET UPPER 2 BITS OF LENGHT RTR;RTR;RAR /SHIFT END-AROUND INTO PLACE TAD I HD1 /GET LOW ORDER BITS DCA MESLEN CLL CLA IAC RAL /2 TAD MESLEN /ADD BBCC CHARACTERS TO IT DCA DATLEN /LENGTH OF DATA PORTION TAD DATLEN TAD (-BUFLEN+7 /SEE IF WE GOT THE WHOLE THING SPA CLA JMP DATCK /LENGTH OK TAD (20 /MESSAGE TO LONG JMS SENDNACK JMP LISTEN / DATCK, JMS CRC RBUF+10 DATLEN, 1 /LENGHT PUT HERE SNA CLA /OK? JMP DATOK /YES CLL CLA IAC RAL /2 JMS SENDNAK /BAD CHECK JMP LISTEN / DATOK, TAD I HD3 /GET NUMBER OF LAST ONE THEY GOT OK DCA LASGOT /UPDATE LAST ONE THEY GOT OK TAD LASTR IAC AND P377 /TAKE MOD 400 CIA TAD I HD4 /CHECK NUMBER OF THIS MESSAGE SZA CLA JMP LISTEN /SEQUENCE ERROR, NO RESPONCE (SPEC. PAGE 27) TAD I HD4 DCA LASTR /UPDATE NUMBER OF LAST ONE WE GOT OK / EJECT / / THE MESSAGE PASSED TO 'INPUT' IS IN THE FOLLOWING FORM / /CDF INSTRUCTION TO CHANGE TO FIELD OF BUFFER / BEGINNING ADDRESS OF BUFFER / LENGTH OF MESSAGE / / THE TASK INPUT SHOULD CHECK FOR A ZERO LENGTH MESSAGE IF / THAT COULD CAUSE PROBLEMS. IF INPUT ACCEPTS THE MESSAGE, / IT SHOULD SET THE LENGHT WORD TO ZERO BEFORE POSTING THE / PARAMETER MESSAGE. OTHERWISE THE LENGTH WORD MAY BE SET TO / 21 IF THERE IS A HEADER FORMAT ERROR / 10 IF THERE IS NO ROOM TO PROCESS INPUT / NOTE.....THE PARAMETER MESSAGE SHOULD BE POSTED A SOOM A POSSIBLE SINCE / COMMUNICATIONS WILL NOT CONTINUE UNTIL THE MESSAGE IS POSTED. / ON THE OTHERHAND, DON'T POST THE MESSAGE BEFORE IT HAS BE PROCESSED OR / COPIED SINCE AFTER THE PARAMETER MESSAGE IS POSTED, THE MESSAGE CONTENTS / MAY CHANGE. / CAL;SENDW /GIVE MESSAGE TO NEXT LEVEL INPUT;INMESS TAD MESLEN SNA /SHOULD BE ZERO, ELSE DDCMP NACK REASON JMP FORMES /NOW RETURN A MESSAGE IF WAITING JMS SENDNACK JMP LISTEN / INMESS, ZBLOCK 3 /FOR RTS8 CDF CUR /FIELD OF BUFFER RBUF+10 /START OF MESSAGE MESLEN, 0 /LENGHT / SYNC;SYNC;SYNC;SYNC ACKMESS,ENQ;ACK;FISEL ACKN, 0;FILL;A0;ZBLOCK 2 PAGE EJECT FORMES, CDF 0 /LOOK AT MESSAGE Q BEFORE ASKING FOR ANY IOF TAD I (TASK^2+MSGTBL CDF CUR SZA CLA /ANYTHING? JMP M2SEND /YES, HAVE SOMETHING ION /NO TACK, JMS SENDACK /NOTHING TO SEND, JUST ACKNOLEDGE JMP LISTEN / M2SEND, TAD (TBUF+10-1 DCA XR1 /GET READY TO TRANSFER THE MESSAGE / PARAMETER MESSAGES SENT TO DDCMP SHOULD BE IN THE FOLLOWING FORM / CDF INSTRUCTION TO CHANGE TO FIELD OF MESSAGE / FIRST ADDRESS OF BUFFER / LENGHT OF MESSAGE / NOTE.......NO CHECK IS MADE FOR A ZERO LENGHT MESSAGE OR / A MESSAGE GREATER THAN THE BUFFER SIZE. BEWARE. / DDCMP WILL POST THE MESSAGE IMMEADIATLY AFTER COPYING IT. / CAL;RECEIVE /GET THE MESSAGE MAD, 0 /MESSAGE ADDRESS DCA MFLD /CHANGE TO DF OF MESSAGE MFLD, HLT TAD I MAD /GET CDF OF MESSAGE TO BE SENT DCA TLOOP /STORE IN TRANSFER LOOP ISZ MAD CMA /-1 TAD I MAD /GET ADDRESS DCA XR2 /STORE ADDRESSS-1 IN XR ISZ MAD TAD I MAD /GET LENGTH DCA OLEN TAD OLEN /LENGHT CIA DCA MCNT /COUNTER TLOOP, HLT TAD I XR2 /GET CHARACTER OF MESSAGE CDF CUR /CHANGE DATA FIELD BACK DCA I XR1 /PUT IN TBUF ISZ MCNT /DONE? JMP TLOOP /NO / TAD MFLD /MESSAGE MAY BE POSTED NOW IT'S COPIED DCA PFLD TAD (-5 /YES, POST THE MESSAGE TAD MAD CAL;POST PFLD, HLT CLL CLA IAC RAL /2 TAD XR1 /GET TOTAL LENGHT FOR SENDM DCA RESEND+2 TAD (TBUF DCA XR1 /PUT INFO IN HEADER TAD OLEN /START PACKING LENGHT AND P377 DCA I XR1 TAD OLEN CLL RTL;RTL;RAL AND (3 TAD (FISEL DCA I XR1 TAD LASTR /IMPLIED ACK DCA I XR1 TAD LASENT IAC AND P377 DCA LASENT TAD LASENT DCA I XR1 /THIS MESSAGE NUMBER / JMS GENCRC /GENERATE HEADER CRC TBUF 6 TAD OLEN DCA .+3 JMS GENCRC /GENERTE CRC FOR DATA TBUF+10 1 /LENGHT PUT HERE RESEND, JMS SENDM TBUF-4 TBUF /CHNGED JMP LISTEN /GET REPONCE / MCNT, 0 /COUNTER OLEN, 0 /LENGTH OF MESSAGE EJECT / IFDEF KG8 < / GENERATE CRC-16 USING KG8 OPTION / / KGDEVCO=0340 RCRH=6001+KGDEVCO /READ BCC HIGH RCRL=6002+KGDEVCO /READ BCC LOW RCGB=6004+KGDEVCO /GENERATE BCC RCLC=6005+KGDEVCO /LOAD CONTROL RCCB=6006+KGDEVCO /CLEAR BCC / CRC, 0 /ENTRY TAD I CRC /SET UP BUFFER ADDRESS DCA KGCADR ISZ CRC TAD I CRC /SET UP LENGTH CIA DCA KGCCNT RCCB /CLEAR KG8 TAD KGC100 RCLC /ENABLE CRC-16 CLA / KGC2, TAD I KGCADR /GET CHARACTER RCGB /GENERATE CRC-16 CLA ISZ KGCADR ISZ KGCCNT /DONE? JMP KGC2 /NO / CLL CLA CMA RTL /-3 TAD KGCADR /BACK UP DCA KGCADR RCRH /READ BCC HIGH DCA I KGCADR ISZ KGCADR RCRL /READ BCC LOW DCA I KGCADR RCRH /READ HI AGAIN TAD I KGCADR /ADD TO LOW FOR ZERO CHECK ISZ CRC JMP I CRC /EXIT TO CALL+3 / KGCADR, 0 KGCCNT, 0 KGC100, 100 > / EJECT IFNDEF KG8 < FREESP=. /MAYBE USE SPACE TO LITERALS PAGE / / ROUTINE TO GENERATE/CHECK CRC-16 / (ARNOLD G. NELSON, HEALTH COMPUTER SCIENCES) / / CALL FOLLOWED BY TWO ARGUMENTS, BA AND BL. / BA IS THE STARTING ADDRESS OF A BUFFER WHICH CONTAINS A / STRING OF RIGHT ADJUSTED 8-BIT CHRACTERS, ONE CHARACTER / PER 12-BIT WORD. BL IS THE LENGHT OF THE BUFFER. / / THIS ROUTINE PUTS THE RESIDUE IN THE LAST TWO WORDS OF THE BUFFER, / SO IF YOU WANT TO CALCULATE THE CRC, LEAVE THE LAST TWO LOCATIONS / AS ZERO, OTHERWISE, CHECK AC-MQ TO MAKE SURE IT IS ZERO ON EXIT. / AC-MQ WILL CONTAIN CRC RESIDUE ON EXIT / CRC, 0 /SUBROUTINE ENTRANCE TAD I CRC /BUFFER ADDRESS DCA CRCADR ISZ CRC TAD I CRC /BUFFER LENGTH CIA /MAKE MINUS FOR COUNT DCA CRCCNT DCA CRC16U /CLEAR OUT RESIDUE DCA CRC16L / CRC2, TAD I CRCADR /GET A CHARACTER DCA CRCCHR TAD (-10 DCA CRCBIT / CRC4, TAD CRCCHR /SHIFT CHAR RIGT ONE CLL RAR DCA CRCCHR SZL /IS BIT THERE? TAD (400 /INSERT CURRENT BIT INTO BIT 3 OF CRC16L WORD TAD CRC16L DCA CRC16L TAD CRC16U /TEST X16 BIT IN CRC16U RAR; SNL JMP CRC6 /X16 = 0, GOTO SHIFT / / EXCLUSIVE OR PROCUDURES (X16 = 1) / RAL TAD CRCPCU /(A+B)-2*(A AND B) DCA CRCTMP TAD CRC16U AND CRCPCU CLL RAL; CIA TAD CRCTMP DCA CRC16U / TAD CRC16L /EXCLUSIVE OR CRC-16 LOWER TAD CRCPCL DCA CRCTMP TAD CRC16L AND CRCPCL CLL RAL; CIA TAD CRCTMP DCA CRC16L / / SHIFT PROCEDURES / CRC6, CLA /SHIFT CRC-16 LOWER TAD CRC16L CLL RAR DCA CRC16L SZL TAD (400 /IF RIGHT BIT WAS 1, ADD BIT TAD CRC16U /TO CRC UPPER (POSITION 3) CLL RAR DCA CRC16U / ISZ CRCBIT /UPDATE BIT COUNT JMP CRC4 /NOT DONE, PROCESS NEXT BIT ISZ CRCADR /UPDATE CHAR ADDRESS ISZ CRCCNT /UPDATE CHARACTER COUNT JMP CRC2 /NOT DONE, PROCESS NEXT CHAR / CLL CLA CMA RAL /-2 TAD CRCADR /BACK UP ADDRESS BY 2 DCA CRCADR TAD CRC16U /STORE CRC16U IN (BA+BL-2), SAVE IN MQ DCA I CRCADR ISZ CRCADR TAD CRC16L /STORE CRC16L IN (BA+BL-1), SAVE IN AC DCA I CRCADR TAD CRC16L TAD CRC16U /CALLING ROUTINE MAY CHECK FOR ZERO ISZ CRC JMP I CRC /EXIT TO CALL+3 // / CRC16L ---NLLLLLLLL BITS 0-7, N=NEXT BIT / CRC16U ----UUUUUUUU BITS 8-15 / / CRCPCL ---101000000 1 +X2 / CRCPCU ----00000011 X15+X16 / CRCADR, 0 /BUFFER ADDRESS CRCCNT, 0 /CHARACTER COUNT CRC16L, 0 /CRC LOWER CRC16U, 0 /CRC UPPER CRCCHR, 0 /CURRENT CHARACTER CRCBIT, 0 /BIT COUNTER CRCTMP, 0 /TEMPORARY / CRCPCL, 0500 /POLYNOMIAL CONSTANT LOWER CRCPCU, 0003 /POLYNOMIAL CONSTANT UPPER ENDCRC=. /FREE SPACE TO END OF PAGE-LITTERALS PAGE > EJECT / IFNDEF RESTRT <*STRTUP+1> PAGE HANGUP, SCSI /CLEAR HARDWARE OF MODEM CONTROLER TAD (CUR^10+CUR^10 /SET EXTENDED ADRESS FIELDS IN SLFL /INTERFACE. CLL CLA CML RAR /4000 SLCC /TERMINAL READY CLA TAD TRYS /RESET COUNT DCA NTRY / / / THE FOLLOWING CODE IS THE CODE THAT ESTABLISHES / THE INITIAL CONTACT. / SWAIT, JMS GETMESS /WAIT FOR MESSAGE OR PHONE TO RING JMP SMESS /GOT A MESSAGE JMP SWAIT /TIMED OUT /PHONE RANG CAL;SENDW /WAIT FOR MODEM TO ANSWER PHONE CLOCK;ANSWER JMS GENCRC /SEND A START MESSAGE STARTM 6 RANG, ISZ NTRY /HAVE WE TRIED A LOT SKP /NO YET JMP HANGUP /GIVE UP JMS SENDM /SEND IT STARTM-4 STARTM+7 / JMS GETMESS /WAIT FOR RESPONCE JMP CKSTAK /GO CHECK IF ITS A LEGAL STACK JMP RANG /TIMED OUT, SEND PROBE AGAIN. JMP RANG /? / CKSTAK, JMS CKHED /CHECK HEADER CRC JMP RANG /BAD CRC, SEND START AGAIN. TAD I HD0 /CHECK TYPE. TAD (-ENQ SZA CLA JMP RANG /WRONG TYPE, RESEND START. TAD I HD1 /CHECK TO SEE IF STACK TAD (-STAK SZA CLA JMP RANG /WRONG KIND OF MESSAGE /IN THE GENERAL CASE, THERE COULD BE A START HERE TOO. CMA /-1 TAD I HD4 /GET NUMBER OF FIRST MESSAGE TO BE SENT AND P377 DCA LASTR /SAY WE GOT PREVIOUS ONE OK. JMP FORMESS /GO GET A MESSAGE TO SEND TO TERMINAL / SMESS, ISZ NTRY /HAVE WE GOTTEN A LOT OF JUNK? SKP /TIME FOR MORE JMP HANGUP JMS CKHED /CHECK HEADER CRC JMP SWAIT /BAD CRC TAD I HD0 TAD (-ENQ /SEE IF IT COULD BE A START MESSAGE SZA CLA JMP SWAIT /WRONG TYPE TAD I HD1 TAD (-STRT SZA CLA /START MESSAGE? JMP SWAIT /NO NEWSAK, CLA CMA /YES , MAKE -1 TAD I HD4 AND P377 DCA LASTR /SAY WE GOT PREVIOUS MESSAGE TAD I HD4 DCA FSTSEQ /SAY WE HAVE YOUR NUMBER SENSAK, ISZ NTRY /HAVE WE RESPONDED A LOT? SKP /KEEP TRYING JMP HANGUP /GIVE UP JMS GENCRC SAKM 6 JMS SENDM SAKM-4 SAKM+7 / JMS GETMESS /WAIT FOR RESPONCE JMP CIFOK /GOT SOMETHING, SEE IF IT'S OK. JMP SENSAK /TIMED OUT REPOND AGAIN HLT /TOO LATE TO RING NOW / CIFOK, JMS CKHED /CHECK HEADER CRC JMP SENSAK /BAD CRC TAD I HD0 TAD (-ENQ /START AGAIN? SZA CLA JMP STARTD /NO, STARTED UP TAD I HD1 TAD (-STRT SZA CLA JMP STARTD /COULD BE AN ACK OR SOMETHING JMP NEWSAK /HE MUST HAVE MISSED MY SAK / / ANSWER,ZBLOCK 3 /MESSAGE TO TELL CLOCK TO RESTART IN 3 SECS ZBLOCK 2 3^SHERTZ /THREE SECONDS PAGE IFDEF FREESP <*FREESP> /USE SOME LEFTOVER SPACE SYNC;SYNC;SYNC;SYNC FISEL;FILL STARTM, ENQ;STRT /START MESSAGE 1 /NUMBER OF FIRST MEASAGE TO BE SENT A0;ZBLOCK 2 /DESTINATION ADDRESS AND SPACE FOR CRC // SYNC;SYNC;SYNC;SYNC SAKM, ENQ;STAK /START ACKNOLEDGE MESSAGE FISEL FSTSEQ, 0 /THEIR FIRST SEQENCE NUMBER GOES HERE 1;A0;ZBLOCK 2 /OUR FIRST NUMBER,DEST.ADDR.,BCC SPAVE. / EJECT IFDEF MCRFLD < FIELD MCRFLD%10 NAMES=6176 *TASK^2+NAMES 0404 /DD 0320 /CP > / START=DP8E $