Pyromaniac features
System
- The system supports only some of the processor modes:
- SVC mode is used for modules (and the OS).
- IRQ mode is used for timed events and other extensible IRQs.
- USR mode for applications and utilities.
- UND mode is used for the undefined instruction handler.
- Modes FIQ, SYS, MON and HYP are not used.
- Only 32bit modes are supported.
- MMU is not enabled - all the execution happens within a flat memory space environment.
- Memory protection is not used within many memory regions (including the ROM area).
- The memory below application space (
0
-&8000
) is has a number of traps which are configurable with watchpoints to report accesses to the memory range for diagnostic purposes. (watchregions
)
0
-&20
: Low vector range (not used by RISC OS Pyromaniac)
&20
-&FE8
: Low memory (not used by RISC OS Pyromaniac)
&FE8
-&1000
: Shared pointers, used by C library, FPE, Window Manager (not used by RISC OS Pyromaniac)
&1000
-&4000
: VDU workspace (not used by RISC OS Pyromaniac)
&4000
-&8000
: Scratch space (not used by RISC OS Pyromaniac)
- SVC stack memory can be trapped, to detect corruption of the system stack.
- Internal exceptions may be fatal. They are reported with a python backtrace (configurably) and then trigger the Error handler using a hardware error code. Sometimes that might mean that multiple exceptions are reported from a single failure, due to further problems handling the exception.
- IRQs may be dispatched through the device vectors.
- Tickers are passed through the device vectors, and use IRQ mode when registered tickers are dispatched.
- VSyncs are passed through the device vectors, and raise events.
- Exception vectors are implemented in high address space.
- API documentation for features can be found in the
docs/prm
directory.
- The
pyro.py
command supports a --version full
to get information on the system implementation.
- Within the system the command
*Help Pyromaniac
gives information on the system implementation.
SWIs
- SWIs are provided for most of the Kernel operations.
- Most of the standard SWIs from RISC OS to 3 are supported, with some of the RISC OS 4 and Select specific features.
- A few of the RISC OS 5 SWIs are supported.
- Unsupported SWIs:
OS_BreakPt
- Not supported.
OS_UpdateMEMC
- Not relevant to RISC OS Pyromaniac.
OS_InstallKeyHandler
- Not supported.
OS_ClaimScreenMemory
- Kernel does not manage the screen buffer, so this is redundant.
OS_ReadRAMFsLimits
- Kernel does not manage RAMFS, so this is redundant.
OS_DelinkApplication
, OS_RelinkApplication
- Not supported.
OS_HeapSort
, OS_HeapSort32
- Not supported by the Kernel (provided by the OSSWIs module)
OS_ExitAndDie
- Not supported.
OS_ReadMemMapEntries
, OS_SetMemMapEntries
, OS_FindMemMapEntries
- Without physical pages, these are redundant.
OS_ClaimSWI
, OS_ReleaseSWI
- Not supported (not sure these were ever defined)
OS_Pointer
- Partially supported (only for reading type) (ospointer.device_type
).
OS_AbortTrap
- Not supported
OS_MMUControl
- Without an MMU, controlling it is redundant.
OS_SpecialControl
- Not supported (not sure what this was intended for)
OS_EnterUSR32
, OS_EnterUSR26
- Not supported
OS_TaskControl
- Not supported (not sure what this was intended for)
OS_DeviceDriver
- Not supported
OS_Hardware
- Not supported
OS_IICOp
- Not supported, use the IIC
module.
OS_ConvertVariform
- Not supported
- Kernel SWIs can be trapped with
OS_ClaimOSSWIs
.
- SWIs can warn about misuses:
- SWIs issued in SVC mode without the X-bit set may report warnings to the trace output.
- SWIs issued in SVC mode without the X-bit which cause errors may report errors into the trace output.
- SWIs issued in IRQ mode will report a warning in the trace output.
- SWI execution depth may be explicitly limited.
- Configuration
kernel.swi_recursion_limit
may be set to the number of nested SWI calls that may be performed before an error is raised.
- Configuration
emulation.internal_recursion_limit
may be required to increase the limit of Python function call nesting to allow the SWI recursion limit to be effective.
Memory (Memory management)
- Dynamic areas are partially implemented, but don't support the full range of features:
- Creation - supported
- Deletion - supported
- Resizing - supported
- Sparse mappings - not supported properly (they can be faked with
dynamicarea.sparsemap_support=fake
).
- Handlers - supported:
- Pre/Post Shrink/Grow will be called on resize.
- Shrinkable areas - not supported
- Physical map addresses/specific pages - not supported
- Abortable areas - not supported
- Clamping - supported (
dynamicarea.clamp_*
), but not applied to sparse dynamic areas.
- Domain mappings - not supported
- Heap DAs - supported
- Heap DAs automatically resize when they need to grow.
- Heap DAs are used for the System Heap and the RMA.
- Corruption can be detected in many ways.
- Corruption in Heap DAs (including the system heap and RMA) triggers a report into the trace output when it is detected (debug option
daheaperror
).
- Heap tracking can identify repeated frees and ownership of allocated blocks (configuration option
dynamicareaheap.tracking_full_checks
).
- Allocated and freed block headers can be marked as tracing or aborting (
watchregions.daheap
).
- Guard regions can be included within the protected watch regions to trap overruns and underruns (
dynamicareaheap.guard_size
greater than 0).
- When guards are used, their values may be configured (
dynamicareaheap.guard_alloc_value
, dynamicareaheap.guard_free_value
).
- Enumeration - supported
- Renumbering - supported
- Access permissions - not supported
- Locked areas - supported
- Doubly mapped areas - not supported
- Read free space - supported
- Free space can be configured to be the difference between the configured amount of DRAM and the used memory ('dynamic'), or a static size (
dynamicarea.freesize
).
- Read change information - supported, but tracks all areas not just the system ones.
- Application space, RMA, ROM, the System Heap, SVC, IRQ and UND stack dynamic areas are implemented.
- New dynamic areas have been created:
- Zero page is registered as a Dynamic Area.
- By default this is 0 bytes and so would be inaccessible.
- It can be configured to be accessible, which allows the modules like SharedCLibrary and Debugger to initialise, which would otherwise try to access data in the zero page area (in the Select versions).
- The content of zero page can be configured to various values through the
zeropage
configuration group.
- CPU exception vectors region is registered as a Dynamic Area.
- Application space is remappable using the
OS_AMBControl
SWIs.
OS_AMBControl
doesn't allow remapping into different areas of memory. It can only map into the application space.
- Lazy mappings are not supported.
- Application space can be resized directly. The free pool does not exist, so resizing it does not push pages into the application space.
OS_AMBControl 9
provides information on the mappings.
- Without the MMU, memory protection is not relevant.
OS_ValidateAddress
supported.
OS_Memory
calls are only supported enough to read the system size. Physical pages do not exist, so it is not possible to enumerate or remap memory, but it is possible to return fake values.
OS_Memory 8
for reading the memory size is configurable, but may also be forced to specific sizes.
- Memory mapped I/O regions (external hardware registers mapped into memory space) are supported, but are incredibly slow, so are disabled by default. At the present time, no memory mapped regions are offered by the implementation.
OS_Memory 6/7
for reading the memory arrangement can be configured to return errors (the default), return 0 pages available (through osmemory.physical_table_support
), or some fake page tables.
- Addresses and sizes of DynamicAreas in the memory map are configurable (through the
memorymap
configuration group), although the system may not function as expected for some configurations.
- The base address for new dynamic area allocations is configurable.
- Dynamic area names can be validated on creation through configuration (
name_zero_effect
, name_invalid_effect
, name_control_effect
).
- Dynamic area name length is configurable (
name_max
).
OS_Heap
managed areas are configurable:
- Minimum size of allocations can be set (
heap.minimum_allocation
).
- Maximum size of a heap can be controlled (
heap.maximum_heap_size
), which makes it easier to recognise heap header corruption.
- Extends which reduce to 0 or less can be reported as errors, rather than returning -1 (
heap.extend_to_nothing_is_error
)
- Blocks claimed and freed can be implicitly cleared so that they do not contain left over values, or make it easier to spot invalid uses (
heap.clear_*
).
- The free list within the heap defaults to the RISC OS Classic format, but can be configured to use a simpler offsets format (
heap.free_link_is_heap_offset
).
- Allocated block size can be rounded to different values within the heap (
heap.rounding
).
Interrupts
- Generalised interrupts not supported.
- Ticker events are implemented:
OS_CallEvery
and OS_CallAfter
can be used to register timed events, and they will be called back at the appropriate time.
- Interrupting ticker events require a special build of Unicorn at present - see https://github.com/unicorn-engine/unicorn/issues/1105 for more details.
- Interrupting ticker events are believed to be unreliable, causing interrupts that break the current execution, and are disabled at present.
- Ticker events are triggered when the system is idle and has threaded out of the ARM execution, which may mean that events are delayed.
- Tickers can be dispatched more slowly with a configuration (
tickers.dispatch_rate
).
TickerV
is supported.
- VSync can be enabled (
graphics.vsync_enabled
) and will trigger Event_VSync
.
Modules
- Modules are loadable into ROM, RMA and may be provided in ROM images through Podule manager:
- ROM modules are initialised first.
- Early init modules will be initialised before other modules.
- ROM modules are not protected.
- ROM modules may report errors and will not fail the boot.
- RMA modules are initialised once the OS has booted.
- RMA modules which report errors will fail pyro initialisation.
- Podule Manager can provide additional modules which are treated like ROM modules.
- Module entry points are partially implemented:
- Initialise/Finalise - implemented.
- Compressed modules are not supported.
- A flag on the initialise entry point offset indicates that the module may be of a different architecture.
- Services - implemented, supporting Ursula style service tables.
- Start - implemented.
- Help and commands - partially implemented.
- Commands can be dispatched (through the command line and with
OS_CLI
)
- GSTrans mappings and the parameter limits in the infoword are honoured.
- Informational and Help-only commands are supported.
- FileSystem commands are dispatched when the filesystem is selected.
- Syntax messages which don't start with
Syntax: *
are warned about (configurable).
- SWIs - implemented (but not the SWI decoding code).
- Extended flags - implemented and extended.
- 32bit module flag is required for ARM 32 execution (non-32bit modules will be rejected).
- Early initialisation modules will be started before modules without the flag.
- Flags have been created to indicate the architecture of the module - but only ARM 32 is supported.
- Allocations within the RMA (Claim, Release, Extend, etc) are implemented.
- Module, ROM and extension/expansion ROM enumeration is supported.
OS_SWINumberToString
/OS_SWINumberFromString
are implemented, resolving names from a file of constants and from dynamically loaded modules.
- Modules may be multiply instantiated, and preferred.
- Modules may be reinitialised. ROM modules may be reinitialised if they had been killed.
- Module names may be abbreviated by suffixing them with a
.
.
- Modules are implementable in Python to provide implementations without having to load the original module.
- Initialise/Finalise - implemented.
- Start - not implemented.
- Service - implemented, but no Ursula style service tables.
- SWIs - implemented.
- Help - implemented.
- Commands - implemented.
- Extended flags - describe the module as being for the 'Python' architecture.
- Module notification services are not partially supported.
Service_ModuleStatus
is supported.
Service_ModulePreInit
is supported.
- Podules supported through the
Podule
PyModule.
- Only a single extension ROM is currently supported with
--config podule.extensionrom1
.
- Podules can only load full RISC OS ROM images at present (actual podule images not supported).
- Podule chunk directories will be synthesised from the ROM images.
- RISC OS Select 32bit images are supported (requires
memorymap.rom_base
to be assigned to a different location such as &8800000
to avoid memory area clashes).
- RISC OS 5 images are partially supported.
- Unplugging modules through the NVRAM configuration is not supported.
- Unplugging modules is supported through the Pyromaniac configuration (
modules.unplug
configuration option)
OS_Byte
- Dispatched through
ByteV
.
- Only some of the reason codes are implemented:
- 80 implemented at time of writing; see
--list-registered OS_Byte
for named handlers.
- See individual sections of the features for more detail on support.
- Status variables (
OS_Byte &A6
upward) are supported, although they may not be used by the system.
- NVRAM is implemented through this
OS_Byte
161/162 (but not checksumed).
- NVRAM requests are passed through
NVRAMV
, which defaults to an internal implementation.
- NVRAM can be preserved by supplying a backing file with
--config nvram.backingfile=<filename>
.
- NVRAM backing files can be 240 bytes of data, or a file containing the values.
- NVRAM backing files will be written every time the data is updated.
- An IIC implementation is provided which contains the NVRAM storage, although this is currently not used.
OS_Byte 129
and OS_Byte 0
have configurable values to return for the OS version and Machine type.
OS_Byte 1
(user flag) is supported.
- Event enabling and disabling with
OS_Byte
13/14 is supported, and will be honoured by OS_GenerateEvent
and internally generated events.
- Other
OS_Byte
operations are documented in the following sections.
OS_Word
- Dispatched through
WordV
.
- Only a few calls implemented:
- System clock - implemented
- Interval timer - not implemented
- Time conversions - implemented
- Read character definition - implemented
- Palette operations - read and write palette are implemented through
PaletteV
.
- Pointer operations - some implemented (see the Graphics system for more details)
OS_ReadSysInfo
- A few of the calls are implemented, enough to return the hardware as having none of the features of the other platforms:
- Screen size (
OS_ReadSysInfo 0
) - 0
- Mode/Monitor/Sync (
OS_ReadSysInfo 1
) - configured module, with monitor type 'MDFs', and vertical sync.
- Chips and ID (
OS_ReadSysInfo 2
) - no chips, same ID as OS_ReadSysInfo 5
- IO Features (
OS_ReadSysInfo 3
) - no chips present
- Mac address (
OS_ReadSysInfo 4
) - configurable
- Unique ID (
OS_ReadSysInfo 5
) - configurable
- Kernel values (
OS_ReadSysInfo 6
) - most values are 0; values only returned where implemented
- Abort information (
OS_ReadSysInfo 7
) - correctly returned
- Platform Class (
OS_ReadSysInfo 8
) - configurable
- ROM Information (
OS_ReadSysInfo 9
) - configurable
- OS Version (
OS_ReadSysInfo 10
) - supported
- Debug handlers (
OS_ReadSysInfo 11
) - configurable
- Kernel debug handlers are configurable to use different implementations:
null
- ignores the output and returns no input.
stdout
- writes output to the console stdout and returns no input.
stderr
- writes output to the console stderr and returns no input.
socket
- connects to a remote server and directs input and output through it.
OS_PlatformFeatures 0
supported, but returns no IRQ trigger function, and limited features.
- 'SynchroniseCodeAreas required' bit is set, as the system uses the synchronisation points to track code changes.
- 26bit mode is unavailable.
- Vectors are always reported in the high region.
- 'No physical pages available' bit is set, as none of the page manipulation interfaces are exposed.
- The flags are configurable as
osplatformfeatures.codefeatures
.
OS_PlatformFeatures 33
describes the cache, having a single I cache which is the size of the memory of the machine.
OS_PlatformFeatures 64
describes the CPU registers, and the layout of register dumps.
OS_SynchroniseCodeAreas
supported, and used for internal recaching of changed memory regions. May be a very slow operation.
- Aborts update
DFAR
/DFSR
, IFAR
/IFSR
and are reported by the Debugger
module.
Services
- Services are dispatched internally and to modules.
- Many of the system operations do not dispatch services in the way they do under RISC OS Classic; only a few have been implemented.
- Internally provided services:
Service_TaskManagerAcknowledgements
reports system information.
- Fast service dispatch using the RISC OS 4 service tables is supported.
- PyModules do not currently support fast service dispatch.
Vectors
- Vectors may be claimed (
OS_Claim
), added to (OS_AddToVector
), released (OS_Release
) and dispatched (OS_CallAVector
).
- When called, the vectors may be claimed (by pulling from the stack).
- Post-processing and multiple calls to lower level handlers are not supported.
- Most OS SWIs call the vectors as expected.
UserV
is implemented as a simple message printer (configurable), to allow testing of the vector dispatch.
- The
Debugger
module includes a *Vector
command to list the vectors in a similar way to the tool of the same name.
Variables (System variables)
- Basic setting and reading of variables is supported.
- Variables are GSTrans'd on set if requested.
- Variables are EvaluateExpression'd on set if requested.
- Macros are GSTrans'd on read.
- Code variables are supported (both within RISC OS and PyModules)
- Enumeration is supported.
- Deleting is supported.
- Reading variables can cause the buffer to be corrupted with other data (
sysvars.read_corrupts_buffer
).
- Variables are isolated to the emulated environment (not propagated from host environment - this would not really make sense as they have completely different interpretations).
- Default system variables:
CLI$Prompt
set to *
.
File$Path
set to @.
.
Run$Path
set to ,%.
.
Alias$.
set to Cat
.
FileSwitch$CurrentFilingSystem
set to HostFS
.
FileSwitch$HostFS$CSD
(and friends) set to $
.
Sys$Time
set to a code variable to give the current time.
Sys$Date
set to a code variable to give the current date.
Sys$DateFormat
set to %24:%mi:%se %dy-%m3-%ce%yr
Sys$Year
set to a code variable to give the current year.
Sys$ReturnCode
set to 0
.
Sys$RCLimit
set to 256
.
Conversions
OS_Convert*
family are implemented (except the new OS_ConvertVariform
).
OS_GSTrans
is implemented. OS_GSInit
and OS_GSRead
are implemented in terms of OS_GSTrans
(where in RISC OS Classic, it was the other way around).
Buffers
- Buffers 0-9 are supported internally, but largely unused.
- Buffer 0 (keyboard input) is read as part of read key interface, but key presses are not inserted into the buffer (they're read directly). This means that
OS_Byte 138
to insert characters works and takes precedence over the input from the keyboard.
- Buffer 9 (mouse events) is updated by the pointer, but is never read.
OS_Byte 15
and OS_Byte 21
supported for flushing buffers
OS_Byte 128
, OS_Byte 138
, OS_Byte 145
, OS_Byte 152
. OS_Byte 153
are supported for reading size, inserting and removing bytes from the buffers.
InsV
, RemV
and CnPV
are supported for the buffer insertion, removal, counting and flushing. Both byte and block interfaces are supported.
BufferManager
module does not exist - the buffers are all handled internally.
OS_ReadC
, OS_Byte &81
(INKEY) and OS_ReadLine
are implemented, and take input from stdin, if available.
OS_ReadC
dispatched through ReadCV
(RdChV
)
OS_ReadLine
/OS_ReadLine32
are supported:
ReadLineV
is used to dispatch such calls.
- Configurably may use native 'readline' to give history and line editing.
- May infer the prompt within the output.
- History file and the truncation length are configurable.
- Will output its read line to the graphics implementation only on a complete line being supplied.
- Tab completion of system variables, *-commands and filenames is available (
input.readline_native_completion
).
- Escape within a read line is supported (only partially with the native 'readline')
OS_ChangeRedirection
is implemented.
*Exec
input is implemented.
INKEY
is implemented.
- Buffered keys (passed through buffer 0) are returned from the console.
- Keyboard scan only works if the UI component supports it (VNC, GTK and WxWidgets currently support input)
- Under console the keyboard scan will always return no keys pressed:
OS_Byte &79
always returns 'no keys pressed'.
OS_Byte &81
with -ve values always returns 'no keys pressed'.
- Function key input is expanded from
Key$*
if the key input is triggered.
- Function keys can be triggered from the console when the native readline is not used.
- Function keys can be triggered from the UI where the UI passes these through.
- Function keys can be triggered by buffer insertions with
OS_Byte 138
.
- Console input can be trigger function keys for certain terminal control sequences (configurable with
input.terminal_escape
)
- Cursor key operations can be controlled with
OS_Byte 4
.
- Mode 0 (cursor editing) is not supported (silently swallows cursor key presses).
- Mode 1 (generating codes) generates key codes.
- Mode 2 (act as function keys) triggers function keys, as above.
- Input of the cursor keys is supported through the GTK and WxWidgets UI.
- Input of the cursor and function keys in the console is supported for certain terminal control sequences.
- Input encoding is configurable.
- Input encoding defaults to UTF-8 (configurable with
input.utf_support
).
- The input encoding will be converted to the current alphabet before being inserted into the buffers.
OS_Byte 219
to redefine the tab character is supported.
- Escape should be handled correctly.
- Escape is triggered by either reprogramming the escape key using
OS_Byte 220
, or by Ctrl-C (SIGINT
) interrupt.
Event_Escape
will be raised if it has been enabled, disabling the standard escape behaviour.
- Escape effects configured using
OS_Byte 200
are honoured.
- Escape effects configured using
OS_Byte 230
are honoured.
- In VNC, GTK and WxWidgets UIs, the Escape key is functional.
- Escape should follow the regular pattern for RISC OS, although behaviour such as flushing buffers is not effective if keys are not being passed through buffers (as is the case for console).
- Escape cannot be detected whilst in the native readline input.
KeyV
can be triggered by the UI (configurable with input.keypress_enable
).
- Generates character input into the buffers on key presses.
- Key press state in
OS_Byte &79/&7A
and OS_Byte &81
are not implemented yet.
- Key repeats delay and rate are supported.
- Key status flags in
OS_Byte &CA
is supported.
KeyV
updates the flags in this OS_Byte value when Shift, Ctrl, Caps Lock, Scroll Lock and Num Lock are pressed.
KeyV 3
is issued to update the keyboard LEDs (may be displayed in the WxWidgets UI).
- Caps Lock and Anti-Caps Lock ('Shift enable') are honoured from these flags when characters are inserted into the buffer.
- Scroll Lock has no effect.
- Num Lock has no effect.
- Configurable whether
KeyV
is used outside of the UI (console input never passes through KeyV
).
Event_Keyboard
will be issued (configurable with input.keypress_event_enable
).
- On Windows, console input is read in the background when requested, so as to not block timers.
- EOF (Ctrl-D) can be configured to raise an error, issue
OS_Exit
or OS_Reset
, fake an Escape key press, or be ignored (input.eof_effect
).
Output (Character output and VDU)
- VDU output may be vectored through
WrchV
(configurable through vdu.wrchv
).
- Default operation is to only use the vector when there are claimants.
- The use of the vector can be disabled entirely (which will be faster), or enabled always (which will be slower when there are no claimants).
OS_Write
family are implemented, and write to stdout.
OS_NewLine
supported.
- When used in the plain VDU implementation is is configurable whether it generates combinations of
\r
and \n
.
- When used in ANSIText VDU implementation will always generate a
\n
.
OS_PrettyPrint
will print formatted output, honouring the current text window. This may result in oddly positioned line breaks in console mode as the text window will most likely not match the size of the text output console.
- Redirection of output is not fully supported:
OS_ChangeRedirection
is supported, but never acted upon.
OS_Byte 3
, character output destination, is not honoured, although it does track state.
- Printer output is passed around internally, but is not directly diverted to a separate device.
VDUXV
redirection is supported.
*Spool
/*SpoolOn
is supported.
- Stdout is converted from the current alphabet (controllable by
OS_Byte &47
and *Alphabet
) to the output encoding (which defaults to UTF-8). These character sets (alphabet and output encoding) are configurable with --config vdu.alphabet
and --config vdu.output_encoding
).
- Output is flushed on the console in a configurable manner (with
--config vdu.flush
). Output can be flushed at the end of a line, after each character, or only when the logical position of the cursor changes outside the usual console progression.
- VDU sequences are supported, and state is retained for most of the calls. When unsupported, they will be consumed, but the default action is to print the sequence as a diagnostic when they occur, eg
[^<char>:<queue>]
(configurable).
VDU 1
/VDU 2
/VDU 3
is tracked and passes to an internal 'printer' which does nothing with it.
VDU 5
/VDU 4
state is tracked and output diverted to the graphics system if necessary.
VDU 21
/VDU 6
state is implemented.
VDU 7
is issued as Service_ExternalBell
(SystemBell
internal module will convert this to a Sound call).
VDU 8
-VDU 13
(except VDU 12
) cursor movement are passed through to the console as appropriate. VDU 9
is passed to the console as a space to match RISC OS behaviour.
VDU 12
(CLS) is ignored by the console (the ANSIText implementation will clear the screen as expected).
VDU 14
/VDU 15
is tracked, and paging actions can be configured through vdu.paging
.
VDU 16
(CLG) is passed to the graphics system.
VDU 17
(set text colour) is ignored by the plain implementation (the ANSIText implementation will set the colour)
VDU 18
(set graphics colour) is passed to the graphics system.
VDU 19
(set palette) records the palette (only a single colour is recorded).
VDU 20
(reset colours) resets the palette entries and colours, and passes to the graphics system.
VDU 22
(change mode) changes the effective mode to a numbered mode, and passes to the graphics system.
VDU 23
is processed and unknown calls will be passed to UKVDU23V
(which is many of them).
- Character definitions and reading are supported.
- Resetting character definitions with
OS_Byte 20
and OS_Byte 25
are supported.
- The default definitions are the default definitions provided by the RISC OS Kernel.
- Character redefinition by alphabet is provided by the International module.
- Text cursor shape definition is supported, and will be used to draw the flashing cursor.
- Text window is supported in limited ways (appears correctly on UI through Cairo)
- Text character movement direction is supported.
- Colour tint selection is supported.
- Text colour swapping is supported.
- Character sizes are supported in Cairo.
- Teletext option selection is supported.
- ECF definition is supported for both BBC and RISC OS formats.
- Simple ECF definition is supported.
- Reading the ECF definition is not supported.
- ECF rendering is supported in Cairo.
- ECF origin is supported, but never used.
- Scrolled text window operations are supported in character mode in the graphics system, but not in byte mode.
- Clear text region operations are supported in Cairo and ANSIText.
- Teletext configuration is supported.
VDU 24
(set graphics window) is passed to the graphics system.
VDU 25
(plot) is passed to the graphics system.
VDU 26
(reset windows) resets the text and graphics windows.
VDU 28
(set text window) records the text window (although scrolling is not supported in ANSIText; should be correct in the graphics system).
VDU 29
(set origin) is passed to the graphics system.
VDU 30
/VDU 31
cursor supported for moving the cursor (in ANSIText).
VDU 127
deletes a character.
- Paged mode is supported and the manner of waiting for output can be configured:
- A configuration option can be set to change the behaviour to wait for a key press before continuing, or to use
Shift
, or to ignore pagin.
- Paged mode does not detect a
Shift
to continue at the console, but can be configured to detect Shift
in the graphics UI.
- Slow output mode (triggered by holding down the ctrl key during VDU 4 output), is not supported.
- Palette operations are tracked.
OS_ReadPalette
is supported, for main palette, border and the pointer, through PaletteV
.
- In ANSIText the palette changes are effective after the change (ie do not change existing text).
OS_Byte 9/10
and VDU 23,9/10
to change flashing colour timings are supported, but ignored.
OS_SetColour
is supported for both text and graphics output, but not for patterns.
- Tinted colours are supported when in 64/256 colour modes.
- Teletext modes are provided through implementations, configured through
--config teletext.implementation=<value>
.
- The
videov
implementation calls the RISC OS Select VideoV
vectored teletext interface. High quality mode can be configured.
- The
videov
implementation does not use efficient updates for its handling of the display.
- VideoTTX module provides an implementation of the TTX module through
VideoV
.
- Alternative VDU implementations may be provided and are configured through
--config vdu.implementation=<value>
; use --list-implementations VDU
for a list of VDU implementations):
plain
provides the output described above.
ansitext
augments the 'plain' output by converting RISC OS text colour sequences to ANSI colour sequences.
OS_Byte &86
always reads cursor input position as the current cursor output position.
OS_Byte
calls to read character at input or output cursor are supported only in graphics implementations at present.
OS_ReadModeVariable
/OS_ReadVduVariables
is implemented for VDU and graphics parameters. See Graphics section for details of the graphics parameters implemented. Text parameters:
- Text window bounds supported.
- Text window size supported.
- Text colour and tint supported.
- Highest numbered mode supported.
- Text character size and spacing supported.
- ANSIText implementation supports:
- Foreground and background colours (and palette changes, but only for subsequent output) using standard colours, 256 colours and 24-bit interfaces (configurable)
- Cursor positioning.
- Clear screen.
- Cursor movement.
- Cursor shape (block/underline), flash state, and visibility.
- Changing size of terminal to match screen mode (configurable).
OS_PrintChar
write characters to the printer implementation.
OS_RemoveCursors
/OS_RestoreCursors
are supported and will remove the cursor when it is applied (see Graphics section).
- A few
ColourTrans
SWIs have been implemented to make it possible to use some applications which need to work with colour (see ColourTrans section for more):
ColourTrans_SetTextColour
, ColourTrans_SetOppTextColour
, ColourTrans_SetColour
are supported to select colours.
- The output destination for VDU output can be configured to a different file descriptor, if necessary (
vdu.output_fd
).
Graphics
- Graphics calls are understood, and passed on to selected implementation.
null
does not support any output, but tracks the interfaces to give useful returns from SWIs.
cairo
provides the primary graphics implementation.
- When selected directly it may render to a bitmap (PNG, PNM), an SVG or a PDF.
- At the end of execution, the contents of the graphics system may be saved to a configurable file.
gtk
provides a UI implementation based on GTK 3 (see the Video section)
- The underlying graphics are derived from the Cairo implementation.
wx
provides a UI implementation based on WxWidgets (see the Video section)
- The underlying graphics are derived from the Cairo implementation.
vnc
provides a UI implementation which is served over VNC (see the Video section)
- The underlying graphics are derived from the Cairo implementation, served by the 'cairo-vnc' package.
framedevice
provides a simple interface which can be used with physical devices.
- The underlying graphics are derived from the Cairo implementation.
- Frame device implementations are configured through
framedevice.implementation
.
console
and ansi
frame device implementations provide graphics on the console, one character per pixel.
ssd1306
provides an interface to an SSD1306 OLED display connected via I2C.
dreamcheeky
provides an interface to a small LED message display connected by USB.
turingsmartscreen
provides an interface to a LCD display connected by USB.
bbcbasic
provides a graphics output as a BBC BASIC program wich can be run
to reproduce the graphics that were rendered. This is only intended for testing
purposes, to allow the comparison of different behaviour more easily. It is not
complete and many graphics operations will not be reported in the output file.
- The state of the graphics system is tracked where possible, and may be used by the different implementations.
OS_Plot
calls are interpreted and may be acted upon by the different implementations.
- Debug option
plotsvg
can be used to output diagnostics of what OS_Plot operations were performed as SVG statements. These can be dropped into an SVG file and will render a partial image of what would have been plotted. Currently this is upside down due to the differences in coordinate systems.
- Unhandled Plot calls are passed to
UKPlotV
.
OS_ChangedBox
state updated by the implementation if it is acted upon. If the implementation provides updates, they will be returned by the SWI.
- VDU 4 and 5 output is passed to the graphics system.
- Dot-dash patterns are supported within the Cairo implementation.
- ECFs are understood and are mostly supported within the Cairo implementation.
- BBC and RISC OS interpretation of ECFs are both supported.
- Giant ECFs are supported.
- Simple ECFs are not supported.
- Colour selection works for shallow colour, 256 colour and deep colour modes.
- Modes exist and can be operated on:
- Numbered modes can be selected with
VDU 22
, OS_ScreenMode 0
.
- Mode selectors are supported in
OS_ScreenMode
, OS_ReadVduVariables
, and OS_ReadModeVariable
.
- Attempting to select modes with inconsistent values for ModeFlags and NColour can be configured to warn, generate errors or be ignored (
modeselector_fullpalette_invalid
, modeselector_ncolour_invalid
).
- Default screen mode is configurable (
vdu.mode
).
OS_ReadModeVariables
and OS_CheckModeValid
are implemented.
Service_ModeExtension
is used for unknown modes.
- RISC OS 3.1 and 3.5 format extensions are supported (
vdumode.modeextension_format
, vdumode.support_vidclist*
).
- Only the mode variables will be set from the returned modes; VIDC parameters are ignored.
- Substitute modes are supported.
Service_ModeChanging
and Service_ModeChanged
are issued on the change of the mode.
OS_Byte &87
reads the current mode (and character at cursor, if it is decodable using the current bitmap font).
OS_ScreenMode
has many reason codes implemented:
OS_ScreenMode 0
(Select mode) - Supports selection by mode specifier (mode number, mode selector, sprite).
OS_ScreenMode 1
(Return mode) - Supported
OS_ScreenMode 2
(Enumerate modes) - Supported by calling Service_EnumerateScreenModes
.
OS_ScreenMode 3
(Select Monitor Type) - Not supported
OS_ScreenMode 4
(Configure acceleration) - Supported, but returns that none is available
OS_ScreenMode 5
(Update frame buffer) - Stubbed
OS_ScreenMode 6
(Force frame update) - Stubbed
OS_ScreenMode 7
(Count banks) - Supported
OS_ScreenMode 8
(Select display bank) - Supported
OS_ScreenMode 9
(Select render bank) - Supported
OS_ScreenMode 10
(Copy banks) - Not supported
OS_ScreenMode 11
(Select display driver) - Supported for reading device only
OS_ScreenMode 12
(Read display details) - Supported
OS_ScreenMode 13
(Decode mode string) - Supported
OS_ScreenMode 14
(Encode mode string) - Supported
OS_ScreenMode 15
(Select mode by mode string) - Supported
OS_ScreenMode 255
(Register display driver) - Not supported
OS_ScreenMode 254
(Deregister display driver) - Not supported
OS_ScreenMode 253
(Read maximum display driver) - Supported
Service_EnumerateScreenModes
can configurably return the details for the numbered modes (vdumode.enumerate_numbered_modes
).
- Modes returned by the service may be restricted by configuration (
vdumode.display_*
).
- The
PyromaniacModes
module provides extra modes through configuration (modes.numbered_modes
).
OS_ReadModeVariable
/OS_ReadVduVariables
are implemented for VDU and graphics parameters. See Character output and VDU section for details of the text parameters implemented. Graphics parameters:
- Graphics window supported.
- Cursor position history supported (in both the internal and external variants).
- Graphics origin supported.
- Graphics colours and tints supported.
- Graphics character size and spacing supported.
- Display and screen base addresses, and screen memory size not supported (as there is no frame buffer; see Video section)
- VIDCClockSpeed not supported.
- Horizontal line is supported (as used by the classic Draw module).
- PolyHLine supported (as used by the Select Draw module) (
graphics.polyhline_enable
).
- VideoDisplayNumber supported.
- Graphics colour patterns ECFs, colours to write to the screen, are not supported.
- 64 colour modes partially supported.
OS_SetColour
updates the tint parameter consistent with the colour selected. On RISC OS Classic, the tint is a construction parameter for the colour number and the value in VDU variables cannot be relied on to obtain an equivalent GCOL. In RISC OS Pyromaniac the value of the VDU variables for tint is updated consistently. This may have side effects where clients do not expect the tint to change over calls to OS_SetColour
.
- Palette changes within 64 colour modes may not have the same effects as RISC OS Classic.
- VSync is supported through
Event_VSync
when enabled (graphics.vsync_enable
), and OS_Byte 19
will wait until an appropriate period has passed even if not enabled.
- Sprites operations are only partially supported (see the Sprites section).
- VDU cursor flashing is supported (configurable)
- Within the UIs it will default to enabled.
- In Cairo the cursor may flash on non-UI when configured.
- When configured off, no CPU impact will be made for flash events.
- VDU operations which control the cursor flash rate, and visibility are supported.
- Flash events are counted through centisecond timer, not through VSyncs.
- Screen banks are supported, although whether they are effective and how many is dependant on the graphics implementation:
OS_Byte 112
and OS_Byte 113
legacy calls select screen banks.
OS_ScreenMode 7-9
operate on screen banks (OS_ScreenMode 10
, copy banks, is not supported).
- Cairo graphics support:
- Output buffer is either vector or a 24bit bitmap; paletted modes are emulated.
- The output may be saved to a PNG, PNM, SVG or PDF on exit (configurable with
graphicscairo.save_on_exit
and graphicscairo.save_filename
)
- 'Video' may be created by configuring the creation of frames, which can then be passed to
ffmpeg
to create a video.
- Enabled through configuration
graphicscairo.video_enable
.
- Stored as PNGs in configuration
graphicscairo.video_directory
.
- May include the mouse pointer when configured (
graphicscairo.video_pointer
).
- For line drawing when output is a bitmap, drawing may be anti-aliased (disabled by default).
- Lines supported.
- End point selection not supported (all lines have both ends).
- Dotted lines are supported.
- End point selection not supported (all lines have both ends).
- Continuation pattern not supported (all patterns start at the beginning).
- Points supported.
- Triangles supported.
- Rectangles, Parallelograms supported.
- Circles and ellipses supported (may not render as expected in non-square pixel modes).
- Arcs, segments, sectors supported.
- Flood fill not supported.
- Block copy, block move are supported.
- Solid colours supported.
- ECFs supported.
- GCOL actions are not only partially supported:
- Set (0) works as expected.
- EOR (3) and invert (4) will do a colour inversion, rather than bitwise paletted operations.
- Others operate as Set.
- Gap modes are rendered correctly for text output (in both BBC gap mode style and regular style), although graphics operations in gap modes may produce odd effects.
VDU 12
and VDU 16
(CLS
and CLG
) are supported.
VDU 4
output is passed to the graphics implementation and will be rendered appropriately.
VDU 5
text supported, both as bitmaps and as a native font (not through FontManager), configurably.
VDU 5
text movement supported as expected.
- Should wrap correctly at the graphics window edges when unbounded output is disabled, and continue when unbounced output is enabled.
- Should bound correctly at the graphics window edges.
- Text written outside the graphics window should never be wrapped.
VDU 4
and VDU 5
text size configuration are honoured.
- Text window scrolling is supported (not hardware scrolling).
- Graphics window bounds all graphics and text.
- Reading text characters from screen is supported in bitmap mode.
OS_ReadPoint
is supported for reading the point colours.
OS_Word 9
is supported for reading the point colours through legacy interface.
- Palette changes only affect subsequent output, not existing output on the screen.
Draw
path and fill rendering supported:
- SWIs are dispatched through the
DrawV
vector.
- Paths are supported, although the gap operations may not work as expected.
- Fill rule NonZero and EvenOdd are supported, but Positive and Negative are not.
- Triangle caps not supported.
- All fills are interior (boundary regions, and exterior fills not supported)
- Line widths are supported.
- Flattening value is ignored
- Dash pattern is ignored.
- Matrix transform operations are supported.
- Screen banks are supported:
- 2^32-1 screen banks are supported, and will come into existance when referenced.
- Display and VDU banks are honoured correctly.
ColourTrans
module exists to provide some colour manipulation calls (See ColourTrans section)
Video
- No frame buffer is currently supported (no Direct Screen Access).
- Although the multi-display driver
OS_ScreenMode
calls are supported, the drivers do not support multiple displays.
- UI Configurables:
- Window title is configurable.
- Scale factor is configurable.
- Border around the graphics display is configuable in colour and size (
graphicsui.border_colour
and graphicsui.border_size
).
- Minimum width is configurable, allowing scale up of very small modes.
gtk
implementation:
- Closing the window will terminate the system.
- Dynamic scaling not supported.
- Eigenfactors supported.
- Redraws are able to be capped at a redraw rate, to prevent the system running away with refresh as fast as possible.
- VSync is used for updates at the redraw rate.
- Key presses are passed on to the input system.
- Mouse movement is passed on to the pointer system.
- UI pointer shape is updated from RISC OS (
graphics.ponter_on_shape
, graphics.pointer_off_shape
).
- Border is rendered around the graphics output (configurable colour; not using RISC OS palette definition).
- Menus offer RISC OS interaction options:
- Screenshot (to file and to clipboard)
- Reboot
- Screen blanking is not supported.
wx
implementation:
- Screen display window shows the output from the graphics system.
- Closing the window will terminate the system.
- Scaling of the window is configurable to either be disallowed, scale to the window, or scale retaining aspect ratio (
graphics.window_resize
).
- Border is rendered around the graphics output, defaulting to the RISC OS palette colour, but may be forced by configuration (
graphics.border_*
).
- Eigenfactors supported.
- Redraws are able to be capped at a redraw rate, to prevent the system running away with refresh as fast as possible.
- VSync is used for updates at the redraw rate.
- Key presses are passed on to the input system.
- Mouse movement is passed on to the pointer system.
- Mouse clicks are passed to the input system, and Menu may be emulated (
emulate_menu_button
).
- UI pointer shape is updated from RISC OS (
graphics.ponter_on_shape
, graphics.pointer_off_shape
).
- Menus offer RISC OS interaction options:
- Screenshot (to file and to clipboard)
- Reboot
- Enable and disabling debug options from a list.
- Show window with keyboard LEDs.
- Show windows with miscellaneous system information.
- Show console output.
- Show memory dumps for modules, AMBs, and dynamic areas.
- Open a file explorer to examine the hosted file system.
- Open a python shell to directly examine the system state.
- Centres windows when mode size changes (configurable).
- Screen blanking is supported.
vnc
implementation:
- Multiple clients are supported (
vnc.max_clients
).
- Connection remains running when client.
- Redraws are able to be capped at a redraw rate, to prevent the system running away with refresh as fast as possible.
- Key presses are passed on to the input system.
- Mouse movement is passed on to the pointer system.
- Port can be selected, defaulting to display 2, port 5902 (
vnc.port
).
- A password may be set for full access to the system (
vnc.password
).
- A separate password may be set for view only to the system (
vnc.password_readonly
).
- Screen blanking is supported.
framedevice
implementation:
OS_Byte 144
(*TV
) is supported, but does nothing.
Pointer (Pointer and mouse)
- Outside of the UIs, pointer and mouse operations only track their settings, they never generate any input.
- Mouse clicks may be passed through from the UI.
- Mouse clicks enter the mouse buffer.
- Buffered mouse state is read from the mouse buffer.
KeyV
calls for the mouse clicks not supported.
- Pointer configuration is partially supported:
- Pointer shape can be configured with
OS_Word 21
, and is passed to the graphics system.
- GTK and Wx widgets may display the configured pointer in the UI using the native pointer.
- Pointer colours are supported, although some graphics UI systems may not be able to display full colour and may default to monochrome.
OS_SpriteOp 24
to set the pointer from a sprite is supported.
- Mouse and pointer are always linked.
- The
OSPointer
module provides a *Pointer
command (which in RISC OS Classic is provided by the Wimp).
- Mouse bounding box not supported.
OS_Pointer
supports reading the pointer type and the alternate pointer ('Mouse scroll') position.
PointerV
is not used.
- Alternative pointer ('Mouse scroll') events are supported.
- Only WxWidgets UI generates these events, but they are passed through.
- Mode changes cause the mouse position to be reset to the centre of the screen.
ColourTrans
- ColourTrans SWIs are vectored through
ColourV
.
- ColourTrans never uses ECFs to simulate more colours in low depth modes.
- Colour matching uses a fixed 2, 4, 1 weighting.
- Colour selection
ColourTrans_SetGCOL
- supported
ColourTrans_SetOppGCOL
- not supported
ColourTrans_SetColour
- supported
ColourTrans_SetTextColour
- supported
ColourTrans_SetOppTextColour
- supported
- Sets the opposite colour number in all modes. In Classic, in 256 colour modes, this call would set the worst matching tint for the best matching colour.
- GCOL operations:
ColourTrans_ReturnGCOL
- supported
ColourTrans_ReturnGCOLForMode
- supported
ColourTrans_ReturnOppGCOL
- supported
ColourTrans_ReturnOppGCOLForMode
- supported
ColourTrans_GCOLToColourNumber
, ColourTrans_ColourNumberToGCOL
- supported
- Colour number operations:
ColourTrans_ReturnColourNumber
- supported
ColourTrans_ReturnOppColourNumber
- supported
- Returns the opposite colour number in all modes. In Classic, in 256 colour modes, this call would return the worst matching tint for the best matching colour.
ColourTrans_ReturnColourNumberForMode
, ColourTrans_ReturnOppColourNumberForMode
- supported
- Font operations:
ColourTrans_ReturnFontColours
- not supported
ColourTrans_SetFontColours
- calls to Font_SetColourTable
.
- Colour tables:
ColourTrans_SelectTable
, ColourTrans_GenerateTable
- supported partially
- Sprites as sources are supported.
- Current mode, mode numbers, descriptors and sprite mode words as sources are supported.
- Sprites as destinations are supported.
- Current mode, mode numbers, descriptors and sprite mode words as destinations are supported.
- Palette pointers follow the RISC OS 3.5+ definitions of the default palette.
- Pixel translation tables are supported.
- Palette tables are not supported.
- 32K. tables are supported for deep modes rendering to shallow modes (precomputed tables exist for common 256 colour modes).
- Wide translation tables are supported.
- Transfer functions are supported (but not for 32K. tables).
ColourTrans_SelectGCOLTable
- not supported
- Miscellaneous operations:
ColourTrans_InvalidateCache
- supported, but does nothing.
ColourTrans_SetCalibration
- not supported
ColourTrans_ReadCalibration
- not supported
ColourTrans_WriteCalibrationToFile
- not supported
ColourTrans_WriteLoadingsToFile
- not supported
ColourTrans_ConvertDeviceColour
- not supported
ColourTrans_ConvertDevicePalette
- not supported
ColourTrans_MiscOp
- not supported
- Model conversions:
ColourTrans_ConvertRGBToCIE
, ColourTrans_ConvertCIEToRGB
- not supported
ColourTrans_ConvertRGBToHSV
, ColourTrans_ConvertHSVToRGB
- supported
ColourTrans_ConvertRGBToCMYK
, ColourTrans_ConvertCMYKToRGB
- not supported
- Palette operations
ColourTrans_ReadPalette
- supported
ColourTrans_WritePalette
- supported for updating the display palette
Sprites
OS_SpriteOp
calls are passed through SpriteV
.
- Rendering calls are mostly supported.
- Many variants of the rendering calls are not supported.
- Old style masks and 1-bpp masks are supported.
- Alpha-channel sprites are supported.
- CMYK sprites are not supported.
- Colour mapping is not supported.
- Plotting deep sprites is supported.
- Plotting in deep modes is supported.
- Masked and unmasked rendering is supported.
- Rendering of the mask in the current colour is supported.
- Left and right wastage are supported on all sprites.
- Old style palettes on sprites with 256 colours might not be correct.
- Translucent plotting is applied consistently on all sprites operations.
- Plot actions are supported in line with GCOL:
- Set (0) works as expected.
- EOR (3) and invert (4) perform a colour inversion, rather than a bitwise palette inversion.
- Other actions work as Set.
- Screen operations:
OS_SpriteOp &2
(ScreenSave) - supported
- A warning is generated if an invalid palette flag is supplied.
OS_SpriteOp &3
(ScreenLoad) - partially supported
- Does not load to the graphics window's bottom left.
- Does not select a screen mode when new style sprite modes are used.
- Does not write to the palette.
- Sprite file operations:
OS_SpriteOp &a
(LoadSpriteFile) - supported
- Does not validate the sprite file after load.
OS_SpriteOp &b
(MergeSpriteFile) - supported
- If sprite area is empty, performs a load.
- Errors may leave the sprite file in a valid but inconsistent state.
OS_SpriteOp &c
(SaveSpriteFile) - supported
- Area operations:
OS_SpriteOp &8
(ReadAreaCB) - supported
OS_SpriteOp &9
(ClearSprites) - supported
OS_SpriteOp &f
(CreateSprite) - supported
OS_SpriteOp &11
(CheckSpriteArea) - supported
OS_SpriteOp &19
(DeleteSprite) - supported
OS_SpriteOp &1a
(RenameSprite) - supported
OS_SpriteOp &1b
(CopySprite) - supported
- Sprite information:
OS_SpriteOp &d
(ReturnName) - supported
OS_SpriteOp &18
(SelectSprite) - supported
- Does not select the sprite for plotting with
OS_Plot
OS_SpriteOp &28
(ReadSpriteSize) - supported
- Plotting:
OS_SpriteOp &1c
(PutSprite) - supported
- In mismatched colour depths for paletted sprites (eg 16 colour sprite plotted to 256 colour mode), the images will be rendered to the closest colours. Classic would byte copy data, so would be scaled and coloured oddly.
- Transparent plotting is supported. Classic would not render transparently when the plot action bits 8-16 were set.
OS_SpriteOp &22
(PutSpriteUserCoords) - supported
- In mismatched colour depths for paletted sprites (eg 16 colour sprite plotted to 256 colour mode), the images will be rendered to the closest colours. Classic would byte copy data, so would be scaled and coloured oddly.
- Transparent plotting is supported. Classic would not render transparently when the plot action bits 8-16 were set.
OS_SpriteOp &30
(PlotMask) - supported
OS_SpriteOp &31
(PlotMaskUserCoords) - supported
OS_SpriteOp &32
(PlotMaskScaled) - supported
OS_SpriteOp &33
(PaintCharScaled) - not supported
OS_SpriteOp &34
(PutSpriteScaled) - supported
OS_SpriteOp &35
(PutSpriteGreyScaled) - not supported
OS_SpriteOp &37
(PlotMaskTransformed) - supported
- Arbitrary source rectangles are not supported.
- Destination coordinates are not supported.
OS_SpriteOp &38
(PutSpriteTransformed) - supported
- Arbitrary source rectangles are not supported.
- Destination coordinates are not supported.
OS_SpriteOp &41
(TileSpriteScaled) - supported
- Under the Cairo graphics implementation this will be accelerated to only use a single sprite conversion (
graphicscairo.tile_acceleratiion
).
- Transformations and scalings which produce empty regions can be configured to report warnings or errors (
spriteop.empty_transformation
).
- Creation:
OS_SpriteOp &e
(GetSprite) - supported
OS_SpriteOp &10
(GetSpriteUserCoords) - supported
- Sprite modification:
OS_SpriteOp &1d
(CreateMask) - not supported
OS_SpriteOp &1e
(RemoveMask) - not supported
OS_SpriteOp &1f
(InsertRow) - not supported
OS_SpriteOp &20
(DeleteRow) - not supported
OS_SpriteOp &21
(FlipAboutXAxis) - not supported
OS_SpriteOp &23
(AppendSprite) - not supported
OS_SpriteOp &25
(CreateRemovePalette) - not supported
OS_SpriteOp &26
(CreateRemoveAlphaMask) - not supported
OS_SpriteOp &2d
(InsertCol) - not supported
OS_SpriteOp &2e
(DeleteCol) - not supported
OS_SpriteOp &2f
(FlipAboutYAxis) - not supported
OS_SpriteOp &36
(RemoveLeftHandWastage) - not supported
OS_SpriteOp &39
(InsertDeleteRows) - not supported
OS_SpriteOp &3a
(InsertDeleteColumns) - not supported
- Pixel data:
OS_SpriteOp &29
(ReadPixelColour) - not supported
OS_SpriteOp &2a
(WritePixelColour) - not supported
OS_SpriteOp &2b
(ReadPixelMask) - not supported
OS_SpriteOp &2c
(WritePixelMask) - not supported
- Pointer:
OS_SpriteOp &24
(SetPointerShape) - supported
- Redirection:
OS_SpriteOp &3c
(SwitchOutputToSprite) - ignored when redirecting to screen, error otherwise
OS_SpriteOp &3d
(SwitchOutputToMask) - not supported
OS_SpriteOp &3e
(ReadSaveAreaSize) - not supported
- System sprite area is provided by the SpriteUtils module:
- Most of the commands for system sprite area manipulation are provided by the SpriteUtils module.
Fonts
- The FontManager provides a number of the original SWIs.
- Not implemented:
- Font files:
Font_MakeBitmap
, Font_UnCacheFile
, Font_ReadFontPrefix
, Font_ReadEncodingFilename
- Sizing:
Font_FindCaret
, Font_FindCaretJ
- Conversion:
Font_SetScaleFactor
- Rendering:
Font_SwitchOutputToBuffer
- Colours:
Font_ReadColourTable
- Configuration:
Font_ReadThresholds
, Font_SetThresholds
, Font_SetFontMax
, Font_ReadFontMax
- Implemented:
- Font handles:
Font_FindFont
, Font_LoseFont
, Font_SetFont
, Font_CurrentFont
, Font_FutureFont
- Font files:
Font_LookupFont
- Font specifiers:
Font_FindField
, Font_ApplyFields
- Informational:
Font_CacheAddr
, Font_ReadDefn
, Font_ReadInfo
, Font_ReadFontMetrics
- Sizing:
Font_StringWidth
, Font_StringBBox
, Font_ScanString
, Font_CharBBox
- Conversion:
Font_ConverttoOS
, Font_Converttopoints
, Font_ReadScaleFactor
- Rendering:
Font_Paint
, Font_Caret
- Enumeration:
Font_ListFonts
, Font_DecodeMenu
- Colours:
Font_SetFontColours
, Font_SetPalette
, Font_SetColourTable
, Font_CurrentRGB
, Font_FutureRGB
- Fonts are provided by a font resource.
- The 'standard' fonts may be faked by the font system, and will do nothing. They will enumerate as the standard set of fonts (
graphics.font_fake
.)
- When the Cairo graphics system is in use:
- The standard fonts can be mapped to the standard Cairo serif, sans-serif and monospace fonts (
graphics.font_standard
). The italic variants can be forced to be oblique (fonts_standard_synthetic
).
- The font-config system (through the
fc-list
command) can be used to determine the fonts available (graphicscairo.fonts_fontconfig
), and may be filtered to allow only certain fonts (graphicscairo.fonts_fontconfig_allo
, graphicscairo.fonts_fontconfig_deny
). Font names will be converted to RISC OS font names based on rules using the weight and italic effects.
- The bounds used by the font characters can be read from the font itself (the designer's metrics), or by examination of a sample of characters (
graphicscairo.fonts_designer_bounds
).
- Fonts may be given a name prefixed by a
:
to use the host font of that name.
- Font identifier fields are supported:
\F
(font identifier): Supported
\f
(territory for font name): Supported, but not used
\E
(encoding): Supported
\e
(territory for encoding): Supported, but not used
\M
(matrix): Supported. Trailing space is configurable (font.enforce_trailing_space_on_matrix
).
- Font handles can be restricted to a particular range (
font.handle_min
, font.handle_max
).
- Unused font handles can be retained, or freed from the list immediately (
font.free_early
).
- Font handles can be made to be unique per claimant (
font.reuse_handles
).
Font_ListFonts
menu generation is not supported.
- Font control strings are not well supported, and where unsupported will be stripped.
Font_Caret
is supported through line drawing:
- Can be configured can be configured to use 'loops' on the end of the the stem (
fontmanager.caret_loops
)
- Double width is supported.
- OS units and millipoints are supported.
- Flag bit 2 is ignored (as this is set by the Wimp, though it has no meaning), but all other unsupported flags raise an error.
- 3 forms of caret are used, depending on the vertical height. These follow the style of the Classic
FontManager
.
- Does not render with EOR in Cairo (as this is not implemented).
OS_ChangedBox
is updated at the completion of caret render.
Font_ConverttoOS
can be rounded to the current output's pixel units (fontmanager.converttoos_rounded
).
PLOT 206-215
, VDU 23, 25
and VDU 23, 26
not implemented.
- The font scale factor is always 400; it cannot be changed.
Font_Paint
support:
- Justification is supported
- Rub out box is supported
- OS unit and millipoint rendering is supported
- Coordinate block for spacing of characters and words is supported.
- Kerning is never applied, and requests for it will be ignored (
fontmanager.error_on_kerning
).
- Transformation matrix is supported.
- Right-to-left rendering is not supported.
- Cairo rendering will always blend to the background, even when not requested.
OS_ChangedBox
is updated at the completion of font rendering.
- Font string control codes support:
- Control codes are supported in all the supported SWIs.
- Move x/y are supported.
- Select font is supported.
- Underline position and thickness is supported, but only works reliably for horizontal text.
- Colour selection by GCOL/RGB are supported.
- Matrix is supported.
- Comment is supported.
Font_ScanString
support:
- Control codes are supported.
- Coordinates blocks are not supported.
- Matrix is supported.
- Kerning is not supported.
- Right-to-left is not supported.
- Returning matrix is not supported.
- Split character is supported.
- Returning split count is supported.
- Returning matrix is supported.
- Maximum x and y offset are supported.
- Current and future contexts are supported (
Font_CurrentFont
, Font_CurrentRGB
, Font_FutureFont
, Font_FutureRGB
).
- The colours returned are the colours selected in the current mode. In Classic FontManager these calls would return the supplied colours.
Font_ListFonts
support:
- RISC OS 2 compatible mode defaults the enumeration parameters.
- Font identifier and local font names are supported, although local name is always the same as the font identifier.
- Termination with CR and NUL are supported.
- Returning a list of encodings is supported.
- Font menu definition is supported.
- Encoding menu definition is not supported.
Font_DecodeMenu
support:
- Regular font menus are supported.
- Encoding menus are not supported.
Font_SetPalette
support:
- Palette gradient is applied in linear RGB space.
- Compatibility and
TRUE
RGB values are supported.
Font_SwitchOutputToBuffer
support:
- Redirection to a buffer is not supported.
Font_SetColourTable
support:
- Only the start and end of the table are supported.
- Notification of the colours without a table is supported.
- Font identifiers in font strings (
Font_FindFont
, Font_ApplyFields
, Font_FindField
) are described as being terminated by spaces in the PRMs. This is never the case, and cannot be made optional as spaces are already declared as significant in the documentation.
FontV
is not used by FontManager by default, but can be configured (fontmanager.fontv
):
R8
on entry is the SWI offset, as per the DrawV
precedent.
R8
should be set to -1 on return if the SWI has been handled (which differs from DrawV
).
- CLI commands:
*FontCat
is supported, and can take an extra -encodings
parameter to list font encodings instead of fonts.
*FontList
is supported.
- Size and dots-per-inch are listed, although DPI is not applied anywhere.
- Usage count is supported.
- Age is supported, as 'Recency' counter.
- Cache data size is not reported (there is no cache data).
- Unsupported:
*FontInstall
, *FontRemove
, *FontLibrary
, *LoadFontCache
, *SaveFontCache
.
Filesystem
- Only a host filesystem is implemented.
- Filesystems cannot be registered with the built in system (although their registration can be ignored with
register_filesystem
).
- A RISC OS Classic
FileSwitch
may be loaded which allows regular filesystems to be used.
- Filenames are passed through GSTrans to expand variables.
- Filesystem operations are passed through vectors as expected.
- Opening and accessing files which are already open for write can now be checked (
filesystem.check_open_files
).
- Only a single 'host' filing system supported; temporary and current filing systems are not supported.
- The base of the native filesystem can be configured (
filesystem.native_directory
).
- The encoding used for the native filesystem can be configured (
filesystem.native_encoding
).
- The encoding used for RISC OS filesystem can be configured (
filesystem.riscos_encoding
).
OS_File
is fully implemented, for the limitations of the host system.
- Load actions are supported.
- Loading Generic Code (&F95) files will synchronise code areas, but can be disabled (
filesystem.load_gencode_synchronises
).
- Timestamping will be applied based on the load and exec addresses supplied.
- An error will be reported if the memory required for loading files is not present.
- Native filesystem operations treat filetypes as
,xxx
extensions, and load/exec addresses as ,llllllll,eeeeeeee
extensions.
- Native files with the executable bit set will be treated as filetype
UnixEx
(filesystem.unix_executable
). They can be executed if pyromaniacmodule.unixexecutable_enable
is set.
OS_Find
can open and close files.
- Error handling, and the extra bits on open are not well supported.
- Close all files on current filesystem can configurably report an error, or ignore the request, but it won't close the files.
OS_Args
can read the EOF state, pointer, extent and allocated space, path name.
- SCB flags are partially supported.
- Temporary filesystem read by
OS_Args 0,0
returns as 0 (no filesystem).
OS_Byte
can be used to read the EOF state of a file.
OS_BGet
/OS_BPut
can read and write a byte, and report EOF condition followed by errors on subsequent reads.
OS_GBPB
can read and write multiple bytes, and supports the directory enumeration interfaces.
- Enumeration can be configured to return results like FileCore, or more efficiently (
filesystem.enumerate_last_chunk
).
- Enumeration can be configured to return the context offset either in monotonically increasing values or a variety of other ways (
filesystem.enumerate_context
).
- Enumeration supports wildcards.
- Enumeration buffer can cause the buffer to be corrupted (
filesystem.enumerate_corrupts_buffer
).
OS_FSControl
is vectored, but only a few interfaces are supported:
- Shutting files is supported, but generates an explicit error.
- Changing and unseetting the current directory, library and URD are supported.
- Changing and reading directories 'unchecked' is supported.
*Back
and *Up
supported.
- Unsetting directory, library and URD is supported.
- StartApplication supported, but doesn't deal with temporary filing system.
- Run file supported:
- Calls RunAbsolute for absolute files.
- Calls RunUtility for utility files.
- Calls RunUntyped for untyped files.
- RunAbsolute supported:
- Loads the code (if necesary).
- Calls the executable at &8000 for ARM code.
- Does not issue the UKCompression services.
- Checks the AIF header is present and suitable for the system (
executables.absolute_allow_unheadered
).
- RunUtility supported:
- Does not check the header.
- May not free the workspace on certain exit types.
- May run from a separate dynamic area, to identify problems more easily (
executables.utility_da
).
- Cataloguing directories (
*Cat
, *LCat
, *Ex
, *LEx
, *EnumDir
) is supported.
- Information on a file is supported for
*Info
and *FileInfo
.
*Info
can be configured to use Sys$DateFormat
value or a fixed value.
- RunUntyped supported, and executes Run actions as necessary.
*Wipe
is supported for a limited set of options (unsupported: Confirm, Date range).
*Copy
is supported for a limited set of options (unsupported: Look, User buffers, Newer, Structure only, Delete source, Prompt for disc change, Confirm, Date range)
*Count
is supported, although the Confirm option is not implemented.
*Wipe
, *Copy
, *Count
can be configured to error, warn or ignore unknown flags (filesystem.multifile_unsupported_flags
).
- Access permissions (
*Access
) are supported.
- Access permissions on native files will be synthesised when read, and translated back to native format when the permissions are set.
- Lock permissions are not supported.
- Execute only permissions are not supported.
- Rename file is supported.
- Shutdown filesystem is not supported.
- Convert filetype name to number supported.
- Convert filetype number to name supported, and can be configured to truncate or error (
filesystem.filetype_strict_range
).
- Convert file information to filetype supported.
- Canonicalise filename supported.
- Reading boot option is implemented, and returns a configured value for the host filesystem.
- Setting boot option not supported.
- Boot from filesystem attempts to execute
&.!Boot
according to the boot option.
- Reading and setting defects not supported.
- Reading free space with
OS_FSControl 49/55
is supported (configurably may return host filesystem or fixed values).
*Free
will report the free space on the currently selected directory, or a given path.
- Registering, selecting filesystems not supported.
- However, registrations can be ignored to allow the components to initialise (
filesystem.register_filesystem
).
- Reading internal file handles is supported, but without filesystems the filesystem information word is 0.
- Timestamps on objects may be configured to always return a fixed value (useful for consistency during testing).
- Filehandles are numbered from a high limit, downwards
- The upper and lower limits on the file handle numbers are configurable (
filesystem.filehandle_*
)
- File handles can be enumerated through
OS_FSControl 58
.
- 'Filesystems' (in the sense of
ADFS:<specifier>
) are not supported - everything is rooted at $
.
- Statistics can be gathered on the operations performed on files (
filesystemstatistics.enable
).
CLI
- Dispatched through
CLIV
.
- Command line buffer is 1024 bytes.
- Configurable through
progenv.cli_size
.
- Size is readable through
OS_ChangeEnvironment 33
.
- Empty commands and comments - supported.
- File execution - supported (by filename, by
/
prefix, by *Run
command)
- Aliases - supported
- Abbreviated commands - supported
- Filesystem prefix - supported if the filesystem interfaces support it (supplied interfaces do not, but classic FileSwitch does)
- Filesystem commands - supported if the filesystem interfaces support it (supplied interfaces do not, but classic FileSwitch does)
- Module name directed commands - supported (
Module#<module>
configurable)
- Commands are directed to the preferred module instance.
- Module command syntax errors support dictionary lookups.
- Redirection - recognised and stripped, but not honoured.
- GSTrans - supported
- Argument counting - supported
Service_UKCommand
- supported (LegacyBBC
python module will handle commands which don't have a space after them, eg *FX
).
Devices (I/O access)
- Joystick input is not supported.
- ADC is not supported.
- RTC (Real Time Clock) is supported.
OS_ReadMonotonicTime
implemented.
- Time reading and writing through
OS_Word 14
and OS_Word 15
is implemented.
- Operations are issued through
RTCV
.
- Time offsets may be configured, to alter the real time clock by a specified amount.
- An IIC implementation is provided which contains the PCF8583 RTC/NVRAM chip, although this is currently not used for the clock.
- Timezone is supported in the
Territory
module as the host time zone.
RTCHWDS1307
module can be enabled to use the DS1307
IIC RTC chip.
RTCHWDS3231
module can be enabled to use the DS3231
IIC RTC chip.
RTCHWPCF8563
module can be enabled to use the PCF8563
IIC RTC chip.
RTCHWPCF8583
module can be enabled to use the PCF8583
IIC RTC chip (as used in the RiscPC).
- Parallel devices are supported through different implementations in the ParallelDeviceDriver.
- Implementations are provided for:
null
- tracks state only.
file
- writes to (or reads from) native files.
socket
- connects to a remote server and diverts input and output to it.
- Does not support
parallel:
filing system.
OS_SerialOp
is supported to access serial implementations.
- Issued through
SerialV
.
- Implementations are provided for:
null
- ignores all access to the serial port.
file
- reads and writes from files on disc.
pyserial
- access to real serial devices through the pyserial python module.
- Does not support
serial:
filing system.
- GPIO access is supported through the
GPIO
module.
- Implementations are provided for:
null
- does not provide any pins.
static
- provides static values on pins and ignores outputs.
mcp2221
- provides access to external GPIO pins through MCP2221 USB IIC/GPIO interface.
pcf8574
- uses the IIC
module to access GPIO pins on a PCF8574.
pcf8575
- uses the IIC
module to access GPIO pins on a PCF8575.
mcp23008
, mcp23017
- uses the IIC
module to access GPIO pins on the MCP23008 and MCP23017 devices.
pigpio
- uses the pigpio
Python module to access GPIO pins on a Raspberry Pi.
rpigpio
- uses the RPi.GPIO
Python module to access GPIO pins on a Raspberry Pi.
ch341
- provides access to GPIO pins through CH341 USB IIC/GPIO interface.
wx
- provides GPIO pins within the WxWidgets UI for both input and output.
- IIC access is supported through the
IIC
module.
- Implementations are provided for:
internal
- provides registered handlers, and a PCF8583 Clock/RAM chip.
null
- ignores writes and returns 0 for all reads.
mcp2221
- provides access to external devices through MCP2221 USB IIC/GPIO interface.
pigpio
- provides access to I²C through the Raspberry Pi's ports, or over the network.
cp2112
- provides access to I²C through CP2112 IIC/GPIO interface.
ch341
- provides access to I²C through CH341 USB IIC/GPIO interface.
- Internal IIC implementations are configurable (
iicinternal.devices
) and listable (--list-iic-devices
):
aht10
- AHT10 temperature/humidity sensor.
ds1307
- DS1307 RTC/CMOS.
ds3231
- DS3231 RTC.
lm75
- LM75 temperature sensor.
max30205
- MAX30205 temperature sensor.
mcp4725
- MCP4725 DAC.
mcp9808
- MCP9808 temperature sensor.
pcf8563
- PCF8563 RTC.
pcf8583
- PCF8583 RTC/CMOS storage.
- MIDI is not supported.
- Econet is not supported.
Sound
- Internal
SoundChannels
module provided, playing back sound through MIDI.
- Voices are supported only as MIDI voices:
- The default voices are mapped to approximately sensible MIDI voices, and may be configured.
- Voice information can be read.
- MIDI channels are only configured on first use, to avoid affecting existing MIDI usage if no sound is output.
- Global volume supported.
- Sound operations are passed through the Python rtmidi module.
- Gate only, no parameter modification.
- Sounds are asynchronous and up to 16 channels can in theory be used (although only 8 currently supported).
- Sound buffering can be configured to work like RISC OS or the BBC (actually defaults to BBC, because it's a much nicer system).
- Tuning is not supported.
*Voices
, *ChannelVoice
and *Sound
supported.
OS_Byte 210
to suppress sound is supported (not documented in the PRM, but supported by RISC OS Classic).
Service_SoundControl
- issued and if claimed will abort processing.
Service_Sound
- issued on initialisation and finalisation.
- Does not issue service on startup.
SoundDMA
is supplied as a stub which only tracks state.
- This means no sampled sound output.
- 16bit sound extension SWIs are not supported.
Sound_Configure
- supported but only tracks state.
Sound_Enable
- supported but only tracks state.
Sound_Stereo
- supported but only tracks state, and does not quantise stereo positions.
Sound_Speaker
- supported but only tracks state.
Sound_Mode
- not supported.
Sound_LinearHandler
- not supported.
Sound_SampleRate
- not supported.
*Audio
, *Speaker
and *Stereo
are supported through calls to the above SWIs.
*Stereo
can also report the current state of the stereo position (not supported under RISC OS Classic).
SoundScheduler
is supplied and can schedule playback.
SoundScheduler
may call the SWIs for requested beats.
- The code interface provided by
Sound_Schedule
and Sound_Schedule32
is not supported.
- The accuracy of scheduled dispatch is limited by the ticker events, so cannot be greater than a scheduled call per centisecond.
Sound_QBeat
may report beats according to time values returned from the system clock (sound.scheduler_type
).
SharedSound
not provided (without SoundDMA
it isn't useful).
Networking
- Simple
Internet
module providing a native socket interface.
- Only some of the SWIs are sending and receiving data (
recv
, recvfrom
/_1
, sendto
, sendmsg
/_1
, read
, write
).
- New style and old style calls have differing degrees of support (mostly this relates to the
sockaddr
structure layout).
Socket_Ioctl
supports some operations:
- Non-blocking configuration (
FIONBIO
)
- Data in buffers (
FIONREAD
and FIONWRITE
- new to RISC OS)
- Asynchronous notifications (
FIOASYNC
)
- Interface information reading (
AF_INET
, AF_LINK
and AF_INET6
) (SIOCGIFCONF
)
- Interfaces are ordered to try to return the most useful first (loopback, multicast, broadcast, point-to-point), but otherwise keep the host order.
- Interface names will be converted to RISC OS format (specifically this applies to Windows where the long UUIDs will be converted to numbered 'host' interfaces).
- Addresses follow the standard sockaddr_in6 and sockaddr_dl (
SIOCGIFADDR
)
- Flags for the interface are translated to give RISC OS style flags, possibly synthesised on Windows (
SIOCGIFFLAGS
)
- Broadcast addresses can be read (
SIOCGIFBRDADDR
)
- Netmask addresses can be read (
SIOCGIFNETMASK
)
- Destination addresses can be read (
SIOCGIFDSTADDR
)
- MTU can be read (
SIOCGIFMTU
)
- Destination addresses are not supported (
SIOCGIFDSTADDR
)
- Metrics are supported, but return a fixed value (
SIOCGIFMETRIC
)
Socket_Select
supported.
Socket_Setsockopt
supports the some of the options:
- Many socket options at level
SOL_SOCKET
are supported, if they are supported by the underlying system.
IPPROTO_IP
options which require a single byte or word are supported. This means that the multicast interface and membership options are not supported.
Socket_Recvmsg
and Socket_Recvmsg_1
are partially implemented. The socketextra
package is required to provide support for reading the iovec and control messages, however the sockaddr structure will not be populated. Simple requests without control messages may fall back to recvfrom
instead.
- Blocking operations will block tickers from happening.
- Asynchronous sockets will trigger
Event_Internet
in the background:
- The situations in which the events are called may differ slightly from the original implementation.
- No
Socket_InternalLookup
support, which means kvm
access to read statistics and interface hardware information is not possible the way that it used to be done.
AF_LINK
sockets can be used to read the interface hardware addresses. A modified version of ifconfig
is required to take advantage of this.
- No routing information available (
AF_ROUTE
sockets on the host system may not work as expected by RISC OS, although you can still use them but must know about the host representation)
- On startup, initialises
Inet$Hostname
and Inet$LocalDomain
with values from the host system.
- Unimplemented SWIs:
Socket_Shutdown
, Socket_Getsockopt
, Socket_Stat
, Socket_Readv
, Socket_Writev
, Socket_Sendtosm
, Socket_Sysctl
, Socket_InternalLookup
, Socket_Filter
.
*InetStat
supports only simple information on open sockets.
- The module's operation can be disabled through a configuration option.
- Resolver module provides limited functionality.
Resolver_GetHostByName
supported for remote names.
- Local hosts file is supported through
InetDBase:hosts
, configurably (resolver.hosts_file
)
- Lookup through LanManFS not supported.
- Lookup through ResolverMDNS not supported.
- Lookup through Freeway not supported.
Resolver_GetHost
not supported.
- No services issued on resolution.
- Configuration of resolver is limited.
- The
Resolver_CacheControl
SWIs are supported as stubs.
- The module itself may be disabled through a configuration option (
resolver.enable
).
*ResolverConfig
is implemented.
- System variables are supported like in RISCOSSelect.
Inet$Hostname
raises Service_InternetVars
when changed, validates host name and updates Inet$LocalDomain
if multiple components are specified.
Inet$LocalDomain
raises Service_InternetVars
when changed and validates the domain.
Inet$Resolvers
raises Service_InternetVars
when changed, but does not issued the 'reordered' service. The list of resolvers is not used.
InetDBase$Path
raises Service_InternetVars
when changed.
- Network applications will probably fail if they attempt to read the internet database (
InetDBase$Path
) files, such as InetDBase:Services
, if these are not available in the filesystem.
Misc (Miscellaneous Kernel functions)
OS_CRC
supported.
OS_ReadArgs
supported.
OS_SubstituteArgs
/ OS_SubstituteArgs32
supported.
OS_EvaluateExpression
supported, although some of the operators are not yet implemented.
OS_Confirm
supported.
- Multiple implementations (
osconfirm.implementation
).
- Default
riscos
implementation provides the usual pointer based confirmation:
- Configurable to allow the display of a message when a confirmation response is required.
- Configurable to program the pointer and read the mouse buttons for input.
- The characters used for confirmation are configurable (in RISC OS Classic the characters were defined in the Kernel Messages file).
yes
, no
and escape
implementations always return a given result.
wxwidgets
implementation uses a native dialogue box for a response.
OS_ClaimOSSWI
supported.
OS_ClaimProcessorVector
supported, although only the undefined instruction vector has been heavily tested.
OS_Reset
supported (configurable whether it resets or exits, and may explicitly exit with 'power off' extension).
MessageTrans
- Implemented as a module, which can operate in one of 3 ways:
none
: All SWIs return errors
simple
: All SWIs return as if they file were open and give either a fake response, or the default value. Useful for testing when the expected Messages files do not exist.
full
: A full implementation which reads Messages files and returns tokens properly. Not actually a 'full' implementation right now as some SWIs are not implemented.
MessageTrans_Lookup
error behaviour on short buffers is now configurable (messagetrans.overflow_error
).
- In
simple
configuration:
MessageTrans_ErrorLookup
supported to pass through the error code, as a simple means by which errors can be reported (as this SWI is commonly used to report errors, it is better that it return a useful message, rather than 'SWI not known').
MessageTrans_OpenFile
, MessageTrans_CloseFile
return without doing anything.
MessageTrans_FileInfo
returns a fake size.
MessageTrans_ErrorLookup
, MessageTrans_Lookup
, use the default value supplied. If no default is supplied, a message based on the token and parameters is generated.
MessageTrans_GSLookup
works as MessageTrans_Lookup
but then GSTrans's the output.
MessageTrans_MakeMenus
is supported, but will report values as for MessageTrans_Lookup
.
MessageTrans_CopyError
is supported.
- In
full
configuration:
- Never directly accesses files in memory (ResourceFS access is more costly).
- Always loads the files into memory.
- Error numbers are not returned correctly.
- Default dictionary is not supported.
- Other SWIs should operate as expected.
ProgEnv (Program environment)
- The environment runs utilities (&FFC) and absolutes (&FF8) in 32bit USR mode.
OS_GetEnv
/OS_WriteEnv
supported.
OS_UpCall
supported.
OS_ChangeEnvironment
and its deprecated friends are implemented.
- Pass through
ChangeEnvironmentV
.
- MemoryLimit is set on boot, and updated in the application space DA handler on resize.
- ApplicationSpaceSize is set on boot, and updated in the application space DA handler on resize.
- Error handler is called when an error is raised within an entered module or application.
- UpCall handler is called when
OS_UpCall
is issued.
- Abort handlers called when exceptions are raised, and the default handlers generate errors as expected. Types of aborts are reported according to the
IFSR
or DFSR
.
- New BranchThroughZero handler (32) is called on detecting execution at address 0.
- ExceptionDumpArea is implemented and is used by the default handlers.
- New ExceptionDumpRegion handler (33) is implemented to capture the code around the execution address on aborts.
- Non-transient callbacks are dispatched but don't always work as expected (
OS_SetCallBack
and exits from Escape and Event handlers are honoured).
- Escape conditions should be honoured and processed by the environment handlers as expected. Acknowledging escape generates most of the same side effects as RISC OS would (although some are incomplete).
- Exit handlers are called as expected on application exits; the default handler exits the environment.
- Event handler is not implemented (will not be called for events).
- UpCall handler is implemented (will be called for events).
- Breakpoint handler is not implemented.
- OtherExceptionHandler is never called.
- CAOPointer is supported, but not used properly for application startup.
- Special handler 33 has been defined to be report the space used by the command line, and how large it is.
OS_EnterOS
/OS_LeaveOS
are implemented (sorry) as they are used as part of the test framework.
OS_IntOn
/OS_IntOff
are implemented, but may be configured to report errors.
OS_CallASWI
/OS_CallASWIR12
are implemented internally.
- Transient callbacks (
OS_AddCallBack
/OS_RemoveCallBack
) are supported, and will be triggered when the OS is returning back to USR mode.
- Interrupt signals (Ctrl-C on POSIX tty systems) are trapped and will be passed as an Escape (regardless of the definition of the escape key) to the system.
- Break/Escape actions and effects are not currently supported completely.
- Break is not generatable.
- Escape is generated by Ctrl-C, or by the defined escape character.
- Escape may be disabled (
OS_Byte 200
).
- Escape effects (
OS_Byte 230
) are supported.
Event_Escape
is raised if enabled.
- Escape is not passed through the buffer system.
Errors (Error handling)
- Data aborts, prefetch aborts and undefined instructions are passed to the exception handlers as expected. May be configured to display the registers at the time of the exception automatically.
- Additional information is available when the trace interface is in use.
- The region for the address being reported may be reported in the error message.
- C backtrace may be available if it is recognised by the trace system.
- A new environment handler is used to report Branch Through Zero.
- A new environment handler records the instructions leading up to the exception address.
- Failures within the Utility or Absolute code through
OS_GenerateError
are reported as such from the tool.
- Failures within the Python, will be reported through backtraces, which is converted to a hardware error in RISC OS.
- Errors raised within an entered module or absolute will cause the Error handler to be called as expected; if the default handler is present, these will cause the system to exit.
- Errors are passed through
ErrorV
.
- Error pointers are checked for validity and may be replaced:
- A pointer of 0 is configurable with
error.nullpointer_effect
to either pass the null pointer on (passthrough
), generate an explicit Null error pointer
message (message
), or report the string ofla
(ofla
).
- A pointer to invalid memory of 0 is configurable with
error.invalid_effect
to either pass the null pointer on (passthrough
) or generate an explicit Invalid error pointer
message (message
).
- A pointer to an unaligned address is configurable with
error.unaligned_effect
to either pass the null pointer on (passthrough
) or generate an explicit Unaligned error pointer
message (message
).
- These checks will be reported through the trace system as warnings.
Booting
- By default the system sets up a minimal environment, but passes through many of the stages which were originally performed by RISC OS Classic.
- As not all of the boot-time operations are relevant to the Pyromaniac system, they may not all be issued. A non-exhaustive list of the start up operations (see
riscos/kernel.py
in Kernel.initialise
/Kernel.boot
/Kernel.system_boot
for more information):
- Creation of system dynamic areas.
- Initialisation of the SVC stack (with a BTS-aware initialised base).
- ROM module initialisations.
- Podule module enumeration and module initialisations.
- Module initialisations.
- Alphabet configuration.
- Memory size configuration (not supported).
- Configured filesystem selection (not supported).
Service_PostInit
issued.
- Queued transient callbacks called.
- Mode selection (configurable).
- Startup banner (configurable).
Service_Reset
.
- Startup bell (configurable).
- System boot (which is the running of the boot sequence, etc) is not performed by default. When enabled it triggers:
- Boot from filesystem (configurable).
- Boot into configured language (not supported).
- Run BootMenu (configurable).
- Enter supervisor (configurable).
- The system startup is intended to be able to provide enough to start tools, without precluding the ability to initialise as a full startup which loaded RISC OS modules might expect.
Desktop
- No
WindowManager
module is supplied, but certain SWIs and commands are supported to ensure that command line tools operate as expected.
- The RISC OS Classic
WindowManager
will work with a few small modifications for AMB operations.
Wimp_ReportError
provides an interface to report errors and get responses from the user.
Service_WimpReportError
is raised for the start and end of the call.
Service_ErrorStarting
, Service_ErrorEnding
, Service_ErrorButtonPressed
are issued, but are not restartable.
- RISC OS 3.5 categories are supported.
- RISC OS 3.5 additional buttons are supported.
- Application names are supported by querying
Wimp_ReadSysInfo
and TaskManager, defaulting to 'application'.
- Sprites are included within the WxWidgets implementation.
- Serious errors are recognised from the error group and a special list of numbers, and produce the RISC OS 3.5 style 'Application has gone wrong' messages.
- Five implementations are provided.
null
which does nothing.
vdu
which outputs the information on the VDU stream.
graphics
which outputs a graphics representation like RISC OS Classic.
easygui
which opens dialogues on the native system.
wxwidgets
which provides a native dialogue when WxWidgets is used for the graphics implementation.
Wimp_ReadSysInfo
provides a stub for a few functions.
Wimp_ReadSysInfo 0
: Task count is configurable with wimpreadsysinfo.task_count
.
Wimp_ReadSysInfo 1
: Mode is configurable with wimpreadsysinfo.mode
.
Wimp_ReadSysInfo 2
: Sprite suffix is configurable with wimpreadsysinfo.iconsprites_suffix
.
Wimp_ReadSysInfo 3
: Desktop state is configurable with wimpreadsysinfo.desktop_state
.
Wimp_ReadSysInfo 7
: Window manager version is configurable with wimpreadsysinfo.wimp_version
.
Wimp_ReadSysInfo 8
: Returns the font handles that would be used by Wimp_TextOp
.
Wimp_ReadSysInfo 11
: Returns the application space size from the environment.
Wimp_ReadSysInfo 16/19
: Returns the sprite pool bases for the ROM, RAM and priority pools.
Wimp_SpriteOp
can use configurable sprite pools to access sprites.
WimpSpritePool
module manages the sprite pool.
wimpspritepool.rom_native_filename
/ wimpspritepool.rom_filename
populates the ROM sprite pool on use.
wimpspritepool.ram_native_filename
/ wimpspritepool.ram_filename
populates the RAM sprite pool on use.
wimpspritepool.priority_native_filename
/ wimpspritepool.priority_filename
populates the RAM sprite pool on use.
wimpspritepool.protect_rom_sprites
changes the order of searching for named sprites.
*IconSprites
is provided by the WimpSpritePool
module to populate the sprite pool.
*IconSprites
on its own will list the contents of the sprite pool.
*ToolSprites
is provided by the WimpSpritePool
module.
Wimp_BaseOfSprites
is supported.
Wimp_CommandWindow
provides a rendering of the class command window used by the WindowManager.
- The state of the window manager can be passed through to the
Wimp_ReadSysInfo 3
variable.
- The window colours are configurable through
wimpcommandwindow.colour_*
.
- The window can be configured to appear immediately, rather than waiting for output with
wimpcommandwindow.immediate_effect
.
- The command window uses the font provided by
Wimp_TextOp
.
Wimp_TextOp
can be used to render text in a similar manner to the WindowManager in RISC OS Classic.
- No 'current redraw window' is present, and requesting positions relative to it will produce an error.
- The default font name and size used are configurable through
wimptextop.font_*
.
Wimp$Font
, Wimp$FontSize
and Wimp$FontWidth
are set up as code variables from their first use, which have immediate effect when changed.
Wimp_TextOp 0-3
are implemented.
Wimp_TextOp 4
(truncate with ellipsis) is not implemented.
Wimp_SetColour
can be used to select a graphics colour (GCOL
) using Wimp colours.
Wimp_TextColour
can be used to select a text colour (COLOUR
) using Wimp colours.
Wimp_SetPalette
/Wimp_ReadPalette
can be used to retriecve or manipulate the Wimp colour palette.
Wimp_SetMode
will change mode immediately.
Wimp_PlotIcon
can be used to render icons.
- Some validation strings (specifically those affecting rendering) are supported:
R
: border types are supported, with the slab in colour (or C
overrides).
A
: allowed characters are understood, but not used by the renderer.
D
: password obscuring is supported.
F
: font colours are not supported.
C
: 24bit colour specification is supported (wimpicon.validation_c
).
K
: key actions are understood, but not used by the renderer.
L
: multi-line text is supported. RISC OS Classic did not support alignments of the multi-line text, but RISC OS Pyromaniac may use all the alignments (wimpicon.multiline_alignment
).
P
: pointer sprite is not supported.
S
: sprite name is supported, and uses the selected sprite if both are supplied.
T
: tinting is not supported.
X
: iconbar resizing is not supported (and wouldn't be used by the renderer).
Y
: flags are supported, but not used by the renderer.
- Icon flags are partially supported, where they relate to rendering:
- Horizontal, vertical and right-justified flags are supported, and should function as in RISC OS Classic.
- Selected and shaded icons are supported.
- Bordered and filled icons are supported.
- Half-size sprites are supported.
- Icon fonts using specified handles are not supported.
- Deleted icons are supported (won't be drawn).
- Colours are mostly supported (Wimp colours,
R
-validation colours, C
-validation colours, selection and shaded colours).
- Icon data types are mostly supported (indirected, text and sprite, in all combinations).
- Sprite selection colours use inversion (as pre-RISC OS 4).
- Sprite shading colours may use lighten to grey, grey and lighten (as pre-Select), or blend to background (as in RISC OS Select) (
wimpicon.shaded_style
).
- Deep sprite colour mapping (and thus selection and shading of deep sprites) is not supported.
- Extended
KSAT
form of Wimp_PlotIcon
is mostly supported.
- Coordinate offsets are supported.
- Background colour specification is supported.
- Window handle specification is not supported.
- Default sprite area specification is not supported.
- Highlight flag is not supported.
- VDU mode reverts to VDU 4 after rendering, rather than staying in VDU 5 mode.
- Window operations are only supported in a limited way:
- Window operations are visual only - you cannot interact with them.
- There is no window stack, so windows are only drawn when
Wimp_OpenWindow
is issued.
- Windows are not redrawn if their position or state is changed.
- Some of the window flags are supported:
- Old style flags are promoted to new style.
- Title bar text is supported and will be rendered.
- Windows are not moveable by the user.
- Hotkeys are not supported (as there is no polling).
- Window user redraw is not supported.
- Pane windows are not treated any differently.
- Windows are not bounded to the screen.
- Horizontal and vertical scroll bars are supported.
- Background and forground window flags are not supported.
- Back and close icons are drawn as placehoders.
- Maximise icon is drawn as a placeholder.
- Status flags (bits 16-20) are not supported.
- Real colour flag is not supported.
- Extra flag for true colour is supported (and the 'C' validation is honoured).
- Extra flags for 3D borders are not supported.
- Extra flag for returning shaded icons is supported.
- Window nesting is not supported.
- 3D window borders are not supported.
- Windows without frames are not supported.
- Window handles follow the pattern of handles from RISC OS Classic, but are not references to memory.
- Icon redraw is clipped to the window.
Wimp_CreateWindow
will create a window and return a handle.
Wimp_GetWindowState
will return the current state of the window.
Wimp_OpenWindow
will immediately redraw the window in the new position.
Wimp_CloseWindow
changes the window flags, but has no visual effect.
Wimp_DeleteWindow
will delete the window from those known, but not remove it from the screen.
Wimp_GetIconState
, Wimp_SetIconState
, and Wimp_ResizeIcon
are supported, although they will not redraw without a Wimp_OpenWindow
.
Wimp_WhichIcon
is supported.
Wimp_GetPointerInfo
is supported, with the window flag for returning shaded icons.
Wimp_CreateIcon
and Wimp_DeleteIcon
are supported, but never reuse deleted icons.
Wimp_GetWindowState
and Wimp_GetWindowInfo
are supported.
Wimp_OpenTemplate
, Wimp_LoadTemplate
, Wimp_CloseTemplate
are supported, although fonts are not applied.
Wimp_SetCaretPosition
and Wimp_GetCaretPosition
are supported, although they have no visual effect.
Wimp_SlotSize
is supported.
WimpCommands
module provides some commands which are usually handle by the WindowManager.
*WimpMode
will decode the mode string and issue a Wimp_SetMode
.
*WimpSlot
will modify the current application space, but does not record the next slot size
TaskWindow
module is supplied, which can return a configurable state for TaskWindow_TaskInfo
.
TaskManager
module is supplied, which returns a list containing only itself when enumerating tasks (configurable).
*TaskManager_Acknowldgements
displays the acknowledgements to the VDU stream.
- Tasks returned by the enumeration can be configured.
- Task name termination is configurable as 0-termination or CR-termination.
Invocation
- Configuration of the emulated system is possible through command line switches (
--config <system>.<var>=<value
).
- Internal modules can be enabled by command line switch (
--load-internal-modules
). They may be disabled by using the unplug configuration (--config modules.unplug=<modules-list>
).
- RISC OS Modules can be loaded by command line switches (
--load-module <file>
and --load-rom-module <file>
)
- System variables can be set by a command line switch (
--set-variable <var>=<value>
)
- Invocation allows:
- Running of utilities (specify native filename).
- Running of absolutes (specify native filename).
- Entering modules (
--enter-module <module>
)
- Executing module commands (
--command <command>
). May be specified multiple times.
- On exit,
Service_PreReset
will be issued (configurable with pyro.reset_effect
).
- Total execution time can be limited (
--config emulation.runtime_limit=<seconds>
).
- When multiple actions (commands, module entry, system boot, etc) are performed, the terminating behaviour is:
- They will terminate when an error is returned.
- If
pyro.stop_on_failing_rc
is enabled, execution will terminate once Sys$ReturnCode
is non-0.
- If
pyro.return_rc
is enabled, the tool's exit code will be set to 1 if a RISC OS error occurred, or the Sys$ReturnCode
value. If the option is disabled, the exit code will be either 0 or 1, based on those same conditions (ie 0 is success, and 1 is failure).
- Terminating messages are configurable, and may be written to stdout, stderr or to the RISC OS drivers (
--config execute.output
):
- Errors generated are printed by default (
--config execute.error_template
).
- Exit is silent by default (
--config execute.exit_template
).
OS_Reset
prints a message by default (--config execute.reset_template
).
- Signals to the system are handled in a logical way:
SIGINT
(usually Ctrl-C) is passed to the OS as an Escape key (regardless of the configuration of the Escape key code).
SIGTERM
has the usual behaviour of terminating the application.
SIGUSR1
will report the current execution location to the trace stream.
- Exit codes for the tool are dependant on the type of error (see
--help-exit-codes
):
- Exits with errors (SWIs generating errors without the X bit) will return a non-0 return code.
- Successful exit with
OS_Exit
(or through MOV pc, lr
in the case of Utilities and module commands) will return a 0 return code, or the return code of the OS_Exit
SWI if ABEX
was supplied.
- Aborts return code 125.
- Failure during the booting (usually module errors) return code 124.
- Incorrect configuration returns code 123.
- Bad command arguments returns code 122.
- Exit due to a reboot (
OS_Reset
) returns code 121 (configurable whether a reboot restarts the system).
- Exit due to a timeout returns code 120.
- Exit due to explicit termination (such as by closing the UI window) returns code 119.
- Pyromaniac Command server (
pyro-server
) allows starting a RISC OS to run commands within a Unix environment.
- Runs RISC OS commands through the
pyro-client
tool, within the server environment.
- Client returns RISC OS command return codes on exit.
- The RISC OS server continues running after the commands executed through the client exits.
SysRqs (System requests)
- System requests ('SysRqs') provide interfaces to access the internals of the Operating System implementation:
- Subsystems have commands related to the operations they perform.
- System requests are exposed through internal interfaces and a line-based TCP server (
sysrqserver.enable
).
- The TCP server provides human readable responses to requests.
- UI implementations use the SysRqs system to query the internal state of the Operating System.
- System request subsystems provide access to different areas, prefixed by the subsystem name:
ambs
- Application space management.
clipboard
- Access to the ClipboardHolder data.
config
- Pyromaniac configuration.
debug
- Pyromaniac debug and tracing.
dynamicareas
- Dynamic area memory management.
fs
- Filing system.
graphics
- Graphics and VDU systems.
internet
- Network system.
input
- Access to the input system.
memory
- Access to logical memory.
regs
- Access to ARM registers.
nvram
- Access to NVRAM configuration bytes.
modules
- Relocatable module system.
sysvars
- Access to system variables.
tasks
- Wimp task information
tickers
- Access to the ticker list.
timings
- Timings system.
PyModules (Supplied Modules)
SystemBell
- generates a bell through the regular SoundChannels
interface, or through the console depending on configuration.
systembell.implementation
controls the bell's effect.
- Implementation
sound
issues the Sound_Control
calls in the regular way.
- Implementation
console
issues a bell through the console.
- Implementation
message
prints a message to the RISC OS output.
- Implementation
wxwidgets
uses the host system bell when used with the WxWidgets UI.
SoundDMA
- stub implementation which just tracks configured values.
SoundChannels
- sound implemention that uses python-rtmidi
.
- This provides asynchronous sound with up to 15 channels.
- May provide a BBC-style buffering system for the
SOUND
calls, in addition to the RISC OS system. The BBC would buffer notes and could play multiple notes simultaneously, with the next starting when a note on the channel completed. The RISC OS system only plays notes immediately.
- MIDI instruments can be selected by choosing the voice configuration with
sound.voice_*
settings.
- See the Sound section for more detail.
SoundScheduler
is provided and can play synchronised notes.
IIC
- a means of communicating with the I²C hardware, provided as implementations. See the 'Devices (I/O access)' section for more details.
Internet
- an implementation of the BSD Sockets interface, as provided by the Internet 5 module. See the 'Networking' section for more specific implementation details.
Resolver
- a simple implementation of the DNS resolver. Does not support background operations. See the 'Networking' section for more specific implementation details.
TWIN
- a rudimentary command handler for *TWIN
which allows BASIC TWIN
commands to launch an editor. The host's nano
editor (configurable through the texteditor
configuration) is invoked on the BASIC program.
*Edit
command allows the same functionality for other text files.
LegacyBBC
- provides some older interfaces from the BBC:
*FX<number>
support (and *Key
, *TV
, and *Opt
) without spaces
OS_Byte 160
legacy interface to OS_ReadVduVariables
(required for ARMBasicEditor, not supplied).
OS_Word 7
(SOUND) is passed to Sound_Control
OS_Word 8
(ENVELOPE) is recognised and ignored.
- Configurable with
legacybbc.enable
for the module's availability, and legacybbc.warnings
for any use of its interfaces.
BASICTrans
- provides a translation of some messages used by the BASIC module.
TaskWindow
- dummy module which always returns that we are not in a TaskWindow (configurable).
TaskManager
- dummy information on the system's tasks.
- Allows enumeration of the Tasks present on the system (only the TaskManager itself is present; configurable).
*TaskManager_Acknowledgements
displays the acknowledgement results for the system.
DDEUtils
- provides only a few interfaces:
- The extended command line interface is supported.
- Throwback SWIs are supported, and have multiple implementations:
null
- does nothing.
console
- writes the throwback information to the console, and may be configured to use links to open the referenced files.
posturl
- sends the throwback information to a remote URL.
Portable
- Provides multiple implementations to read the system state.
- Can power off the system, and may pass through the host power state.
Portable_Idle
will sleep for a centisecond.
psutil
implementation reports host battery time.
osx
implementation reports most variables from the host system.
- Services are not issued.
- Events are never issued.
Territory
- Stub implementation, which only supports a few SWIs.
- Supported territory SWIs:
Territory_Number
, Territory_NumberToName
, Territory_NameToNumber
.
- Supported alphabet SWIs:
Territory_AlphabetNumberToName
, Territory_SelectAlphabet
, Territory_WriteDirection
- Supported time SWIs:
Territory_ReadCurrentTimeZone
, Territory_ConvertDateAndTime
, Territory_ReadTimeZones
, Territory_ConvertStandardDateAndTime
, Territory_ConvertStandardDate
, Territory_ConvertStandardTime
, Territory_ConvertTimeToOrdinals
, Territory_ConvertOrdinalsToTime
, Territory_ConvertTimeStringToOrdinals
.
- Supported character SWIs:
Territory_CharacterPropertyTable
, Territory_LowercaseTable
, Territory_UppercaseTable
, Territory_ReadSymbols
, Territory_ControlTable
, Territory_PlainTable
, Territory_ValueTable
.
Territory_Collate
is supported, but does not honour the ordering of alphabetic characters (unicode code point ordering is used).
- The character property tables are generated from the Unicode categories for characters in Latin 1. This means that the control characters in the C1 range (&80-&BF) will not be correct for Acorn Latin 1. The accent information is inferred, as accents are not special to Unicode, and may be labelled incorrectly.
- TimeZone information is read from the host system.
URI
- can launch URIs in the host system (configurable whether it's able to function)
- Configurable to disable the module, or disable the launching of certain schemes.
ClipboardHolder
- can transfer clipboard text to and from the host system (configurable whether it's able to function).
*Clipboard_FromFile
copies a file in RISC OS to the host clipboard.
*Clipboard_ToFile
copies the host clipboard to a file in RISC OS.
- Multiple implementations are available:
null
- does nothing
static
- holds the content and never transfers it out of the system.
pyperclip
- uses the python pyperclip package to interface with the native clipboard.
posturl
- sends clipboard contents to an external URL.
OSCommands
- provides simple CLI commands
- Supported commands:
*FX
, *TV
, *Key
, *Time
, *Quit
, *Error
, *Set
, *SetEval
, *Unset
, *SetMacro
, *Show
, *Help
, *Go
, *Echo
, *ChangeDynamicArea
, *If
.
- Missing commands:
*Ignore
, *Shadow
, *Configure
, *Status
.
*Help DynamicAreas
will list the state of the dynamic areas.
*Help
supports dictionaries.
ModuleCommands
- provides some module commands.
- Supported commands:
*RMLoad
, *RMKill
, *RMRun
, *Modules
(and *Help Modules
), *ROMModules
, *RMEnsure
.
- Missing commands:
*RMClear
, *RMInsert
, *RMTidy
, *Unplug
.
*Help Modules
includes text indicating which are internal Pyromaniac modules.
Debugger
- provides disassembly SWI and CLI commands.
- Supported SWIs:
Debugger_Disassemble
, Debugger_DisassembleThumb
, Debugger_Flags
, Debugger_DisassembleArch
, Debugger_DisassemblePlus
.
- Disassembly of FPA instructions is supported.
Debugger_Flags
is only partially supported and limited flags are supported.
- Unsupported SWIs:
Debugger_CPU
.
- Supported commands:
*Memory
, *MemoryI
, *MemoryA
, *ShowRegs
, *InitStore
, *DisassembleFlags
, *DumpI
.
*DisassembleFlags
will update the flags in the same way as the SWI Debugger_Flags
. See *Help DissassembleFlagas
for details.
- Missing commands:
*Debug
, *BreakSet
, *BreakClr
, *BreakList
, *Continue
.
- New commands:
*Vector
shows current vector claimants, or lists all the vectors.
*TickerStats
shows statistics for the ticker calls (if enabled with ticker.statistics
).
*Tickers
lists the currently claimed ticker routings.
*DumpI
disassembles a file.
- New SWIs:
Debugger_DisassembleArch
allows the disassembly of instructions for different architectures.
*ShowRegs
includes information about the exception information:
- The region is shown for LR and PC.
- The last abort information from the Kernel is shown.
- The state of
IFSR
, DFSR
, IFAR
and DFAR
are shown, if relevant.
- The disassembly of code leading up to the PC is shown, using the Exception Dump Region if present.
*MemoryI
may display disassembly with colouring if Debugger$Options
contains a C
.
*MemoryI
supports Thumb and AArch64 disassembly when the T
or 6
prefix is used.
EvaluateExpression
- provides the implementation of OS_EvaluateExpression
.
- Supported command:
*Eval
.
- May not evaluate the same as the original EvaluateExpression in some cases (particularly unary operators are not as well supported).
- Supported extensions:
LEAFNAME
, DIRNAME
, CANONICALISE
- convert argument as a filename
TIMEFORMAT
- format the current time in a given format
INSTR
- return the offset of a substring
SET
- check whether a system variable is set
MODULEVERSION
- return the version of a module * 100, or -1.
FileTypes
- sets up the system variables for the standard filetypes.
FileSwitchCommands
- provides many of the commands that were previously within the FileSwitch
module, and some that are in FSCommands
.
- Fileswitch commands supported:
*Cat
, *LCat
, *Ex
, *LEx
, *EnumDir
, *Info
, *Dir
, *Back
, *Up
, *CDir
, *URD
, *Lib
, *SetType
, *Run
, *Rename
, *Spool
, *SpoolOn
, *Copy
, *Count
, *Wipe
, *NoDir
, *NoLib
, *NoURD
, *Access
, *Stamp
.
- Fileswitch commands missing:
*Shut
, *Shutdown
.
- FSCommands commands supported:
*Append
, *Build
, *Load
, *Save
, *Delete
, *Remove
, *Exec
, *Create
, *Type
, *List
, *Print
, *Dump
, *Close
.
- FSCommands commands missing:
*Opt
.
- New commands:
*Help OpenFiles
, *Free
(previously this was in filesystem modules).
MimeMap
- provides translations between different filename formats.
- RISC OS Type (name and number), Media Types, Extensions and Mac Types are supported.
- Wildcard matching on Media Types is not supported.
- Configuration of the MimeMap file is not supported.
SpriteUtils
- provides system sprite area and the *ScreenSave
command.
*ScreenSave
- saves the screen as a sprite, but a new -native
switch allows saving in native format if the graphics implementation supports it. The Cairo implementation saves as a PNG.
*ScreenLoad
- loads the first sprite of a file to the screen.
*S<command>
- system sprite pool commands, most of which are implemented
*SList
- includes information about the sprite's size, depth and mask.
Pyromaniac
- provides an interface to the workings of the Pyromaniac system.
- All features of the Pyromaniac module are configurable, to allow the restriction of its operation within the guest:
pyromaniacmodule.enable
- controls whether any of the module functions are available.
pyromaniacmodule.debug_enable
- controls whether the *PyromaniacDebug
command is usable.
pyromaniacmodule.watchpoints_enable
- controls whether the *PyromaniacWatchpoints
command is usable.
pyromaniacmodule.config_enable
- controls whether the *PyromaniacConfig
command is usable.
pyromaniacmodule.config_allow
- provides a list of configuration groups are allowed to be accessed. If empty, all groups are allowed.
pyromaniacmodule.config_deny
- provides a list of configuration groups are not allowed to be accessed. If empty, all groups are allowed. The deny list is checked before the allow list and so takes precedence.
pyromaniacmodule.hostcommand_enable
- controls whether the *PyromaniacHostCommand
command is usable.
pyromaniacmodule.hostcommand_cwd_riscos
- controls whether the current directory is used for execution.
pyromaniacmodule.hostcommand_print_rc
- controls whether the return code is printed after execution.
pyromaniacmodule.hostcommand_output_encoding
- controls whether the output is reencoded in the current alphabet.
pyromaniacmodule.hostcommand_ansiescapes
- controls whether ANSI escapes in the output will be converted to RISC OS colour operations
pyromaniacmodule.urlcopy_enable
- controls whether the *URLCopy
command is usable.
pyromaniacmodule.unixexecutable_enable
- controls whether files with the type UnixEx
on the native filesystem can be run with the command *PyromaniacUnixExecutable
, which is assigned to the runtype for that file.
*PyromaniacFeatures
- displays this document within the emulated system, paged if configured to do so. The document may be viewed in sections for easier viewing.
*PyromaniacConfig
- interacts with the configuration system. Not all configurations will take effect immediately, and some may be destructive to the running environment, so care should be taken. Configurations may be prefixed with -help
for information on the group or option.
*PyromaniacDebug
- interacts with the debug system. All debug options should be safe to change whilst the system is running, although some may make the system unusable.
*PyromaniacWatchpoint
- provides a convenience for setting memory watchpoints.
*PyromaniacTimings
- controls the timings and counters interface.
*PyromaniacHostCommand
- executes commands on the host system. Output will be encoded to the current alphabet (controlled by output_encoding
), and ANSI escapes can be converted to RISC OS colour operations with hostcommand_ansiescapes
.
*PyromaniacUnixExecutable
- runs a native command within the RISC OS environment.
*URLCopy
- allows files to be downloaded from URLs.
OSPointer
- limited functionality for the pointer.
- Does not provide pointer operations in the way that it does under Select.
- Provides
*Pointer
command, and programs a pointer shape when selected. This command was in the WindowManager in RISC OS Classic.
Hourglass
- provides a variety of implementations:
- Implementation
vdu
and console
provide text output for the hourglass module's operations.
- Implementation
pointer
provides a pointer animation in the graphics system.
- Hourglass percentages are supported.
- Hourglass LEDs not supported.
Podule
- provides a way to load collections of modules from a ROM image.
- RISC OS Select 32bit ROM images and RISC OS 5 ROM images are supported, but it is vital that some modules be unplugged to prevent them from interacting badly with the system.
*Help Podules
gives more information on the loaded ROM images.
International
- provides alphabet translations and the selection of BBC fonts according to those alphabets.
BootCommands
- provides a few commands command:
*Do
- supported.
*X
- supported.
*AppSize
- supported, by resizing the application space.
*FreePool
- does nothing (no Free Pool dynamic area exists)
*IfThere
- supported.
SysLog
- provides the SysLog interfaces.
- Supported SWIs:
SysLog_LogMessage
, SysLog_GetLogLevel
, SysLog_FlushLog
, SysLog_SetLogLevel
, SysLog_LogUnstamped
, SysLog_Indent
, SysLog_UnIndent
, SysLog_NoIndent
, SysLog_ReadErrorMessage
, SysLog_LogComplete
, SysLog_LogCharacter
- Unsupported SWIs:
SysLog_OpenSessionLog
, SysLog_CloseSessionLog
, SysLog_LogData
, SysLog_LogFormatted
, SysLog_IRQMode
, SysLog_Control
, SysLog_Enumerate
- Session logs are not supported.
- Network logging is not supported.
- Configuration of logs is not supported.
- Background flushing of logs is not supported.
- Error messages are just tokens.
- Timestamp format is configurable.
- Default logging directory is configurable.
ColourTrans
- provides colour translation operations; see the ColourTrans section.
Zipper
- provides SWIs for reading and writing Zip archives.
- Application bound zip handles are not supported.
- Compression level is not configurable.
PyromaniacModes
- provides extensions to numbered modes to allow selection of customised numbered modes through configuration (modes.numbered_modes
).
Draw
- provides path based rendering.
- Supports all the main SWIs, but see the caveats described in the Graphics section.
FontManager
- provides user interface to the font system provided by the graphics implementation.
- See the Fonts section for more detail.
SpriteExtend
- provides the JPEG rendering SWI calls.
SpriteV
is not handled by SpriteExtend.
- JPEGs are supported:
- All the information and rendering SWIs are supported.
- Non-square transformation matrices are supported.
- Printer driver intercept is not supported.
- Colour mapping is not supported.
- Dithering is passed on as antialiasing.
ImageFileRenderPyromaniac
- provides an ImageFileRender
component for different image formats.
- Non-square transformation matrices are supported.
- Colourmap is not supported.
- The following filetypes are supported: PNG, XBM, WMF, PNM, Targa, BMP, PCX, GIF, ICO, TIFF, WebP, JPEG 2000.
- 3 quality levels are supported.
Squash
- provides an interface to decompress content.
Squash_Compress
- not supported
Squash_Decompress
- supported, although its behaviour differs from that of the original module in that output is deferred until the input has been completely consumed.
TimerMod
- provides a high resolution timer.
Timer_Start
, Timer_Stop
, Timer_Value
are supported.
*TimerStart
, *TimerStop
, *TimerValue
are supported.
*TimedOS
is not supported.
CDFSSoftPyromaniac
- provides an interface to access CD data through CDFS
. CDFS
and CDFSDriver
must be softloaded (as must a FileSwitch
, as no filing system registrations are implemented within RISC OS Pyromaniac).
CDFSDriver
- provides a dispatcher for access to the hardware CD drivers.
CompressJPEG
- provides a simple interface to compress bitmap data to JPEGs.
- Basic interfaces supported (
CompressJPEG_Start
, CompressJPEG_WriteLine
, CompressJPEG_Finish
)
CompressJPEG_Comment
supported
CompressJPEG_WriteLineExtended
supported
CompressJPEG_Transcode
not supported
ParallelDeviceDriver
- provides a stub interface for Parallel port operations.
Parallel_HardwareAddress
- supported.
Parallel_Op
- depends on configured implementation.
- No filesystem support.
- Implementations available:
null
- tracks state only
file
- writes to (or reads from) native files
socket
- connects to a remote server and diverts input and output to it.
ADFS
- provides an interface for accessing disc images.
- Only RISC OS 3 interfaces are currently supported.
- Disc images are configurable (
adfs.drive#_*
):
- Disc images may be configured for any floppy or harddiscs (0-7).
- Disc images may take the form of either raw disc dumps, or HDF disc images as used by RPCEmu.
- Disc image data ranges may be limited within the file (allowing multiple drives in a single file).
- Disc images may be marked as read only.
- The module will register with FileCore on initialisation, if it is present.
- SWI support:
ADFS_DiscOp
, ADFS_SectorDiscOp
- support depends on reason code.
ADFS_MiscOp
- support depends on reason code.
ADFS_DiscOp64
- not supported.
ADFS_HDC
- not supported.
ADFS_Freespace
, ADFS_Freespace64
- supported with fake values (does not call FileCore).
ADFS_Retries
- not supported.
ADFS_DescribeDisc
- supported with fake values (does not call FileCore
).
ADFS_VetFormat
- not supported.
ADFS_ControllerType
- not supported.
ADFS_PowerControl
- not supported.
ADFS_SetIDEController
- not supported.
ADFS_IDEUserOp
- not supported.
ADFS_ECCSAndRetries
- not supported.
ADFS_LockIDE
- not supported.
- DiscOp support:
- DiscOp Verify (0) - ignored.
- DiscOp ReadSectors (1) - supported.
- DiscOp WriteSectors (2) - supported (when not read only).
- DiscOp ReadTrackOrId (3) - not supported
- DiscOp WriteTrack (4) - not supported
- DiscOp Seek (5) - ignored.
- DiscOp Restore (6) - ignored.
- DiscOp FloppyStepIn (7) - not supported.
- DiscOp FloppyStepOut (8) - not supported.
- DiscOp ReadSectorsViaCache (9) - not supported.
- DiscOp Specify (15) - not supported.
- MiscOp support:
- MiscOp Mount (0) - supported.
- MiscOp PollChanged (1) - not supported.
- MiscOp LockDrive (2) - supported.
- MiscOp UnlockDrive (3) - supported.
- MiscOp PollPeriod (4) - not supported.
- MiscOp EjectDisc (5) - supported.
- MiscOp ReadInfo (6) - not supported.
- MiscOp ReadStatus (7) - supported (always returns unlocked).
ShareFS
- Stub module which tracks the status of the discs that are shared.
Freeway
- Stub module which tracks the status of the objects that are shared.
ResourceFS
- Tracks the registrations of resources.
- SWIs supported:
ResourceFS_RegisterFiles
- supported
ResourceFS_DeregisterFiles
- supported
- Does not provide a filing system.
*ResourcesFS_List
will list the files that have been registered.
InetServices
- module providing information about Internet services.
- Supported SWIs:
InetServices_GetServiceByPort
- supported
InetServices_GetServiceByName
- supported
InetServices_DecodeError
- supported
InetServices_GetServicesMenu
- supported
Speak
- Provides text to speech synthesis (Jonathan Duddington API).
- All SWIs are mostly supported, but features may vary between implementation.
- Language and voice variant are not properly supported.
Speech!
- Provides text to speech synthesis (Superior Software API).
- Most SWIs are supported.
- Uses the same implementations as the Speak module.
WebColours
- Provides a conversion between different forms of colour specification used on the Web.
GPIO
- Provides an interface to allow access to GPIO pins, with different implementations. See the 'Devices (I/O access)' section for more details.
RTCHWDS1307
- Provides an implementation of the RTC through the IIC DS1307 chip. This device may be provided by the internal IIC implementations.
RTCHWDS3231
- Provides an implementation of the RTC through the IIC DS3231 chip. This device may be provided by the internal IIC implementations.
RTCHWPCF8563
- Provides an implementation of the RTC through the IIC PCF8563 chip. This device may be provided by the internal IIC implementations.
RTCHWPCF8583
- Provides an implementation of the RTC through the IIC PCF8583 chip. This device may be provided by the internal IIC implementations.
PyromaniacWimpDebug
- Experimental module for tracking Wimp tasks and messages.
TimerManager
- Provides registration of 'hardware' timer handlers.
PyromaniacGit
- Provides an interface to the host 'git' command.
- Git operation is modelled on the same commands and syntax as the original, passing through to the host commands.
*Help Git
gives information on the commands supported.
*Git help <command>
describes the syntax supported for each command.
- Commands taking filenames are translated from RISC OS format to native format.
- Environment variables are mapped to RISC OS style variable names.
*Help GitVariables
describes the variables and their mapping from the standard
format.
- Variables holding paths are translated from RISC OS format to native format.
- Variables holding lists of comma-separated paths are translated from RISC OS format to native format as colon-separated paths.
- Transformations will be performed where possible on the git inputs and outputs:
- Output from the git commands will be displayed in the RISC OS alphabet, with ANSI colour operations converted to RISC OS VDU operations.
- Author and committer names in environment variables are translated from RISC OS alphabet to UTF-8.
- Commit messages in files will be translated from the RISC OS alphabet to UTF-8.
- Remote and branch names will be translated from the RISC OS alphabet to UTF-8.
- Filenames in the command output are not translated to RISC OS format.
- User configuration is not supported, although it can inherit from the host system.
- Authentication with a remote server can be performed through the console input.
- Credentials can be configured to be stored in a file on the RISC OS file system with the variable
Git$Credentials$Store
(pyromaniacgit.credential_store_filename
).
- Credentials can be configured to be stored in a file on the native filesystem (
pyromaniacgit.credential_store_native_filename
).
- Commands supported:
add
- Add file contents to the index
annotate
- Annotate file lines with commit information
blame
- Show what revision and author last modified each line of a file
branch
- List, create, or delete branches
checkout
- Switch branches or restore working tree files
cherry-pick
- Select changes from another branch
clean
- Revert working directory to a clean state
clone
- Clone a repository into a new directory
commit
- Record changes to the repository
describe
- Give an object a human readable name based on an available ref
diff
- Show changes between commits, commit and working tree, etc
fetch
- Fetch from another repository or a local branch
grep
- Search for strings
help
- Display help for a given command
init
- Create an empty Git repository or reinitialize an existing one
log
- Show commit logs
merge
- Merge branches onto the current branch
mv
- Move or rename a file or directory
pull
- Fetch from and integrate with another repository or a local branch
push
- Push changes to remote repository
rebase
- Rebase branches onto the current branch
reflog
- Manage reflog information
remote
- Manage repository mapping
reset
- Reset current HEAD to the specified state
restore
- Restores files
rev-parse
- Pick out and massage parameters
rm
- Remove files from the working tree and from the index
show
- Show various types of objects
shortlog
- Summarize 'git log' output
stash
- Stash the changes in a dirty working directory away
status
- Show the working tree status
switch
- Change current branch (use checkout
if not supported by host git tool)
tag
- Create, list, and delete tags on objects
version
- Report the version of git on the host and RISC OS system
- Notable commands not supported (incomplete list, with workarounds where necessary):
worktree
- Manage multiple working directories from a single repository
submodule
- Manage inner module relationships
notes
- Manage notes
bisect
- Bisect failures to a commit
OwnerBanner
- Provides the system startup banner.
VideoTTX
- provides an implementation of the VideoV teletext display.
- Arbitrary mode sizes are supported.
- Text rendering and updates are supported.
- Update deferral is supported, but not controllable by
VDU
sequences.
- Flashing cursor is supported.
- Scrolling is supported.
- Conceal/reveal is supported.
- Flashing is supported.
- Double height text is supported, but only for fully double height (partial characters are not supported).
- Corrected characters are supported, although still may not match the correct characters from the character set.
- Contiguous and separated graphics supported.
- Font is the standard RISC OS font.
- High resolution setting has no effect.
- Hold graphics are not supported.
- Black background configuration is not supported.
ImpressionSpell
- provides spell checking interface, supporting different implementations: null
, wordsfile
.
Wordsfile
uses simple lists of words from the host, like /usr/share/dict/words
:
- File to use may be 'none', 'auto' or an explicit native filename, or a RISC OS filename. (
spellwordsfile.native_filename
, spellwordsfile.filename
).
- Typo only returns a match or not.
- Anagram only returns exact anagrams of the word, not subgrams (
spellwordsfile.anagram_algorithm
).
- Fuzzy applies the SoundEx algorithm to match words. Algorithm is itself configurable (
spellwordsfile.fuzzy_algorithm
)
- User dictionaries are supported, although the file format may not be exactly that of Impression's dictionaries.
- Adding, removing and checking words are supported.
- Loading and saving dictionaries are supported.
- Converting dictionaries to word lists and vice-versa is supported.
- Browse window is not supported.
- Miscellaneous operations only really supports the version and count of reason code 0.
- Impression integration SWIs are not supported.
- Ignore dictionaries are supported.
PathUtils
- provides the path variable manipulation SWIs and commands.
FanController
- provides a registration and management interface for fan drivers. API documentation for the FanController is provided alongside the installation.
WimpSpritePool
- provides the sprite pools used for icon and tool sprites, together with the *Commands. See the Desktop section.
WimpCommands
- provides some commands which would usually be handled by the WindowManager.