And no, it's probably not what you think (regarding the moderator situation)! I need the input of other minds to figure out how best to address an interesting form of data storage...
Lately, I've been conceiving and beginning to design a very interesting project. See, for a long time, it has been a huge interest and aspiration of mine to create a fully mechanical computer working on binary (not analog!) principles. The original Z1 computer (from the 40s?) was like this, and I know that some people have built them in recent times. For the most part, though, this type of computer is nearly nonexistent. Anyway, I've modified my string logic gate design into a different sort of lever based logic gate design that effectively works on the same principle (and is still fully composable, allowing assemblies of gates without needing synchronization, which the Z1 computer actually did need). Oh, and, it should be possible to assemble the gates and other logic elements with laser cut pieces of plastic, hopefully making the overall project affordable, even if made of thousands of gates. In the mean time, I plan on doing some smaller scale prototyping with a 3D printer I ordered a week ago (still in a warehouse in China

).
Anyway, I've also come up with an interesting design for memory (I call it bead memory, as it uses the positions of small beads to store individual bits), which should be able to cram 48 kilobytes of data into a roughly 1x1.5x2 meter space (possibly smaller). To keep this design from being excessively complex, it works somewhat akin to a hard disk drive -- data is stored on a very simple medium (consisting of a small bead/ball for each bit and a specially shaped substrate) and is accessed by a far more complex "read/write head", which physically moves across the storage medium (stacked into "platters" as I call them) to access different addresses. As in an HDD, this movement of the head across the storage medium will make accessing data inherently slow. Sure, of course, the whole computer will be slow by its mechanical nature, but I expect this storage contraption to be
really slow (let's arbitrarily guesstimate at least half a second per seek, much longer for seeks requiring significant head movement). Electronic computers handle this with faster and smaller RAM, which I plan to emulate with a small (probably somewhere around 512 to 1,024 bytes) bank of NAND gate memory.
Now in a real computer, at least to my understanding, this system is facilitated by a system of interrupts (processor requests data from HDD, moves onto other processing while waiting, is notified via interrupt once data from HDD is ready). To keep the processor's complexity to a minimum, I'd like to avoid implementing any sort of interrupt handling support. That said... How do you folks think I should address my storage system? I have a couple ideas myself...
First, the small memory bank could merely be representative of a of a specific address range within storage; for example, at any given time, a portion of the memory bank would be a copy of a certain address range within storage, and the two would often need to be synced back and forth. I feel like this system might work, but it wouldn't be of any benefit in situations where completely different blocks of storage are accessed alternately (due to needing to copy over an entire chunk of data each time a new block is accessed).
Another system I have in mind wouldn't provide any speed benefit; it would effectively pause the whole system clock while waiting for the storage to seek data, only to resume the clock once the data has been accessed. This would be pretty simple and would work, but all processing would be halted during storage seeks, allowing the storage to severely bottleneck the whole system.
A third system I am thinking of is related to my first system and would allow the processor to address the storage by more of a high level system of messaging. For instance, a special address within the memory bank might be dedicated to this purpose -- when the processor wants to access the storage, it would write into this special address the storage address of the data it would like to access. The storage system would see this request and would access the data at the specified address, writing the data back into a second special address in the memory bank (or vice versa, if writing data to storage). From here, the processor would be able to check for and access the data from the memory bank at its leisure, being able to continue running (on instructions stored elsewhere in the memory bank) while the storage is being accessed. I feel like this would be the best system, or maybe a hybrid of this and the first system.
Or, perhaps, I should include some sort of interrupt handling support after all? I haven't thought about how one would implement this on a subleq OISC processor, or if it would even be possible. But hey, if I can get interrupt support, I'd be on my way to support for preemptive multitasking! Running a preemptive multitasking operating system on a mechanical computer would be just the niftiest thing.
So what do you guys think? Obviously this thing is going to be incredibly slow, (maybe 5 hertz if I'm lucky?) but I'd like to keep the storage system from bottlenecking it further.
And now that I am thinking of it, the idea of implementing interrupt support is actually quite entertaining...
OUT with the ugly campaign signature and IN with some super fancy text.