PAGE 75,128 TITLE USRPARM - User Parm function for CCBBS. PAGE .XLIST INCLUDE CCBBS.DEF INCLUDE CCBBS.MAC .LIST ;----------------------------------------------- ;SYSTEM DATA SEGMENT ;----------------------------------------------- SYSDATA SEGMENT PARA PUBLIC 'DATA' CTBL3 DB 'HAFGLMPWX?' ;USER PARM COMMANDS JTBL3 DW UPHELP ;HELP DW UPANSI ;ANSI SCREEN HANDLING DW FPARMS ;FILE TRANSFER DEFAULTS DW ADIOS ;GOODBYE DW UPLF ;LINE FEEDS DW UEXIT ;EXIT DW UPBELL ;PROMPT SOUND DW UPSETM ;PAGE WIDTH DW UPXPRT ;EXPERT MODE DW FMENU ;FULL MENU CTBL3A DB 'PLPWMAMSXG' ;USER PARM 2 CHAR CMDS JTBL3A DW PAGEL ;PAGE LENGTH DW UPASSW ;PASSWORD DW MAOPT ;MAIL OPTIONS DW MSECT ;MESSAGE SECTIONS DW UPGRAF ;EXTENDED GRAPHICS SYSDATA ENDS ;----------------------------------------------- ;CODE SEGMENT ;----------------------------------------------- CSEG SEGMENT PARA PUBLIC 'CODE' EXTRN GETBUF:NEAR,FREBUF:NEAR,APPBYT:NEAR,GDBYE:NEAR EXTRN CMPSTA:NEAR,BINASP:NEAR,DQCMD:NEAR,DQTIOA:NEAR EXTRN GDBYE:NEAR,ILINEB:NEAR,MMENU1:NEAR,MOVSTR:NEAR EXTRN NOTYET:NEAR,PTIME:NEAR,QUERY:NEAR,QVALUE:NEAR EXTRN PADB:NEAR,SENDHF:NEAR,TXPRT:NEAR,UNCMD:NEAR EXTRN WRMSG:NEAR,UPDUSR:NEAR,XLATE:NEAR,LOSTC:NEAR EXTRN CRCCLC:NEAR,STRIP:NEAR,PSECNO:NEAR,TAYSOP:NEAR EXTRN MOVMSG:NEAR,BINASC:NEAR,POSTCD:NEAR EXTRN WMSGNO:NEAR,QMSGNO:NEAR,QVALNO:NEAR PUBLIC UPARMS,UPAR00,SETMGN,PASSW,DSPSEC,DSPCLS,DSPSTS ASSUME CS:CSEG,DS:NOTHING,ES:SYSDATA USRPARM PROC NEAR ;--------------------------------------------------------------------- ;USER PARAMETER COMMAND ENTRY FROM MAIN MENU ;--------------------------------------------------------------------- UPARMS: CALL PTIME ;REMAINING TIME MOV DI,WORD PTR [BX+USRST] ;USER ENTRY PUSH DI ;PASS AS PARM CALL UPAR00 ;MAKE USER CHANGES JNZ UPARMX ;CHECK RESULT CODE JMP MMENU1 ;MAIN MENU UPARMX: TEST AX,1 ;ERROR EXIT? JNZ UPARME ;YES - GO POST JMP GDBYE ;LOG OFF SYSTEM UPARME: JMP POSTCD ;ERROR EXIT ;-------------------------------------------------------- ;USER PARAMETER CHANGES ;ENTRY BP+4 A(USER ENTRY) ;LOCAL BP-2 RESULT CODE ; 00 NORMAL COMPLETION ; 01 ERROR EXIT ; 02 LOGOFF REQUEST ;EXIT AX RESULT CODE IF ZF = 0 ;-------------------------------------------------------- UPAR00: PUSH BP ;SAVE CALLER'S FRAME MOV BP,SP ;ESTABLISH LOCAL FRAME SUB SP,2 ;ALLOCATE LOCAL STORAGE MOV WORD PTR [BP-2],0 ;CLEAR RESULT FLAG PUSH CX PUSH SI PUSH DI UPAR10: CALL TXPRT ;EXPERT MODE? JNZ UPAR12 ;YES UPAR11: MOV AX,89 ;FULL MENU CALL WMSGNO UPAR12: MOV AX,90 ;COMMAND PROMPT CALL QMSGNO ;PROMPT FOR COMMAND JNC UPAR20 ;INPUT OK MOV WORD PTR [BP-2],1 ;FLAG EXCEPTION JMP UPAR90 ;EXIT UPAR20: CALL DQCMD ;GET NEXT COMMAND JC UPAR10 ;NO CMD, SO PROMPT AGAIN CALL XLATE ;TRANSLATE TO UPPER CASE MOV CX,WORD PTR [SI-2] ;DATA LENGTH OR CX,CX ;NULL COMMAND? JZ UPAR10 ;YES - PROMPT AGAIN CMP CX,2 ;MAX COMMAND LENGTH JAE UPAR40 ;HANDLE EXTENDED COMMANDS LODSB ;GET COMMAND MOV DI,OFFSET CTBL3 ;FILE COMMAND LIST MOV CX,(JTBL3-CTBL3) ;COMMAND TABLE SIZE REPNZ SCASB ;CHECK FOR MATCH JNZ UPAR30 ;UNKNOWN COMMAND SUB DI,OFFSET CTBL3+1 ;OFFSET IN STRING SHL DI,1 ;TABLE WIDTH CALL JTBL3[DI] ;PERFORM COMMAND JMP UPAR10 ;PROMPT AGAIN UPAR30: CALL UNCMD ;UNKNOWN COMMAND JMP UPAR10 ;PROMPT AGAIN UPAR40: JNZ UPAR30 ;FOR NOW MOV DI,OFFSET CTBL3A ;2 CHAR USER MENU COMMANDS MOV CX,(JTBL3A-CTBL3A) ;COMMAND TABLE SIZE IN BYTES SHR CX,1 ;CONVERT TO WORDS LODSW ;GET COMMAND CHARS REPNZ SCASW ;CHECK FOR MATCH JNZ UPAR30 ;NO MATCH SUB DI,OFFSET CTBL3A+2 ;OFFSET IN STRING CALL JTBL3A[DI] ;EXECUTE COMMAND JMP UPAR10 ;PROMPT AGAIN UPAR90: POP DI POP SI POP CX MOV AX,[BP-2] ;RESULT CODE MOV SP,BP ;FREE LOCAL STORAGE POP BP ;RESTORE CALLER'S FRAME OR AX,AX ;SET CONDITION CODE RET 2 ;CLEAN UP STACK FMENU: POP AX ;KILL RETURN JMP UPAR11 ;DISPLAY MENU UEXIT: POP AX ;KILL RETURN JMP UPAR90 ;EXIT ADIOS: MOV WORD PTR [BP-2],2 ;LOG OFF REQUEST CODE POP AX ;KILL RETURN JMP UPAR90 ;EXIT UPHELP: MOV AX,8 ;HELP FILE NUMBER CALL SENDHF ;DISPLAY HELP FILE RET UPXPRT: MOV DI,[BP+4] ;SIGN-ON ENTRY XOR WORD PTR [DI+UEOPTS],4 ;FLIP EXPERT STATE TEST WORD PTR [DI+UEOPTS],4 ;SET CONDITION CODE MOV AX,92 ;EXPERT MODE MSG JNZ UPXPR2 ;NOW EXPERT MOV AX,91 ;MENU MODE MSG UPXPR2: CALL WMSGNO ;TELL USER RET UPLF: MOV DI,[BP+4] ;SIGN-ON ENTRY XOR WORD PTR [DI+UEOPTS],1 ;FLIP LF FLAG TEST WORD PTR [DI+UEOPTS],1 ;SET CONDITION CODE MOV AX,94 ;LF ON JNZ UPLF2 ;NOW ON MOV AX,93 ;LF OFF UPLF2: CALL WMSGNO ;TELL USER RET UPBELL: MOV DI,[BP+4] ;SIGN-ON ENTRY XOR WORD PTR [DI+UEOPTS],2 ;FLIP BELL FLAG TEST WORD PTR [DI+UEOPTS],2 ;SET CONDITION CODE MOV AX,96 ;BELL ON JNZ UPBEL2 ;NOW ON MOV AX,95 ;BELL OFF UPBEL2: CALL WMSGNO ;TELL USER RET FPARMS: CALL ILINEB ;INIT BUFFER MOV AX,318 ;CURRENT OPTION CALL MOVMSG ;MOVE TO BUFFER MOV DI,[BP+4] ;USER RECORD MOV AL,BYTE PTR [DI+UEULPC] ;UPLOAD PROTOCOL OR AL,AL ;ANYTHING? JNZ FPAR10 ;YES MOV AL,' ' ;CONVERT TO BLANK FPAR10: CALL APPBYT ;ADD TO STRING MOV AL,BYTE PTR [DI+UEDLPC] ;DOWNLOAD PROTOCOL OR AL,AL ;ANYTHING? JNZ FPAR20 ;YES MOV AL,' ' ;CONVERT TO BLANK FPAR20: CALL APPBYT ;ADD TO STRING CALL WRMSG ;DISPLAY MSG CALL ILINEB ;INIT BUFFER MOV AX,319 ;ENTER NEW OPTION CALL QMSGNO ;GET RESPONSE JC MAOPTX ;LOST CARRIER CALL DQCMD ;GET RESPONSE MOV CX,WORD PTR [SI-2] ;RESPONSE LENGTH JCXZ FPARMX ;NULL RESPONSE CALL XLATE ;MAKE UPPERCASE LODSB ;UPLOAD PARM CMP AL,' ' ;BLANK? JNZ FPAR22 ;NO PROBLEM XOR AL,AL ;CONVERT TO NULL FPAR22: MOV AH,AL ;ASSUME SAME DEC CX ;CHECK COUNT JZ FPAR30 ;NO MORE LODSB ;DOWNLOAD PARM CMP AL,' ' ;BLANK? JNZ FPAR30 ;NO PROBLEM XOR AL,AL ;CONVERT TO NULL FPAR30: MOV DI,[BP+4] ;USER RECORD MOV BYTE PTR [DI+UEDLPC],AL ;NEW DOWNLOAD MOV BYTE PTR [DI+UEULPC],AH ;NEW UPLOAD JMP FPARMS ;DESPLAY NEW VALUES FPARMX: RET MAOPT: MOV AX,97 ;MAIL OPTIONS CALL WMSGNO ;DISPLAY MESSAGE CALL ILINEB ;INIT BUFFER MOV AX,320 ;CURRENT OPTION CALL MOVMSG ;MOVE TO BUFFER CALL MAOPTV ;FILL VALUE FIELD CALL WRMSG ;DISPLAY MSG MOV AX,98 ;ENTER NEW OPTION CALL QMSGNO ;GET RESPONSE JC MAOPTX ;LOST CARRIER CALL DQCMD ;GET RESPONSE MOV CX,WORD PTR [SI-2] ;RESPONSE LENGTH JCXZ MAOPTX ;NULL RESPONSE CMP CX,1 ;VALID LENGTH? JNZ MAOPT ;NO - TRY AGAIN MOV AL,BYTE PTR [SI] ;RESPONSE CHAR SUB AL,'1' ;CONVERT TO BINARY JC MAOPT ;INVALID CMP AL,5 ;MAX VALID JNC MAOPT ;INVALID AND WORD PTR [DI+UEOPTS],0FFC7H ;CLEAR OPTION BITS CMP AL,4 ;NO MAIL? JNZ MAOPT1 ;HANDLE VALUE OR WORD PTR [DI+UEOPTS],8 ;SHOW NO MAIL SCAN JMP SHORT MAOPTX MAOPT1: MOV CL,4 ;SHIFT VALUE SHL AL,CL ;POSITION BITS IN FIELD CBW ;NEED WORD VALUE OR WORD PTR [DI+UEOPTS],AX ;SET OPTION BITS MAOPTX: CALL ILINEB ;INIT LINE BUFFER MOV AX,321 ;NEW MAIL OPTION CALL MOVMSG ;MOVE TO BUFFER CALL MAOPTV ;FILL FIELD CALL WRMSG ;TELL USER RET MAOPTV: MOV DI,[BP+4] ;USER RECORD MOV AX,WORD PTR [DI+UEOPTS] ;USER OPTION BITS AND AX,0038H ;ISOLATE MAIL BITS MOV CL,4 ;SHIFT FACTOR SHR AX,CL ;NORMALIZE JNC MAOPV1 ;VALUE IS VALID MOV AL,4 ;SHOW NO MAIL MAOPV1: ADD AL,'1' ;CONVERT TO ASCII CALL APPBYT ;APPEND TO STRING RET PAGEL: CALL ILINEB ;FORMAT BUFFER MOV AX,322 ;PAGE LENGTH IS CALL MOVMSG MOV DI,[BP+4] ;USER RECORD MOV AX,WORD PTR [DI+UEXPL] ;PAGE LENGTH CALL BINASP MOV AX,323 ;ENTER NEW PL CALL MOVMSG CALL QVALUE ;GET VALUE JC PAGELX ;NULL RESPONSE - EXIT OR AH,AH ;>255? JNZ PAGEL ;YES - ASSUME ERROR MOV DI,[BP+4] ;USER RECORD MOV WORD PTR [DI+UEXPL],AX ;SET NEW PAGE LENGTH PAGELX: RET UPASSW: MOV DI,[BP+4] ;USER RECORD PUSH DI ;PASS AS PARM CALL PASSW ;GET NEW PASS WORD RET PASSW: FRAME 1 MOV WORD PTR [BP-2],0 ;SHOW NO BUFFER PASS10: MOV SI,[BP-2] ;PASSWORD BUFFER CALL FREBUF ;FREE IT MOV WORD PTR [BP-2],0 ;SHOW FREE MOV AX,99 ;NEW PASSWORD? MOV WORD PTR [BX+USRSE],1 ;ECHO WITH DOTS CALL QMSGNO ;GET PASSWORD JNC PASS11 ;GOOD RESPONSE JMP PASSWX ;LOST CARRIER PASS11: CALL DQTIOA ;GET RESPONSE MOV [BP-2],SI ;SAVE PASSWORD STRING MOV CX,WORD PTR [SI-2] ;GET RESPONSE LENGTH OR CX,CX ;ANYTHING? JNZ PASS15 ;YES TEST DS:MSGCKPT+MSOPTS,4000H ;PASSWORD REQUIRED? JZ PASS13 ;NO MOV DI,[BP+4] ;USER RECORD CMP WORD PTR [DI+UEPSWD],0 ;PASSWORD EXIST? JNZ PASS13 ;YES PASS12: MOV AX,11 ;PASSWORD HELP CALL SENDHF ;ENTER HELP SCRIPT JMP PASS10 ;TRY AGAIN PASS13: JMP PASSWX ;NULL RESPONSE OK PASS15: CALL STRIP ;DELETE TRAILING BLANKS MOV AX,WORD PTR [SI-2] ;LENGTH OR AX,AX ;WAS ALL BLANKS? JNZ PASS18 ;NO PROBLEM TEST DS:MSGCKPT+MSOPTS,4000H ;PASSWORD REQUIRED? JNZ PASS12 ;YES - SEND HELP TEXT JMP PASS50 ;NO - GO RESET PASS18: CALL XLATE ;UC PASS20: CALL DQCMD ;TRY TO READ DUPLICATE JNC PASS30 ;FOUND IT MOV AX,100 ;TYPE AGAIN CALL QMSGNO ;GET RESPONSE JC PASSWX ;LOST CARRIER JMP PASS20 ;GO DEQUEUE PASS30: CALL XLATE ;UC MOV DI,[BP-2] ;1ST ENTRY CALL CMPSTA ;IDENTICAL? JZ PASS40 ;YES MOV AX,101 ;DON'T MATCH CALL WMSGNO JMP PASS10 ;TRY AGAIN PASS40: MOV SI,[BP-2] ;PASSWORD STRING MOV CX,UESTAT-UELNK ;LENGTH OF PASSWORD CALL PADB MOV [BP-2],SI ;PADB CAN SWAP BUFFERS CALL CRCCLC ;ENCRYPT PASS50: MOV DI,[BP+4] ;USER RECORD MOV WORD PTR [DI+UEPSWD],AX ;STORE NEW PASSWORD VALUE MOV AX,[BX+USRSL] ;USER SLOT CMP AX,-1 ;NEW USER? JZ PASSWX ;YES - NO FILE RECORD YET CALL UPDUSR ;UPDATE USER RECORD MOV AX,102 ;CHANGE COMPLETE CALL WMSGNO PASSWX: MOV WORD PTR [BX+USRSE],0 ;NORMAL ECHO MOV SI,[BP-2] ;PASSWORD STRING CALL FREBUF ;FREE IT MOV SP,BP ;FREE LOCAL STORAGE POP BP ;RESTORE CALLER'S FRAME RET 2 UPSETM: MOV DI,[BP+4] ;USER RECORD PUSH DI CALL SETMGN ;SET PAGE MARGIN RET SETMGN: PUSH BP ;SAVE CALLER'S FRAME MOV BP,SP ;ESTABLISH LOCAL FRAME PUSH BX PUSH CX PUSH SI PUSH DI CALL ILINEB ;FORMAT BUFFER MOV AX,324 ;SET AT CALL MOVMSG MOV DI,[BP+4] ;USER RECORD MOV AX,WORD PTR [DI+UEMARG] ;MARGIN CALL BINASP CALL WRMSG ;DISPLAY MOV AX,103 ;SET PROMPT CALL QVALNO ;GET VALUE JC SETM10 ;INVALID OR AX,AX ;ANYTHING JZ SETM10 ;NO CMP AX,80 ;MAX JA SETM10 ;INVALID MOV DX,AX ;SAVE MARGIN MOV CL,8 ;DIVISOR DIV CL ;MODULO 8 OR AH,AH ;ANY REMAINDER? JNZ SETM10 ;YES - INVALID MOV DI,[BP+4] ;USER RECORD MOV WORD PTR [DI+UEMARG],DX ;NEW MARGIN CALL ILINEB ;FORMAT BUFFER MOV AX,326 ;NOW SET CALL MOVMSG MOV AX,DX ;MARGIN CALL BINASP ;PUT IN STRING CALL WRMSG MOV AX,DX ;MARGIN CLC ;SHOW GOOD RETURN JMP SETM20 ;EXIT SETM10: CALL ILINEB ;FORMAT BUFFER MOV AX,325 ;INVALID CALL MOVMSG MOV DI,[BP+4] ;USER RECORD MOV AX,WORD PTR [DI+UEMARG] ;OLD MARGIN CALL BINASP CALL WRMSG STC ;SHOW NO CHANGE SETM20: POP DI POP SI POP CX POP BX MOV SP,BP ;FREE LOCAL STORAGE POP BP ;RESTORE CALLER'S FRAME RET 2 ;CLEAN UP STACK UPANSI: MOV DI,[BP+4] ;SIGN-ON ENTRY XOR WORD PTR [DI+UEOPTS],40H ;FLIP ANSI FLAG TEST WORD PTR [DI+UEOPTS],40H ;SET CONDITION CODE MOV AX,315 ;ANSI ON JNZ UPANS2 ;NOW ON MOV AX,314 ;ANSI OFF UPANS2: CALL WMSGNO ;TELL USER RET UPGRAF: MOV DI,[BP+4] ;SIGN-ON ENTRY XOR WORD PTR [DI+UEOPTS],80H ;FLIP GRAPHICS FLAG TEST WORD PTR [DI+UEOPTS],80H ;SET CONDITION CODE MOV AX,317 ;GRAPHICS ON JNZ UPGRA2 ;NOW ON MOV AX,316 ;GRAPHICS OFF UPGRA2: CALL WMSGNO ;TELL USER RET ;---------------------------------------------------------- ;Enroll in Public Message Sections ;---------------------------------------------------------- MSECT: MOV DI,[BP+4] ;USER RECORD MOV DX,WORD PTR [DI+UESECT] ;MESSAGE SECTION BITS AND DX,DS:MSGCKPT+MDPSECT ;PUBLIC SECTIONS ONLY JZ MSEC00 ;NO MOV AX,105 ;YOU ARE ENROLLED ... CALL WMSGNO CALL DSPSEC ;DISPLAY SECTIONS MSEC00: MOV DX,DS:MSGCKPT+MDPSECT ;PUBLIC SECTION BITS NOT DX ;PRIVATE SECTION BITS AND DX,WORD PTR [DI+UESECT] ;MESSAGE SECTION BITS JZ MSEC10 ;NO PRIVATE SECTIONS MOV AX,107 ;PRIVATE SECTIONS CALL WMSGNO CALL DSPSEC MSEC10: MOV DX,WORD PTR [DI+UESECT] ;MESSAGE SECTION BITS XOR DX,DS:MSGCKPT+MDPSECT ;PUBLIC SECTION BITS AND DX,DS:MSGCKPT+MDPSECT ;PUBLIC SECTION BITS JZ MSEC30 ;NO SECTIONS AVAILABLE MSEC20: MOV AX,106 ;YOU MAY ENROLL ... CALL WMSGNO CALL DSPSEC ;DISPLAY SECTIONS MSEC30: MOV SI,104 ;ENTER SECTIONS TO CHANGE XOR AX,AX ;DEFAULT CALL PSECNO ;PARSE RESPONSE JC MSEC80 ;INVALID RESPONSE OR AX,AX ;NOTHING? JZ MSEC80 ;EXIT CALL TAYSOP ;PRIVILEGED USER? JNZ MSEC40 ;YES AND AX,DS:MSGCKPT+MDPSECT ;PUBLIC SECTION BITS MSEC40: XOR WORD PTR [DI+UESECT],AX ;FLIP SECTION BITS JMP MSECT ;DISPLAY AGAIN MSEC80: RET DSPSTS: PUSH AX MOV AX,344 ;STARTING MESSAGE NUMBER JMP SHORT DSPS00 ;ENTER COMMON CODE DSPCLS: PUSH AX MOV AX,328 ;STARTING MESSAGE NUMBER JMP SHORT DSPS00 ;ENTER COMMON CODE DSPSEC: PUSH AX MOV AX,2 ;STARTING MESSAGE NUMBER DSPS00: PUSH BP ;COMMON ENTRY POINT MOV BP,SP ;ESTABLISH LOCAL FRAME SUB SP,4 ;ALLOCATE LOCAL STORAGE DEC AX ;OFFSET FROM SECTION # MOV [BP-2],AX ;STARTING MESSAGE NUMBER MOV WORD PTR [BP-4],1 ;1ST SECTION NUMBER PUSH CX PUSH DX MOV CX,16 ;LOOP COUNT DSPS10: SHR DX,1 ;TEST SECTION AVAILABLE JNC DSPS20 ;NOT THIS ONE CALL ILINEB ;INITIALIZE BUFFER PUSH CX MOV CX,2 ;FIELD WIDTH MOV AX,[BP-4] ;CURRENT SECTION CALL BINASC ;PUT SECTION # IN MESSAGE POP CX ADD WORD PTR [SI-2],2 ;LEAVE TWO SPACES ADD AX,[BP-2] ;MSG # CALL MOVMSG ;MOVE DESCRIPTION TO MESSAGE CALL WRMSG DSPS20: INC WORD PTR [BP-4] ;NEXT SECTION NUMBER LOOP DSPS10 ;NEXT SECTION POP DX POP CX MOV SP,BP ;FREE LOCAL STORAGE POP BP ;RESTORE CALLER'S FRAME POP AX RET USRPARM ENDP CSEG ENDS END