[openfirmware] [commit] r2707 - in cpu/x86/pc/newton: . build

repository service svn at openfirmware.info
Tue Nov 29 01:26:23 CET 2011


Author: wmb
Date: Tue Nov 29 01:26:22 2011
New Revision: 2707
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2707

Log:
Initial revision of Newton files

Added:
   cpu/x86/pc/newton/
   cpu/x86/pc/newton/addrs.fth
   cpu/x86/pc/newton/build/
   cpu/x86/pc/newton/build/Makefile
   cpu/x86/pc/newton/config.fth
   cpu/x86/pc/newton/coskernel.fth
   cpu/x86/pc/newton/disptest.fth
   cpu/x86/pc/newton/fw.bth
   cpu/x86/pc/newton/ofw.bth
   cpu/x86/pc/newton/pcinode.fth
   cpu/x86/pc/newton/probemem.fth
   cpu/x86/pc/newton/reset.bth
   cpu/x86/pc/newton/spiui.fth
   cpu/x86/pc/newton/start.bth
   cpu/x86/pc/newton/testicons.bth
   cpu/x86/pc/newton/testicons.tgz
   cpu/x86/pc/newton/testitems.fth
   cpu/x86/pc/newton/usb.fth
   cpu/x86/pc/newton/vstest.fth
   cpu/x86/pc/newton/yuv2rgb.fth

Added: cpu/x86/pc/newton/addrs.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/addrs.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,56 @@
+\ See license at end of file
+purpose: Establish address and I/O configuration definitions
+
+\ Dropin-base is where the set of dropin modules, the verbatim
+\ image of what is stored in ROM or on disk, ends up in memory.
+\ If OFW is in FLASH, dropin-base can just be the FLASH address.
+\ If OFW is pulled in from disk, dropin-base is where the very
+\ early startup code - the first few instructions in the image -
+\ copies it to get it out of the way of things like OS load areas.
+
+h# 198.0000 constant dropin-base        \ Location of payload in RAM
+dropin-base h# 20 +  constant ResetBase	\ Location of "reset" dropin in RAM
+h#   8.0000 constant dropin-size
+
+\needs fw-pa      h# 0f00.0000 constant fw-pa     \ OFW dictionary location
+\needs /fw-ram    h#   20.0000 constant /fw-ram
+
+\needs heap-base  h# 0f20.0000 constant heap-base \ Dynamic allocation heap
+\needs heap-size  h#   20.0000 constant heap-size
+
+\needs dma-base   h# 0ee0.0000 constant dma-base  \ DMA heap
+\needs dma-size   h#   20.0000 constant dma-size
+
+\ Where OFW initially loads an OS that is is going to boot
+
+h# 100.0000 constant def-load-base      \ Convenient for initrd
+
+fload ${BP}/cpu/x86/pc/virtaddr.fth
+
+[ifdef] virtual-mode
+h#        3 constant pte-control	\ Page table entry attributes
+[then]
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 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/x86/pc/newton/build/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/build/Makefile	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,35 @@
+OS := $(shell uname)
+
+CPUDIR=../../..
+BASEDIR := $(shell cd ${CPUDIR}/../..; pwd;)
+TAGFILES= ${CPUDIR}/build/*.tag *.tag
+CLIENTDIR=${BASEDIR}/clients
+CLIENTPROGS=
+
+all: ofw.elf tags
+
+fw.tag: ofw.elf
+
+tags: fw.tag
+	@${BASEDIR}/forth/lib/toctags ${BASEDIR} ${TAGFILES}
+
+ofw.elf: FORCE build ../../../build/inflate.bin ${CLIENTPROGS}
+	./build $@
+
+../../../${OS}/forth:
+	@make -C ../../../${OS} forth
+
+../../../build/inflate.bin:
+	@make -C ../../../build inflate.bin
+
+build: ../../../${OS}/forth
+	@ln -sf ../../../${OS}/forth build
+
+clean:
+	rm -f *.dic *.log headers *~ *.elf *.di *.img builton.fth build *.rom *.version *.bin *.tag tags
+
+clean-all: clean
+	@make -C ../../../build clean
+	@make -C ../../../${OS} clean
+
+.PHONY: FORCE clean all clean-all

Added: cpu/x86/pc/newton/config.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/config.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,69 @@
+purpose: Configuration setting for OFW as a Coreboot payload on Samsung "Newton" Chromebook
+\ See license at end of file
+
+\ h# e0401000 constant mem-uart-base
+
+create coreboot-loaded
+create coreboot-qemu
+\ create debug-startup
+
+create use-timestamp-counter
+create use-tsc-timing
+
+\ create use-vesa
+create use-ega
+\ create serial-console
+
+\ In virtual mode, OFW runs with the MMU on.  The advantages are
+\ that OFW can automatically locate itself out of the way, at the
+\ top of physical memory, it can dynamically allocate exactly as
+\ much physical memory as it needs, and it can remain alive after
+\ the OS starts.  The disadvantage is that it is more confusing -
+\ you always have to be aware of the distinction between virtual
+\ and physical addresses.
+
+\ If you use virtual mode for Linux, you can debug past
+\ the point where Linux starts using the MMU.  It is not strictly
+\ necessary to use virtual mode if you just want to boot Linux
+\ and then have OFW disappear.
+
+\ create virtual-mode
+
+\ linux-support includes a bzImage file-format handler
+\ and ext2 filesystem support
+
+create linux-support
+
+\ create pseudo-nvram
+create resident-packages
+create addresses-assigned  \ Don't reassign PCI addresses
+create no-floppy-node
+create no-lpt-node
+create no-com1-node
+create no-com2-node
+
+fload ${BP}/cpu/x86/pc/newton/addrs.fth
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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/x86/pc/newton/coskernel.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/coskernel.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,47 @@
+
+h# 10000 constant /kbuf
+0 value kbuf
+
+: alloc-kbuf  ( -- )  /kbuf alloc-mem to kbuf  ;
+: free-kbuf  ( -- )  kbuf /kbuf free-mem  0 to kbuf  ;
+
+: get-kparams  ( name$ -- )
+   open-dev ?dup  0=  if  exit  then  >r  ( r: ih )
+   kbuf /kbuf " read" r@ $call-method     ( r: ih )
+   r> close-dev
+;
+
+: .keydata  ( adr len -- )
+   over  6 cdump       ( adr len )
+   ." ... "            ( adr len )
+   2dup + 6 - 6 cdump  ( adr len )
+   nip  ." (0x" .x ." bytes)" cr   ( )
+;
+   
+: .signature  ( adr -- )
+   dup x@ x>u           ( adr offset )
+   over +               ( adr sig-adr )
+   swap x@ x>u          ( sig-adr sig-len )
+   .keydata             ( )
+;
+
+string-array algorithm-names
+," RSA1024 SHA1"
+," RSA1024 SHA256"
+," RSA1024 SHA512"
+," RSA2048 SHA1"
+," RSA2048 SHA256"
+," RSA2048 SHA512"
+," RSA4096 SHA1"
+," RSA4096 SHA256"
+," RSA4096 SHA512"
+," RSA8192 SHA1"
+," RSA8192 SHA256"
+," RSA8192 SHA512"
+end-string-array
+
+: .key  ( adr -- )
+   dup .signature                    ( adr )
+   ." Ver " over h# 18 + x@ x>u .x   ( adr )
+   h# 10 + x@ x>u algorithm-names count type  ( )
+;

Added: cpu/x86/pc/newton/disptest.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/disptest.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,236 @@
+purpose: Display test
+\ See license at end of file
+
+\needs final-test?  0 value final-test?
+\needs smt-test?    0 value smt-test?
+
+dev /display
+
+d# 100 constant bar-int
+h# 7 constant test-colors16-mask
+create test-colors16
+\  white  magenta   yellow  red     green    blue    cyan    black
+   ffff w, f81f w,  ffe0 w, f800 w, 07e0 w,  001f w, 07ff w, 0000 w,
+
+: fill-rect  ( -- )  " fill-rectangle" $call-screen  ;
+: dimens     ( -- w h )  " dimensions" $call-screen  ;
+: ht         ( -- h )  " height" $call-screen  ;
+: wth        ( -- w )  " width"  $call-screen  ;
+
+: whole-screen  ( -- x y w h )  0 0 dimens  ;
+
+: black-screen  ( -- )  0  whole-screen  fill-rect  ;
+
+: test-color16  ( n -- color )
+   test-colors16 swap bar-int / test-colors16-mask and wa+ w@
+;
+: .horizontal-bars16  ( -- )
+   dimens				( width height )
+   0  ?do				( width )
+      i test-color16 0 i 3 pick bar-int fill-rect
+   bar-int +loop  drop
+;
+: .vertical-bars16  ( -- )
+   dimens				( width height )
+   swap 0  ?do				( height )
+      i test-color16 i 0 bar-int 4 pick fill-rect
+   bar-int +loop  drop
+;
+
+instance variable rn            	\ Random number
+d# 5,000 constant burnin-time		\ 5 seconds
+
+: random  ( -- n )
+   rn @  d# 1103515245 *  d# 12345 +   h# 7FFFFFFF and  dup rn !
+;
+
+: randomize-color  ( -- c )
+   random h# 1f and d# 11 <<
+   random h# 3f and d#  5 << or
+   random h# 1f and          or
+;
+: randomize-xy  ( -- x y )
+   dimens				( width height )
+   random 3ff and min swap		( y width )
+   random 7ff and min swap		( x y )
+;
+: randomize-wh  ( x y -- w h )
+   dimens				( x y width height )
+   rot - -rot				( max-h x width )
+   swap - swap				( max-w max-h )
+   randomize-xy				( max-w max-h w h )
+   rot min -rot min swap		( w' h' )
+;
+: .random-rect  ( -- )
+   randomize-color			( c )
+   randomize-xy				( c x y )
+   2dup randomize-wh			( c x y w h )
+   " fill-rectangle" $call-screen	( )
+;
+
+: random-selftest  ( -- )
+   get-msecs rn !
+   get-msecs burnin-time +    ( limit )
+   begin
+      get-msecs over u<       ( limit reached? )
+   while                      ( limit )
+      .random-rect            ( limit )
+      key?  if  key 2drop exit  then
+   repeat                     ( limit )
+   drop
+;
+
+0 value xbias
+0 value ybias
+0 value hstripe
+0 value vstripe
+: set-stripes  ( -- )
+   wth  d# 256 /  to hstripe
+   ht   d# 256 /  to vstripe
+   wth  hstripe d# 256 * -  to xbias
+   ht   vstripe d# 256 * -  to ybias
+;
+: half-bias  ( -- )  xbias 2/ to xbias  ybias 2/ to ybias  ;
+: gvsr  ( -- )
+   set-stripes  half-bias  black-screen   ( )
+   d# 256 0  do                ( )
+      d# 256 0  do             ( )
+         i j 0 rgb>565         ( color )
+         hstripe i * xbias +   ( color x )
+         vstripe j * ybias +   ( color x y )
+         hstripe vstripe       ( color x y w h )
+         fill-rect
+      loop
+   loop
+;
+: gvsb  ( -- )
+   set-stripes  half-bias  black-screen   ( )
+   d# 256 0  do                ( )
+      d# 256 0  do             ( )
+         0 j i rgb>565         ( color )
+         hstripe i * xbias +   ( color x )
+         vstripe j * ybias +   ( color x y )
+         hstripe vstripe       ( color x y )
+         fill-rect
+      loop
+   loop
+;
+: hgradient  ( -- )
+   set-stripes  black-screen   ( )
+   d# 256 0  do                ( )
+      i i i rgb>565            ( color )
+      hstripe i * xbias +  0   ( color x y )
+      hstripe  ht              ( color x y sw h )
+      fill-rect                ( )
+   loop                        ( )
+;
+
+: vgradient  ( -- )
+   set-stripes  black-screen   ( )
+   d# 256 0  do                ( )
+      i i i rgb>565            ( color )
+      0  vstripe i * ybias +   ( color x y )
+      wth  vstripe             ( color x y w sh )
+      fill-rect                ( )
+   loop                        ( )
+;
+
+
+h# ff h# ff h# ff rgb>565 constant white-color
+
+: hline  ( y -- )  >r  white-color  0 r>  wth  1  fill-rect  ;
+: vline  ( y -- )  >r  white-color  r> 0  1 ht    fill-rect  ;
+
+: crosshatch  ( -- )
+   black-screen
+   ht    0  do  i hline  d# 10 +loop
+   wth   0  do  i vline  d# 10 +loop
+;
+: short-wait  ( -- )  smt-test?  if  d# 250 ms  else  d# 500 ms  then  ;
+: brightness-ramp  ( -- )
+   0  h# 0f  do  i bright!  short-wait  -1 +loop
+   backlight-off  short-wait  backlight-on
+   h# f bright!
+;
+
+: red-screen  ( -- )
+   load-base  whole-screen  " read-rectangle" $call-screen
+   h# ff 00 00 rgb>565 whole-screen fill-rect
+   d# 1000 ms
+   load-base  whole-screen  fill-rect
+;
+: hold-time  ( -- )
+   smt-test?  if
+      d# 500 ms
+   else
+      final-test?  if  d# 500 ms  else  d# 1000 ms  then
+   then
+;
+
+: hold-time2  ( -- )
+   smt-test?  if
+      d# 500 ms
+   else
+      final-test?  if  key drop  then
+      d# 1000 ms
+   then
+;
+: wait  ( -- )
+   hold-time
+\   0 set-source \ Freeze image
+   hold-time
+\   1 set-source \ Unfreeze image
+   hold-time2
+;
+
+warning @ warning off
+: selftest  ( -- error? )
+   depth d# 16 <  if  false exit  then
+   smt-test? 0=  if
+      .horizontal-bars16   wait
+      .vertical-bars16     wait
+   then
+   gvsr                 wait
+   gvsb                 wait
+   hgradient            wait
+   vgradient            wait
+   crosshatch           wait
+   brightness-ramp
+
+   smt-test?  0=  if
+      burnin-time d# 5000 >  if
+         ." Press a key to stop early." cr
+         d# 1000 ms
+      then
+      random-selftest
+   then
+
+   confirm-selftest?
+;
+warning !
+
+device-end
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2007 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/x86/pc/newton/fw.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/fw.bth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,351 @@
+\ See license at end of file
+purpose: Build Open Firmware core
+
+dictionary: ${BP}/cpu/x86/build/basefw.dic
+command: &x86forth &dictionary &this
+in: builton.fth
+build-now
+
+" fw.tag" r/w create-file drop  tag-file !
+
+hex
+\ ' $report-name is include-hook
+
+fload ${BP}/cpu/x86/pc/newton/config.fth
+
+: headerless ;  : headers  ;  : headerless0 ;
+
+' (quit) to quit
+
+: \Tags [compile] \  ; immediate
+: \NotTags [compile] \  ; immediate
+
+: RAMbase  ( -- adr )  fw-virt-base  ;
+: RAMtop  ( -- adr )  RAMbase /fw-ram +  ;
+
+h# 00.0000 value    dp-loc	\ Set in patchboot
+: stacktop    ( -- adr )  RAMtop  ;
+: dict-limit  ( -- adr )  RAMtop  h# 06.0000 -  ;
+
+\ XXX What we should do is pass in the top address in SP, and have
+\ boot.fth allocate the user area by subtracting user-size.  But
+\ we need some way of finding it again for exception re-entry.
+\ prom-main-task is used in arch/pc/boot.fth .  The constant
+\ value is wired into the assembly code
+stacktop  user-size - ( fw-virt-base - ) constant prom-main-task	\ user area for main task
+
+0 value load-limit	\ Top address of area at load-base
+' 2drop to sync-cache
+
+def-load-base ' load-base set-config-int-default
+
+true ' fcode-debug? set-config-int-default
+\ false  ' auto-boot?    set-config-int-default
+
+" com1" ' output-device set-config-string-default
+" com1" ' input-device set-config-string-default
+
+\ XXX should be loaded by basefw.bth
+fload ${BP}/cpu/x86/initpgm.fth		\ Basic boot handler
+fload ${BP}/cpu/x86/msr.fth	        \ Access to machine specific registers
+
+: (cpu-arch  ( -- adr len )
+   " architecture" ['] root-node  get-package-property  drop
+   get-encoded-string
+;
+' (cpu-arch to cpu-arch
+
+h# 1000 to pagesize
+d# 12   to pageshift
+
+dev /
+1 encode-int  " #address-cells"  property
+1 encode-int  " #size-cells"     property
+" Samsung Chromebook Series 5" model
+" PC" encode-string  " architecture" property
+
+\ XXX figure out bus frequency.  How?
+\ d# 33,333,333 " clock-frequency" integer-property
+device-end
+
+\ Memory management services
+[ifdef] virtual-mode
+fload ${BP}/ofw/core/clntmem1.fth	\ client services for memory
+[else]
+fload ${BP}/ofw/core/clntphy1.fth	\ client services for memory
+[then]
+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
+fload ${BP}/ofw/core/allocmor.fth	\ Secondary allocator
+
+fload ${BP}/cpu/x86/pc/rootnode.fth	\ Platform-specific root node changes
+dev /  " Samsung Chromebook Series 5" " banner-name"  string-property  dend
+
+fload ${BP}/cpu/x86/pc/isaio.fth
+fload ${BP}/dev/pci/configm1.fth	\ Generic PCI configuration access
+
+fload ${BP}/cpu/x86/pc/newton/probemem.fth	\ Memory probing
+
+[ifdef] virtual-mode
+fload ${BP}/cpu/x86/loadvmem.fth	\ /mmu node
+stand-init: MMU
+   " /mmu" open-dev mmu-node !
+;
+fload ${BP}/cpu/x86/pc/initdict.fth	\ Dynamic dictionary allocation
+[then]
+
+\ XXX should be elsewhere
+dev /client-services
+: chain  ( len args entry size virt -- )
+   release                                       ( len args entry )
+   h# 8000 alloc-mem h# 8000 +  (init-program)   ( len args )
+   to %ebx  to %ecx
+   go
+;
+device-end
+
+fload ${BP}/cpu/x86/crc32.fth		\ Assembly language Zip CRC calculation
+fload ${BP}/forth/lib/crc32.fth	\ High-level portion of CRC calculation
+
+[ifdef] resident-packages
+
+\needs unix-seconds>  fload ${BP}/ofw/fs/unixtime.fth	\ Unix time calculation
+support-package: ext2-file-system
+   fload ${BP}/ofw/fs/ext2fs/ext2fs.fth	\ Linux file system
+end-support-package
+
+support-package: zip-file-system
+   fload ${BP}/ofw/fs/zipfs.fth		\ Zip file system
+end-support-package
+
+support-package: dropin-file-system
+   fload ${BP}/ofw/fs/dropinfs.fth	\ Dropin file system
+end-support-package
+[then]
+
+\ Load file format handlers
+
+: call32 ;
+
+fload ${BP}/ofw/core/allocsym.fth    \ Allocate memory for symbol table
+fload ${BP}/ofw/core/symcif.fth
+fload ${BP}/ofw/core/symdebug.fth
+: release-load-area  ( boundary-adr -- )  drop  ;
+
+fload ${BP}/ofw/elf/elf.fth
+fload ${BP}/ofw/elf/elfdebug.fth
+[ifdef] virtual-mode
+\ Depends on the assumption that physical memory is mapped 1:1 already
+: (elf-map-in) ( va size -- )  0 mem-claim  drop  ;
+[else]
+: (elf-map-in)  ( va size -- )  2drop  ;
+[then]
+' (elf-map-in) is elf-map-in
+
+\ Reboot and re-entry code
+fload ${BP}/cpu/x86/pc/reboot.fth	\ Restart the client program
+fload ${BP}/cpu/x86/pc/reenter.fth	\ Various entries into Forth
+
+headerless
+[ifdef] virtual-mode
+: (initial-heap)  ( -- adr len )  sp0 @ ps-size -  dict-limit  tuck -  ;
+[else]
+: (initial-heap)  ( -- adr len )  heap-base heap-size  ;
+[then]
+' (initial-heap) is initial-heap
+headers
+
+" /openprom" find-device
+   " FirmWorks,3.0" encode-string " model" property
+device-end
+
+[ifdef] virtual-mode
+fload ${BP}/cpu/x86/pc/mmusetup.fth	\ Initial values for MMU lists
+[then]
+
+fload ${BP}/cpu/x86/pc/rmtools.fth
+
+fload ${BP}/cpu/x86/pc/newton/devices.fth
+
+true ' local-mac-address? set-config-int-default
+fload ${BP}/ofw/inet/loadtcp.fth
+
+[ifdef] resident-packages
+support-package: nfs
+   fload ${BP}/ofw/fs/nfs/loadpkg.fth
+end-support-package
+[then]
+devalias nfs net//obp-tftp:last//nfs
+
+support-package: http
+   fload ${BP}/ofw/inet/http.fth	\ HTTP client
+end-support-package
+
+fload ${BP}/ofw/wifi/wifi-cfg.fth
+support-package: supplicant
+fload ${BP}/ofw/wifi/loadpkg.fth
+end-support-package
+
+fload ${BP}/cpu/x86/pc/boot.fth
+fload ${BP}/cpu/x86/pc/linux.fth
+
+hex 
+\ If there is a PCI ethernet adapter, use it as the default net device,
+\ otherwise use any ethernet that can be found in the device tree.
+: report-net  ( -- )
+   " /pci/ethernet" 2dup  find-package  if  ( name$ phandle )
+      drop                                  ( name$ )
+   else                                     ( name$ )
+      2drop  " /ethernet"                   ( name$' )
+   then                                     ( name$ )
+   " net" 2swap $devalias                   ( )
+;
+
+fload ${BP}/cpu/x86/pc/newton/usb.fth
+
+fload ${BP}/ofw/gui/bmptools.fth
+fload ${BP}/ofw/gui/loadmenu.fth
+d# 1024 d# 768 to max-xy
+patch noop set-menu-colors setup-graphics
+patch merge-rect-565 merge-rect merge-cursor  \ Hack since we do all our user-level graphics in 565
+patch merge-rect-565 merge-rect merge-cursor  \ Hack since we do all our user-level graphics in 565
+fload ${BP}/cpu/x86/pc/olpc/via/mfgtest.fth
+fload ${BP}/dev/olpc/confirm.fth
+: bright!  ( level -- )  drop  ;
+: backlight-on   ( -- )  ;
+: backlight-off  ( -- )  ;
+[ifdef] use-vesa
+fload ${BP}/cpu/x86/pc/newton/disptest.fth
+[then]
+fload ${BP}/cpu/x86/pc/newton/yuv2rgb.fth       \ YUV2 to RGB conversion
+fload ${BP}/cpu/x86/pc/newton/vstest.fth        \ Video stream test helpers
+
+false to stand-init-debug?
+\ true to stand-init-debug?
+
+hex
+stand-init-debug?  [if]
+warning @  warning off 
+: init
+\ initial-heap add-memory
+   init
+
+   standalone?  if
+      cr ." Type 'i' to interrupt stand-init sequence" cr 
+      d# 1000 ms
+      key?  if
+         key upc ascii I  =  if  ." Interacting" cr  hex interact  then
+      then
+   then
+\  cr0@ h# 9fff.ffff and cr0!	\ enable L1 and L2 caches
+;
+warning !
+[then]
+
+: (.firmware)  ( -- )
+   ." Open Firmware  "  .built  cr
+   ." Copyright 1999 FirmWorks  All Rights Reserved" cr
+;
+' (.firmware) to .firmware
+
+: linux-logo  ( -- )
+   " penguin.txt" find-drop-in  if  page type  then
+;
+
+: probe-all  ( -- )
+   " probe-" do-drop-in
+   probe-pci
+\  report-pci-fb
+   silent-probe-usb
+\   " show-devs /pci" eval   begin again
+;
+
+\ This reduces processor use when waiting for a key.  It helps
+\ a lot when running on an emulator.
+: c1-idle  ( -- )  interrupts-enabled?  if  halt  then  ;
+' c1-idle to stdin-idle
+
+: startup  ( -- )
+   standalone?  0=  if  exit  then
+
+   use-nvramrc?  if  nvramrc safe-evaluate  then
+
+   auto-banner?  if
+      " Probing" ?type  probe-all
+      install-mux-io
+[ifndef] serial-console
+      fallback-in-ih  remove-input
+      fallback-out-ih remove-output
+[then]
+      banner
+      ?usb-keyboard
+      show-usb
+   then
+
+   hex
+   warning on
+   only forth also definitions
+
+   install-alarm
+
+   #line off
+
+   ." Open Firmware demonstration version by FirmWorks" cr
+
+   ." See "
+   blue-letters ." http://wiki.laptop.org/go/Forth_Lessons" black-letters
+   cr cr
+   ." Type  menu  to run diagnostics" cr
+
+   quit
+;
+
+fload ${BP}/cpu/x86/pc/watchall.fth
+
+alias crcgen drop  ( crc byte -- crc' )
+fload ${BP}/cpu/x86/pc/saveabs.fth
+
+fload ${BP}/forth/lib/selstr.fth
+
+\needs ramdisk  " " d# 128 config-string ramdisk
+" console=tty0 console=ttyS0,115200"   ' boot-file    set-config-string-default
+
+" dhcp" ' ip-address  set-config-string-default
+
+: stand-init-io
+   stand-init-io
+;
+
+tag-file @ fclose  tag-file off
+
+.( SAVING FW.dic ...)
+" fw.dic" $save-forth cr
+
+.( Saving fw.img ...)
+" fw.img"  RAMbase save-abs-rom cr
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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/x86/pc/newton/ofw.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/ofw.bth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,78 @@
+purpose: Construct the final OFW image 
+
+command: &builder &this
+in: reset.di
+in: start.di
+in: ${BP}/cpu/x86/pc/newton/build/paging.di
+in: fw.img
+in: ${BP}/dev/usb2/hcd/ohci/build/ohci.fc
+in: ${BP}/dev/usb2/hcd/uhci/build/uhci.fc
+in: ${BP}/dev/usb2/hcd/ehci/build/ehci.fc
+in: ${BP}/dev/usb2/device/hub/build/hub.fc
+in: ${BP}/dev/usb2/device/net/build/usbnet.fc
+in: ${BP}/dev/usb2/device/serial/build/usbserial.fc
+in: ${BP}/dev/usb2/device/storage/build/usbstorage.fc
+in: ${BP}/dev/usb2/device/keyboard/build/usbkbd.fc
+in: ${BP}/dev/usb2/device/webcam/build/webcam.fc
+in: ${BP}/dev/pci/build/pcibridg.fc
+in: ${BP}/dev/ide/build/leghier.fc
+in: testicons.bin
+
+build-now
+
+fload ${BP}/cpu/x86/pc/newton/config.fth
+
+\ Always re-create the builton.fth file when we make a new rom.img
+fload ${BP}/cpu/x86/pc/builton.bth
+
+hex
+
+.( --- Saving as ofw.elf - Coreboot payload format) cr
+fload ${BP}/cpu/x86/pc/elfhdr.fth
+writing ofw.elf
+elf-header /elf-header ofd @ fputs
+
+   " reset.di"              $add-file
+   " start.di"              $add-file
+   " paging.di"             $add-file
+
+   " ${BP}/cpu/x86/build/inflate.bin"           " inflate"         $add-dropin
+
+   " fw.img"                                    " firmware"        $add-deflated-dropin
+\   " fw.img"                                    " firmware"        $add-dropin
+
+   " ${BP}/dev/pci/build/pcibridg.fc"           " class060400"     $add-deflated-dropin
+   " ${BP}/dev/ide/build/leghier.fc"            " class01018a"     $add-deflated-dropin
+
+   " ${BP}/dev/usb2/hcd/ehci/build/ehci.fc"	" class0c0320"     $add-deflated-dropin
+   " ${BP}/dev/usb2/hcd/uhci/build/uhci.fc"	" class0c0300"     $add-deflated-dropin
+
+   " ${BP}/dev/usb2/device/hub/build/hub.fc"            " usb,class9"    $add-dropin
+   " ${BP}/dev/usb2/device/keyboard/build/usbkbd.fc"    " usb,class3,1"  $add-dropin
+   " ${BP}/dev/usb2/device/net/build/usbnet.fc"         " usbnet"        $add-deflated-dropin
+   " ${BP}/dev/usb2/device/serial/build/usbserial.fc"   " usbserial"     $add-deflated-dropin
+   " ${BP}/dev/usb2/device/storage/build/usbstorage.fc" " usbstorage"    $add-deflated-dropin
+   " ${BP}/dev/usb2/device/webcam/build/webcam.fc"     " usb,classe,3,0" $add-dropin
+
+   " builton.fth"                       " probe-"               $add-dropin
+   " ${BP}/ofw/fcode/memtest.fth"       " memtest.fth"          $add-deflated-dropin
+   " ${BP}/ofw/inet/telnetd.fth"        " telnetd"              $add-deflated-dropin
+   " ${BP}/ofw/termemu/15x30pc.psf"     " font"                 $add-deflated-dropin
+
+   " ${BP}/cpu/x86/pc/newton/build/testicons/audio.565"    " audio.565"    $add-deflated-dropin
+   " ${BP}/cpu/x86/pc/newton/build/testicons/clock.565"    " clock.565"    $add-deflated-dropin
+   " ${BP}/cpu/x86/pc/newton/build/testicons/cpu.565"      " cpu.565"      $add-deflated-dropin
+   " ${BP}/cpu/x86/pc/newton/build/testicons/display.565"  " display.565"  $add-deflated-dropin
+   " ${BP}/cpu/x86/pc/newton/build/testicons/play.565"     " play.565"     $add-deflated-dropin
+   " ${BP}/cpu/x86/pc/newton/build/testicons/quit.565"     " quit.565"     $add-deflated-dropin
+   " ${BP}/cpu/x86/pc/newton/build/testicons/ram.565"      " ram.565"      $add-deflated-dropin
+   " ${BP}/cpu/x86/pc/newton/build/testicons/spi.565"      " spi.565"      $add-deflated-dropin
+   " ${BP}/cpu/x86/pc/newton/build/testicons/timer.565"    " timer.565"    $add-deflated-dropin
+   " ${BP}/cpu/x86/pc/newton/build/testicons/usb.565"      " usb.565"      $add-deflated-dropin
+   " ${BP}/cpu/x86/pc/newton/build/testicons/wifi.565"     " wifi.565"     $add-deflated-dropin
+
+   ofd @ fsize pad !        \ file size; store in memory for convenience below
+   h# 44 ofd @ fseek        \ Seek to file size field; see elfhdr.bth
+   pad 4 ofd @ fputs        \ Patch file size
+   pad 4 ofd @ fputs        \ Patch memory size
+ofd @ fclose

Added: cpu/x86/pc/newton/pcinode.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/pcinode.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,85 @@
+\ See license at end of file
+purpose: PCI bus package
+
+\ XXX need slot-names property
+[ifdef] notdef
+h# 1000 encode-int  " slave-only" property
+h# 1800 encode-int			\ Mask of implemented add-in slots
+" PCI-1"           encode-string encode+
+" PCI-2"           encode-string encode+
+" PCI-3"           encode-string encode+
+
+" slot-names" property
+[then]
+
+also forth definitions
+
+" 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10,11,12,13,14,15,16,17,18,19,1a,1b,1c,1d,1e,1f"
+   dup  config-string pci-probe-list
+
+previous definitions
+
+h# 1000.0000 to first-mem		\ Avoid RAM at low addresses
+h# 2000.0000 to mem-space-top
+h# 0000.8000 to first-io		\ Avoid mappings established by BIOS
+
+\ Configuration mechanism #1 as defined in the PCI spec.
+: 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!  ;
+
+: init  ( -- )  ;
+
+\ Determine the parent interrupt information (the "interrupt line" in PCI
+\ parlance) from the child's "interrupt pin" and the child's address,
+\ returning "int-line true" if the child's interrupt line register should
+\ be set or "false" otherwise.
+: assign-int-line  ( phys.hi.func INTx -- irq true )
+   \ Reiterate the value that is already in the int line register,
+   \ which was presumably placed there by the BIOS
+   drop  h# 3c +  config-b@  true
+;
+
+\ The io-base handling really ought to be in the root node, but
+\ that would require more changes than I'm willing to do at present.
+warning @ warning off
+: map-out  ( vaddr size -- )
+   over io-base u>=  if  2drop exit  then  ( vaddr size )
+   map-out                                 ( )
+;   
+warning !
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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/x86/pc/newton/probemem.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/probemem.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,70 @@
+\ See license at end of file
+purpose: Create memory node properties and lists
+
+dev /memory
+
+: /ram  ( -- #bytes )  0  h# b0 config-w@  wljoin  ;  \ Base of stolen memory
+: usable-ramtop  ( -- n )  h# ac config-l@  ;  \ Top of usable DRAM
+
+: release-range  ( start-adr end-adr -- )  over - release  ;
+
+: probe  ( -- )
+   0 /ram  reg   \ Report extant memory
+
+   \ Release some of the first meg, between the page tables and the DOS hole,
+   \ for use as DMA memory.
+   mem-info-pa 2 la+ l@   h# a.0000  release-range  \ Below DOS hole
+
+   h# 10.0000  fw-pa  release-range
+   fw-pa /fw-ram +  heap-base heap-size +  umax  usable-ramtop  release-range
+;
+
+[ifndef] 8u.h
+: 8u.h  ( n -- )  push-hex (.8) type pop-base  ;
+[then]
+: .chunk  ( adr len -- )  ." Testing memory at: " swap 8u.h ."  size " 8u.h cr  ;
+defer test-s3  ( -- error? )  ' false is test-s3
+: selftest  ( -- error? )
+   " available" get-my-property  if  ." No available property" cr true exit  then
+                                         ( adr len )
+   begin  ?dup  while
+      2 decode-ints swap                 ( rem$ chunk$ )
+      2dup .chunk                        ( rem$ chunk$ )
+      \ We maintain a 1-1 convenience mapping so explicit mapping is unnecessary
+      memory-test-suite  if  2drop true exit  then       ( rem$ )
+   repeat  drop
+
+   test-s3
+;
+
+device-end
+
+also forth definitions
+stand-init: Probing memory
+   " probe" memory-node @ $call-method  
+;
+previous definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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/x86/pc/newton/reset.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/reset.bth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,97 @@
+\ See license at end of file
+purpose: Dropin dispatcher for i386
+
+command: &builder &this
+build-now
+
+fload ${BP}/cpu/x86/pc/newton/config.fth
+
+\needs start-assembling  fload ${BP}/cpu/x86/asmtools.fth
+\needs write-dropin      fload ${BP}/forth/lib/mkdropin.fth
+
+fload ${BP}/cpu/x86/mmuparam.fth
+
+hex
+
+fload ${BP}/cpu/x86/pc/finddi.fth			\ find-dropin and other tools
+fload ${BP}/cpu/x86/pc/port80.fth	\ Port 80 output
+
+h#  3e.0000 constant inflate-base
+h#  30.0000 constant workspace
+
+start-assembling
+
+label my-entry
+   e9 c,  0 ,				\ To be patched later
+end-code
+
+[ifdef] debug-startup
+fload ${BP}/cpu/x86/pc/dot.fth		\ Numeric output
+[then]
+
+fload ${BP}/cpu/x86/pc/ramfind.fth		\ find-dropin
+
+label startup
+   h# 10 port80
+   cli cld
+
+   h# 11 port80
+\   h# 80  h# 70 #  isa-c!	\ Disable NMI
+\   h# 71 # al in		\ Why do we do this?
+
+[ifdef] debug-startup
+\ init-com1
+
+carret report
+linefeed report
+ascii F report
+ascii o report
+ascii r report
+[then]
+
+   h# 12 port80
+   " start" $find-dropin,   \ Assemble call to find-dropin with literal arg
+   \ What should we do it this fails?  Perhaps call a default routine
+   \ to try to initialize com1 and display a message?
+   \ For now, we assume success
+
+   d# 32 #  ax  add	\ Skip dropin header
+   ax call		\ Execute the dropin
+   h# 13 port80
+
+   fload ${BP}/cpu/x86/pc/resetend.fth
+end-code
+
+also 386-assembler
+startup  my-entry  put-branch
+previous
+
+end-assembling
+
+writing reset.di
+asm-base  here over -  0  " reset" write-dropin
+ofd @ fclose
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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/x86/pc/newton/spiui.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/spiui.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,179 @@
+\ See license at end of file
+purpose: User interface for reflashing SPI FLASH parts
+
+\ This code is concerned with the user interface for getting
+\ a new firmware image into memory and using it to program
+\ a FLASH device from that image.  The details of how to actually
+\ access the FLASH device are defined elsewhere.
+
+h# 4000 constant /chunk   \ Convenient sized piece for progress reports
+
+: write-flash-range  ( adr end-offset start-offset -- )
+   ." Writing" cr
+   ?do                ( adr )
+      \ Save time - don't write if the data is the same
+      i .x (cr                              ( adr )
+      spi-us d# 20 >=  if                   ( adr )
+         \ Just write if reading is slow
+         true                               ( adr must-write? )
+      else                                  ( adr )
+         dup  /flash-block  i  flash-verify ( adr must-write? )
+      then                                  ( adr must-write? )
+
+      if
+         i flash-erase-block
+         dup  /flash-block  i  flash-write  ( adr )
+      then
+      /flash-block +                        ( adr' )
+   /flash-block +loop                       ( adr )
+   cr  drop           ( )
+;
+
+: verify-flash-range  ( adr end-offset start-offset -- )
+   ." Verifying" cr
+   ?do                ( adr )
+      i .x (cr
+      dup   /flash-block  i  flash-verify   abort" Verify failed"
+      /flash-block +  ( adr' )
+   /flash-block +loop ( adr )
+   cr  drop           ( )
+;
+
+
+\ Perform a series of sanity checks on the new firmware image.
+
+[ifdef] load-base
+: flash-buf  load-base  ;
+[else]
+/flash buffer: flash-buf
+[then]
+
+0 value file-loaded?
+
+: -cbid  ( offset -- )  flash-buf /flash +  swap -  ;
+
+: check-id-string  ( offset expect$ -- )
+   rot -cbid @  -cbid cscount  ( expect$ got$ )
+   2over 2over $=  0=  if      ( expect$ got$ )
+      ." Expecting " 2swap type ." , got " type  cr
+      abort
+   then                        ( expect$ got$ )
+   4drop                       ( )
+;
+: ?coreboot-id  ( -- )
+   h# 14 -cbid @  /flash <>  abort" Coreboot flash size mismatch"
+   h# 1c " SAMSUNG" check-id-string
+   h# 18 " Stumpy" check-id-string
+;
+: ?cbfs  ( -- )
+   flash-buf " LARCHIVE" comp  abort" Image file is not in CBFS format"
+   \ We could also check the integrity of the CBFS headers
+;
+
+: ?image-valid   ( len -- )
+   /flash <> abort" Image file is the wrong length"
+
+   ?cbfs
+   ?coreboot-id
+;
+
+: $get-file  ( "filename" -- )
+   $read-open
+   flash-buf  /flash  ifd @ fgets   ( len )
+   ifd @ fclose
+
+   ?image-valid
+
+   true to file-loaded?
+;
+
+: ?file  ( -- )
+   file-loaded?  0=  if
+      ." You must first load a valid FLASH image file with" cr
+      ."    get-file filename" cr
+      abort
+   then
+;
+
+: read-flash  ( "filename" -- )
+   writing
+   /flash  0  do
+      i .x (cr
+      flash-buf  i +  /chunk i  flash-read
+   /chunk +loop
+   flash-buf  /flash  ofd @ fputs
+   ofd @ fclose
+;
+
+: verify  ( -- )  ?file  flash-buf  /flash  0  verify-flash-range  ;
+
+: verify-firmware  ( -- )
+   flash-buf  /flash  0  verify-flash-range     \ Verify first part
+;
+
+: write-firmware   ( -- )
+   flash-buf  /flash 0  write-flash-range      \ Write first part
+;
+
+: reflash   ( -- )   \ Flash from data already in memory
+   ?file
+   flash-write-enable
+
+   write-firmware
+
+   ['] verify-firmware catch  if
+      ." Verify failed.  Retrying once"  cr
+      spi-identify
+      write-firmware
+      verify-firmware
+   then
+   flash-write-disable
+;
+
+defer fw-filename$  ' null$ to fw-filename$
+
+: get-file  ( ["filename"] -- )
+   parse-word   ( adr len )
+   dup 0=  if  2drop fw-filename$  then  ( adr len )
+   ." Reading " 2dup type cr                     ( adr len )
+   $get-file
+;
+
+: flash  ( ["filename"] -- )  get-file ?enough-power reflash  ;
+: flash! ( ["filename"] -- )  get-file reflash  ;
+
+: safe-flash-read  ( -- )
+   flash-buf  /flash  0 flash-read
+;
+
+dev /flash
+: selftest  ( -- error? )
+   .cbfs
+   d# 2000 ms  \ More time to inspect
+   false
+;
+device-end
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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/x86/pc/newton/start.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/start.bth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,67 @@
+\ See license at end of file
+purpose: Low-level startup code
+
+command: &builder &this
+build-now
+
+\needs start-assembling  fload ${BP}/cpu/x86/asmtools.fth
+\needs write-dropin      fload ${BP}/forth/lib/mkdropin.fth
+
+hex
+
+fload ${BP}/cpu/x86/pc/newton/config.fth
+
+fload ${BP}/cpu/x86/pc/report.fth			\ Startup reports
+
+start-assembling
+
+label my-entry
+[ifdef] debug-startup
+   e9 c,  0 ,				\ To be patched later
+end-code
+
+fload ${BP}/cpu/x86/pc/dot.fth			\ Numeric display
+[then]
+
+label startup
+[ifdef] debug-startup
+\ ascii x report
+[then]
+   ret
+end-code
+
+[ifdef] debug-startup
+also 386-assembler
+startup  my-entry  put-branch
+previous
+[then]
+
+end-assembling
+
+writing start.di
+asm-base  here over -  0  " start" write-dropin
+ofd @ fclose
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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/x86/pc/newton/testicons.bth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/testicons.bth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,11 @@
+purpose: Expand the test icons
+
+command: &builder &this
+build-now
+
+" tar xfz ../testicons.tgz" expand$ $sh
+
+\ This forces the creation of a .log file, so we don't re-fetch
+writing testicons.version
+" 1" ofd @ fputs
+ofd @ fclose

Added: cpu/x86/pc/newton/testicons.tgz
==============================================================================
Files /dev/null	00:00:00 1970	(empty, because file is newly added) and cpu/x86/pc/newton/testicons.tgz	Tue Nov 29 01:26:22 2011	(r2707) differ

Added: cpu/x86/pc/newton/testitems.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/testitems.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,105 @@
+purpose: Platform-specific layout of diagnostic GUI menu items
+
+d# 6 to #mfgcols
+d# 4 to #mfgrows
+
+: dummy-test-dev  ( $ -- )
+   clear-n-restore-scroller
+   ??cr  ." Testing " type ."  - to be implemented" cr
+   mfg-color-green sq-border!
+   d# 2000 hold-message drop
+   cursor-off  gui-alerts  refresh
+   flush-keyboard
+;
+
+: mfg-test-disk  ( name$ -- )
+   clear-n-restore-scroller
+   ??cr  ." Testing " 2dup type cr
+
+   ['] $.partitions  catch  if
+      2drop false
+   else
+      0 true
+   then
+
+   d# 2000 ms  \ More time to inspect
+
+   mfg-test-result
+;
+
+icon: play.icon     rom:play.565
+icon: quit.icon     rom:quit.565
+icon: cpu.icon      rom:cpu.565
+icon: spi.icon      rom:spi.565
+icon: ram.icon      rom:ram.565
+icon: sdcard.icon   rom:sdcard.565
+icon: usb.icon      rom:usb.565
+icon: wifi.icon     rom:wifi.565
+icon: audio.icon    rom:audio.565
+icon: display.icon  rom:display.565
+icon: timer.icon    rom:timer.565
+icon: clock.icon    rom:clock.565
+icon: leds.icon     rom:leds.565
+
+: cpu-item      ( -- )  " /cpu"       mfg-test-dev  ;
+: spiflash-item ( -- )  " /flash"     mfg-test-dev  ;
+: memory-item   ( -- )  " /memory"    mfg-test-dev  ;
+: usb-item      ( -- )  " /usb"       mfg-test-dev  ;
+: int-sd-item   ( -- )  " disk"       mfg-test-disk  ;
+\ : ext-sd-item   ( -- )  " ext:0"      mfg-test-dev  ;
+: rtc-item      ( -- )  " /rtc"       mfg-test-dev  ;
+: display-item  ( -- )  " screen"     mfg-test-dev  ;
+: audio-item    ( -- )  " /audio"     dummy-test-dev  ;
+: camera-item   ( -- )  " /camera"    mfg-test-dev  ;
+: wlan-item     ( -- )  " /wlan"      dummy-test-dev  ;
+: timer-item    ( -- )  " /timer"     mfg-test-dev  ;
+: touchpad-item ( -- )  " /mouse"     mfg-test-dev  ;
+: keyboard-item ( -- )  " /keyboard"  mfg-test-dev  ;
+: switch-item   ( -- )  " /switches"  mfg-test-dev  ;
+: leds-item     ( -- )  " /leds"      mfg-test-dev  ;
+
+: newton-test-menu-items  ( -- )
+   silent-probe-usb
+
+   0 to #mfgtests
+   0 1 set-col-row
+
+   " CPU"
+   ['] cpu-item      cpu.icon      add-icon
+
+   " SPI Flash: Contains EC code, firmware, manufacturing data."
+   ['] spiflash-item    spi.icon   add-icon
+
+   " RAM chips"
+   ['] memory-item   ram.icon      add-icon
+
+   " Internal mass storage"
+   ['] int-sd-item   sdcard.icon   add-icon
+
+   " Timer"
+   ['] timer-item    timer.icon    add-icon
+
+   " RTC (Real-Time Clock)"
+   ['] rtc-item      clock.icon    add-icon
+
+   " Display"
+   ['] display-item  display.icon  add-icon
+
+   " Audio: Speaker and microphone"
+   ['] audio-item    audio.icon    add-icon
+
+   " Wireless LAN"
+   ['] wlan-item     wifi.icon     add-icon
+
+   " USB ports"
+   ['] usb-item      usb.icon      add-icon
+
+   \ These are last because they require user participation.
+   \ The earlier tests are all included in automatic batch-mode.
+
+\   " LEDs"
+\   ['] leds-item     leds.icon     add-icon
+
+;
+
+' newton-test-menu-items to test-menu-items

Added: cpu/x86/pc/newton/usb.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/usb.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,143 @@
+purpose: Platform-specific USB elaborations
+\ See license at end of file
+
+0 config-int usb-delay  \ Milliseconds to wait before set-address
+
+devalias u    /usb/disk
+
+\ Like $show-devs, but ignores pagination keystrokes
+: $nopage-show-devs  ( nodename$ -- )
+   ['] exit? behavior >r  ['] false to exit?
+   $show-devs
+   r> to exit?
+;
+
+: (probe-usb2)  ( -- )
+   " device_type" get-property  if  exit  then
+[ifdef] use-usb-debug-port
+   \ I haven't figured out how to turn on the EHCI cleanly
+   \ when the Debug Port is running
+   dbgp-off
+[then]
+   get-encoded-string  " ehci" $=  if
+      pwd$ open-dev  ?dup  if  close-dev  then
+   then
+;
+: (show-usb2)  ( -- )
+   " device_type" get-property  if  exit  then
+   get-encoded-string  " ehci" $=  if
+      pwd$ $nopage-show-devs
+   then
+;
+: (probe-usb1)  ( -- )
+   " device_type" get-property  if  exit  then
+   get-encoded-string  2dup " uhci" $= >r  " ohci" $= r> or  if
+      pwd$ open-dev  ?dup  if  close-dev  then
+   then
+;
+: (show-usb1)  ( -- )
+   " device_type" get-property  if  exit  then
+   get-encoded-string  2dup " uhci" $= >r  " ohci" $= r> or  if
+      pwd$ $nopage-show-devs
+   then
+;
+: show-usb  ( -- )
+   ." USB2 devices:" cr
+   " /" ['] (show-usb2) scan-subtree
+
+   ." USB1 devices:" cr
+   " /" ['] (show-usb1) scan-subtree
+;
+: silent-probe-usb  ( -- )
+   " /" ['] (probe-usb2) scan-subtree
+   " /" ['] (probe-usb1) scan-subtree
+   report-disk report-net
+;
+: probe-usb  ( -- )
+   silent-probe-usb
+   show-usb
+;
+alias p2 probe-usb
+
+0 value usb-keyboard-ih
+
+devalias usb-keyboard /usb/keyboard
+
+: attach-usb-keyboard  ( -- )
+   " usb-keyboard" expand-alias  if   ( devspec$ )
+      drop " /usb"  comp  0=  if      ( )
+         " usb-keyboard" open-dev to usb-keyboard-ih
+." USB keyboard attached" cr
+         usb-keyboard-ih add-input
+         exit
+      then
+   else                               ( devspec$ )
+      2drop
+   then
+;
+
+: detach-usb-keyboard  ( -- )
+   usb-keyboard-ih  if
+      usb-keyboard-ih remove-input
+      usb-keyboard-ih close-dev
+      0 to usb-keyboard-ih
+   then
+;
+
+: ?usb-keyboard  ( -- )
+   attach-usb-keyboard
+   " /usb/serial" open-dev  ?dup  if
+      add-input
+   then
+;
+
+\ Unlink every node whose phys.hi component matches port
+: port-match?  ( port -- flag )
+   get-unit  if  drop false exit  then
+   get-encoded-int =
+;
+: rm-usb-children  ( port -- )
+   device-context? 0=  if  drop exit  then
+   also                             ( port )
+   'child                           ( port prev )
+   first-child  begin while         ( port prev )
+      over port-match?  if          ( port prev )
+         'peer link@  over link!    ( port prev )      \ Disconnect
+      else                          ( port prev )
+         drop 'peer                 ( port prev' )
+      then                          ( port prev )
+   next-child  repeat               ( port prev )
+   2drop                            ( )
+   previous definitions
+;
+
+: usb-quiet  ( -- )
+   [ ' linux-hook behavior compile, ]    \ Chain to old behavior
+   " usb1" " reset-usb" execute-device-method drop
+   " usb2" " reset-usb" execute-device-method drop
+;
+' usb-quiet to linux-hook
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2007 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/x86/pc/newton/vstest.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/vstest.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,57 @@
+purpose: Video streaming test helper words
+\ See license at end of file
+
+hex
+headers
+
+load-base value vs-adr
+0 value vs-/frame
+0 value vs-height
+0 value vs-width
+0 value vs-x
+0 value vs-y
+d# 16 buffer: vs-guid
+\ XXX Need support for other format than YUV2 frames.
+: vs>screen  ( -- )
+   vs-adr dup vs-/frame yuv2>rgb
+   vs-adr vs-x vs-y vs-width vs-height " draw-rectangle" $call-screen
+;
+
+: cfg-vs-test  ( guid w h /frame -- xt adr )
+   to vs-/frame  to vs-height  to vs-width
+   vs-guid d# 16 move
+
+   ." Press a key to exit"
+   cursor-off
+   " dimensions" $call-screen      ( w h )
+   vs-height - 2/ to vs-y
+   vs-width  - 2/ to vs-x
+
+   ['] vs>screen  vs-adr
+;
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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/x86/pc/newton/yuv2rgb.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/x86/pc/newton/yuv2rgb.fth	Tue Nov 29 01:26:22 2011	(r2707)
@@ -0,0 +1,174 @@
+purpose: YUY2 to RGB-565 conversion
+\ See license at end of file
+
+\ B = 1.164(Y - 16)                   + 2.018(U - 128)
+\ G = 1.164(Y - 16) - 0.813(V - 128)  - 0.391(U - 128)
+\ R = 1.164(Y - 16) + 1.596(V - 128)
+
+[ifdef] 386-assembler
+
+\ This code operates on pixel values in memory using scaler of 128
+\ Src bytes are Y0 U Y1 V
+\ Dst bytes are 565RGB  565RGB (2 16-bit pixels)
+
+code yuv2>rgb  ( src dst count -- )
+   4 [sp] di xchg    \ di: dst
+   8 [sp] si xchg    \ si: src
+
+   ax push  ax push  ax push   \ Save space on stack for V U Y0
+
+   begin
+      \ Get Y0, make signed, multiply by 1.164 * 128, save on stack
+      ax ax xor  al lods  d#  16 # ax sub  d# 149 # ax ax imul-imm  ax 0 [sp] mov
+      ax ax xor  al lods  d# 128 # ax sub  ax 4 [sp] mov  \ Get U, make signed, save on stack
+      \ Get Y1, make signed, multiply by 1.164 * 128, save in BX
+      ax ax xor  al lods  d#  16 # ax sub  d# 149 # ax bx imul-imm
+      ax ax xor  al lods  d# 128 # ax sub  ax 8 [sp] mov  \ Get V, make signed, save on stack
+
+      \ Generate R
+      d# 204 #  8 [sp]  ax imul-imm    \ Multiply V by 1.596 * 128
+      bx        ax  add                \ Add Y1
+      d# 7 #    ax  sar                \ Scale down by 128
+
+      0<  if  ax ax xor  then          \ Clip to 0
+      d# 255 #  ax  cmp  >  if  d# 255 # ax mov  then   \ Clip to 255
+
+      h# f8 #   ax  and                \ Use upper 5 bits only
+      d#  8 #   ax  shl                \ Shift R into position
+      ax        cx  mov                \ Save it
+
+      \ Generate B
+      d# 258 #  4 [sp] ax imul-imm     \ Multiply U by 2.018 * 128
+      bx        ax  add                \ Add Y1
+      d# 7 #    ax  sar                \ Scale down by 128
+
+      0<  if  ax ax xor  then          \ Clip to 0
+      d# 255 #  ax  cmp  >  if  d# 255 # ax mov  then   \ Clip to 255
+
+      h# f8 #   ax  and                \ Use upper 5 bits only
+      d#  3 #   ax  shr                \ Shift B into position
+      ax        cx  or                 \ Save it
+
+      \ Generate G
+      d# -104 #  8 [sp]  dx imul-imm   \ Multiply V by -0.813 * 128
+      d#  -50 #  4 [sp]  ax imul-imm   \ Multiply U by -0.391 * 128
+      dx        ax  add                \ Add
+      ax        dx  mov                \ Save to be used for the 2nd RGB
+      bx        ax  add                \ Add Y1
+      d# 7 #    ax  sar                \ Scale down by 128
+
+      0<  if  ax ax xor  then          \ Clip to 0
+      d# 255 #  ax  cmp  >  if  d# 255 # ax mov  then   \ Clip to 255
+
+      h# fc #   ax  and                \ Use upper 6 bits only
+      d#  3 #   ax  shl                \ Shift G into position
+      ax        cx  or                 \ Save it
+      d# 16 #   cx  shl                \ Save second RGB
+
+      \ Generate 2nd R
+      0 [sp]    bx  mov	               \ Work on Y0
+      d# 204 #  8 [sp] ax imul-imm     \ Multiply V by 1.596 * 128
+      bx        ax  add                \ Add Y0
+      d# 7 #    ax  sar                \ Scale down by 128
+
+      0<  if  ax ax xor  then          \ Clip to 0
+      d# 255 #  ax  cmp  >  if  d# 255 # ax mov  then   \ Clip to 255
+
+      h# f8 #   ax  and                \ Use upper 5 bits only
+      d#  8 #   ax  shl                \ Shift R into position
+      ax        cx  or                 \ Save it
+
+      \ Generate 2nd B
+      d# 258 #  4 [sp] ax imul-imm     \ Multiply U by 2.018 * 128
+      bx        ax  add                \ Add Y0
+      d# 7 #    ax  sar                \ Scale down by 128
+
+      0<  if  ax ax xor  then          \ Clip to 0
+      d# 255 #  ax  cmp  >  if  d# 255 # ax mov  then   \ Clip to 255
+
+      h# f8 #   ax  and                \ Use upper 5 bits only
+      d#  3 #   ax  shr                \ Shift B into position
+      ax        cx  or                 \ Save it
+
+      \ Generate 2nd G
+      dx        ax  mov                \ v*0.813+u*0.391
+      bx        ax  add                \ Add Y-
+      d# 7 #    ax  sar                \ Scale down by 128
+
+      0<  if  ax ax xor  then          \ Clip to 0
+      d# 255 #  ax  cmp  >  if  d# 255 # ax mov  then   \ Clip to 255
+
+      h# fc #   ax  and                \ Use upper 6 bits only
+      d#  3 #   ax  shl                \ Shift G into position
+      cx        ax  or                 \ Save it
+
+      ax stos                          \ Output both RGB
+
+      d# 4 # h# c [sp]  sub
+   0= until
+
+   d# 16 [sp]  sp  lea   \ Clean stack
+   di pop
+   si pop
+c;
+[then]
+
+[ifndef]  yuv2>rgb
+
+\ Forth code: no division; use scaler of 128
+0 value y1
+0 value v  0 value v*0.813+u*0.391  0 value v*1.596
+0 value u  0 value u*2.018
+
+: do-uv-comp  ( -- )
+   u d# 258 * to u*2.018
+   v d# -104 * u d# -50 * + to v*0.813+u*0.391
+   v d# 204 * to v*1.596
+;
+: y>rgb  ( y -- rgb )
+   d# 16 - d# 149 * ( 1.164 )		   ( y' )
+   dup  u*2.018         + 7 >>a  0 max d# 255 min  h# f8 and 3 >>      ( y b )
+   over v*0.813+u*0.391 + 7 >>a  0 max d# 255 min  h# fc and 3 << or   ( y gb )
+   swap v*1.596         + 7 >>a  0 max d# 255 min  h# f8 and 8 << or   ( rgb )
+;
+: yuyv>rgb  ( y0uy1v -- rgb0 rgb1 )
+   lbsplit    	     	     	           ( v y1 u y0 )
+   swap d# 128 - to u  rot d# 128 - to v   ( y1 y0 )
+   do-uv-comp         	      	       	   ( y1 y0 )
+   y>rgb 				   ( y1 rgb0 )
+   swap y>rgb 				   ( rgb0 rgb1 )
+;
+
+: yuv2>rgb  ( src dst len -- )
+   4 / 0  do                         ( src dst )
+      over i la+ be-l@  yuyv>rgb     ( src dst rgb0 rgb1 )
+      wljoin over i la+ le-l!        ( src dst )
+   loop  2drop
+;
+
+[then]
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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