.TITLE FIXIT ;CALL FIXIT(DATA,SHFT,ANS) ;ANS RETURNS AS OR OF ANS WITH DATA SHIFTED LEFT BY SHFT ; BITS. .GLOBL FIXIT FIXIT: MOV 2(R5),R0 ;INPUT DATA ADDR MOV @4(R5),R1 ;SHIFT COUNT MOV 6(R5),R2 ;OUTPUT ADDRESS MOV (R0)+,R3 ;LOWORDER NUMBER MOV @R0,R4 ;HIGH ORDER NUMBER TST R1 ;SHIFT COUNT ZERO? BEQ 10$ ;IF SO DON'T SHIFT! CLC ;INITIALLY TURN OFF C BIT 1$: ROL R3 ;ROTATE UP LOW ORDER PART ROL R4 ;THEN THE HIGH ORDER PART DEC R1 ;COUNT DOWN BITS TO DO BGT 1$ ;THEN TRY AGAIN. NOTE C BIT SAME 10$: BIS R3,(R2)+ ;OUTPUT LOW ORDER NUMBER BIS R4,(R2) ;OUTPUT HIGH ORDER NUMBER TOO RTS PC ;BACK TO CALLER .GLOBL LC ;LEFT CIRCULAR SHIFT LC: MOV 2(R5),R4 ;IN ADDR MOV @4(R5),R3 ;NO BITS TO SHIFT UP MOV (R4)+,R0 ;LOW ORDER RESULT MOV @R4,R1 ;HIGH ORDER RESULT CLR R1 ;(USE I2 ONLY...) TST R3 ;CHECK COUNT BGT 1$ ;IF POS, OK ; RTS PC ;GO AWAY IF SHFT COUNT TOO BIG 1$: CLC 2$: ROL R0 ;SHIFT LOW ORDER UP ROL R1 ;THEN H.O. DEC R3 ;COUNT DON BITS TO DO BGT 2$ RTS PC ;RETURN WHEN DONE .GLOBL LLC ;I4 SHIFT FUNCTION LLC: MOV 2(R5),R4 ;IN ADDR MOV @4(R5),R3 ;NO BITS TO SHIFT UP MOV (R4)+,R0 ;LOW ORDER RESULT MOV @R4,R1 ;HIGH ORDER RESULT TST R3 ;CHECK COUNT BGT 1$ ;IF POS, OK ; RTS PC ;GO AWAY IF SHFT COUNT TOO BIG 1$: CLC 2$: ROL R0 ;SHIFT LOW ORDER UP ROL R1 ;THEN H.O. DEC R3 ;COUNT DON BITS TO DO BGT 2$ RTS PC ;RETURN WHEN DONE .GLOBL I4RL ;32 BIT RIGHT CIRC SHIFT BY COUNT ;OF 32 BIT OBJECT ; ;II=I4RL(DATA,SHIFTCOUNT) I4RL: MOV 2(R5),R0 ;DATA ADDR MOV @4(R5),R1 ;SHIFT COUNT MOV (R0)+,R3 MOV @R0,R4 ;NOW HAVE DATA; SHIFT IT DOWN. DO CIRCULARLY. TST R1 ;ANY SHIFTS? BLE XIT ;NO, RETURN DATA CLC LOOP: ROR R4 ;H.O. LOW BIT TO C BIT ROR R3 ;SHIFT C INTO L.O. DEC R1 ;COUNT DOWN SHIFTS LEFT (C BIT UNCHNGD) BGT LOOP ;KEEP ON TRUCKING.. ;ALL THE SHIFT IS DONE NOW. XIT: MOV R3,R0 ;LOW ORDER MOV R4,R1 ;HIGH ORDER RTS PC .END