基础计数器是PSX的定时器,它有4个计数器。
| 计数器 | 基本地址 | 同步到 |
| 0 | 0x1F80_1100 | 象素时钟 |
| 1 | 0x1F80_1110 | 水平回折 |
| 2 | 0x1F80_1120 | 1/8系统时钟 |
| 3 | 垂直回折 |
每个计数器都有3个寄存器,一个是当前值,一个是计数器模式,一个是目标值。
| 0x11n0 计数 读 | |
| 31 16 | 15 0 |
| 垃圾 | 当前计数值,0x0000-0xFFFF |
| 0x11n4 模式 读/写 | |||||||||
| 31 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 1 | 0 |
| 垃圾 | Div | Clc | Iq2 | Iq1 | Tar | En | |||
| En | 0 计数器运行中 1 计数器停止(只用于计数器2) |
| Tar | 0 计数到0xFFFF 1 计数到目标寄存器的数值 |
| Iq1 Iq2 | 达到目标值时设置IRQ |
| Clc | 0 系统时钟 1 象素时钟(计数器0) 水平回折(计数器1) |
| Div | 0 系统时钟 1 1/8系统时钟(计数器2) |
当计数器的Clc和Div是0的时候,他们以相同的速度运行,速度似乎是计数器2的8倍。第10-31位似乎只有垃圾。
| 0x11n8 目标数 读/写 | |
| 31 16 | 15 0 |
| 垃圾 | 目标值,0x0000-0xFFFF |
要使用这些计数器设置一个中断,进行如下操作:
| 1 | 复位计数器(Mode=0) |
| 2 | 设置目标值,设置模式 |
| 3 | 在中断掩码寄存器(0x1F801074)中使能对应的位 位3=计数器3(Vblank) 位4=计数器0(系统时钟) 位5=计数器1(Hblank) 位6=计数器2(象素) |
| 4 | 打开一个事件(打开事件BIOS调用-0xB0,0x08),等待一下参数: A0-对应的计数器事件描述器或计数器号码 (0xF2000000-计数器0,0xF2000001-计数器1,0xF2000002-计数器2,0xF2000003-计数器3) A1-Spec=0x0002-中断事件。 A2-Mode=中断句柄(0x1000) A3-指向用户例程,返回值V0是事件标识符。 |
| 5 | 用对应的以标识符为参数的BISOCALL(0xB0,0x0C)使能事件。 |
| 6 | 确定中断被使能(COP0状态寄存器的0和10位必须被设置)。 |
用户应该恢复使用的寄存器,应该用正常的jr ra终止。
要关闭中断,先调用禁止事件(0xB0,0x0D),然后用以事件号为参数的关闭事件调用(0xB0,0x09)关闭它。