|
|
1.1 ! root 1: \ tag: Display device management ! 2: \ ! 3: \ this code implements IEEE 1275-1994 ch. 5.3.6 ! 4: \ ! 5: \ Copyright (C) 2003 Stefan Reinauer ! 6: \ ! 7: \ See the file "COPYING" for further information about ! 8: \ the copyright and warranty status of this work. ! 9: \ ! 10: ! 11: hex ! 12: ! 13: \ ! 14: \ 5.3.6.1 Terminal emulator routines ! 15: \ ! 16: ! 17: \ The following values are used and set by the terminal emulator ! 18: \ defined and described in 3.8.4.2 ! 19: 0 value line# ( -- line# ) ! 20: 0 value column# ( -- column# ) ! 21: 0 value inverse? ( -- white-on-black? ) ! 22: 0 value inverse-screen? ( -- black? ) ! 23: 0 value #lines ( -- rows ) ! 24: 0 value #columns ( -- columns ) ! 25: ! 26: \ The following values are used internally by both the 1-bit and the ! 27: \ 8-bit frame-buffer support routines. ! 28: ! 29: 0 value frame-buffer-adr ( -- addr ) ! 30: 0 value screen-height ( -- height ) ! 31: 0 value screen-width ( -- width ) ! 32: 0 value window-top ( -- border-height ) ! 33: 0 value window-left ( -- border-width ) ! 34: 0 value char-height ( -- height ) ! 35: 0 value char-width ( -- width ) ! 36: 0 value fontbytes ( -- bytes ) ! 37: ! 38: \ these values are used internally and do not represent any ! 39: \ official open firmware words ! 40: 0 value char-min ! 41: 0 value char-num ! 42: 0 value font ! 43: ! 44: 0 value foreground-color ! 45: 0 value background-color ! 46: ! 47: ! 48: \ The following wordset is called the "defer word interface" of the ! 49: \ terminal-emulator support package. It gets overloaded by fb1-install ! 50: \ or fb8-install (initiated by the framebuffer fcode driver) ! 51: ! 52: defer draw-character ( char -- ) ! 53: defer reset-screen ( -- ) ! 54: defer toggle-cursor ( -- ) ! 55: defer erase-screen ( -- ) ! 56: defer blink-screen ( -- ) ! 57: defer invert-screen ( -- ) ! 58: defer insert-characters ( n -- ) ! 59: defer delete-characters ( n -- ) ! 60: defer insert-lines ( n -- ) ! 61: defer delete-lines ( n -- ) ! 62: defer draw-logo ( line# addr width height -- ) ! 63: ! 64: defer fb-emit ( x -- ) ! 65: ! 66: \ ! 67: \ 5.3.6.2 Frame-buffer support routines ! 68: \ ! 69: ! 70: : default-font ( -- addr width height advance min-char #glyphs ) ! 71: \ (romfont-8x16) 8 10 10 0 100 ! 72: ; ! 73: ! 74: : set-font ( addr width height advance min-char #glyphs -- ) ! 75: to char-num ! 76: to char-min ! 77: to fontbytes ! 78: to char-height ! 79: to char-width ! 80: to font ! 81: ; ! 82: ! 83: : >font ( char -- addr ) ! 84: char-min - ! 85: char-num min ! 86: fontbytes * ! 87: font + ! 88: ; ! 89: ! 90: \ ! 91: \ 5.3.6.3 Display device support ! 92: \ ! 93: ! 94: \ ! 95: \ 5.3.6.3.1 Frame-buffer package interface ! 96: \ ! 97: ! 98: : is-install ( xt -- ) ! 99: external ! 100: \ Create open and other methods for this display device. ! 101: \ Methods to be created: open, write, draw-logo, restore ! 102: s" open" header ! 103: 1 , \ colon definition ! 104: , ! 105: ['] (semis) , ! 106: reveal ! 107: s" : write dup >r bounds do i c@ fb-emit loop r> ; " evaluate ! 108: s" : draw-logo draw-logo ; " evaluate ! 109: s" : restore reset-screen ; " evaluate ! 110: ; ! 111: ! 112: : is-remove ( xt -- ) ! 113: external ! 114: \ Create close method for this display device. ! 115: s" close" header ! 116: 1 , \ colon definition ! 117: , ! 118: ['] (semis) , ! 119: reveal ! 120: ; ! 121: ! 122: : is-selftest ( xt -- ) ! 123: external ! 124: \ Create selftest method for this display device. ! 125: s" selftest" header ! 126: 1 , \ colon definition ! 127: , ! 128: ['] (semis) , ! 129: reveal ! 130: ; ! 131: ! 132: ! 133: \ 5.3.6.3.2 Generic one-bit frame-buffer support (optional) ! 134: ! 135: : fb1-nonimplemented ! 136: ." Monochrome framebuffer support is not implemented." cr ! 137: end0 ! 138: ; ! 139: ! 140: : fb1-draw-character fb1-nonimplemented ; \ historical ! 141: : fb1-reset-screen fb1-nonimplemented ; ! 142: : fb1-toggle-cursor fb1-nonimplemented ; ! 143: : fb1-erase-screen fb1-nonimplemented ; ! 144: : fb1-blink-screen fb1-nonimplemented ; ! 145: : fb1-invert-screen fb1-nonimplemented ; ! 146: : fb1-insert-characters fb1-nonimplemented ; ! 147: : fb1-delete-characters fb1-nonimplemented ; ! 148: : fb1-insert-lines fb1-nonimplemented ; ! 149: : fb1-delete-lines fb1-nonimplemented ; ! 150: : fb1-slide-up fb1-nonimplemented ; ! 151: : fb1-draw-logo fb1-nonimplemented ; ! 152: : fb1-install fb1-nonimplemented ; ! 153: ! 154: ! 155: \ 5.3.6.3.3 Generic eight-bit frame-buffer support ! 156: ! 157: \ The following two functions are unrolled for speed. ! 158: ! 159: ! 160: \ blit 8 continuous pixels described by the 8bit ! 161: \ value in bitmask8. The most significant bit is ! 162: \ painted first. ! 163: ! 164: \ this function should honour fg and bg colors ! 165: ! 166: : fb8-write-mask8 ( bitmask8 faddr -- ) ! 167: over 1 and 0<> over 7 + c! ! 168: over 2 and 0<> over 6 + c! ! 169: over 4 and 0<> over 5 + c! ! 170: over 8 and 0<> over 4 + c! ! 171: over 10 and 0<> over 3 + c! ! 172: over 20 and 0<> over 2 + c! ! 173: over 40 and 0<> over 1 + c! ! 174: over 80 and 0<> over 0 + c! ! 175: 2drop ! 176: ; ! 177: ! 178: : fb8-blitmask ( fbaddr mask-addr width height -- ) ! 179: over >r \ save width ( -- R: width ) ! 180: * 3 >> \ fbaddr mask-addr width*height/8 ! 181: bounds \ fbaddr mask-end mask ! 182: r> 0 2swap \ fbaddr width 0 mask-end mask ! 183: ?do \ ( fbaddr width l-cnt ) ! 184: 2 pick over + \ fbaddr-current ! 185: i c@ \ bitmask8 ! 186: swap fb8-write-mask8 ! 187: ( fbaddr width l-cnt ) ! 188: 8 + 2dup = if ! 189: drop swap screen-width + ! 190: swap 0 ! 191: then ! 192: ( fbaddr width l-cnt ) ! 193: loop ! 194: 2drop drop ! 195: ; ! 196: ! 197: : fb8-line2addr ( line -- addr ) ! 198: window-top + ! 199: screen-width * ! 200: frame-buffer-adr + ! 201: window-left + ! 202: ; ! 203: ! 204: : fb8-copy-line ( from to -- ) ! 205: fb8-line2addr swap ! 206: fb8-line2addr swap ! 207: #columns char-width * move ! 208: ; ! 209: ! 210: : fb8-clear-line ( line -- ) ! 211: fb8-line2addr ! 212: #columns char-width * ! 213: background-color fill ! 214: \ 0 fill ! 215: ; ! 216: ! 217: : fb8-draw-character ( char -- ) ! 218: \ draw the character: ! 219: >font ! 220: line# char-height * window-top + screen-width * ! 221: column# char-width * window-left + + frame-buffer-adr + ! 222: swap char-width char-height ! 223: fb8-blitmask ! 224: \ now advance the position ! 225: column# 1+ ! 226: dup #columns = if ! 227: drop 0 to column# ! 228: line# 1+ ! 229: dup #lines = if ! 230: drop ! 231: \ FIXME move up screen (and keep position) ! 232: else ! 233: to #lines ! 234: then ! 235: else ! 236: to column# ! 237: then ! 238: ; ! 239: ! 240: : fb8-reset-screen ( -- ) ! 241: false to inverse? ! 242: false to inverse-screen? ! 243: 0 to foreground-color ! 244: d# 15 to background-color ! 245: ; ! 246: ! 247: : fb8-toggle-cursor ( -- ) ! 248: line# char-height * window-top + screen-width * ! 249: column# char-width * window-left + + frame-buffer-adr + ! 250: char-height 0 ?do ! 251: char-width 0 ?do ! 252: dup i + dup c@ invert ff and swap c! ! 253: loop ! 254: screen-width + ! 255: loop ! 256: drop ! 257: ; ! 258: ! 259: : fb8-erase-screen ( -- ) ! 260: frame-buffer-adr ! 261: screen-height screen-width * ! 262: inverse-screen? if ! 263: foreground-color ! 264: else ! 265: background-color ! 266: then ! 267: fill ! 268: ; ! 269: ! 270: : fb8-invert-screen ( -- ) ! 271: frame-buffer-adr ! 272: screen-height screen-width * ! 273: bounds ?do ! 274: i c@ case ! 275: foreground-color of background-color endof ! 276: background-color of foreground-color endof ! 277: dup ! 278: endcase ! 279: i c! ! 280: loop ! 281: ; ! 282: ! 283: : fb8-blink-screen ( -- ) ! 284: fb8-invert-screen fb8-invert-screen ! 285: ; ! 286: ! 287: : fb8-insert-characters ( n -- ) ! 288: ; ! 289: ! 290: : fb8-delete-characters ( n -- ) ! 291: ; ! 292: ! 293: : fb8-insert-lines ( n -- ) ! 294: ; ! 295: ! 296: : fb8-delete-lines ( n -- ) ! 297: \ numcopy = ( #lines - ( line# + n )) * char-height ! 298: #lines over #line + - char-height * ! 299: ! 300: ( numcopy ) 0 ?do ! 301: dup line# + char-height * i + ! 302: line# char-height * i + ! 303: swap fb8-copy-line ! 304: loop ! 305: ! 306: #lines over - char-height * ! 307: over char-height * ! 308: 0 ?do ! 309: dup i + fb8-clear-line ! 310: loop ! 311: ! 312: 2drop ! 313: ; ! 314: ! 315: ! 316: : fb8-draw-logo ( line# addr width height -- ) ! 317: 2swap swap ! 318: char-height * window-top + ! 319: screen-width * window-left + ! 320: frame-buffer-adr + ! 321: swap 2swap ! 322: \ in-fb-start-adr logo-adr logo-width logo-height ! 323: ! 324: fb8-blitmask ( fbaddr mask-addr width height -- ) ! 325: ; ! 326: ! 327: ! 328: : fb8-install ( width height #columns #lines -- ) ! 329: ! 330: \ set state variables ! 331: to #lines ! 332: to #columns ! 333: to screen-height ! 334: to screen-width ! 335: ! 336: screen-width #columns char-width * - 2/ to window-left ! 337: screen-height #lines char-height * - 2/ to window-top ! 338: ! 339: 0 to column# ! 340: 0 to line# ! 341: 0 to inverse? ! 342: 0 to inverse-screen? ! 343: ! 344: \ set defer functions to 8bit versions ! 345: ! 346: ['] fb8-draw-character to draw-character ! 347: ['] fb8-toggle-cursor to toggle-cursor ! 348: ['] fb8-erase-screen to erase-screen ! 349: ['] fb8-blink-screen to blink-screen ! 350: ['] fb8-invert-screen to invert-screen ! 351: ['] fb8-insert-characters to insert-characters ! 352: ['] fb8-delete-characters to delete-characters ! 353: ['] fb8-insert-lines to insert-lines ! 354: ['] fb8-delete-lines to delete-lines ! 355: ['] fb8-draw-logo to draw-logo ! 356: ['] fb8-reset-screen to reset-screen ! 357: ! 358: \ recommended practice ! 359: s" iso6429-1983-colors" get-my-property if ! 360: 0 ff ! 361: else ! 362: 2drop d# 15 0 ! 363: then ! 364: to foreground-color to background-color ! 365: ! 366: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.