PAGE 75,128 TITLE MAIN - Main Menu Logic PAGE .XLIST INCLUDE CCBBS.DEF INCLUDE CCBBS.MAC .LIST ;----------------------------------------------- ;SYSTEM DATA SEGMENT ;----------------------------------------------- SYSDATA SEGMENT PARA PUBLIC 'DATA' EXTRN USERH:WORD,SCRIPT1:BYTE,SCRIPT2:BYTE EXTRN TIMEOUT:WORD,USRCNT:WORD,DEBUGF:BYTE,TESTF:BYTE EXTRN KBDTSK:WORD,SHUTFLG:BYTE,ABORT:BYTE,RETCODE:BYTE ;--------------------------------------------------------------------- ;WINDOW CONTROL TABLE ;--------------------------------------------------------------------- WINCTL DW 0 ;# OF WINDOWS IN USE DW 0 ;WINDOW #1 OWNER DW 0 ;WINDOW #2 OWNER DW 0 ;WINDOW #3 OWNER DW 0 ;WINDOW #4 OWNER DW 0 ;WINDOW #5 OWNER DW 0 ;WINDOW #6 OWNER DW 0 ;WINDOW #7 OWNER DW 0 ;WINDOW #8 OWNER ;HAYES RESPONSE TABLES HAYTBL DW INI100 ;0 - OK DW INIL74 ;1 - 300 BAUD CONNECT DW INIL58 ;2 - RING DW INI120 ;3 - NO CARRIER DW INI130 ;4 - ERROR DW INIL76 ;5 - 1200 BAUD CONNECT DW INITLN ;6 - NO DIALTONE DW INITLN ;7 - BUSY DW INITLN ;8 - NO ANSWER DW INI110 ;9 - NOT DEFINED DW INIL72 ;10 - 2400 BAUD CONNECT DW INIL73 ;11 - 4800 BAUD CONNECT DW INIL70 ;12 - 9600 BAUD CONNECT DW INI110 ;13 - NOT DEFINED DW INIL71 ;14 - 19200 BAUD CONNECT DW INI110 ;15 - NOT DEFINED DW INI110 ;16 - NOT DEFINED DW INI110 ;17 - NOT DEFINED DW INI110 ;18 - NOT DEFINED DW INI110 ;19 - NOT DEFINED DW INI110 ;20 - NOT DEFINED DW INI110 ;21 - NOT DEFINED DW INI110 ;22 - NOT DEFINED DW INI110 ;23 - NOT DEFINED DW INI110 ;24 - NOT DEFINED DW INI110 ;25 - NOT DEFINED DW INI110 ;26 - NOT DEFINED DW INI110 ;27 - NOT DEFINED DW INIL75 ;28 - NOT DEFINED DW INI110 ;29 - NOT DEFINED DW INI110 ;30 - NOT DEFINED DW INI110 ;31 - NOT DEFINED DW INI110 ;32 - NOT DEFINED DW INI110 ;33 - NOT DEFINED DW INI110 ;34 - NOT DEFINED DW INI110 ;35 - NOT DEFINED DW INI110 ;36 - NOT DEFINED DW INI110 ;37 - NOT DEFINED DW INI110 ;38 - NOT DEFINED DW INI110 ;39 - NOT DEFINED DW DCE010 ;40 - 300 BAUD CARRIER DW INI110 ;41 - NOT DEFINED DW INI110 ;42 - NOT DEFINED DW INI110 ;43 - NOT DEFINED DW INI110 ;44 - NOT DEFINED DW INI110 ;45 - NOT DEFINED DW DCE020 ;46 - 1200 BAUD CARRIER DW DCE030 ;47 - 2400 BAUD CARRIER DW DCE040 ;48 - 4800 BAUD CARRIER DW INI110 ;49 - NOT DEFINED DW DCE050 ;50 -9600 BAUD CARRIER DW INI110 ;51 - NOT DEFINED DW INI110 ;52 - NOT DEFINED DW INI110 ;53 - NOT DEFINED DW INI110 ;54 - NOT DEFINED DW INI110 ;55 - NOT DEFINED DW INI110 ;56 - NOT DEFINED DW INI110 ;57 - NOT DEFINED DW INI110 ;58 - NOT DEFINED DW INI110 ;59 - NOT DEFINED DW INI110 ;60 - NOT DEFINED DW INI110 ;61 - NOT DEFINED DW INI110 ;62 - NOT DEFINED DW INI110 ;63 - NOT DEFINED DW INI110 ;64 - NOT DEFINED DW INI110 ;65 - NOT DEFINED DW DCE110 ;66 - MNP/5 DATA COMPRESSION DW DCE120 ;67 - V42bis ERROR CORRECTION DW INI110 ;68 - NOT DEFINED DW DCE130 ;69 - NO COMPRESSION DW DCE210 ;70 - NO PROTOCOL DW INI110 ;71 - NOT DEFINED DW INI110 ;72 - NOT DEFINED DW INI110 ;73 - NOT DEFINED DW INI110 ;74 - NOT DEFINED DW INI110 ;75 - NOT DEFINED DW INI110 ;76 - NOT DEFINED DW DCE220 ;77 - V.42 LAPM DW INI110 ;78 - NOT DEFINED DW INI110 ;79 - NOT DEFINED DW DCE230 ;80 - EC = MNP ;CONNECTION FAILURE CAUSE CODES HAYS86 DW 426 ;0 - NORMAL TERMINATION DW 425 ;1 - NOT DOCUMENTED DW 425 ;2 - NOT DOCUMENTED DW 425 ;3 - NOT DOCUMENTED DW 416 ;4 - PHYSICAL CARRIER LOSS DW 417 ;5 - NO V42 EC DW 418 ;6 - NO REMOTE EC DW 425 ;7 - NOT DOCUMENTED DW 425 ;8 - NOT DOCUMENTED DW 419 ;9 - NO COMMON PROTOCOL DW 420 ;10 - INCORRECT FEATURE DW 425 ;11 - NOT DOCUMENTED DW 421 ;12 - REMOTE DISCONNECT DW 422 ;13 - NO RESPONSE DW 423 ;14 - PROTOCOL VIOLATION DW 424 ;15 - COMPRESSION FAILURE ;PASSED PARAMETER KEYWORDS PARM1 DW PARMS1,CLINE1 DW PARMS2,CLINE2 DW PARMS3,CM300 DW PARMS4,CM1200 DW PARMS5,CM2400 DW PARMS6,CMOFF DW PARMS7,CMOUT DW PARMS8,SDEBUG DW PARMS9,STEST ;SET TEST MODE DW PARMS10,CMNULL DW PARMS11,CMNSW DW PARMS12,CM9600 DW PARMS13,CM4800 DW PARMS14,CM1920 DW PARMS15,CM3840 PARMX EQU $ ;----------------------------------------------- ;MESSAGES ;----------------------------------------------- DW CWNOTE-CRLF-2 CRLF DB 13,0 DW MSGT4-CWNOTE-2 CWNOTE DB 9,9,9,' CC-BBS Version 0.84I',13 DB 9,9,' Copyright (C) 1991 by Temple Software, Inc.',13 DB 27,'[0m' ;TEST MESSAGES DW STRB01-MSGT4-2 MSGT4 DB '*** Command Not Implemented ***',13 DW STRB02-STRB01-2 STRB01 DB 'BULLET' ;BULLETIN FILE DW PARMS1-STRB02-2 STRB02 DB 'IN',0 ;PASSED PARM KEYWORD STRINGS DW PARMS2-PARMS1-2 PARMS1 DB 'COM1' DW PARMS3-PARMS2-2 PARMS2 DB 'COM2' DW PARMS4-PARMS3-2 PARMS3 DB '300' DW PARMS5-PARMS4-2 PARMS4 DB '1200' DW PARMS6-PARMS5-2 PARMS5 DB '2400' DW PARMS7-PARMS6-2 PARMS6 DB 'OFF' DW PARMS8-PARMS7-2 PARMS7 DB 'OUT' DW PARMS9-PARMS8-2 PARMS8 DB 'DEBUG' DW PARMS10-PARMS9-2 PARMS9 DB 'TEST' DW PARMS11-PARMS10-2 PARMS10 DB 'NULL' DW PARMS12-PARMS11-2 PARMS11 DB 'NONSW' DW PARMS13-PARMS12-2 PARMS12 DB '9600' DW PARMS14-PARMS13-2 PARMS13 DB '4800' DW PARMS15-PARMS14-2 PARMS14 DB '19200' DW PARMS16-PARMS15 PARMS15 DB '38400' PARMS16 EQU $ ;----------------------------------------------- ;COMMAND TABLES ;----------------------------------------------- CTBL1 DB 'ABCEFGHKOQRSTW#U!123456789?' ;COMMAND STRING JTBL1 DW QUEST ;ANSWER QUESTIONAIRE DW BMENU ;BULLETINS DW ENTCMT ;COMMENT DW ENTMSG ;ENTER MESSAGE DW FILESS ;FILE SUBSYSTEM DW GDBYE ;GOODBYE DW HMENU ;HELP DW DELETE ;KILL MESSAGE DW OPPAGE ;OPERATOR PAGE DW QUICKS ;QUICK SCAN DW READTM ;READ MSG DW SCANM ;SCAN MSGS DW TIME ;TIME DW WELCO ;WELCOME DW USTATS ;STATISTICS DW UPARMS ;USER PARMS DW MAILCK ;MAIL CHECK DW SETGID ;SET GROUP ID DW DSPCLR ;LIST CALLERS LOG DW PACKMF ;PACK MSG FILE DW RENMSG ;RENUMBER MSG FILE DW RECMSG ;RECOVER A MSG DW LISTMH ;LIST MESSAGE HEADERS DW ARCLOG ;ARCHIVE LOG DW USERFM ;USERS FILE MAINTENANCE DW SYSMSG ;TOGGLE PAGE BELL DW MMENUA ;FULL MENU CTBL1A DB '10111213TERCEREAEFUFDF' ;MAIN MENU 2 CHAR CMDS DB 'Q?R?S?!!' DB 'F1F2F3F4F5F6F7F8F9F0RA' ;FUNCTION KEY EMULATION JTBL1A DW PACKUF ;PACK USERS FILE DW FDIRFM ;FILE DIR MAINT DW PDIRFI ;PACK DIRECTORY FILE DW STSYSP ;SET SYSTEM PARAMETERS DW TERMNL ;TERMINAL EMULATION DW READCM ;READ CONTINUOUS DW ENTREP ;ENTER REPLY DW ENTAPP ;ENTER APPEND DW ENTFM ;ENTER FLASH MESSAGE DW EDITFM ;EDIT FLASH MESSAGE DW REVFM ;DISPLAY FLASH MESSAGES DW QPRMPT ;PROMPTING QUICK SEARCH DW RPRMPT ;PROMPTING READ DW SPRMPT ;PROMPTING SCAN DW OLDMAL ;REPORT OLD MAIL DW FUNC01 ;F1 DW FUNC02 ;F2 DW FUNC03 ;F3 DW FUNC04 ;F4 DW FUNC05 ;F5 DW FUNC06 ;F6 DW FUNC07 ;F7 DW FUNC08 ;F8 DW FUNC09 ;F9 DW FUNC10 ;F10 DW ARCMSG ;ARCHIEVE MESSAGES CTBL1B DB 'RC?' ;3 CHAR MAIN CMDS DB 'BIX' DB 'OIX' DB 'CIX' DB '!!!' JTBL1B DW RCPRMP ;PROMPTING RC DW BIXFIL ;BUILD INDEX FILE DW OIXFIL ;ENABLE INDEX FILE DW CIXFIL ;DISABLE INDEX FILE DW ALLMAL ;REPORT ALL ALL MAIL SYSDATA ENDS ;----------------------------------------------- ;CODE SEGMENT ;----------------------------------------------- CSEG SEGMENT PARA PUBLIC 'CODE' EXTRN GETBUF:NEAR,FREBUF:NEAR,WRLF:NEAR,GPARM:NEAR EXTRN FILESS:NEAR,TERMNL:NEAR,TEIN00:NEAR,MVCSTR:NEAR EXTRN QUICKS:NEAR,READTM:NEAR,SCANM:NEAR,ENTCMT:NEAR EXTRN ENTMSG:NEAR,DELETE:NEAR,BUILDM:NEAR EXTRN UPARMS:NEAR,READM:NEAR,QMSGNO:NEAR EXTRN DSPCLR:NEAR,FNKEY:NEAR,WMSGNO:NEAR EXTRN SETGID:NEAR,PACKMF:NEAR,RENMSG:NEAR,RECMSG:NEAR EXTRN LISTMH:NEAR,ARCLOG:NEAR,USERFM:NEAR,SYSMSG:NEAR EXTRN PACKUF:NEAR,ERROR:NEAR,READCM:NEAR,REVFM:NEAR EXTRN CLEAR:NEAR,SAVALL:NEAR,RSTALL:NEAR,BINASP:NEAR EXTRN BINASC:NEAR,ASCBIN:NEAR,WRMSG:NEAR EXTRN QUERY:NEAR,WPOST:NEAR,RPOST:NEAR,TPOST:NEAR EXTRN LININ:NEAR,CHTIOA:NEAR,DQCMD:NEAR,DQTIOA:NEAR EXTRN EXPBUF:NEAR,CONR:NEAR,CONW:NEAR,CONWRT:NEAR EXTRN CONT:NEAR,TIMRTN:NEAR,TIMASC:NEAR,TIMHM:NEAR EXTRN DATASC:NEAR,DOSTIM:NEAR,DOSDAT:NEAR,ELPASC:NEAR EXTRN ELPTIM:NEAR,TIMON:NEAR,CLRIBF:NEAR,PSMENU:NEAR EXTRN PUMENU:NEAR,TXPRT:NEAR,TSYSOP:NEAR,TAYSOP:NEAR EXTRN PTIME:NEAR,PUSTAT:NEAR,LOGDSK:NEAR,MOVSTR:NEAR EXTRN MOVSTL:NEAR,APPBYT:NEAR,CPCSTA:NEAR,CMPSTR:NEAR EXTRN XLATE:NEAR,FDIRFM:NEAR,ST2400:NEAR,WTBUFE:NEAR EXTRN ILINEB:NEAR,FRELBF:NEAR,BLANKF:NEAR,HAYIND:NEAR EXTRN PADB:NEAR,STRIP:NEAR,CKPTM:NEAR,CLRITB:NEAR EXTRN SENDHF:NEAR,PKINX:NEAR,MVZSTR:NEAR EXTRN SENDF:NEAR,UNCMD:NEAR,PURGST:NEAR,FRETIO:NEAR EXTRN STM7B:NEAR,STM8B:NEAR,RESMDM:NEAR EXTRN ST300:NEAR,ST1200:NEAR,PURG1:NEAR,HAYIN:NEAR EXTRN FEOF:NEAR,FRECMD:NEAR,ST9600:NEAR,LALIGN:NEAR EXTRN WELCO:NEAR,SIGNON:NEAR,PDIRFI:NEAR,STSYSP:NEAR EXTRN ENTREP:NEAR,ENTAPP:NEAR,LOCKWT:NEAR,UNLOCK:NEAR EXTRN EDITFM:NEAR,DISPFM:NEAR,ENTFM:NEAR,RUNFIL:NEAR EXTRN WAITRT:NEAR,MOVMSG:NEAR,ARCMSG:NEAR EXTRN QPRMPT:NEAR,RPRMPT:NEAR,SPRMPT:NEAR EXTRN CLEARW:NEAR,SCRWIN:NEAR,RCPRMP:NEAR EXTRN CLROBF:NEAR,SCAUSE:NEAR,ST4800:NEAR,ST1920:NEAR EXTRN CKFSPC:NEAR,PUTUSR:NEAR,CLRCSR:NEAR,OLDMAL:NEAR EXTRN BIXFIL:NEAR,MAILIX:NEAR,OIXFIL:NEAR,CIXFIL:NEAR EXTRN ALLMAL:NEAR,PRGINX:NEAR,ST3840:NEAR EXTRN LOGCP:NEAR PUBLIC LOSTC,GDBYE,GDBY00,POSTCD,CHKPRM,INIL55 PUBLIC MMENU1,MMENU2,NOTYET,INITLN PUBLIC GETWIN,FREWIN,SETWIN,RESWIN,LABWIN ASSUME CS:CSEG,DS:NOTHING,ES:SYSDATA INITLN: MOV AX,SYSDATA ;SYSTEM DATA SEGMENT MOV ES,AX ;SET EXTRA SEGMENT CALL PURGST ;FREE ALL ALLOCATED STORAGE CALL CLRITB ;CLEAR INTER-TASK BUFFER CALL CLROBF ;PURGE OUTPUT BUFFER MOV WORD PTR [BX+USRSL],-1 ;SHOW NOT LOGGED ON MOV WORD PTR [BX+USRSE],0 ;SET NORMAL ECHO CLI ;NO INTERRUPTS IF OPSYS EQ 1 MOV AX,WORD PTR [BX+CBRTV] ;STANDARD TIME OUT MOV WORD PTR [BX+CBRTC],AX ;SET STANDARD ENDIF MOV WORD PTR [BX+CBFLG],0 ;CLEAR SESSION FLAGS MOV WORD PTR [BX+DCESTAT],0 ;CLEAR DCE STATUS MOV WORD PTR [BX+DTESTAT],0 ;CLEAR DTE STATUS MOV WORD PTR [BX+CBLINO],0 ;CLEAR USER LINE COUNT STI ;INTERRUPTS OK CALL NSHUT ;CHECK FOR NORMAL SHUTDOWN CMP WORD PTR [BX+USRLN],1 ;COMMUNICATION TASK? JZ INIL10 ;YES CMP WORD PTR [BX+USRLN],2 ;COMMUNICATION TASK? JZ INIL10 ;YES MOV WORD PTR [BX+CBMDM],MDMKBD ;MARK LOCAL MOV BYTE PTR [BX+CBMSR],0 ;CLEAR CONSOLE STATUS JMP CONCMD ;GET CONSOLE COMMAND INIL10: CALL RESMDM ;RESET MODEM TO COMMAND STATE TEST WORD PTR DS:MSGCKPT+MSOPTS,6 ;SNOOP OR TRACE ON? JZ INIL12 ;NO CALL GETWIN ;GET SNOOP WINDOW INIL12: OR WORD PTR [BX+CBFLG],SFLTR+SFSNP ;ENABLE SNOOP & TRACE TEST WORD PTR [BX+CBMDM],MDM03+MDM12+MDM24+MDM48+MDM96+MDM192+MDM384 JNZ INIL30 ;MODEM SPEED KNOWN CALL IMODEM ;INITIALIZE MODEM INIL30: CALL STM8B ;SET 8 BIT NO PARITY TEST WORD PTR [BX+CBMDM],MDM24 ;2400? JZ INIL32 ;NO CALL ST2400 ;SET 2400 MOV AX,152 ;2400 BAUD INIT STRING JMP SHORT INIL40 INIL32: TEST WORD PTR [BX+CBMDM],MDM12 ;1200? JZ INIL33 ;NO CALL ST1200 ;SET 1200 MOV AX,154 ;1200 BAUD INIT STRING JMP SHORT INIL40 INIL33: TEST WORD PTR [BX+CBMDM],MDM96 ;9600? JZ INIL34 ;NO CALL ST9600 ;SET 9600 MOV AX,410 ;9600 BAUD INIT STRING JMP SHORT INIL40 INIL34: TEST WORD PTR [BX+CBMDM],MDM48 ;4800? JZ INIL35 ;NO CALL ST4800 ;SET 4800 MOV AX,152 ;ASSUME 4800 SAME AS 2400 JMP SHORT INIL40 INIL35: TEST WORD PTR [BX+CBMDM],MDM192 ;19200? JZ INIL36 ;NO CALL ST1920 ;SET 19200 MOV AX,410 ;ASSUME 19200 SAME AS 9600 JMP SHORT INIL40 INIL36: TEST WORD PTR [BX+CBMDM],MDM384 ;38400? JZ INIL37 ;NO CALL ST3840 ;SET 38400 MOV AX,410 ;ASSUME 38400 SAME AS 9600 JMP SHORT INIL40 INIL37: CALL ST300 ;SET 300 MOV AX,153 ;300 BAUD INIT STRING INIL40: CALL CLRIBF ;FLUSH INPUT BUFFER CALL LABWIN ;UPDATE LABEL WITH SPEED TEST WORD PTR [BX+CBMDM],MDMNULL ;NULL MODEM? JZ INIL42 ;NO MOV AX,145 ;SYSTEM HERALD CALL WMSGNO ;LET TERMINAL KNOW WE'RE UP JMP INIL50 ;SKIP HAYES DIALOG INIJLN: JMP INITLN ;TRY WHOLE THING AGAIN INIL42: CALL WMSGNO ;SEND TO MODEM INIL43: CALL HAYIN ;GET RESPONSE JC INIJLN ;TIME OUT - TRY AGAIN CMP WORD PTR [SI-2],1 ;NUMERIC RESPONSE? JZ INIL44 ;YES JMP INIL43 ;NO - IGNORE COMMAND ECHO INIL44: OR AL,AL ;CHECK RESPONSE JNZ INIJLN ;TRY AGAIN INIL50: MOV AX,TIMEOUT ;SYSTEM TIME OUT CONSTANT MOV WORD PTR [BX+CBRTV],AX ;SET TIME OUT VALUE INIL52: TEST WORD PTR [BX+CBMDM],MDMNSW ;NON-SWITCHED? JZ INIL54 ;NO MOV AX,378 ;NON-SW INIT STRING CALL WMSGNO ;SEND TO MODEM CALL HAYIN ;GET OK RESPONSE JMP INIL58 ;TURN CARRIER ON INIL54: MOV WORD PTR [BX+CBWIT],BX ;REQUEST POST ON RING AND word PTR [BX+CBFLG],sfsnp+sfltr+SFWINV ;CLR session flags CALL FRECMD ;FREE COMMAND BUFFER CALL FREWIN ;FREE CONSOLE WINDOW CALL CLRIBF ;FLUSH RESPONSE BUFFER CALL WAITRT ;WAIT FOR PHONE INIL55: MOV WORD PTR [BX+CBWIT],0 ;ACKNOWLEDGE POST TEST BYTE PTR [BX+CBFLG],SFITP ;INTER-TASK POST? JZ INIL56 ;NO CALL RPOST ;GET POST CODE CMP AL,1DH ;TERMINAL LINE DRIVER? JNZ INIL56 ;NO - IGNORE JMP TEIN00 ;LETS BE A LINE DRIVER INIL56: TEST WORD PTR [BX+CBFLG],SFTO ;TIME OUT? JNZ INIL54 ;YES - WAIT SOME MORE TEST WORD PTR [BX+CBMDM],MDMOO+MDMTE ;ORIGINATE ONLY? JNZ INIL50 ;YES - DON'T ANSWER PHONE TEST WORD PTR [BX+CBMDM],MDMNULL ;NULL MODEM? JZ INIL60 ;NO - GET RING RESPONSE CALL CONR ;GET ATTENTION CHAR AND AL,7FH ;CLEAR PARITY CMP AL,13 ;CARRIAGE RETURN? JNZ INIL54 ;NO - WAIT SOME MORE JMP INIL80 ;GET LOGIN INFO INIL58: MOV AX,428 ;RING CALL LOGCP ;LOG TEST WORD PTR DS:MSGCKPT+MSOPTS,6 ;SNOOP OR TRACE ON? JZ INIL59 ;NO CALL GETWIN ;GET SNOOP WINDOW INIL59: MOV AX,150 ;ANSWER STRING CALL WMSGNO ;TELL MODEM TO ANSWER PHONE INIL60: CALL HAYIND ;GET HAYES RESPONSE JNC INIL65 ;GOT A RESPONSE JMP INITLN ;START OVER INIL65: CMP AL,81 ;VALID RANGE? JNB INIL60 ;NO - TRY AGAIN CBW SHL AX,1 ;INDEX INTO JMP TABLE MOV SI,AX ;NEED INDEX REG JMP HAYTBL[SI] ;ENTER ROUTINE INIL70: MOV AX,439 ;CONNECT 9600 CALL LOGCP ;LOG CALL ST9600 ;SET 9600 BAUD JMP INIL80 ;GO GET LOGIN INIL71: MOV AX,440 ;CONNECT 19200 CALL LOGCP ;LOG CALL ST1920 ;SET 19200 BAUD JMP INIL80 ;GO GET LOGIN INIL72: MOV AX,437 ;CONNECT 2400 CALL LOGCP ;LOG CALL ST2400 ;SET 2400 BAUD JMP INIL80 ;GO GET LOGIN INIL73: MOV AX,438 ;CONNECT 4800 CALL LOGCP ;LOG CALL ST4800 ;SET 4800 BAUD JMP INIL80 ;GO GET LOGIN INIL74: MOV AX,430 ;CONNECT CALL LOGCP ;LOG CALL ST300 ;CHANGE TO 300 BAUD JMP INIL80 ;GO GET LOGIN INIL75: MOV AX,441 ;CONNECT 38400 CALL LOGCP ;LOG CALL ST3840 ;CHANGE TO 38400 BAUD JMP INIL80 ;GO GET LOGIN INIL76: MOV AX,433 ;CONNECT 1200 CALL LOGCP ;LOG CALL ST1200 ;CHANGE TO 1200 BAUD INIL80: MOV WORD PTR [BX+CBRTC],5 ;ABOUT .25 SEC CALL WAITRT ;LET REMOTE MODEM SYNC TEST WORD PTR DS:MSGCKPT+MSOPTS,6 ;SNOOP OR TRACE ON? JZ INIL90 ;NO CALL GETWIN ;GET SNOOP WINDOW INIL90: OR WORD PTR [BX+CBFLG],SFLTR+SFSNP ;ENABLE SNOOP & TRACE INITLX: CALL SIGNON ;GET SIGN ON INFO JNC INITLS ;GO TO MAIN MENU JMP GDBYEX ;INVALID LOGON INITLS: CALL LABWIN ;LABEL WINDOW JMP MMENU ;MAIN MENU ;MODEM OK RESPONSE INI100: MOV AX,429 ;OK CALL LOGCP ;LOG RESULT JMP INIL60 ;TRY AGAIN ;MODEM INVALID RESPONSE INI110: MOV AX,425 ;UNDOCUMENTED CALL LOGCP ;LOG RESULT JMP INIL60 ;TRY AGAIN ;MODEM NO CARRIER INI120: MOV AX,431 ;NO CARRIER CALL LOGCP ;LOG RESULT JMP GDBYEX ;CHECK DISCONNECT REASON ;MODEM ERROR RESPONSE INI130: MOV AX,432 ;ERROR CALL LOGCP ;LOG RESULT JMP INITLN ;INITIALIZE LINE ;MODEM NO DIALTONE INI140: MOV AX,434 ;NO DIALTONE CALL LOGCP ;LOG RESULT JMP INITLN ;INITIALIZE LINE ;MODEM BUSY INI150: MOV AX,435 ;BUSY CALL LOGCP ;LOG RESULT JMP INITLN ;INITIALIZE LINE ;MODEM NO ANSWER INI160: MOV AX,436 ;NO ANSWER CALL LOGCP ;LOG RESULT JMP INITLN ;INITIALIZE LINE ;SET DCE CARRIER SPEED STATUS BITS DCE010: MOV AX,442 ;CARRIER 300 CALL LOGCP ;LOG MOV AX,MSP003 ;300 BAUD CARRIER JMP DCE090 ;GO STORE DCE020: MOV AX,443 ;CARRIER 1200 CALL LOGCP ;LOG MOV AX,MSP012 ;1200 BAUD CARRIER JMP DCE090 ;GO STORE DCE030: MOV AX,444 ;CARRIER 2400 CALL LOGCP ;LOG MOV AX,MSP024 ;2400 BAUD CARRIER JMP DCE090 ;GO STORE DCE040: MOV AX,445 ;CARRIER 4800 CALL LOGCP ;LOG MOV AX,MSP048 ;4800 BAUD CARRIER JMP DCE090 ;GO STORE DCE050: MOV AX,446 ;CARRIER 9600 CALL LOGCP ;LOG MOV AX,MSP096 ;9600 BAUD CARRIER DCE090: AND WORD PTR [BX+DCESTAT],0FF00H ;CLEAR SPEED OR WORD PTR [BX+DCESTAT],AX ;SET NEW SPEED JMP INIL60 ;GET NEXT COMMAND ;SET DCE DATA COMPRESSION BITS DCE110: MOV AX,447 ;CLASS 5 CALL LOGCP ;LOG MOV AX,MDCMNP5 ;MNP 5 DATA COMPRESSION JMP DCE190 ;GO STORE DCE120: MOV AX,448 ;V.42bis CALL LOGCP ;LOG MOV AX,MDCV42 ;V42bis DATA COMPRESSION JMP DCE190 ;GO STORE DCE130: MOV AX,449 ;NO COMPRESSION CALL LOGCP ;LOG XOR AX,AX ;NO DATA COMPRESSION DCE190: AND WORD PTR [BX+DCESTAT],0F0FFH ;CLEAR DC BITS OR WORD PTR [BX+DCESTAT],AX ;SET DC STATUS JMP INIL60 ;GET NEXT COMMAND ;SET DCE LINK PROTOCOL BITS DCE210: MOV AX,450 ;NO PROTOCOL CALL LOGCP ;LOG XOR AX,AX ;NO ERROR CORRECTION JMP DCE290 ;GO STORE DCE220: MOV AX,451 ;LAPM CALL LOGCP ;LOG MOV AX,MECLAPM ;V42 ERROR CONTROL JMP DCE290 ;GO STORE DCE230: MOV AX,452 ;MNP CALL LOGCP ;LOG MOV AX,MECMNP ;MNP ERROR CORRECTION DCE290: AND WORD PTR [BX+DCESTAT],0FFFH ;CLEAR EC BITS OR WORD PTR [BX+DCESTAT],AX ;SET EC STATUS JMP INIL60 ;GET NEXT COMMAND CONCMD: MOV WORD PTR [BX+CBRTV],5500 ;TIME OUT = 5 MIN CMP BX,KBDTSK ;HAVE KEYBOARD FOCUS? JNZ CONC07 ;NO - WAIT FOR INPUT CONC05: CALL GETWIN ;GET CONSOLE WINDOW MOV AX,365 ;ANSI STRING CALL WMSGNO ;WRITE TO SCREEN CALL ILINEB ;INITIALIZE BUFFER MOV DI,OFFSET CWNOTE ;COPYRIGHT SCREEN CALL MVCSTR ;COPY TO BUFFER CALL WRMSG ;DISPLAY MOV AX,18 ;FUNCTION KEY MENU CALL WMSGNO ;DISPLAY CONC07: CALL NSHUT ;CHECK FOR NORMAL SHUTDOWN CALL CONR ;READ CHAR FROM CONSOLE TEST WORD PTR [BX+CBFLG],SFTO ;TIMED OUT? JZ CONC09 ;NO CALL FREWIN ;FREE WINDOW CALL CKFSPC ;CHECK FILE SPACE CALL PRGINX ;CHECKPOINT INDEX BUFFERS CALL CKPTM ;CHECKPOINT SYSTEM STATUS JMP CONC07 ;WAIT SOME MORE CONC09: TEST WORD PTR [BX+CBFLG],SFITP ;INTER-TASK POST? JNZ CONC15 ;YES CONC10: CMP AL,27 ;ESCAPE? JNZ CONC20 ;NO MOV WORD PTR [BX+CBRTV],10000 ;ABOUT 10 MIN OR BYTE PTR [BX+CBMSR],MSRCD ;SHOW CONSOLE IN SESSION CALL GETWIN ;GET WINDOW JMP INITLX ;INVOKE LOGON CONC15: CALL RPOST ;GET POST CODE CMP AL,1CH ;CHAT REQUEST? JNZ CONC07 ;IGNORE OR BYTE PTR [BX+CBMSR],MSRCD ;SHOW CONSOLE IN SESSION CALL GETWIN ;GET WINDOW JMP OPPRTN ;ENTER CHAT ROUTINE CONC20: OR AL,AL ;EXTENDED FUNCTION? JNZ CONC30 ;NO CALL CONR ;GET EXTENDED FUNCTION CODE SUB AL,03BH ;F1 JB CONC30 ;NOT VALID CALL GETWIN ;GET WINDOW CALL FNKEY ;IN SYSOP JMP CONC07 ;WAIT FOR INPUT CONC30: JMP CONC05 ;DISPLAY MENU ;----------------------------------------------------------- ;FUNCTION KEY EMULATION ;----------------------------------------------------------- FUNC01: MOV AL,0 ;F1 JMP CFNKEY ;CALL FUNCTION KEY FUNC02: MOV AL,1 ;F2 JMP CFNKEY ;CALL FUNCTION KEY FUNC03: MOV AL,2 ;F3 JMP CFNKEY ;CALL FUNCTION KEY FUNC04: MOV AL,3 ;F4 JMP CFNKEY ;CALL FUNCTION KEY FUNC05: MOV AL,4 ;F5 JMP CFNKEY ;CALL FUNCTION KEY FUNC06: MOV AL,5 ;F6 JMP CFNKEY ;CALL FUNCTION KEY FUNC07: MOV AL,6 ;F7 JMP CFNKEY ;CALL FUNCTION KEY FUNC08: MOV AL,7 ;F8 JMP CFNKEY ;CALL FUNCTION KEY FUNC09: MOV AL,8 ;F9 JMP CFNKEY ;CALL FUNCTION KEY FUNC10: MOV AL,9 ;F10 JMP CFNKEY ;CALL FUNCTION KEY CFNKEY: CALL TSYSOP ;AUTHORIZED CALLER? JNZ CFNK10 ;YES JMP MMENU2 ;UNKNOWN COMMAND CFNK10: CALL FNKEY ;INVOKE Fn COMMAND ;--------------------------------------------------------- ;MAIN MENU ROUTINE ;---------------------------------------------------------- ;PRINT REMAINING TIME MMENU: CALL PTIME ;REMAINING TIME ;DISPLAY MENU CALL TXPRT ;EXPERT MODE? JNZ MMENUB ;YES MMENUA: CALL PSMENU ;PRINT FULL MENU MMENUB: CALL PUMENU ;PRINT EXPERT MENU JNC MMENU1 ;GOOD READ JMP POSTCD ;HONOR EXCEPTION CONDITION MMENU1: CALL PKINX ;CHECKPOINT MESSAGE INDEX ;PROCESS COMMAND LINES ONE BY ONE CMP WORD PTR [BX+USRIN],0 ;COMMAND IN BUFFER? JZ MMENU ;NO - DISPLAY MENU AGAIN CALL DQCMD ;GET CURRENT COMMAND CALL LALIGN ;STRIP LEADING BLANKS MOV CX,WORD PTR [SI-2] ;DATA LENGTH JCXZ MMENU ;NULL COMMAND CALL XLATE ;TRANSLATE TO UPPER CASE CMP CX,2 ;SINGLE CHAR CMD? JAE MMENU3 ;HANDLE EXTENDED COMMAND LODSB ;GET COMMAND MOV DI,OFFSET CTBL1 ;MAIN COMMAND TABLE MOV CX,(JTBL1-CTBL1) ;COMMAND TABLE SIZE REPNZ SCASB ;CHECK FOR MATCH JNZ MMENU2 ;UNKNOWN COMMAND SUB DI,OFFSET CTBL1+1 ;OFFSET IN STRING SHL DI,1 ;TABLE WIDTH JMP JTBL1[DI] ;GO TO COMMAND ROUTINE MMENU2: CALL FRETIO ;PURGE TIOA CHAIN CALL TXPRT ;TEST FOR EXPERT MODE JNZ MMENU ;REPEAT PROMPT CALL UNCMD ;UNKNOWN COMMAND ROUTINE JMP MMENU MMENU3: JNZ MMENU4 ;TRY 3 CHARS MOV DI,OFFSET CTBL1A ;2 CHAR MAIN MENU COMMANDS MOV CX,(JTBL1A-CTBL1A) ;COMMAND TABLE SIZE IN BYTES SHR CX,1 ;CONVERT TO WORDS MOV AX,[SI] ;GET COMMAND CHARS REPNZ SCASW ;CHECK FOR MATCH JNZ MMENU2 ;NO MATCH SUB DI,OFFSET CTBL1A+2 ;OFFSET IN STRING JMP JTBL1A[DI] ;EXECUTE COMMAND MMENU4: CMP CX,3 ;OK? JNZ MMENU2 ;INVALID MOV DI,OFFSET CTBL1B ;3 CHAR MAIN MENU COMMANDS MOV AX,(JTBL1B-CTBL1B) ;COMMAND TABLE SIZE IN BYTES MOV CX,3 ;ENTRY LENGTH DIV CL ;# OF ENTRIES MOV CL,AL ;COUNT XOR DX,DX ;TABLE OFFSET MMEN4A: MOV AX,[SI] ;GET COMMAND CHARS SCASW ;CHECK FOR MATCH JZ MMEN4C ;SO FAR SO GOOD INC DI ;NEXT ENTRY MMEN4B: ADD DX,2 ;NEXT ENTRY IN JUMP TABLE LOOP MMEN4A ;TRY NEXT ENTRY JMP MMENU2 ;INVALID MMEN4C: MOV AL,[SI+2] ;FINAL CHAR SCASB ;CHECK FOR MATCH JNZ MMEN4B ;NO MATCH MOV DI,DX ;NEED INDEX REG JMP JTBL1B[DI] ;EXECUTE COMMAND ;-------------------------------------------------------- ;ANALYZE EXCEPTION CONDITION ;-------------------------------------------------------- POSTCD: TEST WORD PTR [BX+CBFLG],SFITP ;INTER-TASK POST? JNZ POST10 ;YES JMP LOSTC ;LOST CARRIER OR TIME OUT POST10: CALL RPOST ;GET POST CODE CMP AL,1CH ;CHAT? JNZ POST12 ;NO JMP OPFPAG ;FORCE CHAT POST12: CMP AL,1DH ;LOG OFF? JNZ POST14 ;NO JMP GDBYE ;FORCE LOG OFF POST14: JMP MMENU ;MAIN MENU ;--------------------------------------------------------- ;LOG USER OFF SYSTEM ;--------------------------------------------------------- LOSTC: CALL ILINEB ;FORMAT BUFFER TEST WORD PTR [BX+CBFLG],SFLC ;LOST CARRIER? JNZ LOSTC1 ;YES MOV AL,30H ;NO USER/NO TIME CALL SCAUSE ;SET CAUSE IN USER RECORD MOV AX,204 ;INPUT TIME-OUT JMP SHORT LOSTC2 ;MOVE TO BUFFER LOSTC1: MOV AL,20H ;NO USER CALL SCAUSE ;SET CAUSE IN USER RECORD MOV AX,203 ;LOST CARRIER LOSTC2: CALL MOVMSG MOV AX,WORD PTR [BX+USRLN] ;LINE NUMBER CALL BINASP CALL LOGDSK JMP SHORT GDBY00 GDBYE: XOR AL,AL ;NORMAL TERMINATION CALL SCAUSE ;SET CAUSE IN USER RECORD GDBY00: CMP WORD PTR [BX+USRSL],-1 ;LOGGED ON? JNZ GDBY05 ;YES - INVOKE SCRIPT JMP GDBYEX ;NO ;INVOKE SCRIPT FILE FOR TERMINATION GDBY05: XOR DX,DX ;NO PASSED PARMS PUSH DX MOV SI,WORD PTR [BX+USRST] ;USER RECORD PUSH SI ;PASS AS PARM CALL ILINEB ;INITIALIZE BUFFER MOV AX,392 ;EXIT NAME CALL MOVMSG ;MOVE TO BUFFER PUSH SI ;PASS AS PARM MOV AX,80 ;BUFFER SIZE CALL GETBUF ;GET WORK BUFFER MOV DI,OFFSET SCRIPT2 ;SCRIPT FILE NAME CALL MVZSTR ;MOVE TO BUFFER PUSH SI CALL RUNFIL CALL FREBUF ;FREE WORK BUFFER ;CONTINUE WITH LOGOFF CALL TIMRTN ;PRINT TIME ON SYSTEM CALL ILINEB ;GET BUFFER MOV AX,195 ;THANKS FOR CALLING CALL MOVMSG ;MOVE TO BUFFER MOV DI,WORD PTR [BX+USR1N] ;1ST NAME CALL MOVSTR ;MOVE TO BUFFER MOV DI,OFFSET CRLF ;END OF LINE CALL MVCSTR ;MOVE TO BUFFER MOV SI,WORD PTR [BX+USRLB] ;BUFFER CALL WRMSG MOV DI,WORD PTR [BX+USRST] ;LOGON RECORD CALL DOSDAT ;CURRENT DATE MOV WORD PTR [DI+UELDAT],CX ;YEAR MOV WORD PTR [DI+UELDAT+2],DX ;MONTH AND DAY CALL DOSTIM ;CURRENT TIME MOV WORD PTR [DI+UELTIM],CX ;HOUR AND MINUTE MOV WORD PTR [DI+UELTIM+2],DX ;SECONDS CMP WORD PTR [DI+UERTIM],2 ;LESS THAN 2 MINUTES? JGE GDBY10 ;NO MOV WORD PTR [DI+UERTIM],0 ;CLEAR RESIDUAL TIME GDBY10: MOV AX,[BX+USRSL] ;USER SLOT CALL PUTUSR ;UPDATE USER RECORD MOV AX,USERH ;USER FILE HANDLE CALL FEOF ;FORCE BUFFER WRITE MOV WORD PTR [BX+USRSL],-1 ;SHOW NOT LOGGED ON AND WORD PTR [BX+CBFLG],NOT SFVUR ;USER RECORD NOT VALID CALL ILINEB ;GET LINE BUFFER MOV DI,WORD PTR [BX+USR3N] ;LOGON NAME CALL MOVSTR MOV AX,197 ;LOGGED OFF CALL MOVMSG ;PUT IN BUFFER MOV SI,WORD PTR [BX+USRLB] ;STRING ADDRESS CALL LOGDSK ;LOG DEC USRCNT ;LOGGED-ON USERS CALL WTBUFE ;WAIT FOR BUFFER TO CLEAR CALL DQCMD ;GET NEXT COMMAND JC GDBYEX ;NONE EXISTS AND BYTE PTR [SI],0DFH ;MAKE UPPER CASE CMP BYTE PTR [SI],'H' ;HOLD REQUEST? JNZ GDBYEX ;NO CALL PURGST ;FREE ALL ALLOCATED STORAGE CALL CLEAR ;CLEAR CURRENT WINDOW CALL LABWIN ;RESTORE LABEL JMP INIL80 ;GET SIGN-ON INFO GDBYEX: TEST WORD PTR [BX+CBMDM],MDM96+MDM192+MDM384 JZ GDBYEZ ;LOW SPEED MODEM TEST BYTE PTR [BX+CBMSR],MSRCD+MSRDSR ;STILL ON LINE? JNZ GDBYEZ ;YES - WE WILL DISCONNECT CALL WTBUFE ;WAIT FOR OUTPUT TO COMPLETE CALL LOGS86 ;LOG DISCONNECT REASON GDBYEZ: JMP INITLN NOTYET: CALL ILINEB ;FORMAT BUFFER MOV DI,OFFSET MSGT4 ;NOT IMPLEMENTED CALL MVCSTR ;MOVE TO BUFFER CALL WRMSG JMP MMENU1 USTATS: CALL PUSTAT ;PRINT USER STATISTICS JMP MMENU1 ;HANDLE NEXT COMMAND ;--------------------------------------------------------- ;DISPLAY BULLETINS ;--------------------------------------------------------- BMENU: FRAME 1 BMENU0: CALL ILINEB ;FORMAT BUFFER MOV DI,OFFSET STRB01 ;FILE NAME PREFIX CALL MVCSTR MOV DI,OFFSET STRB02 ;'IN' SUFFIX CALL MVCSTR BMENU1: MOV DX,SI ;FILE NAME STRING CALL SENDF ;TRANSMIT FILE JNC BMENU2 ;GOOD RETURN CALL ILINEB ;FORMAT LINE BUFFER MOV AX,201 ;BULLETIN # CALL MOVMSG MOV AX,[BP-2] ;BULLETIN # CALL BINASP ;PUT IN STRING MOV AX,202 ;NOT AVAILABLE CALL MOVMSG CALL WRMSG BMENU2: MOV AX,28 ;"BULLETIN # ... CALL QMSGNO ;GET RESPONSE JC BMENUX ;LOST CARRIER CALL DQCMD ;GET BUFFER CALL LALIGN ;STRIP LEADING BLANKS CALL XLATE ;MAKE UC MOV CX,WORD PTR [SI-2] ;COMMAND LENGTH JCXZ BMENUX ;EXIT CMP BYTE PTR [SI],'L' ;LIST? JZ BMENU0 ;YES CALL ASCBIN ;GET VALUE MOV [BP-2],AX ;BULLETIN NUMBER CMP AX,100 ;MAX JAE BMENU2 ;PROMPT AGAIN CALL ILINEB ;FORMAT BUFFER MOV DI,OFFSET STRB01 ;FILE NAME PREFIX CALL MVCSTR CALL BINASP ;PUT IN DIGIT FIELD MOV DI,SI ;START OF STRING ADD DI,WORD PTR [SI-2] ;END OF STRING INC WORD PTR [SI-2] ;ALLOW FOR DELIMITER MOV BYTE PTR [DI],0 ;ADD DELIMITER JMP BMENU1 ;GO DISPLAY BMENUX: MOV SP,BP ;FREE LOCAL STORAGE POP BP ;RESTORE CALLER'S FRAME JMP MMENU1 ;--------------------------------------------------------- ;MAIN MENU HELP SCREEN ;--------------------------------------------------------- HMENU: MOV AL,1 ;MAIN HELP SCREEN CALL SENDHF ;TRANSMIT FILE JMP MMENU1 ;--------------------------------------------------------- ;OPERATOR PAGE COMMAND ; BP-2 FLAGS ; 01 - SESSION ESTABLISHED ; 02 - OPERATOR INITIATED ;--------------------------------------------------------- OPFPAG: MOV AX,2 ;SHOW OPERATOR INITIATED JMP SHORT OPPAG0 OPPAGE: XOR AX,AX ;SHOW USER INITIATED OPPAG0: FRAME 1 MOV [BP-2],AX ;INITIALIZE FLAGS TEST WORD PTR [BP-2],2 ;OPERATOR INITIATED? JZ OPPAG1 ;NO - DON'T SEND MESSAGE MOV AX,24 ;CHAT ID MESSAGE CALL WMSGNO ;WRITE MSG JMP SHORT OPPA03 ;INITIATE CHAT OPPAG1: TEST DS:MSGCKPT+MSOPTS,1 ;SYSOP AVAILABLE? JNZ OPPA00 ;NO PROBLEM JMP OPPA40 ;SYSOP NOT AVAILABLE OPPA00: MOV DI,DS:TSKCNT+2 ;CONSOLE TCB TEST BYTE PTR [DI+CBMSR],MSRCD ;LOCAL TERMINAL IN USE? JZ OPPA01 ;NO JMP OPPA40 ;LOCAL TERMINAL BUSY OPPA01: MOV AX,25 ;"PROGRAM RETURNS ... CALL WMSGNO ;WRITE MSG OPPA03: MOV AX,1CH ;OPERATOR CHAT REQUEST CALL WPOST ;POST LOCAL CONSOLE MOV AX,WORD PTR [BX+USRLN] ;LINE NUMBER CALL WPOST ;POST CONSOLE MOV DX,WORD PTR [BX+USR3N] ;USER NAME MOV AL,DH CALL WPOST MOV AL,DL CALL WPOST CALL RPOST ;WAIT FOR RESPONSE CMP AL,1CH ;OK? JZ OPPA17 ;YES JMP OPPA30 ;NO OPERATOR AVAILABLE OPPA17: MOV AX,27 ;"OPERATOR IS AVAILABLE ... CALL WMSGNO ;WRITE MSG OR WORD PTR [BP-2],1 ;SHOW SESSION ESTABLISHED OPPA20: CALL CONR ;WAIT FOR INPUT JNC OPPA25 ;READ FROM LINE TEST BYTE PTR [BX+CBFLG],SFITP ;INTER-TASK POST? JZ OPPA90 ;NO - END CHAT CALL RPOST ;GET POST CODE CMP AL,1BH ;END OF CHAT? JZ OPPA95 ;YES CALL CONW ;WRITE TO COM PORT CMP AL,13 ;? JNZ OPPA20 ;NO CALL WRLF ;WRITE JMP OPPA20 ;WAIT FOR INPUT OPPA25: CMP AL,1BH ;ESCAPE? JNZ OPPA28 ;NO TEST WORD PTR [BP-2],2 ;OPERATOR INITIATED? JNZ OPPA20 ;YES - IGNORE JMP OPPA90 ;CHAT IS OVER OPPA28: CALL CONW ;ECHO CALL WPOST ;WRITE TO LOCAL CMP AL,13 ;? JNZ OPPA20 ;NO CALL WRLF ;WRITE JMP OPPA20 ;NEXT CHAR OPPA30: CALL ILINEB ;INITIALIZE LINE BUFFER MOV AX,160 ;'SORRY CALL MOVMSG MOV DI,WORD PTR [BX+USR1N] ;1ST NAME CALL MOVSTR MOV AX,199 ;'NO OPERATOR AVAILABLE CALL MOVMSG ;MOVE TO BUFFER JMP SHORT OPPA49 ;WRITE MSG AND EXIT OPPA40: CALL ILINEB ;INITIALIZE LINE BUFFER MOV AX,198 ;SYSTEM IS RUNNING CALL MOVMSG MOV DI,WORD PTR [BX+USR1N] ;1ST NAME CALL MOVSTR OPPA49: CALL WRMSG OPPA50: MOV AX,26 ;"PLEASE LEAVE ... CALL WMSGNO ;WRITE MSG CALL ILINEB ;INITIALIZE BUFFER MOV AX,148 ;PAGE NOT ANSWERED CALL MOVMSG ;MOVE TO BUFFER CALL LOGDSK ;LOG TO DISK OPPA90: TEST WORD PTR [BP-2],1 ;SESSION ESTABLISHED? JZ OPPA95 ;NO - DON'T POST MOV AX,1BH ;END OF CHAT POST CODE CALL WPOST OPPA95: MOV SP,BP ;FREE LOCAL STORAGE POP BP ;RESTORE CALLER'S FRAME JMP MMENU1 ;BACK TO MENU OPPRTN: PUSH BP ;SAVE CALLER'S FRAME MOV BP,SP ;ESTABLISH LOCAL FRAME SUB SP,2 ;ALLOCATE LOCAL STORAGE OR BYTE PTR [BX+CBMSR],MSRCD ;SHOW CONSOLE IN SESSION CALL GETWIN ;GET WINDOW CALL RPOST ;GET LINE NUMBER MOV AH,AL ;MOVE LINE NUMBER TO PARM MOV [BP-2],AX ;SAVE LINE NUMBER MOV WORD PTR [BX+CBRTV],90 ;ABOUT 5 SECONDS MOV CX,6 ;LOOP COUNT CALL RPOST ;HIGH ORDER USER NAME MOV DH,AL CALL RPOST ;LOW ORDER USER NAME MOV DL,AL CALL ILINEB ;INITIALIZE BUFFER MOV DI,DX ;PAGER'S NAME CALL MOVSTR ;MOVE TO BUFFER MOV AX,211 ;"PAGING SYSOP CALL MOVMSG ;MOVE TO BUFFER OPPR05: CALL WRMSG ;WRITE TO CONSOLE CALL CONR ;WAIT FOR RESPONSE CMP AL,1BH ;ESCAPE? JZ OPPR10 ;YES - INITIATE CHAT LOOP OPPR05 ;TRY AGAIN JMP OPPR80 ;TERMINATE CHAT OPPR10: MOV AX,[BP-2] ;LINE NUMBER MOV AL,1CH ;INITIATE CHAT CALL WPOST ;POST CALLER TEST DS:MSGCKPT+MSOPTS,2 ;SNOOP ON? JZ OPPR20 ;NO - NEED CONSOLE WINDOW CALL FREWIN ;FREE CONSOLE WINDOW OPPR20: CALL CONR ;WAIT FOR KEYBOARD JNC OPPR30 ;READ FROM KEYBOARD TEST WORD PTR [BX+CBFLG],SFITP ;INTER-TASK POST? JZ OPPR20 ;NO - IGNORE TIME-OUT CALL RPOST ;GET POST CODE CMP AL,1BH ;END OF CHAT? JZ OPPR90 ;YES JMP SHORT OPPR40 ;WRITE TO LOCAL OPPR30: CMP AL,1BH ;ESC? JZ OPPR80 ;SESSION OVER CALL WPOST ;POST CALLER OPPR40: TEST WORD PTR [BX+CBFLG],SFWINV ;VALID WINDOW? JZ OPPR20 ;NO - SKIP WRITE CALL CONW ;ECHO CMP AL,13 ;? JNZ OPPR20 ;NO CALL WRLF ;WRITE JMP OPPR20 ;NEXT CHAR OPPR80: MOV AX,[BP-2] ;LINE NUMBER MOV AL,1BH ;END OF CHAT CALL WPOST ;POST CALLER OPPR90: CALL FREWIN ;FREE WINDOW AND BYTE PTR [BX+CBMSR],NOT MSRCD ;SHOW CONSOLE FREE MOV WORD PTR [BX+CBRTV],5500 ;TIME OUT = 5 MIN MOV SP,BP ;FREE LOCAL STORAGE POP BP ;RESTORE CALLER'S FRAME JMP CONC07 ;WAIT FOR COMMAND ;--------------------------------------------------------- ;TIME OF DAY ;--------------------------------------------------------- TIME: CALL TIMRTN ;DISPLAY TIME JMP MMENU1 ;MAIN MENU ;-------------------------------------------------------- ;MAIL CHECK ;-------------------------------------------------------- MAILCK: XOR AX,AX ;START AT BEGINNING CALL MAILIX ;PERFORM MAIL CHECK JMP MMENU1 ;MAIN MENU ;-------------------------------------------------------- ;INVOKE QUESTIONAIRE ;-------------------------------------------------------- QUEST: XOR AX,AX ;NO PASSED PARMS PUSH AX MOV AX,WORD PTR [BX+USRST] ;USER RECORD PUSH AX CALL ILINEB ;INITIALIZE BUFFER MOV AX,200 ;EXIT NAME CALL MOVMSG ;MOVE TO BUFFER PUSH SI ;PASS AS PARAMETER MOV AX,80 ;WORK BUFFER SIZE CALL GETBUF ;GET BUFFER MOV DI,OFFSET SCRIPT1 ;SCRIPT FILE NAME CALL MVZSTR ;MOVE TO BUFFER PUSH SI ;PASS PARAMETER CALL RUNFIL ;INVOKE SCRIPT FILE CALL FREBUF ;FREE WORK BUFFER JMP MMENU ;NEXT COMMAND ;--------------------------------------------------------- ;HANDLE PASSED PARAMETERS ; BP-2 WORK FLAGS ; BP-4 INPUT LINE CURRENT POSITION ; BP-6 RESULT BUFFER ; BP-8 STATE TABLE ;--------------------------------------------------------- CHKPRM: FRAME 4 MOV WORD PTR [BP-4],0 ;START OF INPUT MOV WORD PTR [BP-6],0 ;NO BUFFER ALLOCATED MOV WORD PTR [BP-8],255 ;NO KEYWORDS IN PROCESS CHKP00: CALL GPARM ;GET KEYWORD JC CHKP90 ;DONE CALL XLATE ;UPPER CASE FOR COMPARE MOV DI,OFFSET PARM1 ;KEYWORD LIST CHKP10: PUSH DI MOV DI,WORD PTR ES:[DI] ;NEXT KEYWORD CALL CPCSTA ;MATCH? POP DI JZ CHKP20 ;YES ADD DI,4 ;NEXT KEYWORD ENTRY CMP DI,OFFSET PARMX ;END OF LIST? JNZ CHKP10 ;NO CMP DEBUGF,0 ;DEBUG ON? JZ CHKP30 ;NO - IGNORE INVALID PARM ERR 601H ;CRASH CHKP20: CALL WORD PTR ES:[DI+2] ;ENTER KEYWORD ROUTINE CHKP30: JMP CHKP00 ;TEST NEXT ENTRY CHKP90: MOV SI,[BP-6] ;RESULT BUFFER CALL FREBUF ;FREE IT EXITF CLINE1: MOV WORD PTR [BP-8],1 ;MARK COM1 SPECIFIED RET CLINE2: MOV WORD PTR [BP-8],2 ;MARK COM21 SPECIFIED RET CM300: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CM300X ;NOT VALID OR WORD PTR [DI+CBMDM],MDM03 ;SET 300 BAUD CM300X: RET CM1200: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CM120X ;NOT VALID OR WORD PTR [DI+CBMDM],MDM12 ;SET 1200 BAUD CM120X: RET CM2400: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CM240X ;NOT VALID OR WORD PTR [DI+CBMDM],MDM24 ;SET 2400 BAUD CM240X: RET CM4800: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CM480X ;NOT VALID OR WORD PTR [DI+CBMDM],MDM48 ;SET 4800 BAUD CM480X: RET CM9600: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CM960X ;NOT VALID OR WORD PTR [DI+CBMDM],MDM96 ;SET 9600 BAUD CM960X: RET CM1920: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CM192X ;NOT VALID OR WORD PTR [DI+CBMDM],MDM192 ;SET 1920 BAUD CM192X: RET CM3840: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CM384X ;NOT VALID OR WORD PTR [DI+CBMDM],MDM384 ;SET 3840 BAUD CM384X: RET CMOFF: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CMOFFX ;NOT VALID OR WORD PTR [DI+CBMDM],MDMOS ;SET OUT OF SERVICE CMOFFX: RET CMOUT: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CMOUTX ;NOT VALID OR WORD PTR [DI+CBMDM],MDMOO ;SET ORIGINATE ONLY CMOUTX: RET CMNULL: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CMNULX ;NOT VALID OR WORD PTR [DI+CBMDM],MDMNULL ;SHOW NULL MODEM CMNULX: RET CMNSW: MOV AX,[BP-8] ;LINE NUMBER CALL GETTCB ;POINT TO TCB JC CMNSWX ;NOT VALID OR WORD PTR [DI+CBMDM],MDMNSW ;SHOW NON-SWITCHED CMNSWX: RET SDEBUG: MOV DEBUGF,255 ;TURN ON DEBUG RET STEST: MOV TESTF,255 ;TURN ON TEST FLAG RET GETTCB: CMP AX,DS:TSKCNT ;VALID LINE NUMBER? JB GETT10 ;YES STC ;SHOW NOT VALID RET GETT10: MOV DI,AX ;LINE NUMBER INC DI SHL DI,1 ;CONVERT TO OFFSET ADD DI,OFFSET TSKCNT ;POINT TO TCB MOV DI,WORD PTR [DI] ;GET TCB ADDRESS CLC ;SHOW GOOD RETURN RET ;--------------------------------------------------------------------- ;WINDOW MANAGEMENT ROUTINES ;--------------------------------------------------------------------- GETWIN: PUSH SI CALL TSTWIN ;ALREADY HAVE ONE? JC GETW10 ;NO OR WORD PTR [BX+CBFLG],SFWINV ;SHOW VALID CALL CLEAR ;CLEAR EXISTING WINDOW CALL LABWIN ;LABEL WINDOW JMP GETW20 ;EXIT GETW10: MOV ES:[SI],BX ;MARK WINDOW OURS INC WINCTL ;COUNT ADDITIONAL USER CALL ADJWIN ;ADJUST WINDOWS GETW20: POP SI CLC RET FREWIN: PUSH SI CALL TSTWIN ;HAVE ONE? JNC FREW10 ;YES POP SI RET FREW10: PUSH AX CALL CLEAR ;CLEAR CURRENT WINDOW FREW20: XOR AX,AX CMP SI,OFFSET WINCTL+16 ;LAST ENTRY? JZ FREW30 ;YES MOV AX,ES:[SI+2] ;MOVE UP ENTRY FREW30: MOV ES:[SI],AX ;TO CURRENT ENTRY ADD SI,2 ;NEXT ENTRY OR AX,AX ;EMPTY? JNZ FREW20 ;NO - TRY NEXT AND WORD PTR [BX+CBFLG],NOT SFWINV ;WINDOW NOT VALID DEC WINCTL ;ONE LESS USER CMP KBDTSK,BX ;HAVE KEYBOARD FOCUS? JNZ FREW50 ;NO PROBLEM CALL WINFOC ;SET KEYBOARD FOCUS FREW50: CALL ADJWIN ;ADJUST WINDOWS POP AX POP SI RET ;--------------------------------------------------------------------- ;ALLOCATE WINDOWS FOR ALL ACTIVE LINES ; BP-2 TCB POINTER ; BP-4 WINDOW CONTROL TABLE POINTER ;--------------------------------------------------------------------- SETWIN: PUSH BP ;SAVE CALLER'S FRAME MOV BP,SP ;ESTABLISH LOCAL FRAME SUB SP,4 ;ALLOCATE LOCAL STORAGE PUSH AX PUSH CX PUSH SI PUSH DI CALL TSTWIN ;FIND EMPTY ENTRY JC SETW10 ;EMPTY ADD SI,2 ;POINT PAST LOCAL ENTRY SETW10: MOV [BP-4],SI ;EMPTY WINDOW POINTER MOV SI,OFFSET TSKCNT+2 ;TCB LIST MOV [BP-2],SI ;TCB POINTER MOV CX,DS:TSKCNT ;TCB COUNT SETW20: MOV SI,[BP-2] ;TCB POINTER MOV DI,[SI] ;NEXT TCB TEST BYTE PTR [DI+CBMSR],MSRCD ;IN SESSION? JZ SETW30 ;NO TEST WORD PTR [DI+CBMDM],MDMKBD ;LOCAL TERMINAL? JNZ SETW30 ;YES - SKIP INC WINCTL ;COUNT USER MOV SI,[BP-4] ;CTL BLOCK PTR MOV ES:[SI],DI ;MARK OWNED ADD WORD PTR [BP-4],2 ;NEXT CTL ENTRY SETW30: ADD WORD PTR [BP-2],2 ;NEXT TCB ENTRY LOOP SETW20 ;REST OF ENTRIES CALL ADJWIN ;ADJUST WINDOWS POP DI POP SI POP CX POP AX MOV SP,BP ;FREE LOCAL STORAGE POP BP RET RESWIN: PUSH AX PUSH CX PUSH SI PUSH DI MOV CX,4 ;MAX ENTRIES MOV SI,OFFSET WINCTL+2 ;1ST ENTRY XOR AX,AX ;ASSUME NO LOCAL WINDOW RESW10: MOV DI,ES:[SI] ;OWNING TCB OR DI,DI ;END OF TABLE? JZ RESW40 ;YES CMP WORD PTR [DI+USRLN],0 ;LOCAL TASK? JNZ RESW20 ;NO MOV AX,DI ;SAVE LOCAL TCB JMP SHORT RESW30 ;CHECK NEXT RESW20: DEC WINCTL ;REMOVE USER RESW30: MOV WORD PTR ES:[SI],0 ;SHOW NOT OWNED ADD SI,2 ;NEXT ENTRY AND WORD PTR [DI+CBFLG],NOT SFWINV ;WINDOW NOT VALID CALL CLEARW ;CLEAR OLD WINDOW LOOP RESW10 ;REST OF ENTRIES RESW40: MOV WINCTL+2,AX ;MAKE LOCAL TCB 1ST CALL ADJWIN ;ADJUST WINDOWS POP DI POP SI POP CX POP AX RET TSTWIN: PUSH CX MOV SI,OFFSET WINCTL+2 ;WINDOW CONTROL ENTRIES MOV CX,4 ;MAX ENTRIES TSTW10: CMP BX,ES:[SI] ;OWN THIS ENTRY? JZ TSTW90 ;YES - RETURN CMP WORD PTR ES:[SI],0 ;EMPTY ENTRY? JZ TSTW80 ;YES ADD SI,2 ;NEXT ENTRY LOOP TSTW10 ;CHECK MORE ENTRIES ERR 506H ;SHOULD NOT OCCUR TSTW80: STC ;SHOW NOT OWNED TSTW90: POP CX RET ADJWIN: CMP WINCTL,0 ;ANYTHING TO ADJUST? JNZ ADJW10 ;YES RET ADJW10: PUSH BP ;SAVE CALLER'S FRAME MOV BP,SP ;ESTABLISH LOCAL FRAME SUB SP,2 ;ALLOCATE LOCAL STORAGE PUSH AX PUSH CX PUSH DX PUSH SI PUSH DI MOV AX,25 ;LINES ON SCREEN DIV BYTE PTR WINCTL ;LINES PER WINDOW DEC AL ;OFFSET TO LAST LINE MOV [BP-2],AX ;WINDOW SIZE MOV SI,OFFSET WINCTL ;WINDOW CONTROL TABLE MOV CX,ES:[SI] ;ACTIVE ENTRIES XOR DH,DH ;TOP OF SCREEN ADJW20: XOR DL,DL ;LEFT EDGE ADD SI,2 ;NEXT ENTRY MOV DI,ES:[SI] ;OWNING TCB MOV AX,[DI+CBWINUL] ;OLD TOP OF WINDOW MOV [DI+CBWINUL],DX ;NEW UPPER LEFT CORNER TEST WORD PTR [DI+CBFLG],SFWINV ;EXISTING WINDOW? JZ ADJW23 ;NO - DON'T SCROLL SUB AH,DH ;LINES MOVED UP JBE ADJW23 ;NOT MOVED UP MOV AL,AH ;LINES TO SCROLL CALL SCRWIN ;SCROLL WINDOW UP ADJW23: MOV AX,[BP-2] ;WINDOW SIZE ADD DH,AL ;LAST LINE CMP CX,1 ;LAST WINDOW? JNZ ADJW30 ;NO ADD DH,AH ;ALLOCATE ODD LINES ADJW30: DEC DH ;LEAVE LINE FOR TITLE MOV DL,79 ;RIGHT EDGE TEST WORD PTR [DI+CBFLG],SFWINV ;EXISTING WINDOW? JNZ ADJW33 ;YES MOV [DI+CBWINLR],DX ;LOWER RIGHT CORNER CALL CLEARW ;CLEAR NEW WINDOW OR WORD PTR [DI+CBFLG],SFWINV ;MARK WINDOW VALID JMP SHORT ADJW36 ;PROCESS NEXT WINDOW ADJW33: MOV AL,BYTE PTR [DI+CBCURSE+1] ;CURSOR LINE SUB AL,DH ;NEW BOTTOM LINE JBE ADJW35 ;CURSOR STILL IN WINDOW CALL SCRWIN ;SCROLL WINDOW ADJW35: MOV [DI+CBWINLR],DX ;LOWER RIGHT CORNER CALL CLRCSR ;CLEAR FROM CURSOR ADJW36: CALL RLABWN ;UPDATE WINDOW LABEL ADD DH,2 ;NEXT WINDOW LOOP ADJW20 ;NEXT ENTRY POP DI POP SI POP DX POP CX POP AX MOV SP,BP ;FREE LOCAL STORAGE POP BP ;RESTORE CALLER'S FRAME RET ;-------------------------------------------------------------------- ;LABEL CURRENT TASK WINDOW ; BP-2 CURSOR SAVE AREA ; BP-4 ATTRIBUTE SAVE AREA ; BP-6 LABEL BUFFER ; BP-8 LABEL LINE LENGTH ;-------------------------------------------------------------------- LABWIN: PUSH DI TEST WORD PTR [BX+CBFLG],SFWINV ;VALID WINDOW? JZ LABW90 ;NO - EXIT MOV DI,BX ;THIS TASK'S WINDOW CALL RLABWN ;LABEL WINDOW LABW90: POP DI RET RLABWN: FRAME 4 PUSH AX PUSH CX PUSH DX PUSH SI PUSH DI MOV DX,[BX+CBCURSE] ;OUR CURSOR LOCATION MOV [BP-2],DX ;SAVE MOV DX,[DI+CBWINLR] ;LOWER RIGHT CORNER INC DH ;LABEL LINE XOR CX,CX ;CLEAR COUNT REG MOV CL,DL ;END OF LINE MOV [BP-8],CX ;LINE LENGTH MOV AX,[DI+CBWINUL] ;UPPER LEFT CORNER MOV DL,AL ;START OF LABEL WINDOW MOV [BX+CBCURSE],DX ;NEW CURSOR POSITION MOV AL,[BX+CBCOLOR] ;ATTRIBUTE MOV [BP-4],AX ;SAVE MOV AL,70H ;REVERSE VIDEO MOV [BX+CBCOLOR],AL ;SET NEW ATTRIBUTE MOV AX,[BP-8] ;LABEL LINE LENGTH CALL GETBUF ;GET BUFFER CALL BLANKF ;BLANK BUFFER MOV AX,259 ;'COM' CALL MOVMSG ;MOVE TO BUFFER MOV AX,WORD PTR [DI+USRLN] ;LINE NUMBER ADD AL,'0' ;CONVERT TO ASCII CALL APPBYT ;ADD TO STRING INC WORD PTR [SI-2] ;LEAVE SPACE TEST WORD PTR [DI+CBMDM],MDMKBD ;LOCAL CONNECTION? JNZ RLAB50 ;YES - SKIP BAUD CHECK MOV DX,[DI+DCESTAT] ;COMMUNICATION STATUS OR DX,DX ;EXIST? JNZ RLAB00 ;YES MOV DX,[DI+DTESTAT] ;USE TERMINAL STATUS RLAB00: MOV AX,246 ;1200 TEST DX,MSP012 ;1200 BAUD? JNZ RLAB10 ;YES MOV AX,247 ;ASSUME 2400 TEST DX,MSP024 ;2400 BAUD? JNZ RLAB10 ;2400 IT IS MOV AX,253 ;ASSUME 4800 TEST DX,MSP048 ;4800 BAUD? JNZ RLAB10 ;4800 IT IS MOV AX,394 ;ASSUME 9600 TEST DX,MSP096 ;9600 BAUD? JNZ RLAB10 ;9600 IT IS MOV AX,245 ;ASSUME 300 TEST DX,MSP003 ;300 BAUD? JNZ RLAB10 ;300 IT IS JMP RLAB50 ;NO SPEED DETECTED RLAB10: CALL MOVMSG ;MOVE SPEED TO BUFFER MOV AL,'E' ;ASSUME EVEN PARITY TEST WORD PTR [DI+DTESTAT],MPARE ;EVEN PARITY? JNZ RLAB11 ;RIGHT ON TEST WORD PTR [DI+DTESTAT],MPARO ;ODD PARITY? JZ RLAB12 ;NO MOV AL,'O' ;ODD PARITY RLAB11: CALL APPBYT ;SHOW EVEN PARITY RLAB12: INC WORD PTR [SI-2] ;LEAVE SPACE RLAB50: PUSH DI MOV DI,[DI+USR3N] ;USER NAME OR DI,DI ;EXIST? JZ RLAB60 ;NO - SKIP NAME CALL MOVSTR ;MOVE TO BUFFER INC WORD PTR [SI-2] ;LEAVE SPACE RLAB60: POP DI TEST WORD PTR [DI+CBFLG],SFVUR ;USER RECORD EXIST JZ RLAB70 ;NO - USER INFO NOT VALID PUSH DI MOV DI,[DI+USRST] ;USER RECORD ADD DI,UEGID ;GROUP ID CMP BYTE PTR [DI],' ' ;EXIST? JBE RLAB65 ;NO MOV AL,'(' CALL APPBYT MOV CX,UEMAIL-UEGID ;MAXIMUM LENGTH CALL MOVSTL ;MOVE TO BUFFER CALL STRIP ;TRIM TRAILING BLANKS MOV AL,')' CALL APPBYT INC WORD PTR [SI-2] ;LEAVE SPACE RLAB65: POP DI MOV AX,[DI+USRMH] ;TIME LOGGED ON PUSH AX MOV AL,AH ;HOURS CBW MOV CX,2 ;FORCE TWO POSITIONS OR CH,80H ;ZERO FILL CALL BINASC ;PUT IN STRING MOV AL,':' CALL APPBYT ;ADD TO STRING POP AX CBW MOV CX,2 ;FORCE TWO POSITIONS OR CH,80H ;ZERO FILL CALL BINASC ;PUT MINUTES IN STRING INC WORD PTR [SI-2] ;LEAVE SPACE MOV AL,'(' CALL APPBYT MOV AX,[DI+USRLMT] ;USER TIME LIMIT CALL BINASP ;MOVE TO STRING MOV AL,')' CALL APPBYT RLAB70: MOV CX,[BP-8] ;LABEL LENGTH CALL PADB ;PAD TO LINE LENGTH MOV [BP-6],SI ;REMEMBER LOCATION MOV CX,[SI-2] ;LENGTH JCXZ RLAB90 ;INVALID RLAB80: LODSB ;NEXT CHAR CALL CONWRT ;WRITE TO SCREEN LOOP RLAB80 RLAB90: MOV DX,[BP-2] ;OLD CURSOR MOV [BX+CBCURSE],DX ;RESTORE CURSOR MOV DX,[BP-4] ;OLD ATTRIBUTE MOV [BX+CBCOLOR],DL ;RESTORE ATTRIBUTE MOV SI,[BP-6] ;LINE BUFFER CALL FREBUF ;FREE IT POP DI POP SI POP DX POP CX POP AX EXITF ;-------------------------------------------------------------------- ;SET KEYBOARD FOCUS TO ELDEST ACTIVE LOCAL WINDOW - COM0 IF NONE ;-------------------------------------------------------------------- WINFOC: FRAME PUSH CX PUSH SI PUSH DI MOV SI,OFFSET WINCTL ;WINDOW CONTROL TABLE MOV CX,ES:[SI] ;NUMBER OF ACTIVE WINDOWS JCXZ WINF20 ;NO WINDOWS OPEN WINF10: ADD SI,2 ;NEXT WINDOW MOV DI,ES:[SI] ;OWNING TCB TEST WORD PTR [DI+CBMDM],MDMKBD ;LOCAL TASK? JNZ WINF30 ;YES - SET FOCUS HERE LOOP WINF10 ;CHECK NEXT WINDOW WINF20: MOV DI,DS:TSKCNT+2 ;COM0 TASK WINF30: MOV KBDTSK,DI ;SET KEYBOARD FOCUS POP DI POP SI POP CX EXITF ;-------------------------------------------------------------------- ;DETERMINE PROPERTIES OF UNSPECIFIED MODEM ; BP-2 RETRY COUNT ;------------------------------------------------------------------- IMODEM: PUSH BP ;SAVE CALLER'S FRAME MOV BP,SP ;ESTABLISH LOCAL FRAME SUB SP,2 ;ALLOCATE LOCAL STORAGE IMOD00: MOV WORD PTR [BP-2],5 ;RETRY COUNT CALL RESMDM ;RESET MODEM CALL STM8B ;SET 8 BIT NO PARITY CALL ST1200 ;SET 1200 BAUD TEST WORD PTR [BX+CBMDM],MDMNULL JZ IMOD10 ;NOT NULL MODEM OR WORD PTR [BX+CBMDM],MDM96 ;DEFAULT TO 9600 JMP IMOD90 IMOD10: DEC WORD PTR [BP-2] ;RETRY COUNT JNS IMOD12 ;NO PROBLEM JMP IMOD00 ;RESET AND TRY AGAIN IMOD12: CALL CLRIBF ;FLUSH BUFFER MOV AX,149 ;COMMON INITIALIZATION STRING CALL WMSGNO ;SEND TO MODEM CALL HAYIN ;GET RESPONSE JC IMOD10 ;TIME OUT - TRY AGAIN CMP WORD PTR [SI-2],1 ;NUMERIC RESPONSE? JNZ IMOD10 ;NO - TRY AGAIN MOV AX,151 ;ASK MODEM WHO HE IS CALL WMSGNO ;SEND TO MODEM CALL HAYIN ;GET RESPONSE CMP AL,4 ;ERROR? JNZ IMOD20 ;NO PROBLEM OR WORD PTR [BX+CBMDM],MDM03 ;SET 300 BAUD JMP SHORT IMOD90 IMOD20: CMP AX,960 ;9600 BAUD JB IMOD30 ;NO OR WORD PTR [BX+CBMDM],MDM96 ;SET 9600 BAUD JMP SHORT IMOD50 IMOD30: CMP AL,240 ;2400? JB IMOD40 ;NO OR WORD PTR [BX+CBMDM],MDM24 ;SET 2400 JMP SHORT IMOD50 IMOD40: CMP AL,120 ;1200? JB IMOD10 ;NOT VALID OR WORD PTR [BX+CBMDM],MDM12 ;SET 1200 IMOD50: CALL HAYIN ;GET OK RESPONSE IMOD90: MOV SP,BP ;FREE LOCAL STORAGE POP BP ;RESTORE CALLER'S FRAME RET ;--------------------------------------------------------------------- ; LOG DISCONNECTION REASON CODE FROM MODEM ;--------------------------------------------------------------------- LOGS86: CALL CLRIBF ;CLEAR INPUT BUFFER CALL CLROBF ;CLEAR OUTPUT BUFFER AND WORD PTR [BX+CBFLG],NOT SFLC ;ALLOW OUTPUT MOV AX,427 ;AT S86? CALL WMSGNO ;QUERY MODEM CALL HAYIN ;GET RESPONSE JC LOG86X ;NO RESPONSE CMP AX,15 ;VALID? JBE LOG86A ;YES MOV AX,1 ;FORCE UNDOCUMENTED CODE LOG86A: SHL AX,1 ;INDEX INTO TABLE MOV DI,AX ;NEED INDEX REG CALL ILINEB ;INITIALIZE BUFFER MOV AX,HAYS86[DI] ;GET MSG NUMBER CALL MOVMSG ;MOVE TO BUFFER CALL LOGDSK ;LOG LOG86X: RET ;--------------------------------------------------------------------- ;COMPLETE NORMAL SHUTDOWN IF NO SESSION ACTIVE ;--------------------------------------------------------------------- NSHUT: CMP SHUTFLG,0 ;DEFERRED SHUTDOWN REQUEST? JZ NSHU90 ;NO - EXIT PUSH SI PUSH DI PUSH CX MOV SI,OFFSET TSKCNT+2 ;1ST TCB POINTER MOV CX,DS:TSKCNT ;# OF ACTIVE TASKS NSHU10: MOV DI,[SI] ;TCB ADDRESS TEST BYTE PTR [DI+CBMSR],MSRCD ;CARRIER ON? JNZ NSHU20 ;YES - EXIT ADD SI,2 ;NEXT TCB LOOP NSHU10 ;GO CHECK IT XOR CX,CX ;SET ZERO FLAG NSHU20: POP CX POP DI POP SI JNZ NSHU90 ;SESSION STILL ACTIVE NSHU80: MOV RETCODE,4 ;ERROR LEVEL MOV ABORT,255 ;INITIATE SHUTDOWN NSHU90: CLC RET CSEG ENDS END