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