;
; 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.)