Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

1161 lines
35 KiB
TeX

.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