home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
BBSING
/
MBBS
/
MBYERIG.0Q1
/
MBYERIG.001
Wrap
Text File
|
2000-06-30
|
11KB
|
341 lines
; 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",<cr>
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<cr>"
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