I even put two buttons on my 3rd cp, for the save state feature... however , it blows ........ it has to have a number attached to it.... so once you hit save state, it ask for a slot number so I hit player 1 start, or number 1........ works fine , til you need to overwirght it..... won't do it.....it gives an error..... so with out a key board it blows.......... and who wants to to do the extra work for each game , mkchamps patch is automatic:)   he included his source...........I feel he violated NO rules:)  but opinions are like bungholes , and that is mine:)................ML
Yup it bugged me to have to hit a key after save or load as well.  I edited the source to make it default to only use a single slot and not ask for a slot.
When you build, find the file src\emu\ui.c
Just delete the crossed out lines from this method  handler_load_save.  Probably don't need the /* check for cancel key */  part either, but it does no harm.
This is what my ui.c file has for 0.143
   /*-------------------------------------------------
       handler_load_save - leads the user through
       specifying a game to save or load
   -------------------------------------------------*/   
   static UINT32 handler_load_save(running_machine &machine, render_container *container, UINT32 state)
   {
      char filename[20];     
input_code code;      char file = 0;   
      /* if we're not in the middle of anything, skip */
      if (state == LOADSAVE_NONE)
         return 0;   
     /* okay, we're waiting for a key to select a slot; display a message */
     if (state == LOADSAVE_SAVE)
        ui_draw_message_window(container, "Select position to save to");
     else
        ui_draw_message_window(container, "Select position to load from");        /* check for cancel key */
      if (ui_input_pressed(machine, IPT_UI_CANCEL))
      {
         /* display a popup indicating things were cancelled */
         if (state == LOADSAVE_SAVE)
            popmessage("Save cancelled");
         else
            popmessage("Load cancelled");   
         /* reset the state */
         machine.resume();
         return UI_HANDLER_CANCEL;
      }
   
     /* check for A-Z or 0-9 */
     for (input_item_id id = ITEM_ID_A; id <= ITEM_ID_Z; id++)
        if (machine.input().code_pressed_once(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id)))
           file = id - ITEM_ID_A + 'a';
     if (file == 0)
        for (input_item_id id = ITEM_ID_0; id <= ITEM_ID_9; id++)
          if (machine.input().code_pressed_once(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id)))
              file = id - ITEM_ID_0 + '0';
     if (file == 0)
       for (input_item_id id = ITEM_ID_0_PAD; id <= ITEM_ID_9_PAD; id++)
           if (machine.input().code_pressed_once(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id)))
              file = id - ITEM_ID_0_PAD + '0';
     if (file == 0)
       return state;        /* display a popup indicating that the save will proceed */
      sprintf(filename, "%c", file);
      if (state == LOADSAVE_SAVE)
      {
         popmessage("Save to position %c", file);
         machine.schedule_save(filename);
      }
      else
      {
         popmessage("Load from position %c", file);
         machine.schedule_load(filename);
      }   
      /* remove the pause and reset the state */
      machine.resume();
      return UI_HANDLER_CANCEL;
   }