基础计数器

基础计数器是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)关闭它。