diff options
Diffstat (limited to 'qemu/roms/SLOF/board-js2x/slof/vga-display.fs')
-rw-r--r-- | qemu/roms/SLOF/board-js2x/slof/vga-display.fs | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/qemu/roms/SLOF/board-js2x/slof/vga-display.fs b/qemu/roms/SLOF/board-js2x/slof/vga-display.fs new file mode 100644 index 000000000..96417e2d3 --- /dev/null +++ b/qemu/roms/SLOF/board-js2x/slof/vga-display.fs @@ -0,0 +1,157 @@ +\ ***************************************************************************** +\ * 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 |