123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- #include <stdio.h>
- #include <conio.h>
- #include <mem.h>
- #include <dos.h>
- #include "main.h"
- item_t *current;
- menu_t *currentmenu;
- int curitem; // current item #
- char inv_attrib; // inversion attribute
- char buffer[160]; // save the entire screen line!
- short menukey; // globally set after GetMenuInput()
- //
- // Make a sound!
- //
- void Sound(int freq, int dly)
- {
- sound(freq);
- delay(dly);
- nosound();
- }
- //
- // Draw a dot if "value" is > 0 at item->x - 3
- //
- void SetMark(item_t *item,int value)
- {
- char far *screen;
- screen = MK_FP(0xb800,item->y*160 + (item->x-3)*2);
- *screen = ' ';
- if (value)
- *screen = 7;
- }
- //
- // Invert the menu item
- //
- void Invert(item_t *item)
- {
- char far *screen;
- int i;
- movedata(0xb800,item->y*160,FP_SEG(&buffer),FP_OFF(&buffer),160);
- screen = MK_FP(0xb800,item->y*160 + item->x*2);
- for (i = 0; i < item->w; i++)
- {
- *(screen+1) = inv_attrib;
- screen += 2;
- }
- }
- //
- // Restore the screen line (uninvert)
- //
- void UnInvert(item_t *item)
- {
- movedata(FP_SEG(&buffer),FP_OFF(&buffer),0xb800,item->y*160,160);
- }
- //
- // Set "current" to first menu item
- //
- void SetupMenu(menu_t *menu)
- {
- currentmenu = menu;
- current = menu->items;
- current += menu->startitem;
- curitem = menu->startitem;
- inv_attrib = menu->invert;
- Invert(current);
- }
- //
- // Get menu input for current menu
- // Exit: -1 = ESC was pressed, xx = item id
- //
- int GetMenuInput(void)
- {
- char c;
- while(1)
- {
- c = getch();
- // gotoxy(1,2);
- // printf("char:%x ",c);
- switch(c)
- {
- case 0x48: // UP
- if (!curitem)
- break;
- UnInvert(current);
- if (curitem->up)
- {
- curitem = curitem->up;
- current = currentmenu->items + curitem;
- }
- else
- {
- curitem--;
- current--;
- }
- Invert(current);
- Sound(50,10);
- break;
- case 0x50: // DOWN
- if (curitem == currentmenu->maxitems - 1)
- break;
- UnInvert(current);
- if (curitem->down)
- {
- curitem = curitem->down;
- current = currentmenu->items + curitem;
- }
- else
- {
- curitem++;
- current++;
- }
- Invert(current);
- Sound(50,10);
- break;
- case 0x4b: // LEFT
- if (current->left != -1)
- {
- UnInvert(current);
- curitem = current->left;
- current = currentmenu->items+curitem;
- Invert(current);
- Sound(50,10);
- }
- break;
- case 0x4d: // RIGHT
- if (current->right != -1)
- {
- UnInvert(current);
- curitem = current->right;
- current = currentmenu->items+curitem;
- Invert(current);
- Sound(50,10);
- }
- break;
- case 0x44: // F10
- case 0x3b: // F1
- case 0x3c: // F2
- UnInvert(current);
- menukey = c;
- currentmenu->startitem = curitem;
- Sound(50,10);
- return current->id;
- case 0x0d: // ENTER
- UnInvert(current);
- menukey = c;
- currentmenu->startitem = curitem;
- Sound(2000,10);
- return current->id;
- case 0x1b: // ESC
- UnInvert(current);
- menukey = c;
- Sound(3000,10);
- return -1;
- }
- }
- }
|