Project

General

Profile

#include "menu.h"

#include "joystick.h"
#include "printf.h"
#include "pause.h"

void clearscreen(); // TODO: header
void actions();
extern int debug_pos;
extern int debug_adjust;
extern unsigned char sd_present;

void memcp8(char const volatile * from, char volatile * to, int offset, int len);
void memset8(void * address, int value, int length);

#ifndef LINUX_BUILD
void *memcpy(void *dest, const void *src, int n)
{
memcp8(src,dest,0,n);
return dest;
}

void *memset(void * s, int constant, int size)
{
memset8(s,constant,size);
return s;
}
#endif

int display_menu(char const * title, struct MenuEntry * entries, menuPress hotkeys, void * menuData)
{
struct joystick_status joy;
joy.x_ = joy.y_ = joy.fire_ = joy.escape_ = 0;

int row = 0;

int res = 0;

int done = 0;
for (;!done;)
{
// Render
clearscreen();
debug_pos = 0;
debug_adjust = 0;

printf((char *)title);

struct MenuEntry * entry = entries;
debug_pos = 80;
int entryRow = 0;
int debug_pos_next = 80;
BOOL has_action = 0;
for (;;)
{
has_action = entry->actionFunction || entry->flags&MENU_FLAG_EXIT;
debug_adjust = (has_action && row==entryRow) ? 128 : 0;
debug_pos_next = debug_pos+40;
if (entry->displayFunction)
entry->displayFunction(menuData, entry->userData);
else if (entry->txt)
printf(entry->txt);
if (entry->flags&MENU_FLAG_SD && !sd_present)
printf("(No SD)");
debug_pos = debug_pos_next;

if (has_action)
entryRow = entryRow+1;

if (entry->flags&MENU_FLAG_FINAL)
break;

entry = entry + 1;
}

// Slow it down a bit
wait_us(100000);

// move
joystick_wait(&joy,WAIT_QUIET);
joystick_wait(&joy,WAIT_EITHER);
if (joy.escape_) break;
if (joy.keyPressed_ > 0 && hotkeys)
{
hotkeys(menuData, joy.keyPressed_);
}

row+=joy.y_;
if (row<0) row = 0;
if (row>=entryRow) row = entryRow-1;

actions();

entry = entries;
entryRow = 0;
for (;;)
{
has_action = entry->actionFunction || entry->flags&MENU_FLAG_EXIT;
if (has_action)
{
if (entryRow == row)
{
if (joy.fire_ && entry->flags&MENU_FLAG_EXIT)
{
done = 1;
}

if (entry->actionFunction)
{
if (entry->flags&MENU_FLAG_SD && !sd_present)
{}
else if ((entry->flags&MENU_FLAG_LEFT && joy.x_<0) || (entry->flags&MENU_FLAG_RIGHT && joy.x_>0) || (entry->flags&MENU_FLAG_FIRE && joy.fire_) || (entry->flags&MENU_FLAG_KEYPRESS && joy.keyPressed_!=0))
if (entry->actionFunction(menuData, &joy, entry->userData))
if (entry->flags&MENU_FLAG_MAYEXIT)
{
res = 1;
done = 1;
}
}

break;
}
entryRow = entryRow+1;
}

if (entry->flags&MENU_FLAG_FINAL)
break;

entry = entry + 1;
}
}
return res;
}

(28-28/46)