|
|
1.1 root 1: \ *****************************************************************************
2: \ * Copyright (c) 2011 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: my-space pci-device-generic-setup
14:
15: \ Defaults, overriden from qemu
16: d# 800 VALUE disp-width
17: d# 600 VALUE disp-height
18: d# 8 VALUE disp-depth
19:
20: \ Determine base address
21: 10 config-l@ translate-my-address 3 not AND VALUE fb-base
22:
23: \ Fixed up later
24: -1 VALUE io-base
25:
26: \ We support only one instance
27: false VALUE is-installed?
28:
29: : vga-io-xlate ( port -- addr )
30: io-base -1 = IF
31: dup translate-my-address fff not and to io-base
32: THEN
33: io-base +
34: ;
35:
36: : vga-w! ( value port -- )
37: vga-io-xlate rw!-le
38: ;
39:
40: : vga-w@ ( port -- value )
41: vga-io-xlate rw@-le
42: ;
43:
44: : vga-b! ( value port -- )
45: vga-io-xlate rb!
46: ;
47:
48: : vga-b@ ( port -- value )
49: vga-io-xlate rb@
50: ;
51:
52: : vbe! ( value index -- )
53: 1ce vga-w! 1d0 vga-w!
54: ;
55:
56: : vbe@ ( index -- value )
57: 1ce vga-w! 1d0 vga-w@
58: ;
59:
60:
61: \ **************************************************************************
62: \ ** These come from vga-display.fs and should probably be moved to a common
63: \ ** location.
64:
65: : draw-rectangle ( adr x y w h -- )
66: is-installed? IF
67: 0 ?DO
68: 4dup ( adr x y w adr x y w )
69: drop ( adr x y w adr x y )
70: i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
71: ( adr x y w adr offs )
72: frame-buffer-adr + \ add to frame-buffer-adr ( adr x y w adr fb_adr )
73: 1 pick 3 pick i * + swap 3 pick ( adr x y w adr adr_offs fb_adr w )
74: rmove \ copy line ( adr x y w adr )
75: drop ( adr x y w )
76: LOOP
77: 4drop
78: ELSE
79: 4drop drop
80: THEN
81: ;
82:
83: : fill-rectangle ( number x y w h -- )
84: is-installed? IF
85: 0 ?DO
86: 4dup ( number x y w number x y w )
87: drop ( number x y w number x y )
88: i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
89: ( number x y w number offs )
90: frame-buffer-adr + \ add to frame-buffer-adr ( number x y w number adr )
91: 2 pick 2 pick ( number x y w number adr w number )
92: rfill \ draw line ( number x y w number )
93: drop ( number x y w )
94: LOOP
95: 4drop
96: ELSE
97: 4drop drop
98: THEN
99: ;
100:
101: : read-rectangle ( adr x y w h -- )
102: is-installed? IF
103: 0 ?DO
104: 4dup ( adr x y w adr x y w )
105: drop ( adr x y w adr x y )
106: i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
107: ( adr x y w adr offs )
108: frame-buffer-adr + \ add to frame-buffer-adr ( adr x y w adr fb_adr )
109: 1 pick 3 pick i * + 3 pick ( adr x y w adr fb_adr adr_offs w )
110: rmove \ copy line ( adr x y w adr )
111: drop ( adr x y w )
112: LOOP
113: 4drop
114: ELSE
115: 4drop drop
116: THEN
117: ;
118:
119: \ ** end of copy from vga-display.fs
120: \ **************************************************************************
121:
122: : color! ( r g b number -- )
123: 3c8 vga-b!
124: rot 3c9 vga-b!
125: swap 3c9 vga-b!
126: 3c9 vga-b!
127: ;
128:
129: : color@ ( number -- r g b )
130: 3c8 vga-b!
131: 3c9 vga-b@
132: 3c9 vga-b@
133: 3c9 vga-b@
134: ;
135:
136: : set-colors ( adr number #numbers -- )
137: over 3c8 vga-b!
138: swap DO
139: rb@ 3c9 vga-b!
140: rb@ 3c9 vga-b!
141: rb@ 3c9 vga-b!
142: LOOP
143: 3drop
144: ;
145:
146: : get-colors ( adr number #numbers -- )
147: 3drop
148: ;
149:
150: : default-palette
151: \ Grayscale ramp for now, be smarter later
152: 100 0 DO
153: i i i i color!
154: LOOP
155: ;
156:
157: \ qemu fake VBE IO registers
158: 0 CONSTANT VBE_DISPI_INDEX_ID
159: 1 CONSTANT VBE_DISPI_INDEX_XRES
160: 2 CONSTANT VBE_DISPI_INDEX_YRES
161: 3 CONSTANT VBE_DISPI_INDEX_BPP
162: 4 CONSTANT VBE_DISPI_INDEX_ENABLE
163: 5 CONSTANT VBE_DISPI_INDEX_BANK
164: 6 CONSTANT VBE_DISPI_INDEX_VIRT_WIDTH
165: 7 CONSTANT VBE_DISPI_INDEX_VIRT_HEIGHT
166: 8 CONSTANT VBE_DISPI_INDEX_X_OFFSET
167: 9 CONSTANT VBE_DISPI_INDEX_Y_OFFSET
168: a CONSTANT VBE_DISPI_INDEX_NB
169:
170: \ ENABLE register
171: 00 CONSTANT VBE_DISPI_DISABLED
172: 01 CONSTANT VBE_DISPI_ENABLED
173: 02 CONSTANT VBE_DISPI_GETCAPS
174: 20 CONSTANT VBE_DISPI_8BIT_DAC
175: 40 CONSTANT VBE_DISPI_LFB_ENABLED
176: 80 CONSTANT VBE_DISPI_NOCLEARMEM
177:
178: : init-mode
179: 0 3c0 vga-b!
180: VBE_DISPI_DISABLED VBE_DISPI_INDEX_ENABLE vbe!
181: 0 VBE_DISPI_INDEX_X_OFFSET vbe!
182: 0 VBE_DISPI_INDEX_Y_OFFSET vbe!
183: disp-width VBE_DISPI_INDEX_XRES vbe!
184: disp-height VBE_DISPI_INDEX_YRES vbe!
185: disp-depth VBE_DISPI_INDEX_BPP vbe!
186: VBE_DISPI_ENABLED VBE_DISPI_8BIT_DAC or VBE_DISPI_INDEX_ENABLE vbe!
187: 0 3c0 vga-b!
188: 20 3c0 vga-b!
189: ;
190:
191: : clear-screen
192: fb-base disp-width disp-height disp-depth 7 + 8 / * * 0 rfill
193: ;
194:
195: : read-settings
196: s" qemu,graphic-width" get-chosen IF
197: decode-int to disp-width 2drop
198: THEN
199: s" qemu,graphic-height" get-chosen IF
200: decode-int to disp-height 2drop
201: THEN
202: s" qemu,graphic-depth" get-chosen IF
203: decode-int nip nip
204: dup 8 =
205: over f = or
206: over 10 = or
207: over 20 = or IF
208: to disp-depth
209: ELSE
210: ." Unsupported bit depth, using 8bpp " drop cr
211: THEN
212: THEN
213: ;
214:
215: : add-legacy-reg
216: \ add legacy I/O Ports / Memory regions to assigned-addresses
217: \ see PCI Bus Binding Revision 2.1 Section 7.
218: s" reg" get-node get-property IF
219: \ "reg" does not exist, create new
220: encode-start
221: ELSE
222: \ "reg" does exist, copy it
223: encode-bytes
224: THEN
225: \ I/O Range 0x1ce-0x1d2
226: my-space a1000000 or encode-int+ \ non-relocatable, aliased I/O space
227: 1ce encode-64+ 4 encode-64+ \ addr size
228: \ I/O Range 0x3B0-0x3BB
229: my-space a1000000 or encode-int+ \ non-relocatable, aliased I/O space
230: 3b0 encode-64+ c encode-64+ \ addr size
231: \ I/O Range 0x3C0-0x3DF
232: my-space a1000000 or encode-int+ \ non-relocatable, aliased I/O space
233: 3c0 encode-64+ 20 encode-64+ \ addr size
234: \ Memory Range 0xA0000-0xBFFFF
235: my-space a2000000 or encode-int+ \ non-relocatable, <1MB Memory space
236: a0000 encode-64+ 20000 encode-64+ \ addr size
237: s" reg" property \ store "reg" property
238: ;
239:
240: : setup-properties
241: \ Shouldn't this be done from open ?
242: disp-width encode-int s" width" property
243: disp-height encode-int s" height" property
244: disp-width disp-depth 7 + 8 / * encode-int s" linebytes" property
245: disp-depth encode-int s" depth" property
246: s" ISO8859-1" encode-string s" character-set" property \ i hope this is ok...
247: \ add "device_type" property
248: s" display" encode-string s" device_type" property
249: s" qemu,std-vga" encode-string s" compatible" property
250: \ XXX We don't create an "address" property because Linux doesn't know what
251: \ to do with it for >32-bit
252: ;
253:
254: \ words for installation/removal, needed by is-install/is-remove, see display.fs
255: : display-remove ( -- )
256: ;
257:
258: : display-install ( -- )
259: is-installed? NOT IF
260: ." Installing QEMU fb" cr
261: fb-base to frame-buffer-adr
262: clear-screen
263: default-font
264: set-font
265: disp-width disp-height
266: disp-width char-width / disp-height char-height /
267: disp-depth 7 + 8 / ( width height #lines #cols depth )
268: fb-install
269: true to is-installed?
270: THEN
271: ;
272:
273: : dimensions ( -- width height )
274: disp-width disp-height
275: ;
276:
277: : set-alias
278: s" screen" find-alias 0= IF
279: \ no previous screen alias defined, define it...
280: s" screen" get-node node>path set-alias
281: ELSE
282: drop
283: THEN
284: ;
285:
286:
287: ." qemu vga" cr
288:
289: pci-master-enable
290: pci-mem-enable
291: pci-io-enable
292: add-legacy-reg
293: read-settings
294: init-mode
295: default-palette
296: setup-properties
297: ' display-install is-install
298: ' display-remove is-remove
299: set-alias
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.