/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