Register | Login | |||||
Main
| Memberlist
| Active users
| Calendar
| Chat
| Online users Ranks | FAQ | ACS | Stats | Color Chart | Search | Photo album |
| |
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: 6435 days Last view: 6431 days |
| ||
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: 6711 days Last view: 6711 days |
| ||
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: 6435 days Last view: 6431 days |
| ||
Define "block of text" ._. | |||
Disch Red Cheep-cheep Since: 12-10-05 Last post: 6711 days Last view: 6711 days |
| ||
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: 6435 days Last view: 6431 days |
| ||
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: 6434 days Last view: 6431 days |
| ||
Originally posted by Celice 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: 6726 days Last view: 6726 days |
| ||
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: 6433 days Last view: 6431 days |
| ||
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:
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: 6816 days Last view: 6816 days |
| ||
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: 6711 days Last view: 6711 days |
| ||
Originally posted by beneficii "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: 6435 days Last view: 6431 days |
| ||
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:
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: 6434 days Last view: 6431 days |
| ||
Originally posted by DischOriginally posted by beneficii 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: 6711 days Last view: 6711 days |
| ||
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: 6434 days Last view: 6431 days |
| ||
Originally posted by Disch 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: 6435 days Last view: 6431 days |
| ||
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. | | |