\ 
\ 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]