CP/M Interface

CP/M provides a universal interface linking application programs into the operating system. Through a system of calls to one location (0005 Hex) with the CPU register C set to the call number, the ROM-based operating system in HUNTER will implement the function and return to the user program. HUNTER is therefore compatible with many readily available commercial products,conforming to these standard system calls.

System Calls

CP/M system calls fall into two distinct categories. They are console (e.g. keyboard/LCD display) I/O and file I/O. Files are organised as CP/M disk files and may be accessed through a file control block (FCB).

Call No. Name Call No. Name
0 System Reset 19 Delete File
1 Console Input 20 Read Sequential
2 Console Output 21 Write Sequential
3 Reader Input 22 Make File
4 Punch Output 23 Rename File
5 List Output 24 Return Login Vector
6 Direct Console I/O 25 Return Current Disk
7 Get I/O Byte 26 Set DMA Address
8 Set I/O Byte 27 Get Addr(Alloc)
9 Print String 28 Write Protect Disk
10 Read Console Buffer 29 Get R/0 Vector
11 Get Console status 30 Set File Attributes
12 Return Version Number 31 Get Addr(Disk Parms)
13 Reset Disk System 32 Set /Get User Code
14 Select Disk 33 Read Random
15 Open File 34 Write Random
16 Close File 35 Compute File Size
17 Search for First 36 Set Random Record
18 Search for Next 37 Reset Drive

System calls 38-47 refer to HUNTER operating system only.

File Control Block

The FCB contains 36 bytes of information on the current file being accessed. On HUNTER, the default FCB location is at 005CH, containing the following Information :-

Byte Description
1 Drive code (zero)
2-9 Eight Character ASCII filename
10-12 ASCII file extension
13 Current extent number
14-15 Reserved
16 Record count for extent
17-32 Reserved for system use
33 Current record in sequential file operation
34-36 Random record number

HUNTER System Calls

This manual does not contain an exhaustive description of each system call, since they are defined and explained in great depth in many other publications. However, there does follow a brief description of each call, together with details of extra calls specific to HUNTER.

The C register is loaded with the call number plus any other parameters into other registers, and the A call is made to address 0005. Registers not mentioned are irrelevant on entry, and none are necessarily preserved on exit. For making these calls from Basic, see the CALL and ARG and Machine Code Calls.

Function Call No Entry Exit Remarks
System Reset 0 None None A system restart, re-entering HUNTER'S operating system.
Console Input 1 None A=ASCII character Read keyboard and echo onto screen. The call will wait until a key is pressed.
Console Output 2 E=ASCII character. None The character is displayed on the screen at the location of the cursor.
Reader Input 3 None A=ASCII character. The next character is read from the serial I/O buffer.
Punch Output 4 E=ASCII character. None The character is sent out through the serial port.
List Output 5 E=ASCII character. None As call 4.
Direct Console I/O 6 E=0FFH for input, E=ASCII character for output. A=ASCII character if input, A=status if output. Similar to calls 1 and 2, but there is no automatic echo to the screen. If a character is from not ready from the keyboard then A=00 on return.
Get I/O Byte 7 None A=I/O status. The present I/O status byte is returned.
Set I/O Byte 8 E=I/0 value. None I/O byte is set.
Print String to Console 9 DE=string address. None An ASCII string whose start address is loaded into DE, is displayed on the screen. The string must be terminated with "$".
Read Console Buffer 10 DE=buffer address. None The keyboard is read and the characters are placed into a buffer, the start address having been loaded into DE. The first byte contains the maximum number of characters to read into the buffer, the second byte contains the number of characters that have been placed into the buffer when input has been terminated with C/R or L/F. See [[:appendix:read_console_buffer]] for further information.
Get Console Status 11 None A=console status. If a character has been typed In then 01H is returned, OOH if not.
Return Version Number 12 None HL=version number. HUNTER is CP/M version 2.2 compatible, so 0022H is returned.
Reset Disk System 13 None None The filing system is reset, and the DMA address is returned to 80H.
Select Disk 14 None None HUNTER has "RAM disks" so this call produces no action.
Open File 15 DE=FCB address. A=directory code. The file specified by the FCB is opened. If successful A=0,1,2 or 3. If not, then A=0FFH.
close File 16 DE=FCB address. A=directory code. If successfully closed, A=0,1,2 or 3, otherwise A=0FFH.
Search for First 17 DE=FCB address. A=directory code. The directory is searched for the first match of the FCB. A=OFFH if there is no match, and 0,1,2 or 3 if there is. The filename is returned into the current DMA buffer. The search function returns the complete entry from the buffer.
Search for Next 18 None A=directory code. Similar to CALL 17, except that the next entry is looked for. The search function returns the complete entry from the buffer.
Delete file 19 DE-FCB address. A=directory code. Files which match the FCB are deleted. If none exist A=0FFH is returned.
Read Sequential 20 DE=FCB address. A=directory code. The specified file is read, and the sector copied to the current DMA address. A=00 for a successful read.
Write Sequential 21 DE=FCB address. A=directory code. The record at the current DMA address is written to the disk. A=00 to indicate a successful write.
Make File 22 DE=FCB address. A=directory code. The specified file is created. A=0-3 if successful, or A=0FFH if not.
Rename a File 23 DE=FCB address. A=directory code. The file specified in the first 16 bytes of the FCB is renamed to that name in the second 16 bytes.
Return Login Vector 24 None HL=login vector. HUNTFR returns HL=1 and A=1, indicating a single disk system.
Return Current Disk 25 None A=current disk. Zero is always returned on HUNTER.
Set DMA Address 26 DE=DMA address. None The current disk data buffer area is set to DE.
Get Allocation Address 27 None HL=allocation address. Zero only is returned.
Write Protect Disk 28 Returns with no effect.
Get Read Only Vector 29 Returns with no effect.
Set File Attributes 30 DE=FCB address. A=directory code. File attributes for readonly etc. are set or reset as specified.
Disk Parameter Address 31 None HL=disk parameter block address. Disk parameters are returned which indicate a double sided double density disk. This is to allow for expansion within HUNTER. it should not be used for space calculation purposes.
Get or Set User Code 32 Returns with no effect.
Read Random 33 DE=FCB address. A=directory code. The file is read at the specified record. Normally non zero directory codes mean an error.
Write Random 34 DE=FCB address. A=directory code. The file is written at the specified record. A=0 means a successful write.
Compute File Size 35 DE=FCB address. None Random record field set to one plus the last record.
Set Random Record 36 DE=FCB address. None Random record field set.
Reset Drive 37 DE=drive vector. None HUNTER'S filing system is reset.
Set up the RS-232 Serial Port 38 None None The software setup routine is entered to set up the serial communications.
Initialise the Clock 39 None None The time and date buffer RAM is copied to the clock.
Write Random with zero fill 40 DE=FCB address. A=directory code. The write random with zero fill operation is similar to function 34, with the exception that a previously unallocated block is filled with zeros before data is written. NOTE: on early HUNTERs, this call was used for a different function.
Initialise communications 41 None None This call allows configuration of the communications exactly as the standard initialise HUNTER communications routine.
Serial Status 42 None A=port status. To test for pending serial input characters A=0 for no characters read else A is non-zero
Terminal emulation call 43 None None Enters terminal emulation mode.
Wand input call 44 DE=Buffer Address None The Wand code is selected previously by setting the bartype location according to wand code being read. The code is read into the buffer. The user must provide the buffer address and, in the first location of the buffer, the user must provide the maximum number of characters to be read into the buffer. On exit, the second byte of the buffer contains the number of characters that have been placed in the buffer, followed by the wand character's input.
Fetch key without echo 47 None A=ASCII code of character.
Read the Clock 48 None None The time and date is copied from the clock into the time and date buffer RAM (see Memory Locations) locations TENTHSEC to TENYR.