I'm impressed. This is a very thoughtful and intricate analysis. I also love the irony that the code responsible for displaying the neutral zone is also the graphics for the neutral zone. I must say, though I always thought I had made it extremely tough to ascertain the code from the display, I'm both glad and relieved to see it passed a very stringent test here. Thank you so much for this! Yars truly, :) HSW
I'm slightly disappointed that I couldn't crack it any further, but it was still fun to analyze and see how far I could possibly take it. Thanks for the comment, and for the game I could make a video about!
Off topic but playing Yars' Revenge in the dark with it lighting up the whole room, the neutral zone mesmerizing me, is a very distinct and loved early gaming memory for me. Want you to know I appreciate it. (Also, ET wasn't that bad and it blew my mind to see a Yar in a well the couple of times it happened.)
That's amazing.❤ I used the same trick in my torch firmware "Anduril", reading from ROM to get values for a pseudo-random number generator. So when the torch is in candle mode or lightning mode, it's technically blinking out the program's machine code. But I continuously added the least-signficant bits of its voltage and temperature ADC readings too, to make it more of a true random.
@@shona-sofI thought the same thing, which is why I sent Howard an email to let him know about it! There's a video on RUclips somewhere where Howard talks about the whole process of developing Yars Revenge* but I'll be darned if I can find it now. I should have bookmarked it! - Russell Jones * Especially the revelation he had on how to control the main ship: He was originally thinking of an Asteroid-esque control scheme where right and left rotate the ship, up is thrust and down was a warp or something similar. He finally realized that up/down/left/right are the perfect controls by themselves, with the fire button launching the shot.
25:45 "It's about to get pretty technical, and if you don't have a good grasp on how assembly and machine code works, it might be a little difficult to follow." Man, you lost me like three years ago, at this point I'm just here for the flashing lights while my brain tickles my ear as it drips on the floor.
Yeah, but the Atari legal team wouldn't have known that back in the day. They got paranoid as soon as they heard the phrase "game code being drawn to the TV screen"...
@@SECONDQUESTAn EPROM programmer was not at all specialized hardware for a programmer of the day. Ironically, displaying the code onscreen would have afforded it more copyright protection than not in the early days of 1982.
The dev stated that if someone did reverse engineer the code from the Neutral Zone, they deserved it, which could be argued in court as permission to reverse engineer it from the image, AND as a license to copy and use that code. Dumping the rom would be clear theft.
@@09jjohns It was Time-Warner's code, not his. However, depending on when in 1982 the game came out, there's a few months where it WOULDN'T be clear theft. 1982 was a big year for copyright protection of computer programs distributed in ROMs, with multiple cases establishing that yes, data in ROM ICs was covered. Before that time, the argument was that only human-readable works were copyrightable, and hence a listing of your code was copyrightable but not the contents of a ROM, disk, or magnetic tape. So while the writing was on the wall there was still a brief window of time you could, legally, copy that floppy.
Yeah, I still get a kick out of this one little detail in the pacman kill screen ep, when he's explaining what happens when you add 1 to 255, and the carry bit on the end just falls off the equation and bounces on the rest of it on the way down.
@@andre_601It looks right to me. The VCS actually has a fairly large color palette to choose from, so it isn't hard. 8 luminance values, 16 chroma values. That results in 128 color options(8 of which are just black and white shades).
If you squint, the Neutral Zone being the game's entire world blown open for all to see lines up with the in-universe lore of it being the remains of one of the Yars' home planets. In a meta sort of way.
And it fits the game being a metaphor of Ray Kassar, head of Atari in those days, getting revenge on Activision (the OG one, not the one that Bobby Kotick used to ru(i)n) for "breaking" his empire with unlicensed games that cut into recurring profit for Atari.
A good way to get the clean data from the neutral zone using late 70s early 80s tech would be to flip the BW switch on the Atari and feed the video output into an oscilloscope. From there you know the neutral zone will be rendered every line in the same place. Edit: Turns out the BW switch doesn't work in Yar's Revenge. Still considering each pixel is made of two dots it would still create a meaningful signal even with color.
Wait, on my 2600 flipping that switch does nothing on this game and it remains in color. I know the switch works as the Telegames cartridge does go black and white, but this one does not. I know the switch is software, but perhaps it works differently on some systems? Mines a 4-switcher.
You do realize that it would be an analogue oscilloscope, not a storage oscilloscope (those were expensive as heck). It would be practically impossible to read. If you had access to a storage oscilloscope, you almost certainly had access to a PROM reader and could trivially just dump the cartridge. (In fact, dumping the cartridge wasn't hard at all for any electronics hobbyist. If anyone really wanted the source, that's what they'd do.)
@@nsf001-3 And yet that wouldn't work anyway, as mentioned in the video. Even with a perfect capture, just too much is missing to properly reconstruct.
I've happily spent 40 minutes of my life appreciating every explanations that a very talented person makes by trying to decipher what is, in the end, nothing more than a very fun and elegant way to make a random number generator. Fun fact, the "last level" of Pacman is also made of the game code, albeit not voluntarily :P
I did a video where I hacked the Pacman game to get to the kill screen and indeed it's about 512 bytes (probably less but half a screen) of the code. I have never ever gotten to that screen myself hence I had to hack it :D
I kept thinking "what's this dude even talking about" at the beginning before I remembered that my phone defaults to data saver resolutions. 1440p/60 cleared my initial confusion right up.
Thankfully that should only be an issue for people watching in 480p and under, unless RUclips has started giving different devices different framerate options that aren't available on desktop.
Unfortunately, this is a common issue for many Atari 2600 games that use flicker (i.e. sprite/playfield multiplexing and scanline flickering) to exceed the native graphics capabilities of the 2600. Some people might be surprised to discover the Atari 2600's native frame rate was 60 Hz (for NTSC, 50 Hz for PAL), which can be unexpected given it's a console from the 1970s. The 60 Hz frame rate is also why Atari sprite movement can look very fluid when movement uses 2 byte fixed-point arithmetic without flicker. We've come to expect fluid movement on more modern powerful consoles. (See Atari 2600 demoscene and modern homebrews.)
I always thought the odd look of the canon when the Neutral Zone wasn't in the level was a stylistic choice. Amazing to discover it was the only way to display it!
not the only way, the laziest to program way is probably more like it. in the end still a stylistic choice, but based not just on the style of the visuals, but combined also with the style of the code and the effort required for it.
Ever since I learned the neutral zone is the game's code, I've always wanted to see a programmer take a crack at deciphering it. Dream come true. Now if only we can get HSW to react to this, my life would be complete.
My biggest takeaway from this video is that Howard Scott Warshaw was a damn genius. Which I already knew but it's always nice to see another display of his prowess. Also, making this video takes another genius, always a pleasure to watch.
33:27 There is a flaw in this logic; the just-greyed box could be a JMP instruction, in which case what comes next need not be a valid instruction. Any bytes immediately after an unconditional jump could be data from some data table, so anything is potentially valid.
i was watching on data at 30 fps and the entire neutral zone at around 2:01 is completely invisible! I didnt even notice you were talking about that til you mentioned some of it was offscreen while zooming into seemingly nothing! the beginning of the video requires 60 fps to see the whole thing haha
Up until now, I thought that I was King of "Going Down The Rabbit Hole." I now humbly transfer that crown to you. This project you undertook required patience of unimagable amount. This is something that reminds me of my High School days when I had Atari 400 and 800 computers. I figured out how to copy cartridges to disk as binary files. Some games would not run, and I had to reverse engineer the code to figure out why. Usually there was some code that would write back to ROM memory space that would not do any harm if it was a legit cartridge installed. However if the game was running in RAM, it would kill it by overwriting itself. I was able to replace all that "anti-piracy" code with NOP instructions. Wow, good memories come back thanks to your video.
I love the idea of checking which interpretation of the binary code results in the most valid/common opcodes! Reminds me of reading gene sequences, where a sequence can be interpreted 3 ways depending on where you start reading it. (DNA is made of codons, which are kind of like opcodes made out of 3 base pairs. Starting on a different base pair results in wildly different codons, and you can check which interpretation is the most likely to be valid by checking how long it takes you to run into a STOP codon.)
Instead of disassembling 8 digit binary groups, you get to disassemble 3 digit quaternary groups (which are effective 6-bit). I find it kind of funny that nature managed to come up with what's basically a "terminator byte." Whether you'd interpret it like a string's null terminator or a subroutine's return instruction, it's still pretty cool how much there is in common.
@@angeldude101it's more similar to a null terminator because STOP codon in prokaryotes can be followed by new start codons, so that the two proteins are always produced in equal proportions
I remember being taught that in high school biology. Then we asked the teacher how the cell read the right sequence: how did it choose the correct strand and how did it get the reading direction right? Turns out she didn’t understand the question. We spent a long time, maybe 15 minutes, trying to explain it to her. Then we collectively decided she was stupid :) (Denmark, late 80’s, no Google, no Wikipedia, no internet.)
@@peterfireflylund I highly doubt she didn't understand the question. She didn't have an answer because that's more the realm of physics and chemistry anyway.
So i am not the only one to compare DNA to computer code, where the compiler is our own body. DNA could also be a large TAR archive and the "human compiler" just scans through it until it finds the block - like a LOAD XXXX instruction. I even dare to say, certain blocks are AND/OR/XOR'd to form a new variance. Because if you see the Y-Chromosome, it has stuff missing in it and can't exist on it's own. THis is called Y0 and any baby with this is unable to form and dies early. I'd like to call the Y-Chromosome "a patch". It integrates, overwrites some portions and then keeps "compiling" normally as an X would. Recessive Genes could be a result of an AND/OR/XOR, thats why brown eyes for example are more dominant then blue, if you think of them as 0/1 , but they aren't. Hell, maybe call blue eyes an "else default" case, so you are left with "is_brown" or "is_green" IF checks. Anyway, I think it really safe to assume human DNA to be code and the base RNA found in all woman to be a key/checksum like "if remote.DNAinit not equal self.DNAinit; exit"
Absolutely excellent. I'm still wondering why Atari management was worried about game code being copied this way, though. Just dumping the ROM on the cartridge would be way easier, and people did that.
At this time, Atari management was Time-Warner. Ironically, displaying the code onscreen at the beginning of 1982 would have actually afforded them STRONGER copyright protection, since the case law establishing that code on a ROM is afforded protection would only happen later that year.
I would say that although it's more or less impossible to unscramble the code from the color blocks, the fact that you can more or less reverse engineer the code that displays the neutral field from looking at the graphics, I would say, technically counts as extracting code from the neutral field graphics, albeit not the code that is hidden in the field. considering that also just by chance, the code to draw the field ends up becoming field is rather fitting to the goal of unscrambling the code.
I heavily suspect that the fact that only half of the rows were drawn was pure coincidence, and the guy didn't realize his reversal method mapped it to the same bytes.
These skills are going to be real useful for hardware archaeology, when we recover damaged firmware developed centuries in the past and need to get them working again.
with modern data keeping tech this is unlikely to happen without some sort of societal collapse, and at that point I don't think youtube would still be around.
Holy shit. My phone auto set it to 480p 30fps and I couldn't see the neutral zone at all lmao. It took till you explained how it worked that I went back and switched it to 60 fps.
A small change in the ROM should allow for the neutral zone to be rendered every frame whilst the quotile shield is never rendered, giving us access to all of the data in the ROM minus the least significant bit. If the Atari had the equivalent of a game genie the branch instruction could be changed to always draw the neutral zone. Building off of this if you run this in an emulator and change address $FAF3 from 0x9003 (bcc $FAF8) to 0x3A3A (NOP x2) then the game will draw the neutral zone every frame and every piece of code can be seen.
With regard to your closing comment, I suspect we could further surmise that anyone who did have the time and experience needed to deduce the code from the neutral zone could probably write their own (UX identical) version of the game from scratch in less time than it would take to untangle that mess and fill in the blanks accurately.
It took me forever to remember what other game you already covered that grabbed a chunk of its own code as a substitute for pseudorandom data. It was _Pac-Man_ using it to determine random directions to move at intersections. I wonder how many other games over the years have used that trick in one way or another.
@@williamdrum9899Yep, because modern CPUs don't let you read random memory for security reasons. It'll let you read your own memory, of course, but you're pretty likely to end up reading invalid memory if you're trying to do something like this.
At first I was extremely confused because I couldn't see the neutral zone at all, but when the section about the flickering started, I realized I just needed to up the quality to 60fps
I remember playing this game as a young kid, maybe about 6 or 7. I had no clue what I was doing, or how to play it. But I still do have distinct memories of it.
This was definitely one of those games you didn't want to throw out the manual for. One great thing about the switch to discs is that people finally started holding on to the packaging for their games, since storing discs without their cases is much more of a pain. I was lucky enough to end up with not just the manual for this one, but the little comic book that explains the backstory in more detail. I still don't know if that came with the game or was something you had to buy separately or order from the back of a cereal box or whatever.
Never thought about using the second bit as a mask in XOR instructions. I typically use XOR instructions to zero out large blocks of registers in one instruction by making my bit matrix both of the input fields as well as the output field. The instruction set allows 125 registers at a time, allowing me to zero out (up to) all 125 in one very fast instruction. This is for low level code on dedicated microcontrollers for industrial automation, where every byte and clock cycle count. Next time I'm working on a large bit matrix, I'll probably look at it a little differently :)
That is funny. My last job I remember seeing a macro for an efficient memset to 0, but never looked at the assembly behind it. Now I wonder if it used XOR or not.
@@canebro1 Probably. Most CPUs have one or more versions of' a "XOR 'thing' with itself" instruction which is generally the most efficient way to set 'thing' to zero.
I love the premise of this video! I used to play Yars' Revenge like crazy in the Atari days, and I think I was vaguely aware of the trivia of the neutral zone sometime recently, AND I am fascinated by your videos. This video is for *me* so thank you for it!
This is definitely high on the list of the best videos that you have made! Technically detailed but also easy enough to follow along with. There may be an opportunity for me to meet HSW at a future event and if I do, I will be sure to ask if he has seen this video/ recommend it to him, and ask his opinion of your methodology to dissect the game; and I will be sure to pass along what he says in DM if it happens. Thanks for all of the great content!
Atari put out a magazine called Atari Age back in the 80s, and sometimes they would include some high-level technical explanations related to their hardware and games, and I could swear that they mentioned once that the Neutral Zone in Yar's Revenge was based on the game's code.
absolutely incredible video, couldnt stop watching. I dont even know anything about machine code or assembly at all but this had me hooked. Sad that it seems impossible to fully decode, but getting that far in the first place is arguably cool enough. And dont even get me started on the editing. Definitely one of the highest quality channels about cool niche coding stuff out there, dont stop doing what you're doing.
The fact that you managed to unpack that much of the code using only understanding of assembly op codes, operation lengths and bit masking is… awesome. Same vibes as archaeologists trying to decrypt worn away texts from millennia past. You never cease to amaze.
34:18 It's not true that $9Exx is a "garbage" location, it would just be a mirror of something (in this case, a ROM address), since the 6507 variant of the 6502 has only 13 address lines but still computes 16-bit addresses internally. Now of course Yars' Revenge is a plain old 4K cartridge with no extra RAM, so storing to an address with A12 set truly is nonsense for this game, but it's worth mentioning. Plus, some particularly advanced bankswitch schemes do interesting things in exploiting the various sorts of incomplete address decoding that the VCS has. Very cool video!
I only understood like half of this, but you explained it so well, that I still feel like I've got a grasp on everything solid enough to leave the video satisfyied. Thank you, that was really interesting!
This all sounds like EXACTLY the argument that inspires things like HDCP. If that were a possibility in the 80s, Atari may have demanded the game use an encrypted channel to the TV. Pirates would then simply dump the ROM, grabbing every byte, in order, with no obfuscation or masked bits. But, gamers would have to upgrade their TVs, VCRs, and switch boxes to avoid scrambled video. Or maybe I'm just bitter that I can't get my Mac Mini desktop to show up through an HDMI KVM, HDMI Matrix, and HDMI to DisplayPort adapter without disconnecting the cable two or three times every morning. Because god forbid I vid-cap my Outlook window and share it on the Internet...
10:19 what you did with the captions here was so genius I almost didn't even notice that they were in a different spot. My eyes moved to the graph and so did the captions. Incredible
Well, what else can I say that everyone else hasn't said but kudos! This is the kind of rabbit hole that I like diving into, it's so refreshing seeing some true software and hardware engineering in action!
Fun fact, if you're watching this video in quality with fps less than 60 you will not see the neutral zone during the showcase of the gameplay. I didn't get what is neutral zone is first before i switched the quality
Absolutely fantastic video as usual! As someone who doesn’t touch code, and doesn’t know assembly, this was still super easy to follow. Extra kudos for the captions, which move out of the way when it would normally block something! ❤
Truly a lovely piece of reverse-engineering analysis, & it brought back a lot of memories! I never worked on Atari 2600 code, but I did work on lots of code for other 6502 based machines of that era. Thanks for the excellent work.
Currently going to school for electrical engineering technology and covering microprocessors right now, so this is pretty cool. As an avid player of this in my '90s childhood, because I got it as a hand-me-down from my Aunt/Uncle, that's also a huge plus.
If you've watched the "racing the beam" episode, you'll understand that the devs back in the day had to be a little bit mad to be doing this kind of thing. This is why you'll often see them affectionately called terms like "wizard" and "magician" on fan forums; it's a tongue-in-cheek way of describing what they are. :)
They essentially need to create random numbers, so what better way than just randomly grabbing from your source code? You know it will be sequence of non-zero numbers, and as long as you do a little fiddling it is essentially unreadable. Plus, as he said at the end, anyone willing to actually decode it probably deserves it, and should probably be hired.
There's a lot of crazy going on in VCS coding. When you have 4Kbytes of ROM, 128 bytes of RAM, and a CPU that almost has to draw the image on the TV in real-time... you get creative in terrifying ways.
This is fantastic. I loved my uni class on assembly code and havent really used much of the knoweldge gained, but i can confidently say it made me able to follow this video, and able to understand the monumental effort you put into it. Good job!
This is video is amazing. Love the amount of effort you put into it. Great visuals, great explanations, great everything. 10/10 I don't know how I missed out on this RUclips channel. But I pulled out my phone on which I am signed in and dropped a like and sub.
this is really cool! honestly i would love a whole video on the process of reverse engineering the code from games. i always wondered how people managed to crack the code for Super Mario 64, OoT, and Paper Mario 64
Wheee! This was fun! Yeah, I can see how some kid playing Yar's Revenge could get excited upon learning that the source for the game was being used to draw the Neutral Zone. But I agree. In the early '80s there really wouldn't be a practical way to decipher that code even to the extent you were able to. This all takes me back to when I learned everything I ever needed to know about computer science on my Atari 800. I really appreciate that text you used for your displays. It looks like a real small font from back in the day. It looks great! Atari 8K BASIC was so slow that we were practically forced to use 6502 Assembly Language pretty quickly. I never had an Atari VCS (2600), I saw computer games as graphics demos for me to figure out how they were done. That "Neutral Zone" looks like the kind of noise I often saw to represent energy fields in the better games. It's not at all surprising that the most convenient source of "noise" would be the machine code.
Impressed by the patience and deductions you put in all your videos. Well as for decoding the code that way, I can only agree with you that no one back in the days would have tried. If someone had the electronic & programming skills to understand the inner working of the console, it would have been much much easier to do a ROM dump.
I believe the explosion when you kill the boss also uses the code. I once coded a ATARI 2600 emulator and I was baffled that whenever I took a screenshot of Yar's Revenge I could only see either the safe zone or the enemy's shield.
@@SECONDQUEST Mate I can't know what techniques every game uses. In fact when you code an emulator you just create the engine. I did know though that the Pacman ghosts were render each 4th frame, because that is more notorious, but for Yar's Revenge it was once every other frame, so until you see it in action you just don't know.
I'm wondering what the display of the Explosion at the end of the level represents. Is it just the same as the Neutral Zone, but scaled up to fill the screen? or... could this display during the explosion show the missing "odd bytes"?
they did a similar effect in Metroid Prime! there is a a static effect that happens around a certain enemy, but they didn’t want to use a big static texture because of the limited RAM space. instead of making a high resolution animated texture, they displayed the game’s code instead!
This is the type of data forensics that wins million dollar jury verdicts. You should spend all of your energies on becoming a highly sought after (and well paid) expert witness in your field. This presentation alone has the court convinced beyond a reasonable doubt.
oh how i love such deep dives into obscure techniques. Especially on 6502 which thanks to von Neumann's memory architecture doesn't distinct between "program" and "data" segments. Therefore we can experience wonders such as self modifying code to save some memory or even executing some graphics data which happen to be valid machine code if read correctly. Leaving all that aside i am astonished by sheer amount of work put in here. Until you showed exact code drawing neutral zone i though that color might be at least missing byte's nibble. Also representation of data-code as blocks and guessing how PC would look like after it was very clever. Amazing video.
It's amazing to see the switching in real time of the graphics while pausing the video and using , and . to go back and forth. (You go into this right after I added the comment LOL )
"It's about to get pretty technical, and if you don't have a good grasp on assembly and machine code works, it might be a little difficult to follow." Buddy, I don't know a hardly anything about code and have been struggling to understand from the start. Don't worry about me :"D (The funny part is, I'm mostly following despite not knowing wtf you're saying. I think it's a result of reading extensive scientific journals despite not knowing the jargon -- I can get a feel for the discussion without knowing anything technical)
Yet another way to conceptualise the XOR operator is that it's the "does not equal" operator; it returns 1 (true) if the two inputs aren't the same. A logic gate that is the opposite of this, returning true if the inputs are the same, is called various names such as NXOR, XNOR, XAND, but does not usually exist as a fundamental operation in assembly code afaik.
With 2020s technology thats trivial, but in the 1980s it would be near impossible. You'd need expensive recording and video processing equipment and slow it down so the computers of the time could decode it.
if you watch this video in less than 720p because it'll be 30 frames instead of 60, you can't see the flashing between the neutral zone and the shield when the gameplay is at normal speed. you can only see the shield. at least I couldn't see the neutral zone at 30 frames. I also don't know if he mentioned that or not, but I thought it was really neat
Some dude in 1982 already figure out the answer using a piece of paper and a calculator while referencing an ASM book, and the notes have been sitting in an attic somwhere for over 40 years. It's gotta happen. Like there's probably some natty benching 1000lbs raw right now but we'll never know because they don't know Powerlifting exists. The universe is pretty weird like that
Well, I'm a collector of early to mid 80s video equipment so I might try recording this to VHS with a period correct VCR to see just how hard it would be to get the correct pattern written down!
Sad that half the bytes are missing, would've made for a really cool reverse engineering puzzle! (I gotta remember this idea for later...) Trying to disassemble while only having half the information is bonkers. I wonder if this would work better on 32/64-bit machines? (Though I doubt it)
Yeah, wouldn't be worth it, with only half the bytes. BUT, if the offset incremented every loop (so all odd addresses first time, all even addresses second time), that would make it a little more interesting. :-D
At 3:47 - I like how your frame counter numbers are coloured with player 1 and player 2 yars colors!! :D It's cool how each Yars is a different color! :)
I'm impressed. This is a very thoughtful and intricate analysis. I also love the irony that the code responsible for displaying the neutral zone is also the graphics for the neutral zone. I must say, though I always thought I had made it extremely tough to ascertain the code from the display, I'm both glad and relieved to see it passed a very stringent test here. Thank you so much for this!
Yars truly, :)
HSW
I'm slightly disappointed that I couldn't crack it any further, but it was still fun to analyze and see how far I could possibly take it. Thanks for the comment, and for the game I could make a video about!
Halfway through this video I thought that someone needed to make sure Howard saw it. Glad to see this comment!
Off topic but playing Yars' Revenge in the dark with it lighting up the whole room, the neutral zone mesmerizing me, is a very distinct and loved early gaming memory for me. Want you to know I appreciate it.
(Also, ET wasn't that bad and it blew my mind to see a Yar in a well the couple of times it happened.)
That's amazing.❤ I used the same trick in my torch firmware "Anduril", reading from ROM to get values for a pseudo-random number generator. So when the torch is in candle mode or lightning mode, it's technically blinking out the program's machine code. But I continuously added the least-signficant bits of its voltage and temperature ADC readings too, to make it more of a true random.
@@shona-sofI thought the same thing, which is why I sent Howard an email to let him know about it! There's a video on RUclips somewhere where Howard talks about the whole process of developing Yars Revenge* but I'll be darned if I can find it now. I should have bookmarked it!
- Russell Jones
* Especially the revelation he had on how to control the main ship: He was originally thinking of an Asteroid-esque control scheme where right and left rotate the ship, up is thrust and down was a warp or something similar. He finally realized that up/down/left/right are the perfect controls by themselves, with the fire button launching the shot.
25:45 "It's about to get pretty technical, and if you don't have a good grasp on how assembly and machine code works, it might be a little difficult to follow."
Man, you lost me like three years ago, at this point I'm just here for the flashing lights while my brain tickles my ear as it drips on the floor.
Well said. I just come to this channel to feel smart and nod my head to the information given while having no clue what the hell is going on.
i read this as he said it. this happens a lot to me
Ironically for Atari, just dumping the rom would be easier than reverse-engineering the code using an image.
Yeah, but the Atari legal team wouldn't have known that back in the day. They got paranoid as soon as they heard the phrase "game code being drawn to the TV screen"...
@@gordontaylor2815that's specialized hardware, and I highly doubt they were actually worried, just wanted to protect their IP.
@@SECONDQUESTAn EPROM programmer was not at all specialized hardware for a programmer of the day.
Ironically, displaying the code onscreen would have afforded it more copyright protection than not in the early days of 1982.
The dev stated that if someone did reverse engineer the code from the Neutral Zone, they deserved it, which could be argued in court as permission to reverse engineer it from the image, AND as a license to copy and use that code. Dumping the rom would be clear theft.
@@09jjohns It was Time-Warner's code, not his.
However, depending on when in 1982 the game came out, there's a few months where it WOULDN'T be clear theft. 1982 was a big year for copyright protection of computer programs distributed in ROMs, with multiple cases establishing that yes, data in ROM ICs was covered. Before that time, the argument was that only human-readable works were copyrightable, and hence a listing of your code was copyrightable but not the contents of a ROM, disk, or magnetic tape.
So while the writing was on the wall there was still a brief window of time you could, legally, copy that floppy.
I love how all the text in this video looks like it was actually drawn on the Atari 2600.
Love little details like that.
2160p60 bandwidth well spent :) (Okay, the intro and outro graphics benefit from it)
Yeah, I still get a kick out of this one little detail in the pacman kill screen ep, when he's explaining what happens when you add 1 to 255, and the carry bit on the end just falls off the equation and bounces on the rest of it on the way down.
Does that also include possible colours the Atari 2600 would be able to draw? That would be peek design detail for me.
@@andre_601It looks right to me. The VCS actually has a fairly large color palette to choose from, so it isn't hard. 8 luminance values, 16 chroma values. That results in 128 color options(8 of which are just black and white shades).
Oh yeah this dudes channel has such intricate and awesome graphical details!!
If you squint, the Neutral Zone being the game's entire world blown open for all to see lines up with the in-universe lore of it being the remains of one of the Yars' home planets. In a meta sort of way.
And it fits the game being a metaphor of Ray Kassar, head of Atari in those days, getting revenge on Activision (the OG one, not the one that Bobby Kotick used to ru(i)n) for "breaking" his empire with unlicensed games that cut into recurring profit for Atari.
A good way to get the clean data from the neutral zone using late 70s early 80s tech would be to flip the BW switch on the Atari and feed the video output into an oscilloscope. From there you know the neutral zone will be rendered every line in the same place.
Edit: Turns out the BW switch doesn't work in Yar's Revenge. Still considering each pixel is made of two dots it would still create a meaningful signal even with color.
Wait, on my 2600 flipping that switch does nothing on this game and it remains in color. I know the switch works as the Telegames cartridge does go black and white, but this one does not. I know the switch is software, but perhaps it works differently on some systems? Mines a 4-switcher.
This is because Yar's Revenge doesn't support BW switch.
You do realize that it would be an analogue oscilloscope, not a storage oscilloscope (those were expensive as heck). It would be practically impossible to read. If you had access to a storage oscilloscope, you almost certainly had access to a PROM reader and could trivially just dump the cartridge. (In fact, dumping the cartridge wasn't hard at all for any electronics hobbyist. If anyone really wanted the source, that's what they'd do.)
Just plug it into a BW television. Bam
@@nsf001-3 And yet that wouldn't work anyway, as mentioned in the video. Even with a perfect capture, just too much is missing to properly reconstruct.
I've happily spent 40 minutes of my life appreciating every explanations that a very talented person makes by trying to decipher what is, in the end, nothing more than a very fun and elegant way to make a random number generator.
Fun fact, the "last level" of Pacman is also made of the game code, albeit not voluntarily :P
And there is a video on this same channel explaining the how/why this happens.
I did a video where I hacked the Pacman game to get to the kill screen and indeed it's about 512 bytes (probably less but half a screen) of the code.
I have never ever gotten to that screen myself hence I had to hack it :D
BRO THAT WAS 40 MINUTES???
The "neutral zone" is sometimes not visible in 30fps on RUclips because of the flicker
I kept thinking "what's this dude even talking about" at the beginning before I remembered that my phone defaults to data saver resolutions. 1440p/60 cleared my initial confusion right up.
Thankfully that should only be an issue for people watching in 480p and under, unless RUclips has started giving different devices different framerate options that aren't available on desktop.
I was JUST seeing that and wanted to make a comment about it !
Oh *that's* why I couldn't see it.
As an old Atari player from back in the day, I knew it was supposed to be there, but it wasn't visible.
Unfortunately, this is a common issue for many Atari 2600 games that use flicker (i.e. sprite/playfield multiplexing and scanline flickering) to exceed the native graphics capabilities of the 2600. Some people might be surprised to discover the Atari 2600's native frame rate was 60 Hz (for NTSC, 50 Hz for PAL), which can be unexpected given it's a console from the 1970s. The 60 Hz frame rate is also why Atari sprite movement can look very fluid when movement uses 2 byte fixed-point arithmetic without flicker. We've come to expect fluid movement on more modern powerful consoles. (See Atari 2600 demoscene and modern homebrews.)
I always thought the odd look of the canon when the Neutral Zone wasn't in the level was a stylistic choice. Amazing to discover it was the only way to display it!
right?! Love finding out stuff like that :)
not the only way, the laziest to program way is probably more like it. in the end still a stylistic choice, but based not just on the style of the visuals, but combined also with the style of the code and the effort required for it.
Ever since I learned the neutral zone is the game's code, I've always wanted to see a programmer take a crack at deciphering it. Dream come true. Now if only we can get HSW to react to this, my life would be complete.
They did, see pinned comment!
Your life is complete.
My biggest takeaway from this video is that Howard Scott Warshaw was a damn genius. Which I already knew but it's always nice to see another display of his prowess. Also, making this video takes another genius, always a pleasure to watch.
33:27 There is a flaw in this logic; the just-greyed box could be a JMP instruction, in which case what comes next need not be a valid instruction. Any bytes immediately after an unconditional jump could be data from some data table, so anything is potentially valid.
was just thinking that too
this is all assuming an uninterrupted branchless instruction flow
This is true. I decided to leave it out of the video since it just made things more complicated. But in practice this would be a valid concern.
i was watching on data at 30 fps and the entire neutral zone at around 2:01 is completely invisible!
I didnt even notice you were talking about that til you mentioned some of it was offscreen while zooming into seemingly nothing!
the beginning of the video requires 60 fps to see the whole thing haha
Up until now, I thought that I was King of "Going Down The Rabbit Hole." I now humbly transfer that crown to you. This project you undertook required patience of unimagable amount. This is something that reminds me of my High School days when I had Atari 400 and 800 computers. I figured out how to copy cartridges to disk as binary files. Some games would not run, and I had to reverse engineer the code to figure out why. Usually there was some code that would write back to ROM memory space that would not do any harm if it was a legit cartridge installed. However if the game was running in RAM, it would kill it by overwriting itself. I was able to replace all that "anti-piracy" code with NOP instructions. Wow, good memories come back thanks to your video.
I love the idea of checking which interpretation of the binary code results in the most valid/common opcodes! Reminds me of reading gene sequences, where a sequence can be interpreted 3 ways depending on where you start reading it. (DNA is made of codons, which are kind of like opcodes made out of 3 base pairs. Starting on a different base pair results in wildly different codons, and you can check which interpretation is the most likely to be valid by checking how long it takes you to run into a STOP codon.)
Instead of disassembling 8 digit binary groups, you get to disassemble 3 digit quaternary groups (which are effective 6-bit).
I find it kind of funny that nature managed to come up with what's basically a "terminator byte." Whether you'd interpret it like a string's null terminator or a subroutine's return instruction, it's still pretty cool how much there is in common.
@@angeldude101it's more similar to a null terminator because STOP codon in prokaryotes can be followed by new start codons, so that the two proteins are always produced in equal proportions
I remember being taught that in high school biology. Then we asked the teacher how the cell read the right sequence: how did it choose the correct strand and how did it get the reading direction right? Turns out she didn’t understand the question. We spent a long time, maybe 15 minutes, trying to explain it to her. Then we collectively decided she was stupid :)
(Denmark, late 80’s, no Google, no Wikipedia, no internet.)
@@peterfireflylund I highly doubt she didn't understand the question. She didn't have an answer because that's more the realm of physics and chemistry anyway.
So i am not the only one to compare DNA to computer code, where the compiler is our own body. DNA could also be a large TAR archive and the "human compiler" just scans through it until it finds the block - like a LOAD XXXX instruction.
I even dare to say, certain blocks are AND/OR/XOR'd to form a new variance. Because if you see the Y-Chromosome, it has stuff missing in it and can't exist on it's own. THis is called Y0 and any baby with this is unable to form and dies early. I'd like to call the Y-Chromosome "a patch". It integrates, overwrites some portions and then keeps "compiling" normally as an X would. Recessive Genes could be a result of an AND/OR/XOR, thats why brown eyes for example are more dominant then blue, if you think of them as 0/1 , but they aren't. Hell, maybe call blue eyes an "else default" case, so you are left with "is_brown" or "is_green" IF checks.
Anyway, I think it really safe to assume human DNA to be code and the base RNA found in all woman to be a key/checksum like "if remote.DNAinit not equal self.DNAinit; exit"
Absolutely excellent.
I'm still wondering why Atari management was worried about game code being copied this way, though. Just dumping the ROM on the cartridge would be way easier, and people did that.
Lawyers, man...
At this time, Atari management was Time-Warner.
Ironically, displaying the code onscreen at the beginning of 1982 would have actually afforded them STRONGER copyright protection, since the case law establishing that code on a ROM is afforded protection would only happen later that year.
@@CptJistuce Also, this was Atari that absolutely would not put game dev names in any publicly accessible credits lest their programmers get poached.
I would say that although it's more or less impossible to unscramble the code from the color blocks, the fact that you can more or less reverse engineer the code that displays the neutral field from looking at the graphics, I would say, technically counts as extracting code from the neutral field graphics, albeit not the code that is hidden in the field. considering that also just by chance, the code to draw the field ends up becoming field is rather fitting to the goal of unscrambling the code.
I'd say that "fitting" would be a better word than "ironic" in the last sentence
@@Nikola_M thanks, english is my first language but I suck at properly conveying information. fixed it.
Oh man....that bit at the end about the code that draws the neutral zone...this is a fantastic example of a "strange loop" as defined by Tom7
Eatin' boots since 1982
I heavily suspect that the fact that only half of the rows were drawn was pure coincidence, and the guy didn't realize his reversal method mapped it to the same bytes.
These skills are going to be real useful for hardware archaeology, when we recover damaged firmware developed centuries in the past and need to get them working again.
Eh, just splice frog DNA in over the missing parts. What could go wrong?
Instructions unclear. Lilypad stuck in ceiling fan.
@@CptJistuceinstructions unclear: my router is going ribbet ribbet and catching flies
Instructions Unclear: my di%# is in my throat
with modern data keeping tech this is unlikely to happen without some sort of societal collapse, and at that point I don't think youtube would still be around.
This was one of the 2600 games that I had back in the day. Thanks for the memories, and happy holidays to you and your family.
Holy shit. My phone auto set it to 480p 30fps and I couldn't see the neutral zone at all lmao. It took till you explained how it worked that I went back and switched it to 60 fps.
Whoever did these captions need a raise, using colors is something I don’t see a lot do. They even move it too!
A small change in the ROM should allow for the neutral zone to be rendered every frame whilst the quotile shield is never rendered, giving us access to all of the data in the ROM minus the least significant bit. If the Atari had the equivalent of a game genie the branch instruction could be changed to always draw the neutral zone.
Building off of this if you run this in an emulator and change address $FAF3 from 0x9003 (bcc $FAF8) to 0x3A3A (NOP x2) then the game will draw the neutral zone every frame and every piece of code can be seen.
With regard to your closing comment, I suspect we could further surmise that anyone who did have the time and experience needed to deduce the code from the neutral zone could probably write their own (UX identical) version of the game from scratch in less time than it would take to untangle that mess and fill in the blanks accurately.
It's amazing with what developers can do with such a limited piece of hardware. Thanks for the video!
It took me forever to remember what other game you already covered that grabbed a chunk of its own code as a substitute for pseudorandom data. It was _Pac-Man_ using it to determine random directions to move at intersections. I wonder how many other games over the years have used that trick in one way or another.
I imagine anything that had a TV static effect was doing it. Nowadays you get a segfault if you tried this
@@williamdrum9899Yep, because modern CPUs don't let you read random memory for security reasons. It'll let you read your own memory, of course, but you're pretty likely to end up reading invalid memory if you're trying to do something like this.
At first I was extremely confused because I couldn't see the neutral zone at all, but when the section about the flickering started, I realized I just needed to up the quality to 60fps
Woah! Rad.
I was working on an NES emulator and you having motivation to explain all the assembly instructions refilled my motivation to emulate running assembly
Omg that transition from the analogue TV static-y shot of the win screen to the crisp digital emulated shot of the win screen at 1:36 was brilliant.
I remember playing this game as a young kid, maybe about 6 or 7. I had no clue what I was doing, or how to play it. But I still do have distinct memories of it.
This was definitely one of those games you didn't want to throw out the manual for. One great thing about the switch to discs is that people finally started holding on to the packaging for their games, since storing discs without their cases is much more of a pain. I was lucky enough to end up with not just the manual for this one, but the little comic book that explains the backstory in more detail. I still don't know if that came with the game or was something you had to buy separately or order from the back of a cereal box or whatever.
Never thought about using the second bit as a mask in XOR instructions. I typically use XOR instructions to zero out large blocks of registers in one instruction by making my bit matrix both of the input fields as well as the output field. The instruction set allows 125 registers at a time, allowing me to zero out (up to) all 125 in one very fast instruction. This is for low level code on dedicated microcontrollers for industrial automation, where every byte and clock cycle count. Next time I'm working on a large bit matrix, I'll probably look at it a little differently :)
That is funny. My last job I remember seeing a macro for an efficient memset to 0, but never looked at the assembly behind it. Now I wonder if it used XOR or not.
@@canebro1
Probably. Most CPUs have one or more versions of' a "XOR 'thing' with itself" instruction which is generally the most efficient way to set 'thing' to zero.
I love the premise of this video!
I used to play Yars' Revenge like crazy in the Atari days, and I think I was vaguely aware of the trivia of the neutral zone sometime recently, AND I am fascinated by your videos. This video is for *me* so thank you for it!
I really appreciate that the subtitles were actually good, and adjusted position when needed based on screen contents. Thank you!
Absolutely beautiful video, please never stop making them
Somebody PLEASE give a price to this guy. The channel is AWESOME, the in depth analysis are always thorough and spot on. 10/10.
This is definitely high on the list of the best videos that you have made! Technically detailed but also easy enough to follow along with.
There may be an opportunity for me to meet HSW at a future event and if I do, I will be sure to ask if he has seen this video/ recommend it to him, and ask his opinion of your methodology to dissect the game; and I will be sure to pass along what he says in DM if it happens.
Thanks for all of the great content!
Atari put out a magazine called Atari Age back in the 80s, and sometimes they would include some high-level technical explanations related to their hardware and games, and I could swear that they mentioned once that the Neutral Zone in Yar's Revenge was based on the game's code.
absolutely incredible video, couldnt stop watching. I dont even know anything about machine code or assembly at all but this had me hooked. Sad that it seems impossible to fully decode, but getting that far in the first place is arguably cool enough. And dont even get me started on the editing. Definitely one of the highest quality channels about cool niche coding stuff out there, dont stop doing what you're doing.
The fact that you managed to unpack that much of the code using only understanding of assembly op codes, operation lengths and bit masking is… awesome. Same vibes as archaeologists trying to decrypt worn away texts from millennia past.
You never cease to amaze.
34:18 It's not true that $9Exx is a "garbage" location, it would just be a mirror of something (in this case, a ROM address), since the 6507 variant of the 6502 has only 13 address lines but still computes 16-bit addresses internally. Now of course Yars' Revenge is a plain old 4K cartridge with no extra RAM, so storing to an address with A12 set truly is nonsense for this game, but it's worth mentioning. Plus, some particularly advanced bankswitch schemes do interesting things in exploiting the various sorts of incomplete address decoding that the VCS has.
Very cool video!
i think the neutral zone would be a great teacher, they never dwell on the least significant bits
I *C* what you did there
(It's assembly but bear with me)
Nice pfp
@@nsf001-3 on the topic of characters being used, i □ unicode
the subtitles for this video are very well done, thanks for having them
I only understood like half of this, but you explained it so well, that I still feel like I've got a grasp on everything solid enough to leave the video satisfyied. Thank you, that was really interesting!
Amazing video. I hadn’t thought about Yar’s Revenge since I was a kid. I loved that game and this is incredibly interesting.
This all sounds like EXACTLY the argument that inspires things like HDCP. If that were a possibility in the 80s, Atari may have demanded the game use an encrypted channel to the TV. Pirates would then simply dump the ROM, grabbing every byte, in order, with no obfuscation or masked bits. But, gamers would have to upgrade their TVs, VCRs, and switch boxes to avoid scrambled video.
Or maybe I'm just bitter that I can't get my Mac Mini desktop to show up through an HDMI KVM, HDMI Matrix, and HDMI to DisplayPort adapter without disconnecting the cable two or three times every morning. Because god forbid I vid-cap my Outlook window and share it on the Internet...
mac user, point and laugh
Bro really put the inner workings of the game on literal display
why write code to generate a random-looking bit pattern when you already have one on the ROM?
@@TuxfanturnipFlashbacks to the Pac-Man RNG.
10:19 what you did with the captions here was so genius I almost didn't even notice that they were in a different spot. My eyes moved to the graph and so did the captions. Incredible
"Challenge Accepted"
You first
"Challenge Accepted"
>40 minutes in the video
hell yeah
e
Well, what else can I say that everyone else hasn't said but kudos! This is the kind of rabbit hole that I like diving into, it's so refreshing seeing some true software and hardware engineering in action!
Fun fact, if you're watching this video in quality with fps less than 60 you will not see the neutral zone during the showcase of the gameplay.
I didn't get what is neutral zone is first before i switched the quality
Absolutely fantastic video as usual! As someone who doesn’t touch code, and doesn’t know assembly, this was still super easy to follow. Extra kudos for the captions, which move out of the way when it would normally block something! ❤
Truly a lovely piece of reverse-engineering analysis, & it brought back a lot of memories! I never worked on Atari 2600 code, but I did work on lots of code for other 6502 based machines of that era. Thanks for the excellent work.
Currently going to school for electrical engineering technology and covering microprocessors right now, so this is pretty cool. As an avid player of this in my '90s childhood, because I got it as a hand-me-down from my Aunt/Uncle, that's also a huge plus.
Worst mindf*ck I've seen in a long time. Oh man, the patience and tolerance to just move forward is just amazing. Total awe. Thanks.
Lol, I was watching this at 480p60 and had 0 clue what you were on about until you slowed it down and showed the switching frames.
Amazing work! And the ingenuity of old-school programmers like this is really impressive too.
the content of your videos tends to go straight over my head, but it's still so fun to listen to!
4:00 to 6:00 is some of the most awesome analysis I’ve ever seen
Imagine making your source code the template for game mechanics. This game was before my time, but that is a madness i can admire!
If you've watched the "racing the beam" episode, you'll understand that the devs back in the day had to be a little bit mad to be doing this kind of thing. This is why you'll often see them affectionately called terms like "wizard" and "magician" on fan forums; it's a tongue-in-cheek way of describing what they are. :)
They essentially need to create random numbers, so what better way than just randomly grabbing from your source code? You know it will be sequence of non-zero numbers, and as long as you do a little fiddling it is essentially unreadable. Plus, as he said at the end, anyone willing to actually decode it probably deserves it, and should probably be hired.
There's a lot of crazy going on in VCS coding. When you have 4Kbytes of ROM, 128 bytes of RAM, and a CPU that almost has to draw the image on the TV in real-time... you get creative in terrifying ways.
This is fantastic. I loved my uni class on assembly code and havent really used much of the knoweldge gained, but i can confidently say it made me able to follow this video, and able to understand the monumental effort you put into it. Good job!
Wow you are one smart dude! Glad people like you exist and are willing to explain how this works to the rest of us.
This is video is amazing. Love the amount of effort you put into it. Great visuals, great explanations, great everything. 10/10
I don't know how I missed out on this RUclips channel. But I pulled out my phone on which I am signed in and dropped a like and sub.
this is really cool! honestly i would love a whole video on the process of reverse engineering the code from games. i always wondered how people managed to crack the code for Super Mario 64, OoT, and Paper Mario 64
What an amazing research, I'm really impressed of how far you could get thru this visual reverse engineering
I never have any clue what you’re talking about but I watch every video you make. Thanks for the great content!
this is by far one of the coolest videos ive seen in a long time
Wheee! This was fun!
Yeah, I can see how some kid playing Yar's Revenge could get excited upon learning that the source for the game was being used to draw the Neutral Zone. But I agree. In the early '80s there really wouldn't be a practical way to decipher that code even to the extent you were able to.
This all takes me back to when I learned everything I ever needed to know about computer science on my Atari 800.
I really appreciate that text you used for your displays. It looks like a real small font from back in the day. It looks great!
Atari 8K BASIC was so slow that we were practically forced to use 6502 Assembly Language pretty quickly.
I never had an Atari VCS (2600), I saw computer games as graphics demos for me to figure out how they were done. That "Neutral Zone" looks like the kind of noise I often saw to represent energy fields in the better games. It's not at all surprising that the most convenient source of "noise" would be the machine code.
Impressed by the patience and deductions you put in all your videos. Well as for decoding the code that way, I can only agree with you that no one back in the days would have tried. If someone had the electronic & programming skills to understand the inner working of the console, it would have been much much easier to do a ROM dump.
Really beautiful and well done presentation. Thank you for all the time and effort it must have taken to make this!
I believe the explosion when you kill the boss also uses the code.
I once coded a ATARI 2600 emulator and I was baffled that whenever I took a screenshot of Yar's Revenge I could only see either the safe zone or the enemy's shield.
You coded a whole emulator and didn't know about flicker?
Dude what.
@@SECONDQUEST Mate I can't know what techniques every game uses. In fact when you code an emulator you just create the engine. I did know though that the Pacman ghosts were render each 4th frame, because that is more notorious, but for Yar's Revenge it was once every other frame, so until you see it in action you just don't know.
6:01 the tia chip is mostly implemented using latched polynomial counter and some shift register style logic
I'm wondering what the display of the Explosion at the end of the level represents. Is it just the same as the Neutral Zone, but scaled up to fill the screen?
or... could this display during the explosion show the missing "odd bytes"?
they did a similar effect in Metroid Prime! there is a a static effect that happens around a certain enemy, but they didn’t want to use a big static texture because of the limited RAM space. instead of making a high resolution animated texture, they displayed the game’s code instead!
That is a gorgeous work of art, thank you. 💞
Thank you for that video. This is incredible how much we can say about game code, using one visual effect.
Sorry for my English
Your English in your comment was perfect.
Yars Revenge was the game that got me hooked on video games when I was 6 years old. I’ve never looked back.
This is the type of data forensics that wins million dollar jury verdicts. You should spend all of your energies on becoming a highly sought after (and well paid) expert witness in your field. This presentation alone has the court convinced beyond a reasonable doubt.
this was super interesting, well paced and very well animated, very good job
oh how i love such deep dives into obscure techniques. Especially on 6502 which thanks to von Neumann's memory architecture doesn't distinct between "program" and "data" segments. Therefore we can experience wonders such as self modifying code to save some memory or even executing some graphics data which happen to be valid machine code if read correctly.
Leaving all that aside i am astonished by sheer amount of work put in here. Until you showed exact code drawing neutral zone i though that color might be at least missing byte's nibble. Also representation of data-code as blocks and guessing how PC would look like after it was very clever. Amazing video.
First video I’ve seen from this channel. What an amazing style you use! Unique!❤
That topic came out of nowhere! Good video though!
It's amazing to see the switching in real time of the graphics while pausing the video and using , and . to go back and forth. (You go into this right after I added the comment LOL )
NEW RGME DROPPED!! LET'S GOO!!!
Interesting design choice of them using the code as a actual game design choice
"It's about to get pretty technical, and if you don't have a good grasp on assembly and machine code works, it might be a little difficult to follow." Buddy, I don't know a hardly anything about code and have been struggling to understand from the start. Don't worry about me :"D
(The funny part is, I'm mostly following despite not knowing wtf you're saying. I think it's a result of reading extensive scientific journals despite not knowing the jargon -- I can get a feel for the discussion without knowing anything technical)
Yet another way to conceptualise the XOR operator is that it's the "does not equal" operator; it returns 1 (true) if the two inputs aren't the same. A logic gate that is the opposite of this, returning true if the inputs are the same, is called various names such as NXOR, XNOR, XAND, but does not usually exist as a fundamental operation in assembly code afaik.
This is a work of art. And I mean both the game AND your video. Thanks.
So interesting to see your videos, its always a blast
With 2020s technology thats trivial, but in the 1980s it would be near impossible. You'd need expensive recording and video processing equipment and slow it down so the computers of the time could decode it.
if you watch this video in less than 720p because it'll be 30 frames instead of 60, you can't see the flashing between the neutral zone and the shield when the gameplay is at normal speed. you can only see the shield.
at least I couldn't see the neutral zone at 30 frames. I also don't know if he mentioned that or not, but I thought it was really neat
"Elementary, Watson." ... Nice voyage into deduction. Thx for sharing!
Some dude in 1982 already figure out the answer using a piece of paper and a calculator while referencing an ASM book, and the notes have been sitting in an attic somwhere for over 40 years. It's gotta happen. Like there's probably some natty benching 1000lbs raw right now but we'll never know because they don't know Powerlifting exists. The universe is pretty weird like that
Well, I'm a collector of early to mid 80s video equipment so I might try recording this to VHS with a period correct VCR to see just how hard it would be to get the correct pattern written down!
Hello fellow analogue lover!
THE CAPTIONS ARE WELL MADE
THANK YOU
oh god that viewers like you thank you thing sent me back years
I hate how I'm already 32 minutes in the video and still have zero idea about all these.
Didn't know Kiryu played the 2600 lol
@@chitan1362 daigo made me do it
Ngl, this would be hella fun idea for a game where you can destroy the game's code w/ the game
Sad that half the bytes are missing, would've made for a really cool reverse engineering puzzle! (I gotta remember this idea for later...)
Trying to disassemble while only having half the information is bonkers. I wonder if this would work better on 32/64-bit machines? (Though I doubt it)
Yeah, wouldn't be worth it, with only half the bytes. BUT, if the offset incremented every loop (so all odd addresses first time, all even addresses second time), that would make it a little more interesting. :-D
At 3:47 - I like how your frame counter numbers are coloured with player 1 and player 2 yars colors!! :D It's cool how each Yars is a different color! :)
I looked it up out of curiosity and the plug and play version does not have the code sadly.