Difference between revisions of "Reading current colours"

From BeebWiki
Jump to: navigation, search
(Fixed external link.)
(Added code to include 16-colour MODEs.)
Line 23: Line 23:
  
 
The values returned in 2-colour and 4-colour MODEs can be converted to logical colour numbers quite easily:
 
The values returned in 2-colour and 4-colour MODEs can be converted to logical colour numbers quite easily:
   colour%  =FNosword(160,whatever)
+
   colour%  =FNosbyte(160,whatever,0)
   maxColour%=FNosword(160,96)
+
   maxColour%=FNosbyte(160,96,0)
 
   colour%=(colour% DIV 8) AND maxColour%
 
   colour%=(colour% DIV 8) AND maxColour%
  
 
or:
 
or:
   LDX #whatever:JSR osword160:PHA     :\ read colour mask
+
   LDX #whatever:LDA #160:JSR osbyte  :\ read colour mask
   LDX #96:JSR osword160:STA temp     :\ read max. colour
+
  TXA:PHA                             :\ save colour mask
 +
   LDX #96:LDA #160:JSR osbyte        :\ read maximum colour
 +
  STX temp                           :\ save it for later
 
   PLA:LSR A:LSR A:LSR A              :\ divide colour mask by 8
 
   PLA:LSR A:LSR A:LSR A              :\ divide colour mask by 8
 
   AND temp                            :\ AND with max. colour
 
   AND temp                            :\ AND with max. colour
  
Converting 16-colour colour masks is more complicated. Also, on the Master the graphics colour is stored elsewhere.
+
Converting 16-colour colour masks is more complicated. The following code will convert colour masks in all MODEs:
 +
  col%=FNosbyte(160,whatever,0)
 +
  FOR loop%=1 TO 3-INTSQR((FNosbyte(160,96,0)+1)/4)
 +
  col%=4*INTSQR((col%DIV16)+1)+SQR((col%AND15)+1)-5
 +
  NEXT loop%
 +
 
 +
or:
 +
  LDA #0:STA col              :\ Clear result
 +
  LDX #87:LDA #160:JSR osbyte :\ Get foreground text colour
 +
  STX mask                    :\ Save colour bitmap
 +
  LDX #96:LDA #160:JSR osbyte :\ Get maximum colour
 +
  STX max                    :\ Save maximum colour
 +
  INX:TXA:ORA #8              :\ Use bitmap from max as counter
 +
  .lp
 +
  ROL mask:ROL mask:ROL col  :\ Rotate every second bit into result
 +
  ROR A:BCC lp                :\ Loop until set bit rotated out
 +
  LDA col:AND max            :\ Get result, AND with max colour
 +
 
 +
Note that on the Master the graphics colour is stored elsewhere.
  
 
==See also==
 
==See also==
 
* [http://mdfs.net/Archive/BBCMicro/2015/10/24/221305.htm BBC Micro Mailing List]
 
* [http://mdfs.net/Archive/BBCMicro/2015/10/24/221305.htm BBC Micro Mailing List]
 
[[User:Jgharston|Jgharston]] ([[User talk:Jgharston|talk]]) 17:03, 31 October 2015 (UTC)
 
[[User:Jgharston|Jgharston]] ([[User talk:Jgharston|talk]]) 17:03, 31 October 2015 (UTC)
 +
[[User:Jgharston|Jgharston]] ([[User talk:Jgharston|talk]]) 12:31, 28 February 2016 (UTC)

Revision as of 13:31, 28 February 2016

OSBYTE 160 reads the VDU variables, and OSBYTE 160,87 to OSBYTE 160,90 read the current text and graphics colours:

OSBYTE 160,87:   read foreground text colour
OSBYTE 160,88:   read background text colour
OSBYTE 160,89:   read foreground graphics colour
OSBYTE 160,90:   read background graphics colour

Unfortunately, they don't return the actual logical colour supplied as the parameter to COLOUR or GCOL. They return the bitmap that that colour stores in the screen memory:

2 colours:   &00, &FF
4 colours:   &00, &0F, &F0, &FF
16 colours:   &00, &03, &0C, &0F, &30, &33, &3C, &3F, &C0, &C3, &CC, &CF, &F0, &F3, &FC, &FF

The values returned in 2-colour and 4-colour MODEs can be converted to logical colour numbers quite easily:

  colour%   =FNosbyte(160,whatever,0)
  maxColour%=FNosbyte(160,96,0)
  colour%=(colour% DIV 8) AND maxColour%

or:

  LDX #whatever:LDA #160:JSR osbyte   :\ read colour mask
  TXA:PHA                             :\ save colour mask
  LDX #96:LDA #160:JSR osbyte         :\ read maximum colour
  STX temp                            :\ save it for later
  PLA:LSR A:LSR A:LSR A               :\ divide colour mask by 8
  AND temp                            :\ AND with max. colour

Converting 16-colour colour masks is more complicated. The following code will convert colour masks in all MODEs:

  col%=FNosbyte(160,whatever,0)
  FOR loop%=1 TO 3-INTSQR((FNosbyte(160,96,0)+1)/4)
  col%=4*INTSQR((col%DIV16)+1)+SQR((col%AND15)+1)-5
  NEXT loop%

or:

  LDA #0:STA col              :\ Clear result
  LDX #87:LDA #160:JSR osbyte :\ Get foreground text colour
  STX mask                    :\ Save colour bitmap
  LDX #96:LDA #160:JSR osbyte :\ Get maximum colour
  STX max                     :\ Save maximum colour
  INX:TXA:ORA #8              :\ Use bitmap from max as counter
  .lp
  ROL mask:ROL mask:ROL col   :\ Rotate every second bit into result
  ROR A:BCC lp                :\ Loop until set bit rotated out
  LDA col:AND max             :\ Get result, AND with max colour

Note that on the Master the graphics colour is stored elsewhere.

See also

Jgharston (talk) 17:03, 31 October 2015 (UTC) Jgharston (talk) 12:31, 28 February 2016 (UTC)