OSDN Git Service

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