File HOTCRC.PA (PAL assembler source file)

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

	/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



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