Kirby 64: The Crystal Shards

From en64 wiki
Jump to: navigation, search

Shygoo's GitHub repo:

  • A basic web-based model viewer
  • An awful web-based Collada DAE to Kirby64 geometry converter
  • Notes on various structures in ROM/RAM
  • Debugger script for Project64
  • Debugger symbol file for Project64 (N64 SDK function addresses)
  • A patch for analog stick support
  • Most notes seen here

OS and Audio Functions


.blank Notes

Region (U)

Audio stuff

00250320 audio sequence table

800909B3 Music Modifier


Stage stuff

800D5E00 stage text

800F78B8 load next section of level

800D6B9C level to load?

800E9FE0 level selection?

800BE4F0 current screen?
800A3820 asm for next screen


800BE500 current world
800BE504 current stage

800D1F98 level table
0007A1E8 ROM

800D1D10 G63 M6MIRACLE
800D1E30 ABE200
800D1E54 ABE100
800D1F2C ITEM01


aaaabbbb ccccdddd eeeeffff
gggghhhh iiiijjjj kkkkllll

aa = model bank? uses table at 800D00C4
bb = level model
gg = collision bank? uses table at 800D0184
hh = collision model/object data? uses table at 800CFCE0
zz = Level Name RAM Pointer

Kirby model numbers:
07 Kirby
08 Kirby Inhaling
09 Fat Kirby
0A Kirby Burning
0B Stone Kirby
0C Stone Kirby Ball
0D Freezing Kirby
61 Waddle Dee
6C Dedede
70 Adeliene

00076490 level model table?

0128E780 First Level Model

00077F38 texture table for 01D28720

802F4A10 level 1 level map info

xxxxxxxx yyyyyyyy zzzzzzzz

zz = objects

802F6670 level 1 map objects

2C long?

aabbccdd eeeeffff xxxxxxxx yyyyyyyy
zzzzzzzz pppppppp qqqqqqqq rrrrrrrr
jjjjjjjj kkkkkkkk llllllll

bb = object type?
  00 = enemy
  03 = item/object
cc = object
dd = variable

99999999 to end map object list

Enemy list

00 N-Z
01 Rocky
02 Bronto Burt
03 Skud
04 Gordo
05 Shotzo
06 Spark-i
07 Bouncy
08 Glunk

48 Mopoo
49 Zebon

Item list

00 Maxim Tomato
01 Sandwich
02 Cake
03 Meat
04 Popsicle
05 Invincibility
06 Yellow Star
07 Blue Star
08 Crystal Shard (crashes game)
09 1-Up
0A Mat you jump on (crashes game)
0B Dandelion
0C Fish
0D Butterfly

Enemy stuff

800FCAC4 asm to load enemy

800E77DC where fire enemy gets stored when walked by

801c29c0 enemy object table?

801C3EB4 fire enemy's shit?

00074F10 unknown table

00074A10 table for 011291B0?

0006C8F0 unknown table

Region (J)

Screen, model, animation, level stuff

800BCF93 Current screen

800d4564 table for asm of screens

8012CEF4 actions?


800481F2 load button press

8016B648 asm set kirby's standing animation S3,S2


800A8754 asm load animation table?


800C6B04 animation table?
0006EDC8 ROM

801950E0 action table
000F5C00 ROM




800D09C4 RAM
00078C88 Level Table

80007C18 load ram pointer when inhaling

800D5B7C p1 character multiplayer


80185D94 multiplayer models
80158FA8 models to load in level select

8016A8A0 Load Kirby Model
8016A800 function

800cebe6 level type?
80127588 table for level types

0006E590 object model table

07 Kirby
61 Waddle Dee
6C Dedede
70 Adeleine

800D6A58 where model pointers get written in RAM


8012CEF0 all of kirby's stuff?

800DECB3 Kirby's Current Model

8014FC6C asm to load title screen
8014FE70 JAL to write Kirby to Title Screen
8014FD78 JAL to write Waddle Dee to title Screen
8014FEE8 JAL to write Dedede to title Screen
8014FDF4 JAL to write Adeleine to title screen
8014FF54 asm to load fairy

8014FEC0 ASM Set Kirby's Animation 02DD
8014FDC8 ASM Set Waddl Dee's Animation
8014FF38 ASM Set Dedede's animations

80154AE0 set waddle dee running animation?

8015ABB0 asm for each character in title screen
001021D0 ROM

000D554B current song playing


800DC9B0 current action + 2

00 Standing
01 Walking
02 Running
03 Jumping
04 Landing
05 Falling
06 Landing
07 Landing
08 Crouching
0A Going underneath platform
0B Floating
12 Toss Star Upwards
16 Sucking in Air
18 Blow out air
19 Toss Star Forwards
21 Burning
22 Stone
23 Ice
24 Needle
25 Bombsss
26 Spark
27 Cutter
28 Super Fireball (Burning + Burning)
29 Volcano (Burning + Stone)
2A Melting Ice Block (Burning + Ice)
2B Flaming Arrow (Burning + Needle)
2C Fireworks (Burning + Bomb)
2D Giant Stone Kirby (Stone + Stone)
2E Drill (Stone +Needle)
2F Dynamite (Stone + Bomb)
30 Curling Stone (Stone + Ice)
31 Giant Spiny Snowflake (Ice + Needle)
32 Explosive Snowman (Ice + Bomb)
33 Refrigerator Kirby (Ice + Spark)
34 Rolling Snowbal (Ice + Ice)
35 Swiss Army Kirby (Needle + Needle)
36 Spike Bomb (Needle + Bomb)
37 Tri-Missile Attack (Bomb + Bomb)
38 Match (Spark + Burning)
39 Lightning Boulder (Spark + Stone)
3A Lightning Rod (Spark + Needle)
3B Light Bulb (Spark + Bomb)
3C Super Electric Energy Field (Spark + Spark)
3D Sword of Fire (Cutter + Burning)
3E Animal Statue (Cutter + Stone)
3F Ice Skating (Cutter + Ice)
40 Giant Claws (Cutter + Needle)
41 Explosive Ninja Star (Cutter + Bomb)
42 Double-Bladed Laser Sword (Cutter + Spark)
43 Super Boomerang (Cutter + Cutter)
44 Standing (can't Move)
45 Running
46 Grabbing Crystal Shard
47 Walking

Shygoo's notes

ROM hacking doc
shygoo 2017


     ROM      RAM      Description
CODE -------- 80034240 DMA subroutine
     -------- 800A8BAC img_id_to_virtual (A0 = img_id_pair)
DATA -------- 800DF4D0 Holds pointer to segment 04
     -------- 800EC9F8 EEPROM Mirror A
	 -------- 800ECBB0 EEPROM Mirror B
CODE -------- 800FC9C0 spawn_entity (A0 = ??, A1 = struct entity*, A2 = ??)
     00042D28 -------- "RSP Gfx ucode F3DEX fifo 2.04H Yoshitaka Yasumoto 1998 Nintendo"
	 00076498 -------- Table of geometry block start/end ROM address pairs
     00076B2C -------- "Bank 7" offset list
	 00077CD4 -------- Another offset list
	 000783F4 -------- Main stage table
	 007DFA70 803448C0 Kirby character vertex data 
     -------- 80346A00 Kirby character microcode
     -------- 80348240 Kirby texture
     0128E770 80349F50 Stage 1-1 Area 0 geometry block
	 01BD5C80 -------- "Bank 7"; contains images for level geometry
	 01CE5A2A -------- Last resource in "Bank 7"
     01D43468 802F4A10 State 1-1 Area 0 settings block (0x2058 bytes)

Main stage table

The table at 000783F4 (800D01A4) controls how each area of a stage is loaded.
For each stage there is an array of area structs. Each list is terminated with an empty struct.

Area structure

  0x00: list_index geo_block_a  List-index of primary Geometry block
  0x04: list_index geo_block_b  List-index of secondary Geometry block
  0x08: u16        skybox_id    Skybox ID
  0x0A: ??
  0x0C: int        music_id     Music ID
  0x10: bank_index level_block  Bank-index of Level settings block 
  0x14: ??
  0x16: ??                      (0009 plays cutscene and crashes)
  0x18: bank_index dust_block   Bank-index of Dust particle settings
  0x1C: bank_index dust_img     Bank-index of Dust particle image
  0x20: char*      area_name    Pointer to dev ASCII level name
  See Resource addressing systems for details on bank_index and list_index.

Geometry block

When a level starts, the entire block is loaded into segment 04.
A table exists at 00076498 with the start and end addresses of each block.
There are multiple lists in ROM that consist of start-end address pairs of the geometry blocks:

Block structure

   1. Header
   2. Vertices
   3. Microcode
   4. G_SETTIMG references
   5. G_VTX references
   6. Entry point groups (Optional)
   7. Layout
   8. Texture scroll settings (Optional)
   9. Unknown2 (Optional)


The header is 32 bytes in size and references assets within the block.
On load, all segptrs in the header are converted to virtual addresses in-place.

   0x00: segptr layout           Points to the Layout section
   0x04: segptr tex_scroll       Points to the Texture scroll section (Optional)
   0x08: int    rendering_mode   Determines how the Layout section is interpreted
   0x0C: segptr img_refs         Points to the G_SETTIMG reference list
   0x10: segptr vtx_refs         Points to the G_VTX reference list
   0x14: int    n_unknown2       Number of entries in the Unknown2 section
   0x18: segptr unknown2         Points the the Unknown2 section (Optional)
   0x1C: int    ??
   b_have_unknown2 checked by code @ 800A9424, 800F6F3C, 800F7110
   0x1C *4|1, passed to 0x800A8358
   unknown2 last 12 bytes of the file? (optional field?)
   rendering_mode is index of the subroutine table at 0x800D4F10, called every frame


16 bytes each, stored buffer-ready:

   0x00: s16 Vx
   0x02: s16 Vy
   0x04: s16 Vz
   0x06: u16 unused
   0x08: s16 U
   0x0A: s16 V
   0x0C: u8  R
   0x0D: u8  G
   0x0E: u8  B
   0x0F: u8  A


All G_SETTIMG addresses for level geometry are stored as bank-indeces.
On load, each bank-index is converted to a virtual address in-place.
[When reading the addresses, if the resource is not in memory, the game loads it?]
All G_VTX addresses are segptrs referencing vertices within the block.

If texture scroll settings are used, there will be jumps to segment 0x0E (Texture scroll settings).

G_SETTIMG reference list

Zero-terminated list of segptrs, all pointing to microcode beginning with G_SETTIMG (0xFD) commands.
[Used to fill in the virtual addresses?]
If there are no images, there will still be a pointer in the header, but the list will just consist of a single 0x00000000.

G_VTX reference list

Zero-terminated list of segptrs, all pointing to microcode beginning with G_VTX (0x01) commands.

Entry point groups

(Optional section for rendering modes 0x18, ....)

Groups display lists together with lists of segptrs to their entry points. Each struct is 8 bytes in size:

   0x00: int    command
   0x04: segptr entry_point

The command field seems to be:

00000000: Start group
   00000001: Continue group
   00000004: End group (entry_point will be NULL)


The interpretation of this section depends on the rendering mode defined in the header.

The following modes are used for the stages and characters:

    0x13: ?
    0x14: List of entry points?
    0x17: List of entry points with matrices
    0x18: List of groups with matrices
    0x1B: ? only on dev level
    0x1C: ? only on dev level

Mode 0x14:

Zero-terminated list of segptrs to microcode entry points.
All elements will be placed without changes to position, rotation, or scaling.

    Mode 0x17:                  |  Mode 0x18:
     0x00: int    command?      |   0x00: int    command?
     0x04: segptr entry_point   |   0x04: segptr group
     0x08: float  x_translation |   0x08: float  x_translation
     0x0C: float  y_translation |   0x0C: float  y_translation
     0x10: float  z_translation |   0x10: float  z_translation
     0x14: float  x_rotation    |   0x14: float  x_rotation
     0x18: float  y_rotation    |   0x18: float  y_rotation
     0x1C: float  z_rotation    |   0x1C: float  z_rotation
     0x20: float  x_scale       |   0x20: float  x_scale
     0x24: float  y_scale       |   0x24: float  y_scale
     0x28: float  z_scale       |   0x28: float  z_scale

It seems if entry_point_list is NULL, the settings are multipliers for following matrices.

	For mode 0x17 and 0x18, command 0x12 seems to terminate the list.
    (Seen command values = 00000000 (always first), 00000001, 00000002, 00000012, 00060000)

Texture scroll settings

(Optional section)

Inserts G_DL branches and dynamic G_SETTILESIZE commands into segment 0x0E for texture scrolling.


   1. Header 0x20 (32) bytes
   2. Big structs 0x78 (120) bytes each
   3. List A?
   4. List B?
   The header and lists are followed by 0x99999999, maybe an end-marker
   1. Header
    0x0C: segptr to segptr list A
    0x10: segptr to segptr list B
   2. Big structs
   3/4. List A/B
    Zero-terminated list of segptrs, all pointing to Big structs


(Optional section)

One or more bank-index pairs? Count is determined by the header's n_unknown2 field.

Level settings block

The level settings block controls the camera, collisions,
Basic structure

   1. Header
   2. Unknown1
   3. Unknown2
   3. Secondary header?
   4. Entity List


   0x00: u32 Offset to unknown 2
   0x04: u32 Offset of secondary header (collisions/camera)
   0x08: u32 Offset of Entity list

When the entity block is loaded, the offsets are converted to virtual addresses in-place.

Entity list

Each entity struct is 0x2C (44) bytes in size and contains information like type, position, and scale:

   0x00: u8 ?
   0x01: u8 ?
   0x02: u8 entity_id
   0x04: u8 ?
   0x05: u8 ?
   0x06: u16 ?
   ....: ?
   0x20: float scale
   0x24: x position

See kirby-entity-ids.txt for a list of entity IDs.
The subroutine at 800FC9C0 ("spawn_entity") is used to spawn individual entities when Kirby is within range.
There is a 4-byte end marker 0x99999999 at the end of the list.

Particle settings block

Determines how dust particles move around in a level.

1. Number of particles
2. Particle offset list
3. Particle settings

Variable-length structures? (The floats seem to control the speed of the particles)

Resource addressing systems

A few different addressing systems are used to reference and load resources from ROM.

Bank-index addressing

   A = Bank number, selects bank ROM address
   B = Index, selects bank offset
   (Index+1 is used to calculate the size of the resource.)

Misc banks
(Level settings, particle images, ...)
The function at 800A9AA8 is used to load the resource and return its RAM address. (800D0184 table of pointers to offset lists?)

   Bank  Address  Offsets
   0000  004F3290 0006CA0C
   0001  007BACA0 0006FA64
   0002  00964660 000712D0
   0003  00BD6DB0 000730C4
   0007  01D28720 00077F30

Image banks
Bank-indeces for images are used for addresses for G_SETTIMG commands in display lists.
The function at 800A8BAC is used to load the resource and return its RAM address.

   Bank Address  Offsets
   0001 005B5360 0006D1E4
   0002 00858740
   0003 009D8CB0 000D9268
   0005 011291B0 00074A0C
   0007 01BD5C80 00076B28

List-index addressing
(geometry blocks only?)

   A = List number, selects the list
   B = Index, selects the ROM start-end address pair from the list

Geometry block list
There are multiple lists of ROM start-end address pairs for geometry blocks.
The function at 800A9864 is used to load the resource and return its RAM address.


   List Addresses Description
   0000 0006C8F0
   0001 0006CA44
   0002 0006FA94
   0003 00071300
   0007 00076490  Level geometry


EEPROM is 0x118 bytes. Software mirrors of it are kept at 0x800EC9F8 and 0x800ECBB0 in RAM.<br>
*It consists of a header and three files.
*Each section is ended with a checksum.<br>
The checksum is generated by adding 0x97538642 to the sum of all words in a section. (Routine 0x800B8F34)
 0x00 Header
 0x10 File 1
 0x68 File 2
 0xC0 File 3

Header is 0x10 bytes
Offset 0x0C checksum

Three files, 0x58 bytes each
File+0x18 u16 minigame jumping record

36.6 = 1310
32.84 = 988

File+0x54 is a checksum
Checksum is generated by adding the sum of all words in file to const 0x97538642 (Routine 0x800B8F34)

Entity IDs

shygoo 2017
For names:

 00 00 N-Z
 00 01 Rocky
 00 02 Bronto Burt
 00 03 Skud
 00 04 Gordo
 00 05 Shotzo
 00 06 Spark-i
 00 07 Bouncy
 00 08 Glunk
 00 09 [?? explodes]
 00 0A Chilly
 00 0B Propeller
 00 0C Glom
 00 0D Mahall
 00 0E Poppy Bros. Jr.
 00 0F Bivolt
 00 10 Splinter
 00 11 Gobblin
 00 12 Kany
 00 13 Bivolt again?
 00 14 Sirkibble
 00 15 Gabon
 00 16 Mariel
 00 17 Large I3
 00 18 Snipper
 00 19 [?? explodes again?]
 00 1A Bonehead
 00 1B Squibbly
 00 1C Bobo
 00 1D Bo
 00 1E Punc
 00 1F Mite
 00 20 Sandman
 00 21 Flopper
 00 22 Kapar
 00 23 Maw
 00 24 Drop
 00 25 Pedo
 00 26 Noo
 00 27 Tick
 00 28 Cairn
 00 29 [?? invisible]
 00 2A Pompey
 00 2B Hack
 00 2C Burnis
 00 2D Fishbone
 00 2E Frigis
 00 2F Sawyer
 00 30 Turbite
 00 31 Plugg
 00 32 Ghost knight
 00 33 Zoos
 00 34 Kakti
 00 35 Rockn
 00 36 Chacha
 00 37 Galbo
 00 38 Bumber
 00 39 Scarfy
 00 3A Nruff
 00 3B Emp
 00 3C Magoo
 00 3D Yariko
 00 3E invisible?
 00 3F Wall Shotzo
 00 40 Keke
 00 41 Sparky
 00 42 Ignus // falling rocks
 00 43 Flora
 00 44 Putt
 00 45 Pteran
 00 46 Mumbies
 00 47 Pupa
 00 48 Mopoo
 00 49 Zebon
 00 4A [invisible?]
 00 4B [falling rocks sometimes blue]
 00 4C [falling rocks sometimes blue bigger?]

 01 00 Waddle Dee Boss
 01 01 Ado Boss
 01 02 DeeDeeDee Boss
 02 00 Whispy Woods
 02 01 Waddle Dee (Boss)
 03 00 Maxim Tomato
 03 01 Sandwich
 03 02 Cake
 03 03 Steak
 03 04 Ice Cream Bar
 03 05 Invinsible Candy
 03 06 Yellow Star
 03 07 Blue Star
 03 08 [crashes]
 03 09 1up
 03 0A [crashes] // used in picnic area
 03 0B Flower
 03 0C School of fish
 03 0D Butterfly
 05 // warps
 07 01 Ado (Gives maxim tomato)

 08 00 N-Z Boss
 08 01 Bouncy Boss
 08 02 Kakti Boss
 08 03 ?
 08 04 Spark-i Boss
 08 05 Tick Boss
 08 06 Kany Boss
 08 07 Kapar Boss
 08 08 Blowfish boss
 08 09 Galbo boss
 08 0A drop boss?

"Rough" Notes

shygoo 2017


geometry file

header+0x04 is scrolling texture settings

for each struct in the section, there is a jump to segment 0E in the microcode

target grows by 8 for each eg

0E000000, 0E000008, 0E0000010

Segment 0E structure

 802C97F0: DE010000 802C9828 // G_DL branch 802C9828
 802C97F8: DE010000 802C9838 // G_DL branch 802C9838
 802C9828: F20AC021 001A421D // G_SETTILESIZE <- Coordinates change actively to scroll texture
 802C9830: DF000000 00000000 // G_ENDDL
 802C9838: F20AC021 001A421D // G_SETTILESIZE <- Coordinates change actively to scroll texture
 802C9830: DF000000 00000000 // G_ENDDL
 For each list of segptrs to the scroll setting structs,
 there is a set of branches and g_settilesize instructions

 level 0 has a list of 7 and another list of 14
8036F1B8 scrolling structs
800CE248 geometry block addresses in ram 

Geo block loading
 800A9864 loadResource(a0 = resource id) // 00070001 = stage model
  800A9250 loadResource(a0 = resource id)
   80002E48 (romaddr & size)

 @800A92C4 watch a0 for addresses

Entity/camera block loading
 800A9AA8 calculates block size using the offset of the next block
  80002E48 a0 = address of entity table
@800A9B2C watch t2 & t3 for bank-offsets

0007003B -> 01D28720 + (0001AD48 : 0001CDA0)

1D43468 : 1D454C0

0007000D 01D28720 00004540 : 0000495C

Image loading

  00858740 00000844

000783F4 800D01A4 resource ID for stage 1-1 area 0 sits here (00070001)


Primary level table?

000783F4 800D01A4: structs, 0x24 (36) bytes in size

00       04       08   0A   0C       10       14   16
00070001 00000000 0002 007F 0000000D 0007003B 003C 0000 0007000D 0007000E 800D5E00
00070002 00000000 0003 007F 00000022 0007003C 003C 000A 0007001F 00070020 800D5E0C
00070003 00000000 0004 007F 0000000D 0007003D 003C 0000 0007000D 0007000E 800D5E18

Different bank contexts

800A9AA8 & 800A8B0C are nearly identical

all call 80002E48 to dma


8012E990 kirby xyz

8012E968 u32, float x, float y, float z
copied from here to kirby xyz

800E2950 z copied from here

kirby init pos


z pos copied from here 8012E974
copied from here 801926D4


Level settings

01D43468 802F4A10 State 1-1 area 0 block (0x2058 bytes)

00001268 = 802F5C78
 116 bytes?
00001C50 = 802F6660
 00000009 00001BC0 00001AF4 00001B48
 00000009 802F65d0 802F6504 802F6558
          ^ camera & collision stuff?

   802f55b4 802f5cec 802f64c4 00020000
00001C60 = 802F6670 object positions

 00000009 number of items
 00001BC0 offset to some structs (3 offsets & a number) (9 structs)
  000015A4 offset of something 144 bytes
  000012DC offset of something 72 bytes
  00001AB4 offset of something 8 bytes
 00001AF4 offset to some bytes
 00001B48 offset to some floats (30 of them)


80047510 ptr to current collision?

802F568C first white block
802F56BC on bridge
802F577C platform
802F579C on block

collision struct 0x30 bytes?

0x0C: Y

collision struct can be applied to multiple places


Environment particle block

1. Number of particles
2. Particle offset list
3. Particle settings


00000028 00000074 00000104 00000198 00000228 000002B8 00000310 00000378 000003BC

00000000 000000C0 00000000 3F800000 3F800000 00000000 00000000 00000000 00000000 00000000 3D4CCCCD 00000000 00000000 00000000 03D9792C A50001A5 0002A500 03A50004 01FF0000
00000000 000100C0 00000003 3C23D70A 3F800000 3FC00000 3FE66666 00000000 00000000 00000000 BF800000 41200000 00000000 00000000 03D9792C 4000A844 48000000 00000043 C80000AD A0004100 0000D700 FFFFFFCF 00F0A0D7 C8BA0707 0F002040 A0404140 0000CF40 F0B4EB40 BA07070A 002038A0 6041C800 00CF60FF FFFF00FA 20993CA3 D70A01FB 2028FF00
00000000 000100C0 00000003 3C23D70A 3F800000 3F99999A 3FF33333 00000000 00000000 00000000 BF800000 41200000 00000000 00000000 03D9792C 4000A844 48000000 00000043 C80000A6 00640080 ADA00041 000000D7 00FFFFFF CF00DCDC 3CC8BA11 11000020 34A02041 400000CF 20F0F0D2 40BA0707 00002030 A04041C8 0000CF40 FFFFFF00 FA14993C F5C28F01 FB04FF00
00000000 00010080 00000003 3C23D70A 3F800000 3FC00000 40200000 00000000 00000000 00000000 BF800000 41200000 00000000 00000000 03D9792C 4000A844 48000000 00000043 C80000AD A0004100 0000D700 FFFFFFCF 00DC9655 C8BA1134 00002034 A0204140 0000CF20 F0F0B440 BA070700 002030A0 4041C800 00CF4019 FFFF00FA 14993CA3 D70A01FB 08FF30A8
00000000 000100C0 00000003 3C23D70A 3F800000 3FB33333 3FE00000 3F800000 00000000 00000000 BF800000 41200000 00000000 00000000 03D9792C 4000A844 48000000 00000043 C80000AD A0004100 0000D700 5FDC5FCF 0078C878 C8BA001B 00002040 A0404140 0000CF40 C8F04640 BA000700 002038A0 6041C800 00CF60FF FFFF00FA 20993CA3 D70A01FB 2028FF6A
00000001 0001001E 00000002 3F800000 3F800000 00000000 41A00000 00000000 00000000 3FC90FDA C1700000 41700000 00000000 00000000 03D9792C 4000A23E 99999AA3 3F59999A AC003F80 000041A0 000014C8 0A000AFF
00000000 00010014 00000000 3F800000 3F800000 00000000 41000000 3F800000 C1F00000 3F5F66F3 C1A00000 41200000 00000000 00000000 03D9792C 4000ADD7 00FFFFFF CF00FFFF FFA00ABD 40000000 41200000 A23FA000 00A01442 480000B4 C814000A FFC18E71
00000001 0001001E 00000000 3F800000 3F800000 00000000 00000000 00000000 00000000 00000000 BF800000 41700000 00000000 00000000 03D9792C A50005A5 000601FF
00000000 00010019 00000000 3F800000 3F800000 00000000 41200000 41F00000 00000000 3FC90FDA C1700000 42480000 00000000 00000000 03D9792C 4000ADD7 00FFFFFF CF00FFFF FF64A23F 0CCCCDA3 3F333333 0AA01442 C80000C8 14000FFF


802F5E5C floats here mess with the collision


007DFA70 007E38C0 kirby character geometry block
6FA94 rom address list


Image address conversion

800A8BAC (A0 = bank_id_pair)

 void* bank_table[] @ 800D0104
 int bankno = (bank_id_pair >> 0x10) // upper
 int id = (bank_id_pair & 0xFFFF) // lower
 void* bank[] = bank_table[bankno]
 void* img_addr = bank[id]

0x01BD5C80 ROM Bank 7?
0x00076B2C Offset list

01BD5C80 + 00068A0A (image address)
passed to 80002E48

01BD5C80 + 0010FDAA

00078300: 01BD5C80 ; a reference to bank7 ?


fire thing position

800FC9C0 spawn_entity function

  a0 = ptr
  a1 = ptr to entity struct
  a2 = ptr
  a0 = ?
  a1 = ?
  a2 = float x_pos
   + 1268 = 802f5c78
   + 1C50 = 802F6660 more offsets converted to pointers within block?
      00000009 00001BC0 00001AF4 00001B48 becomes...
      00000009 802F65D0 802F6504 802F6558 
   + 1C60 = 802F6670 objects array

code at 800a9420 converts segptrs to ptrs in geo block

level screen selection

level loading related, entity block is in memory after this is called
800075C0 JAL 0x8000708C ; does not return to pc+8
800072F0 JALR RA, V1
 V1 = *(n + 0x88)
 n = {
  8015A064 ; game start
  8015A064 ; into screen
  8015A064 ; title screen
  8015AAC4 ; select file screen
  8015C074 ; planet selection
  8015A7DC ; stage selection
  80123F64 ; popstar 1
  8015AAC4 ; copy ability prompt
800F6600 JAL 0x800F8274
800F8348 JAL 0x800F78E4

 800a9aa8 converts offsets to pointers in the entity block