
|
Sliding into bdos [3/6] M.J.Karas, 00-00-00
SYSTEM FUNCTIONS THAT CONTROL THE DISKS
The data storage files for applications programs are stored
upon the disk drives attached to the CP/M computer. The BDOS
supports a number of functions that allow the state and selection
status of the drives to be controlled.
SELECT DISK: Function 14.
The simplest control function is to select the current disk
with which to refer to as the logged or default disk. The
function is equivalent to the console CCP command:
A>B:<cr>
B>
Which changed the currently logged disk to drive B:. A BDOS
program to affect the same thing is given in the example program
of the next section below. Drive numbers correspond to the
console displayed drive designators as follows:
A: = Drive # 0
B: = Drive # 1
***
P: = Drive # 15
Once a drive has been selected it has its directory "activated"
and is maintained in a logged in status until the next warm boot,
cold boot, or disk reset BDOS function.
DETERMINE LOGGED DISK: Function 25.
An applications program can determine which disk drive is
the currently logged or default drive through use of this
function. The BDOS will return in the (A) register the number of
the currently selected drive according to the table given above.
The program segment below shows a sequence of BDOS interface
code that first determines if drive B: is selected, and if not
then does a BDOS call to change it.
;SELECT AND POLL LOGGED DISK DRIVE EXAMPLE
;
SELECT EQU 0EH ; FUNCTION 14
ASKDRV EQU 19H ; FUNCTION 25
BDOS EQU 0005H ; SYSTEM ENTRY POINT
ORG 0100H ; PROG START
LD C,ASKDRV ; FIND OUT IF B: IS SELECTED
CALL BDOS
CP 'B'-'A'
RET Z ; DONT SELECT IF ALREADY
; ..LOGGED
LD E,'B'-'A' ; SET TO LOG AND SELECT B:
LD C,SELECT
CALL BDOS
RET ; FINISHED WITH ANOTHER PROG
;
END
DRIVE STATUS SET AND RESET: Functions 28 & 37.
Drive status may be individually controlled by these
functions. Operation 28 allows a the currently selected drive to
be write protected (set to read/only). The process is simply:
WPDSK EQU 01CH
BDOS EQU 0005H
LD C,WPDSK ;WRITE PROTECT DISK
CALL BDOS
The write protect status of a specific disk may be removed by
function 37 which deactivates the directories of each drive
specified at call time. Each drive by default then becomes
read/write again but requires reactivation through reselection.
The reset drive vector is a 16-bit value passed to the BDOS with
a "1" bit in each bit position for a drive that equires
resetting. The most significant bit of the 16 bit quanity
corresponds to drive P: and the LSB to drive A:. The code
sequence to reset drive B: would be:
RESDSK EQU 025H
BDOS EQU 0005H
LD C,RESDSK ;FUNCTION CODE
LD DE,0000$0000$0000$0010B ;DRIVE B: BIT SET
CALL BDOS
GET DRIVE LOGIN AND READ?ONLY VECTORS: Function 24 & 29.
The BDOS keeps track of all drives that have been selected
since the last boot or disk reset functions. These drives are
considered in a online status in that the system knows
immediately what the space allocation map of the drive is and
whether the drive is in read/only status or not. Function 24
allows the application program to determine what subset of the
current drive complement are in this online logged status. The
vector returned in the (HL) register pair is a bit map like above
where a "1" bit means the drive is active. The most significant
bit of the 16-bit number corresponds to drive P:. The code below
fetches the vector and saves it in a local data area.
;LOGIN VECTOR EXAMPLE
;
LOGIN EQU 018H ; FUNCTION 24
BDOS EQU 0005H ; SYSTEM ENTRY POINT
ORG 0100H
LD C,LOGIN ; FUNCTION
CALL BDOS
LD (LOCLOG),HL ; SAVE VECTOR HERE
RET ; TO CCP
;
LOCLOG:
DEFS 2
END
In a similar manner the BDOS allows determination of which
drives are in the write protected read/only status. A "1" bit in
the returned vector indicates read/only status for a specific
drive. The code here shows how to fetch it.
;READ/ONLY VECTOR EXAMPLE
;
ROVEC EQU 01DH ; FUNCTION 29
BDOS EQU 0005H ; SYSTEM ENTRY POINT
ORG 0100H
LD C,ROVEC ; FUNCTION
CALL BDOS
LD (LOCROV),HL ; SAVE VECTOR HERE
RET ; TO CCP
;
LOCROV:
DEFS 2
END
GET ALLOCATION VECTOR AND DISK PARM POINTER: Function 27 & 31.
Two more miscellaneous disk drive interface functions are
provided that permit several special types of functions to be
performed. The first, function 27 returns an address in the (HL)
registers that points to a bit string in memory that corresponds
to the data block allocation map of the currently selected drive.
The map contains one bits in each position where a block
allocated, starting with the MSB of the forst byte in the string.
The length of the bit string depends upon the total capacity of
the drive in allocatable blocks. Function 31 permits an
application to determine the characteristics of the currently
selected drive. The BDOS returns an address in the (HL) registers
that points to a table of 33 bytes that describe the current
drive. Data in the table includes such data as number of
possible directory entries on the disk, number of allocatable
blocks on the disk, and, indirectly, the size of each disk block.
The program below is a comprehensive example of how these
functions can be used to determine the remaining space left on a
the selected drive. The program stores the available space of the
drive specified in the first byte of the default FCB into memory
location "KPDISK" and then exits to the CCP. The reader can adapt
the code as desired.
;
;CP/M BDOS INTERFACE EQUATES
;
BASE EQU 0000H ;BASE OF CP/M SYSTEM
LOGDRIV EQU 0004H+BASE ;LOCATION OF CURRENTLY LOGGED DRIVE
BDOS EQU 0005H+BASE ;THE BDOS I/O VECTOR
SLCTDSK EQU 14 ;SELECT DISK DRIVE
GALVEC EQU 27 ;GET ADDRESS ALLOCATION VECTOR
GDSKP EQU 31 ;GET ADDRESS OF DISK PARAMETER TABLE
;
;
ORG 0100H
;
;
;PROGRAM TO FETCH REMAINING DISK SPACE IN KBYTES
;
SPCGET:
LD A,(LOGDRIV) ; GET CURRENTLY LOGGED DRIVE AND SAVE
AND 0FH ; STRIP OUT USER NUMBER
LD (SAVDRIV),A ; SAVE CODE
;
LD A,(FCB) ; CHECK IF SAME AS SELECT
DEC A ; ADJUST FCB DRIVE TO MATCH SELECT DRIVE
LD E,A ; ..SELECT IN BDOS
LD C,SLCTDSK ; SELECT DISK FUNCTION
CALL BDOS
;
LD C,GDSKP ; FIND ADDRESS OF DISK PARAMETER HEADER
CALL BDOS
LD BC,0002H ; INDEX TO BLOCK SHIFT FACTOR
ADD HL,BC
LD B,(HL) ; (B) = BYTE BLOCK SHIFT FACTOR
INC HL
INC HL
INC HL
LD E,(HL) ; (DE) = WORD DISK BLOCK COUNT
INC HL
LD D,(HL)
INC DE
;
LD A,B ; ADJUST SHIFT FOR KBYTE SIZE
SUB 03H
LD HL,0001H ; CALCULATE BLOCK SIZE
SPCCAL:
OR A ; KNOW KBYTES PER BLOCK?
JP Z,SPCKNW
ADD HL,HL ; DOUBLE # SECTORS PER TRACK
DEC A ; DECREMENT BLOCK SHIFT
JP SPCCAL
;
SPCKNW:
LD C,L ; (BC)=KBYTES PER BLOCK
LD B,H
LD HL,0 ; INITIALIZE KPDISK
LD (KPDISK),HL
PUSH BC ; SAVE KBYTES/BLOCK
PUSH DE ; SAVE NUMBER OF BLOCKS
LD C,GALVEC ; NOW POINT TO THE ALLOCATION VECTOR
CALL BDOS ; (HL)=ALLOCATION VECTOR ADDRESS
POP DE
POP BC
;
LD (ALLSAVE),HL ; SAVE ALLOCATION POINTER
LD H,1 ; SET MINIMUM START BIT COUNT
;
UALLOC:
DEC H ; DEC BIT COUNT
JP NZ,STACT ; STILL ACTIVE BYTE
;
LD HL,(ALLSAVE) ; GET POINTER
LD A,(HL)
INC HL
LD (ALLSAVE),HL ; SAVE NEW POINTER
LD H,08H ; SET BIT COUNTER TO MAX
;
STACT:
RLCA ; GET ALLOCATION BIT TO CARRY
JP C,ALLOC ; DONT COUNT ALLOCATED BLOCKS
PUSH HL
LD HL,(KPDISK) ; GET KBYTES LEFT COUNT
ADD HL,BC ; ADD IN ONE MORE BLOCK COUNT
LD (KPDISK),HL
POP HL
;
ALLOC:
DEC DE ; DEC TOTAL BLOCK COUNT
LD L,A
LD A,D
OR E ; ALL BLOCKS SCANNED YET
LD A,L ; RESTORE ALLOC BIT PATTERN
JP NZ,UALLOC ; MORE TO COUNT
;
LD A,(SAVDRIV) ; RETURN DISK SELECT TO PREVIOUS
LD E,A ; ..SELECT IN BDOS
LD C,SLCTDSK ; SELECT DISK FUNCTION
CALL BDOS
RET ; BACK TO THE CCP
;
;
;PROGRAM DATA STORAGE ALLOCATIONS
;
BLKSIZ:
DEFS 2 ; STORAGE FOR ALLOCATION BLOCK SIZE
ALLSAVE:
DEFS 2 ; STORAGE FOR ALLOCATION PNT SAVE
SAVDRIV:
DEFS 1 ; SAVE CURRENT DISK SELECT DURING RELOG
KPDISK:
DEFS 2 ; STORAGE FOR KBYTES PER DRIVE LEFT
;
END
The next part in this series will present the the CP/M file
system as viewed from the BDOS interface aspect. The FILE CONTROL
BLOCK (FCB) will be presented. In addition the procedures to
prepare files for I/O and then the actual I/O procedures will be
presented. The series will round out to a conclusion with a
comprehensive programming example that presents a sequential file
I/O set of subroutines that permit character by character I/O
with a file to be done.
-----
What is this thing everybody is talking about called BDOS?
This series will attempt to answer this question in some detail
but first we need a little basis to understand WHY in the first
place. Digital Research CP/M is an operating system for smaller
type micro processor computer systems that is designed to remove
much of the normal computer operation drudgery experienced by the
computer operator. The operating system software embodies a
"system philosophy" that structures and generalizes upon the
operating environment of a piece of electronics hardware. The
environment presented actually allows that piece of quiet,
transistorized machinery to be used at a much higher level. The
full impact of what this operating system provides to a computer
is most probably felt by the typical micro computer hacker that
worked the hard way to get a computer system up and running.
While building, debugging, and integrating the pieces, the
computer was just a whole bunch of parts interfaced together in
an organized manner. However, when the thing is finally a
"computer" how does it get used. The low level process of poking
data into memory from a front panel or even filling, dumping, or
block moving memory data with an EPROM based "monitor program"
hardly makes this computer "useful". The process of putting on
disks and bringing up CP/M lights the torch for computer
usability. In this case the hacker experiences an elated feeling
now "NOW I CAN DO SOMETHING!"
Buried inside of the total operating system presentation is
the concept of generalization brought up in the previous
paragraph. One of the major requirements in order to make a
computer useful is that there has to be applications software
that performs the jobs intended for the computer. Jobs like
accounting, word processing, spread sheet data analysis, or
inventory control. Unfortunately the process of producing
applications software is very, very expensive. A good package may
take anywhere from one to ten man years of development effort to
make. If the process of making an applications package had to be
custom taylored to a specific hardware environment, then there
would not be affordable software available for use upon a given
XYZ computer. Generalization in the operation of a computer
environment solves this problem however. With the understanding
that at a certain level "all microprocessor computer systems are
alike" it is possible, with minimum constraints, to define a set
of logical type operations that make a computer useful.
This logical set of operations, for the Digital Research
CP/M operating system, is defined within the BDOS portion of the
operating system. Here in about 3 1/2 K bytes of tightly written
assembly language is the "generalization converter" that takes
I/O requests for hardware independant applications programs and
turns them into a lower level set of simplistic hardware oriented
functions that are then processed through the BIOS. This
conversion process is beneficial in the light that CP/M Ver 2.2
can be setup to run on a typical brand XYZ computer for about one
half of the effort needed to convert even one of the simplest
application packages had that application been written in a
hardware dependant manner. Conclusion; software developers can
make better, more sophisticated applications available for lower
cost and computer users find a competitive software market place
where there are many times multiple packages available that
perform similar functions.
The thrust of this presentation is to show the prospective
applications programmer how to use most of the generalized set
of "BDOS System Calls" within Digital Researches CP/M Ver 2.2.
The presentation scheme will be to describe all of the functions
and use simple examples. The reader is assumed to be modistly
familiar with 8080 Assembly Language Programming as all of the
examples will be given in machine language. Likewise, in this
environment it is assumed by default that the prospective
programmer is planning to code in assembly language. If a CP/M
compatible high level language is used for programming, such as
Digital Research PL/I-80 or Microsoft BASIC-80, then of course
the program interface at the "System Call" level becomes
transparent to the programmer. Run time subroutines make the high
level coded application get converted through yet another step.
(One major reason applications code in a high level language runs
slower than the equivalent function written in assembly
language).
|