2 Copyright (C) 1998 BJ Eirich (aka vecna)
\r
3 This program is free software; you can redistribute it and/or
\r
4 modify it under the terms of the GNU General Public License
\r
5 as published by the Free Software Foundation; either version 2
\r
6 of the License, or (at your option) any later version.
\r
7 This program is distributed in the hope that it will be useful,
\r
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
\r
10 See the GNU General Public Lic
\r
11 See the GNU General Public License for more details.
\r
12 You should have received a copy of the GNU General Public License
\r
13 along with this program; if not, write to the Free Software
\r
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
\r
21 #include "mode13h.h" // SetMode()
\r
23 #include "vdriver.h"
\r
25 // ================================= Data ====================================
\r
27 #define SEQU_ADDR 0x3c4
\r
28 #define CRTC_ADDR 0x3d4
\r
29 #define MISC_OUTPUT 0x3c2
\r
31 char *screen1, *screen2; // page banks;
\r
32 char *screenx, curscr; // ptr to active page | page flip ctr
\r
33 char *screenbase; // ptr to A000:0000
\r
35 extern unsigned char* translucency_table; //zero
\r
37 extern void CheckTimerStuff();
\r
38 extern void *valloc(int amount,char*,int);
\r
39 extern int vfree(void *);
\r
41 // ================================= Code ====================================
\r
43 static void plane(char p)
\r
46 outpw(0x03c4, (hi<<8)|0x02);
\r
49 extern void SetModeX(void);
\r
59 { char *s,*se,*d,*de;
\r
64 s=screen+(16*tsx)+16;
\r
93 int ModeXCopySprite(int x, int y, int width, int height, char *src)
\r
97 for (; height; height--)
\r
99 memcpy(d,src,width);
\r
107 int ModeXCCopySprite(int x,int y,int width,int height,char *src)
\r
108 { int cx1,cy1,cx2,cy2;
\r
121 if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)
\r
124 if (x+xl > cx2) xl=cx2-x+1;
\r
125 if (y+yl > cy2) yl=cy2-y+1;
\r
127 if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }
\r
128 if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }
\r
131 if (xs+ys) s+=(ys*width)+xs;
\r
132 d=screen+(y*tsx)+x;
\r
144 int ModeXTCCopySprite(int x,int y,int width,int height,char *src)
\r
145 { int cx1,cy1,cx2,cy2;
\r
159 if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)
\r
162 if (x+xl > cx2) xl=cx2-x+1;
\r
163 if (y+yl > cy2) yl=cy2-y+1;
\r
165 if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }
\r
166 if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }
\r
169 if (xs+ys) s+=(ys*width)+xs;
\r
170 d=screen+(y*tsx)+x;
\r
174 for (x=0; x<xl; x++)
\r
187 int ModeXTCopySprite(int x, int y, int width, int height, char *src)
\r
191 d=screen+(y*tsx)+x;
\r
192 for (; height; height--)
\r
194 for (x=0; x<width; x++)
\r
207 int ModeXCopyTile(int x, int y, char *src)
\r
212 d=screen+(y*tsx)+x;
\r
215 memcpy(d, src, 16);
\r
223 int ModeXVLine(int x, int y, int length, char color)
\r
224 { int cx1,cy1,cx2,cy2;
\r
232 if (x>cx2 || y>cy2 || x<cx1 || y+length<cy1)
\r
235 if (y+length > cy2) length=cy2-y+1;
\r
236 if (y<cy1) { length-=(cy1-y); y=cy1; }
\r
238 d=screen+(y*tsx)+x;
\r
239 for (; length; length--)
\r
248 int ModeXHLine(int x, int y, int width, char color)
\r
249 { int cx1,cy1,cx2,cy2;
\r
257 if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)
\r
260 if (x+width > cx2) width=cx2-x+1;
\r
261 if (x<cx1) { width-=(cx1-x); x=cx1; }
\r
263 d=screen+(y*tsx)+x;
\r
264 memset(d,color,width);
\r
269 int ModeXFilledBox(int x, int y, int width, int height, char c)
\r
271 for (; height; height--,y++)
\r
272 ModeXHLine(x, y, width, c);
\r
277 int ModeXColorGrid(int x, int y, char c)
\r
280 if (x<0 || x>336 || y<0 || y>256) return 0;
\r
281 d=screen+(y*tsx)+x;
\r
282 for (y=0; y<8; y++)
\r
284 d[0]=c; d[2]=c; d[4]=c; d[6]=c;
\r
285 d[8]=c; d[10]=c; d[12]=c; d[14]=c;
\r
289 d[0]=c; d[2]=c; d[4]=c; d[6]=c;
\r
290 d[8]=c; d[10]=c; d[12]=c; d[14]=c;
\r
298 int ModeXClearScreen()
\r
300 memset(screen,0,90117);
\r
304 int ModeXCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src)
\r
306 int cx1,cy1,cx2,cy2;
\r
307 unsigned char *s,*d,c;
\r
318 if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)
\r
320 if (x+xl > cx2) xl=cx2-x+1;
\r
321 if (y+yl > cy2) yl=cy2-y+1;
\r
322 if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }
\r
323 if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }
\r
326 if (ys) s+=(ys*width); // only perform mul if necessary ;)
\r
328 d=screen+(y*tsx)+x;
\r
332 for (x=0; x<xl; x++)
\r
336 d[x]=translucency_table[d[x]|(c<<8)];
\r
350 outpw(SEQU_ADDR, 0x0604);
\r
351 memset((unsigned char *)0xA0000, 0, 0x10000);
\r
352 outpw(SEQU_ADDR, 0x0110);
\r
353 outp(MISC_OUTPUT, 0xe3);
\r
354 outpw(SEQU_ADDR, 0x0300);
\r
355 outp(CRTC_ADDR, 0x11);
\r
356 in_byte = inp((CRTC_ADDR+1));
\r
357 in_byte = (in_byte && 0x7f);
\r
358 outp((CRTC_ADDR+1), in_byte);
\r
359 outpw(CRTC_ADDR, 0x0d06);
\r
360 outpw(CRTC_ADDR, 0x3e07);
\r
361 outpw(CRTC_ADDR, 0x4109);
\r
362 outpw(CRTC_ADDR, 0xea10);
\r
363 outpw(CRTC_ADDR, 0xac11);
\r
364 outpw(CRTC_ADDR, 0xdf12);
\r
365 outpw(CRTC_ADDR, 0x0014);
\r
366 outpw(CRTC_ADDR, 0xe715);
\r
367 outpw(CRTC_ADDR, 0x0616);
\r
368 outpw(CRTC_ADDR, 0xe317);
\r
371 //tsx=352; tsy=272;
\r
373 //endcol=336; nextl=80;
\r
376 screenx=(char *) 0xA0000;
\r
377 screen=(char *) valloc(352*(256+16),"screen",0);
\r
378 //memset(screen,0,95744);
\r
385 // Mode successfuly set, now lets set up the driver.
\r
386 ShutdownVideo=&ModeXShutdown;
\r
387 ShowPage=&ModeXShowPage;
\r
388 CopySprite=&ModeXCopySprite;
\r
389 CCopySprite=&ModeXCCopySprite;
\r
390 TCCopySprite=&ModeXTCCopySprite;
\r
391 TCopySprite=&ModeXTCopySprite;
\r
392 CopyTile=&ModeXCopyTile;
\r
393 FilledBox=&ModeXFilledBox;
\r
396 ColorGrid=&ModeXColorGrid;
\r
397 ClearScreen=&ModeXClearScreen;
\r
398 CopySpriteLucentClip=&ModeXCopySpriteLucentClip;
\r