]> 4ch.mooo.com Git - 16.git/blobdiff - 16/keen456/KEEN4-6/ID_VW.H
extrcted keen code remake
[16.git] / 16 / keen456 / KEEN4-6 / ID_VW.H
diff --git a/16/keen456/KEEN4-6/ID_VW.H b/16/keen456/KEEN4-6/ID_VW.H
new file mode 100755 (executable)
index 0000000..65e9867
--- /dev/null
@@ -0,0 +1,381 @@
+/* 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