WWIVNEWS Volume 1, Issue 1
January 1991
Table of Contents
~~~~~~~~~~~~~~~~~
The Official History of WWIV.................................Random 1@1
The Amazing 4.12 Disappearing G-Files...............East Bay Ray 1@9964
Multi-line WWIV: Myth or Reality?...................East Bay Ray 1@9964
Submitting to WWIVNEWS...................................WWIVNEWS Staff
The DGROUP Saga......................................Lord Elric 1@18251
The Pending File.........................................WWIVNEWS Staff
The Editor's Corner.................................East Bay Ray 1@9964
=======================================================================
The Official History of WWIV
by Wayne Bell
Random 1@1
WWIV started around December 1984, when I first put up a BBS. It
was run on an IBM-PC with a 10 meg hard disk and a Hayes 1200. I was
running WWIV v1.0, which was in interpreted BASIC. It crawled along
quite slowly, and did not have a whole lot of features.
About the only other BBSs I was competing with at the time were
run on Apple II's, also running in interpreted BASIC. Of course, there
were RBBSs and the like, but I do not recall ever having called one.
Soon the 64k limitation of IBM interpreted BASIC became apparent. I did
some pretty strange stuff with memory allocation and string storage,
but I had pretty much reached the cutoff point. When you try typing in
30 lines of a message and the result is an "out of memory" error, you
know it is time to go on to something better.
The better thing was Turbo Pascal 2.0. Turbo 2.0 did not have ANY
support directories (all file I/O was within your current directory
only). I also had quite some trouble getting comm routines working.
With the release of Turbo 3.0, I put up WWIV v2.0. Soon after that I
got REAL interrupt-driven comm routines, and things started moving
along.
I had to go off to UCLA, and was forced to take the BBS down.
Around December 1985 on Christmas vacation, I decided to put the BBS
back up for some reason. I did some major revamping at some time around
then, and called it WWIV v3.0. Still in Turbo Pascal 3.0, though.
Around this time (December), I got around to putting in a file section.
It took quite a bit of work getting xmodem working, and I had to go
back and re-format my data files to allow for file descriptions. Since
I had never actually been on any other IBM-type BBS, I had no clue as
to how the file section should work, so things turned out pretty
randomly.
On January 1, 1986 I finally released WWIV v3.0. It ended up
going through quite a few revisions, especially in the first week or
two after being released. And, to make things even more fun, I had to
resume classes at UCLA, so I ended up pretty much writing WWIV without
running a BBS. As you may guess, this caused a few unfortunate bugs to
slip by me, but that's life.
Sometime around June 1986, I had decided to put in ANSI color and
call it WWIV v3.2. This involved re-formatting the user list (to store
the user's color selections), and a few other little fun things, so I
decided to put up a BBS again. This was only for a week because I had
to move back up to UCLA after that time for the summer session. You
might think that not many people would end up calling a BBS that is
pretty much stated as only being up for a week, but it managed to get
some pretty good activity. To make this week even more fun, for about
half of it I was not there. I had a friend of mine, Stephen Davis, call
up and remotely take care of this experimental BBS. It even managed to
make it without crashing.
After releasing that, it turned out that I had a pretty bad bug
in the Y-Modem routine. The BBS would read in a block of data, and THEN
seek to the right place in the file instead of FIRST seeking then
reading. So I came out with 3.20a rather quickly. Around January 1987 I
put up the BBS again, running 3.21d.
Then around June 1987 I started writing WWIV v4.0. Naturally,
since I had a summer job, things did not go so fast. Also, the fact
that I had never written anything in my life in C before did not help.
I eventually got the hang of things. Finally, on Dec 1, 1987, I put up
4.0 as my BBS for testing in real life. Among my big promises of how
great it would be, I said it would support networking among systems. I
thought this sounded like a good idea, only I had no clue as to how I
would go about implementing it at the time. So I relegated that to
"don't hold your breath" status, secretly thinking I might never get
around to it.
Surprisingly, I did get around to it relatively soon. By that
time, everyone had already installed the BBS on their computers, so I
was stuck with the format I had dreamed up a long time ago when I had
no clue how it would work -- a number 1-65535 indicating which system
was which. I ended up trying to design a network around that, although
it was not quite the optimal solution (as if is such a thing). I was
bored one day and had been talking with someone about a network, so I
decided to start writing a program to send files between computers.
There was no planning at all, I just pretty much sat down and typed it
in. That developed into the NETWORK.EXE program.
Of course, there was more to it than that. It was actually after
I had the NETWORK.EXE program mostly working that I started thinking
about how the systems would connect together. I originally started with
the idea of having it pretty much hierarchial, with a local-system list
for all systems to call directly any systems that were local. After
talking with Stephen Davis about this for a while, I decided to pretty
much have it grid-like, with an amorphous structure. That does not,
however, prevent some structure from being applied to it. Without any
software changes, it can be easily changed over to a straight
hierarchial structure. All I would have to do is set up the hierarchy,
change one file, and send out an update of that.
Well that pretty much brings me up to the present time. Future
expansion? Who knows. One thing that keeps appearing is a multi-line
WWIV. That just is not practical. WWIV depends upon many external
programs (chains, FSED, archiving programs) and you can NOT,
practically, have the BBS run external programs without running under a
multi-tasking operating system. To put it simply, PC-DOS was not
designed with multi-tasking in mind.
=======================================================================
The Amazing 4.12 Disappearing G-Files
by Jeff Garzik
East Bay Ray 1@9964
The release of WWIV v4.12 brought many new features, such as
Zmodem batch downloads, almost 100k of memory savings with TC++
overlays, an upload event, and much more. WWIV v4.12 also brought with
it a hideous bug. In v4.12 the G-Files section had disappeared, and a
new one could be not created. As you might have guessed, this created a
stir almost immediately on both Amber and WWIVnet. You see, Wayne made
a small typographical error in XINIT.C, where he told the BBS to look
for the G-File data in the GFILES directory This was a mistake, because
the GFILE.DAT file goes into DATA, not GFILES.
This problem is very easy to fix. When you first run your BBS,
copy GFILE.DAT from your DATA directory to your GFILES directory.
Whenever you edit it with //GFILEEDIT (or 'G' from WFC screen), copy it
over to the GFILES directory. If you have registered to get the source
code, you may apply this small mod to XINIT.C to remove the
disappearing G-File problem altogether. Search for this line in
XINIT.C:
sprintf(s,"%sGFILE.DAT",syscfg.gfilesdir);
and replace it with this:
sprintf(s,"%sGFILE.DAT",syscfg.datadir);
That will stop your G-Files from disappearing. If you still need
help with this problem, you can contact 1@9964 for assistance.
=======================================================================
Multi-line WWIV: Myth or Reality?
by Jeff Garzik
East Bay Ray 1@9964
Current technology has opened up new worlds in BBSing. One of
those is the capability for a single BBS to have more than one user on
the BBS concurrently. RBBS, PC-Board, TBBS, and many others already
have this capability, but WWIV does not.
There are many solutions to the problem of adding multinode
support. One of them is using a LAN (Local Area Network), where several
computers are available, one for each phone line. Another solution,
sometimes used in conjunction with a LAN, is the user of a commercial
multitasker such as Desqview, DoubleDOS, or MS Windows. These multi-
taskers allow the use of more than one program concurrently, at the
price of program speed. The final solution is for a BBS to multitask
using its own routines.
A BBS multitasking using its own routines is usually the most
efficient solution, because it causes the least program slowdown. This
also removes the author from dependence on another company's product.
Drawbacks of this include the author not having access to all the
resources a large commercial has.
The LAN method requires a lot of hardware (it involves a computer
for each node; 4 nodes = 4 PCs), but it is generally the accepted
method for large BBSs. LANs, however, are sometimes notoriously slow.
The commercial multitasker method is the general choice for the
hobbyist-sysop. It allows multiple nodes on a single computer by
running 2 or more programs at the same time. This does slow the
individual programs down, because a single processor is handling the
load for more than one program at a time. Processor slowdown is not
really a problem on fast machines, such as an 80386 at 33 Mhz.
That is a little about multiple node BBSs in general. Wayne Bell
summarily declared a few years ago (see the closing statements of "The
Official History of WWIV") that WWIV is not going to be a multinode BBS
system. He has, in my opinion, weakened in his position since then, but
he has not wavered visibly. I think there WILL be a multinode version
of WWIV, but it is still a long way off, and there is a possibility
that it will not be written by Wayne at all (the multinode portion). A
multiple node WWIV, for now at least, is a myth and not reality.
=======================================================================
Submitting to WWIVNEWS
by WWIVNEWS Staff
Submitting Tips/Letters to WWIVNEWS
-----------------------------------
To submit a letter to the editor (to be published in later
editions) or a tip, simply send e-mail to 1@9964. Tell me in the letter
that it is to be published in a later edition of WWIVNEWS. Letters
submitted immediately become the property of Jeff Garzik, and he
reserves the right to edit any tip or letter (letters will be edited
only for size limitations and clarity). Tips and letters will be no
longer than 1,000 bytes. The letter or tip must include express
permission to print your tip or letter. If not, it will not be
published. All unpublished or unacceptable submissions will be deleted,
possibly without notification of the author or submitter.
Submitting an Article to WWIVNEWS
---------------------------------
Listed below are the requirements for submissions (all this must
be included in a single letter addressed to user 1@9964).
1) The title of the e-mail you send to 1@9964 should be something to
the effect of "WWIVNEWS submission". It helps to know your letter has
something to do with WWIVNEWS, because that will really speed up
processing.
2) Article title of no more than 40 characters.
3) Real name, such as "Jeff Garzik". If this line is not included, or
you use an alias, then the submission will be rejected.
4) Your preferred alias, such as "Filo", "East Bay Ray", etc.
5) Your main WWIVnet or WWIVlink node address.
6) Double-space and then include a one or two line summary of your sub-
mission. An example might be:
This article is about the problem of DGROUP, a description
of what it is, and recommendations on how to solve this problem.
7) Double-space again. You will now enter your article. I would suggest
that you limit your article to between 3,000 and 5,000 bytes. This
should be more than enough for a decent sized article. If space
requirements become more constraining in the future, the maximum size
(5,000 bytes) may be lowered.
NOTE: All submissions immediately become the property of Jeff Garzik,
and he reserves the right to print and edit the submissions as he sees
fit. If substantial changes need to be made, WWIVNEWS will probably
contact you at the WWIVnet address supplied. All WWIVNEWS issues are
kept for permanent storage, and all other non-published submissions
will be subsequently deleted.
=======================================================================
The DGROUP Saga
by Wayne McDaniel
Lord Elric 1@18251
One of the most often asked questions by WWIV modders is "I get
this DGROUP error. What can I do?" This article should explain what the
error is, what causes it, and how to prevent it.
First, some background information is needed. The DGROUP error is
a direct result of the architecture of the 8088 chip. The 8088 chip has
a 16 bit word length. Using 16 bits, only 64K of memory is addressable.
So, how can you have over 64K in your computer? The chip uses 2 16-bit
variables (known as "words") to store the address.
The two words are called the segment and the offset. Each segment
contains 64K. Segments start on even 16 byte boundaries. So, the first
segment starts at memory location 00h, the next at 10h, the next at
20h, and so on. The offset is then added to the segment to generate the
exact address.
So, the exact formula for a memory address is (segment * 16) +
offset. In hex, conveniently, this involves shifting the segment one
position to the left. Here is a sample address in hex and how they
would go together.
1111:2222 = 11110 <- shift the segment left, fill in a zero
+ 2222 <- add the offset
--------
13332 <- final memory address
Anyway, what has all this got to do with DGROUP errors? Well, let
me explain. DGROUP is the name Turbo C gives for a particular group of
segments. To be more specific, the _BSS and the _DATA segments are both
lumped into DGROUP. Maybe this map will show you a bit more...
Map of a C program, Large memory model
Low CS ->---------------------------------------
: Code from one file : Each chunk of code
: --------- : is 1 segment, so
: code from another file : you can have
: -------- : multiple chunks.
: code from another file :
DS ->---------------------------------------
: _DATA : _DATA and _BSS
: initialized data : are collectively
:-------------------------------------: known as DGROUP.
: _BSS : 64K limit for
: uninitialized data : both combined.
SS ->---------------------------------------
: free space : The stack can be
: : up to 64K.
Current SP->:-------------------------------------:
: stack (grows high to low) :
Start SP->---------------------------------------
: : Heap is all the
: heap (grows low to high) : remaining memory
: : all the way up to
: : the 640K boundary.
---------------------------------------
High
Address...
As you can see, the DGROUP segment consists of the static data,
both the initialized (_DATA segment) and the uninitialized (_BSS)
segment. Since the _DATA segment and the _BSS segment both have to fit
in the DGROUP segment, this limits you to 64K total. Getting the DGROUP
error simply means you have too much data in the DGROUP segment. First
lets take a look at what kind of data this is, so you know what to pull
out. The _DATA segment consists of global variables which are
pre-initialized. This would be something like:
int myvar ={25};
which would declare an integer myvar, and initialize it to 25 at the
start of the program. The major part of the _DATA section is not pre-
initialized variables, but text. Plain and simple text.
pl("Press a key to continue");
strcpy(s,"Some more text examples");
In these samples, anything between the quotes is going into the
_DATA portion of DGROUP. The other section of DGROUP is _BSS, or the
uninitialized data. And, thats what it is, any global or static data
which does not have a constant or pre-defined value has to fit into
_BSS. One way to check how much DGROUP data you have is to consult the
map file, which will tell you just exactly how much DGROUP data you
havem and where it comes from. If you are compiling with the integrated
environment, turn detailed maps on. If you are compiling with the
command line compiler, add "/s" to your call to tlink.
The first section of the map file looks like this...
Start Stop Length Name Class
00000H 00E2EH 00E2FH _TEXT CODE
00E2FH 03FDFH 031B1H BBS_TEXT CODE
. . .
3863BH 38670H 00036H WHEREXY_TEXT CODE
38680H 40CADH 0862EH _DATA DATA
40CAEH 40CB1H 00004H _EMUSEG DATA
40CB2H 40CB3H 00002H _CRTSEG DATA
40CB4H 40CBBH 00008H _CVTSEG DATA
40CBCH 40CD3H 00018H _SCNSEG DATA
40CD4H 485B7H 078E4H _BSS BSS
485B8H 485B8H 00000H _BSSEND STACK
485C0H 486A5H 000E6H _STACK STACK
The addresses here have the segment and offset already combined.
The two most important lines are near the bottom of this section, the
one for _DATA and the one for _BSSEND. Take the hex value for the start
of _BSSEND and subtract the starting value of _DATA to find out how
much DGROUP data you have. So, I am using 485B8H-38680H = FF38. Since
FFFF is the maximum allowed, I have FFFF-FF38, or C7, or 199 bytes
left. In other words, not much.
The next part of the map breaks down the segments a bit more, so
you can see just exactly what makes up _DATA and _DGROUP.
Detailed map of segments
Address Size Class Segment Group Module name ????
0000:0367 0000 C=CODE S=_TEXT G=(none) M=FLAGS87 ACBP=28
0000:0367 0260 C=CODE S=_TEXT G=(none) M=FPEXCEP ACBP=28
3868:0000 0093 C=DATA S=_DATA G=DGROUP M=C0L ACBP=68
3868:0094 07F5 C=DATA S=_DATA G=DGROUP M=bbs.c ACBP=48
3868:088A 1100 C=DATA S=_DATA G=DGROUP M=bbsutl.c ACBP=48
3868:8654 0000 C=BSS S=_BSS G=DGROUP M=C0L ACBP=48
3868:8654 7331 C=BSS S=_BSS G=DGROUP M=bbs.c ACBP=48
3868:F986 00CD C=BSS S=_BSS G=DGROUP M=bbsutl.c ACBP=48
So, you can see that the initialized data and text for BBSUTL.C
takes up 1100H bytes, or 4352 bytes in decimal, or even better, 6% of
the space in DGROUP. Add them all up, and you wind up with text
accounting for almost 50% of the DGROUP space.
Now you know what the DGROUP error is and why it occurs. What can
you do about it? Well, the obvious thing to do is to cut down on text
in the source code. Instead of "Oooh baby, tickle my keyboard" use the
smaller "pause". That may seem insignifigant, but that is 24 bytes of
DGROUP space you just saved. Find little used text, comment it out,
copy it to a text file, and then use printfile to pull it off the disk.
This is only recommended if the text is fairly large. For example,
change:
pl("Please Re-enter your user number when prompted");
pl("and write down your password");
pl("Waste some more DGROUP");
to
/*
pl("Please Re-enter your user number when prompted");
pl("and write down your password");
pl("Waste some more DGROUP");
*/
printfile("newuser1");
Now all the text is stored in the gfiles directory under
NEWUSER1.MSG, and not in DGROUP.
One mod to look for is the External Strings Manager by Caramon
Majere. He has written a program to read strings in from a file and an
editor to maintain the file. One problem, however, is speed. It will
slow the BBS down (the slowdown is usually only noticeable on slow
computers or hard drives), so I suggest only using the infrequently
accessed lines, and I would also suggest a disk cache. Up to 500 lines
of string data may be taken out of your code using his program, and if
you figure even 100 strings with an average length of 40 bytes that is
4K of extra space. If you take out 500 strings with an average length
of 4K, you just saved 20K. A good method for doing that is to comment
out the line, but leave it in the source, so later when you are reading
your source code you can still search for the string to find that
section of code. Such as:
/* pl("Please enter name or number"); */ /* now string 27 */
get_string(27);
I hope this file has at least helped you to understand what the
DGROUP error is, and has given you some hints. Mostly, remove the
string text. String text accounts for 40%-50% of your DGROUP data
usually. The other option is to remove some of the static and global
variables. However, since you need almost every one of them, it would
be hard to do. If you have any further questions, I can be reached at
812-877-3488, The Kingdom of Melnibone.
=======================================================================
The Pending File
(WWIV & WWIVnet Tips, Tricks, and News)
by WWIVNEWS Staff
If you find a message in one of your extended net logs (NETDAT0.LOG -
NETDAT2.LOG in your GFILES directory) informing you that WWIVnet does
not know what "8/0" is, and that you don't have a "de2" program, don't
worry about it. It is a test of an upcoming WWIVnet feature, being
conducted by Black Dragon 1@2380 and Random 1@1. It will not affect
your system in any way.
For those of you who have Richard Ruffner's program SUBEDIT, do not use
it. It is incompatible with the new multiple-BBSLIST format introduced
in NET20. Both Filo 1@5252 and East Bay Ray 1@9964 have released new
sub editors, and either of these should be used in place of the
original SUBEDIT.
For those who use NETEDIT, version 1.25 is out. It is now separately
compiled for faster execution if you have an 80287 or 80387 math
co-processor. The filename is usually NETEDIT.ZIP, and it can be found
on Amber and Black Dragon Enterprises (the author's BBS).
As many are aware, a program called NetZip II was released into
WWIVnet, plagued with dozens of problems and bugs. It has now been
fixed and has been working for several weeks. The filename is
NETZIP26.ZIP.
For those who are having problems with DSZ data overruns and are using
US Robotics' HSTs, try putting "ha slow" on the command line.
If anyone has ever seen the message "corrupted, not processing", then
they know that particular feeling of frustration. After Wayne Bell
(almost) lost a 2.3 meg packet, he decided to implement some sort of
recovery for corrupted packets. LNET and NETWORK1 will now split
corrupted packets as to isolate the corrupted part, and process the
rest.
Also, as a result of continued debate, Wayne declared in a piece of
global mail that all illegal activities, such as pirating, phreaking,
hacking, and other like undertakings which are carried over WWIVnet are
outlawed and forbidden. Further policy and discretion is left to the
individual Group and Area Coordinators.
=======================================================================
The Editor's Corner
by Jeff Garzik
East Bay Ray 1@9964
This section is for any notes, notices, or changes in policy
regarding any aspect of WWIVNEWS. It may also contain some sort of
editorial, or information regarding articles in upcoming issues. Since
this is the first issue of what I hope to be a tradition in WWIVnet,
there isn't really any news (because the whole thing is new(s)!).
I also want to clear the air about a couple things. First,
reviews ARE accepted, but they must be objective AND they must cover a
major utility, such as NETEDIT. I also prefer that the author review
the product, but this is not set in stone, per say. As many people
know, I am fairly well known as both a programmer (some say of ill
repute) and as a modder. I will do the utmost to keep advertisements,
and any other related material (excepting announcements which I think
benefit the network as a whole) away from WWIVNEWS. I will also keep
all "fights" between sysops or factions away from this magazine unless
it affects a majority of the net. An example of an exception to this
rule might be the WWIVlink crisis. If people wish to call my bulletin
board, my number is listed in the BBSLIST (group 5) along with my
maximum baud rate. I also want to point out that I try to keep my name
out of it as much as possible. If there is a suitable place, I will
exchange "East Bay Ray" for "WWIVNEWS" or "WWIVNEWS Staff".
Some people might be scared away but such things as the tech-
nicality of having to submit an article. I am very lenient, and as long
as the article comes with the basic information I won't, for example,
remove yours outright simply because it is missing a double space in
the recommended place. Far from from it! I want to encourage, not
discourage, submissions. Bug reports (as long as they are supported
with evidence, and are reproducible) are accepted and welcomed also.
Finally, a word about the accuracy of this document. It is not
spell-checked at all, only proofread by myself. I am human, and I do
make errors. In the future, this will hopefully change, but until then,
I will stick with the human spell checker, the Turbo Pascal Editor
Toolbox text editor, and RightWriter grammar checker.
=======================================================================
The End