.TITLE MOVEUP ;MOVE DATA UP BUFFER .GLOBL MOVEUP ;MOVE DATA UP IN BUFFER BY NN BITS ;GIVEN START WORD, BIT-IN-WORD (FROM LEFT), AND ;START BIT AND WORD OF OUTPUT AND WORDS TO TRANSFER ; ;CALL: ; CALL MOVEUP(WSTART,BSTART,WC,ISTART,ISTBIT) ;ALL ARGS INTEGERS ;MOVE WC WORDS FROM (ISTART,ISTBIT) TO (WSTART,BSTART) ; MOVEUP: TST (R5)+ ;SKIP ARG COUNT MOV (R5)+,-(SP) ;SAVE WSTART MOV @(R5)+,-(SP) ;SAVE BSTART MOV @(R5)+,-(SP) ;SAVE WC MOV (R5)+,-(SP) ;SAVE ISTART MOV @(R5)+,-(SP) ;SAVE ISTBIT MOV SP,R4 ;POINT R4 AT STACKED ARGS WSTART=10 BSTART=6 ;DEFINE OFFSETS OFF R4 TO ARGS ON STACK WC=4 ISTART=2 ISTBIT=0 MOV @WSTART(R4),R0 ;START WORD MOV BSTART(R4),R1 ;START BIT ;MASK OFF DATA ORIGINALLY IN WORD OUT WHERE IT WILL BE OVER-WRITTEN BIC #-20,R1 ;GUARANTEE START BIT IN 0-15 RANGE ;(REALLY IT IS BITS TO SKIP IN WORD) BNE 22$ ;IF NON-ZERO, SHIFT LOGIC OK CLR R0 ;BUT IF SKIPPING 0, SHIFT LOGIC FAILS 22$: SUB #20,R1 ;FORM NBITS-16. = - NO. BITS TO SHIFT OFF NEG R1 BIC #-20,R1 ;ZOT OUT ALL BUT 0-15 RANGE NEG R1 ASH R1,R0 ;SHIFT OFF UN-NEEDED BITS NEG R1 ASH R1,R0 ;THEN SHIFT BACK 0'S MOV R0,@WSTART(R4) ;COPY DATA BACK ;NOW REMOVE SKIPPED BITS IN INPUT WORD MOV ISTBIT(R4),R1 ;START BIT (ASSUMES INPUT, OUTPUT IN DIFFERENT ;WORDS) (SHIFT COUNT OF 0 IS PERFECTLY LEGAL) MOV @ISTART(R4),R3 ;GET DATA ASH R1,R3 ;SHIFT DATA LEFT BY START BIT NO. SHIFTS CLR R2 ;NOW SET UP 0'S IN H.O. OF 32 BITS NEG R1 ;SET FOR RIGHT SHIFT... ASHC R1,R2 ;SHIFT RIGHT AGAIN MOV R3,@ISTART(R4) ;AND BASH START LOC. EARLY BITS MOV ISTBIT(R4),R3 SUB BSTART(R4),R3 ;GET BIT LOC AND FIGURE OUT HOW FAR TO ;SHIFT BPL 1$ NEG R3 ;NEGATIVE, SO NOW GUARANTEE LEGAL RANGE... BIC #-20,R3 ;GUARANTEE IN 0-15 RANGE OR 0--15 NEG R3 ; NOW MAKE IT 0 TO -15 AS REQUIRED BR 2$ 1$: BIC #-20,R3 ;PERFORM ELABORATE RANGE CHECK ON POS. SHFT. 2$: MOV WSTART(R4),R0 ;START WORD OUT MOV ISTART(R4),R1 ;AND IN (ADDRESSES...) MOV WC(R4),R2 ;WORDS TO DO MOV R5,-(SP) ;SAVE R5,R4 MOV R4,-(SP) TST R3 ;WHICH WAY DO WE SHIFT? BPL 10$ ;LEFT SHIFT (OR NO SHIFT) MOV (R1)+,R5 ;L.O. RIGHT SHIFT MOV (R1),R4 ;H.O. ASHC R3,R4 ;SHIFT DATA RIGHT BIS R5,(R0)+ ;SET BITS INTO OUTPUT FIRST TIME THRU BR 20$ 10$: MOV (R1)+,R4 ;SHIFT H.O. LEFT WORD MOV -4(R1),R5 ;LEFT SHIFT WORD N-1 ASHC R3,R4 BIS R4,(R0)+ ;LEAVE BITS IN OUTPUT ON IF THERE NOW 20$: DEC R2 ;DECREASE WORD COUNT BY 1 BLE 30$ ;BE SURE ANY ARE LEFT 40$: TST R3 ;CHECK RIGHT OR LEFT SHIFT REQUIRED BPL 41$ MOV (R1)+,R5 ;L.O. = WORD N FOR RIGHT SHIFT MOV (R1),R4 ;H.O. = WORD N+1 FOR RIGHT SHIFT ASHC R3,R4 ;SHIFT BY BIT DIFFERENCE MOV R5,(R0)+ ;SAVE L.O. FOR RIGHT SHIFT BR 42$ 41$: MOV (R1)+,R4 ;H.O. = WORD N FOR LEFT SHIFT MOV -4(R1),R5 ;L.O. = WORD N-1 FOR LEFT SHIFT ASHC R3,R4 ;SHIFT BY BIT DIFFERENCE MOV R4,(R0)+ ;SAVE DATA 42$: DEC R2 BPL 40$ ;DO ALL WORDS LEFT TO DO 30$: MOV (SP)+,R4 MOV (SP)+,R5 ;RESTORE R4,R5 ADD #12,SP ;POP ARGS OFF STACK RTS PC .END