[openfirmware] [commit] r3738 - cpu/ppc cpu/ppc/prep cpu/ppc/prep/build cpu/ppc/prep/qemu cpu/ppc/prep/qemu/build cpu/x86/pc/emu dev dev/ide dev/isa dev/pci dev/via dev/video dev/video/controlr ofw/fs/fatfs ofw/f...

repository service svn at openfirmware.info
Tue Sep 2 23:07:36 CEST 2014


Author: wmb
Date: Tue Sep  2 23:07:35 2014
New Revision: 3738
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3738

Log:
Added a bunch of PReP stuff

Added:
   cpu/ppc/prep/
   cpu/ppc/prep/basevars.fth
   cpu/ppc/prep/build/
   cpu/ppc/prep/build/Makefile.cross
   cpu/ppc/prep/build/prepfw.bth
   cpu/ppc/prep/builton.bth
   cpu/ppc/prep/crc.fth
   cpu/ppc/prep/elf.fth
   cpu/ppc/prep/encresid.fth
   cpu/ppc/prep/fortyone.fth
   cpu/ppc/prep/initpgm.fth
   cpu/ppc/prep/isaio.fth
   cpu/ppc/prep/leflag.fth
   cpu/ppc/prep/mappci.fth
   cpu/ppc/prep/mkresid.fth
   cpu/ppc/prep/nv7x.fth
   cpu/ppc/prep/nvramhdr.fth
   cpu/ppc/prep/nvtypes.fth
   cpu/ppc/prep/qemu/
   cpu/ppc/prep/qemu/build/
   cpu/ppc/prep/qemu/build/Makefile.cross
   cpu/ppc/prep/qemu/cpunode.fth
   cpu/ppc/prep/qemu/devalias.fth
   cpu/ppc/prep/qemu/devices.fth
   cpu/ppc/prep/qemu/fixednv.fth
   cpu/ppc/prep/qemu/fw.bth
   cpu/ppc/prep/qemu/initrav.fth
   cpu/ppc/prep/qemu/macaddr.fth
   cpu/ppc/prep/qemu/pcinode.fth
   cpu/ppc/prep/qemu/probemem.fth
   cpu/ppc/prep/qemu/resetvec.bth
   cpu/ppc/prep/qemu/rom.bth
   cpu/ppc/prep/qemu/rootnode.fth
   cpu/ppc/prep/qemu/slam.fth
   cpu/ppc/prep/qemu/start.bth
   cpu/ppc/prep/raven.fth
   cpu/ppc/prep/reset.fth
   cpu/ppc/prep/residdef.fth
   dev/ds1385n.fth
   dev/ide/twolevel-ide.fth
   dev/isa/pc87307.fth
   dev/m48t559.fth
   dev/via/vt82c586.fth
   dev/video/bga.bth
   dev/video/controlr/bga.fth
   dev/video/controlr/bgapci.fth
   ofw/fs/hfs/
   ofw/fs/hfs/hfs.fth
   ofw/fs/hfs/partition.fth
Modified:
   cpu/ppc/resetvec.fth
   cpu/x86/pc/emu/fw.bth
   dev/i8259.fth
   dev/ide/atapi.fth
   dev/ide/idenode.fth
   dev/pci/intmap.fth
   ofw/fs/fatfs/partition.fth

Added: cpu/ppc/prep/basevars.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/basevars.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,102 @@
+purpose: Configuration variables needed by early startup code
+\ See license at end of file
+
+d#  20 value /fixed-nv
+h# 7ec value fixed-nv-base	\ Override as needed for the platform
+
+true value fixed-nv-ok?
+
+: fixed-nv@  ( offset -- byte )
+   fixed-nv-base +  nv-c@
+;
+: fixed-nv!  ( byte offset -- )
+   fixed-nv-base +  nv-c!
+;
+
+: fixed-nv-checksum  ( -- checksum )
+   0  /fixed-nv  0  ?do  i fixed-nv@ xor  loop  ( checksum )
+;
+
+: set-fixed-nv-checksum  ( -- )
+   fixed-nv-checksum  0 fixed-nv@ xor  h# 5a xor  0 fixed-nv!
+;
+
+6 actions
+action: fixed-nv-ok?  if  l@ fixed-nv@ 0<>  else  la1+ @  then  ;
+action: l@ fixed-nv! set-fixed-nv-checksum  ;
+action: l@  ;
+action: drop flag>$  ;
+action: drop $>flag  ;
+action: la1+ @ 0<>  ;
+
+: fixed-nv-flag  ( "name" default-value offset -- )
+   create-option use-actions  l, ,  
+;
+
+6 actions
+action:
+   fixed-nv-ok?  if
+      l@  4 bounds  do  i fixed-nv@  loop  swap 2swap swap bljoin
+   else
+      la1+ @
+   then
+;
+action:
+   l@ >r  lbsplit  r> 4 bounds  do  i fixed-nv!  loop
+   set-fixed-nv-checksum
+;
+action: l@  ;
+action: drop  push-hex <# u#s [char] x hold  [char] 0 hold u#>  pop-base  ;
+action: drop $>number  ;
+action: la1+ @  ;
+
+: fixed-nv-int  ( "name" default-value offset -- )
+   create-option use-actions  l, ,  
+;
+
+false     1 fixed-nv-flag diag-switch?
+false     2 fixed-nv-flag real-mode?
+-1        3 fixed-nv-int  real-base
+-1        7 fixed-nv-int  real-size
+-1    d# 11 fixed-nv-int  virt-base
+-1    d# 15 fixed-nv-int  virt-size
+false d# 19 fixed-nv-flag hrp-memmap?
+
+' diag-switch? is (diagnostic-mode?)
+
+: init-fixed-nv  ( -- )
+   fixed-nv-checksum h# 5a = ?dup  if  to fixed-nv-ok? exit  then
+   ['] diag-switch? do-set-default
+   ['] real-mode?   do-set-default
+   ['] real-base    do-set-default
+   ['] real-size    do-set-default
+   ['] virt-base    do-set-default
+   ['] virt-size    do-set-default
+   ['] hrp-memmap?  do-set-default
+   fixed-nv-checksum h# 5a =  to fixed-nv-ok?
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/build/Makefile.cross
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/build/Makefile.cross	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,32 @@
+# This setting of HOSTDIR is for cross-building on an x86 Linux system
+# For it to work, you first need to build the simulator version of ppcforth
+# in cpu/x86/Linux with "make -f Makefile.ppcforth"
+OS := $(shell uname)
+
+HOSTCPU:=x86
+HOSTDIR:=../../../${HOSTCPU}/${OS}
+
+all: prepfw.dic
+
+.PHONY: FORCE all clean
+
+.PRECIOUS: prepfw.dic
+
+${HOSTDIR}/forth:
+	@make -C ${HOSTDIR} forth
+
+${HOSTDIR}/ppcforth:
+	@make -C ${HOSTDIR} -f Makefile.ppcforth ppcforth
+
+build: ${HOSTDIR}/forth
+	@ln -sf $< $@
+
+%.dic: FORCE build ${HOSTDIR}/ppcforth
+	./build $@
+
+builder.dic: FORCE build
+	-[ ! -f builder.sav ] && cp builder.dic builder.sav
+	./build builder.dic
+
+clean:
+	rm -f prepfw.dic *.log *~ build

Added: cpu/ppc/prep/build/prepfw.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/build/prepfw.bth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,206 @@
+purpose: Load file for PReP firmware - no board specifics
+\ See license at end of file
+
+dictionary: ${BP}/cpu/ppc/build/basefw.dic
+command: &ppcforth &dictionary &this
+build-now
+
+
+\ ' $report-name to include-hook
+
+fload ${BP}/cpu/ppc/prep/basevars.fth
+0 value little-endian?
+
+headerless
+h# 1000 to pagesize
+d# 12   to pageshift
+
+false value chrp?	\ Change as needed
+headers
+
+dev /
+1 encode-int  " #address-cells"  property
+" prep" " compatible" string-property
+device-end
+
+\ Memory management services
+fload ${BP}/ofw/core/clntmem1.fth	\ client services for memory
+fload ${BP}/ofw/core/memlist.fth     \ Resource list common routines
+fload ${BP}/ofw/core/showlist.fth	\ Linked list display tool
+fload ${BP}/ofw/core/allocph1.fth	\ S Physical memory allocator
+fload ${BP}/ofw/core/availpm.fth	\ Available memory list
+
+headerless
+: (memory?)  ( phys -- flag )
+   chrp?  if  h# 4000.0000  else  h# 8000.0000  then  u<
+;
+' (memory?) to memory?
+
+\ Handy tools to mark device nodes with the "built-in" property
+: mark-builtin  ( -- false )
+   0 package(  0 0 encode-bytes  " built-in" property  )package
+   false
+;
+: mark-builtin-all  ( -- )
+   ['] mark-builtin ['] search-preorder catch  2drop
+;
+headers
+
+\ Load file format handlers
+fload ${BP}/cpu/ppc/prep/initpgm.fth	\ Basic boot handler
+fload ${BP}/cpu/ppc/prep/elf.fth	\ handler for ELF booting
+
+\ Reboot and re-entry code
+fload ${BP}/cpu/ppc/reboot.fth		\ Restart the client program
+fload ${BP}/cpu/ppc/reenter.fth		\ Various entries into Forth
+
+\ Miscellaneous hardware interface words
+fload ${BP}/cpu/ppc/cache603.fth	\ Cache synchronization
+fload ${BP}/cpu/ppc/segreg.fth	\ Segment register access
+fload ${BP}/cpu/ppc/bat.fth		\ BAT mapping register access
+fload ${BP}/cpu/ppc/scrub.fth	\ Fast memory scrubbing using "dcbz"
+
+fload ${BP}/ofw/termemu/cp881-16.fth  \ ISO-Latin1 Font
+hex
+warning on
+
+h#  40.0000 ' load-base set-config-int-default
+
+headerless
+: (initial-heap)  ( -- adr len )  sp0 @ ps-size -  limit  tuck -  ;
+' (initial-heap) is initial-heap
+headers
+
+" /openprom" find-device
+   " FirmWorks,3.0" encode-string " model" property
+device-end
+
+fload ${BP}/cpu/ppc/prep/isaio.fth		\ ISA I/O space access
+\ XXX this may need to change for L2 cache support
+warning @ warning off
+\ We can't turn on the dcache until we have set up BAT mapping
+stand-init: Instruction cache on
+   icache-on? 0=  if  icache-on  then
+;
+warning !
+
+fload ${BP}/cpu/ppc/dectrap.fth		\ Null decrementer handler
+stand-init: Enable machine check exceptions
+   msr@  h# 1000 or  msr!
+;
+
+headerless
+defer set-memory-map  ' noop to set-memory-map
+
+headers
+stand-init: Set Memory Map
+   set-memory-map
+;
+
+headerless
+h# 6000.0000 value fw-virt-base			\ 32 megs of mapping space
+h# 0200.0000 value fw-virt-size
+
+0 value memsize
+headers
+
+fload ${BP}/cpu/ppc/loadvmem.fth		\ /mmu node
+stand-init: MMU
+   " /mmu" open-dev mmu-node !
+;
+
+fload ${BP}/cpu/ppc/rootnode.fth 	   \ Methods for root node
+stand-init: Root node
+   " /"  " init"  execute-device-method drop
+;
+stand-init: Data cache on
+   msr@ h# 10 and  dcache-on? 0=  and  if  dcache-on  then
+;
+stand-init: Fast CPU mode
+   fastest-mode
+;
+
+0 0  " "  " /"  begin-package
+fload ${BP}/cpu/ppc/prep/mappci.fth	\ PCI-to-root-node address translation
+fload ${BP}/dev/pcibus.fth		\ Generic PCI bus package
+end-package
+stand-init: PCI host bridge
+   " /pci" " init" execute-device-method drop
+;
+
+fload ${BP}/dev/pciprobe.fth
+defer probe-all  ' probe-pci to probe-all
+
+fload ${BP}/dev/scsi/probscsi.fth
+
+fload ${BP}/cpu/ppc/cpunode.fth
+
+fload ${BP}/ofw/core/bailout.fth
+
+fload ${BP}/cpu/ppc/prep/reset.fth		 \ Reset via "92" register
+
+fload ${BP}/ofw/core/countdwn.fth	 \ Startup countdown
+
+: restore-stdout  ( -- )
+   " restore" stdout @ ['] $call-method  catch  if  3drop  then
+;
+
+fload ${BP}/forth/lib/pattern.fth		\ Text string pattern matching
+fload ${BP}/ofw/core/filecmds.fth 	\ File commands: dir, del, ren, etc.
+
+: startup  ( -- )
+   standalone?  0=  if  exit  then
+
+   copy-reboot-info
+
+   \ Ensure a clean startup state regardless of the development
+   \ environment's use of these variables
+   0 stdin !  0 stdout !  0 to my-self
+
+[ifdef] debug-startup  ." nvramrc" cr  [then]
+   use-nvramrc?  if  nvramrc safe-evaluate  then
+
+[ifdef] debug-startup  ." probe" cr  [then]
+   auto-banner?  if  probe-all install-console banner  then
+
+   hex
+   warning on
+   only forth also definitions
+
+   install-alarm
+
+   #line off
+
+   auto-boot
+   restore-stdout
+
+   user-interface
+;
+
+.( --- Saving prepfw.dic ---)  " prepfw.dic" $save-forth  cr
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\ Copyright (c) 2014 Artyom Tarasenko
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/builton.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/builton.bth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,38 @@
+purpose: Create "builton.fth" file containing the current date
+copyright: Copyright 1997 FirmWorks  All Rights Reserved
+
+command: &native &this
+build-now
+
+\needs today         fload ${BP}/fm/cwrapper/date.fth
+
+: put$  ( adr len -- )  ofd @ fputs  ;
+
+\ Creates a "builton.fth" file indicating the current date and time.
+\ It contains, for example:
+\ : build-date " December 17, 1996 18:26:50" ;
+\ d# 19961217 constant built-date-int
+\ dev /openprom
+\    built-date-int encode-int " built-on" property
+\ device-end
+
+writing builton.fth
+" \ Defines build-date"n" put$
+" : build-date "" " put$   today date$ put$   bl ofd @ fputc
+now time$ put$  " "" ;"n" put$      
+
+" d# " put$
+base @ decimal
+today (.) put$  <# u# u# u#> put$  <# u# u# u#>  put$
+base !
+"  constant built-date-int"n" put$
+
+" dev /openprom"n" put$
+"    built-date-int encode-int "" built-on"" property"n" put$
+" device-end"n" put$
+
+ofd @ fclose
+
+\ We don't want to log the creation of this file, because doing so
+\ tends to cause double-recompiles in some cases.
+" builton.log" delete-file drop

Added: cpu/ppc/prep/crc.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/crc.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,42 @@
+purpose: CRC calculation for PR*P NVRAM
+\ See license at end of file
+
+\ Uses CCITT polynomial  x**16 + x**12 + x**5 + 1
+
+: rol  ( x y mask -- n )  -rot 2dup << -rot  d# 16 swap - >>  or  and  ;
+: ror  ( x y mask -- n )  -rot 2dup >> -rot  d# 16 swap - <<  or  and  ;
+
+: crcgen  ( oldcrc data -- newcrc )
+   swap wbsplit rot xor    ( old.lo pd>> )
+   dup rot bwjoin          ( pd>> crc )
+   swap 8 << swap          ( pd crc )
+   over 4 h# f00f rol xor  ( pd crc' )
+   over 3 h# 1fe0 ror xor  ( pd crc'' )
+   over   h# f000 and xor  ( pd crc''' )
+   swap 7 h# 01e0 ror xor  ( newcrc )
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/elf.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/elf.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,211 @@
+purpose: Load image handler for ELF (Extended Linker Format)
+\ See license at end of file
+
+hex
+
+headerless
+: elf?  ( -- flag )  0 +base 4  " "(7f)ELF" $=  ;
+: elf-le?  ( -- flag )  5 +base c@  1 =  ;
+: elfl@  ( adr -- n )  elf-le?  if   le-l@  else  be-l@  then  ;
+: elfw@  ( adr -- w )  elf-le?  if   le-w@  else  be-w@  then  ;
+
+: eh-l@  ( offset -- l )  +base elfl@  ;
+: eh-w@  ( offset -- w )  +base elfw@  ;
+
+: +elfl@  ( adr offset -- n )  + elfl@  ;
+
+: 1275-note?  ( note-adr -- flag )
+   \ note-type  
+   dup 8 +elfl@  h# 1275 =  if         ( note-adr )
+
+      \ note-name-adr   note-name-len
+      dup h# 0c +  swap  0 +elfl@ 1-   ( note-name$ )
+
+       " PowerPC"  $=  exit            ( flag )
+   then                                ( note-adr )
+   drop false
+;
+: find-note-section  ( -- true | adr false )
+   \ Look for a note entry among the program headers
+
+   \ e_phentsize  e_phoff
+   h# 2a eh-w@  1c eh-l@ +base
+   \       e_phnum
+   over  h# 2c eh-w@ *  bounds  ?do	    ( phentsize )
+      \ p_type  PT_NOTE
+      i 0 +elfl@  4 =  if                   ( phentsize )
+         \ p_offset
+         i 4 +elfl@  +base                  ( phentsize note-adr )
+         dup  1275-note?  if                ( phentsize note-adr )
+            nip unloop false exit           ( note-adr false )
+         then                               ( phentsize note-adr )
+         drop                               ( phentsize )
+      then                                  ( phentsize )
+   dup +loop                                ( phentsize )
+   drop                                     ( )
+
+   \ Look for a note entry among the section headers
+
+   \ e_shentsize   e_shoff
+   h# 2e eh-w@   h# 20 eh-l@ +base          ( shentsize shbase )
+   \       e_shnum
+   over  h# 30 eh-w@ *  bounds ?do          ( shentsize )
+      \ sh_type SHT_NOTE
+      i 4 +elfl@  7 =  if                   ( shentsize )
+         \  sh_offset
+         i h# 10 +elfl@  +base              ( shentsize note-adr )
+         dup  1275-note?  if                ( shentsize note-adr )
+            nip unloop exit                 ( note-adr false )
+         then                               ( shentsize note-adr )
+         drop                               ( shentsize )
+      then                                  ( shentsize )
+   dup +loop                                ( shentsize )
+   drop
+
+   true
+;
+
+: get-note-section
+            ( -- true | chrp? load-base virt-base virt-size real-mode? false )
+   find-note-section  if  true exit  then    ( note-adr )
+   
+   \ advance to descriptor portion of note section
+   \ namesz      name-offset   padding
+   dup  dup 0 +elfl@ +  h# 0c +   4 round-up      ( note-adr note-data-adr )
+
+   >r                                             ( note-adr )
+
+   \ CHRP note sections are 6 longwords; PR*P has only 5. The additional
+   \ entry is for load-base.  If we see a 6-entry note section, we also
+   \ assume that the CHRP memory map is desired.
+   4 +elfl@ d# 20 >  if                           ( )
+      true                                        ( chrp? )
+      r@ h# 14 +elfl@                             ( chrp? load-base )
+   else                                           ( chrp? load-base )
+      false -1                                    ( chrp? load-base )
+   then                                           ( chrp? load-base )
+
+   r@     4 +elfl@  ( chrp? load-base real-base )
+   r@     8 +elfl@  ( chrp? load-base real-base real-size )
+   r@ h# 0c +elfl@  ( chrp? load-base real-base real-size virt-base )
+   r@ h# 10 +elfl@  ( chrp? load-base real-base real-size virt-base virt-size )
+   r>     0 +elfl@  ( chrp? load-base virt-base virt-size real-mode? )
+   false
+;
+
+\ XXX the following code assumes that the value of load-base is such that
+\ the copying of program sections to their correct locations does not
+\ overwrite portions of other sections that have not yet been copied.
+
+\ One sufficient condition is that the program sections are stored in the
+\ ELF file in ascending order of their execution addresses (vaddr fields)
+\ and that load-base is large enough that the sections must be moved to
+\ lower addresses.
+
+0 value high-water
+0 value low-water
+: record-extent  ( adr len -- )
+   bounds  low-water umin to low-water   high-water umax to high-water 
+;   
+
+: prepare-elf-program  ( -- entry-point )
+   0  to high-water
+   -1 to low-water
+
+   \ Copy all pheaders to allocated memory to protect them from being
+   \ overwritten when we copy the programs to their final destinations.
+
+   \ e_entry       e_phentsize      e_phnum  
+   h# 18 eh-l@  h# 2a eh-w@ dup  h# 2c eh-w@ *   ( entry phentsize phsize)
+   dup alloc-mem  swap                       ( entry phentsize pbbuf phsize )
+
+   \     e_phoff
+   2dup  1c eh-l@ +base   -rot move          ( entry phentsize phbuf phsize )
+
+   \ Scan the program sections and determine how much memory is needed
+   2dup bounds  ?do	( entry phentsize phbuf phsize ) \ throughout loop
+      \ p_type  PT_LOAD
+      i 0 +elfl@  1 =  if
+	 \ p_vaddr       p_memsz
+         i 8 +elfl@  i h# 14 +elfl@  record-extent
+      then
+   2 pick +loop		( entry phentsize phbuf phsize )
+
+   \ XXX Ultimatelty we need to allocate physical memory and map
+   \ it appropriately, but for now we just claim the virtual address
+   \ space, assuming that it is already mapped.
+
+   low-water 0   high-water low-water -  0  mem-claim drop  ( adr )
+   low-water <> abort" Couldn't claim the program's memory"
+
+   2dup bounds  ?do	( entry phentsize phbuf phsize ) \ throughout loop
+      \ p_type  PT_LOAD
+      i 0 +elfl@  1 =  if
+
+         \ XXX we need to acquire and map the memory first!
+
+	 \ Move it into the correct vaddr.
+         \ p_offset          p_vaddr      p_filesz
+	 i 4 +elfl@ +base   i 8 +elfl@  i h# 10 +elfl@   ( src dst len )
+         2dup 2>r  move  2r> sync-cache
+
+         \ Zero any bytes that are not stored in the file
+	 \ p_vaddr       p_memsz        p_filesz
+         i 8 +elfl@  i h# 14 +elfl@  i h# 10 +elfl@  /string  erase
+      then
+   2 pick +loop		( entry phentsize phbuf phsize )
+   free-mem  drop       ( entry )
+;
+
+defer verify-machine-type
+: (verify-machine-type)   ( -- )
+   h# 10 eh-w@  2  <>  abort" The loaded file is not executable"
+   h# 12 eh-w@  dup d# 17 <>  swap d# 20 <>  and
+   abort" The loaded file is not a PowerPC program"
+;
+' (verify-machine-type) to verify-machine-type
+
+: init-elf-program   ( -- )
+   verify-machine-type
+   get-note-section  if
+      elf-le?  ?endian-restart
+   else             ( chrp? load-base r-base r-size v-base v-size real-mode? )
+      elf-le?  test-modes   ?mode-restart
+   then
+
+   prepare-elf-program           ( pc )
+
+   h# 8000 alloc-mem  h# 8000 +  ( pc sp )
+
+   (init-program)
+;
+
+headers
+warning @ warning off
+: init-program  ( -- )  elf?  if  init-elf-program  else  init-program  then  ;
+warning !
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/encresid.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/encresid.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,94 @@
+purpose: Tools to create device-tree properties to drive residual-data creation
+\ See license at end of file
+
+: aix-id  ( type id -- )
+   encode-int rot encode-int encode+  " aix-id&type" property
+;
+: aix-flags  ( flags -- )  encode-int " aix-flags" property  ;
+: chip-id  ( id -- )  encode-int  " aix-chip-id" property  ;
+: in-82378  ( -- )  h# 24.4d.00.81 chip-id  ;
+: pnp-data  ( adr len -- )  encode-bytes  " pnp-data" property  ;
+
+\ Encode primitive data types in PnP format
+: start-encode  ( -- adr len )  0 0 encode-bytes  ;
+: +byte   ( adr len b -- adr' len' )  here >r  c,  r> 1  encode+  ;
+: +le16   ( adr len w -- adr' len' )  wbsplit >r +byte  r> +byte  ;
+: +le32   ( adr len l -- adr' len' )  lbflip encode-int encode+  ;
+: +le64   ( adr len l -- adr' len' )  +le32  0 encode-int encode+  ;
+: +bytes  ( adr len adr1 len1 -- adr' len' )  encode-bytes encode+  ;
+
+\ Encode address ranges using the IBM vendor-unique PnP format
+: +regn  ( base size #bits -- )
+   -rot >r >r >r
+   " "(84 15 00 09 01)" +bytes   ( r: size base #bits )
+   r> +le16  0 +byte     r> +le64  r> +le64
+;
+: +reg32  ( adr len base size -- adr' len' )  d# 32 +regn  ;
+: +reg16  ( adr len base size -- adr' len' )  d# 16 +regn  ;
+: +reg11  ( adr len base size -- adr' len' )  d# 11 +regn  ;
+
+: +isa-mem32  ( adr len base size -- adr' len' )
+   >r >r
+   " "(84 15 00 09 02 20 00 00)" +bytes
+   r> ( base ) +le64  r> ( size ) +le64
+;
+: +isa-reg  ( adr len base size -- adr' len' )
+   >r >r
+   " "(47 01)" +bytes  r@ ( base ) +le16  r> +le16   1 +byte  r> ( size ) +byte
+;
+
+: +fixed-isa-reg  ( adr len base size -- adr' len' )
+   >r >r
+   h# 4b +byte  r> ( base ) +le16  r> ( size ) +byte
+;
+
+\ Encode an IRQ number in PnP format
+: +irq  ( adr len irq# -- adr' len' )  >r h# 22 +byte  1 r> lshift +le16  ;
+
+\ Encode IBM bus-bridge-attributes PnP item
+: +bus-attributes  ( adr len speed #slots -- adr' len' )
+   >r >r  " "(84 06 00 06)" +bytes  r> +le32  r> +byte
+;
+
+\ Encode IBM bus-bridge-address-translation PnP item
+: +bus-range  ( adr len decode type parent child size -- adr' len' )
+   >r >r >r >r >r
+   " "(84 1D 00 05)" +bytes  r> +byte  1 +byte  r> +byte  0 +byte
+   r> +le64  r> +le64  r> +le64
+;
+
+\ Encode IBM PCI-bridge-descriptor PnP item
+: start-pci-descriptor  ( adr len #devices -- adr' len' )
+   >r  h# 84 +byte  r> d# 12 *  d# 21 +  +le16  3 +byte
+;
+
+\ Encode Device/slot entry in PCI-bridge-descriptor
+: +slot  ( adr len slot# dev&func# int-type inta intb intc intd -- adr' len' )
+   >r >r >r >r >r >r >r
+   r> +byte  r> +byte  r> +le16  r> +le16  r> +le16  r> +le16  r> +le16
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/fortyone.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/fortyone.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,78 @@
+purpose: Load image handler for PR*P/IBM "0x41" boot partition format
+\ See license at end of file
+
+defer set-aix-modes		' noop to set-aix-modes
+
+[ifndef] residual-data
+0 value residual-data
+
+defer make-aix-l2-cache		' noop to make-aix-l2-cache
+defer make-residual-data	' noop to make-residual-data
+[then]
+
+warning @  warning off
+: init-program  ( -- )
+   loaded  h# 400 round-up  swap h# 204 + le-l@  h# 400 round-up  =  if
+      \ Mostly we don't care about the addresses, but we must be in real
+      \ mode, big-endian, pr*p memory map.
+      \ chrp?    <addresses>  real?  le?
+      false    -1 -1 -1 -1 -1 true false test-modes
+      ?mode-restart
+
+      make-aix-l2-cache  make-residual-data
+
+      loaded  sync-cache
+      load-base h# 200 + le-l@  load-base +  load-base  (init-program)
+
+      residual-data to %r3
+      load-base to %r4
+
+      msr@  h# 8030 invert and  to %msr	\ disable translations
+   
+      set-aix-modes
+
+      exit
+   then
+   \ Otherwise, try other formats
+   init-program
+;
+
+\ Handle IBTA format, i.e., AIX bootable tape images.
+\ Block 0 (at load-base) contains a partition map.  Assume the first
+\ entry in the map describes this image.
+: init-program  ( -- )
+   load-base be-l@ h# c9c2d4c1 ( "IBTA" in EBCDIC! ) =  if
+      loaded  over  h# 1c6 + le-l@  /sector *    ( load-adr,len offset )
+      /string                                    ( image-adr,len )
+      dup !load-size                             ( image-adr,len )
+      load-base swap move                        ( )
+   then
+   \ Fall through to regular 41-format handler
+   init-program
+;
+warning !
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/initpgm.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/initpgm.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,110 @@
+purpose: Generic tools for load image handlers
+\ See license at end of file
+
+: (init-program)  ( pc sp -- )
+   clear-save-area  state-valid on
+   \ PowerPC calling conventions store the link register at SP+8,
+   \ so we start with r1 a little below the top of the allocated region
+   h# 20 - to %r1  to %pc
+   cif-handler to %r5
+
+   msr@  interrupt-enable-bit invert and  to %msr
+
+   restartable? on
+   true to already-go?
+;
+
+headerless
+: ?endian-restart  ( little-endian? -- )
+   dup little-endian? <>  if
+      to little-endian?
+      collect(
+      ." Rebooting in " little-endian?  if  ." little"  else  ." big"  then
+      ." -endian mode ..." )collect progress progress-done
+      reboot-same
+   else
+      drop
+   then
+;
+
+: +base  ( n -- adr )  load-base +  ;
+
+false value bad-mode?
+: bad-mode  true to bad-mode?  ;
+
+headers
+: test-modes  ( hrp-memmap? load-base real-base real-size virt-base ...
+               ( ... virt-size real-mode? little-endian? -- )
+   false to bad-mode?
+   dup little-endian? <>  if  dup to little-endian?  bad-mode  then  drop
+   dup real-mode?     <>  if  dup to real-mode?      bad-mode  then  drop
+
+   dup -1 <>  if
+      dup virt-size <>  if  dup to virt-size  bad-mode   then
+   then
+   drop
+
+   dup -1 <>  if
+      dup virt-base <>  if  dup to virt-base  bad-mode   then
+   then
+   drop
+
+   dup -1 <>  if
+      dup real-size <>  if  dup to real-size  bad-mode   then
+   then
+   drop
+
+   dup -1 <>  if
+      dup real-base <>  if  dup to real-base  bad-mode   then
+   then
+   drop
+
+   dup -1 <>  if
+      dup load-base <>  if  dup to load-base  bad-mode   then
+   then
+   drop
+
+   dup hrp-memmap?    <>  if  dup to hrp-memmap?     bad-mode  then  drop
+;
+
+: ?mode-restart  ( -- )
+   bad-mode?  if
+      " Rebooting in the correct mode for this client program ..."  progress
+      progress-done
+      reboot-same
+   then
+;
+
+dev /client-services
+: chain  ( len args entry size virt -- )
+   release                                       ( len args entry )
+   h# 8000 alloc-mem h# 8000 +  (init-program)   ( len args )
+   to %r6  to %r7
+   go
+;
+device-end
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/isaio.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/isaio.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,37 @@
+purpose: Real-mode access to ISA IO space
+\ See license at end of file
+
+headers
+h# 8000.0000 value io-base
+
+: pc@  ( offset -- n )  io-base + rb@  ;
+: pc!  ( n offset -- )  io-base + rb!  ;
+: pw@  ( offset -- n )  io-base + rw@  ;
+: pw!  ( n offset -- )  io-base + rw!  ;
+: pl@  ( offset -- n )  io-base + rl@  ;
+: pl!  ( n offset -- )  io-base + rl!  ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/leflag.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/leflag.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,52 @@
+purpose: Read the endian flag byte from the NVRAM
+\ See license at end of file
+
+\needs get-nv-byte  fload ${BP}/cpu/ppc/prep/nv7x.fth
+
+\ Destroys:  r1,r4
+\ Out:       r3: le-flag
+
+label read-le-flag  ( -- r3: le-flag )
+   mfspr   r4,lr
+
+   \ Read the big/little endian flag from location 9 of the NVRAM.
+   set  r3,9   get-nv-byte bl *
+
+   cmpi  0,0,r3,h#4c		\ Compare to 'L'
+   0<> if			\ Set r3 only if the byte is exactly 'L'
+      set  r3,0
+   else
+      set  r3,-1
+   then
+
+\   set  r3,0			\ Big-endian
+\   set  r3,1			\ Little-endian
+
+   mtspr  lr,r4
+   bclr 20,0
+end-code
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/mappci.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/mappci.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,50 @@
+purpose: PCI physical address mapping to root node
+\ See license at end of file
+
+headerless
+: map-pci-phys  ( paddr io? phys.hi size -- vaddr )
+   >r  drop                    ( paddr io? R: size )
+   chrp?  if                   ( paddr io? R: size )
+      if  h# fe00.0000  else   ( paddr R: size )
+         \ PCI addresses below 2G are really for ISA memory space, and
+         \ must be translated up to the "peripheral memory alias" space
+         \ so as not to look like system memory addresses.
+         dup h# 8000.0000 u<  if  h# fd00.0000  else  h# 0000.0000  then
+      then
+   else
+      if  h# 8000.0000  else  h# c000.0000  then
+   then
+   or  r>  " map-in" $call-parent
+;
+: >pci-devaddr  ( root-devaddr -- pci-devaddr )
+   chrp?  0=  if  h# 8000.0000  +  then
+;
+: pci-devaddr>  ( pci-devaddr -- root-devaddr )
+   chrp?  0=  if  h# 8000.0000  -  then
+;
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/mkresid.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/mkresid.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,436 @@
+purpose: Create residual data structure
+\ See license at end of file
+
+hex
+
+0 value fw-revision		\ Set me
+h# dc6 value fw-supports	\ Change if needed
+h# 2 value fw-supplier		\ Change if needed
+
+defer #cpus  ' 1 to #cpus	\ Actual # of CPUs installed
+
+: $pcall-parent  ( ?? adr len -- ?? )
+   parent-device dup push-package  $call-static-method  pop-package
+;
+: get-parent-property  ( adr len -- val$ false | true )
+   parent-device get-package-property
+;   
+: get-bus-id  ( -- true | bus-id false )
+   " aix-bus-id" get-parent-property  if  true  exit  then
+   get-encoded-int  false
+;
+: isa-child?  ( -- flag )  get-bus-id  if  false  else  1 =  then  ;
+
+\ PnP stuff
+
+0 value next-pnp-adr
+: pnp-b,  ( byte -- )
+   next-pnp-adr  dup 1+ to next-pnp-adr  c!
+;
+: pnp-w,  ( word -- )  wbsplit swap pnp-b, pnp-b,  ;
+: pnp-l,  ( long -- )  lwsplit swap pnp-w, pnp-w,  ;
+: pnp-x,  ( d -- )  swap pnp-l, pnp-l,  ;
+
+: pnp,  ( adr len -- )  bounds  ?do  i c@ pnp-b,  loop  ;
+
+: make-interrupt-items  ( -- )
+   isa-child?  0=  if  exit  then
+   " interrupts" get-property  0=  if            ( adr len )
+      begin  dup  while
+         " pnp-decode-interrupt" $pcall-parent   ( adr' len' irq-mask flags )
+         ?dup  if
+            h# 23 pnp-b, swap pnp-w, pnp-b,
+         else
+            h# 22 pnp-b,  pnp-w,
+         then
+      repeat
+      2drop
+   then
+;
+: make-reg-item  ( false | .. stuff .. true -- )
+   0=  if  exit  then
+   if                               ( adr' len' size isa-adr 16bit )
+      \ Variable I/O port item
+      h# 47 pnp-b, pnp-b, dup pnp-w, pnp-w, 1 pnp-b, pnp-b,
+   else                             ( adr' len' d.size d.base info type )
+      \ IBM "generic address" item
+      h# 84 pnp-b,  d# 21 pnp-w,  9 pnp-b,  pnp-b, pnp-b, 0 pnp-w,
+      pnp-x, pnp-x,
+   then
+;
+: make-reg-items  ( -- )
+   \ Possible override
+   " aix-reg" get-property  0=  if  pnp,  exit  then
+   " reg" get-property  0=  if         ( adr len )
+      begin  dup  while
+         " pnp-decode-reg" $pcall-parent make-reg-item
+      repeat
+      2drop
+   then
+   " other-bus-reg" get-property  0=  if  ( adr len )
+       begin  dup  while
+          decode-int  " pnp-decode-reg"  rot $call-static-method  make-reg-item
+       repeat
+       2drop
+   then
+;
+: make-ranges-items  ( -- )
+   \ It isn't worthwhile to automate this, because the AIX ranges stuff
+   \ is too irregular.
+   " pnp-ranges" get-property  0=  if  pnp,  then
+;
+: make-dma-items  ( -- )
+   \ Only do this for children of the ISA node
+   isa-child?  0=  if  exit  then
+
+   " dma" get-property  0=  if             ( adr len )
+      begin  dup  0>  while                ( adr len )
+         h# 2a pnp-b,                      ( adr len )
+         decode-int 1 swap lshift pnp-b,   ( adr' len' )
+         decode-int pnp-b,                 ( adr'' len'' )
+      repeat                               ( adr' len' )
+      2drop
+   then
+;
+: make-id-item  ( -- )
+   " aix-chip-id" get-property 0=  if
+      h# 75 pnp-b,  1 pnp-b,  get-encoded-int lbflip pnp-l,
+   then
+;
+: invent-pnp-data  ( -- )
+   make-interrupt-items
+   make-reg-items
+   make-dma-items
+   make-id-item
+   make-ranges-items
+   " other-pnp-data" get-property  0=  if  pnp,  then
+;   
+: make-pnp-packet  ( -- )
+   " pnp-data" get-property  0=  if  pnp,  exit  then
+   " make-pnp-data" current-device find-method  if
+      execute pnp, exit
+   then                                      ( )
+   invent-pnp-data
+;
+
+\ End of pure PNP stuff
+
+
+\ Constructors for residual-data fields
+
+0 value next-res-adr
+: res-b,  ( byte -- )  next-res-adr  dup 1+ to next-res-adr  c!  ;
+: res-w,  ( word -- )  wbsplit res-b, res-b,  ;
+: res-l,  ( long -- )  lwsplit res-w, res-w,  ;
+
+\ Add PnP info to the AIX device record
+
+0 value pnp-base
+: res-pnp,  ( -- )  next-pnp-adr pnp-base -  res-l,  ;
+: end-pnp  ( -- )  h# 78 pnp-b,  ;
+: set-pnp-fields  ( -- )
+   res-pnp,  make-pnp-packet                                      end-pnp
+   res-pnp,  " pnp-possible"   get-property  0=  if  pnp,  then   end-pnp
+   res-pnp,  " pnp-compatible" get-property  0=  if  pnp,  then   end-pnp
+;
+
+
+[ifdef] compute-mem-segs
+: get-instance-property  ( property-name$ ihandle -- adr len )
+   ihandle>phandle get-package-property drop
+;
+0 value mem-reg  0 value /mem-reg
+: mem-seg-open  ( -- reg-adr,len avail-adr,len )
+   " reg" memory-node @ get-instance-property  to /mem-reg
+   /mem-reg alloc-mem to mem-reg
+   mem-reg /mem-reg move
+   mem-reg /mem-reg
+   " available" memory-node @ get-instance-property
+;
+: mem-seg-close  ( -- )  mem-reg /mem-reg free-mem  ;
+: next-range  ( reg-adr,len avail-adr,len -- reg-adr,len avail-adr,len adr ty )
+   
+;
+[then]
+
+: mem-seg,   ( start end usage -- end )
+   >r  2dup =  if  r> 2drop exit  then	\ Don't create pieces for null regions
+   r> res-l,                         ( start end )
+   over pageshift rshift res-l,      ( start end )
+   dup rot - pageshift rshift res-l,
+;
+
+: mem-segs,  ( -- )
+   next-res-adr >r  0 res-l,		\ To be patched later
+
+   0
+   \ end-address  type
+   4000             4  mem-seg,  \ trap table
+\  htab            10  mem-seg,  \ a little free piece
+\  htab /htab +     2  mem-seg,  \ HTAB
+   load-base       10  mem-seg,  \ free memory below load-base
+   loaded +  pagesize round-up
+                    8  mem-seg,	 \ loaded program
+   origin          10  mem-seg,  \ More free mem (XXX what about allocated mem)
+   limit            4  mem-seg,  \ Firmware code (dictionary)
+   sp0 @ ps-size -  2  mem-seg,  \ Firmware heap
+   memtop @         1  mem-seg,  \ Firmware stack
+   memsize         10  mem-seg,  \ free piece above firmware
+   8000.0000       20  mem-seg,  \ Unpopulated memory area
+   8080.0000      440  mem-seg,  \ ISA I/O space
+   8100.0000      480  mem-seg,  \ PCI config space
+   bf80.0000      500  mem-seg,  \ PCI I/O space
+   c000.0000      600  mem-seg,  \ System I/O registers
+   ff00.0000      800  mem-seg,  \ PCI memory space
+   fff0.0000     1000  mem-seg,  \ Unpopulated system ROM area
+   0000.0000     2000  mem-seg,  \ ROM
+   drop
+
+   next-res-adr  r@ -  /mem-seg  /  dup r> be-l!  ( actual-#mem-segs )
+   max#mem-segs swap -  /mem-seg *  next-res-adr +  to next-res-adr
+;
+   
+: get-dev&bus#  ( -- dev/func# bus# )
+   " reg" get-property drop  ( adr len )
+   get-encoded-int  lbsplit  ( reg# dev,func# bus# xxx )
+   drop rot drop drop        ( dev/func# )
+   " bus-range" get-parent-property  if  0  else  get-encoded-int  then
+;
+
+: make-aix-device  ( -- false )
+   " aix-id&type" get-property  if
+      \ No AIX property; try for PCI vendor-id, device-id, class-code props.
+
+      " vendor-id" get-property  if  false exit  then  ( adr len )
+
+      get-encoded-int
+      " device-id" get-property  abort" No device-id property"
+      get-encoded-int  wljoin >r
+
+      " class-code" get-property  abort" No class-code property"
+      get-encoded-int  >r			   ( r: devid type )
+
+   else                                            ( adr len )
+      \ Use aix-id&type property value
+      decode-int >r  get-encoded-int >r		   ( r: devid type )
+   then                                            ( adr len )
+
+   get-bus-id  if  2r> 2drop false exit  then      ( r: devid type ) ( bus-id )
+
+   dup res-l,  r> r> res-l,                        ( bus-id type )
+
+   " slave"     get-property  if    -1  else  get-encoded-int  then  res-l,
+   " aix-flags" get-property  if                   ( bus-id type )
+      over 4 =  if  4180  else  2800  then         ( bus-id type flags )
+   else                                            ( bus-id type adr len )
+      get-encoded-int                              ( bus-id type flags )
+   then  res-l,                                    ( bus-id type )
+
+   8 lshift  res-l,                                ( bus-id )
+
+   4 =  if  get-dev&bus#  else  0 0  then  res-b, res-b,
+   0 res-w,                                        ( )
+
+   set-pnp-fields
+
+   false
+;
+: cpu,  ( state cpu# type -- )  res-l,  res-b,  res-b,  0 res-b,  0 res-b,  ;
+\ XXX pvr@ should be done on each individual CPU
+: (cpus,)  ( -- )
+   max#cpus res-w,
+   #cpus res-w,
+
+\ XXX   1 0 pvr@ cpu,		  \ Assumes that CPU 0 is running the firmware
+   0 0 pvr@ cpu,		  \ Assumes that CPU 0 is running the firmware
+
+   #cpus 1  ?do  0 i pvr@ cpu,  loop	\ Assumes that all CPUs are good
+   res#cpus #cpus ?do  0 0 0 cpu,  loop	\ Zero the unused entries
+;
+defer cpus,  ' (cpus,) to cpus,
+
+: mem-simm-size  ( simm# -- #bytes )
+   " simm-size" memory-node @ $call-method
+;
+: simms,  ( -- )
+   \ Count the number of SIMMs present
+   0  max#mems 0  do  i mem-simm-size  if  1+  then  loop  res-l,
+
+   \ ??? should this be densely packed or sparse?
+   max#mems 0  do  i mem-simm-size d# 20 rshift res-l,  loop
+;
+: mem,  ( -- )
+   " size" memory-node @ $call-method drop      ( #bytes )
+   dup res-l,			\ Total memory
+   res-l,			\ Good memory
+   mem-segs,
+   simms,
+;
+
+: get-root-int  ( name$ -- n )  root-phandle get-int  ;
+: get-cpu-int  ( name$ -- n )  cpu-package get-int  ;
+
+: res-erase  ( #bytes -- )  0  ?do  0 res-b,  loop  ;
+: res-$,  ( adr len maxlen -- )
+   dup >r  min tuck   ( adr len' )
+   bounds  ?do  i c@ res-b,  loop    ( len' )  ( r: maxlen )
+   r> swap  ?do  bl res-b,  loop
+;
+: cpu-int,  ( name$ -- )  get-cpu-int res-l, ;
+
+: >kb  ( #bytes -- #kb )  d# 10 rshift  ;
+: cache,  ( -- )
+   \ XXX this needs work for 601 and other potential unified-cache processors
+   " i-cache-block-size" get-cpu-int              ( line-size )
+   dup res-l,		\ coherence block size
+   dup res-l,		\ reservation granule size
+   " i-cache-size" get-cpu-int                    ( line-size i$-size )
+   " d-cache-size" get-cpu-int                    ( line-size i$-size d$-size )
+   2dup + >kb  res-l,	\ Total cache size in KB
+
+   " cache-unified" cpu-package get-package-property  if  ( /i$l /i$ /d$ )
+      1 res-l,				\ split cache
+      0 res-l,				\ associativity
+      0 res-l,				\ unified cache line size
+      over >kb res-l,   ( i$-line /i$ /d$ )	\ i-cache-size in KB
+      swap 2 pick /     ( i$-line /d$ i$#lines )
+      " i-cache-sets" get-cpu-int / res-l,	\ i-cache-associativity
+      swap res-l,     ( /d$ )		\ i-cache-line-size
+      dup >kb res-l,  ( /d$ )		\ d-cache-size in KB
+      " d-cache-block-size" get-cpu-int	( /d$ /d$ln )
+      tuck /          ( /d$ln d$#lines )
+      " d-cache-sets" get-cpu-int / res-l, ( /d$ln) \ d-cache-associativity
+      res-l,				\ d-cache-line-size
+
+      " tlb-size" get-cpu-int		( #tlb-entries )
+      dup res-l,			\ tlb-size
+      620-class?  if                    ( #tlb-entries )
+         drop                           ( )
+         2 res-l,			\ unified TLB
+         2 res-l,                       \ TLB associativity for unified TLB
+         d# 128 res-l, 			\ i-tlb-size
+         d# 2 res-l,			\ i-tlb-associativity
+         d# 128 res-l,			\ d-tlb-size
+         d# 2 res-l,			\ d-tlb-associativity
+      else
+         1 res-l,			\ split TLB
+         0 res-l,                       \ TLB associativity for unified TLB
+         2/ dup  " tlb-sets" get-cpu-int   ( #itlb-ents #itlb-ents #tlb-sets )
+         2/ /                              ( #itlb-entries #itlb-sets )
+         over res-l,			\ i-tlb-size
+         dup  res-l,			\ i-tlb-associativity
+         swap res-l,			\ d-tlb-size
+              res-l,			\ d-tlb-associativity
+      then
+   else						( ... adr len )
+      2drop
+[ifdef] notdef
+      2 res-l,				\ unified cache
+      ?? res-l,				\ associativity
+      0 res-l,				\ unified cache line size
+[then]      
+   then
+   0 res-l,
+;   
+
+: devs,  ( -- )
+   next-res-adr >r  0 res-l,		\ To be patched later
+
+   root-phandle push-package
+      ['] make-aix-device  ['] (search-preorder) catch 2drop
+   pop-package
+
+   next-res-adr  r@ -  /device  /  r> be-l!
+;
+
+: make-residual-data  ( -- )
+   /residual-data alloc-mem to residual-data
+   residual-data to next-res-adr
+
+   residual-data pnp-heap-offset + to pnp-base
+   pnp-base to next-pnp-adr
+
+   residual-data /residual-data erase
+
+   /residual-data res-l,	\ length
+   0 res-b,  1 res-b,		\ version, revision
+   fw-revision res-w,		\ firmware revision
+
+   " model" root-phandle get-package-property  if
+      " "
+   else
+      get-encoded-string
+   then
+   d# 31 res-$,	0 res-b,		\ Printable Model
+
+   " aix-serial#" root-phandle get-package-property  if
+      " "
+   else
+      get-encoded-string
+   then
+   d# 16 res-$,
+
+   d# 48 res-erase
+
+   fw-supplier res-l,		\ Firmware Supplier
+   fw-supports res-l,		\ FirmwareSupports bit mask
+
+   " size" nvram-node $call-method drop d# 1024 round-up  res-l,
+
+   " #simm-slots" memory-node @ ihandle>phandle get-package-property
+   abort" Missing #simm-slots property in memory node"
+   get-encoded-int res-l,
+
+   \ XXX depends on bridge
+   1 res-w,			\ Endian switch: Port A8 bit 5 - for Eagle
+   0 res-w,			\ Spread I/O: Port 850
+
+   \ XXX for SMP
+   0 res-l,			\ SMP enter-idle-loop address
+
+   0 res-l,			\ RAM error log offset into PnP heap
+   8 res-erase
+
+   " clock-frequency" cpu-int,
+   " clock-frequency" get-root-int dup res-l,   ( CPU-bus-clock-freq )
+   4 res-erase
+
+   " timebase-frequency"  get-cpu-int / d# 1000 *  res-l,
+
+   620-class?  if  d# 64  else  d# 32  then  res-l,
+
+   d# 4096 res-l,			\ page size
+
+   cache,
+   cpus,
+   mem,
+
+   devs,
+
+   make-boot-name
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/nv7x.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/nv7x.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,37 @@
+purpose: Read bytes from NVRAM using indirect (port 7x) access
+\ See license at end of file
+
+\ Destroys: r1,r3
+label get-nv-byte  ( r3:offset -- r3:byte )
+   io-base  set     r1,*
+   rlwinm  r3,r3,24,0,31   nv-adr-high 1  stb r3,*   \ High address byte
+   rlwinm  r3,r3,08,0,31   nv-adr-low  1  stb r3,*   \ Low address byte
+   eieio
+   nv-data 1  lbz  r3,*
+   bclr    20,0
+end-code
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/nvramhdr.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/nvramhdr.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,105 @@
+purpose: PR*P-specific NVRAM functions
+\ See license at end of file
+
+headerless
+[ifndef] nvram-l@
+: nvram-l@  ( offset -- l )  dup wa1+ nvram-w@  swap nvram-w@  wljoin  ;
+: nvram-l!  ( l offset -- )  >r lwsplit r@ nvram-w!  r> wa1+ nvram-w!  ;
+[then]
+
+: crc-loop  ( crc end start -- crc' )  ?do  i nvram-c@ crcgen  loop  ;
+: os-area  ( -- offset len )  h# e8 nvram-l@  h# ec nvram-l@  ;
+: config-area  ( -- offset len )  h# d4 nvram-l@  h# d8 nvram-l@  ;
+: env-range  ( -- offset len )  h# c4 nvram-l@  h# c8 nvram-l@  ;
+
+: prep-env-area  ( -- adr len )  env-range swap config-mem +  swap  ;
+
+\ There is a bug in IBM's early firmware which causes it to omit byte 8.
+: crc-base  ( -- offset )  3 nvram-c@ 4 >=  if  8  else  9  then  ;
+: crc1  ( -- n )
+   h# ffff  4 0  crc-loop              ( crc )
+   os-area drop  crc-base  crc-loop    ( crc )
+;
+: fix-crc1  ( -- )  crc1  4 nvram-w!  4 2 write-range  ;
+: fix-crc2  ( -- )
+   h# ffff
+
+   \ There is a bug in IBM's early firmware which causes it to omit
+   \ the last byte, hence the "1-" below.
+   h# d4 nvram-l@  h# d8 nvram-l@ 1-  0 max  bounds  crc-loop  ( crc )
+   6 nvram-w!
+
+   6 2 write-range
+;
+
+\ True if the intersection between the two ranges in not empty
+: overlap?  ( adr1 len1 adr2 len2 -- flag )
+   >r >r   over r@ max  -rot       ( max-adr adr1 len1 )
+   + r> r> +  min                  ( max-adr min-end-adr )
+   swap -  0>
+;
+: prep-config-checksum?  ( -- okay? )
+   os-area  drop  crc-base config-size within  if
+      crc1 4 nvram-w@ =
+   else
+      false
+   then
+;
+
+: set-prep-env-checksum  ( -- )
+   modified-range  0  os-area drop  overlap?  if  fix-crc1  then
+   modified-range  config-area      overlap?  if  fix-crc2  then
+;
+
+hex
+: >bcd  ( binary -- bcd )  d# 10 /mod  4 << +  ;
+: set-timestamp  ( offset -- )
+   >r
+   time&date d# 100 /mod  r@ 7  bounds  do  >bcd i nvram-c!  loop
+   r> 7 +  0 swap nvram-c!
+;
+: init-timestamps  ( -- )  5c 34  do  i set-timestamp  8 +loop  ;
+: clear-passwords  ( -- )  " none" " security-mode" $setenv  ;
+: prep-layout-config  ( -- )
+   config-size d# 1024 /    0 nvram-w!	\ Size in KBytes
+   1 2 nvram-c!  2 3 nvram-c!		\ version and revision
+   0 3 nvram-c!				\ Last OS (Firmware)
+   init-timestamps
+
+    a00 e8 nvram-l!  200 ec nvram-l!	\ OS Area
+   1000 d4 nvram-l!    0 d8 nvram-l!	\ ConfigArea (PnP packets)
+     f8 c4 nvram-l!  908 c8 nvram-l!	\ Global Environment area
+
+   clear-passwords	 \ Depends on the area descriptors above!
+;
+: prep-nvram?  ( -- flag )
+   2 nvram-c@ 1 =  3 nvram-c@ 2 =  and
+   0 nvram-w@  config-size d# 1024 /  =  and
+   prep-config-checksum? and
+;
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/nvtypes.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/nvtypes.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,258 @@
+purpose: Configuration option data types that are PR*P but not CHRP specific
+\ See license at end of file
+
+: [']actions  ( -- )  compile (') action-adr token,  ; immediate
+
+6 actions
+action: drop 9 nvram-c@ ascii L =  ;
+action: drop  if  ascii L  else  ascii B  then config-rw 9 nvram-c! config-ro ;
+action: drop  config-mem 9 +  ;
+action: drop flag>$  ;
+action: drop $>flag  ;
+action: la1+ @ 0<>  ;
+
+\ Modify the code field of the little-endian? flag to make it use
+\ the PR*P storage location and encodings.
+: set-prep-le  ( -- )  [']actions  ['] little-endian?  uses  ;
+
+[ifdef] notdef
+: pack-prep-env  ( adr len apf -- adr' len' )  \ Binary to ASCII text
+   >r
+   push-hex
+   >r r@ 2*  alloc-mem             ( adr adr' )
+   r@  0  do                       ( adr adr' )
+      over i ca+ c@  <# u# u# u#>  ( adr adr' n-adr 2 )
+      drop over i wa+ 2 move       ( adr adr' )
+   loop
+   nip r> 2*
+   pop-base
+   2dup r> false put-env$          ( adr' len' )
+   free-mem                        ( )
+;
+
+\ The maximum size required for this buffer is limited to the size of
+\ the global environment area divided by two.  The size of the global
+\ environment area is established by set-mfg-defaults
+h# 908 2/ constant /decode-buf
+/decode-buf buffer: decode-buf
+
+0 value pntr
+: unpack-prep-env  ( cstr -- adr' len' )  \ ASCII text to binary
+   push-hex
+   0 to pntr
+   decode-buf				( adr adr' )
+   begin                                ( adr adr' )
+      over pntr wa+ 2 $number  if  
+         0 true				( adr adr' 0 true )
+      else
+         pntr /decode-buf =		( adr adr' n flag )
+      then
+      >r				( adr adr' 0|n ) ( r: flag )
+      over pntr ca+ c!			( adr adr' ) ( r: flag )
+      pntr 1+ to pntr			( adr adr' ) ( r: flag )
+      r>				( adr adr' flag )
+   until
+   nip  pntr 1-				( adr' len' )
+   pop-base
+;
+[then]
+
+headerless
+
+h# 20 constant boot-pw
+h# 30 constant config-pw
+max-password buffer: password-buf
+: password@  ( offset -- byte )  " rtc@" clock-node @ $call-method  ;
+: password!  ( byte offset -- )  " rtc!" clock-node @ $call-method  ;
+: pw-crc!  ( crc offset -- )  >r wbsplit  r@ password!  r> 1+ password!  ;
+: pw-crc@  ( offset -- crc )  dup 1+ password@  swap password@  bwjoin  ;
+: retrieve-password  ( offset -- )
+   max-password 0  ?do  dup i + password@  password-buf i + c!  loop
+   drop
+;
+: password-string  ( -- adr len )
+   max-password  dup 0  ?do
+      password-buf i ca+ c@ 0=  if  drop i  leave  then
+   loop   ( #chars )
+   password-buf swap
+;
+: compute-pw-crc  ( offset -- crc offset' )
+   dup max-password +  >r
+   retrieve-password   
+   h# ffff  password-buf max-password bounds  ?do  i c@ crcgen  loop  ( crc )
+   r>
+;
+: make-invalid  ( offset -- )  compute-pw-crc swap invert swap  pw-crc!  ;
+: make-valid  ( offset -- )  compute-pw-crc  pw-crc!  ;
+: pw-off  ( -- )  1  h# 19 password!  1  h# 1f password!  ;
+: pw-on   ( -- )  0  h# 19 password!  0  h# 1f password!  ;
+: pw-on?  ( -- flag )
+   h# 19 password@ 0=     h# 1f password@ 0=  or
+;
+: pw-valid?  ( offset -- flag )  compute-pw-crc pw-crc@ =  ;
+: set-password  ( adr len offset -- )
+   d# 14 0  do  0 over i + password!  loop	\ Erase old value
+   swap   0  ?do  ( adr offset )  over i + c@  over i + password!  loop
+   2drop
+;
+
+: prep-secmode@  ( apf -- n )
+   drop
+   pw-on?  0=  if  0  exit  then
+   boot-pw pw-valid?  if
+      2
+   else
+      config-pw pw-valid?  if  1  else  0  then
+   then
+;
+: prep-secmode!  ( n apf -- )
+   drop
+   case
+      1  of  config-pw make-valid   boot-pw make-invalid  pw-on  endof
+      2  of  config-pw make-valid   boot-pw make-valid    pw-on  endof
+             config-pw make-invalid boot-pw make-invalid  pw-off
+   endcase
+;
+: prep-password@  ( apf -- adr len )
+   drop  config-pw retrieve-password  password-string
+;
+: prep-password!  ( adr len apf -- )
+   drop            ( adr len )
+   max-password min  2dup config-pw set-password  boot-pw set-password
+;
+
+5 actions
+action: drop  h# 2c nvram-l@  h# 30 nvram-l@ +  ;
+action: drop  config-rw  0 h# 2c nvram-l!  h# 30 nvram-l!  config-ro  ;
+action:  ;
+action: drop (.d)  ;
+action: drop $>number  ;
+
+\ Modify the code field of the little-endian? flag to make it use
+\ the PR*P storage location and encodings.
+: set-prep-#badlogins  ( -- )
+   [']actions  ['] security-#badlogins  uses
+;
+
+headers
+warning @ warning off
+: set-defaults  ( -- )
+   security-on?  if
+      ." Note: set-defaults does not change the security fields." cr
+   then
+   set-defaults
+;
+warning !
+
+d#  20 value /fixed-nv
+h# 7ec value fixed-nv-base	\ Override as needed for the platform
+
+true value fixed-nv-ok?
+
+: fixed-nv@  ( offset -- byte )  fixed-nv-base +  nv-c@  ;
+: fixed-nv!  ( byte offset -- )  fixed-nv-base +  nv-c!  ;
+
+: fixed-nv-checksum  ( -- checksum )
+   0  /fixed-nv  0  ?do  i fixed-nv@ xor  loop  ( checksum )
+;
+
+: set-fixed-nv-checksum  ( -- )
+   fixed-nv-checksum  0 fixed-nv@ xor  h# 5a xor  0 fixed-nv!
+;
+
+6 actions
+action: fixed-nv-ok?  if  l@ fixed-nv@ 0<>  else  la1+ @  then  ;
+action: l@ fixed-nv! set-fixed-nv-checksum  ;
+action: l@  ;
+action: drop flag>$  ;
+action: drop $>flag  ;
+action: la1+ @ 0<>  ;
+
+: is-fixed-nv-flag  ( offset xt -- )
+   [']actions over uses  ( offset xt )
+   >body l!              ( )
+;
+
+6 actions
+action:
+   fixed-nv-ok?  if
+      l@  4 bounds  do  i fixed-nv@  loop  swap 2swap swap bljoin
+   else
+      la1+ @
+   then
+;
+action:
+   l@ >r  lbsplit  r> 4 bounds  do  i fixed-nv!  loop
+   set-fixed-nv-checksum
+;
+action: l@  ;
+action: drop
+   push-hex <# 0 hold u#s [char] x hold  [char] 0 hold u#>  pop-base
+;
+action: drop $>number  ;
+action: la1+ @  ;
+
+: is-fixed-nv-int  ( offset xt -- )
+   [']actions over uses  ( offset xt )
+   >body l!              ( )
+;
+
+' diag-switch? is (diagnostic-mode?)
+
+: init-fixed-nv  ( -- )
+   fixed-nv-checksum h# 5a = ?dup  if  to fixed-nv-ok? exit  then
+   ['] diag-switch? do-set-default
+   ['] real-mode?   do-set-default
+   ['] real-base    do-set-default
+   ['] real-size    do-set-default
+   ['] virt-base    do-set-default
+   ['] virt-size    do-set-default
+   ['] hrp-memmap?  do-set-default
+   fixed-nv-checksum h# 5a =  to fixed-nv-ok?
+;
+
+headerless
+: install-prep-nv  ( -- )
+   set-prep-le
+   set-prep-#badlogins
+
+       1 ['] diag-switch? is-fixed-nv-flag
+       2 ['] real-mode?   is-fixed-nv-flag
+       3 ['] real-base    is-fixed-nv-int
+       7 ['] real-size    is-fixed-nv-int
+   d# 11 ['] virt-base    is-fixed-nv-int
+   d# 15 ['] virt-size    is-fixed-nv-int
+   d# 19 ['] hrp-memmap?  is-fixed-nv-flag
+
+   ['] drop                  to grow-cv-area
+   ['] prep-env-area         to cv-area
+   ['] prep-config-checksum? to config-checksum?
+   ['] prep-layout-config    to layout-config
+   ['] set-prep-env-checksum to set-env-checksum
+;
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/build/Makefile.cross
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/build/Makefile.cross	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,38 @@
+# This setting of HOSTDIR is for cross-building on an x86 Linux system
+# For it to work, you first need to build the simulator version of ppcforth
+# in cpu/x86/Linux with "make -f Makefile.ppcforth"
+OS := $(shell uname)
+
+HOSTCPU:=x86
+HOSTDIR:=../../../../${HOSTCPU}/${OS}
+
+all: qprepofw.rom
+
+.PHONY: FORCE all clean
+
+.PRECIOUS: qprepofw.rom
+
+${HOSTDIR}/forth:
+	@make -C ${HOSTDIR} forth
+
+${HOSTDIR}/ppcforth:
+	@make -C ${HOSTDIR} -f Makefile.ppcforth ppcforth
+
+build: ${HOSTDIR}/forth
+	@ln -sf $< $@
+
+%.di: FORCE build ${HOSTDIR}/ppcforth
+	./build $@
+
+%.dic: FORCE build resetvec.di start.di
+	./build $@
+
+qprepofw.rom: FORCE build fw.dic
+	./build rom
+
+builder.dic: FORCE build
+	-[ ! -f builder.sav ] && cp builder.dic builder.sav
+	./build builder.dic
+
+clean:
+	rm -f fw.dic *.di *.log *~ build

Added: cpu/ppc/prep/qemu/cpunode.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/cpunode.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,36 @@
+purpose: CPU node
+\ See license at end of file
+
+hex
+headers
+
+defer l2cache-on	' noop to l2cache-on
+defer l2cache-off	' noop to l2cache-off
+defer l2cache-flush	' noop to l2cache-flush
+: allcache-off  l2cache-off icache-off dcache-off ;
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/devalias.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/devalias.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,46 @@
+purpose: Platform-specific device aliases
+\ See license at end of file
+
+devalias net /pci/ethernet
+
+devalias scsi  /pci/scsi
+devalias disk0 /pci/ide/disk at 0,0:1
+devalias disk1 /pci/ide/disk at 1,0:1
+devalias disk3 /pci/ide/disk at 3,0:1
+devalias cdrom /pci/ide/disk at 2,0
+
+devalias a /fdc/disk at 0:\
+devalias c /pci/ide/disk at 0,0:\
+
+devalias disk  /pci/ide/disk at 0,0:1
+
+\ devalias mouse /pci/isa/8042/mouse
+
+devalias com1 /pci/isa/serial at i3f8
+devalias com2 /pci/isa/serial at i2f8
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\ Copyright (c) 2014 Artyom Tarasenko
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/devices.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/devices.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,69 @@
+purpose: Load file for devices of QEMU -M prep
+copyright: Copyright 1999 FirmWorks Inc.  All Rights Reserved.
+
+fload ${BP}/cpu/ppc/prep/qemu/pcinode.fth
+
+: unswizzle-move  ( arc dest len -- )  move  ;
+
+0 0  " fff00000"  " /" begin-package
+   " flash" device-name
+   h# 10.0000 dup constant /device constant /device-phys
+   my-address my-space /device reg
+   fload ${BP}/dev/flashpkg.fth
+
+end-package
+
+\ Create the /ISA node in the device tree, and load the ISA bridge code.
+\ Usually this includes the dma controller, interrupt controller, and timer.
+0 0  " b"  " /pci" begin-package
+fload ${BP}/dev/via/vt82c586.fth			\ ISA node
+end-package
+
+fload ${BP}/dev/isa/irq.fth
+
+support-package: 16550
+fload ${BP}/dev/16550pkg/16550.fth  \ Serial port support package
+end-support-package
+
+\ Super I/O support.
+\ Usually includes serial, parallel, floppy, and keyboard.
+\ The 87308 also has gpio and power control functions.
+fload ${BP}/dev/isa/pc87307.fth			\ SuperI/O
+
+\ QEMU doesn't have rtc/nvram on port 70
+" /rtc"  find-package  if  delete-package  then
+
+0 0 " i74" " /isa" begin-package	 \ RTC node
+   fload ${BP}/dev/m48t559.fth
+end-package
+
+fload ${BP}/cpu/ppc/prep/qemu/fixednv.fth  \ Offsets of fixed regions of NVRAM 
+
+
+fload ${BP}/cpu/ppc/prep/qemu/macaddr.fth
+
+0 0  " i74"  " /pci/isa" begin-package	  \ NVRAM node
+fload ${BP}/dev/ds1385n.fth
+
+" mk48t18-nvram" encode-string
+" ds1385-nvram"  encode-string encode+
+" pnpPNP,8"      encode-string encode+
+" compatible" property
+
+env-end-offset to /nvram
+end-package
+stand-init: NVRAM
+   " /nvram" open-dev  to nvram-node
+    init-config-vars
+;
+
+0 0 " b,1" " /pci" begin-package
+   fload ${BP}/dev/ide/pcilintf.fth
+   fload ${BP}/dev/ide/generic.fth
+   fload ${BP}/dev/ide/onelevel.fth
+end-package
+\ One-level IDE
+
+\ Mark all ISA devices as built-in.
+" /isa" find-device  mark-builtin-all  device-end
+

Added: cpu/ppc/prep/qemu/fixednv.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/fixednv.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,42 @@
+purpose: Offsets of fixed areas of NVRAM
+\ See license at end of file
+
+\ d# 19
+h# 400
+
+[ifdef] /fixed-nv  to /fixed-nv  [else]  constant /fixed-nv  [then]
+
+\ Allocate fixed regions of NVRAM from the top down
+h# 2000
+h#    8    -  dup   constant rtc-reg-offset  ( h# 1ff8 )  \ RTC registers
+h#   10    -  dup   constant cmos-offset     ( h# 1eb8 )  \ Simulated CMOS RAM
+
+/fixed-nv  -  dup                    ( h# 1ea5 h# 1ea5 )  \ real-base, etc.
+[ifdef] fixed-nv-base  to fixed-nv-base  [else]  constant fixed-nv-base  [then]
+
+constant env-end-offset                      ( )
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/fw.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/fw.bth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,130 @@
+purpose: OFW build file for QEMU/prep
+\ See license at end of file
+
+dictionary: ${BP}/cpu/ppc/prep/build/prepfw.dic
+command: &ppcforth &dictionary &this
+build-now
+
+true to stand-init-debug?
+
+hex
+warning on
+
+h#   4.0000 constant initial-heap-size
+
+fload ${BP}/dev/diaguart.fth		\ Diagnostic driver for serial port
+h# 3f8 is uart-base
+fload ${BP}/forth/lib/sysuart.fth	\ Plug UART routines into key and emit
+' ukey is diag-key			\ Feed UART input to "dl"
+
+: ?report drop ;
+: fw-title ( -- )
+   ." Open Firmware"
+   " build-date"  $find  if  ."  , Built  " execute type  else  2drop  then  cr
+   ?spaces ." Copyright (c) 1995-2000, FirmWorks." cr
+   ?spaces ." Copyright (c) 2014, Artyom Tarasenko." cr
+;
+' fw-title to .firmware
+
+: .r3 ;
+
+fload ${BP}/cpu/ppc/ppcboot.fth 	\ Forth startup code
+
+fload ${BP}/dev/pci/configm1.fth
+fload ${BP}/cpu/ppc/prep/raven.fth
+
+\ Add name properties and an init method to the root node of the device tree.
+fload ${BP}/cpu/ppc/prep/qemu/rootnode.fth
+
+\ Add drivers for supported plug-in cards
+fload ${BP}/cpu/ppc/prep/qemu/devices.fth
+fload ${BP}/cpu/ppc/prep/qemu/devalias.fth
+
+: (probe-all)
+  true to fcode-debug?
+  true to diag-switch?
+   " probe-" do-drop-in
+   probe-pci
+;
+['] (probe-all) to probe-all
+
+stand-init:  Keyboard overrides
+   ?bailout
+;
+
+\ Add CPU properties
+fload ${BP}/cpu/ppc/prep/qemu/cpunode.fth	\ CPU node additions
+
+\ Scrub memory and add it to the available list.
+fload ${BP}/cpu/ppc/prep/qemu/probemem.fth	\ Memory probing
+
+0 value residual-data
+: make-aix-l2-cache ;
+
+fload ${BP}/cpu/ppc/prep/residdef.fth		\ Residual data structure
+
+: get-int  ( name$ phandle -- int )
+   get-package-property  abort" Missing property"  get-encoded-int
+;
+
+: make-boot-name ;
+
+fload ${BP}/cpu/ppc/prep/mkresid.fth               \ Residual data creation
+fload ${BP}/cpu/ppc/prep/encresid.fth              \ Residual data encoding
+
+fload ${BP}/cpu/ppc/prep/fortyone.fth              \ handler for AIX booting
+
+support-package: ufs-file-system
+   fload ${BP}/ofw/fs/ufs/ufs.fth               \ Unix file system
+end-support-package
+
+fload ${BP}/forth/lib/crc32.fth
+\needs unix-seconds>  fload ${BP}/ofw/fs/unixtime.fth   \ Unix time calculation
+\needs ($crc16)       fload ${BP}/forth/lib/crc16.fth
+support-package: ext2-file-system
+    fload ${BP}/ofw/fs/ext2fs/ext2fs.fth \ Linux file system
+end-support-package
+
+
+devalias dropins /flash
+
+\ Create a pseudo-device that presents the dropin modules as a filesystem.
+fload ${BP}/ofw/fs/dropinfs.fth
+\ This devalias lets us say, for example, "dir rom:"
+devalias rom     /dropin-fs
+
+\ XXX should check QEMU -nographic option
+\ for now, comment out the two following lines for graphic boot
+\ " com1"  ' output-device  set-config-string-default
+\ " com1"  ' input-device   set-config-string-default
+
+
+install-rom-cold
+
+.( --- Saving fw.dic ---)  " fw.dic" $save-forth  cr
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\ Copyright (c) 2014 Artyom Tarasenko
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/initrav.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/initrav.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,114 @@
+purpose: Low-level startup code for Raven
+\ See license at end of file
+
+label setup-raven  ( -- )
+   mfspr  r30,lr
+
+[ifdef] slam-it
+
+   \ PPCbus registers
+   raven-base	set  r1,*
+
+   set  r2,h#fd00.fdff
+   stw   r2,h#40(r1)
+
+   set  r2,h#0300.00c2
+   stw   r2,h#44(r1)
+
+   set  r2,h#fe00.fe7f
+   stw   r2,h#48(r1)
+
+   set  r2,h#0200.00c0
+   stw   r2,h#4c(r1)
+
+   set  r2,h#c000.fcff
+   stw   r2,h#50(r1)
+
+   set  r2,h#4000.00c2
+   stw   r2,h#54(r1)
+
+   set  r2,h#8000.bf7f
+   stw   r2,h#58(r1)
+
+   set  r2,h#8000.00c0
+   stw   r2,h#5c(r1)
+
+   set  r2,h#55
+   stb   r2,h#60(r1)
+   set  r2,h#aa0f
+   sth   r2,h#60(r1)
+
+   set  r2,h#55
+   stb   r2,h#68(r1)
+   set  r2,h#aa0f
+   sth   r2,h#68(r1)
+
+   set  r2,h#dead.beef
+   stw   r2,h#74(r1)
+
+   \ PCIbus registers
+
+   set     r1,h#80000cf8	\ PCI Configuration Address Register
+
+   set     r2,h#80000004	\ Config address of word containing offset 4
+   stwbrx  r2,r0,r1
+   set     r3,h#06		\ Memory and mastership enable
+   stb     r3,4(r1)		\ Write to config register 0x04
+
+   set     r2,h#80000014	\ Config address of word containing offset 14
+   stwbrx  r2,r0,r1
+   set     r3,h#0000003c	\ (swapped) MPIC base address in PCI mem space
+   stw     r3,4(r1)		\ Write to config register 0x14
+
+   set     r2,h#80000080	\ Config address of word containing offset 80
+   stwbrx  r2,r0,r1
+   set     r3,h#fe.81.00.80	\ (swapped) PCI aperture [8000.0000-81ff.0000)
+   stw     r3,4(r1)		\ Write to config register 0x80
+
+   set     r2,h#80000084	\ Config address of word containing offset 84
+   stwbrx  r2,r0,r1
+   set     r3,h#f3.00.00.80	\ (swapped) maps to PPC bus 0
+   stw     r3,4(r1)		\ Write to config register 0x84
+
+   set     r2,h#80000088	\ Config address of word containing offset 88
+   stwbrx  r2,r0,r1
+   set     r3,h#ff.81.ff.81	\ (swapped) PCI aperture [81ff.0000-8200.0000)
+   stw     r3,4(r1)		\ Write to config register 0x88
+
+   set     r2,h#8000008c	\ Config address of word containing offset 8c
+   stwbrx  r2,r0,r1
+   set     r3,h#e3.00.00.80	\ (swapped) maps to PPC bus 01ff.0000
+   stw     r3,4(r1)		\ Write to config register 0x8c
+
+
+[then]
+
+   mtspr  lr,r30
+   bclr   20,0			\ ET go home...
+end-code
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/macaddr.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/macaddr.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,98 @@
+purpose: System MAC Address access
+\ See license at end of file
+
+8 buffer: id
+: (system-mac-address)  ( -- addr len )  id 1+  6  ;
+
+: mac-sum  ( -- cksum )  h# a4  id 1+ 6  bounds  do  i c@ xor  loop  ;
+: mac-bad?  ( -- flag )
+   \ If the version byte is 0 or ff, the EEPROM hasn't been programmed
+   id c@  dup 0=  swap h# ff =  or  if  true exit  then
+
+   id 1+ c@  1 and 0<>            \ Don't allow multicast MAC addresses
+
+   \ Test the MAC address checksum
+   mac-sum  id 0 + c@  xor 0<>  or  ( bad? )
+;
+: get-mac-address  ( -- )
+   id  8  h# ff  fill		\ Default value (broadcast address)
+   7 0 do  i 1+ " cmos@" clock-node @ $call-method  id 1+ c!  loop
+   mac-bad?  if
+      ." The MAC address in the EEPROM is invalid" cr
+\     ['] false to idprom-valid?
+   then
+;
+['] (system-mac-address) is system-mac-address
+
+stand-init: MAC address
+   get-mac-address
+;
+
+1 buffer: mkp-buf
+: gh  ( value index -- )  id + c!  ;
+: mkp  ( value index -- )
+  2dup gh
+  1+  " cmos!" clock-node @ $call-method
+;
+: g0  ( n1 n2 -- )
+   <>  if
+\     " Copyright (c) 1998 FirmWorks"
+      " Bnoxqhfgs 'b( 0887 EhqlVnqjr"
+      bounds  ?do  i c@ dup bl >  if  1+  then emit  loop
+      quit
+   then
+;
+: g1  ( -- )  key  control D  g0  ;
+: g2  ( -- )  key  control R  g0  ;
+: g3  ( -- )  mac-bad?  0=  if  0 1 g0  then  ;
+
+: mkpx  ( mac0 mac1 mac2 mac3 mac4 mac5 -- )
+   g1
+   g2  g3
+   6 0  do  6 i - gh  loop	\ Ethernet address
+   mac-sum 0 gh
+   7 0 do   id i + c@  i 1+  " cmos!"  clock-node @ $call-method  loop
+
+   ['] true to idprom-valid?
+;
+
+
+\ 2 buffer: xid-buf
+\ 
+\ : update-xid  ( -- )
+\    nvram-node 0=  if  exit  then
+\    [ also " /obp-tftp" find-device ]
+\    8 ee-seek  xid-buf 2 ee-read
+\    xid-buf le-w@  1+  dup  xid-buf le-w!   ( xid-high )
+\    8 ee-seek  xid-buf 2 ee-write	   ( xid-high )
+\    d# 20 lshift to rpc-xid                 ( )
+\    [ previous definitions ]
+\ ;
+\ stand-init:
+\    update-xid
+\ ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/pcinode.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/pcinode.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,61 @@
+purpose: System-specific portions of PCI bus package
+\ See license at end of file
+
+dev /pci
+
+d# 33,333,333 " clock-frequency"  integer-property
+
+external
+
+h#    1.c000  " bus-master-capable"          integer-property
+
+h# 1c000 encode-int				\ Mask of implemented slots
+" Slot1" encode-string encode+
+" Slot2" encode-string encode+
+" Slot3" encode-string encode+  " slot-names" property
+
+: config-setup  ( config-adr -- vaddr )
+   \ Bit 31 ("enable") must be 1, bits 30:24 ("reserved") must be 0,
+   \ bits 1:0 must be 0.
+   dup h# ff.fffc and  h# 8000.0000 or  h# cf8 pl!  ( config-adr )
+   3 and  h# cfc +  \ Merge in the byte selector bits
+;
+
+: config-b@  ( config-adr -- b )  config-setup pc@ ;
+: config-w@  ( config-adr -- w )  config-setup pw@  ;
+: config-l@  ( config-adr -- l )  config-setup pl@ ;
+: config-b!  ( b config-adr -- )  config-setup pc! ;
+: config-w!  ( w config-adr -- )  config-setup pw! ;
+: config-l!  ( l config-adr -- )  config-setup pl! ;
+
+
+fload ${BP}/dev/pci/intmap.fth		\ Generic interrupt mapping code
+
+device-end
+
+" 2,3,4,5"  dup config-string pci-probe-list
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/probemem.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/probemem.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,66 @@
+purpose: Create memory node properties and lists
+\ See license at end of file
+
+" /memory" find-device
+
+headerless
+
+: scrub&release  ( bottom top -- )
+   2dup =  if  2drop exit  then
+   over -  2dup  berase
+   release
+;
+
+headers
+
+: probe  ( -- )
+   0 memsize  reg       \ Put all memory in the "reg" property value
+   1 encode-int  " #simm-slots" property \ 1 SIMM should be enough for everyone
+
+   \ NT and MacOS have different ideas about the reporting of low pages
+   in-little-endian?  if  h# 4000  else  h# 3000  then
+   origin pagesize round-down  virt-phys -  scrub&release
+
+   memtop @       memsize                    scrub&release
+;
+
+\ mkresid.fth needs #simm-slots and simm-size. Let's give it one SIMM
+: simm-size ( simm# -- size )
+   0<> if 0 exit  then
+   memsize
+;
+
+device-end
+
+also forth definitions
+stand-init: Memory node
+   " probe" memory-node @ $call-method
+;
+previous definitions
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\ Copyright (c) 2014 Artyom Tarasenko
+\ 
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\ 
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\ 
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\ 
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/resetvec.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/resetvec.bth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,34 @@
+purpose: Build script for the reset vector startup code
+\ See license at end of file
+
+dictionary: ${BP}/cpu/ppc/build/basefw.dic
+command: &ppcforth &dictionary &this
+
+build-now
+
+fload ${BP}/cpu/ppc/resetvec.fth
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/rom.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/rom.bth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,56 @@
+purpose: Build file rom image for QEMU -M prep
+\ See license at end of file
+
+command: &builder &this
+in: builton.fth
+in: ${BP}/cpu/ppc/prep/qemu/build/start.di
+in: ${BP}/cpu/ppc/prep/qemu/build/resetvec.di
+in: ${BP}/cpu/ppc/prep/qemu/build/fw.dic
+in: ${BP}/dev/video/build/bga.fc
+in: ${BP}/dev/video/build/cirrus.fc
+build-now
+
+\needs $add-dropin  fload ${BP}/forth/lib/mkdropin.fth
+
+\ Always re-create the builton.fth file when we make a new rom.img
+fload ${BP}/forth/lib/date.fth
+fload ${BP}/cpu/ppc/prep/builton.bth
+
+writing qprepofw.rom
+   " resetvec.di"         $add-file
+   " start.di"            $add-file
+
+   " fw.dic"                               " firmware"     $add-dropin
+
+   " builton.fth"                          " probe-"       $add-dropin
+   " ${BP}/dev/video/build/cirrus.fc"      " pci1013,b8"   $add-dropin
+   " ${BP}/dev/video/build/bga.fc"         " class030000"  $add-dropin
+   " ${BP}/ofw/termemu/cp881-16.obf"       " font"         $add-dropin
+\ h# 8.0000 pad-file
+ofd @ fclose
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\ Copyright (c) 2014 Artyom Tarasenko
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/rootnode.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/rootnode.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,40 @@
+purpose: Methods for root node
+\ See license at end of file
+
+dev /
+" device-tree" device-name
+" QEMU PReP" model
+
+: init  ( -- )
+
+   d# 66,666,666  " clock-frequency" integer-property  \ For root bus
+
+;
+
+device-end
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\ Copyright (c) 2014 Artyom Tarasenko
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/slam.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/slam.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,172 @@
+purpose: Slam the Falcon and Raven back into default, poweron like mode
+\ See license at end of file
+
+label cfg-l!  ( r3:value r4:offset -- )
+   mfspr  r28,lr
+
+\ Needs some work here....
+label cfg-l!  ( r3:value r4:index -- )  \ Hammers r1,r2
+
+   set	r1,h#80000cf8			\ Config address register
+   set	r2,h#80000cfc			\ Config data register
+
+   sync
+   stwbrx r4,0,r1
+   sync
+   stwbrx r3,0,r2
+   sync
+
+   bclr   20,0
+end-code
+
+label slam-falcon  ( -- )
+   mfspr  r29,lr
+
+   falcon-base	set  r1,*
+
+   set	r2,h#0000.0002		\ Setup General Control Register
+   stw	r2,h#08(r1)		\ Upper Falcon
+
+\ Danger Will Robinson!  The next two stores will kill the machines
+\ DRAM.  If you run this code from DRAM, your dead.  If you enbale
+\ the stores, you must load the code to the pflash and then run the
+\ code with the "go ff000100" command.
+
+   set  r2,h#0000.0000		\ Setup DRAM Size Register
+   stw	r2,h#10(r1)		\ Upper Falcon
+
+   set  r2,h#0000.0000		\ Setup DRAM Base Register
+   stw	r2,h#18(r1)		\ Upper Falcon
+
+\ End of danger section
+ 
+   set  r2,h#4200.0000		\ Setup Clock Frequency Register
+   stw	r2,h#20(r1)		\ Upper Falcon
+
+   set  r2,h#0000.0000		\ Setup ECC Registers
+   stw	r2,h#30(r1)		\ Upper Falcon
+
+   set  r2,h#0000.0000		\ Setup Scruber Registers
+   stw	r2,h#40(r1)		\ Upper Falcon
+
+   set  r2,h#ff40.0000		\ Setup ROMB Registers
+   stw	r2,h#58(r1)		\ Upper Falcon
+
+   set  r2,h#0000.0000		\ Setup Clock Enable Register
+   stw	r2,h#28(r1)		\ Upper Falcon
+
+   mtspr  lr,r29
+   bclr   20,0
+end-code
+
+label slam-raven  ( -- )
+   mfspr  r29,lr
+
+   raven-base	set  r1,*
+
+   set  r2,0
+   stw   r2,h#70(r1)
+   stw   r2,h#74(r1)
+   stw   r2,h#78(r1)
+   stw   r2,h#7c(r1)
+   stw   r2,h#44(r1)
+   stw   r2,h#4c(r1)
+   stw   r2,h#54(r1)
+   stw   r2,h#40(r1)
+   stw   r2,h#48(r1)
+   stw   r2,h#50(r1)
+   stw   r2,h#30(r1)
+   stw   r2,h#20(r1)
+
+   set	 r2,h#8000.00c0
+   stw   r2,h#5c(r1)
+
+   set	 r2,h#8000.8080
+   stw   r2,h#58(r1)
+
+   set	 r2,h#0000.00be
+   stw   r2,h#10(r1)
+
+   lwz	 r2,h#8(r1)
+   sync
+   andi. r2,r2,h#ffff
+   sync
+   stw   r2,h#8(r1)
+
+   mtspr  lr,r29
+   bclr   20,0			\ ET go home...
+end-code
+
+label slam-pci
+   mfspr  r29,lr
+
+   set     r3,h#0280.0004
+   set	   r4,4
+   cfg-l!  bl *
+
+   set	   r3,0
+   set	   r4,h#10
+   cfg-l!  bl *
+
+   set	   r4,h#14
+   cfg-l!  bl *
+
+   set	   r4,h#80
+   cfg-l!  bl *
+   set	   r4,h#88
+   cfg-l!  bl *
+   set	   r4,h#90
+   cfg-l!  bl *
+   set	   r4,h#98
+   cfg-l!  bl *
+
+   set	   r4,h#84
+   cfg-l!  bl *
+   set	   r4,h#8c
+   cfg-l!  bl *
+   set	   r4,h#94
+   cfg-l!  bl *
+   set	   r4,h#9c
+   cfg-l!  bl *
+
+
+   mtspr  lr,r29
+   bclr   20,0
+end-code
+
+
+label grand-slam  ( -- )
+   mfspr   r30,lr
+
+   slam-pci    bl *
+   slam-raven  bl *
+   slam-falcon bl *
+
+   mtspr   lr,r30
+   bclr	   20,0
+end-code
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/qemu/start.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/qemu/start.bth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,133 @@
+purpose: Low-level startup code for QEMU -M prep
+\ See license at end of file
+
+dictionary: ${BP}/cpu/ppc/build/basefw.dic
+command: &ppcforth &dictionary &this
+
+build-now
+
+\ create debug-start
+create slam-it				\ Slam the chipset into a working mode
+
+h# 0018.0000 constant RAMsize		\ Firmware size
+h# fef8.0000 constant falcon-base
+h# fef8.0010 constant falcon-mem-config
+h# feff.0000 constant raven-base
+
+
+\needs start-assembling  fload ${BP}/cpu/ppc/asmtools.fth
+\needs write-dropin      fload ${BP}/forth/lib/mkdropin.fth
+
+assembler
+' be-l@ is asm@
+' be-l! is asm!
+forth
+
+start-assembling
+
+label my-entry
+   0 ,				\ To be patched later
+end-code
+
+fload ${BP}/cpu/ppc/prep/qemu/slam.fth		\ Code to emulate POR state
+
+
+\needs io-base h# 8000.0000 constant io-base
+fload ${BP}/cpu/ppc/prep/qemu/initrav.fth	\ Code to init Raven
+[ifdef] debug-start
+fload ${BP}/arch/prep/initcom1.fth		\ Code to init COM1
+[then]
+
+label init-pbc		\ Setup VIA SouthBridge Chip
+   mfspr   r30,lr
+
+   set     r1,h#80000cf8	\ PCI Configuration Address Register
+
+   set     r2,h#80005840	\ Config address of word containing offset 41
+   stwbrx  r2,r0,r1
+   set     r3,h#20		\ Enable Port 92 Fast Reset
+   stb     r3,5(r1)		\ Write to config register 0x41
+
+   set     r2,h#80005844	\ Config address of word containing offset 46
+   stwbrx  r2,r0,r1
+   set     r3,h#0120		\ (swapped) Enable Delay Transaction, posting
+   sth     r3,6(r1)		\ Write to config register 0x46
+   
+   set     r2,h#80005848	\ Config address of word containing offset 48
+   stwbrx  r2,r0,r1
+   set     r3,h#0901		\ (swapped) Enable Extra RTC port 74/75
+   sth     r3,4(r1)		\ Write to config register 0x48
+   
+   set     r2,h#8000584c	\ Config address of word containing offset 4e
+   stwbrx  r2,r0,r1
+\   set     r3,h#00f1		\ (byte-swapped) set mem/DMA routing
+   set     r3,h#ffff		\ (byte-swapped) set mem/DMA routing
+   sth     r3,6(r1)		\ Write to config register 0x4e
+
+   set     r2,h#80005854	\ Config address of word containing offset 56
+   stwbrx  r2,r0,r1
+   set     r3,h#a500		\ (swapped) IRQ10 for PIRQA, IRQ5 for PIRQB
+   sth     r3,6(r1)		\ Write to config register 0x56
+
+   mtspr   lr,r30		\ Restore return address
+   bclr    20,0			\ Return
+end-code
+
+label start-system
+   mfspr   r31,lr
+
+   grand-slam    bl *		\ Attempt to emulate POR state...
+
+   setup-raven   bl *
+   init-pbc      bl *
+\ [ifdef] debug-start
+\   init-com1     bl *
+\ [then]
+
+\ XXX Read value from NVRAM when QEMU's NVRAM layout is settled
+\ or read in from the Falcon registers when it's emulated.
+
+   set r5,h#8000000 \ 128 MiB
+   stw  r5,0(r0)                \ Store here for ppcboot.fth
+
+   RAMsize  set r4,*            \ Space Firmware gets
+   subf   r3,r4,r5              \ Memory base address
+
+
+   mtspr  lr,r31		\ Restore return address
+   bclr   20,0			\ ET go home...
+end-code
+
+start-system  my-entry  put-branch
+
+end-assembling
+
+writing start.di
+asm-base  here over -  0  " start" write-dropin
+ofd @ fclose
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\ Copyright (c) 2014 Artyom Tarasenko
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/raven.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/raven.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,92 @@
+purpose: "Raven" PCI Bridge Controller Access Methods
+\ See license at end of file
+
+h# feff.0000 constant raven-addr
+
+: pcic-l@  ( offset -- l )  raven-addr + be-l@  ;
+: pcic-w@  ( offset -- l )  raven-addr + be-w@  ;
+: pcic-c@  ( offset -- l )  raven-addr + c@  ;
+
+: pcic-l!  ( l offset -- )  raven-addr + be-l!  ;
+: pcic-w!  ( l offset -- )  raven-addr + be-w!  ;
+: pcic-c!  ( l offset -- )  raven-addr + c!  ;
+
+: raven?  ( -- flag )		      \ True if we have a Raven controller
+   0 pcic-l@  h# 10574801 =
+;
+
+: r-rev@  ( -- b )  6 pcic-c@  ;	\ Chip revision
+
+: r-csr@  ( -- w )  h# 0a pcic-w@  ;	\ Control and status register
+: r-csr!  ( w -- )  h# 0a pcic-w!  ;
+
+: csr-or  ( w -- )  r-csr@  or  r-csr!  ;
+
+\ Is PCI in little endian?
+: pci-le?  ( -- le? )  r-csr@  h# 8000 and  ;
+
+\ Set PCI bus to little endian
+: pci-le  ( -- )  h# 8000 csr-or  ;
+
+\ PCI Read will complete before writes
+: pci-flush-before-read  ( -- )  h# 1000 csr-or  ;
+
+\ PPC master ties up bus during xfer
+: buss-hog  ( -- )  h# 800 csr-or  ;
+
+\ PPC Read will complete before writes
+: ppc-flush-before-read  ( -- )  h# 400 csr-or  ;
+
+\ Set PPC bus timeouts
+\  0 = 256 uS
+\  1 =  64 uS
+\  2 =   8 uS
+\  3 = disable
+: ppc-bus-timeout  ( 0|1|2|3 -- )
+   r-csr@  h# 300 invert and  8 lshift or  r-csr!
+;
+
+\ Set 64-bit mode
+: p64  ( -- )  h# 80 csr-or  ;
+
+\ Turn on open-pic controller
+: open-pic-enable  ( -- )  h# 20 csr-or  ;
+
+\ Read module-id bits, tells us who owns he bus in MP systems
+\ 0 = device on ABG0
+\ 1 = device on ABG1
+\ 2 = device on ABG2
+\ 3 = Raven
+: mid@  ( -- master-id )  r-csr@  h# 3 and  ;
+
+: r-feature@  ( -- w )  h# 8 pcic-w@  ;
+: r-feature!  ( w -- )  h# 8 pcic-w!  ;
+
+: r-prescaler@  ( -- b )  h# 10 pcic-c@  ;
+: r-prescaler!  ( b -- )  h# 10 pcic-c!  ;
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/reset.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/reset.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,117 @@
+purpose: Reset system - this version works on many PR*P systems
+\ See license at end of file
+
+headerless
+: (reset-all)  ( -- )
+   icache-off dcache-off
+
+   \ We are about to disable translations by modifying the MSR,
+   \ but we must preserve our ability to do ISA I/O cycles to the
+   \ "92" register, so we have to set io-base back to the physical
+   \ address of ISA space.
+   h# 8000.0000 to io-base
+
+   \ Warm reset doesn't affect all the MSR bits, so we have to
+   \ explicitly set some of them to their power-up values.
+   \ We want ILE (10000) off so that the reset interrupt will occur
+   \ in big-endian mode, external interrupts (8000) off, machine
+   \ checks (1000) off, address translation (30) off, and the
+   \ interrupt prefix (40) on (to direct the reset interrupt to ROM).
+
+   msr@  h# 19030 invert and  h# 40 or  msr!
+
+   \ Read the old value because we must not change the
+   \ endianness of the host bridge until the very last step.
+
+   \ h# 92 pc@			( old-value )
+
+   \ Drive the reset bit low because it's the low-to-high transition
+   \ that does the work.
+
+   \ dup 1 invert and  h# 92 pc!     ( old-value )
+
+   \ Clear the bridge endian bit (2) and set the reset bit (1)
+   \ 2 invert and 1 or  h# 92 pc!
+
+   \ See below for the history behind the following replacement code.
+   \ We first check the reset bit for 1 and reset it only if needed.
+
+   h# 92 pc@ dup  1 and if
+
+      \ If we must reset it, the following will get the endian bit
+      \ from the msr reg for the Ultra.  The Viper will reset here.
+
+      dup  msr@ 1 and 2* or  1 invert and  h# 92 pc!
+
+   then  2 invert and  1 or  h# 92 pc!
+
+   \ On some systems, it takes a while for the reset to take effect,
+   \ so we wait here rather than returning to the prompt immediately,
+   \ to avoid confusing the user.
+   d# 3000 ms
+;
+' (reset-all) to reset-all
+headers
+
+\    Here's the story:
+\
+\    On an Ultra, the PCI bridge endian bit is driven by bit 1 (0x02) in
+\    I/O port 92.  In the same port, bit 0 (0x01) making the transition
+\    from 0 to 1 causes the machine to reset.  This is the standard I/O
+\    port 92 reset.
+\
+\    On a Viper, any write to port 92 will reset the machine (apparently
+\    the implementation is a PAL) and the PCI bridge endian switch is
+\    controlled via the PCI configuration registers.  As it turns out,
+\    the code for the Viper will work on a Ultra to control the bridge
+\    (that's good, eaglele.fth is in arch/prep/) so there isn't any
+\    problem until you go to mess with port 92 on the Ultra.
+\
+\    Here's the relevant code from arch/prep/reset.fth:
+\
+\    92 pc@ dup 1 invert and 92 pc! 2 invert and 1 or 92 pc!
+\
+\    If you try to reset the Ultra while running in little endian, it now
+\    reads port 92 its endian bit as zero (meaning big endian) while the
+\    Eagle bridge chip is really running in little endian (controlled
+\    through the config registers).  This bit is carefully saved and
+\    stored back into the port when the reset bit is forced to zero.
+\    This neatly hangs the system.  From observation, bit 0 is never set
+\    on entry to this code, even though it is left set.  It is probably
+\    reset after it's tested in the early startup code.  We could try the
+\    following for the reset code:
+\
+\    92 pc@ dup  1 and if
+\       dup msr@ 1 and 2* or 1 invert and 92 pc!
+\    then 2 invert and 1 or  h# 92 pc!
+\
+\    We'll have a problem with this code if we get some machine which
+\    uses bit 1 (0x02) for something other than the Eagle chip endian
+\    switch and it hangs the machine to set it and the machine is in
+\    little endian and bit 0 of port 92 is 1 when we invoke the
+\    (reset-all) word.
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Added: cpu/ppc/prep/residdef.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/ppc/prep/residdef.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,214 @@
+purpose: Definitions of residual data structures and field values
+\ See license at end of file
+
+[ifdef] create-resid-field-names
+alias res-field field
+: rfield  ( offset size "name" -- offset' )
+   create  over , +  does>  @ residual-data +
+;
+[else]
+: res-field  ( offset size "name" -- offset' )  safe-parse-word 2drop  +  ;
+alias rfield res-field  ( offset size "name" -- offset' )
+[then]
+
+d#  32 constant res#cpus	\ Number of CPU slots in residual data
+d#  64 constant max#mems
+d# 256 constant max#devices
+d#  32 constant /pnp-avg
+d#  64 constant max#mem-segs
+
+: bfield  ( offset "name" -- offset' )  /c res-field  ;
+: wfield  ( offset "name" -- offset' )  /w res-field  ;
+: lfield  ( offset "name" -- offset' )  /l res-field  ;
+
+struct ( cpu )
+   lfield >cpu-type	\ PVR@
+   bfield >cpu#		\ The interrupt cookie for MP interrupts - 0 for UP
+   bfield >cpu-state	\ 0:good  1:running FW  2:inactive  3: failed
+   2 +  \ reserved
+constant /cpu
+
+struct ( mem-seg )
+   lfield >usage
+	\ 1: FW stack  2: FW heap  4: FW code  8: Boot image  10: free mem
+	\ 20: Unpopulated mem  40: ISA  80: PCI config  100: PCI
+	\ 200: system regs  400: system I/O  800: I/O memory
+	\ 1000: unpopulated ROM  2000: ROM  4000: resume block  8000: other
+   lfield >base-page
+   lfield >page-count
+constant /mem-seg
+
+struct ( mem )
+   lfield >simm-size	\ size in Mbytes.  0 means absent or bad
+constant /mem
+
+struct ( device )
+   lfield >bus-id	\ 1: ISA  2: EISA  4: PCI  8: PCMCIA  10: PNPISA
+			\ 20: MCA  40: MX  80: Processor bus  100: VME
+   lfield >dev-id	\ bus-specific encoding
+   lfield >serial#	\ logical unit number
+   lfield >flags	\ 1: output  2: input  4: console out  8: console in
+			\ 10: removable  20: R/O  40: power managed
+			\ 80: disableable  100: configurable  200: bootable
+			\ 400: on docking station  800: not configurable
+			\ 1000: failed  2000: on motherboard  4000: enabled
+   bfield >base-type
+   bfield >sub-type
+   bfield >interface
+			\ 1:0 SCSI  1:1 IDE  1:1:1 ATA IDE
+			\ 1:2 floppy 1:2:1 765  1:2:2 Super I/O floppy at 398
+			\ 1:2:3 .. at 026e  1:2:4 .. at 15c  1:2:5 .. at 02e
+			\ 1:3 IPI  1:80 other mass storage
+			\ 2:0 Ethernet  2:1 Token Ring  2:2 FDDI 2:80 other net
+			\ 3:0 VGA  3:1 SVGA  3:2 XGA  3:80 other display
+			\ 4:0 video  4:1 audio  4:1:1 CS4232 audio
+			\ 4:80 other multimedia
+			\ 5:0 RAM  5:0:0 PCI mem ctlr  5:0:1 RS6K mem ctlr
+			\ 5:1 FLASH  5:80 other memory
+			\ 6:0 host bridge  6:1 ISA bridge  6:2 EISA bridge
+			\ 6:3 MCA bridge  6:4:0 PCI w/ memory mapped config.
+			\ 6:4:1 PCI with CF8/CFC config  6:4:2 RS6K PCI
+			\ 6:5 PCMCIA bridge  6:6 VME bridge  6:80 other bridge
+			\ 7:0 RS232  7:0:1 COMx  7:0:2 16450  7:0:3 16550
+			\ 7:0:4 Super I/O serial @ 398  7:0:5 .. @ 26e
+			\ 7:0:6 .. @ 15c  7:0:5 .. @ 02e
+			\ 7:1 parallel  7:1:1 LPTx
+			\ 7:1:2 Super I/O parallel @ 398  7:1:3 .. at 26e
+			\ 7:1:4 .. at 15c  7:1:5 .. at 02e
+			\ 7:80 other communications device
+			\ 8:0 interrupt controller  8:0:1 ISA 8259
+			\ 8:0:2 EISA PIC  8:0:3 MPIC  8:0:4 RS6K PIC
+			\ 8:1 DMA  8:1:1 ISA DMA  8:1:2 EISA DMA
+			\ 8:2 timer  8:2:1 ISA timer  8:2:2 EISA timer
+			\ 8:3 RTC  8:3:1 ISA RTC
+			\ 8:4 L2 cache  8:4:1 write-through-only L2 cache
+			\ 8:4:2 copyback-enabled L2 cache  8:4:3 RS6K L2 cache
+			\ 8:5:0 NVRAM at ports 74-76  8:5:1 direct mapped NVRAM
+			\ 8:5:2 24-bit indirect NVRAM at ports 73-76
+			\ 8:6 power management  8:6:1 emerg. power-off warning
+			\ 8:6:2 software power on/off
+			\ 8:7 CMOS RAM
+			\ 8:8 operator panel  8:8:1 hard disk light
+			\ 8:8:2 CDROM light  8:8:3 power light  8:8:4 key lock
+			\ 8:8:5 alphanumeric display  8:8:6 system status LED
+			\ 8:9 service processor class 1
+			\ 8:a service processor class 2
+			\ 8:b service processor class 3
+			\ 8:c graphics assist 8:c:0 none 8:c:1 transfer data
+			\ 8:c:2 IGM32  8:c:3 IGM64
+			\ 8:80 other system peripheral
+   bfield >spare
+   lfield >bus-access	\ Processor bus:  bus#:byte  BUID:byte  reserved:short
+			\ ISA bus:  slot#:byte  log dev#:byte  reserved:short
+			\ PCI bus:  bus#:byte  DevFunc#:byte  reserved:short
+			\ etc.  PCI DevFunc# is bits 15:8 of conf. addr. reg
+   lfield >allocated-offset	\ Offset into PnP heap
+   lfield >possible-offset	\ Offset into PnP heap
+				\ usually points to a PnP terminator byte
+   lfield >compatible-offset	\ Offset into PnP heap
+				\ usually points to a PnP terminator byte
+constant /device
+
+struct ( residual-data )
+   4 rfield r-length			\ constant
+   1 rfield r-version			\ constant
+   1 rfield r-revision			\ constant
+   2 rfield r-ec			\ constant
+
+   \ VPD section
+
+   d# 32 rfield r-printable-model	\ from "banner-name" property in "/'
+   d# 16 rfield r-serial# 		\ from NVRAM or IDPROM
+   d# 48 +   \ reserved
+   4 rfield r-fw-supplier		\ fixed
+   4 rfield r-fw-supports		\ fixed
+   4 rfield r-nvram-size		\ from "size" method in "/nvram"
+   4 rfield r-#simm-slots		\ Code in probemem.fth
+   2 rfield r-endian-switch-method	\ depends on bridge chip
+   2 rfield r-spread-io-method		\ depends on bridge chip
+   4 rfield r-smpiar			\ ??
+   4 rfield r-ram-err-log-offset	\ computed after setting up PnP heap
+   d# 8 +    \ reserved
+   4 rfield r-processor-hz		\ "clock-frequency" prop. in CPU node
+   4 rfield r-processor-bus-hz		\ "clock-frequency" prop. in "/"
+   d# 4 +    \ reserved
+   4 rfield r-timebase-divisor		\ CPU-dependent 1000 * bus-clocks/tick
+   4 rfield r-wordwidth			\ 32 for 60x, 64 for 620
+   4 rfield r-pagesize			\ constant
+   4 rfield r-coherence-block-size	\ from "cache-line-size" in CPU node
+   4 rfield r-granule-size		\ "
+   4 rfield r-cache-size		\ sum of i$ + d$ in Kbytes - 16 for 603, 32 for 604
+   4 rfield r-cache-attrib		\ 1 for split - from "cache-unified" property
+   4 rfield r-cache-assoc		\ 0 for 603, 603e, 604
+   4 rfield r-cache-line-size		\ 0
+   4 rfield r-icache-size		\ from cpu-node prop
+   4 rfield r-icache-assoc		\ 2 for 603, 4 for 603e, 604
+   4 rfield r-icache-line-size		\ 32
+   4 rfield r-dcache-size		\ 8 for 603, 16 for 604
+   4 rfield r-dcache-assoc		\ 2 for 603, 4 for 603e, 604
+   4 rfield r-dcache-line-size		\ 32
+   4 rfield r-tlb-size			\ 128
+   4 rfield r-tlb-attrib		\ 1 for split
+   4 rfield r-tlb-assoc			\ 0
+   4 rfield r-itlb-size			\ 64
+   4 rfield r-itlb-assoc		\ 2
+   4 rfield r-dtlb-size			\ 64
+   4 rfield r-dtlb-assoc		\ 2
+   4 rfield r-extended-vpd		\ NULL pointer
+
+   \ CPU section
+
+   2                         rfield r-max#cpus		\ system-dependent
+   2                         rfield r-actual#cpus	\ # of cpu nodes
+   /cpu res#cpus *           rfield r-cpus
+
+   \ Memory section
+
+   4                         rfield r-total-memory	\ "reg" in "memory"
+   4                         rfield r-good-memory	\ "reg" in "memory"
+   4                         rfield r-actual#mem-segs	\ "reg" & "avail"
+   /mem-seg max#mem-segs *   rfield r-mem-segs
+   4                         rfield r-actual#memories
+   /mem max#mems *           rfield r-mems
+
+   \ Device section
+
+   4                         rfield r-actual#devices
+   /device  max#devices *    rfield r-devices
+
+dup constant pnp-heap-offset
+
+   /pnp-avg max#devices * 2* rfield r-pnp-heap
+
+constant /residual-data
+
+\ : >mem      ( mem# -- adr )  /mem     * r-mems     +  ;
+\ : >mem-seg  ( seg# -- adr )  /mem-seg * r-mem-segs +  ;
+\ : >cpu      ( cpu# -- adr )  /cpu     * r-cpus     +  ;
+\ : >devices  ( dev# -- adr )  /device  * r-devices  +  ;
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
+

Modified: cpu/ppc/resetvec.fth
==============================================================================
--- cpu/ppc/resetvec.fth	Sat Aug 30 03:45:28 2014	(r3737)
+++ cpu/ppc/resetvec.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -8,7 +8,7 @@
 [then]
 
 \needs start-assembling fload ${BP}/cpu/ppc/asmtools.fth
-\needs write-dropin     fload ${BP}/tools/mkdropin.fth
+\needs write-dropin     fload ${BP}/forth/lib/mkdropin.fth
 
 h#  e.0000  d# 16 rshift  constant inflate-offset    \ Shifted for addis
 h#  f.0000  d# 16 rshift  constant workspace-offset  \ Shifted for addis

Modified: cpu/x86/pc/emu/fw.bth
==============================================================================
--- cpu/x86/pc/emu/fw.bth	Sat Aug 30 03:45:28 2014	(r3737)
+++ cpu/x86/pc/emu/fw.bth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -4,6 +4,7 @@
 dictionary: ${BP}/cpu/x86/build/basefw.dic
 command: &x86forth &dictionary &this
 in: builton.fth
+in: ${BP}/dev/ide/node.hex
 build-now
 
 " fw.tag" r/w create-file drop  tag-file !
@@ -192,6 +193,8 @@
 [then]
 devalias nfs net//obp-tftp:last//nfs
 
+fload ${BP}/dev/ide/twolevel-ide.fth
+
 fload ${BP}/ofw/inet/loadtcp.fth
 
 support-package: http

Added: dev/ds1385n.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dev/ds1385n.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,94 @@
+purpose: Driver for NVRAM portion of DS1385 
+\ See license at end of file
+
+" nvram" device-name
+" nvram" device-type
+" pnpPNP,8" " compatible" string-property
+
+d# 4096 value /nvram
+
+nv-adr-low 1+ nv-adr-high =  [if]
+   nv-adr-low    my-space encode-phys          2 encode-int encode+
+   nv-data       my-space encode-phys encode+  1 encode-int encode+
+[else]
+   nv-adr-low    my-space encode-phys          1 encode-int encode+
+   nv-adr-high   my-space encode-phys encode+  1 encode-int encode+
+   nv-data       my-space encode-phys encode+  1 encode-int encode+
+[then]
+
+" reg" property
+
+nv-data     global value data-adr
+nv-adr-low  global value as0-adr
+nv-adr-high global value as1-adr
+
+0 instance value nvram-ptr
+
+\ Writing to the as1 address latches the high 4 bits of the address,
+\ writing to the as0 address latches the low  8 bits of the address,
+\ and reading or writing the data address reads or writes the data.
+: nvram-set-adr  ( offset -- data-adr )
+   wbsplit  as1-adr pc!  as0-adr pc!  data-adr
+;
+: nvram@  ( offset -- n )  nvram-set-adr pc@  ;
+: nvram!  ( n offset -- )  nvram-set-adr pc!  ;
+' nvram@ to nv-c@
+' nvram! to nv-c!
+
+\ headers
+: clip-size  ( adr len -- len' adr len' )
+   nvram-ptr +   /nvram min  nvram-ptr -     ( adr len' )
+   tuck
+;
+: update-ptr  ( len' adr -- len' )
+   drop  dup nvram-ptr +  to nvram-ptr
+;
+
+\ external
+: seek  ( d.offset -- status )
+   0<>  over /nvram u>  or  if  drop true  exit	 then  \ Seek offset too large
+   to nvram-ptr
+   false
+;
+: read  ( adr len -- actual )
+   clip-size  0  ?do           ( len' adr )
+      i nvram-ptr +  nvram@    ( len' adr value )
+      over i + c!              ( len' adr )
+   loop                        ( len' adr )
+   update-ptr                  
+;
+: write  ( adr len -- actual )
+   clip-size  0  ?do           ( len' adr )
+      dup i + c@               ( len' adr value )
+      i nvram-ptr +  nvram!    ( len' adr )
+   loop                        ( len' adr )
+   update-ptr                  ( len' )
+;
+: size  ( -- d )  /nvram 0  ;
+
+\ external
+: open  ( -- flag )  true  ;
+: close  ( -- )  ;
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Modified: dev/i8259.fth
==============================================================================
--- dev/i8259.fth	Sat Aug 30 03:45:28 2014	(r3737)
+++ dev/i8259.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -137,12 +137,12 @@
       drop false                               ( false )
    then                                        ( false | level true )
 ;
-: interrupt-done  ( -- )  eoi  ;
 : eoi  ( -- )
    h# b h# 20 ocw3@  4 and      ( slave? )
    h# 20 h# 20 pc!              ( slave? )  \ EOI to master
    if  h# 20 h# a0 pc!  then    ( )	    \ EOI to slave
 ;
+: interrupt-done  ( -- )  eoi  ;
 [then]
 
 \ XXX we really should map the registers

Modified: dev/ide/atapi.fth
==============================================================================
--- dev/ide/atapi.fth	Sat Aug 30 03:45:28 2014	(r3737)
+++ dev/ide/atapi.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -84,7 +84,8 @@
 defer pio-rwblock  ' noop to pio-rwblock
 : sendpkt  ( addr len pkt-addr -- count )
    over h# a0 swap sendcmd                         ( addr len pkt-addr )
-   wait-until-drq  pkt-len chip-base io-blk-w!     ( addr len )
+   wait-until-drq  if h# 100 ms 3drop 0 then       ( addr len pkt-addr )
+   pkt-len chip-base io-blk-w!                     ( addr len )
    waitonbusy                                      ( addr len )
    waitfordrq  if		\ Timeout          ( addr len )
       h# 100 ms  2drop 0                           ( 0 )

Modified: dev/ide/idenode.fth
==============================================================================
--- dev/ide/idenode.fth	Sat Aug 30 03:45:28 2014	(r3737)
+++ dev/ide/idenode.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -55,6 +55,18 @@
    r> base !
 ;
 
+: probe-child  ( unit -- )
+   dup set-address                            ( unit )
+   any-blocks? 0=  if  drop  exit  then       ( unit )
+   new-device                                 ( unit )
+      encode-int " reg" property              ( )
+      " node-fcode" $call-parent 1 byte-load  ( )
+      cdrom?  if  " cdrom" device-name  then  ( )
+   finish-device                              ( )
+;
+
+: probe  ( -- )  2 0  do  i probe-child  loop  ;
+
 headers
 \ LICENSE_BEGIN
 \ Copyright (c) 2006 FirmWorks

Added: dev/ide/twolevel-ide.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dev/ide/twolevel-ide.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,68 @@
+\ See license at end of file
+purpose: IDE two-level - master,slave / primary,secondary on different levels
+
+0 0  " i1f0"  " /isa" begin-package
+" ide-controller" device-name
+
+create node-fcode
+fload $(BP)/dev/ide/node.hex
+
+fload $(BP)/dev/ide/isaintf.fth
+fload $(BP)/dev/ide/generic.fth
+
+\ The ide-controller address space is of the form "unit#", an integer.
+\ Each child is an IDE "string"
+
+: decode-unit  ( unit-str len -- phys )
+   base @ >r hex
+   $number  if  0  then
+   r> base !
+;
+
+: encode-unit  ( phys -- unit-str len )  base @ >r hex  (u.)  r> base !  ;
+
+1 encode-int " #address-cells" property
+
+: any-blocks?  ( -- flag )  /block@  ;
+: cdrom?       ( -- flag )  atapi-drive?@  ;
+
+new-device				\ Create ide at 0
+   0 encode-int " reg" property
+   fload ${BP}/dev/ide/idenode.fth	\ "ide" name declared here
+finish-device
+
+new-device				\ Create ide at 1
+   1 encode-int " reg" property
+   fload ${BP}/dev/ide/idenode.fth	\ "ide" name declared here
+finish-device
+
+end-package
+
+stand-init: Probe IDE
+   " /ide-controller/ide at 0" select-dev  " probe" $call-self  unselect-dev
+   " /ide-controller/ide at 1" select-dev  " probe" $call-self  unselect-dev
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2014 William M. Bradley
+\ 
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\ 
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\ 
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Added: dev/isa/pc87307.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dev/isa/pc87307.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,322 @@
+purpose: Driver for National PC87307 "Super IO" chip with Plug 'n Play
+\ See license at end of file
+
+hex
+: sio-b@  ( index -- b )  h# 15c pc!  h# 15d pc@  ;
+: sio-b!  ( b index -- )  h# 15c pc!  h# 15d pc!  ;
+: select-sio-dev  ( device# -- )  7 sio-b!  ;
+
+nuser superio-node
+
+0 0 " i15c" " /isa" begin-package	\ SuperI/O configuration registers
+" configuration" device-name
+" NSM,PC87307" model
+my-address my-space 2  reg
+" configuration" device-type
+
+0 0 encode-bytes
+   " NSM,PC87307-configuration" encode-string encode+
+   " pnp-configuration"         encode-string encode+
+" compatible" property
+
+headerless
+: enable-sio-dev  ( device# -- )  select-sio-dev  1 h# 30 sio-b!  ;
+
+: ps2-floppy   ( -- )  h# 21 sio-b@  4 invert and  h# 21 sio-b!  ;
+\ : at-floppy   ( -- )  h# 21 sio-b@  4 or  h# 21 sio-b!  ;
+
+\ Doubly-indirect access to programmable chip select control registers
+: pcs@  ( index -- data )  h# 23 sio-b!  h# 24 sio-b@  ;
+: pcs!  ( data index -- )  h# 23 sio-b!  h# 24 sio-b!  ;
+
+headers
+
+\ This table converts the "interrupt type" field in Open Firmware ISA
+\ "interrupts" property to the corresponding code for Plug N Play
+\ interrupt configuration registers.
+    \ OFW#/type  0/low level  1/high level  2/falling edge  3/rising edge
+create int-map   1 c,         3 c,          0 c,            2 c,
+
+: set-interrupt  ( level mode int# device# -- )
+   select-sio-dev                ( level mode int# )
+   h# 70 swap wa+                ( level mode pnp-reg# )
+   swap  int-map + c@  swap      ( level pnp-mode pnp-reg# )
+   tuck 1+ sio-b!  sio-b!        ( )
+;
+
+: set-dma  ( channel dma# device# -- )
+   select-sio-dev                ( channel dma# )
+   h# 74 swap ca+                ( channel pnp-reg# )
+   sio-b!                        ( )
+;
+
+: set-reg  ( address space size port# device# -- )
+   select-sio-dev                      ( address space size port# )
+   h# 60 swap wa+ >r                   ( address space size r: pnp-reg# )
+   swap  1 and  if  \ I/O space        ( address size r: pnp-reg# )
+      drop                             ( address r: pnp-reg# )
+      wbsplit r@ sio-b!  r> 1+ sio-b!  ( )
+   else             \ Memory space     ( address size r: pnp-reg# )
+      \ XXX implement me
+      \ The Memory configuration registers are at 40-44, 48-4d, 50-54, 58-5d
+      \ See /fw/doc/standards/pnp/isapnp.{doc,ps}
+      true abort" ISA memory space configuration not yet supported"
+   then
+;
+
+[ifdef] notdef
+: set-memory  ( address size device# -- )
+\ XXX implement me
+;
+[then]
+
+0 value device#
+: set-configuration  ( -- )
+   " device#" get-property  if  exit  then        ( adr len )
+   get-encoded-int to device#                     ( )
+
+   " reg" get-property  0=  if                    ( adr len )
+      \ XXX we must maintain a separate count of I/O and memory descriptors
+      \ There can be up to 8 I/O ports and up to 4 memory ranges
+      d# 12 0  do                                 ( adr len )
+         dup 3 /l* <  if  leave  then             ( adr len )
+         decode-phys 2>r  decode-int  2r> rot     ( adr len phys.lo,hi size )
+         i device#  " set-reg" superio-node @ $call-method
+      loop                                        ( adr len )
+      2drop                                       ( )
+   then                                           ( )
+
+   " interrupts" get-property  0=  if             ( adr len )
+      2 0  do                                     ( adr len )
+         dup 2 /l* <  if  leave  then             ( adr len )
+         2 decode-ints  swap                      ( adr' len' level mode )
+         i device#  " set-interrupt" superio-node @ $call-method
+      loop                                        ( adr len )
+      2drop                                       ( )
+   then                                           ( )
+
+   " dma" get-property  0=  if                    ( adr len )
+      2 0  do                                     ( adr len )
+         dup 5 /l* <  if  leave  then             ( adr len )
+         decode-int  i device#  " set-dma" superio-node @ $call-method
+         4 0  do  decode-int drop  loop           ( adr' len' )
+      loop                                        ( adr len )
+      2drop                                       ( )
+   then                                           ( )
+
+   device# " enable-sio-dev" superio-node @ $call-method
+;
+
+: open  ( -- okay? )  true  ;
+: close  ( -- )  ;
+
+also forth definitions
+: configure-superio  ( -- )
+   " /isa/configuration" open-dev superio-node !
+   " /isa"  ['] set-configuration  scan-subtree
+;
+warning @ warning off
+: stand-init-io
+   stand-init-io
+   configure-superio
+;
+warning !
+previous definitions
+
+end-package
+
+fload ${BP}/dev/pci/isaall.fth			\ The usual ISA devices
+
+\ Declare the Super-I/O chip type in the child nodes
+dev /isa/parallel
+" NSM,PC87307" model
+4 " device#" integer-property
+\ XXX We should configure this device in ECP mode so we can set
+\ it to level sensitive
+7 encode-int  3 encode-int encode+    " interrupts" property
+device-end
+
+[ifndef] no-com1-node
+dev /isa/serial at 3f8
+" NSM,PC87307" model
+6 " device#" integer-property
+4 encode-int  1 encode-int encode+    " interrupts" property
+device-end
+[then]
+
+[ifndef] no-com2-node
+dev /isa/serial at 2f8
+" NSM,PC87307" model
+5 " device#" integer-property
+3 encode-int  1 encode-int encode+    " interrupts" property
+device-end
+[then]
+
+[ifndef] no-floppy-node
+dev /isa/fdc
+" NSM,PC87307" model
+3 " device#" integer-property
+6 encode-int  1 encode-int encode+    " interrupts" property
+device-end
+[then]
+
+dev /isa/8042
+0 " device#" integer-property
+" NSM,PC87307" model
+" interrupts" delete-property
+device-end
+
+dev /isa/8042/keyboard
+0 " device#" integer-property
+1 encode-int  1 encode-int encode+    " interrupts" property
+device-end
+
+dev /isa/8042/mouse
+1 " device#" integer-property
+d# 12 encode-int  1 encode-int encode+    " interrupts" property
+device-end
+
+\ Driver for the power management device on the pc87308 sio chip. 
+
+0 0  " i380"  " /isa" begin-package          \ power management node
+
+headerless
+" power" device-name
+" power" device-type
+
+my-address     my-space  2 encode-reg  " reg" property
+
+8 " device#" integer-property
+0 0 encode-bytes
+   " NSM,PC87307-power" encode-string encode+
+   " pnpNSC,c0f"        encode-string encode+
+   " pnpPNP,c02"        encode-string encode+
+" compatible" property
+
+0 value power-base
+
+\ Indirect access to power management control registers
+: pm@  ( index -- data )  power-base rb!  power-base 1+ rb@  ;
+: pm!  ( data index -- )  power-base rb!  power-base 1+ rb!  ;
+
+: open  ( -- flag )
+   power-base  0=  if
+      my-address my-space 2 " map-in" $call-parent  is power-base
+   then
+   true
+;
+: close  ( -- )  ;
+
+also forth definitions
+
+0 value power-node
+
+stand-init: Power
+   " /power" open-dev  to power-node
+;
+
+previous definitions
+
+end-package
+
+0 0  " i3e0"  " /isa" begin-package          \ gpio node
+
+headerless
+" gpio" device-name
+" gpio" device-type
+
+my-address     my-space  2 encode-reg  " reg" property
+
+7 " device#" integer-property
+
+0 0 encode-bytes
+   " dnard,gpio"       encode-string encode+
+   " NSM,PC87307-gpio" encode-string encode+
+   " pnpNSC,c02"       encode-string encode+
+   " pnpPNP,c02"       encode-string encode+
+" compatible" property
+
+0 value gpio-base 
+
+: map-gpio  ( -- )
+   my-address my-space 8 " map-in" $call-parent  is gpio-base
+;
+
+: gpio@  ( index -- n )  gpio-base + rb@  ;
+: gpio!  ( n index -- )  gpio-base + rb!  ;
+
+0 constant gpio-data
+1 constant gpio-direction
+2 constant output-type
+3 constant pull-up-control
+
+: open  ( -- flag )   
+   gpio-base 0=  if
+      map-gpio
+
+      \ This lets "reset-all" work even in the early phases of stand-init
+      power-node 0=  if  " /power" open-dev to power-node  then
+
+      \ init the power management to turn on gpio
+      h# 01 " pm@" power-node $call-method   h# 80 or
+      h# 01 " pm!" power-node $call-method
+   then
+   true
+;
+: close  ( -- )   ;
+: init  ( -- )  ;   \ Redefine as needed
+ 
+0 encode-int  " #size-cells" property
+0 encode-int  " #address-cells" property
+: decode-unit  ( adr len -- )  ;
+: encode-unit  ( -- adr len )  " "  ;
+
+also forth definitions
+
+0 value gpio-node
+
+stand-init: GPIO
+   " /gpio" open-dev  to gpio-node
+   " init" gpio-node $call-method
+;
+
+previous definitions
+
+end-package
+
+
+0 0  " i70"  " /isa" begin-package   	\ Real-time clock node
+fload ${BP}/dev/ds1385r.fth
+2 " device#" integer-property
+8 encode-int  0 encode-int encode+    " interrupts" property
+
+also forth definitions
+stand-init: RTC
+   " /rtc" open-dev  clock-node !
+;
+previous definitions
+
+end-package
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Added: dev/m48t559.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dev/m48t559.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,143 @@
+purpose: Driver for RTC portion og M48T559
+\ See license at end of file
+
+hex
+headerless
+" rtc" device-name
+" rtc" device-type
+
+" m48t559-rtc" encode-string
+" compatible" property
+
+my-address    my-space  encode-phys  4 encode-int encode+
+" reg" property
+
+h# 1ff8 constant rtc-base
+
+: rtc-set-adr  ( offset -- data-adr )
+   rtc-base +  wbsplit  nv-adr-high pc!  nv-adr-low pc!  nv-data
+;
+: rtc@  ( offset -- n )  lock[ rtc-set-adr pc@ ]unlock  ;
+: rtc!  ( n offset -- )  lock[ rtc-set-adr pc! ]unlock  ;
+: inhibit-updates  ( -- )  lock[ 0 rtc@  h# 40 or  0 rtc! ]unlock ;
+: enable-writes  ( -- )  lock[ 0 rtc@  h# 80 or  0 rtc! ]unlock ;
+: start-updates  ( -- )  lock[ 0 rtc@  h# c0 invert and  0 rtc! ]unlock ;
+
+\ Going to carve out a few more bytes, just under the start of the rtc regs
+\ to use as a place to put things like the century and maybe battery status
+
+\ So our map looks like:
+\
+\   Offset	Value	        Where
+\
+\   0x1fff	year	        RTC
+\   0x1ffe	month	        RTC
+\   0x1ffd	date		RTC
+\   0x1ffc	day		RTC
+\   0x1ffb	hours		RTC
+\   0x1ffa	minutes		RTC
+\   0x1ff9	seconds		RTC
+\   0x1ff8	control		RTC		<- rtc-base address
+\   0x1ff7	watchdog	RTC
+\   0x1ff6	interrupts	RTC
+\   0x1ff5	alarm date	RTC
+\   0x1ff4	alarm hours	RTC
+\   0x1ff3	alarm minutes	RTC
+\   0x1ff2	alarm seconds	RTC
+\   0x1ff1	unused		RTC
+\   0x1ff0	flags		RTC
+\   0x1fef	mac		NVRAM
+\   0x1fee	mac		NVRAM
+\   0x1fed	mac		NVRAM
+\   0x1fec	mac		NVRAM
+\   0x1feb	mac		NVRAM
+\   0x1fea	mac		NVRAM
+\   0x1fe9	mac checksum	NVRAM
+\   0x1fe8	century		NVRAM
+
+: cmos-base-adr  ( -- adr )  rtc-base h# 10 -  ;
+: cmos-set-addr  ( offset -- data-adr )
+   cmos-base-adr + wbsplit  nv-adr-high pc!  nv-adr-low pc!  nv-data
+;
+: cmos@  ( offset -- b )  cmos-set-addr pc@  ;
+: cmos!  ( b offset -- )  cmos-set-addr pc!  ;
+
+: century!  ( b -- )  0 cmos!  ;
+: century@  ( -- b )  0 cmos@  ;
+
+: check-battery  ( -- error? )
+   " status" get-my-property 0=  if
+      decode-string 2nip  " bad battery" $=  nip exit
+   then
+
+   -8 rtc@ h# 10 and		( error? )  \ Get battery status
+   dup if			( error? )
+      " bad battery"		( error $ )
+   else				( 0 )
+      " okay"			( 0 $ )
+   then				( error? $ )
+   encode-string  " status" property	( error? )
+;
+
+true value first-open?
+: open  ( -- ok? )
+   first-open?  if   
+      check-battery drop
+      false to first-open?
+   then
+   true
+;
+: close  ;
+
+: bcd>  ( bcd -- binary )  dup h# f and  swap 4 >>  d# 10 *  +  ;
+: >bcd  ( binary -- bcd )  d# 10 /mod  4 << +  ;
+
+: bcd-time&date  ( -- s m h d m y century )
+   inhibit-updates
+   1 rtc@  2 rtc@  3 rtc@  5 rtc@  6 rtc@  7 rtc@ century@ ( s m h d m y c )
+   start-updates
+;
+: bcd!  ( n offset -- )  swap >bcd  swap rtc!  ;
+
+: get-time  ( -- s m h d m y )
+   bcd-time&date  >r >r >r >r >r >r
+   bcd>  r> bcd>  r> bcd>  r> bcd>  r> bcd>  r> bcd>  r> bcd> ( s m h d m y c )
+
+   \ We allow the century byte to force the year to 20xx, but not to force
+   \ it to 19xx, because that would cause a problem when the century
+   \ rolls over.
+   dup  d# 20 <>  if
+      drop  dup d# 94 <  if  d# 20  else  d# 19  then
+   then
+
+   d# 100 * +  		\ Merge century with year
+;
+: set-time  ( s m h d m y -- )
+   enable-writes
+   d# 100 /mod  century!  7 bcd!  6 bcd!  5 bcd!  3 bcd!  2 bcd!  1 bcd!
+   r> d# 11 rtc!                            ( )
+   start-updates
+;
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Modified: dev/pci/intmap.fth
==============================================================================
--- dev/pci/intmap.fth	Sat Aug 30 03:45:28 2014	(r3737)
+++ dev/pci/intmap.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -60,7 +60,7 @@
    1-  swap d# 11 rshift  h# 1f and                  ( int-pin0 dev# )
 
    \ Bail out for non-existent device IDs
-   pin,dev>pic-irq  if  false exit  then             ( opic-int# )
+   pin,dev>isa-irq  if  false exit  then             ( opic-int# )
 
    true
 ;

Added: dev/via/vt82c586.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dev/via/vt82c586.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,57 @@
+purpose: Device nodes for VIA Technologies PCI-to-ISA bridge chip
+\ See license at end of file
+
+" VIA,82C586" encode-string  " model"  property
+" pci1106,586" encode-string
+" pnpPNP,a00"  encode-string encode+
+" compatible"  property
+
+fload ${BP}/dev/pci/isa.fth
+
+fload ${BP}/dev/pci/isamisc.fth
+
+\ Amend various device nodes
+my-self  0 to my-self   \ Force the properties to be created in the child nodes
+
+" dma-controller" find-device
+   " pci1106,586-dma-controller" +compatible
+   " chrp,dma" +compatible
+   " VIA,82C586" model
+pop-device
+
+" interrupt-controller" find-device
+   " pci8086,484-interrupt-controller" +compatible
+   " pci10ad,105-interrupt-controller" +compatible
+   " chrp,iic" +compatible
+   " WINB,83C553" model
+pop-device
+
+" timer" find-device
+   " pci10ad,105-timer" +compatible
+   " WINB,83C553" model
+pop-device
+
+to my-self
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Added: dev/video/bga.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dev/video/bga.bth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,51 @@
+\ See license at end of file
+purpose: Build file for Bochs Graphics Adapter driver
+
+command: &tokenize &this
+build-now
+
+silent on
+
+begin-tokenizing bga.fc
+
+FCode-version2
+
+" vga" device-name
+fload ${BP}/dev/video/common/defer.fth          \ Defered words
+1024x768x16
+fload ${BP}/dev/video/controlr/pcimap.fth       \ Generic PCI implementations
+fload ${BP}/dev/video/controlr/vga.fth          \ Load generic VGA routines
+fload ${BP}/dev/video/controlr/bga.fth          \ Load BGA routines
+fload ${BP}/dev/video/controlr/bgapci.fth       \ PCI routines
+fload ${BP}/dev/video/common/graphics.fth       \ Graphics and color routines
+fload ${BP}/dev/video/common/init.fth           \ Init code
+fload ${BP}/dev/video/common/display.fth        \ High level interface code
+
+probe
+end0
+
+end-tokenizing
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2014 Artyom Tarasenko
+\ 
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\ 
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\ 
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Added: dev/video/controlr/bga.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dev/video/controlr/bga.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,96 @@
+\ See license at end of file
+purpose: Initialize Bochs Graphics Adapter Controllers
+
+\ This file contains the Cirrus Controller specific code.
+
+hex
+\ headerless
+: .driver-info  ( -- )
+   .driver-info
+   ." BGA Code Version" cr
+;
+\ Constants from http://wiki.osdev.org/Bochs_VBE_Extensions
+\    VBE_DISPI_INDEX_ID (0)
+\    VBE_DISPI_INDEX_XRES (1)
+\    VBE_DISPI_INDEX_YRES (2)
+\    VBE_DISPI_INDEX_BPP (3)
+\    VBE_DISPI_INDEX_ENABLE (4)
+\    VBE_DISPI_INDEX_BANK (5)
+\    VBE_DISPI_INDEX_VIRT_WIDTH (6)
+\    VBE_DISPI_INDEX_VIRT_HEIGHT (7)
+\    VBE_DISPI_INDEX_X_OFFSET (8)
+\    VBE_DISPI_INDEX_Y_OFFSET (9)
+
+: vbe-w!
+  h# 1ce pw!
+  h# 1d0 pw!
+;
+
+\ At least under QEMU this is a write only register.
+\ Reading from 1d0 just returns the last word written regardless of index.
+\ For the case it works different one day
+\ : vbe-w@
+\   h# 1ce pw!
+\   h# 1d0 pw@
+\ ;
+
+: init-bga-controller  ( -- )   \ This gets plugged into "init-controller"
+  0 4 vbe-w!                                    \ Disable VBE extensions
+  0 8 vbe-w! 0 9 vbe-w! 		        \ Set offsets to 0
+  width 1 vbe-w! height 2 vbe-w! depth 3 vbe-w! \ Set resolution
+  h# 41 4 vbe-w!                                \ Enable VBE and Linear FB
+;
+
+: set-resolution  ( width height depth -- )
+   unmap-frame-buffer
+   (set-resolution)
+   map-io-regs
+   init-bga-controller
+   width height  over char-width /  over char-height /
+   /scanline  depth   " fb-install" eval
+   unmap-io-regs
+   map-frame-buffer
+   frame-buffer-adr /fb h# ff fill
+;
+
+: use-bga-words  ( -- )	\ Turns on the BGA-specific words
+   ['] init-bga-controller to init-controller
+   use-vga
+;
+
+: init-bga-dac ( -- )
+   true to 6-bit-primaries?     \ The default BGA pallete DAC is 3x6
+;
+
+: use-bga-dac  ( -- )
+   ['] init-bga-dac to init-dac
+;
+
+: probe-dac  ( -- )		\ Chained probing word...sets the dac type
+   safe?  if use-bga-dac exit  then
+   probe-dac				\ Try someone else's probe
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2014 Artyom Tarasenko
+\ 
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\ 
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\ 
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Added: dev/video/controlr/bgapci.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dev/video/controlr/bgapci.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,179 @@
+\ See license at end of file
+purpose: Bochs Graphics Adapter PCI Methods
+
+\ PCI access code.
+\ This code is used to determine which controller is present and
+\ to begin the process of sorting out which specific words are to
+\ be plugged into the various defered words. Also, and just as important,
+\ the REG property gets formed here.
+
+hex
+headers
+
+struct
+   04 field >physlo	\ phys.lo address
+   04 field >physmid	\ phys.mid address
+   04 field >physhi	\ phys.hi address
+   04 field >hiflag	\ phis.hi modifiers (n/p/t... bits)
+   04 field >size1	\ First size
+   04 field >size2	\ Second size
+   04 field >reg#	\ PCI Base address register offset (10,14,18...)
+constant /array
+
+0 instance value reg-props			\ Pointer for temp storage
+0 instance value tpoint				\ A second pointer
+d# 50 /array * instance value /reg-props	\ Allocate 50 entries for now
+
+/reg-props alloc-mem to reg-props		\ Allocate some memory
+reg-props /reg-props erase			\ Clean it up
+
+: >reg-props  ( phys.[lo,mid,hi] hi.flag size size -- )
+
+   reg-props /array - to tpoint   
+   begin
+      tpoint /array + to tpoint
+      tpoint >physhi l@ 0=
+   until				\ tpoint now points to first empty slot
+
+			( phys.[lo,mid,hi] hi.flag size size reg# )
+   tpoint >reg# l!	( phys.[lo,mid,hi] hi.flag size size )
+   tpoint >size2 l!	( phys.[lo,mid,hi] hi.flag size )
+   tpoint >size1 l!	( phys.[lo,mid,hi] hi.flag )
+   tpoint >hiflag l!	( phys.[lo,mid,hi] )
+   tpoint >physhi l!	( phys.lo phys.mid )
+   tpoint >physmid l!	( phys.lo )
+   tpoint >physlo l!	( )
+;
+
+: 0m  ( -- 0 my-space )  0 my-space  ;
+
+: legacy-regs  ( -- )
+      h# 3b0 0m h# a100.0000 0 h# C  0 >reg-props
+      h# 3c0 0m h# a100.0000 0 h# 20 0 >reg-props
+      h# a.0000 0m h# a200.0000 0 h# 2.0000 0 >reg-props
+;
+   
+0 instance value mask-val
+
+: munge-map-size  ( raw -- new )	\ Makes a proper map-size argument
+   dup 0=  if  exit  then
+
+   1 to mask-val		\ Basically, just walk a one up mask-val value,
+   begin			\ anding all the way looking for first non-zero
+      mask-val 2 * to mask-val	\ bit. If chip is working correctly, first non
+      dup mask-val and 0 <>	\ zero bit location tells you how big a 
+   until			\ map-size you need.
+   drop
+   mask-val
+;
+
+: get-map-size  ( reg# -- map-size )	\ Returns the amount of memory required
+   >r r@ c-l@		( old-val )	\ Get old value
+   -1 r@ c-l!		( old-val )	\ Write all ones
+   r@ c-l@ 		( old-val raw )	\ Read back
+   ff invert and	( old-val raw ) \ Mask off low bits
+   swap r> c-l!		( raw )		\ Put old value back
+   munge-map-size	( map-size )	\ Mask off high bits
+;
+
+: determine-controller  ( -- )	\ Determines which PCI controller we have
+   0 to safe?
+   0 c-w@	( vendor )
+   h# 1234 =
+   2 c-w@	( vendor? device )
+   h# 1111 = and if
+      use-bga-words             \ bga.fth
+      true to safe?
+   then
+;
+
+headers
+
+: reg-entry  ( map reg size -- )
+   >r >r >r
+   0 0 my-space
+   r> r> + +
+   encode-phys encode+
+   0 encode-int encode+ r> encode-int encode+
+;
+
+: add-rom-regs  ( -- )
+   \ If this driver is used for an on board frame buffer, the builtin.fth
+   \ file for that platform should declare a "no-rom" property in the node 
+   \ where this driver is used. This will prevent the reg property from 
+   \ including an entry for a non-existent ROM
+
+   " no-rom" get-my-property 0=  if
+      2drop exit
+   then
+
+   h# 30 get-map-size  if
+      0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
+   then
+;
+
+: encode-reg-property  ( -- )
+
+   safe?  if
+         0 0m h# 200.0010 0 h# 10 get-map-size h# 10 >reg-props	\ Frame buffer
+         add-rom-regs
+         legacy-regs
+   then
+
+   \ Now we build reg entry up
+
+   my-address my-space encode-phys 0 encode-int encode+ 0 encode-int encode+
+
+   reg-props to tpoint
+   begin
+      tpoint >physhi l@ 0<>  if
+         tpoint >physlo l@		( phys.lo )
+         tpoint >physmid l@		( phys.lo phys.mid )
+         tpoint >physhi l@		( phys.lo phys.mid phys.hi )
+         tpoint >hiflag l@ or		( phys.lo phys.mid phys.hi )
+         encode-phys encode+
+         tpoint >size1 l@		( size )
+         encode-int encode+
+         tpoint >size2 l@		( size )
+         encode-int encode+
+         tpoint /array + to tpoint
+         false
+      else
+         true
+      then
+   until
+
+   " reg" property
+
+   reg-props /reg-props free-mem		\ Release the tempory buffer
+;
+
+: probe
+   determine-controller
+   encode-reg-property			\ Build the reg property now
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 FirmWorks
+\ Copyright (c) 2014 Artyom Tarasenko
+\ 
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\ 
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\ 
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Modified: ofw/fs/fatfs/partition.fth
==============================================================================
--- ofw/fs/fatfs/partition.fth	Sat Aug 30 03:45:28 2014	(r3737)
+++ ofw/fs/fatfs/partition.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -97,7 +97,8 @@
             else		\ Ordinary partition	( ... n,s,b,t )
                suitable?  if                		( ... n,s,b,t )
                   to partition-type drop		( ... n,s )
-                  r@ + to sector-offset			( ... n )
+                  \ FAT partitions encode offsets in 512 byte sectors
+                  r@ + /sector d# 512 / / to sector-offset	( ... n )
                   /sector um* to size-high to size-low	( ... )
                   true to found?			( ... )
                else					( ... n,s,b,t )

Added: ofw/fs/hfs/hfs.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ ofw/fs/hfs/hfs.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,700 @@
+purpose: Macintosh File System support package
+\ See license at end of file
+
+dev /packages
+new-device
+" hfs-file-system" device-name
+0 0  " support" property
+
+headerless
+0 instance value /al-blk
+0 instance value al-blk0
+
+\ The "extents" structure describes a contiguous piece of a file.
+\ They are stored in groups of 3.  The first group of three is
+\ stored in:
+\   a) The catalog file node, for ordinary file data and resource forks
+\   b) The volume info record, for the catalog file and the extents
+\      overflow file.
+\ Subsequent groups of three are stored in node records within the
+\ extents overflow file, tagged by file ID and which fork.  The
+\ extents overflow file itself is described solely by its first
+\ three extent descriptors, and does not use overflow extents to
+\ describe itself.
+
+struct ( extent )
+   /w    field >first-al-blk
+   /w    field >#al-blks
+constant /extent
+/extent 3 * constant /extents
+
+\ Given a target logical block number, the address of an array of 3 extents
+\ entries, and the number of the logical block represented by the first
+\ entry in that array, find the physical block number corresponding to the
+\ target logical block number and the number of blocks after it in the
+\ enclosing extent.
+: (next-piece)  ( log-blk# extents-adr extent-log-blk -- phys-blk# #blks )
+   3 0  do    ( log-blk# extent extent-blk# )
+      over >#al-blks be-w@ +           ( log-blk# extent extent-max-blk# )
+      2 pick over u<  if  leave  then  ( log-blk# extent extent-max-blk# )
+      swap /extent + swap              ( log-blk# extent' extent-max-blk# )
+   loop                                ( log-blk# extent' extent-max-blk# )
+   swap >r  swap -                     ( #blks )
+   r@ >first-al-blk be-w@  r> >#al-blks be-w@ +  over - swap
+;
+
+\ Determine the total number of blocks described by the array of 3 extents
+\ entries beginning at extents-adr
+: extent-#blks  ( extents-adr -- #blks )
+   0  swap >#al-blks  /extents  bounds  do  i be-w@ +  /extent +loop
+;
+
+\ A node record is is a fixed length container that contains one or more
+\ variable-length nodes.
+
+struct ( node-record )
+   /l    field >flink
+   /l    field >blink
+   /c    field >type
+   /c    field >level
+   /w    field >#recs
+   h# 1f4 +
+constant /node-record
+/node-record instance buffer: node-record
+
+
+\ Each B*Tree file begins with a header node.
+
+struct  ( header-node )
+   /w    field >tree-depth
+   /l    field >root-index
+   /l    field >#leaf-records
+   /l    field >first-leaf
+   /l    field >last-leaf
+   /w    field >reclen
+   /w    field >whatever1
+   /l    field >total#nodes
+   /l    field >#free-nodes
+constant /master-index
+
+\ Nodes in the catalog file come in three flavors - thread, directory, and file
+
+struct ( thread-catalog-entry ) \ Type = 3 or 4
+   1 +
+   d# 8 +
+   /l    field >thread-parent
+   d# 32 field >thread-name
+drop
+
+struct  ( times )
+   /l    field >create-time
+   /l    field >modify-time
+   /l    field >backup-time
+constant /times
+
+struct ( dir-catalog-entry )
+   1 +
+   /w    field >dir-flags
+   /w    field >valence
+   /l    field >dir-id
+   /times field >dir-times
+   d# 16 field >dir-user-finder-info
+   d# 16 field >dir-finder-info
+   d# 16 field >dir-reserved
+drop
+
+struct ( file-catalog-entry )
+   1 +
+   /c    field >file-flags   \ h#80:record used  2:thread rec exists 1:locked
+   /c    field >file-type    \ Supposed to always contain 0
+   d# 16 field >user-finder
+   /l    field >file#
+   /w    field >dblk0
+   /l    field >dleof
+   /l    field >dpeof
+   /w    field >rblk0
+   /l    field >rleof
+   /l    field >rpeof
+   /times field >file-times
+   d# 16 field >finder-info
+   /w    field >/clump
+   /extents field >data-extents
+   /extents field >resource-extents
+   /l +  ( reserved )
+constant /catalog-entry
+
+: skip-key  ( adr -- adr' )  count  1 or  +  ;
+
+\ Each HFS volume is described by a volume-info structure that is stored
+\ at offset 1K bytes from the beginning of the volume.
+
+struct ( volume-info )
+   /w    field >magic
+   /l    field >init-date
+   /l    field >mode-date
+   /w    field >volume-attributes
+   /w    field >volume-#files
+   /w    field >bitmap-blk#
+   /w    field >al-ptr
+   /w    field >vol-#al-blks
+   /l    field >/al-blk
+   /l    field >vol-/clump
+   /w    field >al-blk0
+   /l    field >next-file#
+   /w    field >#free-blocks
+   h# 1c field >vol-name
+   /l    field >bkup-date
+   /w    field >vseq#
+   /l    field >write-count
+   /l    field >/extent-clump
+   /l    field >/catalog-clump
+   /w    field >#rt-dirs
+   /l    field >#files
+   /l    field >#directories
+   d# 32 field >vol-finder-info
+   /w    field >vc-size
+   /w    field >vcbm-size
+   /w    field >ctlc-size
+   /l    field >/extent-tree
+   /extents field >extent-extents
+   /l    field >/catalog-tree
+   /extents field >catalog-extents
+   h# 15e +			\ There's something at offset 0x5f4 too
+constant /volume-info
+
+/volume-info instance buffer: volume-info
+
+3 constant extent-file-id
+4 constant catalog-file-id
+
+\ This forward reference is necessary because B*Trees are stored in
+\ files that are described by extents, some of which can be stored in
+\ the extents overflow B*Tree file.  Infinite recursion is prevented by
+\ ensuring that the extents overflow file is contained entirely within
+\ the three fixed extents, so that file does not need overflow extents.
+defer search-btree
+
+: >extent-file-blk#  ( log-blk# -- phys-blk# )
+   volume-info >extent-extents  0  (next-piece)  drop
+;
+
+: extent-compare  ( key-adr1 key-adr2 -- -|0|+ )
+   over ca1+ c@  over ca1+ c@  -  ?dup  if           ( key-adr1 key-adr2 +- )
+      over wa1+ be-l@  over wa1+ be-l@  -  ?dup  if  ( key-adr1 key-adr2 +- )
+         swap 6 + be-w@  swap 6 + be-w@  -           ( +|0|- )
+      else                                           ( key-adr1 key-adr2 )
+         nip nip                                     ( +|- )
+      then                                           ( +|0|- )
+   else                                              ( key-adr1 key-adr2 )
+      nip nip                                        ( +|- )
+   then                                              ( +|0|- )
+;
+
+: find-extent  ( al-blk# file-id fork -- node-adr )
+   d# 10 alloc-mem  >r  ( al-blk# file-id fork r: key-buffer )
+   r@ ca1+ c!		( al-blk# file-id )
+   r@ wa1+ be-l!        ( al-blk# )
+   r@ 6 +  be-w!        ( )
+   r@  ['] extent-compare  extent-file-id  search-btree
+   r> d# 10 free-mem
+   0= abort" Can't find extent"
+;
+
+: >catalog-file-blk#  ( log-blk# -- phys-blk# )
+   0  volume-info >catalog-extents >r        ( log-blk# 0 r: entents-adr )
+
+   begin  2dup r@ extent-#blks +  u>  while  ( log-blk# blk# r: extents-adr )
+      r> extent-#blks +                      ( log-blk# blk#' )
+      dup catalog-file-id 0 find-extent      ( log-blk# blk# node-adr )
+      skip-key >r                            ( log-blk# blk# r: extents-adr' )
+   repeat                                    ( log-blk# blk# r: extents-adr )
+
+   \ Now log-blk# is within the group of extents at "extents-adr" and
+   \ blk# is the beginning logical block of that extents group.
+
+   r> swap  (next-piece) drop                ( phys-blk# )
+;
+
+: al-blk>offset  ( al-blk# -- d.disk-offset )  /al-blk um*  al-blk0 0  d+  ;
+
+0 instance value btree-file#
+
+\ Return the physical disk offset of the indicated node record from the file
+\ "btree-file#", 
+: >node-rec-offset  ( rec# -- d.disk-offset )
+   /node-record um*  /al-blk um/mod  0 swap        ( d.blk-offset log-blk# )
+   btree-file#  case
+      extent-file-id   of  >extent-file-blk#   endof
+      catalog-file-id  of  >catalog-file-blk#  endof
+   endcase                                         ( d.blk-offset phys-blk# )
+   al-blk>offset d+                                ( d.disk-offset )
+;
+
+\ "Cache tags" to remember which node is currently in the buffer
+-1 instance value node-rec#
+-1 instance value node-file#
+
+: >node-rec  ( rec# -- record-adr )
+   dup node-rec# =  btree-file# node-file# =  and  if
+      drop node-record exit
+   then                                                 ( rec# )
+
+   dup >node-rec-offset  " seek" $call-parent  drop     ( rec# )
+   node-record /node-record " read" $call-parent  drop  ( rec# )
+
+   \ Update "cache tags"
+   to node-rec#  btree-file# to node-file#             ( )
+
+   node-record
+;
+
+: >nextnode  ( node# rec# -- node#' rec#' )
+   dup >node-rec dup >#recs be-w@   ( node# rec# rec& #recs )
+   3 pick 1+                        ( node# rec# rec& #recs node#' )
+   <=  if                           ( node# rec# rec& )
+      nip nip  >flink be-l@  0 swap ( 0 rec#' )
+   else                             ( node# rec# rec& )
+      drop swap 1+ swap             ( node#' rec# )
+   then
+;
+: >node  ( node# rec# -- node-adr )
+   >node-rec  dup /node-record +  rot 1+ /w* -  be-w@  +
+;
+
+defer key-compare
+: search-ply  ( key-adr node# rec# -- key-adr node#' rec#' )
+   2>r 2r@
+   begin 
+      3dup >node key-compare                ( key-adr node#' rec#' )
+      ?dup 0= if                            ( key-adr node#' rec#' )
+         2r> 2drop exit
+      then                                  ( key-adr node#' rec#' flag )
+      0<  if                                ( key-adr node#' rec#' )
+         2drop 2r> exit
+      then                                  ( key-adr node#' rec#' )
+      2r> 2drop  2>r                        ( key-adr node#' rec#' )
+      2r@ >nextnode  2dup or  while         ( key-adr node#' rec#' )
+   repeat                                   ( key-adr node#' rec#' )
+   2drop  2r>
+;
+
+0 instance value last-node#
+0 instance value last-rec#
+: (search-btree)  ( key-adr compare-xt btree-file# -- false | node-adr true )
+   btree-file# >r   to btree-file#        
+   ['] key-compare behavior >r  to key-compare  ( key-adr r: old-file# old-xt )
+   0 0 >node >root-index be-l@ 0 swap       ( key-adr node# rec# )
+   begin                                    ( key-adr node# rec# )
+      search-ply                            ( key-adr node#' rec#' )
+      dup >node-rec >level c@ 1 >           ( key-adr node#' rec#' leval )
+   while                                    ( key-adr node# rec# )
+      \ Go down a level
+      >node skip-key be-l@  0 swap          ( key-adr node#' rec#' )
+   repeat                                   ( key-adr node# rec# )
+
+   \ If we are searching the catalog tree, save the node and record
+   \ numbers for the benefit of next-file
+   btree-file#  catalog-file-id =  if
+      2dup to last-rec#  to last-node#
+   then
+
+   >node tuck  key-compare  if              ( node-adr )
+      drop false
+   else
+      true
+   then
+
+   r> to key-compare  r> to btree-file#
+;
+' (search-btree) to search-btree
+
+: read-blocks  ( adr blk# #blks -- )
+   swap al-blk>offset  " seek" $call-parent  drop   ( adr #blks )
+   /al-blk *  " read" $call-parent  drop
+;
+: get-catalog  ( -- )
+   h# 400 0  " seek" $call-parent drop
+   volume-info /volume-info  " read" $call-parent  drop
+
+   volume-info >r
+   r@ >magic be-w@  h# 4244 <>  abort" Bad volume magic number"
+   r@ >/al-blk be-l@ to /al-blk
+   r@ >al-blk0 be-w@ h# 200 *  to al-blk0
+   r> drop
+;
+: name-compare  ( name-adr1 name-adr2 -- -|0|+ )
+   >r  count tuck                ( len1 adr1 len1 r: name-adr2 )
+   r>  count dup >r              ( len1 adr1 len1 adr2 len2 r: len2 )
+   rot min caps-comp  ?dup  if   ( len1 +|- r: len2 )
+      nip r> drop                ( +|- )
+   else                          ( len1 r: len2 )
+      r> -                       ( +|- )
+   then
+;
+: path-compare  ( key-adr1 key-adr2 -- -|0|+ )
+   dup c@ 0= if 2drop 1 exit then         ( key-adr1 key-adr2 )
+   swap wa1+ swap wa1+                    ( dirid-adr1 dirid-adr2 )
+   over be-l@ over be-l@  -  ?dup  if     ( dirid-adr1 dirid-adr2 -|+ )
+      nip nip                             ( -|+ )
+   else                                   ( dirid-adr1 dirid-adr2 )
+      swap la1+  swap la1+ name-compare   ( -|0|+ )
+   then
+;
+: type-compare  ( key-adr1 key-adr2 -- -|0|+ )
+   dup c@ 0= if 2drop 1 exit then         ( key-adr1 key-adr2 )
+   swap wa1+ swap wa1+                    ( dirid-adr1 dirid-adr2 )
+   over be-l@ over be-l@  -  ?dup  if     ( dirid-adr1 dirid-adr2 -|+ )
+      nip nip exit                        ( -|+ )
+   then
+   node-record >level c@ 1 = if           ( dirid-adr1 dirid-adr2 )
+      swap la1+  swap la1+                ( adr1 adr2 )
+      skip-key dup c@ 2 = if              ( adr1 filerec )
+         1+ >user-finder be-l@  swap      ( type adr1 )
+         ca1+ be-l@ = if 
+            0                             ( 0 )  \ found it
+         else
+            1                             ( 1 )  \ not the type we want
+         then
+      else                                ( adr1 filerec )
+         2drop 1                          ( 1 )  \ not a file
+      then
+   else                                   ( dirid-adr1 dirid-adr2 )
+      2drop -1                            ( -1 )  \ not level 1
+   then
+;
+
+\ search string for %xx and replace with hex char
+: translate-name ( adr len -- adr len' )
+   push-hex
+   2dup                             ( adr len adr len )
+   begin dup while                  ( adr len adr len )
+      over c@ [char] % = if         ( adr len adr len )
+         rot 2 - -rot               ( adr len' adr len )
+         over 1+ 2 $number 0= if    ( adr len adr len n )
+            2 pick c! 2 - swap 1+ swap   ( adr len adr' len' )
+            over dup 2+ swap 4 pick move ( adr len adr' len' )
+         then
+      else
+         swap 1+ swap 1-            ( adr len adr' len' )
+      then
+   repeat
+   2drop
+   pop-base
+;
+
+d# 38 instance buffer: file-key
+: find-file  ( adr len dir-id -- false | node-adr true )
+   file-key wa1+ be-l!             ( adr len )
+   translate-name                  ( adr len )
+   over c@ [char] :   = if \ search by type
+      1 /string                    ( adr len )
+      file-key 6 + place           ( )
+      file-key  ['] type-compare  catalog-file-id  search-btree
+   else                    \ search by name
+      file-key 6 + place           ( )
+      file-key  ['] path-compare  catalog-file-id  search-btree
+   then
+;
+
+0 instance value next-log-blk
+/extents buffer: extents
+0 instance value extent-log-blk
+0 instance value blk-offset
+
+0 instance value the-fork	
+0 instance value current-node	\ The catalog node that the last lookup found
+0 instance value cwd-id		\ The current directory; a parent if file-id !0
+0 instance value file-id	\ The current fileid, or 0 if the last lookup
+				\ found a directory
+
+: follow-thread  ( adr -- node-adr false | true true )
+   dup >thread-name count
+   rot  >thread-parent be-l@  find-file  if
+      false
+   else
+      true true
+   then
+;
+\ This can fail if you try to select an alias whose referent has been deleted
+: select-component  ( node-adr -- error? )
+   begin
+      dup to current-node
+      skip-key count                                  ( adr type )
+      case
+         1 of  >dir-id be-l@  to cwd-id    false true   endof
+         2 of  >file#  be-l@  to file-id   false true   endof
+         3 of  follow-thread   endof
+         4 of  follow-thread   endof
+         ( default )  ." Bogus Record Type: "  dup .  nip cr
+      endcase
+   until
+;
+: select-file  ( adr len -- error? )
+   dup  0=  if  2drop exit  then
+   0 to file-id
+   over c@  [char] \  =  if
+      1 /string  2 to cwd-id
+      over c@ [char] \  = if    \ blessed folder indicator?
+         1 /string volume-info >vol-finder-info be-l@ to cwd-id
+      then
+\      " " cwd-id find-file  if  select-component  else  2drop true exit  then
+   then   ( adr len )
+   begin  dup  while                                        ( rem$ )
+
+      \ Error if we have already found a file but there's more in the path
+      file-id  if  
+         " %RESOURCES" $=  if
+            h# ff to the-fork  false
+         else
+            true
+         then
+         exit
+      then                                                  ( rem$ )
+
+      [char] \ left-parse-string                            ( rem$' name$ )
+
+      \ Error if we can't find the path component
+      cwd-id find-file  0=  if  2drop true exit  then       ( rem$ node-adr )
+      
+      select-component  if  2drop true exit  then           ( rem$ )
+   repeat                                                   ( null$ )
+   2drop  false
+;
+
+: do-seek  ( d -- )  /al-blk um/mod  to next-log-blk  to blk-offset  ;
+: prime-extents  ( -- )  -1 to extent-log-blk  0 0 do-seek  ;
+: extent-max-blk  ( -- last-blk#+1 )
+   extent-log-blk -1 =  if  0 exit  then
+   extents extent-#blks  extent-log-blk +
+;
+: get-extents  ( log-blk# -- )
+   dup extent-log-blk u<  if
+      0 to extent-log-blk
+      current-node skip-key 1+
+      the-fork  if  >resource-extents  else  >data-extents  then
+      extents /extents  move   ( log-blk# )
+   then
+   \ Now ext-log-blk <= log-blk#
+   begin  dup extent-max-blk u>=  while
+      extent-max-blk to extent-log-blk
+      extent-log-blk file-id the-fork find-extent
+      skip-key extents /extents move
+   repeat
+   drop
+   \ Now ext-log-blk <= log-blk# < extent-max-blk
+;
+
+\ Returns the address and length of the next contiguous part of the file
+\ following the given logical block number
+: next-piece  ( log-blk# -- phys-blk# #blks )
+   dup get-extents                        ( log-blk# )
+   extents  extent-log-blk  (next-piece)  ( phys-blk# #blks )
+;
+: hfsdfalign  ( d.byte# 'fh -- d.aligned )
+   drop /al-blk um/mod nip  /al-blk um*
+;
+
+: this-size  ( -- n )
+   current-node skip-key 1+  the-fork  if  >rleof  else  >dleof  then  be-l@
+;
+: hfsdflen   ( 'fhandle -- d.size )  drop this-size 0  ;
+
+: hfsdfseek  ( d.byte# 'fh -- )  drop do-seek  ;
+
+: #remaining  ( -- n )  this-size   next-log-blk /al-blk *  -  0 max  ;
+
+: hfsfread   ( addr count 'fh -- #read )
+   drop                                   ( adr len )
+   #remaining min  dup >r                 ( adr #to-read )
+   /al-blk 1- +  /al-blk /                ( adr #blks-to-read )
+   begin  dup  while                      ( adr #blks-rem )
+      >r                                  ( adr )
+      dup next-log-blk next-piece         ( adr adr phys-blk# #blks )
+      r@ min  dup >r                      ( adr adr phys-blk# #to-read )
+      read-blocks  r> r>                  ( adr #to-read #blks-rem )
+      over -  -rot                        ( #blks-rem' adr #to-read )
+      /al-blk * +  swap                   ( adr' #blks-rem' )
+   repeat                                 ( adr 0 )
+   2drop
+   r>   
+;
+
+: hfsfclose  ( 'fh -- )  drop   bfbase @  /al-blk free-mem  ;
+
+/fd instance buffer: my-fd
+
+: hfssetupfd  ( -- )
+   0 0 do-seek
+   file @ >r  my-fd file !
+   /al-blk alloc-mem  /al-blk initbuf
+   my-fd r/o
+   ['] hfsdflen  ['] hfsdfalign  ['] hfsfclose  ['] hfsdfseek
+   ['] nullwrite ['] hfsfread
+   setupfd
+   r> file !
+;
+
+headers
+
+: open  ( -- )
+   get-catalog
+   1 to cwd-id
+   -1 to extent-log-blk
+   my-args select-file  if  false exit  then
+   file-id  if  hfssetupfd  then
+   true
+;
+
+: close  ( -- )
+   file-id  if
+      my-fd  ['] fclose catch  ?dup  if  .error drop  then
+   then
+;
+: read  ( adr len -- actual )
+   my-fd  ['] fgets catch  if  3drop 0  then
+;
+\ : write  ( adr len -- actual )
+\    tuck  my-fd  ['] fputs catch  if  2drop 2drop -1  then
+\ ;
+: seek   ( offset.low offset.high -- error? )
+   my-fd  ['] dfseek catch  if  2drop true  else  false  then
+;
+: size  ( -- d )  my-fd  ['] dfsize catch  if  2drop 0 0  then  ;
+: load  ( adr -- size )  size drop read  ;
+
+1 value showtype?
+
+: file-name  ( -- adr len ) 
+   current-node 6 + count                      ( adr len )
+   showtype? if
+      current-node skip-key c@ 2 = if
+        current-node skip-key 1+ >user-finder be-l@      ( adr len type )
+        file-key be-l! file-key 4 + dup h# 20 swap c! 1+ ( adr len buf )
+        swap dup >r move file-key r> 5 +                 ( adr len )
+      then
+   then
+;
+
+headerless
+
+\ XXX Is this correct for directory records?
+: locked?  ( flags -- flag )  h# 100 and 0<>   ;
+
+\ Convert HFS file attributes to the firmware encoding
+\ see showdir.fth for a description of the firmware encoding
+create type-map  h# 4000 ,  h# 8000 ,  0 ,  h# a000 ,
+: >canonical-attrs  ( hfs-flags -- canon-attrs )
+   >r
+   \ Access permissions
+   r@ locked?  if  o# 666  else  o# 777  then   \ rwxrwxrwx
+
+   \ XXX maybe the way to set the "archive" indication is to compare
+   \ the backup time with the modification time.
+
+   \ Mutually-exclusive file types
+   current-node skip-key c@ 1-  type-map swap na+ @  or
+
+   r> drop
+;
+
+create alias-times  0 be-l,  0 be-l,  0 be-l,
+
+decimal
+
+\ The months are stored in this order so the leap day happens at the
+\ end of a cycle.
+
+create days/month
+\ Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec   Jan   Feb
+  31 c, 30 c, 31 c, 30 c, 31 c, 31 c, 30 c, 31 c, 30 c, 31 c, 31 c, 29 c,
+
+: >d/m  ( day-in-year -- day month )
+   d# 12 0  do
+      days/month i ca+ c@  2dup <  if   ( rem days-in-month )
+         drop 1+  i  leave
+      then
+      -
+   loop
+;
+
+\ The Mac filesystem stores timestamps in seconds since midnight on 1/1/1904
+: mac-time>  ( seconds -- s m h d m y )
+   \ XXX we should account for accumulated leap seconds too
+   60 u/mod  60 u/mod  24 u/mod          ( s m h days )
+   60 -    \ shift to first cycle boundary (1Mar04)
+   [ 365 4 * 1+ ] literal /mod  >r       ( s m h day-in-cycle  r: cycles )
+   365 u/mod                             ( s m h day-in-year year-in-cycle )
+   dup  4 =  if  2drop  365 3  then      ( s m h day-in-year year-in-cycle )
+   swap  >d/m                            ( s m h year-in-cycle day month )
+   9 -  dup 0>  if  rot 1+  else  12 +  rot   then  ( s m h d m year-in-cycle )
+   r> 4 *  +  1904 +
+;
+hex
+
+: get-mtime  ( adr -- s m h d m y )  >modify-time be-l@ mac-time>  ;
+headers
+: file-info  ( -- s m h d m y len attributes name$ )
+   current-node skip-key count swap >r  case  ( r: adr )
+      1 of
+         r@ >dir-times  get-mtime  r@ >valence be-w@
+      endof
+      2 of
+         r@ >file-times get-mtime  r@ >dleof be-l@  r@ >rleof be-l@  +
+      endof
+      ( default )
+         >r   alias-times get-mtime  0   r>            
+   endcase                                    ( s m h d m y len r: adr )
+   r> >dir-flags be-w@ >canonical-attrs       ( s m h d m y len attrs )
+   file-name                                  ( s m h d m y len attrs name$ )
+;
+
+headerless
+: next-file  ( -- found? )
+   catalog-file-id to btree-file#
+   last-node# last-rec# >nextnode  2dup to last-rec#  to last-node#
+   2dup or  0=  if  2drop false exit  then    ( node# rec# )
+   >node  dup to current-node                 ( node-adr )
+   wa1+ be-l@ cwd-id =
+;
+
+headers
+
+: next-file-info  ( id -- false | id' s m h d m y len attributes name$ true )
+   dup 0=  if
+      null$ cwd-id find-file  if  drop  else  drop false exit  then
+   then  ( id )
+   next-file  if                       ( id )
+      1+  file-info  true
+   else
+      drop false
+   then
+;
+: free-bytes  ( -- d.#bytes )  volume-info >#free-blocks be-w@  /al-blk m*  ;
+
+finish-device
+device-end
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Added: ofw/fs/hfs/partition.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ ofw/fs/hfs/partition.fth	Tue Sep  2 23:07:35 2014	(r3738)
@@ -0,0 +1,130 @@
+purpose: Macintosh partition map decoder
+\ See license at end of file
+
+\ MacOS HFS
+struct  ( mac-partition )
+   /w field >part-magic
+   2 +				\ Reserved
+   /l field >mp-#pm-blks	\ # of blocks in the partition map
+   /l field >mp-blk0		\ first logical block number for partition
+   /l field >mp-#blks		\ # of blocks in the partition
+   d# 32 field >mp-part-name
+   d# 32 field >mp-part-type
+   /l field >mp-dblk0		\ Offset in blocks to first data block
+   /l field >mp-#dblks		\ Number of data blocks
+   /l field >mp-status		\ Flags
+   /l field >mp-bblk0		\ Offset in blocks to first boot block
+   /l field >mp-/boot		\ Size in bytes of boot area
+   /l field >mp-boot-load	\ Load address of boot code
+   /l +				\ Reserved
+   /l field >mp-boot-entry	\ Entry address of boot code
+   /l +				\ Reserved
+   /l field >mp-boot-sum	\ Checksum of boot code
+   \ d# 16 field >mp-proctype   \ Processor type
+drop
+
+0 value /mac-block
+0 value mac-partition-sector
+: get-mac-partition-info  ( -- )
+   \ XXX we need to think about the boot area
+   sector-buf >mp-blk0 be-l@  sector-buf >mp-dblk0 be-l@  +  to sector-offset
+   sector-buf >mp-#dblks be-l@      ( #sectors )
+   /mac-block um*  to size-high  to size-low
+;
+
+: default-mac?  ( -- flag )
+   \ If a file name (or directory name) is supplied, and it
+   \ is not "%BOOT", we don't want to select the first bootable
+   \ partition, because bootable partitions often contain nothing
+   \ but SCSI device drivers.  Instead, we look for a partition
+   \ with a file system on it.
+   filename nip 0=  filename " %BOOT" $=  or  if
+      \ Find the first bootable partition
+      \ Readable(10), bootable(8), allocated(2), valid(1)
+      sector-buf >mp-status be-l@  h# 1b and  h# 1b =  if  true exit  then
+   else
+      \ Find the first readable, allocated, valid partition
+      \ of type "Apple_HFS"
+      sector-buf >mp-status be-l@  h# 13 and  h# 13 =  if
+         sector-buf >mp-part-type  " Apple_HFS" comp  0=  if  true exit  then
+      then
+   then
+   false
+;
+
+: find-mac-partition  ( criterion-xt -- error? )
+   to suitable?
+
+   \ XXX search for a Mac partition whose "valid" flag is set.
+   \ The 0x01 status bit is "valid?"  The 0x08 status bit is "bootable?"
+   \ If one is found, set partition-type, size-high, size-low, and
+   \ sector-offset and return false.
+
+   \ Get the partition entry that describes the partition map as a whole
+   1 read-sector
+   sector-buf >part-magic be-w@ h# 504d  <>  if  true exit  then
+
+   1  sector-buf >mp-#pm-blks be-l@    ( first-block #partition-map-blocks )
+   bounds  ?do                         ( )
+      i to mac-partition-sector
+      i 1 <>  if  i read-sector  then   \ Already read sector 1
+      sector-buf >mp-status be-l@  1 and  if               \ Valid?
+         suitable?  if  get-mac-partition-info  false  unloop  exit  then
+      then
+   loop                                            ( )
+   true
+;
+
+: mac-map  ( -- )
+   #part  -1 =  if		\ Find the default bootable partition
+      ['] default-mac?  find-mac-partition  0=  if  exit  then
+      \ Failing to find a suitable default partition, use the first valid one
+      1 to #part
+   then
+   ['] nth? find-mac-partition abort" No such MAC partition"
+;
+
+2 buffer: hfs-magic
+: hfs-partition?  ( -- flag )
+   h# 400 0  offset  " seek" $call-parent drop  ( )
+   hfs-magic 2  " read" $call-parent            ( #read )
+   \ Re-establish initial position
+   0 0 offset  " seek" $call-parent drop        ( #read )
+
+   2 <>  if  false  exit  then
+   hfs-magic be-w@  h# 4244 =
+;
+
+\ In addition to returning the flag, if it is a mac disk, this
+\ routine has the side effect of setting /mac-block and size-low,high
+: mac-disk?  ( -- flag )
+   sector-buf be-w@  h# 4552  =  dup  if
+      sector-buf wa1+ be-w@  to /mac-block
+      /sector /mac-block <>
+      abort" The partition map code cannot handle non-512-byte sector sizes"
+      sector-buf la1+ be-l@  /mac-block um*  to size-high  to size-low
+   then
+;
+\ LICENSE_BEGIN
+\ Copyright (c) 1997 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END



More information about the openfirmware mailing list