|
|
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: my-space pci-class-name type
14:
15: my-space assign-all-device-bars
16: my-space pci-device-props
17: my-space pci-set-irq-line
18:
19: 7 4 config-w!
20:
21: \ Special notice from ATI:
22: \ ATI TECHNOLOGIES INC. ("ATI") HAS NOT ASSISTED IN THE CREATION OF,
23: \ AND DOES NOT ENDORSE THE USE OF, THIS SOFTWARE. ATI WILL NOT BE
24: \ RESPONSIBLE OR LIABLE FOR ANY ACTUAL OR ALLEGED DAMAGE OR LOSS
25: \ CAUSED BY OR IN CONNECTION WITH THE USE OF, OR RELIANCE ON,
26: \ THIS SOFTWARE.
27:
28: \ Description: This FCODE driver initializes the RN50 (ES1000) ATI
29: \ adaptor.
30:
31: -1 value mem-addr
32: -1 value regs-addr
33: false value is_installed
34:
35: : >rn [ 18 config-l@ -10 and ] LITERAL + ;
36: : rn! >rn rl!-le ;
37: : rn@ >rn rl@-le ;
38: : reg-rl@ rn@ ;
39: : reg-rl! rn! ;
40: : map-in " map-in" $call-parent ;
41: : map-out " map-out" $call-parent ;
42: : pc@ ( offset -- byte ) >rn rb@ ;
43: : pc! ( byte offset -- ) >rn rb! ;
44:
45: 0 value phys_low
46: 0 value phys_mid
47: 0 value phys_high
48: 0 value phys_len
49:
50: : MAP-CSR-BASE ( -- )
51: " assigned-addresses" get-my-property 0= if
52: begin dup 0> while ( prop-addr len )
53: \ Get the phys-hi mid low and the low order 32 bits of the length
54:
55: decode-phys to phys_high to phys_mid to phys_low decode-int drop decode-int to phys_len
56:
57: phys_high H# FF and \ See which BAR this refers to
58: case
59: h# 10 of phys_low phys_mid phys_high h# 1000000 map-in to mem-addr endof
60: h# 18 of phys_low phys_mid phys_high phys_len map-in to regs-addr endof
61: endcase
62: repeat
63: ( prop-addr 0 ) 2drop
64: then
65:
66: ;
67:
68: : enable-card my-space 4 + dup config-b@ 3 or swap config-b! ;
69:
70: : EARLY-MAP ( -- )
71:
72: " reg" get-my-property 0= if
73: begin dup 0> while ( prop-addr len )
74:
75: \ Get the phys-hi mid low and the low order 32 bits of the length
76:
77: decode-phys to phys_high to phys_mid to phys_low decode-int drop decode-int to phys_len
78:
79: phys_high H# FF and \ See which BAR this refers to
80: case
81: h# 10 of phys_low phys_mid phys_high H# 1000000 map-in to mem-addr endof
82: h# 18 of phys_low phys_mid phys_high h# 1000 map-in to regs-addr endof
83: endcase
84: repeat
85: ( prop-addr 0 ) 2drop
86: then
87: ;
88:
89: : EARLY-UNMAP ( -- )
90:
91: mem-addr -1 <> if
92: mem-addr h# 1000000 map-out
93: -1 to mem-addr
94: then
95:
96: regs-addr -1 <> if
97: regs-addr h# 1000 map-out
98: -1 to regs-addr
99: then
100:
101: ;
102:
103: CREATE INIT1_ARRAY
104: H# 0F8 ( CONFIG_MEMSIZE ) L, H# 00000000 L, H# 01000000 L,
105: H# 1C0 ( MPP_TB_CONFIG ) L, H# 00FFFFFF L, H# 07000000 L,
106: H# 030 ( BUS_CNTL ) L, H# 00000000 L, H# 5133A3B0 L,
107: H# 0EC ( RBBM_CNTL ) L, H# 00000000 L, h# 00004443 L,
108: H# 1D0 ( DEBUG_CNTL ) L, H# FFFFFFFD L, H# 00000002 L,
109: H# 050 ( CRTC_GEN_CNTL ) L, H# 00000000 L, H# 04000000 L,
110: H# 058 ( DAC_CNTL ) L, H# 00000000 L, H# FF604102 L,
111: H# 168 ( PAD_CTLR_STRENGTH ) L, H# FFFEFFFF L, H# 00001200 L,
112: H# 178 ( MEM_REFRESH_CNTL ) L, H# 00000000 L, H# 88888888 L,
113: H# 17C ( MEM_READ_CNTL ) L, H# 00000000 L, H# B7C20000 L,
114: H# 188 ( MC_DEBUG ) L, H# FFFFFFFF L, H# 00000000 L,
115: H# D00 ( DISP_MISC_CNTL) L, H# 00FFFFFF L, H# 5B000000 L,
116: H# 88C ( TV_DAC_CNTL ) L, H# F800FCEF L, H# 00490200 L,
117: H# D04 ( DAC_MACRO_CNTL) L, H# 00000000 L, H# 00000905 L,
118: H# 284 ( FP_GEN_CNTL ) L, H# FFFFFFFF L, H# 00000008 L,
119: H# 030 ( BUS_CNTL ) L, H# FFFFFFEF L, H# 00000000 L,
120:
121: here INIT1_ARRAY - /L / CONSTANT INIT1_LENGTH
122:
123:
124: CREATE INIT2_ARRAY
125:
126: H# 140 ( MEM_CNTL ) L, H# 00000000 L, H# 38001A01 L, 0 L,
127: H# 158 ( MEM_SDRAM_MODE_REG ) L, H# E0000000 L, H# 08320032 L, 0 L,
128: H# 144 ( MEM_TIMING_CNTL ) L, H# 00000000 L, H# 20123833 L, 0 L,
129: H# 14C ( MC_AGP_LOCATION ) L, H# 00000000 L, H# 000FFFF0 L, 0 L,
130: H# 148 ( MC_FB_LOCATION ) L, H# 00000000 L, H# FFFF0000 L, 0 L,
131: H# 154 ( MEM_INIT_LAT_TIMER ) L, H# 00000000 L, H# 34444444 L, 0 L,
132: H# 18C ( MC_CHP_IO_OE_CNTL ) L, H# 00000000 L, H# 0A540002 L, 0 L,
133: H# 910 ( FCP_CNTL ) L, H# 00000000 L, H# 00000004 L, 0 L,
134: H# 010 ( BIOS_0_SCRATCH ) L, H# FFFFFFFB L, H# 00000004 L, 0 L,
135: H# D64 ( DISP_OUTPUT_CNTL ) L, H# FFFFFBFF L, H# 00000000 L, 0 L,
136: H# 2A8 ( TMDS_PLL_CNTL ) L, H# 00000000 L, H# 00000A1B L, 0 L,
137: H# 800 ( TV_MASTER_CNTL ) L, H# BFFFFFFF L, H# 40000000 L, 0 L,
138: H# D10 ( DISP_TEST_DBUG_CTL ) L, H# EFFFFFFF L, H# 10000000 L, 0 L,
139: H# 4DC ( OV0_FLAG_CNTRL ) L, H# FFFFFEFF L, H# 00000100 L, 0 L,
140: H# 034 ( BUS_CNTL1 ) L, H# 73FFFFFF L, H# 84000000 L, 0 L,
141: H# 174 ( AGP_CNTL ) L, H# FFEFFF00 L, H# 001E0000 L, 0 L,
142: H# 18C ( MC_CHP_IO_OE_CNTL ) L, H# FFFFFFF9 L, H# 00000006 L, h# 000A L,
143: H# 18C ( MC_CHP_IO_OE_CNTL ) L, H# FFFFFFFB L, H# 00000000 L, H# 000A L,
144: H# 18C ( MC_CHP_IO_OE_CNTL ) L, H# FFFFFFFD L, H# 00000000 L, 0 L,
145:
146: here INIT2_ARRAY - /L / CONSTANT INIT2_LENGTH
147:
148: CREATE PLLINIT_ARRAY
149:
150: H# 0D L, H# FFFFFFFF L, H# FFFF8000 L, 0 L,
151: H# 12 L, H# FFFFFFFF L, H# 00350000 L, 0 L,
152: H# 08 L, H# FFFFFFFF L, H# 00000000 L, 0 L,
153: H# 2D L, H# FFFFFFFF L, H# 00000000 L, 0 L,
154: H# 1F L, H# FFFFFFFF L, H# 0000000A L, 5 L,
155: H# 03 L, H# FFFFFFFF L, H# 0000003C L, 0 L,
156: H# 0A L, H# FFFFFFFF L, H# 00252504 L, 0 L,
157: H# 25 L, H# FFFFFFFF L, H# 00000005 L, 0 L,
158: H# 0E L, H# FFFFFFFF L, H# 04756400 L, 0 L,
159: H# 0C L, H# FFFFFFFF L, H# 04006401 L, 0 L,
160: H# 02 L, H# FFFFFFFF L, H# 0000A703 L, 0 L,
161: H# 0F L, H# FFFFFFFF L, H# 0000051C L, 0 L,
162: H# 10 L, H# FFFFFFFF L, H# 04000400 L, 5 L,
163: H# 0E L, H# FFFFFFFD L, H# 00000000 L, 5 L,
164: H# 0E L, H# FFFFFFFE L, H# 00000000 L, 5 L,
165: H# 12 L, H# FFFFFFFF L, H# 00350012 L, 5 L,
166: H# 0F L, H# FFFFFFFE L, H# 00000000 L, 6 L,
167: H# 10 L, H# FFFFFFFE L, H# 00000000 L, 5 L,
168: H# 10 L, H# FFFEFFFF L, H# 00000000 L, 6 L,
169: H# 0F L, H# FFFFFFFD L, H# 00000000 L, 5 L,
170: H# 10 L, H# FFFFFFFD L, H# 00000000 L, 5 L,
171: H# 10 L, H# FFFDFFFF L, H# 00000000 L, d# 10 L,
172: H# 0C L, H# FFFFFFFE L, H# 00000000 L, 6 L,
173: H# 0C L, H# FFFFFFFD L, H# 00000000 L, 5 L,
174: h# 0D L, H# FFFFFFFF L, H# FFFF8007 L, 5 L,
175: H# 08 L, H# FFFFFF3C L, H# 00000000 L, 0 L,
176: H# 02 L, H# FFFFFFFF L, H# 00000003 L, 0 L,
177: H# 04 L, H# FFFFFFFF L, H# 000381C0 L, 0 L,
178: H# 05 L, H# FFFFFFFF L, H# 000381F7 L, 0 L,
179: H# 06 L, H# FFFFFFFF L, H# 000381C0 L, 0 L,
180: H# 07 L, H# FFFFFFFF L, H# 000381F7 L, 0 L,
181: H# 02 L, H# FFFFFFFD L, H# 00000000 L, 6 L,
182: H# 02 L, H# FFFFFFFE L, H# 00000000 L, 5 L,
183: h# 08 L, H# FFFFFF3C L, H# 00000003 L, 5 L,
184: H# 0B L, H# FFFFFFFF L, H# 78000800 L, 0 L,
185: H# 0B L, H# FFFFFFFF L, H# 00004000 L, 0 L,
186: h# 01 L, h# FFFFFFFF L, H# 00000010 L, 0 L,
187:
188: here PLLINIT_ARRAY - /L / CONSTANT PLLINIT_LENGTH
189:
190: CREATE MEMINIT_ARRAY
191: h# 6FFF0000 L, H# 00004000 L, H# 6FFF0000 L, H# 80004000 L,
192: h# 6FFF0000 L, H# 00000132 L, H# 6FFF0000 L, H# 80000132 L,
193: h# 6FFF0000 L, H# 00000032 L, H# 6FFF0000 L, H# 80000032 L,
194: h# 6FFF0000 L, H# 10000032 L,
195: here MEMINIT_ARRAY - /L / CONSTANT MEMINIT_LENGTH
196: : L@+ ( addr -- value addr' )
197:
198: dup l@ swap la1+
199: ;
200:
201: 0 VALUE _len
202:
203: : ENCODE-ARRAY ( array len -- )
204: dup to _len 0 do l@+ swap encode-int rot loop
205: drop _len 1 - 0 ?do encode+ loop
206: ;
207:
208: : andorset ( reg and or -- )
209: 2 pick regs-addr + dup rn@
210: 3 pick AND 2 pick OR swap rn! 3drop
211: ;
212:
213: : INIT1
214: H# 0F8 ( CONFIG_MEMSIZE ) H# 00000000 H# 01000000 andorset \ Set 16Mb memory size
215: H# 1C0 ( MPP_TB_CONFIG ) H# 00FFFFFF H# 07000000 andorset
216: H# 030 ( BUS_CNTL ) H# 00000000 H# 5133A3B0 andorset
217: H# 0EC ( RBBM_CNTL ) H# 00000000 h# 00004443 andorset
218: H# 1D0 ( DEBUG_CNTL ) H# FFFFFFFD H# 00000002 andorset
219: H# 050 ( CRTC_GEN_CNTL ) H# 00000000 H# 04000000 andorset
220: H# 058 ( DAC_CNTL ) H# 00000000 H# FF604102 andorset
221: H# 168 ( PAD_CTLR_STRENGTH ) H# FFFEFFFF H# 00001200 andorset
222: H# 178 ( MEM_REFRESH_CNTL ) H# 00000000 H# 88888888 andorset
223: H# 17C ( MEM_READ_CNTL ) H# 00000000 H# B7C20000 andorset
224: H# 188 ( MC_DEBUG ) H# FFFFFFFF H# 00000000 andorset
225: H# D00 ( DISP_MISC_CNTL) H# 00FFFFFF H# 5B000000 andorset
226: H# 88C ( TV_DAC_CNTL ) H# F800FCEF H# 00490200 andorset
227: H# D04 ( DAC_MACRO_CNTL) H# 00000000 H# 00000905 andorset
228: H# 284 ( FP_GEN_CNTL ) H# FFFFFFFF H# 00000008 andorset
229: H# 030 ( BUS_CNTL ) H# FFFFFFEF H# 00000000 andorset
230: ;
231:
232:
233: : INIT2
234: H# 140 ( MEM_CNTL ) H# 00000000 H# 38001A01 andorset
235: H# 158 ( MEM_SDRAM_MODE_REG ) H# E0000000 H# 08320032 andorset
236: H# 144 ( MEM_TIMING_CNTL ) H# 00000000 H# 20123833 andorset
237: H# 14C ( MC_AGP_LOCATION ) H# 00000000 H# 000FFFF0 andorset
238: H# 148 ( MC_FB_LOCATION ) H# 00000000 H# FFFF0000 andorset
239: H# 154 ( MEM_INIT_LAT_TIMER ) H# 00000000 H# 34444444 andorset
240: H# 18C ( MC_CHP_IO_OE_CNTL ) H# 00000000 H# 0A540002 andorset
241: H# 910 ( FCP_CNTL ) H# 00000000 H# 00000004 andorset
242: H# 010 ( BIOS_0_SCRATCH ) H# FFFFFFFB H# 00000004 andorset
243: H# D64 ( DISP_OUTPUT_CNTL ) H# FFFFFBFF H# 00000000 andorset
244: H# 2A8 ( TMDS_PLL_CNTL ) H# 00000000 H# 00000A1B andorset
245: H# 800 ( TV_MASTER_CNTL ) H# BFFFFFFF H# 40000000 andorset
246: H# D10 ( DISP_TEST_DEBUG_CTL ) H# EFFFFFFF H# 10000000 andorset
247: H# 4DC ( OV0_FLAG_CNTRL ) H# FFFFFEFF H# 00000100 andorset
248: H# 034 ( BUS_CNTL1 ) H# 73FFFFFF H# 84000000 andorset
249: H# 174 ( AGP_CNTL ) H# FFEFFF00 H# 001E0000 andorset
250: H# 18C ( MC_CHP_IO_OE_CNTL ) H# FFFFFFF9 H# 00000006 andorset h# 000A ms
251: H# 18C ( MC_CHP_IO_OE_CNTL ) H# FFFFFFFB H# 00000000 andorset H# 000A ms
252: H# 18C ( MC_CHP_IO_OE_CNTL ) H# FFFFFFFD H# 00000000 andorset
253: ;
254:
255: : CLK-CNTL-INDEX! 8 ( CLK_CNTL_INDEX ) reg-rl! ;
256:
257: : CLK-CNTL-INDEX@ 8 ( CLK_CNTL_INDEX ) reg-rl@ ;
258:
259: : PLLWRITEON clk-cntl-index@ H# 80 ( PLL_WR_ENABLE ) or clk-cntl-index! ;
260:
261: : PLLWRITEOFF clk-cntl-index@ H# 80 ( PLL_WR_ENABLE ) not and clk-cntl-index! ; \ Remove PLL_WR_ENABLE
262:
263: : CLKDATA! h# 0c ( CLK_CNTL_DATA ) reg-rl! ;
264:
265: : CLKDATA@ h# 0c ( CLK_CNTL_DATA ) reg-rl@ ;
266:
267: : PLLINDEXSET clk-cntl-index@ h# FFFFFFC0 and or clk-cntl-index! ;
268:
269: : PLLSET swap pllindexset clkdata! ;
270:
271: : pllandorset ( index and or -- )
272: 2 pick pllindexset clkdata@
273: 2 pick AND over OR clkdata! 3drop
274: ;
275:
276: : PLLINIT
277: pllwriteon
278: H# 0D H# FFFF8000 pllset
279: H# 12 H# 00350000 pllset
280: H# 08 H# 00000000 pllset
281: H# 2D H# 00000000 pllset
282: H# 1F H# 0000000A pllset 5 ms
283:
284: H# 03 H# 0000003C pllset
285: H# 0A H# 00252504 pllset
286: H# 25 H# 00000005 pllset
287: H# 0E H# 04756400 pllset
288: H# 0C H# 04006401 pllset
289: H# 02 H# 0000A703 pllset
290: H# 0F H# 0000051C pllset
291: H# 10 H# 04000400 pllset 5 ms
292:
293: H# 0E H# FFFFFFFD 00 pllandorset 5 ms
294: H# 0E H# FFFFFFFE 00 pllandorset 5 ms
295: H# 12 H# 00350012 pllset 5 ms
296: H# 0F H# FFFFFFFE 00 pllandorset 6 ms
297: H# 10 H# FFFFFFFE 00 pllandorset 5 ms
298: H# 10 H# FFFEFFFF 00 pllandorset 6 ms
299: H# 0F H# FFFFFFFD 00 pllandorset 5 ms
300: H# 10 H# FFFFFFFD 00 pllandorset 5 ms
301: H# 10 H# FFFDFFFF 00 pllandorset d# 10 ms
302: H# 0C H# FFFFFFFE 00 pllandorset 6 ms
303: H# 0C H# FFFFFFFD 00 pllandorset 5 ms
304: h# 0D h# FFFF8007 pllset 5 ms
305: H# 08 H# FFFFFF3C 00 pllandorset
306: H# 02 h# FFFFFFFF 03 pllandorset
307: H# 04 H# 000381C0 pllset
308: H# 05 H# 000381F7 pllset
309: H# 06 H# 000381C0 pllset
310: H# 07 H# 000381F7 pllset
311: H# 02 H# FFFFFFFD 00 pllandorset 6 ms
312: H# 02 h# FFFFFFFE 00 pllandorset 5 ms
313: h# 08 H# FFFFFF3C 03 pllandorset 5 ms
314: H# 0B h# 78000800 pllset
315: H# 0B H# FFFFFFFF h# 4000 pllandorset
316: h# 01 h# FFFFFFFF h# 0010 pllandorset
317:
318: pllwriteoff
319: ;
320:
321: : DYNCKE
322: pllwriteon
323: H# 14 H# FFFF3FFF H# 30 pllandorset
324: H# 14 H# FF1FFFFF H# 00 pllandorset
325: H# 01 h# FFFFFFFF h# 80 pllandorset
326: H# 0D H# 00000007 pllset 5 ms
327: h# 2D H# 0000F8C0 pllset
328: h# 08 H# FFFFFFFF h# C0 pllandorset 5 ms
329: pllwriteoff
330: ;
331:
332: : MEM-MODE@
333: h# 158 ( MEM_SDRAM_MODE_REG ) reg-rl@ ;
334:
335: : MEM-MODE!
336: h# 158 ( MEM_SDRAM_MODE_REG ) reg-rl! ;
337:
338: : MEM-STATUS@
339: H# 150 reg-rl@ ;
340:
341: : WAIT-MEM-CMPLT
342: h# 8000 0 do mem-status@ 3 and 3 = if leave then loop ;
343:
344: : INITMEM
345:
346: mem-mode@ h# 6FFF0000 and h# 4000 or mem-mode!
347: mem-mode@ h# 6FFF0000 and h# 80004000 or mem-mode!
348: wait-mem-cmplt
349: mem-mode@ h# 6FFF0000 and h# 0132 or mem-mode!
350: mem-mode@ h# 6FFF0000 and h# 80000132 or mem-mode!
351: wait-mem-cmplt
352: mem-mode@ h# 6FFF0000 and h# 0032 or mem-mode!
353: mem-mode@ h# 6FFF0000 and h# 80000032 or mem-mode!
354: wait-mem-cmplt
355: mem-mode@ h# 6FFF0000 and h# 10000032 or mem-mode!
356: ;
357:
358:
359:
360: : CLR-REG ( reg -- )
361: 0 swap reg-rl!
362:
363: ;
364: : SET-PALETTE ( -- )
365: h# 0 h# b0 pc! \ Reset PALETTE_INDEX
366:
367: d# 16 0 do
368: H# 000000 h# B4 reg-rl! \ Write the PALETTE_DATA ( Auto increments)
369: H# aa0000 H# B4 reg-rl!
370: H# 00aa00 H# B4 reg-rl!
371: H# aa5500 H# B4 reg-rl!
372: H# 0000aa H# B4 reg-rl!
373: H# aa00aa H# B4 reg-rl!
374: H# 00aaaa H# B4 reg-rl!
375: H# aaaaaa H# B4 reg-rl!
376: H# 555555 H# B4 reg-rl!
377: H# ff5555 H# B4 reg-rl!
378: H# 55ff55 H# B4 reg-rl!
379: H# ffff55 H# B4 reg-rl!
380: H# 5555ff H# B4 reg-rl!
381: H# ff55ff H# B4 reg-rl!
382: H# 55ffff H# B4 reg-rl!
383: H# ffffff H# B4 reg-rl!
384: loop
385:
386: ;
387:
388: 0 VALUE _addr
389: 0 VALUE _color
390:
391: : DO-COLOR ( color-addr addr color -- )
392: to _color to _addr 0 to _color
393: 3 0 do _addr i + c@ 2 i - 8 * << _color + to _color loop
394: _color h# B4 reg-rl!
395: ;
396:
397: : SET-COLORS ( addr index #indicies -- )
398:
399: swap h# B0 pc!
400: ( addr #indicies ) 0 ?do dup ( index ) i 3 * + DO-COLOR loop
401: ( addr ) drop ;
402:
403: : init-card
404:
405: h# FF h# 58 3 + pc! \
406: h# 59 pc@ h# FE and h# 59 pc! \
407: h# 50 reg-rl@ H# FEFFFFFF AND h# 02000200 or \ Clear 24 set 25 and 8-11 to 2
408: h# 50 reg-rl!
409: h# 4F0063 h# 200 reg-rl!
410: H# 8C02A2 h# 204 reg-rl!
411: H# 1Df020C h# 208 reg-rl!
412: h# 8201EA h# 20C reg-rl!
413: h# 50 reg-rl@ H# F8FFFFFF AND h# 03000000 or h# 50 reg-rl!
414: h# 50 h# 22C reg-rl!
415: set-palette
416:
417: \ at this point for some reason mem-addr does not point
418: \ to the right address and therefore the following command
419: \ which should probably clean the frame buffer just
420: \ overwrites everything starting from 0 including the
421: \ exception vectors
422:
423: \ mem-addr h# F0000 0 fill
424: ;
425:
426: : DO-INIT
427: early-map
428: enable-card
429: init1
430: pllinit
431: init2
432: initmem
433: init-card
434: h# 8020 h# 54 reg-rl!
435: early-unmap
436: ;
437:
438: d# 640 constant /scanline
439: d# 480 constant #scanlines
440: /scanline #scanlines * constant /fb
441:
442: " okay" encode-string " status" property
443:
444: : display-install ( -- )
445: is_installed not if
446: map-csr-base
447: enable-card
448: mem-addr to frame-buffer-adr
449: h# 8020 h# 54 reg-rl!
450: default-font set-font
451: /scanline #scanlines d# 100 d# 40 fb8-install
452: true to is_installed
453: then
454: ;
455:
456: : display-remove ( -- ) ;
457:
458: do-init \ Set up the card
459: \ clear at least 640x480
460: 10 config-l@ 8 - F0000 0 rfill
461: init1_array init1_length encode-array " ibm,init1" property
462: init2_array init2_length encode-array " ibm,init2" property
463: pllinit_array pllinit_length encode-array " ibm,pllinit" property
464: meminit_array meminit_length encode-array " ibm,meminit" property
465: 0 0 encode-bytes " iso6429-1983-colors" property
466: " display" encode-string " device_type" property
467: /scanline encode-int " width" property
468: #scanlines encode-int " height" property
469: 8 encode-int " depth" property
470: /scanline encode-int " linebytes" property
471:
472: ' display-install is-install
473: ' display-remove is-remove
474:
475: : fill-rectangle ( index x y w h -- )
476: 2swap -rot /scanline * + frame-buffer-adr + ( index w h fbadr )
477: swap 0 ?do ( index w fbadr )
478: 3dup swap rot fill ( index w fbadr )
479: /scanline + ( index w fbadr' )
480: loop
481: 3drop
482: ;
483: : draw-rectangle ( addr x y w h -- )
484: 2swap -rot /scanline * + frame-buffer-adr + ( addr w h fbadr )
485: swap 0 ?do ( addr w fbadr )
486: 3dup swap move ( addr w fbadr )
487: >r tuck + swap r> ( addr' w fbadr )
488: /scanline + ( addr' w fbadr' )
489: loop
490: 3drop
491: ;
492: : read-rectangle ( addr x y w h -- )
493: 2swap -rot /scanline * + frame-buffer-adr + ( addr w h fbadr )
494: swap 0 ?do ( addr w fbadr )
495: 3dup -rot move ( addr w fbadr )
496: >r tuck + swap r> ( addr' w fbadr )
497: /scanline + ( addr' w fbadr' )
498: loop
499: 3drop
500: ;
501:
502: : dimensions ( -- width height ) /scanline #scanlines ;
503:
504: ." ( rn50 )" cr
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.