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