New 'Slide-n-Glide' joystick settings. New key mapping implemented. General cleanup and refactor. Getting ready for the 0.9 release.

This commit is contained in:
Dave Bernazzani 2025-04-29 17:27:59 -04:00
parent 6f27ba9773
commit 0035ef390d
9 changed files with 300 additions and 187 deletions

View File

@ -9,7 +9,7 @@ include $(DEVKITARM)/ds_rules
export TARGET := GimliDS
export TOPDIR := $(CURDIR)
export VERSION := 0.8b
export VERSION := 0.9
ICON := -b $(CURDIR)/C64_icon.bmp "GimliDS $(VERSION);wavemotion-dave;https://github.com/wavemotion-dave/GimliDS"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -170,12 +170,9 @@ C64::~C64()
delete TheCPU;
delete TheDisplay;
//delete[] RAM;
delete[] Basic;
//delete[] Kernal;
delete[] Char;
delete[] Color;
//delete[] RAM1541;
delete[] ROM1541;
c64_dtor();
@ -896,6 +893,8 @@ ITCM_CODE void C64::VBlank(bool draw_frame)
}
}
u8 key_row_map[] __attribute__((section(".dtcm"))) = {7,7,0,0,0,0,6,6,5,5,5,5,5,6,6,5, 1,3,2,2,1,2,3,3,4,4,4,5,4,4,4,5,7,2,1,2,3,3,1,2,3,1, 7,7,1,1,2,2,3,3,4,4};
u8 key_col_map[] __attribute__((section(".dtcm"))) = {7,5,4,5,6,3,1,5,0,3,4,7,5,2,7,6, 2,4,4,2,6,5,2,5,1,2,5,2,4,7,6,1,6,1,5,6,6,7,1,7,1,4, 0,3,0,3,0,3,0,3,0,3};
/*
* Poll joystick port, return CIA mask
@ -905,6 +904,15 @@ u8 retkey=0;
u16 dampen=0;
extern s16 temp_offset;
extern u16 slide_dampen;
// ----------------------------------------------------------------------------
// Chuckie-Style d-pad keeps moving in the last known direction for a few more
// frames to help make those hairpin turns up and off ladders much easier...
// ----------------------------------------------------------------------------
u8 slide_n_glide_key_up = 0;
u8 slide_n_glide_key_down = 0;
u8 slide_n_glide_key_left = 0;
u8 slide_n_glide_key_right = 0;
uint8 C64::poll_joystick(int port)
{
uint8 j = 0xff;
@ -922,140 +930,147 @@ uint8 C64::poll_joystick(int port)
u32 keys= keysHeld();
u8 joy_up = 0;
u8 joy_dn = 0;
u8 joy_fire = 0;
if(keys & KEY_B)
u8 joy_up = 0;
u8 joy_down = 0;
u8 joy_left = 0;
u8 joy_right = 0;
u8 joy_fire = 0;
u8 mappable_key_press[8] = {0,0,0,0,0,0,0,0};
if (keys & (KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT | KEY_A | KEY_B | KEY_X | KEY_Y))
{
switch (myConfig.key_B)
if (myConfig.joyMode == JOYMODE_SLIDE_N_GLIDE)
{
case KEY_MAP_RETURN:
TheDisplay->KeyPress(MATRIX(0,1), TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
retkey=1;
break;
case KEY_MAP_SPACE:
TheDisplay->KeyPress(MATRIX(7,4), TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
space=1;
break;
case KEY_MAP_PAN_UP:
temp_offset = -16;
slide_dampen = 15;
break;
case KEY_MAP_PAN_DN:
temp_offset = 16;
slide_dampen = 15;
break;
case KEY_MAP_JOY_UP:
joy_up = 1;
break;
case KEY_MAP_JOY_DN:
joy_dn = 1;
break;
case KEY_MAP_JOY_FIRE:
joy_fire = 1;
break;
if (keys & KEY_UP)
{
slide_n_glide_key_up = 12;
slide_n_glide_key_down = 0;
}
if (keys & KEY_DOWN)
{
slide_n_glide_key_down = 12;
slide_n_glide_key_up = 0;
}
if (keys & KEY_LEFT)
{
slide_n_glide_key_left = 12;
slide_n_glide_key_right = 0;
}
if (keys & KEY_RIGHT)
{
slide_n_glide_key_right = 12;
slide_n_glide_key_left = 0;
}
if (slide_n_glide_key_up)
{
slide_n_glide_key_up--;
keys |= KEY_UP;
}
if (slide_n_glide_key_down)
{
slide_n_glide_key_down--;
keys |= KEY_DOWN;
}
if (slide_n_glide_key_left)
{
slide_n_glide_key_left--;
keys |= KEY_LEFT;
}
if (slide_n_glide_key_right)
{
slide_n_glide_key_right--;
keys |= KEY_RIGHT;
}
}
}
if (keys & KEY_UP) mappable_key_press[0] = 1;
if (keys & KEY_DOWN) mappable_key_press[1] = 1;
if (keys & KEY_LEFT) mappable_key_press[2] = 1;
if (keys & KEY_RIGHT) mappable_key_press[3] = 1;
if(keys & KEY_A)
{
switch (myConfig.key_A)
{
case KEY_MAP_RETURN:
TheDisplay->KeyPress(MATRIX(0,1), TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
retkey=1;
break;
case KEY_MAP_SPACE:
TheDisplay->KeyPress(MATRIX(7,4), TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
space=1;
break;
case KEY_MAP_PAN_UP:
temp_offset = -16;
slide_dampen = 15;
break;
case KEY_MAP_PAN_DN:
temp_offset = 16;
slide_dampen = 15;
break;
case KEY_MAP_JOY_UP:
joy_up = 1;
break;
case KEY_MAP_JOY_DN:
joy_dn = 1;
break;
case KEY_MAP_JOY_FIRE:
joy_fire = 1;
break;
}
}
if (keys & KEY_A) mappable_key_press[4] = 1;
if (keys & KEY_B) mappable_key_press[5] = 1;
if (keys & KEY_X) mappable_key_press[6] = 1;
if (keys & KEY_Y) mappable_key_press[7] = 1;
}
else // No NDS keys pressed...
{
if (slide_n_glide_key_up) slide_n_glide_key_up--;
if (slide_n_glide_key_down) slide_n_glide_key_down--;
if (slide_n_glide_key_left) slide_n_glide_key_left--;
if (slide_n_glide_key_right) slide_n_glide_key_right--;
}
if(keys & KEY_X)
u8 auto_fire = 0;
for (int i=0; i<8; i++)
{
switch (myConfig.key_X)
if (mappable_key_press[i])
{
case KEY_MAP_RETURN:
TheDisplay->KeyPress(MATRIX(0,1), TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
retkey=1;
break;
case KEY_MAP_SPACE:
TheDisplay->KeyPress(MATRIX(7,4), TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
space=1;
break;
case KEY_MAP_PAN_UP:
temp_offset = -16;
slide_dampen = 15;
break;
case KEY_MAP_PAN_DN:
temp_offset = 16;
slide_dampen = 15;
break;
case KEY_MAP_JOY_UP:
joy_up = 1;
break;
case KEY_MAP_JOY_DN:
joy_dn = 1;
break;
case KEY_MAP_JOY_FIRE:
joy_fire = 1;
break;
}
}
switch (myConfig.key_map[i])
{
// Handle space and return specially
case KEY_MAP_RETURN:
TheDisplay->KeyPress(MATRIX(0,1), TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
retkey=1;
break;
case KEY_MAP_SPACE:
TheDisplay->KeyPress(MATRIX(7,4), TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
space=1;
break;
if(keys & KEY_Y)
{
switch (myConfig.key_Y)
{
case KEY_MAP_RETURN:
TheDisplay->KeyPress(MATRIX(0,1), TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
retkey=1;
break;
case KEY_MAP_SPACE:
TheDisplay->KeyPress(MATRIX(7,4), TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
space=1;
break;
case KEY_MAP_PAN_UP:
temp_offset = -16;
slide_dampen = 15;
break;
case KEY_MAP_PAN_DN:
temp_offset = 16;
slide_dampen = 15;
break;
case KEY_MAP_JOY_UP:
joy_up = 1;
break;
case KEY_MAP_JOY_DN:
joy_dn = 1;
break;
case KEY_MAP_JOY_FIRE:
joy_fire = 1;
break;
// Handle all joystick mapped buttons
case KEY_MAP_JOY_UP:
joy_up = 1;
break;
case KEY_MAP_JOY_DOWN:
joy_down = 1;
break;
case KEY_MAP_JOY_LEFT:
joy_left = 1;
break;
case KEY_MAP_JOY_RIGHT:
joy_right = 1;
break;
case KEY_MAP_JOY_FIRE:
joy_fire = 1;
break;
case KEY_MAP_JOY_AUTO:
joy_fire = 1;
auto_fire = 1;
break;
// Handle special meta-mapped buttons (pan screen Up/Down)
case KEY_MAP_PAN_UP16:
temp_offset = -16;
slide_dampen = 15;
break;
case KEY_MAP_PAN_UP24:
temp_offset = -24;
slide_dampen = 15;
break;
case KEY_MAP_PAN_DN16:
temp_offset = 16;
slide_dampen = 15;
break;
case KEY_MAP_PAN_DN24:
temp_offset = 24;
slide_dampen = 15;
break;
// Handle all other keypresses... mark the key as pressed for the PollKeyboard() routine
default:
TheDisplay->IssueKeypress(key_row_map[myConfig.key_map[i]-8], key_col_map[myConfig.key_map[i]-8], TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
break;
}
}
}
static u32 auto_fire_dampen=0;
if ((myConfig.autoFire) && joy_fire)
if (auto_fire && joy_fire)
{
if (++auto_fire_dampen & 0x08) joy_fire=0;
} else auto_fire_dampen=0;
@ -1075,7 +1090,7 @@ uint8 C64::poll_joystick(int port)
if (keys & KEY_LEFT)
{
dampen = 4;
myConfig.offsetX++;
if (myConfig.offsetX < 64) myConfig.offsetX++;
}
if (keys & KEY_RIGHT)
{
@ -1094,12 +1109,12 @@ uint8 C64::poll_joystick(int port)
if (keys & KEY_DOWN)
{
dampen = 4;
myConfig.scaleY--;
if (myConfig.scaleY > 140) myConfig.scaleY--;
}
if (keys & KEY_LEFT)
{
dampen = 4;
myConfig.scaleX--;
if (myConfig.scaleX > 200) myConfig.scaleX--;
}
if (keys & KEY_RIGHT)
{
@ -1119,23 +1134,19 @@ uint8 C64::poll_joystick(int port)
if( keys & KEY_START && !dampen)
{
kbd_buf_feed("\rLOAD\"*\",8,1\rRUN\r");
dampen = 30;
dampen = 50; // Full second - do not repeat this often!
}
if (dampen) dampen--;
if (!dampen)
{
if(port != myConfig.joyPort) return j;
// Handle the joystick input... never dampen this!
if(port != myConfig.joyPort) return j;
if( keys & KEY_LEFT ) j&=0xfb;
if( keys & KEY_RIGHT ) j&=0xf7;
if( keys & KEY_UP ) j&=0xfe;
if( keys & KEY_DOWN ) j&=0xfd;
if( joy_fire ) j&=0xef; // Fire button
if( joy_up ) j&=0xfe;
if( joy_dn ) j&=0xfd;
}
if( joy_up ) j&=0xfe; // Up
if( joy_down ) j&=0xfd; // Down
if( joy_left ) j&=0xfb; // Left
if( joy_right ) j&=0xf7; // Right
if( joy_fire ) j&=0xef; // Fire button
return j;
}

View File

@ -262,8 +262,8 @@ u16 vBlanks;
void vblankIntr(void)
{
vBlanks++;
int cxBG = (myConfig.offsetX << 8);
int cyBG = (myConfig.offsetY+temp_offset) << 8;
int cxBG = ((s16)myConfig.offsetX << 8);
int cyBG = ((s16)myConfig.offsetY+temp_offset) << 8;
int xdxBG = ((320 / myConfig.scaleX) << 8) | (320 % myConfig.scaleX) ;
int ydyBG = ((200 / myConfig.scaleY) << 8) | (200 % myConfig.scaleY);
@ -510,6 +510,13 @@ bool m_tpActive=false;
touchPosition m_tp;
u8 issue_commodore_key = 0;
void C64Display::IssueKeypress(uint8 row, uint8 col, uint8 *key_matrix, uint8 *rev_matrix)
{
c64_key = MATRIX(row,col);
KeyPress(c64_key, key_matrix, rev_matrix);
lastc64key=c64_key;
}
void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick)
{
scanKeys();

View File

@ -59,6 +59,7 @@ public:
void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick);
void InitColors(uint8 *colors);
void NewPrefs(Prefs *prefs);
void IssueKeypress(uint8 row, uint8 col, uint8 *key_matrix, uint8 *rev_matrix);
C64 *TheC64;
public:

View File

@ -41,7 +41,6 @@ Prefs::Prefs()
SIDType = SIDTYPE_DIGITAL;
LimitSpeed = true;
FastReset = true;
CIAIRQHack = false;
TrueDrive = false; // True Drive Emulation when TRUE (slower emulation)

View File

@ -44,7 +44,6 @@ public:
char DrivePath[2][256]; // Path for drive 8 and 9
int SIDType; // SID emulation type
bool LimitSpeed; // Limit speed to 100%
bool FastReset; // Skip RAM test on reset
bool CIAIRQHack; // Write to CIA ICR clears IRQ
bool TrueDrive; // Enable processor-level 1541 emulation

View File

@ -46,10 +46,11 @@ extern void BottomScreenMainMenu(void);
#define MENU_ACTION_END 255 // Always the last sentinal value
#define MENU_ACTION_EXIT 0 // Exit the menu
#define MENU_ACTION_RESET_EMU 1 // Reset Emulator
#define MENU_ACTION_SAVE_STATE 2 //
#define MENU_ACTION_LOAD_STATE 3 //
#define MENU_ACTION_CONFIG 4 //
#define MENU_ACTION_SAVE_STATE 2 // Save State
#define MENU_ACTION_LOAD_STATE 3 // Load State
#define MENU_ACTION_CONFIG 4 // Configure Game
#define MENU_ACTION_PRESS_C64 5 // Issue the actual C= key!
#define MENU_ACTION_QUIT_EMU 6 // Exit Emulator
#define MENU_ACTION_SKIP 99 // Skip this MENU choice
typedef struct
@ -74,6 +75,7 @@ MainMenu_t main_menu =
{(char *)" LOAD STATE ", MENU_ACTION_LOAD_STATE},
{(char *)" RESET C64 ", MENU_ACTION_RESET_EMU},
{(char *)" PRESS @ KEY ", MENU_ACTION_PRESS_C64},
{(char *)" QUIT GIMLIDS", MENU_ACTION_QUIT_EMU},
{(char *)" EXIT MENU ", MENU_ACTION_EXIT},
{(char *)" NULL ", MENU_ACTION_END},
},
@ -168,6 +170,10 @@ u8 MainMenu(C64 *the_c64)
{
switch(menu->menulist[menuSelection].menu_action)
{
case MENU_ACTION_QUIT_EMU:
exit(0);
break;
case MENU_ACTION_PRESS_C64:
extern u8 issue_commodore_key;
issue_commodore_key = 1;
@ -338,31 +344,41 @@ void SetDefaultGameConfig(void)
{
myConfig.game_crc = 0; // No game in this slot yet
myConfig.key_A = 0;
myConfig.key_B = 1;
myConfig.key_Y = 2;
myConfig.key_X = 3;
myConfig.autoFire = 0;
myConfig.trueDrive = 0;
myConfig.jitter = 1; // Medium
myConfig.diskSFX = 1; // Disk sound effects on
myConfig.joyPort = 0; // Default to Joy1
myConfig.key_map[0] = KEY_MAP_JOY_UP; // D-Pad Up
myConfig.key_map[1] = KEY_MAP_JOY_DOWN; // D-Pad Down
myConfig.key_map[2] = KEY_MAP_JOY_LEFT; // D-Pad Left
myConfig.key_map[3] = KEY_MAP_JOY_RIGHT;// D-Pad Right
myConfig.key_map[4] = KEY_MAP_JOY_FIRE; // A = Fire Button
myConfig.key_map[5] = KEY_MAP_SPACE; // B = SPACE key
myConfig.key_map[6] = KEY_MAP_JOY_UP; // X = Joy Up
myConfig.key_map[7] = KEY_MAP_RETURN; // Y = RETURN key
myConfig.key_map[8] = KEY_MAP_SPACE; // Spare 1
myConfig.key_map[9] = KEY_MAP_SPACE; // Spare 2
myConfig.trueDrive = 0; // Fast 1541 emulation by default
myConfig.jitter = 1; // Medium level of jitter
myConfig.diskSFX = 1; // Disk sound effects on
myConfig.joyPort = 0; // Default to Joy1
myConfig.joyMode = 0; // Default is normal joypad / dpad
myConfig.reserved2 = 0;
myConfig.reserved3 = 0;
myConfig.reserved4 = 0;
myConfig.reserved5 = 0;
myConfig.reserved6 = 0xA5; // So it's easy to spot on an "upgrade" and we can re-default it
myConfig.reserved6 = 0;
myConfig.reserved7 = 0;
myConfig.reserved8 = 0xA5; // So it's easy to spot on an "upgrade" and we can re-default it
myConfig.cpuCycles = 0; // Normal 63 - this is the delta adjustment to that
myConfig.badCycles = 0; // Normal 23 - this is the delta adjustment to that
myConfig.cpuCycles = 0; // Normal 63 - this is the adjustment to that
myConfig.badCycles = 0; // Normal 23 - this is the adjustment to that
myConfig.offsetX = 32;
myConfig.offsetY = 19;
myConfig.scaleX = 256;
myConfig.scaleY = 200;
myConfig.offsetX = 32; // Push the side border off the main display
myConfig.offsetY = 19; // Push the top border off the main display
myConfig.scaleX = 256; // Scale the 320 pixels of C64 display to the DS 256 pixels (squashed... booo!)
myConfig.scaleY = 200; // Scale the 200 pixels of C64 display to the DS 200 (yes, there is only 192 so this will cut... use PAN UP/DN)
}
s16 CycleDeltas[] = {0,1,2,3,4,5,6,7,8,9,-9,-8,-7,-6,-5,-4,-3,-2,-1};
s16 CycleDeltas[] = {0,1,2,3,4,5,6,7,8,9,-9,-8,-7,-6,-5,-4,-3,-2,-1}; // Used with myConfig.cpuCycles and myConfig.badCycles
// ----------------------------------------------------------------------
// Read file twice and ensure we get the same CRC... if not, do it again
@ -533,29 +549,44 @@ void FindConfig(void)
struct options_t
{
const char *label;
const char *option[20];
const char *option[64];
u8 *option_val;
u8 option_max;
};
#define CYCLE_DELTA_STR "+0","+1","+2","+3","+4","+5","+6","+7","+8","+9","-9","-8","-7","-6","-5","-4","-3","-2","-1",
#define KEY_MAP_OPTIONS "JOY FIRE", "JOY UP", "JOY DOWN", "JOY LEFT", "JOY RIGHT", "JOY AUTOFIRE",\
"KEY SPACE", "KEY RETURN", "RUN/STOP", "KEY C=", "KEY F1", "KEY F3", "KEY F5", "KEY F7",\
"KEY *", "KEY =", "KEY +", "KEY -", "KEY PERIOD", "KEY COMMA", "KEY COLON", "KEY SEMI", "KEY SLASH", "KEY @",\
"KEY A", "KEY B", "KEY C", "KEY D", "KEY E", "KEY F", "KEY G", "KEY H", "KEY I", "KEY J", "KEY K", "KEY L",\
"KEY M", "KEY N", "KEY O", "KEY P", "KEY Q", "KEY R", "KEY S", "KEY T", "KEY U", "KEY V", "KEY W", "KEY X",\
"KEY Y", "KEY Z", "KEY 1", "KEY 2", "KEY 3", "KEY 4", "KEY 5", "KEY 6", "KEY 7", "KEY 8", "KEY 9", "KEY 0",\
"PAN-UP 16", "PAN-UP 24", "PAN-DOWN 16", "PAN-DOWN 24"
const struct options_t Option_Table[1][20] =
{
// Game Specific Configuration
{
{"TRUE DRIVE", {"DISABLE (FAST)", "ENABLED (SLOW)"}, &myConfig.trueDrive, 2},
{"AUTO FIRE", {"OFF", "ON"}, &myConfig.autoFire, 2},
{"JOY PORT", {"PORT 1", "PORT 2"}, &myConfig.joyPort, 2},
{"JOY MODE", {"NORMAL", "SLIDE-N-GLIDE"}, &myConfig.joyMode, 2},
{"LCD JITTER", {"NONE", "LIGHT", "HEAVY"}, &myConfig.jitter, 3},
{"DISK SOUND", {"SFX OFF", "SFX ON"}, &myConfig.diskSFX, 2},
{"A BUTTON", {"JOY FIRE", "SPACE", "RETURN", "JOY UP", "JOY DOWN", "PAN-UP", "PAN-DOWN"}, &myConfig.key_A, 7},
{"B BUTTON", {"JOY FIRE", "SPACE", "RETURN", "JOY UP", "JOY DOWN", "PAN-UP", "PAN-DOWN"}, &myConfig.key_B, 7},
{"X BUTTON", {"JOY FIRE", "SPACE", "RETURN", "JOY UP", "JOY DOWN", "PAN-UP", "PAN-DOWN"}, &myConfig.key_X, 7},
{"Y BUTTON", {"JOY FIRE", "SPACE", "RETURN", "JOY UP", "JOY DOWN", "PAN-UP", "PAN-DOWN"}, &myConfig.key_Y, 7},
{"CPU CYCLES", {CYCLE_DELTA_STR}, &myConfig.cpuCycles, 19},
{"BAD CYCLES", {CYCLE_DELTA_STR}, &myConfig.badCycles, 19},
{"D-PAD UP", {KEY_MAP_OPTIONS}, &myConfig.key_map[0], 64},
{"D-PAD DOWN", {KEY_MAP_OPTIONS}, &myConfig.key_map[1], 64},
{"D-PAD LEFT", {KEY_MAP_OPTIONS}, &myConfig.key_map[2], 64},
{"D-PAD RIGHT", {KEY_MAP_OPTIONS}, &myConfig.key_map[3], 64},
{"A BUTTON", {KEY_MAP_OPTIONS}, &myConfig.key_map[4], 64},
{"B BUTTON", {KEY_MAP_OPTIONS}, &myConfig.key_map[5], 64},
{"X BUTTON", {KEY_MAP_OPTIONS}, &myConfig.key_map[6], 64},
{"Y BUTTON", {KEY_MAP_OPTIONS}, &myConfig.key_map[7], 64},
{NULL, {"", ""}, NULL, 1},
}
};

View File

@ -1,30 +1,29 @@
#define MAX_CONFIGS 1150
#define CONFIG_VERSION 0x0005
#define MAX_CONFIGS 960
#define CONFIG_VERSION 0x0006
extern s16 CycleDeltas[];
struct __attribute__((__packed__)) Config_t
{
u32 game_crc;
u8 key_A;
u8 key_B;
u8 key_X;
u8 key_Y;
u8 key_map[10]; // U,D,L,R, A,B,X,Y, +2 spares
u8 trueDrive;
u8 autoFire;
u8 jitter;
u8 diskSFX;
u8 joyPort;
u8 joyMode;
u8 reserved2;
u8 reserved3;
u8 reserved4;
u8 reserved5;
u8 reserved6;
u8 reserved7;
u8 reserved8;
u8 cpuCycles;
u8 badCycles;
s16 offsetX;
s16 offsetY;
s8 offsetX;
s8 offsetY;
s16 scaleX;
s16 scaleY;
};
@ -32,12 +31,78 @@ struct __attribute__((__packed__)) Config_t
extern struct Config_t myConfig;
#define KEY_MAP_JOY_FIRE 0
#define KEY_MAP_SPACE 1
#define KEY_MAP_RETURN 2
#define KEY_MAP_JOY_UP 3
#define KEY_MAP_JOY_DN 4
#define KEY_MAP_PAN_UP 5
#define KEY_MAP_PAN_DN 6
#define KEY_MAP_JOY_UP 1
#define KEY_MAP_JOY_DOWN 2
#define KEY_MAP_JOY_LEFT 3
#define KEY_MAP_JOY_RIGHT 4
#define KEY_MAP_JOY_AUTO 5
#define KEY_MAP_SPACE 6
#define KEY_MAP_RETURN 7
#define KEY_MAP_RUNSTOP 8
#define KEY_MAP_COMMODORE 9
#define KEY_MAP_F1 10
#define KEY_MAP_F3 11
#define KEY_MAP_F5 12
#define KEY_MAP_F7 13
#define KEY_MAP_ASTERISK 14
#define KEY_MAP_EQUALS 15
#define KEY_MAP_PLUS 16
#define KEY_MAP_MINUS 17
#define KEY_MAP_PERIOD 18
#define KEY_MAP_COMMA 19
#define KEY_MAP_COLON 20
#define KEY_MAP_SEMI 21
#define KEY_MAP_SLASH 22
#define KEY_MAP_ATSIGN 23
#define KEY_MAP_A 24
#define KEY_MAP_B 25
#define KEY_MAP_C 26
#define KEY_MAP_D 27
#define KEY_MAP_E 28
#define KEY_MAP_F 29
#define KEY_MAP_G 30
#define KEY_MAP_H 31
#define KEY_MAP_I 32
#define KEY_MAP_J 33
#define KEY_MAP_K 34
#define KEY_MAP_L 35
#define KEY_MAP_M 36
#define KEY_MAP_N 37
#define KEY_MAP_O 38
#define KEY_MAP_P 39
#define KEY_MAP_Q 40
#define KEY_MAP_R 41
#define KEY_MAP_S 42
#define KEY_MAP_T 43
#define KEY_MAP_U 44
#define KEY_MAP_V 45
#define KEY_MAP_W 46
#define KEY_MAP_X 47
#define KEY_MAP_Y 48
#define KEY_MAP_Z 49
#define KEY_MAP_1 50
#define KEY_MAP_2 51
#define KEY_MAP_3 52
#define KEY_MAP_4 53
#define KEY_MAP_5 54
#define KEY_MAP_6 55
#define KEY_MAP_7 56
#define KEY_MAP_8 57
#define KEY_MAP_9 58
#define KEY_MAP_0 59
#define KEY_MAP_PAN_UP16 60
#define KEY_MAP_PAN_UP24 61
#define KEY_MAP_PAN_DN16 62
#define KEY_MAP_PAN_DN24 63
#define KEY_MAP_MAX 64
#define JOYMODE_NORMAL 0
#define JOYMODE_SLIDE_N_GLIDE 1
extern u32 getCRC32(u8 *buf, int size);
extern u32 file_crc;