====== 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. These registers are 8 bits wide. ===== 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. This register is 32 bits wide. ===== Timer 0 ===== **0xF0000410** Timer control. ^ Bits ^ Desc. ^ | 0 | ?? | | 1 | Timer enable | | 2 | Count direction; 0=up, 1=down | | 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. Writes are ignored when the timer isn't active. When the timer goes past the target in count-up mode, or below zero in count-down mode, the timer is reloaded (to 0 in count-up mode, to the target value in count-down mode) and IRQ 0x00 is triggered. Writing a new value greater than the target does not cause a reload. This register is 32 bits wide. **0xF0000418** Target. In count-up mode, before a reload, the last value the timer takes is equal to the target. It is then reloaded to 0. In count-down mode, before a reload, the last value the timer takes is 0. It is then reloaded to the target value. ===== Timer 1 ===== Function identical to timer 0, except it triggers IRQ 0x01.