1; Tests sprite overflow flag timing
2
3     .include "prefix.a"
4
5test_name:
6     .db  "SPRITE OVERFLOW TIMING",0
7     .code
8
9begin_timing:
10     sta  result
11     jsr  sync_ppu_20
12     lda  #$18
13     sta  $2001
14     jsr  dma_sprite_table
15     pha  ; 14 delay for later expansion
16     pla
17     pha
18     pla
19     rts
20
21check_sprite_overflow_timing:
22     txa
23     and  #$20
24     jsr  error_if_ne
25     inc  result
26     tya
27     and  #$20
28     jsr  error_if_eq
29     rts
30
31reset:
32     jsr  begin_sprite_overflow_tests
33
34     lda  #128
35     ldx  #0
36     ldy  #9
37     jsr  move_sprites
38     lda  #2;) Cleared too late/3)too early at end of VBL
39     jsr  begin_timing
40     ldy  #61       ; 31497 delay
41     lda  #102
42     jsr  delay_ya4
43     ldy  $2002
44     ldx  $2002
45     jsr  check_sprite_overflow_timing
46
47     jsr  clear_sprite_table
48     lda  #0
49     ldx  #0
50     ldy  #9
51     jsr  move_sprites
52     lda  #0
53     ldx  #3
54     ldy  #9
55     jsr  move_sprites
56     lda  #4;) Set too early/5)too late for first scanline
57     jsr  begin_timing
58     ldy  #2        ; 1874 delay (1873 and 1875 work reliably,
59     lda  #184      ; 1872 and 1876 fail part of the time)
60     jsr  delay_ya5
61     ldx  $2002
62     ldy  $2002
63     jsr  check_sprite_overflow_timing
64
65     lda  #255
66     ldx  #3
67     ldy  #9
68     jsr  move_sprites
69     lda  #6;) Sprite horizontal positions should have no effect on timing
70     jsr  begin_timing
71     ldy  #2        ; 1874 delay (1873 and 1875 work reliably,
72     lda  #184      ; 1872 and 1876 fail part of the time)
73     jsr  delay_ya5
74     lda  $2002
75     ldx  $2002
76     and  #$20
77     jsr  error_if_ne
78     txa
79     and  #$20
80     jsr  error_if_eq
81
82     jsr  clear_sprite_table
83     lda  #0
84     ldx  #220
85     ldy  #9
86     jsr  move_sprites
87     lda  #7;) Set too early/ 8)late for last sprites on first scanline
88     jsr  begin_timing
89     ldy  #8        ; 1911 delay (1909 fails often and 1912 fails occasionally)
90     lda  #46
91     jsr  delay_ya6
92     ldx  $2002
93     ldy  $2002
94     jsr  check_sprite_overflow_timing
95
96     jsr  clear_sprite_table
97     lda  #239
98     ldx  #0
99     ldy  #9
100     jsr  move_sprites
101     lda  #9;) Set too early/10)too late for last scanline
102     jsr  begin_timing
103     ldy  #26       ; 29040 delay (29038 and 29042 fail sometimes)
104     lda  #222
105     jsr  delay_ya7
106     ldx  $2002
107     ldy  $2002
108     jsr  check_sprite_overflow_timing
109
110     jsr  clear_sprite_table
111     lda  #0
112     ldx  #0
113     ldy  #8
114     jsr  move_sprites
115     lda  #0
116     sta  sprites + 255
117     lda  #11;) Set too early/12)too late when 9th sprite # is way after 8th
118     jsr  begin_timing
119     ldy  #8        ; 1911 delay (1909 fails often and 1912 fails occasionally)
120     lda  #46
121     jsr  delay_ya6
122     ldx  $2002
123     ldy  $2002
124     jsr  check_sprite_overflow_timing
125
126     jsr  clear_sprite_table
127     lda  #0
128     ldx  #4
129     ldy  #8
130     jsr  move_sprites
131     lda  #1
132     sta  sprites + 0
133     lda  #13;) Overflow on second scanline occurs too early/14)too late
134     jsr  begin_timing
135     ldy  #3        ; 1987 delay (1986 & 1988 work too)
136     lda  #130
137     jsr  delay_ya2
138     ldx  $2002
139     ldy  $2002
140     jsr  check_sprite_overflow_timing
141
142     jmp  tests_passed
143