OSDN Git Service

having the palette in the game code may help. also i added wolf3d's palette for exama...
[proj16/16.git] / src / lib / 16_vl.h
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
3  *\r
4  * This file is part of Project 16.\r
5  *\r
6  * Project 16 is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 3 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Project 16 is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>, or\r
18  * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
19  * Fifth Floor, Boston, MA 02110-1301 USA.\r
20  *\r
21  */\r
22 /*\r
23  * Functions for handling modex and doing other basic graphics stuff.\r
24  */\r
25 #ifndef MODEX16_H\r
26 #define MODEX16_H\r
27 \r
28 #include "src/lib/16_head.h"\r
29 #include "src/lib/16_tail.h"\r
30 //#include "src/lib/planar.h"\r
31 //#include "src/lib/modex16/16planar.h"\r
32 #include "src/lib/16text.h"\r
33 ////#include "src/lib/modex16/320x240.h"\r
34 // #include "src/lib/modex16/320x200.h"\r
35 // #include "src/lib/modex16/256x192.h"\r
36 // #include "src/lib/modex16/192x144_.h"\r
37 // #include "src/lib/modex16/160x120.h"\r
38 \r
39 //320x240 = 20x15\r
40 //192x144 = 12x9\r
41 \r
42 //temp defines\r
43 #define TILEWH  16\r
44 #define TILEWHD TILEWH*2\r
45 #define QUADWH                  TILEWH/2\r
46 \r
47 //#define OLDBGPRESERVE\r
48 \r
49 /* -========================== Types & Macros ==========================- */\r
50 #define PAGE_OFFSET(x,y) (((y)<<6)+((y)<<4)+((x)>>2))\r
51 #define PLANE(x) (1 << ((x) & 3))\r
52 #define SELECT_ALL_PLANES() outpw(0x03c4, 0xff02)\r
53 \r
54 // clips for rectangles not on 4s\r
55 #define LRCLIPDEF \\r
56         static byte lclip[4] = {0x0f, 0x0e, 0x0c, 0x08}; \\r
57         static byte rclip[4] = {0x00, 0x01, 0x03, 0x07};\r
58 \r
59 #define VCLIPDEF \\r
60         static byte pclip[4] = {1,2,4,8};\r
61 \r
62 typedef union\r
63 {\r
64         byte red;\r
65         byte green;\r
66         byte blue;\r
67 } rgb_t;\r
68 \r
69 /* -======================= Constants & Vars ==========================- */\r
70 extern byte far*  VGA;  /* The VGA Memory */\r
71 extern byte far gamepal;\r
72 #define SCREEN_SEG              0xa000\r
73 #define VIDEO_INT               0x10\r
74 #define SET_MODE                0x00\r
75 #define VGA_256_COLOR_MODE      0x13\r
76 #define TEXT_MODE               0x03\r
77 \r
78 #define SC_INDEX                0x03c4\r
79 #define SC_RESET                        0\r
80 #define SC_CLOCK                        1\r
81 #define SC_MAPMASK                      2\r
82 #define SC_CHARMAP                      3\r
83 #define SC_MEMMODE                      4\r
84 \r
85 #define CRTC_INDEX                      0x3D4\r
86 #define CRTC_H_TOTAL            0\r
87 #define CRTC_H_DISPEND          1\r
88 #define CRTC_H_BLANK            2\r
89 #define CRTC_H_ENDBLANK         3\r
90 #define CRTC_H_RETRACE          4\r
91 #define CRTC_H_ENDRETRACE       5\r
92 #define CRTC_V_TOTAL            6\r
93 #define CRTC_OVERFLOW           7\r
94 #define CRTC_ROWSCAN            8\r
95 #define CRTC_MAXSCANLINE        9\r
96 #define CRTC_CURSORSTART        10\r
97 #define CRTC_CURSOREND          11\r
98 #define CRTC_STARTHIGH          12\r
99 #define CRTC_STARTLOW           13\r
100 #define CRTC_CURSORHIGH         14\r
101 #define CRTC_CURSORLOW          15\r
102 #define CRTC_V_RETRACE          16\r
103 #define CRTC_V_ENDRETRACE       17\r
104 #define CRTC_V_DISPEND          18\r
105 #define CRTC_OFFSET                     19\r
106 #define CRTC_UNDERLINE          20\r
107 #define CRTC_V_BLANK            21\r
108 #define CRTC_V_ENDBLANK         22\r
109 #define CRTC_MODE                       23\r
110 #define CRTC_LINECOMPARE        24\r
111 \r
112 #define GC_INDEX                0x03ce\r
113 #define GC_SETRESET                     0\r
114 #define GC_ENABLESETRESET       1\r
115 #define GC_COLORCOMPARE         2\r
116 #define GC_DATAROTATE           3\r
117 #define GC_READMAP                      4\r
118 #define GC_MODE                         5\r
119 #define GC_MISCELLANEOUS        6\r
120 #define GC_COLORDONTCARE        7\r
121 #define GC_BITMASK                      8\r
122 \r
123 #define AC_INDEX                0x03c0\r
124 #define SC_DATA                 0x03c5\r
125 #define CRTC_DATA               0x03d5\r
126 #define MISC_OUTPUT             0x03c2\r
127 #define HIGH_ADDRESS            0x0C\r
128 #define LOW_ADDRESS             0x0D\r
129 #define VRETRACE                0x08\r
130 //#define INPUT _STATUS_1                       defined in 16_head\r
131 //#define STATUS_REGISTER_1     0x03da\r
132 \r
133 #define STATUS_REGISTER_1    0x3da\r
134 \r
135 #define ATR_INDEX                       AC_INDEX\r
136 #define ATR_OVERSCAN            17\r
137 #define DISPLAY_ENABLE          0x01\r
138 //#define MAP_MASK              0x02\r
139 #define PAL_READ_REG                    0x03C7   /* Color register, read address */\r
140 #define PAL_WRITE_REG              0x03C8   /* Color register, write address */\r
141 #define PAL_DATA_REG                    0x03C9   /* Color register, data port */\r
142 #define PAL_SIZE                                (256 * 3)\r
143 \r
144 //===========================================================================\r
145 \r
146 #define SCREENSEG               0xa000\r
147 \r
148 //#define SCREENWIDTH           80                      // default screen width in bytes\r
149 //#define MAXSCANLINES  240                     // size of ylookup table\r
150 \r
151 //#define CHARWIDTH             2\r
152 //#define TILEWIDTH             4\r
153 \r
154 //===========================================================================\r
155 \r
156 //\r
157 // VGA hardware routines\r
158 //\r
159 void    VGAWRITEMODE(byte x),\r
160         VGAMAPMASK(byte x),\r
161         VGAREADMAP(byte x),\r
162         VGABITMASK(byte x);\r
163 \r
164 #define VW_Hlin(x,z,y,c,q)      VL_Hlin(x,y,(z)-(x)+1,c,q)\r
165 #define VW_Vlin(y,z,x,c,q)      VL_Vlin(x,y,(z)-(y)+1,c,q)\r
166 #define PALPROGRAMSNEWPAGE gvar.video.page[0] = modexDefaultPage(&gvar.video.page[0], &gvar);// modexFadeOn(4, &gvar.video.palette);\r
167 \r
168 /* -============================ Functions =============================- */\r
169 /* mode switching, page, and plane functions */\r
170 void    VL_Startup (global_game_variables_t *gvar),\r
171         VL_Shutdown (global_game_variables_t *gvar),\r
172         VL_SetVGAPlaneMode (global_game_variables_t *gvar),\r
173         VL_ClearVideo (byte color),\r
174         VL_DePlaneVGA (),\r
175         VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv),\r
176         modexEnter(sword vq, boolean cmem, global_game_variables_t *gv);\r
177 //void VL_vgaSetMode(byte mode);\r
178 byte VL_vgaGetMode(void);\r
179 extern void TL_VidInit(global_game_variables_t *gvar);\r
180 void modexLeave(void);\r
181 void modexsetBaseXMode();\r
182 page_t modexDefaultPage(page_t *p, global_game_variables_t *gvar);\r
183 page_t modexNextPage(page_t *p);\r
184 page_t modexNextPageFlexibleSize(page_t *p, word x, word y);\r
185 void modexCalcVmemRemain(video_t *video);\r
186 void VL_Initofs(video_t *video);\r
187 void modexHiganbanaPageSetup(global_game_variables_t *gvar);\r
188 void modexShowPage(page_t *page);//for 0croll.exe\r
189 void VL_ShowPage(page_t *page, boolean vsync, boolean sr);\r
190 void modexPanPage(page_t *page, int dx, int dy);\r
191 void modexSelectPlane(byte plane);\r
192 void modexClearRegion(page_t *page, int x, int y, int w, int h, byte color);\r
193 /* moved to src/lib/modex16/16render.c */\r
194 void modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
195 \r
196 /* Palette fade and flash effects */\r
197 void VL_FadeIn (int start, int end, byte far *palette, int steps, video_t *v);\r
198 void modexFadeOn(word fade, byte *palette);\r
199 void modexFadeOff(word fade, byte *palette);\r
200 void modexFlashOn(word fade, byte *palette);\r
201 void modexFlashOff(word fade, byte *palette);\r
202 \r
203 /* palette loading and saving */\r
204 void VL_SetPalette (byte far *palette, video_t *v);\r
205 void modexPalSave(byte *palette);\r
206 //byte *modexNewPal();\r
207 void modexLoadPalFile(char *filename, byte *palette);\r
208 void VL_LoadPalFile(const char *filename, byte *palette, global_game_variables_t *gvar);\r
209 void VL_LoadPalFileCore(byte *palette, global_game_variables_t *gvar);\r
210 //void VLL_LoadPalFilewithoffset(const char *filename, byte *palette, word o, global_game_variables_t *gvar);\r
211 void VL_UpdatePaletteWrite(byte *palette, word o, word palsize, global_game_variables_t *gvar);\r
212 void VL_PaletteSync(global_game_variables_t *gvar);\r
213 void modexSavePalFile(char *filename, byte *palette);\r
214 #define MenuFadeIn()    VL_FadeIn(0,255,&gamepal,10)\r
215 \r
216 /* fixed palette functions */\r
217 void modexPalBlack();\r
218 void modexPalWhite();\r
219 \r
220 /* utility functions */\r
221 void modexPalUpdate(byte *p);\r
222 void VL_modexPalScramble(byte *p);\r
223 word VL_modexPalOverscan(byte *p, word col);\r
224 void VL_ColorBorder (int color, video_t *v);\r
225 void VL_Plot (int x, int y, int color, global_game_variables_t *gvar);\r
226 void VL_Hlin (unsigned x, unsigned y, unsigned width, unsigned color, global_game_variables_t *gvar);\r
227 void VL_Vlin (int x, int y, int height, int color, global_game_variables_t *gvar);\r
228 void VL_Bar (int x, int y, int width, int height, int color, global_game_variables_t *gvar);\r
229 void VL_MemToScreen (byte far *source, int width, int height, int x, int y, global_game_variables_t *gvar);\r
230 void modexputPixel(page_t *page, int x, int y, byte color);\r
231 byte modexgetPixel(page_t *page, int x, int y);\r
232 \r
233 #if 0 // not needed anymore. maybe good for reference purposes though.\r
234 static inline void modexwritepixel(page_t *page, int x, int y, word addr, byte color)\r
235 {\r
236         /* Each address accesses four neighboring pixels, so set\r
237            Write Plane Enable according to which pixel we want\r
238            to modify.  The plane is determined by the two least\r
239            significant bits of the x-coordinate: */\r
240         modexSelectPlane(PLANE(x));\r
241         //outp(SC_INDEX, 0x02);\r
242         //outp(SC_DATA, 0x01 << (x & 3));\r
243 \r
244         /* The offset of the pixel into the video segment is\r
245            offset = (width * y + x) / 4, and write the given\r
246            color to the plane we selected above.  Heed the active\r
247            page start selection. */\r
248         vga_state.vga_graphics_ram[addr] = color;\r
249 }\r
250 static inline byte modexreadPixel(page_t *page, int x, int y, word addr)\r
251 {\r
252         /* Select the plane from which we must read the pixel color: */\r
253         outpw(GC_INDEX, 0x04);\r
254         outpw(GC_INDEX+1, x & 3);\r
255         return vga_state.vga_graphics_ram[addr];\r
256 }\r
257 #endif\r
258 \r
259 void modexDrawChar(page_t *page, int x/*for planar selection only*/, word t, word col, word bgcol, word addr);\r
260 void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word color, word bgcolor, boolean vidsw, const byte *str);\r
261 void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str);\r
262 void VL_modexPrintTextBox(global_game_variables_t *gvar);\r
263 void VL_print(const byte *str, nibble pagenum, global_game_variables_t *gvar);\r
264 void modexpdump(nibble pagenum, global_game_variables_t *gvar);\r
265 void VL_PatternDraw(video_t *video, word pn, boolean sw, boolean allsw);\r
266 void modexWaitBorder();\r
267 void modexWaitBorder_start();\r
268 void modexWaitBorder_end();\r
269 void VL_WaitVBL(word num);\r
270 void VL_SetLineWidth (unsigned width, global_game_variables_t *gvar);\r
271 void VL_PrintmodexmemInfo(video_t *v);\r
272 \r
273 #endif\r