summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/board-js2x/slof/pci-device_1002_515e.fs
blob: 39a02ded0eb478daaa67ea20cf076ff257311e8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
\ *****************************************************************************
\ * 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
\ ****************************************************************************/

my-space pci-class-name type

my-space assign-all-device-bars
my-space pci-device-props
my-space pci-set-irq-line

7 4 config-w!

\ Special notice from ATI:
\ ATI TECHNOLOGIES INC. ("ATI") HAS NOT ASSISTED IN THE CREATION OF,
\ AND DOES NOT ENDORSE THE USE OF, THIS SOFTWARE.  ATI WILL NOT BE
\ RESPONSIBLE OR LIABLE FOR ANY ACTUAL OR ALLEGED DAMAGE OR LOSS
\ CAUSED BY OR IN CONNECTION WITH THE USE OF, OR RELIANCE ON,
\ THIS SOFTWARE.

\  Description: This FCODE driver initializes the RN50 (ES1000) ATI
\               adaptor.

-1 value mem-addr
-1 value regs-addr
false value is_installed

: reg-rl@ regs-addr + rl@-le ;
: reg-rl! regs-addr + rl!-le ;
: map-in   " map-in"   $call-parent ;
: map-out  " map-out"  $call-parent ;
: pc@ ( offset -- byte ) regs-addr + rb@ ;
: pc! ( byte offset -- ) regs-addr + rb! ;

0 value phys_low
0 value phys_mid
0 value phys_high
0 value phys_len

: MAP-CSR-BASE ( -- )
  " assigned-addresses" get-my-property 0= if
    begin dup 0> while  ( prop-addr len )
     \ Get the phys-hi mid low and the low order 32 bits of the length

      decode-phys to phys_high to phys_mid to phys_low decode-int drop decode-int to phys_len

      phys_high H# FF and  \ See which BAR this refers to
      case
        h# 10 of phys_low phys_mid phys_high h# 1000000  map-in to mem-addr  endof
        h# 18 of phys_low phys_mid phys_high    phys_len map-in to regs-addr endof
      endcase
    repeat
    ( prop-addr 0 ) 2drop
  then

  ;

: enable-card my-space 4 + dup config-b@ 3 or swap config-b! ;

: EARLY-MAP ( -- )

  " reg" get-my-property 0= if
    begin dup 0> while  ( prop-addr len )

   \ Get the phys-hi mid low and the low order 32 bits of the length

      decode-phys to phys_high to phys_mid to phys_low decode-int drop decode-int to phys_len

      phys_high H# FF and  \ See which BAR this refers to
      case
        h# 10 of phys_low phys_mid phys_high H# 1000000  map-in to mem-addr  endof
        h# 18 of phys_low phys_mid phys_high h#    1000  map-in to regs-addr endof
      endcase
    repeat
    ( prop-addr 0 ) 2drop
  then
  ;

: EARLY-UNMAP ( -- )

  mem-addr -1 <> if
    mem-addr h# 1000000 map-out
    -1 to mem-addr
  then

  regs-addr -1 <> if
    regs-addr h# 1000   map-out
    -1 to regs-addr
  then

  ;

CREATE INIT1_ARRAY
H# 0F8  ( CONFIG_MEMSIZE )  L,    H# 00000000 L, H# 01000000 L,
H# 1C0  ( MPP_TB_CONFIG )   L,    H# 00FFFFFF L, H# 07000000 L,
H# 030  ( BUS_CNTL      )   L,    H# 00000000 L, H# 5133A3B0 L,
H# 0EC  ( RBBM_CNTL     )   L,    H# 00000000 L, h# 00004443 L,
H# 1D0  ( DEBUG_CNTL    )   L,    H# FFFFFFFD L, H# 00000002 L,
H# 050  ( CRTC_GEN_CNTL )   L,    H# 00000000 L, H# 04000000 L,
H# 058  ( DAC_CNTL      )   L,    H# 00000000 L, H# FF604102 L,
H# 168  ( PAD_CTLR_STRENGTH ) L,  H# FFFEFFFF L, H# 00001200 L,
H# 178  ( MEM_REFRESH_CNTL  ) L,  H# 00000000 L, H# 88888888 L,
H# 17C  ( MEM_READ_CNTL )   L,    H# 00000000 L, H# B7C20000 L,
H# 188  ( MC_DEBUG      )   L,    H# FFFFFFFF L, H# 00000000 L,
H# D00  ( DISP_MISC_CNTL)   L,    H# 00FFFFFF L, H# 5B000000 L,
H# 88C  ( TV_DAC_CNTL   )   L,    H# F800FCEF L, H# 00490200 L,
H# D04  ( DAC_MACRO_CNTL)   L,    H# 00000000 L, H# 00000905 L,
H# 284  ( FP_GEN_CNTL   )   L,    H# FFFFFFFF L, H# 00000008 L,
H# 030  ( BUS_CNTL      )   L,    H# FFFFFFEF L, H# 00000000 L,

here  INIT1_ARRAY  - /L / CONSTANT INIT1_LENGTH


CREATE INIT2_ARRAY

H# 140  ( MEM_CNTL )           L, H#  00000000 L, H# 38001A01 L, 0 L,
H# 158  ( MEM_SDRAM_MODE_REG ) L, H#  E0000000 L, H# 08320032 L, 0 L,
H# 144  ( MEM_TIMING_CNTL    ) L, H#  00000000 L, H# 20123833 L, 0 L,
H# 14C  ( MC_AGP_LOCATION    ) L, H#  00000000 L, H# 000FFFF0 L, 0 L,
H# 148  ( MC_FB_LOCATION     ) L, H#  00000000 L, H# FFFF0000 L, 0 L,
H# 154  ( MEM_INIT_LAT_TIMER ) L, H#  00000000 L, H# 34444444 L, 0 L,
H# 18C  ( MC_CHP_IO_OE_CNTL  ) L, H#  00000000 L, H# 0A540002 L, 0 L,
H# 910  ( FCP_CNTL           ) L, H#  00000000 L, H# 00000004 L, 0 L,
H# 010  ( BIOS_0_SCRATCH     ) L, H#  FFFFFFFB L, H# 00000004 L, 0 L,
H# D64  ( DISP_OUTPUT_CNTL   ) L, H#  FFFFFBFF L, H# 00000000 L, 0 L,
H# 2A8  ( TMDS_PLL_CNTL      ) L, H#  00000000 L, H# 00000A1B L, 0 L,
H# 800  ( TV_MASTER_CNTL     ) L, H#  BFFFFFFF L, H# 40000000 L, 0 L,
H# D10  ( DISP_TEST_DBUG_CTL ) L, H#  EFFFFFFF L, H# 10000000 L, 0 L,
H# 4DC  ( OV0_FLAG_CNTRL     ) L, H#  FFFFFEFF L, H# 00000100 L, 0 L,
H# 034  ( BUS_CNTL1          ) L, H#  73FFFFFF L, H# 84000000 L, 0 L,
H# 174  ( AGP_CNTL           ) L, H#  FFEFFF00 L, H# 001E0000 L, 0 L,
H# 18C  ( MC_CHP_IO_OE_CNTL  ) L, H#  FFFFFFF9 L, H# 00000006 L, h# 000A L,
H# 18C  ( MC_CHP_IO_OE_CNTL  ) L, H#  FFFFFFFB L, H# 00000000 L, H# 000A L,
H# 18C  ( MC_CHP_IO_OE_CNTL  ) L, H#  FFFFFFFD L, H# 00000000 L, 0 L,

here  INIT2_ARRAY  - /L / CONSTANT INIT2_LENGTH

CREATE PLLINIT_ARRAY

H# 0D   L, H# FFFFFFFF L, H# FFFF8000 L, 0 L,
H# 12   L, H# FFFFFFFF L, H# 00350000 L, 0 L,
H# 08   L, H# FFFFFFFF L, H# 00000000 L, 0 L,
H# 2D   L, H# FFFFFFFF L, H# 00000000 L, 0 L,
H# 1F   L, H# FFFFFFFF L, H# 0000000A L, 5 L,
H# 03   L, H# FFFFFFFF L, H# 0000003C L, 0 L,
H# 0A   L, H# FFFFFFFF L, H# 00252504 L, 0 L,
H# 25   L, H# FFFFFFFF L, H# 00000005 L, 0 L,
H# 0E   L, H# FFFFFFFF L, H# 04756400 L, 0 L,
H# 0C   L, H# FFFFFFFF L, H# 04006401 L, 0 L,
H# 02   L, H# FFFFFFFF L, H# 0000A703 L, 0 L,
H# 0F   L, H# FFFFFFFF L, H# 0000051C L, 0 L,
H# 10   L, H# FFFFFFFF L, H# 04000400 L, 5 L,
H# 0E   L, H# FFFFFFFD L, H# 00000000 L, 5 L,
H# 0E   L, H# FFFFFFFE L, H# 00000000 L, 5 L,
H# 12   L, H# FFFFFFFF L, H# 00350012 L, 5 L,
H# 0F   L, H# FFFFFFFE L, H# 00000000 L, 6 L,
H# 10   L, H# FFFFFFFE L, H# 00000000 L, 5 L,
H# 10   L, H# FFFEFFFF L, H# 00000000 L, 6 L,
H# 0F   L, H# FFFFFFFD L, H# 00000000 L, 5 L,
H# 10   L, H# FFFFFFFD L, H# 00000000 L, 5 L,
H# 10   L, H# FFFDFFFF L, H# 00000000 L, d# 10 L,
H# 0C   L, H# FFFFFFFE L, H# 00000000 L, 6 L,
H# 0C   L, H# FFFFFFFD L, H# 00000000 L, 5 L,
h# 0D   L, H# FFFFFFFF L, H# FFFF8007 L, 5 L,
H# 08   L, H# FFFFFF3C L, H# 00000000 L, 0 L,
H# 02   L, H# FFFFFFFF L, H# 00000003 L, 0 L,
H# 04   L, H# FFFFFFFF L, H# 000381C0 L, 0 L,
H# 05   L, H# FFFFFFFF L, H# 000381F7 L, 0 L,
H# 06   L, H# FFFFFFFF L, H# 000381C0 L, 0 L,
H# 07   L, H# FFFFFFFF L, H# 000381F7 L, 0 L,
H# 02   L, H# FFFFFFFD L, H# 00000000 L, 6 L,
H# 02   L, H# FFFFFFFE L, H# 00000000 L, 5 L,
h# 08   L, H# FFFFFF3C L, H# 00000003 L, 5 L,
H# 0B   L, H# FFFFFFFF L, H# 78000800 L, 0 L,
H# 0B   L, H# FFFFFFFF L, H# 00004000 L, 0 L,
h# 01   L, h# FFFFFFFF L, H# 00000010 L, 0 L,

here  PLLINIT_ARRAY  - /L / CONSTANT PLLINIT_LENGTH

CREATE MEMINIT_ARRAY
h# 6FFF0000  L, H# 00004000 L, H# 6FFF0000 L, H# 80004000 L,
h# 6FFF0000  L, H# 00000132 L, H# 6FFF0000 L, H# 80000132 L,
h# 6FFF0000  L, H# 00000032 L, H# 6FFF0000 L, H# 80000032 L,
h# 6FFF0000  L, H# 10000032 L,
here MEMINIT_ARRAY - /L / CONSTANT MEMINIT_LENGTH
: L@+ ( addr -- value addr' )

dup l@ swap la1+
;

0 VALUE _len

: ENCODE-ARRAY  ( array len -- )
   dup to _len 0  do  l@+ swap encode-int rot  loop
   drop _len 1 - 0  ?do  encode+  loop
;

: andorset  ( reg and or -- )
   2 pick dup reg-rl@
   3 pick AND 2 pick OR swap reg-rl! 3drop
;

: INIT1
H# 0F8  ( CONFIG_MEMSIZE )      H# 00000000  H# 01000000 andorset \ Set 16Mb memory size
H# 1C0  ( MPP_TB_CONFIG )       H# 00FFFFFF  H# 07000000 andorset
H# 030  ( BUS_CNTL      )       H# 00000000  H# 5133A3B0 andorset
H# 0EC  ( RBBM_CNTL     )       H# 00000000  h# 00004443 andorset
H# 1D0  ( DEBUG_CNTL    )       H# FFFFFFFD  H# 00000002 andorset
H# 050  ( CRTC_GEN_CNTL )       H# 00000000  H# 04000000 andorset
H# 058  ( DAC_CNTL      )       H# 00000000  H# FF604102 andorset
H# 168  ( PAD_CTLR_STRENGTH )   H# FFFEFFFF  H# 00001200 andorset
H# 178  ( MEM_REFRESH_CNTL  )   H# 00000000  H# 88888888 andorset
H# 17C  ( MEM_READ_CNTL )       H# 00000000  H# B7C20000 andorset
H# 188  ( MC_DEBUG      )       H# FFFFFFFF  H# 00000000 andorset
H# D00  ( DISP_MISC_CNTL)       H# 00FFFFFF  H# 5B000000 andorset
H# 88C  ( TV_DAC_CNTL   )       H# F800FCEF  H# 00490200 andorset
H# D04  ( DAC_MACRO_CNTL)       H# 00000000  H# 00000905 andorset
H# 284  ( FP_GEN_CNTL   )       H# FFFFFFFF  H# 00000008 andorset
H# 030  ( BUS_CNTL      )       H# FFFFFFEF  H# 00000000 andorset
;


: INIT2
H# 140  ( MEM_CNTL )            H#  00000000  H# 38001A01 andorset
H# 158  ( MEM_SDRAM_MODE_REG )  H#  E0000000  H# 08320032 andorset
H# 144  ( MEM_TIMING_CNTL    )  H#  00000000  H# 20123833 andorset
H# 14C  ( MC_AGP_LOCATION    )  H#  00000000  H# 000FFFF0 andorset
H# 148  ( MC_FB_LOCATION     )  H#  00000000  H# FFFF0000 andorset
H# 154  ( MEM_INIT_LAT_TIMER )  H#  00000000  H# 34444444 andorset
H# 18C  ( MC_CHP_IO_OE_CNTL  )  H#  00000000  H# 0A540002 andorset
H# 910  ( FCP_CNTL           )  H#  00000000  H# 00000004 andorset
H# 010  ( BIOS_0_SCRATCH     )  H#  FFFFFFFB  H# 00000004 andorset
H# D64  ( DISP_OUTPUT_CNTL   )  H#  FFFFFBFF  H# 00000000 andorset
H# 2A8  ( TMDS_PLL_CNTL      )  H#  00000000  H# 00000A1B andorset
H# 800  ( TV_MASTER_CNTL     )  H#  BFFFFFFF  H# 40000000 andorset
H# D10  ( DISP_TEST_DEBUG_CTL ) H#  EFFFFFFF  H# 10000000 andorset
H# 4DC  ( OV0_FLAG_CNTRL     )  H#  FFFFFEFF  H# 00000100 andorset
H# 034  ( BUS_CNTL1          )  H#  73FFFFFF  H# 84000000 andorset
H# 174  ( AGP_CNTL           )  H#  FFEFFF00  H# 001E0000 andorset
H# 18C  ( MC_CHP_IO_OE_CNTL  )  H#  FFFFFFF9  H# 00000006 andorset h# 000A ms
H# 18C  ( MC_CHP_IO_OE_CNTL  )  H#  FFFFFFFB  H# 00000000 andorset H# 000A ms
H# 18C  ( MC_CHP_IO_OE_CNTL  )  H#  FFFFFFFD  H# 00000000 andorset
;

: CLK-CNTL-INDEX! 8 ( CLK_CNTL_INDEX ) reg-rl! ;

: CLK-CNTL-INDEX@ 8 ( CLK_CNTL_INDEX ) reg-rl@ ;

: PLLWRITEON  clk-cntl-index@ H# 80 ( PLL_WR_ENABLE ) or clk-cntl-index! ;

: PLLWRITEOFF clk-cntl-index@ H# 80 ( PLL_WR_ENABLE ) not and clk-cntl-index! ; \ Remove PLL_WR_ENABLE

: CLKDATA! h# 0c ( CLK_CNTL_DATA ) reg-rl! ;

: CLKDATA@ h# 0c ( CLK_CNTL_DATA ) reg-rl@ ;

: PLLINDEXSET clk-cntl-index@ h# FFFFFFC0 and or clk-cntl-index! ;

: PLLSET swap pllindexset clkdata! ;

: pllandorset  ( index and or -- )
   2 pick pllindexset clkdata@
   2 pick AND over OR clkdata! 3drop
;

: PLLINIT
pllwriteon
H# 0D   H# FFFF8000 pllset
H# 12   H# 00350000 pllset
H# 08   H# 00000000 pllset
H# 2D   H# 00000000 pllset
H# 1F   H# 0000000A pllset 5 ms

H# 03   H# 0000003C pllset
H# 0A   H# 00252504 pllset
H# 25   H# 00000005 pllset
H# 0E   H# 04756400 pllset
H# 0C   H# 04006401 pllset
H# 02   H# 0000A703 pllset
H# 0F   H# 0000051C pllset
H# 10   H# 04000400 pllset 5 ms

H# 0E   H# FFFFFFFD 00 pllandorset 5 ms
H# 0E   H# FFFFFFFE 00 pllandorset 5 ms
H# 12   H# 00350012 pllset 5 ms
H# 0F   H# FFFFFFFE 00 pllandorset 6 ms
H# 10   H# FFFFFFFE 00 pllandorset 5 ms
H# 10   H# FFFEFFFF 00 pllandorset 6 ms
H# 0F   H# FFFFFFFD 00 pllandorset 5 ms
H# 10   H# FFFFFFFD 00 pllandorset 5 ms
H# 10   H# FFFDFFFF 00 pllandorset d# 10 ms
H# 0C   H# FFFFFFFE 00 pllandorset 6 ms
H# 0C   H# FFFFFFFD 00 pllandorset 5 ms
h# 0D   h# FFFF8007      pllset 5 ms
H# 08   H# FFFFFF3C 00   pllandorset
H# 02   h# FFFFFFFF 03   pllandorset
H# 04   H# 000381C0      pllset
H# 05   H# 000381F7      pllset
H# 06   H# 000381C0      pllset
H# 07   H# 000381F7      pllset
H# 02   H# FFFFFFFD 00   pllandorset 6 ms
H# 02   h# FFFFFFFE 00   pllandorset 5 ms
h# 08   H# FFFFFF3C 03   pllandorset 5 ms
H# 0B   h# 78000800      pllset
H# 0B   H# FFFFFFFF h# 4000 pllandorset
h# 01   h# FFFFFFFF h# 0010 pllandorset

pllwriteoff
;

: DYNCKE
pllwriteon
H# 14   H# FFFF3FFF H# 30 pllandorset
H# 14   H# FF1FFFFF H# 00 pllandorset
H# 01   h# FFFFFFFF h# 80 pllandorset
H# 0D   H# 00000007       pllset 5 ms
h# 2D   H# 0000F8C0       pllset
h# 08   H# FFFFFFFF h# C0 pllandorset 5 ms
pllwriteoff
;

: MEM-MODE@
    h# 158 ( MEM_SDRAM_MODE_REG ) reg-rl@ ;

: MEM-MODE!
    h# 158 ( MEM_SDRAM_MODE_REG ) reg-rl! ;

: MEM-STATUS@
    H# 150 reg-rl@ ;

: WAIT-MEM-CMPLT
    h# 8000 0 do mem-status@ 3 and 3 = if leave then loop ;

: INITMEM

  mem-mode@ h# 6FFF0000 and h# 4000     or mem-mode!
  mem-mode@ h# 6FFF0000 and h# 80004000 or mem-mode!
  wait-mem-cmplt
  mem-mode@ h# 6FFF0000 and h# 0132     or mem-mode!
  mem-mode@ h# 6FFF0000 and h# 80000132 or mem-mode!
  wait-mem-cmplt
  mem-mode@ h# 6FFF0000 and h# 0032     or mem-mode!
  mem-mode@ h# 6FFF0000 and h# 80000032 or mem-mode!
  wait-mem-cmplt
  mem-mode@ h# 6FFF0000 and h# 10000032 or mem-mode!
;



: CLR-REG ( reg -- )
  0 swap  reg-rl!

;
: SET-PALETTE  ( -- )
  h# 0 h# b0 pc!                \ Reset PALETTE_INDEX

  d# 16 0 do
    H# 000000 h# B4 reg-rl!     \ Write the PALETTE_DATA ( Auto increments)
    H# aa0000 H# B4 reg-rl!
    H# 00aa00 H# B4 reg-rl!
    H# aa5500 H# B4 reg-rl!
    H# 0000aa H# B4 reg-rl!
    H# aa00aa H# B4 reg-rl!
    H# 00aaaa H# B4 reg-rl!
    H# aaaaaa H# B4 reg-rl!
    H# 555555 H# B4 reg-rl!
    H# ff5555 H# B4 reg-rl!
    H# 55ff55 H# B4 reg-rl!
    H# ffff55 H# B4 reg-rl!
    H# 5555ff H# B4 reg-rl!
    H# ff55ff H# B4 reg-rl!
    H# 55ffff H# B4 reg-rl!
    H# ffffff H# B4 reg-rl!
  loop

 ;

0 VALUE _addr
0 VALUE _color

: DO-COLOR  ( color-addr addr color -- )
   to _color to _addr 0 to _color
   3 0  do  _addr i + c@ 2 i - 8 * << _color + to _color  loop
   _color h# B4 reg-rl!
;

: SET-COLORS ( addr index #indices -- )

  swap h# B0 pc!
  ( addr #indices ) 0 ?do dup ( index ) i 3 * + DO-COLOR loop
  ( addr ) drop ;

: init-card

  h# FF h# 58 3 + pc!   \
  h# 59 pc@ h# FE and  h# 59 pc!   \
  h# 50 reg-rl@ H# FEFFFFFF AND h# 02000200 or  \ Clear 24 set 25 and 8-11 to 2
  h# 50 reg-rl!
  h# 4F0063  h# 200 reg-rl!
  H# 8C02A2  h# 204 reg-rl!
  H# 1Df020C h# 208 reg-rl!
  h# 8201EA  h# 20C reg-rl!
  h# 50 reg-rl@ H# F8FFFFFF AND h# 03000000 or h# 50 reg-rl!
  h# 50 h# 22C reg-rl!
  set-palette

  \ at this point for some reason mem-addr does not point
  \ to the right address and therefore the following command
  \ which should probably clean the frame buffer just
  \ overwrites everything starting from 0 including the
  \ exception vectors

  \ mem-addr h# F0000 0 fill
 ;

: DO-INIT
  early-map
  enable-card
  init1
  pllinit
  init2
  initmem
  init-card
  h# 8020 h# 54 reg-rl!
  early-unmap
;

d# 640 constant /scanline
d# 480 constant #scanlines
/scanline #scanlines * constant /fb

" okay" encode-string " status" property

: display-install ( -- )
  is_installed not if
    map-csr-base
    enable-card
    mem-addr to frame-buffer-adr
    h# 8020 h# 54 reg-rl!
    default-font set-font
    /scanline #scanlines  d# 100 d# 40 fb8-install
    true to is_installed
  then
;

: display-remove  ( -- )  ;

do-init                                                 \ Set up the card
\ clear at least 640x480
10 config-l@ 8 - F0000 0 rfill
init1_array init1_length encode-array " ibm,init1" property
init2_array init2_length encode-array " ibm,init2" property
pllinit_array pllinit_length   encode-array " ibm,pllinit" property
meminit_array meminit_length   encode-array " ibm,meminit" property
0 0 encode-bytes " iso6429-1983-colors" property
s" display" device-type
/scanline  encode-int " width" property
 #scanlines encode-int " height" property
8 encode-int " depth" property
/scanline  encode-int " linebytes" property

' display-install is-install
' display-remove is-remove

: fill-rectangle ( index x y w h -- )
  2swap -rot /scanline * + frame-buffer-adr + ( index w h fbadr )
  swap 0 ?do ( index w fbadr )
    3dup swap rot fill ( index w fbadr )
    /scanline + ( index w fbadr' )
  loop
  3drop
;
: draw-rectangle ( addr x y w h -- )
 2swap -rot /scanline * + frame-buffer-adr + ( addr w h fbadr )
 swap 0 ?do ( addr w fbadr )
   3dup swap move ( addr w fbadr )
    >r tuck + swap r> ( addr' w fbadr )
    /scanline + ( addr' w fbadr' )
  loop
  3drop
 ;
 : read-rectangle ( addr x y w h -- )
  2swap -rot /scanline * + frame-buffer-adr + ( addr w h fbadr )
  swap 0 ?do ( addr w fbadr )
    3dup -rot move ( addr w fbadr )
    >r tuck + swap r> ( addr' w fbadr )
    /scanline + ( addr' w fbadr' )
  loop
  3drop
 ;

: dimensions  ( -- width height )  /scanline #scanlines  ;

."  ( rn50 )" cr