CBBS34.DOC 6/18/80 N-O-T-E to previous CBBS implementors wishing to upgrade to version 3.4: You need only add a fourth line to the file "NEXT" which contains a 5 digit, maximum number of active messages. Note that this is character-string compared with the number in the third line, which is the current number of active messages. (I.E. don't put 00320 in line 5, put in (space) (space) 320. As long as you are running a version of CBBS which does not do the message packing, this SHOULD be the only change required. Let me know if it isn't. Since going to the version of CBBS which did not re-number and pack the messages, CBBS has had a problem with the time it took to kill a message. That has now been solved with CBBS 3.4. The primary cause of the slow speed of "K" was that the entire summary was passed thru memory, to "WORKFILE", deleting the single message summary being killed. This is similar to the overhead of doing an edit to a file, except that the "editor" (CBBS) is resident. I had been looking for a long time for a simple way to speed up the kill. It appeared that fancy linked-lists, or some other technique was required, but that went against the grain of the idea of CBBS files: that they all be simple, sequential ASCII files so you may readily use existing utilities on them, such as editors, etc. The solution was to only "flag" the summary as having deleted a message, but to otherwise fully process it. Many people had suggested this technique, perhaps with a file or table of killed message numbers to look at first. But I didn't want to add that level of complexity to CBBS. Now, when a message is killed, the message file is processed, with the message being physically deleted and written to "KILLED" (a history file of messages); The "NEXT" file is processed to update the # of active messages; then the summary is flagged. How? First some background: Some time ago, I made the "Q" and "S" search commands do a binary search for the message. However, I didn't go past one extent (16K) because of the complexity. For CBBS 3.4, I did change the summary scan routine to do a full binary search of the summary, assuming (as I recall) that the summary wasn't more than 2 extents long. I also made the binary search routine a subroutine. Therefore, it could be called from both the summary routines, and the kill routine. So, to "flag" a message in the summary as killed, I just do a binary search for the number, then read ahead for the first digit of the # of lines in the message, and overwrite an "X" to it. I then write the sector back in place, unless the "X" occurred in the last byte of the sector, in which case "WRBYTE" already wrote it back. The routine which processes the entire summary file thru memory is no longer automatically run by "K" (therefore the time saving). So periodically, the system operators must run the new operator command "PURGE" which will pass the summary thru memory, deleting all "X"ed messages. The summaries of the deleted messages are shown, as is the total number of messages deleted. You need only ensure that the free space on the disk never goes below the length of the summary file, since the temporary file created by PURGE is nearly as long as the summary. (See next paragraph). Additional enhancements in 3.4: You now set the maximim number of messages entered by any one caller, the number of comment lines entered, and most importantly, the maximum number of active messages in the system. This was implemented because of the need for the workfile to delete messages and to PURGE the summary file. If the disk gets full so that K or PURGE won't work, you have to PIP over message files to another disk until there is space, then K or PURGE, then eventually PIP the messages back. Now, by limiting the maximum number of active messages, CBBS will simply not accept any more at this point. NOTE this is not a test of how full the disk is, since message length is not taken into account. At CBBS/Chicago, running two 8" drives, we typically run with 25-35K free on the message disk, and have 320 as our number of active messages. ---------------- Ideas for the future: Randy is interested in adding some functions, particularly for you implementers of CBBS. For example, a special password which would allow CBBS operators to exchange implementation ideas, problems, solutions, and for us to leave new modifications online. In general, we would like to enhance the function of CBBS, perhaps going to an overlay scheme to handle a wider variety of functions, without CBBS.COM getting unwieldy. Some operators, notably Lewis Moseley of CBBS/Atlanta, have split all the user-specific functions out of the main menu, and put them into a separate "U" function menu. These include the Case, Duplex, Null, Prompt bell, Video backspace, and eXpert user functions. The reason is to make the main menu less crowded. I, too have been thinking of this and soliciting comments. The comments are sufficiently varied that there is no clear cut solution. Some thing dual menus to be more confusing than a single menu. Others say don't have another menu, but go to two byte commands, such as MD for "Mode Duplex", and MX for "Mode eXpert". A nice idea, too. "The jury is still out" on this one. Some have suggested deleting the "V" function, and just echoing characters if DEL is used, and echoing backspaces if control-H is used. Randy vetoed that for good reason: He has a video terminal with a handy-to-use backspace key, which generates a DEL, but he wants the cursor to back up. I see no problem with "V" remaining. ---------------- Here is a list of the changes since release 3.2 of CBBS, by file: CBBS.ASM: Modified the documentaion on the contents of file "NEXT". Added following equates: ECOUNT: number of messags any one caller may enter. CCOUNT: number of comment lines any one caller may enter. Added "TEST" equate to generate a system which doesn't look at the sense switch, defaults all files to the "logged in drive", and JMPs to 0 when you use the "G" command. Used to create "CBBSTEST.COM" whicn is to allow you to become familiar with CBBS on your own machine. CBBSBYE.ASM: Code to limit the number of comment lines. CBBSDISK.ASM: Add label "SETOPEN" which just opens FCB; Also add usage of "UNRDBYT" to replace earlier code which dinked with the pointer to the disk read buffer; Also modify routine "EXTEND" to efficiently handle multiple extents. The eariler version only went to the end of the file if it was in the first extent. This routine keeps opening extents if necessary to find the end. CBBSENT1.ASM: Modifications to limit the number of active messages allowed in the system, and the maximum number entered by any one caller. CBBSFUNC.ASM: Added label "DEFUNCT" which kills stacked lines. Then modified several places in many other modules, which did a STA of a CR into INBUF to kill the stacked lines. They now just JMP to DEFUNCT. N-O-T-E you don't have to change any of your old routines. This is a new, but compatible way to kill stacked lines. CBBSKILL.ASM: MAJOR REWRITE to just flag summaries as killed. Add "PURGE" routine for operators to clean up the summary file of flagged messages. CBBSOPER.ASM: Add PURGE to the command table. CBBSSUB1.ASM Put in "DCX H" to back up buffer pointer when the buffer is filled. At label RDFULL. Also fix bad JMP in RDLINE (Thanks to Lewis Moseley for finding this) CBBSSUB2.ASM: Add moving "CCOUNT" to "CLEFT" and moving "ECOUNT" to "ELEFT", in the REINIT routine. Put in test to not jump to PROM if "TEST" mode is true. CBBSSUB3.ASM: Added missing "INX H" in the flush test. (Did not properly test if running under FAST). CBBSSUMM.ASM: Enhance the binary search to handle two extents, and split it out as a subroutine so it may be used to search the summary on a "flag" kill. Also split out "SUMCOMP" to scan from current summary position, to match the contents of "MSGNO". Also modified the summary print to ignore "flagged" summaries. CBBSWORK.ASM: Add ELEFT, CLEFT; and other minor documentation. Add "NPURG" (# PURGED). Add "TEST" equate to allow assembling a system which may be run as is, with no modem, for you to try out when you receive CBBS.