summaryrefslogtreecommitdiff
path: root/asm/src/veneer.s
blob: 420ab8b44103647ce51ffef4078b119cf1a72cc3 (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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
	.include "asm/macros.inc"
	.include "constants/constants.inc"

	.syntax unified

	.text

@ copies from the gMapDataBottomSpecial to the bg buffers depending on gUpdateVisibleTiles
	thumb_func_start UpdateScrollVram
UpdateScrollVram: @ 0x08000108
	push {r4, lr}
	ldr r0, _080001E8 @ =gUpdateVisibleTiles
	ldrb r1, [r0]
	lsls r1, r1, #2
	beq _08000136 @ jump if gUpdateVisibleTiles == 0
	add r4, pc, #0x20 @ r4 = 0x8000134
	ldr r4, [r4, r1] @ r4 = r4[gUpdateVisibleTiles] (1: _08000138, 2: _0800013C, 3: _08000140, 4:_08000144)
	ldr r0, _080001EC @ =gMapBottom
	ldr r0, [r0]
	cmp r0, #0
	beq _08000126 @ jump if gMapBottom.bgSettings == NULL
	ldr r0, _080001F0 @ =gMapDataBottomSpecial
	ldr r1, _080001F4 @ =gBG1Buffer+0x40
	bl _call_via_r4
_08000126:
	ldr r0, _080001F8 @ =gMapTop
	ldr r0, [r0]
	cmp r0, #0
	beq _08000136 @ jump if gMapTop.bgSettings == NULL
	ldr r0, _080001FC @ =gMapDataTopSpecial
	ldr r1, _08000200 @ =gBG2Buffer+0x40
	bl _call_via_r4
_08000136:
	pop {r4, pc}
_08000138:
_08000138: .4byte ram_sub_080B197C + 1
_0800013C: .4byte sub_0807D280 @ layer 1, 2, 3?
_08000140: .4byte sub_0807D46C
_08000144: .4byte sub_0807D6D8

	thumb_func_start SetCollisionData
SetCollisionData: @ 0x08000148
	lsls r2, r2, #2
	ldr r3, _08000204 @ =gCollisionDataPtrs
	ldr r2, [r3, r2]
	strb r0, [r2, r1]
	bx lr

	non_word_aligned_thumb_func_start CloneTile
CloneTile: @ 0x08000152
	lsls r2, r2, #2
	add r3, pc, #0x68
	ldr r3, [r3, r2]
	lsls r0, r0, #1
	ldrh r0, [r3, r0]
	lsrs r2, r2, #2

	non_word_aligned_thumb_func_start SetTile
SetTile: @ r0 = tile index, r1, = tile position, r2 = layer
	push {r4-r7, lr}
	lsls r3, r2, #3 @ 1: 8, 2: 16
	ldr r4, _08000208 @ =gMapDataPtrs
	ldr r5, [r4, r3] @ layer 1: gMapBottom.mapData, 2: gMapTop.mapData
	lsls r6, r1, #1
	ldrh r7, [r5, r6] @ r7 (oldTile) = gMapBottom.mapData[tilePos]
	strh r0, [r5, r6] @ gMapBottom.mapData[tilePos] = tileIndex
	ldr r6, _0800020C @ =0x00004000
	cmp r0, r6
	blo tile_wrong_type @ jump if tileIndex < 0x4000
	push {r1, r2}
	subs r4, r0, r6 @ r4 = tileIndex - 0x4000
	ldr r3, _08000210 @ =gMapSpecialTileToActTile
	ldrb r0, [r3, r4] @ r0 = gMapSpecialTileToActTile[tileIndex - 0x4000]
	bl SetActTileAtTilePos
	ldr r3, _08000214 @ =gMapSpecialTileToCollisionData
	ldrb r0, [r3, r4] @ r0 = gMapSpecialTileToCollisionData[tileIndex - 0x4000]
	lsrs r2, r2, #2 @ r2 = layer
	bl SetCollisionData
	pop {r0, r1} @ tilepos, layer
	push {r0, r1}
	bl UnregisterInteractTile @ DeleteLoadedTileEntity(tilePos, layer)
	adds r0, r7, #0 @ r0 = oldTile
	pop {r1, r2}
	bl RegisterInteractTile @ StoreTileForSpecialTile(oldTile, tilePos, layer)
	pop {r4, r5, r6, r7, pc} @ pop pc results in returning to the calling function
tile_wrong_type:
	adds r3, #4 @ r3 = layer * 8 + 4
	ldr r4, [r4, r3]
	lsls r0, r0, #1 @ r0 = tileIndex * 2
	ldrh r4, [r4, r0] @ r4 (tileType) = gMapBottom.tileTypes[tileIndex]
	push {r1, r2}
	ldr r3, _08000218 @ =gMapTileTypeToActTile
	ldrb r0, [r3, r4] @ r0 = gMapTileTypeToActTile[tileType]
	bl SetActTileAtTilePos
	ldr r3, _0800021C @ =gMapTileTypeToCollisionData
	ldrb r0, [r3, r4] @ r0 = gMapTileTypeToCollisionData[tileType]
	lsrs r2, r2, #2 @ r2 = layer
	bl SetCollisionData
	pop {r0, r1}
	bl UnregisterInteractTile
	pop {r4, r5, r6, r7, pc}
	.align 2, 0
_080001C0: .4byte gMapBottom+0x6004
_080001C4: .4byte gMapBottom+0x6004
_080001C8: .4byte gMapTop+0x6004
_080001CC: .4byte gMapBottom+0x6004

@ r0: @see gMapSpecialTileToActTile  r1: tilePos, r2: layer
	thumb_func_start SetActTileAtTilePos
SetActTileAtTilePos: @ 0x080001D0
	lsls r2, r2, #2
	ldr r3, _08000220 @ =gActTilePtrs
	ldr r3, [r3, r2] @ r3 = gMapBottom.actTiles
	strb r0, [r3, r1] @ gMapBottom.actTiles[tilePos] = r0
	bx lr

	non_word_aligned_thumb_func_start GetTileIndex
GetTileIndex: @ 0x080001DA
	lsls r1, r1, #3
	ldr r2, _08000224 @ =gMapDataPtrs
	ldr r1, [r2, r1]
	lsls r0, r0, #1
	ldrh r0, [r1, r0]
	bx lr
	.align 2, 0
_080001E8: .4byte gUpdateVisibleTiles
_080001EC: .4byte gMapBottom
_080001F0: .4byte gMapDataBottomSpecial
_080001F4: .4byte gBG1Buffer+0x40
_080001F8: .4byte gMapTop
_080001FC: .4byte gMapDataTopSpecial
_08000200: .4byte gBG2Buffer+0x40
_08000204: .4byte gCollisionDataPtrs
_08000208: .4byte gMapDataPtrs
_0800020C: .4byte 0x00004000
_08000210: .4byte gMapSpecialTileToActTile
_08000214: .4byte gMapSpecialTileToCollisionData
_08000218: .4byte gMapTileTypeToActTile
_0800021C: .4byte gMapTileTypeToCollisionData
_08000220: .4byte gActTilePtrs
_08000224: .4byte gMapDataPtrs

gMapDataPtrs::
	.4byte BOTTOM_TILEDATA @ layer 0
gTileTypesPtrs::
	.4byte BOTTOM_TILETYPES
	.4byte BOTTOM_TILEDATA @ layer 1
	.4byte BOTTOM_TILETYPES
	.4byte TOP_TILEDATA @ layer 2
	.4byte TOP_TILETYPES
	.4byte BOTTOM_TILEDATA @ layer 3
	.4byte BOTTOM_TILETYPES
gCollisionDataPtrs::
	.4byte BOTTOM_COLLISIONDATA @ layer 0
	.4byte BOTTOM_COLLISIONDATA @ layer 1
	.4byte TOP_COLLISIONDATA @ layer 2
	.4byte BOTTOM_COLLISIONDATA @ layer 3
gUnk_08000258:: @ mapDataOriginal and tileTypes
	.4byte BOTTOM_TILEDATAORIGINAL @ layer 0
	.4byte BOTTOM_TILETYPES
	.4byte BOTTOM_TILEDATAORIGINAL @ layer 1
	.4byte BOTTOM_TILETYPES
	.4byte TOP_TILEDATAORIGINAL @ layer 2
	.4byte TOP_TILETYPES
	.4byte BOTTOM_TILEDATAORIGINAL @ layer 3
	.4byte BOTTOM_TILETYPES
gActTilePtrs:: @ actTile for layers
	.4byte BOTTOM_ACTTILES @ layer 0
	.4byte BOTTOM_ACTTILES @ layer 1
	.4byte TOP_ACTTILES @ layer 2
	.4byte BOTTOM_ACTTILES @ layer 3

@ call 0x80B19CC
@ ========
@ Unused? Doesn't seem to be called by anything in Ghidra.
	thumb_func_start GetTileAtEntityPos
GetTileAtEntityPos: @ 0x08000288
	ldr r3, _080002F4 @ =ram_GetTileAtEntityPos
	bx r3

@ call 0x80B19D8
@ ========
@ Unused? Doesn't seem to be called by anything in Ghidra.
	thumb_func_start sub_080B19D8
sub_080B19D8: @ 0x0800028C
	ldr r3, _080002F8 @ =ram_sub_080B19D8
	bx r3

@ call 0x80B19EC
@ ========
@ Unused? Doesn't seem to be called by anything in Ghidra.
	thumb_func_start sub_080B19EC
sub_080B19EC: @ 0x08000290
	ldr r3, _080002FC @ =ram_sub_080B19EC
	bx r3

@ call 0x80B19FC
@ ========
@ Unused? Doesn't seem to be called by anything in Ghidra.
	thumb_func_start sub_080B19FC
sub_080B19FC: @ 0x08000294
	ldr r3, _08000300 @ =ram_sub_080B19FC
	bx r3

@ call 0x80B1A04
@ ========
@ Unused? Doesn't seem to be called by anything in Ghidra.
	thumb_func_start sub_080B1A04
sub_080B1A04: @ 0x08000298
	ldr r3, _08000304 @ =ram_sub_080B1A04
	bx r3

@ call 0x80B1A0C
@ r0: entity*
@ r1: s32
@ r2: s32
	thumb_func_start GetTileTypeRelativeToEntity
GetTileTypeRelativeToEntity: @ 0x0800029C
	ldr r3, _08000308 @ =ram_GetTileTypeRelativeToEntity
	bx r3

@ call 0x080B1A28
@ r0: entity
@ return: u32 (tileType)
	thumb_func_start GetTileTypeAtEntity
GetTileTypeAtEntity: @ 0x080002A0
	ldr r3, _0800030C @ =ram_GetTileTypeAtEntity
	bx r3

@ call 0x080B1A34
@ r0: s32 (xPos)
@ r1: s32 (yPos)
@ r2: u32 (layer)
@ return: u32 (tileType)
	thumb_func_start GetTileTypeAtWorldCoords
GetTileTypeAtWorldCoords: @ 0x080002A4
	ldr r3, _08000310 @ =ram_GetTileTypeAtWorldCoords
	bx r3

@ call 0x080B1A48
@ r0: s32 (xPos)
@ r1: s32 (yPos)
@ r2: u32 (layer)
	thumb_func_start GetTileTypeAtRoomCoords
GetTileTypeAtRoomCoords: @ 0x080002A8
	ldr r3, _08000314 @ =ram_GetTileTypeAtRoomCoords
	bx r3

@ call 0x080B1A58
@ r0: s32 (xPos)
@ r1: s32 (yPos)
@ r2: u32 (layer)
	thumb_func_start GetTileTypeAtRoomTile
GetTileTypeAtRoomTile: @ 0x080002AC
	ldr r3, _08000318 @ =ram_GetTileTypeAtRoomTile
	bx r3

@ call 0x080B1A60
@ r0: u32 (tileIndex)
@ r1: u32 (layer)
@ return: u32 (tileType)
	thumb_func_start GetTileTypeAtTilePos
GetTileTypeAtTilePos: @ 0x080002B0
	ldr r3, _0800031C @ =ram_GetTileType
	bx r3

@ call 0x080B1A8C
@ r0: Entity*
@ r1: u32
@ r2: u32
	thumb_func_start GetActTileRelativeToEntity
GetActTileRelativeToEntity: @ 0x080002B4
	ldr r3, _08000320 @ =ram_GetActTileRelativeToEntity
	bx r3

@ call 0x080B1AA8
@ r0:
@ r1:
@ r2:
@ return: 
@ ========
@ Called every frame a pot is thrown, every frame the screen is sliding in a transition, and once when entering stairs.
	thumb_func_start GetActTileAtEntity
GetActTileAtEntity: @ 0x080002B8
	ldr r3, _08000324 @ =ram_GetActTileAtEntity
	bx r3

@ call 0x080B1AB4
@ r0: s32 (xPos)
@ r1: s32 (yPos)
@ r2: u32 (layer)
	thumb_func_start GetActTileAtWorldCoords
GetActTileAtWorldCoords: @ 0x080002BC
	ldr r3, _08000328 @ =ram_GetActTileAtWorldCoords
	bx r3

@ call 0x080B1AC8
@ r0: u32
@ r1: u32
@ r2: u32
@ return: ???
	thumb_func_start GetActTileAtRoomCoords
GetActTileAtRoomCoords: @ 0x080002C0
	ldr r3, _0800032C @ =ram_GetActTileAtRoomCoords
	bx r3

@ call 0x080B1AD8
@ r0: Entity*
@ r1: s32 (xOffset)
@ r2: s32 (yOffset)
@ ========
@ Unused? Doesn't seem to be called by anything in Ghidra.
	thumb_func_start GetActTileAtRoomTile
GetActTileAtRoomTile: @ 0x080002C4
	ldr r3, _08000330 @ =ram_GetActTileAtRoomTile
	bx r3

@ call 0x080B1AE0
@ r0: u32 (tileIndex)
@ r1: u32 (layer)
	thumb_func_start GetActTileAtTilePos
GetActTileAtTilePos: @ 0x080002C8
	ldr r3, _08000334 @ =ram_GetActTileAtTilePos
	bx r3

@ call 0x080B1AF0
@ r0: Entity*
@ r1: ???
@ r2: ???
	thumb_func_start GetCollisionDataRelativeTo
GetCollisionDataRelativeTo: @ 0x080002CC
	ldr r3, _08000338 @ =ram_GetCollisionDataRelativeTo
	bx r3

@ call 0x080B1B0C
@ r0: Entity*
	thumb_func_start GetCollisionDataAtEntity
GetCollisionDataAtEntity: @ 0x080002D0
	ldr r3, _0800033C @ =ram_GetCollisionDataAtEntity
	bx r3

@ call 0x080B1B18
@ r0: s32 (xPos)
@ r1: s32 (yPos)
@ r2: u32 (layer)
	thumb_func_start GetCollisionDataAtWorldCoords
GetCollisionDataAtWorldCoords: @ 0x080002D4
	ldr r3, _08000340 @ =ram_GetCollisionDataAtWorldCoords
	bx r3

@ call 0x080B1B2C
@ ========
@ Unused? Doesn't seem to be called by anything in Ghidra.
	thumb_func_start GetCollisionDataAtRoomCoords
GetCollisionDataAtRoomCoords: @ 0x080002D8
	ldr r3, _08000344 @ =ram_GetCollisionDataAtRoomCoords
	bx r3

@ call 0x080B1B3C
@ ========
@ Unused? Doesn't seem to be called by anything in Ghidra.
	thumb_func_start GetCollisionDataAtRoomTile
GetCollisionDataAtRoomTile: @ 0x080002DC
	ldr r3, _08000348 @ =ram_GetCollisionDataAtRoomTile
	bx r3

@ call 0x080B1B44
	thumb_func_start GetCollisionDataAtTilePos
GetCollisionDataAtTilePos: @ 0x080002E0
	ldr r3, _0800034C @ =ram_GetCollisionDataAtTilePos
	bx r3

@ call 0x080B1B54
@ r0: u32 (tileIndex)
	thumb_func_start GetActTileForTileType
GetActTileForTileType: @ 0x080002E4
	ldr r3, _08000350 @ =ram_GetActTileForTileType
	bx r3

@ call 0x080B1B68
@ ========
@ Unused? Doesn't seem to be called by anything in Ghidra.
	thumb_func_start sub_080B1B68
sub_080B1B68: @ 0x080002E8
	ldr r3, _08000354 @ =ram_sub_080B1B68
	bx r3

@ call 0x080B1B84
@ r0: u32 (tileIndex)
@ r1: u32 (layer)
	thumb_func_start sub_080B1B84
sub_080B1B84: @ 0x080002EC
	ldr r3, _08000358 @ =ram_sub_080B1B84
	bx r3

@ call 0x080B1BA4
@ r0: u32 (tileIndex)
@ r1: u32 (layer)
@ r2: ???
	thumb_func_start sub_080B1BA4
sub_080B1BA4: @ 0x080002F0
	ldr r3, _0800035C @ =ram_sub_080B1BA4
	bx r3

_080002F4: .4byte ram_GetTileAtEntityPos
_080002F8: .4byte ram_sub_080B19D8
_080002FC: .4byte ram_sub_080B19EC
_08000300: .4byte ram_sub_080B19FC
_08000304: .4byte ram_sub_080B1A04
_08000308: .4byte ram_GetTileTypeRelativeToEntity
_0800030C: .4byte ram_GetTileTypeAtEntity
_08000310: .4byte ram_GetTileTypeAtWorldCoords
_08000314: .4byte ram_GetTileTypeAtRoomCoords
_08000318: .4byte ram_GetTileTypeAtRoomTile
_0800031C: .4byte ram_GetTileType
_08000320: .4byte ram_GetActTileRelativeToEntity
_08000324: .4byte ram_GetActTileAtEntity
_08000328: .4byte ram_GetActTileAtWorldCoords
_0800032C: .4byte ram_GetActTileAtRoomCoords
_08000330: .4byte ram_GetActTileAtRoomTile
_08000334: .4byte ram_GetActTileAtTilePos
_08000338: .4byte ram_GetCollisionDataRelativeTo
_0800033C: .4byte ram_GetCollisionDataAtEntity
_08000340: .4byte ram_GetCollisionDataAtWorldCoords
_08000344: .4byte ram_GetCollisionDataAtRoomCoords
_08000348: .4byte ram_GetCollisionDataAtRoomTile
_0800034C: .4byte ram_GetCollisionDataAtTilePos
_08000350: .4byte ram_GetActTileForTileType
_08000354: .4byte ram_sub_080B1B68
_08000358: .4byte ram_sub_080B1B84
_0800035C: .4byte ram_sub_080B1BA4