Difference between revisions of "VDU 19"

From BeebWiki
Jump to: navigation, search
m (1 revision)
(Added alpha channel.)
 
(15 intermediate revisions by 2 users not shown)
Line 6: Line 6:
 
|- style="vertical-align:top"
 
|- style="vertical-align:top"
 
| [[BASIC metasyntax|Syntax]]
 
| [[BASIC metasyntax|Syntax]]
| <code>VDU 19,<logical>,<physical>,0,0,0</code>
+
| <code>VDU 19,</code><logical><code>,</code><physical><code>,</code><red><code>,</code><green><code>,</code><blue>
|- style="vertical-align:top"
 
| Keyboard equivalent
 
| CTRL S
 
 
|- style="vertical-align:top"
 
|- style="vertical-align:top"
 
| Character stream (hex)
 
| Character stream (hex)
| <code>13</code> <logical> <physical> <code>r g b</code>
+
| <code>&13</code> <logical> <physical> <red> <green> <blue>
 
|- style="vertical-align:top"
 
|- style="vertical-align:top"
 
| Description
 
| Description
Line 18: Line 15:
 
|}
 
|}
  
== Description ==
+
==Description==
 +
<code>'''VDU 19'''</code> sets the logical colour, used in GCOL ([[VDU 18]])
 +
or COLOUR ([[VDU 17]]) to the provided physical colour. The physical colour
 +
is set with a [[Physical colour numbers|physical colour]] number or, on
 +
32-bit platforms and compatible extensions for 8-bit systems, the individual
 +
red/green/blue colour levels set with the last three parameters.
 +
 
 +
The logical colour value is MODed by the number of colours in the screen
 +
mode, so in a four colour mode, defining colour 4 will alter colour 0.
  
<code>VDU 19</code>, sets the logical colour, used in a GCOL ([[VDU 18]]) or
+
Some platforms support a logical colour of -1 to set the border colour. Some
a COLOUR ([[VDU 17]]) to the provided physical colour. On the 8-bit
+
platforms use a physical colour of 16+ to set the border or pointer colours
machines, the physical colour list is the same as the default for a 16
+
or individual flash colours.
colour mode, as shown below. On 32-bit systems and compatible extensions for
 
8-bit systems, the individual red/green/blue colour levels can be set with
 
the last three parameters.
 
  
{| class="wikitable"
+
Screen modes with 256 or more logical colours use other methods to control
|+ Default physical colours
+
the palette.
! Logical colour !! Physical colour
 
|-
 
| 0 || Black
 
|-
 
| 1 || Red
 
|-
 
| 2 || Green
 
|-
 
| 3 || Yellow
 
|-
 
| 4 || Blue
 
|-
 
| 5 || Magenta
 
|-
 
| 6 || Cyan
 
|-
 
| 7 || White
 
|-
 
| 8 || Flashing black/white
 
|-
 
| 9 || Flashing red/cyan
 
|-
 
| 10 || Flashing green/magenta
 
|-
 
| 11 || Flashing yellow/blue
 
|-
 
| 12 || Flashing blue/yellow
 
|-
 
| 13 || Flashing magenta/green
 
|-
 
| 14 || Flashing cyan/red
 
|-
 
| 15 || Flashing white/black
 
|}
 
  
The logical colour value is MODed by the number of colours in the mode, so
+
==Parameters==
in a four colour mode, defining colour 4 will alter colour 0.
+
Logical colour:
 +
  VDU 19,<128 ,p,r,g,b - set logical colour
 +
  VDU 19,128+n,p,r,g,b - provisional: set alpha channel colour
 +
  VDU 19,-1  ,p,r,g,b - set border colour (-1 is sent as CHR$255)
  
On a BBC Micro, this VDU call performs similar to [[OSBYTE &9B]] and will
+
Physical colour:
update the ULA colour registers. It will automatically invert the physical
+
  0+colour    VDU 19,l,%0000ebgr,r,g,b - set to [[Physical colour numbers|physical colour]]
colour value as required by the ULA.
+
  16+action    VDU 19,l,%0001xxxx,r,g,b - set to RGB colour
 +
  32+colour    VDU 19,l,%0010ebgr,r,g,b - set first flashing physical colour
 +
  48+colour    VDU 19,l,%0011ebgr,r,g,b - set second flashing physical colour
 +
  64+action    VDU 19,l,%01xxxxxx,r,g,b - reserved
 +
128+action    VDU 19,l,%100yyyyy,z,x,x - CPC: flash between colour y and z
 +
255          VDU 19,l,%11111111,r,g,b - DOS: set 6-bit RGB colour
 +
 +
This gives the following implementations:
 +
  VDU 19, l,  0-15, r,g,b - set to 4-bit physical colour
 +
  VDU 19, l,  16,  r,g,b - set to RGB colour
 +
  VDU 19, l,  17,  r,g,b - set first RGB flash colour
 +
  VDU 19, l,  18,  r,g,b - set second RGB flash colour
 +
  VDU 19, l,  24,  r,g,b - set border RGB colour
 +
  VDU 19, l,  25,  r,g,b - set pointer RGB colour
 +
  VDU 19, l, 32+p,  r,g,b - set first physical flashing colour
 +
  VDU 19, l, 48+p,  r,g,b - set second physical flashing colour
 +
  VDU 19, l,128+p1, p2,x,x - set CPC physical colours
 +
  VDU 19, l,  -1,  r,g,b - set to 6-bit RGB colour
  
 
==Calling from BBC BASIC==
 
==Calling from BBC BASIC==
On BASIC V and later:
+
On BASIC V and later, and equivalent:
 
* '''<code>COLOUR l,p</code>''' sends VDU 19,l,p,0,0,0
 
* '''<code>COLOUR l,p</code>''' sends VDU 19,l,p,0,0,0
 
* '''<code>COLOUR l,r,g,b</code>''' sends VDU 19,l,16,r,g,b
 
* '''<code>COLOUR l,r,g,b</code>''' sends VDU 19,l,16,r,g,b
 +
 +
Some implementations support setting the border colour with:
 +
* '''<code>COLOUR l,r,g,b</code>''' sends VDU 19,l,24,r,g,b if l<0
 +
 +
==Implementations==
 +
 +
===BBC/Master/Electron===
 +
The native 8-bit Acorn computers only support using 4-bit physical colour
 +
numbers, and do not support setting the border colour. The top four bits of
 +
the logical colour and physical colour are ignored, as are the r/g/b
 +
components, but programs should use 0-15 for the colours and zero for the
 +
r/g/b components to allow for expansion.
 +
 +
Expansions such as the Chamelion and the Prisma support using red/green/blue
 +
colour components and setting the border colour.
 +
<ref>[http://mdfs.net/Info/Comp/BBC/Border/ Border colour module]</ref>
 +
Software extensions support setting independent flash colours.
 +
<ref>[http://mdfs.net/Info/Comp/BBC/Display/ Non-complementary flashing colours]</ref>
 +
 +
===RISC OS===
 +
RISC OS supports 4-bit physical colour numbers 0-15 and using physical
 +
colour numbers 16-31 to set red/green/blue colour components. Physical
 +
colour numbers greater than 31 are ignored completely.
 +
 +
===DOS/Windows===
 +
DOS/Windows supports 4-bit physical colour numbers and using physical colour
 +
numbers 16-31 to set red/green/blue colour components. It also supports
 +
using logical colour -1 to set the border colour. On Windows VDU 19 just
 +
sets the physical colour for use from that point on, it does not change any
 +
colours already displayed on screen. This means that it cannot be used for
 +
palette-switching animation.
 +
 +
===Millipede Prisma Graphics System===
 +
The Prima Graphics System supports:
 +
* VDU 19,l,p,0,0,0 - sets to physical non-flashing colour if red/green/blue are zero and p<16.
 +
* VDU 19,l,p,r,g,b - sets to red/green/blue colour components if any are non-zero, ignoring p.
 +
* VDU 19,l,p,r,g,b - sets to red/green/blue colour components if p=16+, otherwise ignoring p.
 +
 +
===Amstrad CPC===
 +
Amstrad CPC supports 4-bit physical colour numbers translated to the Amstrad
 +
3*3*3 colour palette and using logical colour -1 to set the border colour.
 +
It also supports the following to set colours to the native 3*3*3 Amstrad
 +
colour levels:
 +
* VDU 19,l,128+x,y,0,0 - flash between Amstrad colour x and y
 +
 +
==Compatability across platforms==
 +
To be compatible across different platforms programs should use the
 +
following code:
 +
* <code>'''VDU 19,l,0-15,0,0,0'''</code> to set a physical colour, specify r/g/b parameters as all zero
 +
* <code>'''VDU 19,l,16,r,g,b'''</code> to set red/green/blue colour components
 +
* <code>'''VDU 19,-1,24,r,g,b'''</code> to set the border colour, use both l=-1 and p=24
 +
 +
==References==
 +
<references/>
 +
 +
==See also==
 +
* [[OSWORD &0B]] - Read palatte entries
 +
* [[OSWORD &0C]] - Write palette entries
 +
 +
On a BBC/Master, VDU 19 calls the code that [[OSBYTE &9B]] calls to update
 +
the ULA palette registers. It will automatically invert the physical colour
 +
value as required by the ULA.
  
 
--[[User:Tautology|Tautology]] 13:10, 1 May 2011 (UTC)
 
--[[User:Tautology|Tautology]] 13:10, 1 May 2011 (UTC)
 +
[[User:Jgharston|Jgharston]] ([[User talk:Jgharston|talk]]) 23:10, 16 June 2016 (UTC)
 +
[[User:Jgharston|Jgharston]] ([[User talk:Jgharston|talk]]) 07:39, 30 November 2016 (UTC)

Latest revision as of 11:13, 11 February 2024

Define Logical Colour.

VDU 19
Syntax VDU 19,<logical>,<physical>,<red>,<green>,<blue>
Character stream (hex) &13 <logical> <physical> <red> <green> <blue>
Description Set the logical colour <logical> to be the physical colour <physical>.

Description

VDU 19 sets the logical colour, used in GCOL (VDU 18) or COLOUR (VDU 17) to the provided physical colour. The physical colour is set with a physical colour number or, on 32-bit platforms and compatible extensions for 8-bit systems, the individual red/green/blue colour levels set with the last three parameters.

The logical colour value is MODed by the number of colours in the screen mode, so in a four colour mode, defining colour 4 will alter colour 0.

Some platforms support a logical colour of -1 to set the border colour. Some platforms use a physical colour of 16+ to set the border or pointer colours or individual flash colours.

Screen modes with 256 or more logical colours use other methods to control the palette.

Parameters

Logical colour:
 VDU 19,<128 ,p,r,g,b - set logical colour
 VDU 19,128+n,p,r,g,b - provisional: set alpha channel colour
 VDU 19,-1   ,p,r,g,b - set border colour (-1 is sent as CHR$255)
Physical colour:
  0+colour    VDU 19,l,%0000ebgr,r,g,b - set to physical colour
 16+action    VDU 19,l,%0001xxxx,r,g,b - set to RGB colour
 32+colour    VDU 19,l,%0010ebgr,r,g,b - set first flashing physical colour
 48+colour    VDU 19,l,%0011ebgr,r,g,b - set second flashing physical colour
 64+action    VDU 19,l,%01xxxxxx,r,g,b - reserved
128+action    VDU 19,l,%100yyyyy,z,x,x - CPC: flash between colour y and z
255           VDU 19,l,%11111111,r,g,b - DOS: set 6-bit RGB colour

This gives the following implementations:
 VDU 19, l,   0-15, r,g,b - set to 4-bit physical colour
 VDU 19, l,   16,   r,g,b - set to RGB colour
 VDU 19, l,   17,   r,g,b - set first RGB flash colour
 VDU 19, l,   18,   r,g,b - set second RGB flash colour
 VDU 19, l,   24,   r,g,b - set border RGB colour
 VDU 19, l,   25,   r,g,b - set pointer RGB colour
 VDU 19, l, 32+p,   r,g,b - set first physical flashing colour
 VDU 19, l, 48+p,   r,g,b - set second physical flashing colour
 VDU 19, l,128+p1, p2,x,x - set CPC physical colours
 VDU 19, l,   -1,   r,g,b - set to 6-bit RGB colour

Calling from BBC BASIC

On BASIC V and later, and equivalent:

  • COLOUR l,p sends VDU 19,l,p,0,0,0
  • COLOUR l,r,g,b sends VDU 19,l,16,r,g,b

Some implementations support setting the border colour with:

  • COLOUR l,r,g,b sends VDU 19,l,24,r,g,b if l<0

Implementations

BBC/Master/Electron

The native 8-bit Acorn computers only support using 4-bit physical colour numbers, and do not support setting the border colour. The top four bits of the logical colour and physical colour are ignored, as are the r/g/b components, but programs should use 0-15 for the colours and zero for the r/g/b components to allow for expansion.

Expansions such as the Chamelion and the Prisma support using red/green/blue colour components and setting the border colour. [1] Software extensions support setting independent flash colours. [2]

RISC OS

RISC OS supports 4-bit physical colour numbers 0-15 and using physical colour numbers 16-31 to set red/green/blue colour components. Physical colour numbers greater than 31 are ignored completely.

DOS/Windows

DOS/Windows supports 4-bit physical colour numbers and using physical colour numbers 16-31 to set red/green/blue colour components. It also supports using logical colour -1 to set the border colour. On Windows VDU 19 just sets the physical colour for use from that point on, it does not change any colours already displayed on screen. This means that it cannot be used for palette-switching animation.

Millipede Prisma Graphics System

The Prima Graphics System supports:

  • VDU 19,l,p,0,0,0 - sets to physical non-flashing colour if red/green/blue are zero and p<16.
  • VDU 19,l,p,r,g,b - sets to red/green/blue colour components if any are non-zero, ignoring p.
  • VDU 19,l,p,r,g,b - sets to red/green/blue colour components if p=16+, otherwise ignoring p.

Amstrad CPC

Amstrad CPC supports 4-bit physical colour numbers translated to the Amstrad 3*3*3 colour palette and using logical colour -1 to set the border colour. It also supports the following to set colours to the native 3*3*3 Amstrad colour levels:

  • VDU 19,l,128+x,y,0,0 - flash between Amstrad colour x and y

Compatability across platforms

To be compatible across different platforms programs should use the following code:

  • VDU 19,l,0-15,0,0,0 to set a physical colour, specify r/g/b parameters as all zero
  • VDU 19,l,16,r,g,b to set red/green/blue colour components
  • VDU 19,-1,24,r,g,b to set the border colour, use both l=-1 and p=24

References

See also

On a BBC/Master, VDU 19 calls the code that OSBYTE &9B calls to update the ULA palette registers. It will automatically invert the physical colour value as required by the ULA.

--Tautology 13:10, 1 May 2011 (UTC) Jgharston (talk) 23:10, 16 June 2016 (UTC) Jgharston (talk) 07:39, 30 November 2016 (UTC)