Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / slof / fs / fbuffer.fs
diff --git a/qemu/roms/SLOF/slof/fs/fbuffer.fs b/qemu/roms/SLOF/slof/fs/fbuffer.fs
new file mode 100644 (file)
index 0000000..756f05a
--- /dev/null
@@ -0,0 +1,264 @@
+\ *****************************************************************************
+\ * 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
+\ ****************************************************************************/
+
+#include "terminal.fs"
+#include "display.fs"
+
+\ \\\\\\\\\\\\\\ Global Data
+
+0 VALUE frame-buffer-adr
+0 VALUE screen-height
+0 VALUE screen-width
+0 VALUE screen-depth
+0 VALUE window-top
+0 VALUE window-left
+
+0 VALUE .sc
+
+: screen-#rows  ( -- rows )
+   .sc IF
+      screen-height char-height /
+    ELSE
+      true to .sc
+      s" screen-#rows" eval
+      false to .sc
+    THEN
+;
+
+: screen-#columns ( -- columns )
+   .sc IF
+      screen-width char-width /
+   ELSE
+      true to .sc
+      s" screen-#columns" eval
+      false to .sc
+   THEN
+;
+
+\ \\\\\\\\\\\\\\ Structure/Implementation Dependent Methods
+
+
+\ \\\\\\\\\\\\\\ Implementation Independent Methods (Depend on Previous)
+\ *
+\ *
+
+: fb8-background inverse? ;
+: fb8-foreground inverse? invert ;
+
+: fb8-lines2bytes ( #lines -- #bytes ) char-height * screen-width * screen-depth * ;
+: fb8-columns2bytes ( #columns -- #bytes ) char-width * screen-depth * ;
+: fb8-line2addr ( line# -- addr )
+       char-height * window-top + screen-width * screen-depth *
+       frame-buffer-adr + window-left screen-depth * +
+;
+
+: fb8-erase-block ( addr len ) fb8-background rfill ;
+
+
+0 VALUE .ab
+CREATE bitmap-buffer 400 4 * allot
+
+: active-bits ( -- new ) .ab dup 8 > IF 8 - to .ab 8 ELSE
+               char-width to .ab ?dup 0= IF recurse THEN
+       THEN ;
+
+: fb8-char2bitmap ( font-height font-addr -- bitmap-buffer )
+       bitmap-buffer >r
+       char-height rot 0> IF r> char-width 2dup fb8-erase-block + >r 1- THEN
+
+       r> -rot char-width to .ab
+       ( fb-addr font-addr font-height )
+       fontbytes * bounds ?DO
+               i c@ active-bits 0 ?DO
+                       dup 80 and IF fb8-foreground ELSE fb8-background THEN
+                       ( fb-addr fbyte colr ) 2 pick ! 1 lshift
+                       swap screen-depth + swap
+               LOOP drop
+       LOOP drop
+       bitmap-buffer
+;
+
+\ \\\\\\\\\\\\\\ Exported Interface:
+\ *
+\ * IEEE 1275: Frame buffer support routines
+\ *
+
+: fb8-draw-logo ( line# addr width height -- ) ." fb8-draw-logo ( " .s ."  )" cr
+       2drop 2drop
+;
+
+: fb8-toggle-cursor ( -- )
+       line# fb8-line2addr column# fb8-columns2bytes +
+       char-height 0 ?DO
+               char-width screen-depth * 0 ?DO dup dup rb@ -1 xor swap rb! 1+ LOOP
+               screen-width screen-depth * + char-width screen-depth * -
+       LOOP drop
+;
+
+: fb8-draw-character ( char -- )
+    >r default-font over + r@ -rot between IF
+       2swap 3drop r> >font fb8-char2bitmap ( bitmap-buf )
+       line# fb8-line2addr column# fb8-columns2bytes + ( bitmap-buf fb-addr )
+       char-height 0 ?DO
+               2dup char-width screen-depth * mrmove
+               screen-width screen-depth * + >r char-width screen-depth * + r>
+       LOOP 2drop
+    ELSE 2drop r> 3drop THEN
+;
+
+: fb8-insert-lines ( n -- )
+       fb8-lines2bytes >r line# fb8-line2addr dup dup r@ +
+       #lines line# - fb8-lines2bytes r@ - rmove
+       r> fb8-erase-block
+;
+
+: fb8-delete-lines ( n -- )
+       fb8-lines2bytes >r line# fb8-line2addr dup dup r@ + swap
+       #lines fb8-lines2bytes r@ - dup >r rmove
+       r> + r> fb8-erase-block
+;
+
+: fb8-insert-characters ( n -- )
+       line# fb8-line2addr column# fb8-columns2bytes + >r
+       #columns column# - 2dup >= IF
+               nip dup 0> IF fb8-columns2bytes r> ELSE r> 2drop EXIT THEN
+       ELSE
+               fb8-columns2bytes swap fb8-columns2bytes tuck -
+               over r@ tuck + rot char-height 0 ?DO
+                       3dup rmove
+                       -rot screen-width screen-depth * tuck + -rot + swap rot
+               LOOP
+               3drop r>
+       THEN
+       char-height 0 ?DO
+               dup 2 pick fb8-erase-block screen-width screen-depth * +
+       LOOP
+       2drop
+;
+
+: fb8-delete-characters ( n -- )
+       line# fb8-line2addr column# fb8-columns2bytes + >r
+       #columns column# - 2dup >= IF
+               nip dup 0> IF fb8-columns2bytes r> ELSE r> 2drop EXIT THEN
+       ELSE
+               fb8-columns2bytes swap fb8-columns2bytes tuck -
+               over r@ + 2dup + r> swap >r rot char-height 0 ?DO
+                       3dup rmove
+                       -rot screen-width screen-depth * tuck + -rot + swap rot
+               LOOP
+               3drop r> over -
+       THEN
+       char-height 0 ?DO
+               dup 2 pick fb8-erase-block screen-width screen-depth * +
+       LOOP
+       2drop
+;
+
+: fb8-reset-screen ( -- ) ( Left as no-op by design ) ;
+
+: fb8-erase-screen ( -- )
+       frame-buffer-adr screen-height screen-width * screen-depth * fb8-erase-block
+;
+
+: fb8-invert-screen ( -- )
+       frame-buffer-adr screen-height screen-width * screen-depth * 2dup /x / 0 ?DO
+               dup rx@ -1 xor over rx! xa1+
+       LOOP 3drop
+;
+
+: fb8-blink-screen ( -- ) fb8-invert-screen fb8-invert-screen ;
+
+: fb8-install ( width height #columns #lines -- )
+       1 to screen-depth
+       2swap  to screen-height  to screen-width
+       screen-#rows min to #lines
+       screen-#columns min to #columns
+       screen-height char-height #lines * - 2/ to window-top
+       screen-width char-width #columns * - 2/ to window-left
+       ['] fb8-toggle-cursor to toggle-cursor
+       ['] fb8-draw-character to draw-character
+       ['] fb8-insert-lines to insert-lines
+       ['] fb8-delete-lines to delete-lines
+       ['] fb8-insert-characters to insert-characters
+       ['] fb8-delete-characters to delete-characters
+       ['] fb8-erase-screen to erase-screen
+       ['] fb8-blink-screen to blink-screen
+       ['] fb8-invert-screen to invert-screen
+       ['] fb8-reset-screen to reset-screen
+       ['] fb8-draw-logo to draw-logo
+;
+
+: fb-install  ( width height #columns #lines depth -- )
+       >r
+       fb8-install
+       r> to screen-depth
+;
+
+
+\ Install display related FCODE evaluator tokens
+: fb8-set-tokens  ( -- )
+       ['] is-install        0 11C set-token
+       ['] is-remove         0 11D set-token
+       ['] is-selftest       0 11E set-token
+
+       ['] #lines            0 150 set-token
+       ['] #columns          0 151 set-token
+       ['] line#             0 152 set-token
+       ['] column#           0 153 set-token
+       ['] inverse?          0 154 set-token
+       ['] inverse-screen?   0 155 set-token
+       ['] draw-character    0 157 set-token
+       ['] reset-screen      0 158 set-token
+       ['] toggle-cursor     0 159 set-token
+       ['] erase-screen      0 15A set-token
+       ['] blink-screen      0 15B set-token
+       ['] invert-screen     0 15C set-token
+       ['] insert-characters 0 15D set-token
+       ['] delete-characters 0 15E set-token
+       ['] insert-lines      0 15F set-token
+       ['] delete-lines      0 160 set-token
+       ['] draw-logo         0 161 set-token
+       ['] frame-buffer-adr  0 162 set-token
+       ['] screen-height     0 163 set-token
+       ['] screen-width      0 164 set-token
+       ['] window-top        0 165 set-token
+       ['] window-left       0 166 set-token
+       \ ['] foreground-color  0 168 set-token  \ 16-color extension - n/a
+       \ ['] background-color  0 169 set-token  \ 16-color extension - n/a
+       ['] default-font      0 16A set-token
+       ['] set-font          0 16B set-token
+       ['] char-height       0 16C set-token
+       ['] char-width        0 16D set-token
+       ['] >font             0 16E set-token
+       ['] fontbytes         0 16F set-token
+
+       ['] fb8-draw-character    0 180 set-token
+       ['] fb8-reset-screen      0 181 set-token
+       ['] fb8-toggle-cursor     0 182 set-token
+       ['] fb8-erase-screen      0 183 set-token
+       ['] fb8-blink-screen      0 184 set-token
+       ['] fb8-invert-screen     0 185 set-token
+       ['] fb8-insert-characters 0 186 set-token
+       ['] fb8-delete-characters 0 187 set-token
+       ['] fb8-insert-lines      0 188 set-token
+       ['] fb8-delete-lines      0 189 set-token
+       ['] fb8-draw-logo         0 18A set-token
+       ['] fb8-install           0 18B set-token
+;
+fb8-set-tokens
+
+
+\ \\\\\\\\\\\\ Debug Stuff \\\\\\\\\\\\\\\\
+
+: fb8-dump-bitmap cr char-height 0 ?do char-width 0 ?do dup c@ if ." @" else ." ." then 1+ loop cr loop drop ;
+
+: fb8-dump-char >font -b swap fb8-char2bitmap fb8-dump-bitmap ;