I do hope to one day follow up on more ZeldaClassic hacking. Meanwhile, John Berry/Ulf Magnet is beginning with some of my research and putting together his own Python utilities to work with the game’s data files.
Related posts:
I do hope to one day follow up on more ZeldaClassic hacking. Meanwhile, John Berry/Ulf Magnet is beginning with some of my research and putting together his own Python utilities to work with the game’s data files.
Related posts:
A multimedia colleague posed the quandary: “why are there 13 different lossless formats out there?” My best answer: Because there were at least 13 organizations or individuals that wanted their own flavor. We will probably discover that the underlying algorithms for all 13 are nearly indistingishable, just with slightly tweaked parameters. Indeed, the individual who reverse engineered Apple’s ALAC figured out portions by first understanding similar portions of FLAC.
I once reverse engineered an audio decoder from binary code only to find that is was a stock IMA ADPCM decoder. I didn’t see how it offered any advantage whatsoever over another available, free solution. I later had the opportunity to talk to someone involved with this variant’s creation. I asked why they chose to create their own format since it brought nothing new to the table; did they just want have their own format for the sake of it?
The response: “Doesn’t everybody?”
Does anyone happen to have any technical documentation (e.g., software developer’s manual) for the NEC V60 CPU?
Back in 2000, I came across this Advogato article about proper coding guidelines for the coming wave of 64-bit machines. The most interesting part, I thought, was comment #2 (“C is portable, if you let it be”) which offers some very sane guidelines for declaring variable types to just allow the compiler to do its job effectively. This is why I usually just declare int’s for numbers rather than uint32_t’s everywhere. There is often no reason to try to force particular types.
Don’t think that you’re saving space by declaring a uint8_t instead of an int– chances are that you aren’t. I’ve disassembled enough C code compiled into 32-bit x86 machine code to know that a compiler will usually allocate 32 bits for that 8-bit variable. In fact, here is a small piece of code to drive the point home:
stack.c:
Compile with: gcc -Wall stack.c -o stack
Disassemble with: objdump -d -Mintel stack
Key parts:
080483a0 < main >: 80483a0: 55 push ebp 80483a1: 89 e5 mov ebp,esp 80483a3: 83 ec 08 sub esp,0x8 80483a6: 83 e4 f0 and esp,0xfffffff0 80483a9: b8 00 00 00 00 mov eax,0x0 80483ae: 29 c4 sub esp,eax 80483b0: e8 07 ff ff ff call 80482bc < random @plt > 80483b5: 88 45 ff mov BYTE PTR [ebp-1],al 80483b8: 66 0f be 45 ff movsx ax,BYTE PTR [ebp-1] 80483bd: 40 inc eax 80483be: 66 89 45 fc mov WORD PTR [ebp-4],ax
Notice that, despite strictly needing only 3 bytes of local variable storage, 8 bytes were allocated from the stack. 32-bit machines like the i386 really, really like dealing with 32-bit quantities.