(Link to AcmlmWiki) Offline: thank ||bass
Register | Login
Views: 13,040,846
Main | Memberlist | Active users | Calendar | Chat | Online users
Ranks | FAQ | ACS | Stats | Color Chart | Search | Photo album
05-03-24 09:38 AM
0 users currently in ROM Hacking.
Acmlm's Board - I3 Archive - ROM Hacking - "How do I" pointer help. New poll | |
Add to favorites | Next newer thread | Next older thread
User Post
Celice

Gordo








Since: 11-17-05
From: Oroville, CA

Last post: 6288 days
Last view: 6284 days
Posted on 01-28-06 11:09 PM Link | Quote
I'd assume some games, if not all, use thier own format for pointers. So I'm remixing this game, and the game itself hasn't even been completly translated. In fact, it's been done wrong in some places, and crashes. Thanks go to J2E before they poofed. So now that I'm working with their translation, I need to work in some more text for certain things. I them, know I'll need room: I already have that figured out. What I need help with is this:

Does anyone here have any suggestions for finding an NES game's pointer format :?

I wouldn't think J2E had known anything 'bout it they have "Zmb" in place of "Zombie."
Disch

Red Cheep-cheep


 





Since: 12-10-05

Last post: 6563 days
Last view: 6563 days
Posted on 01-28-06 11:20 PM Link | Quote
Usually there's a pointer table right before the block of text you're interested in. However judging by this question I'm guessing it's not that obvious for this particular game.

Anyway -- I would do this (like I do everything else) the long way.

1) Find out how the text gets to the screen (likely it gets moved to RAM first, then gets drawn to the screen -- or it goes straight from ROM->screen)

2) Keep tracing where the text comes from until you find out where the game is pulling it from in the ROM

3) Once you find where the game is pulling it from the ROM, find HOW the game is pulling it from the ROM. If it's via an indirection a la "LDA ($10),Y", you have your pointer at $10,$11.

4) Trace the values at $10,$11 backwards until you find where in the ROM they came from. And there's your pointer.


Of course because I do everything the long way ... I rarely finish anything rom-hacking related. But while this method is long -- it's full proof. If you stick with it you're guaranteed to find what you're looking for (unless the game happens to not use pointers at all -- but you'll find that out in this process if that's the case).
Celice

Gordo








Since: 11-17-05
From: Oroville, CA

Last post: 6288 days
Last view: 6284 days
Posted on 01-28-06 11:53 PM Link | Quote
Define "block of text" ._.
Disch

Red Cheep-cheep


 





Since: 12-10-05

Last post: 6563 days
Last view: 6563 days
Posted on 01-29-06 12:34 AM Link | Quote
several strings clumped together in an area of ROM. For example in Final Fantasy all the enemy names are clumped together with a null seperator between them ($00) so you're left with something like this:

[blahblah pointer table here blah]
IMP\0GrIMP\0WOLF\0Gr
WOLF\0SPIDER\0
[etc]
Celice

Gordo








Since: 11-17-05
From: Oroville, CA

Last post: 6288 days
Last view: 6284 days
Posted on 01-29-06 01:11 AM Link | Quote
I recognize those. What exactly should a pointer look like? I know a pointer is just that: a pointer. But... yeah. It seems I haven't gotten too far on the deeper hacking processes.

Pointer table: $00~$FF, and then something saying $3D = $34007? Ish?



I've tried reading up on these kinds of things, but I'm the kinda guy who needs someone to kinda walk him through the first time. And how something should and will work. Not the best description for an actual hacker, I know D:
beneficii

Broom Hatter


 





Since: 11-18-05

Last post: 6287 days
Last view: 6283 days
Posted on 01-29-06 04:48 AM Link | Quote
Originally posted by Celice
I recognize those. What exactly should a pointer look like? I know a pointer is just that: a pointer. But... yeah. It seems I haven't gotten too far on the deeper hacking processes.

Pointer table: $00~$FF, and then something saying $3D = $34007? Ish?




I've tried reading up on these kinds of things, but I'm the kinda guy who needs someone to kinda walk him through the first time. And how something should and will work. Not the best description for an actual hacker, I know D/quote]

Well, here is where you have to deal with how the NES works itself. The pointers should typically be stored 2 bytes each, with the low-byte first. Then you need to figure out what ROM address the RAM address pointer is referring to. Say, you have $8456 ($=hex) as the RAM address pointed to; well, you'll have to find out the ROM address. This is where it gets fun.

The easiest way is to see if you can get a list of values starting at $8456 and then search for them. You'll want the ROM address you get to have 466 as its last 3 digits. It's likely that you would only get one hit in the search that fits this, but you should check again, if there's 2 or more, then change for one of them and see if you get the result changed on your function, then you have it.

To calculate the ROM address you want, take off the last 3 digits of the RAM address, and add $10 to it. If you get $1000 or more from this, then just take the last 3 digits of that and compare to that.

I hope you can understand this. I'm not sure how knowledgeable you are about this.


(edited by beneficii on 01-29-06 03:52 AM)
Kirk Bradford Myers

Shyguy








Since: 01-23-06
From: Baltimore, Maryland

Last post: 6578 days
Last view: 6578 days
Posted on 01-29-06 12:53 PM Link | Quote
Someone calling themselves Madhacker wrote a very good tutorial on using and implementing pointers in NES games. It can be found below. You will need WordPad to view the document.

The Madhacker's Guide To NES Pointers

And here's an online follow-up by the same author:

Using Pointers Effectively

Also, one more. This is a pointer format for the game Metroid, but it might be helpful in figuring out what you need to know about how pointers work, as it seems to be written in simplistic detail and the methods used therein can be applied to a lot of different games...

Metroid Pointer Format

Hope that helps...
Gideon Zhi

Keese








Since: 12-05-05
From: ...behind you! Boo!

Last post: 6286 days
Last view: 6283 days
Posted on 01-29-06 12:54 PM Link | Quote
Say, is this Villgust? I remember playing a bunch of Villgust and getting stuck, just because there didn't seem to be anywhere else to go, and wondered if it was the fault of the translation.

Edit: Anyway, a pointer is simply a memory address (in an NES game) or a file/bank address (in an SNES game.) It tells the game where a particular piece of text begins. For example, in FF1 you'll see this:


See your face upon the
clean water. How dirty!
Come! Wash your face!


In this case, there'll be a pointer -probably- pointing to the capital S in "See." The reason the MadHacker's document talks about subtracting $10 is because of the iNES header - real NES games don't have this header, and it pushes all the addresses up sixteen bytes and makes your calculations nasty. Same with the $200-byte subtract rule on SNES games, except SNES headers are entirely removable with no real repurcussions.

The various formats that the MadHacker talks about revolve around how the game is programmed (as such, pointer tables don't necessarily work exactly the same way in every game), what the game's mapper is, and where the text ends up in memory. The 6502 also uses an endian mode that we're unused to. We're used to thinking in big-endian; that is, the biggest parts of a number come first. Most consoles think in little-endian; that is, the smallest byte are written first. This is the reason for the "byte swap" thing that you hear about when you're researching pointers.

So that's all they are - somewhat complicated (if only 'cuz you're not used to them) addresses that tell the game where to find a single given bit of its text. Hope that helps some.


(edited by Gideon Zhi on 01-29-06 12:09 PM)
(edited by Gideon Zhi on 01-29-06 12:10 PM)
ForrestKnight
Newcomer


 





Since: 01-29-06
From: North America

Last post: 6668 days
Last view: 6668 days
Posted on 01-29-06 01:35 PM Link | Quote
I imagine it's Fire Emblem Gaiden. Only thing I can think of on the NES that j2e did and had malformed names.
Disch

Red Cheep-cheep


 





Since: 12-10-05

Last post: 6563 days
Last view: 6563 days
Posted on 01-29-06 02:50 PM Link | Quote
Originally posted by beneficii
To calculate the ROM address you want, take off the last 3 digits of the RAM address, and add $10 to it.


"CPU address" or just "address", plzkthx. Not all of CPU addressing space is RAM. In fact very little of it is. Misleading terminology is problematic when people have to actually differentiate between RAM and addressing space and they think of the two as one and the same.
Celice

Gordo








Since: 11-17-05
From: Oroville, CA

Last post: 6288 days
Last view: 6284 days
Posted on 01-29-06 09:06 PM Link | Quote

Knight|E|Armor|E|Paladin|E|FFFFFF|E|Merc |E|SwordM|E|MagicKn|E|Priest|E|Archer|E|Sniper |E|Villager|E|Mage |E|Nun|E|Cleric|E|Sage|E|Bowman|E|Fighter |E|Baron|E|Hero|E|Royal|E|Soldier|E||E

Alright, so this is what I've come up with (|E| are the seperater thingers): Knight is at 3DBB3. Mad said to subtract ten. So it's now 3DBA3. From there, switch the last 4 digits. So it's now A3 DB. It later says:

8) Check the second digit in the number you just wrote down (In FE it'd be the E). Compare that
value with the hundreds place in your adjusted position (In 12345 it'd be the 3). If they match,
you may have found the beginning of your pointer table. In they don't, continue searching UP.

3DBB3 - DB. Correct? So this is using the Standard Format. However, whenever I change this "pointer" nothing changes.
beneficii

Broom Hatter


 





Since: 11-18-05

Last post: 6287 days
Last view: 6283 days
Posted on 01-30-06 03:55 AM Link | Quote
Originally posted by Disch
Originally posted by beneficii
To calculate the ROM address you want, take off the last 3 digits of the RAM address, and add $10 to it.


"CPU address" or just "address", plzkthx. Not all of CPU addressing space is RAM. In fact very little of it is. Misleading terminology is problematic when people have to actually differentiate between RAM and addressing space and they think of the two as one and the same.


OK, sumimasen. To be clear to Celice, I was referring to the $8000 to $FFFF range of the main CPU memory where the ROM data is put into as "RAM." Since that tied in that address system where the RAM is also stored, it seemed to make sense to call it the "RAM" space to differentiate from the word "ROM," which was reserved for the following definition: By ROM address, I was referring to the equivalent address found in the iNES format ROM image file.


(edited by beneficii on 01-30-06 02:57 AM)
(edited by beneficii on 01-30-06 02:58 AM)
Disch

Red Cheep-cheep


 





Since: 12-10-05

Last post: 6563 days
Last view: 6563 days
Posted on 01-30-06 02:26 PM Link | Quote
CPU addressing space contains more than just ROM and RAM (though it typically addresses much more ROM than RAM). CPU space also addresses system registers. But it wouldn't make much sense to call $CD43 a register address -- since it's not a register.

Like I said it's an easy sub to just say "CPU address" instead of "RAM address". Same number of letters, much more clear, not a misleading term. Everyone wins. If you're worried about a conflict with the .nes file -- you can refer to those as "offsets". "ROM offset" and "CPU address" are not terms that will be confused for each other, and are not misleading or inaccurate.

I've also seen/used other techniques such as using numbers like $8000 for CPU addresses ($ symbol... always exactly 4 digits), but using 0x08000 for ROM offsets (0x symbol, always 5 or more digits).


But whatever floats your boat. I know I sound like a whiney anal prick, but it's just a pet peeve of mine when people throw around glaringly wrong terms. It'll do nothing but cause confusion for people down the line.
beneficii

Broom Hatter


 





Since: 11-18-05

Last post: 6287 days
Last view: 6283 days
Posted on 01-30-06 03:24 PM Link | Quote
Originally posted by Disch
CPU addressing space contains more than just ROM and RAM (though it typically addresses much more ROM than RAM). CPU space also addresses system registers. But it wouldn't make much sense to call $CD43 a register address -- since it's not a register.

Like I said it's an easy sub to just say "CPU address" instead of "RAM address". Same number of letters, much more clear, not a misleading term. Everyone wins. If you're worried about a conflict with the .nes file -- you can refer to those as "offsets". "ROM offset" and "CPU address" are not terms that will be confused for each other, and are not misleading or inaccurate.

I've also seen/used other techniques such as using numbers like $8000 for CPU addresses ($ symbol... always exactly 4 digits), but using 0x08000 for ROM offsets (0x symbol, always 5 or more digits).


But whatever floats your boat. I know I sound like a whiney anal prick, but it's just a pet peeve of mine when people throw around glaringly wrong terms. It'll do nothing but cause confusion for people down the line.


I understand 100 percent. Don't worry about sounding whiny. I realize now that what I said was probably confusing. I understand what you're talking about, and I do understand the NES pretty well, and yes the ROM and the RAM are not the only parts of the CPU address space (the registers starting at $2000 and $4000 and also the mapper registers). It's not that I was misunderstanding that. In my head, I had largely used RAM to refer to the CPU address space and ROM to refer to the ROM offset, while understanding the limitations of the my uses of the terms. Where I went wrong was when I used it with other people and assumed they knew it. My mistake. We've talked before about various things on the NES and I think you know that I'm no NES n00b.

A lot of people I noticed consider you whiny, but I actually to an extent applaud most of your posts. I think an effort toward accuracy in terms is generally a good idea. I also like how you went after the people who made hacks that require colors not on the NES palette and still called it an NES game.
Celice

Gordo








Since: 11-17-05
From: Oroville, CA

Last post: 6288 days
Last view: 6284 days
Posted on 01-31-06 12:57 AM Link | Quote
Alright. I've gone though as many ways as I can think of. I've even gone plugging in X000 in hopes of finding something. However, still nothing. From what I read, I'm using a sequential kind of pointer. As in, with Armor|E|Knight, remove the breaker (|E|), and the game keeps the text going till the end of the drawn box.

Any help? I would have tried Disch's method, but I've not come to understand how to associate the RAM and ROM as one when looking for things.

There's so much wasted space it makes me cry. There's at least three words repeated per weapon. So in the case of Silver, instead of only using six, I'm wasting 18 slots which could be used for something that actually NEEDS it.
Add to favorites | Next newer thread | Next older thread
Acmlm's Board - I3 Archive - ROM Hacking - "How do I" pointer help. |


ABII

Acmlmboard 1.92.999, 9/17/2006
©2000-2006 Acmlm, Emuz, Blades, Xkeeper

Page rendered in 0.020 seconds; used 429.94 kB (max 541.00 kB)