home *** CD-ROM | disk | FTP | other *** search
- ;-----------------------------------------------------------------------------
- ;PCHAT.MAC version 1.0A For use with PBBS v3.0 or later only.
- ; 07/16/86
- ;
- ; This program allows the user to CHAT chat with the sysop, if the bell
- ; flag in BYE is on and the Chat times are correct. If either of these
- ; two conditions prevent him from chatting, PCHAT will ask the user if he
- ; wants to leave a note to the sysop, if he does, PCHAT will chain to
- ; PNOTE.
- ; You must set the name of your PNOTE program at the label PNOTE:.
- ; You may change the NOTE question at label NOTIN:.
- ; Assemble this program and place it on A0 as CHAT.COM.
- ; Requires BYE5 or NUBYE and PBBS v3.0 or later.
- ;
- ; The Sysop my bypass the time and BYE check by entering CHAT C
- ; This was added to allow the sysop to talk to a user even though
- ; the chat time was not within the limits.
- ;
- ; PCHAT is based on code from PBBBS and used as part of:
- ;
- ; The Public Bulletin Board System
- ; Author: Russ Pencin
- ; 1301 Ridgeview Drive
- ; Mail Stop 102
- ; Lewisville, Texas 75067
- ; The Dallas Connection RCPM
- ; (214) 238-1016 (300/1200/2400)
- ;------------------------------------------------------------------
- ;
- ;--> 1.0 initial Public Release 07/15/86
- ;--> 1.1 enhancements and fixes submitted by Tom Brady
- ; 1) TOS defeated during CHAT mode, restored on exit.
- ; 2) More accurate message before PNOTE is loaded.
- ; [accepted and added 07/16/86. RLP]
- ;
- ;------------------------------------------------------------------------------
- ;
- ;NOTE:
- ; This file MUST be linked to PBBSUBS.REL....
- ;------------------------------------------------------------------------------
- .Z80
- ASEG
- ORG 100H
- ;
- JP START ;jump around the header and subs
- VER::
- DB 1 ;version
- ;
- VERR::
- DB 1 ;revision
- ;
- ;
- INCLUDE PBBSHDR.MAC ;header info (switches, etc.)
- ;
- INCLUDE BDOSHDR.MAC ;Time and Date conversions
- ;
- PNOTE: DB 4,'NOTE',0 ;Length and Name of your PNOTE program
- ;null terminated.
- NOTIN: DB CR,LF,LF
- DB 'The Sysop is unavailable at this time..',CR,LF
- DB 'Would you like to leave a private note? ',0
- ;
- VERDAT: DB ' 07/16/86',0
- ;
- START:
- LD C,32
- LD E,241
- CALL BDOS ; See if BYE5 is active
- CP 77
- JP Z,BEGIN ; Yes, proceed
- CALL PRINT ; Else abort
- ;
- DB CR,LF,'BYE not available, aborting...',CR,LF,0
- RET
-
- BEGIN:
- LD HL,0
- ADD HL,SP
- LD (CCPSTK),HL ; save the return address
- LD SP,STACK ; install our stack
- LD E,255
- LD C,81
- CALL BDOS ; Get MXTIME from BYE
- LD (MXTIME),A ; And store it
- LD E,0
- LD C,81
- CALL BDOS ; Set unlimited time during CHAT
- LD C,32
- LD E,0FFH
- CALL BDOS ; Get current user
- LD (OLDUSR),A ; And save it
- LD C,25
- CALL BDOS ; Get current drive
- LD (OLDDRV),A ; And save it
- ;
- CALL PRINT ; print all the neat stuff
- DB CR,LF,'PCHAT, '
- DB 'Version ',0
- LD HL,(VER) ; l=version, h=revision
- CALL PVER ; print the version
- LD HL,VERDAT ; and the date
- CALL PRINTM ;
- LD A,(SYSDRV) ;system files are here
- LD E,A ;
- LD C,LOGDRV ;
- CALL BDOS ;log to the drive
- LD A,(SYSUSR) ;
- LD E,A ;
- LD C,LOGUSR ;log to the user area
- CALL BDOS ;
- ;
- ;
- ;------------------------------------------------------------------------------
- ;
- YAK:
- LD A,(FCB+1)
- CP 'C'
- JP Z,YAKSOP
- LD E,255 ; see if the bell is on..
- LD C,78
- CALL BDOS
- OR A
- JP Z,NOYAK ;nope..sorry charlie...
- YAK0:
- CALL PRINT
- DB CR,LF,0
- CALL GETTIM ; get time and convert to binary
- LD A,(BTIME)
- CP CHAT0 ;is it too early?
- JP M,NOYAK
- CP CHAT1 ;is it too LATE?
- JP P,NOYAK
- ;
- ;calculate the hash to insure proper state.
- ;
- CALHASH:
- LD HL,(USRS)
- AND A ; clear carry flag
- LD DE,26 ; # of ascci chars
- LD BC,0 ; counter
- DIV: SBC HL,DE
- JP C,HASHSET ;calculate the hash for this system
- INC BC
- JR DIV
- HASHSET:
- LD (HASH),BC
- ;
- ;----------------------------------------------------------------------------
- ;
- ; User is on system, and has typed CHAT. Allow the user to leave a
- ; private note if CHAT not available and then exit back to cp/m.
- ;
- MAINT:
- LD HL,USERS ;address the filename
- CALL OPEN ;open the file
- LD HL,USRLEN ;set the record size
- LD (RRSZ),HL ;
- LD HL,(USREC) ;reget the user record no. in hl
- CALL GET ;get record into buffer
- CALL CLOSE ;and close the file
- LD HL,AVAILF ; save it for callers file update
- LD DE,AVAIL
- LD BC,USRLEN
- LDIR
- CALL PRINT
- DB CR,LF,'Hold on, ',0
- LD B,30
- LD HL,UNAME
- CALL PRINTN
- CALL PRINT ; Print:
- DB '. You may use ^C or ^X to abort.'
- DB CR,LF,0
- CALL PRINT
- DB ' |',0
- LD A,ALERT ; get the value
- LD (LINES),A
- LD IY,LINES
- ;
- BARS1: CALL PRINT ; Print bar and space
- DB '-',0
- DEC (IY) ; Done with bars?
- JR NZ,BARS1 ; Not done, do it again
- CALL PRINT
- DB '|',CR,LF,0
- LD A,ALERT ; restore value
- LD (LINES),A ; temp counter
- ;
- CALL PRINT
- DB 'Ringing: ',0
- ;
- ;
- ; Attempt to alert operator
- ;
- YAK2:
- CALL PRINT ; Print bell, period, space
- DB BEL,'.',0
- CALL DELAY
- DEC (IY) ; Done with alert attempts?
- JR NZ,YAK2 ; Not done with attempts, do more
- JP NOYAK
- ; Delay routine to wait between beeps
- ;
- DELAY:
- LD B,CLOCK
- ;
- DELAY1:
- LD HL,DLAYV
- LD DE,1
- ;
- DELAY2:
- PUSH HL ; Save the values, consume some time
- PUSH DE
- PUSH BC
- LD E,0FFH
- LD C,6
- CALL SPBDOS ; Get console status
- OR A ; Character ready?
- JR NZ,DELAY4 ; Let's check it out
- ;
- DELAY3:
- POP BC ; Restore the values
- POP DE
- POP HL
- ADD HL,DE
- JR NC,DELAY2
- DEC B
- JR NZ,DELAY1
- RET ; Finished this time
- ;.....
- DELAY5:
- LD SP,STACK ; fix the stack
- JP NOYAK
- ;
- ;
- DELAY4:
- CP 'X'-040H ; User has cold feet?
- JP Z,DELAY5 ; Yes? then go back to pbbs
- CP 'K'-'@' ; ^K
- JP Z,DELAY5
- CP 03H ; Used to using CTL-C to quit?
- JP Z,DELAY5 ; Ok, then back to pbbs
- CP ESC ; Was it the right answer?
- JR NZ,DELAY3 ; If not, keep timing
- ;
- ;
- ; Operator is present
- ;
- YAKSOP:
- LD SP,STACK ; Fix stack
- CALL PRINT
- DB CR,LF,LF
- DB 'Operator is available, please go ahead...',CR,LF
- DB '(Use three <RETURNS> to exit)',CR,LF
- DB CR,LF,0
- YAK3:
- LD IY,LINES
- LD (IY),3
- YAK4:
- CALL PRINT
- DB CR,LF,0
- LD B,74 ;input length
- XOR A ;allow echo
- LD C,A ;no caps forced
- LD D,1 ;want word-wrap at 53rd character
- CALL INPUT ;get line
- OR A
- JR NZ,YAK3
- DEC (IY)
- JR NZ,YAK4
- JP REXIT
- NOYAK:
- LD HL,NOTIN ; Load nobody home message
- CALL PRINTM
- CALL GETCH
- CALL CAPS
- CALL ECHO
- CP 'Y'
- JP NZ,REXIT
- LD A,(MXTIME) ; Get MXTIME back
- LD E,A
- LD C,81
- CALL BDOS ; Restore MXTIME to pre-chat status
- CALL PRINT
- DB CR,LF,'Loading NOTE...Please wait...',CR,LF,0
- CALL RESTR
- LD HL,PNOTE ;load up command pointer
- PUSH HL ;set up for command buffer
- JP CPM+30 ;move command without logging into INITAR.
- ;
- REXIT:
- LD A,(MXTIME) ; Get MXTIME back
- LD E,A
- LD C,81
- CALL BDOS ; Restore MXTIME to pre-chat status
- CALL RESTR
- LD HL,(CCPSTK)
- LD SP,HL ; Restore original stack
- RET ; And exit
- ;
- ;
- ; subroutine
- ;
- RESTR:
- LD A,(OLDDRV) ;subroutine to restore the user/drv areas
- LD E,A
- LD C,LOGDRV
- CALL BDOS ; Restore original drive
- LD A,(OLDUSR)
- LD E,A
- LD C,LOGUSR
- CALL BDOS ; Restore original user area
- RET
- ;
- EATCHR:
- LD E,0FFH
- LD C,6
- CALL SPBDOS
- OR A
- JR NZ,EATCHR
- RET
- ;.....
- ;
- NOMSG: DB 'No ',CR,LF,0
- COLUMN: DB 0 ;current column counter
- CRS: DB 0 ;carriage return counter
- HSHREC: DW 0
- HASH: DB 0
- MXTIME: DB 0 ; temporary storage for TOS
- ;
- OLDUSR: DB 0
- OLDDRV: DB 0
- LINES: DB 0
- CCPSTK:: DW 0
- TMPSTK:: DW 0
- ;
- DS 128 ;stack area
- STACK EQU $
- ;
- MSG::
- DW 0 ;message entry storage starts after
- ;linked PBBSUBS.rel file
- MSGARR::
- DW 0 ;storage for message pointers
- END