Register - Login
Views: 99379361
Main - Memberlist - Active users - Calendar - Wiki - IRC Chat - Online users
Ranks - Rules/FAQ - Stats - Latest Posts - Color Chart - Smilies
04-23-22 10:53:48 PM
Jul - SM64 Hacking (Archive) - Mario 64 'C' header files New poll - New thread - New reply
Pages: 1 2 3 Next newer thread | Next older thread
messiaen
Catgirl
Level: 68


Posts: 479/1085
EXP: 2594037
For next: 134763

Since: 11-20-07


Since last post: 8.1 years
Last activity: 7.2 years

Posted on 02-18-09 11:17:39 PM (last edited by messiaen at 02-20-09 05:44 PM) Link | Quote
Hi,

Haven't been working much on this lately but I decided to share it as there's lot of potential in it. Basically, this is a header file (mario64.h) with function prototypes and mapped structs which provide easy access to the RAM objects.

These are be used on a GCC compiler targetting the MIPS architecture. You can find a very nice tutorial (by ZZT32) on setting up a "N64" Toolchain on Windows.

There is one complete example hack that can be used as a Gameshark code included (the "Mario 64 Explosive Objects" code), plus some other smaller hacks and even a recompilable "disassembly" of the Moving-Up-and-Down behavior.

If you want to look at (much better than mine) examples of hacking N64 games using a mipgs-gcc compiler, I recommend also looking at GZRT (ROM tool for Zelda64 games) Googlecode page.

Eventually, when more functions are mapped and when we have some list of animation pointers compiled, creating replacement behaviors for existing animated objects (ie, Yoshi) will be possible.

Download Mario64 header file and code examples.

Note: this is geared to people with already some basic knowledge of C and MIPS.

____________________
Mario 64 notes @ http://sites.google.com/site/messiaen64/
Hectamatatortron
Member
Level: 35


Posts: 112/232
EXP: 257991
For next: 21945

Since: 09-19-07


Since last post: 7.2 years
Last activity: 5.3 years

Posted on 02-20-09 04:00:05 AM Link | Quote
Hm? I thought you got this idea from me :/

You didn't list any of my examples at all!

____________________
messiaen
Catgirl
Level: 68


Posts: 480/1085
EXP: 2594037
For next: 134763

Since: 11-20-07


Since last post: 8.1 years
Last activity: 7.2 years

Posted on 02-20-09 11:16:46 AM Link | Quote
Hi, thanks for reminding me about your hacks, that was really what inspired me in the first place. I am very grateful both to you and ZZT32, who set up the "N64" Toolchain I'm using (GCC + MIPS binutils) and has helped me a lot during the past two months. When I posted the thread I was in a bit of hurry, and forgot to mention also about your Mischief Makers hacks.

I also mention Yoshielectron and Cellar Dweller's on the mario64.h file, but let me also thanks them in a public way for all the information on numerous aspects of the game. Basically, the header file is a (still very incomplete) compilation of their notes - and eventually more of Nagra's will be used - along with some stuff by me.

Also, I forgot to include a readme.txt or something, I will probably update the zip file as soon as possible with some information about how to interface with behavior scripts, where to hook code and how to set up a loader for custom ASM.

____________________
Mario 64 notes @ http://sites.google.com/site/messiaen64/
OOnet
Random nobody
Level: 8


Posts: 6/9
EXP: 1977
For next: 210

Since: 08-14-07

From: France

Since last post: 13.2 years
Last activity: 13.2 years

Posted on 02-20-09 06:22:50 PM Link | Quote
Is this possible to setting the N64 Toolchain on Vista ?
I tried it but I always have "CreateProcess: no such file or directory" when I build the code.
Bob-omb8194
Still Explodin'
Level: 80


Posts: 4/1654
EXP: 4665777
For next: 117192

Since: 02-19-09

From: NC, US

Since last post: 10.8 years
Last activity: 10.8 years

Posted on 02-20-09 08:31:17 PM Link | Quote
How do you use it? I'm not sure how...
OOnet
Random nobody
Level: 8


Posts: 7/9
EXP: 1977
For next: 210

Since: 08-14-07

From: France

Since last post: 13.2 years
Last activity: 13.2 years

Posted on 02-20-09 08:59:38 PM Link | Quote
I found the problem, on Vista you have to specify a directory to properly build.
If someone have the same CreateProcess problem : add to your msys' PATH the directory root/libexec/gcc/mips64/4.3.2 from your n64 toolchain directory.

But now I have a problem with the "as" program, it doesn't recognize the -EB option.
Hectamatatortron
Member
Level: 35


Posts: 113/232
EXP: 257991
For next: 21945

Since: 09-19-07


Since last post: 7.2 years
Last activity: 5.3 years

Posted on 02-20-09 09:42:17 PM Link | Quote
ZZT is a friend of mine from Kodewerx; he showed me some of his quirky projects (I believe one was a Brainfuck interpreter in C?).

I knew he dabbled in N64 hacking, but I wasn't aware he had a system for setting up an N64 toolchain.

I haven't looked at it yet; does the header file just have function prototypes, no such thing, or does it actually have function definitions? I'm speaking of methods within the game, of course; in my Ocarina of Time example, you can see where I've been able to use methods in the game as my own. Makes me feel all warm and Puppet-Master inside.

____________________
messiaen
Catgirl
Level: 68


Posts: 481/1085
EXP: 2594037
For next: 134763

Since: 11-20-07


Since last post: 8.1 years
Last activity: 7.2 years

Posted on 02-21-09 02:22:22 AM Link | Quote
I don't know what could be going wrong on Vista. Just to make things easier, here are the download links for MinGW and MSYS, just install them in default directories (c:\mingw and C:\msys) if you want to avoid having to configure more stuff later.

1. MinGW (GCC)
2. MSYS (shell)

Once that is installed, just follow the tutorial (corrected link on the first post) and see if you can get at least the Zelda64 example hacks to compile.

Hectamatatortron: here's an example how the functions are defined:

/* part of mario64.h */
extern void PrintXY(u16 x, u16 y, char* text);
extern void SpawnObj(u32 obj_pointer, u16 model_id, u32 behavior); /* obj_pointer = *0x80331160 */
extern void CreateStar(float x, float y, float z);


The linker script (mario64.x) holds the actual addresses:

/* part of mario64.x */

PrintXY = 0x802d66c0 ;
SpawnObj = 0x8029edcc ;
CreateStar = 0x802f2aa0 ;


And here's an Hello World example .

#include "mario64.h"

void _start (void)
{
asm volatile("la $gp, _gp");
PrintXY(50, 50, "Hello World");
}


The "la $gp, _gp" is very important as it will ensure that the data (ie, #define values, static variables or, in this example, the "Hello World" string) will be loaded correctly.

____________________
Mario 64 notes @ http://sites.google.com/site/messiaen64/
OOnet
Random nobody
Level: 8


Posts: 8/9
EXP: 1977
For next: 210

Since: 08-14-07

From: France

Since last post: 13.2 years
Last activity: 13.2 years

Posted on 02-21-09 09:07:53 PM Link | Quote
No change with the links given.
I always have the CreateProcess error, and when I add libexec/gcc/mipsxx/x.x.x to my PATH, it compiles but the assembler doesn't recognize the BIG ENDIAN option. It's strange because the program output says that the standard as.exe program is used whereas the mips64-as.exe program should be used :


../root/bin/mips64-gcc -fno-builtin -std=gnu99 -nodefaultlibs -march=vr4300 -mtune=vr4300 -I../include -I.  -Os -mabi=32 -mno-gpopt   -c -o z64as.o z64as.c

as: unrecognized option `-EB'
make: *** [z64as.o] Error 1



I read the makefile but it doesn't specify the assembler used.
The problem is that mips64-gcc is used to compile the code which contains the asm volatile () function and while processing the compilation, gcc use the as program instead of use the mips64-as program (perhaps).

But it's strange : the as standard program should be able to recognize the -EB option which is a fundamental option.

Anyone install this toolchain successfully on Vista ?
Hectamatatortron
Member
Level: 35


Posts: 114/232
EXP: 257991
For next: 21945

Since: 09-19-07


Since last post: 7.2 years
Last activity: 5.3 years

Posted on 02-22-09 01:28:05 AM Link | Quote
Do you actually get little endian output without that option?

Isn't MIPS BE by default?

____________________
OOnet
Random nobody
Level: 8


Posts: 9/9
EXP: 1977
For next: 210

Since: 08-14-07

From: France

Since last post: 13.2 years
Last activity: 13.2 years

Posted on 02-22-09 06:40:13 AM Link | Quote
I cannot tell you, the as program is called by gcc, I cannot change the option.
And I am too lazy to write an asm program to test it. All problems I have are caused by the compilation program, not by the build configuration.
messiaen
Catgirl
Level: 68


Posts: 485/1085
EXP: 2594037
For next: 134763

Since: 11-20-07


Since last post: 8.1 years
Last activity: 7.2 years

Posted on 02-22-09 09:35:48 AM (last edited by messiaen at 02-22-09 06:39 AM) Link | Quote
I just did some Google searches and indeed it seems Vista has a few problems with MinGW/MSYS, especially on 64-bit systems.

This seems a good guide for fixing PATH issues.

By the way, once you got inside MSYS, did you do this?

cd /c/n64tree-win32/root/bin
export PATH=$PATH:`pwd`


Also, try removing all the "asm volatile()" from z64as.c and compiling it, just to see if everything else is ok.

____________________
Mario 64 notes @ http://sites.google.com/site/messiaen64/
Hectamatatortron
Member
Level: 35


Posts: 115/232
EXP: 257991
For next: 21945

Since: 09-19-07


Since last post: 7.2 years
Last activity: 5.3 years

Posted on 02-22-09 02:10:47 PM (last edited by Hectamatatortron at 02-22-09 11:14 AM) Link | Quote
This works on my Vista 64 machine just fine.

I use that and a batch script on their own for all of my N64 programming needs. Poor, to be sure, but hey, it works.

Hm...I can't remember where I found this mips-elf-as and other executables, though.

____________________
messiaen
Catgirl
Level: 68


Posts: 505/1085
EXP: 2594037
For next: 134763

Since: 11-20-07


Since last post: 8.1 years
Last activity: 7.2 years

Posted on 03-07-09 08:05:52 PM Link | Quote
Here's an interesting code snippet to make something different with Floor Switchs. The original Hidden Object behaviour has a lot of hardcoded stuff, so it can only be used for the breakable box, while with this general code you can a plenty of things. It traverses all the object linked lists and search for pressed floor switches:


#include

u32 *CurrentObject = (void*)M64_CURR_OBJ_PTR;

void _start ( void )
{
asm volatile("la $gp, _gp"); /* Loads global pointer so .data can be loaded correctly*/

int pseudo_stack; /* This will be used to save a global variable we'll mess up */
static int visible = 0; /* Static because the value needs to be hold accross funtion calls */
int i;

pseudo_stack = *CurrentObject; /* Saving because this global variable will be messed up */
int col_switch = SegmentedToVirtual(0x0800C7A8); /* This is the collision pointer of the Floor Switch, /*
/* used as a parameter when searching for that object in RAM */

/* Preparing to traverse objects circular list (going back to first object) */
*CurrentObject = (void*)M64_FIRST_OBJ_STRUCT;

/* Traverse all objects linked-list and checks if floor switch is pressed */
for (i = 0; i < 240; i++)
{
if ( (*Obj)->collision_ptr == col_switch )
{
if ( (*Obj)->action == 2 ) do_something= 1; /* action 2 = floor switch is pressed */
if ( (*Obj)->action == 0 ) do_something = 0;
}
*CurrentObject = (*CurrentObject)->next;
}

*CurrentObject = (void*)pseudo_stack; /* Back to original object */

if (do_something) something();

}


____________________
Mario 64 notes @ http://sites.google.com/site/messiaen64/
Hectamatatortron
Member
Level: 35


Posts: 118/232
EXP: 257991
For next: 21945

Since: 09-19-07


Since last post: 7.2 years
Last activity: 5.3 years

Posted on 03-08-09 07:10:27 AM Link | Quote
Very cool.

I saw your post about having NPCs act different based upon a variable; the power you all have over this game is something to treasure.

____________________
messiaen
Catgirl
Level: 68


Posts: 507/1085
EXP: 2594037
For next: 134763

Since: 11-20-07


Since last post: 8.1 years
Last activity: 7.2 years

Posted on 03-08-09 11:56:35 AM Link | Quote
One if the reasons is that, fortunately, documentation on Mario 64 is extensive, organized, and easy to find.
Yoshielectron, Cellar Dweller and HyperHacker have done a very extensive work documenting the struct shared by most objects in the game, so its now much easier to understand their coding. It also helps that Nintendo used compilers with no optimization settings .

____________________
Mario 64 notes @ http://sites.google.com/site/messiaen64/
qijino1236
Random nobody
Level: 3


Posts: 1/1
EXP: 68
For next: 60

Since: 04-22-09


Since last post: 13.0 years
Last activity: 13.0 years

Posted on 04-22-09 10:20:49 AM Link | Quote
How do you apply these "c" header files to the game?

messiaen
Catgirl
Level: 68


Posts: 546/1085
EXP: 2594037
For next: 134763

Since: 11-20-07


Since last post: 8.1 years
Last activity: 7.2 years

Posted on 04-22-09 02:45:51 PM (last edited by messiaen at 04-22-09 12:06 PM) Link | Quote
The mario64.h file is used along the MIPS GCC compiler to create new programming for the game. The makefile is set to output a Gameshark code in Nemu's format so you can test it, however you'll need to know where to 'hook' the code so that it gets executed.

Perhaps I released this too early but the practical applications will be much clearer once I release "The Missing Stars" and, along with it, the source code for the hacks used in the game. I will write a few tutorials about inserting new code into the ROM, creating behaviors and where to hook stuff, there's plenty of practical knowledge I'm eager to share and which will hopefully people to go along the same route.

By the way, this is the source code for the "Fire Mario" code I showed in a video some time ago. Compile it with the same makefile used in the "Explosive objects code" and it will output a Gameshark code to be used in Nemu. Again, this is proof of concept, simplistic, inneficient and slow, and was written very quickly. It would be much better to hurt objects selectively, which is what I have been exploring lately.
BigBrain
Member
Level: 22


Posts: 22/85
EXP: 55267
For next: 3083

Since: 09-10-08


Since last post: 8.8 years
Last activity: 6.7 years

Posted on 04-22-09 03:44:52 PM Link | Quote
Originally posted by messiaen
The mario64.h file is used along the MIPS GCC compiler to create new programming for the game. The makefile is set to output a Gameshark code in Nemu's format so you can test it, however you'll need to know where to 'hook' the code so that it gets executed.

Perhaps I released this too early but the practical applications will be much clearer once I release "The Missing Stars" and, along with it, the source code for the hacks used in the game. I will write a few tutorials about inserting new code into the ROM, creating behaviors and where to hook stuff, there's plenty of practical knowledge I'm eager to share and which will hopefully people to go along the same route.

By the way, this is the source code for the "Fire Mario" code I showed in a video some time ago. Compile it with the same makefile used in the "Explosive objects code" and it will output a Gameshark code to be used in Nemu. Again, this is proof of concept, simplistic, inneficient and slow, and was written very quickly. It would be much better to hurt objects selectively, which is what I have been exploring lately.

Thanks for that explanation messiaen, seems like this will open up many opportunities for future SM64 hacking.

I needed quite some time to understand what all the b1,...b25 variables were about. Are you planning to add some #defines for common ROM/RAM/whatever addresses to make using them less time consuming?

btw, searching for 13001184 in http://homepage.mac.com/qubedstudios/SM64Behaviors.txt showed me that this behavior is declared as unused... where you using that behavior intentionelly because it's otherwise unused or is there just a gap in the docs?
messiaen
Catgirl
Level: 68


Posts: 547/1085
EXP: 2594037
For next: 134763

Since: 11-20-07


Since last post: 8.1 years
Last activity: 7.2 years

Posted on 04-22-09 05:14:14 PM (last edited by messiaen at 04-22-09 02:18 PM) Link | Quote
The b1-b25 are pointers for behaviors that shouldn't be exploded (mostly objects produced by Mario such as dirt, snow, little stars, etc) and 0x1184 object is the behavior for the jumping fireball. When dealing with segmented pointers, you always have to use the SegmentedToVirtual function because of dynamic memory allocation.

The behavior doc is a bit outdated, most of the "unused" objects are actually spawned by some of the known behaviors. For instance, the Jumping Fireball (0x1168) behavior just checks if Mario is near, and on the right conditions it will create a sub-object with the actual fireball (0x1184) effect.

About the #defines, the idea is to gather as much data as possible into the .h files so that even someone without knowledge of Mario64 inner workings can work on it easily. Here's for instance an example of the code that shows how many stars you collected in each level from "The Missing Stars"



#include
#include "mario64.h"

#define BOB_OMB 0x0009
#define CASTLE_GROUNDS 0x0010
#define INSIDE_CASTLE 0x0006
#define WHOMP 0x0018
#define COOL_COOL_MOUNTAIN 0x0005
#define JOLLY_ROGER_BAY 0x000C
#define TALL_TALL_MOUNTAIN 0x0024
#define HAZY_MAZE 0x0007
#define PEACH_SLIDE 0x001B
#define FILE1 0x8020770C
#define FILE2 0x8020777C
#define FILE3 0x802077EC
#define FILE4 0x8020785C

void _start ( void )
{
/* Shows how many stars you have got in this area */

asm volatile("la $gp, _gp");

u16 *SaveFile = (void*)0x8032DDF4;
u16 Save = *SaveFile;

u16 *CurrentLevel = (void*)0x8032DDF8;
u16 Level = *CurrentLevel;

u8* CurrentStars;

u8 StarCount = 0;
u8 numstars = 0;

u8 DontShow = 0;

int SaveAddress;

switch (Save)
{
case 1:
SaveAddress = FILE1;
break;

case 2:
SaveAddress = FILE2;
break;

case 3:
SaveAddress = FILE3;
break;

case 4:
SaveAddress = FILE4;
break;

default:
SaveAddress = FILE1;
break;
}

Level = *CurrentLevel;

if (Level == BOB_OMB || Level == CASTLE_GROUNDS || Level == INSIDE_CASTLE)
{
CurrentStars = (void *)SaveAddress;
numstars = 6;
}
else if (Level == WHOMP)
{
CurrentStars = (void *)(SaveAddress + 1);
numstars = 4;
}
else if (Level == JOLLY_ROGER_BAY)
{
CurrentStars = (void *)(SaveAddress + 2);
numstars = 5;
}
else if (Level == COOL_COOL_MOUNTAIN)
{
CurrentStars = (void *)(SaveAddress + 3);
numstars = 3;
}
else if (Level == TALL_TALL_MOUNTAIN)
{
CurrentStars = (void *)(SaveAddress + 11);
numstars = 2;
}
else if (Level == HAZY_MAZE)
{
CurrentStars = (void *)(SaveAddress + 5);
numstars = 2;
}
else
{
DontShow = 1;
}

if (DontShow == 0)
{
unsigned int star_flag = *CurrentStars;

if (star_flag g& 1) StarCount++;
if (star_flag & 2) StarCount++;
if (star_flag & 4) StarCount++;
if (star_flag & 8) StarCount++;
if (star_flag & 16) StarCount++;
if (star_flag & 32) StarCount++;

PrintXY(75, 20,"-* of ");
PrintInt(55, 20, "%d", StarCount);
PrintInt(105, 20, "%d", numstars);
}

}

Pages: 1 2 3 Next newer thread | Next older thread
Jul - SM64 Hacking (Archive) - Mario 64 'C' header files New poll - New thread - New reply


Rusted Logic

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

33 database queries, 14 query cache hits.
Query execution time:  0.086231 seconds
Script execution time:  0.029629 seconds
Total render time:  0.115860 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 196 - 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 128 - Warning: unescaped & or unknown entity "&page"
line 149 column 50 - Warning: missing </font> before </td>
line 149 column 163 - 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 101 - Warning: unescaped & or unknown entity "&postid"
line 196 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 198 column 9 - Warning: missing <tr>
line 216 column 13 - Warning: missing <tr>
line 217 column 101 - Warning: unescaped & or unknown entity "&postid"
line 224 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 226 column 9 - Warning: missing <tr>
line 244 column 13 - Warning: missing <tr>
line 245 column 101 - Warning: unescaped & or unknown entity "&postid"
line 254 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 256 column 9 - Warning: missing <tr>
line 274 column 13 - Warning: missing <tr>
line 275 column 101 - Warning: unescaped & or unknown entity "&postid"
line 281 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 283 column 9 - Warning: missing <tr>
line 301 column 13 - Warning: missing <tr>
line 302 column 101 - Warning: unescaped & or unknown entity "&postid"
line 307 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 309 column 9 - Warning: missing <tr>
line 327 column 13 - Warning: missing <tr>
line 328 column 101 - Warning: unescaped & or unknown entity "&postid"
line 336 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 338 column 9 - Warning: missing <tr>
line 356 column 13 - Warning: missing <tr>
line 357 column 101 - Warning: unescaped & or unknown entity "&postid"
line 366 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 368 column 9 - Warning: missing <tr>
line 386 column 13 - Warning: missing <tr>
line 387 column 101 - Warning: unescaped & or unknown entity "&postid"
line 391 column 399 - Warning: unescaped & or unknown entity "&package_id"
line 425 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 427 column 9 - Warning: missing <tr>
line 445 column 13 - Warning: missing <tr>
line 446 column 101 - Warning: unescaped & or unknown entity "&postid"
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 101 - 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 101 - Warning: unescaped & or unknown entity "&postid"
line 518 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 520 column 9 - Warning: missing <tr>
line 538 column 13 - Warning: missing <tr>
line 539 column 101 - Warning: unescaped & or unknown entity "&postid"
line 553 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 555 column 9 - Warning: missing <tr>
line 573 column 13 - Warning: missing <tr>
line 574 column 101 - Warning: unescaped & or unknown entity "&postid"
line 583 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 585 column 9 - Warning: missing <tr>
line 603 column 13 - Warning: missing <tr>
line 604 column 101 - Warning: unescaped & or unknown entity "&postid"
line 609 column 433 - Error: <mario64.h> is not recognized!
line 609 column 433 - Warning: discarding unexpected <mario64.h>
line 647 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 649 column 9 - Warning: missing <tr>
line 667 column 13 - Warning: missing <tr>
line 668 column 101 - Warning: unescaped & or unknown entity "&postid"
line 675 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 677 column 9 - Warning: missing <tr>
line 695 column 13 - Warning: missing <tr>
line 696 column 101 - Warning: unescaped & or unknown entity "&postid"
line 702 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 704 column 9 - Warning: missing <tr>
line 722 column 13 - Warning: missing <tr>
line 723 column 101 - Warning: unescaped & or unknown entity "&postid"
line 730 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 732 column 9 - Warning: missing <tr>
line 750 column 13 - Warning: missing <tr>
line 751 column 101 - Warning: unescaped & or unknown entity "&postid"
line 760 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 762 column 9 - Warning: missing <tr>
line 780 column 13 - Warning: missing <tr>
line 781 column 101 - Warning: unescaped & or unknown entity "&postid"
line 795 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 797 column 9 - Warning: missing <tr>
line 815 column 13 - Warning: missing <tr>
line 816 column 101 - Warning: unescaped & or unknown entity "&postid"
line 826 column 1042 - Error: <n64.h> is not recognized!
line 826 column 1042 - Warning: discarding unexpected <n64.h>
line 945 column 17 - Warning: missing <tr>
line 945 column 17 - Warning: discarding unexpected <table>
line 948 column 35 - Warning: missing <tr>
line 948 column 96 - Warning: unescaped & or unknown entity "&page"
line 948 column 128 - Warning: unescaped & or unknown entity "&page"
line 948 column 50 - Warning: missing </font> before </td>
line 948 column 163 - Warning: missing </font> before </table>
line 950 column 35 - Warning: missing <tr>
line 950 column 50 - Warning: missing </font> before </td>
line 951 column 37 - Warning: unescaped & or unknown entity "&id"
line 950 column 196 - Warning: missing </font> before </table>
line 952 column 17 - Warning: discarding unexpected </textarea>
line 952 column 28 - Warning: discarding unexpected </form>
line 952 column 35 - Warning: discarding unexpected </embed>
line 952 column 43 - Warning: discarding unexpected </noembed>
line 952 column 53 - Warning: discarding unexpected </noscript>
line 952 column 64 - Warning: discarding unexpected </noembed>
line 952 column 74 - Warning: discarding unexpected </embed>
line 952 column 82 - Warning: discarding unexpected </table>
line 952 column 90 - Warning: discarding unexpected </table>
line 954 column 9 - Warning: missing </font> before <table>
line 966 column 25 - Warning: discarding unexpected </font>
line 975 column 58 - Warning: discarding unexpected </font>
line 953 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 111 - Warning: <img> lacks "alt" attribute
line 161 column 161 - Warning: <img> lacks "alt" attribute
line 172 column 15 - Warning: <img> lacks "alt" attribute
line 201 column 22 - Warning: <img> lacks "alt" attribute
line 201 column 63 - Warning: <img> lacks "alt" attribute
line 201 column 112 - Warning: <img> lacks "alt" attribute
line 201 column 162 - Warning: <img> lacks "alt" attribute
line 212 column 15 - Warning: <img> lacks "alt" attribute
line 221 column 291 - Warning: <img> proprietary attribute value "absmiddle"
line 221 column 291 - Warning: <img> lacks "alt" attribute
line 221 column 344 - Warning: <img> proprietary attribute value "absmiddle"
line 221 column 344 - Warning: <img> lacks "alt" attribute
line 229 column 22 - Warning: <img> lacks "alt" attribute
line 229 column 63 - Warning: <img> lacks "alt" attribute
line 229 column 111 - Warning: <img> lacks "alt" attribute
line 229 column 161 - Warning: <img> lacks "alt" attribute
line 240 column 15 - Warning: <img> lacks "alt" attribute
line 259 column 21 - Warning: <img> lacks "alt" attribute
line 259 column 62 - Warning: <img> lacks "alt" attribute
line 259 column 111 - Warning: <img> lacks "alt" attribute
line 259 column 161 - Warning: <img> lacks "alt" attribute
line 260 column 11 - Warning: <img> lacks "alt" attribute
line 270 column 15 - Warning: <img> lacks "alt" attribute
line 286 column 22 - Warning: <img> lacks "alt" attribute
line 286 column 63 - Warning: <img> lacks "alt" attribute
line 286 column 112 - Warning: <img> lacks "alt" attribute
line 286 column 162 - Warning: <img> lacks "alt" attribute
line 287 column 11 - Warning: <img> lacks "alt" attribute
line 297 column 15 - Warning: <img> lacks "alt" attribute
line 312 column 21 - Warning: <img> lacks "alt" attribute
line 312 column 62 - Warning: <img> lacks "alt" attribute
line 312 column 111 - Warning: <img> lacks "alt" attribute
line 312 column 161 - Warning: <img> lacks "alt" attribute
line 313 column 11 - Warning: <img> lacks "alt" attribute
line 323 column 15 - Warning: <img> lacks "alt" attribute
line 341 column 22 - Warning: <img> lacks "alt" attribute
line 341 column 63 - Warning: <img> lacks "alt" attribute
line 341 column 112 - Warning: <img> lacks "alt" attribute
line 341 column 162 - Warning: <img> lacks "alt" attribute
line 352 column 15 - Warning: <img> lacks "alt" attribute
line 363 column 706 - Warning: <img> proprietary attribute value "absmiddle"
line 363 column 706 - Warning: <img> lacks "alt" attribute
line 363 column 759 - Warning: <img> proprietary attribute value "absmiddle"
line 363 column 759 - Warning: <img> lacks "alt" attribute
line 371 column 22 - Warning: <img> lacks "alt" attribute
line 371 column 63 - Warning: <img> lacks "alt" attribute
line 371 column 111 - Warning: <img> lacks "alt" attribute
line 371 column 161 - Warning: <img> lacks "alt" attribute
line 382 column 15 - Warning: <img> lacks "alt" attribute
line 411 column 1247 - Warning: <img> proprietary attribute value "absmiddle"
line 411 column 1247 - Warning: <img> lacks "alt" attribute
line 430 column 21 - Warning: <img> lacks "alt" attribute
line 430 column 62 - Warning: <img> lacks "alt" attribute
line 430 column 111 - Warning: <img> lacks "alt" attribute
line 430 column 161 - Warning: <img> lacks "alt" attribute
line 431 column 11 - Warning: <img> lacks "alt" attribute
line 441 column 15 - 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 162 - Warning: <img> lacks "alt" attribute
line 479 column 15 - Warning: <img> lacks "alt" attribute
line 488 column 209 - Warning: <img> proprietary attribute value "absmiddle"
line 488 column 209 - Warning: <img> lacks "alt" attribute
line 488 column 262 - Warning: <img> proprietary attribute value "absmiddle"
line 488 column 262 - Warning: <img> lacks "alt" attribute
line 496 column 21 - Warning: <img> lacks "alt" attribute
line 496 column 62 - Warning: <img> lacks "alt" attribute
line 496 column 111 - Warning: <img> lacks "alt" attribute
line 496 column 161 - Warning: <img> lacks "alt" attribute
line 497 column 11 - Warning: <img> lacks "alt" attribute
line 507 column 15 - Warning: <img> lacks "alt" attribute
line 523 column 22 - Warning: <img> lacks "alt" attribute
line 523 column 63 - Warning: <img> lacks "alt" attribute
line 523 column 111 - Warning: <img> lacks "alt" attribute
line 523 column 161 - Warning: <img> lacks "alt" attribute
line 534 column 15 - Warning: <img> lacks "alt" attribute
line 558 column 22 - Warning: <img> lacks "alt" attribute
line 558 column 63 - Warning: <img> lacks "alt" attribute
line 558 column 112 - Warning: <img> lacks "alt" attribute
line 558 column 162 - Warning: <img> lacks "alt" attribute
line 569 column 15 - Warning: <img> lacks "alt" attribute
line 580 column 469 - Warning: <img> proprietary attribute value "absmiddle"
line 580 column 469 - Warning: <img> lacks "alt" attribute
line 580 column 522 - Warning: <img> proprietary attribute value "absmiddle"
line 580 column 522 - Warning: <img> lacks "alt" attribute
line 588 column 22 - Warning: <img> lacks "alt" attribute
line 588 column 63 - Warning: <img> lacks "alt" attribute
line 588 column 111 - Warning: <img> lacks "alt" attribute
line 588 column 161 - Warning: <img> lacks "alt" attribute
line 599 column 15 - Warning: <img> lacks "alt" attribute
line 652 column 22 - Warning: <img> lacks "alt" attribute
line 652 column 63 - Warning: <img> lacks "alt" attribute
line 652 column 112 - Warning: <img> lacks "alt" attribute
line 652 column 162 - Warning: <img> lacks "alt" attribute
line 663 column 15 - Warning: <img> lacks "alt" attribute
line 672 column 267 - Warning: <img> proprietary attribute value "absmiddle"
line 672 column 267 - Warning: <img> lacks "alt" attribute
line 672 column 320 - Warning: <img> proprietary attribute value "absmiddle"
line 672 column 320 - Warning: <img> lacks "alt" attribute
line 680 column 22 - Warning: <img> lacks "alt" attribute
line 680 column 63 - Warning: <img> lacks "alt" attribute
line 680 column 111 - Warning: <img> lacks "alt" attribute
line 680 column 161 - Warning: <img> lacks "alt" attribute
line 691 column 15 - Warning: <img> lacks "alt" attribute
line 699 column 449 - Warning: <img> proprietary attribute value "absmiddle"
line 699 column 449 - Warning: <img> lacks "alt" attribute
line 707 column 21 - Warning: <img> lacks "alt" attribute
line 707 column 62 - Warning: <img> lacks "alt" attribute
line 707 column 111 - Warning: <img> lacks "alt" attribute
line 707 column 161 - Warning: <img> lacks "alt" attribute
line 718 column 15 - Warning: <img> lacks "alt" attribute
line 735 column 22 - Warning: <img> lacks "alt" attribute
line 735 column 63 - Warning: <img> lacks "alt" attribute
line 735 column 111 - Warning: <img> lacks "alt" attribute
line 735 column 161 - Warning: <img> lacks "alt" attribute
line 746 column 15 - Warning: <img> lacks "alt" attribute
line 765 column 22 - Warning: <img> lacks "alt" attribute
line 765 column 63 - Warning: <img> lacks "alt" attribute
line 765 column 112 - Warning: <img> lacks "alt" attribute
line 765 column 162 - Warning: <img> lacks "alt" attribute
line 776 column 15 - Warning: <img> lacks "alt" attribute
line 800 column 22 - Warning: <img> lacks "alt" attribute
line 800 column 63 - Warning: <img> lacks "alt" attribute
line 800 column 111 - Warning: <img> lacks "alt" attribute
line 800 column 161 - Warning: <img> lacks "alt" attribute
line 811 column 15 - Warning: <img> lacks "alt" attribute
line 951 column 44 - Warning: <img> proprietary attribute value "absmiddle"
line 951 column 142 - Warning: <img> proprietary attribute value "absmiddle"
line 951 column 245 - Warning: <img> proprietary attribute value "absmiddle"
line 960 column 25 - Warning: <img> lacks "alt" attribute
line 965 column 267 - Warning: <img> lacks "alt" attribute
line 945 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 217 column 27 - Warning: <nobr> is not approved by W3C
line 245 column 27 - Warning: <nobr> is not approved by W3C
line 275 column 27 - Warning: <nobr> is not approved by W3C
line 302 column 27 - Warning: <nobr> is not approved by W3C
line 328 column 27 - Warning: <nobr> is not approved by W3C
line 357 column 27 - Warning: <nobr> is not approved by W3C
line 387 column 27 - Warning: <nobr> is not approved by W3C
line 446 column 27 - Warning: <nobr> is not approved by W3C
line 484 column 27 - Warning: <nobr> is not approved by W3C
line 512 column 27 - Warning: <nobr> is not approved by W3C
line 539 column 27 - Warning: <nobr> is not approved by W3C
line 574 column 27 - Warning: <nobr> is not approved by W3C
line 604 column 27 - Warning: <nobr> is not approved by W3C
line 668 column 27 - Warning: <nobr> is not approved by W3C
line 696 column 27 - Warning: <nobr> is not approved by W3C
line 723 column 27 - Warning: <nobr> is not approved by W3C
line 751 column 27 - Warning: <nobr> is not approved by W3C
line 781 column 27 - Warning: <nobr> is not approved by W3C
line 816 column 27 - Warning: <nobr> is not approved by W3C
Info: Document content looks like HTML5
Info: No system identifier in emitted doctype
Tidy found 289 warnings and 2 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