]> 4ch.mooo.com Git - 16.git/blob - src/lib/16_tail.c
removed some junk
[16.git] / src / lib / 16_tail.c
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2018 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         StartupCAMMPM(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 }\r
53 \r
54 //===========================================================================\r
55 \r
56 /*\r
57 ==========================\r
58 =\r
59 = Shutdown16\r
60 =\r
61 = Shuts down all ID_?? managers\r
62 =\r
63 ==========================\r
64 */\r
65 \r
66 void Shutdown16 (global_game_variables_t *gvar)\r
67 {\r
68 #ifdef __WATCOMC__\r
69 #ifdef __DEBUG_InputMgr__\r
70         if(!dbg_nointest)\r
71 #endif\r
72         IN_Shutdown(gvar);\r
73 #endif\r
74         ShutdownCAMMPM(gvar);\r
75 #ifdef __WATCOMC__\r
76         if(gvar->video.VL_Started)\r
77                 VL_Shutdown (gvar);//VGAmodeX(0, 1, gvar);\r
78 #endif\r
79 }\r
80 \r
81 //===========================================================================\r
82 \r
83 /*\r
84 ==========================\r
85 =\r
86 = StartupCAMMPM\r
87 =\r
88 ==========================\r
89 */\r
90 \r
91 void StartupCAMMPM (global_game_variables_t *gvar)\r
92 {\r
93 /*\r
94         MM_Startup ();                  // so the signon screen can be freed\r
95 \r
96         SignonScreen ();\r
97 \r
98         VW_Startup ();\r
99         IN_Startup ();\r
100         PM_Startup ();\r
101         PM_UnlockMainMem ();\r
102         SD_Startup ();\r
103         CA_Startup ();\r
104         US_Startup ();\r
105 */\r
106         MM_Startup(gvar);\r
107 #ifdef __16_PM__\r
108         PM_Startup(gvar);\r
109 //????  PM_CheckMainMem(gvar);\r
110         PM_UnlockMainMem(gvar);\r
111 #endif\r
112         CA_Startup(gvar);\r
113 }\r
114 \r
115 //===========================================================================\r
116 \r
117 /*\r
118 ==========================\r
119 =\r
120 = ShutdownCAMMPM\r
121 =\r
122 ==========================\r
123 */\r
124 \r
125 void ShutdownCAMMPM (global_game_variables_t *gvar)\r
126 {\r
127 /*\r
128         US_Shutdown ();\r
129         SD_Shutdown ();\r
130         PM_Shutdown ();\r
131         IN_Shutdown ();\r
132         VW_Shutdown ();\r
133         CA_Shutdown ();\r
134         MM_Shutdown ()\r
135 */\r
136 #ifdef __16_PM__\r
137         PM_Shutdown(gvar);\r
138 #endif\r
139         CA_Shutdown(gvar);\r
140         MM_Shutdown(gvar);\r
141 }\r
142 \r
143 //===========================================================================\r
144 \r
145 ////////////////////////////////////////////////////////////////////\r
146 //\r
147 // HANDLE INTRO SCREEN (SYSTEM CONFIG)\r
148 //\r
149 ////////////////////////////////////////////////////////////////////\r
150 void MU_IntroScreen(global_game_variables_t *gvar)\r
151 {\r
152 #define MAINCOLOR       0x6c\r
153 #define EMSCOLOR        0x6c\r
154 #define XMSCOLOR        0x6c\r
155 \r
156 #define FILLCOLOR       14\r
157 \r
158         long memory,emshere,xmshere;\r
159         int i,num,ems[10]={100,200,300,400,500,600,700,800,900,1000},\r
160                 xms[10]={100,200,300,400,500,600,700,800,900,1000},\r
161                 main[10]={32,64,96,128,160,192,224,256,288,320};\r
162 \r
163         gvar->video.print.t=1;\r
164         gvar->video.print.tlsw=1;\r
165         gvar->video.print.bgcolor=8;\r
166         gvar->video.print.color=5;\r
167 \r
168         //\r
169         // DRAW MAIN MEMORY\r
170         //\r
171         num=32;\r
172         gvar->video.print.x=49-32;\r
173 \r
174         memory=(1023l+gvar->mmi.nearheap+gvar->mmi.farheap)/1024l;\r
175         for (i=0;i<10;i++)\r
176                 if (memory>=main[i])\r
177                 {\r
178                         gvar->video.print.y=163-8*i;\r
179                         sprintf(global_temp_status_text, "% 4u", num); VL_print(global_temp_status_text, 0, gvar);\r
180                         VL_Bar(49,163-8*i,6,5,MAINCOLOR-i,gvar);\r
181                         num+=32;\r
182                 }\r
183         gvar->video.print.y=171;\r
184         VL_print("MAIN", 0, gvar);\r
185 \r
186 \r
187         //\r
188         // DRAW EMS MEMORY\r
189         //\r
190         if (gvar->pm.emm.EMSPresent)\r
191         {\r
192                 num=100;\r
193                 gvar->video.print.x=89-32;\r
194 \r
195                 emshere=4l*gvar->pm.emm.EMSPagesAvail;\r
196                 for (i=0;i<10;i++)\r
197                         if (emshere>=ems[i])\r
198                         {\r
199                                 gvar->video.print.y=163-8*i;\r
200                                 sprintf(global_temp_status_text, "% 4u", num); VL_print(global_temp_status_text, 0, gvar);\r
201                                 VL_Bar(89,163-8*i,6,5,EMSCOLOR-i,gvar);\r
202                                 num+=100;\r
203                         }\r
204                 gvar->video.print.y=171;\r
205                 VL_print(" EMS", 0, gvar);\r
206         }\r
207 \r
208         //\r
209         // DRAW XMS MEMORY\r
210         //\r
211         if (gvar->pm.xmm.XMSPresent)\r
212         {\r
213                 num=100;\r
214                 gvar->video.print.x=129-32;\r
215 \r
216                 xmshere=4l*gvar->pm.xmm.XMSPagesAvail;\r
217                 for (i=0;i<10;i++)\r
218                         if (xmshere>=xms[i])\r
219                         {\r
220                                 gvar->video.print.y=163-8*i;\r
221                                 sprintf(global_temp_status_text, "% 4u", num); VL_print(global_temp_status_text, 0, gvar);\r
222                                 VL_Bar(129,163-8*i,6,5,XMSCOLOR-i,gvar);\r
223                                 num+=100;\r
224                         }\r
225                 gvar->video.print.y=171;\r
226                 VL_print(" XMS", 0, gvar);\r
227         }\r
228 \r
229         //\r
230         // FILL BOXES\r
231         //\r
232         if (gvar->in.MousePresent)\r
233                 VL_Bar(164,82,12,2,FILLCOLOR,gvar);\r
234 \r
235         if (gvar->in.JoysPresent[0] || gvar->in.JoysPresent[1])\r
236                 VL_Bar(164,105,12,2,FILLCOLOR,gvar);\r
237 \r
238 //++++  if (gvar->sd.AdLibPresent)//SB && !SoundBlasterPresent)\r
239 //++++          VL_Bar(164,128,12,2,FILLCOLOR,gvar);\r
240 \r
241 //SB    if (SoundBlasterPresent)\r
242 //SB            VL_Bar(164,151,12,2,FILLCOLOR,gvar);\r
243 \r
244 //SS    if (SoundSourcePresent)\r
245 //SS            VL_Bar(164,174,12,2,FILLCOLOR,gvar);\r
246         IN_Ack (gvar);\r
247 }\r
248 \r
249 //===========================================================================\r
250 \r
251 /*\r
252 ====================\r
253 =\r
254 = ReadConfig\r
255 =\r
256 ====================\r
257 */\r
258 #if 0\r
259 void ReadConfig(void)\r
260 {\r
261         int                                      file;\r
262 //      SDMode            sd;\r
263 //      SMMode            sm;\r
264 //      SDSMode          sds;\r
265 \r
266 \r
267         if ( (file = open(CONFIGNAME,O_BINARY | O_RDONLY)) != -1)\r
268         {\r
269         //\r
270         // valid config file\r
271         //\r
272 //              read(file,Scores,sizeof(HighScore) * MaxScores);\r
273 \r
274 //              read(file,&sd,sizeof(sd));\r
275 //              read(file,&sm,sizeof(sm));\r
276 //              read(file,&sds,sizeof(sds));\r
277 \r
278                 read(file,&mouseenabled,sizeof(mouseenabled));\r
279                 read(file,&joystickenabled,sizeof(joystickenabled));\r
280                 read(file,&joystickprogressive,sizeof(joystickprogressive));\r
281                 read(file,&joystickport,sizeof(joystickport));\r
282 \r
283                 read(file,&dirscan,sizeof(dirscan));\r
284                 read(file,&buttonscan,sizeof(buttonscan));\r
285                 read(file,&buttonmouse,sizeof(buttonmouse));\r
286                 read(file,&buttonjoy,sizeof(buttonjoy));\r
287 \r
288                 read(file,&viewsize,sizeof(viewsize));\r
289                 read(file,&mouseadjustment,sizeof(mouseadjustment));\r
290 \r
291                 close(file);\r
292 \r
293                 /*if (sd == sdm_AdLib && !AdLibPresent && !SoundBlasterPresent)\r
294                 {\r
295                         sd = sdm_PC;\r
296                         sd = smm_Off;\r
297                 }\r
298 \r
299                 if ((sds == sds_SoundBlaster && !SoundBlasterPresent) ||\r
300                         (sds == sds_SoundSource && !SoundSourcePresent))\r
301                         sds = sds_Off;*/\r
302 \r
303                 if (!MousePresent)\r
304                         mouseenabled = false;\r
305                 if (!JoysPresent[joystickport])\r
306                         joystickenabled = false;\r
307 \r
308                 MainMenu[6].active=1;\r
309                 MainItems.curpos=0;\r
310         }\r
311         else\r
312         {\r
313         //\r
314         // no config file, so select by hardware\r
315         //\r
316 /*              if (SoundBlasterPresent || AdLibPresent)\r
317                 {\r
318                         sd = sdm_AdLib;\r
319                         sm = smm_AdLib;\r
320                 }\r
321                 else\r
322                 {\r
323                         sd = sdm_PC;\r
324                         sm = smm_Off;\r
325                 }\r
326 \r
327                 if (SoundBlasterPresent)\r
328                         sds = sds_SoundBlaster;\r
329                 else if (SoundSourcePresent)\r
330                         sds = sds_SoundSource;\r
331                 else\r
332                         sds = sds_Off;*/\r
333 \r
334                 if (MousePresent)\r
335                         mouseenabled = true;\r
336 \r
337                 joystickenabled = false;\r
338                 joystickport = 0;\r
339                 joystickprogressive = false;\r
340 \r
341                 viewsize = 15;\r
342                 mouseadjustment=5;\r
343         }\r
344 \r
345         SD_SetMusicMode (sm);\r
346         SD_SetSoundMode (sd);\r
347         SD_SetDigiDevice (sds);\r
348 }\r
349 \r
350 \r
351 /*\r
352 ====================\r
353 =\r
354 = WriteConfig\r
355 =\r
356 ====================\r
357 */\r
358 \r
359 void WriteConfig(void)\r
360 {\r
361         int                                      file;\r
362 \r
363         file = open(CONFIGNAME,O_CREAT | O_BINARY | O_WRONLY,\r
364                                 S_IREAD | S_IWRITE | S_IFREG);\r
365 \r
366         if (file != -1)\r
367         {\r
368 //              write(file,Scores,sizeof(HighScore) * MaxScores);\r
369 \r
370 //              write(file,&SoundMode,sizeof(SoundMode));\r
371 //              write(file,&MusicMode,sizeof(MusicMode));\r
372 //              write(file,&DigiMode,sizeof(DigiMode));\r
373 \r
374                 write(file,&mouseenabled,sizeof(mouseenabled));\r
375                 write(file,&joystickenabled,sizeof(joystickenabled));\r
376                 write(file,&joystickprogressive,sizeof(joystickprogressive));\r
377                 write(file,&joystickport,sizeof(joystickport));\r
378 \r
379                 write(file,&dirscan,sizeof(dirscan));\r
380                 write(file,&buttonscan,sizeof(buttonscan));\r
381                 write(file,&buttonmouse,sizeof(buttonmouse));\r
382                 write(file,&buttonjoy,sizeof(buttonjoy));\r
383 \r
384 //              write(file,&viewsize,sizeof(viewsize));\r
385                 write(file,&mouseadjustment,sizeof(mouseadjustment));\r
386 \r
387                 close(file);\r
388         }\r
389 }\r
390 #endif\r
391 //===========================================================================\r
392 \r
393 /*\r
394 ===================\r
395 =\r
396 = FizzleFade\r
397 =\r
398 ===================\r
399 */\r
400 \r
401 boolean FizzleFade (unsigned source, unsigned dest, unsigned width, unsigned height, unsigned frames, boolean abortable, global_game_variables_t *gvar)\r
402 {\r
403         word            p,pixperframe;\r
404         unsigned        drawofs,pagedelta;\r
405         byte            mask,maskb[8] = {1,2,4,8};\r
406         unsigned        x,y,frame;\r
407         long            rndval;\r
408         word            screenseg;\r
409 #ifdef __WATCOMC__\r
410         unsigned        esorig;//,q;\r
411 #endif\r
412 \r
413         pagedelta = dest-source;\r
414         rndval = 1;\r
415 #ifdef __WATCOMC__\r
416         esorig = 0;// q = 16;\r
417 #endif\r
418         x = y = 0;\r
419         pixperframe = (dword)(gvar->video.page[0].width*gvar->video.page[0].height)/frames;\r
420         screenseg = SCREENSEG;\r
421 \r
422         IN_StartAck (gvar);\r
423 \r
424 //      modexClearRegion(&(gvar->video.page[0]), 0, 0, gvar->video.page[0].width, gvar->video.page[0].height, 0);\r
425 //      modexClearRegion(&(gvar->video.page[1]), 0, 0, gvar->video.page[0].width, gvar->video.page[0].height, 15);\r
426 \r
427 #ifdef __WATCOMC__\r
428         __asm {\r
429                 mov     [esorig],es\r
430         }\r
431 #endif\r
432 //      TimeCount=\r
433         frame=0;\r
434         do      // while (1)\r
435         {\r
436                 if (abortable && IN_CheckAck (gvar) )\r
437                         return true;\r
438 \r
439                 __asm {\r
440                         mov     es,[screenseg]\r
441                 }\r
442 \r
443                 for (p=0;p<pixperframe;p++)\r
444                 {\r
445                         __asm {\r
446                                 //\r
447                                 // seperate random value into x/y pair\r
448                                 //\r
449                                 mov     ax,[WORD PTR rndval]\r
450                                 mov     dx,[WORD PTR rndval+2]\r
451                                 mov     bx,ax\r
452                                 dec     bl\r
453                                 mov     [BYTE PTR y],bl                 // low 8 bits - 1 = y xoordinate\r
454                                 mov     bx,ax\r
455                                 mov     cx,dx\r
456                                 mov     [BYTE PTR x],ah                 // next 9 bits = x xoordinate\r
457                                 mov     [BYTE PTR x+1],dl\r
458                                 //\r
459                                 // advance to next random element\r
460                                 //\r
461                                 shr     dx,1\r
462                                 rcr     ax,1\r
463                                 jnc     noxor\r
464                                 xor     dx,0x0001\r
465                                 xor     ax,0x2000\r
466 #ifdef __BORLANDC__\r
467                         }\r
468 #endif\r
469 noxor:\r
470 #ifdef __BORLANDC__\r
471                         __asm {\r
472 #endif\r
473                                 mov     [WORD PTR rndval],ax\r
474                                 mov     [WORD PTR rndval+2],dx\r
475                         }\r
476 \r
477                         if (x>width || y>height)\r
478 //                      if ((x>width || y>height) && (x<width*2 && y<height*2))\r
479                                 continue;\r
480 //                      drawofs = source+(gvar->video.ofs.ylookup[y]) + (x>>2);\r
481                         drawofs = source+(y*gvar->video.page[0].stridew) + (x>>2);\r
482 \r
483                         //\r
484                         // copy one pixel\r
485                         //\r
486                         mask = x&3;\r
487                         VGAREADMAP(mask);\r
488                         mask = maskb[mask];\r
489                         VGAMAPMASK(mask);\r
490 \r
491                         __asm {\r
492                                 mov     di,[drawofs]\r
493                                 mov     al,[es:di]\r
494                                 add     di,[pagedelta]\r
495                                 mov     [es:di],al\r
496                         }\r
497 \r
498                         if (rndval == 1)                // entire sequence has been completed\r
499                                 return false;\r
500                 }\r
501                 frame++;\r
502 //--            while (TimeCount<frame){}//;            // don't go too fast\r
503                 delay(1);\r
504         } while (1);\r
505 #ifdef __WATCOMC__\r
506         __asm {\r
507                 mov     es,[esorig]\r
508         }\r
509         return false;\r
510 #endif\r
511 }\r
512 \r
513 //===========================================================================\r
514 \r
515 /*\r
516 ==================\r
517 =\r
518 = DebugMemory\r
519 =\r
520 ==================\r
521 */\r
522 \r
523 void DebugMemory_(global_game_variables_t *gvar, boolean q)\r
524 {\r
525         /*VW_FixRefreshBuffer ();\r
526         US_CenterWindow (16,7);\r
527 \r
528         US_CPrint ("Memory Usage");\r
529         US_CPrint ("------------");\r
530         US_Print ("Total         :");\r
531         US_PrintUnsigned (mminfo.mainmem/1024);\r
532         US_Print ("k\nFree        :");\r
533         US_PrintUnsigned (MM_UnusedMemory()/1024);\r
534         US_Print ("k\nWith purge:");\r
535         US_PrintUnsigned (MM_TotalFree()/1024);\r
536         US_Print ("k\n");\r
537         VW_UpdateScreen();*/\r
538         if(q){\r
539         printf("========================================\n");\r
540         printf("                DebugMemory_\n");\r
541         printf("========================================\n");}\r
542         if(q) { printf("Memory Usage\n");\r
543         printf("------------\n"); }else printf("        %c%c", 0xD3, 0xC4);\r
544         printf("Total:  "); if(q) printf("      "); printf("%uk", gvar->mmi.mainmem/1024);\r
545         if(q) printf("\n"); else printf("       ");\r
546         printf("Free:   "); if(q) printf("      "); printf("%uk", MM_UnusedMemory(gvar)/1024);\r
547         if(q) printf("\n"); else printf("       ");\r
548         printf("With purge:"); if(q) printf("   "); printf("%uk\n", MM_TotalFree(gvar)/1024);\r
549         if(q) printf("------------\n");\r
550 #ifdef __WATCOMC__\r
551         //IN_Ack ();\r
552 #endif\r
553 //      if(q) MM_ShowMemory (gvar);\r
554 }\r
555 \r
556 /*\r
557 ===================\r
558 =\r
559 = TestSprites\r
560 =\r
561 ===================\r
562 */\r
563 \r
564 #if 0\r
565 #define DISPWIDTH       110\r
566 #define TEXTWIDTH   40\r
567 void TestSprites(void)\r
568 {\r
569         int hx,hy,sprite,oldsprite,bottomy,topx,shift;\r
570         spritetabletype far *spr;\r
571         spritetype _seg *block;\r
572         unsigned        mem,scan;\r
573 \r
574 \r
575         VW_FixRefreshBuffer ();\r
576         US_CenterWindow (30,17);\r
577 \r
578         US_CPrint ("Sprite Test");\r
579         US_CPrint ("-----------");\r
580 \r
581         hy=PrintY;\r
582         hx=(PrintX+56)&(~7);\r
583         topx = hx+TEXTWIDTH;\r
584 \r
585         US_Print ("Chunk:\nWidth:\nHeight:\nOrgx:\nOrgy:\nXl:\nYl:\nXh:\nYh:\n"\r
586                           "Shifts:\nMem:\n");\r
587 \r
588         bottomy = PrintY;\r
589 \r
590         sprite = STARTSPRITES;\r
591         shift = 0;\r
592 \r
593         do\r
594         {\r
595                 if (sprite>=STARTTILE8)\r
596                         sprite = STARTTILE8-1;\r
597                 else if (sprite<STARTSPRITES)\r
598                         sprite = STARTSPRITES;\r
599 \r
600                 spr = &spritetable[sprite-STARTSPRITES];\r
601                 block = (spritetype _seg *)grsegs[sprite];\r
602 \r
603                 VL_Bar (hx,hy,TEXTWIDTH,bottomy-hy,WHITE);\r
604 \r
605                 PrintX=hx;\r
606                 PrintY=hy;\r
607                 US_PrintUnsigned (sprite);US_Print ("\n");PrintX=hx;\r
608                 US_PrintUnsigned (spr->width);US_Print ("\n");PrintX=hx;\r
609                 US_PrintUnsigned (spr->height);US_Print ("\n");PrintX=hx;\r
610                 US_PrintSigned (spr->orgx);US_Print ("\n");PrintX=hx;\r
611                 US_PrintSigned (spr->orgy);US_Print ("\n");PrintX=hx;\r
612                 US_PrintSigned (spr->xl);US_Print ("\n");PrintX=hx;\r
613                 US_PrintSigned (spr->yl);US_Print ("\n");PrintX=hx;\r
614                 US_PrintSigned (spr->xh);US_Print ("\n");PrintX=hx;\r
615                 US_PrintSigned (spr->yh);US_Print ("\n");PrintX=hx;\r
616                 US_PrintSigned (spr->shifts);US_Print ("\n");PrintX=hx;\r
617                 if (!block)\r
618                 {\r
619                         US_Print ("-----");\r
620                 }\r
621                 else\r
622                 {\r
623                         mem = block->sourceoffset[3]+5*block->planesize[3];\r
624                         mem = (mem+15)&(~15);           // round to paragraphs\r
625                         US_PrintUnsigned (mem);\r
626                 }\r
627 \r
628                 oldsprite = sprite;\r
629                 do\r
630                 {\r
631                 //\r
632                 // draw the current shift, then wait for key\r
633                 //\r
634                         VL_Bar(topx,hy,DISPWIDTH,bottomy-hy,WHITE);\r
635                         if (block)\r
636                         {\r
637                                 PrintX = topx;\r
638                                 PrintY = hy;\r
639                                 US_Print ("Shift:");\r
640                                 US_PrintUnsigned (shift);\r
641                                 US_Print ("\n");\r
642                                 VWB_DrawSprite (topx+16+shift*2,PrintY,sprite);\r
643                         }\r
644 \r
645                         VW_UpdateScreen();\r
646 \r
647                         scan = IN_WaitForKey ();\r
648 \r
649                         switch (scan)\r
650                         {\r
651                         case sc_UpArrow:\r
652                                 sprite++;\r
653                                 break;\r
654                         case sc_DownArrow:\r
655                                 sprite--;\r
656                                 break;\r
657                         case sc_LeftArrow:\r
658                                 if (--shift == -1)\r
659                                         shift = 3;\r
660                                 break;\r
661                         case sc_RightArrow:\r
662                                 if (++shift == 4)\r
663                                         shift = 0;\r
664                                 break;\r
665                         case sc_Escape:\r
666                                 return;\r
667                         }\r
668 \r
669                 } while (sprite == oldsprite);\r
670 \r
671   } while (1);\r
672 \r
673 \r
674 }\r
675 \r
676 #endif\r
677 \r
678 /*\r
679 ==========================\r
680 =\r
681 = ClearMemory\r
682 =\r
683 ==========================\r
684 */\r
685 \r
686 void ClearMemory (global_game_variables_t *gvar)\r
687 {\r
688 #ifdef __16_PM__\r
689         PM_UnlockMainMem(gvar);\r
690 #endif\r
691         //sd\r
692         MM_SortMem (gvar);\r
693 }\r
694 \r
695 /*\r
696 ==========================\r
697 =\r
698 = Quit\r
699 =\r
700 ==========================\r
701 */\r
702 \r
703 void Quit (global_game_variables_t *gvar, char *error)\r
704 {\r
705         //unsigned              finscreen;\r
706         memptr  screen=0;\r
707 \r
708         ClearMemory (gvar);\r
709         if (!*error)\r
710         {\r
711 // #ifndef JAPAN\r
712 //              CA_CacheGrChunk (ORDERSCREEN);\r
713 //              screen = grsegs[ORDERSCREEN];\r
714 // #endif\r
715 //              WriteConfig ();\r
716         }\r
717         else\r
718         {\r
719 //              CA_CacheGrChunk (ERRORSCREEN);\r
720 //              screen = grsegs[ERRORSCREEN];\r
721         }\r
722         Shutdown16(gvar);\r
723 \r
724         if (error && *error)\r
725         {\r
726                 //movedata((unsigned)screen,7,0xb800,0,7*160);\r
727                 gotoxy (10,4);\r
728                 fprintf(stderr, "%s\n", error);\r
729                 gotoxy (1,8);\r
730                 exit(1);\r
731         }\r
732         else\r
733         if (!error || !(*error))\r
734         {\r
735                 clrscr();\r
736 #ifndef JAPAN\r
737                 movedata ((unsigned)screen,7,0xb800,0,4000);\r
738                 gotoxy(1,24);\r
739 #endif\r
740 //asm   mov     bh,0\r
741 //asm   mov     dh,23   // row\r
742 //asm   mov     dl,0    // collumn\r
743 //asm   mov ah,2\r
744 //asm   int     0x10\r
745         }\r
746 \r
747         exit(0);\r
748 }\r
749 \r
750 //===========================================================================\r
751 \r
752 #ifdef __WATCOMC__\r
753 //\r
754 // for mary4 (XT)\r
755 // this is from my XT's BIOS\r
756 // http://www.phatcode.net/downloads.php?id=101\r
757 //\r
758 void turboXT(byte bakapee)\r
759 {\r
760         __asm {\r
761                 push    ax\r
762                 push    bx\r
763                 push    cx\r
764                 in      al, 61h                         //; Read equipment flags\r
765                 xor     al, bakapee                     //;   toggle speed\r
766                 out     61h, al                         //; Write new flags back\r
767 \r
768                 mov     bx, 0F89h                       //; low pitch blip\r
769                 and     al, 4                           //; Is turbo mode set?\r
770                 jz      @@do_beep\r
771                 mov     bx, 52Eh                        //; high pitch blip\r
772 \r
773         @@do_beep:\r
774                 mov     al, 10110110b           //; Timer IC 8253 square waves\r
775                 out     43h, al                         //;   channel 2, speaker\r
776                 mov     ax, bx\r
777                 out     42h, al                         //;   send low order\r
778                 mov     al, ah                          //;   load high order\r
779                 out     42h, al                         //;   send high order\r
780                 in      al, 61h                         //; Read IC 8255 machine status\r
781                 push    ax\r
782                 or      al, 00000011b\r
783                 out     61h, al                         //; Turn speaker on\r
784                 mov     cx, 2000h\r
785         @@delay:\r
786                 loop    @@delay\r
787                 pop     ax\r
788                 out     61h, al                         //; Turn speaker off\r
789                 pop     cx\r
790                 pop     bx\r
791                 pop     ax\r
792         }\r
793 }\r
794 #endif\r