;
;		USERID.ASM AS OF 12/1/80
;
;WRITTEN BY HOWARD MOULTON; SYSOP OF AMBBS REMOTE CP/M
;AMESBURY, MASS. 617-388-5125 (RINGBACK: SEE RCPMLIST.DOC)
;PROGRAM FOR USE AS PUBLIC DOMAIN SOFTWARE.
;
;ANY CHANGES AND IMPROVMENTS WOULD BE GREATLY APPRECIATED
;IF YOU LET ME KNOW WHAT THEY ARE SO WE ALL CAN SHARE THEM.
;THIS PROGRAM IS JUST A SMALL CONTRIBUTION AND ALL I HAVE
;TO OFFER FOR ALL THE CP/M SOFTWARE I'VE RECIEVED FROM THE
;MANY PEOPLE I'VE MET THRU CP/M USERS.
;
;12/1/80 MODIFIED TO OPERATE UNDER CP/M VERS.2.2 USING ATTRIBUTE
;	 MODIFICATION, DRIVE SELECT, USER AREA SELECT, CONTROL-C
;	 TRAP AND AUTOMATIC LOCATION OF THE CONSOLE COMMAND PRO-
;	 CESSOR COMMAND TABLE. BY: ROD HART WA3MEZ
;
;
;THE FOLLOWING MUST BE CHANGED TO CORRESPOND TO YOUR SYSTEM.
;
FALSE	EQU	0
TRUE	EQU	NOT FALSE
;
V1	EQU	FALSE	;TRUE IF CP/M VERSION 1.X
V2	EQU	TRUE	;TRUE IF CP/M VERSION 2.X
WBOOT	EQU	TRUE	;WARMBOOT________CONT-C TRAP SET BY MODEM CONT. PGM
;
USERN	EQU	1	;CP/M VERS 2.2 USER #
DRIVEN	EQU	0	;CP/M VERS 2.2 DRIVE #
;
MSIZE	EQU	48	;CP/M SIZE IN K
;
	IF	V1
;LOCATE CP/M VERS 1.4 CCP COMMAND TABLE
BIAS	EQU	(MSIZE-16)*1024	;CP/M VERS 1.4 OFFSET
CCP	EQU	2900H+BIAS	;CP/M VERS 1.4 CONSOLE COMMAND
				;PROCESSOR
COMTB	EQU	CCP+2F6H	;CONSOLE PROCESSOR COMMAND TABLE
	ENDIF
;
	IF	V2
;LOCATE CP/M VERS 2.2 CCP COMMAND TABLE
BIAS	EQU	(MSIZE-20)*1024	;CP/M VERS 2.2 OFFSET
CCP	EQU	3400H+BIAS	;CP/M VERS 2.2 CONSOLE COMMAND
				;PROCESSOR
COMTB	EQU	CCP+310H	;CONSOLE COMMAND PROCESSOR TABLE
	ENDIF
;
READCON	EQU	1	;CONSOLE INPUT FUNCTION
BDOS	EQU	5
PRINT	EQU	9	;PRINT STRING FUNCTION
PCNBUFF	EQU	10	;READ CONSOLE FUNCTION
CONSTAT	EQU	11	;GET CONSOLE STATUS FUNCTION
SELDSK	EQU	13	;RESET DISK SYSTEM FUNCTION
OPEN	EQU	15	;FILE OPEN FUNCTION
CLOSE	EQU	16	;CLOSE FILE FUNCTION
ATTRIB	EQU	1EH	;SET OR RESET FILE ATTRIBUTE FUNCTION
WRITE	EQU	21	;WRITE SEQUENTIAL FUNCTION
RENAME	EQU	23	;RENAME FILE FUNCTION
DMA	EQU	26	;SET DMA ADDRESS FUNCTION
SUSER	EQU	32	;SET OR GET USER CODE FUNCTION
;
FCB	EQU	5CH	;SYSTEM FCB
FCB2	EQU	FCB+16
DBUFF	EQU	80H	;DMA ADDRESS
;
CR	EQU	13	;CARRIAGE RETURN
LF	EQU	10	;LINE FEED
BELL	EQU	7	;BELL
;
	ORG	100H
	MVI	C,CR
	CALL	BDOS	;RESET LOGGED TO DISC A
	XRA	A
	STA	BUFF	;ZERO BUFFER
	LXI	D,DBUFF
	MVI	C,DMA
	CALL	BDOS	;MAKE SURE WE ARE AT 80H FOR DMA
START	LXI	H,FCB+1	;CHECK FOR PASSWORD
	MVI	A,'0'
	CMP	M
	JNZ	IDERR	;NO PASSWORD FOUND
	XRA	A
	MVI	B,8
L1	INX	H
	ADD	M
	DCR	B
	JNZ	L1
	LXI	H,USERCT	;NUMBER OF USER #'S TO CHECK
	MOV	B,M
	LXI	H,USERS
CHK	CMP	M
	JZ	CHOK	;PASSWORD FOUND
	INX	H
	DCR	B
	JNZ	CHK
IDERR	LXI	D,NOIDMSG
	MVI	C,PRINT
	CALL	BDOS	;PRINT NO PASSWORD FOUND MSG
IDERR1	CALL	GETC
	CPI	cr
	JZ	IDERR2	;PROCESS COMMAND
	STA	BUFF
	JMP	IDERR1	;NEED CARRIAGE RETURN
IDERR2	LDA	BUFF
	CPI	'h'
	JZ	QUERY	;GIVE HELP
	CPI	'H'
	JZ	QUERY	;GIVE HELP
	LXI	D,EXMSG
	CALL	SEND
	JMP	0	;RETURN TO CP/M
QUERY	LXI	D,INTRO
	CALL	SEND	;PROVIDE HELP INFO
QUERY1	CALL	GETC
	CPI	CR
	JZ	QCK
	STA	BUFF
	JMP	QUERY1
QCK	LDA	BUFF
	CPI	'y'
	JZ	QCONT	;GET INFO FOR APPLICATION
	CPI	'Y'
	JZ	QCONT	;GET INFO FOR APPLICATION
	LXI	D,EXMSG
	CALL	SEND
	JMP	0	;RETURN TO CP/M
QCONT	LXI	H,FILENM	;PREPARE FOR INPUT
	LXI	D,FCB+1
MLOOP	MOV	A,M	;LOOP UNTIL YOU HAVE IT ALL
	STAX	D
	CPI	0
	JZ	QCONT1	;HAVE COMPLETE FILE NAME IN FCB
	INX	D
	INX	H
	JMP	MLOOP	;RETURN FOR NEXT CHARACTER
QCONT1	LXI	D,FCB
	MVI	C,OPEN
	CALL	BDOS	;OPEN APPLICATION INPUT FILE
	CPI	0FFH	;LOOK FOR END
	JZ	GENERR	;FILE OPEN ERROR
	XRA	A	;ZERO OUT A
	STA	FCB+32	;AND PUT 0 IN RECORD #
;
;ASK QUESTIONS REQUIRED TO PROCESS APPLICATION FOR PASSWORD
QCONT2	LXI	H,Q1H
	CALL	PRINTH
	LXI	D,Q1
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q2H
	CALL	PRINTH
	LXI	D,Q2
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q3H
	CALL	PRINTH
	LXI	D,Q3
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q4H
	CALL	PRINTH
	LXI	D,Q4
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q5H
	CALL	PRINTH
	LXI	D,Q5
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q6H
	CALL	PRINTH
	LXI	D,Q6
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q7H
	CALL	PRINTH
	LXI	D,Q7
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q8H
	CALL	PRINTH
	LXI	D,Q8
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q9H
	CALL	PRINTH
	LXI	D,Q9
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q9AH
	CALL	PRINTH
	LXI	D,Q9A
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q10H
	CALL	PRINTH
	LXI	D,Q10
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q11H
	CALL	PRINTH
	LXI	D,Q11
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q12H
	CALL	PRINTH
	LXI	D,Q12
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q13H
	CALL	PRINTH
	LXI	D,Q13
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	H,Q14H
	CALL	PRINTH
	LXI	D,Q14
	CALL	SEND
	XCHG
	CALL	GETSTR
	LXI	D,FCB
	MVI	C,CLOSE
	CALL	BDOS	;CLOSE APPLICATION FILE
;
;RENAME FILE NOW SO USER CAN'T WRITE OVER THE INFORMATION
;AND IN CASE SOMEONE ELSE WANTS TO APPLY, HE WON'T WRITE
;OVER THIS ONE BEFORE I SEE IT. (DUE TO FACT THAT PGM
;CAN'T FIND FILE ON NEXT INVOCATION OF PROGRAM)
REN	LXI	H,FILENM2	;NEW FILENAME
	LXI	D,FCB2+1
	CALL	MOVER
	LXI	D,FCB
	MVI	C,RENAME
	CALL	BDOS	;RENAME FILE FOR PROTECTION
;
	IF	V2
;SET FILE ATTRIBUTE TO .SYS SO FILE IS INVISIBLE TO CALLERS
	MVI	C,ATTRIB
	CALL	BDOS
	ENDIF
;
;WE ARE DONE WITH THE FILE NOW SO LETS GET OUTTA HERE...
	LXI	D,EQMSG
	CALL	SEND
FIN	LXI	D,EXMSG
	CALL	SEND
	RET
CHOK	LXI	D,OKMSG
	CALL	SEND
;
	IF	V1
;ENABLE SELECTED FILES FOR AUTHORIZED USERS
	LXI	D,RENMSG
	CALL	SEND
	CALL	CRLF
	LXI	D,FCB+1
	LXI	H,BASICD
	CALL	MOVER
	LXI	D,FCB2+1
	LXI	H,BASICE
	CALL	MOVER
	LXI	D,FCB
	MVI	C,RENAME
	CALL	BDOS
	LXI	D,BASICE
	CALL	SEND	;SHOW WHICH FILES ARE AVAILABLE NOW...
	CALL	CRLF
	LXI	D,FCB+1
	LXI	H,MACD
	CALL	MOVER
	LXI	D,FCB2+1
	LXI	H,MACE
	CALL	MOVER
	LXI	D,FCB
	MVI	C,RENAME
	CALL	BDOS
	LXI	D,MACE
	CALL	SEND
	CALL	CRLF
	LXI	D,FCB+1
	LXI	H,LOADD
	CALL	MOVER
	LXI	D,FCB2+1
	LXI	H,LOADE
	CALL	MOVER
	LXI	D,FCB
	MVI	C,RENAME
	CALL	BDOS
	LXI	D,LOADE
	CALL	SEND
	CALL	CRLF
	LXI	D,FCB+1
	LXI	H,EDITD
	CALL	MOVER
	LXI	D,FCB2+1
	LXI	H,EDITE
	CALL	MOVER
	LXI	D,FCB
	MVI	C,RENAME
	CALL	BDOS
	LXI	D,EDITE
	CALL	SEND
	LXI	D,FCB+1
	LXI	H,CBBSE
	CALL	MOVER
	LXI	D,FCB2+1
	LXI	H,CBBSD
	CALL	MOVER
	LXI	D,FCB
	MVI	C,RENAME
	CALL	BDOS
	ENDIF
;
	IF	V2
;ENABLE USER AREA AND DRIVE FOR AUTHORIZED USER
	MVI	E,USERN
	MVI	C,SUSER
	CALL	BDOS	;SELECT USER AREA
	MVI	E,DRIVEN
	MVI	C,SELDSK
	CALL	BDOS	;SELECT DRIVE
	ENDIF
;
	CALL	CRLF
	CALL	CRLF
;
;RENAME CCP COMMANDS AND SET CONT-C TRAP ON THE FLY
	LXI	D,COMTB
	LXI	H,NCOMTB
	CALL	MOVER
	MVI	A,0CDH
	STA	0	;SET CONTROL-C TRAP
	LXI	D,BBSMSG
	CALL	SEND
	JMP	FIN
;
;SUBROUTINES
MOVER	MOV	A,M
	CPI	0
	RZ
	STAX	D
	INX	D
	INX	H
	JMP	MOVER
GETSTR	PUSH	D
	CALL	GETC
	POP	D
	CPI	CR
	JZ	WRBUFF
	CPI	'U'-40H
	JZ	REASK
	CPI	'H'-40H
	JZ	REASK
	CPI	7FH
	JZ	REASK
	CPI	5FH
	JZ	REASK
	STAX	D
	INX	D
	JMP	GETSTR
REASK	CALL	CRLF
	PUSH	D
	LXI	D,RTYMSG
	CALL	SEND
	POP	D
	CALL	CRLF
	PUSH	D
	MVI	E,'?'
	MVI	C,2
	CALL	BDOS
	MVI	E,07
	MVI	C,2
	CALL	BDOS
	POP	D
	LXI	H,DBUFF
REASK1	MOV	A,M
	CPI	':'
	JZ	REASKED
	INX	H
	JMP	REASK1
REASKED	INX	H	;ONE MORE TIME FOR SPACE
	INX	H	;PUTS US BACK WHERE WE START IN DMA.
	XCHG
	JMP	GETSTR
CRLF	PUSH	D
	PUSH	H
	MVI	E,CR
	MVI	C,2
	CALL	BDOS
	MVI	E,LF
	MVI	C,2
	CALL	BDOS
	MVI	E,BELL
	MVI	C,2
	CALL	BDOS
	POP	H
	POP	D
	RET
PRINTH	LXI	D,DBUFF
	MOV	A,M
PRINTH1	STAX	D
	INX	H
	INX	D
	MOV	A,M
	CPI	0
	JNZ	PRINTH1
PRINTHE	XCHG
	RET
GETC	MVI	C,CONSTAT
	CALL	BDOS
	ORA	A
	JZ	GETC
	MVI	C,READCON
	CALL	BDOS
	RET
SEND	PUSH	H
	MVI	C,PRINT
	CALL	BDOS
	POP	H
	RET
WRBUFF	MVI	A,CR
	STAX	D
	INX	D
	MVI	A,LF
	STAX	D
	INX	D
WRBUFF1	MOV	A,E
	CPI	0FFH
	JZ	WRBUFF2
	XRA	A
	STAX	D
	INX	D
	JMP	WRBUFF1
WRBUFF2	LXI	D,FCB
	MVI	C,WRITE
	CALL	BDOS
	CPI	0
	RZ
	CPI	1
	JZ	EXTERR
	CPI	2
	JZ	DIRFUL
	CPI	255
	JZ	DIRFUL
	JMP	GENERR
EXTERR	LXI	D,EXERMSG
	CALL	SEND
	CALL	FIN
	JMP	0
DIRFUL	LXI	D,DIRERMSG
	CALL	SEND
	CALL	FIN
	JMP	0
GENERR	LXI	D,GERRMSG
	CALL	SEND
	CALL	FIN
	JMP	0
;
	IF	V1
RENMSG	DB	CR,LF,LF,'THE FOLLOWING ARE ENABLED; THEY WILL BE DISABLED '
	DB	'AT SIGN-OFF:$'
	ENDIF
;
RTYMSG	DB	CR,LF,LF,'++RETYPE ENTIRE LINE PLEASE:$'
;
EXERMSG	DB	CR,LF,LF,'++ERROR EXTENDING FILE: ABORTED.$'
;
DIRERMSG	DB	CR,LF,LF,'++DISK OR DIRECTORY FULL: ABORTED.$'
;
GERRMSG	DB CR,LF,'++AN APPLICATION HAS ALREADY BEEN SUBMITTED AND SYSOP HAS'
	DB CR,LF,'NOT EXAMINED IT AS OF YET. PLEASE APPLY AGAIN TOMORROW.',07,'$'
;
BBSMSG	DB CR,LF,'MESSAGE SYSTEM IS NOW DISABLED. IF YOU WANT TO USE IT YOU'
	DB CR,LF,'WILL HAVE TO SIGN-OFF, THEN SIGN-IN AGAIN.',07,'$'
;
okmsg	DB CR,LF,'CP/M Now Patched For Normal Use.'
;
	IF	NOT WBOOT
	DB CR,LF,07,07,07,'Remember: If you do a WARMSTART, YOU MUST CALL THIS'
	DB ' PROGRAM AGAIN,'
	DB CR,LF,'TO REINITIALIZE COMMAND TABLE. (Minor detail to be worked '
	DB 'out later.',CR,LF,'Details, details...[sigh]).',07,07,07,'$'
	ENDIF
;
	IF	WBOOT
	DB 07,07,07,'$'
	ENDIF
;
;THE FOLLOWING WILL BE IN A FILE TO READ IN THE FUTURE
;(HOPEFULLY) AND WILL REDUCE THE SIZE OF THE .ASM FILE CONSIDERABLY.
noidmsg	db	CR,LF,'User ID not found or not specified.'
	DB CR,LF,'Enter "H" for help, <cr> to abort? ',07,'$'
;
INTRO	DB CR,LF,'This program allows the user to modify file'
	DB CR,LF,'extensions, rename files, erase files, and view .###'
	DB CR,LF,'type files. Another words, with the correct user ID, the'
	DB CR,LF,'user is given COMPLETE control of the system without ANY'
	DB CR,LF,'restrictions whatsoever. In addition, these files may'
	DB CR,LF,'be made available to you:'
	DB CR,LF,'Basic',CR,LF,'Mac',CR,LF,'Load',CR,LF,'Edit'
	DB CR,LF,'These programs will allow development of software directly'
	DB CR,LF,'on this system in 8080 code. EDIT will allow editing .ASM'
	DB CR,LF,'files, BASIC for basic programing, LOAD to convert .HEX'
	DB CR,LF,'files to .COM, and MAC for assembling .ASM files.'
	DB CR,LF,'If you wish to establish a user ID, please answer'
	DB CR,LF,'ALL questions complete. Any unanswered questions'
	DB CR,LF,'will assume you DO NOT want a user ID.'
	DB CR,LF,LF,'Do you wish to establish a User ID (Y/N)? ',07,'$'
;
Q1	DB CR,LF,LF,'What is your FULL name (include middle initial)? ',07,'$'
;
Q2	DB CR,LF,'What is your current STREET address? ',07,'$'
;
Q3	DB CR,LF,'What CITY/STATE is that located in? ',07,'$'
;
Q4	DB CR,LF,'Where do you work (company name only)? ',07,'$'
;
Q5	DB CR,LF,'What is your current work address? ',07,'$'
;
Q6	DB CR,LF,'What CITY/STATE? ',07,'$'
;
Q7	DB CR,LF,'What is the phone # at your home (include area code)? ',07,'$'
;
Q8	DB CR,LF,'What is it at work (include area code)? ',07,'$'
;
Q9	DB CR,LF,'What extension (enter 0 if none)? ',07,'$'
;
Q9A	DB CR,LF,'What is your position at this company? ',07,'$'
;
Q10	DB CR,LF,'What make modem are you using? ',07,'$'
;
Q11	DB CR,LF,'Do you make computer calls from home or work (enter "home"'
	DB CR,LF,'or "work" or "both")? ',07,'$'
;
Q12	DB CR,LF,'What kind of DOS (e.i. CP/M, HDOS,) do you use? ',07,'$'
;
Q13	DB CR,LF,'What kind of microcomputer (i.e. TRS-80, ALTAIR)? ',07,'$'
;
Q14	DB CR,LF,'What kind of programs would you like to see available? ',07,'$'
;
eqmsg	db cr,lf,lf,'End of questions; I left all info entered, on file.'
	db cr,lf,'The sysop will evaluate the information entered, and'
	db cr,lf,'determine if a user ID should be issued. If it is, call'
	db cr,lf,'this programm as follows:'
	db cr,lf,'A>USERID 0PASSWORD<cr>','$'
;
exmsg	db	CR,LF,'Returning to CP/M....$'
;
q1h	db	'name: ',0
;
q2h	db	'Current address: ',0
;
q3h	db	'Current address - city/state: ',0
;
q4h	db	'Works at: ',0
;
q5h	db	'Work address: ',0
;
q6h	db	'CITY/STATE of work: ',0
;
q7h	db	'Number at home: ',0
;
q8h	db	'Number at work: ',0
;
q9h	db	'Extension: ',0
;
q9ah	db 'Position at work: ',0
;
q10h	db 'Kind of modem he/she uses: ',0
;
q11h	db 'Makes calls usaully from: ',0
;
q12h	db 'Kind of DOS he/she uses: ',0
;
q13h	db 'Kind of computer: ',0
;
q14h	db	'Kind of programming would like to see: ',0
;
BUFF	DS	1
;
;THESE BYTES ARE EQUATED BY FINDING OUT WHAT THE SUM
;IS OF ALL USERS LETTERS EXCLUDING THE STARTING '0'.
;REMEMBER, ALL UPPER CASE (CP/M DOES THAT WHEN YOU TYPE
;A>USERID 0XXXXXX)
;ID WILL BE IN FCB (5CH) WHEN PGM STARTS AND WILL ALREADY
;BE IN UPPERS.
USERS	DB	0FEH	;'XXXXXX'
	DB	0E3H	;'XXXXXX': USER NAME 
	DB	01BH	;'XXXXXX': USER NAME
	DB	018H	;'RWHART': SYSOP ROD
;
USERCT	DB	04	;number of user #'s in list
;
	IF	V1
;PATCHED CCP COMMAND TABLE
NCOMTB	DB	'SEE ERA TYPESAVEREN',0
	ENDIF
;
	IF	V2
;PATCHED CCP COMMAND TABLE
NCOMTB	DB	'DIR ERA TYPESAVEREN AREA',0
	ENDIF
;
;THESE FILES HAVE .### TYPE EXTENSIONS CAUSE I HAVE DIR WRITTEN
;TO MASK ANY FILE WITH A "#" LOCATED IN ANY POSITION IN THE
;EXTENSION OF THE FILE, SO USER DOES NOT SEE IT AT ALL (DOESN'T
;EVEN KNOW THE FILE IS THERE). ALSO HAVE MLIST MODIFIED TO
;NOT TYPE A FILE THAT HAS A # IN THE EXTENSION ANYWHERE.
;THE 80H+'X' IS REQUIRED IN ORDER TO MAKE .SYS FILE IN VERS 2.2
;
	IF	V1
FILENM	DB	'APPUSER ###',0	;APPLICATION INPUT FILE
FILENM2	DB	'APPUSER #LA',0	;APPLICATION HOLDING FILE
	ENDIF
;
	IF	V2
FILENM	DB	'APPUSER    ',0	;APPLICATION INPUT FILE
FILENM2	DB	'APPUSER A',80H+'P','P',0	;APPLICATION HOLDING FILE
	ENDIF
;
	IF	V1
;YOU CAN CHANGE THE FOLLOWING TO WHAT EVER FILES YOU WANT USERS
;TO HAVE ACCESS TO. REMEMBER TO PUT COMPLIMENTARY FILENAME IN
;RESPECTIVE LABEL.
BASICE	DB	'BASIC   COM',0,'$'
MACE	DB	'MAC     COM',0,'$'
LOADE	DB	'LOAD    COM',0,'$'
EDITE	DB	'EDIT    COM',0,'$'
BASICD	DB	'BASIC   #OM',0
MACD	DB	'MAC     #OM',0
LOADD	DB	'LOAD    #OM',0
EDITD	DB	'EDIT    #OM',0
CBBSE	DB	'CBBS    COM',0
CBBSD	DB	'C'+80H,'BBS    COM',0
	ENDIF
;
;AFTER USER IS SIGNED OFF SYSTEM, FILES ARE RENAMED FROM BYE, SO ADD
;APPRORIATE CODE TO BYE TO CORRESPOND TO FILES IN USERID.ASM
;THERE IS PROBABLY AN EASIER WAY TO DO THIS, AND CONSIDERING
;THAT THIS IS THE FIRST ATTEMPT OF ANYTHING LIKE THIS, SO
;THERE IS GOBS OF ROOM FOR IMPROVMENT, SO THAT IS WHY I
;SENT IT TO GET OTHER IDEAS. (LOOK WHAT HAPPENED TO SJBBS
;AFTER I GAVE THE FIRST COPY TO SOMEONE.)
