Skip to content

Build an Orix rom


  • In order to have commands available from shell, some rules must be set in the bank structure ( Bank structure must be used, or commands won't be accessed from the kernel or commands (As help -b XX)

  • A ROM will be in an ROM slot or a RAM slot.

Ram slot is useful if some values must be set internaly (and it avoid malloc use, but it's not the way a ROM should not done if the process can be launched twice at the same time).

The twilighte board had been released without the sram saved with a battery, there is a lot more twilighte board in the workd without SRAM saved by battery than with a battery. In that case, if a .rom is coded with the behavior to keep information into it's bank slot (like configuration), it will lost (and the content of the rom) when oric is switch off.

Since shell 2022.4, it's possible to load roms with a shortcut from a config file in /etc

Some existing roms are in a eeprom slot (kernel, shell, monitor, forth ..). Systemd rom is a rom loaded into RAM bank.

  • C language can be used for bank, but the 16KB of a bank is quickly filled with C code.

  • orix-sdk must be intensively used, and if it can't be used, kernel primitives must be used. If a universal feature is missing in kernel, it's better to insert into kernel than develop only for the ROM.

  • Each rom contains 1 or X commands.

  • In order to have multitasking in the future, commands must use malloc and free from kernel (and file operations from the kernel)

  • commands must use zero page from $80 to $80+26 because kernel saves 26 bytes from $80 to $80+26 in order to swap processes. Address $80 to $80+26 are reserved for binary functionnality. It's also possible to use RES and RESB (used in kernel primitive), if you don't call kernel primitives, or else, it well be erased in each kernel primitive call

  • limit for a rom is 16KB. But, it's maybe enough because many operations are done with kernel calls (fopen for example).

  • Kernel is always available (Bank 7) when "set" banking is RAM or EEPROM (kernel is always available durint swapping banks with twilighte banking register ($343).

Bank Structure

If you want to build an orix compatible rom, a special format is used for Orix bank.

A rom template can be downloaded here :

Rom definition

  • $fff0 : 1 byte, rom type (Value 0 : empty bank, value 1 : command bank)

Zero page

Kernel uses some address in zero page. But $80 to $80+26 offset are reserved for binary, Orix banks. Address below $80 can be used, but kernel could erase it when IRQ or Kernels calls are performed

Iin some orix rom, userzp is a label for $80 offset.

Kernel saves 16 bytes when a binary is forked. It means that a XEXEC calls in a binary will save PPID offset from $80 to $80+16, and kernel will restore theses offsets when the PID has finished. In the future, multitasking will work in the same ways, and there is no guarantee that a binary will have its values restores when offset are greater than $80+16

Launch the ROM


If it's a rom which must be in a ram slot, the config file (twilighte.cfg) must be set it in in bankram section or else insert it in bankrom section.


Rom can be loaded on eeprom easily, it will erase 4 banks :

/#orixcfg -r -s 0 myrom.rom

Rom must be loaded into ram slot, it will erase only one bank : :

/#orixcfg -w -s 0 -b 4 myrom.rom

At this step if everything is OK, each commands from the bank can be accessed from shell.

Last update: 2022-11-23