BYE
                           CALLBACK
                         MODIFICATION
                         ------------

    With this modification to the B5IM code in BYE5 or
equivalent B3IM code in recent versions of BYE3, your modem only
answers the second of two calls placed less than a minute apart,
and only then if the telephone rang less than three times on the
first call.  This makes your computer accessable on a line
ordinarily used for voice communication, without preventing use
of that line by incoming voice callers.

    Changes are made to three areas of the BYE source code.

    First, add the following equates in the OPTION CONFIGURATION
SECTION.  Location is not critical; I added them after the four
equates under the heading "The next 4 equates are only used if
B5IM is YES" --

-----------------------------------------------------------------
;
;       Equates for callback feature - B5IM must = YES
;
CALLBK  EQU     YES             ; Yes activates callback code in B5IM
CLBKTM  EQU     30              ; Seconds to wait for callback (<64)
CBMSGS  EQU     YES             ; If YES, ring count, ready and time up
                               ; messages are printed (also activated
                               ; by PRGRSS)
;
;
;
-----------------------------------------------------------------

    Next, go to the B5IM code.
DELETE the portion which looks like this:

        IF     B5IM
IMRING: CALL    MDINST          ; Character ready from modem?
       RZ                      ; No
       CALL    MDINP           ; Get the modem response code
       ANI     7FH             ; Strip parity
        ENDIF                  ; B5IM
;
        IF     B5IM AND PRGRSS
       CALL    RCDISP          ; Display RC for local sysop
       PUSH    PSW
       LXI     H,LFMSG
       CALL    PRINTL          ; Turn up a line on crt
       POP     PSW
        ENDIF                  ; PRGRSS
;
        IF     B5IM
       CPI     CR
       RZ
       CPI     LF
       RZ
       CPI     '2'             ; Ring?
       JNZ     REDOIT          ; No, something wrong, start over
        ENDIF                  ; B5IM


and REPLACE that code with this:

-----------------------------------------------------------------

;*************************************************************
;
;       B5IM MODIFIED FOR CALLBACK
;
;*************************************************************
        IF     B5IM
IMRING:
        ENDIF
        IF     B5IM AND CALLBK
       LHLD    RDYFLG          ; Does flag show
       MOV     A,H             ; ready for callback?
       ORA     L
       JZ      RCT4            ; No...carry on
       CALL    KDELAY          ; Yes...continue countdown
       DCX     H               ;
       MOV     A,H             ; and see if time up
       ORA     L
       SHLD    RDYFLG
       JNZ     RCT4            ; Time not up ... carry on
        ENDIF                  ; B5IM AND CALLBACK
        IF     B5IM AND CALLBK AND (CBMSGS OR PRGRSS)
       LXI     H,RNMS4         ; Time up ... print message
       CALL    PRINTL
        ENDIF                  ; B5IM, etc.
        IF     B5IM AND CALLBK
RCT4:
        ENDIF                  ; B5IM AND CALLBK
        IF     B5IM
       CALL    MDINST          ; Character ready from modem?
       RZ                      ; No
       CALL    MDINP           ; Get the modem response code
       ANI     7FH             ; Strip parity
        ENDIF                  ; B5IM
;
        IF     B5IM AND PRGRSS
       CALL    RCDISP          ; Display RC for local sysop
       PUSH    PSW
       LXI     H,LFMSG
       CALL    PRINTL          ; Turn up a line on crt
       POP     PSW
        ENDIF                  ; PRGRSS
;
        IF     B5IM
       CPI     CR
       RZ
       CPI     LF
       RZ
       CPI     '2'             ; Ring?
       JNZ     REDOIT          ; No, something wrong, start over
        ENDIF                  ; B5IM
;
        IF     B5IM AND CALLBK
       LHLD    RDYFLG          ; Ready for callback?
       MOV     A,H
       ORA     L
       LXI     H,0             ; (Reset counter regardless)
       SHLD    RDYFLG
       JNZ     IMRIN1          ; Yes ... then answer 'phone
RNGCNT: XRA     A               ; Reset ringcounter and
       STA     RNG
        ENDIF
        IF     B5IM AND CALLBK AND (CBMSGS OR PRGRSS)
       MVI     A,' '
       STA     RNMS2           ; Ascii representation buffer
       STA     RNMS2+1
       STA     RNMS2+2
        ENDIF                  ; B5IM, etc.
        IF     B5IM AND CALLBK
RCT0:   LDA     RNG             ; Update ringcount
       INR     A
       STA     RNG
        ENDIF
        IF     B5IM AND CALLBK AND (CBMSGS OR PRGRSS)
       LXI     H,RNMS2         ; Put in ascii form
       CALL    DEC8
       LXI     H,RNMS1         ; And print # in message
       CALL    PRINTL
        ENDIF
        IF     B5IM AND CALLBK
       LXI     B,8000          ; Set ringstoptest timer
RCT1:   CALL    MDINST          ; Anything from modem?
       JZ      RCT2            ; No
       CALL    MDINP           ; Yes ... get it
       ANI     07FH
       CPI     '2'             ; Ring?
       JZ      RCT0            ; Yes ... update ringcount
                               ; and reset counter
RCT2:   CALL    KDELAY          ; 8 seconds since last ring?
       DCX     B
       MOV     A,C
       ORA     B
       JNZ     RCT1            ; No ... keep checking
        ENDIF
        IF     B5IM AND CALLBK AND (CBMSGS OR PRGRSS)
       LXI     H,LFMSG
       CALL    PRINTL
        ENDIF
        IF     B5IM AND CALLBK
       LDA     RNG             ; Yes ... more than 2 rings?
       CPI     3
       JNC     RCT3            ; Yes ... Ignore that call
        ENDIF
        IF     B5IM AND CALLBK AND (CBMSGS OR PRGRSS)
       LXI     H,RNMS3         ; Its a callback signal, so
       CALL    PRINTL          ; print ready message and
        ENDIF
        IF B5IM AND CALLBK
                               ; Set ready flag/timer
       LXI     H,CLBKTM*1000
       SHLD    RDYFLG
RCT3:   XRA     A               ; Set zero flag and return
       RET                     ; as though no call
        ENDIF                  ; B5IM AND CALLBK

-----------------------------------------------------------------


    Finally, go to the messages section near the end of the
code, and place the following code after the end of the B5IM
command strings section --


-----------------------------------------------------------------
;
;
;
        IF     B5IM AND CALLBK
RNG:    DB      0
RDYFLG: DB      0,0
        ENDIF
        IF     B5IM AND CALLBK AND (CBMSGS OR PRGRSS)
RNMS1:  DB      CR,'Ring #'
RNMS2:  DB      '   ',0
RNMS3:  DB      'Ready for callback...',CR,LF,0
RNMS4:  DB      'No callback...time up!',CR,LF,0
        ENDIF                  ; B5IM AND CALLBK, etc.
;
;
;
-----------------------------------------------------------------

Notes:

    1) For use with BYE3, proceed as indicated but change "B5IM"
to "B3IM" wherever it appears in the modification.

    2) The modified program starts looking for the callback ring
seven or eight seconds after the last ring of a one- or two-ring
call.  It answers the callback after the first ring.  It stops
looking if no callback occurs within CLBKTM seconds (actually
about 1.18 times CLBKTM if MHZ = 4).  CLBKTM should not be
greater than 64.

O. Gray
Toronto, Ont
Sept. 12, 1985