;MACRO SUB TO CALC A CRC CHARACTER ; ; MAIN CALL ; CALL "CRC"(I,J,K) ; ; WHERE ; I IS CURRENT VALUE OF CRC CHARACTER ; J IS NEW WORD TO BE ADDED ; K IS NEW VALUE OF CRC CHARACTER ; ; ; IDENTIFYING INFO .MCALL ULODHD ;CALL MACRO ;IDENTIFY START OF CODE, END OF CODE ;AND ONE ENTRY POINT ULODHD CRC,END,CRC ; AC0=%0 AC1=%1 ; ; CRC: ;LABLE ACTUAL START OF CODE JSR R4,@#GTRGPI ;GO GET ARGUMENTS IN PI FASHION .BYTE 1,1,2,0 ;OLD CRC (2 WORDS, ON STACK) ;NEW WORD (2 WORDS, ON STACK) ;RETURNED CRC (5 WORD TARGET) JSR PC,@#PARCHK ;CHECK FOR TRAILING RIGHT PAREN SETI ;SET INTEGER MODE SETF ;NORMAL FLOATING LDF (SP)+,AC0 ;GET OLD CRC WORD LDF (SP)+,AC1 ;GET ADDED WORD MOV R0,-(SP) ;SAVE USED REGS NOW MOV R1,-(SP) MOV R2,-(SP) STCFI AC0,R0 ;OLD CRC VALUE TO R0 STCFI AC1,R1 ;NEXT WORD TO R1 xor r0,r1 ; do xor mov r1 ,r2 ; get the high four bits ash #-4 ,r2 ; and move them over to 3..0 bic #^C17 ,r2 ; drop any bits left over bic #^C17 ,r1 ; and the low four bits asl r1 ; times 2 for word addressing asl r2 ; times 2 for word addressing mov crctb2(r1),r1 ; get low portion of CRC factor mov crctab(r2),r2 xor r2,r1 ; simple (limited modes for XOR) swab r0 ; shift off a byte from previous crc bic #^C377 ,r0 ; clear new high byte xor r1 ,r0 ; add in the new value LDCIF R0,AC0 ;PUT BACK TO FLOATING MOV (SP)+,R2 ;RESTORE USED REGS MOV (SP)+,R1 MOV (SP)+,R0 MOV SP,R5 ;R5 => 3RD ARG JSR PC,@#NSTORE ;RETURN ARG TO PROGRAM ADD #12,SP ;UN-KLUTZ STACK POINTER RTS PC ;BACK TO MAIN PROG ; crctab: .word 0 .word 10201 .word 20402 .word 30603 .word 41004 .word 51205 .word 61406 .word 71607 .word 102010 .word 112211 .word 122412 .word 132613 .word 143014 .word 153215 .word 163416 .word 173617 crctb2: .word 0 .word 10611 .word 21422 .word 31233 .word 43044 .word 53655 .word 62466 .word 72277 .word 106110 .word 116701 .word 127532 .word 137323 .word 145154 .word 155745 .word 164576 .word 174367 ; END: .END