157 lines
5.6 KiB
Forth
157 lines
5.6 KiB
Forth
\ *****************************************************************************
|
|
\ * Copyright (c) 2004, 2008 IBM Corporation
|
|
\ * All rights reserved.
|
|
\ * This program and the accompanying materials
|
|
\ * are made available under the terms of the BSD License
|
|
\ * which accompanies this distribution, and is available at
|
|
\ * http://www.opensource.org/licenses/bsd-license.php
|
|
\ *
|
|
\ * Contributors:
|
|
\ * IBM Corporation - initial implementation
|
|
\ ****************************************************************************/
|
|
|
|
\ included by pci-class_03.fs
|
|
|
|
( str len display_num ) \ name prefix
|
|
|
|
false value is-installed?
|
|
value display_num ( str len )
|
|
|
|
s" ,Display-" $cat 41 display_num + char-cat \ add ", Display-A" or "-B" to name ( str len )
|
|
encode-string s" name" property \ store as name property
|
|
|
|
s" display" device-type
|
|
|
|
\ screen-info is set by pci-class_03.fs contains output of get_vbe_info bios-snk call
|
|
CASE screen-info c@ \ ( display-type )
|
|
0 OF s" NONE" ENDOF \ No display
|
|
1 OF s" Analog" ENDOF
|
|
2 OF s" Digital" ENDOF
|
|
ENDCASE
|
|
encode-string s" display-type" property
|
|
|
|
screen-info 8 + l@ value mem-adr
|
|
screen-info 1 + w@ value width
|
|
screen-info 3 + w@ value height
|
|
|
|
screen-info c@ IF
|
|
\ if screen-info is not 0, we have some screen attached, add needed properties...
|
|
width encode-int s" width" property
|
|
height encode-int s" height" property
|
|
screen-info 5 + w@ encode-int s" linebytes" property
|
|
screen-info 7 + c@ encode-int s" depth" property
|
|
mem-adr encode-int s" address" property
|
|
\ the EDID property breaks the boot... so i leave it out for now,
|
|
\ maybe encode-bytes does s.th. wrong???
|
|
\ screen-info c + 80 encode-bytes s" EDID" property
|
|
s" ISO8859-1" encode-string s" character-set" property \ i hope this is ok...
|
|
THEN
|
|
|
|
\ words for installation/removal, needed by is-install/is-remove, see display.fs
|
|
: display-remove ( -- )
|
|
;
|
|
: display-install ( -- )
|
|
is-installed? NOT IF
|
|
mem-adr to frame-buffer-adr
|
|
default-font
|
|
set-font
|
|
width height width char-width / height char-height / ( width height #lines #cols )
|
|
fb8-install
|
|
true to is-installed?
|
|
THEN
|
|
;
|
|
|
|
: color! ( r g b number -- )
|
|
\ 3c8 is RAMDAC write mode select palette entry register
|
|
\ 3c9 is RAMDAC write mode write palette entry register ( 3 consecutive writes set new entry )
|
|
vga-device-node? 3c8 translate-address ( r g b number address )
|
|
swap 1 pick ( r g b address number address )
|
|
rb! \ write palette entry number ( r g b address )
|
|
1 + \ select next register (3c9)
|
|
dup 4 pick swap rb! \ write red ( r g b address )
|
|
dup 3 pick swap rb! \ write green ( r g b address )
|
|
dup 2 pick swap rb! \ write blue ( r g b address )
|
|
4drop
|
|
;
|
|
|
|
: color@ ( number -- r g b )
|
|
\ 3c7 is RAMDAC read mode select palette entry register
|
|
\ 3c9 is RAMDAC read mode read palette entry register ( 3 consecutive reads read entry )
|
|
vga-device-node? 3c7 translate-address ( number address )
|
|
swap 1 pick ( address number address )
|
|
rb! \ write palette entry number ( address )
|
|
2 + >r \ select next register (3c9) ( R: address )
|
|
r@ rb@ \ read red ( r R: address )
|
|
r@ rb@ \ read green ( r g R: address )
|
|
r@ rb@ \ write blue ( r g b R: address )
|
|
r> drop ( r g b )
|
|
;
|
|
|
|
: set-colors ( adr number #numbers -- )
|
|
\ 3c8 is RAMDAC write mode select palette entry register
|
|
\ 3c9 is RAMDAC write mode write palette entry register ( 3 consecutive writes set new entry )
|
|
\ since after writing 3 entries, the palette entry is automagically incremented,
|
|
\ we can just continue writing...
|
|
vga-device-node? 3c8 translate-address ( adr number #numbers )
|
|
dup 3 pick swap ( adr number #numbers address number address )
|
|
rb! \ write palette entry number ( adr number #numbers address )
|
|
1 + \ select next register (3c9)
|
|
-rot swap drop ( adr address #numbers )
|
|
-rot swap rot ( address adr #numbers )
|
|
0 ?DO
|
|
( address adr )
|
|
dup rb@ \ read red value from adr ( address adr r )
|
|
2 pick rb! \ write to register ( address adr )
|
|
1 + \ next adr
|
|
dup rb@ \ read green value from adr ( address adr g )
|
|
2 pick rb! \ write to register ( address adr )
|
|
1 + \ next adr
|
|
dup rb@ \ read blue value from adr ( address adr r )
|
|
2 pick rb! \ write to register ( address adr )
|
|
1 + \ next adr
|
|
LOOP
|
|
2drop
|
|
;
|
|
|
|
: get-colors ( adr number #numbers -- )
|
|
\ 3c7 is RAMDAC read mode select palette entry register
|
|
\ 3c9 is RAMDAC read mode read palette entry register ( 3 consecutive reads get entry )
|
|
\ since after reading 3 entries, the palette entry is automagically incremented,
|
|
\ we can just continue reading...
|
|
vga-device-node? 3c7 translate-address ( adr number #numbers )
|
|
dup 3 pick swap ( adr number #numbers address number address )
|
|
rb! \ write palette entry number ( adr number #numbers address )
|
|
2 + \ select next register (3c9)
|
|
-rot swap drop ( adr address #numbers )
|
|
-rot swap rot ( address adr #numbers )
|
|
0 ?DO
|
|
( address adr )
|
|
1 pick rb@ \ read red value from register ( address adr r )
|
|
1 pick rb! \ write to adr ( address adr )
|
|
1 + \ next adr
|
|
1 pick rb@ \ read green value from register ( address adr g )
|
|
1 pick rb! \ write to adr ( address adr )
|
|
1 + \ next adr
|
|
1 pick rb@ \ read blue value from register ( address adr b )
|
|
1 pick rb! \ write to adr ( address adr )
|
|
1 + \ next adr
|
|
LOOP
|
|
2drop
|
|
;
|
|
|
|
include graphics.fs
|
|
|
|
\ clear screen
|
|
mem-adr width height * 0 rfill
|
|
|
|
\ call is-install and is-remove
|
|
' display-install is-install
|
|
|
|
' display-remove is-remove
|
|
|
|
s" screen" find-alias 0= IF
|
|
\ no previous screen alias defined, define it...
|
|
s" screen" get-node node>path set-alias
|
|
ELSE
|
|
drop
|
|
THEN
|