MENU.C 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <mem.h>
  4. #include <dos.h>
  5. #include "main.h"
  6. item_t *current;
  7. menu_t *currentmenu;
  8. int curitem; // current item #
  9. char inv_attrib; // inversion attribute
  10. char buffer[160]; // save the entire screen line!
  11. short menukey; // globally set after GetMenuInput()
  12. //
  13. // Make a sound!
  14. //
  15. void Sound(int freq, int dly)
  16. {
  17. sound(freq);
  18. delay(dly);
  19. nosound();
  20. }
  21. //
  22. // Draw a dot if "value" is > 0 at item->x - 3
  23. //
  24. void SetMark(item_t *item,int value)
  25. {
  26. char far *screen;
  27. screen = MK_FP(0xb800,item->y*160 + (item->x-3)*2);
  28. *screen = ' ';
  29. if (value)
  30. *screen = 7;
  31. }
  32. //
  33. // Invert the menu item
  34. //
  35. void Invert(item_t *item)
  36. {
  37. char far *screen;
  38. int i;
  39. movedata(0xb800,item->y*160,FP_SEG(&buffer),FP_OFF(&buffer),160);
  40. screen = MK_FP(0xb800,item->y*160 + item->x*2);
  41. for (i = 0; i < item->w; i++)
  42. {
  43. *(screen+1) = inv_attrib;
  44. screen += 2;
  45. }
  46. }
  47. //
  48. // Restore the screen line (uninvert)
  49. //
  50. void UnInvert(item_t *item)
  51. {
  52. movedata(FP_SEG(&buffer),FP_OFF(&buffer),0xb800,item->y*160,160);
  53. }
  54. //
  55. // Set "current" to first menu item
  56. //
  57. void SetupMenu(menu_t *menu)
  58. {
  59. currentmenu = menu;
  60. current = menu->items;
  61. current += menu->startitem;
  62. curitem = menu->startitem;
  63. inv_attrib = menu->invert;
  64. Invert(current);
  65. }
  66. //
  67. // Get menu input for current menu
  68. // Exit: -1 = ESC was pressed, xx = item id
  69. //
  70. int GetMenuInput(void)
  71. {
  72. char c;
  73. while(1)
  74. {
  75. c = getch();
  76. // gotoxy(1,2);
  77. // printf("char:%x ",c);
  78. switch(c)
  79. {
  80. case 0x48: // UP
  81. if (!curitem)
  82. break;
  83. UnInvert(current);
  84. if (current->up)
  85. {
  86. curitem = current->up;
  87. current = currentmenu->items + curitem;
  88. }
  89. else
  90. {
  91. curitem--;
  92. current--;
  93. }
  94. Invert(current);
  95. Sound(50,10);
  96. break;
  97. case 0x50: // DOWN
  98. if (curitem == currentmenu->maxitems - 1)
  99. break;
  100. UnInvert(current);
  101. if (current->down)
  102. {
  103. curitem = current->down;
  104. current = currentmenu->items + curitem;
  105. }
  106. else
  107. {
  108. curitem++;
  109. current++;
  110. }
  111. Invert(current);
  112. Sound(50,10);
  113. break;
  114. case 0x4b: // LEFT
  115. if (current->left != -1)
  116. {
  117. UnInvert(current);
  118. curitem = current->left;
  119. current = currentmenu->items+curitem;
  120. Invert(current);
  121. Sound(50,10);
  122. }
  123. break;
  124. case 0x4d: // RIGHT
  125. if (current->right != -1)
  126. {
  127. UnInvert(current);
  128. curitem = current->right;
  129. current = currentmenu->items+curitem;
  130. Invert(current);
  131. Sound(50,10);
  132. }
  133. break;
  134. case 0x44: // F10
  135. case 0x3b: // F1
  136. case 0x3c: // F2
  137. UnInvert(current);
  138. menukey = c;
  139. currentmenu->startitem = curitem;
  140. Sound(50,10);
  141. return current->id;
  142. case 0x0d: // ENTER
  143. UnInvert(current);
  144. menukey = c;
  145. currentmenu->startitem = curitem;
  146. Sound(2000,10);
  147. return current->id;
  148. case 0x1b: // ESC
  149. UnInvert(current);
  150. menukey = c;
  151. Sound(3000,10);
  152. return -1;
  153. }
  154. }
  155. }