Elite on the 6502: The original 6502 assembly source, heavily commented
elite.bbcelite.com
elite.bbcelite.com
So instead of using some fantasy machines such as LC-3, students can directly get into the world of 6502.
First semester: mostly concentrated on 6502 with a full 6502 CPU emulator as the final project.
Second semester: concentrate on a real machine such as the NES. Students need to learn to improve their emulators to program in it (so, do you need a debugger? a decompiler?), as well as hacking roms, burning roms, using carts to load the games into a real NES, and programming new games for it. The game must run in the emulator as well as a real NES.
Third semester for honour: upgrade to a 16/24/32-bit machine, e.g. 80286, SNES, 68K, whatever, and get some serious project done. Can use C if applicable. The project can even be a simple OS or a BASIC interpreter to pave the way for advanced classes. Or maybe a computer virus, anything that is fun and creative.
OS and compiler classes can also be designed around real hardware and projects. e.g. Porting an early version of Linux to a once popular architecture and add a few small functionalities; Write a compiler for a LISP-like language for that architecture and OS.
You don't even need Data Structure and Algorithm and those BS Java programming classes - they learn them on the way. And if they miss anything they can pick them up on the job.
One great advantage to your approach is that emulators are free and some of them, like MAME, have extremely powerful debugging and exploration tools built right in. Plus there's extensive developer documentation, SDKs and instructional materials available for many of the most popular platforms along with lots of commented code disassemblies. Having an actual course structured around curated sets of these materials would be pretty amazing.
I think it's a good idea to go further to work on more difficult retro platforms. I know teachers like LC-3 because it is simple, but I think they underestimate the devoted students.
Agreed, although I'm not sure platforms like Genesis, Amiga or NeoGeo would really be much more difficult for a beginner following a framework than NES. However, their increased performance, resolution and colors would be more capable of creating inspiring output.
(Also, I don't think anyone actually likes NES games except for nostalgia, but this might just be because square waves make my ears hurt.)
I guess dads with NES nostalgia have lost their high-pitched hearing anyway.
I like the principle, and the 6502 holds a special place in my heart as my introduction to machine code programming on an Apple ][ in late 1980 after I got bored with BASIC after two days .. self-taught from the ROM listing and 6502 reference in the back of the manual.
But it's absolutely the wrong ISA today.
RISC-V RV32I (or RV32E, with only 16 registers) is the right ISA today, for many reasons. It is every bit as easy to understand as 6502, if not easier. It is certainly much easier to write an emulator for than 6502 -- and I've done both. And it is at least 10x easier to write real useful programs using, especially if you're going to deal with values bigger than 8 bits, or pointers, or recursive/reentrant subroutines.
You can also cheaply buy a large and growing range of RISC-V hardware, starting from the $0.10 CH32V003 (48 MHz, 2k RAM, 16k of flash for your program) or boards with that chip for about $1, up to ESP32-C3 or RP2350 boards for a couple of bucks with a few hundred KB of RAM. Or the full Linux $5 Milk-V Duo with 1 GHz 64 bit CPU, 64 MB RAM, and SD card for the OS/programs, which you can power from the USB port on any PC and also ssh into it from the PC.
The only advantage the 6502 has now is it is one of the few chips you can still buy with exposed and non-multiplexed 16 bit address bus and 8 bit data bus, which allows you to do tricks such as hard-wiring the data bus to a NOP instruction (0xEA), and feed it a slow clock and watch the PC increment the address bus through all the NOPs.
Nice, but you can do that with an emulator too, or for that matter with a debugger talking to your microcontroller chip.
But again, I agree it's not a great ISA (and only having 3 registers always bug me anyway), so as long as it's a real machine I think it's good. Maybe the one you talked about, or a Z80 machine, would all do the job.
Empirically you need up to 20% more instructions executed vs the 32 register RV2I, which is also similar to what Intel reports with their new "APX" x86 extension giving 32 GPRs.
The 2k RAM also concentrates the mind more so than a 6502 or Z80 with 64k RAM.
[1] you can ignore the "C" for simplicity if you want
[2] which arguably you're not going to use for that purpose so it's effectively available too, most usefully as a 3rd callee save register.
Maybe use these.
My fantasy course would start with a BBC Micro - 6502 BBC Basic with its inline assembler.
Then move on to an Acorn Archimedes - 32 bit ARM which was designed as a direct replacement for 6502.
Finally move to Raspberry Pi - 64 bit ARM with multiple cores.
The thing about advanced courses are: all production material more or less went through 30-40 years of evolution so it's impossible to get students to jump into it directly. Few people can hack modern gcc or Linux kernals nowadays. We can only go back some 30 years and work on the machines then to get some ideas.
Yeah it takes a lot of time though, plus it's just a concept, not real courses -- I myself is a very mediocre programmer.
https://itwww.hs-pforzheim.de/daten/mitarbeiter/johannsen/ve...
We don’t treat this as a creative discipline and thus we don’t spend time looking at masters, how they were successful and the ways they were just as human as anyone.
Someone would get paid for writing stuff like this, same as people getting paid to write about Poe, Cummings, Hemingway, Thoreau.
But I guess the problem is that the way we price teaching and coding, the gap is far too wide between talking about and doing, unless you do it as a side hustle/hobby.
It should probably be an MS class or a senior level class.
In a world of limited time and resources we always make judgements about which academic fields of study are worthwhile. At some level it's a zero-sum game: time spent on comparative literature is time not spent on philosophy or history or creative writing. So, given that we have to prioritize which people to pay and which courses to require, how should we make those decisions?
To live a life thinking this way outside of work would fill me with existential despair. Life well lived is more than a mere exercise in market efficiency.
Academia isn't supposed to maximize our return on investment, and the people who made this their lives work didn't choose the field because it was the highest pay they could obtain or the thing which contributed the most to the orphan crushing machine (the economy).
This is how things work in the real world. Enjoy your existential despair.
That's a great question. I suppose we should start by asking ourselves who is currently paying them. It seems to me that would mostly be the for profit colleges who offer liberal arts degrees.
So far, letting "the free market" decide seems to be working for the most part. Although I am concerned that people are forgetting the value of having an educated popluace, and conversations like this one reinforce that fear. Do you know that 20% of Americans are functionally illiterate and the 54% read below the sixth grade level now?
It sounds like there is a quiet part you aren't saying out loud here, and I'm curious what it is? Do you feel that the government should be limiting access to education in some way?
There are very few for-profit colleges that offer liberal arts degree. Almost all colleges that pay academics to teach comparative literature are government or non-profit institutions. (Sure, you can buy an English degree of dubious quality from a for-profit school like University of Phoenix but the numbers there are tiny.)
Illiteracy is a symptom of a fundamental breakdown in the primary education system before students are even exposed to more complex liberal arts subjects like comparative literature. So I have no idea what point you're trying to make there.
That's said, I still feel there is room to discuss which outcome we are trying to optimize for when we discuss the cost benefit of education and how to allocate those resources. Is the goal profit for employers, well adjusted complete cotizens who understand the world they live in, or something else?
I do suspect that our current attempts to laser focus on the skills most valuable to employers are short sighted, and frankly might be damaging society almost as much as the utter failure of primary education. That is why I mentioned the illiteracy issue before.
If only a minority can read well, and we are trying to "optimize" the learning outcomes of the remaining smaller percentage of competent students, we leave only a tiny percentage of well rounded and capable thinkers.
I also perhaps shouldn't use absurdity to argue against illogical statements.
I had some great comp lit courses in undergrad, which exposed me to some really fascinating work that I wouldn't have found otherwise.
Especially a course on literature of the Caribbean, which looked at a combination of contemporary work and older Western lot which are typical reference points: Robinson Crusoe and the Tempest. A good course brings together interesting world, and provides some structured discussion of both history and culture. You get more out of it through discussion with both the Prof and other students.
These courses at the undergrad level also create more writing practice on diverse topics, which is critical for developing writing skills generally.
I went on to get a PhD in mathematics, and now do machine learning for conservation, collaborating with folks all over the globe. Understanding the shape and impact of colonialism has been important for my subsequent work.
It's a shame because recursive code is often the most clean, elegant and fast for things like traversing trees.
And I have no idea whether the implementation of map/reduce I use is implemented as a recursive function or not, I just use it.
If your friend works with implementing libraries or database engines I would be a bit shocked. If he implements applications and services I could agree that keeping things simple and not inventing your own frameworks could be a good idea.
I wish all codebases were like this. This must have taken months to document it.
[1] https://elite.bbcelite.com/c64/articles/map_of_the_source_co...
[2] https://elite.bbcelite.com/c64/main/subroutine/tactics_part_...
Here’s a timeline of the project so far:
https://elite.bbcelite.com/about_site/site_history.html
I’m sure it will keep growing, there’s always something more to write about…
Anyway, I have reworded every reference to books in the commentary so they now contain the full title and author list, so hopefully people will be able to find the relevant tomes. I've also linked to the books from my "useful links" page in a more prominent manner:
https://elite.bbcelite.com/about_site/useful_links.html
I hope that helps!
Beyond that it was a great game to play. I used to buy drugs on poor agricultural planets, then sell them for massive profits on rich industrial ones, then buy illegal weapons and sell them back on the poor agricultural planets. Starfighting was quite good in terms of frame rate and enemy AI. At some point, hundreds of hours into the game, I was offered a unique mission to recover a spacecraft...
For those wondering what Elite was.