	ALWAYS	26MAR4	OFFSET	<OFFSET - ESTABLISH OFFSET VALUE>		;26MAR4
	.MCALL	DIR$,CALLR							;**-1
;************************************************************************
;*									*
;*	MODULE: OFFSET - ASSIGN A VALUE TO OFFST			*
;*									*
;*	AUTHOR: KEVIN ANGLEY						*
;*									*
;*	DATE:	20-JUL-82						*
;*									*
;*	INPUT PARAMETERS:						*
;*									*
;*		R0 POINTS TO THE COMMAND LINE IN PROCESS		*
;*									*
;*	OUTPUT PARAMETERS:						*
;*									*
;*		R0 POINTS JUST BEYOND THE LAST CHARACTER OF THE OFFSET	*
;*									*
;*	DESTROYS:	R1,R2,R3,R4,R5					*
;*									*
;*	IF NO VALUE IS SPECIFIED, THE OFFSET VALUE IS DISPLAYED.	*
;*									*
;*	REVISED BY: CHRIS DORAN, SIRA LTD.				*
;*									*
;*	DATE: JAN-84							*
;*									*
;*	MODIFICATIONS:							*
;*		Put BOS and OFF messages, only used here, into this	*
;*		  module, for overlaid code.				*
;*		Comment out currently unused OFFSTA entry code.		*
;*									*
;*	26MAR4	Scott Smith, Telex Computer Products, Raleigh, NC	*	;26MAR4
;*		Uncommented OFFSTA code.				*	;26MAR4
;*									*	;26MAR4
;************************************************************************

	.ENABL	LSB
OFFSTA::			; AUTO-OFFSET ENTRY POINT			;26MAR4
				;  PROGRAM GENERATED CALL TO SET OFFSET		;26MAR4
				;  TO 24-BIT MODE, AND TO VALUE IN R3/R4	;26MAR4
	MOV	R3,OFFST	; ESTABLISH NEW OFFSET				;26MAR4
	MOV	R4,OFFST+2							;26MAR4
	PUSH	#24.		; INDICATE PROGRAM GENERATED (@SP <> 0)		;26MAR4
	MOV	@SP,MODE	; FORCE 24-BIT MODE				;26MAR4
	BR	10$		; GO DISPLAY NEW OFFSET				;26MAR4
OFFSET::									;**-9
	CLR	-(SP)		; INDICATE NORMAL ENTRY				;26MAR4
	TSTB	(R0)		; VALUE SPECIFIED?				;**-1
	BEQ	10$		; NO - JUST OUTPUT THE VALUE
	MOV	R0,R2		; PUT CURRENT CHARACTER POINTER IN R2
	MOV	MODE,R5		; SAVE OLD MODE IN R5
1$:
	TSTB	(R2)+		; FIND THE ASCIZ TERMINATOR
	BNE	1$		;  NE: HAVEN'T FOUND IT YET
	DEC	R2		; R2 POINTS TO LAST CHARACTER IN OFFSET
	SUB	R0,R2		; MAKE R2 CONTAIN NUMBER OF HEX DIGITS
	MOV	#16.,MODE	; ASSUME 16 BIT MODE
	CMP	#4.,R2		; DID USER GIVE US 4 HEX DIGITS (16 BITS)?
	BEQ	4$		;  EQ: YES, ASSUMPTION IS CORRECT
	MOV	#24.,MODE	; ASSUME 24 BIT MODE
	CMP	#6.,R2		; DID USER GIVE US 6 HEX DIGITS (24 BITS)?
	BEQ	4$		;  EQ: YES, ASSUMPTION IS CORRECT
	MOV	#32.,MODE	; ASSUME 32 BIT MODE
	CMP	#8.,R2		; DID USER GIVE US 8 HEX DIGITS (32 BITS)?
	BEQ	4$		;  EQ: YES, ASSUMPTION IS CORRECT
	OUTPUT	<BOS>		; "OFFSET MUST BE 16, 24, OR 32-BIT VALUE"
	BR	250$		; TAKE ERROR EXIT
4$:
	CALL	GETHXL		; GET A HEX VALUE FROM COMMAND LINE
				;	R1 (LOW WORD)
				;	R2 (HIGH WORD)
	BCS	250$		;  CS: ERROR
	BIT	#1,R1		; IS OFFSET SPECIFIED ODD?
	BEQ	5$		;  EQ: NO
	OUTPUT	EVO		; SHOW ERROR MESSAGE - OFFSET MUST BE EVEN
	BR	250$		; TAKE ERROR EXIT
5$:
	MOV	R1,OFFST	; ESTABLISH NEW OFFSET VALUE
	MOV	R2,OFFST+2
10$:
	PUSH	R0		; SAVE COMMAND STRING POINTER
	PUSH	R1		; SAVE R1
	MOV	OFFST,R1	; PREPARE FOR CONVERSION
	MOV	OFFST+2,R2
	MOV	#OFF+OFFLEN-8.,R0 ; PUT INTO MESSAGE
	CALL	PUTHXJ		; CONVERT TO HEX - PUT IN MESSAGE
	OUTPUT	OFF
	POP	R1		; RESTORE R1
	POP	R0		; RESTORE COMMAND STRING POINTER
	BR	253$		; TAKE SUCCESS EXIT
250$:				;  ERROR EXIT
	MOV	R5,MODE		; RESTORE OLD MODE
	SEC			; Set carry
253$:
	MOV	@SP,(SP)+	; IS THIS A PROGRAM GENERATED OFFSET CALL?	;26MAR4
	BNE	255$		;  NE: YES, DON'T PURGE EXTRA COMMAND LINE	;**-1
	CALLR	EXTRA		; PURGE COMMAND LINE OF SUPERFLUOUS JUNK
255$:
	RETURN			;   AND RETURN

	.PSECT	PURE	RO,D
	DEFM	BOS	<Offset must be 16, 24, or 32-bit value>
	DEFM	EVO	<Offset must be even>
	.EVEN

	.PSECT	DATA	RW,D

	DEFM	OFF	<Offset: 00000000>
	.EVEN

	.END
