home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv044.ark / CHAT16.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  302 lines

  1. ;            CHAT.ASM ver 1.6
  2. ;            (revised 4/19/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. ;04/19/81 Added DACBELL option for systems having a D-to-A type music
  18. ;      board (such as Newtech).  This allows summoning the operator
  19. ;      when the system console is turned off.  (Bruce Ratoff)
  20. ;
  21. ;01/02/81 Fixed TRUE/FALSE equates (FALSE was never used), changed
  22. ;      signon message, fixed conditional on ORG statement,
  23. ;      cleaned up file. (KBP)
  24. ;
  25. ;12/20/80 Modified so no warm boot on exit, TRUE/FALSE equates
  26. ;      for ALTCPM, FASTCLK, MPMPRL, MINICBBS (or CBBS) message.
  27. ;      Also inform user to use CTL-C to exit.  By Kelly Smith.
  28. ;
  29. ;12/14/80 Modified to use direct calls to CBIOS I/O to make
  30. ;      compatible with CP/M 1.4, 2.x, and MP/M.  (KBP)
  31. ;
  32. ;12/09/80 Rewritten to optimize code, correct stack problems,
  33. ;      add backspace routine, reduce number of bells,
  34. ;      add user selectable operator acknowledge code, 
  35. ;      eliminate unnecessary subroutines, add additional
  36. ;      comments and add base equare for ALTCPM.
  37. ;        By Keith Petersen W8SDZ, and Dave Hardy
  38. ;
  39. FALSE    EQU    0      ;DEFINE FALSE
  40. TRUE    EQU    NOT FALSE ;DEFINE TRUE
  41. ;
  42. ;Conditional assembly switches
  43. ;
  44. STDCPM    EQU    TRUE     ;TRUE IF STANDARD CP/M
  45. ALTCPM    EQU    FALSE    ;TRUE IF ALTERNATE CP/M (HEATH H8 & TRS-80 MODEL I)
  46. MPMPRL    EQU    FALSE    ;TRUE IF MP/M PROGRAM RELOCATABLE FORMAT
  47. FASTCLK    EQU    TRUE     ;TRUE IF 4 MHZ SYSTEM CLOCK
  48. CBBS    EQU    FALSE    ;TRUE IF CBBS MESSAGE (MINICBBS = FALSE)
  49. DACBELL    EQU    TRUE    ;TRUE IF MUSIC BOARD INSTEAD OF CONTROL-G FOR BELL
  50. DACPORT    EQU    24H    ;I/O PORT CONTAINING D-TO-A
  51.  
  52. ;
  53. ;Define base address of system
  54. ;
  55.     IF    STDCPM
  56. BASE    EQU    0
  57.     ENDIF
  58. ;
  59.     IF    ALTCPM
  60. BASE    EQU    4200H
  61.     ENDIF
  62. ;
  63. ;Define operator acknowledge code
  64. ;
  65. ACK    EQU    1BH    ;ESCAPE KEY
  66. ;
  67. ;Define number of alert attempts
  68. ;
  69. ALERT    EQU    6    ;SIX SEEMS ENOUGH
  70. ;
  71. ;Define ASCII characters used
  72. ;
  73. BEL    EQU    07H    ;BELL
  74. CR    EQU    0DH    ;CARRIAGE RETURN
  75. LF    EQU    0AH    ;LINE FEED
  76. CONTC    EQU    03H    ;CONTROL-C, CHAT-MODE EXIT CHARACTER
  77. BAKSP    EQU    08H    ;BACKSPACE
  78. ;
  79. ;BDOS equates
  80. ;
  81. BDOS    EQU    BASE+5    ;BDOS CALL ADDRESS
  82. PRINT    EQU    9    ;PRINT STRING FUNCTION
  83. ;
  84.     IF    MPMPRL
  85.     ORG    BASE
  86.     ENDIF
  87. ;
  88.     IF    NOT MPMPRL
  89.     ORG    BASE+100H
  90.     ENDIF
  91. ;
  92. START:    LXI    H,0
  93.     DAD    SP     ;GET OLD STACK POINTER
  94.     SHLD    STACK     ;SAVE IT
  95.     LXI    SP,STACK ;SET NEW STACK POINTER
  96. ;
  97. ;Initialize jumps to CBIOS for direct I/O
  98. ;
  99.     LHLD    BASE+1     ;GET POINTER TO CBIOS
  100.     LXI    D,3     ;READY FOR ADD
  101.     DAD    D     ;HL = CONSTAT VECTOR
  102.     SHLD    CSTAT+1     ;MODIFY JUMP
  103.     DAD    D     ;HL = CONIN VECTOR
  104.     SHLD    CONIN+1     ;MODIFY JUMP
  105.     DAD    D     ;HL = CONOUT VECTOR
  106.     SHLD    CONOUT+1 ;MODIFY JUMP
  107. ;
  108. ;Print signon message
  109. ;
  110.     CALL    ILPRT    ;PRINT:
  111.     DB    CR,LF,'CHAT ver 1.6 - Remote conversation utility.'
  112.     DB    CR,LF,'Program returns to system in 30 seconds'
  113.     DB    CR,LF,'if operator is unavailable.'
  114.     DB    CR,LF,CR,LF,'Alerting operator now . ',0
  115. ;
  116. ;Attempt to alert operator
  117. ;
  118. START1:
  119.  
  120.     IF    DACBELL
  121.     CALL    DING
  122.     CALL    ILPRT
  123.     DB    '. ',0
  124.     ENDIF
  125.  
  126.     IF    NOT DACBELL
  127.     CALL    ILPRT    ;PRINT BELL, PERIOD, SPACE
  128.     DB    BEL,'. ',0
  129.     ENDIF
  130.  
  131.     CALL    DELAY    ;WAIT 5 SECONDS
  132.     LDA    CNT    ;GET ATTEMPT COUNTER
  133.     DCR    A    ;DONE WITH ALERT ATTEMPTS?
  134.     STA    CNT    ;SAVE NEW COUNT
  135.     JNZ    START1    ;NOT DONE WITH ATTEMPTS, DO MORE
  136.     CALL    ILPRT    ;PRINT:
  137.     DB    CR,LF,CR,LF,'Sorry, no operator available - ',CR,LF
  138.     DB    'Please leave your request on '
  139. ;
  140.     IF    CBBS
  141.     DB    'CBBS'
  142.     ENDIF
  143. ;
  144.     IF    NOT CBBS
  145.     DB    'RIBBS'
  146.     ENDIF
  147. ;
  148.     DB    '.',CR,LF,0
  149.     JMP    EXIT    ;EXIT TO CP/M
  150. ;
  151.     IF    DACBELL
  152. DING:
  153.     MVI    B,0FCH        ; INITIAL DAC VALUE
  154. DING1:
  155.     ENDIF
  156.     IF    DACBELL AND FASTCLK
  157.     MVI    C,128        ; DURATION COUNTER
  158.     ENDIF
  159.     IF    DACBELL AND NOT FASTCLK
  160.     MVI    C,64        ; DURATION COUNTER
  161.     ENDIF
  162.     IF    DACBELL
  163. DING2:
  164.     SUB    A        ; DAC TO 0
  165.     OUT    DACPORT
  166.     CALL    DINGDLY        ; WAIT 1/2 CYCLE
  167.     MOV    A,B
  168.     OUT    DACPORT        ; MAKE SOME SOUND
  169.     CALL    DINGDLY
  170.     DCR    C
  171.     JNZ    DING2
  172.     ANI    0FCH        ; IGNORE LOW BITS
  173.     RZ            ; QUIT IF DONE RINGING
  174.     RAR            ; DECAY THE TONE SOME
  175.     MOV    B,A        ; SAVE IT
  176.     JMP    DING2        ; LOOP FOR DURATION
  177.     ENDIF
  178.  
  179.     IF    DACBELL AND FASTCLK
  180. DINGDLY:
  181.     MVI    E,80H        ; COUNTER FOR 1/2 CYCLE DELAY
  182.     ENDIF
  183.  
  184.     IF    DACBELL AND NOT FASTCLK
  185.     MVI    E,40H
  186.     ENDIF
  187.  
  188.     IF    DACBELL
  189. DINGDLY1:
  190.     DCR    E
  191.     JNZ    DINGDLY1
  192.     RET
  193.     ENDIF
  194. ;
  195.     IF    FASTCLK    ;4 MHZ SYSTEM CLOCK
  196. DELAY:    MVI    A,11    ;NUMBER OF 1 SECOND DELAYS +1 * 2
  197.     ENDIF
  198. ;
  199.     IF    NOT FASTCLK
  200. DELAY:    MVI    A,6    ;NUMBER OF 1 SECOND DELAYS + 1
  201.     ENDIF
  202. ;
  203. DELAY1:    LXI    H,0
  204.     LXI    D,1    ;LOOP DELAY VALUES
  205. ;
  206. WAIT:    DAD    D    ;WAIT BETWEEN BELL RINGS
  207.     JNC    WAIT
  208.     DCR    A    ;DONE?
  209.     JNZ    DELAY1    ;NO, LOOP
  210. ;
  211.     CALL    CSTAT    ;GET CONSOLE STATUS
  212.     ORA    A    ;CHARACTER WAITING?
  213.     RZ        ;NO, RETURN
  214.     CALL    CONIN    ;GET CHARACTER
  215.     CPI    ACK    ;WAS IT THE RIGHT ANSWER?
  216.     RNZ        ;NO? THEN TRY AGAIN
  217. ;
  218.     POP    PSW    ;FIX STACK
  219.     CALL    ILPRT    ;PRINT:
  220.     DB    CR,LF,CR,LF
  221.     DB    'Operator is available, enter CTL-C to exit CHAT'
  222.     DB    CR,LF,BEL,'Please go ahead:'
  223.     DB    CR,LF,CR,LF,0
  224. ;
  225. ;Conversation routine - uses direct CBIOS I/O to
  226. ;prevent control characters from being echoed.
  227. ;
  228. CONT:    CALL    CONIN    ;GET CONSOLE INPUT WITH NO ECHO
  229.     CPI    CONTC    ;CONTROL-C ?
  230.     JZ    EXIT    ;YES, EXIT TO CP/M
  231.     CPI    CR    ;CARRIAGE RETURN?
  232.     JZ    CRLF    ;YES, SEND CRLF
  233.     CPI    BAKSP    ;BACKSPACE?
  234.     JZ    BACKIT    ;YES, DO BACKSPACE SPACE BACKSPACE
  235.     CPI    ' '    ;SPACE OR ABOVE?
  236.     JC    CONT    ;IT'S A CTL CHARACTER, CONTINUE LOOPING
  237.     PUSH    PSW    ;SAVE CHARACTER ON STACK
  238.     MOV    C,A    ;CHARACTER TO C FOR CBIOS
  239.     CALL    CONOUT    ;SEND CHARACTER TO CONSOLE
  240.     POP    B    ;GET CHARACTER TO B FROM STACK
  241.     LDA    LCNT    ;GET CHARACTER COUNT
  242.     INR    A    ;INCREMENT COUNTER
  243.     STA    LCNT    ;SAVE NEW COUNT
  244.     CPI    63    ;AT END OF LINE LIMIT?
  245.     JZ    CRLF    ;YES, GIVE AUTO CRLF
  246.     CPI    58    ;NEAR END OF LINE LIMIT?
  247.     JC    CONT    ;NO, CONTINUE LOOPING
  248.     MOV    A,B    ;GET CHARACTER
  249.     CPI    ' '    ;SPACE?
  250.     JNZ    CONT    ;NO, CONTINUE LOOPING
  251. ;
  252. CRLF:    CALL    ILPRT    ;PRINT:
  253.     DB    CR,LF,0
  254.     XRA    A    ;ZERO CHARACTER COUNTER
  255.     STA    LCNT
  256.     JMP    CONT    ;CONTINUE LOOPING
  257. ;
  258. BACKIT:    LDA    LCNT    ;GET CHARACTER COUNT
  259.     DCR    A    ;SUBTRACT ONE BECAUSE OF BACKSPACE
  260.     JM    CONT    ;DONT GO PAST ZERO
  261.     STA    LCNT    ;SAVE NEW COUNT
  262.     CALL    ILPRT    ;PRINT
  263.     DB    BAKSP,' ',BAKSP,0
  264.     JMP    CONT    ;CONTINUE LOOPING
  265. ;
  266. ;Inline print routine
  267. ;
  268. ILPRT:    XTHL        ;SAVE HL, GET MSG
  269. ;
  270. ILPLP:    MOV    C,M    ;GET CHAR
  271.     PUSH    H
  272.     CALL    CONOUT    ;OUTPUT IT
  273.     POP    H
  274.     INX    H    ;POINT TO NEXT
  275.     MOV    A,M    ;TEST
  276.     ORA    A    ;...FOR END
  277.     JNZ    ILPLP
  278.     XTHL        ;RESTORE HL, RETURN ADDRESS
  279.     RET        ;RETURN PAST MESSAGE STRING
  280. ;
  281. EXIT:    LHLD    STACK    ;GET OLD CP/M (OR MP/M) STACK
  282.     SPHL        ;RESTORE OLD STACK POINTER
  283.     RET        ;RETURN TO CCP
  284. ;
  285. CSTAT:    JMP    $-$    ;MODIFIED AT INIT
  286. ;
  287. CONIN:    JMP    $-$    ;MODIFIED AT INIT
  288. ;
  289. CONOUT:    JMP    $-$    ;MODIFIED AT INIT
  290. ;
  291. CNT:    DB    ALERT    ;ALERT COUNTER
  292. LCNT:    DB    0    ;LINE POSITION COUNTER
  293. ;
  294.     DS    64    ;ROOM FOR 32 LEVEL STACK
  295. STACK    DS    2    ;OLD CP/M (OR MP/M) STACK SAVED HERE
  296. ;
  297.     IF    MPMPRL
  298.     DB    0    ;FORCE ALLOCATION OF STORAGE SPACE
  299.     ENDIF
  300. ;
  301.     END    START
  302.