1 /* Project 16 Source Code~
2 * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669
4 * This file is part of Project 16.
6 * Project 16 is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * Project 16 is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>, or
18 * write to the Free Software Foundation, Inc., 51 Franklin Street,
19 * Fifth Floor, Boston, MA 02110-1301 USA.
23 * Functions for handling modex and doing other basic graphics stuff.
28 #include "src/lib/16_head.h"
29 #include "src/lib/bitmap.h"
30 #include "src/lib/planar.h"
31 #include "src/lib/modex16/16planar.h"
32 #include "src/lib/16text.h"
33 #include "src/lib/modex16/16render.h"
34 // #include "src/lib/modex16/320x240.h"
35 // #include "src/lib/modex16/320x200.h"
36 // #include "src/lib/modex16/256x192.h"
37 // #include "src/lib/modex16/192x144_.h"
38 // #include "src/lib/modex16/160x120.h"
40 #include <hw/cpu/cpu.h>
41 #include <hw/dos/dos.h>
42 #include <hw/vga/vga.h>
43 #include <hw/vga/vrl.h>
45 static struct pcxHeader {
70 #define QUADWH TILEWH/2
72 /* -========================== Types & Macros ==========================- */
73 #define PAGE_OFFSET(x,y) (((y)<<6)+((y)<<4)+((x)>>2))
74 #define PLANE(x) (1 << ((x) & 3))
75 #define SELECT_ALL_PLANES() outpw(0x03c4, 0xff02)
85 /* -======================= Constants & Vars ==========================- */
86 extern byte far* VGA; /* The VGA Memory */
87 #define SCREEN_SEG 0xa000
88 #define VIDEO_INT 0x10
90 #define VGA_256_COLOR_MODE 0x13
91 #define TEXT_MODE 0x03
93 #define AC_INDEX 0x03c0
94 #define SC_INDEX 0x03c4
95 #define SC_DATA 0x03c5
96 #define CRTC_INDEX 0x03d4
97 #define CRTC_DATA 0x03d5
98 #define GC_INDEX 0x03ce
99 #define MISC_OUTPUT 0x03c2
100 #define HIGH_ADDRESS 0x0C
101 #define LOW_ADDRESS 0x0D
102 #define VRETRACE 0x08
103 //#define INPUT_STATUS_1 0x03da defined in 16_head
104 #define DISPLAY_ENABLE 0x01
105 #define MAP_MASK 0x02
106 #define PAL_READ_REG 0x03C7 /* Color register, read address */
107 #define PAL_WRITE_REG 0x03C8 /* Color register, write address */
108 #define PAL_DATA_REG 0x03C9 /* Color register, data port */
109 #define PAL_SIZE (256 * 3)
111 /* -============================ Functions =============================- */
112 /* mode switching, page, and plane functions */
113 void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv);
114 void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv);
117 void modexsetBaseXMode();
118 page_t modexDefaultPage(page_t *p);
119 page_t modexNextPage(page_t *p);
120 page_t modexNextPageFlexibleSize(page_t *p, word x, word y);
121 void modexCalcVmemRemain(video_t *video);
122 void modexHiganbanaPageSetup(video_t *video);
123 void modexShowPage(page_t *page);
124 void modexPanPage(page_t *page, int dx, int dy);
125 void modexSelectPlane(byte plane);
126 void modexClearRegion(page_t *page, int x, int y, int w, int h, byte color);
127 /* moved to src/lib/modex16/16render.c */
128 void modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);
130 /* Palette fade and flash effects */
131 void modexFadeOn(word fade, byte *palette);
132 void modexFadeOff(word fade, byte *palette);
133 void modexFlashOn(word fade, byte *palette);
134 void modexFlashOff(word fade, byte *palette);
136 /* palette loading and saving */
137 void modexPalSave(byte *palette);
139 void modexLoadPalFile(char *filename, byte **palette);
140 void modexSavePalFile(char *filename, byte *palette);
142 /* fixed palette functions */
143 void modexPalBlack();
144 void modexPalWhite();
146 /* utility functions */
147 void modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset);
148 void modexPalUpdate1(byte *p);
149 void modexPalUpdate0(byte *p);
150 void modexPalOverscan(byte *p, word col);
151 void modexchkcolor(bitmap_t *bmp, word *q, word *a, word *aa, word *z, word *i/*, word *offset*/);
152 void modexputPixel(page_t *page, int x, int y, byte color);
153 byte modexgetPixel(page_t *page, int x, int y);
155 #if 0 // not needed anymore. maybe good for reference purposes though.
156 static inline void modexwritepixel(page_t *page, int x, int y, word addr, byte color)
158 /* Each address accesses four neighboring pixels, so set
159 Write Plane Enable according to which pixel we want
160 to modify. The plane is determined by the two least
161 significant bits of the x-coordinate: */
162 modexSelectPlane(PLANE(x));
163 //outp(SC_INDEX, 0x02);
164 //outp(SC_DATA, 0x01 << (x & 3));
166 /* The offset of the pixel into the video segment is
167 offset = (width * y + x) / 4, and write the given
168 color to the plane we selected above. Heed the active
169 page start selection. */
170 vga_state.vga_graphics_ram[addr] = color;
172 static inline byte modexreadPixel(page_t *page, int x, int y, word addr)
174 /* Select the plane from which we must read the pixel color: */
175 outpw(GC_INDEX, 0x04);
176 outpw(GC_INDEX+1, x & 3);
177 return vga_state.vga_graphics_ram[addr];
181 void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str);
182 void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str);
183 void modexpdump(page_t *pee);
184 void modexcls(page_t *page, byte color, byte *Where);
185 void modexWaitBorder();