9 ms·
Easy 6502 - Learn the 6502 Assembly Language
- davepeck 14y agoSo much fun, thank you. Some of my earliest programming was on a C64 with the Merlin Assembler -- this brought me back _and_ brought a big grin to my face.
- mechanical_fish 14y agoIt's fun to see people being encouraged to relive my youth. And 6502 assembly is indeed a nice, compact thing to learn. Though I think the most valuable thing I learned from studying assembly was actually about higher-level languages: How function calls work, and the mechanism of stack frames. This discussion doesn't reach quite that far, and actually I'm not sure how one would work such things into a discussion of 6502 assembly – I learned about them in the context of 680x0 assembly. Back in my 6502 days, I never even encountered a compiler, so I never had the chance to disassemble a C or Pascal program. (To this day I can't name a 6502-based C compiler, though I'm sure they existed someplace. I knew about Pascal compilers, but I never got my hands on one; back in the 1980s compilers actually cost money.)
- pjmlp 14y ago> back in the 1980s compilers actually cost money They still do, only in Linux/BSD land they do not. After all, people have to bring bread back home.
- tluyben2 14y agoYou can find free compilers for (almost) everything on every OS. What do you mean with Linux/BSD land here? And bringing bread home by making compilers; can you point out a commercial compiler that 'brings bread home' besides the Visual Studio compilers (which, actually, do not bring that bread; you can download the compilers for free)? I'm curious as I thought paid compilers currently are niche and don't make the companies selling them enough to actually pay more than maybe 1 person working on it full time, if that. Maybe Intel is making enough of pure compilers to actually call it a business?
- pmjordan 14y agoThe Portland Group's (PGI) main business seems to be HPC compilers. CodePlay make compilers for game developers. There are companies that have made a business out of selling fully-integrated build & debug toolchains for embedded devices. There is usually some amount of customisation required for each type of device, and there's a lot of value in not having to do this yourself. So yes, there are still companies making compilers as their main, paid product, but they tend to target specialised markets.
- tluyben2 14y agoThanks! I did see some AAA game compilers and tools before indeed. But I remember that being very niche and tight knit, small teams. Which is bringing home the bacon, but not compared to making more high level game tools (Unity for instance); unless you are an AAA game dev with very specific needs, you wouldn't bother even looking for those tools because they are so commodity, while high level tools like Unity and Unreal (with all it's add-ons) are not commodity and thus making millions of $. But yes, you are right; embedded, HPC and gaming are good examples. Thanks for pointing that out.
- pjmlp 14y agoI mean that having compilers with 100% full support is something that only happens in open source land. All commercial UNIX vendors sell their compilers. Even in Solaris case, the EULA does not allow you to sell software done with their "free" compiler. Intel compilers are not free for Mac OS X and Windows. All the SDKs for game development from the console owners are not free. The express editions of Visual Studio compilers are limited in which optimizations they offer, libraries and supported processor targets. The compilers from Portland group for HPC. The compilers from CodePlay for the game industry. Even the compilers from Apple can be said that they are not free, after all you're paying indirectly for them when you buy a Mac Developer's license.
- wglb 14y agoThe xcode download that I use to build lots of stuff cost $0.
- wglb 14y agoCheck out http://msdn.microsoft.com/en-us/dd299405.aspx http://msdn.microsoft.com/en-us/dd299405.aspx. Gobs of stuff, compilers, linkers, headers free for the download. So the statement They still do, only in Linux/BSD land they do not. might not be true. Visual studio full version is not free, but you can easily build (compile, link, run) everything for zero dollars. (Not even a picodollar.)
- jorgeleo 14y agoStill there: http://www.cc65.org/ http://www.cc65.org/ What i learned from the 6502 was the use of pointers through the indirect addressing, later when I learned C they became vey easy.
- colanderman 14y agoThis discussion doesn't reach quite that far, and actually I'm not sure how one would work such things into a discussion of 6502 assembly The 6502 supports function calls easily: JSR/PHA/PLA/RTS (Better even than some modern microcontrollers…)
- kabdib 14y ago... but limited to 256 bytes. The 6502 stack is pretty much a toy for a language like C or Pascal, and you definitely need to use a non-hardware stack for actual variables and stuff, probably even return addresses. (I never ran out of 6502 stack programming in assembly, and I wrote a LOT of it, back in the day).
- bcl 14y agoI learned 6502 on my Atari 800. The closest thing to C that I used was a language called Action! (https://en.wikipedia.org/wiki/Action_programming_language https://en.wikipedia.org/wiki/Action_programming_language)
- Smerity 14y agoThis is an excellent introduction -- thanks for posting it :) I teach high school students programming as part of a summer camp and this is a perfect resource for students who are already further along and want another challenge. The introduction to assembly will help them in their later careers and 6502 assembly is likely less of a shock than any recent ASM. With the 32x32 display they could even do some simple graphics to stretch themselves :)
- elliottcarlson 14y agoBesides simple graphics, the original Prince of Persia was developed in 6502 assembly - the source has even been released recently: http://jordanmechner.com/blog/2012/03/prince-of-persia-source-code-found/ http://jordanmechner.com/blog/2012/03/prince-of-persia-sourc...
- hcarvalhoalves 14y agoEducational hacks are the best hacks. Bonus points for historical value!
- Zenst 14y agoFor a assembly language designed for humans they sure did like there 3 letter TLA's. How hard would it of been to have STORE_ADDRESS instead of STA. To realy learn a assembly language you realy need to write code and to write code you realy have to have a project/purpose. Now 6502 is one of the oldest assembly languages still in active use as they still do very well in the microcontroler sector. Though that said ARM is also in that area and alot cheaper to obtain ARM compatable kit. ARM was born out of frustrations/limitation with the original 6502 CPU and in that may be a better more practical use of your educational time. That all said - every programmer of any language should at least learn/play with one assembly language sometime in there life, maybe one or two. I remember after my ZX81 I opted for the Oric-1 over the Spectrum just becasue it had a different CPU (6502) and after that I opted for the AtariST (6800) and a amstrad PC (X86). Also inventing your own CPU/assembler is not as hard and intimidating as alot will think. All are very rewarding and a good use of your time on a rainy day.
- timthorn 14y agoSTORE_ADDRESS takes more than 4 times the memory of STA. RAM was not cheap! Also having fixed width and shorter opcodes made assemblers faster and easier to write.
- Zenst 14y agoErm you don't run assembly languages you still compile them to machine code! Fixed width is easier to process and not necasaryly to write. Remember it is about learning a assembler here - not pandaring towards limited computer memory and processing approaches of the time. THAT is a seprate issue and on that note thanks for the mod down point ;|.
- pjmlp 14y agoYou still needed to write the program before assembling it, so your suggestion would be taking too much memory in the assembler editor.
- 14y ago
- bitcracker 14y ago> So, why would you want to learn 6502? It’s a dead language isn’t it? Well, yeah, but so’s Latin 6502 isn't dead, it has even been relaunched: http://www.h-online.com/open/news/item/Relaunched-the-6502-microprocessor-1422007.html http://www.h-online.com/open/news/item/Relaunched-the-6502-m... 6502 was my first processor, and it was real fun to learn Assembler. I used also figForth and learned from the ground up how it was implemented. Amazing days! Today Assembler isn't fun anymore.. I don't even know the exact name of my current quad core :) Could it be that FPGA programming will be the next golden age of "Assembler"? Content industry works hard to lock computer hardware with DRM. So if we want to keep our freedom then we'll have no other choice than to build our future computers ourselves - again.
- sliverstorm 14y agoI question the idea that homebrew CPUs on FPGAs are the future of desktop computing. Core IP availability aside, FPGAs are very expensive. Also, FPGAs are typically configured with an HDL, which can be likened more to C than assembler.
- bitcracker 14y ago> FPGAs are very expensive. Yes currently, but price depends on demand. On the other side, if FPGAs remain expensive then Assembler could become even more important to put as much code as possible into an fpga. > can be likened more to C than assembler. For that reason I mentioned the word Assembler in quotes. Btw VHDL is much more like Ada than C while Verilog is different from both.
- femto 14y agoFPGAs also consume more power for a given clock rate, and their maximum frequency is less than a dedicated chip. It would be unusual to dedicate an FPGA to implementing a CPU. It might change in the future though? I remember some years ago, the possibility of nanotube based chips were being touted, offering FPGA like programmability and speeds greater than a dedicated chip. I haven't heard of it since.
- 14y ago
- n-gauge 14y agoThis brought back my collage days! I had job coding Z80 ASM to control electronics and RS232 data links... such fun :) People would give you such funny looks when they saw you staring into a terminal of hex and you pointing out .. ahh that 3E CF needs to be 3E D3 :) Best thing is that I ending up knowing all the op-codes and most of the instruction timings of by heart (which made interfacing to those 16 x 2 line LCD modules easier) NMI anyone?
- dizzib 14y agoI'm attempting to finish writing my unpublished BBC micro game 'Zen' written in 1988... http://www.youtube.com/watch?v=Gg8Dtod83qA http://www.youtube.com/watch?v=Gg8Dtod83qA It's so much fun developing in 6502 assembler again!!!
- mpclark 14y agoThe cool thing is that, as a BBC game, it well sell only slightly fewer copies today than it would have in 1988. You've lost nothing by waiting :) Game looks great, btw!
- kghose 14y agoWe were taught on the 8085. We had these cute little kits that were hinged wooden boxes that you opened up. They had all the circuitry exposed which was awesome, a 4 or 6 digit 8-segment LED display and a numeric keypad. Sometimes the kits would go on the fritz and the most common solution was to press all the chips into the sockets. Did I mention it was awesome. My proudest/excitingest moment with them was at the end of the semester when I implemented a long division program on them. It would take two numbers and output the decimal fraction to an arbitrary number of digits using long division. Aaah!
- colanderman 14y agoI recommend also the 6809 as an example of another very well-designed processor from the same era. Most notably, it has post-increment and pre-decrement addressing, and basic 16-bit arithmetic support. http://www.textfiles.com/programming/CARDS/6809 http://www.textfiles.com/programming/CARDS/6809 http://en.wikipedia.org/wiki/Motorola_6809 http://en.wikipedia.org/wiki/Motorola_6809 The modern Atmel AVR is in many ways a spiritual successor to the 6502 and 6809: http://en.wikipedia.org/wiki/Atmel_AVR_instruction_set http://en.wikipedia.org/wiki/Atmel_AVR_instruction_set (That said, I cut my teeth on the 6502 and it will always have a spot in my heart!)
- daeken 14y agoAbout two years ago I picked up 6809 assembly while writing an emulator for it, to assist in reversing a device built around a 6809. Amazingly simple processor/architecture.
- wglb 14y agoKind of reminds one of the PDP-11 architecture.
- protomyth 14y agoI, like you, started on the 6502 and then learned the 6809 (well the book was 6809 but the processor was actually the Hitachi 6309). They were fun processors to program on and I guess if push came to shove I would chose the 6809, but I had the most fun with the 6502 (actual screen vs. serial port). I later learned IBM 370 assembler (why not have the CompSci's assembler class on a mainframe) and 8086/88. I hated both. They felt wrong compared to the 6502/6509. Although 8086 assembler did help my grade in the graphics class. Assembler is great to learn because it teaches you what the final form of your program is.
- facorreia 14y agoI remember the 6502 from the days the Apple II hit the market. It was huge back then. Strangely, the article lists a number of 6502 systems down to Futurama's Bender but doesn't mention Apple II.
- ColinWright 14y agoAs a humorous aside, from Futurama the robot Bender allegedly runs on a 6502.
- cjauvin 14y agoVery elegant and well done! I recently went through the process of learning 6502 C64 ASM (an unfulfilled childhood dream), by writing a simple Tetris clone: https://github.com/cjauvin/tetris-c64 https://github.com/cjauvin/tetris-c64 The basic concepts came very easily (with a quick skim through Jim Butterfield's ML book), but I struggled a bit more with the C64 hardware intricacies: zero page addressing, IRQs, double-buffering to avoid flickers, etc. This was a very interesting and enlightening experiment (in terms of the perspective it sheds on modern-day tools and languages), and I plan to write about it soon.
- vidarh 14y agoIt's pretty unusual to use double-buffering on the C64 - wastes memory. You'll find a lot of code times screen updates to the raster interrupt to either do updates during virtual blank, or start updates after the portion of the screen in question was updated. Of course that assumes you can do the updates in one frame, so you will find exceptions.
- cjauvin 14y agoIn fact, I don't know if what I did really corresponds to "real" double-buffering: at any point, the next move is created in an alternate buffer, which, when ready, is then switched as the visible portion of the video RAM (at vblank, using the raster interrupt). It works ok, but it's also quite possible that this mechanism might be a bit overkill.
- sethish 14y agoIf anyone would like to use this to write emulation instructions for Prince-of-Persia II [0], I would be happy to merge them into the github repo [0]. [0] https://github.com/jmechner/Prince-of-Persia-Apple-II https://github.com/jmechner/Prince-of-Persia-Apple-II
- michaelochurch 14y agoThis is cool stuff. A few noob questions: I notice that the 0x00-ff memory space has no 0xff byte and that 0xfe seems to change a lot, but it's not explained. What's going on here? What's in 0xfe and why is 0xff not shown? I noticed that there's no multiplication operator. Does that mean that multiplication was performed using looping addition? What about division, floating-point, et al?
- loganfsmyth 14y ago* Not sure I follow this question. The zero page (address 0x00-FF) can store any values 0x00-FF. * This is an old processor, so it doesn't support fancy stuff like multiplication and division and floating-point. Generally you just try to avoid multiplication whenever possible, or keep it to powers of 2, since that can be done with shift operations. You can do multiplication using looped addition, but if you were to implement it you'd want to use a constant-time binary multiplication algorithm instead.
- michaelochurch 14y agoIf you open the Monitor in the first example and step through it in the debugger, the byte at address 0xFE changes at every step. This doesn't seem to be documented and it's not clear to me why it's doing that. Moreover the content of 0xFE keeps changing even after execution stops (if you keep hitting the "step" button). 0xFF isn't even listed, but a load from that address seems to work (with value 0x00). [ETA: actually, that seems to be a quirk of the Monitor's initial config. If you set "length" to 100 instead of ff, you can see byte 0xFF in the monitor. Nothing wrong or weird there.]
- loganfsmyth 14y agoAhh, I see what you mean. 0xFF doesn't show up because the Monitor's length is set to 0xFF, which is 255. If you set the length to 0x100 it properly shows the first 256 entries. As for the value at 0xFE, I don't know.
- loganfsmyth 14y ago
- mjcohenw 14y agoBoth the Apple II and the Commodore PET used the 6502. I'm amazed that these were not mentioned in the original article. I wrote a bunch of 6502 code for Micro Technology Unlimited's music and graphics boards for the PET, and even wrote my own assembler in PET Basic. Fun Times!
- Kelliot 14y agoThis brings back memories of painful Friday morning lectures in yr1 of uni! XD