ENTRY UNPACK UNPACK: MOVEM 2,TEMP+0 MOVEM 3,TEMP+1 MOVEM 4,TEMP+2 MOVEM 5,TEMP+3 MOVE 0,@0(16) ; RO = N JUMPLE 0,UOUT MOVEI 1,@1(16) ; R1 -> FROM.STRING MOVEI 2,@2(16) ; R2 -> TO.STRING UWHILE: ; DO UWHILE N < 0 (MORE CHARS TO GO) MOVE 3,0(1) ; R3 = PACKED FROM.WORD MOVEI 4,5 ; R4 COUNTS BYTES LOOP: ; LOOP FOR 5 BYTES/WORD MOVE 5,[^O774000000000] AND 5,3 ; AND OUT ALL BUT H/O ASCII CHAR LSH 5,^D-29 ; RIGHT JUSTIFY IT MOVEM 5,0(2) ; LOAD CHAR -> TO.STRING ADDI 2,1 ; R2 -> NEXT TO.CHAR SOJLE 0,ENDL ; EXITIF NO.MORE.CHARS.TO.UNPACK SOJLE 4,ENDL ; EXITIF NO.MORE.CHARS.THIS.WORD LSH 3,7 ; SHIFT OUT PROCESSED CHARACTER JRST 0,LOOP ; END LOOP ENDL: ADDI 1,1 ; R1 -> NEXT FROM.WORD JUMPG 0,UWHILE ; END UWHILE UOUT: MOVE 5,TEMP+3 MOVE 4,TEMP+2 MOVE 3,TEMP+1 MOVE 2,TEMP+0 POPJ 17,0 ; RETURN TEMP: BLOCK 5 PRGEND TITLE GETFLD ; ; GETFLD(VAR,OFFSET,LENGTH) ; ; FUNCTION - RETURN A BYTE OF LENGTH BITS STARTING AT BIT ; (WHERE 0 IS THE LEFTMOST BIT) FROM VAR ENTRY GETFLD ; AC ASSIGNMENTS A=1 B=2 C=3 L=16 P=17 GETFLD: PUSH P,A ; SAVE ACS PUSH P,B PUSH P,C ; CREATE A BYTE POINTER FOR GETTING THE BYTE FROM VAR (C IS BYTE POINTER). MOVE A,@2(L) ; GET VALUE OF LENGTH. MOVE B,A ; AND SAVE FOR LATER. ADD A,@1(L) ; A = OFFSET + LENGTH MOVEI C,^D36 ; PREPARE TO CALCULATE P FIELD OF RESULTANT B.P. SUB C,A ; P FIELD = 36. - (OFFSET+LENGTH) LSH C,^D30 ; PUT IN PLACE IN C. LSH B,^D24 ; PUT LENGTH FIELD IN PROPER PLACE IN B.P. IOR C,B HRRI C,@(L) ; GET ADDRESS OF VAR LDB 0,C ; LOAD BYTE INTO AC 0 FOR FUNCTION RETURN ; RESTORE ACS AND RETURN POP P,C POP P,B POP P,A POPJ P, END