1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
; timer interrupt handler
TimerHandler:
push af
push hl
push de
push bc
ei
call SerialTimerHandler
; only trigger every fourth interrupt ≈ 60.24 Hz
ld hl, wTimerCounter
ld a, [hl]
inc [hl]
and $3
jr nz, .done
; increment the 60-60-60-255-255 counter
call IncrementPlayTimeCounter
; check in-timer flag
ld hl, wReentrancyFlag
bit IN_TIMER, [hl]
jr nz, .done
set IN_TIMER, [hl]
ldh a, [hBankROM]
push af
ld a, BANK(SoundTimerHandler)
call BankswitchROM
call SoundTimerHandler
pop af
call BankswitchROM
; clear in-timer flag
ld hl, wReentrancyFlag
res IN_TIMER, [hl]
.done
pop bc
pop de
pop hl
pop af
reti
; increment play time counter by a tick
IncrementPlayTimeCounter:
ld a, [wPlayTimeCounterEnable]
or a
ret z
ld hl, wPlayTimeCounter
inc [hl]
ld a, [hl]
cp 60
ret c
ld [hl], $0
inc hl
inc [hl]
ld a, [hl]
cp 60
ret c
ld [hl], $0
inc hl
inc [hl]
ld a, [hl]
cp 60
ret c
ld [hl], $0
inc hl
inc [hl]
ret nz
inc hl
inc [hl]
ret
; setup timer to 16384/68 ≈ 240.94 Hz
SetupTimer:
ld b, -68 ; Value for Normal Speed
call CheckForCGB
jr c, .set_timer
ldh a, [rKEY1]
and $80
jr z, .set_timer
ld b, $100 - 2 * 68 ; Value for CGB Double Speed
.set_timer
ld a, b
ldh [rTMA], a
ld a, TAC_16384_HZ
ldh [rTAC], a
ld a, TAC_START | TAC_16384_HZ
ldh [rTAC], a
ret
; return carry if not CGB
CheckForCGB:
ld a, [wConsole]
cp CONSOLE_CGB
ret z
scf
ret
|