Register - Login
Views: 99386831
Main - Memberlist - Active users - Calendar - Wiki - IRC Chat - Online users
Ranks - Rules/FAQ - Stats - Latest Posts - Color Chart - Smilies
04-24-22 05:37:53 AM
Jul - The Cutting Room Floor - Instruction Manual sub-map leftovers? (Wario Land 1) New poll - New thread - New reply
Pages: 1 2 3 Next newer thread | Next older thread
Keitaro

Fire Snake
LOVELY ARRANGEMENT. VOLCANO BAKEMEAT
Level: 70


Posts: 1115/1191
EXP: 2898889
For next: 116922

Since: 09-09-08

From: California

Since last post: 4.1 years
Last activity: 3.8 years

Posted on 06-01-12 08:31:42 AM (last edited by Keitaro at 06-01-12 08:32:28 AM) Link | Quote
Holy shit I never expected all this when I started this thread, this is amazing. So wait...that room is used? There's two checkpoints within one room of eachother? that seems a bit...well, weird. Were you ever able to find any information about the map structure of the overworld submaps themselves? Also I would be more than extremely interested in any rom hacking "seminar" of yours simply just to see your methods at work
GuyPerfect
Catgirl
Level: 68


Posts: 770/1096
EXP: 2663434
For next: 65366

Since: 07-23-07


Since last post: 1.6 years
Last activity: 210 days

Posted on 06-01-12 01:55:23 PM Link | Quote
Originally posted by Keitaro
So wait...that room is used? There's two checkpoints within one room of eachother? that seems a bit...well, weird.
It's actually a giant block with a 3-up heart inside. That object parameter really makes things different.

Originally posted by Keitaro
Were you ever able to find any information about the map structure of the overworld submaps themselves?
Yup, came across those while looking into the level data, but I didn't do anything with them.

There may be some latent data tucked away, inaccessible to the game engine, but don't hold your breath. If I was a betting man, I'd bet there's no unused level or overworld data in there.

Originally posted by Keitaro
Also I would be more than extremely interested in any rom hacking "seminar" of yours simply just to see your methods at work
It's difficult to devise a way to convey the information that would help people come away with the skills they need to hack games themselves. I could post a series of articles, but I don't think that'd really do the trick. I mean, you can describe to a person how to operate a car, but it doesn't mean they're a good driver without the experience.

People may know how to use a hex editor. People might understand the function of a breakpoint. People could have good knowledge of graphical formats. But that's not enough: you have to have a feel for how programs are put together and be familiar with how developers structure their work so that you can pick it apart.
Xkeeper

Level: 263


Posts: 20250/25343
EXP: 296716870
For next: 2243583

Since: 07-03-07

Pronouns: they/them/????????

Since last post: 9 days
Last activity: 3 days

Posted on 06-01-12 02:44:28 PM Link | Quote
Originally posted by GuyPerfect
There may be some latent data tucked away, inaccessible to the game engine, but don't hold your breath. If I was a betting man, I'd bet there's no unused level or overworld data in there.

Yeah, that's what we thought about (insert game here) and then we found (insert surprise here).


I know better not to say anything until we have a fully-disassembled game in front of us.

____________________
GuyPerfect
Catgirl
Level: 68


Posts: 771/1096
EXP: 2663434
For next: 65366

Since: 07-23-07


Since last post: 1.6 years
Last activity: 210 days

Posted on 06-01-12 03:24:05 PM (last edited by GuyPerfect at 06-01-12 03:30:11 PM) Link | Quote
In other news, in preparation for making a level editor... The ROM needs to be expanded to allow room for custom levels without messing up any other data in there that the game uses for other purposes.

Wario Land is 512 KB and uses the MBC1 mapper. MBC1 switches PRG-ROM banks by writing the desired bank number to any address in the $2000-$3FFF range, which will then map the corresponding 16 KB region of ROM data to the $4000-$7FFF range.

MBC1 also supports multiple RAM banks, and can support an additional 2 bits for ROM bank addressing for up to 2 MB of PRG-ROM data, but there's a bit of a complication. The ROM bank register is only 5 bits, meaning banks 1-0x1F can be mapped. Times 16 KB, this is 512 KB exactly. For the purpose of switching ROM banks in MBC1, Wario Land uses every available bank without adding programming overhead to access the upper bank index bits.

Fortunately, we lucked out in that the ROM bank register is the only MBC1 register used by Wario Land. It never sets the ROM/RAM switching mode, and never switches RAM banks. The cartridge hardware likely had 512 KB of ROM, 8 KB of RAM, and a friendly smile. Why on earth is this good news? Because it means we can change the setting in the ROM header to use MBC3, which also uses $2000-$3FFF for switching ROM banks (which map into $4000-$7FFF), except it uses a full 7 bits giving access to the entire 2 MB through the same register.

The byte at 0x000147 is a field in the ROM header specifying the mapper type. It's currently 0x03 (MBC1 + SRAM), and we want to change it to 0x13 (MBC3 + SRAM). If you do this yourself, you'll notice the game plays just fine without any trouble. But secretly, we know it's an upgrade.
__________

There are three kinds of variable-length data we'll want to be able to stuff into arbitrary banks and addresses:
  • World data
  • Door destinations
  • Items, objects and enemies
Accessing world data won't require any changes: simply specify a higher bank number in the data and you're good to go.
__________

The table of door definitions is at 0x030F30, aka 0C:4F30. The game has this bank and address hard-coded in bank 0, which is always present in the $0000-$3FFF range:
  • When you attempt to enter a door, it pushes the current bank to the stack, swaps to bank C, reads the door destination, saves the door definition address to $A98E, then pulls the original bank off the stack and swaps back to it.
  • If the door's destination is not a special-case value (like the exits), the game will swap back to bank C, load the door definition address from $A98E, and process the graphics and teleportation accordingly.
In short, there are three instructions we're interested in here: two that select bank C, and one that selects the table address $4F30. These are located at $073D, $0F44 and $0763, respectively. I'd have to test to be sure, but it looks as though changing these numbers to a new bank and table address will make it work as merrily as can be.

The door table contains 32 pointers for 86 levels, each of which points to a 24-byte structure. 2 * 32 * 86 = 5504 bytes just for the pointer table, and in a 16384-byte bank, that leaves us with 10880 bytes for actual door destination definitions. At 24 bytes each, this means we can have no more than 453 doors in the entire game once all custom levels have been patched.

Storage space notwithstanding, the engine supports up to a theoretical 2752 doors, so that's quite a hit on our total due to a technical limitation. But don't think that 453 is a small number. Think about it: there are 43 levels (the duplicates tend to use the same door definitions), and they can have up to 32 doors each. How many doors does a typical level have, 3 to 6? 6 * 43 = 258; barely over half of what we can fit in. And the exit doors only require 1 byte since they don't technically go anywhere.
__________

Now the level object data is a different story. The ones used in the game pretty neatly fit into 4 KB in bank 7, and the game won't load them from any other bank (in fact, the code that loads them is also in bank 7). The other 12 KB in bank 7 is used for other stuff. Since we need to be able to move this data to accommodate custom levels, the game will need to be reprogrammed a bit.

The object data table is at 0x01C199 (07:4199), and object data itself occupies 0x01EF00 to almost 0x01FFFF. I say almost, because I'm not sure if the data at 0x01FF68 is actually object data. The table contains 43 addresses to the data.

There is a function at 0x01C056-0x01C0A6 (07:4056-07:40A6) that loads the level index from $A804 (which is set by the overworld map), then the address from $4199 accordingly, ultimately loading the object data into $B000-$BFFF. The data is transferred in its packed 4-bit values, meaning 2 blocks per byte. 256 * 32 block levels = 128 * 32 bytes = 4096, aka 0x1000.

The function never pops anything from the stack before it returns at $40A6. Additionally, it isn't called directly by address; it uses the HL register to jump, so the code at $4056 should be modified directly rather than attempt to cause the program to call from a different address.

Those two bytes used for the object data address can be repurposed to work the same way as the world data references: the first byte is the bank number, and the second byte is an index such that $4000 + ThatByte * 2 points to the address of the data. After the game program loads the bytes, the program can be shot down to $7F60 or thereabouts, where some custom code will exist to switch to the target bank.

Since the code switching banks will itself be in the region being switched, there should be copies of the code in every bank that contains object data. This will allow the code to continue to function after a bank switch, where it can load object data into $B000, then switch back to bank 7 to return once it's finished.

Originally posted by Xkeeper
Yeah, that's what we thought about (insert game here) and then we found (insert surprise here).
Fortunately, I am not a betting man.
Aeonic Butterfly
200
Level: 32


Posts: 86/207
EXP: 191521
For next: 14921

Since: 12-27-10

From: Ridgecrest, CA

Since last post: 4.4 years
Last activity: 4.4 years

Posted on 06-01-12 04:17:28 PM Link | Quote
For teaching others, wouldn't this and comparing SML2's be a good start? With Metroid 2's engine? I mean, they are similar, right? Kind of like how all the Sonic Genesis games are built off of Sonic 1's engine, with modifications, and Sonic CD's engine has the same base of Sonic 1's, just taken in a different direction.
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: 4809/5390
EXP: 29051149
For next: 283856

Since: 07-22-07

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

Since last post: 333 days
Last activity: 333 days

Posted on 06-02-12 10:38:57 AM Link | Quote
Post #4809 · Sat 120602 063857
Any particular reason to use MBC3 instead of MBC5?

____________________
GuyPerfect
Catgirl
Level: 68


Posts: 772/1096
EXP: 2663434
For next: 65366

Since: 07-23-07


Since last post: 1.6 years
Last activity: 210 days

Posted on 06-02-12 03:30:53 PM Link | Quote
Any particular reason to use MBC5 instead of MBC3?

As long as we've got more banks, we're good to go.
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: 4812/5390
EXP: 29051149
For next: 283856

Since: 07-22-07

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

Since last post: 333 days
Last activity: 333 days

Posted on 06-03-12 06:36:37 AM Link | Quote
Post #4812 · Sun 120603 023637
MBC5 is the same thing, but gives you even moar ROM space! (No clock but who cares)

____________________
GuyPerfect
Catgirl
Level: 68


Posts: 774/1096
EXP: 2663434
For next: 65366

Since: 07-23-07


Since last post: 1.6 years
Last activity: 210 days

Posted on 06-03-12 10:32:49 PM Link | Quote
I took a moment to look into the "enemy pointer" today. The addresses specify a block of code in bank 7 that initializes memory for using one pair of objects, be it enemies, doors, checkpoints, treasure chests, 3-Up hearts, etc. If it has a sprite, it's an object. And these little blocks of code initialize them.

The blocks aren't very big. Here's the one that loads the enemies in the first area of the first level:
07:44CF


3E 27 ld a,27
EA 2F A3 ld (A32F),a
3E 56 ld a,56
EA 30 A3 ld (A330),a
01 97 61 ld bc,6197
CD A7 40 call 40A7
C9 ret

Not too bad, eh? Problem is, there's 218 of these used by the game. It's going to be better to crack these open to see what's inside than to try and enumerate them all...

That 27 and 56 are stored in RAM for later. That call to $40A7 is present in every one of these blocks, and at that address is just another call instruction, to $3614. I mean, it should have just been call 3614. Ah well, keepin' it fresh, I guess. $3614-$3663 is a function I that loads 48 tiles into VRAM at $8D00. These are the tiles that correspond with the objects in question.

The tiles themselves are defined by the contents of bc, which in this example contains $6197. At that address in bank 7 is a list of 4-byte structures:
0F     Bank containing object 0 tiles

DC 50 Tile address
10 Number of tiles to load
---
07 Bank containing object 1 tiles
72 6D Tile address
14 Number of tiles to load
---
00
00 00
FF (Terminator)

The starting tile index is recorded by the game program--tiles can be loaded into VRAM in any order and still function properly in the game. Exactly where these values go, I'll have to look into it later.

It appears that the number of objects you can use in a given area is dictated by the number of tiles they consume--you can fit up to 48 tiles total across all objects. This will be something to test.

The 27 and 56 from earlier are an address in bank 7 where yet more pointers exist. These pointers are loaded from the given base address, plus 2 times the value of the object to spawn. Objects have values of 1 and 2 (as seen in an earlier post), so their addresses are the base address plus 2 or 4, respectively. These addresses are accessed every time an object is spawned (when you get close enough for it to appear on screen).

In this particular case, 07:5627 will load objects 1: $5313 (Wanderin' Goom) and 2: $5323 (Pirate Goom). What do those point to? Well, I don't know, and for now it doesn't look like it matters. There's one of those values for every object and enemy type, so those are what we'll make a list of. They start at $530F and continue every 4 bytes up to $5447--80 object types, most of them enemies. It's possible they're not all used by the game, but poking through them without the corresponding graphics might be difficult.

As I mentioned, I swapped the order of these two enemies as well as the order their tiles were loaded, and they still looked and behaved correctly in the game (except everywhere a Wanderin' Goom usually spawns was a Pirate Goom and vice-versa). A glimpse at the tile memory confirms that they were loaded into different locations in VRAM.

Let me mull over this for a while and I'll think of where to go next.
GuyPerfect
Catgirl
Level: 68


Posts: 775/1096
EXP: 2663434
For next: 65366

Since: 07-23-07


Since last post: 1.6 years
Last activity: 210 days

Posted on 06-04-12 12:09:33 AM Link | Quote
All of the object graphics definitions are sequential in the ROM starting at 0x01DFE3 (07:6FE3). Unfortunately, there doesn't appear to be a whole lot of unused graphics aside from the Wanderin' Goom's spitball projectile:

Celice
Member
Level: 31


Posts: 33/196
EXP: 177832
For next: 7531

Since: 10-24-10


Since last post: 5.7 years
Last activity: 3.9 years

Posted on 06-05-12 08:11:54 AM Link | Quote
This is really awesome stuff you got going on I always loved the second Wario Land, but I'm enjoying all this info about the first one. If you do get an editor out I'd mess with this game for sure.
Keitaro

Fire Snake
LOVELY ARRANGEMENT. VOLCANO BAKEMEAT
Level: 70


Posts: 1129/1191
EXP: 2898889
For next: 116922

Since: 09-09-08

From: California

Since last post: 4.1 years
Last activity: 3.8 years

Posted on 07-22-12 07:26:37 PM Link | Quote
tiny bump, but looking through the wiki I noticed something about unused sprites/background/a room(?) for the Bobo boss...was curious if you happened to come across anything related to this during your digging. I don't see anything related to that in the previous image you just posted which is why I was wondering (then again, some other things also appear to be missing such as the genie)
Tigrou
Random nobody
Level: 5


Posts: 1/4
EXP: 385
For next: 144

Since: 12-19-15


Since last post: 100 days
Last activity: 80 days

Posted on 12-19-15 08:51:25 AM Link | Quote
Hi there.
I have been working on a SML3/WL1 editor some weeks ago.

Here is the result : http://www.romhacking.net/utilities/1156/

It's unfinished but basic functionalities are there.

It is based on GuyPerfect posts and some personal hack / research.
Source is on GitHub.

Have fun !

Keitaro

Fire Snake
LOVELY ARRANGEMENT. VOLCANO BAKEMEAT
Level: 70


Posts: 1186/1191
EXP: 2898889
For next: 116922

Since: 09-09-08

From: California

Since last post: 4.1 years
Last activity: 3.8 years

Posted on 01-25-16 08:57:32 PM Link | Quote
!!!!!

This is really awesome so far, I'm really happy this exists! Thank you!
Pages: 1 2 3 Next newer thread | Next older thread
Jul - The Cutting Room Floor - Instruction Manual sub-map leftovers? (Wario Land 1) New poll - New thread - New reply


Rusted Logic

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

32 database queries, 6 query cache hits.
Query execution time:  0.340801 seconds
Script execution time:  0.028841 seconds
Total render time:  0.369642 seconds


TidyHTML vomit below
line 1 column 1 - Warning: missing <!DOCTYPE> declaration
line 2 column 311 - 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 223 - Warning: missing </font> before </table>
line 149 column 35 - Warning: missing <tr>
line 149 column 95 - 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 165 - 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 102 - Warning: unescaped & or unknown entity "&postid"
line 182 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 184 column 9 - Warning: missing <tr>
line 202 column 13 - Warning: missing <tr>
line 203 column 102 - Warning: unescaped & or unknown entity "&postid"
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 102 - Warning: unescaped & or unknown entity "&postid"
line 239 column 74 - Warning: <style> isn't allowed in <td> elements
line 239 column 9 - Info: <td> previously mentioned
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 102 - 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 102 - Warning: unescaped & or unknown entity "&postid"
line 333 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 335 column 9 - Warning: missing <tr>
line 353 column 13 - Warning: missing <tr>
line 354 column 102 - Warning: unescaped & or unknown entity "&postid"
line 356 column 4439 - Warning: replacing unexpected input with </input>
line 356 column 4753 - Warning: discarding unexpected </span>
line 359 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 361 column 9 - Warning: missing <tr>
line 379 column 13 - Warning: missing <tr>
line 380 column 102 - Warning: unescaped & or unknown entity "&postid"
line 387 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 389 column 9 - Warning: missing <tr>
line 407 column 13 - Warning: missing <tr>
line 408 column 102 - Warning: unescaped & or unknown entity "&postid"
line 410 column 4479 - Warning: replacing unexpected input with </input>
line 410 column 4793 - Warning: discarding unexpected </span>
line 413 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 415 column 9 - Warning: missing <tr>
line 433 column 13 - Warning: missing <tr>
line 434 column 102 - Warning: unescaped & or unknown entity "&postid"
line 477 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 479 column 9 - Warning: missing <tr>
line 497 column 13 - Warning: missing <tr>
line 498 column 102 - Warning: unescaped & or unknown entity "&postid"
line 505 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 507 column 9 - Warning: missing <tr>
line 525 column 13 - Warning: missing <tr>
line 526 column 102 - Warning: unescaped & or unknown entity "&postid"
line 531 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 533 column 9 - Warning: missing <tr>
line 551 column 13 - Warning: missing <tr>
line 552 column 102 - Warning: unescaped & or unknown entity "&postid"
line 557 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 559 column 9 - Warning: missing <tr>
line 577 column 13 - Warning: missing <tr>
line 578 column 102 - Warning: unescaped & or unknown entity "&postid"
line 595 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 597 column 9 - Warning: missing <tr>
line 615 column 13 - Warning: missing <tr>
line 616 column 102 - Warning: unescaped & or unknown entity "&postid"
line 623 column 17 - Warning: missing <tr>
line 623 column 17 - Warning: discarding unexpected <table>
line 626 column 35 - Warning: missing <tr>
line 626 column 95 - Warning: unescaped & or unknown entity "&page"
line 626 column 128 - Warning: unescaped & or unknown entity "&page"
line 626 column 50 - Warning: missing </font> before </td>
line 626 column 165 - Warning: missing </font> before </table>
line 628 column 35 - Warning: missing <tr>
line 628 column 50 - Warning: missing </font> before </td>
line 629 column 37 - Warning: unescaped & or unknown entity "&id"
line 628 column 223 - Warning: missing </font> before </table>
line 630 column 17 - Warning: discarding unexpected </textarea>
line 630 column 28 - Warning: discarding unexpected </form>
line 630 column 35 - Warning: discarding unexpected </embed>
line 630 column 43 - Warning: discarding unexpected </noembed>
line 630 column 53 - Warning: discarding unexpected </noscript>
line 630 column 64 - Warning: discarding unexpected </noembed>
line 630 column 74 - Warning: discarding unexpected </embed>
line 630 column 82 - Warning: discarding unexpected </table>
line 630 column 90 - Warning: discarding unexpected </table>
line 632 column 9 - Warning: missing </font> before <table>
line 644 column 25 - Warning: discarding unexpected </font>
line 653 column 57 - Warning: discarding unexpected </font>
line 631 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 246 - Warning: <img> proprietary attribute value "absmiddle"
line 160 column 11 - Warning: <img> lacks "alt" attribute
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 162 - Warning: <img> lacks "alt" attribute
line 172 column 15 - Warning: <img> lacks "alt" attribute
line 176 column 91 - Warning: <font> attribute "color" had invalid value "97ACEF" and has been replaced
line 179 column 84 - Warning: <img> proprietary attribute value "absmiddle"
line 179 column 84 - Warning: <img> lacks "alt" attribute
line 179 column 291 - Warning: <img> proprietary attribute value "absmiddle"
line 179 column 291 - Warning: <img> lacks "alt" attribute
line 179 column 605 - Warning: <img> proprietary attribute value "absmiddle"
line 179 column 605 - Warning: <img> lacks "alt" attribute
line 187 column 22 - Warning: <img> lacks "alt" attribute
line 187 column 63 - Warning: <img> lacks "alt" attribute
line 187 column 112 - Warning: <img> lacks "alt" attribute
line 187 column 162 - Warning: <img> lacks "alt" attribute
line 198 column 15 - Warning: <img> lacks "alt" attribute
line 205 column 233 - Warning: <img> proprietary attribute value "absmiddle"
line 205 column 233 - Warning: <img> lacks "alt" attribute
line 205 column 441 - Warning: <img> proprietary attribute value "absmiddle"
line 205 column 441 - Warning: <img> lacks "alt" attribute
line 211 column 1193 - Warning: <img> proprietary attribute value "absmiddle"
line 211 column 1193 - Warning: <img> lacks "alt" attribute
line 221 column 23 - Warning: <img> lacks "alt" attribute
line 221 column 64 - Warning: <img> lacks "alt" attribute
line 221 column 113 - Warning: <img> lacks "alt" attribute
line 221 column 163 - Warning: <img> lacks "alt" attribute
line 222 column 11 - 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 266 column 90 - Warning: <font> attribute "color" had invalid value "7C60B0" and has been replaced
line 304 column 6343 - Warning: <img> proprietary attribute value "absmiddle"
line 304 column 6343 - Warning: <img> lacks "alt" attribute
line 311 column 15 - Warning: <img> proprietary attribute value "absmiddle"
line 311 column 15 - Warning: <img> lacks "alt" attribute
line 311 column 58 - Warning: <img> proprietary attribute value "absmiddle"
line 311 column 58 - Warning: <img> lacks "alt" attribute
line 311 column 101 - Warning: <img> proprietary attribute value "absmiddle"
line 311 column 101 - Warning: <img> lacks "alt" attribute
line 311 column 144 - Warning: <img> proprietary attribute value "absmiddle"
line 311 column 144 - Warning: <img> lacks "alt" attribute
line 312 column 22 - Warning: <img> lacks "alt" attribute
line 312 column 63 - Warning: <img> lacks "alt" attribute
line 312 column 112 - Warning: <img> lacks "alt" attribute
line 312 column 162 - Warning: <img> lacks "alt" attribute
line 323 column 15 - Warning: <img> lacks "alt" attribute
line 338 column 23 - Warning: <img> lacks "alt" attribute
line 338 column 64 - Warning: <img> lacks "alt" attribute
line 338 column 113 - Warning: <img> lacks "alt" attribute
line 338 column 163 - Warning: <img> lacks "alt" attribute
line 349 column 15 - Warning: <img> lacks "alt" attribute
line 364 column 22 - Warning: <img> lacks "alt" attribute
line 364 column 63 - Warning: <img> lacks "alt" attribute
line 364 column 112 - Warning: <img> lacks "alt" attribute
line 364 column 162 - Warning: <img> lacks "alt" attribute
line 375 column 15 - Warning: <img> lacks "alt" attribute
line 392 column 23 - Warning: <img> lacks "alt" attribute
line 392 column 64 - Warning: <img> lacks "alt" attribute
line 392 column 113 - Warning: <img> lacks "alt" attribute
line 392 column 163 - Warning: <img> lacks "alt" attribute
line 403 column 15 - Warning: <img> lacks "alt" attribute
line 418 column 22 - Warning: <img> lacks "alt" attribute
line 418 column 63 - Warning: <img> lacks "alt" attribute
line 418 column 112 - Warning: <img> lacks "alt" attribute
line 418 column 162 - Warning: <img> lacks "alt" attribute
line 429 column 15 - Warning: <img> lacks "alt" attribute
line 482 column 22 - Warning: <img> lacks "alt" attribute
line 482 column 63 - Warning: <img> lacks "alt" attribute
line 482 column 112 - Warning: <img> lacks "alt" attribute
line 482 column 162 - Warning: <img> lacks "alt" attribute
line 493 column 15 - Warning: <img> lacks "alt" attribute
line 502 column 304 - Warning: <img> lacks "alt" attribute
line 510 column 22 - Warning: <img> lacks "alt" attribute
line 510 column 63 - Warning: <img> lacks "alt" attribute
line 510 column 112 - Warning: <img> lacks "alt" attribute
line 510 column 162 - Warning: <img> lacks "alt" attribute
line 521 column 15 - Warning: <img> lacks "alt" attribute
line 528 column 120 - Warning: <img> proprietary attribute value "absmiddle"
line 528 column 120 - Warning: <img> lacks "alt" attribute
line 535 column 11 - Warning: <img> lacks "alt" attribute
line 536 column 22 - Warning: <img> lacks "alt" attribute
line 536 column 63 - Warning: <img> lacks "alt" attribute
line 536 column 112 - Warning: <img> lacks "alt" attribute
line 536 column 162 - Warning: <img> lacks "alt" attribute
line 547 column 15 - Warning: <img> lacks "alt" attribute
line 562 column 21 - Warning: <img> lacks "alt" attribute
line 562 column 62 - Warning: <img> lacks "alt" attribute
line 562 column 111 - Warning: <img> lacks "alt" attribute
line 562 column 161 - Warning: <img> lacks "alt" attribute
line 563 column 11 - Warning: <img> lacks "alt" attribute
line 573 column 15 - Warning: <img> lacks "alt" attribute
line 599 column 11 - Warning: <img> lacks "alt" attribute
line 600 column 22 - Warning: <img> lacks "alt" attribute
line 600 column 63 - Warning: <img> lacks "alt" attribute
line 600 column 112 - Warning: <img> lacks "alt" attribute
line 600 column 162 - Warning: <img> lacks "alt" attribute
line 611 column 15 - Warning: <img> lacks "alt" attribute
line 629 column 44 - Warning: <img> proprietary attribute value "absmiddle"
line 629 column 142 - Warning: <img> proprietary attribute value "absmiddle"
line 629 column 246 - Warning: <img> proprietary attribute value "absmiddle"
line 638 column 25 - Warning: <img> lacks "alt" attribute
line 643 column 267 - Warning: <img> lacks "alt" attribute
line 356 column 4506 - Warning: trimming empty <label>
line 410 column 4546 - Warning: trimming empty <label>
line 623 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 203 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 328 column 27 - Warning: <nobr> is not approved by W3C
line 354 column 27 - Warning: <nobr> is not approved by W3C
line 380 column 27 - Warning: <nobr> is not approved by W3C
line 408 column 27 - Warning: <nobr> is not approved by W3C
line 434 column 27 - Warning: <nobr> is not approved by W3C
line 498 column 27 - Warning: <nobr> is not approved by W3C
line 526 column 27 - Warning: <nobr> is not approved by W3C
line 552 column 27 - Warning: <nobr> is not approved by W3C
line 578 column 27 - Warning: <nobr> is not approved by W3C
line 616 column 27 - Warning: <nobr> is not approved by W3C
Info: Document content looks like HTML5
Info: No system identifier in emitted doctype
Tidy found 236 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