summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/forth/lib/64bit.fs
blob: 239ddd0284406846d7432acd606c645ef5bb358b (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
\ 
\ Copyright (C) 2009 Stefan Reinauer
\ 
\ See the file "COPYING" for further information about
\ the copyright and warranty status of this work.
\ 

\ Implementation of IEEE Draft Std P1275.6/D5
\ Standard for Boot (Initialization Configuration) Firmware
\ 64 Bit Extensions


cell /x = constant 64bit?

64bit? [IF] 

: 32>64 ( 32bitsigned -- 64bitsigned )
  dup 80000000 and if		\ is it negative?
    ffffffff00000000 or		\ then set all high bits
  then
;

: 64>32 ( 64bitsigned -- 32bitsigned )
  h# ffffffff and
;

: lxjoin ( quad.lo quad.hi -- o )
  d# 32 lshift or
;

: wxjoin ( w.lo w.2 w.3 w.hi -- o )
  wljoin >r wljoin r> lxjoin
;

: bxjoin ( b.lo b.2 b.3 b.4 b.5 b.6 b.7 b.hi -- o )
  bljoin >r bljoin r> lxjoin
;

: <l@ ( qaddr -- n )
  l@ 32>64
;

: unaligned-x@ ( addr - o )
  dup la1+ unaligned-l@ 64>32 swap unaligned-l@ 64>32 lxjoin
;

: unaligned-x! ( o oaddr -- )
  >r dup d# 32 rshift r@ unaligned-l!
  h# ffffffff and r> la1+ unaligned-l!
;
  
: x@ ( oaddr -- o )
  unaligned-x@ \ for now
;

: x! ( o oaddr -- )
  unaligned-x! \ for now
;

: (rx@) ( oaddr - o )
  x@
;

: (rx!) ( o oaddr -- )
  x!
;

: x, ( o -- )
  here /x allot x!
;

: /x* ( nu1 -- nu2 )
  /x *
;

: xa+ ( addr1 index -- addr2 )
  /x* +
;

: xa1+ ( addr1 -- addr2 )
  /x +
;

: xlsplit ( o -- quad.lo quad.hi )
  dup h# ffffffff and swap d# 32 rshift
;

: xwsplit ( o -- w.lo w.2 w.3 w.hi )
  xlsplit >r lwsplit r> lwsplit
;

: xbsplit ( o -- b.lo b.2 b.3 b.4 b.5 b.6 b.7 b.hi )
  xlsplit >r lbsplit r> lbsplit
;

: xlflip ( oct1 -- oct2 )
  xlsplit swap lxjoin
;

: xlflips ( oaddr len -- )
  bounds ?do 
    i unaligned-x@ xlflip i unaligned-x!
  /x +loop
;

: xwflip ( oct1 -- oct2 )
  xlsplit lwflip swap lwflip lxjoin
;

: xwflips ( oaddr len -- )
  bounds ?do
    i unaligned-x@ xwflip i unaligned-x! /x
  +loop
;

: xbflip ( oct1 -- oct2 )
  xlsplit lbflip swap lbflip lxjoin
;

: xbflips ( oaddr len -- )
  bounds ?do
    i unaligned-x@ xbflip i unaligned-x!
  /x +loop
;

\ : b(lit) b(lit) 32>64 ;

[THEN]