ALWAYS 30APR2 CRC ;30APR2 .MCALL DIR$ ;**-1 .PSECT ;************************************************************************ ;* * ;* MODULE: CRC * ;* * ;* FUNCTION: COMPUTE A 16-BIT FORWARD CRC OVER A RANGE * ;* * ;* INPUT PARAMETERS: * ;* * ;* R0 POINTS TO THE COMMAND LINE IN PROCESS * ;* * ;* OUTPUT PARAMETERS: * ;* * ;* R0 POINTS JUST BEYOND COMMAND LINE * ;* * ;* DESTROYS: ALL REGISTERS * ;* * ;* AUTHOR: KEVIN ANGLEY * ;* * ;* DATE: 29-AUG-80 * ;* * ;************************************************************************ ;30APR2 ; 30APR2 KEVIN ANGLEY CORRECTED INCORRECT USAGE OF FLAGS AFTER THE ;30APR2 ; GETKEY MACRO. SHOULD USE Z-FLAG TO DETERMINE ;30APR2 ; MATCH (Z SET) OR NO MATCH (Z CLEAR). ;30APR2 ; ;30APR2 ;30APR2 CRC:: CALL FROMTH ; GET FROM ADDR IN R1, THRU ADDR IN R2 ; AND COUNT IN R3 BCS 255$ ; CS: FAILURE PUSH R0 ; SAVE COMMAND LINE POINTER CLR R2 ; USE ZERO PRESET CRC 10$: MOVB MEMORY(R1),R4 BIC #177400,R4 ; CLEAR HIGH BYTE MOV #120001,R0 XOR R4,R2 ; XOR NEW BYTE INTO CRC MOV #8.,R5 ; BIT COUNT FOR DIVIDE 20$: CLC ROR R2 BCC 30$ XOR R0,R2 ; SUBTRACT POLY 30$: SOB R5,20$ ; DECREMENT BIT COUNT INC R1 ; NEXT LOCATION SOB R3,10$ ; CONTINUE FOR COUNT MOV R2,R1 ; PREPARE TO OUTPUT SWAB R1 ; PUT IN HIGH-LOW MOV #CRO+CROLEN-4,R0 ; PUT INTO MESSAGE CALL PUTHX4 OUTPUT CRO ; OUTPUT THE MESSAGE POP R0 ; RESTORE COMMAND LINE POINTER TSTB (R0) ; "TO" SPECIFIED? BEQ 255$ ; EQ: NO - TAKE NO ACTION GETKEY TO ; GET KEYWORD "TO" BEQ 40$ ; EQ: GOT IT ;30APR2 OUTPUT MSK ; MISSING KEYWORD ;**-1 BR 255$ ; TAKE ERROR EXIT 40$: CMPB #'%,(R0) ; PSEUDO-REGISTER DESTINATION FOR CRC? BNE 45$ ; NE: NO - GET 4-DIGIT HEX ADDRESS INC R0 ; POINT TO REGISTER NUMBER CLR R1 ; CLEAR HIGH BYTE OF REGISTER NUMBER CALL GETHX2 ; GET TWO DIGIT HEX NUMBER BCS 255$ ; CS: FAILURE MOVB R2,REGISTER(R1) ; PUT IN HIGH BYTE INCB R1 ; INCREMENT REGISTER NUMBER WITH WRAP SWAB R2 ; PREPARE TO PUT OUT LOW BYTE MOVB R2,REGISTER(R1) ; PUT IN LOW BYTE BR 255$ ; ALL DONE 45$: CALL GETHX4 ; GET TARGET ADDRESS BCS 255$ ; CS: FAILED CALL VALID ; VALIDATE AND OFFSET BCS 255$ ; CS: INVALID MOVB R2,MEMORY(R1) ; PUT HIGH BYTE IN INC R1 SWAB R2 ADD OFFST,R1 ; UN-OFFSET CALL VALID ; VALIDATE AND OFFSET LOC FOR LOW BYTE BCS 255$ ; CS: INVALID MOVB R2,MEMORY(R1) ; PUT IN LO BYTE 255$: CALL$R EXTRA ; PURGE SUPERFLUOUS COMMAND LINE .END