kern/include/cio.h

287 lines
8.5 KiB
C

/**
** SCCS ID: @(#)cio.h 2.7 1/22/25
**
** @file cio.h
**
** @author Warren R. Carithers
** @authors K. Reek, Jon Coles
**
** Based on: c_io.c 1.13 (Ken Reek, Jon Coles, Warren R. Carithers)
**
** Declarations and descriptions of console I/O routines
**
** These routines provide a rudimentary capability for printing to
** the screen and reading from the keyboard.
**
** Screen output:
** There are two families of functions. The first provides a window
** that behaves in the usual manner: writes extending beyond the right
** edge of the window wrap around to the next line, the top line
** scrolls off the window to make room for new lines at the bottom.
** However, you may choose what part of the screen contains this
** scrolling window. This allows you to print some text at fixed
** locations on the screen while the rest of the screen scrolls.
**
** The second family allows for printing at fixed locations on the
** screen. No scrolling or line wrapping are done for these functions.
** It is not intended that these functions be used to write in the
** scrolling area of the screen.
**
** In both sets of functions, the (x,y) coordinates are interpreted
** as (column,row), with the upper left corner of the screen being
** (0,0) and the lower right corner being (79,24).
**
** The printf provided in both sets of functions has the same
** conversion capabilities. Format codes are of the form:
**
** %-0WC
**
** where "-", "0", and "W" are all optional:
** "-" is the left-adjust flag (default is right-adjust)
** "0" is the zero-fill flag (default is space-fill)
** "W" is a number specifying the minimum field width (default: 1 )
** and "C" is the conversion type, which must be one of these:
** "c" print a single character
** "s" print a null-terminated string
** "d" print an integer as a decimal value
** "x" print an integer as a hexadecimal value
** "o" print an integer as a octal value
**
** Keyboard input:
** Two functions are provided: getting a single character and getting
** a newline-terminated line. A third function returns a count of
** the number of characters available for immediate reading.
** No conversions are provided (yet).
*/
#ifndef CIO_H_
#define CIO_H_
#ifndef ASM_SRC
// EOT indicator (control-D)
#define EOT '\04'
/*****************************************************************************
**
** INITIALIZATION ROUTINES
**
** Initializes the I/O system.
*/
/**
** cio_init
**
** Initializes the I/O routines. Must be called before
** any CIO functions can be used.
**
** @param notify pointer to an input notification function, or NULL
*/
void cio_init(void (*notify)(int));
/*****************************************************************************
**
** SCROLLING OUTPUT ROUTINES
**
** Each operation begins at the current cursor position and advances
** it. If a newline is output, the reminder of that line is cleared.
** Output extending past the end of the line is wrapped. If the
** cursor is moved below the scrolling region's bottom edge, scrolling
** is delayed until the next output is produced.
*/
/**
** cio_setscroll
**
** This sets the scrolling region to be the area defined by the arguments.
** The remainder of the screen does not scroll and may be used to display
** data you do not want to move. By default, the scrolling region is the
** entire screen. X and Y coordinates begin at 0 in the upper left corner
** of the screen.
**
** @param min_x,min_y upper-left corner of the region
** @param max_x,max_y lower-right corner of the region
*/
void cio_setscroll(unsigned int min_x, unsigned int min_y, unsigned int max_x,
unsigned int max_y);
/**
** cio_moveto
**
** Moves the cursor to the specified position. (0,0) indicates
** the upper left corner of the scrolling region. Subsequent
** output will begin at the cursor position.
**
** @param x,y desired coordinate position
*/
void cio_moveto(unsigned int x, unsigned int y);
/**
** cio_putchar
**
** Prints a single character.
**
** @param c the character to be printed
*/
void cio_putchar(unsigned int c);
/**
** cio_puts
**
** Prints the characters in the string up to but not including
** the terminating null byte.
**
** @param str pointer to a NUL-terminated string to be printed
*/
void cio_puts(const char *str);
/**
** cio_write
**
** Prints "length" characters from the buffer.
**
** @param buf the buffer of characters
** @param length the number of characters to print
*/
void cio_write(const char *buf, int length);
/**
** cio_printf
**
** Limited form of printf (see the beginning of this file for
** a list of what is implemented).
**
** @param fmt a printf-style format control string
** @param ... optional additional values to be printed
*/
void cio_printf(char *fmt, ...);
/**
** cio_scroll
**
** Scroll the scrolling region up by the given number of lines.
** The output routines scroll automatically so normally you
** do not need to call this routine yourself.
**
** @param lines the number of lines to scroll
*/
void cio_scroll(unsigned int lines);
/**
** cio_clearscroll
**
** Clears the entire scrolling region to blank spaces, and
** moves the cursor to (0,0).
*/
void cio_clearscroll(void);
/*****************************************************************************
**
** NON-SCROLLING OUTPUT ROUTINES
**
** Coordinates are relative to the entire screen: (0,0) is the upper
** left corner. There is no line wrap or scrolling.
*/
/**
** cio_putchar_at
**
** Prints the given character. If a newline is printed,
** the rest of the line is cleared. If this happens to the
** left of the scrolling region, the clearing stops when the
** region is reached. If this happens inside the scrolling
** region, the clearing stops when the edge of the region
** is reached.
**
** @param x,y desired coordinate position
** @param c the character to be printed
*/
void cio_putchar_at(unsigned int x, unsigned int y, unsigned int c);
/**
** cio_puts_at
**
** Prints the given string. cio_putchar_at is used to print
** the individual characters; see that description for details.
**
** @param x,y desired coordinate position
** @param str pointer to a NUL-terminated string to be printed
*/
void cio_puts_at(unsigned int x, unsigned int y, const char *str);
/**
** cio_printf_at
**
** Limited form of printf (see the beginning of this file for
** a list of what is implemented).
**
** @param x,y desired coordinate position
** @param fmt a printf-style format control string
** @param ... optional additional values to be printed
*/
void cio_printf_at(unsigned int x, unsigned int y, char *fmt, ...);
/**
** cio_clearscreen
**
** This function clears the entire screen, including the scrolling region.
*/
void cio_clearscreen(void);
/*****************************************************************************
**
** INPUT ROUTINES
**
** When interrupts are enabled, a keyboard ISR collects keystrokes
** and saves them until the program calls for them. If the input
** queue fills, additional characters are silently discarded.
** When interrupts are not enabled, keystrokes made when no input
** routines have been ** called are lost. This can cause errors in
** the input translation because the states of the Shift and Ctrl keys
** may not be tracked accurately. If interrupts are disabled, the user
** is advised to refrain from typing anything except when the program is
** waiting for input.
*/
/**
** cio_getchar
**
** If the character is not immediately available, the function
** waits until the character arrives.
**
** @return the next character from the keyboard input buffer
*/
int cio_getchar(void);
/**
** cio_gets
**
** This function reads a newline-terminated line from the
** keyboard. cio_getchar is used to obtain the characters;
** see that description for more details. The function
** returns when:
** a newline is entered (this is stored in the buffer)
** ctrl-D is entered (not stored in the buffer)
** the buffer becomes full.
** The buffer is null-terminated in all cases.
**
** @param buffer destination buffer for the input character sequence
** @param size the buffer length
**
** @return count of the number of characters read into the buffer
*/
int cio_gets(char *buffer, unsigned int size);
/**
** cio_input_queue
**
** This function lets the program determine whether there is input
** available. This indicates whether or not a call to cio_getchar()
** would block.
**
** @return number of characters in the input queue
*/
int cio_input_queue(void);
#endif /* !ASM_SRC */
#endif