No prob. If you understood all that, there is no reason to break it down any further
Moving along...
For an example of what a nightmare it WOULD be if programmers were only allowed to use 1's and 0's, imagine an entire disassembly for a game written in them. The thing would be unreadable to humans. The computer would have no problems tho...since it's only interested in whether the gates are open or shut in the collection of 8 that it's looking at. So hex, decimal, binary notation is really kind of irrelivant to the computer. Those only exist to benefit YOU - the reader - trying to make sense out of what gets fed into the computer.
EDIT for previous post:
I mentioned addresses above in a couple of spots, when I really should have used the word "byte". The computer deals with all sorts of numbers, and a few of them have no address. They are called the registers...and keep track of what is currently happening. Skip ahead if you aren't interested in hacking the very instructions of games...because this might get a bit deep.
Three of the registers of them are used by the program to hold values that are currently being manipulated (the accumulator, X, and Y registers). Variables, in other words. And everything that happens in a program is dependant upon what those variables hold. The accumulator is the real workhorse...most everything that happens does so because of a value passing through this register (or variable). It's also called just "A". And the X and Y registers are secondary...either holding values that we want to work with while keeping the accumulator intact, or assisting the accumulator to do it's job.
Another register (the status register) contains 8 bits that change depending upon the results of the manipulations happening to those 3 variables. For example...if 2 values are being compared, a bit will be turned on in the status register if they are of equal value.
Still another register (the program counter) exists to keep track of WHERE the program is when running the program. This allows the computer to be able to move to the next instruction in memory once the current one has been dealt with...as well as jump away from it's current position to a new area.
Getting back from all of that:
"Addresses" are just like the name implies. When you go to somebody's house, you are going to their address. Similarly, when the computer is moving values from a register to memory or from memory to the register, it's copying the value from register to the address or visa-versa.
The superb book Machine Language For Beginners describes the computer's memory as a long street...which has 65536 houses along it. Each of those houses is an address...and can hold exactly 8 bits (which "live" inside it). The value in each address is the combination of those 8 bits.
Besides the registers (which don't "live" at any address), there are 2 types of computer memory...Ram and Rom.
ROM (Read-Only) Memory is the entire contents of the program cartridge, and it's size and values NEVER change. They are burned right into the chip itself, and none of the values can be altered. They contain every instruction, every sprite, and every piece of data that it "knows" when it is powered up. And it's size is also unchanging...a Rom chip that holds 4096 bytes (i.e. "houses") of memory will always hold 4096 bytes. No more. No less. And the values within will remain in the chip...even if the computer is off power.
RAM (Random-Access) Memory are similar to the registers. The values in each of those addresses can be overwritten. They can be "looked at" by the program...and values from registers can be copied to them. The number of Ram addresses ("houses") is usually unchanging. I use the word "usually" because the Atari console itself holds a static number of them...but some cartridges or hardware include Ram memory of their own. Ram memory will be cleared or corrupted when the system is getting no power.
When hacking graphics, one of the first things you might be wondering is
why you cannot make sprite shapes larger than what they already are. This is due to the cartridge chip size...it never changes...as well as the way the program is written (if the program's Rom instruction is only reading 10 addresses, it will always only read those 10 addresses). So if you try making a sprite larger, it will be overwriting the values of what existed above and below it. Those are Rom addresses too...and the program might be expecting specific values to "live" there. Some games might be a bit forgiving...like reading in a group of 20 addresses even though only 10 of them hold non-zero values. But for the most part, you should expect that the sprites must be kept at the same size it was originally or less. To make them larger, you usually need to change the program instructions themselves to account for the additional lines. And that leaves one method...
Disassembly:
Programs like HOM and 2600GFX work well to change things that are instantly recognisable...like sprite shapes...but to get farther than that and be able to change the program instructions themselves, you'll need to have a program DISASSEMBLE the contents of the program and translate it into a file that is read at your leisure. The disassembler will translate all of those bytes into the program instructions and data values into a format that is decypherable by lowly humans like us...who have problems seeing the difference between %10111010 and %10011010 in a few nanoseconds.
Instead, the program code will be translated into 3-letter instructions (called menomics...or "memory aids")...as well as any value needed to perform that instruction (called "arguments"). The reason that they are "memory aids" is because it's quite easy to see a difference between STX $8D and STY $8D. Moreso than $86 $8D and $84 8D. In that example instruction, the contents of the X or Y register is being copied to Ram address $8D. STX/STY is the instruction, $8D is the argument. So all of those seemingly random values from the Rom code are translated (or rather, interpreted) to something that we can read more easily. Remember, it makes no difference to the computer. The menomics and hex values exist only to help
you read it. So once a program is disassembled, it will no longer run on the computer. The disassembly exists for humans alone. In order to run on the computer, the program would have to be ASSEMBLED...interpreted from all of those instructions and arguments back into the 0's and 1's that the computer can read.
Problems with disassembly:
There is one major problem during this automatic interpreting to get a readable disassembly. And that is that the program instructions use the same values that the arguments and data do. $88 is the value of the menominc DEY...but how will the disassembling program
know when it's not referring to a data value of $88? How will it know when to insert the letters "DEY" instead of "$88" into the disassembly? Fortunately, all Atari game programs start from a known location. This is listed right near the end of the Rom cartridge memory...and the disassember knows this and begins translating menomics from the address given (and following). When the program branches off to a new address, so does the disassembler...and it converts the values there to menomics also. Anything NOT branched to will be left as values only...listed as ".byte XX" in the disassembly (where XX is the value). In that sense, the disassembler at least tries to do it on it's own. Problems crop up due to the way that some instructions work...
Some instructions' arguments are not literally given in the program code, but rely on the Ram memory to assist (this is called indirect addressing). For example, instead of loading a value FROM ram address $A8, it might be loading the value from the address GIVEN at ram address $A8. This is way too much complexity for a disassembler to handle...and it will miss out on labelling that line. Ram addresses can also be used to hold addresses JUMPED TO! In that sense, entire sections of program code will fail to be interpreted into menomics! Fortunately, there is a solution...
Configuration files:
These small files are created by a person PRIOR TO disassembly. In it, all the address portions that the disassembler should interpret as coded menomics are listed, as well as portions to be interpreted as data or graphics. You can add as many portions as there are Rom addresses...and also list where in memory that disassembly is to begin at "on paper". Usually what people do is let the disassember run an automatic version of the listing...and then create a config file after looking though it to check for missed areas. Then the final version of the disassembly is run with the aid of that configuration file.
More?