; FUNCTION IRAM ; ;*********************************************************************** ; * ; FORTRAN CALLING SEQUENCE: NWORD = IRAM(IWORD,KOUNT,MASK) * ; * ; WHERE: IWORD IS THE WORD TO BE ROTATED AND MASKED. * ; KOUNT IS THE NUMBER OF BITS TO CIRCULAR ROTATE 'IWORD'. * ; + RIGHT CIRCULAR ROTATE 'IWORD' KOUNT BITS. * ; 0 NO ROTATION. * ; - LEFT CIRCULAR ROTATE 'IWORD' -KOUNT BITS. * ; MASK IS THE WORD MASK LOGICALLY 'AND'ED TO THE RESULT * ; AFTER 'IWORD' IS ROTATED. * ; NWORD IS THE RESULT OF 'IWORD' AFTER ROTATION AND MASK. * ; * ;*********************************************************************** ; ; .TITLE IRAM .GLOBL IRAM R0=%0 R1=%1 R2=%2 R3=%3 R5=%5 SP=%6 PC=%7 ; IRAM: TST (R5)+ ; INCREMENT TO 1ST ARGUMENT MOV @(R5)+,R0 ; MOVE 'IWORD' TO R0 MOV @(R5)+,R3 ; MOVE 'KOUNT' TO R3 MOV @(R5)+,R2 ; MOVE 'MASK' TO R2 ; TST R3 ; TEST 'KOUNT' LOOP: BEQ MASK BMI LEFT ; KOUNT -, LEFT ROTATE ; BPL RIGHT ; KOUNT +, RIGHT ROTATE ; RIGHT: CLR R1 ; CLEAR R1 FOR CARRY BIT STORAGE ASR R0 ; ARITHMETIC SHIFT RIGHT 1 BIT BIC #100000,R0 ; LOGICAL 'AND' WITH ABSOLUTE FOR CARRY ROR R1 ; RIGHT ROTATE, SHIFT IN CARRY BIT BIS R1,R0 ; INCLUSIVE 'OR' OF CARRY AFTER SHIFT DEC R3 ; DECREMENT KOUNT BR LOOP ; TEST KOUNT ; LEFT: CLR R1 ; CLEAR R1 FOR CARRY BIT STORAGE ASL R0 ; ARITHMETIC SHIFT LEFT 1 BIT BIC #000001,R0 ; LOGICAL 'AND' WITH ABSOLUTE FOR CARRY ROL R1 ; LEFT ROTATE, SHIFT IN CARRY BIT BIS R1,R0 ; INCLUSIVE 'OR' OF CARRY AFTER SHIFT INC R3 ; INCREMENT KOUNT BR LOOP ; TEST KOUNT ; MASK: COM R2 ; COMPLEMENT R2 BIC R2,R0 ; LOGICAL 'AND' WITH MASK, RESULT IN R0 RTS PC ; RETURN .END IRAM