Sliding into bdos [4/6] M.J.Karas, 00-00-00 SUMMARY OF CP/M SYSTEM CALLS The set of system or "BDOS" I/O entry points available to the CP/M programmer is complete yet simple. The primary beauty of the CP/M system is this small world of completeness. Many programmers familair with other operating systems complain that the CP/M system is weak, unflexible, and incomplete. However, in a microprocessor type computer world, the generalization level defined for the CP/M system allows 85% of all microprocessor type appliciation jobs to be programmed with relative ease. Also, in my opinion, 8-bit microprocessor hardware is easily capable of performing about 90 percent of the typical tasks targeted for microcomputers. So what is this set of functions? The chart of Figure 1 summarizes, in function number order, all of the system operations specific to CP/M Version 2.2 that will be covered in this presentation. In the subsequent sections that follow the functions will be grouped into categories so that related operations may become familiar with reference to one another. FIGURE 1. DETAILED SUMMARY OF CP/M 2.2 SYSTEM CALLS Function Entry Value to Return Value from Number BDOS Passed in BDOS Passed in DEC HEX Function (DE) or (E) regs (HL) or (A) register ------------------------------------------------------------------------- 0 00 | System Reset | **** | **** | 1 01 | Console Input | **** | (A)=character | 2 02 | Console Output | (E)=character | **** | 3 03 | Reader Input | **** | (A)=character | 4 04 | Punch Output | (E)=character | **** | 5 05 | Printer Output | (E)=character | **** | 6 06 | Direct Console I/O | (E)=0FFH is input| (A)=character | | | (E)=chr is output| **** | 7 07 | Get IOBYTE | **** | (A)=IOBYTE | 8 08 | Set IOBYTE | (E)=IOBYTE | **** | 9 09 | Display Console String | (DE)=string addr | **** | 10 0A | Input Console String | (DE)=string addr | (A)=# chr input | 11 0B | Get Console Status | **** | (A)=000H idle | | | | (A)=0FFH ready | 12 0C | Get CP/M Version Number| **** | (HL)=Version # | 13 0D | Reset Disk Subsystem | **** | **** | 14 0E | Select Disk Drive | (E)=disk number | **** | 15 0F | Open a File | (DE)=FCB address | (A)=dir code | 16 10 | Close a File | (DE)=FCB address | (A)=dir code | 17 11 | Search for File | (DE)=FCB address | (A)=dir code | 18 12 | Search for Next | **** | (A)=dir code | 19 13 | Delete File | (DE)=FCB address | (A)=dir code | 20 14 | Read next Record | (DE)=FCB address | (A)=error code | 21 15 | Write next Record | (DE)=FCB address | (A)=error code | 22 16 | Create New File | (DE)=FCB address | (A)=dir code | 23 17 | Rename File | (DE)=FCB address | (A)=dir code | 24 18 | Get Login Vector | **** | (HL)=login vector| 25 19 | Get Logged Disk Number | **** | (A)=logged disk | 26 1A | Set R/W Data Buff Addr | (DE)=buffer addr | **** | 27 1B | Get Allocation Vector | **** | (HL)=alloc vector| | | | address | 28 1C | Write Protect Disk | (E)=disk number | **** | 29 1D | Get Read Only Vector | **** | (HL)=R/O vector | 30 1E | Set File Attributes | (DE)=FCB address | (A)=dir code | 31 1F | Get Addr of Disk Parms | **** | (HL)=parm addr | 32 20 | Get/Set User Select | (E)=0FFH get | (A)=current user | 33 21 | Read Random Record | (DE)=long FCB adr| (A)=error code | 34 22 | Write Random Record | (DE)=long FCB adr| (A)=error code | 35 23 | Get Size of File | (DE)=long FCB adr| (r0-2=rec cnt) | 36 24 | Set Random Record Num | (DE)=long FCB adr| (r0-2=rec numb) | 37 25 | Reset Drive | (DE)=drive vector| **** | 38 26 | Not used | | | 39 27 | Not used | | | 40 28 | Write Random with | (DE)=long FCB adr| (A)=error code | ------------------------------------------------------------------------- The technical means required to "use" or interface to the CP/M system for each function contains a certain common structure that will be discussed here. The base memory page of a CP/M system memory map includes, at a specific memory address, a JUMP instruction to the CP/M BDOS entry point. For most CP/M systems this is address 00005H. To accomplish BDOS I/O the number of the function is placed into the (C) register. If the parameter requires input parameters, then they are passed in the (DE) register pair or the individual (E) register depending upon whether the parameter is a word or byte value. Result information returned by some functions is sent back to the users program in either the (A) register or the (HL) register pair depending upon if the value is a byte or word. The following simple program segment demonstrates the scheme used to output the 26 characters A-Z to the console screen through the use of function number 2. BDOS EQU 0005H ; SYSTEM ENTRY CONOUT EQU 2 ; OUTPUT FUNCTION ORG 0100H ; TPA BASE LD B,26 ; PRINT 26 COUNTER LD C,'A' ; START WITH 'A' ; LOOP: PUSH BC ; SAVE COUNTER & LETTER LD E,C ; LETTER TO (E) FOR OUTPUT LD C,CONOUT ; BDOS FUNC TO (C) CALL BDOS ; GO GO OUTPUT POP BC INC C ; SEQUENCE TO NEXT CHAR DEC B ; DECREASE CHR COUNTER JP NZ,LOOP ; MORE TO DO IF NOT TO ZERO RET ; IMMEDIATE CCP RETURN SYSTEM CALLS FOR OPERATOR CONSOLE INPUT AND OUTPUT Intrinsic to the operation of any computer system, especially of the CP/M gender, is the operator console. The device provides the human interface to the machine and as such the BDOS includes a generalized set of operator communication functions to perform I/O with the console device. The various options available will each be presented with a brief example. INPUT FROM CONSOLE KEYBOARD: Function 1. This function waits for and reads in a character from the console device keyboard. The operator typed character is echoed automatically back to the console display if the character is an ASCII printable character (020H to 07EH) or it is a carriage return, line feed, back space, or tab. Note that the BDOS automatically expands tabs to columns of eight characters. Upon outputting the character for the echo, a check is made for console start/stop, CTL-S, and if so the console input routine does not return to the users program until another arbitrary key is depressed. ;CONSOLE INPUT EXAMPLE ; CONIN EQU 001H ; FUNC # 1 BDOS EQU 0005H ; SYSTEM ENTRY ORG 0100H ; START LD C,CONIN ; FUNCTION CALL BDOS ; GO GET CHARACTER LD (INCHAR),A ; SAVE FOR WHATEVER REASON RET ; IMMEDIATE CCP RETURN ; INCHAR: DEFS 1 ; PLACE TO STORE INPUT CHAR ; END OUTPUT TO CONSOLE DISPLAY: Function 2. The ASCII character in the (E) register is sent to the console display device. The output may be any byte value but many times the hardware driver BIOS routines automatically strip off the upper bit of the byte. Upon output the printer echo flag within BDOS is checked (CTL-P) and if set the character is also sent to the printer peripheral device. Note that the BDOS automatically expands output tabs to columns of eight characters. Upon outputting the character a check is made for input of console start/stop, CTL-S, and if so the console output routine does not return to the users program until another arbitrary key is depressed. ;CONSOLE OUTPUT EXAMPLE ; CONOUT EQU 002H ; FUNC # 2 BDOS EQU 0005H ; SYSTEM ENTRY ORG 0100H ; START LD A,(OUTCHAR) ; GET CHARACTER TO OUTPUT LD E,A LD C,CONOUT ; FUNCTION CALL BDOS ; GO SEND CHARACTER RET ; IMMEDIATE CCP RETURN ; OUTCHAR: DEFB 'X' ; PLACE TO GET OUTPUT CHAR ; END DIRECT USER INTERFACE TO CONSOLE: Function 6. Some programming applications require that the BDOS not monitor the input/output character stream as is done with functions 1 & 2. To allow for these functions the direct I/O function is supported. The following example shows how it is used to input values and echo them until an input control-Z character is typed. ;DIRECT CONSOLE I/O EXAMPLE ; DIRCIO EQU 006H ; FUNCTION NUMBER BDOS EQU 0005H ; SYSTEM ENTRY POINT CTLZ EQU 'Z'-040H ; ASCII CTL-Z CHARACTER INPUT EQU 0FFH ; DIRECT INPUT FLAG ORG 0100H ; CONSOLE INPUT ; LOOP: LD E,INPUT ; SET FOR INPUT LD C,DIRCIO ; FUNCTION CALL BDOS ; GET INPUT OR STATUS OR A ; IF (A)=0 NO CHAR WAS READY JP Z,LOOP ; CONTINUE TO WAIT FOR INPUT CP CTLZ ; IF INPUT WAS CTL Z THEN END RET Z ; CCP RETURN ON END LD E,A ; CHARACTER TO (E) FOR OUTPUT LD C,DIRCIO ; SAME FUNCTION NUMBER AGAIN CALL BDOS ; GO OUTPUT IT JP LOOP ; NEXT CHARACTER INPUT LOOP ; END PRINTING STRINGS OF CHARACTERS TO THE CONSOLE: Function 9. Message string sequences of characters to be sent to the console are quite common in applications programming. Typical uses may be for user prompt messages, program sign-on messages etc. The BDOS provides a convenient mechanism to allow the programmer to output a whole string of characters rather than having to loop with single character outputs. The string is intended to be stored in consecutive memory locations and end with the ASCII '$' character. The (DE) registers are used to point to the start of the string. The '$' signals the end of the string to display and is not sent to the console. The output bytes may be any 8-bit value but many times the hardware driver BIOS routines automatically strip off the upper bit of the byte. Upon output of each character the printer echo flag within BDOS is checked (CTL-P) and if set the character is also sent to the printer peripheral device. Note that the BDOS automatically expands output tabs to columns of eight characters. Upon outputting each character a check is made for input of console start/stop, CTL-S, and if so the console string output routine does not return to the users program until another arbitrary key is depressed. ;CONSOLE STRING PRINT EXAMPLE ; CONSTR EQU 009H ; FUNC # 9 BDOS EQU 0005H ; SYSTEM ENTRY CR EQU 0DH ; ASCII CARRIAGE RETURN LF EQU 0AH ; ASCII LINE FEED ORG 0100H ; START LD DE,MESSAGE ; POINT AT STRING TO SEND LD C,CONSTR ; FUNCTION CALL BDOS ; GO SEND STRING RET ; IMMEDIATE CCP RETURN ; MESSAGE: DEFB CR,LF,'Hello Operator',CR,LF,'$' ; END READING A STRING OF CHARACTERS IN FROM KEYBOARD: Function 10. The CP/M console command processor (CCP) assumed to be vary familiar to most CP/M system operators allows buffered command input with editing features. It turns out that this operation is a much needed function for getting in strings of text from the operator console. Use of this function allows standardization of the command input functions so that the operator can easily learn the editing key functions. It also removes the pain of writing the same function over and over again by the applications programmer. The read string command inputs the edited text to a buffer pointerd to by the (DE) register pair. The caller specifies the maximum length desired and the BDOS returns the actual length of string entered if carriage return is entered prior to exceeding the maximum input length. The input length is returned in both the (A) register and as part of the buffer. Bytes in the string buffer past the end of the entered text are uninitialized. The example shown below gives an assembly language view point of the buffer structure and how to program an input function. The editing functions supported are the following control and/or special characters: rub/del removes and echos the last entered char ctl-C initiates system reboot if first char ctl-E echos a CR & LF to console without putting them into buffer ctl-H (or back space key) back spaces one char removing last entered character ctl-J (or line feed key) terminates line input ctl-M (or carriage return) terminates input ctl-R retypes currently entered characters under current line ctl-U deletes all of currently entered data and restarts buffer input on new line ctl-X deletes all of currently entered data and restarts buffer input on same line ;CONSOLE INPUT BUFFER EXAMPLE ; CONBUF EQU 00AH ; STRING INPUT FUNCTION BDOS EQU 0005H ; SYSTEM ENTRY POINT LENGTH EQU 32 ; DESIRED MAXIMUM CHARACTERS ORG 0100H ; START POINT LD DE,STRING ; POINT AT BUFFER AREA LD C,CONBUF ; FUNCTION NUMBER CALL BDOS ; GO GET STRING RET ; RETURN TO CCP WITHOUT ; ...DOING ANYTHING WITH DATA ; ; ;CONSOLE INPUT BUFFER LAYOUT ; STRING: DEFB LENGTH ; MAXIMUM DESIRED INPUT LENGTH AMOUNT: DEFS 1 ; BYTE WHERE BDOS RETURNS ; ..ACTUAL BYTE COUNT STRBF: DEFS LENGTH ; RESERVED STORAGE FOR UP TO ; "LENGTH" NUMBER OF CHARACTERS ; END |