\ ***************************************************************************** \ * 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