.he
.bp odd
.mt 5
.mb 6
.pl 66
.ll 65
.po 10
.hm 2
.fm 2
.ft All Information Presented Here is Proprietary to Digital Research
.ce 2
.sh
.tc 4  BIOS Functions
Section 4
.sp
.sh
BIOS Functions
.he CP/M-8000 System Guide                           4  BIOS Functions
.sp 3
.he CP/M-8000 System Guide                           4.1  Introduction
.tc    4.1  Introduction
.sh
4.1  Introduction
.pp 5
All CP/M-8000 hardware dependencies are concentrated in subroutines that are
collectively referred to as the Basic I/O System (BIOS).  A CP/M-8000
system implementor can tailor CP/M-8000 to fit nearly any Z8000 operating
environment.  This section describes each BIOS function:  its calling 
conventions, parameters, and the actions it must perform.
The discussion of Disk Definition Tables is treated separately in  
Section 5.
.ix BIOS
.ix BIOS function, called by BDOS
.ix SC #3 instruction
.pp
When the BDOS calls a BIOS function, it places the function number in 
register R3, and function parameters in registers RR4 and RR6.  It then 
executes a SC #3 instruction.  R3 is always needed to specify the function, 
but each function has its own requirements for other parameters, which are 
described in the section describing the particular function.  The BIOS 
returns results, if any, in register RR6.  The size of the result depends on 
the particular function.  
.sp
.sh
Note:  \c
.qs
The system call handler in the BIOS must preserve at least registers
R8 through R15.  The handlers provided in most BIOSes 
preserve all registers, except
for RR6 which is used to return results.
Of course, if the BIOS uses interrupts to service I/O, the 
interrupt handlers will need to preserve registers.
.ix register contents
.ix BDOS Direct BIOS Function, Call 50
.ix SC #3 instruction
.pp
Usually, user applications do not need to make direct use of BIOS functions.
However, when access to the BIOS is required by user software, it should
use the BDOS Direct BIOS Function, Call 50, instead of calling the BIOS with
a SC #3 instruction.  This rule ensures that applications remain compatible 
with future systems.
.ix Exception Handlers
.ix Exception Vector
.pp
The BIOS must also maintain a vector of "Exception Handler" addresses,
through which all system calls and traps are routed.  The vector
numbers have been selected to match the exception numbers 
used in CPM-68K.  These numbers will be found in the Programmer's
Guide.
.ix SC #0 instruction
.ix SC #1 instruction
.ix Memory Management
.ix Debugger Breakpoint
.pp
In addition to the general entry point via the SC #3 instruction,
the BIOS has two additional system call entry points.  SC #0 is
the entry point for the debugger's breakpoint instruction.  The
BIOS only has to vector this through the exception vector.  The
BIOS also has an entry point for a general-purpose memory-management
system call, SC #1, which is used to perform system-dependent
memory-management operations.  These operations are described
in section 4.2.
.ix Disk Parameter Header 
.ix Disk Parameter Block
.pp
The Disk Parameter Header (DPH) and Disk Parameter Block (DPB) formats have
changed slightly from previous CP/M versions to accommodate the Z8000's 
32-bit addresses.  The formats are described in Section 5.
.cp 19
.bp
.ix BIOS register usage
.ce
.sh
Table 4-1.  BIOS Register Usage  
.sp
.nf
                        Entry Parameters:

                     R3  = function code
                     RR4 = first parameter
                     RR6 = second parameter

                         Return Values:

                RL7 = byte values (8 bits)
                R7  = word values (16 bits)
                RR6 = longword values (32 bits)
.fi
.sp
.in 0
.pp
The decimal BIOS function numbers and the functions
they correspond to are listed in Table 4-2.
.sp 2
.ce
.sh
Table 4-2.   BIOS Functions 
.ll 60
.in 5
.nf
.sp
Number		             Function		
.fi
.sp
.in 22
.ti -14
0             Initialization (called for cold boot)
.ti -14
1             Warm Boot (called for warm start)  
.ti -14
2             Console Status (check for console character ready)  
.ti -14
3             Read Console Character In 
.ti -14
4             Write Console Character Out 
.ti -14
5             List (write listing character out) 
.ti -14
6             Auxiliary Output (write character to auxiliary output device)  
.ti -14
7             Auxiliary Input (read from auxiliary input) 
.ti -14
8             Home (move to track 00)  
.ti -14
9             Select Disk Drive  
.ti -15
10             Set Track Number  
.ti -15
11             Set Sector Number  
.ti -15
12             Set DMA Address 
.ti -15
13             Read Selected Sector 
.ti -15
14             Write Selected Sector 
.ti -15
15             Return List Status
.ti -15
16             Sector Translate  
.ti -15
18             Get Memory Region Table Address  
.ti -15
19             Get I/O Mapping Byte  
.ti -15
20             Set I/O Mapping Byte  
.ti -15
21             Flush Buffers  
.ti -15
22             Set Exception Handler Address  
.fi
.in 0
.ll 65
.bp
.he CP/M-8000 System Guide                 Function 0:  Initialization
.sp 3
                   FUNCTION 0:  INITIALIZATION


               Entry Parameters:
                  Register R3:  00H

               Returned   Value:
                  Register R3: User/Disk Numbers
		   
.sp 2
.ix BIOS Function 0 Initialization
.ix BIOS Function 0
.ix _init
.ix call _init
.ix ret instruction
.ix BIOS internal variables
.ix SC #3 vector
.pp
This routine is entered on cold boot and must initialize the BIOS.  
Function 0 is unique, in that it is not entered with a SC #3 instruction. 
Instead, the BIOS has a global label, _init, which is the entry to this
routine.  On cold boot, Function 0 is called by a call _init.  When
initialization is done, exit is through a ret instruction.  Function 0 
is responsible for initializing hardware if necessary, initializing 
BIOS internal variables (such as IOBYTE) as needed, 
setting up register RR6 as described below, setting the SC #3 vector to 
point to the main BIOS entry point, and then exiting with a ret.

	=== THIS IS INACCURATE ===

	=== WHAT ACTUALLY HAPPENS IS THAT THE BIOS SETUP IS DONE ===
	=== BEFORE TRANSFERRING TO THE CCP                       ===
	===    THE biosboot MODULE SETS UP THE PSA AND STACK PTR ===
	=== AND JUMPS TO LABEL bios, WHICH CALLS _biosinit AND	 ===
	=== _trapinit, THEN JUMPS TO ccp  			 ===

	=== THIS SHOULD PROBABLY BE FIXED			 ===

.ix longword value
.pp
Function 0 returns a longword value.
The CCP uses this value to set the initial user number and the initial default
disk drive.  The least significant byte of RR6 is the disk number 
(0 for drive A, 1 for drive B, and so on).  The next most significant byte is
the user number.  The high-order bytes should be zero.
.pp
The entry point to this function must be named _init and must be declared
global.  This function is called only once from the system at
system initialization.

	=== skeletal code removed, here and elsewhere below ===
.fi
.in 0
.bp
.he CP/M-8000 System Guide                      Function 1:  Warm Boot
.nf
.sp 3
                     FUNCTION 1:  WARM BOOT
.sp 2
                     Entry Parameters:
                        Register R3:  01H
.sp
                     Returned   Value:  None
.fi
.sp 2
.ix BIOS function 1 Warm Boot
.ix CCP entry point
.ix _ccp
.pp
This function is called whenever a program terminates.  Some reinitialization
of the hardware or software might occur.  When this function completes, it 
jumps
directly to the entry point of the CCP, named _ccp.  Note that _ccp
must be declared as a global. 
.fi
.in 0
.bp
.he CP/M-8000 System Guide                 Function 2:  Console Status
.ix BIOS function 2 Console Status
.nf
.sp 3
                   FUNCTION 2:  CONSOLE STATUS
.sp 2
              Entry Parameters:
                 Register R3: 02H	   
.sp
              Returned   Value:
                 Register R7: 00FFH if ready
                 Register R7: 0000H if not ready
.sp 2
.fi
.pp
This function returns the status of the currently assigned console device.
It returns 00FFH in register R7 when a character is ready to be read, or 
0000H in register R7 when no console characters are ready.
.bp
.he CP/M-8000 System Guide         Function 3:  Read Console Character
.ix BIOS function 3 Read Console Character
.nf
.sp 3
               FUNCTION 3:  READ CONSOLE CHARACTER
.sp 2 
                   Entry Parameters:
                      Register R3:  03H
.sp
                   Returned   Value:
                      Register R7: Character
.fi
.sp 2
.pp
This function reads the next console character into register R7.  If no 
console character is ready, it waits until a character is typed before
returning.
.bp
.he CP/M-8000 System Guide        Function 4:  Write Console Character
.ix BIOS function 4 Write Console Character
.nf
.sp 3
              FUNCTION 4:  WRITE CONSOLE CHARACTER
.sp 2 
                   Entry Parameters:
                      Register R3: 04H
                      Register R5: Character
.sp
                   Returned   Value: None
.fi
.sp 2
.pp
This function sends the character from register R5 to the console output 
device.  The character is in ASCII.  You might want to include a delay or 
filler 
characters for a line-feed or carriage return, if your console device 
requires some time interval at  the end  of the  line  (such as  a TI Silent 
700 
Terminal \ \ ).  You can also filter out control characters which have 
undesirable 
effects on the console device. 
.ix line-feed
.ix carriage return
.bp
.he CP/M-8000 System Guide          Function 5:  List Character Output
.ix BIOS function 5 List Character Output
.nf
.sp 3
               FUNCTION 5:  LIST CHARACTER OUTPUT
.sp 2  
                   Entry Parameters:
                      Register R3: 05H
                      Register R5: Character
.sp
                   Returned   Value: None
.fi
.ix ASCII character
.ix list device
.ix communication protocol
.sp 2
.pp
This function sends an ASCII character from register R5 to the
currently assigned listing device.  If your list device requires some
communication protocol, it must be handled here.
.bp
.he CP/M-8000 System Guide               Function 6:  Auxiliary Output
.ix BIOS function 6 Auxiliary Output
.nf
.sp 3
                  FUNCTION 6:  AUXILIARY OUTPUT
.sp 2 
                   Entry Parameters:
                      Register R3: 06H
                      Register R5: Character
.sp
                   Returned   Value: None
.fi
.ix output device, auxiliary
.sp 2
.pp
This function sends an ASCII character from register R5 to the
currently assigned auxiliary output device.
.bp
.he CP/M-8000 System Guide                Function 7:  Auxiliary Input
.ix BIOS function 7 Auxiliary Input
.nf
.sp 3
                  FUNCTION 7:  AUXILIARY INPUT
.sp 2 
                   Entry Parameters:
                      Register R3: 07H
.sp
                   Returned   Value:
                      Register R7: Character
.fi
.sp 2
.ix end-of-file condition
.ix ASCII CTRL-Z (1AH)
.pp
This function reads the next character from the currently assigned
auxiliary input device into register R7.  It reports an end-of-file condition 
by returning an ASCII CTRL-Z (1AH).
.bp
.he CP/M-8000 System Guide                           Function 8:  Home
.ix BIOS function 8 Home
.nf
.sp 3
                        FUNCTION 8:  HOME
.sp 2 
                     Entry Parameters:
                        Register R3: 08H
.sp
                     Returned   Value: None
.fi
.ix disk head
.ix track 00 position
.ix SETTRK function
.sp 2
.pp
This function returns the disk head of the currently selected disk

to the track 00 position.  If your controller does not have a special
feature for finding track 00, you can translate the call to a SETTRK function
with a parameter of 0.
.bp
.he CP/M-8000 System Guide              Function 9:  Select Disk Drive
.ix BIOS function 9 Select Disk Drive
.nf
.sp 3  
                 FUNCTION 9:  SELECT DISK DRIVE
.sp 2 
              Entry Parameters:
                 Register R3: 09H
                 Register R5: Disk Drive
                 Register R7: Logged in Flag
.sp
              Returned   Value:
                 Register RR6: Address of Selected 
                                Drive's DPH
.fi
.sp 2
.pp
This function selects the disk drive specified in register R5 for
further operations.  Register R5 contains 0 for drive A, 1 for drive B,
up to 15 for drive P.  
.ix Disk Parameter Header
.pp
On each disk select, this function returns the address of the selected drive's
Disk Parameter Header in register RR6.  See Section 5 for a discussion of the
Disk Parameter Header.  
.ix error indicator
.ix disk select operation
.pp
If there is an attempt to select a nonexistent drive, this function
returns 00000000H
in register RR6 as an error indicator.  Although the function must return the
header address on each call, it may be advisable to postpone the actual
physical disk select operation until an I/O function (seek, read, or
write) is performed.  Disk select operations can occur without a
subsequent disk operation.  Thus, doing a physical select each time this 
function is called may be wasteful of time.
.ix Disk Parameter Block
.pp
On entry to the Select Disk Drive function,
if the least significant bit in register R7 is zero,
the disk is not currently logged in.  If the disk drive is capable of
handling varying media (such as single- and double-sided disks, single- and 
double-density, and so on), the BIOS should check the type of
media currently installed and set up the Disk Parameter Block
accordingly at this time.
.bp
.he CP/M-8000 System Guide              Function 10:  Set Track Number
.ix BIOS function 10 Set Track Number
.nf
.sp 3
                 FUNCTION 10:  SET TRACK NUMBER
.sp 2 
               Entry Parameters:
                  Register R3: 0AH
                  Register R5: Disk track number
.sp
               Returned   Value: None
.fi
.sp 2
.pp
This function specifies in register R5 the disk track number for
use in subsequent disk accesses.  The track number remains valid until
either another Function 10 or a Function 8 (Home) is performed.
.ix BIOS function, Home (8)
.pp
You can choose to physically seek to the selected track at this time,
or delay the physical seek until the next read or write actually occurs.
.ix maximum track number, 65535
.pp
The track number can range from 0 to the maximum track number supported
by the physical drive.  However, the maximum track number is limited
to 65535 by the fact that it is being passed as a 16-bit quantity.
Standard floppy disks have tracks numbered from 0 to 76.
.bp
.he CP/M-8000 System Guide             Function 11:  Set Sector Number
.ix BIOS function 11 Set Sector Number
.nf
.sp 3
                 FUNCTION 11:  SET SECTOR NUMBER
.sp 2 
                 Entry Parameters:
                    Register R3: 0BH
                    Register R5: Sector Number
.sp
                 Returned   Value: None
.fi
.sp 2
.ix sector numbers, unskewed
.pp
This function specifies in register R5 the sector number for subsequent disk
accesses.  This number remains in effect until either another Function 11 is 
performed.
.pp
The function selects actual (unskewed) sector numbers.  If skewing is 
appropriate, it will have previously been done by a call to Function 16.
You can send this information to the controller at this point or delay sector 
selection until a read or write operation occurs.
.bp
.he CP/M-8000 System Guide               Function 12:  Set DMA Address
.ix BIOS function 12 Set DMA Address
.nf
.sp 3
                  FUNCTION 12:  SET DMA ADDRESS
.sp 2
                  Entry Parameters:
                     Register R3: 0CH
                     Register RR4: DMA Address
.sp
                  Returned   Value: None
.fi
.sp 2
.ix DMA address
.pp
This function contains the DMA (disk memory access) address in register
RR4 for subsequent read or write operations.  Note that the controller
need not actually support DMA (direct memory access).  The BIOS will use
the 128-byte area starting at the selected DMA address
for the memory buffer during the following read or write operations.
This function can be called with either
an even or an odd address for a DMA buffer.
.bp
.he CP/M-8000 System Guide                   Function 13:  Read Sector
.ix BIOS function 13 Read Sector
.nf
.sp 3
                    FUNCTION 13:  READ SECTOR
.sp 2 
              Entry Parameters:    
                 Register R3: 0DH
.sp
              Returned   Value:  
                 Register R7: 0 if no error
                 Register R7: 1 if physical error
.fi
.sp 2
.pp
After the drive has been selected, the track has been set, the sector has
been set, and the DMA address has been specified, the read function uses
these parameters to read one sector and returns the error code
in register R7.
.ix return code value
.pp
Currently, CP/M-8000 responds only to a zero or nonzero return code value.
Thus, if the value in register R7 is zero, CP/M-8000 assumes that the disk
operation completed properly.  If an error occurs however, the BIOS should
attempt at least ten retries to see if the error is recoverable.  
.bp
.he CP/M-8000 System Guide                  Function 14:  Write Sector
.ix BIOS function 14 Write Sector
.nf
.sp 3
                   FUNCTION 14:  WRITE SECTOR
.sp 2 
          Entry Parameters:    
             Register R3: 0EH
             Register R5: 0=normal write
                          1=write to a directory 
                              sector
                          2=write to first sector 
                              of new block
.sp
          Returned   Value:  
             Register R7: 0=no error
                          1=physical error
.fi
.sp 2
.ix DMA buffer
.pp
This function is used to write 128 bytes of data from the currently
selected DMA buffer to the currently selected sector, track, and disk.
The value in register R5 indicates whether the write is an ordinary
write operation or whether the there are special considerations.
.pp
If register R5=0, this is an ordinary write operation.  If
R5=1, this is a write to a directory sector, and the write should
be physically completed immediately.  If R5=2, this is a write
to the first sector of a newly allocated block of the disk.  The
significance of this value is discussed in Section 5 under Disk Buffering.
.in 0
.bp
.he CP/M-8000 System Guide            Function 15:  Return List Status
.ix BIOS function 15 Return List Status
.nf
.sp 3
                FUNCTION 15:  RETURN LIST STATUS
.sp 2 
            Entry Parameters:  
               Register R3: 0FH
.sp
            Returned   Value:  
                 Register R7: 00FFH=device ready
                 Register R7: 0000H=device not ready
.fi

.sp 2
.pp
This function returns the status of the list device.  Register R7
contains either 0000H when the list device is not ready to accept a character
or 00FFH when a character can be sent to the list device.
.bp
.he CP/M-8000 System Guide              Function 16:  Sector Translate
.ix BIOS function 16 Sector Translate
.nf
.sp 3
                 FUNCTION 16:  SECTOR TRANSLATE
.sp 2
             Entry Parameters:    
                Register R3: 10H
                Register R5: Logical Sector Number
                Register RR6: Address of Translate 
                               Table
.sp
             Returned   Value:  
                Register R7: Physical Sector Number
.fi
.sp 2
.pp
This function performs logical-to-physical sector translation, as discussed
in Section 5.2.2.  
The Sector Translate function receives a logical sector 
number from register R5.
The logical sector number can range from 0 to the number of sectors 
per track-1.
Sector Translate also receives the address of 
the translate table in register RR6.  This address must be in the
system's address space.
The logical sector number is used as an index into the translate table.
The resulting physical sector number is returned in R7.
.ix translate table
.ix algorithms
.ix Disk Parameter Header
.pp
If register RR6 = 00000000H, implying that there is no translate table,
register R5 is copied to register R7 before returning.  Note that
other algorithms are possible; in particular, is is common to increment 
the logical sector number in order to convert the logical range of 0 to n-1
into the physical range of 1 to n.
Sector Translate is always called by the BDOS, whether
the translate table address in the Disk Parameter Header is zero or nonzero.
.bp
.he CP/M-8000 System Guide            Function 18:  Get Address of MRT
.ix BIOS function 18 Get Address of MRT
.nf
.sp 3
               FUNCTION 18:  GET ADDRESS OF MEMORY 
                                 REGION TABLE
.sp 2 
                 Entry Parameters:    
                    Register R3: 12H
.sp
                 Returned   Value:  
                    Register RR6: Memory Region
                                   Table Address
.fi
.sp 2
.ix Memory Region Table
.pp
This function returns the address of the Memory Region Table (MRT) in
register RR6.  The MRT describes the segments that compose the TPA
for non-segmented programs.  The format of the MRT is shown below:
.sp 3
.nf
            Entry Count = 4  16 bits
.sp
            Base address of first region     32 bits
.sp
            Length of first region           32 bits
.sp
            Base address of second region    32 bits
.sp
            Length of second region          32 bits
.sp
            Base address of third region     32 bits
.sp
            Length of third region           32 bits
.sp
            Base address of fourth region    32 bits
.sp
            Length of fourth region          32 bits
.fi
.sp 2
.ce
.sh
Figure 4-1.  Memory Region Table Format
.sp 2
.in 0
.ll 65
.pp
The regions are:  1) the segment used for programs with merged program
and data segments;  2) the program segment for programs with split
program and data segments;  3) the data segment for programs with split
program and data segments;  4) a data segment that gives access to 
region 2.  (In other words, the segment number in region 2 is the
one that goes into the program counter of a program executing in it,
while the segment number in region 4 is a segment in data space
that allows loading into the program space.)
.pp
The memory region table must begin on an even address, and must be implemented.
.bp
.nf
.he CP/M-8000 System Guide                  Function 19:  Get I/O Byte
.ix BIOS function 19 Get I/O Byte
.nf
.sp 3
                   FUNCTION 19:  GET I/O BYTE
.sp 2 
               Entry Parameters:    
                  Register R3: 13H
.sp
               Returned   Value:  
                  Register R7: I/O Byte Current 
                                 Value
.fi
.sp 2
.pp
This function returns the current value of the logical to physical
input/output device byte (I/O byte) in register R7.  This 8-bit
value associates physical devices with CP/M-8000's four logical devices
as noted below.  Note that even though this is a byte value, we are
using word references.  The upper byte should be zero.
.pp
Peripheral devices other than
disks are seen by CP/M-8000 as logical devices, and are assigned to
physical devices within the BIOS.  Device characteristics are defined

in Table 4-3 below.
.sp 2
.ce
.sh
Table 4-3.  CP/M-8000 Logical Device Characteristics
.qs
.nf
.in 5
.ix CP/M-8000, logical device characteristics
.ll 60
.sp
  Device Name                 Characteristics
.fi
.in 25 
.ix CONSOLE device
.sp
.ti -20
CONSOLE             The interactive console that you use to communicate with 
the system is accessed through functions 2, 3 and 4.  Typically, the console 
is a CRT or other terminal device.
.sp
.ix LIST device
.ti -20
LIST                The listing device is a hard-copy device, usually a 
printer.
.sp
.ix AUXILIARY OUTPUT device
.ti -20
AUXILIARY OUTPUT    An optional serial output device.
.sp
.ix AUXILIARY INPUT device
.ti -20
AUXILIARY INPUT     An optional serial input device.
.sp
.in 0
.ll 65
.fi
.pp
Note that a single peripheral can be assigned as the LIST, AUXILIARY INPUT, 
and AUXILIARY OUTPUT device simultaneously.  If no peripheral device is 
assigned as the LIST, AUXILIARY INPUT, or AUXILIARY OUTPUT device, your BIOS 
should give an appropriate error message so that the system does not hang if 
the device is accessed by PIP or some other transient program.  
Alternatively, the AUXILIARY OUTPUT and LIST functions can simply do nothing
except return to the caller, and the AUXILIARY INPUT function can return with 
a 1AH (CTRL-Z) in register R7 to indicate immediate end-of-file.
.bp
.ix I/O byte
.pp
The I/O byte is split into four 2-bit fields called CONSOLE, AUXILIARY INPUT, 
AUXILIARY OUTPUT, and LIST, as shown in Figure 4-2.
.sp 3
.nf
        Most Significant		Least Significant
.sp
  I/O Byte   LIST   AUXILIARY OUTPUT   AUXILIARY INPUT  CONSOLE
.sp
   bits:      7,6           5,4               3,2          1,0
.fi
.sp 2
.ce
.sh
Figure 4-2.  I/O Byte Fields
.sp 2
.pp
The value in each field can be in the range 0-3, defining the assigned
source or destination of each logical device.  The values which can
be assigned to each field are given in Table 4-4.
.sp 2
.ix I/O byte field definitions
.ce
.sh
Table 4-4.  I/O Byte Field Definitions
.sp
.ll 65
.ce
CONSOLE field (bits 1,0)
.nf
.ll 60
.sp
.in 5 
Bit                       Definition
.fi
.sp
.in 10
.ti -4
0   console is assigned to the console printer (TTY:)
.ti -4
1   console is assigned to the CRT device (CRT:)
.ti -4
2   batch mode: use the AUXILIARY INPUT as the CONSOLE input, and the LIST 
device as the CONSOLE output (BAT:)
.ti -4
3   user defined console device (UC1:)
.fi
.in 0
.sp 2
.ce
   AUXILIARY INPUT field (bits 3,2)
.sp
.nf
.in 5
Bit                       Definition
.sp
.fi
.in 10
.ti -4
0   AUXILIARY INPUT is the Teletype device (TTY:)
.ti -4
1   AUXILIARY INPUT is the high-speed reader device (PTR:)
.ti -4
2   user defined reader #1 (UR1:)
.ti -4
3   user defined reader #2 (UR2:)
.fi
.in 0
.bp
.ce
.sh
Table 4-4.  (continued)
.sp
.ll 65
.ce
   AUXILIARY OUTPUT field (bits 5,4)
.sp
.nf
.in 5
Bit                       Definition
.sp
.fi
.in 10
.ti -4
0   AUXILIARY OUTPUT is the Teletype device (TTY:)
.ti -4
1   AUXILIARY OUTPUT is the high-speed punch device (PTP:)
.ti -4
2   user defined punch #1 (UP1:)
.ti -4
3   user defined punch #2 (UP2:)
.sp 2
.fi
.in 0
.ce
LIST field (bits 7,6)
.sp
.nf
.in 5
Bit                       Definition
.fi
.in 10
.sp
.ti -4
0   LIST is the Teletype device (TTY:)
.ti -4
1   LIST is the CRT device (CRT:)
.ti -4
2   LIST is the line printer device (LPT:)
.ti -4
3   user defined list device (UL1:)
.sp
.ll 65
.in 0
.fi
.pp
Note that the implementation of the I/O byte is optional, and affects
only the organization of your BIOS.  No CP/M-8000 utilities use the
I/O byte except for PIP, which allows access to the physical devices, and

STAT, which allows logical-physical assignments to be made and displayed.
It is a good idea to first implement and test your BIOS without the IOBYTE
functions, then add the I/O byte function.  
.ix PIP
.ix STAT
.bp
.he CP/M-8000 System Guide                  Function 20:  Set I/O Byte
.ix BIOS function 20 Set I/O Byte
.nf
.sp 3
                   FUNCTION 20:  SET I/O BYTE
.sp 2 
                    Entry Parameters:    
                       Register R3: 14H
                       Register R5: Desired
.sp
                    Returned   Value: None
.fi
.sp 2
.ix word references
.pp
This function uses the value in register R5 to set the value of the
I/O byte that is stored in the BIOS.  See Table 4-4 for the
I/O byte field definitions.  Note that even though this is a byte
value, we are using word references.  The upper byte should be zero.
.bp
.he CP/M-8000 System Guide                 Function 21:  Flush Buffers
.ix BIOS function 21 Flush Buffers
.nf
.sp 3
                   FUNCTION 21:  FLUSH BUFFERS
.sp 2
           Entry Parameters:    
              Register R3: 15H
.sp
           Returned   Value:  
              Register R7: 0000H=successful write
              Register R7: FFFFH=unsuccessful write
.fi
.sp 2
.ix disk buffers, writing
.ix disk writes
.pp
This function forces the contents of any disk buffers that have been
modified to be written.  That is, after this function has
been performed, all disk writes have been physically completed.  After the
buffers are written, this function returns a zero in register R7.
However, if the buffers cannot be written or an error occurs, the function
returns a value of FFFFH in register R7.
.bp
.he CP/M-8000 System Guide         Function 22:  Set Exception Address
.ix BIOS function 22 Set Exception Handler Address
.nf
.sp 3
           FUNCTION 22:  SET EXCEPTION HANDLER ADDRESS
.sp 2
            Entry Parameters:    
               Register R3:  16H
               Register R5:  Exception Vector Number
               Register RR6: Exception Vector Address
.sp 
            Returned   Value:  
               Register RR6: Previous Vector Contents
.fi
.sp 2
.ix exception vector
.ix context block
.ix Transfer Control
.pp
This function sets the exception vector indicated in register R5
to the value specified in register RR6.  The previous vector value
is returned in register RR6.  Unlike the BDOS Set Exception Vector
Function (61), this BIOS function sets any exception vector.
Note that register R5 contains the exception vector number.  Thus,
to set exception #2, segmentation trap, this register contains a 2.
.ix BDOS function 61 Set Exception Vector
.pp
The exception handler is called as a subroutine, with all of
its registers saved on the stack, in the form given for
the context block in the Transfer Control instruction.  
On a segmented CPU, the
exception handler is enterred in segmented mode.  It should
return with a RET instruction.
.pp
All of the caller's registers except RR0 are also passed
intact to the handler.

.he CP/M-8000 System Guide                      4.2  Memory Management
.tc    4.2  Memory Management
.sh
4.1  Memory Management
.ix Memory Management
.pp 5
The system call SC #1 is used for several memory-management
operations:  mapping addresses from logical to physical, copying
blocks of (physical) memory, and transferring control from
one address space to another.  Parameters are specified in
registers RR2, RR4, and RR6, and a value may be returned in
RR6.
.pp
For this operation it is necessary to distinguish between
logical and physical addresses.  A logical address refers to
an address in a program's address space; it is 16 bits long
for a non-segmented program, and 23 bits long (stored in a
32-bit word) in a segmented program.  The hardware may perform
some mapping on a logical address, turning it into a physical
address.  Also, when a non-segmented program is running on
a segmented CPU, the non-segmented logical address acquires
a segment number (taken from the PC), which becomes part of
the logical address.
.pp
For the purposes of CPM-8000, it is necessary that the logical-to-physical
mapping process not affect the low-order 16 bits (offset part)
of an address.  Thus, on some systems (for example, those with
MMU's that permit segments to start on arbitrary boundaries)
the "physical" addresses used inside of the BIOS might undergo
further mapping.  It is only necessary that the BIOS's physical
addresses be able to distinguish between all memory segments
belonging to the system and to the TPA.
.pp
All BIOS operations done through SC #3 expect full 32-bit
physical addresses.  BIOS operations done through BDOS call 50
are mapped from the caller's address space into physical addresses.
.bp
.he CP/M-8000 System Guide         SC #1:  Memory Copy
.ix SC #1:  Memory Copy
.nf
.sp 3
           SYSTEM CALL 1:  MEMORY COPY
.sp 2
            Entry Parameters:    
               Register RR2: Length
               Register RR4: Destination
               Register RR6: Source
.sp 
            Returned   Value:  None
.fi
.sp 2
.ix Memory Copy
.pp
This operation copies a block of Length bytes from Source to Destination.
Length must be greater than zero and less than 65536 (a Length of zero
is used to distinguish different memory management operations).  The
Source and Destination are segmented physical addresses, as provided
by the Map Address operation (below).
.bp
.he CP/M-8000 System Guide         SC #1:  Map Address
.ix SC #1:  Map Address
.nf
.sp 3
           SYSTEM CALL 1:  MAP ADDRESS
.sp 2
            Entry Parameters:    
               Register RR2: 0
               Register RR4: Space Code
               Register RR6: Logical Address
.sp 
            Returned   Value:  
               Register RR6: Physical Address
.fi
.sp 2
.ix Map Address
.pp
This form of SC #1 is used to convert a logical address to a
physical address.  Since logical addresses depend on both the
mode (system or normal) of the program using them, and on the
space being accessed (program or data), a code is used to
determine which space to map from.  
.pp
If the program in the TPA is running non-segmented, the 
Set TPA Segment version of SC #1 will have been used to tell
the mapping routine which segment is being used.  If the TPA
is running with split program and data, it is also necessary
to distinguish between the segment number that goes in the
program counter to access instructions, and the physical segment
by which the TPA's instruction segment can be accessed as data.
.pp
The space codes are as follows:
.sp 3
.nf
	0:	Caller's Data Space
	1:	Caller's Program Space (as Data)
	257:	Caller's Program Space (as Instructions)
	2:	System's Data Space
	3:	System's Program Space (as Data)
	259:	System's Program Space (as Instructions)
	4:	TPA's Data Space
	5:	TPA's Program Space
	261:	TPA's Program Space (as Instructions)

.fi
.bp
.he CP/M-8000 System Guide         SC #1:  Set TPA Segment
.ix SC #1:  Set TPA Segment
.nf
.sp 3
           SYSTEM CALL 1:  SET TPA SEGMENT
.sp 2
            Entry Parameters:    
               Register RR2: 0
               Register RR4: 0000FFFFh
               Register RR6: TPA Base Address
.sp 
            Returned   Value:  None
.fi
.sp 2
.ix Set TPA Segment
.pp
This operation sets the base segment for a non-segmented program
running in the TPA.  This base address is usually obtained from
entry 1 in the Memory Region Table for programs with programs
and data in the same segment, and from entry 2 for programs with
split program and data segments.
.pp
If R6 (the high-order word of RR6) is FFFFh, the program running
in the TPA will be assumed to be running in segmented mode.
.bp
.he CP/M-8000 System Guide         SC #1:  Transfer Control
.ix SC #1:  Transfer Control
.nf
.sp 3
           SYSTEM CALL 1:  TRANSFER CONTROL
.sp 2
            Entry Parameters:    
               Register RR2: 0
               Register RR4: FFFEh
               Register RR6: Context Block Address
.sp 
            Returned   Value:  none
.fi
.sp 2
.ix Transfer Control
.ix context block
.pp
This operation causes control to be transferred to another address
space.  It allows all of the registers to be specified (except for
the system mode stack pointer), and is used by the debugger to
transfer control to the program being debugged.  RR6 points to
a context block of the form:
.nf
.sp 3
		word	R0
		word	R1
		word	R2
		word	R3
		word	R4
		word	R5
		word	R6
		word	R7
		word	R8
		word	R9
		word	R10
		word	R11
		word	R12
		word	R13
		word	R14 (normal mode R14)
		word	R15 (normal mode R14)
		word	ignored
		word	FCW (Flag/Control Word)
		word	PC Segment
		word	PC Offset
.sp 2
.fi
.pp
Note that the PC segment word is required even if the CPU is
a non-segmented Z8002, for compatibility reasons.

.ce
End of Section 4
.nx five
 
