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 CPU
, Register
s, Memory
, and Mnemonic
s.
+ BaseMachine
+ Cpu
Registers
Mnemonics
+ Memory
Map
The first 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 usp
and 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:
AddRegister("D", 8)
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:
GetRegister(name)
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 Dictionary
itself.
No changes have been made to mnemonics.
This currently just has a Map
array of Integer
s. Other than that, I haven't done any further work on memory. Registers, above, is the current focus.