OSDN Git Service

added stuff to help me study 0.exe it is a complex program wwww what is getting to...
[proj16/16.git] / src / lib / 16_vl.h
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2016 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/bitmap.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 #ifdef __WATCOMC__\r
40 #include <hw/cpu/cpu.h>\r
41 #include <hw/dos/dos.h>\r
42 #include <hw/vga/vga.h>\r
43 #include <hw/vga/vrl.h>\r
44 #include <hw/vga/vrs.h>\r
45 #endif\r
46 \r
47 //320x240 = 20x15\r
48 //192x144 = 12x9\r
49 \r
50 //temp defines\r
51 #define TILEWH  16\r
52 #define TILEWHD TILEWH*2\r
53 #define QUADWH                  TILEWH/2\r
54 \r
55 /* -========================== Types & Macros ==========================- */\r
56 #define PAGE_OFFSET(x,y) (((y)<<6)+((y)<<4)+((x)>>2))\r
57 #define PLANE(x) (1 << ((x) & 3))\r
58 #define SELECT_ALL_PLANES() outpw(0x03c4, 0xff02)\r
59 #define     PALSIZE            768\r
60 \r
61 typedef union\r
62 {\r
63         byte red;\r
64         byte green;\r
65         byte blue;\r
66 } rgb_t;\r
67 \r
68 /* -======================= Constants & Vars ==========================- */\r
69 extern byte far*  VGA;  /* The VGA Memory */\r
70 #define SCREEN_SEG              0xa000\r
71 #define VIDEO_INT               0x10\r
72 #define SET_MODE                0x00\r
73 #define VGA_256_COLOR_MODE      0x13\r
74 #define TEXT_MODE               0x03\r
75 \r
76 #define AC_INDEX                0x03c0\r
77 #define SC_INDEX                0x03c4\r
78 #define SC_DATA                 0x03c5\r
79 #define CRTC_INDEX              0x03d4\r
80 #define CRTC_DATA               0x03d5\r
81 #define GC_INDEX                0x03ce\r
82 #define MISC_OUTPUT             0x03c2\r
83 #define HIGH_ADDRESS            0x0C\r
84 #define LOW_ADDRESS             0x0D\r
85 #define VRETRACE                0x08\r
86 //#define INPUT_STATUS_1                0x03da  defined in 16_head\r
87 #define DISPLAY_ENABLE          0x01\r
88 #define MAP_MASK                0x02\r
89 #define PAL_READ_REG                    0x03C7   /* Color register, read address */\r
90 #define PAL_WRITE_REG              0x03C8   /* Color register, write address */\r
91 #define PAL_DATA_REG                    0x03C9   /* Color register, data port */\r
92 #define PAL_SIZE                                (256 * 3)\r
93 \r
94 /* -============================ Functions =============================- */\r
95 /* mode switching, page, and plane functions */\r
96 void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv);\r
97 void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv);\r
98 byte vgaGetMode();\r
99 void modexLeave();\r
100 void modexsetBaseXMode();\r
101 page_t modexDefaultPage(page_t *p);\r
102 page_t modexNextPage(page_t *p);\r
103 page_t modexNextPageFlexibleSize(page_t *p, word x, word y);\r
104 void modexCalcVmemRemain(video_t *video);\r
105 void modexHiganbanaPageSetup(video_t *video);\r
106 void modexShowPage(page_t *page);\r
107 void modexShowPage_(page_t *page);\r
108 void modexShowPageVsync(page_t *page);\r
109 void modexPanPage(page_t *page, int dx, int dy);\r
110 void modexSelectPlane(byte plane);\r
111 void modexClearRegion(page_t *page, int x, int y, int w, int h, byte color);\r
112 /* moved to src/lib/modex16/16render.c */\r
113 void modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
114 \r
115 /* Palette fade and flash effects */\r
116 void modexFadeOn(word fade, byte *palette);\r
117 void modexFadeOff(word fade, byte *palette);\r
118 void modexFlashOn(word fade, byte *palette);\r
119 void modexFlashOff(word fade, byte *palette);\r
120 \r
121 /* palette loading and saving */\r
122 void modexPalSave(byte *palette);\r
123 byte *modexNewPal();\r
124 void modexLoadPalFile(char *filename, byte **palette);\r
125 void modexSavePalFile(char *filename, byte *palette);\r
126 \r
127 /* fixed palette functions */\r
128 void modexPalBlack();\r
129 void modexPalWhite();\r
130 \r
131 /* utility functions */\r
132 void modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset);\r
133 void modexPalUpdate1(byte *p);\r
134 void modexPalUpdate0(byte *p);\r
135 void modexPalOverscan(word col);\r
136 void modexchkcolor(bitmap_t *bmp, word *q, word *a, word *aa, word *z, word *i/*, word *offset*/);\r
137 void modexputPixel(page_t *page, int x, int y, byte color);\r
138 byte modexgetPixel(page_t *page, int x, int y);\r
139 \r
140 #if 0 // not needed anymore. maybe good for reference purposes though.\r
141 static inline void modexwritepixel(page_t *page, int x, int y, word addr, byte color)\r
142 {\r
143         /* Each address accesses four neighboring pixels, so set\r
144            Write Plane Enable according to which pixel we want\r
145            to modify.  The plane is determined by the two least\r
146            significant bits of the x-coordinate: */\r
147         modexSelectPlane(PLANE(x));\r
148         //outp(SC_INDEX, 0x02);\r
149         //outp(SC_DATA, 0x01 << (x & 3));\r
150 \r
151         /* The offset of the pixel into the video segment is\r
152            offset = (width * y + x) / 4, and write the given\r
153            color to the plane we selected above.  Heed the active\r
154            page start selection. */\r
155         vga_state.vga_graphics_ram[addr] = color;\r
156 }\r
157 static inline byte modexreadPixel(page_t *page, int x, int y, word addr)\r
158 {\r
159         /* Select the plane from which we must read the pixel color: */\r
160         outpw(GC_INDEX, 0x04);\r
161         outpw(GC_INDEX+1, x & 3);\r
162         return vga_state.vga_graphics_ram[addr];\r
163 }\r
164 #endif\r
165 \r
166 void modexDrawChar(page_t *page, int x/*for planar selection only*/, word t, word col, word bgcol, word addr);\r
167 void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str);\r
168 void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str);\r
169 void modexpdump(page_t *pee);\r
170 void modexcls(page_t *page, byte color, byte *Where);\r
171 void modexWaitBorder();\r
172 void modexprintmeminfo(video_t *v);\r
173 \r
174 #endif\r