The IBM-PC WINDOWING library A PC Character Based Windowing Library for Stand-Alone 8086 applicatons using MICRO-C. Copyright 1989-2000 Dave Dunfield All rights reserved. DK86 WINDOWING LIBRARY Page: 1 1. IBM-PC WINDOWING Library The MICRO-C WINDOWING LIBRARY is a set of powerful, very fast, compact, text based windowing functions for use with the MICRO-C compiler, on the IBM Personal Computer. Features of the library include multiple open windows, overlaid windows with automatic save/restore of screen underneath, scrolling within windows, optional window borders, menu and form entry functions, and more. The library is organized into two parts, the first is a set of assembly language routines which provides the basic "low level" functions to open/close windows, and to output data in them. The second part of the library provides a set of 'C' functions which provide "high level" functions such as menu and form entry, formatted printing, etc. To add these functions to the 8086 Developers Kit library (TINY and SMALL) models, CD to the LIB86 directory, and use the following commands: cc86 winrtns -afop slib i=tiny a=winrtns a=wprintf a=window slib i=small a=winrtns a=wprintf a=window I have compiled the window demonstration program from the standard DOS compiler using the 8086 Developers Kit with these functions added to its library. Run WINDEMO.COM to see the windowing functions in action. DK86 WINDOWING LIBRARY Page: 2 1.1 Window Control Block Whenever a new window is opened, the windowing library sets up a WINDOW CONTROL BLOCK (WCB) which contains information needed to access and control the window. The format of the WCB is: Offset: 0 - Current video attribute * 1 - Window flags (High 8 bits of w_open attrs) ** 2 - Absolute 'X' position of top left corner of active region. *** 3 - Absolute 'Y' position of top left corner of active region. *** 4 - Width in characters of active region *** 5 - Height in characters of active region *** 6 - Current 'X' cursor coordinate 7 - Current 'Y' cursor coordinate 8,9 - Pointer to previous window buffer 10 - Previous cursor ENDING line 11 - Previous cursor STARTING line 12 - Previous cursor absolute 'X' position **** 13 - Previous cursor absolute 'Y' position **** 14..- Save area for SAVE/RESTORE function * You may dynamically alter the video attribute of data written to the window by writing to this byte. ** You may dynamically alter the properties of the window by setting or clearing the flag bits with these exceptions: -DO NOT enable SAVE/RESTORE unless opened with it (It is Ok to disable SAVE/RESTORE). -DO NOT change the state of the BORDER bits. *** For windows opened with a BORDER, this reflects the size of the active region (not including the border). Otherwise, this is the size of the entire window. **** For full screen window which does not SAVE/RESTORE, you can set these values to zero to home cursor on exit. DK86 WINDOWING LIBRARY Page: 3 1.2 External Variables In addition to the functions decribed on the following pages, the windowing library provides the following external variables which may be accessed from within your 'C' program: 1.2.1 W_BASE extern int W_BASE; This variable contains the base address of the video screen, which may be used to determine the type of display present: B000 = Monochrome B800 = Color 1.2.2 W_OPEN extern char *W_OPEN; This variable contains a pointer to the WCB for the "active" window, and controls which window is manipulated by certain library functions. This automatically set up by "wopen" to point to the last window opened, but may be changed at any time with: W_OPEN = window; NOTE, when the active window is closed, W_OPEN is reset to point to the window which was active at the time that it (the active window) was opened. If windows are closed in other than the reverse order of which they were opened, W_OPEN may be left pointing to a window which has already been closed. If this happens, YOU MUST NOT USE THE "ACTIVE" WINDOW FUNCTIONS WITHOUT RESETTING W_OPEN TO POINT TO AN OPEN WINDOW. It is your (the programmer's) responsibility to insure that you know what window will be accessed through W_OPEN at all times throughout your program. 1.3 Window Library Functions The following pages contain a description of each function available in the IBM-PC windowing library. WCLEOL WCLEOL W_CLEOL W_CLEOL PROTOTYPE: wcleol() w_cleol(char *window) ARGUMENTS: window - Pointer to WCB for an open window RETURN VALUE: None DESCRIPTION: The "wcleol" function clears the active window from the current cursor position to the end of a line. The "w_cleol" function clears the specified window fromt the current position to the end of the line. EXAMPLES: wputs("Input> "); /* Display a prompt */ wcleol(); /* Clear remainder of input line */ WCLEOW WCLEOW W_CLEOW W_CLEOW PROTOTYPE: wcleow() w_cleow(char *window) ARGUMENTS: window - Pointer to WCB for an open window RETURN VALUE: None DESCRIPTION: The "wcleow" function clears the active window from the current position to the end of the window. The "w_cleow" function clears the specified window from the current position to the end of the window. EXAMPLES: wgotoxy(0, 10); /* position at line 11 */ wcleos(); /* Clear lower part of screen */ WCLOSE WCLOSE W_CLOSE W_CLOSE PROTOTYPE: wclose() w_close(char *window) ARGUMENTS: window - Pointer to WCB for an open window RETURN VALUE: None DESCRIPTION: The "wclose" function closes the "active" window, and de-activates it. The "w_close" function closes the specified window, and de-activates it. If the window being closed is the "active" window, the "active" window will revert to the window which was "active" at the time that the window being closed was opened. EXAMPLES: wclose(); /* Close active window */ w_close(title); /* Close the title window */ WCLWIN WCLWIN W_CLWIN W_CLWIN PROTOTYPE: wclwin() w_clwin(char *window) ARGUMENTS: window - Pointer to WCB for an open window RETURN VALUE: None DESCRIPTION: The "wclwin" function clears the entire active window and resets the cursor position to the top left hand corner. The "w_clwin" function clears the entire specified window, and resets the cursor position to the top left hand corner. EXAMPLES: if(c = 0x1b) { /* Escape command */ wclwin(); /* Clear the screen */ wputs("Exiting back to main menu"); return; } WCURSOR_BLOCK WCURSOR_BLOCK PROTOTYPE: wcursor_block() ARGUMENTS: None RETURN VALUE: None DESCRIPTION: This function enables (turns on) display of the cursor on the IBM PC video display. The cursor is shown as flashing block, occupying the entire character window. EXAMPLES: if(insert) /* Test insert mode flag */ wcursor_block(); /* Indicate inserting with block cursor */ else wcursor_line(); /* Indicate overwrite with line cursor */ WCURSOR_LINE WCURSOR_LINE PROTOTYPE: wcursor_line() ARGUMENTS: None RETURN VALUE: None DESCRIPTION: This function enables (turns on) display of the cursor on the IBM PC video display. The cursor is shown as a single flashing line, at the bottom of the character window. EXAMPLES: wcursor_line(); /* Re-enable the cursor */ exit(0); /* And terminate */ WCURSOR_OFF WCURSOR_OFF PROTOTYPE: wcursor_off() ARGUMENTS: None RETURN VALUE: None DESCRIPTION: This function inhibits (turns off) display of the cursor on the IBM PC video display. This affects the cursor display only, screen output will continue to be displayed at the correct cursor position. EXAMPLES: wclscr(); /* Clear screen */ wcursor_off(); /* Inhibit cursor */ wmenu(10, 10, 0x6007, main_menu, &index); /* Present main menu */ WFORM WFORM PROTOTYPE: register wform(int x, int y, int attrs, char *prompts[], char *strings, ...) ARGUMENTS: x - Absolute COLUMN of upper left corner of form window y - Absolute ROW of upper left corner of form window attrs - Attributes for form window (See WOPEN) prompts - Prompt string for form entries strings - Destination string to receive form data ... - Additional arguments may be required RETURN VALUE: None DESCRIPTION: The "wform" function opens a window, which contains a "form" consisting of prompts and data areas. Each data area is shown beside its corresponding prompt, and may be edited using the keys supported by WGETS. the UP and DOWN ARROW keys may be used to move the editing cursor between the various fields in the input form.* The "attrs" argument contains the open attributes (see WOPEN) for the menu window, and may be used to control the color, border, clearing, etc. The "prompts" argument is an array of pointers to strings, which define the prompts and input fields in the form. The first two characters of each string define the 'X' and 'Y' coordinates within the window of the prompt string. The third character contains the length of the destination string, and the remainder of the string contains the text prompt. The destination string is positioned in the window directly following the prompt string. This list of prompts must end with a NULL (0) element. The first (0) element of "prompts" does not actually point to an input definition, but contains the X and Y sizes for the window to be opened (High byte = X, Low byte = Y). Following the "prompts" argument, there must be one destination "string" argument for each prompt defined. The strings must be long enough to contain the number of characters specified in the third byte of the coresponding "prompt" string. Only the lower seven bits of the field length are used (length = 1-127), the high bit indicates that the field is to contain numbers only. In this case, the corresponding argument is NOT a pointer to a string, but must be a pointer to an "int" variable. The form is exited by pressing the ESCAPE key. EXAMPLES: /* Sample input form */ char *form[] = { 50<<8|6, /* Place in 50 by 6 window */ "\x01\x00\x20Software :", "\x01\x01\x20Author :", "\x01\x02\x20Directory :", "\x01\x03\x20Filename :", 0 }; /* Data areas for input form */ char software[0x21] = "MICRO-C", author[0x21] = "Dave Dunfield", direct[0x21] = "C:\\MC", filename[0x21] = "MC*.*"; /* Simple main program to display the form */ main() { wform(15, 9, 0xE007, form, software, author, direct, filename); } WGETC WGETC W_GETC W_GETC PROTOTYPE: int wgetc() int w_getc(char *window) ARGUMENTS: window - Pointer to WCB for an open window RETURN VALUE: 0-127 - ASCII value of key pressed < 0 - Special function key as defined in "window.h" DESCRIPTION: The "wgetc" function waits until a key is pressed on the system console, and returns its value. The cursor is updated to be placed at the current cursor position in the active window. The "w_getc" function waits until a key is pressed on the system console, and returns its value. The cursor is updated to be placed at the current cursor position in the specified window. Note that due to the buffering of the IBM-PC keyboard, every keypress will be reported, even if the WGETC or W_GETC function is called after a key is pressed and released. EXAMPLES: switch(wgetc()) { /* Handle input keys . . . } WGETS WGETS PROTOTYPE: int wgets(int x, int y, char *string, int length) ARGUMENTS: x - COLUMN position for input y - ROW position for input string - Destination string length - Length of string (High bit set = Numbers only) RETURN VALUE: Character causing exit DESCRIPTION: The "wgets" function positions the cursor at the specified X and Y coordinates, and displays the contents of "string" (in a field of "length" characters), and waits for input, which may be used to edit the string. Any normal ASCII characters which are input will be entered into the string, The following function keys are recognized: LEFT ARROW - Position cursor one space to the left RIGHT ARROW - Position cursor one space to the right BACKSPACE - Backup cursor & delete previous character DELETE - Delete character under cursor INSERT - Toggle between INSERT/OVERWRITE HOME - Position cursor at start of string END - Position cursor at end of scring PAGE UP - Clear entire field PAGE DOWN - Clear from cursor to end of field Any other special function keys will cause "wgets" to terminate, and return the value of the offending key. (See "window.h" for key definitions). When INSERT mode is enabled, all entered text will be inserted into the string, with the remainder of the string shifting to the right. This mode is indicated by a flashing BLOCK cursor. When OVERWRITE mode is enabled, all entered text will overwrite the existing string. This mode is indicated by a flashing LINE cursor. EXAMPLES: wgets(2, 5, name, 25); WGOTOXY WGOTOXY W_GOTOXY W_GOTOXY PROTOTYPE: wgotoxy(int x, int y) w_gotoxy(int x, int y, char *window) ARGUMENTS: x - New COLUMN y - New ROW window - Pointer to WCB for an open window RETURN VALUE: None DESCRIPTION: The "wgotoxy" function positions the cursor within the active window. Any further display output to that window will occur at the new ROW and COLUMN positions. The "w_gotoxy" function positions the cursor within the specified window. Any further display output to that window will occur at the new ROW and COLUMN positions. EXAMPLES: for(i=0; i<10; ++i) { /* Draw a diagonal line of 'X's */ wgotoxy(i, i); wputc('X'); } WMENU WMENU PROTOTYPE: wmenu(int x, int y, int attrs, char *names[], int &index) ARGUMENTS: x - Absolute COLUMN of top left corner of menu window y - Absolute ROW of top left corner of menu window attrs - Attributes for menu window (see WOPEN) names - Array to menu selection text (last entry = 0) index - Address of message selection index variable RETURN VALUE: 0 - Selection was made and ENTER pressed. !0 - Menu was aborted via ESCAPE key. DESCRIPTION: The "wmenu" function opens a window containing a list of menu items at the specified ROW and COLUMN address. The user may use the UP, DOWN, HOME and END keys to select an entry by moving the INVERSE VIDEO selection cursor. Pressing an alpha-numeric key will position the selection bar to the first entry which begins with that character. When the desired selection is under the cursor, the selection is made by pressing the ENTER key. At any time the menu selection may be canceled by pressing the ESCAPE key. The "attrs" argument contains the open attributes (see WOPEN) for the menu window, and may be used to control the color, border, clearing, etc. The "names" argument must be a pointer to an array of character strings which are the selections to display. This array MUST end with a NULL (0) element to indicate the end of the list. The "index" argument is the address of an "int" variable which contains the position of the selection cursor. It controls where the selection cursor will appear when the function is first invoked (0 = first entry), and also is assigned the position of the selection cursor when the selection is made. Once a selection is made, the first character of that selection will be hilighted in reverse video. EXAMPLES: char *names[] = { "One", "Two", "Three", "Four", "Five", 0 }; . . . index = 0; if(wmenu(10, 10, 0xE007, names, &index)) return; /* Aborted, exit to higher level */ switch(index) { /* Handle selection */ . . . } WOPEN WOPEN PROTOTYPE: char *wopen(int x, int y, int width, int height, int attrs) ARGUMENTS: x - Absolute COLUMN of top left corner of window y - Absolute ROW of top left corner of window width - The width of the window in characters height - The height of the window in characters attrs - The window attributes, BIT definitions: 15 - Enable SAVE/RESTORE screen under window * 14 - Enable SINGLE line BORDER * 13 - Enable DOUBLE line BORDER 12 - Enable CLEAR on OPEN ** 11 - Enable CLEAR on CLOSE *** 10 - Disable NEWLINE (LF only) 9 - Enable SCROLLING in window 8 - Enable LINE WRAP in window 7-0 - Video attributes for window * When BORDER is selected, window will include an enclosing BOX. In this case, the effective height and width of the active region (where text data can be written) will be reduced by 2. ** Has no visual effect when SAVE/RESTORE is enabled. *** If this BIT is set, CTRL-J will behave as LINEFEED only, and will not return the cursor to the left margin. RETURN VALUE: A pointer to the WCB for the newly opened window 0 if the window could not be opened DESCRIPTION: The "wopen" function creates a new window on the PC video screen. This newly created window is also made the "active" window, which is automatically accessed by many of the windowing functions. If "wopen" is unable to allocate enough memory for the window control block (WCB), it will fail and return a value of zero (0). EXAMPLES: /* Create a title window at top of screen */ titlewin = wopen(0, 0, 80, 3, 0x6047); WPRINTF WPRINTF W_PRINTF W_PRINTF PROTOTYPE: register wprintf(char *format, arg, ...) register w_printf(char *window, char *format, arg, ...) ARGUMENTS: window - Pointer to WCB for an open window format - Pointer to format string arg - Argument as determined by format string ... - Additional arguments may be required RETURN VALUE: None DESCRIPTION: The "wprintf" function performs exactly as the "PRINTF" function in the standard function library, except that it outputs directly to the active window using the low level windowing library functions. The "w_printf" function behaves similar to "wprintf", except that the window to receive the output is specified as the first parameter. These functions should be used in preference to "PRINTF" when using the windowing function library since "PRINTF" will not move the windowing librarys cursor, will not use the attributes from the WCB, and will not respect the boundarys of the window. NOTE: This function uses a variable number of arguments, and must be declared as "register" (See "window.h"). EXAMPLES: wgotoxy(0, 0); wprintf("Window %u", screen); WPUTC WPUTC W_PUTC W_PUTC PROTOTYPE: wputc(int c) wputc(int c, char *window) ARGUMENTS: c - Character to be written to window RETURN VALUE: None DESCRIPTION: This "wputc" function displays a character in the active window at the current cursor position. The "w_putc" functino displays a character in the specified window at the current cursor position. Characters are output in "tty" fashion, with proper handling of control codes such as CARRIAGE-RETURN, LINE-FEED and BELL. The screen will scroll upwards when a NEWLINE is printed on the bottom line of the screen, or when the bottom line wraps around to the next (Assuming those options are enabled in the window). Although only the lower 8 bits of a passed value are used, "vputc" will not perform ANY output translations if any of the upper 8 bits are set. This provides a method of displaying the video characters represented by control codes such as NEWLINE, and BACKSPACE. The first byte of the window control block (WCB) for the window contains the attributes which will be used to display the character. This value is written to the attribute location associated with the character on the video display hardware. Its effect is dependant on the video adapter in use. The "window.h" header file contains definitions of the attribute bits for use on "standard" monochrome and color displays. EXAMPLES: w_putc(0x0A, window1); /* Line-feed, advance cursor */ wputc(0x0A | 0xff00); /* Display 0x0A character code */ WPUTF WPUTF PROTOTYPE: wputf(char *string, int width) ARGUMENTS: string - Pointer to character string width - Width of output field RETURN VALUE: None DESCRIPTION: The "wputf" function outputs a character string to the active window screen using the video library functions. The string is left justified in a field of the specified width. If the string is shorter than "width", the field is padded with blanks. If the string is longer than "width", the output is truncated. EXAMPLES: wputf(message, 10); WPUTS WPUTS W_PUTS W_PUTS PROTOTYPE: wputs(char *string) w_puts(char *string, char *window) ARGUMENTS: string - Pointer to character string window - Pointer to WCB for an open window RETURN VALUE: None DESCRIPTION: The "wputs" function outputs a character string to the active window. The "w_puts" function output a character string to the specified window. EXAMPLES: wputs(message); w_puts(message, window1); WTSTC WTSTC W_TSTC W_TSTC PROTOTYPE: int wtstc() int w_tstc(char *window) ARGUMENTS: window - Pointer to WCB for an open window RETURN VALUE: 0 - No key pressed 1-127 - ASCII value of key pressed < 0 - Special function key as defined in "window.h" DESCRIPTION: The "wtstc" function tests for a key pressed on the system console, and returns its value. If a character is found, the cursor is updated in the active window. The "w_tstc" function tests for a key pressed on the system console, and returns its value. If a character is found, the cursor is updated in the specified window. A returned value of zero (0) indicates that no key was found to be pressed. Note that due to the buffering of the IBM-PC keyboard, every keypress will be reported, even if the WTSTC or W_TSTC function is called after a key is pressed and released. EXAMPLES: if(wtstc() == 0x1B) /* exit loop on ESCAPE key */ break; WUPDATEXY WUPDATEXY W_UPDATEXY W_UPDATEXY PROTOTYPE: wupdatexy() w_updatexy(char *window) ARGUMENTS: window - Pointer to WCB for an open window RETURN VALUE: None DESCRIPTION: The "wupdatexy" function updates the real X/Y cursor position on the video screen to reflect the "logical" position where the next character will be output in the active window. The "w_updatexy" function updates the real X/Y cursor position on the video screen to reflect the "logical" position where the next character will be output in the specified window. The MICRO-C Windowing library uses a BIOS interrupt (INT 10) to position the cursor, which is quite slow, compared to the speed of the library video routines. To prevent this from slowing down the video output, the cursor is only physically re-positioned when a "wgotoxy" or a "wgetc" is executed. This allows the library routines to run at full speed, and still put the cursor in the right place when output stops and an input request is made. A side effect of this is that the cursor on the screen will not appear to move unless you call "wgotoxy" or "wgetc". This only affects the physical cursor on the screen, MICRO-C maintains its own internal cursor location which it uses to determine where on the screen the next write will occur. Some applications which run in real time (Such as a terminal emulator) do not call "wgetc", but use "wtstc" to poll the keyboard on a regular basis. In this case, the "wupdatexy" routine should be called any time that the visual position of the cursor is important. EXAMPLES: wupdatexy(); /* position the cursor * c = wtstc(); /* Test for a character */ DK86 WINDOWING LIBRARY TABLE OF CONTENTS Page 1. IBM-PC WINDOWING Library 1 1.1 Window Control Block 2 1.2 External Variables 3 1.3 Window Library Functions 3
Code: