;
; 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