;
;	USER.ASM vers. 1.2
;	  by Ron Fowler
;	     Westland, Mich.
;
;
;	  revised 8/7/80
;
;     (FOR USE WITH CP/M-2.x ONLY)
; This program is used to restrict access
; to the higher user areas while  leaving
; the lower user areas public.	The high-
; est available public user area  is  de-
; fined by "MAXUSER".
;
;08/07/80 CORRECTED TO MAINTAIN REQUESTED
;	  USER NUMBER EVEN AFTER WARM BOOT.
;	  AND TO ALLOW NUMBERS HIGHER THAN
;	  9.  By Keith Petersen, W8SDZ.
;
;08/07/80 Replaced RAL instructions with RLC to 
;	  eliminate drive select error caused by
;	  rotating carry bit into accumulator.
;	  By Dave Hardy and Bruce Levison
;
;08/08/80 Modified for improved response time
;	 by calling the setusr function after
;	 modifying the drive byte at loc 4,
;	 bypassing the need to warm boot
;		By Ron Fowler
;
;
DFCB	EQU	5CH 
MAXUSER EQU	9	;for example
SETUSR	EQU	32	;set user in bdos
DRIVE	EQU	4
BDOS	EQU	5
;
	ORG	100H
;
	LXI	H,DFCB+1 ;POINT TO ORIGINATING USER # IN CMD LINE
	MVI	E,0
NUMLUP:
	MOV	A,M	;GET CHARACTER
	INX	H	;BUMP CHAR POINTER
	SUI	'0'	;REMOVE ASCII BIAS
	JC	NUMDONE
	CPI	10	;CHECK IF PAST 9
	JNC	NUMDONE ;ANY INVALID CHAR ENDS NUMBER
	MOV	D,A
	MOV	A,E	;GET ACCUMULATED NUMBER
	ADD	A	;TIMES TWO
	ADD	A	;TIMES FOUR
	ADD	E	;TIMES FIVE
	ADD	A	;TIMES TEN
	ADD	D	;PLUS NEW DIGIT
	MOV	E,A	;SAVE ACCUMULATION
	JMP	NUMLUP	;LOOP BACK FOR NEXT CHAR
;
NUMDONE:
	MOV	A,E	;GET ACCUMULATED NUMBER
	ORA	A	;BELOW ZERO OR ABOVE 127?
	JM	HUH	;INVALID CHARACTER ENTERED
	CPI	MAXUSER+1
	JNC	HUH	;RESTRICT ACCESS
	RLC ! RLC ! RLC ! RLC	;MOVE TO UPPER NIBBLE
	MOV	B,A	;SAVE REQUESTED USER NUMBER
	LDA	DRIVE	;GET CURRENT USER/DRIVE
	ANI	0FH	;STRIP OFF OLD USER NUMBER
	ORA	B	;GET NEW USER NUMBER
	STA	DRIVE	;SET NEW USER NUMBER
	MVI	C,SETUSR ;SET THE USER FOR NOW
	JMP	BDOS	;SET IT AND EXIT
;
HUH:	LXI	D,MSG
	MVI	C,9	;PRINT STRING FUNCTION
	JMP	BDOS	;PRINT & EXIT 
;
MSG:	DB	'Only USER 0-'
	DB	MAXUSER+30H
	DB	' available.$'
;
	END
