|
|
1.1 root 1: \ *****************************************************************************
2: \ * Copyright (c) 2004, 2008 IBM Corporation
3: \ * All rights reserved.
4: \ * This program and the accompanying materials
5: \ * are made available under the terms of the BSD License
6: \ * which accompanies this distribution, and is available at
7: \ * http://www.opensource.org/licenses/bsd-license.php
8: \ *
9: \ * Contributors:
10: \ * IBM Corporation - initial implementation
11: \ ****************************************************************************/
12:
13: \ included by pci-class_03.fs
14:
15: ( str len display_num ) \ name prefix
16:
17: false value is-installed?
18: value display_num ( str len )
19:
20: s" ,Display-" $cat 41 display_num + char-cat \ add ", Display-A" or "-B" to name ( str len )
21: encode-string s" name" property \ store as name property
22:
23: s" display" encode-string s" device_type" property \ add "device_type" propert
24:
25: \ screen-info is set by pci-class_03.fs contains output of get_vbe_info bios-snk call
26: CASE screen-info c@ \ ( display-type )
27: 0 OF s" NONE" ENDOF \ No display
28: 1 OF s" Analog" ENDOF
29: 2 OF s" Digital" ENDOF
30: ENDCASE
31: encode-string s" display-type" property
32:
33: screen-info 8 + l@ value mem-adr
34: screen-info 1 + w@ value width
35: screen-info 3 + w@ value height
36:
37: screen-info c@ IF
38: \ if screen-info is not 0, we have some screen attached, add needed properties...
39: width encode-int s" width" property
40: height encode-int s" height" property
41: screen-info 5 + w@ encode-int s" linebytes" property
42: screen-info 7 + c@ encode-int s" depth" property
43: mem-adr encode-int s" address" property
44: \ the EDID property breaks the boot... so i leave it out for now,
45: \ maybe encode-bytes does s.th. wrong???
46: \ screen-info c + 80 encode-bytes s" EDID" property
47: s" ISO8859-1" encode-string s" character-set" property \ i hope this is ok...
48: THEN
49:
50: \ words for installation/removal, needed by is-install/is-remove, see display.fs
51: : display-remove ( -- )
52: ;
53: : display-install ( -- )
54: is-installed? NOT IF
55: mem-adr to frame-buffer-adr
56: default-font
57: set-font
58: width height width char-width / height char-height / ( width height #lines #cols )
59: fb8-install
60: true to is-installed?
61: THEN
62: ;
63:
64: \ as of OF 8bit Graphics Recommendation, these shall be implemented:
65:
66: : draw-rectangle ( adr x y w h -- )
67: is-installed? IF
68: 0 ?DO
69: 4dup ( adr x y w adr x y w )
70: drop ( adr x y w adr x y )
71: i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
72: ( adr x y w adr offs )
73: frame-buffer-adr + \ add to frame-buffer-adr ( adr x y w adr fb_adr )
74: 1 pick 3 pick i * + swap 3 pick ( adr x y w adr adr_offs fb_adr w )
75: rmove \ copy line ( adr x y w adr )
76: drop ( adr x y w )
77: LOOP
78: 4drop
79: ELSE
80: 4drop drop
81: THEN
82: ;
83:
84: : fill-rectangle ( number x y w h -- )
85: is-installed? IF
86: 0 ?DO
87: 4dup ( number x y w number x y w )
88: drop ( number x y w number x y )
89: i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
90: ( number x y w number offs )
91: frame-buffer-adr + \ add to frame-buffer-adr ( number x y w number adr )
92: 2 pick 2 pick ( number x y w number adr w number )
93: rfill \ draw line ( number x y w number )
94: drop ( number x y w )
95: LOOP
96: 4drop
97: ELSE
98: 4drop drop
99: THEN
100: ;
101:
102: : read-rectangle ( adr x y w h -- )
103: is-installed? IF
104: 0 ?DO
105: 4dup ( adr x y w adr x y w )
106: drop ( adr x y w adr x y )
107: i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
108: ( adr x y w adr offs )
109: frame-buffer-adr + \ add to frame-buffer-adr ( adr x y w adr fb_adr )
110: 1 pick 3 pick i * + 3 pick ( adr x y w adr fb_adr adr_offs w )
111: rmove \ copy line ( adr x y w adr )
112: drop ( adr x y w )
113: LOOP
114: 4drop
115: ELSE
116: 4drop drop
117: THEN
118: ;
119:
120: : color! ( r g b number -- )
121: \ 3c8 is RAMDAC write mode select palette entry register
122: \ 3c9 is RAMDAC write mode write palette entry register ( 3 consecutive writes set new entry )
123: vga-device-node? 3c8 translate-address ( r g b number address )
124: swap 1 pick ( r g b address number address )
125: rb! \ write palette entry number ( r g b address )
126: 1 + \ select next register (3c9)
127: dup 4 pick swap rb! \ write red ( r g b address )
128: dup 3 pick swap rb! \ write green ( r g b address )
129: dup 2 pick swap rb! \ write blue ( r g b address )
130: 4drop
131: ;
132:
133: : color@ ( number -- r g b )
134: \ 3c7 is RAMDAC read mode select palette entry register
135: \ 3c9 is RAMDAC read mode read palette entry register ( 3 consecutive reads read entry )
136: vga-device-node? 3c7 translate-address ( number address )
137: swap 1 pick ( address number address )
138: rb! \ write palette entry number ( address )
139: 2 + >r \ select next register (3c9) ( R: address )
140: r@ rb@ \ read red ( r R: address )
141: r@ rb@ \ read green ( r g R: address )
142: r@ rb@ \ write blue ( r g b R: address )
143: r> drop ( r g b )
144: ;
145:
146: : set-colors ( adr number #numbers -- )
147: \ 3c8 is RAMDAC write mode select palette entry register
148: \ 3c9 is RAMDAC write mode write palette entry register ( 3 consecutive writes set new entry )
149: \ since after writing 3 entries, the palette entry is automagically incremented,
150: \ we can just continue writing...
151: vga-device-node? 3c8 translate-address ( adr number #numbers )
152: dup 3 pick swap ( adr number #numbers address number address )
153: rb! \ write palette entry number ( adr number #numbers address )
154: 1 + \ select next register (3c9)
155: -rot swap drop ( adr address #numbers )
156: -rot swap rot ( address adr #numbers )
157: 0 ?DO
158: ( address adr )
159: dup rb@ \ read red value from adr ( address adr r )
160: 2 pick rb! \ write to register ( address adr )
161: 1 + \ next adr
162: dup rb@ \ read green value from adr ( address adr g )
163: 2 pick rb! \ write to register ( address adr )
164: 1 + \ next adr
165: dup rb@ \ read blue value from adr ( address adr r )
166: 2 pick rb! \ write to register ( address adr )
167: 1 + \ next adr
168: LOOP
169: 2drop
170: ;
171:
172: : get-colors ( adr number #numbers -- )
173: \ 3c7 is RAMDAC read mode select palette entry register
174: \ 3c9 is RAMDAC read mode read palette entry register ( 3 consecutive reads get entry )
175: \ since after reading 3 entries, the palette entry is automagically incremented,
176: \ we can just continue reading...
177: vga-device-node? 3c7 translate-address ( adr number #numbers )
178: dup 3 pick swap ( adr number #numbers address number address )
179: rb! \ write palette entry number ( adr number #numbers address )
180: 2 + \ select next register (3c9)
181: -rot swap drop ( adr address #numbers )
182: -rot swap rot ( address adr #numbers )
183: 0 ?DO
184: ( address adr )
185: 1 pick rb@ \ read red value from register ( address adr r )
186: 1 pick rb! \ write to adr ( address adr )
187: 1 + \ next adr
188: 1 pick rb@ \ read green value from register ( address adr g )
189: 1 pick rb! \ write to adr ( address adr )
190: 1 + \ next adr
191: 1 pick rb@ \ read blue value from register ( address adr b )
192: 1 pick rb! \ write to adr ( address adr )
193: 1 + \ next adr
194: LOOP
195: 2drop
196: ;
197:
198: : dimensions ( -- width height )
199: width height
200: ;
201:
202: \ clear screen
203: mem-adr width height * 0 rfill
204:
205: \ call is-install and is-remove
206: ' display-install is-install
207:
208: ' display-remove is-remove
209:
210: s" screen" find-alias 0= IF
211: \ no previous screen alias defined, define it...
212: s" screen" get-node node>path set-alias
213: ELSE
214: drop
215: THEN
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.