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
20 #include "mode13h.h"
\r
21 #include "vdriver.h"
\r
23 // ================================= Data ====================================
\r
25 char *screenr; // realscr
\r
26 char startline=16; // virtual scroll around 240 vert. pixels
\r
27 extern unsigned char* translucency_table; //zero
\r
29 extern void *valloc(int amount, char*, int);
\r
30 extern int vfree(void *);
\r
31 extern void CheckTimerStuff(); // in maped.c
\r
33 // ================================= Code ====================================
\r
36 void SetMode(int mode)
\r
43 int Mode13hShutdown()
\r
51 int Mode13hShowPage()
\r
57 s=screen+(16*tsx)+16;
\r
61 for (; rows; rows--)
\r
71 int Mode13hCopySprite(int x, int y, int width, int height, char *src)
\r
75 for (; height; height--)
\r
77 memcpy(d,src,width);
\r
85 int Mode13hCCopySprite(int x,int y,int width,int height,char *src)
\r
86 { int cx1,cy1,cx2,cy2;
\r
99 if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)
\r
102 if (x+xl > cx2) xl=cx2-x+1;
\r
103 if (y+yl > cy2) yl=cy2-y+1;
\r
105 if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }
\r
106 if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }
\r
109 if (xs+ys) s+=(ys*width)+xs;
\r
110 d=screen+(y*tsx)+x;
\r
122 int Mode13hTCCopySprite(int x,int y,int width,int height,char *src)
\r
123 { int cx1,cy1,cx2,cy2;
\r
137 if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)
\r
140 if (x+xl > cx2) xl=cx2-x+1;
\r
141 if (y+yl > cy2) yl=cy2-y+1;
\r
143 if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }
\r
144 if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }
\r
146 s=src+(ys*width)+xs;
\r
147 d=screen+(y*tsx)+x;
\r
151 for (x=0; x<xl; x++)
\r
164 int Mode13hTCopySprite(int x, int y, int width, int height, char *src)
\r
168 d=screen+(y*tsx)+x;
\r
169 for (; height; height--)
\r
171 for (x=0; x<width; x++)
\r
184 int Mode13hCopyTile(int x, int y, char *src)
\r
189 d=screen+(y*tsx)+x;
\r
192 memcpy(d, src, 16);
\r
200 int Mode13hVLine(int x, int y, int length, char color)
\r
201 { int cx1,cy1,cx2,cy2;
\r
209 if (x>cx2 || y>cy2 || x<cx1 || y+length<cy1)
\r
212 if (y+length > cy2) length=cy2-y+1;
\r
213 if (y<cy1) { length-=(cy1-y); y=cy1; }
\r
215 d=screen+(y*tsx)+x;
\r
216 for (; length; length--)
\r
225 int Mode13hHLine(int x, int y, int width, char color)
\r
226 { int cx1,cy1,cx2,cy2;
\r
234 if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)
\r
237 if (x+width > cx2) width=cx2-x+1;
\r
238 if (x<cx1) { width-=(cx1-x); x=cx1; }
\r
240 d=screen+(y*tsx)+x;
\r
241 memset(d,color,width);
\r
246 int Mode13hFilledBox(int x, int y, int width, int height, char c)
\r
248 for (; height; height--,y++)
\r
249 Mode13hHLine(x, y, width, c);
\r
254 int Mode13hColorGrid(int x, int y, char c)
\r
257 if (x<0 || x>336 || y<0 || y>256) return 0;
\r
258 d=screen+(y*tsx)+x;
\r
259 for (y=0; y<8; y++)
\r
261 d[0]=c; d[2]=c; d[4]=c; d[6]=c;
\r
262 d[8]=c; d[10]=c; d[12]=c; d[14]=c;
\r
266 d[0]=c; d[2]=c; d[4]=c; d[6]=c;
\r
267 d[8]=c; d[10]=c; d[12]=c; d[14]=c;
\r
275 int Mode13hClearScreen()
\r
277 memset(screen,0,76032);
\r
281 int Mode13hCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src)
\r
283 int cx1,cy1,cx2,cy2;
\r
284 unsigned char *s,*d,c;
\r
295 if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)
\r
297 if (x+xl > cx2) xl=cx2-x+1;
\r
298 if (y+yl > cy2) yl=cy2-y+1;
\r
299 if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }
\r
300 if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }
\r
303 if (ys) s+=(ys*width); // only perform mul if necessary ;)
\r
305 d=screen+(y*tsx)+x;
\r
309 for (x=0; x<xl; x++)
\r
313 d[x]=translucency_table[d[x]|(c<<8)];
\r
325 screenr=(char *) 0xA0000;
\r
326 screen=(char *) valloc(352*(216+16),"Screen",0);
\r
327 //memset(screen,0,95744);
\r
333 // Mode successfuly set, now lets set up the driver.
\r
334 ShutdownVideo=&Mode13hShutdown;
\r
335 ShowPage=&Mode13hShowPage;
\r
336 CopySprite=&Mode13hCopySprite;
\r
337 CCopySprite=&Mode13hCCopySprite;
\r
338 TCCopySprite=&Mode13hTCCopySprite;
\r
339 TCopySprite=&Mode13hTCopySprite;
\r
340 CopyTile=&Mode13hCopyTile;
\r
341 FilledBox=&Mode13hFilledBox;
\r
342 VLine=&Mode13hVLine;
\r
343 HLine=&Mode13hHLine;
\r
344 ColorGrid=&Mode13hColorGrid;
\r
345 ClearScreen=&Mode13hClearScreen;
\r
346 CopySpriteLucentClip=&Mode13hCopySpriteLucentClip;
\r