.TITLE UTILS .IDENT /BL1.0/ ; ; ZERO AN INTEGER BUFFER , ISIZE = # OF WORDS ; CALL ZEROB(IB(1),ISIZE) ; .ENTRY ZEROA,^M MOVL AP,R5 MOVL (R5)+,R4 ; Number of params JSB TESTP BEQL 50$ ; No parameter MOVL R3,R0 ; Initial address JSB TESTP BEQL 50$ ; None ? SUBL R0,R3 BLEQ 50$ ; Bad address MOVC5 #0,(R0),#0,R3,(R0) ; Clear R3 bytes 50$: RET ; ; SEPARATES 1 WORD INTO 16 WORDS VIA BITS ; CALL SEP(CODE WD,ARRAY OF CODE WD) ; .ENTRY SEPWW,^M MOVL AP,R5 MOVL (R5)+,R4 ; Number of params JSB TESTP BEQL 50$ ; No parameter MOVW (R3),R0 ; Word to separate JSB TESTP BEQL 50$ CVTBL #16,R1 BRB 11$ ; Start with compare 10$: ASHL #-1,R0,R0 ; Get next low bit 11$: BLBS R0,20$ ; Low bit set ? CLRW (R3)+ SOBGTR R1,10$ RET 20$: CVTBW #1,(R3)+ ; Indicate bit set SOBGTR R1,10$ 50$: RET ; ; CALL IZTOT(IARRAY,ISIZE) IZTOT ; NO = IZTOTW(IARRAY,ISIZE) ; NO IS THNE THE NUMBER OF NON ZERO ELEMENTS IN THE ARRAY .ENTRY IZTOTW,^M MOVL AP,R5 MOVL (R5)+,R4 ; Number of params CLRL R0 JSB TESTP BEQL 50$ ; No parameter MOVL R3,R1 ; Array address JSB TESTP ; Another param BEQL 50$ ; No ? CVTWL (R3),R3 ; Get array size BEQL 50$ ; None ? 10$: TSTW (R1)+ ; Non zero ? BEQL 20$ ; No ? INCL R0 20$: SOBGTR R3,10$ 50$: RET ; ; CALL MOVEW(IA,IB,ISIZE) ; THIS SUBROUTINE MOVES ARRAY IA TO ARRAY IB OF SIZE ISIZE ; .ENTRY MOVEW,^M BSB MOVBEG ; Get params ASHL #1,R2,R2 ; Now is byte count MOVC3 R2,(R0),(R1) ; Move the char string RET .ENTRY MOVEB,^M BSB MOVBEG ; Get params MOVC3 R2,(R0),(R1) ; Move the char string RET MOVEF:: .ENTRY MOVEL,^M BSB MOVBEG ; Get params ASHL #2,R2,R2 ; Now is byte count MOVC3 R2,(R0),(R1) ; Move the char string RET MOVED:: .ENTRY MOVEQ,^M BSB MOVBEG ; Get params ASHL #3,R2,R2 ; Now is byte count MOVC3 R2,(R0),(R1) ; Move the char string RET MOVBEG: MOVL AP,R5 MOVL (R5)+,R4 ; Number of params JSB TESTP BEQL 50$ ; No parameter MOVL R3,R0 ; Address of input array JSB TESTP BEQL 50$ ; No parameter MOVL R3,R1 ; Output array JSB TESTP BEQL 50$ ; No parameter CVTWL (R3),R2 ; Element count BEQL 50$ ; None ? RSB 50$: RET ; ; CALL SWAPB(IA,IB,LENGTH) ; SWAPS ARRAYS IA,IB OF LENGTH LENGTH ; SWAPD:: .ENTRY SWAPQ,^M BSB MOVBEG ; Get params ASHL #3,R2,R2 ; Get count shifted to quad count BRB SWAP SWAPF:: .ENTRY SWAPL,^M BSB MOVBEG ; Get params ASHL #2,R2,R2 ; Get count shifted to quad count BRB SWAP .ENTRY SWAPW,^M BSB MOVBEG ; Get params ASHL #1,R2,R2 ; Get count shifted to quad count BRB SWAP .ENTRY SWAPB,^M BSB MOVBEG ; Get params SWAP: ASHL #-3,R2,R3 ; Get count shifted to quad count BEQL 20$ ; None ? 10$: MOVQ (R0),R4 ; Get source MOVQ (R1),(R0)+ ; Dest to source MOVQ R4,(R1)+ ; Source to dest SOBGTR R3,10$ 20$: BICL #^XFFFFFFF8,R2 ; Bytes to swap ? BEQL 50$ ; None 30$: MOVB (R0),R4 ; Get source MOVB (R1),(R0)+ ; Dest to source MOVB R4,(R1)+ SOBGTR R2,30$ 50$: RET ; ; I = IRAMW(IWORD,ICOUNT,IMASK) ; IWORD IS ROTATED ICOUNT PLACES TO RIGHT &ANDED WITH IMASK IRAM:: .ENTRY IRAMW,^M MOVL AP,R5 MOVL (R5)+,R4 ; Number of params CLRL R0 JSB TESTP BEQL 50$ ; No parameter MOVW (R3),R0 ; Word to shift ASHL #16,R0,R0 ; Shift up to upper half MOVW (R3),R0 ; Same in both halves JSB TESTP BEQL 50$ ; No parameter ROTL (R3),R0,R0 ; Rotate the word JSB TESTP BEQL 50$ ; No parameter MCOMW (R3),R1 ; Get complement of input BICW R1,R0 CVTWL R0,R0 ; Convert to longword 50$: RET .END