aboutsummaryrefslogtreecommitdiff
path: root/src/example/gb.asm
blob: 10381e98002f70c305877607e0096f735bfbbaeb (plain)
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