OSDN Git Service

wwww
[proj16/16.git] / src / v2 / source / verge / MAPED / MODEX.C
1 /*\r
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
15 */\r
16 \r
17 #include <conio.h>\r
18 #include <string.h>\r
19 #include <malloc.h>\r
20 \r
21 #include "mode13h.h" // SetMode()\r
22 #include "modex.h"\r
23 #include "vdriver.h"\r
24 \r
25 // ================================= Data ====================================\r
26 \r
27 #define SEQU_ADDR               0x3c4\r
28 #define CRTC_ADDR               0x3d4\r
29 #define MISC_OUTPUT             0x3c2\r
30 \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
34 \r
35 extern unsigned char* translucency_table; //zero\r
36 \r
37 extern void CheckTimerStuff();\r
38 extern void *valloc(int amount,char*,int);\r
39 extern int  vfree(void *);\r
40 \r
41 // ================================= Code ====================================\r
42 \r
43 static void plane(char p)\r
44 {\r
45   int hi=1<<p;\r
46   outpw(0x03c4, (hi<<8)|0x02);\r
47 }\r
48 \r
49 extern void SetModeX(void);\r
50 \r
51 int ModeXShutdown()\r
52 {\r
53   SetMode(0x3);\r
54   vfree(screen);\r
55   return 0;\r
56 }\r
57 \r
58 int ModeXShowPage()\r
59 { char *s,*se,*d,*de;\r
60   int k;\r
61 \r
62   CheckTimerStuff();\r
63 \r
64   s=screen+(16*tsx)+16;\r
65   se=s+(sy*tsx);\r
66   d=screenx;\r
67 \r
68   while (s<se)\r
69   {\r
70     for (k=0; k<4; k++)\r
71     {\r
72       plane(k);\r
73       de=d+(sx>>2);\r
74 \r
75       while (d<de)\r
76       {\r
77         d[0]=s[k];\r
78         d[1]=s[k+4];\r
79         s+=8;\r
80         d+=2;\r
81       }\r
82 \r
83       s-=sx;\r
84       d-=(sx>>2);\r
85     }\r
86 \r
87     s+=tsx;\r
88     d+=(sx>>2);\r
89   }\r
90   return 0;\r
91 }\r
92 \r
93 int ModeXCopySprite(int x, int y, int width, int height, char *src)\r
94 { char *d;\r
95 \r
96   d=screen+(y*tsx)+x;\r
97   for (; height; height--)\r
98   {\r
99     memcpy(d,src,width);\r
100     src+=width;\r
101     d+=tsx;\r
102   }\r
103 \r
104   return 0;\r
105 }\r
106 \r
107 int ModeXCCopySprite(int x,int y,int width,int height,char *src)\r
108 { int cx1,cy1,cx2,cy2;\r
109   char *s,*d;\r
110   int xl,yl,xs,ys;\r
111 \r
112   xl=width;\r
113   yl=height;\r
114   xs=ys=0;\r
115 \r
116   cx1=0;\r
117   cy1=0;\r
118   cx2=tsx-1;\r
119   cy2=tsy-1;\r
120 \r
121   if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
122     return 0;\r
123 \r
124   if (x+xl > cx2) xl=cx2-x+1;\r
125   if (y+yl > cy2) yl=cy2-y+1;\r
126 \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
129 \r
130   s=src;\r
131   if (xs+ys) s+=(ys*width)+xs;\r
132   d=screen+(y*tsx)+x;\r
133 \r
134   for (; yl; yl--)\r
135   {\r
136     memcpy(d,s,xl);\r
137     s+=width;\r
138     d+=tsx;\r
139   }\r
140 \r
141   return 0;\r
142 }\r
143 \r
144 int ModeXTCCopySprite(int x,int y,int width,int height,char *src)\r
145 { int cx1,cy1,cx2,cy2;\r
146   char *s,*d;\r
147   int xl,yl,xs,ys;\r
148   char c;\r
149 \r
150   xl=width;\r
151   yl=height;\r
152   xs=ys=0;\r
153 \r
154   cx1=0;\r
155   cy1=0;\r
156   cx2=tsx-1;\r
157   cy2=tsy-1;\r
158 \r
159   if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
160     return 0;\r
161 \r
162   if (x+xl > cx2) xl=cx2-x+1;\r
163   if (y+yl > cy2) yl=cy2-y+1;\r
164 \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
167 \r
168   s=src;\r
169   if (xs+ys) s+=(ys*width)+xs;\r
170   d=screen+(y*tsx)+x;\r
171 \r
172   for (; yl; yl--)\r
173   {\r
174     for (x=0; x<xl; x++)\r
175     {\r
176       c=s[x];\r
177       if (c)\r
178         d[x]=c;\r
179     }\r
180     s+=width;\r
181     d+=tsx;\r
182   }\r
183 \r
184   return 0;\r
185 }\r
186 \r
187 int ModeXTCopySprite(int x, int y, int width, int height, char *src)\r
188 { char *d;\r
189   char c;\r
190 \r
191   d=screen+(y*tsx)+x;\r
192   for (; height; height--)\r
193   {\r
194     for (x=0; x<width; x++)\r
195     {\r
196       c=src[x];\r
197       if (c)\r
198         d[x]=c;\r
199     }\r
200     src+=width;\r
201     d+=tsx;\r
202   }\r
203 \r
204   return 0;\r
205 }\r
206 \r
207 int ModeXCopyTile(int x, int y, char *src)\r
208 { int h;\r
209   char *d;\r
210 \r
211   h=16;\r
212   d=screen+(y*tsx)+x;\r
213   for (; h; h--)\r
214   {\r
215     memcpy(d, src, 16);\r
216     src+=16;\r
217     d+=tsx;\r
218   }\r
219 \r
220   return 0;\r
221 }\r
222 \r
223 int ModeXVLine(int x, int y, int length, char color)\r
224 { int cx1,cy1,cx2,cy2;\r
225   char *d;\r
226 \r
227   cx1=0;\r
228   cy1=0;\r
229   cx2=tsx-1;\r
230   cy2=tsy-1;\r
231 \r
232   if (x>cx2 || y>cy2 || x<cx1 || y+length<cy1)\r
233     return 0;\r
234 \r
235   if (y+length > cy2) length=cy2-y+1;\r
236   if (y<cy1) { length-=(cy1-y); y=cy1; }\r
237 \r
238   d=screen+(y*tsx)+x;\r
239   for (; length; length--)\r
240   {\r
241     *d=color;\r
242     d+=tsx;\r
243   }\r
244 \r
245   return 0;\r
246 }\r
247 \r
248 int ModeXHLine(int x, int y, int width, char color)\r
249 { int cx1,cy1,cx2,cy2;\r
250   char *d;\r
251 \r
252   cx1=0;\r
253   cy1=0;\r
254   cx2=tsx-1;\r
255   cy2=tsy-1;\r
256 \r
257   if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
258     return 0;\r
259 \r
260   if (x+width > cx2) width=cx2-x+1;\r
261   if (x<cx1) { width-=(cx1-x); x=cx1; }\r
262 \r
263   d=screen+(y*tsx)+x;\r
264   memset(d,color,width);\r
265 \r
266   return 0;\r
267 }\r
268 \r
269 int ModeXFilledBox(int x, int y, int width, int height, char c)\r
270 {\r
271   for (; height; height--,y++)\r
272     ModeXHLine(x, y, width, c);\r
273 \r
274   return 0;\r
275 }\r
276 \r
277 int ModeXColorGrid(int x, int y, char c)\r
278 { char *d;\r
279 \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
283   {\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
286 \r
287     d+=(tsx+1);\r
288 \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
291 \r
292     d+=(tsx-1);\r
293   }\r
294 \r
295   return 0;\r
296 }\r
297 \r
298 int ModeXClearScreen()\r
299 {\r
300   memset(screen,0,90117);\r
301   return 0;\r
302 }\r
303 \r
304 int ModeXCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src)\r
305 {\r
306  int cx1,cy1,cx2,cy2;\r
307   unsigned char *s,*d,c;\r
308   int xl,yl,xs,ys;\r
309 \r
310   cx1=0;\r
311   cy1=0;\r
312   cx2=tsx-1;\r
313   cy2=tsy-1;\r
314 \r
315   xl=width;\r
316   yl=height;\r
317   xs=ys=0;\r
318   if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
319     return 1;\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
324 \r
325   s=src;\r
326   if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
327   if (xs) s+=xs;\r
328   d=screen+(y*tsx)+x;\r
329 \r
330   for (; yl; yl--)\r
331   {\r
332     for (x=0; x<xl; x++)\r
333     {\r
334       c=s[x];\r
335       if (c)\r
336         d[x]=translucency_table[d[x]|(c<<8)];\r
337     }\r
338     s+=width;\r
339     d+=tsx;\r
340   }\r
341   return 1;\r
342 }\r
343 \r
344 \r
345 void InitModeX()\r
346 { char in_byte;\r
347 \r
348   SetMode(0x13);\r
349 \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
369 \r
370   //sx=320;  sy=240;\r
371   //tsx=352; tsy=272;\r
372   //tx=20;   ty=15;\r
373   //endcol=336; nextl=80;\r
374   //winofs=5632;\r
375 \r
376   screenx=(char *) 0xA0000;\r
377   screen=(char *) valloc(352*(256+16),"screen",0);\r
378   //memset(screen,0,95744);\r
379   curscr=0;\r
380 \r
381   sx=320;  sy=240;\r
382   tsx=352; tsy=256;\r
383   tx=20;   ty=15;\r
384 \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
394   HLine=&ModeXHLine;\r
395   VLine=&ModeXVLine;\r
396   ColorGrid=&ModeXColorGrid;\r
397   ClearScreen=&ModeXClearScreen;\r
398   CopySpriteLucentClip=&ModeXCopySpriteLucentClip;\r
399 \r
400   map_scroll_x =\r
401   map_scroll_y = 2;\r
402 }\r
403 \r
404 \r