forked from Gekkio/mooneye-gb
-
Notifications
You must be signed in to change notification settings - Fork 2
/
call_cc_timing2.s
95 lines (81 loc) · 2.2 KB
/
call_cc_timing2.s
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
94
95
; This file is part of Mooneye GB.
; Copyright (C) 2014-2016 Joonas Javanainen <joonas.javanainen@gmail.com>
;
; Mooneye GB is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Mooneye GB is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Mooneye GB. If not, see <http://www.gnu.org/licenses/>.
; CALL cc, nn is expected to have the following timing:
; M = 0: instruction decoding
; M = 1: nn read: memory access for low byte
; M = 2: nn read: memory access for high byte
; M = 3: internal delay
; M = 4: PC push: memory access for high byte
; M = 5: PC push: memory access for low byte
; Verified results:
; pass: DMG, MGB, SGB, SGB2, CGB, AGB, AGS
; fail: -
.incdir "../common"
.include "common.s"
di
; set first $20 bytes of VRAM to $81, so we
; have a known value when reading results
wait_vblank
ld hl, VRAM
ld bc, $20
ld a, $81
call memset
run_hiram_test
test_finish:
save_results
assert_b $81
assert_c $81
assert_d $81
assert_e $B9
assert_h $FF
assert_l $D6
jp process_results
hiram_test:
ld sp, OAM+$20
start_oam_dma $80
ld a, 38
- dec a
jr nz, -
nops 1
scf
call c, $FF80 + (finish_round1 - hiram_test)
; OAM is accessible at M=6, so we expect to see
; incorrect low and high bytes (= $81 written by OAM DMA)
finish_round1:
pop bc
start_oam_dma $80
ld a, 38
- dec a
jr nz, -
nops 2
scf
call c, $FF80 + (finish_round2 - hiram_test)
; OAM is accessible at M=5, so we expect to see
; incorrect (= $81 written by OAM DMA) high byte, but correct low byte
finish_round2:
pop de
start_oam_dma $80
ld a, 38
- dec a
jr nz, -
nops 3
scf
call c, $FF80 + (finish_round3 - hiram_test)
; OAM is accessible at M=4, so we expect to see
; correct high byte and low byte
finish_round3:
pop hl
jp test_finish