; March 18, 1985, Bucky Carr, World Peace (ZBBS) RCP/M, Denver, 303-320-4822 ; ; Here is a little ditty that I snitched from an old BYE routine that a ;friend had. Have you ever found yourself looking at your CRT and wondering ;if the blinking cursor actually means that BYE is working, and waiting for ;a ring. No need to wonder any more. With these mods, your CRT will keep ;you informed of what BYE is doing between calls. ; ; I specifically adapted this to Kim Levitt's MBYE35, but I left enough info ;that virtually anyone should be able to make this work on any BYE that s/he ;is running (I showed a friend how to do it to BYE331, last night in 5 mins!) ; ; My changes are represented by the symbology: ; ;*************************************** ; * ; changes and additions inside the box * ; * ;*************************************** ; ; These changes will make the CRT flash the following message on and off the ;CRT at about 1 second intervals: "Waiting for ring ...." ; ; First look for a label like this and the 'Await ringing' comment for the ;next label ; START2: ; XRA A ;clear OPTION flag STA OPTION ; ; Await ringing - check local keyboard for CTL-C exit request, ; CTL-G bell toggle or CTL-Z screen clear. ; ;************************************************************************ ; Need to initialize some counters that represent delay loops * ;and do this before the RINGWT label. MHZ should be defined above in * ;your program already * ; * LOOP: ;values are for about 1 second flashing * LXI B,MHZ*200 ;counter for printing the 'waiting' msg * LXI D,(MHZ*400)-1 ;counter for erasing the 'waiting' msg * LXI H,MSGWT2 ;print the 'waiting for ring ....' msg * CALL LCLPRT ;gotta use DE & BC cuz #s big * ; * ; Call the local CRT, not the modem port and not both. In BYE331 it is * ;a routine called PRINTL, in MBYE35 it is LCLPRT. MSGWT2 is the address* ;of the 'Waiting for ring ....' msg (see near the end) * ;************************************************************************ ; RINGWT: ; ;************************************************************************ ; Actual delay for printing the message(s) occurs here. * ;I found that the built in routine (DELAY) would not work reliably * ;so wrote this which does work reliably. Notice that this does not * ;cause more than a few nanoseconds delay in the regular scanning of * ;the console (VCONSTAT) and the modem (MDINST or MDCARCK) ports * ; * DCX B ;decrement BC * MOV A,B ;put B in A, OR it with C * ORA C ;0 yet? yes=one second has elapsed * JZ WAITMSG ;erase the 'Waiting for ring ....' msg * DCX D ;decrement DE * MOV A,D ;put D in A, OR it with E * ORA E ;0 yet? yes=another second has elapsed * JZ LOOP ;re-print the 'Waiting for ring ...' msg* ; * THERE: ;need this label now (ESSENTIAL) * ; * ; the following is included for your orientation * ;************************************************************************ CALL VCONSTAT ;check if console key ready ORA A JZ RNGWT1 ;nope, check for ring/carrier CALL VCONIN ;yep, get console key ANI 7FH ;strip parity bit ; IF FKEYS CPI BELKEY ;bell key? CZ TOGBEL ;if so, toggle console bell on/off CPI CLRKEY ;clear screen char? CZ CLRSCRN ;if so clear the screen ENDIF ; CPI 'C'-40H ;CTL-C? JZ USRCHK ;check for exit ; ; Now look for the next label we need, here called RNGWT1. We are looking ;for a spot to stick a small subroutine to which we can jump without ;having it used for anything else accidentally. You could technically stick ;stick this little subroutine anywhere out of harm's way.... ; RNGWT1: ; IF NORING AND NOT (SMODEM OR SM1200 OR SM2400) CALL MDCARCK ;check for carrier JNZ ANSWER ;we have carrier, let's say hello. JMP RINGWT ;nope, loop ENDIF ;NORING AND NOT (SMODEM OR SM1200 OR SM2400) ; IF SMODEM OR SM1200 OR SM2400 CALL MDINST ;check for data available JZ RINGWT ;nope, keep waiting CALL MDINP ;yep, get data (CR) CPI CR ;if CR, JZ RINGWT ;ignore it CPI '2' ;'RING?' JZ ANSWSM ;yes, answer the phone CPI '3' ;'NO CARRIER?' JZ START2 ;yes, clear OPTION flag, cont. PUSH PSW ;no, save result code CPI '1' ;'300 CONNECT?' ENDIF ;SMODEM OR SM1200 OR SM2400 ; IF SMODEM OR (SM1200 AND S300) OR (SM2400 AND S300) ;300 baud? JZ ANSWER ;yes, answer ENDIF ; IF (SM1200 OR SM2400) AND NOT S300 JZ HANGUP1A ;if not, hang up on 'em ENDIF ; IF SM1200 OR SM2400 CPI '5' ;'1200 CONNECT?' JZ ANSWER ENDIF ;SM1200 OR SM2400 ; IF SM2400 CPI '6' ;'2400 CONNECT?' JZ ANSWER ENDIF ;SM2400 ; IF SMODEM OR SM1200 OR SM2400 POP PSW ;not a response code JMP RINGWT ;ignore it ; ANSWSM: ; ENDIF ; IF (SMODEM OR SM1200 OR SM2400) AND USRLOG LXI H,OLDUSR ;count this as "attempted log on" CALL BOPLOG ENDIF ; IF SMODEM OR SM1200 OR SM2400 OR ANCHOR OR USR ANSWS2: CALL MDINST ;check for data available JZ ANSWS2 ;nope, keep waiting CALL MDINP ;yep, get data (CR) ANSWS3: LXI H,SMAMSG ;send "ATA", CALL MDMPRT JMP RINGWT ;wait for response code ENDIF ; ;************************************************************************ ; Here is a safe spot to stick our subroutine * ; This RCP/M runs on a Heath H89, so I used the clear screen codes * ;to accomplish the erasing of the message every other second * ; * ; If you don't know your computer's clear screen codes (see below) * ;then change the CLRSMSG to MSGWT1, and we will do it another way * ; * WAITMSG: ; * LXI H,CLRSMSG ;clear local screen only * CALL LCLPRT * LXI B,MHZ*400 ;delay the print msg * JMP THERE * ; * ; the following is for your orientation * ;************************************************************************ ; IF NOT NORING ; RINGW2: CALL MDRING ;call ring-check routine JZ RINGWT ;not ringing... ; ; ; Next, I did not want the cursor flashing on the screen and cluttering ;up my pretty flashing 'Waiting ....'msg, so I added a cursor on/off routine. ;Here is off at the label in MBYE35 called CLRSCRN. This way each call ;by BYE to the clear screen routine, will also turn off the cursor. ; CLRSCRN: LXI H,CLRSMSG ;Clear screen CALL LCLPRT ;************************************************************************ ; CURSOFFMSG is the address of the cursor off routine (see below) * ; * LXI H,CURSOFFMSG ;CURSOR OFF * CALL LCLPRT ; * ; * ; Again, only send the cursor off routine to the local console not the * ;modem. The RET instruction following was part of the original CLRSCRN * ;code, so don't forget it * ;************************************************************************ RET ; ; ; When we exit to CP/M, relieving BYE of its duties, we of course want the ;cursor back on again. For your orientation, find the following label, ;and work down from there. ; ; Here to exit to CP/M, first reset the modem to default status ; EXCPM: ; IF COMFILE LDA OPTION CPI 'E' ;If not "E" option JNZ EXEX ;exit direct to CP/M CALL LODCOM ;else, make sure .COM file loaded ENDIF ; IF MBBS AND RTC CALL PATCH ;If MBBS, run with BYE patched XRA A ;in so RTC will work... STA MDMFLG ;(but with MDMFLG cleared) ENDIF ; IF COMFILE CALL TPA ;execute .COM file locally ENDIF ; EXEX: ; IF SMODEM OR SM1200 OR SM2400 OR ANCHOR OR USR LXI H,SMQMSG ;send "ATZ" CALL MDMPRT CALL SMDLAY ;wait a bit... ENDIF ; IF SM1200 OR SM2400 OR ANCHOR OR USR CALL SET1200 ;if SM1200, ATZ = 1200 baud ENDIF ; IF SMODEM OR SM1200 OR SM2400 OR ANCHOR OR USR LXI H,SMZMSG CALL MDMPRT ;send "AT S0=0" ENDIF ; IF CCSDISK CALL DSKON ;turn on the drives ENDIF ;CCSDISK ; IF ZCPR2 OR NZCPR MVI A,OFF STA WHEEL ;DO NOT restore wheel byte for SYSOP STA 03FH ;RIG IT SO THE SYSOP HAS TO LOG IN TOO MVI A,4 ;SD SCREEN WIDTH STA 03EH ;SD WIDTH LOCATION ENDIF ; IF ZPATH CALL SPATH ;set up sysop path ENDIF ;ZPATH ; IF USEZCPR MVI A,SMAXUSR STA MAXUSER ;and MAXUSR MVI A,SMAXDRV STA MAXDRIV ;and MAXDRIV ENDIF ; IF MBBS AND RTC CALL UNPATCH ENDIF ; MVI A,' ' ;clear STA YESITS ;'B' in 'BYE' to force reload ; ;************************************************************************ ; Just in front of the warm boot, turn the cursor back on * ; * LXI H,CURSONMSG ;CURSOR BACK ON * CALL LCLPRT ; * ;************************************************************************ JMP VWARMBT ;warm boot to unpatched CP/M ; ; ; Near the end of the BYE and MBYE programs are a number of DB statements ;to which we will add some of our own. ; ; Program version number message. ; VMSG: DB CR,LF,'>>> MBYE v3.5 - 01/26/85 - Kim Levitt' DB CR,LF,0 ; ;************************************************************************ ; 'Waiting for ring' message, assuming that you can invoke the CLRSCRN * ;abilities of your machine (Richard Conn does it in dozens of machines * ;with his Z3TCAP and TCSELECT, so I know you can, too. It is the * ;preferred method. * ; * MSGWT2: ; * DB CR,'Waiting for ring ....',CR,0 ; * ; * ; IF AND ONLY IF, you cannot do a clear screen routine on your machine * ;then add this, here, * ; * MSGWT1: ; * DB CR,'Waiting ....',CR,0 * ; * ; and be sure that you changed the CLRSMSG to MSGWT1 up in the WAITMSG * ;above * ;************************************************************************ ; ; For your edification, here is the clear screen routine for the Heath ;H89 or H19. ; ; Clear screen string. ; CLRSMSG: ;put clear screen control code or DB 27,'E' ;escape sequence here, end with 0 DB 0 ;(escape E) ; ;************************************************************************ ; Cursor off/on messages for the Heath H89 or H19 * ; * CURSOFFMSG: ; * DB 27,'x','5' ;CURSOR OFF CONTROL CODE HERE * DB 0 ;END WITH ZERO (escape x5) * ; * CURSONMSG: ; * DB 27,'y','5' ;CURSOR ON CONTROL CODE HERE * DB 0 ;END WITH ZERO (escape y5) * ; * ; And the following is for your orientation * ; * ; What is ZBBS, anyway? * ;************************************************************************ ; IF LGONMSG LOGMSG: DB CR,LF,LF,LF,'World Peace (ZBBS) RCP/M' DB CR,LF,'The World Peace Movement' DB CR,LF,0 ENDIF ;LGOMSG V