1 /* Project 16 Source Code~
\r
2 * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover
\r
4 * This file is part of Project 16.
\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
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
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
23 * Functions for handling modex and doing other basic graphics stuff.
\r
28 #include "src/lib/16_head.h"
\r
29 //#include "src/lib/planar.h"
\r
30 //#include "src/lib/modex16/16planar.h"
\r
31 #include "src/lib/16text.h"
\r
32 ////#include "src/lib/modex16/320x240.h"
\r
33 // #include "src/lib/modex16/320x200.h"
\r
34 // #include "src/lib/modex16/256x192.h"
\r
35 // #include "src/lib/modex16/192x144_.h"
\r
36 // #include "src/lib/modex16/160x120.h"
\r
39 #include <hw/cpu/cpu.h>
\r
40 #include <hw/dos/dos.h>
\r
41 #include <hw/vga/vga.h>
\r
42 #include <hw/vga/vrl.h>
\r
43 #include <hw/vga/vrs.h>
\r
51 #define TILEWHD TILEWH*2
\r
52 #define QUADWH TILEWH/2
\r
54 //#define OLDBGPRESERVE
\r
56 /* -========================== Types & Macros ==========================- */
\r
57 #define PAGE_OFFSET(x,y) (((y)<<6)+((y)<<4)+((x)>>2))
\r
58 #define PLANE(x) (1 << ((x) & 3))
\r
59 #define SELECT_ALL_PLANES() outpw(0x03c4, 0xff02)
\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
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 STATUS_REGISTER_1 INPUT_STATUS_1
\r
88 #define ATR_INDEX AC_INDEX
\r
89 #define ATR_OVERSCAN 17
\r
90 #define DISPLAY_ENABLE 0x01
\r
91 #define MAP_MASK 0x02
\r
92 #define PAL_READ_REG 0x03C7 /* Color register, read address */
\r
93 #define PAL_WRITE_REG 0x03C8 /* Color register, write address */
\r
94 #define PAL_DATA_REG 0x03C9 /* Color register, data port */
\r
95 #define PAL_SIZE (256 * 3)
\r
97 /* -============================ Functions =============================- */
\r
98 /* mode switching, page, and plane functions */
\r
99 void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv);
\r
100 void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv);
\r
103 void modexsetBaseXMode();
\r
104 page_t modexDefaultPage(page_t *p);
\r
105 page_t modexNextPage(page_t *p);
\r
106 page_t modexNextPageFlexibleSize(page_t *p, word x, word y);
\r
107 void modexCalcVmemRemain(video_t *video);
\r
108 void VL_Initofs(video_t *video);
\r
109 void modexHiganbanaPageSetup(video_t *video);
\r
110 //void modexShowPage(page_t *page);
\r
111 void VL_ShowPage(page_t *page, boolean vsync, boolean sr);
\r
112 void modexPanPage(page_t *page, int dx, int dy);
\r
113 void modexSelectPlane(byte plane);
\r
114 void modexClearRegion(page_t *page, int x, int y, int w, int h, byte color);
\r
115 /* moved to src/lib/modex16/16render.c */
\r
116 void modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);
\r
118 /* Palette fade and flash effects */
\r
119 void modexFadeOn(word fade, byte *palette);
\r
120 void modexFadeOff(word fade, byte *palette);
\r
121 void modexFlashOn(word fade, byte *palette);
\r
122 void modexFlashOff(word fade, byte *palette);
\r
124 /* palette loading and saving */
\r
125 void modexPalSave(byte *palette);
\r
126 //byte *modexNewPal();
\r
127 void modexLoadPalFile(char *filename, byte *palette);
\r
128 void VL_LoadPalFile(const char *filename, byte *palette);
\r
129 void VL_LoadPalFilewithoffset(const char *filename, byte *palette, word o);
\r
130 void VL_UpdatePaletteWrite(byte *palette, word o);
\r
131 void modexSavePalFile(char *filename, byte *palette);
\r
133 /* fixed palette functions */
\r
134 void modexPalBlack();
\r
135 void modexPalWhite();
\r
137 /* utility functions */
\r
138 void modexPalUpdate(byte *p);
\r
139 void modexPalUpdate0(byte *p);
\r
140 void modexPalOverscan(word col);
\r
141 void modexputPixel(page_t *page, int x, int y, byte color);
\r
142 byte modexgetPixel(page_t *page, int x, int y);
\r
144 #if 0 // not needed anymore. maybe good for reference purposes though.
\r
145 static inline void modexwritepixel(page_t *page, int x, int y, word addr, byte color)
\r
147 /* Each address accesses four neighboring pixels, so set
\r
148 Write Plane Enable according to which pixel we want
\r
149 to modify. The plane is determined by the two least
\r
150 significant bits of the x-coordinate: */
\r
151 modexSelectPlane(PLANE(x));
\r
152 //outp(SC_INDEX, 0x02);
\r
153 //outp(SC_DATA, 0x01 << (x & 3));
\r
155 /* The offset of the pixel into the video segment is
\r
156 offset = (width * y + x) / 4, and write the given
\r
157 color to the plane we selected above. Heed the active
\r
158 page start selection. */
\r
159 vga_state.vga_graphics_ram[addr] = color;
\r
161 static inline byte modexreadPixel(page_t *page, int x, int y, word addr)
\r
163 /* Select the plane from which we must read the pixel color: */
\r
164 outpw(GC_INDEX, 0x04);
\r
165 outpw(GC_INDEX+1, x & 3);
\r
166 return vga_state.vga_graphics_ram[addr];
\r
170 void modexDrawChar(page_t *page, int x/*for planar selection only*/, word t, word col, word bgcol, word addr);
\r
171 void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word col, word bgcol, const byte *str);
\r
172 void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str);
\r
173 void modexpdump(page_t *pee);
\r
174 void modexcls(page_t *page, byte color, byte *Where);
\r
175 void VL_PatternDraw(video_t *video, word pn, boolean sw, boolean allsw);
\r
176 void modexWaitBorder();
\r
177 void modexWaitBorder_start();
\r
178 void modexWaitBorder_end();
\r
179 void VL_PrintmodexmemInfo(video_t *v);
\r