diff --git a/sys/msdos/pcvideo.h b/sys/msdos/pcvideo.h new file mode 100644 index 000000000..25cf93238 --- /dev/null +++ b/sys/msdos/pcvideo.h @@ -0,0 +1,283 @@ +/* SCCS Id: @(#)pcvideo.h 3.3 94/06/07 */ +/* Copyright (c) NetHack PC Development Team 1993, 1994 */ +/* NetHack may be freely redistributed. See license for details. */ +/* */ +/* + * pcvideo.h - Hardware video support definitions and prototypes + * + *Edit History: + * Initial Creation M. Allison 93/10/30 + * + */ + +#ifndef PCVIDEO_H +#define PCVIDEO_H + +#include "portio.h" + +# ifdef SCREEN_BIOS +# if !defined(PC9800) +# define MONO_CHECK /* Video BIOS can do the check */ +# endif +# endif + +# ifdef SCREEN_DJGPPFAST +/*# define MONO_CHECK /* djgpp should be able to do check */ +# endif + +/* + * PC interrupts + */ +# ifdef PC9800 +#define CRT_BIOS 0x18 +#define DOS_EXT_FUNC 0xdc +#define DIRECT_CON_IO 0x10 +# else +#define VIDEO_BIOS 0x10 +# endif +#define DOSCALL 0x21 + + +/* + * Video BIOS functions + */ +# if defined(PC9800) +#define SENSEMODE 0x0b /* Sense CRT Mode */ + +#define PUTCHAR 0x00 /* Put Character */ +#define SETATT 0x02 /* Set Attribute */ +#define SETCURPOS 0x03 /* Set Cursor Position */ +#define CURSOR_RIGHT 0x08 /* Move Cursor Right */ +#define CURSOR_LEFT 0x09 /* Move Cursor Left */ +#define SCREEN_CLEAR 0x0a /* Clear Screen */ +#define LINE_CLEAR 0x0b /* Clear Line */ +# else +#define SETCURPOS 0x02 /* Set Cursor Position */ +# endif + +#define GETCURPOS 0x03 /* Get Cursor Position */ +#define GETMODE 0x0f /* Get Video Mode */ +#define SETMODE 0x00 /* Set Video Mode */ +#define SETPAGE 0x05 /* Set Video Page */ +#define FONTINFO 0x1130 /* Get Font Info */ +#define SCROLL 0x06 /* Scroll or initialize window */ +#define PUTCHARATT 0x09 /* Write attribute & char at cursor */ + +/* + * VGA Specific Stuff + */ +# ifdef SCREEN_VGA +/* #define HW_PANNING /* Hardware panning enabled */ +#define USHORT unsigned short +#define MODE640x480 0x0012 /* Switch to VGA 640 x 480 Graphics mode */ +#define MODETEXT 0x0003 /* Switch to Text mode 3 */ + +#ifdef HW_PANNING +#define PIXELINC 16 /* How much to increment by when panning */ +/*#define PIXELINC 1 /* How much to increment by when panning */ +#define SCREENBYTES 128 +#define CharRows 30 +#define VERT_RETRACE {while (!(inportb(crt_status) & 0x08)); } +#define VERT_RETRACE_END {while ( (inportb(crt_status) & 0x08)); } +#else +#define SCREENBYTES 80 +#endif + +#define CharacterWidth 8 +#define SCREENHEIGHT 480 +#define SCREENWIDTH (SCREENBYTES * CharacterWidth) +#define VIDEOSEG 0xa000 +#define FONT_PTR_SEGMENT 0x0000 +#define FONT_PTR_OFFSET 0x010C +#define SCREENPLANES 4 +#define COLORDEPTH 16 +#define egawriteplane(n) { outportb(0x3c4,2); outportb(0x3c5,n); } +#define egareadplane(n) { outportb(0x3ce,4); outportb(0x3cf,n); } +#define col2x8(c) ((c) * 8) +#define col2x16(c) ((c) * 16) +#define col2x(c) ((c) * 2) +#define row2y(c) ((c) * 16) +#define MAX_ROWS_PER_CELL 16 +#define MAX_COLS_PER_CELL 16 +#define MAX_BYTES_PER_CELL 2 /* MAX_COLS_PER_CELL/8 */ +#define ROWS_PER_CELL MAX_ROWS_PER_CELL +#define COLS_PER_CELL MAX_COLS_PER_CELL +#define BYTES_PER_CELL MAX_BYTES_PER_CELL + +struct cellplane { + char image[MAX_ROWS_PER_CELL][MAX_BYTES_PER_CELL]; +}; + +struct planar_cell_struct { + struct cellplane plane[SCREENPLANES]; +}; + +struct overview_cellplane { + char image[MAX_ROWS_PER_CELL][1]; +}; + +struct overview_planar_cell_struct { + struct overview_cellplane plane[SCREENPLANES]; +}; + + + +# endif /* SCREEN_VGA */ + + +/* + * Default color Indexes for hardware palettes + * + * Do not change the values below. + * These are the color mappings defined by the particular video + * hardware/mode. You can rearrange the NetHack color mappings at + * run-time via the defaults.nh "videocolors" and "videoshades" + * settings. + * + */ + +# if defined(SCREEN_BIOS) || defined(SCREEN_DJGPPFAST) +#define M_BLACK 8 +#define M_WHITE 15 +#define M_GRAY 7 /* low-intensity white */ +#define M_RED 4 +#define M_GREEN 2 +#define M_BROWN 6 /* low-intensity yellow */ +#define M_BLUE 1 +#define M_MAGENTA 5 +#define M_CYAN 3 +#define M_ORANGE 12 +#define M_BRIGHTGREEN 10 +#define M_YELLOW 14 +#define M_BRIGHTBLUE 9 +#define M_BRIGHTMAGENTA 13 +#define M_BRIGHTCYAN 11 + +#define M_TEXT M_GRAY +#define BACKGROUND_COLOR 0 +#define ATTRIB_NORMAL M_TEXT /* Normal attribute */ +#define ATTRIB_INTENSE M_WHITE /* Intense White */ +#define ATTRIB_MONO_NORMAL 0x01 /* Underlined,white */ +#define ATTRIB_MONO_UNDERLINE 0x01 /* Underlined,white */ +#define ATTRIB_MONO_BLINK 0x87 /* Flash bit, white */ +#define ATTRIB_MONO_REVERSE 0x70 /* Black on white */ +# endif /*SCREEN_BIOS || SCREEN_DJGPPFAST */ + +# if defined(SCREEN_VGA) || defined(SCREEN_8514) +#define BACKGROUND_VGA_COLOR 0 +#define ATTRIB_VGA_NORMAL CLR_GRAY /* Normal attribute */ +#define ATTRIB_VGA_INTENSE 13 /* Intense White 94/06/07 palette chg*/ +# endif /*SCREEN_VGA || SCREEN_8514*/ + +# if defined(PC9800) +static unsigned char attr98[CLR_MAX] = { + 0xe1, /* 0 white */ + 0x21, /* 1 blue */ + 0x81, /* 2 green */ + 0xa1, /* 3 cyan */ + 0x41, /* 4 red */ + 0x61, /* 5 magenta */ + 0xc1, /* 6 yellow */ + 0xe1, /* 7 white */ + 0xe1, /* 8 white */ + 0x25, /* 9 reversed blue */ + 0x85, /* 10 reversed green */ + 0xa5, /* 11 reversed cyan */ + 0x45, /* 12 reversed red */ + 0x65, /* 13 reversed magenta */ + 0xc5, /* 14 reversed yellow */ + 0xe5, /* 15 reversed white */ +}; +# endif + +# ifdef SIMULATE_CURSOR +#define CURSOR_HEIGHT 3 /* this should go - MJA */ +/* cursor styles */ +#define CURSOR_INVIS 0 /* cursor not visible at all */ +#define CURSOR_FRAME 1 /* block around the current tile */ +#define CURSOR_UNDERLINE 2 /* thin line at bottom of the tile */ +#define CURSOR_CORNER 3 /* cursor visible at the 4 tile corners */ +#define NUM_CURSOR_TYPES 4 /* number of different cursor types */ +#define CURSOR_DEFAULT_STYLE CURSOR_CORNER +#define CURSOR_DEFAULT_COLOR M_GRAY +/* global variables for cursor */ +extern int cursor_type; +extern int cursor_flag; +extern int cursor_color; +# endif + + +/* + * Function Prototypes + * + */ + +#define E extern + +/* ### video.c ### */ + +# ifdef SIMULATE_CURSOR +E void NDECL(DrawCursor); +E void NDECL(HideCursor); +# endif + +/* ### vidtxt.c ### */ + +# ifdef NO_TERMS +E void NDECL(txt_backsp); +E void NDECL(txt_clear_screen); +E void FDECL(txt_cl_end,(int,int)); +E void NDECL(txt_cl_eos); +E void NDECL(txt_get_scr_size); +E void FDECL(txt_gotoxy,(int,int)); +E int NDECL(txt_monoadapt_check); +E void NDECL(txt_nhbell); +E void FDECL(txt_startup,(int*,int*)); +E void FDECL(txt_xputs, (const char *, int, int)); +E void FDECL(txt_xputc, (CHAR_P, int)); + +/* ### vidvga.c ### */ + +# ifdef SCREEN_VGA +E void NDECL(vga_backsp); +E void FDECL(vga_clear_screen,(int)); +E void FDECL(vga_cl_end,(int,int)); +E void FDECL(vga_cl_eos,(int)); +E int NDECL(vga_detect); +# ifdef SIMULATE_CURSOR +E void NDECL(vga_DrawCursor); +# endif +E void FDECL(vga_DisplayCell, (struct planar_cell_struct *, int, int)); +E void FDECL(vga_DisplayCell_O, + (struct overview_planar_cell_struct *, int, int)); +E void NDECL(vga_Finish); +E char __far *NDECL(vga_FontPtrs); +E void NDECL(vga_get_scr_size); +E void FDECL(vga_gotoloc,(int,int)); +# ifdef POSITIONBAR +E void FDECL(vga_update_positionbar, (char *)); +# endif +# ifdef SIMULATE_CURSOR +E void NDECL(vga_HideCursor); +# endif +E void NDECL(vga_Init); +E void FDECL(vga_SwitchMode, (unsigned int)); +E void FDECL(vga_SetPalette, (char *)); +E void NDECL(vga_tty_end_screen); +E void FDECL(vga_tty_startup,(int*,int*)); +E void FDECL(vga_WriteChar, (int, int, int, int)); +E void FDECL(vga_WriteStr, (char *, int, int, int, int)); +E void FDECL(vga_xputs, (const char *, int, int)); +E void FDECL(vga_xputc, (CHAR_P, int)); +E void FDECL(vga_xputg, (int, int, unsigned)); +E void FDECL(vga_userpan, (BOOLEAN_P)); +E void FDECL(vga_overview, (BOOLEAN_P)); +E void FDECL(vga_traditional, (BOOLEAN_P)); +E void NDECL(vga_refresh); +# endif /* SCREEN_VGA */ +# endif /* NO_TERMS */ + +#undef E + +#endif /* PCVIDEO_H */ +/* pcvideo.h */