Register - Login
Views: 99377972
Main - Memberlist - Active users - Calendar - Wiki - IRC Chat - Online users
Ranks - Rules/FAQ - Stats - Latest Posts - Color Chart - Smilies
04-23-22 09:51:39 PM
Jul - SM64 Hacking (Archive) - Editing the RAM objects New poll - New thread - New reply
Pages: 1 2 Next newer thread | Next older thread
yoshiman
Member
Level: 23


Posts: 3/95
EXP: 67007
For next: 716

Since: 12-21-07

From: London, England

Since last post: 13.2 years
Last activity: 12.9 years

Posted on 12-23-07 08:47:27 PM Link | Quote
I know a lot about the so-called 'RAM objects,' I'm putting a list together about the different variables that belong to a structure. From what I understand, the level details only set a few of the variables such as position and rotation, very much as is the case of Ocarina of Time. However, the level details are copied to the RAM in Ocarina of Time but this does not seem to be the case for SM64.

One of the object variables is a pointer to the behaviour coding, for all we know there might be unused behaviours? This was how, for example, I made a ghost Peach by using the Big Boo behaviour pointer; the behaviour coding can be used in any level. But be warned, some behaviour pointers cause the game to crash if used with certain objects, this may be due to the coding finding values within the object structure that it doesn't 'like.'

I really need to look at the ASM in more detail, see how it handles the object behaviour. Compared to Ocarina of Timer and Resi Evil 2 on the N64 that I know quite a bit how the objects are handled, SM64 although simple has features that perhaps were planned to be used at one time. For example, you can rotate an object's collision idependent of the actual object rotation so you can, for e.g., read only the back or side of a signpost.

We really need to take SM64 apart, I'm sure there is something hiding...

James S.
Rena
I had one (1) message in Discord deleted and proceeded to make a huge, huge mess about how it was a violation of free speech and how moderators are supposed to be spam janitors and nobody should have the right to tell me not to talk about school shootings
Level: 135


Posts: 1889/5390
EXP: 29050276
For next: 284729

Since: 07-22-07

Pronouns: he/him/whatever
From: RSP Segment 6

Since last post: 333 days
Last activity: 333 days

Posted on 12-23-07 09:13:23 PM Link | Quote
Jul - Post #1889 - 12-23-07 04:13:23pm
I doubt that's really support for planned but unused features so much as just quirks of the way it's programmed. Many games have collision maps and actual level models separate for speed reasons (the collision map can have much less detail/fewer polygons since it's invisible), so you can make them mismatch if you want.
Originally posted by yoshiman
But be warned, some behaviour pointers cause the game to crash if used with certain objects, this may be due to the coding finding values within the object structure that it doesn't 'like.'
I'd guess it's more likely the code tries to reference a part that isn't in that model.

____________________
yoshiman
Member
Level: 23


Posts: 4/95
EXP: 67007
For next: 716

Since: 12-21-07

From: London, England

Since last post: 13.2 years
Last activity: 12.9 years

Posted on 12-23-07 09:19:47 PM Link | Quote
Am I right in thinking that the lower polygon Mario is used for collision purposes or is it the original model left in?

Even if there aren't any unused behaviour coding, understanding how objects are handled will allow us to create new behaviours. Say you wanted a Yoshi, which ended up in the SM64 DS version, then new behaviour coding would be needed.

James S.
VL-Tone
Member
Super Mario 64 forum moderator
Level: 53


Posts: 148/621
EXP: 1135498
For next: 21621

Since: 07-27-07

From: Montreal, Canada

Since last post: 4.7 years
Last activity: 1.2 years

Posted on 12-24-07 04:41:23 AM (last edited by VL-Tone at 12-24-07 04:22 AM) Link | Quote
Time: Now - Date: Today - Weather: What can be seen outside. - Mood: How it feels. Answer to the universe: 42
Originally posted by yoshiman

One of the object variables is a pointer to the behaviour coding, for all we know there might be unused behaviours? This was how, for example, I made a ghost Peach by using the Big Boo behaviour pointer; the behaviour coding can be used in any level. But be warned, some behaviour pointers cause the game to crash if used with certain objects, this may be due to the coding finding values within the object structure that it doesn't 'like.'

I really need to look at the ASM in more detail, see how it handles the object behaviour. Compared to Ocarina of Timer and Resi Evil 2 on the N64 that I know quite a bit how the objects are handled, SM64 although simple has features that perhaps were planned to be used at one time. For example, you can rotate an object's collision idependent of the actual object rotation so you can, for e.g., read only the back or side of a signpost.

We really need to take SM64 apart, I'm sure there is something hiding...

James S.




As I've said in the other thread, if the behavior pointers are the same as those that are set by ROM level commands, you might be interested in this document: http://homepage.mac.com/qubedstudios/SM64Behaviors.txt

The behavior pointers (13XXXXXX) refer to what I've called "behavior scripts" which are a few commands that set different aspects of the behavior for a given object. Behavior scripts can, amongst other things, set the animation sequence of an object (using the 0x27 command). The 0x27 command is described in more details in this thread: http://jul.rustedlogic.net/thread.php?id=954

Other behavior commands include one to set the collision map of a single object (0x2A) and other commands can spawn sub-objects (0x1C, 0x29 and 0x2C). The 0x0C command calls ASM routines found in RAM, and this is where the real magic happens.

[0C] [00 00 00] [80 2A CC 3C]


[0]= 0C is the command byte.
[1,2,3]= Always zero, unused?
[4,5,6,7]= Offset in RAM of the ASM function.



I haven't studied much of the ASM routines that are referred by the 0x0C commands, but once we reverse-engineer most of it, we'll be able to do very interesting stuff.

Originally posted by yoshiman
I know a lot about the so-called 'RAM objects,' I'm putting a list together about the different variables that belong to a structure. From what I understand, the level details only set a few of the variables such as position and rotation, very much as is the case of Ocarina of Time. However, the level details are copied to the RAM in Ocarina of Time but this does not seem to be the case for SM64.



At which address the RAM objects are stored?

The ROM level commands are also copied to RAM in SM64, like in OOT. I guess you just didn't stumble on them.

Originally posted by HyperHacker
I doubt that's really support for planned but unused features so much as just quirks of the way it's programmed. Many games have collision maps and actual level models separate for speed reasons (the collision map can have much less detail/fewer polygons since it's invisible), so you can make them mismatch if you want.
Originally posted by yoshiman
But be warned, some behaviour pointers cause the game to crash if used with certain objects, this may be due to the coding finding values within the object structure that it doesn't 'like.'
I'd guess it's more likely the code tries to reference a part that isn't in that model.


We're still looking for the Blargg behavior script. There's still a lot of undefined and un-referenced behavior scripts so there's still hope. I also more recently found the animation command pointer for the Blargg: it's 05 00 61 6C. So not only the model is still there, but also the animation data.

Some behavior scripts are dependent on data that's only present in certain levels. Those include behavior scripts that refer to collision data found in a specific memory bank (segment), or those that refer to animation data.

While some object indeed have polygonal collision maps (levels, platforms, boxes etc.), many enemies and Mario himself don't use polygons for collision detection. Because of the complexity of the body, and the fact that it's animated, a spherical collision bubble is instead used. There's no polygon involved, it's only a matter of detecting a collision if the distance between objects is less than X. This is how most 3d games worked until more recently when more powerful and precise physics engines were implemented in games.



Just a little note, the current thread is a related to this thread: http://jul.rustedlogic.net/thread.php?id=1607 (which was trashed).

yoshiman (aka James S.) is an experienced SM64 "RAM hacker" that can bring a lot to the SM64 hacking community because of his discoveries. More on his website at http://james.boshikoopa.googlepages.com/game_codes and http://james.boshikoopa.googlepages.com/game_hacking


____________________
yoshiman
Member
Level: 23


Posts: 5/95
EXP: 67007
For next: 716

Since: 12-21-07

From: London, England

Since last post: 13.2 years
Last activity: 12.9 years

Posted on 12-24-07 08:55:57 PM Link | Quote
What I mean by a pointer in the object structure (what you call a RAM object) I mean an actual address. It seems that in the ROM you use offset to the segment which makes sense since the actual RAM addresses aren't known. In the RAM, actual address pointers are used most of the time and look like this:

800E5F20 This is a pointer to Mario's gfx struxture for the PAL SM64.

This is confusing for some as it looks like a Gameshak code but it's just an aboslute address. Well, I say absolute as opposed to an offset added to a start address. In the RAM objects towards the end are pointers like above to the ASM coding, changing these alters how the obejct behaves.

I'm not totally sure but it seems every object can have at least 2 behaviours, perhaps 3. Often two of the the behaviour pointers are the same with a flag to say which one to use, with a third that I need to study more.

There does seem to be a lot of unused variables within each RAM object, for e.g., there are floating point values towards the end that look like size modifiers but they're at the beginning.

When I did a search for the instructions to set object positions in the RAM it didn't return many values which is strange.

James S.
Rena
I had one (1) message in Discord deleted and proceeded to make a huge, huge mess about how it was a violation of free speech and how moderators are supposed to be spam janitors and nobody should have the right to tell me not to talk about school shootings
Level: 135


Posts: 1894/5390
EXP: 29050276
For next: 284729

Since: 07-22-07

Pronouns: he/him/whatever
From: RSP Segment 6

Since last post: 333 days
Last activity: 333 days

Posted on 12-25-07 04:49:14 AM Link | Quote
Jul - Post #1894 - 12-24-07 11:49:14pm
Originally posted by yoshiman
Am I right in thinking that the lower polygon Mario is used for collision purposes or is it the original model left in?
I'm pretty sure it's for when Mario is far enough from the camera that most of the detail would be lost. A lot of games will use low-polygon models for far-away objects since you wouldn't notice it at that distance anyway.

____________________
VL-Tone
Member
Super Mario 64 forum moderator
Level: 53


Posts: 158/621
EXP: 1135498
For next: 21621

Since: 07-27-07

From: Montreal, Canada

Since last post: 4.7 years
Last activity: 1.2 years

Posted on 12-27-07 05:38:15 AM Link | Quote
Time: Now - Date: Today - Weather: What can be seen outside. - Mood: How it feels. Answer to the universe: 42
Originally posted by HyperHacker
Originally posted by yoshiman
Am I right in thinking that the lower polygon Mario is used for collision purposes or is it the original model left in?
I'm pretty sure it's for when Mario is far enough from the camera that most of the detail would be lost. A lot of games will use low-polygon models for far-away objects since you wouldn't notice it at that distance anyway.


Yeah it's a LOD (level of detail) system, but it only applies to Mario. There are actually 3 different Mario models. TT64 includes a feature to disable the low-polygon Mario and use the high-poly version in all cases, and somehow it doesn't seem to slow down the game.




Ok, so I've done a little RAM searching with the latest version of PJ64, and I've found the 608 bytes long RAM objects and did some experiments.

When in the Castle Ground level (NTSC version, which is the only one I'm gonna refer to), at 0x8033D6E8 in RAM you can find the data structure of a tree. This tree in TT64 is the 2nd object in the 0x43 list (the first being the Castle Tower).

At 0x33D788 you can find the current X Y and Z coordinates (and size?).

But the most interesting find was what yoshiman call the behavior pointers. To avoid confusion, we should use a different name since in TT64 it means something else.

Let me explain:

In the level setup commands found in ROM (and also copied in RAM), the behavior pointer for a tree is 13002AA4. It's a pointer for a behavior script, found at offset 0x2AA4 in bank 0x13

Here a quote from this doc: http://homepage.mac.com/qubedstudios/SM64Behaviors.txt


Behavior scripts are loaded in bank 0x13. They define some basic parameters an object behavior. The core of the behavior logic though is in ASM functions, which are called by the behavior scripts using the 0x0C command.


Bank 0x13 is copied to RAM from location 219E00 to 21F4C0 in ROM. The location in RAM of bank 0x13 is dependent on which other bank was loaded before, though I think that the banks loaded before are usually the same since these are shared by most levels.

So, to get back at this tree behavior script, here's what it looks like:


ROM Addr: 0021C8A4 Hex Behav: 13002AA4

Description: Tree Behavior
21C8A4/002AA4 00 0A 00 00
21C8A8/002AA8 21 00 00 00
21C8AC/002AAC 11 01 00 01
21C8B0/002AB0 10 2A 00 40
21C8B4/002AB4 23 00 00 00 00 50 01 F4
21C8BC/002ABC 10 05 00 00
21C8C0/002AC0 08 00 00 00
21C8C4/002AC4 0C 00 00 00 80 2C 63 E8
21C8CC/002ACC 09 00 00 00



The only command I know really in this particular script is the 0x0C command. It points to an ASM function in RAM (at location 0x802C63E8 in this case) where the actual behavior code is executed.

While experimenting in the 608-byte RAM object, I've found what yoshiman call the behavior pointer in this case: 0x80EDC44.

The pointer is found at two places in the 608 bytes structure, at 0x8033D8B4 and 0x8033D8BC.

Here's the interesting part, if you look at the location referred by the pointer (0x80EDC44), here's what you find:

80EDC44: 0C 00 00 00 80 2C 63 E8 09 00 00 00

Looks familiar? It's the 0x0C command found in the tree behavior script! And actually, the whole script is there, in fact this location is part of bank 0x13 in RAM.

In some object behavior scripts, there are more than one 0x0C commands, so that explains why yoshiman found objects that had multiple "behavior pointers".

I hope it's not too confusing...

To summarize, there are pointers in RAM object that refer to 0x0C command locations found in bank 0x13 in RAM. These pointers are probably set up while the level is created, and the behavior script for each object is read the first time. The 0x0C commands themselves refer to ASM functions found elsewhere in RAM.




Ok that's about it for now, I'm going to be in vacation for a week or so, with no or little internet access, in the meantime, please be kind to Metal_Man88

____________________
yoshiman
Member
Level: 23


Posts: 8/95
EXP: 67007
For next: 716

Since: 12-21-07

From: London, England

Since last post: 13.2 years
Last activity: 12.9 years

Posted on 12-27-07 09:00:12 PM Link | Quote
Yeah, the behaviour pointerss are nothing more than jumps to ASM, that is, coding stored in the RAM. But since that's copied from the ROM, it would be possible to alter how objects behave. I mean, create new behaviours, such as for Mario to ride Yoshi.

James S.

____________________
Time is the key...
VL-Tone
Member
Super Mario 64 forum moderator
Level: 53


Posts: 163/621
EXP: 1135498
For next: 21621

Since: 07-27-07

From: Montreal, Canada

Since last post: 4.7 years
Last activity: 1.2 years

Posted on 01-05-08 11:15:08 PM Link | Quote
Time: Now - Date: Today - Weather: What can be seen outside. - Mood: How it feels. Answer to the universe: 42
Originally posted by yoshiman
Yeah, the behaviour pointerss are nothing more than jumps to ASM, that is, coding stored in the RAM. But since that's copied from the ROM, it would be possible to alter how objects behave. I mean, create new behaviours, such as for Mario to ride Yoshi.

James S.



Mario riding Yoshi would be pretty nice, we're not quite there yet, but your info certainly help us move in that direction.

What else can you tell us about the RAM objects? It would be very useful if you could make a list of the variables/parameters you know about.

____________________
Rena
I had one (1) message in Discord deleted and proceeded to make a huge, huge mess about how it was a violation of free speech and how moderators are supposed to be spam janitors and nobody should have the right to tell me not to talk about school shootings
Level: 135


Posts: 2078/5390
EXP: 29050276
For next: 284729

Since: 07-22-07

Pronouns: he/him/whatever
From: RSP Segment 6

Since last post: 333 days
Last activity: 333 days

Posted on 01-06-08 06:53:23 AM Link | Quote
Jul - Post #2078 - 01-06-08 01:53:23am
Come to think of it, I documented a lot of this a few years ago for Gameshark codes.

First Goomba in Bob-omb Battlefield
Starts at: 803401A0
Ends at: 803403FF
803401A0: 3F 80 00 00 80 10 BF EE 00 18 00 21 80 33 FF 48
803401B0: 80 34 04 08 80 38 BD 88 00 00 00 00 80 18 D2 2C
803401C0: 01 01 00 00 BA 00 00 00 C5 30 C0 98 43 04 65 A6
803401D0: 45 A7 F7 D0 3F C0 00 00 3F C0 00 00 3F C0 00 00
803401E0: 00 00 00 00 80 18 0F 24 00 0D 09 92 00 0D 00 00
803401F0: 00 01 00 00 00 00 00 00 00 00 00 00 44 DF 6A 78
80340200: 44 04 53 72 C5 85 EC FC 80 34 04 08 80 33 CD E8
80340210: 80 34 01 A8 00 00 00 00 00 00 00 00 01 01 00 00
80340220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80340230: 00 00 00 00 40 00 20 49 00 00 00 00 00 00 00 00
80340240: 00 00 00 00 00 00 00 00 C5 30 C0 98 43 04 65 A6
80340250: 45 A7 F7 D0 BF FC BA 6C 3F AA AA AA BE 96 35 39
80340260: 3F FF 80 BA 00 00 00 00 00 00 00 00 00 00 00 00
80340270: FF FF BA 00 00 00 00 00 00 00 00 00 FF FF BA 00
80340280: 00 00 00 00 00 00 00 00 00 00 00 00 C0 80 00 00
80340290: 43 04 65 A6 00 00 00 02 00 00 00 00 00 00 00 00
803402A0: 3F C0 00 00 00 00 00 92 FF FF BA 00 00 00 00 21
803402B0: 00 00 00 00 3F AA AA AB 00 00 00 00 00 00 00 00
803402C0: 00 00 00 00 00 00 00 00 08 01 DA 4C 00 00 00 00
803402D0: 42 20 00 00 41 20 00 00 00 00 80 00 00 00 00 00
803402E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
803402F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 2F
80340300: BF 00 00 00 46 9C 40 00 FF FF CB 51 C5 29 90 00
80340310: 43 18 14 80 45 B4 90 00 41 20 00 00 00 00 00 00
80340320: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00
80340330: 00 00 00 00 00 00 00 00 00 00 00 00 44 7A 00 00
80340340: 00 00 00 01 45 7A 00 00 FF FF FF FF 00 00 00 00
80340350: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80340360: 00 29 00 00 00 00 00 00 80 1A 8C B0 50 60 B0 81
80340370: 00 00 00 00 80 0E F8 E4 00 00 00 01 80 0E F8 E4
80340380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80340390: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02
803403A0: 42 D8 00 00 42 96 00 00 42 7C 00 00 42 70 00 00
803403B0: 00 00 00 00 80 0E F8 AC 00 00 00 00 00 00 00 00
803403C0: 00 00 00 00 3F 80 00 00 00 00 00 00 00 00 00 00
803403D0: 00 00 00 00 00 00 00 00 3F 80 00 00 00 00 00 00
803403E0: 00 00 00 00 00 00 00 00 00 00 00 00 3F 80 00 00
803403F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


Blanks are unknown. (?) means it has only been tested with one type of object, or is not fully understood.
Bytes Description
001 - 027
028 - 031 Image Pointer (?)
032 - 032 Is Object Visible? 1=Yes 0=No
033 - 051
052 - 055 X Size
056 - 059 Y Size
060 - 063 Z Size
064 - 124
125 - 125 Does Object Exist? 1=Yes 0=No (See note 1)
126 - 126
127 - 127 Is Active?? (Only for teleporters, etc) (?)
128 - 149
150 - 150 ??? (See note 2)
151 - 151 Does Rotate? (Only for Stars, possibly coins) (?)
152 - 167
168 - 171 X Coordinates
172 - 175 Y Coordinates
176 - 179 Z Coordinates
180 - 209
210 - 211 Vertical Rotation (?)
212 - 221
222 - 223 Vertical Rotation Clone? (?) (See note 3)
224 - 250
251 - 251 Type (only for ! blocks, boxes, etc) (?)
252 - 255
256 - 259 Universal Size???
260 - 275
276 - 279 Speed
280 - 342
343 - 343 Action? (?)
344 - 351
352 - 353 ??? Jump Something? (See note 4)
354 - 355
356 - 359 ??? (?)
360 - 371
372 - 375 ??? (?) (See note 5)
376 - 393
394 - 395 Cash Value (only for Coins)/Damage Taken On Contact (Byte 395 only, unsigned) (?)
400 - 400 Star # (Only for Stars, obviously) (?)
401 - 406
407 - 407 Action Clone? (?) (See note 6)
408 - 411
412 - 413 Clipping??? (?) (See note 7)
414 - 415
416 - 419 Cash Held (See note 8)
420 - 421 Disappear Distance (Normally 457A, greater values = farther)
422 - 467
468 - 471 Stat Pointer? (?)
472 - 475
476 - 479 Object Type (Pointer)? (?)
480 - 607

Notes:
1. If you set the "Does Object Exist" byte (#125) to zero, it will not reappear unless you leave the area and return! I'm still checking out why.
2. The default value is 20h. If you change it to 1Fh or 22h, the object disappears. If you set it back to 20h, it pops out of the ground! Seems like a coordinate code, but how could 1Fh and 22h both be lower points than 20h?
3. This always seems to match the value of bytes 210 to 211 (Vertical Rotation). If you change it, it changes back! If you change the Vertical Rotation, this changes too!
4. I only tried this on Goombas. The default value is BF00. Set it to C000 and they'll start jumping, higher with each bounce!
5. Whatever this does, I seem to have lost my description.
6. This always seems to match the value at byte 343 (Action). If changed, it changes back. I tried using a code to write the value 07 to it constantly (on a Whomp in level 2), and when it jumped it'd just fly away!
7. This seems like a clipping field size for the Y coordinate, but there's something funky about it. The default value is always 447A. 407A removes all clipping, and 437A removes clipping for the top half. But by that logic, 487A should create an invisible barrier above the object, but it doesn't!
8. If using this on a Whomp, you can set it to anything from 0 (00000000h) to 2,147,483,647 (7FFFFFFFh). Any higher wields negative values resulting in no money. It's safe no matter how high it goes because you can only get one coin at a time by jumping on their backs and not pounding. But don't use anything higher than 40 (28h) on any object with which all the coins come out at once (IE a Goomba, box, etc), as the game won't be able to handle a lot of coins! 40 actually slows it down sometimes so I would stop there. If you have 2 objects with a lot of coins that spit them all out at once, you should probably only break one at a time and wait for all the coins to disappear (or get them) before breaking another.

Those offsets in the list are in decimal for some reason.

____________________
yoshiman
Member
Level: 23


Posts: 13/95
EXP: 67007
For next: 716

Since: 12-21-07

From: London, England

Since last post: 13.2 years
Last activity: 12.9 years

Posted on 01-06-08 09:02:13 PM (last edited by yoshiman at 01-07-08 05:43 PM) Link | Quote
Ok, here are some of the variables that I've found so far for an object structure and some information that I'm putting on my website:

Stored in the RAM while playing SM64 are the object structures which are simply an area of memory dedicated to each object that stores its position, rotation, and so on as well as defining how it looks. These object structures appear to be doubly-linked lists since the game was most likely programmed in either C or C++ and each object structure contains a pointer to the next and previous structure. Just think of a structure as a collection of variables bound to a particular object, each of the 240 objects that can be in a single level have this structure stored in the RAM one after another.

Each structure uses 608 (0x260) bytes, so all 240 objects in a level occupy a total of 145,920 (0x23A00) bytes. The first object structure is located in RAM at address 8030B0B8 for the PAL game and 8033D488 for the NTSC game.

What follows is that which I know about the variables contained within an object structure; not all variables are normally used by a single object and thus some variables will not have an effect on the object. The number in square brackets [] is the offset from the start of the object structure. Following that is an example value and then a description of how various values affect the object.

(f/p) is a floating-point value.
0x?? or 0x???? are hexadecimal values.

[0x00] 0x001800 Always that value, should not be changed as it marks the start of an object structure.
[0x03] 0x25 Alters how the object behaves in relation to the camera. 0x25 causes the object to always face the camera as is the case of the 2D objects like trees and other objects so that it appears 3D, however it can be used with 3D objects. 0x21 is used for true 3D objects so the object isn't forced to always face the camera since rotating the camera will show other parts of the object.
[0x04] 0x8030B0B8 Usually pointer to the previous object. If this is the first object, it will point to the last object.
[0x08] 0x8030B578 Usually pointer to the next object. If this is the last object, it will point to the first object.
[0x0C] 0x80386A20 Always equals this value, points to a structure that contains variables which affect all the objects.
[0x10] 0x00000000 ?
[0x14] 0x80195084 Pointer to the object's graphics structure.
[0x18] 0x01 Use graphics flag: =0x00 don't display object's graphics, =0x01 do display object's graphics.
[0x19] 0x01 Appears to have no effect on the object; usually equals 0x01 if [0x18]=0x01.
[0x1A] 0x0000 ?
[0x1C] 0x00000000 ?
[0x20] 0xC4A6A000 (f/p) Some form of coordinate?
[0x24] 0x4431C000 (f/p) Some form of coordinate?
[0x28] 0x44EB2000 (f/p) Some form of coordinate?
[0x2C] 0x3F800000 (f/p) X size modifier (scaling value).
[0x30] 0x3F800000 (f/p) Y size modifier (scaling value).
[0x34] 0x3F800000 (f/p) Z size modifier (sacling value).
[0x38] 0x00000000 ?
[0x3C] 0x80060030 Pointer to the object's animation structure; if zero, object is not animated.
[0x40] 0x00000000 ?
[0x44] 0x00000000 ?
[0x48] 0x00010000 ?
[0x4C] 0x00000000 ?
[0x50] 0x00000000 ?
[0x54] 0x3F751000 ?
[0x58] 0xC2D2C670 (f/p) Some form of coordinate?
[0x5C] 0xC444B1C0 (f/p) Some form of coordinate?
[0x60] 0x8030FA58 Pointer to object ?
[0x64] 0x8030F598 Pointer to object ?
[0x68] 0x8030F7F8 Pointer to object ?
[0x6C] 0x00000000 ?
[0x70] 0x00000000 ?
[0x74] 0x01 ?
[0x75] 0x01 Determines if the object is active: =0x00 remove the object (the structure remains), =0x01 continue using this object.
[0x76] 0x0001 ?
[0x78] 0x803194B8 Pointer to object?
[0x7C] 0x00000000 ?
[0x80] 0x00000000 ?
[0x84] 0x00000000 ?
[0x88] 0x00000000 ?
[0x8C] 0x0000
[0x8E] 0x0001 How much object homes in on Mario? 0x0001=Do not react to Mario.
0x2449=Rotate to face Mario.
[0x90] 0x00000000 ?
[0x94] 0x00000000 ?
[0x98] 0x00000000 ?
[0x9C] 0x00000000 ?
[0xA0] 0x45A54000 (f/p) X position in level.
[0xA4] 0x43C4FD52 (f/p) Y position in level.
[0xA8] 0xC4480000 (f/p) Z position in level.
[0xAC] 0x00000000 ?
[0xB0] 0x00000000 ?
[0xB4] 0x00000000 ?
[0xB8] 0x00000000 ?
[0xBC] 0x00000000 ?
[0xC0] 0x00000000 ?
[0xC4] 0x00000000 X collision rotation?
[0xC8] 0xFFFFBA00 Y collision rotation?
[0xCC] 0x00000000 Z collision rotation?
[0xD0] 0x00000000 X object rotation.
[0xD4] 0xFFFFBA00 Y object rotation.
[0xD8] 0x00000000 Z object rotation.
[0xDC] 0x00000000 ?
[0xF3] 0x00 For ! boxes, controls its colour (does not change what it gives out; use [0x147]):
0x00=red (wing cap).
0x01=green (metal cap).
0x02=blue(vanish cap).
0x03=yellow (other item such as coins).
For ordinary boxes changes the texture of its graphics: 0x00=Shifting Sands box texture.
0x01=Bob-omb Battlefield box texture.
For coins selects texture to use to animate its spinning; ranges from 0x00 to 0x07.
[0xFE] 0x0028 ?
[0x131] 0x80 0x00=Solid object; can be punched, kicked and climbed onto its top.
0x10=Similiar to 0x40.
0x20=Cause Mario damage upon contact ([0x183] determines how much damage); can't jump on top or bounce off.
0x40=Cause Mario damage upon contact ([0x183] determines how much damage); can jump onto top and bounce off.
0x80=Can be read like a signpost and climbed onto its top.
[0x133] 0x40 0x00=Solid object.
0x40=Object can be climbed.
[0x147] 0x32 Message to use for signposts and Bob-omb buddies (0x00 is the first message).
For ! boxes it controls what object is given after the box is broken (has no affect on the colour of the ! box unless a code is active before entering the level):
0x00=Wing cap.
0x01=Metal cap.
0x02=Vanish cap.
0x03=Koopa shell.
0x04=x1 yellow coin.
0x05=x3 yellow coins.
0x06=x10 yellow coins.
0x07=1-up mushroom (moves slowly).
0x08=Level star 1.
0x09=1-up mushroom (moves fast).
0x0A=Level star 2.
0x0B=Level star 3.
0x0C=Level star 4.
0x0D=Level star 5.
0x0E=Level star 6.
0x0F=nothing.
[0x14F] 0x04 Current action. For a platform lift: 0x01=Moving straight upwards.
0x02=Turning over.
0x03=Moving straight downwards.
0x04=Moving horizontally.
[0x156] 0x0033 Timer that increases until it reaches a certain value, resets to 0 and counts up again. Used by objects such as the platform lifts to decide when to change its movement type. For ! boxes it is used to delay the 'return' of the box.
[0x17F] 0xFF Level of transparency for object's graphics (only affects some graphics?) 0x00=completely transparent, 0xFF=opaque.
[0x183] 0x01 How many segments of damage to do Mario for objects that cause him harm; if zero enemy objects will push Mario away but not do him any harm.
[0x1CC] 0x800E3B50 Pointer to behavoiur coding.
[0x1D4] 0x800E3B50 Pointer to behaviour coding.
[0x20C] 0x800E3B20 Pointer to behaviour related data?

Hope this helps; it's far from complete.

I actually did Mario riding Yoshi by changing Yoshi's behaviour to that of a Koopa shell. But of course his animation wasn't right as Mario was surfing on Yoshi!

James S.

____________________
Time is the key...
VL-Tone
Member
Super Mario 64 forum moderator
Level: 53


Posts: 171/621
EXP: 1135498
For next: 21621

Since: 07-27-07

From: Montreal, Canada

Since last post: 4.7 years
Last activity: 1.2 years

Posted on 01-08-08 01:40:10 AM Link | Quote
Time: Now - Date: Today - Weather: What can be seen outside. - Mood: How it feels. Answer to the universe: 42
Wow, very interesting stuff you posted!

Just let me digest all this, I'm sure it will be useful in one way or the other.

____________________
yoshiman
Member
Level: 23


Posts: 21/95
EXP: 67007
For next: 716

Since: 12-21-07

From: London, England

Since last post: 13.2 years
Last activity: 12.9 years

Posted on 01-08-08 08:33:56 PM Link | Quote
I will put up more variables; it's very interesting to compare how different objects use the same variables in different ways. And there's stuff I've missed off such as how an ! box uses its size modifier to give the impression that it's squashed. The biggest mystery are the behaviour pointers as sometimes they don't point to ASM.

James S.

____________________
We English do things a little differently...Anyone for a cup of tea while we hack?!
messiaen
Catgirl
Level: 68


Posts: 35/1085
EXP: 2594026
For next: 134774

Since: 11-20-07


Since last post: 8.1 years
Last activity: 7.2 years

Posted on 04-18-08 08:17:26 PM (last edited by messiaen at 04-18-08 05:21 PM) Link | Quote
James, do you have more information regarding RAM objects you could post? I finally got an emulator which has RAM viewing support (Nemu).

So, the "10 2A 00 40" command we discussed in the behavior thread probably work with this byte:

[0x133] 0x40 0x00=Solid object.
0x40=Object can be climbed.

I am just wondering, how does 2A (dec 42) translates to offset 133 (307), if we assume that the second byte of the 0x10 command is the offset to be modified? Do you see any relation? I will try to change the "2A" byte and see if I can write to another offset in the RAM object.

Also, is there any easy way to locate a specific object in the RAM structure?

I think your information will be very important, because if most behavior commands just affect the object RAM, then it will be only a matter of time until we know precisely what each command do.

Also, be sure to check for "scaling" X,Y,Z values also for the collision data. If you look at my last post on the behavior thread, you will see that there is a command the scales the object and the collision data, so probably there are RAM values for that.
yoshiman
Member
Level: 23


Posts: 47/95
EXP: 67007
For next: 716

Since: 12-21-07

From: London, England

Since last post: 13.2 years
Last activity: 12.9 years

Posted on 04-18-08 10:48:45 PM Link | Quote
I will post soon an updated list of the variables used by the objects. I don't think that the commands used by the behaviour scripts specify the offset into the RAM object. I noticed the familiar value as mentioned on the behaviour script thread and tested by changing the value and it confirmed what the command does. So maybe the game knows what offset is to be used for the values used with each script command, but I might be wrong.

Each object is a 'RAM structure,' I call it that since it's a collection of variables bound to each object which in C (that the game was likely to have been programmed in) that's known as a structure. Actually, they look to be doubly linked-lists, in other words, each object has a pointer to the next and previous object.

The way I locate an object in a level is to search for the graphics value it uses and then you can narrow it down. With Mario, there is in the RAM a pointer to his object since which object he uses depends on the level. Unlike, in Ocarina of Time, where Link always used the same object.

I have found that each object has scaling variables for its size along the three axis, but the actual ASM forces them to fixed values for some objects such as Mario, Goombas and strangely the ! switches. People could change Mario's size equally along the 3 axis but it wasn't until I patched the actual coding that Luigi, Wario, etc size Mario was possible.

If you adjust the size of a box, its collision size updates also but for some objects it doesn't so that may be due to the different collision map or not even using polygons for collision as VL-TONE pointed out.

James S.

____________________
We English do things a little differently...Anyone for a cup of tea while we hack?!
RomanianGirl

Level: 16


Posts: 10/42
EXP: 19620
For next: 636

Since: 01-31-08

From: Canada

Since last post: 12.9 years
Last activity: 12.9 years

Posted on 05-03-08 05:46:32 PM Link | Quote
If I can ask a question, how would I find the ROM address from a Gameshark code? For example, I would like to know where to find the ROM address of 8108FE60 0036 so I can find it on the hex editor, and look at values nearby. If anyone can help me on this, Thank you very much, and hopefully with this I can discover more about Mario in Super Mario 64.
yoshiman
Member
Level: 23


Posts: 58/95
EXP: 67007
For next: 716

Since: 12-21-07

From: London, England

Since last post: 13.2 years
Last activity: 12.9 years

Posted on 05-12-08 10:33:20 PM Link | Quote
Finding the ROM address of a Gameshark code depends on what the code does. If the code gave Mario unlimited lives that would affect a variable which lives in the RAM so that could not be converted to a patch in the ROM unless you changed it to affect the coding (such as to not subtract a life when Mario was killed).

If it's changing colours that you want to do in the ROM usually these values aren't changed in the RAM for the current level but are loaded from the ROM due to system limitations. If the values are unique (i.e. something like 8EFC) do a search in the ROM and then compare with the bytes that follow to check that it's the right data.

Remember, of the two main Gameshark codes:

80 writes 8-bits
81 writes 16-bits

James S.

____________________
We English do things a little differently...Anyone for a cup of tea while we hack?!
Flamingo
Random nobody
Level: 3


Posts: 1/1
EXP: 71
For next: 57

Since: 05-13-08


Since last post: 13.9 years
Last activity: 13.9 years

Posted on 05-13-08 12:16:02 AM Link | Quote
Originally posted by VL-Tone
Originally posted by yoshiman
Yeah, the behaviour pointerss are nothing more than jumps to ASM, that is, coding stored in the RAM. But since that's copied from the ROM, it would be possible to alter how objects behave. I mean, create new behaviours, such as for Mario to ride Yoshi.

James S.


Mario riding Yoshi would be pretty nice, we're not quite there yet, but your info certainly help us move in that direction.

Yeah, like we could mix yoshi's model with the koopa shell's behavior. That would be awesome!
yoshiman
Member
Level: 23


Posts: 60/95
EXP: 67007
For next: 716

Since: 12-21-07

From: London, England

Since last post: 13.2 years
Last activity: 12.9 years

Posted on 05-13-08 11:14:43 PM Link | Quote
I've already done a code to ride Yoshi but there are problems with it:

(1) Mario's animation needs correcting
(2) Yoshi shouldn't spin around when not riding (easily fixed with ASM patch)
(3) If Yoshi touches water it's bye, bye

Of course, ideally we need a new behaviour for a ridable Yoshi but we could base it on the Koopa shell.

James S.

____________________
We English do things a little differently...Anyone for a cup of tea while we hack?!
Stevoisiak
Member
Level: 38


Posts: 77/283
EXP: 345474
For next: 24973

Since: 11-22-07

From: New York, Long Island

Since last post: 12.3 years
Last activity: 5.6 years

Posted on 05-14-08 10:16:50 PM Link | Quote
Originally posted by yoshiman
I've already done a code to ride Yoshi but there are problems with it:

(1) Mario's animation needs correcting
(2) Yoshi shouldn't spin around when not riding (easily fixed with ASM patch)
(3) If Yoshi touches water it's bye, bye

Of course, ideally we need a new behaviour for a ridable Yoshi but we could base it on the Koopa shell.

James S.

You mean yoshi cant go in water. If he touches a wall, its bye bye.
Pages: 1 2 Next newer thread | Next older thread
Jul - SM64 Hacking (Archive) - Editing the RAM objects New poll - New thread - New reply


Rusted Logic

Acmlmboard - commit 47be4dc [2021-08-23]
©2000-2022 Acmlm, Xkeeper, Kaito Sinclaire, et al.

34 database queries, 11 query cache hits.
Query execution time:  0.106619 seconds
Script execution time:  0.064566 seconds
Total render time:  0.171185 seconds


TidyHTML vomit below
line 1 column 1 - Warning: missing <!DOCTYPE> declaration
line 2 column 300 - Warning: unescaped & or unknown entity "&page"
line 119 column 11 - Warning: <form> isn't allowed in <table> elements
line 118 column 10 - Info: <table> previously mentioned
line 120 column 11 - Warning: missing <tr>
line 120 column 119 - Warning: missing </font> before </td>
line 124 column 16 - Warning: plain text isn't allowed in <tr> elements
line 120 column 11 - Info: <tr> previously mentioned
line 125 column 68 - Warning: missing </nobr> before </td>
line 141 column 68 - Warning: missing </nobr> before <tr>
line 147 column 35 - Warning: missing <tr>
line 147 column 50 - Warning: missing </font> before </td>
line 148 column 37 - Warning: unescaped & or unknown entity "&id"
line 147 column 194 - Warning: missing </font> before </table>
line 149 column 35 - Warning: missing <tr>
line 149 column 96 - Warning: unescaped & or unknown entity "&page"
line 149 column 50 - Warning: missing </font> before </td>
line 149 column 131 - Warning: missing </font> before </table>
line 156 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 158 column 9 - Warning: missing <tr>
line 176 column 13 - Warning: missing <tr>
line 177 column 99 - Warning: unescaped & or unknown entity "&postid"
line 190 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 192 column 9 - Warning: missing <tr>
line 210 column 13 - Warning: missing <tr>
line 211 column 99 - Warning: unescaped & or unknown entity "&postid"
line 213 column 84 - Warning: <style> isn't allowed in <td> elements
line 213 column 9 - Info: <td> previously mentioned
line 213 column 2151 - Warning: unescaped & or unknown entity "&pr"
line 213 column 2156 - Warning: unescaped & or unknown entity "&lv"
line 213 column 2162 - Warning: unescaped & or unknown entity "&ep"
line 213 column 2169 - Warning: unescaped & or unknown entity "&ed"
line 213 column 2177 - Warning: unescaped & or unknown entity "&ll"
line 213 column 2186 - Warning: unescaped & or unknown entity "&ex"
line 213 column 2197 - Warning: unescaped & or unknown entity "&le"
line 213 column 2208 - Warning: unescaped & or unknown entity "&eg"
line 213 column 2215 - Warning: unescaped & or unknown entity "&et"
line 213 column 3083 - Warning: unescaped & or unknown entity "&config"
line 216 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 218 column 9 - Warning: missing <tr>
line 236 column 13 - Warning: missing <tr>
line 237 column 99 - Warning: unescaped & or unknown entity "&postid"
line 246 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 248 column 9 - Warning: missing <tr>
line 266 column 13 - Warning: missing <tr>
line 267 column 99 - Warning: unescaped & or unknown entity "&postid"
line 269 column 73 - Warning: <style> isn't allowed in <td> elements
line 269 column 9 - Info: <td> previously mentioned
line 269 column 1511 - Warning: missing </font> before <blockquote>
line 269 column 1590 - Warning: inserting implicit <font>
line 269 column 1590 - Warning: missing </font> before <hr>
line 270 column 1 - Warning: inserting implicit <font>
line 270 column 1 - Warning: missing </font> before <hr>
line 277 column 1 - Warning: inserting implicit <font>
line 277 column 1 - Warning: missing </font> before <blockquote>
line 284 column 3675 - Warning: inserting implicit <font>
line 284 column 3675 - Warning: missing </font> before <hr>
line 290 column 1 - Warning: inserting implicit <font>
line 290 column 1 - Warning: missing </font> before <blockquote>
line 293 column 4066 - Warning: inserting implicit <font>
line 293 column 4066 - Warning: missing </font> before <hr>
line 293 column 4131 - Warning: inserting implicit <font>
line 293 column 4131 - Warning: missing </font> before <hr>
line 294 column 4538 - Warning: inserting implicit <font>
line 295 column 1 - Warning: inserting implicit <font>
line 295 column 1 - Warning: missing </font> before <blockquote>
line 300 column 4740 - Warning: inserting implicit <font>
line 300 column 4740 - Warning: missing </font> before <hr>
line 300 column 4808 - Warning: inserting implicit <font>
line 300 column 4808 - Warning: missing </font> before <blockquote>
line 300 column 5140 - Warning: inserting implicit <font>
line 300 column 5140 - Warning: missing </font> before <hr>
line 300 column 5205 - Warning: inserting implicit <font>
line 300 column 5205 - Warning: missing </font> before <hr>
line 300 column 5411 - Warning: inserting implicit <font>
line 300 column 5411 - Warning: missing </font> before <hr>
line 301 column 1 - Warning: inserting implicit <font>
line 301 column 1 - Warning: missing </font> before <hr>
line 309 column 1 - Warning: inserting implicit <font>
line 269 column 137 - Warning: missing </div>
line 315 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 317 column 9 - Warning: missing <tr>
line 335 column 13 - Warning: missing <tr>
line 336 column 99 - Warning: unescaped & or unknown entity "&postid"
line 353 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 355 column 9 - Warning: missing <tr>
line 373 column 13 - Warning: missing <tr>
line 374 column 99 - Warning: unescaped & or unknown entity "&postid"
line 376 column 84 - Warning: <style> isn't allowed in <td> elements
line 376 column 9 - Info: <td> previously mentioned
line 376 column 2151 - Warning: unescaped & or unknown entity "&pr"
line 376 column 2156 - Warning: unescaped & or unknown entity "&lv"
line 376 column 2162 - Warning: unescaped & or unknown entity "&ep"
line 376 column 2170 - Warning: unescaped & or unknown entity "&ed"
line 376 column 2179 - Warning: unescaped & or unknown entity "&ll"
line 376 column 2188 - Warning: unescaped & or unknown entity "&ex"
line 376 column 2199 - Warning: unescaped & or unknown entity "&le"
line 376 column 2210 - Warning: unescaped & or unknown entity "&eg"
line 376 column 2217 - Warning: unescaped & or unknown entity "&et"
line 376 column 2830 - Warning: unescaped & or unknown entity "&config"
line 379 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 381 column 9 - Warning: missing <tr>
line 399 column 13 - Warning: missing <tr>
line 400 column 99 - Warning: unescaped & or unknown entity "&postid"
line 402 column 73 - Warning: <style> isn't allowed in <td> elements
line 402 column 9 - Info: <td> previously mentioned
line 402 column 1511 - Warning: missing </font> before <blockquote>
line 402 column 1590 - Warning: inserting implicit <font>
line 402 column 1590 - Warning: missing </font> before <hr>
line 402 column 1670 - Warning: inserting implicit <font>
line 402 column 1670 - Warning: missing </font> before <hr>
line 402 column 1735 - Warning: inserting implicit <font>
line 402 column 1735 - Warning: missing </font> before <hr>
line 402 column 1871 - Warning: inserting implicit <font>
line 402 column 1871 - Warning: missing </font> before <hr>
line 403 column 1 - Warning: inserting implicit <font>
line 403 column 1 - Warning: missing </font> before <hr>
line 407 column 1 - Warning: inserting implicit <font>
line 407 column 1 - Warning: missing </font> before <blockquote>
line 422 column 3446 - Warning: inserting implicit <font>
line 422 column 3446 - Warning: missing </font> before <hr>
line 422 column 3450 - Warning: inserting implicit <font>
line 422 column 3450 - Warning: missing </font> before <hr>
line 423 column 1 - Warning: inserting implicit <font>
line 423 column 1 - Warning: missing </font> before <blockquote>
line 428 column 4061 - Warning: inserting implicit <font>
line 428 column 4061 - Warning: missing </font> before <hr>
line 439 column 1 - Warning: inserting implicit <font>
line 439 column 1 - Warning: missing </font> before <hr>
line 459 column 1 - Warning: inserting implicit <font>
line 402 column 137 - Warning: missing </div>
line 463 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 465 column 9 - Warning: missing <tr>
line 483 column 13 - Warning: missing <tr>
line 484 column 99 - Warning: unescaped & or unknown entity "&postid"
line 491 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 493 column 9 - Warning: missing <tr>
line 511 column 13 - Warning: missing <tr>
line 512 column 99 - Warning: unescaped & or unknown entity "&postid"
line 514 column 73 - Warning: <style> isn't allowed in <td> elements
line 514 column 9 - Info: <td> previously mentioned
line 514 column 1511 - Warning: missing </font> before <blockquote>
line 514 column 1590 - Warning: inserting implicit <font>
line 514 column 1590 - Warning: missing </font> before <hr>
line 514 column 1655 - Warning: inserting implicit <font>
line 514 column 1655 - Warning: missing </font> before <hr>
line 517 column 1 - Warning: inserting implicit <font>
line 514 column 137 - Warning: missing </div>
line 523 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 525 column 9 - Warning: missing <tr>
line 543 column 13 - Warning: missing <tr>
line 544 column 99 - Warning: unescaped & or unknown entity "&postid"
line 546 column 84 - Warning: <style> isn't allowed in <td> elements
line 546 column 9 - Info: <td> previously mentioned
line 652 column 8529 - Warning: unescaped & or unknown entity "&config"
line 652 column 8719 - Warning: unescaped & or unknown entity "&pr"
line 652 column 8724 - Warning: unescaped & or unknown entity "&lv"
line 652 column 8730 - Warning: unescaped & or unknown entity "&ep"
line 652 column 8738 - Warning: unescaped & or unknown entity "&ed"
line 652 column 8747 - Warning: unescaped & or unknown entity "&ll"
line 652 column 8756 - Warning: unescaped & or unknown entity "&ex"
line 652 column 8767 - Warning: unescaped & or unknown entity "&le"
line 652 column 8778 - Warning: unescaped & or unknown entity "&eg"
line 652 column 8785 - Warning: unescaped & or unknown entity "&et"
line 655 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 657 column 9 - Warning: missing <tr>
line 675 column 13 - Warning: missing <tr>
line 676 column 99 - Warning: unescaped & or unknown entity "&postid"
line 804 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 806 column 9 - Warning: missing <tr>
line 824 column 13 - Warning: missing <tr>
line 825 column 99 - Warning: unescaped & or unknown entity "&postid"
line 827 column 73 - Warning: <style> isn't allowed in <td> elements
line 827 column 9 - Info: <td> previously mentioned
line 827 column 137 - Warning: missing </div>
line 832 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 834 column 9 - Warning: missing <tr>
line 852 column 13 - Warning: missing <tr>
line 853 column 99 - Warning: unescaped & or unknown entity "&postid"
line 860 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 862 column 9 - Warning: missing <tr>
line 880 column 13 - Warning: missing <tr>
line 881 column 99 - Warning: unescaped & or unknown entity "&postid"
line 899 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 901 column 9 - Warning: missing <tr>
line 919 column 13 - Warning: missing <tr>
line 920 column 99 - Warning: unescaped & or unknown entity "&postid"
line 935 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 937 column 9 - Warning: missing <tr>
line 955 column 13 - Warning: missing <tr>
line 956 column 99 - Warning: unescaped & or unknown entity "&postid"
line 961 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 963 column 9 - Warning: missing <tr>
line 981 column 13 - Warning: missing <tr>
line 982 column 99 - Warning: unescaped & or unknown entity "&postid"
line 996 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 998 column 9 - Warning: missing <tr>
line 1016 column 13 - Warning: missing <tr>
line 1017 column 99 - Warning: unescaped & or unknown entity "&postid"
line 1027 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 1029 column 9 - Warning: missing <tr>
line 1047 column 13 - Warning: missing <tr>
line 1048 column 99 - Warning: unescaped & or unknown entity "&postid"
line 1061 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 1063 column 9 - Warning: missing <tr>
line 1081 column 13 - Warning: missing <tr>
line 1082 column 99 - Warning: unescaped & or unknown entity "&postid"
line 1096 column 17 - Warning: missing <tr>
line 1096 column 17 - Warning: discarding unexpected <table>
line 1099 column 35 - Warning: missing <tr>
line 1099 column 96 - Warning: unescaped & or unknown entity "&page"
line 1099 column 50 - Warning: missing </font> before </td>
line 1099 column 131 - Warning: missing </font> before </table>
line 1101 column 35 - Warning: missing <tr>
line 1101 column 50 - Warning: missing </font> before </td>
line 1102 column 37 - Warning: unescaped & or unknown entity "&id"
line 1101 column 194 - Warning: missing </font> before </table>
line 1103 column 17 - Warning: discarding unexpected </textarea>
line 1103 column 28 - Warning: discarding unexpected </form>
line 1103 column 35 - Warning: discarding unexpected </embed>
line 1103 column 43 - Warning: discarding unexpected </noembed>
line 1103 column 53 - Warning: discarding unexpected </noscript>
line 1103 column 64 - Warning: discarding unexpected </noembed>
line 1103 column 74 - Warning: discarding unexpected </embed>
line 1103 column 82 - Warning: discarding unexpected </table>
line 1103 column 90 - Warning: discarding unexpected </table>
line 1105 column 9 - Warning: missing </font> before <table>
line 1117 column 25 - Warning: discarding unexpected </font>
line 1126 column 58 - Warning: discarding unexpected </font>
line 1104 column 1 - Warning: missing </center>
line 120 column 63 - Warning: <img> lacks "alt" attribute
line 125 column 19 - Warning: <td> attribute "width" has invalid value "120px"
line 125 column 93 - Warning: <img> lacks "alt" attribute
line 141 column 19 - Warning: <td> attribute "width" has invalid value "120px"
line 141 column 98 - Warning: <img> lacks "alt" attribute
line 148 column 44 - Warning: <img> proprietary attribute value "absmiddle"
line 148 column 142 - Warning: <img> proprietary attribute value "absmiddle"
line 148 column 245 - Warning: <img> proprietary attribute value "absmiddle"
line 161 column 22 - Warning: <img> lacks "alt" attribute
line 161 column 63 - Warning: <img> lacks "alt" attribute
line 161 column 112 - Warning: <img> lacks "alt" attribute
line 161 column 161 - Warning: <img> lacks "alt" attribute
line 172 column 15 - Warning: <img> lacks "alt" attribute
line 195 column 23 - Warning: <img> lacks "alt" attribute
line 195 column 64 - Warning: <img> lacks "alt" attribute
line 195 column 113 - Warning: <img> lacks "alt" attribute
line 195 column 163 - Warning: <img> lacks "alt" attribute
line 206 column 15 - Warning: <img> lacks "alt" attribute
line 213 column 2094 - Warning: <img> lacks "alt" attribute
line 213 column 3094 - Warning: <img> lacks "alt" attribute
line 221 column 22 - Warning: <img> lacks "alt" attribute
line 221 column 63 - Warning: <img> lacks "alt" attribute
line 221 column 112 - Warning: <img> lacks "alt" attribute
line 221 column 161 - Warning: <img> lacks "alt" attribute
line 232 column 15 - Warning: <img> lacks "alt" attribute
line 251 column 22 - Warning: <img> lacks "alt" attribute
line 251 column 63 - Warning: <img> lacks "alt" attribute
line 251 column 112 - Warning: <img> lacks "alt" attribute
line 251 column 162 - Warning: <img> lacks "alt" attribute
line 262 column 15 - Warning: <img> lacks "alt" attribute
line 269 column 693 - Warning: <img> lacks "alt" attribute
line 312 column 7291 - Warning: <img> lacks "alt" attribute
line 312 column 7450 - Warning: <img> lacks "alt" attribute
line 320 column 22 - Warning: <img> lacks "alt" attribute
line 320 column 63 - Warning: <img> lacks "alt" attribute
line 320 column 112 - Warning: <img> lacks "alt" attribute
line 320 column 161 - Warning: <img> lacks "alt" attribute
line 331 column 15 - Warning: <img> lacks "alt" attribute
line 358 column 23 - Warning: <img> lacks "alt" attribute
line 358 column 64 - Warning: <img> lacks "alt" attribute
line 358 column 113 - Warning: <img> lacks "alt" attribute
line 358 column 163 - Warning: <img> lacks "alt" attribute
line 369 column 15 - Warning: <img> lacks "alt" attribute
line 376 column 2094 - Warning: <img> lacks "alt" attribute
line 376 column 2841 - Warning: <img> lacks "alt" attribute
line 384 column 22 - Warning: <img> lacks "alt" attribute
line 384 column 63 - Warning: <img> lacks "alt" attribute
line 384 column 112 - Warning: <img> lacks "alt" attribute
line 384 column 162 - Warning: <img> lacks "alt" attribute
line 395 column 15 - Warning: <img> lacks "alt" attribute
line 402 column 693 - Warning: <img> lacks "alt" attribute
line 460 column 5948 - Warning: <img> proprietary attribute value "absmiddle"
line 460 column 5948 - Warning: <img> lacks "alt" attribute
line 460 column 6081 - Warning: <img> lacks "alt" attribute
line 460 column 6240 - Warning: <img> lacks "alt" attribute
line 468 column 22 - Warning: <img> lacks "alt" attribute
line 468 column 63 - Warning: <img> lacks "alt" attribute
line 468 column 112 - Warning: <img> lacks "alt" attribute
line 468 column 161 - Warning: <img> lacks "alt" attribute
line 479 column 15 - Warning: <img> lacks "alt" attribute
line 496 column 22 - Warning: <img> lacks "alt" attribute
line 496 column 63 - Warning: <img> lacks "alt" attribute
line 496 column 112 - Warning: <img> lacks "alt" attribute
line 496 column 162 - Warning: <img> lacks "alt" attribute
line 507 column 15 - Warning: <img> lacks "alt" attribute
line 514 column 693 - Warning: <img> lacks "alt" attribute
line 520 column 2302 - Warning: <img> lacks "alt" attribute
line 520 column 2461 - Warning: <img> lacks "alt" attribute
line 528 column 23 - Warning: <img> lacks "alt" attribute
line 528 column 64 - Warning: <img> lacks "alt" attribute
line 528 column 113 - Warning: <img> lacks "alt" attribute
line 528 column 163 - Warning: <img> lacks "alt" attribute
line 539 column 15 - Warning: <img> lacks "alt" attribute
line 652 column 8305 - Warning: <img> proprietary attribute value "absmiddle"
line 652 column 8305 - Warning: <img> lacks "alt" attribute
line 652 column 8540 - Warning: <img> lacks "alt" attribute
line 652 column 8662 - Warning: <img> lacks "alt" attribute
line 660 column 22 - Warning: <img> lacks "alt" attribute
line 660 column 63 - Warning: <img> lacks "alt" attribute
line 660 column 112 - Warning: <img> lacks "alt" attribute
line 660 column 161 - Warning: <img> lacks "alt" attribute
line 671 column 15 - Warning: <img> lacks "alt" attribute
line 809 column 22 - Warning: <img> lacks "alt" attribute
line 809 column 63 - Warning: <img> lacks "alt" attribute
line 809 column 112 - Warning: <img> lacks "alt" attribute
line 809 column 162 - Warning: <img> lacks "alt" attribute
line 820 column 15 - Warning: <img> lacks "alt" attribute
line 827 column 693 - Warning: <img> lacks "alt" attribute
line 829 column 1706 - Warning: <img> proprietary attribute value "absmiddle"
line 829 column 1706 - Warning: <img> lacks "alt" attribute
line 829 column 1838 - Warning: <img> lacks "alt" attribute
line 829 column 1997 - Warning: <img> lacks "alt" attribute
line 837 column 22 - Warning: <img> lacks "alt" attribute
line 837 column 63 - Warning: <img> lacks "alt" attribute
line 837 column 112 - Warning: <img> lacks "alt" attribute
line 837 column 161 - Warning: <img> lacks "alt" attribute
line 848 column 15 - Warning: <img> lacks "alt" attribute
line 865 column 22 - Warning: <img> lacks "alt" attribute
line 865 column 63 - Warning: <img> lacks "alt" attribute
line 865 column 111 - Warning: <img> lacks "alt" attribute
line 865 column 161 - Warning: <img> lacks "alt" attribute
line 876 column 15 - Warning: <img> lacks "alt" attribute
line 904 column 22 - Warning: <img> lacks "alt" attribute
line 904 column 63 - Warning: <img> lacks "alt" attribute
line 904 column 112 - Warning: <img> lacks "alt" attribute
line 904 column 161 - Warning: <img> lacks "alt" attribute
line 915 column 15 - Warning: <img> lacks "alt" attribute
line 939 column 11 - Warning: <img> lacks "alt" attribute
line 940 column 22 - Warning: <img> lacks "alt" attribute
line 940 column 63 - Warning: <img> lacks "alt" attribute
line 940 column 112 - Warning: <img> lacks "alt" attribute
line 940 column 162 - Warning: <img> lacks "alt" attribute
line 941 column 11 - Warning: <img> lacks "alt" attribute
line 951 column 15 - Warning: <img> lacks "alt" attribute
line 966 column 22 - Warning: <img> lacks "alt" attribute
line 966 column 63 - Warning: <img> lacks "alt" attribute
line 966 column 112 - Warning: <img> lacks "alt" attribute
line 966 column 161 - Warning: <img> lacks "alt" attribute
line 977 column 15 - Warning: <img> lacks "alt" attribute
line 1001 column 21 - Warning: <img> lacks "alt" attribute
line 1001 column 62 - Warning: <img> lacks "alt" attribute
line 1001 column 111 - Warning: <img> lacks "alt" attribute
line 1001 column 161 - Warning: <img> lacks "alt" attribute
line 1012 column 15 - Warning: <img> lacks "alt" attribute
line 1032 column 22 - Warning: <img> lacks "alt" attribute
line 1032 column 63 - Warning: <img> lacks "alt" attribute
line 1032 column 112 - Warning: <img> lacks "alt" attribute
line 1032 column 161 - Warning: <img> lacks "alt" attribute
line 1043 column 15 - Warning: <img> lacks "alt" attribute
line 1066 column 22 - Warning: <img> lacks "alt" attribute
line 1066 column 63 - Warning: <img> lacks "alt" attribute
line 1066 column 112 - Warning: <img> lacks "alt" attribute
line 1066 column 162 - Warning: <img> lacks "alt" attribute
line 1077 column 15 - Warning: <img> lacks "alt" attribute
line 1102 column 44 - Warning: <img> proprietary attribute value "absmiddle"
line 1102 column 142 - Warning: <img> proprietary attribute value "absmiddle"
line 1102 column 245 - Warning: <img> proprietary attribute value "absmiddle"
line 1111 column 25 - Warning: <img> lacks "alt" attribute
line 1116 column 267 - Warning: <img> lacks "alt" attribute
line 269 column 1511 - Warning: trimming empty <font>
line 284 column 3675 - Warning: trimming empty <font>
line 294 column 4538 - Warning: trimming empty <font>
line 402 column 1511 - Warning: trimming empty <font>
line 422 column 3446 - Warning: trimming empty <font>
line 428 column 4061 - Warning: trimming empty <font>
line 514 column 1511 - Warning: trimming empty <font>
line 1096 column 17 - Warning: trimming empty <tr>
line 125 column 68 - Warning: <nobr> is not approved by W3C
line 141 column 68 - Warning: <nobr> is not approved by W3C
line 177 column 27 - Warning: <nobr> is not approved by W3C
line 211 column 27 - Warning: <nobr> is not approved by W3C
line 237 column 27 - Warning: <nobr> is not approved by W3C
line 267 column 27 - Warning: <nobr> is not approved by W3C
line 269 column 157 - Warning: <table> proprietary attribute "height"
line 269 column 222 - Warning: <td> proprietary attribute "background"
line 269 column 318 - Warning: <td> proprietary attribute "background"
line 269 column 408 - Warning: <table> proprietary attribute "height"
line 269 column 488 - Warning: <td> proprietary attribute "background"
line 269 column 1443 - Warning: <td> proprietary attribute "background"
line 336 column 27 - Warning: <nobr> is not approved by W3C
line 374 column 27 - Warning: <nobr> is not approved by W3C
line 400 column 27 - Warning: <nobr> is not approved by W3C
line 402 column 157 - Warning: <table> proprietary attribute "height"
line 402 column 222 - Warning: <td> proprietary attribute "background"
line 402 column 318 - Warning: <td> proprietary attribute "background"
line 402 column 408 - Warning: <table> proprietary attribute "height"
line 402 column 488 - Warning: <td> proprietary attribute "background"
line 402 column 1443 - Warning: <td> proprietary attribute "background"
line 484 column 27 - Warning: <nobr> is not approved by W3C
line 512 column 27 - Warning: <nobr> is not approved by W3C
line 514 column 157 - Warning: <table> proprietary attribute "height"
line 514 column 222 - Warning: <td> proprietary attribute "background"
line 514 column 318 - Warning: <td> proprietary attribute "background"
line 514 column 408 - Warning: <table> proprietary attribute "height"
line 514 column 488 - Warning: <td> proprietary attribute "background"
line 514 column 1443 - Warning: <td> proprietary attribute "background"
line 544 column 27 - Warning: <nobr> is not approved by W3C
line 676 column 27 - Warning: <nobr> is not approved by W3C
line 825 column 27 - Warning: <nobr> is not approved by W3C
line 827 column 157 - Warning: <table> proprietary attribute "height"
line 827 column 222 - Warning: <td> proprietary attribute "background"
line 827 column 318 - Warning: <td> proprietary attribute "background"
line 827 column 408 - Warning: <table> proprietary attribute "height"
line 827 column 488 - Warning: <td> proprietary attribute "background"
line 827 column 1443 - Warning: <td> proprietary attribute "background"
line 853 column 27 - Warning: <nobr> is not approved by W3C
line 881 column 27 - Warning: <nobr> is not approved by W3C
line 920 column 27 - Warning: <nobr> is not approved by W3C
line 956 column 27 - Warning: <nobr> is not approved by W3C
line 982 column 27 - Warning: <nobr> is not approved by W3C
line 1017 column 27 - Warning: <nobr> is not approved by W3C
line 1048 column 27 - Warning: <nobr> is not approved by W3C
line 1082 column 27 - Warning: <nobr> is not approved by W3C
Info: Document content looks like HTML5
Info: No system identifier in emitted doctype
Tidy found 414 warnings and 0 errors!


The alt attribute should be used to give a short description
of an image; longer descriptions should be given with the
longdesc attribute which takes a URL linked to the description.
These measures are needed for people using non-graphical browsers.

For further advice on how to make your pages accessible
see http://www.w3.org/WAI/GL.
You are recommended to use CSS to specify the font and
properties such as its size and color. This will reduce
the size of HTML files and make them easier to maintain
compared with using <FONT> elements.

You are recommended to use CSS to control line wrapping.
Use "white-space: nowrap" to inhibit wrapping in place
of inserting <NOBR>...</NOBR> into the markup.

About HTML Tidy: https://github.com/htacg/tidy-html5
Bug reports and comments: https://github.com/htacg/tidy-html5/issues
Official mailing list: https://lists.w3.org/Archives/Public/public-htacg/
Latest HTML specification: http://dev.w3.org/html5/spec-author-view/
Validate your HTML documents: http://validator.w3.org/nu/
Lobby your company to join the W3C: http://www.w3.org/Consortium

Do you speak a language other than English, or a different variant of
English? Consider helping us to localize HTML Tidy. For details please see
https://github.com/htacg/tidy-html5/blob/master/README/LOCALIZE.md