Mercurial > vba-clojure
changeset 611:d9f991cddad9
spellcheck
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Thu, 22 Nov 2012 11:24:52 -0600 |
parents | 4dd5ebf224cd |
children | 00c5cdfb9da7 |
files | org/total-control.org |
diffstat | 1 files changed, 20 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
1.1 --- a/org/total-control.org Thu Nov 22 11:21:05 2012 -0600 1.2 +++ b/org/total-control.org Thu Nov 22 11:24:52 2012 -0600 1.3 @@ -50,7 +50,7 @@ 1.4 1.5 When I first saw that speedrun, I was amazed at how fast pokemon 1.6 yellow could be beaten, and that it was possible to manipulate the 1.7 -game from the inside, using only the item list. I wondeered how far I 1.8 +game from the inside, using only the item list. I wondered how far I 1.9 could extend the techniques found in p4wn3r's run. 1.10 1.11 The gameboy is an 8 bit computer. That means that ultimately, anything 1.12 @@ -65,14 +65,14 @@ 1.13 interactive program that reads input from the buttons and allows you 1.14 to write any program you want to the gameboy. Once you have assembled 1.15 such a program and forced the game to run it, you have won, since you 1.16 -can use that program to write any other program (like tetirs or 1.17 -pacman) over pokemon yellow's code. I call a program that allows you 1.18 +can use that program to write any other program (like Tetris or 1.19 +Pacman) over pokemon yellow's code. I call a program that allows you 1.20 to write any other program a "bootstrapping program". So, the goal is 1.21 to somehow get a bootstrapping program into pokemon yellow and then 1.22 force yellow to run that program instead of its own. 1.23 1.24 How can we spell out such a program? Everything in the game is 1.25 -ultimately nunbers, including all items, pokemon, levels, etc. In 1.26 +ultimately numbers, including all items, pokemon, levels, etc. In 1.27 particular, the item list looks like: 1.28 1.29 #+begin_example 1.30 @@ -112,14 +112,14 @@ 1.31 pokemon keeps a number called a function pointer within easy reach of 1.32 the corrupted item list. This function pointer is the starting point 1.33 (address) of a program which the game runs every so often to check for 1.34 -poison and do general maintaiance. By shifting an item over this 1.35 +poison and do general maintenance. By shifting an item over this 1.36 function pointer, I can rewrite that address to point to the 1.37 bootstrapping program, and make the game execute it. Without this 1.38 function pointer, it would not be possible to take over the game. 1.39 1.40 * The Run 1.41 1.42 -I start off and name my rival Lpk. These characters will eventually be 1.43 +I start off and name my rival Lp/k. These characters will eventually be 1.44 treated as items and shifted over the function pointer, causing it to 1.45 execute the bootstrapping program that will soon be constructed. I 1.46 start the run the same as p4wn3r's and restart the game while saving, 1.47 @@ -129,7 +129,7 @@ 1.48 rewrite the warp point of my house to Celadon Dept. Store. (p4wn3r 1.49 used this to go directly to the hall of fame and win the game in his 1.50 run.) I deposit many 0x00 glitch items into the PC from my corrupted 1.51 -inventory for later use. Then, I widthdraw the potion from the 1.52 +inventory for later use. Then, I withdraw the potion from the 1.53 PC. This repairs my item list by overflowing the item counter from 1.54 0xFF back to 0x00, though the potion is obliterated in the process. I 1.55 then take 255 glitch items with ID 0x00 from the computer into my 1.56 @@ -175,17 +175,17 @@ 1.57 any location in memory, and then jump to any location in memory. This 1.58 new program also can write 8 bits per frame by using all the 1.59 buttons. Using this new bootstrap program, I write a final 1.60 -bootstrapping program that does everything the provious bootstrapping 1.61 +bootstrapping program that does everything the previous bootstrapping 1.62 program does except it also displays the bytes it is writing to memory 1.63 on the screen. 1.64 1.65 -After completing this bootstrapping program, I go to the celadon 1.66 +After completing this bootstrapping program, I go to the Celadon 1.67 mansion, because I find the metaness of that building to be 1.68 sufficiently high to serve as an exit point for the pokemon 1.69 universe. I corrupt my item list again by switching corrupted pokemon, 1.70 -scroll down to my rival's name and discard untill it is equal to the 1.71 +scroll down to my rival's name and discard until it is equal to the 1.72 address of my bootstrapping program, and then swap it with the 1.73 -function pointer. Once the menu is closed, the boostrapping program 1.74 +function pointer. Once the menu is closed, the bootstrapping program 1.75 takes over, and I write the payload.... 1.76 1.77 * Infrastructure 1.78 @@ -195,7 +195,7 @@ 1.79 of the infrastructure I build to make the video. The entire source of 1.80 the project is available at http://hg.bortreb.com/vba-clojure 1.81 1.82 -The first step was to build a programatic interface to pokemon 1.83 +The first step was to build a programmatic interface to pokemon 1.84 yellow. So, I downloaded vba-rerecording from 1.85 http://code.google.com/p/vba-rerecording/. After repairing their 1.86 broken auto-tools scripts so that it would compile on GNU/Linux, I 1.87 @@ -212,7 +212,7 @@ 1.88 do everything I could do with the lower level C interface in a 1.89 functional manner. Using this functional code, I wrote search programs 1.90 that take a particular game-state and try out different combinations 1.91 -of button prosses to get any desired effect. By combining different 1.92 +of button presses to get any desired effect. By combining different 1.93 styles of search with different initial conditions, I created high 1.94 level functions that could each accomplish a certain general task, 1.95 like walking and buying items. For example, here is some actual code: 1.96 @@ -245,7 +245,7 @@ 1.97 1.98 This script walks from the Viridian City pokemon store to Oak's 1.99 Lab in the most efficient way possible. The walk-thru-grass function 1.100 -gaurantees that no wild battles will happen by manipulating the game's 1.101 +guarantees that no wild battles will happen by manipulating the game's 1.102 random number generator. 1.103 1.104 #+begin_src clojure 1.105 @@ -268,11 +268,11 @@ 1.106 #+end_src 1.107 1.108 This script calculates the fastest sequence of key presses to deposit 1.109 -the requested items into a pc, assuming that the character starts out 1.110 +the requested items into a PC, assuming that the character starts out 1.111 in front of a computer. 1.112 1.113 -I also wrote functions that coudl grovel through the game's memory and 1.114 -present the internal data structures in useable ways. For example, the 1.115 +I also wrote functions that could grovel through the game's memory and 1.116 +present the internal data structures in usable ways. For example, the 1.117 function =print-inventory= returns the current inventory in a human 1.118 readable format. 1.119 1.120 @@ -299,7 +299,7 @@ 1.121 1.122 1.123 Armed with these functions, I constructed a bootstrapping program that 1.124 -could be expressed as items. This is particurally hard, since many 1.125 +could be expressed as items. This is particularly hard, since many 1.126 useful opcodes do not correspond any item, and the item quantities 1.127 must all be less than 99. 1.128 1.129 @@ -436,7 +436,7 @@ 1.130 1.131 I use the glitch items 0x00 and 0xFF to great effect in my run. 0x00 1.132 sells for almost half of max_money, and I use just 3 of them to 1.133 -finance the purchace of all the other items I need. 0x00 is also a 1.134 +finance the purchase of all the other items I need. 0x00 is also a 1.135 NO-OP in the gameboy's machine language, which means that I can stick 1.136 them anywhere where I need to break up an other wise illegal pair of 1.137 opcodes. 0xFF is also extremely useful because it is the end-of-list 1.138 @@ -463,7 +463,7 @@ 1.139 language. Then I translated a midi file from 1.140 http://www.everyponysings.com/ into this reduced MIDI language. The 1.141 payload program contains both the music data and the MIDI interpreter 1.142 -to play that data. The picture works in a similiar way. There is code 1.143 +to play that data. The picture works in a similar way. There is code 1.144 to translate a png file into a form that can be displayed on a 1.145 gameboy, and other code to actually display that image. Both the image 1.146 and the display code are also written by the final bootstrapping