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
/
ENTERPRS
/
CPM
/
UTILS
/
S
/
ZPM3N08.ARC
/
BIOS.TXT
< prev
next >
Wrap
Text File
|
1992-05-27
|
11KB
|
230 lines
NOTES on your CP/M 3.0 BIOS and ZPM3
====================================
Last updated 19/4/92
ZPM3 will work fine with your current CP/M 3.0 BIOS. This
document is not meant to tell you how to change your BIOS for
ZPM3, but rather to point out some interesting and useful facts
about the way ZPM3 uses the BIOS, and how you should configure
your BIOS.
XMOVE routine.
~~~~~~~~~~~~~~
If you have 128 byte physical sectors, or your BIOS does all the
deblocking so that it appears to the BDOS that you have 128 byte
physical sectors, XMOVE does not get used at all by ZPM3. Such
was not the case with CP/M 3.0 which would make redundant calls
to XMOVE. Make sure XMOVE is implemented and working anyhow as
applications may attempt to use it.
When the BDOS is operating in the system bank (bank 0) and it
needs to move data in the TPA bank, it switches to the TPA bank
and does an ordinary LDIR. As such, XMOVE will never get called
by the BDOS with B=C (source bank and destination bank the same).
In the CP/M 3.0 manuals, there are two differing opinions about
XMOVE as far as whether B is the source or the destination. The
truth is that C is the source and B is the destination. Anything
you see to the contrary is a misprint.
MOVE routine.
~~~~~~~~~~~~~
When CP/M 3.0 was released, it was made 8080 compatible simply
because CP/M 2.2 was 8080 compatible. I have never heard of an
8080 machine running CP/M 3.0, and it is likely that there has
never been one. Digital Research knew that the Z80 was the CPU of
choice for modern PC's, and while they wrote their code for the
8080, they recognised the Z80 with the MOVE routine (which a Z80
BIOS could implement in just three instructions).
ZPM3 uses the MOVE routine much less than CP/M 3.0 does. In fact,
the only time ZPM3 uses MOVE is with an XMOVE call directly
preceding it. If you have 128 byte physical sectors (or the BIOS
does the sector deblocking), MOVE will never get called.
Always remember that MOVE must return with HL and DE pointing to
the end of the moved data. If they don't, you will have trouble.
TIME routine.
~~~~~~~~~~~~~
Be aware that the DATE program supplied with CP/M 3.0 will not
work properly if your BIOS does not update the SCB with
interrupts. There have been replacements since then that are
available in the public domain.
One common trap for BIOS writers is forgetting that HL and DE
must be saved by the TIME routine. There is no obvious reason for
it, and really they should be saved in the BDOS.
ZPM3 does not expect HL to be saved. If you have had trouble with
your CP/M 3.0 clock things might work now. It was decided that
seeing as TIME was the only routine (apart from MOVE) which
required HL to be saved, it was too easy to overlook, and a real
pain to implement (some systems use HL to switch banks on entry
to the BIOS. MOVE is always accounted for, but TIME sometimes
isn't (Morrow MD11 owners take note!)).
Ideally, there should be no reason to save HL in your BIOS,
unless you intend to run CP/M 3.0 sometimes (although I can't
imagine why). Any applications which attempt to use TIME through
the function 50 are not guaranteed that HL will be saved anyhow.
Buffers.
~~~~~~~~
CP/M 3.0 (and therefore ZPM3) keeps special disk buffers. The
system is rather complex. The directory is buffered separately
from the rest of the disk (and in the case of 128 byte sectors
the rest of the disk isn't buffered anyhow).
You decide how many buffers to give to each disk's directory and
data, and you may choose to have buffers shared by different
drives. All these choices can make for lots of fun for the
hacker, but without knowing much about the internal workings of
the BDOS how do you best set the buffer up?
There are many cases to consider depending on how much RAM you
have available to allocate to buffers. If you have virtually
unlimited RAM, you might as well allocate as many buffers as
GENCPM will allow. The only catch to this is that more buffers
implies the BDOS will take more time to look through them all
before coming to the decision that a disk read is required. The
good news is that the ZPM3 searching algorithm is particularly
fast. Empty buffers are discovered even faster than buffers
which are valid but don't match, so large numbers of empty
buffers pose very little problem. In general, even with the
maximum number of buffers, the advantages they give outweigh the
disadvantages.
Of course, few people have unlimited RAM. If you have very little
room available, spend most of it on the directory buffers. These
buffers act like a cache of the directory, and can save the disk
heads from moving back to the directory tracks to find out where
the next block is stored. Even on very fast hard disks, the
advantages that decent directory buffers give are great.
When dividing up directory buffers between a number of drives,
consider which drive holds the most files and which drive does
the most work. A drive which holds a lot of files but is rarely
accessed is not worth wasting buffers on. If you have a system
with one hard drive and one floppy drive, and you don't intend to
use the floppy drive very much, give only one buffer to the
floppy and all the rest to your hard drive. This will penalise
the floppy's performance somewhat, but the improvement it gives
to the hard drive will make it worthwhile.
Data buffers, like directory buffers, perform two tasks:
deblocking of physical sectors, and cacheing. For data buffers
however the cacheing is the less important job, unless you have a
lot of data buffers available. The reason for this is that the
buffer algorithms work by taking the least recently used buffer
and using it for deblocking. If you are working on a file which
is 8k long, but you only have 4k of buffers, the BDOS will run
out of buffers before it has read the whole file and will grab
the least recently used one even though it contains valid data
from the file which could be required later on. The result is
that the BDOS does much searching through its 4k of buffers, but
rarely finds anything which matches and must read from the disk
anyhow.
In practice the system works a little better than that because of
the way files are used by most programs, so data buffers are
still worthwhile, but to take real advantage of their cacheing
ability you must have more room in the data buffers than the size
of the file you are working with. With word processors such as
Wordstar and NewWord creating extra files as they work, you
really need more than twice as much room in the buffers than the
size of the file.
So you can see why data buffers are less important than directory
buffers. Something else you should be aware of concerns multi-
sector i/o and the data buffers. When the BDOS is told to read a
file it searches its buffers and if it can't find the data there
it reads it from the disk. Normally it deblocks the data one
record at a time through its data buffers, leaving the data in
the buffers in case it is required again. However multi-sector
i/o does not usually need to deblock its data, so the data is
sent straight to the TPA without going through the data buffers.
If any of that data is required again, it will not be in the data
buffers and must be read from the disk. So two reads of the same
data using multi-sector i/o might actually be slower than reads
that are done a sector at a time!
And the really important thing about all this is that the CCP
uses multi-sector i/o to load programs. So if you thought that
implementing large numbers of data buffers would give you faster
loading of programs, you were wrong. The data buffers won't help
program loading unless the data can be put into the buffers
first.
If you use ZCCP, you will find there is a facility to prevent the
data buffers from being bypassed on program loads. It involves
simply setting the f1' bit of the file. The idea is that you set
f1' on all the files which are small enough not to clog up your
buffers, and then they run as if they are on a ram disk, but one
in which you can never lose data. The system is quite wonderful
in that the RAM used to hold the files is available to buffer
other data if required. Unlike a ram disk, the RAM is dynamically
allocated and the data is completely safe. But you must be using
ZCCP, and you must have at least 6k of data buffers before it
does anything useful. If you currently have a ram disk but few
data buffers, consider taking a chunk of your ram disk for data
buffers and switching to ZCCP.
CPMLDR bug.
~~~~~~~~~~~
This is closely related to the subject of buffers because you
will find that if you increase your buffers past a certain point,
the system will not boot. Almost certainly you will suspect a
problem with your BIOS code (you normally should), however the
CPMLDR.REL code supplied by DRI has a bug in it.
You may be wondering if everything DRI did with CP/M 3.0 was
buggy! I must say that what they achieved was terrific, but it
had its faults as well. Hopefully ZPM3 has addressed them all.
The CPMLDR problem occurs when your CPM3.SYS grows from being 16k
or less, to over 16k (and therefore two logical extents). You may
not have this problem under certain drive configurations, but if
you do, the symptom is that described above.
There really is no way of patching around this, but if you have
your loader BIOS, you can certainly use the (somewhat superior)
ZPM3LDR.REL code instead. This works very similarly to the DRI
code, except that it works properly. Unlike the DRI code, you
will find that ZPM3LDR has all its messages at the head of the
file so that you can patch them and change them if you wish.
ZPM3LDR does not clear the screen on boot up (CPMLDR does by
sending multiple linefeeds), but you could patch this if you
like. ZPM3LDR.REL will directly replace CPMLDR.REL. ZPM3LDR
however does not use the MOVE routine that CPMLDR requires
(although there is nothing much to be gained by removing it from
your loader bios code).
GENCPM bugs.
~~~~~~~~~~~~
GENCPM has bugs in it. If you can, try and set up all your
buffers manually. That way you'll know where they are and you are
in complete control.
The biggest fault I have found with GENCPM is that it will
allocate allocation vectors incorrectly. CP/M 3.0 can use double
bit allocation vectors, but doesn't necessarily. Sometimes (and I
think it is mainly with big disks), GENCPM will only allocate
enough room for single bit allocation vectors when double bit
vectors had been specified. The symptoms of this are varied, but
often, you can use your A: drive for a while, but as soon as you
use your B: drive funny things happen. If you only use A: and C:
drives, things appear to work OK.
The first thing to try if you suspect a GENCPM induced problem is
setting up with only one drive and a single buffer. If that fixes
it, the problem could well be with GENCPM.
Naturally, your BIOS code could still be the problem, so look out
for that too!