[HN Gopher] Video Chess disassembled and commented ___________________________________________________________________ Video Chess disassembled and commented Author : nanochess Score : 224 points Date : 2023-06-22 13:33 UTC (9 hours ago) (HTM) web link (nanochess.org) (TXT) w3m dump (nanochess.org) | dbravender wrote: | I just finished training a neural network to play a trick taking | card game and just the neural network is 4,250 times the size of | the ROM for Video Chess and the executable including the UI is | even bigger. | | True story: One time I was at a party and my parents introduced | me to some friends of theirs and they said their son worked on | graphics drivers. I said I couldn't handle low-level work like | that. My parents glared at me and told me I was being rude. Once | I figured out the disconnect I explained that low-level means | closer to the CPU and it's much more complicated - not that it's | less desirable work. | deater wrote: | don't settle for chess on the Atari 2600 when you can be playing | Myst on the Atari 2600: http://deater.net/weave/vmwprod/myst_vcs/ | | I'm trying to get it to the speed-runnable state before Mysterium | next week, we'll see how that goes | syntex wrote: | You can play this game here | free80sarcade.com/atari2600_VideoChess.php | chrisbrandow wrote: | The podcast advent of computing just had a deep dive into the | intricacies and limitations of the Atari 2600. Having just | listened to that episode, it makes this achievement even more | impressive. | | https://overcast.fm/+Ri2NFzoG8 | spogbiper wrote: | I highly recommend this podcast if you have any interest in our | computing history | nsxwolf wrote: | What's its ELO score? | | Edit: Really? Downvotes? Certainly it must have one. You could | play someone on chess.com and find out? | molticrystal wrote: | This seems to have an estimate: | https://chess.stackexchange.com/questions/24952/how-strong-i... | | I was wondering the same thing. It is interesting to see the | exact feature in past engines with limited resources that | overcomes the threshold and moves an engine from the bottom to | the higher ranks, and how historically what ideas were in place | and which were culled that moved the engines in that direction. | dws wrote: | Many years back (so details are fuzzy), a friend who worked at | Atari in the early 80's told that the programmer who did the game | part of the work had the basic chess algorithm working in a few | months, spent the next year getting it to run in less than 128 | bytes of RAM, and was then burnt out and left tech. | | IIRC, the game devs used a PDP-11 for much of their work, so that | had a bit more RAM to work with to get started. | devit wrote: | The 128 bytes of RAM seems quite easy (game state is 32 bytes | for chessboard + 1 byte for side-to-move+castling+en-passant | plus 2/3 bytes per move in the search stack + 1 byte to record | the depth at which castling was disrupted = 54/64 bytes with | depth 10, leaving a luxurious 64/74 bytes for call stack and | local variables). | | The problem seems to be more the 4KB of ROM, but only if one is | trying to make it actually somewhat good, and also perhaps | using 1979 tech for programming. | sitkack wrote: | I'd love to see a dev setup for using the PDP-11 and the Atari | 2600 for doing gamedev. I did a quick search on youtube and the | search engines and couldn't find anything. | reaperducer wrote: | _I 'd love to see a dev setup for using the PDP-11 and the | Atari 2600 for doing gamedev. I did a quick search on youtube | and the search engines and couldn't find anything._ | | The photographs I've seen aren't all that interesting. | | A VT-52 terminal and a hand-built cart wired into an RS-232 | port, all on a long desk. | | Hopefully there are more exciting photographs out there that | I haven't seen. | rahen wrote: | Have a look at the PDF document here: | https://forums.atariage.com/topic/259003-intellivision- | devel... | | Also check out the links provided at the end of the | document. | | Besides the PDP-11, I'm glad to see the beloved PDP-10 was | also used by game developers back in the days. | wkjagt wrote: | Oscar Toledo is awesome. I have his book Programming Boot Sector | Games, and it's wonderful. | LanceH wrote: | Now get it hooked up to lichess and see where its rating ends up. | | I love the 2600 breakdowns and the hacks to get things working. | cwaffles wrote: | Smallest chess engine in 288 bytes: https://leanchess.github.io/ | kstrauser wrote: | I think I'm pretty good at writing software, and then I see stuff | like this, and the impostor syndrome kicks in hard. A fully | working chess game in 4K of ROM, using each of the 128 bytes of | RAM for several purposes? That's some genius. | | Bravo to OP for the disassembly and explanation, too! | jgrahamc wrote: | If you only had 4K of ROM and 128 bytes of RAM you'd find a | way. That's what we all did back then. This isn't to diminish | Atari's achievement (this stuff was super hard and also super | satisfying), it's just to say that doing these kinds of tricks | was what you did when you wanted to create something state of | the art with few resources. | | Here's a silly example: https://blog.jgc.org/2022/11/primality- | testing-on-commodore-... | falcor84 wrote: | > That's what we all did back then. | | I think you might be "suffering" from the Dunning-Kruger | Effect. Even if I accept that "all" the coders at that time | were able to do this, that would just mean that the pool of | people who were capable coders then is vastly more skilled | than the typical coder these days. | ddingus wrote: | Well, for some perspective tricks of the kind being | discussed here were frequently published in magazines found | in the local grocery store! Getting an extra sprite on a | horizontal line, or putting more colors on the screen, | various math tricks, how to pack multiple flags into a | byte, and many other discussions were common. | | When others say, "we had to", they are in part, | communicating how thinking was done. The lower level | details were often published down to the bits in registers | and doing even simple things took one into tricks land more | often than we may realize today. | | Now that said, the VCS (2600) is a difficult machine. But, | it was not above an average programmer to be successful as | much as it did demand one go through the careful steps and | thinking as told today. In fact, just doing what the | machine was designed for; namely, "Combat" required that | thinking. | | I think you may be getting hung up on scope and scale. What | I mean is the field was not as broad in some ways, and most | everyone was a lot closer to the hardware than we mostly | are today too. | | Kids were jumping onto micros and literally figuring it out | with the info they could glean from one another, manuals | shipped with the machines (maybe), magazines and the like | were the basic communications happening daily. I was one of | those kids and in my peer group it was expected to | understand the hardware well enough to follow code. | | So yeah, overall it was just different in ways that may | well prove confusing today, depending on what any of us may | have chosen as our start point. | jgrahamc wrote: | Anyone who wanted to push the limits of hardware at that | time had to do tricks like this. There just wasn't any | other choice. Sure, there were plenty of programmers back | then who weren't capable. But it's not magic, it's careful | thinking and hard work. | kstrauser wrote: | That's perpetually true. "You're trying to do machine | learning on a desktop PC?" "Hmmm, I wonder if we could use | the GPU as a math engine?" | | But holy cow, that chess game really pushed the limits! | | (A side note I like to bring up occasionally: my first | "computer" was "Atari BASIC" on my 2600. It had 63 bytes of | RAM, I think. That didn't last long until my parents brought | home a TS1000 with a luxurious 1KB of RAM.) | jgrahamc wrote: | Yes. I was thinking about that after my comment. All the | folks doing machine learning optimizations, weird stuff | with AVX2, etc. are the same folks who would have been | stuffing chess in 4K of ROM and 128 bytes of RAM. | | In 1985, me and another boy from school wrote a whole | reliable network transport and stuffed it into unused | memory on a Research Machines 480Z. We had 128 bytes for | the receive buffer so in order to do anything we'd | literally ship a packet across the network containing | machine code and the stub code would CALL the receive | buffer to perform tasks. Executable packets! | kstrauser wrote: | I could listen to stories like this all day long. | jgrahamc wrote: | Enjoy: https://blog.jgc.org/2013/05/from-ground-up.html | kstrauser wrote: | How could you do this to me on a work day? | Someone wrote: | > But holy how, that chess game really pushed the limits! | | Having 4 kilobytes of ROM made it _relatively_ easy, I | think. If one ignores draws by repeated positions (which I | think all small chess programs do), board state can easily | be stored in 67 bytes or so (64 for the board proper plus | four bits for whether various castlings are allowed, plus a | byte indicating the square for en passant opportunity, plus | a byte for counting for the 50-move rule), leaving 61 for | the search algorithm. | | I think https://en.wikipedia.org/wiki/1K_ZX_Chess, with 672 | bytes of code and therefore 352 bytes of RAM for storing | game state _and_ screen data might be more impressive. | | I would have to see at what level both programs play to be | sure, though. | phire wrote: | 1K ZX chess actually used the screen data as the game | state. | | As a neat side effect, this means the user can see all | the moves that the engine is considering. | vikingerik wrote: | Each square of the board doesn't even need a byte, only a | nibble. There are 6 piece types so that fits in 3 bits, | plus one for color. If you pack two of those nibbles per | byte then you can do it in 32 bytes plus the castling and | en passant bits. | | Video Chess uses the lower nibble of 64 bytes for the | board, and the upper bits of those for various other | purposes. | | You actually could condense further than that. Build the | storage as an array of pieces rather than squares, so 32 | storage locations. Each of those locations needs only 6 | bits to indicate that piece's current square. (And even | only 5 bits per bishop, although pawns need three more | bits each to handle promotion and to which piece type.) | Of course, writing an engine for that data structure is | much more cumbersome, since it can't look at a square to | find what piece is on it, instead it has to iterate over | all the pieces to find out what's on a square. | chinaman425 wrote: | [dead] | kgwxd wrote: | I've worked through all the 2600 programming books, including | the authors. I've yet to start on anything of my own worth | while. At one point I thought maybe I could start reverse | engineering some games for some inspiration. Didn't get more | than a few hours into it before I decided I'd just rather watch | other people do great things with the 2600. | diydsp wrote: | Also if you have some acquired 6502 skills consider doing | some c64 and appleii or even atari x00 projects. Then maybe | go back to 2600. All are very constrained in their own | beautiful ways but not as perverse as the 2600 :) | toast0 wrote: | I've considered doing something in this vein, and my thought | is don't try to learn two things at once. Game design and | game implementation are two different things; better to clone | a game for your first several implementations, IMHO. OTOH, | I'm not motivated enough to do that, either. :D | ddingus wrote: | You may want to give Batari Basic a look. | | In the early 00's one enthusiast had the idea to make a | simple BASIC compiler for the 2600. I was one of the early | testers and the first thing I did was make a functional | "BREAKOUT", bounce the ball off the bat to eliminate bricks | in a wall game. | | It took a couple hours and was, I think, the first (and | buggy) playable program authored by someone other than the | language author. And it was fun! | | What the author did was kind of brilliant in that he packaged | up several of the common tricks used to make games and | presented them along with a simple BASIC. | | Variables, for example, were just bytes and or individual | bits, essentially addressing bits in a byte like an array. | J = %01101101 If J[2] = 0 then X = X +1 | | Here is a sample program to move a sprite around on the | screen: x=50 y=50 main2 | COLUP0=28 COLUBK=02 player0: | %00011100 %00011000 %00011000 | %00100000 %01011010 %01111100 | %00100100 %00010000 %00011000 | %00111100 %00011000 end | player0x=x player0y=y drawscreen | if joy0right then x=x+1 if joy0left then x=x-1 | if joy0up then y=y-1 if joy0down then y=y+1 | goto main2 | | On the VCS, a game is a loop that renders the display and in- | between display frames, during VBLANK, one computes the next | game state to be displayed, and it all runs at 50 or 60Hz, | locked to the display refresh rate. | | The BASIC exposes the little bit of hardware to a programmer | in a simple way that I found to be a lot of fun because the | really hard parts of assembly language are not necessary, but | can be written in-line just as easily as defining a sprite | is: asm LDA J ASL | ASL . . . end | | Any hoo, it was fun and surprisingly productive. I found I | could knock out simple concepts in an hour or two. | reaperducer wrote: | _A fully working chess game in 4K of ROM, using each of the 128 | bytes of RAM_ | | MicroChess says hold my 924 byte beer: | http://www.benlo.com/microchess/index.html | | MicroChess is also believed to be the first home computer | software that was available for sale to the public. | | I have this on my KIM-1, and I find watching it play itself | kind of soothing. | giantrobot wrote: | Keep in mind is these kind of things have a flat memory space | between RAM and ROM. It's not like today where disk is some | thing way over _there_ that you need to buffer in RAM. All of | your code and resources are in ROM which means they 're just an | address away. Your RAM is scratch space for dynamic values but | you can pull everything else from ROM. | | For instance your bitmaps for pieces/spaces are stored in ROM, | the code called when a scanline is drawn goes and accessed the | values in ROM (it's just a memory address) without needing it | to ever living in RAM. The only part that needs to live in RAM | is the board state that the drawing code uses to find the | bitmaps to draw. There's no need to draw to an off-screen | buffer in RAM that then needs to be drawn to the screen. | | None of that is to say 128 bytes of RAM is somehow _easy_ but | the code and data in ROM can do a lot of heavy lifting without | taking much RAM. | toast0 wrote: | > All of your code and resources are in ROM which means | they're just an address away. | | Only until you need more rom than address space available to | the cartridge slot, and you need to add bank switching. Then | you've got to keep track of what bank resources are in. | JohnBooty wrote: | Keep in mind is these kind of things have a flat | memory space between RAM and ROM | | This is true and is very central to how these miracles were | pulled off. | | While you know this, for the benefit of those reading: you | could also use ROM for time/space tradeoff purposes -- for | example instead of doing a bunch of trig calculations in real | time for character movement purposes you could just have | lookup tables in ROM. the code called when | a scanline is drawn goes and accessed the values in | ROM (it's just a memory address) without needing it | to ever living in RAM | | This went away at some point in console history, and I'm not | sure exactly when. | | For example the Sega Genesis/Megadrive has a scanline based | video chip. No framebuffer, etc. But you've got to copy | graphics data from ROM into the 64KB of video RAM before it | can be drawn onscreen -- no rendering directly from ROM. | | You can do this during the VBLANK interval (the time between | frames) but there is not enough time to rewrite all 64KB so | you've got to be crafty. Typical procedure was to stream | animation data for the main character into VBLANK because you | would like your main character to be animated as smoothly as | possible. [1] | | Contemporary systems like the Neo-Geo did not have that | restriction and could render ROM data directly,[2] although | it was several times more expensive than the Genesis and had | many more address lines physically exposed on the ROM | cartridge connector. May have used faster ROM chips too; | dunno. | | [1] https://rasterscroll.com/mdgraphics/graphical- | effects/animat... | | [2] https://wiki.neogeodev.org/index.php?title=VRAM | JohnBooty wrote: | Addendum: Contemporary systems like the | Neo-Geo did not have that restriction and could | render ROM data directly | | ...which was obviously advantageous for typical use cases! | However, it came at a cost in flexibility. The NeoGeo | _could_ draw from ROM, but _could not_ draw from video RAM. | | Games on the Genesis and SNES could therefore use video RAM | as sort of a makeshift kludgy framebuffer for polygonal | games or for fancier raster effects. The Neo-Geo could do | no such thing. | | The Neo-Geo might have been able to given some custom | hardware on the cartridge itself, with a cartridge-based | CPU rendering data to RAM on the cart that was seamlessly | mapped into the cartridge's address space. I have seen some | wacky emulator projects that work this way, like DOOM on | NES: https://hackaday.com/2019/06/06/doom-on-the-nes/ | Traubenfuchs wrote: | 99% of people "writing software" could not write anything worth | calling a chess engine by themselves. | _a_a_a_ wrote: | Well, there's also this https://en.wikipedia.org/wiki/1K_ZX_Chess | | 1K ZX Chess's code takes up only 672 bytes in memory,[2] but | implements chess rules except for castling, promotion, and en | passant, including a computer opponent.[3] It was the smallest | implementation of chess on any computer at the time. | | 672 bytes RAM, No ROM. No promotion is a killer though | danmaz74 wrote: | I started developing software as a kid on a Commodore 64, and I | thought we were pretty clever if we were able to accomplish | interesting things using only 32KB of RAM. But the idea that | somebody was able to develop a full chess engine using only 128 | _Bytes_ of RAM boggles my mind. | danmaz74 wrote: | By the way: right now I'm working on a chess training | project(1), and I'm thinking that a marketing cofounder could | really help. If anybody is interested, my contact info is in my | profile. | | (1) https://chess.braimax.com | soegaard wrote: | Looks neat. | | Better call the puzzle training something else than Puzzle | Rush though. | danmaz74 wrote: | > Looks neat. | | Thank you. | | > Better call the puzzle training something else than | Puzzle Rush though. | | Why? I think it's the most recognised name for the sequence | of puzzles becoming harder and harder, even if I removed | the time limit (as that leads to not learning much :) | croshan wrote: | I tried it out, was enjoyable to play a few puzzles. My | feedback is a) that the ring sound (when you win a puzzle) | was too loud, so I ended up muting the tab, and b) that the | logo looks like "BraiMax", and doesn't stylistically fit with | the rest of the site theme. | danmaz74 wrote: | Thank you for your feedback! By the way, you can disable | sound from the little cog icon just above the chessboard. | haburka wrote: | Imagine how easy it would be to tell people "Hey sorry we can't | include that feature, there's not enough RAM" and then you | could just build what you wanted to, exactly. | samstave wrote: | [flagged] | Drakim wrote: | I wonder if it "looks ahead" anything at all, or if it's just | evaluating the current turn's piece trade potential. If it does | look ahead, I wonder how many bytes per turn of lookahead is | needed. ___________________________________________________________________ (page generated 2023-06-22 23:00 UTC)