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