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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
cpu gameboy
option output-file,gb.gb
option output-format,gameboy
;option gameboy-irq,vbl,vbl_code
VRAM equ $8000
SCRN equ $9800
OAM equ $fe00
LCDC equ $ff40
STAT equ $ff41
BGRDPAL equ $ff47
OBJ0PAL equ $ff48
OBJ1PAL equ $ff49
CURLINE equ $ff44
READY equ $ff81
XPOS equ $ff82
VBLANK macro
push af
.wait
ldh a,(CURLINE)
cp 144
jr nz,wait
pop af
endm
;
; **********
; CODE START
; **********
;
org $150
di
xor a
ldh (READY),a
ld sp,$fffe
; Set LCD so only sprites show
;
VBLANK
ld a,$81
ldh (LCDC),a
ld a,$10
ldh (STAT),a
ld a,$e4
ldh (BGRDPAL),a
ldh (OBJ0PAL),a
ldh (OBJ1PAL),a
; Copy to VRAM
;
ld hl,VRAM
ld de,sprite
ld c,16
VBLANK
.copy
ld a,(de)
ld (hl+),a
inc de
dec c
jr nz,copy
ld a,1
ldh (READY),a
ei
VBLANK
; Set sprite numbers
;
xor a
ld (OAM+2),a
ld (OAM+6),a
ld (OAM+10),a
; Set sprite flags
;
ld a,$80
ld (OAM+3),a
ld (OAM+7),a
ld (OAM+11),a
.idle
VBLANK
ldh a,(XPOS)
inc a
ldh (XPOS),a
ld (OAM),a
ld (OAM+1),a
add 20
ld (OAM+4),a
ld (OAM+5),a
add 33
ld (OAM+8),a
ld (OAM+9),a
jr idle
vbl_code:
ldh a,(READY)
or a
jr z,finish
ldh a,(XPOS)
inc a
ldh (XPOS),a
ld (OAM),a
ld (OAM+1),a
xor a
ld (OAM+2),a
ld (OAM+3),a
.finish
reti
sprite:
defb $ff,$ff
defb $00,00
defb $ff,$ff
defb $00,00
defb $ff,$ff
defb $00,00
defb $ff,$ff
defb $00,00
defb $ff,$ff
defb $00,00
|