mirror of
https://github.com/kenshineto/kern.git
synced 2025-04-21 20:57:25 +00:00
287 lines
8.5 KiB
C
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
|