home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol018 / chat15.asm < prev    next >
Assembly Source File  |  1984-04-29  |  6KB  |  240 lines

  1. ;            CHAT.ASM ver 1.5
  2. ;            (revised 1/2/81)
  3. ;
  4. ;    An interactive program to allow a remote user to "chat"
  5. ;      with the local Remote CP/M system operator.
  6. ;
  7. ;               Originally by Roderick W. Hart
  8. ;
  9. ;This program is to be used by a local RCPM operator to conduct two-way
  10. ;communications with a remote caller.  Operator acknowledges "chat"
  11. ;request by pressing the special code key designated at "ACK" below.
  12. ;
  13. ;When in the chat mode, lines are automatically limited to 63
  14. ;characters. A  CR and LF is inserted automatically on the first
  15. ;space typed after the 57th character.
  16. ;
  17. ;01/02/81 Fixed TRUE/FALSE equates (FALSE was never used), changed
  18. ;      signon message, fixed conditional on ORG statement,
  19. ;      cleaned up file. (KBP)
  20. ;
  21. ;12/20/80 Modified so no warm boot on exit, TRUE/FALSE equates
  22. ;      for ALTCPM, FASTCLK, MPMPRL, MINICBBS (or CBBS) message.
  23. ;      Also inform user to use CTL-C to exit.  By Kelly Smith.
  24. ;
  25. ;12/14/80 Modified to use direct calls to CBIOS I/O to make
  26. ;      compatible with CP/M 1.4, 2.x, and MP/M.  (KBP)
  27. ;
  28. ;12/09/80 Rewritten to optimize code, correct stack problems,
  29. ;      add backspace routine, reduce number of bells,
  30. ;      add user selectable operator acknowledge code, 
  31. ;      eliminate unnecessary subroutines, add additional
  32. ;      comments and add base equare for ALTCPM.
  33. ;        By Keith Petersen W8SDZ, and Dave Hardy
  34. ;
  35. FALSE    EQU    0      ;DEFINE FALSE
  36. TRUE    EQU    NOT FALSE ;DEFINE TRUE
  37. ;
  38. ;Conditional assembly switches
  39. ;
  40. STDCPM    EQU    TRUE     ;TRUE IF STANDARD CP/M
  41. ALTCPM    EQU    FALSE    ;TRUE IF ALTERNATE CP/M (HEATH H8 & TRS-80 MODEL I)
  42. MPMPRL    EQU    FALSE    ;TRUE IF MP/M PROGRAM RELOCATABLE FORMAT
  43. FASTCLK    EQU    FALSE    ;TRUE IF 4 MHZ SYSTEM CLOCK
  44. CBBS    EQU    FALSE    ;TRUE IF CBBS MESSAGE (MINICBBS = FALSE)
  45. ;
  46. ;Define base address of system
  47. ;
  48.     IF    STDCPM
  49. BASE    EQU    0
  50.     ENDIF
  51. ;
  52.     IF    ALTCPM
  53. BASE    EQU    4200H
  54.     ENDIF
  55. ;
  56. ;Define operator acknowledge code
  57. ;
  58. ACK    EQU    1BH    ;ESCAPE KEY
  59. ;
  60. ;Define number of alert attempts
  61. ;
  62. ALERT    EQU    6    ;SIX SEEMS ENOUGH
  63. ;
  64. ;Define ASCII characters used
  65. ;
  66. BEL    EQU    07H    ;BELL
  67. CR    EQU    0DH    ;CARRIAGE RETURN
  68. LF    EQU    0AH    ;LINE FEED
  69. CONTC    EQU    03H    ;CONTROL-C, CHAT-MODE EXIT CHARACTER
  70. BAKSP    EQU    08H    ;BACKSPACE
  71. ;
  72. ;BDOS equates
  73. ;
  74. BDOS    EQU    BASE+5    ;BDOS CALL ADDRESS
  75. PRINT    EQU    9    ;PRINT STRING FUNCTION
  76. ;
  77.     IF    MPMPRL
  78.     ORG    BASE
  79.     ENDIF
  80. ;
  81.     IF    NOT MPMPRL
  82.     ORG    BASE+100H
  83.     ENDIF
  84. ;
  85. START:    LXI    H,0
  86.     DAD    SP     ;GET OLD STACK POINTER
  87.     SHLD    STACK     ;SAVE IT
  88.     LXI    SP,STACK ;SET NEW STACK POINTER
  89. ;
  90. ;Initialize jumps to CBIOS for direct I/O
  91. ;
  92.     LHLD    BASE+1     ;GET POINTER TO CBIOS
  93.     LXI    D,3     ;READY FOR ADD
  94.     DAD    D     ;HL = CONSTAT VECTOR
  95.     SHLD    CSTAT+1     ;MODIFY JUMP
  96.     DAD    D     ;HL = CONIN VECTOR
  97.     SHLD    CONIN+1     ;MODIFY JUMP
  98.     DAD    D     ;HL = CONOUT VECTOR
  99.     SHLD    CONOUT+1 ;MODIFY JUMP
  100. ;
  101. ;Print signon message
  102. ;
  103.     CALL    ILPRT    ;PRINT:
  104.     DB    CR,LF,'CHAT ver 1.5 - Remote conversation utility.'
  105.     DB    CR,LF,'Program returns to system in 30 seconds'
  106.     DB    CR,LF,'if operator is unavailable.'
  107.     DB    CR,LF,CR,LF,'Alerting operator now . ',0
  108. ;
  109. ;Attempt to alert operator
  110. ;
  111. START1:    CALL    ILPRT    ;PRINT BELL, PERIOD, SPACE
  112.     DB    BEL,'. ',0
  113.     CALL    DELAY    ;WAIT 5 SECONDS
  114.     LDA    CNT    ;GET ATTEMPT COUNTER
  115.     DCR    A    ;DONE WITH ALERT ATTEMPTS?
  116.     STA    CNT    ;SAVE NEW COUNT
  117.     JNZ    START1    ;NOT DONE WITH ATTEMPTS, DO MORE
  118.     CALL    ILPRT    ;PRINT:
  119.     DB    CR,LF,CR,LF,'Sorry, no operator available - ',CR,LF
  120.     DB    'Please leave your request on '
  121. ;
  122.     IF    CBBS
  123.     DB    'CBBS'
  124.     ENDIF
  125. ;
  126.     IF    NOT CBBS
  127.     DB    'MINICBBS'
  128.     ENDIF
  129. ;
  130.     DB    '.',CR,LF,0
  131.     JMP    EXIT    ;EXIT TO CP/M
  132. ;
  133.     IF    FASTCLK    ;4 MHZ SYSTEM CLOCK
  134. DELAY:    MVI    A,11    ;NUMBER OF 1 SECOND DELAYS +1 * 2
  135.     ENDIF
  136. ;
  137.     IF    NOT FASTCLK
  138. DELAY:    MVI    A,6    ;NUMBER OF 1 SECOND DELAYS + 1
  139.     ENDIF
  140. ;
  141. DELAY1:    LXI    H,0
  142.     LXI    D,1    ;LOOP DELAY VALUES
  143. ;
  144. WAIT:    DAD    D    ;WAIT BETWEEN BELL RINGS
  145.     JNC    WAIT
  146.     DCR    A    ;DONE?
  147.     JNZ    DELAY1    ;NO, LOOP
  148. ;
  149.     CALL    CSTAT    ;GET CONSOLE STATUS
  150.     ORA    A    ;CHARACTER WAITING?
  151.     RZ        ;NO, RETURN
  152.     CALL    CONIN    ;GET CHARACTER
  153.     CPI    ACK    ;WAS IT THE RIGHT ANSWER?
  154.     RNZ        ;NO? THEN TRY AGAIN
  155. ;
  156.     POP    PSW    ;FIX STACK
  157.     CALL    ILPRT    ;PRINT:
  158.     DB    CR,LF,CR,LF
  159.     DB    'Operator is available, enter CTL-C to exit CHAT'
  160.     DB    CR,LF,BEL,'Please go ahead:'
  161.     DB    CR,LF,CR,LF,0
  162. ;
  163. ;Conversation routine - uses direct CBIOS I/O to
  164. ;prevent control characters from being echoed.
  165. ;
  166. CONT:    CALL    CONIN    ;GET CONSOLE INPUT WITH NO ECHO
  167.     CPI    CONTC    ;CONTROL-C ?
  168.     JZ    EXIT    ;YES, EXIT TO CP/M
  169.     CPI    CR    ;CARRIAGE RETURN?
  170.     JZ    CRLF    ;YES, SEND CRLF
  171.     CPI    BAKSP    ;BACKSPACE?
  172.     JZ    BACKIT    ;YES, DO BACKSPACE SPACE BACKSPACE
  173.     CPI    ' '    ;SPACE OR ABOVE?
  174.     JC    CONT    ;IT'S A CTL CHARACTER, CONTINUE LOOPING
  175.     PUSH    PSW    ;SAVE CHARACTER ON STACK
  176.     MOV    C,A    ;CHARACTER TO C FOR CBIOS
  177.     CALL    CONOUT    ;SEND CHARACTER TO CONSOLE
  178.     POP    B    ;GET CHARACTER TO B FROM STACK
  179.     LDA    LCNT    ;GET CHARACTER COUNT
  180.     INR    A    ;INCREMENT COUNTER
  181.     STA    LCNT    ;SAVE NEW COUNT
  182.     CPI    63    ;AT END OF LINE LIMIT?
  183.     JZ    CRLF    ;YES, GIVE AUTO CRLF
  184.     CPI    58    ;NEAR END OF LINE LIMIT?
  185.     JC    CONT    ;NO, CONTINUE LOOPING
  186.     MOV    A,B    ;GET CHARACTER
  187.     CPI    ' '    ;SPACE?
  188.     JNZ    CONT    ;NO, CONTINUE LOOPING
  189. ;
  190. CRLF:    CALL    ILPRT    ;PRINT:
  191.     DB    CR,LF,0
  192.     XRA    A    ;ZERO CHARACTER COUNTER
  193.     STA    LCNT
  194.     JMP    CONT    ;CONTINUE LOOPING
  195. ;
  196. BACKIT:    LDA    LCNT    ;GET CHARACTER COUNT
  197.     DCR    A    ;SUBTRACT ONE BECAUSE OF BACKSPACE
  198.     JM    CONT    ;DONT GO PAST ZERO
  199.     STA    LCNT    ;SAVE NEW COUNT
  200.     CALL    ILPRT    ;PRINT
  201.     DB    BAKSP,' ',BAKSP,0
  202.     JMP    CONT    ;CONTINUE LOOPING
  203. ;
  204. ;Inline print routine
  205. ;
  206. ILPRT:    XTHL        ;SAVE HL, GET MSG
  207. ;
  208. ILPLP:    MOV    C,M    ;GET CHAR
  209.     PUSH    H
  210.     CALL    CONOUT    ;OUTPUT IT
  211.     POP    H
  212.     INX    H    ;POINT TO NEXT
  213.     MOV    A,M    ;TEST
  214.     ORA    A    ;...FOR END
  215.     JNZ    ILPLP
  216.     XTHL        ;RESTORE HL, RETURN ADDRESS
  217.     RET        ;RETURN PAST MESSAGE STRING
  218. ;
  219. EXIT:    LHLD    STACK    ;GET OLD CP/M (OR MP/M) STACK
  220.     SPHL        ;RESTORE OLD STACK POINTER
  221.     RET        ;RETURN TO CCP
  222. ;
  223. CSTAT:    JMP    $-$    ;MODIFIED AT INIT
  224. ;
  225. CONIN:    JMP    $-$    ;MODIFIED AT INIT
  226. ;
  227. CONOUT:    JMP    $-$    ;MODIFIED AT INIT
  228. ;
  229. CNT:    DB    ALERT    ;ALERT COUNTER
  230. LCNT:    DB    0    ;LINE POSITION COUNTER
  231. ;
  232.     DS    64    ;ROOM FOR 32 LEVEL STACK
  233. STACK    DS    2    ;OLD CP/M (OR MP/M) STACK SAVED HERE
  234. ;
  235.     IF    MPMPRL
  236.     DB    0    ;FORCE ALLOCATION OF STORAGE SPACE
  237.     ENDIF
  238. ;
  239.     END    START
  240.