home *** CD-ROM | disk | FTP | other *** search
- ;
- ; CHAT.ASM ver 1.3
- ; (revised 12/14/80)
- ;
- ; An interactive program to allow a remote user to "chat" with
- ; the local system operator.
- ;
- ; Originally by RODERICK W. HART
- ;
- ;THIS PROGRAM IS TO BE USED BY A LOCAL OPERATOR TO CONDUCT TWO WAY
- ;COMMUNICATIONS WITH A REMOTE CALLER. OPERATOR ACKNOWLEDGES "CHAT"
- ;REQUEST BY PRESSING THE SPECIAL CODE KEY DESIGNATED AT "AC" BELOW.
- ;
- ;WHEN IN ╘HE CHAT MODE, LINES ARE AUTOMATICALLY LIMITED TO 63
- ;CHARACTERS. CLF IS INSERTED AUTOMATICALLY ON THE FIRST SPACE
- ;TYPED AFTER THE 57TH CHARACTER.
- ;
- ;12/14/80 Modified to use direct calls to CBIOS I/O to make
- ; compatible with CP/M 1.4, 2.x, and MP/M. (KBP)
- ;
- ;12/09/80 Rewritten to optimize code, correct stack problems,
- ; add backspace routine, reduce number of bells,
- ; add user selectable operator acknowledge code,
- ; eliminate unnecessary subroutines, add additional
- ; comments and add BASE equate for ALTCPM.
- ; By Keith Petersen W8SDZ, and Dave Hardy
- ;
- BASE EQU 0 ;SET TO 4200H FOR ALTCPM, 0 FOR REGULAR CP/M
- ;
- ACK EQU 1BH ;OPERATOR ACKNOWLEDGE CODE
- ;
- ALERT EQU 6 ;NUMBER OF ALERT ATTEMPTS
- ;
- FASTCLK EQU 0 ;SET TO 1 FOR 4 MHZ, 0 FOR 2 MHZ SYSTEM CLOCK
- ;
- BEL EQU 07H ;BELL
- CR EQU 0DH ;CARRIAGE RETURN
- LF EQU 0AH ;LINE FEED
- CONTC EQU 03H ;CHAT-MODE EXIT CHARACTER
- BAKSP EQU 08H ;BACKSPACE
- ;
- BDOS EQU BASE+5 ;BDOS CALL ADDRESS
- PRINT EQU 9 ;PRINT STRING FUNCTION
- ;
- ORG BASE+100H
- ;
- START LXI SP,STACK ;SET NEW STACK POINTER
- ;
- ;Initialize jumps to CBIOS for direct I/O
- LHLD BASE+1 ;GET POINTER TO CBIOS
- LXI D,3 ;READY FOR ADD
- DAD D ;HL = CONSTAT VECTOR
- SHLD CSTAT+1 ;MODIFY JUMP
- DAD D ;HL = CONIN VECTOR
- SHLD CONIN+1 ;MODIFY JUMP
- DAD D ;HL = CONOUT VECTOR
- SHLD CONOUT+1 ;MODIFY JUMP
- ;
- ;Print signon message
- CALL ILPRT ;PRINT:
- DB CR,LF,'REMOTE CONVERSATION UTILITY ver 1.3',CR,LF
- DB 'Program aborts automatically in 30 seconds.'
- DB CR,LF,CR,LF,'Alerting OPERATOR . ',0
- ;
- ;Attempt to alert operator
- ;
- START1 CALL ILPRT ;PRINT BELL, PERIOD, SPACE
- DB BEL,'. ',0
- CALL DELAY ;WAIT 5 SECONDS
- LDA CNT ;GET ATTEMPT COUNTER
- DCR A ;DONE WITH ALERT ATTEMPTS?
- STA CNT ;SAVE NEW COUNT
- JN START1 ;NOT DONE WITH ATTEMPTS, DO MRE
- CALL ILPRT ;PRINT:
- DB CR,LF,CR,LF,'orry, no OPERATR available-',CR,LF
- DB 'Please leave your request on MINICBBS',CR,LF,0
- JMP BASE+0 ;EXIT TO CP/M WARM BOOT
- ;
- IF FASTCLK ;4 MHZ SYSTEM CLOCK
- DELAY MVI A,11 ;NUMBER OF 1 SECOND DELAYS +1 * 2
- ENDIF
- ;
- IF NOT FASTCLK
- DELAY MVI A,6 ;NUMBER OF 1 SECOND DELAYS + 1
- ENDIF
- ;
- DELAY1 LXI H,0
- LXI D,1 ;LOOP DELAY VALUE
- ;
- WAIT DAD D ;WAIT BETWEEN BELL RINGS
- JNC WAIT
- DCR A ;DONE?
- JNZ DELAY1 ;NO, LOOP
- ;
- CALL CSTAT ;GET CONSOLE STATUS
- ORA A ;CHARACTER WAITING?
- RZ ;NO, RETURN
- CALL CONIN ;GET CHARACTER
- CPI ACK ;WAS IT THE RIGHT ANSWER?
- RNZ ;NO? THEN TRY AGAIN
- ;
- POP PSW ;FIX STACK
- CALL ILPRT ;PRINT:
- DB CR,LF,CR,LF,'OPERATOR is ON-LINE. Please go ahead:'
- DB CR,LF,CR,LF,0
- ;
- ;CONVERSATION ROUTINE - uses direct CBIOS I/O to
- ;prevent control characters from being echoed.
- ;
- CONT CALL CONIN ;GET CONSOLE INPUT WITH NO ECHO
- CPI CONTC ;CONTROL-C ?
- JZ BASE+0 ;YES, WARM-BOOT AND RETURN TO CP/M
- CPI CR ;CARRIAGE RETURN?
- JZ CRLF ;YES SEND CRLF
- CPI BAKSP ;BACKSPACE?
- JZ BACKIT ;YES DO BACKSPACE SPACE BACKSPACE
- CPI ' ' ;SPACE OR ABOVE?
- JC CONT ;IT'S A CTL CHARACTER, CONTINUE LOOPING
- PUSH PSW ;SAVE CHARACTER ON STACK
- MOV C,A ;CHARACTER TO C FOR CBIOS
- CALL CONOUT ;SEND CHARACTER TO CONSOLE
- POP B ;GET CHARACTER TO B FROM STACK
- LDA LCNT ;GET CHARACTER COUNT
- INR A ;INCREMENT CUNTER
- STA LCNT ;PUT COUNTER BACK
- CPI 63 ;AT END OF L NE LIMIT?
- JZ CRLF ;YES, GIVE AUTO CRLF
- CPI 58 ;NEAR END OF LINE LIMIT?
- JC CONT ;NO, CONTINUE LOOPING
- MOV A,B ;GET CHARACTER
- CPI ' ' ;SPACE?
- JNZ CONT ;NO, CONTINUE LOOPING
- ;
- CRLF CALL ILPRT ;PRINT:
- DB CR,LF,0
- XRA A ;ZERO CHARACTER COUNTER
- STA LCNT
- JMP CONT ;CONTINUE LOOPING
- ;
- BACKIT LDA LCNT ;GET CHARACTER COUNT
- DCR A ;SUBTRACT ONE BECAUSE OF BACKSPACE
- JM CONT ;DONT GO PAST ZERO
- STA LCNT ;SAVE NEW COUNT
- CALL ILPRT ;PRINT
- DB BAKSP,' ',BAKSP,0
- JMP CONT ;CONTINUE LOOPING
- ;
- ;INLINE PRINT ROUTINE
- ;
- ILPRT XTHL ;SAVE HL, GET MSG
- ;
- ILPLP MOV C,M ;GET CHAR
- PUSH H
- CALL CONOUT ;OUTPUT IT
- POP H
- INX H ;POINT TO NEXT
- MOV A,M ;TEST
- ORA A ;..FOR END
- JNZ ILPLP
- XTHL ;RESTORE HL, RET ADDR
- RET ;RET PAST MSG
- ;
- CSTAT JMP $-$ ;MODIFIED AT INIT
- ;
- CONIN JMP $-$ ;MODIFIED AT INIT
- ;
- CONOUT JMP $-$ ;MODIFIED AT INIT
- ;
- CNT DB ALERT ;ALERT COUNTER
- LCNT DB 0 ;LINE POSITION COUNTER
- DS 60 ;ROOM FOR STACK
- STACK EQU $
- ;
- END