Announcement

Collapse
No announcement yet.

Cheat Codes For Atari 2600 Emulator "Stella"

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Cheat Codes For Atari 2600 Emulator "Stella"

    Does anyone know if there are any cheat files for the Atari 2600 emulator "Stella"? I can't find any cheat files for Stella. I saw just a few individual cheat codes over at AtariAge, but that's about it. I heard somebody mention "Bob Colbert's Cheetah cheat codes". I don't know what that is. I don't know if that is a cheat file or a method of inserting and/or creating cheats on your own. But I think it is a cheat file. If that is a cheat file, I don't know where I can find that file? Anyone know any information regarding any of this?

    (When I search for "Bob Colbert's Cheetah cheat codes", the website that it used to be located was at "members.cox.net/rcolbert", but it appears that site no longer exists. All the links that people over at AtariAge have posted for those codes are dead links to that website or variants of that website. And I can't find those codes anywhere else.)

    Can anyone please help me?
    Last edited by OldSchoolGamer; 11-05-2011, 07:44:47 PM.
    Now broadcasting from the underground command post. Deep in the bowels of a hidden bunker. Somewhere under the brick & steel of a nondescript building. We've once again made contact w/ our leader, OSG

  • #2
    Use archive.org to enter the dead website and hope the files are archived there.

    Comment


    • #3
      I'll try that. But does anyone have any information regarding cheats for Stella? Has anyone found any cheat files?
      Now broadcasting from the underground command post. Deep in the bowels of a hidden bunker. Somewhere under the brick & steel of a nondescript building. We've once again made contact w/ our leader, OSG

      Comment


      • #4
        i find it- http://web.archive.org/web/201002120....net/rcolbert/

        Comment


        • #5
          Yeah, exactly what I said he should do.

          If you want Atari stuff, go to the AtariAge forums. They are pretty big.
          Last edited by ReyVGM; 11-06-2011, 05:06:01 PM.

          Comment


          • #6
            We should probably provide support for this as well, in the future.
            I may be lazy, but I can...zzzZZZzzzZZZzzzZZZ...

            Comment


            • #7
              Originally posted by ReyVGM View Post
              Yeah, exactly what I said he should do.

              If you want Atari stuff, go to the AtariAge forums. They are pretty big.
              Yea, thanks for that suggestion. I never knew a site like that existed. I'm sure that will come in handy. Yea, I know about AtariAge. It's a very good site... the best for Atari related stuff. I believe they were the original site that inspired NintendoAge, SegaAge, etc.

              I visited that site that but I only found a few games' codes. I thought it was supposed to be alot of games's codes. And I also thought that it was supposed to be a cheat file. Can you check out that site to see if I'm missing something/mistaken?
              Last edited by OldSchoolGamer; 11-08-2011, 01:10:41 AM.
              Now broadcasting from the underground command post. Deep in the bowels of a hidden bunker. Somewhere under the brick & steel of a nondescript building. We've once again made contact w/ our leader, OSG

              Comment


              • #8
                The last time I used stella I wasn't able to save cheats. I always had to modify the values in real time.

                Comment


                • #9
                  Stella and Game Cheats

                  ==================================================

                  Born2Code presents The Atari 2600 Cheat Collection

                  December 10, 2012

                  ==================================================



                  Introduction
                  ------------

                  I've been a programmer on 6502 CPU computers for over 20 years and decided to try Atari 2600 games for a challenge.
                  All cheats were done using Stella as I don't own an Atari console.

                  It took me an hour or so to figure out how to use the STELLA emulator debugger and I'm still not entirely
                  sure how to fully use it. The cheat process would be made a lot easier if a ROM search also existed.

                  There used to be a website with Cheetah codes but it's now offline. I'm not certain what games were covered so this
                  archive might contain some redundant games.


                  Personal Note
                  -------------

                  While these games are old and nothing in comparison to today's gaming consoles, I recall back when I was a teenager
                  that the Atari 2600 was a big deal to us. I remember renting one for a weekend and spending all of my free time playing
                  Pitfall and Defender. Back in the 1980's these games were amazing and there were even magazines dedicated to these
                  consoles where people sent in photos of their high scores. To think that there was a day where renting these cartridges
                  earned businesses a profit. Oh how times have changed!


                  Games covered
                  --------------

                  Here is a list of the games covered. I've noticed that many of the games are renamed (example: River Raid) or there
                  were multiple versions of the same game released. Stella uses a hash value (MD5) to determine which binary file you're
                  using. For this reason my cheats may not work with your version! I've supplied the binary files used in creating these
                  cheats.

                  Note that some games had the option for unlimited time but I found that upon completing a level, the game would
                  try to subtract remaining time. This would result in an endless loop and so the cheat was removed.

                  Some cheats require multiple selections be enabled at once.
                  Example: Infinite Lives 1, Infinite Lives 2.

                  The reason for this is that I need to insert different code into the game and as far as I know Stella doesn't support inserting different code for
                  one selected cheat. Cheats were playtested but some may not be 100%.


                  LEGEND:

                  L - Infinite Lives
                  T - Infinite Time
                  P - Infinite Power
                  I - Invincibility
                  F - Infinite Fuel

                  The List:

                  2600 Invaders (L)
                  A-Team (L)
                  Air Raid -Menavision (L)
                  Alien (L)
                  Amidar (L)
                  Apples and Dolls (L)
                  Aquaventure (L) buggy
                  Assault (L)
                  Asteroids (L)
                  Asteroid Belt aka Time Machine (L)
                  Astroblast M-Network 1982 (L)
                  Astrowar aka Meteor Defence (LI)
                  Bank Heist (L)
                  Baseattack aka Z-Tack (L)
                  Battlezone (L)
                  Beany Bopper (L)
                  Berzerk (L, I) * Invincibility can get you stuck if you hit a wall *
                  Bi!Bi (L)
                  Buck Rogers (LT)
                  Bump N Jump (L)
                  Burning Desire aka Jungle Fever (L) *Activate After Loading *
                  Cabbage Patch Kits (L,T)
                  Carnival (L)
                  Centipede (L)
                  Chopper Command (L)
                  Commando (L, grenades)
                  Condor Attack (vulture attack) (L)
                  Conquest of Mars (LF)
                  Crazy Balloon (LT)
                  Crazy Climber (L)
                  Cross Force (L)
                  Crystal Castles (L)
                  Deadly Duck (L)
                  Death Star aka star Wars (L)
                  Defender 2 (L + Smart Bombs)
                  Demon Attack (L)
                  Donkey Kong Junior (L)
                  Donkey Kong (L)
                  Double Dragon (T)
                  Elevator Action (L)
                  Encounter at L-5 (L)
                  Espial (L)
                  Fast Eddie (L) * Must enable both cheats*
                  Flash Gordon (Space Adventure) (L)
                  Frogger (L,T)
                  Frostbite (T)
                  Galaxian (L)
                  Garfield On the Run (L)
                  Gas Hog (L)
                  Gorf (L)
                  Gyruss (L)
                  HERO (L,E and TNT)
                  Ikari Warriors (L,E and grenades)
                  Invaders (Erik Mooney) (L)
                  James Bond (L)
                  Joust (L)
                  Jungle Hunt (L)
                  Junior Pac Man (L)
                  Keystone Capers (L)
                  Marineflieger aka Seahawk (L)
                  Mario Brothers (L)
                  MegaMania (L,E)
                  Miner 2049'er (L)
                  Miner 2049'er Volume 2 (L) *may only work for first level*
                  Mission 3000 AD (L)
                  Montezuma's Revenge (L) *enable cheat after you've loaded file *
                  Moon Patrol (L)
                  Mr. Do (L)
                  Mr. Postman (L)
                  Ms. Pac Man (L)
                  Oystron (L)
                  Pac Kong (L,T)
                  Pac-Man Space (hack) (L, eat enemies anytime)
                  Pengo (L)
                  Phoenix (L, shields)
                  Pole Position (T)
                  Radar Lock (L)
                  River Raid (aka Galaga) (F)
                  River Raid 2 (L, F)
                  Solar Storm (L, no overheat)
                  Space Chase (L)
                  Space Invaders (L)
                  Space Invaders - PAL Version (L)
                  Star Wars - The Empire Strikes Back (L)
                  Time Pilot (L)
                  Tom Boy (aka Pitfall) (LTP)Road Runner (L)
                  Star Wars - the Arcade Game (L)
                  Subterennea (L)
                  Super Cobra (L) * must enable ALL life cheats * fuel is in $c3
                  Tempest (L)
                  Time Warp (L) (includes PAL version)
                  UFO PAtrol (Time Warp) (L)
                  Vanguard (L,F)
                  Venture
                  Wizard of War (L)
                  Zaxxon (L, F)


                  Other Cheats
                  ------------
                  Mr. Do's Castle ($F1 holds lives)

                  Double Dragon - energy $9c
                  infinite time set F2Ac = 0


                  Tutorial
                  --------

                  Cheating a game (also called "training" as they help you learn to play a game) is ridiculously easy on the Atari 2600
                  due to the small area of RAM that is used to store values. By using STELLA you can easily cheat a game.

                  There are existing tutorials out there on this (also called 'hacking a ROM') but this is basically how it is done:


                  GYRUSS

                  For the game Gyruss we begin with 3 lives.

                  Start a new Gyruss game and with 3 lives remaining do the following:

                  1) Press ` to enter the debugger built into STELLA
                  2) Click on SRCH because we want to search RAM for our 3 lives
                  3) Enter a value of 03 (for 3 lives) and click OK
                  4) Click EXIT and play the game until you lose one life
                  5) Immediately press ` again to enter the debugger
                  6) Now we want to see which RAM location went from 3 down to 2 (for a loss of a ship)
                  7) Click CMP (this means compare locations since the last search)
                  8) Enter 02 and click OK
                  9) Any greyed out memory locations are the suspect locations that changed to '02'
                  10) You'll notice that $8B is greyed out (we read the locations from the vertical column on the left and then
                  add the value of the horizontal row, so it is $8B. Think of it like that old board game Battleship where you have to
                  line up the rows and columns.
                  11) Now we want to find out where in the game code $8B is being decremented
                  12) In the left area window make sure you are in the 'prompt' area and type in:

                  "trapwrite $8B" (without quotes)

                  this will trap all calls to that memory address
                  13) type "run" to resume the game and then lose another life
                  14) The emulator SHOULD go back to the debugger upon execution of where the game decrements the memory location $8b
                  15) If you look in the box labelled PC this gives you the memory location that the emeulator halted at.
                  16) In the lower right box scroll up to the last instruction given just before the halt (at $d213)
                  17) Notice at location $d211 the command DEC $8B this means DECREMENT the location $8b (thus, lose a life)
                  18) By changing this command to something else, such as NO OPERATION (NOP) it will stop the game from subtracting
                  a life. NOP is a command like REM is to BASIC,. It does nothing.
                  19) Double click where you see C6 8B side by side. C6 is the code for DECREMENT and 8B is the memory location to be
                  decremented. Change the codes to EA and EA respectively ($EA is code for NOP)
                  20) Now resume the game. It works! (or it should)

                  If you want to save this cheat in Stella (although I've already added it to my cheat collection) this is what you do:
                  - Press TAB in Stella to get to the CHEAT CODE menu
                  - ADD a new code and give it a name (eg. INFINITE LIvES)
                  - For the code, it gets a little complicated. We only enter the last 3 digits of the memory location where we want
                  to insert new code. So since the DECREMENT $8B was found at $d211 we will enter '211' followed by 'EA' which is the
                  op-code for NO OPERATION followed by a 1.

                  211EA1

                  The first 3 digits are the memory location / EA (no operation) / 1 repetition

                  The last digit would be a 0 if you only wanted to insert one EA, but we put a 1 because we want to repeat the
                  process one time. I found this confusing because I think it should be 1 for 1 opcode, 2 for two, etc.

                  So the original code was:
                  $D211 dec $8b c6 8b

                  and we changed it to
                  $D211 nop nop ea ea

                  The two letter values ($ea, $c6) are the actual values that are placed in the Atari's memory while the
                  words (DEC and NOP) are just a way for humans to understand what those two digit values translate to in machine
                  language.


                  The Basics of cheating
                  ----------------------

                  The 6502 chip has three registers. Think of a register like a corkboard in your office. You can take a number and staple
                  it up on the corkboard which is the analogy I'll use for storing values in the registers of the Atari 2600.

                  There are three registers: A,X and Y. The Atari 2600 and Commodore 64 use these registers in any machine language game
                  that has been written. The A register is best suited for mathematical use whereas the X and Y are best used for storing
                  values that don't require mathematical equations.

                  Picture three corkboards on a wall in your office or home, with labels A X and Y above them respectively.
                  In machine language if we want to store the value of 03 in the X or Y register we would do this:

                  LDX #$03 ' load X with 3
                  STX $44 ' store X in location $44

                  LDY #$03 ' load Y with 3
                  STY $55 ' store Y in location $55

                  The above code takes a value of 3 and places it in location $44 and loads Y with a value of 3 and places it in location $55.
                  LD means LOAD, ST means store. Simple right?

                  Note that the #$ means "put this actual number" in that location. So using our analogy, this code takes a number "03" and
                  places it on our corkboard labelled X and takes a number "03" and places it on the Y whiteboard. The STX and STY means,
                  "store whatever is on my X/Y corkboard" into the memory location that follows.

                  We can also load the X or Y registers with the value of what's in a memory location, instead of actual numbers.

                  LDX $03
                  STX $44

                  LDY $03
                  STY $55
                  (notice the # sign is not present)

                  This is different from the earlier example. The difference is that this time we don't go through our shoebox and find
                  a number 03, we go through the Atari's memory and pull out *whatever value* is sitting in location $03.

                  We can put any number from 0-255 in any of these three registers or we can take a number from any memory location and put it
                  in any of these three registers.

                  What's the difference in loading an actual number (eg. LDA #$02) vs. loading a memory location value (eg. LDA $02) ?
                  Well in the case of an actual number we would use this to put the number of lives into a memory location. '3' is always
                  going to be 3, right? It will never change nor would we want it to. Three ships for every new game.

                  Loading the value of what's in a memory location doesn't necessarily mean we'll always get the same number nor would we want
                  to especially if we're reading a joystick port value or a paddle value.


                  As it applies to games
                  ----------------------

                  For the purposes of cheating a game, we know that a game will use RAM memory to hold the value of your lives, energy, time,
                  etc. This is because these values need to change (eg. when you lose a ship) and this cannot be done if the values are stored
                  in ROM. ROM is permanent, RAM is temporary (Computers 101 right?).

                  A real life way of storing a life in a game is to load a register with the actual number of 3, and place it into a memory
                  location upon the beginning of a new game. [substitute the 3 for whatever number of lives you have in the game]

                  LDY #$03
                  STY $A4

                  In any game on the Atari 2600, you are going to find some code that looks something like the examples I've shown you above.
                  It might be LDY, it might be LDX or it might be LDA. the LD means LOAD and the last letter is X Y or A.

                  The second line (ST) is arbitrary, we don't know what location the number 3 will be stored in because every game is different.
                  This doesn't concern us anyway because we don't want to change this code, we want to change the code that alters the lives when
                  you lose a ship.

                  There are a few ways this is done and we'll cover them right after we talk about the Accumulator.

                  The Accumulator
                  ---------------

                  In addition to the X and Y registers we have the A register. It's also called the Accumulator because as the name implies
                  it can accumulate values. It's used for adding, subtracting, etc. but works just like the X and Y registers.

                  LDA #$45
                  STA $ED

                  this takes a value of #$45 and puts it in memory location $ED.

                  We can also transfer from X or Y to A and vice versa.
                  LDA #$55
                  TAX
                  LDA #$66
                  TAY

                  This takes the number #$55 and transfers it to X, it then loads A with #$66 and transfers it to Y.

                  TAX is like saying, take whatever I have stuck to my A cockboard and go put it on my X whiteboard.
                  TAY is like saying, take whatever I have stuck to my A corkboard and go put it on my Y whiteboard.

                  Whatever was in your X and Y register is replaced with what is in A. Our corkboard only allows for one number to be stuck
                  on it at a time

                  We can also take whats on our X or Y corkboard and put it onto the A board.

                  LDY #$66
                  TYA ' transfer Y to A

                  this puts a #$66 on the Y whiteboard and transfers it to the A board as well.

                  So now that you have a basic understanding of how the registers work, let's move on.

                  Getting down to business
                  ------------------------

                  In any game you're going to have at least one memory location that's used for lives, power, time, etc.

                  This location will be loaded with the # of lives you have and stored into a memory location upon the start of a new game.

                  It might be done with the A X or Y register. Here are three samples that could occur in three different games:

                  Game One
                  LDX #$03
                  STX $55

                  Game Two
                  LDY #$03
                  STY $DD

                  Game Three
                  LDA #$03
                  STA $56

                  In the above, these hypothetic games used $55, $dd and $56 to hold the # of lives that you begin with.
                  What we are concerned about is when these memory locations are DECREMENTED (loss of a life).

                  This is where it gets a little complicated as there are many different ways of doing this.

                  Game One might use:

                  DEC $55 ' decrement the value of whatever is in location $55

                  Game Two might use:

                  LDA $DD ' take number currently in location $dd
                  SEC ' set carry flag
                  SBC #$01 ' subtract 1
                  STA $DD ' store back into location $dd

                  Game three might use:

                  LDY $56 ' load Y with number from location $56
                  DEY ' decrement Y
                  STY $56 ' store back into location $56

                  These methods are typical of most Atari 2600 games and they all perform the same function.

                  Use the Stella emulator to determine the memory location that holds your # of lives. I won't cover the methodology here
                  as there is already a tutorial on this. You would substitute the $56 for whatever Stella indicates is the RAM location being
                  altered when you lose a life.


                  Performing the cheat
                  --------------------

                  Once Stella has given you the memory location where the location containing your number of lives is, you'll find some
                  code similar to one of the three examples I've shown you. Let's pretend it's location $55 just to be consistent.

                  Decrement method:

                  If you see a DEC $55, this has to be removed. To do this we'll use the NOP command (NOP means No Operation, much like a
                  REM command in BASIC. It does...nothing). In the code where you see DEC $55 you'll see the numbers $C6 $55. The $c6 means
                  DECREMENT and the $55 is the location to be decremented. You COULD change the 55 to something like 88 and the code would
                  then become DEC $88 but since we don't know whats in location $88, it could make our game buggy. By changing the two values
                  to $EA you place two NOP's over top of the old code.

                  Pretending the code is at location $1000 in Stella...

                  $1000 $C6 $55 (dec $55)
                  after changing the C^ and 55 it becomes
                  $1000 $EA EA (nop, nop)


                  The subtraction method:

                  This is used mainly for timers and energy levels because the Accumulator register can handle carrying (think back to when you
                  added numbers on paper and the teacher told you to carry the '1' when you added 9 + 1).

                  LDA $55 ' load Accumulator with whatever is in location $55
                  SEC ' sec carry
                  SBC #$01 ' subtract 1 (notice the # sign meaning the actual number 1)
                  STA $55 ' store it back in location 55

                  P.S. A simple DEC $55 would also accomplish same thing.

                  We could put some NOP's in this code to stop the subtraction, but I have an easier method. Change the 01 to a 00 and it
                  becomes SBC #$00. Any number subtracted with 0 remains unchanged. So move over to the $E9 $01 and change the 01 to a 00.

                  Easy isn't it?

                  Finally the DEY method (or DEX):

                  LDY $55 ' load Y with location $55 (currently value of 3 ships)
                  DEY ' DECREMENT Y value
                  STY $55 ' store Y back in location $55

                  We can put a NOP where the DEY is, or put two NOPS over top of the STY $55.

                  LDY $55 ' load Y with location $55 (currently value of 3 ships)
                  NOP ' do nothing
                  STY $55 ' put the value held in Y into location 55 and since we didn't DEcrement Y(DEY) it remains unchanged.

                  or

                  LDY $55 ' load Y with location $55 (currently value of 3 ships)
                  DEY ' decrement Y so it becomes 2
                  NOP ' do nothing
                  NOP ' do nothing


                  Other methods:
                  --------------

                  There are times where it's not easy to find the location containing the number of lives. This is because there are different
                  ways to do it.

                  You could load a location with the value of 3, decrement it and the game ends when the location reaches 0.
                  You could load a location with the value of 4, decrement it and the game ends when the location reaches 1.
                  You could load a location with the value of 2, decrement it and the game ends when the location reaches 255 (3,2,1,wraps to 255)

                  It won't always be as straightforward as looking for a 3, it could be a 4 or it could be a 2. It could also start with a 0
                  and increment so that when it reaches 3 the game is over. Typically most games decrement though.

                  One method I use for difficult games is to go in and change the memory locations in Stella, row by row.

                  Sure, this is liable to cause the game to crash, restart or show odd results but it works. Basically you take it line by line
                  beginning with the first row of numbers in the Stella debugger. Change them all to zeros and then click EXIT to continue the
                  game. Did your # of ships disappear? If not, restart the game and try the next row.

                  When you reach the row that causes your # of ships to be zero, you can narrow down the exact location by trying 4 or 5
                  locations at a time.

                  Example:
                  DD 01 DD 3E 1E 05 FF FF ' change this row to all zeros and resume game
                  E1 3E 2F FF A1 01 02 03 ' if the first row didn't do anything change this row
                  FF FF FF FF FF 02 02 03 ' and so on...


                  Exporting the Results
                  ---------------------

                  If you'd like to learn how these cheats work, or would like to implement them into other emulator systems you can do so.
                  I would ask that you leave the credit for my hard work intact though.

                  1) Load the Stella emulator, ensure that the cheats file is found by Stella and load one of the games covered by my cheats.
                  2) Press TAB to get to the Cheat menu
                  3) Click on Edit Cheat and look at the CODE.
                  4) The code is the key to how the cheat works.
                  If the code is 6 digits long then it can be read the following:

                  xxxyyd

                  where xxx is the memory location, yy is the value and d is the repetition of the value.
                  For example a code of D1C8e00 for Pitfall would mean that at location $D1C a value of $8e is placed ONCE. No repetitions.
                  A code of C00EA2 would mean that at location $C00 a value of $EA (NOP) is placed three times (once, plus 2 repetitions).

                  If the code is seven digits long it can be read as the following:
                  bxxxyyd
                  b is the bank #, xxx is the memory location, yy is the value and d is the repetition.

                  A code of 1FC0EA2 would place a value of $EA at location $FC0 three times (once, two repetitions). This would occur at bank 1.

                  Some Atari cartridges have memory banks, which you can think of like a different layer. If you don't get the correct layer,
                  the memory location will not be placed in the correct spot. It will go into the proper location, but for a different 'layer'.

                  To find the proper bank, look on the debugger screen of Stella and it will show you which bank is in use. You can change it to
                  reveal the correct bank of code.

                  By enabling and then disabling the cheat, you can see how the code changes to perform the cheat.

                  Good luck

                  The files may be found here:

                  http://letitbit.net/download/51299.5..._2600.rar.html

                  http://rapidshare.com/files/39403144...ari%202600.rar

                  http://www.multiupload.nl/A7RDDK1OFM


                  born2code (Atari Age forum)
                  Last edited by born2code; 12-13-2012, 05:09:29 PM. Reason: typo

                  Comment


                  • #10
                    Very good tutorial, can I repost this on my website?
                    The Hackmaster

                    Comment


                    • #11
                      Originally posted by dlevere View Post
                      Very good tutorial, can I repost this on my website?
                      Sure, as long as it's in the same format with the credit intact

                      The cheat file (.cht) is available in the links at the end of the tutorial. They might expire someday so I'd archive the cheat file at least. The roms are provided because there are so many variations of 2600 games and the codes only work for specific games as the memory locations differ.

                      Comment


                      • #12
                        O.K., will do. Thanks for granting me permission to repost this.
                        The Hackmaster

                        Comment


                        • #13
                          Originally posted by ReyVGM View Post
                          The last time I used stella I wasn't able to save cheats. I always had to modify the values in real time.
                          I think that is why "born2code" uploaded the 100 ROMs instead of the cheat files because as you pointed out, there isn't a way to save a cheat file.
                          Now broadcasting from the underground command post. Deep in the bowels of a hidden bunker. Somewhere under the brick & steel of a nondescript building. We've once again made contact w/ our leader, OSG

                          Comment


                          • #14
                            I remember when I first learned 6502 assembly to make NES Game Genie codes, I was surprised to learn that the 6502 chip was used on lots of other systems: Apple, Apple 2, Atari 2600, Commodore PET, Commodore VIC 20, Commodore 64, etc.
                            The Code Hut: http://codehut.gshi.org/

                            Comment

                            Working...
                            X