So, as part of the work on getting our QSIC card to support SD cards for storage, Dave and I have produced some tools that people might find useful.
Dave's original concept was to do SD support with a state machine. However, the SD protocol turned out to be a little too complex for that, so we decided to create a bespoke micro-engine (hereinafter 'uengine' - I use 'u' in place of the lower-case 'mu' all the time) to handle it. This turned out to be a good call; Dave cranked out a uengine in Verilog (which was incredibly quick to produce), and I whipped up (literally - the first version was done overnight) a uassembler. The latter has since been much improved; the current version reads the entire definition of the uengine from a configuration file, and thus should be usable on any umachine. So, if you need a uassembler for some project, here's one. (And if you need something it can't do, let me know, and I can add stuff; e.g. it doesn't currently support the '+' operator in literals, only '|', but it would be fairly simple to add '+' if anyone had a use for it.) The source is here: http://ana-3.lcs.mit.edu/~jnc/tech/QSIC/tools/uas.c (and no, I don't have the energy to learn how to use sourceforge or github to distribute it, so don't bug me about it). I wrote it under Cygwin on Windows, but Dave compiled and runs it on Linux as-is, so it's pretty portable. The current output format is hex that Dave massages into 'ROM' contents on the FPGA in some fashion I don't know the details of, but if anyone needs something different, again, I'd be happy to add whatever's needed. The source syntax supported is documented in comments at the start of the uassembler source; it's pretty simple, here's a brief synopsis (see the file for more detail). ucode is a collection of lines, one per micro-instruction. The syntax for individual lines is: {<label>:} <operator>{, <operator>}... {<literal>} <operator> can be either: <value> (symbolic) or <field>=<fvalue> (where fvalue can be symbolic or numeric); specific symbolic values are assigned by the configuration file (where they are defined) to specific fields. <literal> is <data>{|<data>}... where <data> is symbolic (a label, or a value) or numeric. Forward references to labels are supported. Numeric items (everywhere) are either octal, decimal or hex. Whitespace (either space(s) or tab(s)) can be used in most places. Comments start with a ';' or '/', and the rest of the line is ignored. A sample umachine configuration file (for the QSIC uengine) is here: http://ana-3.lcs.mit.edu/~jnc/tech/QSIC/tools/ueng and the (simple) format of the config file is documented in the comments at the start. A sample source file for uas for that uengine is here: http://ana-3.lcs.mit.edu/~jnc/tech/QSIC/sd.asm if you want to see what source looks like. Dave has a github site where all his stuff is available; the latest version of the ucode is here: https://github.com/dabridgham/QSIC/blob/master/verilog/sd.asm and the whole thing is here: https://github.com/dabridgham/QSIC including the Verilog for the uengine. Dave reports that it should be easy to adapt his uengine design to other uses, it should run in pretty much any FPGA. So if you want to build a PDP-15 (or a Multics! :-) in an FPGA, there you go. Dave indicates he'd be happy to help anyone who needs to tweak the uengine design for their particular application. Hopefully someone will find this useful! Noel