home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / RCPM / NUCHAT12.AQM / NUCHAT12.ASM
Assembly Source File  |  2000-06-30  |  19KB  |  987 lines

  1. ;        NEW    CHAT    version 1.2
  2.  
  3. ;    This is basically the program CHAT....PLUS!!!
  4.  
  5. ; This program is similar in nature as the 'message service' for a
  6. ; SYSOP  on a BBS. The  main  point is, that it can be used in the
  7. ; command line in CP/M.  I was tired of having to re-enter the BBS
  8. ; just to  leave a  message  because the  SYSOP didn't  answer  on
  9. ; CHAT.
  10.  
  11. ; It should also be noted that this program has  NO provisions for
  12. ; anything less than CP/M 2.x...
  13.  
  14. ;-----------------------------------------------------------------
  15.  
  16. ;See the related DOC file for more information....
  17.  
  18. ;Origional version by: Roderick Hart
  19.  
  20. ;Several people have made upgrades to various versions of CHAT,
  21. ;this program uses only some of them.
  22.  
  23. ;Sorry, I do not have all the names to give proper credit.
  24.  
  25. ;This version written by:
  26. ;(except where noted)
  27.  
  28. ;Version 1.0
  29.  
  30. ;        R. Kester
  31. ;        Springfield, VA.
  32.  
  33. ;###############################
  34.  
  35. ;Version 1.1
  36.  
  37. ;    I don't know, was there? (Just in case)
  38.  
  39. ;Version 1.2
  40.  
  41. ;        R. Kester
  42. ;Cleaned up code and added the some of the latest upgrades for CHAT.
  43. ;These  include:  Aborting  immediately from  ethier ^Z or  ACK, and
  44. ;sending name to CRT (if SEEIT=YES).
  45.  
  46. ;I don't care what you say, the YES/NO is a good idea!
  47. NO    EQU    0
  48. YES    EQU    0FFH
  49.  
  50. STDCPM    EQU    YES        ;True if standard CP/M
  51. ALTCPM    EQU    NO        ;True if other than 'standard' (TRS-80, etc.)
  52.  
  53. ;Define base of CP/M..
  54.     IF    STDCPM
  55. BASE    EQU    0
  56.     ENDIF
  57.  
  58.     IF    ALTCPM
  59. BASE    EQU    4200H
  60.     ENDIF
  61.  
  62.     ORG    BASE+100H
  63.  
  64. ;Version 1.2
  65. VER    EQU    12        ;* Version number
  66.  
  67. CONOUT    EQU    2        ;Console type (character)
  68. BDOS    EQU    BASE+5
  69. FCB    EQU    5CH
  70. OPEN    EQU    0FH        ;Open file
  71. MAKE    EQU    16H        ;Create file
  72. READ    EQU    14H        ;Read sequentially
  73. WRITE    EQU    15H        ;Write sequentially
  74. CLOSE    EQU    10H        ;Close file
  75. SETDMA    EQU    1AH        ;Set DMA addr.
  76. USR    EQU    20H        ;Set new user area
  77. DEFBUF    EQU    80H        ;CP/M default buffer
  78.  
  79. CR    EQU    0DH
  80. LF    EQU    0AH
  81. BELL    EQU    07
  82. SPACE    EQU    20H
  83. SECT    EQU    80H
  84.  
  85. ABORT    EQU    'A'-40H        ;^A, for aborting in MESSAGE mode.
  86. BYBY    EQU    'C'-40H        ;^C, for aborting in CHAT mode.
  87. FINIS    EQU    'S'-40H        ;^S, for saving data in ANY mode.
  88. EOF    EQU    'Z'-40H        ;^Z, End-Of-File mark.
  89. TIRED    EQU    'X'-40H        ;^X, for aborting PAGE mode.
  90. BACKUP    EQU    'H'-40H        ;^H, for BACKSPACE
  91. DEL    EQU    7FH        ;Delete character
  92.  
  93.     JMP    START
  94.  
  95. ; NOTE:  When specifying the drive code, enter the number
  96. ; corresponding to the drive.
  97. ; i.e.        0=current drive
  98. ;        1=drive 'A'
  99. ;        2=drive 'B'.....etc.
  100.  
  101. ; 'MEMLIM' = This allows that number (MEMLIM) of bytes to be added
  102. ; starting at BUFF.  BUFF is the area directly following this pro-
  103. ; gram where all received characters are stored, INCLUDING already
  104. ; existing messages (if any). i.e. If the value of MEMLIM were 50,
  105. ; then this program would only allow 50 bytes to be placed in mem-
  106. ; ory. It would then issue an error telling the user it is running
  107. ; low on memory and  automatically  'close up shop'.  It should be
  108. ; noted that,  even if it does enter the error condition, it still
  109. ; includes the LASTCALR information. So this number should be used
  110. ; as a reference only.
  111.  
  112. ; I.E. 20,000 = 20,000 BYTE MESSAGE FILE.
  113.  
  114. ;* * * * * *  USER MOD AREA   * * * * * *
  115.  
  116. ;*    Message limit (see note above)    *
  117. MEMLIM    EQU    20000 
  118.  
  119. ;*  Set to your CPU clock speed in MHZ    *
  120. CPUMHZ    EQU    5
  121.  
  122. ;*        Make for many bells        *
  123. NOISEY    EQU    YES
  124.  
  125. ;*  Delay value (fine tune max=65,535)    *
  126. DELVAL    EQU    62000
  127.  
  128. ;*    Do we use a LASTCALR file    *
  129. RBBS    EQU    YES
  130.  
  131. ;*    SYSOP acknowledge (escape key)    *
  132. ACK    EQU    1BH
  133.  
  134. ;*     # of characters per line    *
  135. LIMIT    EQU    72
  136.  
  137. ;*         Alert attempts        *
  138. ALERT    EQU    6
  139.  
  140. ;*   How many repetitive characters?    *
  141. ;*     - see note under 'Features'    *
  142. TOMANY    EQU    LIMIT-8
  143.  
  144. ;*   User area you want messages in    *
  145. USER    EQU    10
  146.  
  147. ;*  Drive for messages, put number here    *
  148. DFDRV    EQU    1
  149.  
  150. ;*     Drive with LASTCALR on it    *
  151. CALLDR    EQU    1
  152.  
  153. ;*      User area of LASTCALR        *
  154. CALLU    EQU    0
  155.  
  156. ;*   File name created for messages    *
  157. ;*         spaces ||||||||||| =11      *
  158. FNAME    DB DFDRV,'MESSAGE CPM'
  159. ;*         spaces ||||||||||| =11      *
  160.  
  161. ;* Set the following YES - ONLY if you    *
  162. ;* want the  LASTCALR  name sent to the    *
  163. ;* CRT, AND RBBS is YES...         *
  164.  
  165. SEEIT    EQU    YES
  166.  
  167. ;*     End of option selections    *
  168. ;****************************************
  169.  
  170. ; From here on, you shouldn't need to modify anything else...
  171.  
  172.     IF RBBS
  173. DBUF    EQU    80H
  174. BSIZE    EQU    80H
  175.  
  176. CALLERFCB:
  177.     DB    CALLDR,'LASTCALR   ',0
  178.     DS    23
  179.     DB    0FFH
  180.  
  181. CALLERADR:DW    DBUF
  182. CALLERSIZ:EQU    BSIZE
  183. CALLERLEN:DW    BSIZE
  184. CALLERPTR:DS    2
  185.     ENDIF        ;RBBS
  186.  
  187. START:
  188. ; Do the usual routine for the SP
  189.  
  190.     LXI    H,0
  191.     DAD    SP
  192.     SHLD    STACK
  193.     LXI    SP,STACK
  194.  
  195. ; Initialize direct CBIOS calls
  196.  
  197.     LHLD    1
  198.     LXI    D,3
  199.     DAD    D
  200.     SHLD    CSTAT+1        ;Con stat
  201.     DAD    D
  202.     SHLD    CIN+1        ;Con in
  203.     DAD    D
  204.     SHLD    COUT+1        ;Con out
  205.  
  206. ; Get current user area and save it
  207.  
  208.     MVI    E,0FFH
  209.     MVI    C,USR
  210.     CALL    BDOS
  211.     STA    OLDUSR        ;Save it for return
  212.  
  213. ;Get any potential options next...
  214.     LDA    DEFBUF+1
  215.     ORA    A
  216.     JZ    NONE1
  217.     LDA    DEFBUF+2
  218.     STA    OPT
  219.  
  220. NONE1:
  221.     IF    RBBS
  222.     XRA    A
  223.     STA    CALLERFCB+12
  224.     STA    CALLERFCB+32
  225.     LXI    H,CALLERSIZ
  226.     SHLD    CALLERLEN
  227.     SHLD    CALLERPTR
  228.  
  229.     MVI    E,CALLU        ;Set area for LASTCALR
  230.     MVI    C,USR
  231.     CALL    BDOS
  232.  
  233.     LXI    D,CALLERFCB
  234.     MVI    C,OPEN
  235.     CALL    BDOS
  236.     CPI    YES        ;Was it successful?
  237.     JNZ    OPENOK        ;Zero = No
  238.  
  239.     CALL    ILPRT
  240.     DB BELL,CR,LF,LF
  241.     DB 'ERROR --> LASTCALR file not found!...ABORTING'
  242.     DB CR,LF,LF,0
  243.  
  244.     JMP    LEAVE
  245.  
  246. OPENOK:
  247.     LXI    D,DEFBUF    ;Make sure we have
  248.     MVI    C,SETDMA    ; the default buffer
  249.     CALL    BDOS
  250.  
  251.     MVI    C,READ
  252.     LXI    D,CALLERFCB
  253.     CALL    BDOS
  254.     ORI    0FFH
  255.     JNZ    ROK
  256.  
  257.     CALL    ILPRT
  258.     db bell,cr,lf,lf
  259.     DB 'ERROR -> Can''t read LASTCALR file!'
  260.     DB CR,LF,LF,0
  261.     JMP    LEAVE
  262.  
  263. ROK:
  264.     CALL    VEIW        ;Set up name
  265.     MVI    M,'$'        ;Mark end
  266.     ENDIF        ;RBBS
  267.  
  268. ; Do sign-on
  269.     CALL    ILPRT
  270. DB CR,LF,LF
  271. DB '                    New Chat v'
  272. DB VER/10+'0','.',VER MOD 10+'0'
  273. DB CR,LF,LF,0
  274.  
  275. ; If the operator wishes to see the caller's name during paging.
  276.     IF    SEEIT AND RBBS
  277.     LXI    D,OTMSG        ;Send first part
  278.     CALL    OLOOP        ;Send bytes
  279.     LXI    D,DEFBUF    ;Point to name
  280.     CALL    OLOOP        ;Send name to CRT
  281.     LXI    D,OMSG        ;Send last part
  282.     CALL    OLOOP        ;Send bytes
  283.     JMP    STAR
  284.  
  285. OLOOP:
  286.     LDAX    D
  287.     CPI    '$'
  288.     RZ
  289.     MOV    C,A
  290.     INX    D
  291.     PUSH    D
  292. ZLOOP:
  293.     CALL    COUT
  294.     POP    D
  295.     JMP    OLOOP
  296.  
  297. OTMSG:    DB CR,LF,'Please hang on $'
  298. OMSG:    DB ', I''ll check.',CR,LF,LF,'$'
  299.     ENDIF        ;SEEIT AND RBBS
  300.  
  301. ; First, move the FNAME into the FCB
  302. STAR:
  303.     MVI    B,12        ;Number of bytes to move
  304.     LXI    H,FCB        ;The 'to' place
  305.     LXI    D,FNAME        ;The 'what to move' name
  306. LOOP:
  307.     LDAX    D
  308.     MOV    M,A
  309.     INX    H
  310.     INX    D
  311.     DCR    B
  312.     JNZ    LOOP
  313.     CALL    CLRFCB        ;Clear certain extensions
  314.  
  315. ; And set the area for the messages...
  316.     MVI    E,USER
  317.     MVI    C,USR
  318.     CALL    BDOS
  319.  
  320.     LXI    D,FCB
  321.     MVI    C,OPEN
  322.     CALL    BDOS
  323.     CPI    YES        ;Was it successful?
  324.     JZ    MAKEIT        ;Zero = make it the first time
  325.  
  326. ; Now read in the current contents...
  327.  
  328.     LXI    D,BUFF        ;Point to message buffer
  329. RLOOP:
  330.     MVI    C,SETDMA
  331.     PUSH    D
  332.     CALL    BDOS
  333.     LXI    D,FCB        ;Point to name
  334.     MVI    C,READ        ;Read it in
  335.     CALL    BDOS
  336.     POP    D
  337.     ORA    A        ;Finished?
  338.     JNZ    FINISHED    ;Zero = not finished
  339.     LXI    H,SECT        ;Sector value
  340.     DAD    D        ;HL has new DMA addr.
  341.     XCHG
  342.     JMP    RLOOP
  343.  
  344. CLRFCB:
  345.     XRA    A
  346.     STA    FCB+12
  347.     STA    FCB+32
  348.     RET
  349.  
  350. ; We finished reading the file into the buffer
  351. FINISHED:
  352.     XCHG            ;Get the last DMA for a double check
  353.     SHLD    POINTR    
  354.     CALL    CLRFCB        ;Clear the record info for writing
  355.     CALL    SEARCH        ;Find the EOF mark and cancel it.
  356.                 ; and then reset the POINTR.
  357.  
  358. ; See if any requests are there
  359. MAKDON:
  360.     LDA    OPT
  361.     CPI    NO
  362.     JZ    NONE
  363.     CPI    'D'
  364.     JZ    DIRECT
  365.     CPI    'C'
  366.     JZ    SYYES
  367.     JMP    INSTRUC
  368.  
  369. SYYES:
  370.     MVI    A,YES        ;Mark for sysop
  371.     STA    OPFLG
  372.  
  373.     CALL    ILPRT
  374.     DB 'ch> ',0        ;CHAT prompt
  375.  
  376.     JMP    READIT
  377.  
  378. INSTRUC:
  379.  
  380. ; Otherwise give brief instructions
  381.     CALL    ILPRT
  382.     DB CR,LF
  383.     DB 'Remote conversation utility.'
  384.     DB CR,LF,LF
  385.     DB 'Usage:'
  386.     DB CR,LF,LF
  387.     DB 'When the  program is invoked, it rings the bell at  operator''s'
  388.     DB CR,LF
  389.     DB 'console, signaling that  you wish to "converse" with the sysop'
  390.     DB CR,LF
  391.     DB 'If the operator is available, you will be signaled to go ahead'
  392.     DB CR,LF
  393.     DB 'If not, the message  mode is entered  and you may type in your'
  394.     DB CR,LF
  395.     db 'message.'
  396.     DB CR,LF,LF,0
  397.  
  398. NONE:
  399.     CALL    ILPRT
  400.     DB 'Fetching operator...'
  401.     DB CR,LF
  402.     DB 'Use Cntrl-X to abort alert sooner.'
  403.     DB CR,LF,LF
  404.     DB 'Ringing and counting down... ',0
  405.  
  406. STARIT:
  407.     CALL    ILPRT
  408.     DB BELL,08,0        ;Bell & backspace
  409.  
  410.     LHLD    DECNT        ;Get count value (same as CNT)
  411.     DCX    H
  412.     SHLD    DECNT        ;Save it again
  413.     INX    H
  414.     CALL    DECOUT        ;Display the number (and count down)
  415.     CALL    DELAY        ;Wait some seconds
  416.     LDA    CNT        ;get attempt counter
  417.     DCR    A        ;Done with alert attempts?
  418.     STA    CNT        ;Save new count
  419.     JNZ    STARIT
  420.  
  421. NOHERE:
  422.     CALL    ILPRT
  423.     DB CR
  424.     DB 'Sorry',0
  425.  
  426.     IF    SEEIT AND RBBS
  427.     CALL    FIRSTNM
  428.     ENDIF        ;SEEIT AND RBBS
  429.  
  430.     CALL    ILPRT
  431.     DB ', no operator available - BUT...'
  432.     DB CR,LF,LF,LF,0
  433.  
  434. DIRECT:
  435.     CALL    ILPRT
  436.     DB 'When the  -:  prompt appears, you may  start entering'
  437.     DB CR,LF
  438.     DB 'your message. Hitting the RETURN key is not necessary'
  439.     DB CR,LF
  440.     DB 'for terminating lines. You may  ABORT  the process by'
  441.     DB CR,LF
  442.     DB 'entering a  ^A. Use  ^S  to save message  (quitting).'
  443.     DB CR,LF,LF
  444.     DB 0
  445.  
  446.     JMP    FIRSTPR
  447.  
  448. DECOUT:
  449. ;Display the attempt counter value. We will count down so the caller
  450. ;knows what's happening... (enter with HL = value)
  451.  
  452.     PUSH    PSW
  453.     PUSH    B
  454.     PUSH    D
  455.     PUSH    H
  456.     LXI    B,-10
  457.     LXI    D,-1
  458. DECOUT2:
  459.     DAD    B
  460.     INX    D
  461.     JC    DECOUT2
  462.     LXI    B,10
  463.     DAD    B
  464.     XCHG
  465.     MOV    A,H
  466.     ORA    L
  467.     CNZ    DECOUT
  468.     MOV    A,E
  469.     ADI    '0'
  470.     CALL    TYPE
  471.     POP    H
  472.     POP    D
  473.     POP    B
  474.     POP    PSW
  475.     RET
  476. TYPE:
  477.     PUSH    H
  478.     PUSH    B
  479.     PUSH    D
  480.     PUSH    PSW
  481.     MOV    C,A
  482.     CALL    COUT
  483.     POP    PSW
  484.     POP    D
  485.     POP    B
  486.     POP    H
  487.     RET
  488.  
  489. DELAY:    MVI    A,CPUMHZ    ;Clock speed
  490.  
  491. DELAY1:
  492.     IF    NOISEY
  493.     PUSH    PSW
  494.     MVI    C,BELL
  495.     CALL    COUT
  496.     POP    PSW
  497.     ENDIF            ;NOISEY
  498.  
  499.     LXI    H,DELVAL    ;Set at begining
  500.     LXI    D,1
  501. WAIT:
  502.     PUSH    H        ;Save regs. for upcoming
  503.     PUSH    D
  504.     PUSH    PSW
  505.     MVI    C,06        ;Direct console I/O
  506.     MVI    E,0FFH        ;Request
  507.     CALL    BDOS
  508.     ORA    A
  509.     JNZ    KIO        ;Something, then leave
  510. CMBCK:
  511.     POP    PSW        ;Get regs back
  512.     POP    D
  513.     POP    H
  514.     DAD    D        ;Wait between bell rings
  515.     JNC    WAIT        ;Loop
  516.     DCR    A        ;Done?
  517.     JNZ    DELAY1
  518.     RET
  519.  
  520. KIO:
  521.     CPI    TIRED        ;User has cold feet?
  522.     JZ    LEAVE        ;Yes? then go back to CP/M
  523.     CPI    BYBY
  524.     JZ    LEAVE
  525.     CPI    ACK        ;Was it the right answer?
  526.     JNZ    CMBCK        ;No? then try again
  527.  
  528. ;Operator is present...
  529.     LXI    SP,STACK    ;Fix stack
  530.     MVI    A,YES
  531.     STA    OPFLG        ;Set so we know
  532.  
  533.     CALL    ILPRT
  534.     DB bell,CR
  535.     DB 'Operator is available',0
  536.  
  537.     IF    SEEIT AND RBBS
  538.     CALL    FIRSTNM        ;Type first name
  539.     ENDIF            ;SEEIT AND RBBS
  540.  
  541.     CALL    ILPRT
  542.     DB ', enter CTL-C to exit CHAT.'
  543.     DB CR,LF
  544.     DB 'Please go ahead:'
  545.     DB CR,LF,LF,'ch> ',0        ;CHAT prompt
  546.  
  547.     JMP    READIT
  548.  
  549.     IF    SEEIT AND RBBS
  550. FIRSTNM:
  551.     MVI    C,' '
  552.     CALL    COUT
  553.     LXI    H,DEFBUF
  554. FRST:
  555.     MOV    A,M
  556.     CPI    ' '
  557.     RZ
  558.     MOV    C,A
  559.     PUSH    H
  560.     CALL    COUT
  561.     POP    H
  562.     INX    H
  563.     JMP    FRST
  564.     ENDIF        ;SEEIT AND RBBS
  565.  
  566. FIRSTPR:
  567.     CALL    ILPRT
  568.     DB bell,CR,LF
  569.     DB '      - ^A  aborts       - ^S saves message'
  570.     DB CR,LF,LF
  571.     DB '-: '            ;Freudian message prompt
  572.     DB 0
  573.  
  574. READIT:
  575.     CALL    TESTMEM        ;Check memory limit
  576.     CALL    CIN        ;Get a byte typed
  577.     CPI    BYBY        ;^C?
  578.     JZ    LEAVE        ;Yes
  579.     CPI    FINIS        ;^S?
  580.     JZ    QUIT        ;Yes?, then tidy up
  581.     CPI    ABORT        ;Change their mind?
  582.     JZ    STOP        ;Yes?, then don't tidy up
  583.     CPI    CR        ;A return?
  584.     JZ    CRLF        ;Yes?, do the dirty work
  585.     CPI    BACKUP        ;A backspace?
  586.     JZ    BACK        ;Then fix it
  587.     CPI    DEL        ;delete key?
  588.     JZ    BACK        ;Then fix it
  589.     CPI    ' '
  590.     JC    READIT        ;If it equals a value below, then loop
  591.     CALL    PUTNMEM        ;Slip it in memory
  592.     PUSH    PSW
  593.     MOV    C,A        ;Swap it for output
  594.     CALL    COUT
  595.     POP    B
  596.     LDA    COUNT        ;How far we gone on the screen?
  597.     INR    A
  598.     STA    COUNT
  599.     CPI    LIMIT        ;Too many characters yet?
  600.     JZ    CRLF
  601.     CPI    LIMIT-8        ;Near the limit?
  602.     JC    READIT
  603.     MOV    A,B        ;Find out if we can
  604.     CPI    ' '        ; help'm out and do a
  605.     JNZ    READIT        ; return for them...
  606.  
  607. CRLF:
  608.     LDA    OPFLG
  609.     CPI    YES        ;Which prompt?
  610.     JZ    NEWP
  611.  
  612.     CALL    ILPRT
  613.     DB CR,LF
  614.     DB '-: '        ;MESSAGE prompt
  615.     DB 0
  616.  
  617.     JMP    PASPR
  618.  
  619. NEWP:
  620.     CALL    ILPRT
  621.     DB CR,LF
  622.     DB 'ch> '        ;CHAT prompt
  623.     DB 0
  624.  
  625. PASPR:
  626.     XRA    A        ;Reset the counter
  627.     STA    COUNT
  628.     MVI    A,CR
  629.     CALL    PUTNMEM
  630.     MVI    A,LF
  631.     CALL    PUTNMEM
  632.     JMP    READIT
  633.  
  634. BACK:
  635.     LDA    COUNT
  636.     DCR    A        ;Sub one for a backspace
  637.     JM    READIT        ;Already at 0?
  638.     STA    COUNT
  639.  
  640.     CALL    ILPRT
  641.     DB BACKUP,' ',BACKUP,0
  642.  
  643.     LHLD    POINTR        ;Get pointer value
  644.     MVI    A,L        ;If it is already
  645.     ORA    H        ; a zero then
  646.     JZ    READIT        ; skip the rest
  647.     DCX    H        ;Sub one for backup
  648.     SHLD    POINTR
  649.     JMP    READIT
  650.  
  651. ; Inline print routine using direct I/O
  652. ILPRT:
  653.     XTHL
  654. ILPLP:
  655.     MOV    C,M
  656.     PUSH    H
  657.     CALL    COUT        ;Send it to the console
  658.     POP    H
  659.     INX    H
  660.     MOV    A,M
  661.     ORA    A        ;Is it a null?
  662.     JNZ    ILPLP
  663.     XTHL
  664.     RET
  665.  
  666. ;Message for SYSOP if too many characters in a row.
  667.  
  668. TOMSG:    DB CR,LF,LF,'This person possibly tried to fool you!',CR,LF,'$'
  669.  
  670. TOERR:
  671.  
  672. ;Enter here when we get too many of the same character in a row.
  673.     CALL    ILPRT
  674. DB BELL,CR,LF,LF
  675. DB 'ERROR -> Too many similar characters, ABORTING!'
  676. DB CR,LF,LF,0
  677.  
  678.     LHLD    ORNPTR        ;Get value before anything was entered
  679.     SHLD    POINTR        ;Make that the current value
  680.     LXI    D,TOMSG        ;Enter a message so SYSOP knows why
  681.     CALL    PLOOP        ; nothing was entered
  682. QUIT:
  683.     MVI    A,CR
  684.     CALL    PUTNMEM
  685.     MVI    A,LF
  686.     CALL    PUTNMEM
  687.     CALL    PUTNMEM
  688.  
  689.     IF    NOT RBBS
  690.     JMP    ALMOST
  691.     ENDIF        ;NOT RBBS
  692.  
  693.     IF    RBBS
  694.     CALL    CALLGET        ;Put callers name there too
  695.     JMP    ALMOST
  696.     ENDIF
  697.  
  698.     IF    SEEIT AND RBBS
  699. ;This routine called from very beginning. Puts the name read in
  700. ;from the file, to the default buffer so we can get at it...
  701. VEIW:
  702.     LXI    H,DEFBUF    ;Where name will go
  703.  
  704. ;Set up callers name for print out, change ',' to  a space...
  705. DLOOP:
  706.     MOV    A,M
  707.     CPI    EOF
  708.     RZ
  709.     CPI    CR
  710.     RZ
  711.  
  712. ALOOP:
  713.     CPI    ','        ;Do not print the comma
  714.     JNZ    BLOP
  715.     MVI    A,' '
  716. BLOOP:
  717.     MOV    M,A
  718. BLOP:
  719.     INX    H
  720.     JMP    DLOOP
  721.     ENDIF            ;SEEIT AND RBBS
  722.  
  723. ; Call this routine each time we enter a byte into the buffer
  724. ; and keep track of twits...
  725. PUTNMEM:
  726.     STA    TEMP
  727.     LHLD    POINTR
  728.     MOV    B,A
  729.     MOV    M,A
  730.     INX    H
  731.     SHLD    POINTR
  732.     LHLD    POINTR
  733.     DCX    H
  734.     DCX    H
  735.     MOV    A,M
  736.     CMP    B        ;The same as B?
  737.     JZ    SETNOT
  738.     CPI    CR
  739.     JZ    SETNOT
  740.     CPI    LF
  741.     JZ    SETNOT
  742.     XRA    A
  743.     STA    MNYCNT
  744.     LDA    TEMP
  745.     RET
  746.  
  747. ;Enter here when we find the same character typed twice in a row.
  748. ;And exit if too many of them, and keep the caller's name.
  749. SETNOT:
  750.     LDA    MNYCNT
  751.     INR    A
  752.     STA    MNYCNT
  753.     CPI    TOMANY        ;Too many of them?
  754.     JZ    TOERR        ;Yes?, then error exit
  755.     LDA    TEMP
  756.     RET
  757.  
  758. ; Test memory limit... if we are there, then quit
  759. TESTMEM:
  760.     LHLD    MEMS        ;The number not to exceed
  761.     XCHG
  762.     LHLD    POINTR        ;The number to compare to
  763.     MOV    A,H        ;Put MS part in A
  764.     CMP    D
  765.     RC
  766.     MOV    A,L
  767.     CMP    E
  768.     RC
  769.  
  770.     CALL    ILPRT
  771. DB CR,LF,LF,BELL
  772. DB 'SORRY -> Ending things, running low on memory!'
  773. DB CR,LF,LF
  774. DB 'Please try again another time...'
  775. DB CR,LF,LF,0
  776.  
  777.     JMP    QUIT
  778.     
  779. MEMS:    DW    BUFF+MEMLIM
  780.  
  781. ; End of message delimeter.
  782.  
  783. ENDING:    DB CR,LF,LF,'+ + + + + + + + + + + + + + + + +',CR,LF,LF,'$'
  784.  
  785. ALMOST:
  786.     LXI    D,ENDING    ;Put the delimmiter in memory
  787.     CALL    PLOOP
  788.     JMP    GONE
  789.  
  790. ;Used elsewhere...
  791. PLOOP:
  792.     LDAX    D
  793.     CPI    '$'
  794.     RZ
  795.     CALL    PUTNMEM        ;Slip byte into memory
  796.     INX    D
  797.     JMP    PLOOP
  798.  
  799. GONE:
  800.     MVI    A,EOF        ;Mark the End of file
  801.     CALL    PUTNMEM
  802.  
  803. ;Change the user area for the message file
  804.     MVI    E,USER
  805.     MVI    C,USR
  806.     CALL    BDOS
  807.     LXI    D,BUFF        ;Beginning of DMA (Start of messages)
  808.     PUSH    D
  809.  
  810. ; Write contents to file...
  811. WLOOP:
  812.     POP    D
  813.     PUSH    D
  814.     MVI    C,SETDMA
  815.     CALL    BDOS
  816.     LXI    D,FCB
  817.     MVI    C,WRITE
  818.     CALL    BDOS
  819.     CPI    NO        ;Successful?
  820.     JNZ    WEXIT        ;Zero = yes
  821.     POP    H
  822.     LXI    D,SECT
  823.     DAD    D
  824.     PUSH    H
  825.     MOV    A,H        ;Get the high byte
  826.     CMA            ;1's compliment
  827.     MOV    D,A        ;Save that in D
  828.     MOV    A,L        ;Get the low byte
  829.     CMA            ;1's compliment
  830.     MOV    E,A        ;Save that in E
  831.     INX    D        ;= inverted current DMA addr.+1
  832.     LHLD    POINTR        ;Get # of bytes that were typed
  833.     DAD    D        ;Effectively -> NEW - CURRENT =
  834.                 ; # of bytes left to write in HL
  835.     MOV    A,H        ;Get the MS value in A
  836.     INR    A
  837.     ANA    A        ;Set any flags? (a -1?)
  838.     JNZ    WLOOP        ;No, then we have more to write.
  839.     POP    H        ;Clean the stack
  840.     JMP    EXIT
  841. ;
  842. WEXIT:
  843.     CALL    ILPRT
  844. DB CR,LF,LF,BELL
  845. DB 'ERROR --> Can''t write file, ABORTING!'
  846. DB CR,LF,LF,0
  847.  
  848.     JMP    LEAVE        ;Leave and do nothing
  849.  
  850. EXIT:
  851.     LXI    D,FCB        ;Point to filename
  852.     MVI    C,CLOSE
  853.     CALL    BDOS
  854.     CPI    YES        ;Successful?
  855.     JNZ    LEAVE        ;Zero = No
  856.  
  857.     CALL    ILPRT
  858. DB CR,LF,LF,BELL
  859. DB 'ERROR --> Can''t close file.......ABORTING!'
  860. DB CR,LF,LF,0
  861.  
  862. LEAVE:
  863.     MVI    C,SETDMA    ;Re-set the DMA
  864.     LXI    D,DEFBUF
  865.     CALL    BDOS
  866.  
  867.     LDA    OLDUSR        ;Return to origional user area
  868.     MOV    E,A
  869.     MVI    C,USR
  870.     CALL    BDOS
  871.  
  872.     LHLD    STACK        ;Get intro. stack
  873.     SPHL            ; for 'soft' return
  874.     RET            ;FINISHED!
  875.  
  876. STOP:
  877.     CALL    ILPRT
  878. DB CR,LF,LF
  879. DB '      * * *  ABORTING! - Nothing saved  * * *'
  880. DB CR,LF,LF,0
  881.     JMP    LEAVE
  882.  
  883. ; Create the file
  884.  
  885. MAKEIT:
  886.     CALL    ILPRT
  887. DB CR,LF
  888. DB 'Creating file...'
  889. DB CR,LF,LF,0
  890.  
  891.     LXI    D,FCB        ;We had to create it
  892.     MVI    C,MAKE
  893.     CALL    BDOS
  894.     CPI    YES        ;successful?
  895.     LXI    H,BUFF
  896.     SHLD    POINTR
  897.     SHLD    ORNPTR
  898.     JZ    MERR        ;Zero = No
  899.     CALL    CLRFCB        ;Clear extensions
  900.     JMP    MAKDON
  901.  
  902. MERR:
  903.     CALL    ILPRT
  904. DB BELL,CR,LF,LF
  905. DB 'ERROR --> No directory space or trouble opening.'
  906. DB CR,LF,LF
  907. DB '...Please try again another time.'
  908. DB CR,LF,LF,0
  909.     JMP    EXIT
  910.  
  911.     IF    RBBS
  912. ; Since the last caller's  name is in the default  buffer,
  913. ; get it from there and do not 'type' the name again to the 
  914. ; CRT... (used for inserting name into file)
  915. CALLGET:
  916.     LXI    D,DEFBUF
  917. HLOOP:
  918.     LDAX    D
  919.     CPI    '$'
  920.     RZ
  921.     PUSH    D
  922.     CALL    PUTNMEM
  923.     POP    D
  924.     INX    D
  925.     JMP    HLOOP
  926.     ENDIF        ;RBBS
  927.  
  928. ;Search the current file and blank out the EOF mark...
  929. SEARCH:
  930.     LXI    D,BUFF        ;Point to beginning
  931.     LHLD    POINTR        ;Get current position
  932. SLOOP:
  933.     LDAX    D        ;Move byte into A
  934.     CPI    EOF        ;Was it the EOF?
  935.     JZ    NULLIT        ;Yep?, then zero it
  936.     INX    D        ;No?, then keep searching
  937.     DCX    H        ;Decrement the pointer
  938.     MOV    A,H        ;Find out if we have no
  939.     ORA    L        ; more positions
  940.     JZ    NULLERR        ;Just used for a double check
  941.     JMP    SLOOP        ;Else, check some more
  942. NULLIT:
  943.     XRA    A        ;Zero A
  944.     XCHG            ;Get position in HL
  945.     MOV    M,A        ;Put a '0' there
  946.     SHLD    POINTR        ;Save the areas
  947.     SHLD    ORNPTR
  948.     RET
  949.  
  950. ; Enter here if we did not find an EOF mark in the available
  951. ; number of positions (double check)
  952. NULLERR:
  953.     CALL    ILPRT
  954. DB BELL,CR,LF,LF
  955. DB 'The validity of the file might be questioned!'
  956. DB CR,LF
  957. DB 'Did NOT find  the EOF mark, and should  have!'
  958. DB CR,LF,LF,0
  959.     RET
  960.  
  961. CSTAT:    JMP    $-$        ;Set upon entry
  962. CIN:    JMP    $-$        ; "    "    "
  963. COUT:    JMP    $-$        ; "    "    "
  964.  
  965. CNT:    DB    ALERT
  966. OPFLG:    DB    NO
  967. VWFLG:    DB    NO
  968. OPT:    DB    NO
  969. COUNT:    DB    0
  970.  
  971. DECNT:    DW    ALERT
  972.  
  973. POINTR:    DS    2
  974. ORNPTR:    DS    2
  975. TEMP:    DS    1
  976. MNYCNT:    DS    1
  977. OLDUSR:    DS    1
  978. DLSPD:    DS    1
  979.  
  980.     DS    64
  981. STACK:
  982.     DS    2        ;storge for stack
  983.  
  984. BUFF    EQU    $        ;Message buffer starts here
  985.  
  986.     END
  987.