In RISC OS 2.00 it is possible to load modules which provide additional screen modes and additional monitor types. To provide this facility a number of new services are offered:-
Service_ModeExtension (&50)
R3 = monitor type (or -1 for don't care)out: (If not claimed)
All registers preserved
(If claimed) R1 = 0 R2 preserved R3 -> VIDC list R4 -> workspace list
Offset Value
0 0 (indicates format of list, to allow for new VIDCs at a later date) 4 VIDC base mode 8 VIDC parameter 12 VIDC parameter . . . . n -1
The VIDC base mode is the number of an existing operating system screen mode which is used to determine the values of VIDC registers not explicitly mentioned in the list. The VIDC parameters are in the form that would be written to the hardware ie the top 6 bits specify which register is programmed and the remainder specify the value to be programmed in that register. However, bits 6 and 7 of the control register should be set to 0 as these will be modified by the MOS to take the configured sync and the *TV interlace setting into account. Similarly the vertical parameters for border start, display start, display end and border end are modified by the MOS to take the *TV vertical offset into account.
VIDC parameters below &80000000 are ignored, since these correspond to palette registers (determined by the workspace base mode) and sound registers (not part of the display system).
Offset Value
0 0 (indicates format of list) 4 Workspace base mode 8 Mode variable index 12 Mode variable value 16 Mode variable index 20 Mode variable value . . . . n -1
The workspace base mode is the number of an existing operating system screen
mode which is used to determine the values of mode variables not explicitly
mentioned in the list. The mode variable indices are the same as for
SWI OS_ReadModeVariable.
Note: for the palette to be set properly, a workspace base mode should be
chosen which has the appropriate palette.
When the service is received, the module should check that R2 contains a mode that it knows about and that R3 holds a monitor type that is suitable for that mode. If not, the service should be passed on. If R3 holds -1 then the MOS is making a general enquiry about that mode (eg to determine the attributes of a sprite defined in that mode) so the module should only check R2.
Note that it is possible for a mode to have two or more different sets of VIDC parameters for different monitor types, but the workspace parameters MUST be the same, as the mode number is used as an identifier in sprites and in calls such as OS_ReadModeVariable.
Service_ModeTranslation (&51)
R3 = monitor typeout: (If not claimed)
All registers preserved
(If claimed) R1 = 0 R2 = substitute mode R3 preserved
This service is offered during a call to OS_CheckModeValid or a screen mode change, if the selected mode is not available with the current monitor type (this having been ascertained by offering Service_ModeExtension) and the monitor type is not one known to the MOS (ie not in the range 0..3). If the monitor type passed in R3 is known to the module, then the module should discover what the attributes of the mode in R2 are (by calling ReadModeVariable) and then choose a mode which is suitable for this monitor type and is closest in attributes to the selected mode. This mode number should be returned in R2.
Service_PreModeChange (&4D)
R2 = selected mode (before possible translation)out: (Case 1)
interfere.
(Case 2) R1 = 0 (service claimed) R0 = 0 This implies that the module does not want the mode change to take place, and has taken an alternative action.
(Case 3) R1 = 0 (service claimed) R0 -> error block This implies that the module does not want the mode change to take place, and wishes to return the error pointed to by R0
(Case 4 - possibly to be removed) R1 preserved R2 = new mode This implies that the module wants to substitute a mode for the specified mode. This is not a very good way of doing it, as other modules further down the chain will be offered the service with this new mode. The Service_ModeTranslation mechanism described above should be used by modules providing new monitor types.