]> 4ch.mooo.com Git - 16.git/blob - src/lib/16_tail.c
p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I...
[16.git] / src / lib / 16_tail.c
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
3  *\r
4  * This file is part of Project 16.\r
5  *\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
10  *\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
15  *\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
20  *\r
21  */\r
22 /*\r
23  * 16 tail library\r
24  */\r
25 \r
26 #include "src/lib/16_tail.h"\r
27 #include "src/lib/16text.h"\r
28 \r
29 /*\r
30 ==========================\r
31 =\r
32 = Startup16\r
33 =\r
34 = Load a few things right away\r
35 =\r
36 ==========================\r
37 */\r
38 \r
39 void Startup16(global_game_variables_t *gvar)\r
40 {\r
41         gvar->video.VL_Started=0;\r
42         TL_VidInit(gvar);\r
43         gvar->mm.mmstarted=0;\r
44         gvar->pm.PMStarted=0;\r
45         MM_Startup(gvar);\r
46 #ifdef __WATCOMC__\r
47 #ifdef __DEBUG_InputMgr__\r
48         if(!dbg_nointest)\r
49 #endif\r
50         IN_Startup(gvar);\r
51 #endif\r
52 #ifdef __16_PM__\r
53         PM_Startup(gvar);\r
54         PM_CheckMainMem(gvar);\r
55         PM_UnlockMainMem(gvar);\r
56 #endif\r
57         CA_Startup(gvar);\r
58 }\r
59 \r
60 //===========================================================================\r
61 \r
62 /*\r
63 ==========================\r
64 =\r
65 = Shutdown16\r
66 =\r
67 = Shuts down all ID_?? managers\r
68 =\r
69 ==========================\r
70 */\r
71 \r
72 void Shutdown16(global_game_variables_t *gvar)\r
73 {\r
74 #ifdef __16_PM__\r
75         PM_Shutdown(gvar);\r
76 #endif\r
77 #ifdef __WATCOMC__\r
78 #ifdef __DEBUG_InputMgr__\r
79         if(!dbg_nointest)\r
80 #endif\r
81         IN_Shutdown(gvar);\r
82 #endif\r
83         CA_Shutdown(gvar);\r
84         MM_Shutdown(gvar);\r
85 #ifdef __WATCOMC__\r
86         if(gvar->video.VL_Started)\r
87                 VL_Shutdown (gvar);//VGAmodeX(0, 1, gvar);\r
88 #endif\r
89 }\r
90 \r
91 //===========================================================================\r
92 \r
93 /*\r
94 ====================\r
95 =\r
96 = ReadConfig\r
97 =\r
98 ====================\r
99 */\r
100 \r
101 /*void ReadConfig(void)\r
102 {\r
103         int                                      file;\r
104         SDMode            sd;\r
105         SMMode            sm;\r
106         SDSMode          sds;\r
107 \r
108 \r
109         if ( (file = open(configname,O_BINARY | O_RDONLY)) != -1)\r
110         {\r
111         //\r
112         // valid config file\r
113         //\r
114                 read(file,Scores,sizeof(HighScore) * MaxScores);\r
115 \r
116                 read(file,&sd,sizeof(sd));\r
117                 read(file,&sm,sizeof(sm));\r
118                 read(file,&sds,sizeof(sds));\r
119 \r
120                 read(file,&mouseenabled,sizeof(mouseenabled));\r
121                 read(file,&joystickenabled,sizeof(joystickenabled));\r
122                 read(file,&joypadenabled,sizeof(joypadenabled));\r
123                 read(file,&joystickprogressive,sizeof(joystickprogressive));\r
124                 read(file,&joystickport,sizeof(joystickport));\r
125 \r
126                 read(file,&dirscan,sizeof(dirscan));\r
127                 read(file,&buttonscan,sizeof(buttonscan));\r
128                 read(file,&buttonmouse,sizeof(buttonmouse));\r
129                 read(file,&buttonjoy,sizeof(buttonjoy));\r
130 \r
131                 read(file,&viewsize,sizeof(viewsize));\r
132                 read(file,&mouseadjustment,sizeof(mouseadjustment));\r
133 \r
134                 close(file);\r
135 \r
136                 if (sd == sdm_AdLib && !AdLibPresent && !SoundBlasterPresent)\r
137                 {\r
138                         sd = sdm_PC;\r
139                         sd = smm_Off;\r
140                 }\r
141 \r
142                 if ((sds == sds_SoundBlaster && !SoundBlasterPresent) ||\r
143                         (sds == sds_SoundSource && !SoundSourcePresent))\r
144                         sds = sds_Off;\r
145 \r
146                 if (!MousePresent)\r
147                         mouseenabled = false;\r
148                 if (!JoysPresent[joystickport])\r
149                         joystickenabled = false;\r
150 \r
151                 MainMenu[6].active=1;\r
152                 MainItems.curpos=0;\r
153         }\r
154         else\r
155         {\r
156         //\r
157         // no config file, so select by hardware\r
158         //\r
159                 if (SoundBlasterPresent || AdLibPresent)\r
160                 {\r
161                         sd = sdm_AdLib;\r
162                         sm = smm_AdLib;\r
163                 }\r
164                 else\r
165                 {\r
166                         sd = sdm_PC;\r
167                         sm = smm_Off;\r
168                 }\r
169 \r
170                 if (SoundBlasterPresent)\r
171                         sds = sds_SoundBlaster;\r
172                 else if (SoundSourcePresent)\r
173                         sds = sds_SoundSource;\r
174                 else\r
175                         sds = sds_Off;\r
176 \r
177                 if (MousePresent)\r
178                         mouseenabled = true;\r
179 \r
180                 joystickenabled = false;\r
181                 joypadenabled = false;\r
182                 joystickport = 0;\r
183                 joystickprogressive = false;\r
184 \r
185                 viewsize = 15;\r
186                 mouseadjustment=5;\r
187         }\r
188 \r
189         SD_SetMusicMode (sm);\r
190         SD_SetSoundMode (sd);\r
191         SD_SetDigiDevice (sds);\r
192 }*/\r
193 \r
194 \r
195 /*\r
196 ====================\r
197 =\r
198 = WriteConfig\r
199 =\r
200 ====================\r
201 */\r
202 \r
203 /*void WriteConfig(void)\r
204 {\r
205         int                                      file;\r
206 \r
207         file = open(configname,O_CREAT | O_BINARY | O_WRONLY,\r
208                                 S_IREAD | S_IWRITE | S_IFREG);\r
209 \r
210         if (file != -1)\r
211         {\r
212                 write(file,Scores,sizeof(HighScore) * MaxScores);\r
213 \r
214                 write(file,&SoundMode,sizeof(SoundMode));\r
215                 write(file,&MusicMode,sizeof(MusicMode));\r
216                 write(file,&DigiMode,sizeof(DigiMode));\r
217 \r
218                 write(file,&mouseenabled,sizeof(mouseenabled));\r
219                 write(file,&joystickenabled,sizeof(joystickenabled));\r
220                 write(file,&joypadenabled,sizeof(joypadenabled));\r
221                 write(file,&joystickprogressive,sizeof(joystickprogressive));\r
222                 write(file,&joystickport,sizeof(joystickport));\r
223 \r
224                 write(file,&dirscan,sizeof(dirscan));\r
225                 write(file,&buttonscan,sizeof(buttonscan));\r
226                 write(file,&buttonmouse,sizeof(buttonmouse));\r
227                 write(file,&buttonjoy,sizeof(buttonjoy));\r
228 \r
229                 write(file,&viewsize,sizeof(viewsize));\r
230                 write(file,&mouseadjustment,sizeof(mouseadjustment));\r
231 \r
232                 close(file);\r
233         }\r
234 }*/\r
235 \r
236 //===========================================================================\r
237 \r
238 /*\r
239 ===================\r
240 =\r
241 = FizzleFade\r
242 =\r
243 ===================\r
244 */\r
245 \r
246 boolean FizzleFade (unsigned source, unsigned dest, unsigned width, unsigned height, unsigned frames, boolean abortable, global_game_variables_t *gvar)\r
247 {\r
248         word            p,pixperframe;\r
249         unsigned        drawofs,pagedelta;\r
250         byte            mask,maskb[8] = {1,2,4,8};\r
251         unsigned        x,y,frame;\r
252         long            rndval;\r
253         word            screenseg;\r
254 #ifdef __WATCOMC__\r
255         unsigned        esorig;//,q;\r
256 #endif\r
257 \r
258         pagedelta = dest-source;\r
259         rndval = 1;\r
260 #ifdef __WATCOMC__\r
261         esorig = 0;// q = 16;\r
262 #endif\r
263         x = y = 0;\r
264         pixperframe = (dword)(gvar->video.page[0].width*gvar->video.page[0].height)/frames;\r
265         screenseg = SCREENSEG;\r
266 \r
267         IN_StartAck (gvar);\r
268 \r
269 //      modexClearRegion(&(gvar->video.page[0]), 0, 0, gvar->video.page[0].width, gvar->video.page[0].height, 0);\r
270 //      modexClearRegion(&(gvar->video.page[1]), 0, 0, gvar->video.page[0].width, gvar->video.page[0].height, 15);\r
271 \r
272 #ifdef __WATCOMC__\r
273         __asm {\r
274                 mov     [esorig],es\r
275         }\r
276 #endif\r
277 //      TimeCount=\r
278         frame=0;\r
279         do      // while (1)\r
280         {\r
281                 if (abortable && IN_CheckAck (gvar) )\r
282                         return true;\r
283 \r
284                 __asm {\r
285                         mov     es,[screenseg]\r
286                 }\r
287 \r
288                 for (p=0;p<pixperframe;p++)\r
289                 {\r
290                         __asm {\r
291                                 //\r
292                                 // seperate random value into x/y pair\r
293                                 //\r
294                                 mov     ax,[WORD PTR rndval]\r
295                                 mov     dx,[WORD PTR rndval+2]\r
296                                 mov     bx,ax\r
297                                 dec     bl\r
298                                 mov     [BYTE PTR y],bl                 // low 8 bits - 1 = y xoordinate\r
299                                 mov     bx,ax\r
300                                 mov     cx,dx\r
301                                 mov     [BYTE PTR x],ah                 // next 9 bits = x xoordinate\r
302                                 mov     [BYTE PTR x+1],dl\r
303                                 //\r
304                                 // advance to next random element\r
305                                 //\r
306                                 shr     dx,1\r
307                                 rcr     ax,1\r
308                                 jnc     noxor\r
309                                 xor     dx,0x0001\r
310                                 xor     ax,0x2000\r
311 #ifdef __BORLANDC__\r
312                         }\r
313 #endif\r
314 noxor:\r
315 #ifdef __BORLANDC__\r
316                         __asm {\r
317 #endif\r
318                                 mov     [WORD PTR rndval],ax\r
319                                 mov     [WORD PTR rndval+2],dx\r
320                         }\r
321 \r
322                         if (x>width || y>height)\r
323 //                      if ((x>width || y>height) && (x<width*2 && y<height*2))\r
324                                 continue;\r
325 //                      drawofs = source+(gvar->video.ofs.ylookup[y]) + (x>>2);\r
326                         drawofs = source+(y*gvar->video.page[0].stridew) + (x>>2);\r
327 \r
328                         //\r
329                         // copy one pixel\r
330                         //\r
331                         mask = x&3;\r
332                         VGAREADMAP(mask);\r
333                         mask = maskb[mask];\r
334                         VGAMAPMASK(mask);\r
335 \r
336                         __asm {\r
337                                 mov     di,[drawofs]\r
338                                 mov     al,[es:di]\r
339                                 add     di,[pagedelta]\r
340                                 mov     [es:di],al\r
341                         }\r
342 \r
343                         if (rndval == 1)                // entire sequence has been completed\r
344                                 return false;\r
345                 }\r
346                 frame++;\r
347 //--            while (TimeCount<frame){}//;            // don't go too fast\r
348                 delay(1);\r
349         } while (1);\r
350 #ifdef __WATCOMC__\r
351         __asm {\r
352                 mov     es,[esorig]\r
353         }\r
354         return false;\r
355 #endif\r
356 }\r
357 \r
358 //===========================================================================\r
359 \r
360 /*\r
361 ==================\r
362 =\r
363 = DebugMemory\r
364 =\r
365 ==================\r
366 */\r
367 \r
368 void DebugMemory_(global_game_variables_t *gvar, boolean q)\r
369 {\r
370         /*VW_FixRefreshBuffer ();\r
371         US_CenterWindow (16,7);\r
372 \r
373         US_CPrint ("Memory Usage");\r
374         US_CPrint ("------------");\r
375         US_Print ("Total         :");\r
376         US_PrintUnsigned (mminfo.mainmem/1024);\r
377         US_Print ("k\nFree        :");\r
378         US_PrintUnsigned (MM_UnusedMemory()/1024);\r
379         US_Print ("k\nWith purge:");\r
380         US_PrintUnsigned (MM_TotalFree()/1024);\r
381         US_Print ("k\n");\r
382         VW_UpdateScreen();*/\r
383         if(q){\r
384         printf("========================================\n");\r
385         printf("                DebugMemory_\n");\r
386         printf("========================================\n");}\r
387         if(q) { printf("Memory Usage\n");\r
388         printf("------------\n"); }else printf("        %c%c", 0xD3, 0xC4);\r
389         printf("Total:  "); if(q) printf("      "); printf("%uk", gvar->mmi.mainmem/1024);\r
390         if(q) printf("\n"); else printf("       ");\r
391         printf("Free:   "); if(q) printf("      "); printf("%uk", MM_UnusedMemory(gvar)/1024);\r
392         if(q) printf("\n"); else printf("       ");\r
393         printf("With purge:"); if(q) printf("   "); printf("%uk\n", MM_TotalFree(gvar)/1024);\r
394         if(q) printf("------------\n");\r
395 #ifdef __WATCOMC__\r
396         //IN_Ack ();\r
397 #endif\r
398 //      if(q) MM_ShowMemory (gvar);\r
399 }\r
400 \r
401 /*\r
402 ==========================\r
403 =\r
404 = ClearMemory\r
405 =\r
406 ==========================\r
407 */\r
408 \r
409 void ClearMemory (global_game_variables_t *gvar)\r
410 {\r
411 #ifdef __16_PM__\r
412         PM_UnlockMainMem(gvar);\r
413 #endif\r
414         //sd\r
415         MM_SortMem (gvar);\r
416 }\r
417 \r
418 /*\r
419 ==========================\r
420 =\r
421 = Quit\r
422 =\r
423 ==========================\r
424 */\r
425 \r
426 void Quit (global_game_variables_t *gvar, char *error)\r
427 {\r
428         //unsigned              finscreen;\r
429         memptr  screen=0;\r
430 \r
431         ClearMemory (gvar);\r
432         if (!*error)\r
433         {\r
434 // #ifndef JAPAN\r
435 //              CA_CacheGrChunk (ORDERSCREEN);\r
436 //              screen = grsegs[ORDERSCREEN];\r
437 // #endif\r
438 //              WriteConfig ();\r
439         }\r
440         else\r
441         {\r
442 //              CA_CacheGrChunk (ERRORSCREEN);\r
443 //              screen = grsegs[ERRORSCREEN];\r
444         }\r
445         Shutdown16(gvar);\r
446 \r
447         if (error && *error)\r
448         {\r
449                 //movedata((unsigned)screen,7,0xb800,0,7*160);\r
450                 gotoxy (10,4);\r
451                 fprintf(stderr, "%s\n", error);\r
452                 gotoxy (1,8);\r
453                 exit(1);\r
454         }\r
455         else\r
456         if (!error || !(*error))\r
457         {\r
458                 clrscr();\r
459 #ifndef JAPAN\r
460                 movedata ((unsigned)screen,7,0xb800,0,4000);\r
461                 gotoxy(1,24);\r
462 #endif\r
463 //asm   mov     bh,0\r
464 //asm   mov     dh,23   // row\r
465 //asm   mov     dl,0    // collumn\r
466 //asm   mov ah,2\r
467 //asm   int     0x10\r
468         }\r
469 \r
470         exit(0);\r
471 }\r
472 \r
473 //===========================================================================\r
474 \r
475 #ifndef __WATCOMC__\r
476 char global_temp_status_text[512];\r
477 char global_temp_status_text2[512];\r
478 #else\r
479 //\r
480 // for mary4 (XT)\r
481 // this is from my XT's BIOS\r
482 // http://www.phatcode.net/downloads.php?id=101\r
483 //\r
484 void turboXT(byte bakapee)\r
485 {\r
486         __asm {\r
487                 push    ax\r
488                 push    bx\r
489                 push    cx\r
490                 in      al, 61h                         //; Read equipment flags\r
491                 xor     al, bakapee                     //;   toggle speed\r
492                 out     61h, al                         //; Write new flags back\r
493 \r
494                 mov     bx, 0F89h                       //; low pitch blip\r
495                 and     al, 4                           //; Is turbo mode set?\r
496                 jz      @@do_beep\r
497                 mov     bx, 52Eh                        //; high pitch blip\r
498 \r
499         @@do_beep:\r
500                 mov     al, 10110110b           //; Timer IC 8253 square waves\r
501                 out     43h, al                         //;   channel 2, speaker\r
502                 mov     ax, bx\r
503                 out     42h, al                         //;   send low order\r
504                 mov     al, ah                          //;   load high order\r
505                 out     42h, al                         //;   send high order\r
506                 in      al, 61h                         //; Read IC 8255 machine status\r
507                 push    ax\r
508                 or      al, 00000011b\r
509                 out     61h, al                         //; Turn speaker on\r
510                 mov     cx, 2000h\r
511         @@delay:\r
512                 loop    @@delay\r
513                 pop     ax\r
514                 out     61h, al                         //; Turn speaker off\r
515                 pop     cx\r
516                 pop     bx\r
517                 pop     ax\r
518         }\r
519 }\r
520 #endif\r
521 \r
522 const char *word_to_binary(word x)\r
523 {\r
524         static char b[17];\r
525         int z;\r
526 \r
527         b[0] = '\0';\r
528         for (z = 16; z > 0; z >>= 1)\r
529         {\r
530                 strcat(b, ((x & z) == z) ? "1" : "0");\r
531         }\r
532         return b;\r
533 }\r
534 \r
535 const char *nibble_to_binary(nibble x)\r
536 {\r
537         static char b[9];\r
538         int z;\r
539 \r
540         b[0] = '\0';\r
541         for (z = 8; z > 0; z >>= 1)\r
542         {\r
543                 strcat(b, ((x & z) == z) ? "1" : "0");\r
544         }\r
545         return b;\r
546 }\r
547 \r
548 const char *boolean_to_binary(boolean x)\r
549 {\r
550         static char b[9];\r
551         int z;\r
552 \r
553         b[0] = '\0';\r
554         for (z = 1; z > 0; z >>= 1)\r
555         {\r
556                 strcat(b, ((x & z) == z) ? "1" : "0");\r
557         }\r
558         return b;\r
559 }\r
560 \r
561 void nibbletest()\r
562 {\r
563         nibble pee;\r
564         printf("nibbletest\n");\r
565         /* nibble to binary string */\r
566         for(pee=0;pee<18;pee++)\r
567                 printf("        %u %s\n", pee, nibble_to_binary(pee));\r
568         printf("        sizeof(nibble)=%s\n", nibble_to_binary(sizeof(nibble)));\r
569         printf("end of nibble test\n");\r
570 }\r
571 \r
572 void booleantest()\r
573 {\r
574         boolean pee;\r
575         printf("booleantest\n");\r
576         /* boolean to binary string */\r
577         for(pee=0;pee<4;pee++)\r
578                 printf("        %u %s\n", pee, boolean_to_binary(pee));\r
579         printf("        sizeof(boolean)=%s\n", boolean_to_binary(sizeof(boolean)));\r
580         printf("end of boolean test\n");\r
581 }\r