CP/M MACRO ASSEM 2.0 #001 BYE V7.9 AS OF 04/12/82 TITLE 'BYE V7.9 AS OF 04/12/82' ; PAGE 44 ; ; BYE V7.9 (REVISED 04/12/82) ; REMOTE CONSOLE PROGRAM FOR CP/M AND MODEM ; ;THIS PROGRAM ALLOWS MODEM CALLERS TO USE YOUR CP/M SYSTEM ;JUST AS IF THEY WERE SEATED AT THE SYSTEM CONSOLE. SPECIAL ;ASSEMBLY-TIME OPTIONS ALLOW LIMITING THE CALLER'S ACCESS BY ;PASSWORD AND/OR ACCESS TO ONLY A MESSAGE-SERVICE PROGRAM. ; ;BASED ON AN ORIGINAL PROGRAM WRITTEN BY DAVE JAFFE, JANUARY 1979 ;REWRITTEN FOR PMMI MODEM BY WARD CHRISTENSEN, FEBRUARY 1979. ;THIS PROGRAM NOW SUPPORTS DC HAYES, PMMI, AND EXTERNAL MODEMS. ;CCS CARD AND SMARTMODEM CODE ADDED BY PAUL TRAINA, MARCH, 1982. ; (BASICALLY, ADDED 6850 MEMORY MAPPED ACIA -- SLOT 2). ;THE UARTS SUPPORTED ARE THE INTEL 8251 AND THE WESTERN DIGITAL 8250. ;BE SURE TO SET THE EQUATES FOR THE MODEM YOU ARE USING. ; ;************************************************************************* ;DANGER: PAY CLOSE ATTENTION TO THE POLARITY OF THE JUMP INSTRUCTIONS * ;AFTER ANY IN FROM A UART WHEN RUNNING UNDER 8250/8251'S, I HAVE TRIED * ;TO FIX THEM FOR THE MOST COMMON LOGICAL SETUP, BUT YOUR SYSTEM MAY * ;DIFFER. * ;************************************************************************* ; ;THANKS TO BILL PRECHT FOR THE "LABEL + OFFSET" IDEA ALLOWING ;THIS PROGRAM TO RELOCATE ITSELF WITHOUT USING DDT TO INITIALLY ;SET IT UP. ; ;MODIFICATIONS/FIXES: (IN REVERSE ORDER TO MINIMIZE READING TIME) ; ;03/25/82 IMPROVED CARRIER CHECK HANDLING FOR DCHAYES. ; FIXED A BUG IN CONDITIONAL ASSEMBLY FOR RINGBACK (PROBLEM IN ; BYE77 AND ALSO BYE78). ; CHANGED FASTCLK CONDITIONAL TO A SPEED EQUATE (FOR 6 & 8 MHZ CPUS) ; FINALLY FIXED THE BUG IN LF PARSING FOR OXGATE ; ->CODE ADDED FOR DCHAYES MM][ <- NOT TESTED ; +>CODE ADDED FOR DCHAYES SMODEM <- NOT TESTED ; ----> I WON'T VOUCH FOR THIS CODE, I DON'T HAVE THESE MODEMS, ; `-> SO PLEASE LET ME KNOW IF IT IS SICK. ; -- PAUL S TRAINA ; ;02/03/82 FIXED THE BUGGY CONDITIONAL JUMPS IN/AFTER RINGWT. ; NOW THERE IS CONDITIONAL ASSEMBLY DEPENDING ON IF YOU ARE ; A WD8250/IN8251 OR A "STANDARD" SYSTEM. ; FIXED A FEW BUGS IN CONDITIONAL ASSEMBLY. ; IMPROVED LF CODE. -- PAUL S TRAINA ; ;01/20/82 ADD EQUATES AND ROUTINES FOR HEATH OR IMS SYSTEMS AND ANY ; OTHER SYSTEMS USING EXTERNAL MODEMS AND THE WD8250 UART. ; INCLUDED ASSEMBLY OPTION FOR COMPATABILITY WITH RBBS, ; MINICBBS, AND OXGATE IMPLIMENTATIONS. BY THOM QUICK ; ;01/09/82 ADDED WRTLOC FLAG FOR USE WITH AN RBBS PROGRAM THAT SETS ; THIS FLAG DURING DISK WRITES; AVOIDS FILES OUT OF SYNCH CP/M MACRO ASSEM 2.0 #002 BYE V7.9 AS OF 04/12/82 ; PROBLEM IF CALLER HANGS UP DURING WRITES. ADDED MINICK ; ROUTINES WHICH DO THE SAME WITH MINICBBS. ADDED PATCH ; TO ALLOW BYE TO RUN BELOW THE CCP WITH PROGRAMS SUCH AS ; TYPESQ. SEPARATED SUPERB CONDITIONAL ASSEMBLY INTO EXTERNL ; AND LOSER, THIS SEPARATES EXTERNAL MODEM OPERATION FROM A ; LOSING FEATURE OF A PARTICULAR BIOS. (P. L. KELLEY) ; ;12/03/81 IMPLEMENTED OXGATE PROTOCOL, FIXED SOME BUGS IN CONDITIONAL ; EQUATES. VARIABLES FOR UCLSW AND NULLS MOVED UP SO THAT ; PROGRAMS CAN POKE THEM TOO. -- PAUL S TRAINA ; ;12/02/81 MAKE VARIABLES FOR MAXDRV, MAXUSR, AND TOVALUE THAT ; CAN BE FOUND VIA THE WARM BOOT BIOS VECTOR AT ZERO, ; SO THAT THESE VALUES CAN BE CHANGED WHILE BYE IS ; RUNNING TO ACCOMODATE PRIVILEGED USERS, EITHER THROUGH ; ACTION OF THE BYE-RUN .COM FILE OR SOME OTHER PASSWORD ; PROGRAM RUN LATER. MOVE MCBOOT AND THE USRLOG VECTOR ; TO JUST AFTER THE START VECTOR, FOR EASIER ACCESS ; IF DESIRED. ; ;11/04/81 PRINT OUT BYE VERSION NUMBER IN PRNLOG, TO ALLOW ; PROGRAM TO BE IDENTIFIED EASILY WHEN RUNNING. CALL ; USRCHK IN ALL CASES TO PRINT OUT VERSION NUMBER ON ; LOCAL CTRL-C, THEN ASK TO RESUME BYE INSTEAD OF ; WARM BOOT. CONVERT MANY MSGS TO UPPER/LOWER CASE. ; BY STEVE BOGOLUB ; ;10/24/81 MODIFIED NOPASS SO THAT COM FILES THAT LOOK FOR ; A SECOND FILE ON THE COMMAND LINE (SUCH AS HELP18) ; WILL FIND A 20H AT FCB+1 FOR DEFAULT PURPOSES. ALSO ; ADDED RUNCOM AT THE END OF NOPASS AND CHANGED THE ; JUMPS TO THE TPA (100H) TO A CALL SO THAT A COM FILE ; WILL RETURN TO BYE WHERE A CLEAN JUMP TO WARM BOOT ; CAN BE DONE INSTEAD OF GOING OFF TO NEVER-NEVER LAND. ; R. L. PLOUFFE ; ;10/11/81 PRINT PASSWORD ON LOCAL CONSOLE WITH DUAL$IO. ALLOW ; RETURN FROM PRNLOG WITH USRLOG. MAKE INSTEAD ; OF IN USRLOG REPORTS. PRINT OUT BYE VERSION ; NUMBER FOR EASY IDENTIFICATION. POSITION PRNLOG AFTER ; COLD BOOT ROUTINE, AND CHANGE COLD BOOT ROUTINE TO ; JUMP TO MBOOT, THEREBY DEFINING PATH TO PRNLOG FOR ; ALL BYE PROGRAMS AND ALLOWING ONE TRIVIAL PROGRAM ; THAT CAN BE RUN TO GET THE BYE LOG. MAKE COUNTERS ; 16 BITS FOR GREATER RANGE. BY STEVE BOGOLUB ; ;10/01/81 ADDED CALL CHECK TO MSTAT ROUTINE TO ELIMINATE ; POSSIBILITY OF SYSTEM CRASH WHEN CARRIER LOST WHILE ; PERFORMING REPEATED CONSOLE STATUS CHECKS WITHOUT ; ANY CONSOLE OUTPUT. THIS PROBLEM OCCURS DURING THE ; PASSWORD INPUT OF USERPW.ASM, AND POTENTIALLY ANY OTHER ; PROGRAM THAT DOES REPEATED DIRECT CONSOLE INPUT, SUCH ; AS MBASIC, ETC. ; BY RON FOWLER AND DAVE HARDY ; ;05/14/81 ADDED CCS DISK SUPPORT (TO TURN OFF DISKS WHEN IDLE) CP/M MACRO ASSEM 2.0 #003 BYE V7.9 AS OF 04/12/82 ; ADDED SUPPORT FOR GODBOUT SS1 REAL TIME CLOCK. ; ADDED PHONE TO LISTER, PUNCH & READER PATCH. (AAJ) ; ;03/20/81 FIXED MOUTPUT SO PARITY BIT IS STRIPPED BEFORE OUTPUTTING ; CHARACTER TO MODEM. CORRECTED 3/18/81 NULL FIX. ADDED ; ADDITIONAL DESCRIPTION TO HEADING OF THIS FILE. (KBP) ; ;03/18/81 ADD FIRST-RING DEBOUNCE ROUTINE, CHANGE PMMI HANGUP ; TO DO BREAK FOR FASTER DISCONNECT, FIX ERROR IN P3TODTR ; EQUATE FOR PMMI, ADDED END-OF-PROGRAM ERROR MESSAGE TO ; MARK ENDING ADDRESS (SEE NOTE AT LABEL DEST). BY KBP. ; FIX BUG THAT PREVENTED NULLS AT END OF LINE IF DUAL$IO ; WAS TRUE. BY HANK SZYSZKA. ; ;02/23/81 CONDITIONAL ASSEMBLY ADDED FOR INTERTEC SUPERBRAIN ; WITH RACAL-VADIC 3451 MODEM. CORRECTED LACK OF RET IN ; CONIN. IN MOUTPUT, REPLACED CZ CHECK WITH JNZ SILENT, ; CALL CHECK; THIS ELIMINATES CHANCE OF LOOPING IN MOUTPUT ; IF MODEM DOESN'T EMPTY USART AFTER CARRIER LOST. ; ALSO HAD TO WRITE A ROUTINE TO PATCH BIOS SO THAT AFTER ; THE WARM BOOT DISK READ THIS PROGRAM REPATCHES THE BIOS. ; APPARENTLY THE SUPERBRAIN WARM BOOT OVERWRITES A PORTION ; OF THE BIOS. BY P.L. KELLEY ; ;02/17/81 ADDED CHECK FOR EXTRANEOUS CONTROL CHARACTERS IN ; HARDCOPY LOG. (FORMFEED SEEMS TO BE A COMMON "HIT"). ; CHANGED LOCAL STARTUP TEST TO DIRECTLY TEST FOR CARRIER ; INSTEAD OF CALLING CARCK, TO AVOID 15 SECOND DELAY. ; ; ;02/15/81 REMOVED DEPENDANCE ON DC HAYES HARDWARE TIMER SO THAT ; DCHAYES CONDITIONAL ASSEMBLY IS COMPATIBLE WITH BOTH ; OLD-STYLE 80-103A AND NEW-STYLE MM100 BOARDS. ; REARRANGED PATCH LIST TO "MOST RECENT FIRST" ORDER. ; ADDED MESSAGE FOR INVALID-DRIVE TEST. ; ADDED ANI 7FH TO UPPER CASE CONVERSION TEST SO THAT ; IT'S NOT FOOLED BY BIT 7 BEING SET. ; ADDED WELUSR EQUATE FOR USER # CONTAINING WELCOME FILE. ; REMOVED PTRPORT EQUATE AND CHANGED HARDCOPY LOGIC TO ; WORK THROUGH THE BIOS PRINTER DRIVER. ; ;01/22/81 CHANGED CARRIER DETECT ROUTINE FOR DC HAYES TO WAIT FOR ; 15 SECONDS AFTER LOSS OF CARRIER TO RETURN. ; ;01/17/81 CHANGED TIMING LOOPS TO USE DC HAYES HARDWARE TIMER ; IF PRESENT. ; ;01/16/81 ADDED EQUATES AND CODE FOR THE DC HAYES ; MICROMODEM 100. ; ;09/23/80 FIXED BUGS THAT PREVENTED "BYE /A" AND "BYE /C" FROM ; WORKING PROPERLY. ALSO REPAIRED SEVERAL ERRORS IN ; CONDITIONAL ASSEMBLY NESTING. BY RON FOWLER ; ;09/20/80 MODIFIED STATUS CHECKING DURING RING-WAIT ROUTINE TO ; USE CP/M BDOS CALL, AS SUGGESTED BY KEITH PETERSEN. CP/M MACRO ASSEM 2.0 #004 BYE V7.9 AS OF 04/12/82 ; THIS SHOULD MAKE THE PROGRAM MORE PORTABLE. ALSO ; ADDED BRUCE RATOFF'S UPDATE TO DCHBYE PROGRAM (5.5), ; THAT ALLOWS THE USE OF BYE FROM NON-ZERO USER AREAS. ; BY RON FOWLER ; ;09/19/80 MODIFIED COM FILE LOAD ROUTINE TO PREVENT BDOS ; OVERWRITE IF THE COM FILE WON'T FIT IN THE TPA ; BY RON FOWLER ; ;09/19/80 ADDED NEW '/' OPTION C, WHICH HAS THE SAME AFFECT AS ; /A, EXCEPT THAT /C LOADS THE COM FILE AFTER ANSWERING ; THE PHONE, WHILE /A BOOTS CP/M. BY RON FOWLER ; ;09/19/80 ADDED CONDITIONAL ASSEMBLY TO GIVE THE OPERATOR A ; 'TWIT' LOGOUT KEY. ADDED CONDITIONALS FOR 'MESSAGE ; FROM OPERATOR' AND 'SYSTEM DOWN IN 5 MINUTES' KEYS. ; ADDED FRONT-PANEL SELECTION OF HARD-COPY LOG, REMOTE ; 'BLACK-OUT', AND PASSWORD OPTION. ALSO, IF CPM/2 IS ; USED, A MESSAGE IS PRINTED WHEN AN UNSUPPORTED USER ; AREA IS ENTERED. BY RON FOWLER AND DAVE HARDY ; ;09/19/80 MODIFIED TO PREVENT RE-LOAD OF THE COM FILE WHEN ; A VOICE CALL COMES IN. RESET THE DMA ADDRESS BACK ; TO 80H AFTER THE COM FILE IS LOADED. BY RON FOWLER ; ;09/16/80 ADDED CONDITIONAL ASSEMBLY TO ALLOW AUTOMATIC ; LOADING OF A COM FILE INSTEAD OF CP/M BOOT. ALSO ; ADDED DECIMAL USRLOG COUNTERS AS CONDITIONAL ; ASSEMBLY. BY RON FOWLER ; ;09/15/80 ADDED CONDITIONAL ASSEMBLY FOR AUTOMATIC TIMED ; LOG-OUT, DRIVE AND USER NUMBER MASKING, LOWER ; CASE QUERY AT LOGIN, AND CP/M 2.X. THANKS TO ; BRUCE RATOFF FOR THE ROUTINES (LIFTED FROM HIS ; 'DCHBYE54.ASM') USED TO IMPLEMENT THESE FUNCTIONS ; NOTE: IN ORDER TO IMPLEMENT THE TIMED LOG-OUT, IT ; WAS NECESSARY TO DO TIMING IN SOFTWARE LOOPS. ; THEREFORE, A NEW EQUATE, FASTCLK, HAS BEEN ADDED ; TO ALLOW FOR 4MHZ CLOCK SPEEDS. ALSO ADDED BRUCE ; RATOFF'S OVERRUN/FRAMING ERROR CHECKING WHEN READ- ; ING THE MODEM PORT. BY RON FOWLER ; ;07/16/80 ADDED "/R" COMMAND OPTION TO ALLOW USRLOG ; COUNTERS TO BE RESET UPON ENTRY. BY DAVE HARDY ; ;07/11/80 ADDED CONDITIONAL ASSEMBLY FOR PASSWORD AND ; USER LOG ROUTINES, AND ROUTINES TO PRINT USRLOG ; INFORMATION ON CONSOLE AFTER PROGRAM EXIT. ; BY DAVE HARDY ; ;07/10/80 ADDED CODE TO ALLOW AUTO-ANSWER AFTER FIRST ; OR SECOND RING FOR MORE RELIABLE AUTO-ANSWER ; WHEN USING "RINGBACK" OPTION. BY DAVE HARDY ; ;06/29/80 ADDED USRLOG ROUTINES TO KEEP TRACK OF NUMBER ; OF CALLERS, AND DISPLAY ON FRONT PANEL CP/M MACRO ASSEM 2.0 #005 BYE V7.9 AS OF 04/12/82 ; OF IMSAI (I.E. OUTPUT NUMBER TO PORT FFH). ; BY DAVE HARDY ; ;06/11/80 ADDED ROUTINES TO ALLOW CONDITIONAL ASSEMBLY FOR ; MORROW'S DISCUS 2D BOARD (ALL REV'S) WITH MEMORY ; MAPPED I/O. ADDED 710 BAUD RATE SELECTION OPTION ; AT SIGN-ON. BY DAVE HARDY AND BRUCE LEVISON. ; ;01/24/80 ADDED ROUTINES TO PRESERVE REGISTERS WHEN CALLING ; THE USER'S CBIOS. ADDED CONDITIONAL ASSEMBLY FOR ; CALLBACK FEATURE. INCREASED STACK SPACE TO 60. ; BY KEITH PETERSEN. ; ;09/24/79 ADDED ROUTINES TO ALLOW AUTOMATIC MULTIPLE BAUD ; RATE SELECTION, EXIT TO CP/M FROM LOCAL CONSOLE, ; ECHO NR. OF NULLS SELECTED. BY KEITH PETERSEN, ; WITH THANKS TO BOB MATHIAS FOR SUGGESTIONS. ; ;05/06/79 ADDED ROUTINE TO ALLOW "CALLBACK" OPERATION SO MODEM ; DOES NOT ANSWER NORMAL VOICE CALLS. BY ROBBIN HOUGH ; AND KEITH PETERSEN, W8SDZ. ; ;------------------------------------------------ ; ;THIS PROGRAM RUNS UP IN HIGH RAM. IT GETS THERE ;BY BEING MOVED THERE WHEN 'BYE' IS TYPED. ; ;THE PROGRAM IN HIGH RAM DOES THE FOLLOWING: ; ; 1. HANGS UP THE PHONE ; 2. AWAITS RING DETECT, ALLOWS EXIT ; TO CP/M IF LOCAL KBD TYPES CTL-C ; 3. OUTPUTS CARRIER (SEE CALLBACK ROUTINES) ; 4. AWAITS INCOMING CARRIER GOING TO STEP 1 ; IF NONE FOUND IN 15 SECONDS ; 5. ASKS NUMBER OF NULLS (0-9) ; 6. TYPES THE FILE "WELCOME" FROM ; DISK, ALLOWING CTL-C TO SKIP IT ; 7. ASKS FOR A PASSWORD, ALLOWING ; 5 TRIES TO GET IT RIGHT. ; 8. WHEN PASSWORD ENTERED, IF USED, ; DROPS INTO CP/M. ; 9. CALLER CAN LEAVE BY HANGING UP, ; (ANY TIME CARRIER IS LOST, IT ; WAITS 15 SECONDS, THEN GOES ; BACK TO STEP 1), OR THE CALLER ; MAY TYPE THE PROGRAM NAME (BYE) ; ;------------------------------------------------ ; ;SYSTEM EQUATES ; 0000 = FALSE EQU 0 FFFF = TRUE EQU NOT FALSE ; 000D = CR EQU 0DH CP/M MACRO ASSEM 2.0 #006 BYE V7.9 AS OF 04/12/82 000A = LF EQU 0AH 04B0 = MINUTES EQU 20*60 ;CONSTANT FOR 1 MIN TIME DELAY ; ;CHANGE THE FOLLOWING EQUATE TO AN AREA IN YOUR ;HIGH MEMORY WHERE THIS PROGRAM MAY PATCH ITSELF IN. ;APPROXIMATE MEMORY REQUIREMENTS: 2K BYTES OR MORE, ;DEPENDING UPON THE OPTIONS SELECTED. A MARKER HAS ;BEEN PLACED AT THE END TO DELIBERATELY PRINT AN ERROR ;MESSAGE DURING ASSEMBLY IN ORDER TO DETERMINE THE ACTUAL ;ENDING ADDRESS OF THE PROGRAM. THE ERROR MESSAGE WILL ;NOT AFFECT THE ASSEMBLY. MAKE SURE YOU HAVE MEMORY ;AVAILABLE UP TO THE ADDRESS SHOWN. ; B500 = DEST0 EQU 0B500H ;RUNNING LOCATION OF CODE ; ;CHANGE THE FOLLOWING TO SPECIFY EITHER DCHAYES, PMMI OR SYSTEMS ;WITH EXTERNAL MODEMS. BE SURE TO CHANGE EITHER TPORT FOR PMMI OR ;DATA FOR DCHAYES IF THEY ARE NOT AT THE STANDARD LOCATIONS. ; FFFF = DCHAYES EQU TRUE ;TRUE FOR DC HAYES MODEM 0000 = PMMI EQU FALSE ;TRUE FOR PMMI MODEM 0000 = MMII EQU FALSE ;APPLE MICROMODEM II 0000 = SMODEM EQU FALSE ;DCHAYES SMARTMODEM 0000 = IN8251 EQU FALSE ;TRUE FOR EXTERNAL AND INTEL 8251 0000 = WD8250 EQU FALSE ;TRUE FOR EXTERNAL AND WESTERN DIGITAL 8250 FFFF = PORTED EQU TRUE ;TRUE USE PORTS, FALSE USE MEMORY MAP (APPLE=FALSE) ; ;IF USING A SMARTMODEM THEN NORING SHOULD BE SET TRUE ; ; ;CHANGE THE FOLLOWING IF YOU HAVE A DC HAYES MODEM THAT IS ;NOT BASED AT 80H. ALL OTHER PORT EQUATES ARE BASED ON THIS. ; IF DCHAYES 0080 = DATA EQU 80H ;DC HAYES DATA PORT ENDIF ;DCHAYES ; ;CHANGE THE FOLLOWING IF YOU HAVE A DC HAYES MICROMODEM II THAT ;IS NOT IN SLOT 2. ALL OTHER PORT EQUATES ARE BASED ON THIS. ; IF MMII TPORT EQU 0E0A6H ;MMII CONTROL PORT ENDIF ;MMII ; ;CHANGE THE FOLLOWING IF YOU HAVE A DCHAYES SMARTMODEM THAT ;IS NOT IN SLOT ???. ALL OTHER PORT EQUATES ARE BASED ON THIS. ; IF SMODEM AND NOT PORTED DPORT EQU 0E0A0H ;? WHAT SHOULD THIS BE? (DATA) ENDIF ; ;CHANGE THE FOLLOWING IF YOU HAVE A DCHAYES SMARTMODEM THAT ;IS NOT HOOKED UP TO A COMPUPRO SERIAL PORT LOCATED AT 02H ; IF SMODEM AND PORTED DPORT EQU 02H ;BASE PORT (DATA) CP/M MACRO ASSEM 2.0 #007 BYE V7.9 AS OF 04/12/82 ENDIF ; ;CHANGE THE FOLLOWING IF YOU HAVE A PMMI MODEM THAT IS NOT ;BASED AT 0C0H. ALL OTHER PORT EQUATES ARE BASED ON THIS. ; IF PMMI TPORT EQU 0C0H ;UART CONTROL/STATUS PORT ENDIF ; IF WD8250 BASE$PORT EQU 20H ENDIF ; ;YOU WILL LIKELY ALSO WANT TO CHANGE THE PASSWORD, ;LOCATED BELOW AT LABEL 'PASSWD', AND THE MESSAGES ;PRINTED AT LABEL 'WELCOME' AND JUST ABOVE LABEL ;'HANGUP'. THE NAMES OF THE WELCOME AND COM FILES ;ARE AT LABLES 'WELFIN' AND 'COMFCB' RESPECTIVELY. ; ;**************************************************** ;* OPTION CONFIGURATION SECTION * ;**************************************************** ; ;-----------------GENERAL OPTIONS------------------ ; FFFF = OXGATE EQU TRUE ;WANT TO RUN AN OXGATE NODE? FFFF = PRINTER EQU TRUE ;WANT TO RETAIN LIST DEVICE? FFFF = DUAL$IO EQU TRUE ;WANT CONSOLE & MODEM? 0000 = CALLBAK EQU FALSE ;WANT CALLBACK FEATURE? 0000 = PWRQD EQU FALSE ;WANT TO USE PASSWORD? 0000 = BOOTMSG EQU FALSE ;TRUE IF BOOT MESSAGE FFFF = FKEYS EQU TRUE ;WANT SPECIAL FUNCTION KEYS FFFF = USRLOG EQU TRUE ;WANT TO COUNT NUMBER OF USERS? 0000 = HARDLOG EQU FALSE ;WANT TO ECHO REMOTE KBD TO PRINTER? FFFF = TIMEOUT EQU TRUE ;WANT AUTO LOG-OFF FOR SLEEPY CALLERS? 0005 = TOVALUE EQU 5 ;MINUTES TO AUTO LOGOFF 0000 = COMFILE EQU FALSE ;WANT TO AUTOBOOT A COM FILE? FFFF = DECIMAL EQU TRUE ;WANT DECIMAL VALUES FOR LOGS? FFFF = TRAPLC EQU TRUE ;WANT TO TRAP LOWER CASE? 0000 = ALLDEV EQU FALSE ;RETAIN PUNCH, READER, LISTER 0000 = MINICK EQU FALSE ;TRUE IF MINICBBS 0000 = RBBSCK EQU FALSE ;TRUE IF RBBS SETS/RESETS FLAG AT 'WRTLOC' 0003 = IOBYTE EQU 0003 ;LOCATION OF INTEL IOBYTE 0000 = IOVAL EQU 0 ;INITIAL VALUE TO STORE IN IOBYTE ; ;----------SYSTEM AND HARDWARE DEPENDENT OPTIONS-------------- ; 0000 = ZCPRT EQU FALSE ;TRUE IF RUNNING NEWZCPR (IN SECURE MODE) 003E = WHEEL EQU 003EH ;LOCATION OF NZCPR'S WHEEL FLAG FFFF = BYELOW EQU TRUE ;TRUE IF BYE BELOW CCP 0000 = LOSER EQU FALSE ;TRUE IF WARM BOOT OVERWRITE PART OF THE BIOS 0000 = NORING EQU FALSE ;UART RING INDICATOR NOT AVAILABLE FFFF = CPM2 EQU TRUE ;USING CP/M 2.X? 000F = MAXUSR EQU 15 ;SET TO 0 FOR CP/M 1.4 000E = WELUSR EQU 14 ;USER # OF WELCOME FILE, CPM2 TRUE 000E = COMUSR EQU 14 ;USER # OF COM FILE, CPM2 TRUE CP/M MACRO ASSEM 2.0 #008 BYE V7.9 AS OF 04/12/82 0004 = SPEED EQU 4 ;PROCESSOR SPEED IN MHZ 0002 = MAXDRV EQU 2 ;HIGHEST DRIVE SUPPORTED 0000 = IMSAI EQU FALSE ;ADDS VARIOUS OPTIONS W/SENSE SW'S 000E = TWITKEY EQU 'N'-40H ;KEYCODE TO LOG-OUT A CREEP 0011 = MSGKEY EQU 'Q'-40H ;KEYCODE TO PRINT 'MESG FROM OPER:' 000F = SYSDKEY EQU 'O'-40H ;KEYCODE TO PRINT SYS DOWN MSG 00FF = SENSE EQU 0FFH ;SENSE SWITCH PORT NUMBER IMSAI TRUE 0000 = BLKOUT EQU FALSE ;SWITCH TO TURN OFF REMOTE SEND IMSAI TRUE 0000 = SELPASS EQU FALSE ;SWITCH TO REQUIRE A PASSWORD IMSAI TRUE 0000 = CCSDISK EQU FALSE ;SET TRUE IF CCS DISK CONTROLLER 0000 = RTC EQU FALSE ;SET TRUE IF GODBOUT SS1 BOARD ; IF CCSDISK ; DISKON EQU 071H ;MOTORS ON, SELECT DISK A DISK EQU 34H ;DISK CONTROL PORT DISKOFF EQU 051H ;MOTORS OFF, SELECT DISK A; ENDIF ;CCSDISK ; ;ASSIGNMENT OF FRONT-PANEL OPTIONS TO SWITCHES: ; 0001 = LOGSW EQU 01H ;TURN ON FOR HARDCOPY 0002 = PWDSW EQU 02H ;TURN ON FOR 'PASSWORD' MODE 0004 = BLACKSW EQU 04H ;TURN ON TO BLACK OUT REMOTE END 0008 = ENABLF EQU 08H ;TURN ON TO ENABLE SPL FUNC KEYS ; IF BYELOW B503 = DEST EQU DEST0+3 ;KEEP ON TARGET ; ;****WARNING *** WMLOC AND OLDBD ARE SYSTEM DEPENDENT**** ;WMLOC CAN BE FOUND IN THE BIOS BY TRACING THROUGH THE ;WARM BOOT ROUTINE WITH DDT UNTIL YOU FIND: ; LXI H,OLDBD ; SHLD 0006 ;WMLOC IS THE ADDRESS CONTAINING THE LSB OF OLDBD ; D3CF = WMLOC EQU 0D3CFH C506 = OLDBD EQU 0C506H ; ENDIF ;BYELOW ; IF NOT BYELOW DEST EQU DEST0 ENDIF ;NOT BYELOW ; ;THERE ARE SOME CASES WHERE WARM BOOT OVERWRITES THE ;INITIAL BIOS JUMP TABLE. THIS PROBLEM WAS SOLVED FOR ;THE SUPERBRAIN 3.0 BIOS BY FINDING A WARMBOOT CALL ;TO HIGH IN THE BIOS. THIS CALL IS THEN PATCHED BY ;BYE. THE FORM OF THE CALL IS: ; WBCALL CALL WMSTRT ; IF LOSER ; WBCALL EQU 0DE48H ;CHECK THIS IN YOUR BIOS ; CP/M MACRO ASSEM 2.0 #009 BYE V7.9 AS OF 04/12/82 ;THE FOLLOWING LOCATION IS CALLED ; WMSTRT EQU 0EE48H ;CHECK THIS IN YOUR BIOS ; ENDIF ;LOSER ; ;**************************************************** ;* END OF OPTION CONFIGURATION SECTION * ;**************************************************** ; ;ALL MODEM I/O AND CONTROL ARE HERE ; ; ;************ D.C. HAYES MODEM I/O AREA ************ ; IF DCHAYES ; ;THE DCHAYES HAS AN ANNOYING TENDANCY TO THINK THAT THE PHONE COMPANY'S ;OFF-HOOK TONE SETS OFF THE MODEM, SO WE HAVE TO HACK UP SPECIAL TIMEOUT ;EQUATES. 0008 = CWAIT EQU 8 ;SECONDS TO WAIT FOR INITIAL CARRIER 0005 = CLOSS EQU 5 ;SECONDS TO WAIT IF WE LOOSE CARRIER ; ;PORT EQUATES ; 0080 = DPORT EQU DATA ;DATA PORT 0081 = STATUS EQU DATA+1 0081 = RPORT EQU STATUS ;MODEM STATUS PORT 0081 = CR1 EQU DATA+1 0082 = CR2 EQU DATA+2 0083 = CR3 EQU DATA+3 ; ;BIT FUNCTIONS ; ; STATUS REGISTER ; 0001 = RRF EQU 1 ;RECEIVE REGISTER FULL 0002 = TRE EQU 2 ;TRANSMITTER HOLDING REGISTER EMPTY 0004 = PE EQU 4 ;PARITY ERROR 0008 = FE EQU 8 ;FRAMING ERROR 0010 = OE EQU 10H ;OVERRUN ERROR 0020 = TMR EQU 20H ;TIMER STATUS (MM100 ONLY) 0040 = CD EQU 40H ;CARRIER PRESENT 0080 = RI EQU 80H ;NOT RING INDICATOR (LOW TRUE) 0080 = P2RDET EQU RI ;SAME AS ABOVE ; ; CONTROL REGISTER 1 (CR1) ; 0001 = EPE EQU 1 ;EVEN PARITY ENABLE 0002 = LS1 EQU 2 ;WORD LENGTH SELECT BIT 1 0004 = LS2 EQU 4 ;WORD LENGTH SELECT BIT 2 0008 = SBS EQU 8 ;STOP BITS 0010 = PI EQU 10H ;PARITY INHIBIT 0020 = TMIE EQU 20H ;TIMER INTERRUPTS ENABLE (MM100 ONLY) ; ; CONTROL REGISTER 2 (CR2) CP/M MACRO ASSEM 2.0 #010 BYE V7.9 AS OF 04/12/82 ; 0001 = BRS EQU 1 ;BAUD RATE CONTROL 0002 = TXE EQU 2 ;TRANSMIT CARRIER ENABLE 0004 = MS EQU 4 ;MODE (0=ANSWER 1=ORIGINATE) 0008 = BRK EQU 8 ;SEND BREAK 0010 = ST EQU 10H ;SELF TEST 0020 = TIE EQU 20H ;TRANSMITTER INTERRUPT ENABLE 0040 = RIE EQU 40H ;RECEIVER INTERRUPT ENABLE (MM100 ONLY) 0080 = OH EQU 80H ;OFF-HOOK ; ENDIF ;DCHAYES ; ;************ DCHAYES MM ][ CODE ************** ; IF MMII ; ;MMII MODEM ADDRESS EQUATES ; TPORT EQU TPORT ;CONTROL/STATUS PORT DPORT EQU TPORT+1 ;DATA PORT RPORT EQU TPORT-1 ;BAUD RATE/MODEM STATUS PORT CPORT EQU TPORT-1 ;MODEM CONTROL RPORT1 EQU TPORT ;STATUS ; ;SWITCH HOOK AND MODEM COMMANDS, OUTPUT TO TPORT ; P0BYE EQU 0 ;ON HOOK OR DIALING BREAK P0ORIG EQU 8EH ;OFF HOOK ORIGINATE P0ANSW EQU 8AH ;ANSWER PHONE P0TSB EQU 8 ;2 STOP BITS P0EI EQU 20H ;ENABLE INTERRUPTS P0NORM EQU 15H ;8 BITS, NO PARITY P0110 EQU 11H ;SAME W/2 STOP BITS ; ;MODEM STATUS INPUT FROM RPORT ; P2RDET EQU 80H ;RING DETECT P2CTS EQU 4 ;CLEAR TO SEND ; ;MMII MODEM STATUS MASKS ; P0TBMT EQU 2 ;XMIT BUFFER EMPTY P0DAV EQU 1 ;DATA AVAILABLE P0RPE EQU 40H ;PARITY ERROR P0ORUN EQU 20H ;OVERRUN P0FERR EQU 10H ;FRAMING ERROR ; ;BAUD RATE DIVISORS ; B110 EQU 0 ;110 BAUD B300 EQU 1 ;300 BAUD ; ENDIF ;MMII ; ; ;DCHAYES SMARTMODEM DATA AREA CP/M MACRO ASSEM 2.0 #011 BYE V7.9 AS OF 04/12/82 ; IF SMODEM MSPORT EQU DPORT+1 ;MODEM STATUS PORT RPORT EQU MSPORT ; RING PORT P2RDET EQU 40H ; RING DETECT VALUE ; P2CTS EQU 08H ;CLEAR TO SEND BIT P0TBMT EQU 01H ;TRANSMIT BUFFER EMPTY P0DAV EQU 02H ;CHARACTER AVAILABLE ENDIF ; ; ;************ PMMI MODEM I/O AREA ************ ; IF PMMI ; ;PMMI MODEM PORT EQUATES (TPORT PREVIOUSLY DONE) ; DPORT EQU TPORT+1 ;DATA PORT RPORT EQUTTOVT/2$;RATE GEN/MODEM STATUS CPORT EQU TPORT+3 ;MODEM CONTROL ; ;SWITCH HOOK AND MODEM COMMANDS, OUTPUT TO TPORT (PORT 0) ; P0BYE EQU 0 ;ON HOOK, OR DIALING BREAK P0ORIG EQU 1 ;OFF HOOK, ORIG. P0ANSW EQU 2 ;ANSWER PHONE P08BIT EQU 0CH ;8 DATA BITS P0NOPY EQU 10H ;NO PARITY P0EPS EQU 20H ;EVEN PARITY SELECT P0TSB EQU 40H ;2 STOP BITS P0EI EQU 80H ;ENABLE INTERRUPTS P0NORM EQU P08BIT+P0NOPY ;NORMAL 8 BITS, NO PARITY P0110 EQU P08BIT+P0NOPY+P0TSB ;SAME W/2 STOP BITS ; ;MODEM STATUS, INPUT ON RPORT (PORT 3) ; P2DTD EQU 1 ;DIAL TONE DETECT P2RDET EQU 2 ;RING DETECT P2CTS EQU 4 ;CTS (CARRIER DETECT) P2RXBRK EQU 8 ;RECEIVE BREAK P2CONN EQU 10H ;CONNECTED? (0=YES, 1=MODEM CHIP HUNG UP) P2TMPUL EQU 80H ;TIMER PULSES (40% UP CYCLE) ; ;TIMER RATE SELECTION ; TRATE EQU 250 ;VALUE FOR .1 SEC ; ;PMMI MODEM STATUS MASKS ; P0TBMT EQU 1 ;XMIT BUFF EMPTY P0DAV EQU 2 ;DATA AVAILABLE P0TEOC EQU 4 ;TEST END OF CHAVP0RPE EQU 8 ;REC'D PARITY ERR P0ORUN EQU 10H ;OVERRUN P0FERR EQU 20H ;FRAMING ERROR ; CP/M MACRO ASSEM 2.0 #012 BYE V7.9 AS OF 04/12/82 ;BAUD RATE DIVISORS ; B110 EQU 142 ;110 BAUD B300 EQU 52 ;300 BAUD B450 EQU 35 ;450 BAUD B600 EQU 26 ;600 BAUD B710 EQU 22 ;710 BAUD ; ENDIF ;PMMI ; ;************ EXTERNAL MODEM I/O AREA ************ ; IF IN8251 ; ;TRUE IF UART IS INTEL 8251 OR EQUIVALENT ; DPORT EQU 58H ;DATA PORT CPORT EQU 59H ;CONTROL PORT SPORT EQU CPORT ;STATUS PORT BPORT EQU 60H ;BAUD RATE PORT RPORT EQU 69H ;RING INDICATOR PORT ; ;THE FOLLOWING ARE CPORT COMMANDS ; RSTINS EQU 42H ;RESET USART AND SEND DTR MODINS1 EQU 4EH ;8 BITS, NO PARITY, 1 STOP BIT, 16X BAUD RATE MODINS2 EQU 0CEH ;8 BITS, NO PARITY, 2 STOP BITS, 16X BAUD RATE ONINS EQU 17H ;RESET ERROR FLAGS, SEND DTR, ENABLE RECEIVE ;AND TRANSMIT OFFINS EQU 10H ;DROP DTR, DISABLE RECEIVE AND TRANSMIT ; ;THE FOLLOWING ARE SPORT STATUS MASKS ; TRNRDY EQU 01H ;TRANSMITER EMPTY RCVRDY EQU 02H ;DATA AVAILABLE PERR EQU 08H ;PARITY ERROR ORERR EQU 10H ;OVERRUN ERROR FRERR EQU 20H ;FRAMING ERROR TOERR EQU ORERR + FRERR ;OVERRUN PLUS FRAMING ERROR DSR EQU 80H ;DATA SET READY ; ;THE FOLLOWING ARE BAUD RATES FOR BPORT. THE UPPER 4 BITS ARE ;FOR THE MODEM PORT WHILE THE LOWER FOUR ARE FOR THE AUXILIARY ;PORT. ; BD110 EQU 27H ;110 BAUD BD300 EQU 57H ;300 BAUD BD1200 EQU 77H ;1200 BAUD ; ;RING INDICATOR PORT MASK ; RI EQU 40H ;NOT RING INDICATOR (LOW TRUE) P2RDET EQU RI ; ENDIF ;IN8251 ; CP/M MACRO ASSEM 2.0 #013 BYE V7.9 AS OF 04/12/82 ;****************WD8250 I/O AREAS************************* ;TRUE IF USAR IS WESTERN DIGITAL 8250 OR EQUIVILENT. ; IF WD8250 ; DPORT EQU BASE$PORT ;DATA PORT LPORT EQU BASE$PORT+3 ;LINE CONTROL CPORT EQU BASE$PORT+4 ;MODEM CONTROL SPORT EQU BASE$PORT+5 ;LINE STATUS PORT MSPORT EQU BASE$PORT+6 ;MODEM STATUS PORT RPORT EQU BASE$PORT+6 ;RING INDICATOR PORT ; *****************LINE STATUS MASKS************************ ; P0TBMT EQU 20H ;XMIT BUFFER EMPTY P0DAV EQU 01H ;DATA AVAILABLE P0RPE EQU 04H ;PARITY ERROR P0ORUN EQU 02H ;OVERRUN ERROR P0FERR EQU 08H ;FRAMING ERROR P0BRK EQU 10H ;BREAK DETECT ; ;****************MODEM STATUS MASKS*********************** ; P2DSR EQU 20H ;DATA SET READY P2CTS EQU 080H ;CARRIER DETECT P2RDET EQU 040H ;RING DETECT ; ;******************BAUD RATE DIVISORS********************* ; BR300LS EQU 000H ;300 BAUD BR300MS EQU 001H BR450LS EQU 0ABH ;450 BAUD BR450MS EQU 000H BR600LS EQU 080H ;600 BAUD BR600MS EQU 000H BR120LS EQU 040H ;1200 BAUD BR120MS EQU 000H ; ;*******************MODEM CONTROL**************************** ; MCDTR EQU 01H ; MCRTS EQU 02H MCOUT1 EQU 04H MCOUT2 EQU 08H ; ;*********************LINE CONTROL**************************** ; LCWLS0 EQU 01H LCWLS1 EQU 02H LCSTB EQU 04H LCPEN EQU 08H LCPES EQU 10H LCSPS EQU 20H LCBRK EQU 40H LCDLAB EQU 80H ENDIF ;WD8250 CP/M MACRO ASSEM 2.0 #014 BYE V7.9 AS OF 04/12/82 ; ;--------------------------------------------------------- ; 0100 ORG 100H ; IF BYELOW ;THIS CODE ALLOW RUNNING BELOW CCP AND USING PROGRAMS SUCH AS ;MBASIC OR TYPESQ ECT.... ; 0100 2106C5 LXI H,OLDBD ;OLD LOCATION STORED IN 6 AND 7 FOR ;JUMP FROM BDOS CALL 0103 2201B5 SHLD DEST-2 ;STORE IT JUST ABOVE BYE 0106 2100B5 LXI H,DEST-3 ;POINT TO THREE BYTE ABOVE ;NORMAL BYE 0109 36C3 MVI M,0C3H ;PUT A JUMP THERE 010B 220600 SHLD 0006H ;STORE DEST-3 FOR BDOS JUMP 010E 22CFD3 SHLD WMLOC ;STORE DEST-3 IN YOUR BIOS ; ENDIF ;BYELOW ; ;MOVE MODEM INTERFACE PROGRAM UP TO HIGH RAM AND JUMP TO IT ; 0111 012005 MOVEUP LXI B,PEND-START+1 ;NUMBER OF BYTES TO MOVE 0114 2123BA LXI H,DEST+PEND-START+1 ;END OF MOVED CODE 0117 115B06 LXI D,SOURCE+PEND-START ;END OF SOURCE CODE ; 011A 1A MVLP LDAX D ;GET BYTE 011B 2B DCX H ;BUMP POINTERS 011C 77 MOV M,A ;NEW HOME 011D 1B DCX D 011E 0B DCX B ;BUMP BYTE COUNT 011F 78 MOV A,B ;CHECK IF ZERO 0120 B1 ORA C 0121 C21A01 JNZ MVLP ;IF NOT, DO SOME MORE ; 0124 E5 PUSH H ;SAVE FOR LATER JUMP 0125 3EC3 MVI A,0C3H ;CLEAR ANY TRAPS SO SYSOP.. 0127 320000 STA 0 ;CAN USER "BYE /A" 012A AF XRA A ;NEXT WARMBOOT TO USR0/DRV A 012B 320400 STA 4 012E 0E0E MVI C,14 ;MAKE DRIVE A DEFAULT 0130 5F MOV E,A ;LOG-IN DRIVE CP/M FUNCTION 0131 CD0500 CALL BDOS ; IF CPM2 ;SET USER 0 0134 0E20 MVI C,32 ;GET/SET USR CP/M FUNCTION 0136 1E0E MVI E,WELUSR 0138 CD0500 CALL BDOS ENDIF ;CPM2 ; 013B C9 RET ;TO ADRS PUSHED ABOVE ; ; 013C = SOURCE EQU $ ;BOUNDARY MEMORY MARKER ; B3C7 = OFFSET EQU DEST-SOURCE ;RELOC AMOUNT CP/M MACRO ASSEM 2.0 #015 BYE V7.9 AS OF 04/12/82 ; ;-----------------------------------------------; ; THE FOLLOWING CODE GETS MOVED ; ; TO HIGH RAM LOCATED AT "DEST", ; ; WHERE IT IS EXECUTED. ; ;-----------------------------------------------; ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XX C A U T I O N : IF MODIFYING ANYTHING XX ;XX IN THIS PROGRAM FROM HERE ON: XX ;XX A-L-L LABELS MUST BE OF THE FORM: XX ;XX LABEL EQU $+OFFSET XX ;XX IN ORDER THAT THE RELOCATION TO HIGH XX ;XX RAM WORK SUCCESSFULLY. FORGETTING TO XX ;XX SPECIFY '$+OFFSET' WILL CAUSE THE PRO- XX ;XX GRAM TO JMP INTO WHATEVER IS CURRENTLY XX ;XX IN LOW MEMORY, WITH UNPREDICTABLE XX ;XX RESULTS. BE CAREFUL.... XX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ; B503 = START EQU $+OFFSET 013C C335B5 JMP START0 ;HOP OVER FIXED VECTORS ; ;COLD BOOT VECTOR ENDS UP HERE. OUR COLD BOOT ROUTINE ;CONSISTS OF A JUMP TO THE WARM BOOT ROUTINE. WE ARE ;DEFINED TO CONSIST OF ONLY THIS JUMP, WITH A JUMP ;TO PRNLOG IMMEDIATELY AFTER THIS JUMP, AND OTHER ;MODIFIABLE VARIABLES AFTER THAT. BY DOING THIS, ;A TRIVIAL PROGRAM CAN BE WRITTEN THAT CALCULATES ;WHERE PRNLOG IS THRU THE WARM BOOT VECTOR AT 0001H, ;THEN CALLS PRNLOG, ALLOWING REMOTE USERS TO GET THE ;BYE LOG PRINTED. SUCH A PROGRAM, EASILY ENTERED ;WITH DDT, IS AS FOLLOWS: ; ; LHLD 0001H ;PT TO COLD BOOT VECTOR + 3 ; DCX H ;PT TO VECTOR HIGH BYTE ; MOV D,M ;GET THAT IN D ; DCX H ;PT TO VECTOR LOW BYTE ; MOV E,M ;GET THAT IN E ; LXI H,3 ;CALC PRNLOG ADDRESS ; DAD D ; BY ADDING TO COLD BOOT ADDRESS ; PCHL ;GO PRINT LOG INFO, THEN ; ; RETURN TO CCP ; ;A SIMILAR CALCULATION CAN BE USED TO DETERMINE ;THE LOCATIONS OF THE MXUSR, MXDRV, AND TOVAL ;VARIABLES TO CHANGE THEM ON THE FLY FOR SPECIAL ;USERS. SINCE THIS WILL OFTEN BE DONE BY A ;BASIC SIGNON PROGRAM, THE FOLLOWING SEQUENCE ;OF CODE IS RECOMMENDED: ; ; 10 A=PEEK(2)*256+PEEK(1)-2 'PT TO COLD BOOT ADDRESS ; 20 A=PEEK(A+1)*256+PEEK(A)+6 'GET ADDRESS OF MXUSR ; 30 POKE A,8 'SET MXUSR TO 8, ALLOWS 0-8 ; 40 POKE A+1,4 'SET MXDRV TO 4, ALLOWS A-D ; 50 POKE A+2,5 'SET TOVAL TO 5, ALLOWS 5 MIN OF INACTIVITY ; CP/M MACRO ASSEM 2.0 #016 BYE V7.9 AS OF 04/12/82 ;THE VALUES POKE'ED WILL BE RESET TO THE ASSEMBLY ;VALUES OF MAXUSR, MAXDRV AND TOVALUE RESPECTIVELY ;THE NEXT TIME BYE ANSWERS THE PHONE. ; ;THE FOLLOWING WILL TEST WHETHER BYE IS ACTIVE AND THEN SET ;THE FLAG AT WRTLOC. ; ; 10 A=PEEK(2)*256+PEEK(1)-2 ; 20 A=PEEK(A+1)*256+PEEK(A)+9 'GET ADDRESS OF WRTLOC ; 30 IF CHR$(PEEK(A+1))+SHR$(PEEK(A+2))+CHR$(PEEK(A+3))<>"BYE" THEN ; 40 POKE A,&HFF 'SET FLAG FOR WRITE IN PROGRESS ; ;THE ROUTINE ON LINE 30 SHOULD BE USED IN RBBS SO THAT WHEN RBBS IS ;RUNNING LOCALLY NOTHING WILL BE POKED INTO THE BIOS. ; B506 = MCBOOT EQU $+OFFSET 013F C360B9 JMP MBOOT ;OFF TO WARM BOOT 0142 C30AB6 JMP PRNLOG ;GO PRINT OUT ITEMS OF INTEREST ; ;VARIABLES FOLLOW IN A PREDEFINED ORDER THAT CAN ;BE MANIPULATED BY A PASSWORDED OR OTHER PROGRAM ;TO GIVE SPECIAL USERS DIFFERENT CAPABILITIES. ; B50C = MXUSR EQU $+OFFSET 0145 0F DB MAXUSR ;RUNTIME MAX USER # (UNUSED ; UNDER CP/M 1.4) ; B50D = MXDRV EQU $+OFFSET 0146 02 DB MAXDRV ;RUNTIME # DRIVES ACCESSABLE ; B50E = TOVAL EQU $+OFFSET 0147 05 DB TOVALUE ;RUNTIME # INACTIVE MINUTES ; BEFORE AUTO LOGOFF B50F = NULLS EQU $+OFFSET 0148 05 DB 5 ;INITIAL NUMBER OF NULLS ; B510 = ULCSW EQU $+OFFSET 0149 00 DB 0 ;UPPER CASE ONLY SWITCH ; B511 = LFEEDS EQU $+OFFSET 014A 00 DB 0 ;LINE FEED SWITCH ; B512 = WRTLOC EQU $+OFFSET 014B 00 DB 0 ;LOCATION OF FLAG FOR RBBS TO ;SET WHILE DOING DISK WRITES ; B513 = HARDON EQU $+OFFSET 014C 01 DB 1 ;DEFAULT HARDLOG ON (IF EQUATE IS TRUE, OTHERWISE ;THIS IS JUST A DUMMY BIT TO HOLD SPACE SO SMART ;PROGRAMS WON'T SCREW UP WHEN THEY POKE UP THESE ;FLAGS ; ;PROGRAM VERSION NUMBER MESSAGE. ; B514 = VMSG EQU $+OFFSET 014D 4259452076 DB 'BYE version 7.9 as of 04/12/82',CR,LF CP/M MACRO ASSEM 2.0 #017 BYE V7.9 AS OF 04/12/82 IF SMODEM DB 'Make sure switch 1 is down and switch 6 is up.',CR,LF ENDIF ;SMODEM 016D 24 DB '$' ; ;---------------------------------------------- ;THIS IS THE OFFICIAL START OF THE BYE PROGRAM. ;---------------------------------------------- ; ;IF CARRIER LOST, HANG UP, AWAIT RING. ;OTHERWISE, SAY GOODBYE, AND HANG UP ; B535 = START0 EQU $+OFFSET ; 016E AF XRA A ;GET 0 016F 323BBA STA LOSTFLG ;SHOW NO CARR. LOST ; IF MINICK ; ;SET MINICK TO TRUE IF YOU USE MINICBBS AND WANT TO TAKE ;ADVANTAGE OF ITS FEATURE WHICH CAN PREVENT THE MODEM ;FROM HANGING UP IF THE CALLER SHOULD HAPPEN TO DISCON- ;NECT DURING A FILE UPDATE. MINICBBS SETS THE HIGH-ORDER ;BIT OF IOBYTE TO (ADDRESS 0003) TO INDICATE A FILE UPDATE ;IS IN PROGRESS. ; MVI A,IOVAL STA IOBYTE ; ENDIF ;MINICK ; ;DON'T ALLOW A REMOTE USER TO DO 'BYE /A' ; IF DCHAYES 0172 DB81 IN STATUS 0174 E640 ANI CD ;CHECK CARRIER DETECT 0176 C269B5 JNZ GOODBY ;SAY GOODBYE IF REMOTE ENDIF ;DCHAYES ; IF MMII LDA RPORT1 ;AS ABOVE, FOR MMII ANI P2CTS JZ GOODBY ENDIF ;MMII ; IF SMODEM AND PORTED IN MSPORT ;GET STATUS ENDIF ; IF SMODEM AND NOT PORTED LDA MSPORT ;GET STATUS ENDIF ; IF SMODEM CP/M MACRO ASSEM 2.0 #018 BYE V7.9 AS OF 04/12/82 ANI P2CTS ;CLEAR TO SEND? JZ GOODBY ENDIF ;SMODEM ; IF PMMI IN RPORT ;AS ABOVE, FOR PMMI MODEM ANI P2CTS ;CD DEDUCED FROM CTS JZ GOODBY ENDIF ;PMMI ; IF IN8251 IN SPORT ANI DSR ;CHECK CARRIER DETECT JNZ GOODBY ;GOODBYE IF REMOTE ENDIF ;IN8251 ; IF WD8250 IN MSPORT ANI P2CTS JNZ GOODBY ENDIF ;WD8250 ; ;IDENTIFY VERSION OF PROGRAM ; 0179 0E09 MVI C,PRINTF 017B 1114B5 LXI D,VMSG 017E CD0500 CALL BDOS ; ;CHECK FOR /A OPTION ON COMMAND - REQUEST TO ;GO IMMEDIATELY INTO ANSWER MODE 0181 215D00 LXI H,FCB+1 ;TO OPTION 0184 7E MOV A,M 0185 FE2F CPI '/' ;OPTION? 0187 C28DB5 JNZ HANGUP ;GOT AN OPTION - VALIDATE IT 018A 23 INX H ;TO OPTION BYTE 018B 7E MOV A,M ;GET IT 018C 3237BA STA OPTION ;MIGHT NEED LATER 018F FE41 CPI 'A' ;ANSWER? 0191 CACCB5 JZ ANSWER ; IF COMFILE CPI 'C' JZ ANSWER ENDIF ;COMFILE ; IF USRLOG ;CHECK FOR RESET OF COUNTERS 0194 FE52 CPI 'R' 0196 CC03B6 CZ RESET ENDIF ;USRLOG ; 0199 C38DB5 JMP HANGUP ;WE KNOW IT'S LOCAL, SO SKIP CALL TO CARCK ; ;NO OPTION, OR INVALID ONE ; B563 = NOSLASH EQU $+OFFSET CP/M MACRO ASSEM 2.0 #019 BYE V7.9 AS OF 04/12/82 019C CD56B7 CALL CARCK ;SIGNED OFF W/THIS PROG? 019F DA8DB5 JC HANGUP ;NOBODY THERE ; B569 = GOODBY EQU $+OFFSET 01A2 CD6BB9 CALL ILPRT ;PRINT THIS MSG: 01A5 0D0A476F6F DB CR,LF,'Good-bye, call again...' IF RTC DB CR,LF,CR,LF,'Off at ',0 CALL TIME CALL ILPRT ENDIF ;RTC ; 01BE 0D0A0D0A00 DB CR,LF,CR,LF,0 01C3 CD25B8 CALL UNPATCH ;UNDO BIOS PATCHES ; ;NOBODY THERE, OR WE ARE DONE, SO HANG UP ; B58D = HANGUP EQU $+OFFSET 01C6 3196BA LXI SP,STACK ;SET UP LOCAL STACK 01C9 AF XRA A ;FORCE NEXT WARMBOOT TO USER 0 01CA 320400 STA 4 ;AND DRIVE A ; IF CCSDISK ; CALL DSKOFF ;SHUT DOWN THE DRIVES ; ENDIF ;CCSDISK ; 01CD 0E0E MVI C,14 ;MAKE DRIVE A DEFAULT 01CF 5F MOV E,A 01D0 CD0500 CALL BDOS 01D3 3E20 MVI A,' ' ;DON'T ALLOW OPTIONS.. 01D5 3237BA STA OPTION ;..AFTER 1 "BYE / " ; IF CPM2 AND COMFILE MVI C,32 ;GET/SET USER CODE MVI E,COMUSR ;LOCATION OF OUR COMFILE CALL BDOS ENDIF ;CPM2 AND COMFILE ; IF COMFILE CALL LODCOM ;LOAD THE COM FILE ENDIF ;COMFILE ; ; B59F = HANGUP2 EQU $+OFFSET ; ;CLEAR DTR CAUSING PHONE TO HANG UP ; IF DCHAYES 01D8 AF XRA A ;GET A ZERO 01D9 D382 OUT CR2 ;WRITE TO CR2, CAUSING HANGUP ENDIF ;DCHAYES ; IF MMII XRA A ;CLEAR A CP/M MACRO ASSEM 2.0 #020 BYE V7.9 AS OF 04/12/82 STA TPORT ;RESET ORIG/ANSW STA CPORT ;HANG UP FERN ENDIF ;MMII ; IF SMODEM CALL SMINIT ;WAIT 1 SECOND, SEND "+++", WAIT ONE SECOND CALL SMSEND ;SEND THE HANGUP CODES AND NORMALIZE MODEM DB 'AT H0 Z',CR,0 ; CALL SMINIT ;WAIT 1 SECOND, SEND "+++", WAIT ONE SECOND CALL SMSEND ;SEND THE PROPER CODES SO WE CAN RUN REMOTE DB 'AT E0 F0 M0 Q1 V1 S0=1',CR,0 ENDIF ;SMODEM ; IF PMMI XRA A ;GET DISCONNECT VALUE OUT TPORT ;RESET ORIG/ANSW OUT CPORT ;TURN OFF DTR, DO BREAK ENDIF ;PMMI ; IF IN8251 MVI A,OFFINS ;CLEAR DTR OUT CPORT ;CAUSING HANGUP PUSH B ;PRESERVE IN CASE WE NEED IT MVI B,150 ;15 SECOND DELAY ; OFFTI EQU $+OFFSET CALL DELAY ;0.1 SECOND DELAY DCR B JNZ OFFTI ;KEEP LOOPING UNTIL FINISHED POP B ;RESTORE B MVI A,ONINS ;TURN DTR ON ALLOWING MODEM TO ANSWER PHONE OUT CPORT ENDIF ;IN8251 ; IF WD8250 XRA A ;SHUT OFF DTR & RTS OUT CPORT ;SHUT OFF MODEM ENDIF ;WD8250 ; IF WD8250 AND NORING ; PUSH B ;PRESERVE IT IF WE NEED IT MVI B,150 ;15 SEC DELAY OFFTI EQU $+OFFSET CALL DELAY ;0.1 SEC DELAY DCR B JNZ OFFTI ;KEEP LOOPING UNTIL DONE POP B ;RESTORE B MVI A,MCDTR+MCRTS ;TURN ON DTR/RTS OUT CPORT ENDIF ;WD8250 ; 01DB 3EC3 MVI A,0C3H ;CLEAR ANY TRAPS.. 01DD 320000 STA 0 ;..LEFT FROM COM FILE CP/M MACRO ASSEM 2.0 #021 BYE V7.9 AS OF 04/12/82 ; ;AWAIT RINGING ; B5A7 = RINGWT EQU $+OFFSET ; ;CHECK LOCAL KEYBOARD FOR CTL-C EXIT REQUEST. ;NOTE: MUST DO INPUT VIA BDOS BECAUSE CBIOS PATCHES ;ARE NOT DONE UNTIL CALL COMES IN. ; 01E0 CDFBB5 CALL UCSTS 01E3 E67F ANI 7FH ;STRIP PARITY BIT 01E5 FE03 CPI 'C'-40H ;CONTROL C? 01E7 CC21B6 CZ USRCHK ;CHECK FOR EXIT IF SO ; IF NORING IN MSPORT ANI P2CTS ;GOT CARRIER JNZ ANSWER JMP RINGWT ;KEEP CHECKING ENDIF ;NORING ; B5B1 = RINGW2 EQU $+OFFSET ; IF NOT PORTED LDA RPORT ;GET STATUS ENDIF ; IF PORTED 01EA DB81 IN RPORT ;GET THE STATUS ENDIF ; 01EC E680 ANI P2RDET ;RINGING? ; IF WD8250 OR IN8251 JZ RINGWT ;NO, WAIT ENDIF ;WD8250 OR IN8251 ; IF NOT (WD8250 OR IN8251) 01EE C2A7B5 JNZ RINGWT ;NO, WAIT ENDIF ;NOT (WD8250 OR IN8251) ; ;THE PHONE MAY BE RINGING. WAIT .1 SEC AND LOOK ;AGAIN TO MAKE SURE IT ISN'T JUST RELAY BOUNCE 01F1 CDFCB7 CALL DELAY ;.1 SEC DELAY FOR DEBOUNCE ; IF NOT PORTED LDA RPORT ;GET STATUS ENDIF ; IF PORTED 01F4 DB81 IN RPORT ;GET STATUS ENDIF ; 01F6 E680 ANI P2RDET ;STILL RINGING? ; IF WD8250 OR IN8251 CP/M MACRO ASSEM 2.0 #022 BYE V7.9 AS OF 04/12/82 JZ RINGWT ;NO, IT WAS RELAY BOUNCE ENDIF ;WD8250 OR IN8251 ; IF NOT (WD8250 OR IN8251) 01F8 C2A7B5 JNZ RINGWT ;NO, IT WAS A RELAY BOUNCE ENDIF ;NOT (WD8250 OR IN8251) ; ;THE PHONE IS DEFINITELY RINGING, NOW WAIT UNTIL RING IS FINISHED ; B5C2 = ENDRING EQU $+OFFSET 01FB CDFCB7 CALL DELAY ;.1 SEC DELAY FOR DEBOUNCE ; IF NOT PORTED LDA RPORT ;GET STATUS ENDIF ; IF PORTED 01FE DB81 IN RPORT ;GET STATUS ENDIF ; 0200 E680 ANI P2RDET ;STILL RINGING? ; IF WD8250 OR IN8251 JNZ ENDRING ;WAIT UNTIL RING FINISHED ENDIF ;WD8250 OR IN8251 ; IF NOT (WD8250 OR IN8251) 0202 CAC2B5 JZ ENDRING ;WAIT UNTIL RING FINISHED ENDIF ;NOT (WD8250 OR IN8251) ; IF CALLBAK ;NEXT ROUTINES IMPLEMENT CALLBAK ; ;THIS ROUTINE MINIMIZES THE COMPUTER'S INTERFERENCE ;WITH NORMAL HOUSEHOLD PHONE USE BY HAVING COMPUTER ;FOLK DIAL, LET THE PHONE RING ONCE, HANG UP AND ;THEN DIAL AGAIN. WHEN THE PHONE RINGS ONLY ONCE IT ;ALERTS THE COMPUTER WHICH THEN WAITS FOR AND ANSWERS ;ANY RING WHICH OCCURS WITHIN THE NEXT 40 SECONDS. ; MVI L,45 ;DELAY 4.5 SECONDS FOR NEXT RING ; WAITNX EQU $+OFFSET CALL DELAY ;WAIT .1 SECONDS DCR L ;MORE TO GO? JNZ WAITNX ;YES, LOOP ENDIF ;CALLBAK ; IF CALLBAK AND NOT PORTED LDA RPORT ENDIF ;CALLBAK AND MMII ; IF CALLBAK AND PORTED IN RPORT ;GET THE STATUS ENDIF ;CALLBAK AND NOT MMII ; IF CALLBAK AND (WD8250 OR IN8251) CP/M MACRO ASSEM 2.0 #023 BYE V7.9 AS OF 04/12/82 ANI P2RDET JZ EXPECT ;NO?...ITS FOR ME! ENDIF ; IF CALLBAK AND NOT (WD8250 OR IN8251) ANI P2RDET JNZ EXPECT ;NO?...ITS FOR ME! ENDIF ; IF CALLBAK ; ;IF SECOND RING, THEN CHECK FOR THIRD RING, IN CASE ;CALLER'S PHONE EXCHANGE NOT SYNCH'ED WITH COMPUTER'S ; ENDRNG2 EQU $+OFFSET ENDIF ;CALLBAK ; IF CALLBAK AND NOT PORTED LDA RPORT ;GET THE STATUS ENDIF ; IF CALLBAK AND PORTED IN RPORT ;GET THE STATUS ENDIF ; IF CALLBAK AND (WD8250 OR IN8251) ANI P2RDET ;STILL RINGING? JNZ ENDRNG2 ;WAIT UNTIL RING FINISHED ENDIF ; IF CALLBAK AND NOT (WD8250 OR IN8251) ANI P2RDET ;STILL RINGING? JZ ENDRNG2 ;WAIT UNTIL RING FINISHED ENDIF ; IF CALLBAK MVI L,45 ;DELAY 4.5 SECONDS FOR NEXT RING ; WAITNX2 EQU $+OFFSET CALL DELAY ;WAIT .1 SECONDS DCR L ;MOE TO GO? JNZ WAITNX2 ;YES, LOOP ENDIF ;CALLBAK ; IF CALLBAK AND NOT PORTED LDA RPORT ;GET THE STATUS ENDIF ;CALLBAK AND NOT PORTED ; IF CALLBAK AND PORTED IN RPORT ;GET THE STATUS ENDIF ;CALLBAK AND PORTED ; IF CALLBAK AND (WD8250 OR IN8251) ANI P2RDET ;RINGING AGAIN JZ EXPECT ;NO?...ITS FOR ME! ENDIF CP/M MACRO ASSEM 2.0 #024 BYE V7.9 AS OF 04/12/82 ; IF CALLBAK AND NOT (WD8250 OR IN8251) ANI P2RDET ;RINGIN AGAIN JNZ EXPECT ;NO?...ITS FOR ME! ENDIF ; IF CALLBAK ; ;CALL NOT FOR COMPUTER - WAIT UNTIL RINGING DONE, THEN RESET ; WAITNR EQU $+OFFSET MVI L,100 ;WAIT FOR 10 SECS NO RINGING ; WAITNRL EQU $+OFFSET CALL DELAY ;DELAY .1 SECONDS ENDIF ;CALLBAK ; IF CALLBAK AND NOT PORTED LDA RPORT ;GET THE STATUS ENDIF ;CALLBAK AND NOT PORTED ; IF CALLBAK AND PORTED IN RPORT ;GET THE STATUS ENDIF ;CALLBAK AND PORTED ; IF CALLBAK AND (WD8250 OR IN8251) ANI P2RDET ;STILL RINGING? JNZ WAITNR ;YES, WAIT 10 MORE SECONDS ENDIF ; IF CALLBAK AND NOT (WD8250 OR IN8251) ANI P2RDET ;IS THIS MOTHER STILL RINGING? JZ WAITNR ;YES, WAIT 10 MORE SECONDS ENDIF ; IF CALLBAK DCR L ;NO RING, MAYBE WE'RE DONE JNZ WAITNRL ;NO, LOOP SOME MORE ENDIF ; IF CALLBAK AND USRLOG LXI H,NONUSR ;RECORD AS VOICE CALL CALL BOPLOG ;CALL ROUTINE TO ADD ONE ENDIF ;CALLBAK AND USRLOG ; IF CALLBAK ;CONTINUE WITH CALLBAK ROUTINES JMP HANGUP2 ;GO WAIT FOR NEXT CALL ; EXPECT EQU $+OFFSET LXI H,400 ;40 SECONDS TO WAIT FOR SECOND CALL ; RELOOK EQU $+OFFSET ENDIF ;CALLBAK ; IF CALLBAK AND NOT PORTED LDA RPORT CP/M MACRO ASSEM 2.0 #025 BYE V7.9 AS OF 04/12/82 ENDIF ; IF CALLBAK AND PORTED IN RPORT ;GET THE STATUS ENDIF ; IF CALLBAK AND (WD8250 OR IN8251) ANI P2RDET JNZ ANSWER ;YES, GO ANSWER IT ENDIF ; IF CALLBAK AND NOT (WD8250 OR IN8251) ANI P2RDET JZ ANSWER ;YES, GO ANSWER IT ENDIF ; IF CALLBAK CALL DELAY ;WAIT .1 SECOND DCX H ;ONE LESS COUNT MOV A,H ORA L ;IS COUNT ZERO? JNZ RELOOK ;NO, LOOK SOME MORE JMP HANGUP2 ;COUNT DONE, WAIT FOR NEW CALL ; ENDIF ;END OF CALLBAK ROUTINES ; ;SETUP MODEM ; B5CC = ANSWER EQU $+OFFSET ; IF ZCPRT ;RESET WHEEL STATUS XRA A ;WHEN RUNNING ZCPR-T## FOR YOUR CCP. STA WHEEL ENDIF ;ZCPRT ; IF USRLOG AND PWRQD ;COUNT # OF LOGON ATTEMPTS LXI H,OLDUSR ;GET # OF ATTEMPTS CALL BOPLOG CALL ROUTINE TO ADD ONE ENDIF ;USRLOG AND PWRQD ; IF DCHAYES 0205 3E1E MVI A,LS1+LS2+PI+SBS ;8 DATA BITS, NO PARITY, 2 STOP BITS 0207 D381 OUT CR1 0209 3E82 MVI A,TXE+OH ;TURN ON CARRIER AND ANSWER PHONE 020B D382 OUT CR2 020D DB80 IN DATA ;CLEAR DATA INPUT PORT 020F DB80 IN DATA ;MAKE SURE IT'S CLEAR 0211 CD49B7 CALL FRSTCAR ;LOOK FOR CARRIER 0214 DA9FB5 JC HANGUP2 ;AWAIT ANOTHER CALLER ; ;NOW TEST INPUT FOR BAUD RATE 0217 CD0FB8 CALL PATCH ;PATCH JUMP TABLE 021A CD3DB7 CALL TSTBAUD ;SEE IF BAUD = 110 021D CAD2B6 JZ WELCOME ;YES, EXIT ; 0220 3E16 MVI A,LS1+LS2+PI ;SET FOR 1 STOP BIT, 8 DATA, NO PARITY CP/M MACRO ASSEM 2.0 #026 BYE V7.9 AS OF 04/12/82 0222 D381 OUT CR1 0224 3E83 MVI A,TXE+OH+BRS ;SET FOR 300 BAUD 0226 D382 OUT CR2 0228 CD3DB7 CALL TSTBAUD ;SEE IF BAUD = 300 022B CAD2B6 JZ WELCOME ;YES,EXIT ENDIF ;DCHAYES ; IF MMII MVI A,P0ANSW ;ANSWER MODEM STA CPORT MVI A,P0110 ;110 BAUD STA TPORT LDA DPORT ;FILTER OUT CRAP LDA DPORT CALL CARCK JC HANGUP2 ;AWAIT ANOTHER CALLER ; ;NOW TEST INPUT FOR BAUD RATE CALL PATCH ;PATCH JUMP TABLE CALL TSTBAUD ;SEE IF BAUD = 110 JZ WELCOME ;YES, EXIT ; MVI A,P0NORM ;SET FOR 1 STOP BIT, 8 DATA, NO PARITY STA TPORT MVI A,B300+P0ANSW ;SET FOR 300 BAUD STA CPORT CALL TSTBAUD ;SEE IF BAUD = 300 JZ WELCOME ;YES,EXIT ENDIF ;MMII ; ; IF SMODEM ; ;THE SMARTMODEM ALREADY ANSWERED THE PHONE, SO... ;WE DON'T DO ANY MODEM STUFF, BECAUSE THE BAUDRATE IS ALREADY ;SET... ; CALL PATCH ;PATCH IN JUMP TABLE JMP WELCOME ;GOTO WELCOME ENDIF ;SMODEM ; IF PMMI MVI A,7FH ;TURN ON DTR OUT CPORT ;.. AND SET FILTER VALUE FOR 300 BAUD CALL DELAY ;GIVE TIME TO TURN ON MVI A,P0110+P0ANSW OUT TPORT ;ANSWER PHONE CALL DELAY ;GIVE TIME FOR ANSWER CALL UCSTS IN DPORT ;CLEAR MODEM PORT IN DPORT ;MAKE SURE ITS CLEAR MVI A,B110 ;SET DIVISOR OUT RPORT ;.. TO 110 BAUD RATE ;OUTPUT VALUE ALLOWING MODEM TO HANG UP ON LOSS OF CARRIER MVI A,P0110 ;NORMAL MODE FOR 110 BAUD OUT TPORT CP/M MACRO ASSEM 2.0 #027 BYE V7.9 AS OF 04/12/82 CALL CARCK ;LOOK FOR CARRIER JC HANGUP2 ;AWAIT ANOTHER CALLER ;NOW TEST INPUT FOR BAUD RATE CALL PATCH ;PATCH JMP TABLE CALL TSTBAUD ;SEE IF BAUD = 110 JZ WELCOME ;YES, EXIT ; MVI A,P0NORM ;SET FOR 1 STOP BIT, ETC. OUT TPORT MVI A,B300 ;SET DIVISOR OUT RPORT ;.. TO 300 RATE CALL TSTBAUD ;SEE IF BAUD = 300 JZ WELCOME ;YES, EXIT ; MVI A,B450 ;SET DIVISOR OUT RPORT ;.. TO 450 RATE MVI A,5FH ;SET FILTER VALUE OUT CPORT ;.. FOR > 300 CALL TSTBAUD ;SEE IF BAUD = 450 JZ WELCOME ;YES, EXIT ; MVI A,B600 ;SET DIVISOR OUT RPORT ;.. TO 600 RATE CALL TSTBAUD ;SEE IF BAUD = 600 JZ WELCOME ;YES, EXIT ; MVI A,B710 ;SET DIVISOR OUT RPORT ;.. TO 710 RATE CALL TSTBAUD ;SEE IF BAUD = 710 JZ WELCOME ;YES, EXIT ENDIF ;PMMI ; IF IN8251 MVI A,BD300 ;LOAD 300 BAUD OUT BPORT IN DPORT ;CLEAR IN DPORT ;DATA PORT MVI A,RSTINS ;RESET USART OUT CPORT CALL UDELAY ;USART DELAY MVI A,MODINS1 ;1 STOP BIT, ETC. OUT CPORT CALL UDELAY ;USART DELAY MVI A,ONINS ;DSR, ETC. OUT CPORT CALL CARCK ;SEE IF CARRIER IS PRESENT JC HANGUP2 ;TEST INPUT FOR BAUD RATE CALL PATCH ;PATCH JUMP TABLE CALL TSTBAUD ;SEE IF 300 BAUD JZ WELCOME ;YES, EXIT ; MVI A,BD1200 ;LOAD 1200 BAUD OUT BPORT CALL TSTBAUD ;SEE IF 1200 BAUD JZ WELCOME ;YES,EXIT CP/M MACRO ASSEM 2.0 #028 BYE V7.9 AS OF 04/12/82 ; MVI A,RSTINS ;RESET USART OUT CPORT CALL UDELAY ;DELAY FOR USART MVI A,MODINS2 ;2 STOP BITS, ETC. OUT CPORT CALL UDELAY ;DELAY FOR USART MVI A,ONINS ;DTR, ETC. OUT CPORT MVI A,BD110 ;LOAD 110 BAUD OUT BPORT CALL TSTBAUD ;TEST FOR 110 BAUD JZ WELCOME ENDIF ;IN8251 ; IF WD8250 AND NOT NORING ; MVI A,MCDTR+MCRTS ;TURN ON DATA SET, ANSWER PHONE; OUT CPORT ENDIF ;WD8250 AND NOT NORING ; IF WD8250 MVI A,(LCWLS0+LCWLS1) AND 0FFH ;8 BIT DATA 1 STOP BIT NO PAR OUT LPORT CALL PATCH ;PATCH DRIVERS ; ; BAUD RATE SELECTOR ; TST300: EQU $+OFFSET PUSH D ;SAVE D/E MVI D,BR300MS MVI E,BR300LS CALL SETBAUD POP D CALL TSTBAUD JNZ TST450 CALL TSTBAUD JZ WELCOME TST450: EQU $+OFFSET PUSH D MVI D,BR450MS MVI E,BR450LS CALL SETBAUD POP D CALL TSTBAUD JNZ TST600 CALL TSTBAUD JZ WELCOME TST600: EQU $+OFFSET PUSH D MVI D,BR600MS MVI E,BR600LS CALL SETBAUD POP D CALL TSTBAUD JNZ TST120 CP/M MACRO ASSEM 2.0 #029 BYE V7.9 AS OF 04/12/82 CALL TSTBAUD JZ WELCOME TST120: EQU $+OFFSET PUSH D MVI D,BR120MS MVI E,BR120LS CALL SETBAUD POP D CALL TSTBAUD JNZ BADDO CALL TSTBAUD JZ WELCOME ENDIF ;WD8250 ; B5F5 = BADDO EQU $+OFFSET 022E CD25B8 CALL UNPATCH ;RESTORE ORIG BIOS JMP TBL 0231 C3CCB5 JMP ANSWER ;TEST MORE - INVALID BAUD RATE ; IF IN8251 UDELAY EQU $+OFFSET NOP ! NOP ! NOP ! RET ENDIF ;IN8251 ; ;GET THE CONSOLE STATUS WHEN UNPATCHED ; B5FB = UCSTS EQU $+OFFSET ; IF CPM2 0234 0E06 MVI C,DRECTIO ;DIRECT I/O CALL 0236 1EFF MVI E,0FFH ;ASK FOR INPUT 0238 CD0500 CALL BDOS ;A=0 IF NO CHAR WAITING 023B C9 RET ENDIF ;CPM2 ; IF NOT CPM2 MVI C,CSTS ;IN CPM 1.4, WE HAVE TO GET.. CALL BDOS ;..THE STATUS FIRST ORA A RZ MVI C,CI ;AND THEN THE CHARACTER CALL BDOS RET ENDIF ;NOT CPM2 ; ;FOLLOWING ARE THE USRLOG ROUTINES ; IF USRLOG ;INCLUDE RESET FUNCTIONS B603 = RESET EQU $+OFFSET ;RESET ALL LOGON COUNTERS 023C 210000 LXI H,0 ;ZEROING 16 BIT COUNTERS ENDIF ;USRLOG ; IF USRLOG AND PWRQD SHLD OLDUSR ;RESET ATTEMPT COUNTER ENDIF ;USRLOG AND PWRQD ; CP/M MACRO ASSEM 2.0 #030 BYE V7.9 AS OF 04/12/82 IF USRLOG 023F 2256BA SHLD NEWUSR ;RESET LOGON COUNTER ENDIF ;USRLOG ; IF USRLOG AND CALLBAK SHLD NONUSR ;RESET VOICE COUNTER ENDIF ;USRLOG AND CALLBAK ; IF USRLOG AND IMSAI MVI A,0FFH OUT SENSE ;RESET IMSAI PANEL DISPLAY ENDIF ;USRLOG AND IMSAI ; IF USRLOG 0242 C9 RET ENDIF ;USRLOG ; ; PRNLOG IS CALLED TO PRINT OUT THE BYE VERSION ; # AND USRLOG INFO. IT CAN BE CALLED FROM ; OUTSIDE THE PROGRAM, USING THE VECTOR AFTER ; MCBOOT. ; B60A = PRNLOG EQU $+OFFSET ; 0243 0E09 MVI C,PRINTF ;PRINT OUT PROG VERSION # 0245 1114B5 LXI D,VMSG 0248 CD0500 CALL BDOS ; IF USRLOG AND PWRQD ;PRINT # OF LOGON ATTEMPTS MVI C,PRINTF LXI D,ATMSG CALL BDOS LXI H,OLDUSR+1 ;PT TO HIGH BYTE CALL HXOUT ENDIF ;USRLOG AND PWRQD ; IF USRLOG ;PRINT # OF LOGONS 024B 0E09 MVI C,PRINTF 024D 119CB6 LXI D,SUMSG 0250 CD0500 CALL BDOS 0253 2157BA LXI H,NEWUSR+1 0256 CDB1B6 CALL HXOUT ENDIF ;USRLOG ; IF USRLOG AND CALLBAK ;# OF VOICE CALLS MVI C,PRINTF LXI D,VCMSG CALL BDOS LXI H,NONUSR+1 CALL HXOUT ENDIF ;USRLOG AND CALLBAK ; 0259 C9 RET ;IF NO LOG, NULL PRNLOG ROUTINE ; B621 = USRCHK EQU $+OFFSET IF SMODEM CP/M MACRO ASSEM 2.0 #031 BYE V7.9 AS OF 04/12/82 CALL SMINIT CALL SMSEND DB 'AT Z',CR,0 ENDIF ;SMODEM 025A CD0AB6 CALL PRNLOG ;GIVE INFO 025D 0E09 MVI C,PRINTF 025F 1145B6 LXI D,RS1MSG 0262 CD0500 CALL BDOS ;PROMPT FOR RESUME BYE ; B62C = PRNREL EQU $+OFFSET 0265 CDFBB5 CALL UCSTS ;GET REPLY 0268 B7 ORA A 0269 CA2CB6 JZ PRNREL ;WAIT UNTIL ANSWERED 026C FE52 CPI 'R' ;IS ANSWER "R", FOR RESUME? 026E CA3DB6 JZ PRNRES ;GO DO IT IF SO 0271 FE72 CPI 'R'+20H ;TAKE LOWER CASE ALSO 0273 C288B6 JNZ EXCPM ;IF NOT "R", WARM BOOT CP/M ; B63D = PRNRES EQU $+OFFSET 0276 0E09 MVI C,PRINTF 0278 117AB6 LXI D,RS2MSG 027B C30500 JMP BDOS ;RESUME VIA BDOS AFTER MSG ; B645 = RS1MSG EQU $+OFFSET 027E 0D0A0D0A54 DB CR,LF,CR,LF,'Type "R" to resume,' 0295 20616E7974 DB ' anything else to warm boot: $' B67A = RS2MSG EQU $+OFFSET 02B3 526573756D DB 'Resuming...',CR,LF,'$' ; ; HERE TO EXIT TO CP/M ; B688 = EXCPM EQU $+OFFSET ; IF CCSDISK ; CALL DSKON ;TURN ON THE DRIVES ; ENDIF ;CCSDISK ; IF BYELOW ; 02C1 2106C5 LXI H,OLDBD ;RESET THE OLD BDOS JUMP IN 02C4 22CFD3 SHLD WMLOC ;THE BIOS WARM BOOT ROUTINE ; ENDIF ;BYELOW ; 02C7 C30000 JMP 0000H ;WARM BOOT CP/M ; IF USRLOG ; ; BOPLOG INCREMENTS THE 16 BIT COUNTER PT'ED AT BY ; HL. IF DECIMAL SWITCH IN USE, NUMBER IS KEPT AS ; 4 BCD DIGITS. ; B691 = BOPLOG EQU $+OFFSET CP/M MACRO ASSEM 2.0 #032 BYE V7.9 AS OF 04/12/82 02CA 7E MOV A,M ;GET LOW BYTE 02CB 3C INR A ;INCREMENT ENDIF ;USRLOG ; IF USRLOG AND DECIMAL 02CC 27 DAA ;DECIMAL ADJUST ENDIF ;USRLOG AND DECIMAL ; IF USRLOG 02CD 77 MOV M,A ;REPLACE LOW ORDER 02CE D0 RNC ;IF NO CARRY, BOP DONE 02CF 23 INX H ; ELSE CARRY TO HIGH ORDER 02D0 7E MOV A,M ;GET HIGH ORDER 02D1 3C INR A ; AND BOP IT ENDIF ; IF USRLOG AND DECIMAL 02D2 27 DAA ;DECIMAL ADJUST ENDIF ;USRLOG AND DECIMAL ; IF USRLOG 02D3 77 MOV M,A ;REPLACE HIGH ORDER 02D4 C9 RET ;CARRY OUT OF HIGH DROPPED ENDIF ;USRLOG ; IF USRLOG AND PWRQD ATMSG EQU $+OFFSET DB CR,LF,'Number of logon attempts: $' ENDIF ;USRLOG AND PWRQD ; IF USRLOG B69C = SUMSG EQU $+OFFSET 02D5 0D0A4E756D DB CR,LF,'Number of logons: $' ENDIF ;USRLOG ; IF USRLOG AND CALLBAK VCMSG EQU $+OFFSET DB CR,LF,'Number of voice calls: $' ENDIF ;USRLOG AND CALLBAK ; IF USRLOG B6B1 = HXOUT EQU $+OFFSET 02EA E5 PUSH H ;SAVE PTR 02EB CDB7B6 CALL HXHAF ;DO HIGH ORDER HALF OF # 02EE E1 POP H ;RESTORE PTR 02EF 2B DCX H ;PT TO LOW, THEN DROP ; IN TO DO LOW HALF ; B6B7 = HXHAF EQU $+OFFSET 02F0 7E MOV A,M ;GET HALF # IN ACC 02F1 47 MOV B,A ;SAVE NUMBER 02F2 1F RAR ;ROTATE RIGHT 4 BITS 02F3 1F RAR ;TO MAKE AN ASCII DIGIT 02F4 1F RAR 02F5 1F RAR 02F6 CDC1B6 CALL ONEOUT ;OUTPUT MSH TO CONSOLE CP/M MACRO ASSEM 2.0 #033 BYE V7.9 AS OF 04/12/82 02F9 78 MOV A,B ;GET NUMBER BACK ; B6C1 = ONEOUT EQU $+OFFSET 02FA E60F ANI 0FH ;GET LSH FOR OUTPUT 02FC C690 ADI 90H ;CVT TO DECIMAL ASCII 02FE 27 DAA 02FF CE40 ACI 40H 0301 27 DAA 0302 C5 PUSH B 0303 0E02 MVI C,02H 0305 5F MOV E,A ;OUTPUT THE NUMBER 0306 CD0500 CALL BDOS 0309 C1 POP B 030A C9 RET ENDIF ;USRLOG ; ;WELCOME TO THE SYSTEM ; B6D2 = WELCOME EQU $+OFFSET ; IF CCSDISK ; CALL DSKON ;TURN ON THE DRIVES ; ENDIF ;CCSDISK ; IF CPM2 030B 3E0F MVI A,MAXUSR ;RESET MAX USER # 030D 320CB5 STA MXUSR ENDIF ;CPM2 ; 0310 3E02 MVI A,MAXDRV ;RESET MAX DRIVE # 0312 320DB5 STA MXDRV ; IF TIMEOUT 0315 3E05 MVI A,TOVALUE ;RESET TIMEOUT COUNT 0317 320EB5 STA TOVAL ENDIF ;TIMEOUT ; 031A 3E05 MVI A,5 ;ASSUME THIS MANY NULLS 031C 320FB5 STA NULLS ; IN CASE ERROR ; IF NOT OXGATE ; GETNULL EQU $+OFFSET ; CALL ILPRT ;PRINT THIS MSG: DB CR,LF DB 'HOW MANY NULLS (0-9) DO YOU NEED? ',0 CALL MINPUT ;GET VALUE MOV C,A ;TO C FOR MOUTPUT CALL MOUTPUT ;ECHO CHAR MOV A,C ;RESTORE VALUE CPI '0' JC GETNULL ;BAD, RETRY CPI '9'+1 CP/M MACRO ASSEM 2.0 #034 BYE V7.9 AS OF 04/12/82 JNC GETNULL ;BAD SUI '0' ;MAKE BINARY STA NULLS ;SAVE COUNT ; ENDIF ;NOT OXGATE ; IF TRAPLC AND NOT OXGATE GETULC EQU $+OFFSET CALL ILPRT ;PRINT THIS MSG: DB CR,LF DB 'CAN YOUR TERMINAL DISPLAY LOWER CASE? ',0 MVI A,20H ;FORCE CASE CONVERSION FOR NOW STA ULCSW CALL MINPUT ;GET Y OR NO MOV C,A CALL MOUTPUT ;ECHO MOV A,C CPI 'N' JZ DONEOPT ;WE'RE ALREADY SET UP FOR NO LWR CASE CPI 'Y' JNZ GETULC ;WASN'T Y OR N...GO ASK AGAIN XRA A STA ULCSW ;SET FLAG FOR NO CONVERSION ; DONEOPT EQU $+OFFSET ENDIF ;TRAPLC AND NOT OXGATE ; 031F CD6BB9 CALL ILPRT 0322 0D0A00 DB CR,LF,0 ;PRINT THE WELCOME FILE 0325 2109BA LXI H,WELFILN ;SOURCE 0328 115C00 LXI D,FCB ;DESTINATION 032B 060D MVI B,13 ;LENGTH 032D CD39B8 CALL MOVE ;MOVE THE NAME ;SET DMA ADDRESS TO 80H 0330 118000 LXI D,80H 0333 0E1A MVI C,STDMA 0335 CD0500 CALL BDOS ; IF CPM2 ;SET USER NUMBER FOR WELCOME FILE 0338 0E20 MVI C,32 033A 1E0E MVI E,WELUSR 033C CD0500 CALL BDOS ENDIF ;CPM2 ; ;OPEN THE WELCOME FILE 033F 115C00 LXI D,FCB 0342 0E0F MVI C,OPEN 0344 CD0500 CALL BDOS ;DID IT EXIST? 0347 3C INR A ;A=> 0 MEANS "NO" 0348 CA34B7 JZ PASSINT ;NO WELCOME FILE ;GOT A FILE, TYPE IT 034B AF XRA A ;GET 0 034C 327C00 STA FCBRNO ;ZERO RECORD # CP/M MACRO ASSEM 2.0 #035 BYE V7.9 AS OF 04/12/82 034F 210001 LXI H,100H ;GET INITIAL BUFF POINTER ; ;TYPE THE WELCOME FILE B719 = WELTYLP EQU $+OFFSET 0352 CD71B8 CALL RDBYTE ;GET A BYTE 0355 FE1A CPI 1AH ;EOF? 0357 CA34B7 JZ PASSINT ;YES, DONE 035A 4F MOV C,A ;SETUP FOR TYPE 035B CD0DB9 CALL MOUTPUT ;TYPE THE CHAR 035E CD88B8 CALL MSTAT ;CHECK FOR.. 0361 B7 ORA A ;CHAR TYPED? 0362 CA19B7 JZ WELTYLP ;..NO, LOOP 0365 CDA4B8 CALL MINPUT ;..YES, GET CHAR 0368 FE03 CPI 'C'-40H ;CTL-C? 036A C219B7 JNZ WELTYLP ;..NO, LOOP UNTIL EOF ; ;GET THE PASSWORD ; B734 = PASSINT EQU $+OFFSET ; IF PWRQD AND IMSAI AND SELPASS IN SENSE ;TURN THE SWITCH UP.. ANI PWDSW ;..TO REQUIRE THE PASSWORD JZ NOPASS ENDIF ;PWRQD AND IMSAI AND SELPASS ; IF PWRQD MVI D,5 ;5 TRIES AT PASSWORD ; PASSINP EQU $+OFFSET CALL ILPRT DB CR,LF,'Enter password: ',0 LXI H,PASSWD ;POINT TO PASSWORD MVI E,0 ;NO MISSED LETTERS IN DPORT ;CLEAR OUT GARBAGE ; PWMLP EQU $+OFFSET CALL MINPUT ;GET A CHAR CPI 60H ;LOWER CASE? JC NOTLC ;NO, ANI 5FH ;MAKE UPPER CASE ALPHA ; NOTLC EQU $+OFFSET ENDIF ;PWRQD IF DUAL$IO AND PWRQD PUSH PSW ;SAVE CHAR INPUT CPI 20H ;IS CHAR CONTROL? JNC PWDIS ;PASS IF DISPLAYABLE MVI C,'^' ;IF CONTROL, CALL CONOUT ; MAP TO UP-ARROW, POP PSW ; THEN DISPLAYABLE PUSH PSW ADI 40H PWDIS EQU $+OFFSET MOV C,A CP/M MACRO ASSEM 2.0 #036 BYE V7.9 AS OF 04/12/82 CALL CONOUT ;OUTPUT CHAR LOCALLY POP PSW ;RESTORE TO ACC ENDIF ;DUAL$IO AND PWRQD IF PWRQD CPI 'U'-40H ;CTL-U? JZ PASSINP ;YES, RE-GET IT CMP M ;MATCH PASSWORD? JZ PWMAT ;..YES MVI E,1 ;..NO, SHOW MISS CPI CR ;C/R? JNZ PWMLP ;..NO, WAIT FOR C/R ; ;PASSWORD DIDN'T MATCH ; PWNMAT EQU $+OFFSET CALL ILPRT DB 'Incorrect',CR,LF,0 DCR D ;MORE TRIES? JNZ PASSINP ;YES JMP BADPASS ;NO, GO HANG UP ; ;CHARACTER MATCHED IN PASSWORD ; PWMAT EQU $+OFFSET INX H ;TO NEXT CHAR CPI CR ;END? JNZ PWMLP ;..NO, LOOP ;END OF PASSWORD. ANY MISSED CHARS? MOV A,E ;GET FLAG ORA A JNZ PWNMAT ;NOT RIGHT ;PASSWORD CORRECT ENDIF ;PWRQD ; B734 = NOPASS EQU $+OFFSET ; IF RTC CALL ILPRT DB CR,LF,CR,LF,'On at ',0 CALL TIME CALL ILPRT DB CR,LF,0 ENDIF ;RTC ; ; IF USRLOG ;COUNT # OF SUCCESSFUL LOGONS 036D 2156BA LXI H,NEWUSR ;GET LAST VALUE 0370 CD91B6 CALL BOPLOG ;CALL ROUTINE TO ADD ONE ENDIF ;USRLOG ; IF IMSAI AND USRLOG LDA NEWUSR ;RE-GET LOW ORDER VALUE CMA ;INVERT FOR LIGHTS OUT SENSE ;DISPLAY ON IMSAI FRONT PANEL ENDIF ;IMSAI AND USRLOG CP/M MACRO ASSEM 2.0 #037 BYE V7.9 AS OF 04/12/82 ; IF BOOTMSG ; CALL ILPRT DB CR,LF DB 'Please Wait... ' ;BOOT MSG HERE DB 0 ENDIF ;BOOTMSG ; IF COMFILE AND CPM2 MVI C,32 MVI E,COMUSR ;SWITCH TO COM FILE USER # CALL BDOS ENDIF ;COMFILE AND CPM2 ; ; IF COMFILE MVI A,20H ;FOOL THE SYSTEM STA FCB+1 ;SO THAT COM FILE WILL SEE ;20H AT FCB+1 FOR DEFAULT PURPOSES. LDA OPTION CPI 'A' ;SYSOP CAN BYPASS COM FILE BY.. JZ 0 ;..TYPING "BYE /A" CPI 'C' ;OPER CAN ALSO GO TO COM.. JNZ RUNCOM ;..FILE LOAD WITH "BYE /C" CALL ILPRT ;PRINT THIS MESSAGE:' DB 'Loading system...',CR,LF,0 CALL LODCOM RUNCOM EQU $+OFFSET ;EVERYONE ELSE GETS COM FILE CALL 100H ENDIF ;COMFILE ; 0373 C30000 JMP 0 ;WARM BOOT NOW FOR "NORMAL" CP/M USE ; ;TSTBAUD ATTEMPTS TO READ A LF OR CR, RETURNS WITH ;ZERO FLAG IF THE CHARACTER READ IS ONE OF THESE TWO. ; B73D = TSTBAUD EQU $+OFFSET 0376 CDA4B8 CALL MINPUT ;GET CHARACTER FROM MODEM 0379 FE0D CPI CR ;IF A CARRIAGE RETURN... 037B C8 RZ ;.. RETURN 037C FE0A CPI LF ;IF A LINEFEED... 037E C8 RZ 037F FE03 CPI 'C'-40H ;IF A CONTROL C 0381 C9 RET ;RET ZERO FLAG, ELSE NOT ZERO ; ;**************SET WD8250 BAUD RATE************************ ; IF WD8250 ; SETBAUD: EQU $+OFFSET MVI A,83H ;SET DLAB OUT LPORT MOV A,E ;GET LSB OUT DPORT MOV A,D ;GET MSB CP/M MACRO ASSEM 2.0 #038 BYE V7.9 AS OF 04/12/82 OUT DPORT+1 CPI 04H ;110? JNZ ONESTOP MVI A,LCWLS0+LCWLS1+LCSTB ;8 DATA 2 STOP BITS OUT LPORT JMP DLOOP ONESTOP: EQU $+OFFSET MVI A,LCWLS0+LCWLS1 OUT LPORT DLOOP: EQU $+OFFSET XCHG ;PUT DIVISOR IN HL DAD H!DAD H!DAD H!DAD H ;MULTIPLY BY 16 ;SO WE DELAY APPROX 2 CHARS TIMES DLOOP1: EQU $+OFFSET DCX H MOV A,L ORA H JNZ DLOOP1 XCHG IN DPORT IN DPORT RET ; ENDIF ;WD8250 ; ;LOSS OF CONNECTION TEST ; IF DCHAYES ;THIS IS THE TEST FOR THE FIRST WAIT FOR A CARRIER. ;IT IS ONLY USED IN THE DCHAYES. B749 = FRSTCAR EQU $+OFFSET 0382 DB81 IN STATUS ;GET MODEM STATUS 0384 E640 ANI CD ;GET A CARRIER? 0386 C274B7 JNZ CARCK2 ;YES, GO ON WITH THE TESTS 0389 C5 PUSH B ;PRESERVE B SO WE CAN USE IT 038A 0650 MVI B,CWAIT*10 ;WAIT CWAIT SECONDS 038C C360B7 JMP CARLP ;JUMP TO THE TESTING LOOP ENDIF ;DCHAYES ; B756 = CARCK EQU $+OFFSET IF DCHAYES ; ;THE DC HAYES HAS A HARDWARE HANGUP FEATURE, BUT WE WON'T USE IT. ;INSTEAD, IF WE DETECT THAT THERE IS NO CARRIER UPON ENTRY TO ;THIS ROUTINE, WE'LL KEEP CHECKING FOR CWAIT OR CLOSS SECONDS TO SEE IF THE ;CARRIER RETURNS. IF SO, WE'LL JUST CONTINUE ON. IF NOT, WE'LL ;SIGNAL THIS BY SETTING THE CARRY FLAG. ; 038F DB81 IN STATUS ;GET MODEM STATUS 0391 E640 ANI CD ;GOT A CARRIER? 0393 C274B7 JNZ CARCK2 ;YES, GO ON WITH TESTS 0396 C5 PUSH B ;PRESERVE SO WE CAN USE IT 0397 0632 MVI B,CLOSS*10 ;SET FOR CLOSS SECONDS ; B760 = CARLP EQU $+OFFSET 0399 CDFCB7 CALL DELAY ;WAIT .1 SECONDS CP/M MACRO ASSEM 2.0 #039 BYE V7.9 AS OF 04/12/82 039C DB81 IN STATUS ;GET MODEM STATUS 039E E640 ANI CD ;HAS CARRIER RETURNED? 03A0 78 MOV A,B ;PRESERVE COUNTDOWN VALUE 03A1 C1 POP B ;FIX STACK IN CASE ALL IS OK 03A2 C274B7 JNZ CARCK2 ;GOT CARRIER, CONTINUE ON 03A5 3D DCR A ;COUNT TIME DOWN 03A6 37 STC ;IN CASE THIS IS THE END OF TIME 03A7 C8 RZ ;RETURN IF TIMED OUT 03A8 C5 PUSH B ;PRESERVE B 03A9 47 MOV B,A ;GET COUNTER VALUE IN B 03AA C360B7 JMP CARLP ;KEEP CHECKING ENDIF ;DCHAYES ; ; CARRIER CHECK FOR MMII ; IF MMII LDA RPORT1 ;GET MODEM STATUS ANI P2CTS ;GOT A CARRIER? JZ CARCK2 ;YES, GO ON WITH TESTS PUSH B ;PRESERVE SO WE CAN USE IT MVI B,150 ;SET FOR CLOSS SECONDS ; CARLP EQU $+OFFSET CALL DELAY ;WAIT .1 SECONDS LDA RPORT1 ;GET MODEM STATUS ANI P2CTS ;HAS CARRIER RETURNED? MOV A,B ;PRESERVE COUNTDOWN VALUE POP B ;FIX STACK IN CASE ALL IS OK JZ CARCK2 ;GOT CARRIER, CONTINUE ON DCR A ;COUNT TIME DOWN STC ;IN CASE THIS IS THE END OF TIME RZ ;RETURN IF TIMED OUT PUSH B ;PRESERVE B MOV B,A ;GET COUNTER VALUE IN B JMP CARLP ;KEEP CHECKING ENDIF ;MMII ; ; ;THE SMARTMODEM HANGS UP IMMEDIATELY, WE JUST HAVE TO TELL THE ;COMPUTER IT IS OK. ; IF SMODEM AND PORTED IN MSPORT ;INPUT MODEM STATUS ENDIF ; IF SMODEM AND NOT PORTED LDA MSPORT ;INPUT MODEM STATUS ENDIF ; IF SMODEM ANI P2CTS ;CARRIER? JNZ CARCK2 ;YES, DO OTHER CHECKS STC ;NO, SET CARRY AND RETURN RET ENDIF ;SMODEM ; CP/M MACRO ASSEM 2.0 #040 BYE V7.9 AS OF 04/12/82 IF PMMI ; ;THE PMMI MODEM AUTOMATICALLY HANGS UP THE PHONE AFTER ;15 SECONDS OF LOSS OF CARRIER, PROVIDING YOU OUTPUT TO ;PORT 0 TO ALLOW IT (WHICH THIS PROGRAM DOES). ; ;..SO, THIS ROUTINE FIRST CHECKS IF THE MODEM HAS HUNG UP, ;AND IF SO, RETURNS WITH CARRY SET. IF NOT, IT CHECKS FOR ;CARRIER AND RETURNS IF CARRIER IS ON; OTHERWISE WAITS FOR ;CARRIER WHILE STILL TESTING FOR DISCONNECT. ; ;IT TESTS THE PMMI "CTS" (CLEAR TO SEND) BIT ;WHICH IS 0 WHEN THERE IS CARRIER ; IN RPORT ;GET STATUS ANI P2CONN ;CONNECTED? STC ;(IN CASE NOT) RNZ ;HUNG UP. ;STILL CONNECTED, CHECK FOR CARRIER IN RPORT ;LOOK AT STATUS ANI P2CTS ;GET CARRIER DETECT BIT JZ CARCK2 ;CONTINUE W/TESTS ;LOOP UNTIL EITHER CONNECTION LOST, OR CARRIER RETURNS JMP CARCK ENDIF ;PMMI ; IF IN8251 ; ;RACAL-VADIC MODEM AUTOMATICALLY HANGS UP PHONE 1 SECOND ;AFTER CARRIER LOSS. ; IN SPORT ;GET STATUS ANI DSR ;CHECK IF CARRIER ON JNZ CARCK2 ;YES, CONTINUE ON STC ;SET CARRY BIT FOR NO CARRIER RET ENDIF ;IN8251 ; IF WD8250 ;THE WD8250 HAS HARDWARE HANGUP. BUT WE WILL USE CARRIER DETECT ;ROUTINE TO DETERMINE CARRIER LOSS AFTER 15 SECONDS....... ; IN MSPORT ;GET MODEM STATUS ANI P2CTS ;GOT A CARRIER JNZ CARCK2 ;YES, GO ON WITH TESTS PUSH B ;PRESERVE SO WE CAN USE IT MVI B,150 ;SET FOR 15 SECONDS ; CARLP EQU $+OFFSET ; CALL DELAY ;WAIT .1 SECOND IN MSPORT ;GET MODEM STATUS ANI P2CTS ;HAS CARRIER RETURNED ? MOV A,B ;PRESERVE COUNT DOWN VALUE POP B ;FIX STACK IF ALL IS OK JNZ CARCK2 ;HAVE CARRIER - CONTINUE CP/M MACRO ASSEM 2.0 #041 BYE V7.9 AS OF 04/12/82 DCR A ;COUNT DOWN TIME STC ;IN CASE THIS IS THE END OF TIME RZ ;RETURN IF TIMED OUT PUSH B ;PRESERVE B MOV B,A ;GET COUNTER VALUE IN B JMP CARLP ;CONTINUE - KEEP CHECKING ENDIF ;WD8250 ;NOW TEST DRIVE #'S AND (IF CP/M 2.X) USER #'S TO ;INSURE THAT MAXIMUMS ARE NOT EXCEEDED. ; B774 = CARCK2 EQU $+OFFSET 03AD 3A0400 LDA 4 ;CHECK DISK/USER # 03B0 E60F ANI 0FH ;ISOLATE DRIVE 03B2 E5 PUSH H ;SAVE HL 03B3 210DB5 LXI H,MXDRV ;PT TO ALLOWED # DRIVES 03B6 BE CMP M ;VALID DRIVE? 03B7 DAB0B7 JC CARCK3 ;YES, SKIP THIS JUNK 03BA 3A0400 LDA 4 ;GET WHOLE LOGIN BYTE 03BD E6F0 ANI 0F0H ;RETAIN USER # & FORCE DRIVE TO A 03BF 320400 STA 4 ;UPDATE LOGIN BYTE 03C2 CD6BB9 CALL ILPRT ;TELL USER WHAT HE DID 03C5 5B496E7661 DB '[Invalid drive, returning to A:]',0 03E6 C30000 JMP 0 ;WARM BOOT ; B7B0 = CARCK3 EQU $+OFFSET ; IF CPM2 03E9 3A0400 LDA 4 ;GET LOGIN BYTE 03EC E6F0 ANI 0F0H ;ISOLATE USER # 03EE 0F RRC ;MOVE TO LOW BITS 03EF 0F RRC 03F0 0F RRC 03F1 0F RRC 03F2 210CB5 LXI H,MXUSR ;PT TO MAX USER # 03F5 BE CMP M ;VALID USER #? 03F6 DAF9B7 JC CARCK4 ;YES, DON'T CHANGE 03F9 CAF9B7 JZ CARCK4 03FC 3A0400 LDA 4 ;GET LOGIN BYTE AGAIN 03FF E60F ANI 0FH ;KEEP DRIVE, ZERO USER 0401 320400 STA 4 ;UPDATE LOGIN BYTE 0404 CD6BB9 CALL ILPRT ;TELL HIM WHAT HAPPENED 0407 3E205B496E DB '> [Invalid user number, returning to 0]',0 042F C30000 JMP 0 ;WARM BOOT ENDIF ;CPM2 ; B7F9 = CARCK4 EQU $+OFFSET 0432 E1 POP H ;RESTORE HL 0433 B7 ORA A 0434 C9 RET ; ;.1 SEC DELAY ROUTINE ; B7FC = DELAY EQU $+OFFSET 0435 C5 PUSH B ; CP/M MACRO ASSEM 2.0 #042 BYE V7.9 AS OF 04/12/82 0436 011C41 LXI B,4167*SPEED ;TIMING CONSTANT X CLOCK MHZ ; B800 = DELAY1 EQU $+OFFSET 0439 0B DCX B 043A 78 MOV A,B 043B B1 ORA C 043C C200B8 JNZ DELAY1 043F C1 POP B 0440 C9 RET ; ;50 MS DELAY ROUTINE ; B808 = KDELAY EQU $+OFFSET 0441 C5 PUSH B ; 0442 018C20 LXI B,2083*SPEED 0445 C300B8 JMP DELAY1 ; ;PATCH IN THE NEW JMP TABLE (SAVING THE OLD) ; B80F = PATCH EQU $+OFFSET 0448 CD30B8 CALL TBLADDR ;CALC HL= CP/M JMP TABLE 044B 113CBA LXI D,VCOLDBT ;POINT TO SAVE LOCATION 044E 0618 MVI B,24 ;SAVE ALL VECTORS 0450 CD39B8 CALL MOVE ;MOVE IT ;NOW MOVE NEW JMP TABLE TO CP/M 0453 CD30B8 CALL TBLADDR ;CALC HL=CP/M'S JMP TABLE 0456 EB XCHG ;MOVE TO DE 0457 21F7B9 LXI H,NEWJTBL ;POINT TO NEW 045A CD39B8 CALL MOVE ;MOVE IT ; IF IN8251 AND LOSER LXI H,NWBCALL ;POINT TO NEW CALL SHLD WBCALL+1 ;MODIFY CALL IN BIOS ENDIF ;IN8251 ; 045D C9 RET ; B825 = UNPATCH EQU $+OFFSET 045E CD30B8 CALL TBLADDR ;HL=CP/M'S JMP TABLE 0461 EB XCHG ;MOVE TO DE 0462 213CBA LXI H,VCOLDBT ;GET SAVED TABLE 0465 CD39B8 CALL MOVE ;MOVE ORIG BACK ; IF LOSER LXI H,WMSTRT ;LOAD OLD CALL LOCATION SHLD WBCALL+1 ;RESTORE OLD CALL ENDIF ;LOSER ; 0468 C9 RET ; ;CALCULATE HL=CP/M'S JUMP TABLE, B=LENGTH ; B830 = TBLADDR EQU $+OFFSET 0469 2A0100 LHLD 1 ;GET BIOS POINTER 046C 2B DCX H ;..SKIP CP/M MACRO ASSEM 2.0 #043 BYE V7.9 AS OF 04/12/82 046D 2B DCX H ;..TO 046E 2B DCX H ;..COLD BOOT ; IF (NOT PRINTER) AND (NOT ALLDEV) MVI B,18 ;BYTES TO MOVE ENDIF ;NOT PRINTER AND NOT ALLDEV ; IF PRINTER ;RETAIN LIST DEVICE? 046F 060F MVI B,15 ;DON'T MOVE LISTER JUMP ENDIF ;PRINTER ; IF ALLDEV ;THIS PATCHES ALL DEVICES TO PHONE MVI B,24 ;MOVE ALL JUMPS ENDIF ;ALLDEV 0471 C9 RET ; ;MOVE (HL) TO (DE), LENGTH IN (B) ; B839 = MOVE EQU $+OFFSET 0472 7E MOV A,M ;GET A BYTE 0473 12 STAX D ;PUT AT NEW HOME 0474 13 INX D ;BUMP POINTERS 0475 23 INX H 0476 05 DCR B ;DEC BYTE COUNT 0477 C239B8 JNZ MOVE ;IF MORE, DO IT 047A C9 RET ;IF NOT,RETURN ; IF LOSER NWBCALL EQU $+OFFSET CALL WMSTRT ;WARM BOOT DISK READ CALL PATCH ;FIX BIOS AGAIN AFTER WMSTRT RET ENDIF ;LOSER ; ;COMMON ROUTINE TO CHECK FOR CARRIER LOST, CALLED FROM CONSOLE OUT ; B842 = CHECK EQU $+OFFSET ; IF MINICK ; LDA IOBYTE ;GET IOBYTE ANI 80H ;TEST FOR DISK UPDATE RTN ;BUSY WAIT UNTIL DONE ; ENDIF ;MINICK ; IF RBBSCK ; LDA WRTLOC ;GET WRITE IN PROGRESS FLAG ORA A RNZ ;BUSY WAIT UNTIL DONE ; ENDIF ;RBBSCK ; 047B CD56B7 CALL CARCK ;SEE IF CARRIER STILL ON CP/M MACRO ASSEM 2.0 #044 BYE V7.9 AS OF 04/12/82 047E D0 RNC ;ALL OK ; ;CARRIER IS LOST. TYPE MESSAGE SO LOCAL CONSOLE SHOWS THE REASON ; B846 = BADPASS EQU $+OFFSET ;COME HERE ON BAD PASSWORD 047F 3E01 MVI A,1 ;SHOW CARRIER LOST SO 0481 323BBA STA LOSTFLG ;..WE WON'T CK AGAIN 0484 3196BA LXI SP,STACK ;ENSURE VALID STACK 0487 CD6BB9 CALL ILPRT 048A 0D0A DB CR,LF 048C 5B43617272 DB '[Carrier Lost]' 049A 0D0A202020 DB CR,LF,' ',0 B867 = DROPCAR EQU $+OFFSET 04A0 CD25B8 CALL UNPATCH ;RESTORE ORIG BIOS JMP TBL 04A3 AF XRA A ;CLEAR OUT CARRIER.. 04A4 323BBA STA LOSTFLG ;..LOST FLAG 04A7 C38DB5 JMP HANGUP ; ;READBYTE ROUTINE - USED TO READ THE WELCOME FILE ; B871 = RDBYTE EQU $+OFFSET 04AA 7C MOV A,H ;TIME TO READ? 04AB B7 ORA A ;..IF AT 100H 04AC CA85B8 JZ NORD ;NO READ REQ'D ;HAVE TO READ A SECTOR 04AF 115C00 LXI D,FCB 04B2 0E14 MVI C,READ 04B4 CD0500 CALL BDOS 04B7 B7 ORA A ;OK? 04B8 3E1A MVI A,1AH ;FAKE UP EOF 04BA C0 RNZ ;RET EOF IF BAD 04BB 218000 LXI H,80H ; B885 = NORD EQU $+OFFSET 04BE 7E MOV A,M ;GET CHAR 04BF 23 INX H ;TO NEXT 04C0 C9 RET ; ;KEYBOARD/MODEM STATUS TEST ROUTINE ; B888 = MSTAT EQU $+OFFSET ; 04C1 CD42B8 CALL CHECK ;CHECK FOR CARRIER LOST ; IF DUAL$IO ;WANT LOCAL CONSOLE? 04C4 CD7AB9 CALL CONSTAT ;GET LOCAL STATUS 04C7 B7 ORA A 04C8 C0 RNZ ;RET IF LOCAL CHAR ENDIF ;DUAL$IO ; IF DCHAYES 04C9 DB81 IN STATUS ;GET MODEM STATUS 04CB E601 ANI RRF ;GOT A CHARACTER? 04CD C8 RZ ;RETURN IF NOT 04CE DB81 IN STATUS ;GET MODEM STATUS 04D0 E618 ANI FE+OE ;CHECK FOR FRAMING AND OVERRUN ERROR CP/M MACRO ASSEM 2.0 #045 BYE V7.9 AS OF 04/12/82 04D2 CAA0B8 JZ MSTAT1 ;NO ERROR, CHARACTER IS VALID 04D5 DB80 IN DATA ;SWALLOW CHARACTER (ALSO CLEAR OE & FE) 04D7 AF XRA A ;RETURN FALSE 04D8 C9 RET ENDIF ;DCHAYES ; IF MMII LDA TPORT ;GET STATUS ANI P0DAV ;DATA AVAILABLE? RZ ;NOPE LDA TPORT ;CHECK AGAIN ANI 30H ;CHECK FRAMING AND OVERRUN JZ MSTAT1 ;NO ERRORS LDA DPORT ;SWALLOW CHARACTER XRA A ;RETURN FALSE RET ENDIF ;MMII ; IF SMODEM AND PORTED IN MSPORT ;GET STATUS ENDIF ; IF SMODEM AND NOT PORTED LDA MSPORT ;GET STATUS ENDIF ; IF SMODEM ANI P0DAV ;DATA AVAILABLE? RZ ;RETURN IF NOT READY JMP MSTAT1 ;CONTINUE ENDIF ;SMODEM ; IF PMMI IN TPORT ;GET STATUS ANI P0DAV ;DATA AVAILABLE? RZ ;RETURN IF NOT READY IN TPORT ;GET STATUS ANI 30H ;CHECK FRAMING AND OVERRUN BITS JZ MSTAT1 ;NO ERRORS...LEGIT CHARACTER IN DPORT ;SWALLOW CHARACTER (CLEARS PODAV) XRA A ;RETURN FALSE RET ENDIF ;PMMI ; IF IN8251 IN SPORT ;GET STATUS ANI RCVRDY ;GOT A CHARACTER RZ ;RETURN IF NOT IN SPORT ;GET STATUS ANI TOERR ;CHECK FOR PARITY, FRAMING AND OVERRUN ERRORS JZ MSTAT1 ;NO ERRORS MVI A,ONINS ;RESET ERROR FLAGS OUT CPORT XRA A ;RETURN FALSE RET ENDIF ;IN8251 CP/M MACRO ASSEM 2.0 #046 BYE V7.9 AS OF 04/12/82 ; IF WD8250 IN SPORT ;GET STATUS ANI P0DAV ;DATA AVAILABLE RZ ;RTN IF NOT RDY IN SPORT ;GET STATUS ANI 0EH ;CHECK PAR, FRAM ERR AND OVRN BITS JZ MSTAT1 IN DPORT XRA A ;RTN FALSE RET ENDIF ;WD8250 ; B8A0 = MSTAT1 EQU $+OFFSET 04D9 3EFF MVI A,0FFH ;SHOW READY 04DB B7 ORA A 04DC C9 RET ; ;MODEM INPUT FUNCTION, CHECKS LOCAL CONSOLE FIRST ; B8A4 = MINPUT EQU $+OFFSET ; IF TIMEOUT 04DD 3A0EB5 LDA TOVAL ;GET # MINUTES BEFORE TIMEOUT ; B8A7 = MINPUT0 EQU $+OFFSET 04E0 3238BA STA TOCNTM ;SET MINUTES COUNTER 04E3 E5 PUSH H 04E4 21B004 LXI H,MINUTES ;INIT ONE MINUTE TIMEOUT COUNTER 04E7 2239BA SHLD TOCNT 04EA E1 POP H ENDIF ;TIMEOUT ; B8B2 = MINPUT1 EQU $+OFFSET 04EB 3A3BBA LDA LOSTFLG ;KNOWN LOSS.. 04EE B7 ORA A ;..OF CARRIER? 04EF CC42B8 CZ CHECK ;CARRIER STILL ON? 04F2 CD88B8 CALL MSTAT ;ANYTHING? 04F5 B7 ORA A ; IF NOT TIMEOUT JZ MINPUT ;LOOP TILL CHAR RCD ENDIF ;NOT TIMEOUT ; IF TIMEOUT 04F6 C2F2B8 JNZ MINPUT2 04F9 CD08B8 CALL KDELAY ;KILL 50 MS 04FC E5 PUSH H 04FD 2A39BA LHLD TOCNT ;KNOCK DOWN TIMEOUT COUNTER 0500 2B DCX H 0501 2239BA SHLD TOCNT 0504 7C MOV A,H 0505 B5 ORA L 0506 E1 POP H 0507 C2B2B8 JNZ MINPUT1 ;STILL TIME LEFT..KEEP TRYING 050A 3A38BA LDA TOCNTM ;COUNT OFF LAST MINUTE CP/M MACRO ASSEM 2.0 #047 BYE V7.9 AS OF 04/12/82 050D 3D DCR A 050E C2A7B8 JNZ MINPUT0 ;GO BACK IF TIME LEFT 0511 CD6BB9 CALL ILPRT 0514 5B496E7075 DB '[Input timed out]',7,7,0 0528 C363B5 JMP NOSLASH ENDIF ;TIMEOUT ; B8F2 = MINPUT2 EQU $+OFFSET ; IF DUAL$IO ;BOTH LOCAL AND REMOTE 052B CD7AB9 CALL CONSTAT ;CHECK LOCAL CONSOLE 052E B7 ORA A ;CHAR? 052F C284B9 JNZ CONIN ;..YES, READ IT, RET. ENDIF ; ;LOCAL CONSOLE WASN'T READY, SO READ MODEM ; IF PORTED 0532 DB80 IN DPORT ;GET DATA BYTE ENDIF ; IF NOT PORTED LDA DPORT ENDIF ; 0534 E67F ANI 7FH ;DELETE PARITY 0536 CAA4B8 JZ MINPUT ;IGNORE NULLS ; IF IMSAI AND HARDLOG PUSH B MOV B,A IN SENSE ANI LOGSW MOV A,B POP B JZ NOLOG ENDIF ;IMSAI AND HARDLOG ; IF HARDLOG AND (NOT IMSAI) PUSH B MOV B,A ;PUT A COPY IN B LDA HARDON ;IF HARDON = 0 THEN TURN HARDLOG OFF (SO SYSOP ORA A ; DOESN'T USE UP A LOT OF PAPER WHILE MOV A,B ; PLAYING ZORK (FOO)) POP B JZ NOLOG ENDIF ; IF HARDLOG CPI 20H JNC MINPUT3 CPI CR JNZ NOLOG ; MINPUT3 EQU $+OFFSET CALL LISTOUT ;ECHO ON PRINTER CP/M MACRO ASSEM 2.0 #048 BYE V7.9 AS OF 04/12/82 CPI CR JNZ NOLOG ;CR NEEDS LINEFEED MVI A,LF CALL LISTOUT ;SO SEND IT MVI A,CR ;GET BACK CR ENDIF ;END OF HARDLOG ; B900 = NOLOG EQU $+OFFSET ; 0539 FE03 CPI 3 ;IS IT CONTROL-C? 053B C0 RNZ ;NO, PASS IT THRU 053C 3A0000 LDA 0 ;SEE IF WARM BOOT DISABLED 053F FEC3 CPI 0C3H ;JMP MEANS WARM BOOT OK 0541 3E03 MVI A,3 ;SO RETURN CONTROL-C 0543 C8 RZ 0544 AF XRA A ;ELSE CONVERT TO NULL 0545 C9 RET ; ;MODEM OUTPUT FUNCTION ; B90D = MOUTPUT EQU $+OFFSET ; ;IF WE ALREADY KNOW CARRIER IS LOST, DON'T CHECK ;FOR IT AGAIN OR LOOP TRYING TO OUTPUT. ; 0546 3A3BBA LDA LOSTFLG ;KNOWN LOSS OF CARRIER? 0549 B7 ORA A 054A C244B9 JNZ SILENT ;AVOID LOOP IN CASE CARRIER LOST 054D CD42B8 CALL CHECK ;CARRIER STILL ON? ; IF DCHAYES 0550 DB81 IN STATUS ;GET MODEM STATUS 0552 E602 ANI TRE ;TRANSMIT BUFFER EMPTY? ENDIF ;DCHAYES ; IF MMII LDA TPORT ;GET MODEM STATUS AU1P0TBMT ENDIF ;MMII ; IF SMODEM AND PORTED IN MSPORT ANI P0TBMT ENDIF ; IF SMODEM AND NOT PORTED LDA MSPORT ANI P0TBMT ENDIF ; IF PMMI IN TPORT ;GET MODEM STATUS ANI P0TBMT ;TRANSMIT BUFFER EMPTY? ENDIF ;PMMI ; IF IN8251 CP/M MACRO ASSEM 2.0 #049 BYE V7.9 AS OF 04/12/82 IN SPORT ;GET MODEM STATUS ANI TRNRDY ;TRANSMIT BUFFER EMPTY? ENDIF ;IN8251 ; IF WD8250 IN SPORT ANI P0TBMT ENDIF ;WD8250 ; 0554 CA0DB9 JZ MOUTPUT ;LOOP IF NOT READY ; IF IMSAI AND BLKOUT AND DUAL$IO IN SENSE ;FLIP SWITCH UP... ANI BLACKSW ;..TO BLIND REMOTE USER JNZ SILENT ENDIF ;IMSAI AND BLKOUT AND DUAL$IO ; 0557 79 MOV A,C ;GET CHAR 0558 E67F ANI 7FH ;STRIP PARITY BIT ; IF TRAPLC 055A FE60 CPI 60H ;CHECK FOR LOWER CASE 055C DA32B9 JC MOUTP2 ;SKIP IF NOT LC 055F FE7F CPI 7FH ;CHECK FOR RUBOUT 0561 CA32B9 JZ MOUTP2 0564 E5 PUSH H 0565 2110B5 LXI H,ULCSW ;SUBTRACT EITHER 20H OR 0 0568 96 SUB M 0569 E1 POP H 056A 4F MOV C,A ;FORCE ON LOCAL AS WELL AS REMOTE ; B932 = MOUTP2 EQU $+OFFSET ENDIF ;TRAPLC ; IF OXGATE 056B FE0A CPI LF ;WE HAVE A TOGGLE FOR LINE FEEDS 056D C242B9 JNZ MOUTP3 ;NOPE, NOT A LF 0570 3A11B5 LDA LFEEDS ;YES, SEE IF WE CAN SEND IT... 0573 B7 ORA A ;SET FLAGS 0574 3E00 MVI A,0 ;PREPARE A WITH A NULL 0576 C242B9 JNZ MOUTP3 ;NOPE, DON'T (INSTEAD SEND A NULL) 0579 3E0A MVI A,LF ;YES, SEND THE LINE FEED B942 = MOUTP3 EQU $+OFFSET ENDIF ;OXGATE ; IF NOT PORTED STA DPORT ;OUTPUT TO MODEM ENDIF ; IF PORTED 057B D380 OUT DPORT ;OUTPUT TO MODEM ENDIF ; B944 = SILENT EQU $+OFFSET ; IF DUAL$IO ;TO LOCAL ALSO? CP/M MACRO ASSEM 2.0 #050 BYE V7.9 AS OF 04/12/82 057D F5 PUSH PSW ;SAVE CHAR 057E CDE0B9 CALL CONOUT ;SEND TO REGULAR BIOS 0581 F1 POP PSW ;GET CHAR AGAIN ENDIF ;DUAL$IO ; ;CHECK FOR NULLS 0582 FE0A CPI LF ;TIME FOR NULLS? 0584 C0 RNZ ;NO, RETURN ;SEND NULLS IF REQUIRED 0585 3A0FB5 LDA NULLS ;GET COUNT 0588 B7 ORA A ;ANY? 0589 C8 RZ ;..NO 058A C5 PUSH B 058B 47 MOV B,A ;SAVE COUNT 058C 0E00 MVI C,0 ;0 IS A NULL ; B955 = NULLP EQU $+OFFSET 058E CD0DB9 CALL MOUTPUT ;TYPE A NULL 0591 05 DCR B ;MORE? 0592 C255B9 JNZ NULLP ;..YES, LOOP 0595 C1 POP B 0596 0E0A MVI C,LF ;RESTORE LF 0598 C9 RET ; ;BOOT TRAP - BECOMES DISCONNECT IF JMP AT 0 HAS BEEN ALTERED ; B960 = MBOOT EQU $+OFFSET 0599 3A0000 LDA 0 ;LOOK AT OPCODE 059C FEC3 CPI 0C3H ;IS IT STILL JMP? 059E CA3FBA JZ VWARMBT ;YES, ALLOW IT 05A1 C363B5 JMP NOSLASH ;NO, DISCONNECT ; ;INLINE PRINT ROUTINE ; B96B = ILPRT EQU $+OFFSET 05A4 E3 XTHL ;SAVE HL, GET MSG 05A5 C5 PUSH B ;SAVE BC REGS ; B96D = ILPLP EQU $+OFFSET 05A6 4E MOV C,M ;GET CHAR 05A7 CD0DB9 CALL MOUTPUT ;OUTPUT IT 05AA 23 INX H ;POINT TO NEXT 05AB 7E MOV A,M ;TEST 05AC B7 ORA A ;..FOR END 05AD C26DB9 JNZ ILPLP 05B0 C1 POP B ;RESTORE BC REGS 05B1 E3 XTHL ;RESTORE HL, RET ADDR 05B2 C9 RET ;RET PAST MSG ; IF PWRQD ;KEEP PASSWORD HERE ;ACCESS PASSWORD (ENDS IN CARRIAGE RETURN) ; PASSWD EQU $+OFFSET DB 'TWIT' ;THE PASSWORD ITSELF DB CR ;END OF PASSWORD ;ALLOW ROOM FOR BIGGER PASSWORD TO BE PATCHED IN CP/M MACRO ASSEM 2.0 #051 BYE V7.9 AS OF 04/12/82 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 ENDIF ;PWRQD ; ;ROUTINE TO LOAD THE COM FILE ; IF COMFILE LODCOM EQU $+OFFSET XRA A ;INITIALIZE FCB STA COMFCB LXI H,COMFCB+12 MVI B,21 ; ZLOOP EQU $+OFFSET MVI M,0 INX H DCR B JNZ ZLOOP ; MVI C,OPEN ;NOW OPEN THE FILE LXI D,COMFCB CALL BDOS INR A ;SHOULD BE NON-ZERO JZ ABORT ;NO FILE, ABORT ; ;NOW LOAD THE FILE LHLD 6 ;GET TOP OF MEMORY LXI D,-80H ;RECORD LOADS CAN'T START.. DAD D ;..ABOVE (BDOS) - 80H PUSH H ;SAVE ON STACK ; LXI D,80H ;TPA-80H LXI B,0 ;KEEP A RECORD COUNTER PUSH B ;SAVE COUNTER PUSH D ;AND LOAD ADDRESS ; GLOOP EQU $+OFFSET POP D ;GET TPA ADRS LXI H,80H ;POINT TO NXT ADRS TO READ TO DAD D ;HL HAS THE ADDRESS POP B ;INCREMENT THE COUNTER ;CHECK FOR LOAD PAST TOP-OF-MEMORY POP D ;GET (TOP-OF-MEMORY) PUSH D ;RE-SAVE FOR NEXT TIME MOV A,E ;SUBTRACT: (TOP) - (ADRS) SUB L MOV A,D ;ONLY THE CARRY NEEDED SBB H JNC SIZEOK ;CY= BETTER MOVCPM CALL ERRXIT ;SO TELL THE STORY DB '[Program area too small]','$' ; SIZEOK EQU $+OFFSET INX B PUSH B PUSH H ;SAVE TPA ADRS XCHG ;ALIGN REGISTERS CP/M MACRO ASSEM 2.0 #052 BYE V7.9 AS OF 04/12/82 MVI C,STDMA ;TELL BDOS WHERE TO PUT RECORD CALL BDOS LXI D,COMFCB ;NOW READ THE RECORD MVI C,READ CALL BDOS ORA A JZ GLOOP ;A=0 IF MORE TO READ POP B ;UNJUNK STACK POP B ;THIS IS OUR COUNTER POP H ;MORE JUNK ON STACK MOV A,B ;CHECK FOR ZERO ORA C JZ ABORT ;WE SHOULD HAVE READ SOMETHING LXI D,80H ;WE DID, RESET DMA TO 80H MVI C,STDMA CALL BDOS CALL LOADOK ;PRINT THIS MSG TO CONSOLE: DB 'COM file loaded',CR,LF,'$' ; LOADOK EQU $+OFFSET POP D LDA OPTION ;SEE IF THIS WAS "BYE /C" CPI 'C' ;IF IT WAS THEN.. RZ ;..DON'T PRINT MESSAGE MVI C,PRINTF CALL BDOS RET ; ABORT EQU $+OFFSET CALL ERRXIT DB CR,LF DB '[Cannot find COM file]','$' ; ERRXIT EQU $+OFFSET POP D MVI C,PRINTF CALL BDOS ;PRINT THE ABORT MSG JMP EXCPM ;WARM BOOT ENDIF ;COMFILE ; ;HERE ARE TWO ROUTINES FOR THE SMARTMODEM, ONE WILL SEND A ;+++ TO THE MODEM (AFTER WAITING 1 SECOND GUARD TIME) ;AND THE OTHER ONE WILL SEND A STRING TO THE MODEM JUST LIKE ;ILPRT SENDS TO THE CONSOLE. -- PST ; IF SMODEM SMINIT EQU $+OFFSET MVI B,10 ;WAIT ONE SECOND CALL DELAY CALL SMSEND ;SEND "+++" DB '+++',0 MVI B,10 ;WAIT ANOTHER SECOND CALL DELAY RET ; SMSEND EQU $+OFFSET CP/M MACRO ASSEM 2.0 #053 BYE V7.9 AS OF 04/12/82 XTHL ;SAVE HL, GET MSG PUSH B ;SAVE BC REGS ; SMPLP EQU $+OFFSET ENDIF ;SMODEM ; IF SMODEM AND PORTED IN MSPORT ENDIF ; IF SMODEM AND NOT PORTED LDA MSPORT ENDIF ; IF SMODEM ANI P0TBMT ;OK TO SEND? JZ SMPLP MOV A,M ENDIF ;SMODEM ; IF SMODEM AND PORTED OUT DPORT ENDIF ; IF SMODEM AND NOT PORTED STA DPORT ENDIF ; IF SMODEM INX H ;POINT TO NEXT MOV A,M ;TEST ORA A ;..FOR END JNZ ILPLP POP B ;RESTORE BC REGS XTHL ;RESTORE HL, RET ADDR RET ;RET PAST MSG ENDIF ;SMODEM ; ; ;THIS AREA IS USED FOR VECTORING CALLS TO THE ;USER'S CBIOS, BUT SAVING THE REGISTERS FIRST ;IN CASE THEY ARE DESTROYED. ; B97A = CONSTAT EQU $+OFFSET 05B3 C5 PUSH B 05B4 D5 PUSH D 05B5 E5 PUSH H 05B6 CD42BA CALL VCONSTAT 05B9 E1 POP H 05BA D1 POP D 05BB C1 POP B 05BC C9 RET ; B984 = CONIN EQU $+OFFSET 05BD C5 PUSH B 05BE D5 PUSH D CP/M MACRO ASSEM 2.0 #054 BYE V7.9 AS OF 04/12/82 05BF E5 PUSH H 05C0 CD45BA CALL VCONIN ; IF FKEYS 05C3 CD91B9 CALL CKFUNC ENDIF ;FKEYS ; 05C6 E1 POP H 05C7 D1 POP D 05C8 C1 POP B 05C9 C9 RET ; B991 = CKFUNC EQU $+OFFSET ; IF FKEYS AND IMSAI PUSH B MOV B,A ;SAVE CHAR IN SENSE ;READ THE SWITCHES ANI ENABLF ;CHECK FKEY ENAB SW MOV A,B ;GET CHAR POP B RZ ;NO FUNCT IF SW OFF ENDIF ;FKEYS AND IMSAI ; IF FKEYS 05CA FE0F CPI SYSDKEY 05CC CAB8B9 JZ SYSDOWN ;TELL CALLER TO LEAVE 05CF FE0E CPI TWITKEY 05D1 CA67B8 JZ DROPCAR ;MAKE CALLER LEAVE 05D4 FE11 CPI MSGKEY 05D6 C0 RNZ 05D7 CD6BB9 CALL ILPRT ;SEND CALLER A MESSAGE 05DA 4D65737361 DB 'Message from Sysop:',0 05EE 3E20 MVI A,' ' ;SOMETHING TO RETURN WITH 05F0 C9 RET ; B9B8 = SYSDOWN EQU $+OFFSET 05F1 CD6BB9 CALL ILPRT 05F4 5379737465 DB 'System going down in' 0608 2035206D69 DB ' 5 minutes...',0 0616 3E20 MVI A,' ' 0618 C9 RET ENDIF ;FKEYS ; B9E0 = CONOUT EQU $+OFFSET 0619 C5 PUSH B 061A D5 PUSH D 061B E5 PUSH H 061C CD48BA CALL VCONOUT 061F E1 POP H 0620 D1 POP D 0621 C1 POP B 0622 C9 RET ; B9EA = LISTOUT EQU $+OFFSET 0623 C5 PUSH B CP/M MACRO ASSEM 2.0 #055 BYE V7.9 AS OF 04/12/82 0624 D5 PUSH D 0625 E5 PUSH H 0626 F5 PUSH PSW 0627 4F MOV C,A 0628 CD4BBA CALL VLISTOUT 062B F1 POP PSW 062C E1 POP H 062D D1 POP D 062E C1 POP B 062F C9 RET ; ;THIS IS THE JMP TABLE WHICH IS COPIED ON TOP ;OF THE ONE POINTED TO BY LOCATION 1 IN CP/M ; B9F7 = NEWJTBL EQU $+OFFSET 0630 C306B5 JMP MCBOOT ;COLD BOOT 0633 C360B9 JMP MBOOT ;WARM BOOT 0636 C388B8 JMP MSTAT ;MODEM STATUS TEST 0639 C3A4B8 JMP MINPUT ;MODEM INPUT ROUTINE 063C C30DB9 JMP MOUTPUT ;MODEM OUTPUT ROUTINE IF NOT ALLDEV 063F C9 RET ;DUMMY LIST DEVICE 0640 00 NOP 0641 00 NOP ENDIF ;NOT ALLDEV ; IF ALLDEV JMP MOUTPUT ;MODEM LIST DEVICE JMP MOUTPUT ;MODEM PUNCH DEVICE JMP MINPUT ;MODEM READER DEVICE ENDIF ;ALLDEV ; IF CCSDISK ; DSKON EQU $+OFFSET PUSH PSW ;SAVE THE A AND FLAGS MVI A,DISKON ;VALUE TO TURN ON MOTORS OUT DISK ;TO THE DISK CONTROLLER PUSH H ;THIS IS TIMER LXI H,0000H ;THIS LONG DSKLP EQU $+OFFSET XTHL XTHL DCX H ;COUNT LOOP MOV A,H ;CHECK FOR DONE ORA L JNZ DSKLP POP H ;RESTORE HL POP PSW ;AND A & FLAGS RET ; DSKOFF EQU $+OFFSET PUSH PSW ;SAVE A & FLAG MVI A,DISKOFF ;VALUE TO TURN MOTORS OFF OUT DISK POP PSW CP/M MACRO ASSEM 2.0 #056 BYE V7.9 AS OF 04/12/82 RET ; ENDIF ;CCSDISK ; IF RTC CLKBASE EQU 50H ;BASE OF SYSTEM SUPPORT 1 CARD CLKCTL EQU CLKBASE+10 ;CLOCK CONTROL PORT CLKDATA EQU CLKBASE+11 ;CLOCK DATA PORT CREAD EQU 10H+40H ;READ COMMAND + HOLD COUNT COMMAND ; TIME EQU $+OFFSET PUSH H PUSH D PUSH B PUSH PSW MVI D,CREAD+5 ;POINT TO 10S OF HOURS MVI B,3 ;3 LOOPS JMP TX ;START W/ NO SEPARATOR ; T1 EQU $+OFFSET MVI C,':' ;SEPARATOR CALL MOUTPUT ;TO THE PRINTER TX EQU $+OFFSET MOV A,D ;GET THE DIGIT ADDRESS CALL CLOCK ;GET THE VALUE MOV C,A ;SAVE IT MVI A,CREAD+5 ;TEST FOR FIRST LOOP CMP D ;1ST LOOP? MOV A,C ;RECOVER THE VALUE JNZ T2 ;JUMP IF NOT 1ST LOOP ANI 3 ;DROP PM INDICATOR T2 EQU $+OFFSET ADI '0' ;ADD ASCII BIAS MOV C,A CALL MOUTPUT ;AND PRINT IT DCR D ;POINT TO NEXT DIGIT MOV A,D ;GET THE DIGIT ADDRESS TO A CALL PCLOCK ;GET & PRINT ASCII DCR D ;BUMP DIGIT COUNTER DCR B JNZ T1 ;LOOP TILL ALL PRINTED ; ; CALL ILPRT ;PRINT THE TIME ZONE DB ' CST ',0 ;CENTRAL STANDARD TIME ; ; WE WILL NOW PRINT THE DAY OF THE WEEK, FOLLOWED ; BY THE MONTH, DATE AND YEAR ; ; MVI A,CREAD+6 ;THIS IS DAY OF WEEK CALL CLOCK ;GET THE DAY NUMBER ; DAYDONE EQU $+OFFSET ADD A ;DOUBLE DAY COUNT LXI H,DAYS ;POINT TO TABLE CP/M MACRO ASSEM 2.0 #057 BYE V7.9 AS OF 04/12/82 MOV E,A ;ADD OFFSET TO DE MVI D,0 DAD D ;NEW POINTER IN HL MOV A,M ;GET LO BYTE OF WORD INX H ;POINT TO HI BYTE MOV H,M ;TO H MOV L,A ;PLUS LO BYTE POINTS TO STRING CALL LINOUT ;PRINT THE DAY ; MVI A,CREAD+10 ;10S OF MONTHS CALL CLOCK ORA A ;WE GOT 10'S OF MONTHS? JZ NOTENS ;JUMP IF NOT MVI A,10 ;ADD 10S IF WE GOT EM NOTENS EQU $+OFFSET MOV B,A ;SAVE 10S IN B MVI A,CREAD+9 ;GET THE ONES CALL CLOCK ADD B ;ADD TO THE 10S PLACE TO GET MONTH DCR A ;CORRECT FOR JAN=1 ADD A ;DOUBLE MONTH NUMBER LXI H,MONTHS ;POINT TO DISPATCH TABLE MOV E,A ;OFF SET TO DE MVI D,0 DAD D ;POINTER TO STRING AT (HL) MOV A,M ;GET LO BYTE TO A INX H ;POINT TO NEXT MOV H,M ;HI BYTE TO H MOV L,A ;LO BYTE TO L POINTS TO STRING CALL LINOUT ;PRINT THE MONTH ; MVI A,CREAD+8 ;10S OF DAYS CALL CLOCK ANI 3 ;DROP LEAP YEAR INDICATOR JZ NTENS ;JUMP IF NO TENS PLACE CALL PASC ;PRINT IT NTENS EQU $+OFFSET MVI A,CREAD+7 ;ONES OF DAYS CALL PCLOCK ;PRINT THEM LXI H,YEAR ;PLUS YEAR MESSAGE CALL LINOUT ;TO LISTER MVI A,CREAD+12 ;TENS OF YEAR CALL PCLOCK ;PRINT THEM MVI A,CREAD+11 ;ONES OF YEAR CALL PCLOCK CALL ILPRT ;FINISH THE LINE DB CR,LF,CR,LF,0 POP PSW POP B POP D POP H RET ; PCLOCK EQU $+OFFSET CALL CLOCK ;GET THE DIGIT PASC EQU $+OFFSET CP/M MACRO ASSEM 2.0 #058 BYE V7.9 AS OF 04/12/82 ADI '0' ;ADD ASCII BIAS MOV C,A JMP MOUTPUT ;AND PRINT ; CLOCK EQU $+OFFSET OUT CLKCTL ;TELL IT ADDRESS IN CLKDATA ;GET THE DATA NYBBLE PUSH PSW ;SAVE THE DATA XRA A ;GET 0 OUT CLKCTL ;RESET HOLD BIT POP PSW ;RESTORE DATA RET ; LINOUT EQU $+OFFSET MOV A,M ;GET THE CHARACTER CPI '$' ;DONE? RZ ;RETURN IF DONE MOV C,A ;ELSE PRINT IT CALL MOUTPUT INX H ;POINT TO NEXT CHARACTER JMP LINOUT ;THEN LOOP TILL DONE ; ; SUN EQU $+OFFSET DB 'Sunday, $' MON EQU $+OFFSET DB 'Monday, $' TUE EQU $+OFFSET DB 'Tuesday, $' WED EQU $+OFFSET DB 'Wednesday, $' THU EQU $+OFFSET DB 'Thursday, $' FRI EQU $+OFFSET DB 'Friday, $' SAT EQU $+OFFSET DB 'Saturday, $' ; JAN EQU $+OFFSET DB 'January $' FEB EQU $+OFFSET DB 'February $' MAR EQU $+OFFSET DB 'March $' APR EQU $+OFFSET DB 'April $' MAY EQU $+OFFSET DB 'May $' JUN EQU $+OFFSET DB 'June $' JUL EQU $+OFFSET DB 'July $' AUG EQU $+OFFSET DB 'August $' SEP EQU $+OFFSET DB 'September $' CP/M MACRO ASSEM 2.0 #059 BYE V7.9 AS OF 04/12/82 OCT EQU $+OFFSET DB 'October $' NOV EQU $+OFFSET DB 'November $' DEC EQU $+OFFSET DB 'December $' ; YEAR EQU $+OFFSET DB ', 19$' ; ;################################################# DAYS EQU $+OFFSET DW SUN DW MON DW TUE DW WED DW THU DW FRI DW SAT DW SUN ; MONTHS EQU $+OFFSET DW JAN DW FEB DW MAR DW APR DW MAY DW JUN DW JUL DW AUG DW SEP DW OCT DW NOV DW DEC ; ; ENDIF ;RTC ; BA09 = WELFILN EQU $+OFFSET 0642 0057454C43 DB 0,'WELCOME ',0 ;WELCOME FILE NAME ^^^^^^^^^^^ (MUST BE 11 CHARACTERS) ; BA16 = COMFCB EQU $+OFFSET ; IF NOT OXGATE DB 0,'RBBS COM' ;COM FILE NAME ^^^^^^^^^^^ (MUST BE 11 CHARACTERS) ENDIF ;NOT OXGATE ; IF OXGATE 064F 004F58454E DB 0,'OXENTR COM' ;COM FILE NAME ^^^^^^^^^^^ (MUST BE 11 CHARACTERS) ENDIF ;OXGATE ; BA22 = PEND EQU $+OFFSET ;END OF RELOCATED CODE ; CP/M MACRO ASSEM 2.0 #060 BYE V7.9 AS OF 04/12/82 ;THESE AREAS ARE NOT INITIALIZED ; 065B DS 21 ;REST OF COM FCB ; BA37 = OPTION EQU $+OFFSET 0670 DS 1 ; BA38 = TOCNTM EQU $+OFFSET 0671 DS 1 ; BA39 = TOCNT EQU $+OFFSET 0672 DS 2 ; ;BYTE TO KEEP TRACK OF LOST CARRIER WHEN ;TYPING "[CARRIER LOST]" SO WE DON'T LOOP ; BA3B = LOSTFLG EQU $+OFFSET 0674 DS 1 ; ;SAVE THE CP/M JUMP TABLE HERE ; BA3C = VCOLDBT EQU $+OFFSET 0675 DS 3 ; BA3F = VWARMBT EQU $+OFFSET 0678 DS 3 ; BA42 = VCONSTAT EQU $+OFFSET 067B DS 3 ; BA45 = VCONIN EQU $+OFFSET 067E DS 3 ; BA48 = VCONOUT EQU $+OFFSET 0681 DS 3 ; BA4B = VLISTOUT EQU $+OFFSET 0684 DS 3 ; BA4E = VPUNCH EQU $+OFFSET 0687 DS 3 ; BA51 = VREADER EQU $+OFFSET 068A DS 3 ; ; ; ;SINCE THESE AREAS ARE NOT INITIALIZED, ;THE FOLLOWING COUNTERS WILL NOT BE CHANGED ;BY SUBSEQUENT LOADS OF THIS PROGRAM ; IF USRLOG BA54 = OLDUSR EQU $+OFFSET 068D DS 2 ; BA56 = NEWUSR EQU $+OFFSET CP/M MACRO ASSEM 2.0 #061 BYE V7.9 AS OF 04/12/82 068F DS 2 ; BA58 = NONUSR EQU $+OFFSET 0691 DS 2 ENDIF ;USRLOG ; ; 0693 DS 60 BA96 = STACK EQU $+OFFSET ;LOCAL STACK ; LBA96 = ENDMARK EQU $+OFFSET ;! IGNORE ERROR. THIS MARKS END OF PGM ; ;BDOS EQUATES ; 0001 = CI EQU 1 0002 = WRCON EQU 2 0006 = DRECTIO EQU 6 0009 = PRINTF EQU 9 000B = CSTS EQU 11 000F = OPEN EQU 15 0014 = READ EQU 20 001A = STDMA EQU 26 0005 = BDOS EQU 5 005C = FCB EQU 5CH 007C = FCBRNO EQU FCB+32 ; 06CF END