OSDN Git Service

-- reverted to before layer vars
[proj16/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 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 #ifdef __WATCOMC__\r
42         start_timer(gvar);\r
43 \r
44         // DOSLIB: check our environment\r
45         probe_dos();\r
46 \r
47         // DOSLIB: what CPU are we using?\r
48         // NTS: I can see from the makefile Sparky4 intends this to run on 8088 by the -0 switch in CFLAGS.\r
49         //      So this code by itself shouldn't care too much what CPU it's running on. Except that other\r
50         //      parts of this project (DOSLIB itself) rely on CPU detection to know what is appropriate for\r
51         //      the CPU to carry out tasks. --J.C.\r
52         cpu_probe();\r
53 \r
54         // DOSLIB: check for VGA\r
55         if (!probe_vga()) {\r
56                 printf("VGA probe failed\n");\r
57                 return;\r
58         }\r
59         // hardware must be VGA or higher!\r
60         if (!(vga_state.vga_flags & VGA_IS_VGA)) {\r
61                 printf("This program requires VGA or higher graphics hardware\n");\r
62                 return;\r
63         }\r
64 \r
65         if (_DEBUG_INIT() == 0) {\r
66 #ifdef DEBUGSERIAL\r
67                 //printf("WARNING: Failed to initialize DEBUG output\n");\r
68 #endif\r
69         }\r
70         _DEBUG("Serial debug output started\n"); // NTS: All serial output must end messages with newline, or DOSBox-X will not emit text to log\r
71         _DEBUGF("Serial debug output printf test %u %u %u\n",1U,2U,3U);\r
72 \r
73         textInit();\r
74 #endif\r
75         gvar->mm.mmstarted=0;\r
76         gvar->pm.PMStarted=0;\r
77         MM_Startup(gvar);\r
78 #ifdef __WATCOMC__\r
79 #ifdef __DEBUG_InputMgr__\r
80         if(!dbg_nointest)\r
81 #endif\r
82         IN_Startup(gvar);\r
83 #endif\r
84         PM_Startup(gvar);\r
85         PM_UnlockMainMem(gvar);\r
86         CA_Startup(gvar);\r
87 }\r
88 \r
89 //===========================================================================\r
90 \r
91 /*\r
92 ==========================\r
93 =\r
94 = Shutdown16\r
95 =\r
96 = Shuts down all ID_?? managers\r
97 =\r
98 ==========================\r
99 */\r
100 \r
101 void Shutdown16(global_game_variables_t *gvar)\r
102 {\r
103         PM_Shutdown(gvar);\r
104 #ifdef __WATCOMC__\r
105 #ifdef __DEBUG_InputMgr__\r
106         if(!dbg_nointest)\r
107 #endif\r
108         IN_Shutdown(gvar);\r
109 #endif\r
110         CA_Shutdown(gvar);\r
111         MM_Shutdown(gvar);\r
112         VGAmodeX(0, 1, gvar);\r
113 }\r
114 \r
115 \r
116 //===========================================================================\r
117 \r
118 /*\r
119 ====================\r
120 =\r
121 = ReadConfig\r
122 =\r
123 ====================\r
124 */\r
125 \r
126 /*void ReadConfig(void)\r
127 {\r
128         int                     file;\r
129         SDMode          sd;\r
130         SMMode          sm;\r
131         SDSMode         sds;\r
132 \r
133 \r
134         if ( (file = open(configname,O_BINARY | O_RDONLY)) != -1)\r
135         {\r
136         //\r
137         // valid config file\r
138         //\r
139                 read(file,Scores,sizeof(HighScore) * MaxScores);\r
140 \r
141                 read(file,&sd,sizeof(sd));\r
142                 read(file,&sm,sizeof(sm));\r
143                 read(file,&sds,sizeof(sds));\r
144 \r
145                 read(file,&mouseenabled,sizeof(mouseenabled));\r
146                 read(file,&joystickenabled,sizeof(joystickenabled));\r
147                 read(file,&joypadenabled,sizeof(joypadenabled));\r
148                 read(file,&joystickprogressive,sizeof(joystickprogressive));\r
149                 read(file,&joystickport,sizeof(joystickport));\r
150 \r
151                 read(file,&dirscan,sizeof(dirscan));\r
152                 read(file,&buttonscan,sizeof(buttonscan));\r
153                 read(file,&buttonmouse,sizeof(buttonmouse));\r
154                 read(file,&buttonjoy,sizeof(buttonjoy));\r
155 \r
156                 read(file,&viewsize,sizeof(viewsize));\r
157                 read(file,&mouseadjustment,sizeof(mouseadjustment));\r
158 \r
159                 close(file);\r
160 \r
161                 if (sd == sdm_AdLib && !AdLibPresent && !SoundBlasterPresent)\r
162                 {\r
163                         sd = sdm_PC;\r
164                         sd = smm_Off;\r
165                 }\r
166 \r
167                 if ((sds == sds_SoundBlaster && !SoundBlasterPresent) ||\r
168                         (sds == sds_SoundSource && !SoundSourcePresent))\r
169                         sds = sds_Off;\r
170 \r
171                 if (!MousePresent)\r
172                         mouseenabled = false;\r
173                 if (!JoysPresent[joystickport])\r
174                         joystickenabled = false;\r
175 \r
176                 MainMenu[6].active=1;\r
177                 MainItems.curpos=0;\r
178         }\r
179         else\r
180         {\r
181         //\r
182         // no config file, so select by hardware\r
183         //\r
184                 if (SoundBlasterPresent || AdLibPresent)\r
185                 {\r
186                         sd = sdm_AdLib;\r
187                         sm = smm_AdLib;\r
188                 }\r
189                 else\r
190                 {\r
191                         sd = sdm_PC;\r
192                         sm = smm_Off;\r
193                 }\r
194 \r
195                 if (SoundBlasterPresent)\r
196                         sds = sds_SoundBlaster;\r
197                 else if (SoundSourcePresent)\r
198                         sds = sds_SoundSource;\r
199                 else\r
200                         sds = sds_Off;\r
201 \r
202                 if (MousePresent)\r
203                         mouseenabled = true;\r
204 \r
205                 joystickenabled = false;\r
206                 joypadenabled = false;\r
207                 joystickport = 0;\r
208                 joystickprogressive = false;\r
209 \r
210                 viewsize = 15;\r
211                 mouseadjustment=5;\r
212         }\r
213 \r
214         SD_SetMusicMode (sm);\r
215         SD_SetSoundMode (sd);\r
216         SD_SetDigiDevice (sds);\r
217 }*/\r
218 \r
219 \r
220 /*\r
221 ====================\r
222 =\r
223 = WriteConfig\r
224 =\r
225 ====================\r
226 */\r
227 \r
228 /*void WriteConfig(void)\r
229 {\r
230         int                     file;\r
231 \r
232         file = open(configname,O_CREAT | O_BINARY | O_WRONLY,\r
233                                 S_IREAD | S_IWRITE | S_IFREG);\r
234 \r
235         if (file != -1)\r
236         {\r
237                 write(file,Scores,sizeof(HighScore) * MaxScores);\r
238 \r
239                 write(file,&SoundMode,sizeof(SoundMode));\r
240                 write(file,&MusicMode,sizeof(MusicMode));\r
241                 write(file,&DigiMode,sizeof(DigiMode));\r
242 \r
243                 write(file,&mouseenabled,sizeof(mouseenabled));\r
244                 write(file,&joystickenabled,sizeof(joystickenabled));\r
245                 write(file,&joypadenabled,sizeof(joypadenabled));\r
246                 write(file,&joystickprogressive,sizeof(joystickprogressive));\r
247                 write(file,&joystickport,sizeof(joystickport));\r
248 \r
249                 write(file,&dirscan,sizeof(dirscan));\r
250                 write(file,&buttonscan,sizeof(buttonscan));\r
251                 write(file,&buttonmouse,sizeof(buttonmouse));\r
252                 write(file,&buttonjoy,sizeof(buttonjoy));\r
253 \r
254                 write(file,&viewsize,sizeof(viewsize));\r
255                 write(file,&mouseadjustment,sizeof(mouseadjustment));\r
256 \r
257                 close(file);\r
258         }\r
259 }*/\r
260 \r
261 //===========================================================================\r
262 \r
263 /*\r
264 ==================\r
265 =\r
266 = DebugMemory\r
267 =\r
268 ==================\r
269 */\r
270 \r
271 void DebugMemory_(global_game_variables_t *gvar, boolean q)\r
272 {\r
273         /*VW_FixRefreshBuffer ();\r
274         US_CenterWindow (16,7);\r
275 \r
276         US_CPrint ("Memory Usage");\r
277         US_CPrint ("------------");\r
278         US_Print ("Total     :");\r
279         US_PrintUnsigned (mminfo.mainmem/1024);\r
280         US_Print ("k\nFree      :");\r
281         US_PrintUnsigned (MM_UnusedMemory()/1024);\r
282         US_Print ("k\nWith purge:");\r
283         US_PrintUnsigned (MM_TotalFree()/1024);\r
284         US_Print ("k\n");\r
285         VW_UpdateScreen();*/\r
286         if(q){\r
287         printf("========================================\n");\r
288         printf("                DebugMemory_\n");\r
289         printf("========================================\n");}\r
290         if(q) { printf("Memory Usage\n");\r
291         printf("------------\n"); }else printf("        %c%c", 0xD3, 0xC4);\r
292         printf("Total:  "); if(q) printf("      "); printf("%uk", gvar->mmi.mainmem/1024);\r
293         if(q) printf("\n"); else printf("       ");\r
294         printf("Free:   "); if(q) printf("      "); printf("%uk", MM_UnusedMemory(gvar)/1024);\r
295         if(q) printf("\n"); else printf("       ");\r
296         printf("With purge:"); if(q) printf("   "); printf("%uk\n", MM_TotalFree(gvar)/1024);\r
297         if(q) printf("------------\n");\r
298 #ifdef __WATCOMC__\r
299         //IN_Ack ();\r
300 #endif\r
301         if(q) MM_ShowMemory (gvar);\r
302 }\r
303 \r
304 /*\r
305 ==========================\r
306 =\r
307 = ClearMemory\r
308 =\r
309 ==========================\r
310 */\r
311 \r
312 void ClearMemory (global_game_variables_t *gvar)\r
313 {\r
314         PM_UnlockMainMem(gvar);\r
315         //snd\r
316         MM_SortMem (gvar);\r
317 }\r
318 \r
319 /*\r
320 ==========================\r
321 =\r
322 = Quit\r
323 =\r
324 ==========================\r
325 */\r
326 \r
327 void Quit (global_game_variables_t *gvar, char *error)\r
328 {\r
329         //unsigned        finscreen;\r
330         memptr  screen=0;\r
331 \r
332         ClearMemory (gvar);\r
333         if (!*error)\r
334         {\r
335 // #ifndef JAPAN\r
336 //              CA_CacheGrChunk (ORDERSCREEN);\r
337 //              screen = grsegs[ORDERSCREEN];\r
338 // #endif\r
339 //              WriteConfig ();\r
340         }\r
341         else\r
342         {\r
343 //              CA_CacheGrChunk (ERRORSCREEN);\r
344 //              screen = grsegs[ERRORSCREEN];\r
345         }\r
346         Shutdown16(gvar);\r
347 \r
348         if (error && *error)\r
349         {\r
350                 //movedata((unsigned)screen,7,0xb800,0,7*160);\r
351                 gotoxy (10,4);\r
352                 fprintf(stderr, "%s\n", error);\r
353                 gotoxy (1,8);\r
354                 exit(1);\r
355         }\r
356         else\r
357         if (!error || !(*error))\r
358         {\r
359                 clrscr();\r
360 #ifndef JAPAN\r
361                 movedata ((unsigned)screen,7,0xb800,0,4000);\r
362                 gotoxy(1,24);\r
363 #endif\r
364 //asm   mov     bh,0\r
365 //asm   mov     dh,23   // row\r
366 //asm   mov     dl,0    // collumn\r
367 //asm   mov ah,2\r
368 //asm   int     0x10\r
369         }\r
370 \r
371         exit(0);\r
372 }\r
373 \r
374 //===========================================================================\r
375 #ifndef __WATCOMC__\r
376 char global_temp_status_text[512];\r
377 char global_temp_status_text2[512];\r
378 #else\r
379 //\r
380 // for mary4 (XT)\r
381 // this is from my XT's BIOS\r
382 // http://www.phatcode.net/downloads.php?id=101\r
383 //\r
384 void turboXT(byte bakapee)\r
385 {\r
386         __asm {\r
387         push    ax\r
388         push    bx\r
389         push    cx\r
390         in      al, 61h                         //; Read equipment flags\r
391         xor     al, bakapee                     //;   toggle speed\r
392         out     61h, al                         //; Write new flags back\r
393 \r
394         mov     bx, 0F89h                       //; low pitch blip\r
395         and     al, 4                           //; Is turbo mode set?\r
396         jz      @@do_beep\r
397         mov     bx, 52Eh                        //; high pitch blip\r
398 \r
399 @@do_beep:\r
400         mov     al, 10110110b           //; Timer IC 8253 square waves\r
401         out     43h, al                         //;   channel 2, speaker\r
402         mov     ax, bx\r
403         out     42h, al                         //;   send low order\r
404         mov     al, ah                          //;   load high order\r
405         out     42h, al                         //;   send high order\r
406         in      al, 61h                         //; Read IC 8255 machine status\r
407         push    ax\r
408         or      al, 00000011b\r
409         out     61h, al                         //; Turn speaker on\r
410         mov     cx, 2000h\r
411 @@delay:\r
412         loop    @@delay\r
413         pop     ax\r
414         out     61h, al                         //; Turn speaker off\r
415         pop     cx\r
416         pop     bx\r
417         pop     ax\r
418         }\r
419 }\r
420 #endif\r
421 \r
422 const char *nibble_to_binary(nibble x)\r
423 {\r
424         static char b[9];\r
425         int z;\r
426 \r
427         b[0] = '\0';\r
428         for (z = 8; z > 0; z >>= 1)\r
429         {\r
430                 strcat(b, ((x & z) == z) ? "1" : "0");\r
431         }\r
432         return b;\r
433 }\r
434 \r
435 const char *boolean_to_binary(boolean x)\r
436 {\r
437         static char b[9];\r
438         int z;\r
439 \r
440         b[0] = '\0';\r
441         for (z = 1; z > 0; z >>= 1)\r
442         {\r
443                 strcat(b, ((x & z) == z) ? "1" : "0");\r
444         }\r
445         return b;\r
446 }\r
447 \r
448 void nibbletest()\r
449 {\r
450         nibble pee;\r
451         printf("nibbletest\n");\r
452         /* nibble to binary string */\r
453         for(pee=0;pee<18;pee++)\r
454                 printf("        %u %s\n", pee, nibble_to_binary(pee));\r
455         printf("        sizeof(nibble)=%s\n", nibble_to_binary(sizeof(nibble)));\r
456         printf("end of nibble test\n");\r
457 }\r
458 \r
459 void booleantest()\r
460 {\r
461         boolean pee;\r
462         printf("booleantest\n");\r
463         /* boolean to binary string */\r
464         for(pee=0;pee<4;pee++)\r
465                 printf("        %u %s\n", pee, boolean_to_binary(pee));\r
466         printf("        sizeof(boolean)=%s\n", boolean_to_binary(sizeof(boolean)));\r
467         printf("end of boolean test\n");\r
468 }\r