repo2/firmware_eclairexl/mist/mainmenu.c
1316 | markw | #include "main.h" //!!!
|
|
#include "atari_drive_emulator.h"
|
|||
#include "log.h"
|
|||
#include "utils.h"
|
|||
#include "sd_direct/spi.h"
|
|||
#include "printf.h"
|
|||
#include "menu.h"
|
|||
unsigned char freezer_rom_present;
|
|||
unsigned char sd_present;
|
|||
unsigned char sel_profile;
|
|||
unsigned char sd_mounted;
|
|||
void mainmenu()
|
|||
{
|
|||
int i;
|
|||
*atari_colbk = 0xb8;
|
|||
*atari_colbk = 0x38;
|
|||
freezer_rom_present = 0;
|
|||
sd_mounted = 0;
|
|||
for (i=0; i!=NUM_FILES; ++i)
|
|||
{
|
|||
file_init(files[i]);
|
|||
}
|
|||
sel_profile = 1;
|
|||
init_drive_emulator();
|
|||
reboot(1);
|
|||
run_drive_emulator();
|
|||
}
|
|||
#ifdef DEBUG_SUPPORT
|
|||
struct EditNumberState
|
|||
{
|
|||
unsigned char col;
|
|||
unsigned char mask;
|
|||
unsigned char defaultShift;
|
|||
};
|
|||
struct DebugMenuData
|
|||
{
|
|||
struct EditNumberState state[2];
|
|||
};
|
|||
void initDebugMenuData(struct DebugMenuData * menuData2)
|
|||
{
|
|||
menuData2->state[0].col = 0;
|
|||
menuData2->state[0].mask = 0x3;
|
|||
menuData2->state[0].defaultShift = 12;
|
|||
menuData2->state[1].col = 0;
|
|||
menuData2->state[1].mask = 0x1;
|
|||
menuData2->state[1].defaultShift = 4;
|
|||
}
|
|||
void menuDisplayEditNumber(unsigned int num, struct EditNumberState * state)
|
|||
{
|
|||
int shift = state->defaultShift;
|
|||
int i=0;
|
|||
int adj = debug_adjust;
|
|||
printf("0x");
|
|||
while(shift>=0)
|
|||
{
|
|||
int val = num;
|
|||
val = (val>> shift)&0xf;
|
|||
if (state->col == i)
|
|||
debug_adjust = adj^128;
|
|||
else
|
|||
debug_adjust = adj;
|
|||
printf("%1x",val);
|
|||
shift = shift-4;
|
|||
i=i+1;
|
|||
}
|
|||
debug_adjust = adj;
|
|||
}
|
|||
void menuPrintDebugAddress(void * menuData, void * itemData)
|
|||
{
|
|||
printf("Addr:");
|
|||
struct DebugMenuData * menuData2 = (struct DebugMenuData *)(menuData);
|
|||
menuDisplayEditNumber(get_debug_addr(),&menuData2->state[0]);
|
|||
}
|
|||
void menuPrintDebugData(void * menuData, void * itemData)
|
|||
{
|
|||
printf("Data:");
|
|||
struct DebugMenuData * menuData2 = (struct DebugMenuData *)(menuData);
|
|||
menuDisplayEditNumber(get_debug_data(),&menuData2->state[1]);
|
|||
}
|
|||
void menuPrintDebugMode(void * menuData, void * itemData)
|
|||
{
|
|||
printf("Mode:");
|
|||
if (get_debug_read_mode())
|
|||
printf("Read ");
|
|||
if (get_debug_write_mode())
|
|||
printf("Write ");
|
|||
if (get_debug_data_match())
|
|||
printf("Match ");
|
|||
}
|
|||
bool hexDigitToNumber(unsigned char digit, int *val)
|
|||
{
|
|||
if (digit>='0' && digit<='9')
|
|||
{
|
|||
*val = digit-'0';
|
|||
return true;
|
|||
}
|
|||
else if (digit>='A' && digit<='F')
|
|||
{
|
|||
*val = 10 + digit-'A';
|
|||
return true;
|
|||
}
|
|||
return false;
|
|||
}
|
|||
bool menuEditNumber(struct EditNumberState * state, struct joystick_status * joy, unsigned int * data)
|
|||
{
|
|||
unsigned int val = 0;
|
|||
unsigned int mask = 0;
|
|||
int i;
|
|||
int shift = state->defaultShift;
|
|||
bool res = false;
|
|||
if (hexDigitToNumber(joy->keyPressed_,&val))
|
|||
{
|
|||
//key pressed, store the number in the current location
|
|||
for (i=0;i!=state->col;++i)
|
|||
shift = shift-4;
|
|||
mask = 0xf;
|
|||
val = val<<shift;
|
|||
mask = mask<<shift;
|
|||
*data = ((*data)&~mask) | val;
|
|||
state->col = state->col+1;
|
|||
res = true;
|
|||
}
|
|||
else if (joy->keyPressed_==-1)
|
|||
{
|
|||
// delete pressed, move back one place
|
|||
state->col = state->col-1;
|
|||
}
|
|||
state->col = state->col & state->mask; // sanitize col
|
|||
return res;
|
|||
}
|
|||
void menuDebugAddress(void * menuData, struct joystick_status * joy, int j)
|
|||
{
|
|||
int i;
|
|||
struct DebugMenuData * menuData2 = (struct DebugMenuData *)(menuData);
|
|||
unsigned int addr = get_debug_addr();
|
|||
if (menuEditNumber(&menuData2->state[j],joy,&addr))
|
|||
set_debug_addr(addr);
|
|||
}
|
|||
void menuDebugData(void * menuData, struct joystick_status * joy, int j)
|
|||
{
|
|||
int i;
|
|||
struct DebugMenuData * menuData2 = (struct DebugMenuData *)(menuData);
|
|||
unsigned int data = get_debug_data();
|
|||
if (menuEditNumber(&menuData2->state[j],joy,&data))
|
|||
set_debug_data(data);
|
|||
}
|
|||
void menuDebugHotkeys(void * menuData, unsigned char keyPressed)
|
|||
{
|
|||
switch (keyPressed)
|
|||
{
|
|||
case 'R':
|
|||
set_debug_read_mode(!get_debug_read_mode());
|
|||
break;
|
|||
case 'W':
|
|||
set_debug_write_mode(!get_debug_write_mode());
|
|||
break;
|
|||
case 'M':
|
|||
set_debug_data_match(!get_debug_data_match());
|
|||
break;
|
|||
}
|
|||
}
|
|||
int debug_menu()
|
|||
{
|
|||
struct MenuEntry entries[] =
|
|||
{
|
|||
{&menuPrintDebugAddress,0,&menuDebugAddress,MENU_FLAG_KEYPRESS},
|
|||
{&menuPrintDebugData,1,&menuDebugData,MENU_FLAG_KEYPRESS},
|
|||
{&menuPrintDebugMode,0,0,MENU_FLAG_KEYPRESS},
|
|||
{0,0,0,0}, //blank line
|
|||
{0,"Exit",0,MENU_FLAG_EXIT},
|
|||
{0,0,0,MENU_FLAG_FINAL} //blank line
|
|||
};
|
|||
struct DebugMenuData menuData;
|
|||
initDebugMenuData(&menuData);
|
|||
return display_menu("Debug",&entries[0], &menuDebugHotkeys, &menuData);
|
|||
}
|
|||
#endif
|
|||
void update_keys()
|
|||
{
|
|||
#ifdef LINUX_BUILD
|
|||
check_keys();
|
|||
#endif
|
|||
#ifdef USB
|
|||
usb_poll(&usb_porta);
|
|||
#endif
|
|||
#ifdef USB2
|
|||
usb_poll(&usb_portb);
|
|||
#endif
|
|||
}
|
|||
void actions()
|
|||
{
|
|||
update_keys();
|
|||
// Check for new mounts
|
|||
unsigned char sd_new_mounted = get_sd_mounted();
|
|||
if ((sd_mounted & 0x01) != (sd_new_mounted & 0x01))
|
|||
{
|
|||
int size = *(int*)zpu_in2;
|
|||
if (size) {
|
|||
file_mount(files[0], 0, size);
|
|||
set_drive_status(0,files[0]);
|
|||
} else {
|
|||
// remove
|
|||
file_init(files[0]);
|
|||
set_drive_status(0, 0);
|
|||
}
|
|||
}
|
|||
if ((sd_mounted & 0x02) != (sd_new_mounted & 0x02))
|
|||
{
|
|||
int size = *(int*)zpu_in2;
|
|||
if (size) {
|
|||
file_mount(files[1], 1, size);
|
|||
set_drive_status(1,files[1]);
|
|||
} else {
|
|||
// remove
|
|||
file_init(files[1]);
|
|||
set_drive_status(1, 0);
|
|||
}
|
|||
}
|
|||
sd_mounted = sd_new_mounted;
|
|||
// Hot keys
|
|||
if (get_hotkey_softboot())
|
|||
{
|
|||
reboot(0);
|
|||
}
|
|||
else if (get_hotkey_coldboot())
|
|||
{
|
|||
reboot(1);
|
|||
do
|
|||
{
|
|||
update_keys();
|
|||
}
|
|||
while (get_hotkey_coldboot());
|
|||
} else if (get_hotkey_settings())
|
|||
// cold boot with disk unload
|
|||
{
|
|||
set_drive_status(0, 0);
|
|||
set_drive_status(1, 0);
|
|||
reboot(1);
|
|||
do
|
|||
{
|
|||
update_keys();
|
|||
}
|
|||
while (get_hotkey_settings());
|
|||
}
|
|||
}
|