--- /dev/null
+/* Reconstructed Commander Keen 4-6 Source Code\r
+ * Copyright (C) 2021 K1n9_Duk3\r
+ *\r
+ * This file is primarily based on:\r
+ * Catacomb 3-D Source Code\r
+ * Copyright (C) 1993-2014 Flat Rock Software\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along\r
+ * with this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+ */\r
+\r
+// ID_VW.H\r
+\r
+#ifndef __TYPES__\r
+#include "ID_TYPES.H"\r
+#endif\r
+\r
+#ifndef __ID_MM__\r
+#include "ID_MM.H"\r
+#endif\r
+\r
+#ifndef __ID_GLOB__\r
+#include "ID_GLOB.H"\r
+#endif\r
+\r
+#define __ID_VW__\r
+\r
+//===========================================================================\r
+\r
+#define G_P_SHIFT 4 // global >> ?? = pixels\r
+\r
+#if GRMODE == EGAGR\r
+#ifdef CAT3D\r
+#define SCREENWIDTH 40\r
+#else\r
+#define SCREENWIDTH 64\r
+#endif\r
+#define CHARWIDTH 1\r
+#define TILEWIDTH 2\r
+#define GRPLANES 4\r
+#define BYTEPIXELS 8\r
+#endif\r
+\r
+#if GRMODE == CGAGR\r
+#define SCREENWIDTH 128\r
+#define CHARWIDTH 2\r
+#define TILEWIDTH 4\r
+#define GRPLANES 1\r
+#define BYTEPIXELS 4\r
+#endif\r
+\r
+#define VIRTUALHEIGHT 300\r
+#define VIRTUALWIDTH 512\r
+\r
+\r
+#if GRMODE == CGAGR\r
+\r
+#define MAXSHIFTS 1\r
+\r
+#define WHITE 3 // graphics mode independant colors\r
+#define BLACK 0\r
+#define FIRSTCOLOR 1\r
+#define SECONDCOLOR 2\r
+#define F_WHITE 0 // for XOR font drawing\r
+#define F_BLACK 3\r
+#define F_FIRSTCOLOR 2\r
+#define F_SECONDCOLOR 1\r
+\r
+#endif\r
+\r
+#if GRMODE == EGAGR\r
+\r
+#define MAXSHIFTS 4\r
+\r
+#define WHITE 15 // graphics mode independant colors\r
+#define BLACK 0\r
+#define FIRSTCOLOR 1\r
+#define SECONDCOLOR 12\r
+#define F_WHITE 0 // for XOR font drawing\r
+#define F_BLACK 15\r
+#define F_FIRSTCOLOR 14\r
+#define F_SECONDCOLOR 3\r
+\r
+#endif\r
+\r
+#if GRMODE == EGAGR\r
+#define SCREENXMASK (~7)\r
+#define SCREENXPLUS (7)\r
+#define SCREENXDIV (8)\r
+#endif\r
+\r
+#if GRMODE == CGAGR\r
+#define SCREENXMASK (~3)\r
+#define SCREENXDIV (4)\r
+#endif\r
+\r
+//===========================================================================\r
+\r
+\r
+#define SC_INDEX 0x3C4\r
+#define SC_RESET 0\r
+#define SC_CLOCK 1\r
+#define SC_MAPMASK 2\r
+#define SC_CHARMAP 3\r
+#define SC_MEMMODE 4\r
+\r
+#define CRTC_INDEX 0x3D4\r
+#define CRTC_H_TOTAL 0\r
+#define CRTC_H_DISPEND 1\r
+#define CRTC_H_BLANK 2\r
+#define CRTC_H_ENDBLANK 3\r
+#define CRTC_H_RETRACE 4\r
+#define CRTC_H_ENDRETRACE 5\r
+#define CRTC_V_TOTAL 6\r
+#define CRTC_OVERFLOW 7\r
+#define CRTC_ROWSCAN 8\r
+#define CRTC_MAXSCANLINE 9\r
+#define CRTC_CURSORSTART 10\r
+#define CRTC_CURSOREND 11\r
+#define CRTC_STARTHIGH 12\r
+#define CRTC_STARTLOW 13\r
+#define CRTC_CURSORHIGH 14\r
+#define CRTC_CURSORLOW 15\r
+#define CRTC_V_RETRACE 16\r
+#define CRTC_V_ENDRETRACE 17\r
+#define CRTC_V_DISPEND 18\r
+#define CRTC_OFFSET 19\r
+#define CRTC_UNDERLINE 20\r
+#define CRTC_V_BLANK 21\r
+#define CRTC_V_ENDBLANK 22\r
+#define CRTC_MODE 23\r
+#define CRTC_LINECOMPARE 24\r
+\r
+\r
+#define GC_INDEX 0x3CE\r
+#define GC_SETRESET 0\r
+#define GC_ENABLESETRESET 1\r
+#define GC_COLORCOMPARE 2\r
+#define GC_DATAROTATE 3\r
+#define GC_READMAP 4\r
+#define GC_MODE 5\r
+#define GC_MISCELLANEOUS 6\r
+#define GC_COLORDONTCARE 7\r
+#define GC_BITMASK 8\r
+\r
+#define ATR_INDEX 0x3c0\r
+#define ATR_MODE 16\r
+#define ATR_OVERSCAN 17\r
+#define ATR_COLORPLANEENABLE 18\r
+#define ATR_PELPAN 19\r
+#define ATR_COLORSELECT 20\r
+\r
+#define STATUS_REGISTER_1 0x3da\r
+\r
+//===========================================================================\r
+\r
+typedef enum {NOcard,MDAcard,CGAcard,EGAcard,MCGAcard,VGAcard,\r
+ HGCcard=0x80,HGCPcard,HICcard} cardtype;\r
+\r
+typedef struct\r
+{\r
+ int width,\r
+ height,\r
+ orgx,orgy,\r
+ xl,yl,xh,yh,\r
+ shifts;\r
+} spritetabletype;\r
+\r
+typedef struct\r
+{\r
+ unsigned sourceoffset[MAXSHIFTS];\r
+ unsigned planesize[MAXSHIFTS];\r
+ unsigned width[MAXSHIFTS];\r
+ byte data[];\r
+} spritetype; // the memptr for each sprite points to this\r
+\r
+typedef struct\r
+{\r
+ int width,height;\r
+} pictabletype;\r
+\r
+\r
+typedef struct\r
+{\r
+ int height;\r
+ int location[256];\r
+ char width[256];\r
+} fontstruct;\r
+\r
+\r
+typedef enum {CGAgr,EGAgr,VGAgr} grtype;\r
+\r
+//===========================================================================\r
+\r
+extern cardtype videocard; // set by VW_Startup\r
+extern grtype grmode; // CGAgr, EGAgr, VGAgr\r
+\r
+extern unsigned bufferofs; // hidden port to draw to before displaying\r
+extern unsigned displayofs; // origin of port on visable screen\r
+extern unsigned panx,pany; // panning adjustments inside port in pixels\r
+extern unsigned pansx,pansy;\r
+extern unsigned panadjust; // panx/pany adjusted by screen resolution\r
+\r
+extern unsigned screenseg; // normally 0xa000 or buffer segment\r
+\r
+extern unsigned linewidth;\r
+extern unsigned ylookup[VIRTUALHEIGHT];\r
+\r
+extern boolean screenfaded;\r
+extern char colors[7][17]; // pallets for fades\r
+\r
+extern pictabletype _seg *pictable;\r
+extern pictabletype _seg *picmtable;\r
+extern spritetabletype _seg *spritetable;\r
+\r
+extern unsigned fontnumber; // 0 based font number for drawing\r
+extern int px,py;\r
+extern byte pdrawmode,fontcolor;\r
+\r
+extern int bordercolor;\r
+extern boolean nopan;\r
+\r
+//\r
+// asm globals\r
+//\r
+\r
+extern unsigned *shifttabletable[8];\r
+extern unsigned bufferwidth,bufferheight,screenspot; // used by font drawing stuff\r
+\r
+\r
+\r
+//===========================================================================\r
+\r
+\r
+void VW_Startup (void);\r
+void VW_Shutdown (void);\r
+\r
+cardtype VW_VideoID (void);\r
+\r
+//\r
+// EGA hardware routines\r
+//\r
+\r
+#define EGAWRITEMODE(x) asm{cli;mov dx,GC_INDEX;mov ax,GC_MODE+256*x;out dx,ax;sti;}\r
+#define EGABITMASK(x) asm{cli;mov dx,GC_INDEX;mov ax,GC_BITMASK+256*x;out dx,ax;sti;}\r
+#define EGAMAPMASK(x) asm{cli;mov dx,SC_INDEX;mov ax,SC_MAPMASK+x*256;out dx,ax;sti;}\r
+#define EGAREADMAP(x) asm{cli;mov dx,GC_INDEX;mov ax,GC_READMAP+x*256;out dx,ax;sti;}\r
+\r
+void VW_SetLineWidth(int width);\r
+void VW_SetSplitScreen(int width);\r
+void VW_SetScreen (unsigned CRTC, unsigned pelpan);\r
+\r
+void VW_SetScreenMode (int grmode);\r
+void VW_ClearVideo (int color);\r
+void VW_WaitVBL (int number);\r
+\r
+void VW_ColorBorder (int color);\r
+void VW_SetPalette(byte *palette);\r
+void VW_SetDefaultColors(void);\r
+void VW_FadeOut(void);\r
+void VW_FadeIn(void);\r
+void VW_FadeUp(void);\r
+void VW_FadeDown(void);\r
+\r
+void VW_SetAtrReg (int reg, int value);\r
+\r
+//\r
+// block primitives\r
+//\r
+\r
+void VW_MaskBlock(memptr segm,unsigned ofs,unsigned dest,\r
+ unsigned wide,unsigned height,unsigned planesize);\r
+void VW_InverseMask(memptr segm,unsigned ofs,unsigned dest,\r
+ unsigned wide,unsigned height);\r
+void VW_MemToScreen(memptr source,unsigned dest,unsigned width,unsigned height);\r
+void VW_ScreenToMem(unsigned source,memptr dest,unsigned width,unsigned height);\r
+void VW_ScreenToScreen(unsigned source,unsigned dest,unsigned width,unsigned height);\r
+\r
+\r
+//\r
+// block addressable routines\r
+//\r
+\r
+void VW_DrawTile8(unsigned x, unsigned y, unsigned tile);\r
+\r
+#if GRMODE == EGAGR\r
+\r
+#define VW_DrawTile8M(x,y,t) \\r
+ VW_MaskBlock(grsegs[STARTTILE8M],(t)*40,bufferofs+ylookup[y]+(x),1,8,8)\r
+#define VW_DrawTile16(x,y,t) \\r
+ VW_MemToScreen(grsegs[STARTTILE16+t],bufferofs+ylookup[y]+(x),2,16)\r
+#define VW_DrawTile16M(x,y,t) \\r
+ VW_MaskBlock(grsegs[STARTTILE16M],(t)*160,bufferofs+ylookup[y]+(x),2,16,32)\r
+\r
+#endif\r
+\r
+#if GRMODE == CGAGR\r
+\r
+#define VW_DrawTile8M(x,y,t) \\r
+ VW_MaskBlock(grsegs[STARTTILE8M],(t)*32,bufferofs+ylookup[y]+(x),2,8,16)\r
+#define VW_DrawTile16(x,y,t) \\r
+ VW_MemToScreen(grsegs[STARTTILE16+t],bufferofs+ylookup[y]+(x),4,16)\r
+#define VW_DrawTile16M(x,y,t) \\r
+ VW_MaskBlock(grsegs[STARTTILE16M],(t)*128,bufferofs+ylookup[y]+(x),4,16,64)\r
+\r
+#endif\r
+\r
+void VW_DrawPic(unsigned x, unsigned y, unsigned chunknum);\r
+void VW_DrawMPic(unsigned x, unsigned y, unsigned chunknum);\r
+void VW_ClipDrawMPic(unsigned x, int y, unsigned chunknum);\r
+\r
+//\r
+// pixel addressable routines\r
+//\r
+void VW_MeasurePropString (char far *string, word *width, word *height);\r
+void VW_MeasureMPropString (char far *string, word *width, word *height);\r
+\r
+void VW_DrawPropString (char far *string);\r
+void VW_DrawMPropString (char far *string);\r
+void VW_DrawSprite(int x, int y, unsigned sprite);\r
+void VW_Plot(unsigned x, unsigned y, unsigned color);\r
+void VW_Hlin(unsigned xl, unsigned xh, unsigned y, unsigned color);\r
+void VW_Vlin(unsigned yl, unsigned yh, unsigned x, unsigned color);\r
+void VW_Bar (unsigned x, unsigned y, unsigned width, unsigned height,\r
+ unsigned color);\r
+\r
+//===========================================================================\r
+\r
+//\r
+// Double buffer management routines\r
+//\r
+\r
+void VW_InitDoubleBuffer (void);\r
+void VW_FixRefreshBuffer (void);\r
+int VW_MarkUpdateBlock (int x1, int y1, int x2, int y2);\r
+void VW_UpdateScreen (void);\r
+void VW_CGAFullUpdate (void);\r
+\r
+//\r
+// cursor\r
+//\r
+\r
+void VW_ShowCursor (void);\r
+void VW_HideCursor (void);\r
+void VW_MoveCursor (int x, int y);\r
+void VW_SetCursor (int spritenum);\r
+void VW_FreeCursor (void);\r
+\r
+//\r
+// mode independant routines\r
+// coordinates in pixels, rounded to best screen res\r
+// regions marked in double buffer\r
+//\r
+\r
+void VWB_DrawTile8 (int x, int y, int tile);\r
+void VWB_DrawTile8M (int x, int y, int tile);\r
+void VWB_DrawTile16 (int x, int y, int tile);\r
+void VWB_DrawTile16M (int x, int y, int tile);\r
+void VWB_DrawPic (int x, int y, int chunknum);\r
+void VWB_DrawMPic(int x, int y, int chunknum);\r
+void VWB_Bar (int x, int y, int width, int height, int color);\r
+\r
+void VWB_DrawPropString (char far *string);\r
+void VWB_DrawMPropString (char far *string);\r
+void VWB_DrawSprite (int x, int y, int chunknum);\r
+void VWB_Plot (int x, int y, int color);\r
+void VWB_Hlin (int x1, int x2, int y, int color);\r
+void VWB_Vlin (int y1, int y2, int x, int color);\r
+\r
+//===========================================================================\r