Table of Contents
Timers
The gamepad has the following timer registers: (TODO word better)
Address | Desc. |
---|---|
0xF0000400 | Prescaler for timer 0/1 |
0xF0000404 | Prescaler for count-up timer |
0xF0000408 | Count-up timer |
0xF0000410 | Timer 0 control |
0xF0000414 | Timer 0 counter |
0xF0000418 | Timer 0 target |
0xF0000420 | Timer 1 control |
0xF0000424 | Timer 1 counter |
0xF0000428 | Timer 1 target |
Prescalers
Registers 0xF0000400 and 0xF0000404 control the rate at which timers 0/1 and the count-up timer run, respectively.
They are simple prescaler counters. For example, setting them to 63 will divide the input clock by 64.
The input clock seems to be the system clock, which is about 108MHz at the fast clock settings.
Count-up timer
This is a simple timer that is always counting up. When writing a value to 0xF0000408, it will begin counting from the new value.
Timer 0
0xF0000410
Timer control.
Bits | Desc. |
---|---|
0 | ?? |
1 | Timer enable |
4-6 | Prescaler |
Bit0 is possibly used by firmware code but has no observable effect.
Writing 0 to bit1 resets the timer to 0.
The prescaler value has the following possible settings:
Value | Frequency |
---|---|
0 | Divide by 2 |
1 | Divide by 4 |
2 | Divide by 8 |
3 | Divide by 16 |
4 | Divide by 32 |
5 | Divide by 64 |
6 | Divide by 128 |
7 | Divide by 256 |
0xF0000414
Counter. Can be written to, the timer will count from the new value.
When the timer goes past the target, the timer is reloaded to 0 and IRQ 0x00 is triggered.
Writing a new value greater than the target does not cause a reload.
0xF0000418
Target.
Before a reload, the last value the timer takes is equal to the target.
Timer 1
Function identical to timer 0, except it triggers IRQ 0x01.