aboutsummaryrefslogtreecommitdiff
path: root/bunny.gbasm
blob: c6a06de4c3ea90c8c0017ac9eabcccd7a5873027 (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
Initialize_Bunny:
	LD A, $05
	LD $mem_bunny_x, A
	LD A, $04
	LD $mem_bunny_y, A
	LD A, $08
	LD $reg_viewport_x, A
	LD A, $50
	LD $mem_bunny_x_px, A
	LD A, $50
	LD $mem_bunny_y_px, A
	RET

Move_Bunny:
	LD C, $00 ; (bit 0 = has_scrolled)
	LD A, $mem_moving_sprite_direction
	CP $00
	JR NZ, =Move_Bunny.check_direction

	LD A, $mem_button_direction
	LD $mem_moving_sprite_direction, A
	CP $00
	JP Z, =Move_Bunny.end

	Move_Bunny.check_direction:
		LD $mem_sprite_direction, A

		DEC A
		LD B, $01
		BIT 0, A
		JR NZ, =Move_Bunny.check_direction_end
		LD B, $FF

	Move_Bunny.check_direction_end:

	BIT 1, A
	JR NZ, =Move_Bunny.vertical_px_move

	Move_Bunny.horizontal_px_move:
		LD A, $mem_bunny_x_px
		ADD B
		CP $30
		JR C, =Move_Bunny.horizontal_px_move.scrolling_fallback
		CP $71
		JR NC, =Move_Bunny.horizontal_px_move.scrolling_fallback
		LD $mem_bunny_x_px, A
		JP =Move_Bunny.check_end_of_movement
		Move_Bunny.horizontal_px_move.scrolling_fallback:
			SET 0, C
			LD A, $reg_viewport_x
			ADD B
			LD $reg_viewport_x, A
			JP =Move_Bunny.check_end_of_movement


	Move_Bunny.vertical_px_move:
		LD A, $mem_bunny_y_px
		ADD B
		CP $30
		JR C, =Move_Bunny.vertical_px_move.scrolling_fallback
		CP $71
		JR NC, =Move_Bunny.vertical_px_move.scrolling_fallback
		LD $mem_bunny_y_px, A
		JP =Move_Bunny.check_end_of_movement
		Move_Bunny.vertical_px_move.scrolling_fallback:
			SET 0, C
			LD A, $reg_viewport_y
			ADD B
			LD $reg_viewport_y, A
			JP =Move_Bunny.check_end_of_movement

	Move_Bunny.check_end_of_movement:
		LD A, $mem_moving_animation_step
		INC A
		AND $0f
		LD $mem_moving_animation_step, A
		JR NZ, =Move_Bunny.end
		LD $mem_moving_sprite_direction, A
		LD A, $mem_sprite_direction
		DEC A

		BIT 1, A
		JR NZ, =Move_Bunny.vertical_tile_move

		Move_Bunny.horizontal_tile_move:
			BIT 0, C
			JR Z, =Move_Bunny.horizontal_tile_move.move_viewport_end
			LD A, $mem_viewport_x
			ADD B
			LD $mem_viewport_x, A
			Move_Bunny.horizontal_tile_move.move_viewport_end:
			LD A, $mem_bunny_x
			ADD B
			LD $mem_bunny_x, A
			JP =Move_Bunny.end

		Move_Bunny.vertical_tile_move:
			BIT 0, C
			JR Z, =Move_Bunny.vertical_tile_move.move_viewport_end
			LD A, $mem_viewport_y
			ADD B
			LD $mem_viewport_y, A
			Move_Bunny.vertical_tile_move.move_viewport_end:
			LD A, $mem_bunny_y
			ADD B
			LD $mem_bunny_y, A

	Move_Bunny.end:
	RET

Display_Bunny: ; X position in $81, Y position in $80
	LD A, $mem_viewport_x
	LD HL, $9840
	CALL =Print_8bit

	LD A, $mem_viewport_y
	LD HL, $9860
	CALL =Print_8bit

	LD A, $mem_bunny_x_px
	LD B, A
	LD A, $mem_bunny_y_px
	LD C, A
	LD A, $mem_moving_animation_step

	SUB $08
	BIT 7, A
	JR Z, =Display_Bunny.Hop_ABS1_end

	; Adding hop animation to Y
	XOR $ff
	INC A
	Display_Bunny.Hop_ABS1_end:
	SUB $04
	BIT 7, A
	JR Z, =Display_Bunny.Hop_ABS2_end
	XOR $ff
	INC A
	Display_Bunny.Hop_ABS2_end:
	ADD C

	LD C, A

	LD A, $mem_sprite_direction
	CP $enum_direction_left
	JR Z, =Display_Bunny.Left_Direction_sprite
	CP $enum_direction_right
	JR Z, =Display_Bunny.Right_Direction_sprite
	CP $enum_direction_up
	JR Z, =Display_Bunny.Up_Direction_sprite
	JP =Display_Bunny.Down_Direction_sprite

	Display_Bunny.Left_Direction_sprite:
		LD E, $01
		LD D, $00
		JP =Display_Bunny.Write_OBJ

	Display_Bunny.Right_Direction_sprite:
		LD E, $03
		LD D, $20
		JP =Display_Bunny.Write_OBJ

	Display_Bunny.Up_Direction_sprite:
		LD E, $05
		LD D, $00
		JP =Display_Bunny.Write_OBJ

	Display_Bunny.Down_Direction_sprite:
		LD E, $09
		LD D, $00
		JP =Display_Bunny.Write_OBJ

	Display_Bunny.Write_OBJ:
	; First OBJ (left)
	LD HL, $FE00
	LD A, C
	LD (HL+), A
	LD A, B
	LD (HL+), A
	LD A, E
	LD (HL+), A
	LD A, D
	LD (HL+), A
	
	; Second OBJ
	LD A, B
	ADD $08
	LD B, A

	LD A, C
	LD (HL+), A
	LD A, B
	LD (HL+), A
	LD A, E
	XOR $02
	LD (HL+), A
	LD A, D
	LD (HL+), A
	RET