I hope I am not to late with that "black magic" solution :)
First of all, to set things clear, what you need is possible and not hard to achieve, still there is some good news and bad news. Bad news is that your choice can't be completely arbitrary and the good news is that you can choose from an additional 24 pins (the ones that are marked with PCINTx in the data sheet, PCINT0 all the way PCINT23)
Also bad news is that, some of the following may seem a little foggy at first (it the case is that your not so experimented with micro controllers) but good news is that you are going to a have a much better view of what your dealing with once you get the job done :)
A few basics regarding this matter, which you probably already know, or heard of: PCINTx stands for "Pin Change INTerrupt" and if enabled, on a certain pin, will call an interrupt each time the state on that pin has changed (from high to low/ from low to high).
Second of all, your approach should look something like this:
- enable pin change interrupt on the 6 pins that you need
- enable global interrupts
- when an interrupt is called, check the state of your input to determine the change and save the button state
You're gonna need the datasheet, so here's a shortcut: http://www.atmel.com/dyn/resources/prod_documents/doc2549.PDF :)
for step 1: see register PCICR on page 115 this is Pin Change Interrupt Control Register and also registers PCMSK2, PCMSK1, PCMSK0 to specify exactly which pins are enabled for this special function
for step 2: I'm pretty sure you know how to do this since you posted this question :) - if not call: sei()
for step 3: This is the tricky part. You have 3 interrupt vectors (or you can call them callbacks) one for each port (each port has 8 pins). If multiple pins of the sam port are set as triggers (from the mask registers PCMSKx, at step 1) the same callback will be called, so, be sure to check register PINx to see exactly which one has changed.
That's about it :) a few more things though: this is also applicable for ArduinoUno (atMega328p). This is a very useful feature - if you consider power consumption, you can hold the controller in sleep and perform wake up by interrupt. I have used this feature for the reading input from an RC receiver and you can get real good timings (interrupt driven, so d'oh :P )
Here's a link with GREAT INFO regarding this matter, probably should have started from here: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=71109
I, myself always prefer a software solution instead of a hardware solution, it's usually more flexible and most of the time the results provided are cheaper and faster to get at than hardware changes (also less messy) :). But keep in mind that anything that is hardware is MUCH MUCH MUCH more faster (thus justifies the costs and messiness and lack of flexibly). However, in this case right here, I don't really think you need that kind of speed, so go for SW :)
Hope I'm not to late, but just in case I am, I hope it will be useful maybe another day :) You can find a nice implementation for what I believe you need on the second link (the one from avrfreaks)
This is a link I picked up from another thread on stackexchange, sums up the whole idea pretty well http://www.me.ucsb.edu/~me170c/Code/How_to_Enable_Interrupts_on_ANY_pin.pdf
Cheers,
Dan