rubyx/lib/register
Torsten Ruger 979660f282 move parfait into register
register layer uses parfait models to generate object space
so parfait  should be part of register (not above it)
2015-11-18 12:04:25 +02:00
..
builtin putstring unfolds length 2015-11-16 18:03:29 +02:00
instructions small label changes 2015-11-15 00:35:43 +02:00
parfait move parfait into register 2015-11-18 12:04:25 +02:00
assembler.rb fix arm (assembled) indexing 2015-11-15 20:42:07 +02:00
boot.rb derive binary code form word 2015-11-14 15:04:04 +02:00
collector.rb need to collect labels for return 2015-11-03 11:22:26 +02:00
eventable.rb move interpreter to register 2015-11-18 12:00:30 +02:00
instruction.rb function call now saves the return address before calling 2015-11-03 11:20:49 +02:00
interpreter.rb move interpreter to register 2015-11-18 12:00:30 +02:00
machine.rb fixes yet another order dependant bug in the test (not the code) 2015-11-09 10:04:37 +02:00
minimizer.rb fold last of the virtual into register 2015-10-22 18:16:29 +03:00
padding.rb fix arm (assembled) indexing 2015-11-15 20:42:07 +02:00
parfait.rb move parfait into register 2015-11-18 12:04:25 +02:00
positioned.rb derive binary code form word 2015-11-14 15:04:04 +02:00
README.md rename phisol to soml 2015-10-23 14:22:55 +03:00
register_value.rb update arm and small arm fixes 2015-11-14 13:05:49 +02:00

Register Machine

The RegisterMachine, is an abstract machine with registers. Think of it as an arm machine with normal instruction names. It is not however an abstraction of existing hardware, but only of that subset that we need.

Our primary objective is to compile Soml to this level, so the register machine has:

  • object access instructions
  • object load
  • object oriented call semantics
  • extended (and extensible) branching
  • normal integer operators (but no sub word instructions)

All data is in objects.

The register machine is aware of Parfait objects, and specifically uses Message and Frame to express call semantics.

Calls and syscalls

The RegisterMachine only uses 1 fixed register, the currently worked on Message.

There is no stack, rather messages form a linked list, and preparing to call, the data is pre-filled into the next message. Calling then means moving the new message to the current one and jumping to the address of the method. Returning is the somewhat reverse process.

Syscalls are implemented by one Syscall instruction. The Register machine does not specify/limit the meaning or number of syscalls. This is implemented by the level below, eg the arm/interpreter.

Interpreter

There is an interpreter that can interpret compiled register machine programs. This is very handy for debugging (an nothing else).

Even more handy is the graphical interface for the interpreter, which is in it's own repository: salama-debugger.

Arm / Elf

There is also a (very strightforward) transformation to arm instructions. Together with the also quite minimal elf module, arm binaries can be produced.

These binaries have no external dependencies and in fact can not even call c at the moment (only syscalls :-)).