]> 4ch.mooo.com Git - 16.git/blob - src/lib/dos_gfx.cpp
modified: CORE16.EXE
[16.git] / src / lib / dos_gfx.cpp
1 /////////////////////////////////////////////////////////////////////////////\r
2 //                                                                         //\r
3 // TUTPROG4.CPP - VGA Trainer Program 4 (in Turbo C++ 3.0)                 //\r
4 //                                                                         //\r
5 // "The VGA Trainer Program" is written by Denthor of Asphyxia. However it //\r
6 // was limited to Pascal only in its first run.  All I have done is taken  //\r
7 // his original release, translated it to C++ and touched up a few things. //\r
8 // I take absolutely no credit for the concepts presented in this code and //\r
9 // am NOT the person to ask for help if you are having trouble.            //\r
10 //                                                                         //\r
11 // Program Notes : This program implements virtual screens, a great way    //\r
12 //                 to update your screen.                                  //\r
13 //                                                                         //\r
14 //                 For this particular program, I have found the compiler  //\r
15 //                 option -mc (Compact memory model) to work better than   //\r
16 //                 -ml (Large memory model).  However, you must use -mc or //\r
17 //                 greater.                                                //\r
18 //                 Also, you might want to go under "Options...Debugger"   //\r
19 //                 and increase your programs Heap size to >64k.  I don't  //\r
20 //                 know if <64k will lock your system, but I had problems. //\r
21 //                                                                         //\r
22 // Author        : Grant Smith (Denthor) - denthor@beastie.cs.und.ac.za    //\r
23 // Translator    : Christopher G. Mann   - r3cgm@dax.cc.uakron.edu         //\r
24 //                                                                         //\r
25 // Last Modified : December 23, 1994                                       //\r
26 //                                                                         //\r
27 /////////////////////////////////////////////////////////////////////////////\r
28 #include "src\lib\dos_gfx.h"\r
29 \r
30 // declare a pointer to the offset of the Virtual Screen\r
31 byte *vaddr = NULL;\r
32 // declare a pointer to the offset of the VGA memory\r
33 byte *vga = (byte *) MK_FP(VMEM, 0);\r
34 int old_mode;\r
35 //color てすと\r
36 int gq = LGQ;\r
37 //てすと\r
38 int q = 0;\r
39 int bakax = 0, bakay = 0;\r
40 int xx = 0, yy = 0, sx = 0, sy = 0;\r
41 byte coor;\r
42 \r
43 /////////////////////////////////////////////////////////////////////////////\r
44 //                                                                         //\r
45 // setvideo() - This function Manages the video modes                      //\r
46 //                                                                         //\r
47 /////////////////////////////////////////////////////////////////////////////\r
48 void setvideo(byte mode, int vq){\r
49         union REGS in, out;\r
50 \r
51         if(!vq){ // deinit the video\r
52                 // change to the video mode we were in before we switched to mode 13h\r
53                 in.h.ah = 0x00;\r
54                 in.h.al = old_mode;\r
55                 int86(0x10, &in, &out);\r
56         }else if(vq == 1){ // init the video\r
57                 // get old video mode\r
58                 in.h.ah = 0xf;\r
59                 int86(0x10, &in, &out);\r
60                 old_mode = out.h.al;\r
61 \r
62                 // enter mode\r
63                 in.h.ah = 0x00;\r
64                 in.h.al = mode;\r
65                 // vesa\r
66                 //in.x.ax = 0x4f02;\r
67                 //in.x.bx = mode;\r
68                 int86(0x10, &in, &out);\r
69         }\r
70 }\r
71 \r
72 /////////////////////////////////////////////////////////////////////////////\r
73 //                                                                         //\r
74 // setvbuff() - This manages the memory needed for the virtual screen.     //\r
75 //                                                                         //\r
76 /////////////////////////////////////////////////////////////////////////////\r
77 // manages the buffer/virtual screen\r
78 void setvbuff(int vq){\r
79         if(!vq){\r
80                 free(vaddr);\r
81         }else if(vq == 1){\r
82                 vaddr = (byte *) calloc(SW*SH, 1);\r
83 \r
84                 if(vaddr == NULL){\r
85                         setvideo(0x03, 1);\r
86                         cout << "Not enough video memory available, exiting program....";\r
87                         exit(1);\r
88                 }\r
89         }\r
90 }\r
91 \r
92 /////////////////////////////////////////////////////////////////////////////\r
93 //                                                                         //\r
94 // updatevbuff() - This flips the virtual screen to the VGA screen.        //\r
95 //                                                                         //\r
96 /////////////////////////////////////////////////////////////////////////////\r
97 // updates the buffer/virtual screen\r
98 void updatevbuff(){\r
99 /*      // wait for vertical re-trace\r
100         while(inportb(INPUT_STATUS_0) & 8);\r
101         while(!(inportb(INPUT_STATUS_0) & 8));*/\r
102 \r
103         // copy everything to video memory\r
104         _fmemcpy(vga, vaddr, SW*SH);\r
105 }\r
106 \r
107 /////////////////////////////////////////////////////////////////////////////\r
108 //                                                                         //\r
109 // cls() - This clears the screen to the specified color, on the VGA or on //\r
110 //         the Virtual screen.                                             //\r
111 //                                                                         //\r
112 /////////////////////////////////////////////////////////////////////////////\r
113 void cls(byte color, byte *Where){\r
114         _fmemset(Where, color, SW*SH);\r
115 }\r
116 \r
117 // clears the entire video output\r
118 void clearscr(){\r
119         cls(0, vga);\r
120         cls(0, vaddr);\r
121 }\r
122 \r
123 /////////////////////////////////////////////////////////////////////////////\r
124 //                                                                         //\r
125 // plotpixel() - This puts a pixel at X,Y using color Col, on VGA or the    //\r
126 //              Virtual Screen;                                            //\r
127 //                                                                         //\r
128 /////////////////////////////////////////////////////////////////////////////\r
129 void plotpixel(int x, int y, byte color, byte *Where){\r
130         memset(Where+(x+(y*SW)),color,1);\r
131 }\r
132 \r
133 // king_crimson's code\r
134 void ppf(int x, int y, byte color, byte *Where) {\r
135         byte far *vidptr;\r
136         vidptr = (byte far *)(Where + y*SW + x);\r
137         *vidptr = color;\r
138 }\r
139 \r
140 /////////////////////////////////////////////////////////////////////////////\r
141 //                                                                         //\r
142 // BlockMove() - This tests various ways of moving a block around the      //\r
143 //               screen.                                                   //\r
144 //                                                                         //\r
145 /////////////////////////////////////////////////////////////////////////////\r
146 //てすと\r
147 void BlockMove(){\r
148         int loop1, loop2, loop3;\r
149 \r
150         // This draws a block directly to the VGA with no flipping\r
151         for(loop1=1; loop1<271; loop1++){\r
152         for(loop2=1; loop2<51; loop2++)\r
153                 for(loop3=1; loop3<51; loop3++)\r
154                         plotpixel(loop1+loop2,loop3,32, vga);\r
155                 cls(0,vga);\r
156         }\r
157 \r
158         //`\r
159         for(loop1=1; loop1<281; loop1++){\r
160         for(loop2=1; loop2<41; loop2++)\r
161                 for(loop3=1; loop3<41; loop3++)\r
162                         plotpixel(loop1+loop2,loop3,14, vaddr);\r
163                 //updatevbuff();\r
164                 cls(0,vaddr);\r
165         }\r
166 \r
167 /*      // This draws to the virtual screen, waits for retrace, then flips to VGA\r
168         for(loop1=1; loop1<51; loop1++){\r
169         for(loop2=1; loop2<51; loop2++)\r
170                 for(loop3=1; loop3<51; loop3++)\r
171                         plotpixel(loop1+loop2,loop3,32, vaddr);\r
172 //              WaitRetrace();\r
173                 updatevbuff();\r
174                 cls(0,vaddr);\r
175         }*/\r
176 }\r
177 \r
178 void etesuto(int x = 160, int y = 100){\r
179         memset(vaddr+(x+(y*SW)),gq-1,1);\r
180         //updatevbuff();\r
181 }\r
182 \r
183 void qtesuto(int x = 160, int y = 100, int color = 0){\r
184         memset(vaddr+(x+(y*SW)),color,1);\r
185         //updatevbuff();\r
186 }\r
187 \r
188 //color てすと\r
189 int colortest(){\r
190         if(gq < NUM_COLORS){\r
191                 cls(gq, vaddr);\r
192                 //updatevbuff();\r
193                 gq++;\r
194         }else gq = 0;\r
195         return gq;\r
196 }\r
197 \r
198 //color てすと\r
199 int colorz(){\r
200         if(gq < HGQ){\r
201                 cls(gq, vaddr);\r
202                 //updatevbuff();\r
203                 gq++;\r
204         }else gq = LGQ;\r
205         return gq;\r
206 }\r
207 \r
208 //slow spectrum down\r
209 void ssd(int svq){\r
210         if(sy < SH+1){\r
211                 if(sx < SW+1){\r
212                         //plotpixel(xx, yy, coor, vga);\r
213                         ppf(sx, sy, coor, vga);\r
214                         //printf("%d %d %d %d\n", sx, sy, svq, coor);\r
215                         sx++;\r
216                 }else sx = 0;\r
217                 if(sx == SW){\r
218                         sy++;\r
219                         if(svq == 7) coor++;\r
220                         if(sy == SH && svq == 8) coor = rand()%NUM_COLORS;\r
221                 }\r
222         }else sy = 0;\r
223 }\r
224
225 void pdump(){
226         int palcol=0;
227         for(int paly=0; paly<32; paly++){
228                 for(int palx=0; palx<32; palx++){
229                         ppf((SW-32)+palx, paly, palcol, vaddr);
230                         ppf((SW-32)+palx+1, paly, palcol, vaddr);
231                         ppf((SW-32)+palx, paly+1, palcol, vaddr);
232                         ppf((SW-32)+palx+1, paly+1, palcol, vaddr);
233                         palx++;
234                         palcol++;
235                 }
236         paly++;
237         }
238 }
239
240 //draw a tulip inifficiently
241 void tulip(){
242         cls(0,vaddr);
243         std::cout << "01 Story of Chikyuu" << std::endl;
244         //22 lines
245         int tx = (SW/2)-16;
246         int ty = (SH/2)-22;
247         gq = 0;
248         ppf(tx+8, ty, 37, vaddr); ty++;
249         ppf(tx+7, ty, 37, vaddr); ppf(tx+8, ty, 37, vaddr); ty++;
250         ppf(tx+6, ty, 37, vaddr); ppf(tx+7, ty, 37, vaddr); ppf(tx+8, ty, 40, vaddr); ppf(tx+9, ty, 37, vaddr); ty++;
251         ppf(tx+2, ty, 40, vaddr); ppf(tx+5, ty, 37, vaddr); ppf(tx+6, ty, 37, vaddr); ppf(tx+7, ty, 40, vaddr); ppf(tx+8, ty, 40, vaddr); ppf(tx+9, ty, 38, vaddr); ppf(tx+12, ty, 37, vaddr); ty++;
252         ppf(tx+3, ty, 40, vaddr); ppf(tx+4, ty, 40, vaddr); ppf(tx+5, ty, 37, vaddr); ppf(tx+6, ty, 38, vaddr); ppf(tx+7, ty, 40, vaddr); ppf(tx+8, ty, 38, vaddr); ppf(tx+9, ty, 40, vaddr); ppf(tx+10, ty, 38, vaddr); ppf(tx+11, ty, 37, vaddr); ppf(tx+12, ty, 40, vaddr); ty++;
253         ppf(tx+3, ty, 40, vaddr); ppf(tx+4, ty, 40, vaddr); ppf(tx+5, ty, 40, vaddr); ppf(tx+6, ty, 44, vaddr); ppf(tx+7, ty, 38, vaddr); ppf(tx+8, ty, 44, vaddr); ppf(tx+9, ty, 40, vaddr); ppf(tx+10, ty, 37, vaddr); ppf(tx+11, ty, 40, vaddr); ppf(tx+12, ty, 40, vaddr); ty++;
254         //7
255         ppf(tx+3, ty, 40, vaddr); ppf(tx+4, ty, 40, vaddr); ppf(tx+5, ty, 40, vaddr); ppf(tx+6, ty, 44, vaddr); ppf(tx+7, ty, 44, vaddr); ppf(tx+8, ty, 40, vaddr); ppf(tx+9, ty, 44, vaddr); ppf(tx+10, ty, 37, vaddr); ppf(tx+11, ty, 40, vaddr); ppf(tx+12, ty, 40, vaddr); ty++;
256         ppf(tx+3, ty, 40, vaddr); ppf(tx+4, ty, 40, vaddr); ppf(tx+5, ty, 40, vaddr); ppf(tx+6, ty, 40, vaddr); ppf(tx+7, ty, 40, vaddr); ppf(tx+8, ty, 40, vaddr); ppf(tx+9, ty, 44, vaddr); ppf(tx+10, ty, 40, vaddr); ppf(tx+11, ty, 40, vaddr); ppf(tx+12, ty, 40, vaddr); ty++;
257         ppf(tx+4, ty, 40, vaddr); ppf(tx+5, ty, 40, vaddr); ppf(tx+6, ty, 40, vaddr); ppf(tx+7, ty, 40, vaddr); ppf(tx+8, ty, 40, vaddr); ppf(tx+9, ty, 44, vaddr); ppf(tx+10, ty, 40, vaddr); ppf(tx+11, ty, 40, vaddr); ppf(tx+12, ty, 40, vaddr); ty++;
258         ppf(tx+4, ty, 40, vaddr); ppf(tx+5, ty, 40, vaddr); ppf(tx+6, ty, 40, vaddr); ppf(tx+7, ty, 40, vaddr); ppf(tx+8, ty, 4, vaddr); ppf(tx+9, ty, 44, vaddr); ppf(tx+10, ty, 40, vaddr); ppf(tx+11, ty, 40, vaddr); ppf(tx+12, ty, 40, vaddr); ty++;
259         //11
260         ppf(tx+4, ty, 40, vaddr); ppf(tx+5, ty, 4, vaddr); ppf(tx+6, ty, 40, vaddr); ppf(tx+7, ty, 40, vaddr); ppf(tx+8, ty, 4, vaddr); ppf(tx+9, ty, 40, vaddr); ppf(tx+10, ty, 40, vaddr); ppf(tx+11, ty, 4, vaddr); ppf(tx+12, ty, 4, vaddr); ty++;
261         //12
262         ppf(tx+4, ty, 4, vaddr); ppf(tx+5, ty, 4, vaddr); ppf(tx+6, ty, 40, vaddr); ppf(tx+7, ty, 4, vaddr); ppf(tx+8, ty, 4, vaddr); ppf(tx+9, ty, 40, vaddr); ppf(tx+10, ty, 40, vaddr); ppf(tx+11, ty, 4, vaddr); ppf(tx+15, ty, 2, vaddr); ty++;
263         ppf(tx, ty, 45, vaddr); ppf(tx+5, ty, 4, vaddr); ppf(tx+6, ty, 4, vaddr); ppf(tx+7, ty, 4, vaddr); ppf(tx+8, ty, 4, vaddr); ppf(tx+9, ty, 4, vaddr); ppf(tx+10, ty, 4, vaddr); ppf(tx+13, ty, 2, vaddr); ppf(tx+14, ty, 2, vaddr); ppf(tx+15, ty, 2, vaddr); ty++;
264         //14
265         ppf(tx, ty, 45, vaddr); ppf(tx+1, ty, 2, vaddr); ppf(tx+6, ty, 2, vaddr); ppf(tx+7, ty, 45, vaddr); ppf(tx+8, ty, 2, vaddr); ppf(tx+12, ty, 2, vaddr); ppf(tx+13, ty, 2, vaddr); ppf(tx+14, ty, 45, vaddr); ty++;
266         ppf(tx, ty, 45, vaddr); ppf(tx+1, ty, 45, vaddr); ppf(tx+2, ty, 2, vaddr); ppf(tx+7, ty, 45, vaddr); ppf(tx+11, ty, 2, vaddr); ppf(tx+12, ty, 2, vaddr); ppf(tx+13, ty, 2, vaddr); ppf(tx+14, ty, 45, vaddr); ty++;
267         ppf(tx+1, ty, 45, vaddr); ppf(tx+2, ty, 2, vaddr); ppf(tx+3, ty, 2, vaddr); ppf(tx+7, ty, 45, vaddr); ppf(tx+10, ty, 2, vaddr); ppf(tx+11, ty, 2, vaddr); ppf(tx+12, ty, 2, vaddr); ppf(tx+13, ty, 45, vaddr); ppf(tx+14, ty, 2, vaddr); ty++;
268         ppf(tx+1, ty, 45, vaddr); ppf(tx+2, ty, 45, vaddr); ppf(tx+3, ty, 2, vaddr); ppf(tx+4, ty, 2, vaddr); ppf(tx+7, ty, 45, vaddr); ppf(tx+10, ty, 2, vaddr); ppf(tx+11, ty, 2, vaddr); ppf(tx+12, ty, 45, vaddr); ppf(tx+13, ty, 2, vaddr); ty++;
269         ppf(tx+1, ty, 45, vaddr); ppf(tx+2, ty, 45, vaddr); ppf(tx+3, ty, 45, vaddr); ppf(tx+4, ty, 2, vaddr); ppf(tx+7, ty, 45, vaddr); ppf(tx+9, ty, 2, vaddr); ppf(tx+10, ty, 2, vaddr); ppf(tx+11, ty, 45, vaddr); ppf(tx+12, ty, 2, vaddr); ppf(tx+13, ty, 2, vaddr); ty++;
270         ppf(tx+2, ty, 45, vaddr); ppf(tx+3, ty, 45, vaddr); ppf(tx+4, ty, 45, vaddr); ppf(tx+5, ty, 2, vaddr); ppf(tx+7, ty, 45, vaddr); ppf(tx+9, ty, 2, vaddr); ppf(tx+10, ty, 45, vaddr); ppf(tx+11, ty, 2, vaddr); ppf(tx+11, ty, 2, vaddr); ppf(tx+12, ty, 2, vaddr); ty++;
271         ppf(tx+3, ty, 45, vaddr); ppf(tx+4, ty, 45, vaddr); ppf(tx+5, ty, 45, vaddr); ppf(tx+6, ty, 2, vaddr); ppf(tx+7, ty, 45, vaddr); ppf(tx+8, ty, 2, vaddr); ppf(tx+9, ty, 45, vaddr); ppf(tx+10, ty, 2, vaddr); ty++;
272         ppf(tx+5, ty, 45, vaddr); ppf(tx+7, ty, 45, vaddr); ppf(tx+8, ty, 2, vaddr); ty++;
273         ppf(tx+7, ty, 45, vaddr);
274 }
275 \r
276 /*-----------ding-------------*/\r
277 int ding(int q){\r
278         int d3y;\r
279 \r
280         if(q <= 4 && gq == BONK-1) coor = rand()%NUM_COLORS;\r
281 \r
282         if(q == 5){ colortest(); return gq; }\r
283         if(q == 10){ colorz(); return gq; }\r
284         if(q == 11){ colorz(); delay(100); return gq; }\r
285         if(q == 8){ ssd(q); /*printf("%d\n", coor);*/ }\r
286         if(q == 6){\r
287                 coor = rand()%NUM_COLORS;\r
288                 cls(coor, vaddr);\r
289                 //updatevbuff();\r
290         }\r
291 \r
292         if(q == 7 || q== 9){\r
293                 if(gq < HGQ){\r
294                         if(q == 7) ssd(q);\r
295                         if(q == 9){ ssd(q); coor++; }\r
296                         gq++;\r
297                 }else gq = LGQ;\r
298         }\r
299         if(q<5 && gq<BONK){ // the number variable make the colors more noticable\r
300                 if(q==1){\r
301                         if(xx==SW){bakax=0;}\r
302                         if(xx==0){bakax=1;}\r
303                         if(yy==SH){bakay=0;}\r
304                         if(yy==0){bakay=1;}\r
305                 }else if(q==3){\r
306                         if(xx!=SW||yy!=SH){\r
307                                 if(xx==0){bakax=1;bakay=-1;d3y=1;}\r
308                                 if(yy==0){bakax=1;bakay=0;d3y=1;}\r
309                                 if(xx==SW){bakax=-1;bakay=-1;d3y=1;}\r
310                                 if(yy==SH){bakax=1;bakay=0;d3y=1;}\r
311                         }else if(xx==SW&&yy==SH) xx=yy=0;\r
312                 }\r
313                 if(q==3){\r
314                         if(d3y){\r
315                                 if(bakay<0){\r
316                                         yy--;\r
317                                         d3y--;\r
318                                 }else\r
319                                 if(bakay>0){\r
320                                         yy++;\r
321                                         d3y--;\r
322                                 }\r
323                         }\r
324                         if(bakax<0){\r
325                                 xx--;\r
326                         }else\r
327                         if(bakax>0){\r
328                                 xx++;\r
329                         }\r
330                 }else{\r
331                         if(!bakax){\r
332                                 xx--;\r
333                         }else{\r
334                                 xx++;\r
335                         }\r
336                         if(!bakay){\r
337                                 yy--;\r
338                         }else{\r
339                                 yy++;\r
340                         }\r
341                 }\r
342                 // plot the pixel\r
343                 ppf(xx, yy, coor, vga);\r
344                 if(q==2) ppf(rand()%SW, rand()%SH, 0, vga);\r
345                 if(q==2||q==4){ bakax = rand()&0x1; bakay = rand()&0x1; }\r
346                 gq++;\r
347 //              printf("%d %d %d %d\n", xx, yy, gq, coor);\r
348         }else gq = LGQ;\r
349         return gq;\r
350 }