	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 <LENGTH> BITS STARTING AT BIT
;		<OFFSET> (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
