Haven't quite gone ahead with actually executing instructions as yet because I re-worked the way a "machine" is implemented.
I ended-up ripping out the hard coded properties and features and made everything generic. There's now a set of
base classes that are used for implementing the
machine being implemented (as said from the very start) is the Motorola 68000. It's the first CPU I've used assembler with back in, ooh, 1995, maybe? It's also simpler and makes more sense than today's CPUs. Don't wanna go making things harder for myself.
The potential issue here is that registers are now loosely typed. I'm not sure how to go about implementing the
ssp registers. The
pc (Program Counter) register can be added to the base class as all CPUs will require one. Not entirely sure what it will count, though.
When a new register is added to the
Registers collection, you need to specify its base name, such as
D (for a Data reg) or
A (or an Address one). An index is automatically applied. The
D, in this case, doesn't actually mean anything as far as the program is concerned. You can call the register(s)
FloppyJobbies instead, if you wanted.
Anyway! If you wanted to add 8 Data registers, you'd do the following:
This will create 8 registers, all named D0 to D7. Basically, the index is applied directly after the base name.
Do CPUs only really have (general purpose) Data and Address registers? Could I replace the literal with an enum, instead?
Fetching a register? Like so:
With name being, say, "D6" to get the sixth Data register.
As I've (currently) implemented the
Register collection as a list of type <Register>, I've added a
Dictionary for caching purposes to save having to reiterate over the list each item a register is fetched. But, as registers are uniquely-named, I may just change the base collection to a
No changes have been made to mnemonics.
This currently just has a
Map array of
Integers. Other than that, I haven't done any further work on memory. Registers, above, is the current focus.