[openfirmware] r1201 - in cpu/mips: . Linux QEMU atlas atlas/build bonito broadcom/avx build cobalt

svn at openfirmware.info svn at openfirmware.info
Mon May 25 22:35:47 CEST 2009


Author: wmb
Date: 2009-05-25 22:35:46 +0200 (Mon, 25 May 2009)
New Revision: 1201

Added:
   cpu/mips/Linux/makefile
   cpu/mips/QEMU/forth
   cpu/mips/QEMU/mipsfth
   cpu/mips/argv.fth
   cpu/mips/asmtools.fth
   cpu/mips/assem.fth
   cpu/mips/assembler.html
   cpu/mips/atlas/build/makerom
   cpu/mips/atlas/forthmon.bth
   cpu/mips/atlas/isaio.fth
   cpu/mips/atlas/physaddr.fth
   cpu/mips/atlas/virtaddr.fth
   cpu/mips/basefw.bth
   cpu/mips/bonito/bonito.fth
   cpu/mips/bonito/devalias.fth
   cpu/mips/bonito/devices.fth
   cpu/mips/bonito/excption.fth
   cpu/mips/bonito/flash.fth
   cpu/mips/bonito/forthmon.bth
   cpu/mips/bonito/fw.bth
   cpu/mips/bonito/initbon.fth
   cpu/mips/bonito/initcom1.fth
   cpu/mips/bonito/initsb.fth
   cpu/mips/bonito/initsio.fth
   cpu/mips/bonito/intr.fth
   cpu/mips/bonito/isaio.fth
   cpu/mips/bonito/mappci.fth
   cpu/mips/bonito/nvram.fth
   cpu/mips/bonito/pcicfg.fth
   cpu/mips/bonito/pcinode.fth
   cpu/mips/bonito/physaddr.fth
   cpu/mips/bonito/report.fth
   cpu/mips/bonito/reset.bth
   cpu/mips/bonito/resetjmp.bth
   cpu/mips/bonito/rom.bth
   cpu/mips/bonito/rootnode.fth
   cpu/mips/bonito/start.bth
   cpu/mips/bonito/virtaddr.fth
   cpu/mips/boot.fth
   cpu/mips/broadcom/avx/68kio.fth
   cpu/mips/broadcom/avx/bcuart.fth
   cpu/mips/broadcom/avx/boot.fth
   cpu/mips/broadcom/avx/broadcom.fth
   cpu/mips/broadcom/avx/devalias.fth
   cpu/mips/broadcom/avx/devices.fth
   cpu/mips/broadcom/avx/excption.fth
   cpu/mips/broadcom/avx/flash.fth
   cpu/mips/broadcom/avx/fw.bth
   cpu/mips/broadcom/avx/initbc.fth
   cpu/mips/broadcom/avx/initcom1.fth
   cpu/mips/broadcom/avx/intr.fth
   cpu/mips/broadcom/avx/mappci.fth
   cpu/mips/broadcom/avx/ofwfind.fth
   cpu/mips/broadcom/avx/pcicfg.fth
   cpu/mips/broadcom/avx/pcinode.fth
   cpu/mips/broadcom/avx/physaddr.fth
   cpu/mips/broadcom/avx/report.fth
   cpu/mips/broadcom/avx/reset.bth
   cpu/mips/broadcom/avx/resetjmp.bth
   cpu/mips/broadcom/avx/rom.bth
   cpu/mips/broadcom/avx/romraw.bth
   cpu/mips/broadcom/avx/rootnode.fth
   cpu/mips/broadcom/avx/start.bth
   cpu/mips/broadcom/avx/test.bth
   cpu/mips/broadcom/avx/virtaddr.fth
   cpu/mips/broadcom/avx/vpd.fth
   cpu/mips/build/build
   cpu/mips/builder.bth
   cpu/mips/builton.bth
   cpu/mips/cache.fth
   cpu/mips/call.fth
   cpu/mips/catchexc.fth
   cpu/mips/ccalls.fth
   cpu/mips/centry.fth
   cpu/mips/cobalt/devalias.fth
   cpu/mips/cobalt/devices.fth
   cpu/mips/cobalt/diaguart.fth
   cpu/mips/cobalt/dropins.bth
   cpu/mips/cobalt/fixexc.fth
   cpu/mips/cobalt/flashpkg.fth
   cpu/mips/cobalt/fw.bth
   cpu/mips/cobalt/mappci.fth
   cpu/mips/cobalt/pciinit.fth
   cpu/mips/cobalt/probemem.fth
   cpu/mips/cobalt/reboot.fth
   cpu/mips/cobalt/regacc.fth
   cpu/mips/cobalt/reports.fth
   cpu/mips/code.fth
   cpu/mips/cpubpsup.fth
   cpu/mips/cpustate.fth
   cpu/mips/ctrace.fth
   cpu/mips/debugm.fth
   cpu/mips/decompm.fth
   cpu/mips/disassem.fth
   cpu/mips/field.fth
   cpu/mips/filecode.fth
   cpu/mips/finish.fth
   cpu/mips/fixvoc.fth
   cpu/mips/float.fth
   cpu/mips/forthint.fth
   cpu/mips/ftrace.fth
   cpu/mips/getms.fth
   cpu/mips/initpgm.fth
   cpu/mips/installation.html
   cpu/mips/intctl.fth
   cpu/mips/irq.fth
   cpu/mips/kernboot.fth
   cpu/mips/kerncode.fth
   cpu/mips/kernel.bth
   cpu/mips/ksegaddr.fth
   cpu/mips/lmove.fth
   cpu/mips/loadmach.fth
   cpu/mips/machdep.fth
   cpu/mips/makeinflater.notes
   cpu/mips/metainit.fth
   cpu/mips/metarel.fth
   cpu/mips/objsup.fth
   cpu/mips/pause.fth
   cpu/mips/physaddr.fth
   cpu/mips/probemem.fth
   cpu/mips/r4000cp0.fth
   cpu/mips/regacc.fth
   cpu/mips/register.fth
   cpu/mips/resetjmp.bth
   cpu/mips/rootnode.fth
   cpu/mips/savefort.fth
   cpu/mips/savemeta.fth
   cpu/mips/startup.html
   cpu/mips/sys.fth
   cpu/mips/target.fth
   cpu/mips/testasm.fth
   cpu/mips/tickint.fth
   cpu/mips/tools.bth
   cpu/mips/traps.fth
   cpu/mips/unalign.fth
   cpu/mips/virtaddr.fth
   cpu/mips/zipcrc.fth
Log:
MIPS - checkin leaf files for MIPS



Added: cpu/mips/Linux/makefile
===================================================================
--- cpu/mips/Linux/makefile	                        (rev 0)
+++ cpu/mips/Linux/makefile	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,38 @@
+# Wrapper makefile for Unix: FreeBSD, Linux, etc.
+# Copyright 1997 FirmWorks. All rights reserved.
+#
+CC      = mipsel-linux-gnu-gcc-4.3
+
+CFLAGS  = -O -g -D__linux__ -DMIPS -DHOSTMIPS
+LFLAGS  = -Xlinker -static -static-libgcc
+
+WRDIR = ${BP}/forth/wrapper
+ZIPDIR = ${WRDIR}/zip
+
+ZIPOBJS = zipmem.o deflate.o trees.o bits.o util.o inflate.o
+
+OBJS = wrapper.o logger.o ${ZIPOBJS}
+
+all: forth
+
+wrapper.o: ${BP}/forth/wrapper/wrapper.c
+        ${CC} ${CFLAGS} -c ${BP}/forth/wrapper/wrapper.c
+
+%.o: ${WRDIR}/%.c
+        ${CC} -c ${CFLAGS} $< -o $@
+
+%.o: ${ZIPDIR}/%.c
+        ${CC} -c ${CFLAGS} -I${ZIPDIR} $< -o $@
+
+forth: ${OBJS}
+        ${CC} $(LFLAGS) -o $@ ${OBJS}
+
+clean:
+        @rm -f forth *.o
+
+install: forth
+        cp forth ${BP}/bin/mips/`uname|tr A-Z a-z`/forth
+        cp forth ${BP}/bin/mips/`uname|tr A-Z a-z`/mipsfth
+
+dist:
+        (cd ${BP}; zip /tmp/wrapper.zip os/unix/mips/makefile ${SRCS})

Added: cpu/mips/QEMU/forth
===================================================================
--- cpu/mips/QEMU/forth	                        (rev 0)
+++ cpu/mips/QEMU/forth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,2 @@
+#!/bin/sh
+qemu-mipsel ../Linux/mipsforth $@


Property changes on: cpu/mips/QEMU/forth
___________________________________________________________________
Added: svn:executable
   + *

Added: cpu/mips/QEMU/mipsfth
===================================================================
--- cpu/mips/QEMU/mipsfth	                        (rev 0)
+++ cpu/mips/QEMU/mipsfth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,2 @@
+#!/bin/sh
+qemu-mipsel ../Linux/mipsforth $@


Property changes on: cpu/mips/QEMU/mipsfth
___________________________________________________________________
Added: svn:executable
   + *

Added: cpu/mips/argv.fth
===================================================================
--- cpu/mips/argv.fth	                        (rev 0)
+++ cpu/mips/argv.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,105 @@
+\ See license at end of file
+purpose: Split a command string into an argv array
+
+\ argc,argv  ( command$ name$ -- argv argc )
+\  Places a pointer to a null-terminated representation of the "adr len"
+\  string "name$" in the first element of a pointer array whose base
+\  address is "argv".  Then parses the "adr len" string "command$" into
+\  constituent substrings, storing pointers to the null-terminated
+\  substrings in subsequent elements of the "argv" array.
+\  Returns the number of pointers in the array, including the pointer to
+\  name$, as "argc".  An extra null pointer (i.e. the number 0) is stored
+\  at the end of the array but is not included in the "argc" count.
+\
+\  The substrings are delimited by white space, except that
+\   a) If a backslash is encountered, it "quotes" the next character;
+\      if that character is whitespace, it does not delimit the
+\      substring.  To embed the \ character itself, double it.
+\   b) If the first character of a substring is either " or ', the
+\      substring continues until the next non-quoted occurence of
+\      that quote character.  (A " character can be embedded within
+\      a quoted string by preceding it with \ .)
+\  These quoting rules are intended to be similar to those of Unix shells.
+
+: skipwhite  ( adr len -- adr' len' )
+   begin  dup  while
+      over c@  bl >  if  exit  then
+      1 /string
+   repeat
+;
+
+: append-char  ( ptr adr len char -- ptr' adr len )
+   3 roll  tuck c!  1+  -rot
+;
+
+: collect-arg  ( ptr adr len delim -- ptr' adr' len' )
+   >r
+   begin  dup  while             ( ptr adr len )
+      over c@                    ( ptr adr len char )
+
+      \ Exit when delimiter found
+      \ If delim is < 0, then parse nonwhite characters.  Otherwise parse
+      \ with a specific delimiter.
+      dup  r@  dup  0<  if  drop bl <=  else  =  then  if
+         r> 2drop  1 /string  0 append-char  exit
+      then
+
+      dup  [char] \  =  if       ( ptr adr len char )
+         drop                    ( ptr adr len )
+         1 /string               ( ptr adr' len' )
+         dup 0=  if  0 append-char  r> drop  exit  then
+         over c@                 ( ptr adr len char )
+      then                       ( ptr adr len char )
+      append-char  1 /string     ( ptr' adr' len' )
+   repeat
+   r> drop
+;
+
+: add-arg  ( ptr adr len -- ptr' adr' len' )
+   dup 0=  if  exit  then
+
+   2 pick ,                             ( ptr adr len )
+   over c@   dup [char] " =
+   swap [char] ' =  or  if              ( ptr adr len )
+      1 /string  over 1- c@    collect-arg  ( ptr adr len )
+   else
+      -1 collect-arg
+   then
+;
+
+: argv,argc  ( command$ name$ -- argv argc )
+   align here >r          ( command$ name$ ) ( r: argv )
+   $cstr ,                ( command$ )
+   dup alloc-mem -rot     ( ptr  command$ )
+   begin  dup  while      ( ptr  command$ )
+      skipwhite           ( ptr  command$' )
+      add-arg             ( ptr' command$' )
+   repeat                 ( ptr  command$ )
+   3drop                  ( ) ( r: argv )
+   r>  here over - /n /   ( argv argc )
+   0 ,
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/asmtools.fth
===================================================================
--- cpu/mips/asmtools.fth	                        (rev 0)
+++ cpu/mips/asmtools.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,108 @@
+purpose: Tools for creating disembodied assembly code sequences
+\ See license at end of file
+
+[ifndef] set-transize
+fload ${BP}/forth/lib/transien.fth
+true is suppress-transient?	\ Disable transient definitions for now
+[then]
+
+\needs suppress-headerless?  fload ${BP}/fm/lib/headless.fth
+
+[ifndef] mips-assembler
+fload ${BP}/cpu/mips/assem.fth
+fload ${BP}/cpu/mips/code.fth
+fload ${BP}/forth/lib/loclabel.fth
+[then]
+
+\ The default is to assemble in the native endian-ness of the host system
+: assemble-little-endian  ( -- )
+   [ also mips-assembler ]
+   ['] le-l! is asm!
+   ['] le-l@ is asm@
+   [ previous ]
+;
+: assemble-big-endian  ( -- )
+   [ also mips-assembler ]
+   ['] be-l! is asm!
+   ['] be-l@ is asm@
+   [ previous ]
+;
+
+also forth definitions
+: c$,  ( adr len -- )
+   1+  here swap note-string dup allot move 4 (align)
+;
+previous definitions
+
+false value transient-labels?
+0 value asm-origin
+0 value asm-base
+: pad-to  ( n -- )
+   begin  dup  here asm-base -  asm-origin +   u>  while  0 c,  repeat  drop
+;
+: align-to  ( boundary -- )
+   here asm-base -  swap round-up  pad-to
+;
+
+[ifndef] enable-transient?
+: enable-transient  ( -- )
+   suppress-transient?  if
+      unused 4 /  d# 1000  set-transize
+      false is suppress-transient?
+      false is suppress-headerless?
+   then
+;
+[then]
+enable-transient
+
+: tconstant  ( value "name" -- )
+   transient? 0= dup >r  if  transient  then
+   constant
+   r> if  resident  then
+;
+: label  ( "name" -- )
+   transient-labels?  if
+      here  tconstant
+      [ also mips-assembler ] init-labels [ previous ]  !csp entercode
+   else
+      label
+   then
+;
+
+: set-asm-origin  ( -- )
+   here to asm-base
+   0 to asm-origin
+;
+
+0 0 2value old-asms
+: start-assembling  ( -- )
+   set-asm-origin
+   true to transient-labels?
+;
+: end-assembling  ( -- )
+   false to transient-labels?
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/assem.fth
===================================================================
--- cpu/mips/assem.fth	                        (rev 0)
+++ cpu/mips/assem.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,575 @@
+purpose: Forth Assembler for MIPS
+\ See license at end of file
+
+: set-relocation-bit  ;
+
+\ requires case.f
+\ alias l0< 0<
+\ alias l<> <>
+
+\ requires string-array.f
+
+vocabulary mips-assembler
+also mips-assembler definitions
+
+alias lor or	\ Because "or" gets redefined in the assembler
+
+defer here	\ For switching between resident and meta assembling
+defer asm-allot	\ For switching between resident and meta assembling
+defer asm@	\ For switching between resident and meta assembling
+defer asm!	\ For switching between resident and meta assembling
+
+\ Install as a resident assembler
+: resident  ( -- )
+   [ forth ] ['] here  [ mips-assembler ] is here
+   [ forth ] ['] allot [ mips-assembler ] is asm-allot
+   [ forth ] ['] @     [ mips-assembler ] is asm@
+   [ forth ] ['] n!    [ mips-assembler ] is asm!
+;
+resident
+
+decimal
+
+\ This is used for delay slot optimization.  This variable is set
+\ to the starting address of each code sequence, to the address following
+\ the delay slot of each branch instruction, and to the target address
+\ of forward branches.  If "next" notices that the value in delay-barrier
+\ is the same as "here", it won't move the previous instruction into
+\ its next's delay slot.
+nuser delay-barrier
+: block-delay  ( -- )  here la1+ delay-barrier !  ;
+: block-here   ( -- )  here delay-barrier !  ;
+
+h#     .ffff constant immedmask
+h#     .7fff constant maximmed
+h# ffff.8000 constant minimmed
+h#        1f constant regmask
+h# 1000.0000 constant regmagic
+
+\ Bias register constants outside the range of signed immediate values
+: reg  ( n -- )  regmagic +  ;
+: register  \ name  ( n -- )
+   create ,  does> @ reg
+;
+
+\ Register names; these just return constants.
+
+ 0 register $0   1 register $1   2 register $2   3 register $3
+ 4 register $4   5 register $5   6 register $6   7 register $7
+ 8 register $8   9 register $9  10 register $10 11 register $11
+12 register $12 13 register $13 14 register $14 15 register $15
+16 register $16 17 register $17 18 register $18 19 register $19
+20 register $20 21 register $21 22 register $22 23 register $23
+24 register $24 25 register $25 26 register $26 27 register $27
+28 register $28 29 register $29 30 register $30 31 register $31
+
+alias $at  $1
+alias $kt0 $26
+alias $kt1 $27
+alias $gp  $28
+alias $sp  $29
+alias $a0  $4
+alias $a1  $5
+alias $a2  $6
+alias $a3  $7
+alias ra  $31
+alias s0  $16
+alias s1  $17
+alias s2  $18
+alias s3  $19
+alias s4  $20
+alias s5  $21
+alias s6  $22
+alias s7  $23
+alias s8  $30
+alias t0  $8
+alias t1  $9
+alias t2  $10
+alias t3  $11
+alias t4  $12
+alias t5  $13
+alias t6  $14
+alias t7  $15
+alias t8  $24
+alias t9  $25
+alias k0  $26
+alias k1  $27
+alias v0  $2
+alias v1  $3
+
+32 register $f0   33 register $f1  34 register $f2   35 register $f3
+36 register $f4   37 register $f5  38 register $f6   39 register $f7
+40 register $f8   41 register $f9  42 register $f10  43 register $f11
+44 register $f12  45 register $f13 46 register $f14  47 register $f15
+48 register $f16  49 register $f17 50 register $f18  51 register $f19
+52 register $f20  53 register $f21 54 register $f22  55 register $f23
+56 register $f24  57 register $f25 58 register $f26  59 register $f27
+60 register $f28  61 register $f29 62 register $f30  63 register $f31
+
+\ Test operand values to see what kind of operand they are.
+
+: 16-bit?  ( n -- flag )   minimmed maximmed between  ;
+
+: ?freg  ( r -- r )
+   dup  $f0 $f30 between 0=  abort" Floating point register required"
+;
+
+: ?ireg  ( r -- r )
+   dup  $0 $31 between 0=  abort" Integer register required"
+;
+
+\ Words to encode operands into their appropriate fields
+
+: setbits  ( opcode -- )  here asm!  /l asm-allot  ;
+: opaddr  ( -- addr )  here /l - ;
+: addbits  ( bits -- )  opaddr asm@ +  opaddr asm!  ;
+: >regfld  ( reg shift -- bits )  swap regmask land  swap lshift  ;
+: regset  ( reg shift -- )  >regfld addbits  ;
+: rs   ( rs -- )  21 regset ;
+: rd   ( rd -- )  11 regset ;
+: rt   ( rt -- )  16 regset ;
+: sa   ( re -- )   6 regset ;
+
+: uimmed  ( value -- )  immedmask land  addbits  ;
+: immed  ( value -- )
+   dup 16-bit? 0= abort" Immediate operand doesn't fit in 16 bits"
+   uimmed
+;
+
+\ Set the opcode field
+: set-op  ( n -- )  d# 26 lshift  setbits  ;
+
+: special ( n -- )  0 set-op  addbits  ;
+: regimm  ( n -- )  1 set-op  rt  ;
+: special2 ( n -- )  34 set-op  addbits  ;
+
+\ Define the various opcodes according to their formats.
+octal
+
+: ld:  ( opcode -- )	\ Load instructions
+   create ,  does>  ( rs imm rt opc-adr -- )  @ set-op   rt immed rs
+;
+32 ld: ldl  33 ld: ldr
+40 ld: lb   41 ld: lh    42 ld: lwl   43 ld: lw
+44 ld: lbu  45 ld: lhu   46 ld: lwr   47 ld: lwu
+57 ld: cache
+60 ld: ll   61 ld: lwc1  62 ld: lwc2  63 ld: pref  \ pref is  rs imm hint
+64 ld: lld  65 ld: ldc1  66 ld: ldc2  67 ld: ld
+
+: st:  ( opcode -- )	\ Store instructions
+   create ,  does>  ( rt rs imm  opc-adr -- )  @ set-op   immed rs rt
+;
+50 st: sb  51 st: sh    52 st: swl  53 st: sw  54 st: sdl   55 st: sdr  56 st: swr
+70 st: sc  71 st: swc1  72 st: swc2            74 st: scd   75 st: sdc1
+76 st: sdc2  77 st: sd
+
+: 2op:  ( opcode -- )	\ Two-operand instructions (add, sub, etc)
+   create ,  does>  ( rs rt rd opc-adr -- )  @  special   rd rt rs
+;
+40 2op: add   41 2op: addu   42 2op: sub   43 2op: subu
+44 2op: and   45 2op: or     46 2op: xor   47 2op: nor
+52 2op: slt   53 2op: sltu
+54 2op: dadd  55 2op: daddu  56 2op: dsub  57 2op: dsubu
+
+: lui  ( imm rt -- )
+   o# 17 set-op rt
+   dup h# ffff > abort" Immediate operand doesn't fit in 16 bits"
+   addbits
+;
+: sethi  ( imm rt -- )  swap d# 16 >> swap lui  ;
+
+: li   ( n dst -- )
+   swap dup   h# ffff land  -rot          ( nlow dst n )
+   dup  0  h# ffff  between  if           ( nlow dst n )
+      drop  15 set-op  rt  $0 rs uimmed   \ dst nlow  dst  ori
+      exit
+   then                                   ( nlow dst n )
+
+   dup  h# ffff.8000  -1  between  if     ( nlow dst n )
+      drop  11 set-op  rt  $0 rs uimmed   \ $0 nlow  dst  addiu
+      exit
+   then                                   ( nlow dst n )
+
+   \ We have to use two instructions unless the low 16 bits are 0
+   d# 16 >>  over  lui                    ( nlow dst )
+   over  if
+      15 set-op  dup rt rs uimmed            \ dst nlow  dst  ori
+   else
+      2drop
+   then
+;      
+
+alias set li
+
+\ XXX we need to handle the case where immed is too big for 16 bits,
+\ loading $at in that case.
+: ?set-immed  ( rs imm rt op -- rs imm rt op )
+   2 pick  16-bit?  if  exit  then   ( rs imm rt op )
+   rot $at li                        ( rs rt op )
+   30 + special  rd  $at rt  rs
+   r> drop
+;   
+: ?set-uimmed  ( rs imm rt op -- rs imm rt op )
+   2 pick  h# 10000 u<  if  exit  then   ( rs imm rt op )
+   rot $at li                        ( rs rt op )
+   30 + special  rd  $at rt  rs
+   r> drop
+;   
+  
+: imm:  ( opcode -- )	\ Two-operand immediate instructions (addi, etc)
+   create ,  does>  ( rs imm rt opc-adr -- ) @  ?set-immed set-op  rt uimmed rs
+;
+10 imm: addi  11 imm: addiu  12 imm: slti  13 imm: sltiu
+30 imm: daddi 31 imm: daddiu
+
+: uimm:  ( opcode -- )	\ Two-operand immediate instructions (addi, etc)
+   create ,  does>  ( rs imm rt opc-adr -- ) @  ?set-uimmed set-op  rt uimmed rs
+;
+14 uimm: andi  15 uimm: ori    16 uimm: xori
+
+: jmpi:  ( opcode -- )	\ Jump absolute
+   create ,  does>  ( target opc-adr -- )  @  set-op
+   dup h# fc00.0000 land  here h# fc00.0000 land <>
+   abort" Jump target outside of current 28-bit bank"
+   2 >> h# 3ff.ffff land addbits
+   block-delay
+;
+02 jmpi: j  03 jmpi: jal
+
+: jr    ( rs -- )     o# 10 special  rs     block-delay  ;
+: jalr  ( rs rd -- )  o# 11 special  rd rs  block-delay  ;
+
+: shift:  ( opcode -- )	\ Shift instructions
+   create ,  does>  ( rt sa rd opc-adr -- )  @  special rd sa rt
+;
+00 shift: sll     02 shift: srl     03 shift: sra
+70 shift: dsll    72 shift: dsrl    73 shift: dsra
+74 shift: dsll32  76 shift: dsrl32  77 shift: dsra32
+: shiftv:  ( opcode -- )	\ Shift instructions
+   create ,  does>  ( rt rs rd opc-adr -- )  @  special rd rs rt
+;
+04 shiftv: sllv   06 shiftv: srlv   07 shiftv: srav
+24 shiftv: dsllv  26 shiftv: dsrlv  27 shiftv: dsrav
+
+: mul:  ( opcode -- )	\ Two-operand instructions with implicit destination
+   create ,  does>  ( rs rt opc-adr -- )  @  special  rt rs
+;
+31 mul: mult   31 mul: multu   32 mul: div   33 mul: divu
+34 mul: dmult  35 mul: dmultu  36 mul: ddiv  37 mul: ddivu
+60 mul: tge    61 mul: tgeu    62 mul: tlt   63 mul: tltu
+64 mul: teq    66 mul: tne
+
+: fhilo:  ( opcode -- )	\ HI and LO access
+   create ,  does>  ( rd opc-adr -- )  @  special  rd
+;
+: thilo:  ( opcode -- )	\ HI and LO access
+   create ,  does>  ( rd opc-adr -- )  @  special  rs
+;
+20 fhilo: mfhi  21 thilo: mthi  22 fhilo: mflo  23 thilo: mtlo
+
+: dset  ( d reg -- )
+   >r  r@ set  r@ 0 r@  dsll32  ( d.low )
+   dup 0< swap                  ( negative? d.low )
+   $at set                      ( negative? )
+\   [ also forth ]  if  [ previous ]
+if
+       $at 0 $at dsll32  $at 0 $at dsrl32  \ Zero high bits
+then
+\   [ also forth ]  then  [ previous ]
+   $at r@  r>  daddu
+;
+
+
+: >br-offset   ( target-adr br-adr -- offset )
+   4 + -                                                ( byte-offset )
+   2 >>a						( word-offset )
+   dup 16-bit? 0= abort" Branch offset doesn't fit in 16 bits"
+   immedmask land
+;
+: br-offset  ( adr -- )
+   opaddr >br-offset  addbits
+   block-delay
+;
+: br2:  ( opcode -- )	\ 2-operand conditional branches
+   create ,  does>  ( adr rs rt opc-adr -- )  @  set-op  rt rs br-offset
+;
+04 br2: beq  05 br2: bne  24 br2: beql  25 br2: bnel
+
+: br1:  ( opcode -- )	\ 1-operand conditional branches
+   create ,  does>  ( adr rs opc-adr -- )  @  set-op  rs br-offset
+;
+06 br1: blez  07 br1: bgtz  26 br1: blezl  27 br1: bgtzl
+
+: brx:  ( opcode -- )	\ 1-operand conditional branches (extensions)
+   create ,  does>  ( adr rs opc-adr -- )  @  regimm  rs br-offset
+;
+00 brx: bltz    01 brx: bgez    02 brx: bltzl    03 brx: bgezl
+20 brx: bltzal  21 brx: bgezal  22 brx: bltzall  23 brx: bgezall
+
+: bal  ( adr -- )  $0 bgezal  ;
+
+: cop0  ( -- )  o# 20 set-op  ;
+: cop1  ( -- )  o# 21 set-op  ;
+
+: brf0:  ( adr opcode -- )	\ Floating-point branches
+   create ,  does>  @ cop0  d# 16 << addbits  br-offset
+;
+: brf1:  ( adr opcode -- )	\ Floating-point branches
+   create ,  does>  @ cop1  d# 16 << addbits  br-offset
+;
+400 brf0: bc0f  402 brf0: bc0fl  401 brf0: bc0t  403 brf0: bc0tl
+400 brf1: bc1f  402 brf1: bc1fl  401 brf1: bc1t  403 brf1: bc1tl
+
+: trapi:  ( opcode -- )	\ Trap immediate
+   create ,  does>  ( rs imm opc-adr -- )  @  regimm  immed rs  block-here
+;
+10 trapi: tgei   11 trapi: tgeiu  12 trapi: tlti
+13 trapi: tltiu  14 trapi: teqi   16 trapi: tnei
+
+: syscall  ( -- )  14 special  block-here  ;
+: break    ( -- )  15 special  block-here  ;
+: sync     ( -- )  17 special  block-here  ;
+
+: dbreak  ( -- )  77 special2  block-here  ;
+: dret    ( -- )  76 special2  block-here  ;
+: mtdr    ( dbreg rt -- )  75 special2  4 rs rt rd  ;
+: mfdr    ( dbreg rt -- )  75 special2  0 rs rt rd  ;
+
+d# 16 constant single
+d# 17 constant double
+d# 19 constant fixed
+double value float-mode
+
+: set-cop  ( apf -- )  @ cop1  addbits float-mode rs  ;
+
+: fr2:  ( opcode -- )  \ 2-operand floating point computation instructions
+   create ,
+   does>  ( fs ft fd -- )  set-cop   ( fs ft fd )   sa rt rd
+;   
+00 fr2: addf    01 fr2: subf     02 fr2: mulf    03 fr2: divf
+
+: fr:  ( opcode -- )  \ 1-operand floating point computation instructions
+   create ,
+   does>  ( fs fd -- )  set-cop   ( fs fd )   sa 0 rt rd
+;   
+
+04 fr: sqrt     05 fr: abs      06 fr: movf    07 fr: negf
+14 fr: round.w  15 fr: trunc.w  16 fr: ceil.w  17 fr: floor.w
+40 fr: cvt.s    41 fr: cvt.d
+44 fr: cvt.w
+60 fr: cxx
+
+: fc:  ( opcode -- )  \ floating point comparison instructions
+   create ,
+   does>  ( ft fs -- )  set-cop   ( ft fs )   0 sa  rd  rt
+;   
+
+
+: fc1:  ( opcode -- )
+   create ,  does>  ( fs rt -- )  @ cop1  rs  rt rd
+;
+0 fc1: mfc1   2 fc1: cfc1   4 fc1: mtc1   6 fc1: ctc1
+
+: mfc0   ( cpreg rt -- )  cop0  0 rs  rt rd  ;
+: mtc0   ( cpreg rt -- )  cop0  4 rs  rt rd  ;
+: dmfc0  ( cpreg rt -- )  cop0  1 rs  rt rd  ;
+: dmtc0  ( cpreg rt -- )  cop0  5 rs  rt rd  ;
+: tlbp   ( -- )  cop0  h# 0200.0008 addbits  ;
+: tlbr   ( -- )  cop0  h# 0200.0001 addbits  ;
+: tlbwi  ( -- )  cop0  h# 0200.0002 addbits  ;
+: tlbwr  ( -- )  cop0  h# 0200.0006 addbits  ;
+: eret   ( -- )  cop0  h# 0200.0018 addbits  block-here  ;
+
+: fmt:  ( format-code -- )
+   \ Replace FMT field with correct format
+   create ,  does>  opaddr asm@  h# 03e0.0000 invert land  opaddr asm!  @ rs
+;
+d# 16 fmt: .s   d# 17 fmt: .d   d# 20 fmt: .w
+
+hex
+
+\ Standard assembler macros
+: nop  $0 0 $0 sll  ;
+
+: inhibit-delay   nop  ;
+
+: la  ( n dst -- )  swap set-relocation-bit swap li  ;
+\ : ulh
+\ : ulhu
+\ : ulw
+\ : ush
+\ : usw
+\ : abs
+\ : neg
+\ : negu
+\ : not
+\ : div
+\ : divu
+\ : mul
+\ : mulo
+\ : mulou
+\ : rem
+\ : remu
+\ : rol
+\ : seq
+\ : sle
+\ : sleu
+\ : sgt
+\ : sgtu
+\ : sge
+\ : sgeu
+\ : sne
+\ : bgt   ( adr imm src -- )
+\ : bge   ( adr imm src -- )
+\ : bgeu  ( adr imm src -- )
+\ : bgtu  ( adr imm src -- )
+\ : blt   ( adr imm src -- )
+\ : ble   ( adr imm src -- )
+\ : bleu  ( adr imm src -- )
+\ : bltu  ( adr imm src -- )
+\ : bal   ( adr -- )
+\ : move  ( src dst -- )
+
+\ XXX edited to here
+
+: asm-align  ( boundary -- )
+   1-  begin  dup here land  while  nop  repeat
+;
+
+\ Control transfer instructions
+
+hex
+: -cond  ( condition -- not-condition )
+   dup h# 1000.0000 land  if  h# 0400.0000  else  h# 0001.0000  then
+   [ forth ] xor [ mips-assembler ]
+;
+
+: brif  ( adr cond -- )  setbits br-offset  ;
+   
+\ 6 branch: brfif ( address reg condition -- )
+\ 7 branch: brcif ( address reg condition -- )
+: bra  ( adr -- )  $0 bgez  ;
+: branch!  ( target-adr branch-adr -- )
+   tuck >br-offset  h# 1000.0000 + swap asm!
+;
+: put-branch  ( target-adr branch-adr -- )  branch!  ;
+
+
+\ Structured conditionals
+
+: <mark  ( -- <mark )  here  ;
+: >mark  ( -- >mark )  here  ;
+: >resolve  ( >mark -- )
+   here over >br-offset over asm@ +  swap asm!
+   block-here
+;
+\ >+resolve is used when the resolution follows a branch, so the delay slot
+\ must be skipped  (block-delay is not needed, because the back branch did it)
+: >+resolve  ( >mark -- )
+   here la1+ over >br-offset over asm@ +  swap asm!
+;
+: <resolve  ( -- )  ;
+
+: but     ( mark1 mark2 -- mark2 mark1 )  swap  ;
+: yet     ( mark -- mark mark )  dup  ;
+
+: ahead   ( -- >mark )          >mark  here 4 +  bra  ;
+: if      ( cond -- >mark )     >mark  here 4 +  rot -cond  brif  ;
+: then    ( >mark -- )          >resolve  ;
+: else    ( >mark -- >mark1 )   ahead  but  >+resolve  ;
+: begin   ( -- <mark )          <mark  ;
+: until   ( <mark cond -- )     -cond brif  ;
+: again   ( <mark -- )          bra  ;
+: repeat  ( <mark >mark -- )    again  >+resolve  ;
+: while   ( <mark cond -- <mark >mark )  if  but  ;
+
+\ Define these last to delay overloading of the forth versions
+
+hex
+
+: +rs  ( rs template -- template' )  swap d# 21 >regfld lor  ;
+: +rt  ( rs template -- template' )  swap d# 16 >regfld lor  ;
+
+: =  ( rs rt -- cond )  1000.0000  +rt +rs  ;
+: <> ( rs rt -- cond )  1400.0000  +rt +rs  ;
+
+: 0<=  ( rs -- cond )  1800.0000 +rs  ;
+: 0>   ( rs -- cond )  1c00.0000 +rs  ;
+: 0<   ( rs -- cond )  0400.0000 +rs  ;
+: 0>=  ( rs -- cond )  0401.0000 +rs  ;
+
+
+\ \ Floating-point operations; these aren't needed for the kernel
+\ 
+\ : set-opf  ( opcode-adr -- )  34 2 set-op   @  5 l<<  addbits  ;
+\ : ffop  \ name  ( opcode -- )
+\   create ,
+\   does>  ( frs frd opc-adr -- )  set-opf  ?freg rd  ?freg rs2
+\ ;
+\ 0c9 ffop fstod   0cd ffop fstox
+\ 0c6 ffop fdtos   0ce ffop fdtox
+\ 0c7 ffop fxtos   0cb ffop fxtod
+\ 
+\ 001 ffop fmovs   005 ffop fnegs   009 ffop fabss
+\ 029 ffop fsqrts  02a ffop fsqrtd  02b ffop fsqrtx
+\ 
+\ 0c4 ffop fitos   0c8 ffop fitod   0cc ffop fitox
+\ 
+\ 0c1 ffop fstoir  0c2 ffop fdtoir  0c3 ffop fxtoir
+\ 0d1 ffop fstoi   0d2 ffop fdtoi   0d3 ffop fxtoi
+\ 
+\ : f2op  \ name  ( opcode -- )
+\   create ,
+\   does>  ( frs1 frs2 frd opc-adr -- )
+\   set-opf  ?freg rd  ?freg rs2  ?freg rs
+\ ;
+\ 041 f2op fadds   042 f2op faddd   043 f2op faddx
+\ 045 f2op fsubs   046 f2op fsubd   047 f2op fsubx
+\ 049 f2op fmuls   04a f2op fmuld   04b f2op fmulx
+\ 04d f2op fdivs   04e f2op fdivd   04f f2op fdivx
+\ 
+\ : fcmpop  \ name  ( opcode -- )
+\    create ,
+\    does>  ( frs1 frs2 opc-adr -- )
+\    set-opf  1 td 19 <<  addbits   ?freg rs2  ?freg rs
+\ ;
+\ 051 fcmpop fcmps   052 fcmpop fcmpd   053 fcmpop fcmpx
+\ 055 fcmpop fcmpes  056 fcmpop fcmped  057 fcmpop fcmpex
+
+previous definitions
+
+headers
+
+: fix-immed16  ( n adr -- )
+   tuck l@ h# ffff.0000 and or swap l!
+;
+
+: fix-set32  ( n adr -- )
+   >r lwsplit
+   r@ fix-immed16
+   r> /l + fix-immed16
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/assembler.html
===================================================================
--- cpu/mips/assembler.html	                        (rev 0)
+++ cpu/mips/assembler.html	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,895 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title>MIPS Assembler</title>
+      
+  <meta http-equiv="content-type"
+ content="text/html; charset=ISO-8859-1">
+   
+  <meta name="author" content="Mitch Bradley">
+</head>
+  <body>
+ 
+<h2>MIPS Assembler</h2>
+<br>
+<a href="#Introduction">Introduction</a><br>
+<a href="#Entering_Assembler_Mode">Entering Assembler Mode</a><br>
+<a href="#Basic_Syntax">Basic Syntax</a><br>
+<a href="#Register_names">Register Names</a><br>
+<a href="#Opcodes">Opcodes</a><br>
+<a href="#Structured_Conditionals">Structured Conditionals</a><br>
+<a href="#Local_Labels">Local Labels</a><br>
+<a href="#Directives">Directives</a> 
+<h3><a name="Introduction"></a>Introduction</h3>
+Open Firmware includes an assembler for the MIPS instruction set. &nbsp;The 
+same assembler is present in both the development compiler (builder) and
+the target system.<br>
+ <br>
+ The Open Firmware assembler is quite different from conventional MIPS assemblers.<br>
+ 
+<ul>
+   <li>Its syntax is postfix - the operands are specified before the opcode, 
+which makes it much easier to support assembler macros</li>
+   <li>It supports the opcodes that are actually present in the MIPS hardware 
+instruction set, plus a select few pseudo-ops that generate multiple instructions, 
+instead of synthesizing a whole suite of "instructions" that are not really 
+in the instruction set.</li>
+   <li>It supports structured conditional directives like <b>if .. else .. 
+then</b> and <b>begin .. until</b> so you rarely need to invent labels for 
+simple conditionals and loops.</li>
+   <li>It does not reorder the instruction stream to fill delay slots, nor 
+does it attempt to optimize the instruction stream for any particular MIPS 
+implementation's pipeline characteristics. What you write is what you get.</li>
+   <li>It does not generate or process standard object file formats containing 
+linkage information. Instead, it is intended to be used either for incremental 
+compilation of short "code words" that operate within the framework of Open 
+Firmware's Forth interpreter or for self-contained "dropin modules" that execute
+during the Open Firmware early startup sequence (typically to do things like
+configuring the memory controller).</li>
+  <li>It has only limited support for the floating point (coprocessor) instruction
+set. The basic floating point instructions are supported, but many of the
+elaborations are not.<br>
+  </li>
+ 
+</ul>
+ The net result is that the Open Firmware MIPS assembler is much smaller
+that conventional assemblers. The binary code is approximately 12K bytes,
+compared to over 2Mbytes for some versions of gas . It is small enough to
+leave the assembler resident in the target system, thus making it possible
+to create short assembly language test sequences at any time, without needing
+access to a development host. 
+<h3><a name="Entering_Assembler_Mode"></a>Entering Assembler Mode</h3>
+There are several different ways to enter assembler mode, depending on how
+the assembled code will be used.<br>
+<table cellpadding="2" cellspacing="2" border="1">
+  <tbody>
+    <tr>
+      <td valign="top"><b>code</b> <i>newname</i><br>
+&nbsp; <i>&nbsp;assembly code<br>
+      </i><i>&nbsp; &nbsp;...</i><br>
+      <b>c;</b><br>
+      </td>
+      <td valign="top"><b>code</b> creates (i.e. incrementally adds to the
+resident Forth dictionary) a new Forth word named <i>newname</i> and enters
+assembler mode so you can implement the new word in assembly language. <b>c;</b>
+assembles the appropriate instruction sequence to return control to the Forth
+execution engine and exits from assembler mode. You can then execute the
+new word by typing its name, as with any other Forth word. <br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"><b>label</b> <i>newname</i><br>
+&nbsp; &nbsp;<i>assembly code</i><br>
+&nbsp; &nbsp;...<br>
+      <b>end-code</b><br>
+      </td>
+      <td valign="top"><b>label</b> creates a new Forth word named <i>newname</i>
+and enters assembler mode so you can assemble some machine instructions that
+will be used within the context of the current Forth dictionary, but that
+will not be called directly as a Forth word. <b>end-code</b> exits from assembler
+mode. Later execution of <i>newname</i> pushes on the Forth stack the beginning
+address of that sequence of machine instructions. <b>label</b> is typically
+used to create instruction sequences, for example interrupt handlers, that
+will be executed in a context other than from the Forth virtual machine.<br>
+      <br>
+It is also possible to mix the constructs: &nbsp;<b>code</b> <i>newname</i>
+... <b>end-code</b> creates a Forth word that can be executed by typing its
+name, but that will not return to Forth. &nbsp;<b>label</b> <i>newname</i>
+... <b>c;</b> creates a code sequence that could be entered from elsewhere
+(e.g. from an exception hander), but which would enter Forth when it was
+done.<br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"><b>start-assembling</b><br>
+&nbsp; &nbsp;<i>assembly code</i><br>
+&nbsp; &nbsp;...<br>
+      <b>end-assembling</b><br>
+      </td>
+      <td valign="top"><b>start-assembling .. end-assembling</b> &nbsp;is
+uses to create a block of code that will later be written out to a file (often
+in the form of a "dropin module") for use in a target system environment.
+See <a href="#Directives">Directives.</a><br>
+      </td>
+    </tr>
+  </tbody>
+</table>
+<h3><a name="Basic_Syntax"></a>Basic Syntax</h3>
+The assembler is really just a Forth vocabulary containing Forth words that
+put MIPS machine instructions in memory when they are executed.<br>
+The basic syntax of the Open Firmware MIPS assembler is postfix, just like
+ordinary Forth code. &nbsp;You first execute Forth words to push items on
+the stack - those items typically identify registers, numbers, or addresses, 
+i.e. the operands. Then you execute a word that names the opcode, which assembles 
+the machine instruction corresponding to that opcode with those operands.<br>
+ <br>
+ The order of the operands is generally source first, then destination.<br>
+ <br>
+ Example:<br>
+ <br>
+ &nbsp; v0 20 &nbsp; t3 &nbsp; ld<br>
+ <br>
+ This is equivalent to "ld &nbsp; $t3,20($v0)" &nbsp;in conventional syntax.<br>
+<br>
+When the assembler is active, the vocabulary containing the MIPS opcode and
+operand words is first in the search order, but the "forth" vocabulary containing
+all the other Forth tools is also in the search order, so you can execute
+ordinary Forth commands while assembling MIPS code. This is useful for things
+like including other files (by using the "fload" command) and calculating
+the values of numeric constants.<br>
+ 
+<h3><a name="Register_names"></a>Register names</h3>
+ Executing the name of a MIPS register pushes on the stack a number that
+identifies that register. The register names are:<br>
+ <br>
+<b> $0</b> .. <b>$31</b> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Basic
+names for the 32 integer registers<br>
+<b> $f0</b> .. <b>$f31</b> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Basic names
+for the 32 floating point registers<br>
+ <br>
+<b> v0</b> .. <b>v1</b><br>
+<b> k0</b> .. <b>k1</b><br>
+<b> t0</b> .. <b>t9</b><br>
+<b> s0</b> .. <b>s8</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
+<b> $a0</b> .. <b>$a3</b><br>
+<b> $sp&nbsp; $gp &nbsp;ra &nbsp;$at</b><br>
+<b> $kt0</b> .. <b>$kt1</b><br>
+<blockquote>Aliases for certain integer registers, reflecting their conventional
+use by MIPS compilers.<br>
+</blockquote>
+ <b>sp rp up ip np base tos w</b><br>
+<blockquote>Aliases for certain integer registers, reflecting their use within
+the Forth virtual machine.<br>
+sp = $sp , rp=s6 , up=s3 , ip=s5, np=s1 , base=s2, tos=s4, w=t0<br>
+</blockquote>
+The inconsistent naming (some alias names begin with $ and some don't) is
+historical accident - in part it is due to the fact that the names a0, a1,
+a2, and a3 conflict with hex numbers.<br>
+ 
+<h3><a name="Opcodes"></a>Opcodes</h3>
+ rs - A register (in load and store instructions, this register is the one 
+that <br>
+ rt -&nbsp; A register (in load and store instructions, this register is
+the one that receives or supplies the data)<br>
+ imm - immediate operand<br>
+ <br>
+ 
+<table cellpadding="2" cellspacing="2" border="1">
+   <tbody>
+     <tr>
+       <th valign="top">Opcodes<br>
+       </th>
+       <th valign="top" nowrap="true">Stack Operands<br>
+       </th>
+       <th valign="top">Comments<br>
+       </th>
+     </tr>
+     <tr>
+       <td valign="top">ldl, ldr, lb, lh, lwl, lw, lbu, lhu, lwr, lwu, cache, 
+ll, lwc1, lwc2, pref, lld, ldc1, ldc2, ld<br>
+       </td>
+       <td valign="top" nowrap="true">( rs imm rt -- )<br>
+       </td>
+       <td valign="top">Load instructions - rt receives the data<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">sb, sh, swl, sw, sdl, sdr, swr, sc, swc1, swc2, scd, 
+sdc1, sdc2, sd<br>
+       </td>
+       <td valign="top" nowrap="true">( rt rs imm -- )<br>
+       </td>
+       <td valign="top">Store instructions - rt supplies the data<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">add, addu, sub, subu, and, or, xor, nor, slt, sltu, 
+dadd, daddu, dsub, dsubu<br>
+       </td>
+       <td valign="top" nowrap="true">( rs rt rd -- )<br>
+       </td>
+       <td valign="top">Two-operand instructions - &nbsp;rs OP rd -&gt; rd<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">lui<br>
+       </td>
+       <td valign="top" nowrap="true">( imm rt -- )<br>
+       </td>
+       <td valign="top">Load upper immediate - (imm &lt;&lt; 16) -&gt; rt<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">sethi<br>
+       </td>
+       <td valign="top" nowrap="true">( imm1 rt -- )<br>
+       </td>
+       <td valign="top">Alternative form of lui - you specify the actual
+immediate value that you want to appear in the register. E.g. h# 0f450000
+$a2 sethi<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">addi, addiu, slti, sltiu, daddi, daddiu, andi, ori, 
+xori<br>
+       </td>
+       <td valign="top" nowrap="true">( rs imm rt -- )<br>
+       </td>
+       <td valign="top">Two-operand immediate instructions - rs OP imm -&gt; 
+rt<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">j, jal<br>
+       </td>
+       <td valign="top" nowrap="true">( adr -- )<br>
+       </td>
+       <td valign="top">Jump/Jump and link to target address adr<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">sll, srl, sra, dsll, dsrl, dsra, dsll32, dsrl32,
+dsra32<br>
+       </td>
+       <td valign="top" nowrap="true">( rt imm rd -- )<br>
+       </td>
+       <td valign="top">Shift instructions - rt SHIFT imm -&gt; rd<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">sllv, srlv, srav, dsllv, dsrlv, dsrav<br>
+       </td>
+       <td valign="top" nowrap="true">( rt rs rd -- )<br>
+       </td>
+       <td valign="top">Variable shift instructions - rt SHIFT rs -&gt; rd<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">mult, multu, div, divu, dmult, dmultu, ddiv, ddivu, 
+tge, tgeu, tlt, tltu, teq, tne<br>
+       </td>
+       <td valign="top" nowrap="true">( rs rt -- )<br>
+       </td>
+       <td valign="top">Two-operand instructions with implicit destination 
+register<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">mfhi, mthi, mflo, mtlo<br>
+       </td>
+       <td valign="top" nowrap="true">( rd -- )<br>
+       </td>
+       <td valign="top">Access to HI and LO registers. &nbsp;rd is the source 
+of destination as appropriate.<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">beq, bne, beql, bnel<br>
+       </td>
+       <td valign="top" nowrap="true">( adr rs rt -- )<br>
+       </td>
+       <td valign="top">Two-operand conditional branches - branch to address 
+'adr' if rs COND rt<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">blez, bgtz, blezl, bgtzl, bltz, bgez, bltzl, bgezl, 
+bltzal, bgezal, bltzall, bgezall<br>
+       </td>
+       <td valign="top">( adr rs -- )<br>
+       </td>
+       <td valign="top">One operand conditional branches - branch to address 
+'adr' if COND(rs)<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">bra, bal</td>
+       <td valign="top">( adr -- )<br>
+       </td>
+       <td valign="top">Branch, branch and link (the former is a special
+case of a conditional branch)<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">bc0f, bc0fl, bc0t, bc0tl, bc1f, bc1fl, bc1t, bc1tl<br>
+       </td>
+       <td valign="top">( adr -- )<br>
+       </td>
+       <td valign="top">Coprocessor branches<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">tgei, tgeiu, tlti, tltiu, teqi, tnei<br>
+       </td>
+       <td valign="top">( rs imm -- )<br>
+       </td>
+       <td valign="top">Trap immediate - trap if rs COND imm<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">syscall, break, sync, dbreak<br>
+       </td>
+       <td valign="top">( -- )<br>
+       </td>
+       <td valign="top">Zero-operand instructions<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">mtdr, mfdr<br>
+       </td>
+       <td valign="top">( dbreg rt -)<br>
+       </td>
+       <td valign="top">Access to debug registers<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">single, double, float<br>
+       </td>
+       <td valign="top">( -- )<br>
+       </td>
+       <td valign="top">Set the mode for subsequent floating point instructions<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">addf, subf, mulf, divf<br>
+       </td>
+       <td valign="top">( fs ft fd -- )<br>
+       </td>
+       <td valign="top">Two-operand floating point instructions - fs OP ft 
+-&gt; fd<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">sqrt, abs, movf, negf, round.w, trunc.w, ceil.w,
+floor.w, cvt.s, cvt.d, cvt.w, cxx<br>
+       </td>
+       <td valign="top">( fs fd -- )<br>
+       </td>
+       <td valign="top">One-operand floating point instructions - OP(fs)
+-&gt; fd<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">mfc1, cfc1, mtc1, ctc1<br>
+       </td>
+       <td valign="top">( fs rt -- )<br>
+       </td>
+       <td valign="top">Floating-point coprocessor-register to integer-register 
+instructions<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">mfc0, mtc0, dmfc0, dmtc0<br>
+       </td>
+       <td valign="top">( cpreg rt -- )<br>
+       </td>
+       <td valign="top">System coprocessor-register to integer-register instructions<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">tlbp, tlbr, tlbwi, tlbwr,eret<br>
+       </td>
+       <td valign="top">( -- )<br>
+       </td>
+       <td valign="top">TLB and exception instructions<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">.s, .d, .w<br>
+       </td>
+       <td valign="top">( -- )<br>
+       </td>
+       <td valign="top">Floating point formats<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">dset<br>
+       </td>
+       <td valign="top" nowrap="true">( low high reg -- )<br>
+       </td>
+       <td valign="top">Assemble code to put the 64-bit number low, high
+into the register<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">li, set<br>
+       </td>
+       <td valign="top" nowrap="true">( n reg -- )<br>
+       </td>
+       <td valign="top">Assemble code to put the 32-bit number n into the 
+register (li and set are equivalent)<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">la<br>
+       </td>
+       <td valign="top">( adr dst -- )<br>
+       </td>
+       <td valign="top">Like li but sets a relocation bit for the Forth dictionary 
+file.<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">brif<br>
+       </td>
+       <td valign="top">( adr cond -- )<br>
+       </td>
+       <td valign="top">Assemble a branch from a conditional constructor
+(see below)<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">=, &lt;&gt;<br>
+       </td>
+       <td valign="top">( rs rt -- cond )<br>
+       </td>
+       <td valign="top">Constructor for two-operand structured conditionals 
+- rs COND rt<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top">0&lt;=, 0&gt;, 0&lt;, 0&gt;=<br>
+       </td>
+       <td valign="top">( rs -- cond )<br>
+       </td>
+       <td valign="top">Constructor for one-operand structured conditionals 
+- COND(rs)<br>
+       </td>
+     </tr>
+   
+  </tbody> 
+</table>
+ 
+<h3><a name="Structured_Conditionals"></a>Structured Conditionals</h3>
+The MIPS assembler includes macros for constructing common flow control structures
+without having to make up label names. The structures shown below can be
+nested to arbitrary depth.<br>
+The easiest way to deal with branch delay slots is just to fill them with
+nop's.<br>
+In the following examples, the delay-slot instructions are indented the same
+as the code <i>preceding</i> their branch instruction, to emphasize that
+the delay instruction is logically a part of the preceding code flow. <br>
+<br>
+ 
+<table cellpadding="2" cellspacing="2" border="1">
+   <tbody>
+     <tr>
+       <th valign="top" nowrap="true">Usage Form<br>
+       </th>
+       <th valign="top" nowrap="true">Example<br>
+       </th>
+       <th valign="top" nowrap="true">Equivalent Code<br>
+(in noreorder mode) &nbsp; <br>
+       </th>
+      <th valign="top">Comments<br>
+      </th>
+     </tr>
+     <tr>
+       <td valign="top" nowrap="true"><i>cond</i> if &nbsp;.. &nbsp;then<br>
+       </td>
+       <td valign="top" nowrap="true"><tt>t3 t4 &lt;&gt; if<br>
+nop &nbsp; &nbsp; &nbsp; &nbsp;\ Delay<br>
+&nbsp; &nbsp;t3 1 &nbsp;t3 &nbsp;addiu<br>
+then</tt><br>
+       </td>
+       <td valign="top" nowrap="true"><tt>&nbsp; &nbsp;beq &nbsp; &nbsp;t3,t4,1f<br>
+&nbsp; &nbsp;nop<br>
+&nbsp; &nbsp;addiu &nbsp;t3,1,t3<br>
+1:</tt><br>
+       </td>
+      <td valign="top">1) The conditional in this case is "t3 t4 &lt;&gt;",
+i.e not equal, which takes two register operands.<br>
+2) Note the &nbsp;branch delay slot after the "if"<br>
+3) There is no delay slot after "then" because it just marks the target of
+a forward branch.<br>
+      </td>
+     </tr>
+     <tr>
+       <td valign="top" nowrap="true"><i>cond</i> &nbsp;if &nbsp;.. &nbsp;else
+&nbsp;.. then<br>
+       </td>
+       <td valign="top" nowrap="true"><tt>t2 0&gt; &nbsp;if<br>
+$7 0 &nbsp; $4 &nbsp; lw &nbsp;\ Delay<br>
+&nbsp; &nbsp;sp -4 &nbsp;sp &nbsp; addiu<br>
+&nbsp; &nbsp;$a1 &nbsp; &nbsp;$a3 &nbsp;mult<br>
+else<br>
+&nbsp; &nbsp;$3 $4 &nbsp;$5 &nbsp; add \ Delay<br>
+      <br>
+&nbsp; &nbsp;$7 4 &nbsp; $4 &nbsp; lw<br>
+then<br>
+&nbsp; </tt><br>
+       </td>
+       <td valign="top" nowrap="true"><tt>&nbsp;&nbsp; blez &nbsp; t2,1f<br>
+&nbsp;&nbsp; lw &nbsp; &nbsp; $4,0($7)<br>
+&nbsp; &nbsp;addiu &nbsp;$sp,$sp,4<br>
+&nbsp; &nbsp;mult &nbsp; $a1,$a3<br>
+&nbsp;&nbsp; b &nbsp; &nbsp;&nbsp; 2f<br>
+&nbsp;&nbsp; add &nbsp;&nbsp; $3,$4,$5<br>
+1:<br>
+&nbsp;&nbsp; lw &nbsp; &nbsp; $4,4($7)<br>
+2:</tt><br>
+       </td>
+      <td valign="top">1) The conditional in this case is "t2 0&gt;", i.e.
+t2 greater than zero.<br>
+2) Note the branch delay slots after "if" and "else", because of the implicit
+branch around the else clause.<br>
+      </td>
+     </tr>
+     <tr>
+       <td valign="top" nowrap="true">begin .. again<br>
+       </td>
+       <td valign="top" nowrap="true"><tt>begin<br>
+again<br>
+&nbsp; &nbsp;t3 0 t4 lw &nbsp;\ Delay</tt>&nbsp;<br>
+       </td>
+       <td valign="top" nowrap="true"><tt>1:<br>
+&nbsp; &nbsp;beq &nbsp;&nbsp; $0,$0,1b<br>
+&nbsp; &nbsp;lw &nbsp; &nbsp; $t4,0($t4)</tt><br>
+       </td>
+      <td valign="top">1) In this infinite-loop example, there are no other
+instructions between "begin" and "again". The important work is done in the
+delay slot after the unconditional branch that "again" generates. It is of
+course possible to put instructions between "begin" and "again"<br>
+2) Note that there is no delay slot after "begin", because "begin" does not
+generate a branch instruction; it marks the target of a backward branch.<br>
+      </td>
+     </tr>
+     <tr>
+       <td valign="top" nowrap="true">begin .. <i>cond</i> until<br>
+       </td>
+       <td valign="top" nowrap="true"><tt>begin<br>
+&nbsp; &nbsp;s0 &nbsp;s1 &nbsp;s1 &nbsp; add<br>
+&nbsp; &nbsp;t3 &nbsp;t4 &nbsp;t5 &nbsp; add<br>
+t5 t6 = &nbsp;until<br>
+&nbsp; &nbsp;nop &nbsp;\ Delay</tt><br>
+       </td>
+       <td valign="top" nowrap="true"><tt>1:<br>
+&nbsp;&nbsp; add &nbsp;$s1,$s0,$s1<br>
+&nbsp;&nbsp; add &nbsp;$t5,$t3,$t4<br>
+&nbsp;&nbsp; bne &nbsp;$t5,$t6,1b<br>
+&nbsp;&nbsp; nop</tt><br>
+       </td>
+      <td valign="top">1) "until" generates a conditional backward branch,
+so it has a delay slot<br>
+2) "\ Delay" is just a comment to remind you what is happening. It does not
+affect the code that is generated.<br>
+      </td>
+     </tr>
+     <tr>
+       <td valign="top" nowrap="true">begin ..<br>
+      <i>cond</i> while ...<br>
+repeat<br>
+       </td>
+       <td valign="top" nowrap="true"><tt>begin<br>
+&nbsp; &nbsp;$a0 8 &nbsp;$a1 &nbsp;lw<br>
+$a1 $0 &lt;&gt; while<br>
+&nbsp; &nbsp;nop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \ Delay<br>
+&nbsp; &nbsp;$a0 4 &nbsp;$a0 &nbsp;lw<br>
+repeat &nbsp;nop &nbsp; &nbsp; &nbsp; &nbsp;\ Delay<br>
+&nbsp;</tt> <br>
+       </td>
+       <td valign="top" nowrap="true"><tt>1:<br>
+&nbsp; &nbsp;lw &nbsp; $a1,8($a0)<br>
+&nbsp;&nbsp; beq &nbsp;$a1,$0, 2f<br>
+&nbsp; &nbsp;nop<br>
+&nbsp; &nbsp;lw &nbsp; $a0,4($a0)<br>
+&nbsp; &nbsp;beq &nbsp;$0,$0,1b<br>
+&nbsp; &nbsp;nop<br>
+2:</tt><br>
+       </td>
+      <td valign="top">1) "while" generates a conditional forward branch
+past the <br>
+"repeat", so it has a delay slot<br>
+2) "repeat" generates a conditional backward branch to <br>
+"begin", so it has a delay slot<br>
+3) Note that the delay instruction can be on the same line as the "repeat"
+if you wish. This is generally true; since the assembler syntax is postfix
+without any need for "lookahead", line boundaries are irrelevant. You can
+put multiple opcodes on one line if you wish.<br>
+      </td>
+     </tr>
+     <tr>
+      <td valign="top">ahead .. then<br>
+      </td>
+      <td valign="top"><tt>ahead<br>
+nop &nbsp;\ Delay<br>
+&nbsp;&nbsp; 12345 ,<br>
+&nbsp;&nbsp; 6789 ,<br>
+&nbsp;&nbsp; 3 , <br>
+then</tt><br>
+      </td>
+      <td valign="top"><tt>&nbsp; &nbsp;beq &nbsp;$0,$0, 1f<br>
+&nbsp; &nbsp;nop<br>
+&nbsp; &nbsp;.word &nbsp;12345<br>
+&nbsp; &nbsp;.word &nbsp;6786<br>
+&nbsp; &nbsp;.word &nbsp;3<br>
+1:</tt><br>
+      </td>
+      <td valign="top">1) "ahead" generates an unconditional forward branch
+to "then". It has a delay slot.<br>
+2) In this example we are using it to skip some data that we have placed
+in-line.<br>
+3) The most common use of unconditional forward branches is subsumed by the
+"if .. else .. then" construct, so "ahead" is rarely used.<br>
+      </td>
+    </tr>
+    <tr>
+       <td valign="top" nowrap="true">ahead .. but then<br>
+       </td>
+       <td valign="top" nowrap="true"><tt>ahead<br>
+t0 0 &nbsp; t1 &nbsp;lw &nbsp;\ Delay<br>
+begin<br>
+&nbsp; &nbsp;t0 4 &nbsp; t2 &nbsp;lw<br>
+&nbsp; &nbsp;t2 t3 &nbsp;t3 &nbsp;add<br>
+but then<br>
+t1 $0 = &nbsp;until<br>
+&nbsp; &nbsp;t1 -1 &nbsp;t1 &nbsp;addiu \ Delay<br>
+      <br>
+&nbsp; &nbsp; </tt><br>
+       </td>
+       <td valign="top" nowrap="true"><tt>&nbsp;&nbsp; beq &nbsp;$0,$0,1f<br>
+&nbsp;&nbsp; lw &nbsp;&nbsp; $t1,0($t0)<br>
+2:<br>
+&nbsp;&nbsp; lw &nbsp; &nbsp;$t2,4($t0)<br>
+&nbsp;&nbsp; add &nbsp; $t3,$t2,$t3<br>
+1:<br>
+&nbsp;&nbsp; bne &nbsp; $t1,$0,2b<br>
+&nbsp;&nbsp; addiu $t1,$t1,-1</tt><br>
+       </td>
+      <td valign="top">This is an advanced usage in which two conditional
+constructs ("begin .. until" and&nbsp; "ahead .. then") are not properly
+nested. The intention here is to start the loop execution at the test condition
+at the end. "ahead .. then" is used to branch forward to the test condition.
+The "but" rearranges the assembler's control flow stack so that "then" can
+resolve "ahead" without being confused by the intervening "begin".<br>
+      </td>
+     </tr>
+     <tr>
+       <td valign="top" nowrap="true">begin ..<br>
+&nbsp; &nbsp; <i>cond</i> if .. then<br>
+      <i>cond</i> until<br>
+       </td>
+       <td valign="top" nowrap="true"><tt>begin<br>
+&nbsp; &nbsp;t0 8 &nbsp; t1 &nbsp;lw<br>
+&nbsp; &nbsp;t1 t2 &lt;&gt; &nbsp;if<br>
+&nbsp; &nbsp;nop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \ Delay<br>
+&nbsp; &nbsp; &nbsp; t1 t3 &nbsp;t3 &nbsp;add<br>
+&nbsp; &nbsp;then<br>
+&nbsp; &nbsp;t1 -5 &nbsp;t1 &nbsp;addiu<br>
+t1 0&lt; until<br>
+&nbsp; &nbsp;nop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \ Delay&nbsp; &nbsp;</tt>
+      <br>
+       </td>
+       <td valign="top" nowrap="true"><tt>1:<br>
+&nbsp; &nbsp;lw &nbsp; &nbsp;$t1,8($t0)<br>
+&nbsp; &nbsp;beq &nbsp; $t1,$t2,2f<br>
+&nbsp; &nbsp;nop<br>
+&nbsp; &nbsp;add &nbsp; $t3,$t1,$t3<br>
+2:<br>
+&nbsp; &nbsp;addiu $t1,$t1,-5<br>
+&nbsp; &nbsp;bgez &nbsp;t1,1b<br>
+&nbsp; &nbsp;nop</tt><br>
+       </td>
+      <td valign="top">This is a straightforward example of well-nested control
+structures.<br>
+      <br>
+Note the use of indentation to show the scope of the control flow. Especially
+note how the delay slots are indented the same as the code <i>preceding</i>
+the branch.<br>
+      </td>
+     </tr>
+        
+  </tbody> 
+</table>
+  
+<h3><a name="Local_Labels"></a>Local Labels</h3>
+ Local (numbered) labels can be used in conjunction with branch instructions 
+to create control flows that can't easily be represented with the structured 
+conditionals. These are rarely needed, since the structured conditionals
+cover the most common cases, and your code will be easier to understand if
+you can express it in terms of those structures.<br>
+ <br>
+ 
+<table cellpadding="2" cellspacing="2" border="1">
+   <tbody>
+     <tr>
+       <th valign="top">Command<br>
+       </th>
+       <th valign="top">Stack Effect<br>
+       </th>
+       <th valign="top">Description<br>
+       </th>
+     </tr>
+     <tr>
+       <td valign="top"><b>l:</b><br>
+       </td>
+       <td valign="top">( label# -- )<br>
+       </td>
+       <td valign="top">(ell-colon) Create a local label with the given number<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top"><b>f:</b><br>
+       </td>
+       <td valign="top">( label# -- adr )<br>
+       </td>
+       <td valign="top">Return the address of the next occurrence of the
+given local label in the forward direction<br>
+       </td>
+     </tr>
+     <tr>
+       <td valign="top"><b>b:</b><br>
+       </td>
+       <td valign="top">( label# -- adr )<br>
+       </td>
+       <td valign="top">Return the address of the next occurrence of the
+given local label in the backward direction<br>
+       </td>
+     </tr>
+   
+  </tbody> 
+</table>
+ 
+<h3><a name="Directives"></a>Directives</h3>
+These assembler directives are primarily used to create assembly-language
+"dropin modules" that execute on target machines before the Forth execution
+environment has been set up.<br>
+<br>
+<table cellpadding="2" cellspacing="2" border="1">
+  <tbody>
+    <tr>
+      <th valign="top">Directive<br>
+      </th>
+      <th valign="top" nowrap="true">Stack</th>
+      <th valign="top">Description<br>
+      </th>
+    </tr>
+    <tr>
+      <td valign="top"><b> start-assembling</b><br>
+      </td>
+      <td valign="top" nowrap="true">( -- )<br>
+      </td>
+      <td valign="top">Set <b>asm-base</b> to the current address within
+Forth data space, thus marking that address as the start of memory that will
+later be written to a file.&nbsp; Set <b>asm-origin</b> to 0. Arrange for
+the names of any subsequent labels to be stored in a separate memory space.
+      <br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"><b> end-assembling</b><br>
+      </td>
+      <td valign="top" nowrap="true">( -- )<br>
+      </td>
+      <td valign="top">Restore labels to their default behavior (i.e. label
+names will subsequently be stored in-line in Forth data space rather than
+in a separate area).<br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"><b> label</b> <i>newname</i><br>
+      </td>
+      <td valign="top" nowrap="true">( -- )<br>
+      </td>
+      <td valign="top">Mark the current location in Forth data space so that
+later execution of <i>newname</i> will return that address. When executed
+within the context of <b>start-assembling .. end-assembling</b> , the label
+name will be stored in a separate memory area outside of the Forth data space
+(normally, in a Forth dictionary context, the Forth data space consists of
+interspersed names and data).<br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"><b>asm-origin</b><b> </b><br>
+      </td>
+      <td valign="top" nowrap="true">( -- <i>adr</i> )<br>
+      </td>
+      <td valign="top">A Forth <b>value </b>that contains the address within
+the target machine's address space that corresponds to the beginning of the
+memory marked by <b>start-assembling</b> .The default value, set by <b>start-assembling</b>,
+is 0, but it can be changed to an arbitrary value <i>n</i> by executing "<i>n</i>
+      <b>&nbsp;to &nbsp;asm-origin</b>" . <br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"><b>asm-base</b><b> </b><br>
+      </td>
+      <td valign="top" nowrap="true">( -- adr )<br>
+      </td>
+      <td valign="top">A Forth value that contains the start address within
+the host machines address space of the beginning of the memory marked by
+      <b>start-assembling</b> .<br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"> <b>pad-to</b><br>
+      </td>
+      <td valign="top" nowrap="true">( <i>adr</i> -- )<br>
+      </td>
+      <td valign="top">Add 0x0 bytes to memory until the current address
+within the target machine's address space is <i>adr</i>. Specifically, (
+      <b>here</b> - <b>asm-origin</b> ) = ( <b>adr</b> - <b>asm-origin</b>
+) when pad-to completes. Aborts if the current address is already above <i>adr</i>
+. <br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"> <b>align-to</b><br>
+      </td>
+      <td valign="top" nowrap="true">( <i>n</i> -- )<br>
+      </td>
+      <td valign="top">Add 0x0 bytes to memory until the current address
+within the target machine's address space is a multiple of <i>n</i> <br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"> <b>assemble-little-endian</b><br>
+      </td>
+      <td valign="top" nowrap="true">( -- )<br>
+      </td>
+      <td valign="top">Configure the MIPS assembler to generate code in little-endian
+byte order. &nbsp;The default is the byte order of the host system.<br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"> <b>assemble-big-endian</b><br>
+      </td>
+      <td valign="top" nowrap="true">( -- )<br>
+      </td>
+      <td valign="top">Configure the MIPS assembler to generate code in little-endian
+byte order. &nbsp;The default is the byte order of the host system.<br>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top"><b> c$,</b><br>
+      </td>
+      <td valign="top" nowrap="true">( adr len -- )<br>
+      </td>
+      <td valign="top">Place the bytes from the range <i>adr len</i> into
+memory, followed by a null terminator byte (which need not be present in
+the source range) and sufficient padding for four-byte alignment. This is
+primarily used within the "reset" module to place the names of other dropin
+modules in-line within the code.<br>
+      </td>
+    </tr>
+  </tbody>
+</table>
+.<br>
+ <br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+ <br>
+ <br>
+ <br>
+ <br>
+</body>
+</html>

Added: cpu/mips/atlas/build/makerom
===================================================================
--- cpu/mips/atlas/build/makerom	                        (rev 0)
+++ cpu/mips/atlas/build/makerom	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,4 @@
+#!/bin/sh
+build rom
+echo Converting to ELF format
+./bintoelf -a 0x80200000 -p 8 -l <rom.img >rom.elf


Property changes on: cpu/mips/atlas/build/makerom
___________________________________________________________________
Added: svn:executable
   + *

Added: cpu/mips/atlas/forthmon.bth
===================================================================
--- cpu/mips/atlas/forthmon.bth	                        (rev 0)
+++ cpu/mips/atlas/forthmon.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,56 @@
+purpose: Load file for ForthMon for MIPS on the Atlas board
+copyright: Copyright 2000-2001 FirmWorks  All Rights Reserved
+
+dictionary: ${BP}/cpu/mips/build/tools.dic
+command: &mipsfth &dictionary &this
+build-now
+
+\ ' $report-name is include-hook
+\ true to stand-init-debug?
+
+\ true ' fcode-debug? set-config-int-default
+\ " com1" ' output-device set-config-string-default
+\ " com1" ' input-device set-config-string-default
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/atlas/physaddr.fth
+fload ${BP}/cpu/mips/atlas/virtaddr.fth
+
+: rl@  l@  ;   : rl!  l!  ;
+: rw@  w@  ;   : rw!  w!  ;
+: rb@  c@  ;   : rb!  c!  ;
+
+fload ${BP}/cpu/mips/atlas/isaio.fth	\ ISA I/O space access
+fload ${BP}/dev/diag16550.fth		\ Diagnostic driver for serial port
+h# 0 is uart-base
+d# 3686400 constant uart-clock-frequency
+
+fload ${BP}/forth/lib/sysuart.fth	\ Plug UART routines into key and emit
+
+h#   1.0000 constant initial-heap-size
+fload ${BP}/cpu/mips/boot.fth		\ Low-level startup code
+
+fload ${BP}/fm/lib/dumballo.fth		\ Rudimentary memory allocator
+
+: stand-init-io  ( -- )
+[ifdef] stand-init-io
+   stand-init-io
+[then]
+   install-dumb-alloc
+   install-uart-io
+;
+: stand-init  ;
+
+: startup  ( -- )
+   hex
+   warning on
+   only forth also definitions
+;
+
+install-rom-cold
+
+.( --- Saving forthmon.dic ---)  " forthmon.dic" $save-forth  cr
+
+\ \needs to-srecs     fload ${BP}/tools/srec2.fth
+\ rom-pa rom-entry-pa to-srecs forthmon.dic forthmsr.sr
+\ rom-pa rom-entry-pa to-swapped-srecs forthmon.dic forthmsr.ssr

Added: cpu/mips/atlas/isaio.fth
===================================================================
--- cpu/mips/atlas/isaio.fth	                        (rev 0)
+++ cpu/mips/atlas/isaio.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,12 @@
+purpose: Access to ISA IO space for the Atlas board
+copyright: Copyright 2000 Firmworks  All Rights Reserved
+
+headers
+kseg1 uart-pa + value uart-base
+
+: pc@  ( offset -- n )  3 lshift uart-base + rb@  ;
+: pc!  ( n offset -- )  3 lshift uart-base + rb!  ;
+: pw@  ( offset -- n )  3 lshift uart-base + rw@  ;
+: pw!  ( n offset -- )  3 lshift uart-base + rw!  ;
+: pl@  ( offset -- n )  3 lshift uart-base + rl@  ;
+: pl!  ( n offset -- )  3 lshift uart-base + rl!  ;

Added: cpu/mips/atlas/physaddr.fth
===================================================================
--- cpu/mips/atlas/physaddr.fth	                        (rev 0)
+++ cpu/mips/atlas/physaddr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,36 @@
+purpose: Physical addresses for the Atlas board
+copyright: Copyright 2000 FirmWorks  All Rights Reserved
+
+headerless
+
+h# 0000.0000 constant ram-pa
+h# 0800.0000 constant pci-lo0-pa
+h# 1800.0000 constant pci-lo1-pa
+h# 1c00.0000 constant rom-pa1
+h# 1e00.0000 constant rom-pa0
+h# 1fc0.0000 constant rom-pa
+\ h# 1fd0.0000 constant system-controller-specific
+\ h# 1fe0.0000 kseg1 + constant bonito-cfg-pa
+\ h# 1fe0.0100 kseg1 + constant bonito-reg-pa
+\ h# 1fe8.0000 constant pci-cfg-pa
+h# 1f00.0000 constant io0-pa
+h# 1f00.0900 constant uart-pa
+
+\ pci-io-pa kseg1 + constant isa-io-base
+
+h# 0200.0000 constant /ram-bank
+
+h# 20.0000 constant rom-base
+h# 20.0020 constant rom-entry
+h# 10.0000 constant /rom
+h# 60 constant /resetjmp
+rom-base  kseg0 + constant rom-pa
+rom-entry kseg0 + constant rom-entry-pa
+rom-pa /resetjmp + constant dropin-base
+
+\ Bonito registers
+\ h# 18 bonito-reg-pa + constant pcimap_cfg
+\ h# 50 bonito-reg-pa + constant pcicachectrl
+\ h# 54 bonito-reg-pa + constant pcicachetag
+
+headers

Added: cpu/mips/atlas/virtaddr.fth
===================================================================
--- cpu/mips/atlas/virtaddr.fth	                        (rev 0)
+++ cpu/mips/atlas/virtaddr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,12 @@
+purpose: Virtual addresses for the Atlas board
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+headerless
+
+rom-base kseg0 +   value fw-virt-base		\ 1 meg of mapping space
+h# 10.0000 value fw-virt-size
+
+headers
+
+\ fw-virt-base fw-virt-size + ' load-base set-config-int-default
+0 value load-limit	\ Top address of area at load-base (set later)

Added: cpu/mips/basefw.bth
===================================================================
--- cpu/mips/basefw.bth	                        (rev 0)
+++ cpu/mips/basefw.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,143 @@
+purpose: Load file for base firmware - no platform specifics
+\ See license at end of file
+
+dictionary: ${BP}/cpu/mips/build/tools.dic
+command: &mipsfth &dictionary &this
+build-now
+
+\ ' $report-name is include-hook
+
+create resident-packages
+create include-help			\ Include help facility
+
+alias cfill fill
+fload ${BP}/ofw/core/ofwcore.fth	\ Device tree and other OBP routines
+fload ${BP}/ofw/core/ofwfw.fth		\ FirmWorks enhancements
+fload ${BP}/ofw/core/memops.fth		\ Call memory node methods
+fload ${BP}/ofw/core/mmuops.fth		\ Call MMU node methods
+
+fload ${BP}/cpu/mips/traps.fth		\ Exception handlers
+fload ${BP}/cpu/mips/r4000cp0.fth	\ Coprocessor 0 registers
+fload ${BP}/cpu/mips/getms.fth		\ Timer access
+
+fload ${BP}/cpu/mips/centry.fth		\ Low-level client entry and exit
+
+fload ${BP}/ofw/confvar/loadcv.fth	\ Configuration variables
+fload ${BP}/ofw/core/silentmd.fth	\ NVRAM variable silent-mode?
+
+fload ${BP}/ofw/termemu/loadfb.fth	\ Frame buffer support
+fload ${BP}/ofw/termemu/difont.fth	\ Get font from a dropin module
+
+fload ${BP}/ofw/termemu/fb8-ops.fth	\ 8-bit frame buffer primitives
+\ fload ${BP}/cpu/mips/fb8-ops.fth	\ 8-bit frame buffer primitives
+
+fload ${BP}/ofw/gui/alert.fth		\ Basic dialogs and alerts
+fload ${BP}/dev/stringio.fth		\ Output diversion
+
+fload ${BP}/ofw/core/loadmore.fth	\ Load additional core stuff
+
+fload ${BP}/ofw/inet/loadtftp.fth	\ Trivial File Transfer Protocol pkg.
+
+\ fload ${BP}/pkg/loadpkg.fth		\ Load support packages
+\ fload ${BP}/pkg/inet/loadtcp.fth	\ TCP extensions
+
+fload ${BP}/cpu/mips/catchexc.fth	\ Exception handler
+fload ${BP}/cpu/mips/forthint.fth	\ Alarm handler
+
+fload ${BP}/cpu/mips/regacc.fth		\ Register access words
+
+fload ${BP}/ofw/fcode/loadfcod.fth	\ S Fcode interpreter
+
+fload ${BP}/ofw/fcode/regcodes.fth	\ Register access words
+fload ${BP}/ofw/fcode/extcodes.fth	\ Firmworks extension FCodes
+
+fload ${BP}/ofw/core/initprog.fth	\ FCode and Forth source load formats 
+
+fload ${BP}/ofw/core/infltdi.fth	\ Support for compressed dropin drivers
+
+h# 8010.0000 constant inflater-base
+0 0 2value old-inflater
+: mips-get-inflater  ( -- )
+   (get-inflater)
+   inflater to old-inflater
+   inflater inflater-base swap 2dup to inflater  move
+   inflater sync-cache
+;
+' mips-get-inflater to get-inflater
+
+: mips-release-inflater  ( -- )
+   old-inflater free-mem
+;
+' mips-release-inflater to release-inflater
+
+fload ${BP}/cpu/mips/initpgm.fth	\ Basic boot handler
+
+[ifdef] resident-packages
+support-package: fat-file-system
+   fload ${BP}/ofw/fs/fatfs/loadpkg.fth	\ FAT file system reader
+end-support-package
+
+support-package: iso9660-file-system
+   fload ${BP}/ofw/fs/cdfs/loadpkg.fth	\ ISO 9660 CD-ROM file system reader
+end-support-package
+
+support-package: disk-label
+   fload ${BP}/ofw/disklabel/loadpkg.fth	\ Disk label package
+end-support-package
+[then]
+
+[ifdef] resident-packages
+fload ${BP}/ofw/fs/fatfs/fdisk2.fth	\ Partition map administration
+[else]
+autoload: fdisk2.fth
+defines: $.partitions
+defines: .partitions
+\ defines: init-nt-disk
+defines: $partition
+[then]
+
+fload ${BP}/fm/lib/pattern.fth		\ Text string pattern matching
+fload ${BP}/ofw/core/filecmds.fth	\ File commands: dir, del, ren, etc.
+
+: ldump  (s adr len -- )
+   base @ >r  hex
+   bounds  ?do
+      i 8 u.r  ." : "  i  h# 10  bounds  do
+         i l@ 8 u.r space space
+      /l +loop
+      i  h# 10  bounds  do
+         i c@  dup  bl h# 80 within  if  emit  else  drop ." ."  then
+      loop
+      cr
+      exit? (?leave)
+   h# 10 +loop
+   r> base !
+;
+
+[ifndef] no-heads
+.( --- Saving basefw.dic --- )  cr "" basefw.dic save-forth
+[then]
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/bonito/bonito.fth
===================================================================
--- cpu/mips/bonito/bonito.fth	                        (rev 0)
+++ cpu/mips/bonito/bonito.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,84 @@
+purpose: Forth words for Bonito 
+copyright: Copyright 2000-2001 FirmWorks  All Rights Reserved
+
+defer pcicache-wbinv	' 2drop to pcicache-wbinv
+defer pcicache-inv      ' 2drop to pcicache-inv
+
+: bonito-iobc-cmd!  ( cmd line -- )
+   ( cmd ) ( line ) 3 << or dup pcicachectrl !
+   dup h# 20 or pcicachectrl !
+   begin  pcicachectrl @ h# 20 and  0=  until
+   pcicachectrl !
+;
+
+: bonito-iobc-range  ( pa size cmd -- )
+   over 0=  if  3drop exit  then
+   rot h# 1fff.ffff and rot over + rot
+   4 0 do                           ( pa top cmd )
+      2 i bonito-iobc-cmd!          ( pa top cmd )  \ Read tag
+      pcicachetag @ dup h# 0100.0000 and  if
+         h# 00ff.ffff and 5 <<      ( pa top cmd tag )
+         2 pick over >              ( pa top cmd tag flag )
+         swap h# 20 + 4 pick > and  ( pa top cmd flag )
+         if  dup i bonito-iobc-cmd!  then  ( pa size cmd )  \ Write-back & invalidate
+      else
+         drop                       ( pa size cmd )
+      then
+   loop  3drop
+;
+
+: bonito-iobc-wbinv-all ( -- )
+   4 0 do
+      2 i bonito-iobc-cmd!
+      pcicachetag @ h# 0100.0000 and  if
+         1 i bonito-iobc-cmd!
+      then
+   loop
+   3 0 bonito-iobc-cmd!             \ Flush write queue
+;
+
+: bonito-iobc-wbinv  ( pa size -- )
+   1 bonito-iobc-range              \ Write-back & invalidate range
+   3 0 bonito-iobc-cmd!             \ Flush write queue
+;
+' bonito-iobc-wbinv to pcicache-wbinv
+   
+: bonito-iobc-inv-all ( -- )
+   4 0 do
+      2 i bonito-iobc-cmd!
+      pcicachetag @ h# 0100.0000 and  if
+         0 i bonito-iobc-cmd!
+      then
+   loop
+;
+: bonito-iobc-inv  ( pa size -- )
+   0 bonito-iobc-range              \ Invalidate range
+;
+' bonito-iobc-inv to pcicache-inv
+
+: bonito-iobc-dump  ( -- )
+   4 0 do
+      2 i bonito-iobc-cmd!
+      pcicachetag @
+      i u. dup u. h# ff.ffff and 5 << u. cr
+   loop
+;
+
+: init-bonito  ( -- )
+   h# 0000.0800 h# 0c bonito-cfg-pa + w!
+   h# 0000.0000 h# 10 bonito-cfg-pa + l!
+   h# 2000.0000 h# 14 bonito-cfg-pa + l!
+   h# 1000.0000 h# 18 bonito-cfg-pa + l!
+
+   h# 0004.6144 pcimap    l!
+   h# 0000.2c0f intedge   l!
+   h# 6400.0000 intsteer  l!
+   h# 6600.0000 intpol    l!
+   h# 0004.21cf intenset  l!
+   h# 1a41.fd1f intenclr  l!
+;
+
+stand-init: Initialize Bonito
+   init-bonito
+   bonito-iobc-inv-all
+;

Added: cpu/mips/bonito/devalias.fth
===================================================================
--- cpu/mips/bonito/devalias.fth	                        (rev 0)
+++ cpu/mips/bonito/devalias.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,7 @@
+devalias com1 /isa/serial at i3f8
+devalias com2 /isa/serial at i2f8
+devalias mouse /mouse
+devalias net /ethernet
+devalias disk /isa/ide/disk at 0
+devalias c /isa/ide/disk at 0
+devalias d /isa/ide/disk at 1

Added: cpu/mips/bonito/devices.fth
===================================================================
--- cpu/mips/bonito/devices.fth	                        (rev 0)
+++ cpu/mips/bonito/devices.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,86 @@
+purpose: Load device drivers for Bonito 
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+hex
+
+fload ${BP}/cpu/mips/bonito/pcicfg.fth
+
+0 0  " "  " /"  begin-package
+   fload ${BP}/cpu/mips/bonito/mappci.fth	\ Map PCI to root
+   fload ${BP}/dev/pcibus.fth			\ Generic PCI bus package
+   fload ${BP}/cpu/mips/bonito/pcinode.fth	\ System-specific words for PCI
+end-package
+stand-init: PCI host bridge
+   " /pci" " init" execute-device-method drop
+;
+
+fload ${BP}/dev/pciprobe.fth			\ Generic PCI probing
+
+\ 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  " 1c"  " /pci" begin-package
+fload ${BP}/dev/fw82371.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/pc87307.fth			\ SuperI/O
+
+0 0 dropin-base <# u#s u#> " /" begin-package
+   " flash" device-name
+
+   /rom value /device
+   my-address my-space /device reg
+   fload ${BP}/dev/flashpkg.fth
+end-package
+
+" rom"  dropin-base <# u#s " /flash@" hold$ u#>  $devalias
+
+fload ${BP}/dev/flashpkg.fth
+fload ${BP}/dev/amd29fxx.fth		\ Low-level FLASH programming driver
+fload ${BP}/dev/at29c020.fth		\ Low-level FLASH programming driver
+fload ${BP}/cpu/mips/bonito/flash.fth	\ Platform-specific FLASH interface
+
+dev /rtc
+   fload ${BP}/cpu/mips/bonito/nvram.fth
+device-end
+
+stand-init: NVRAM
+   " /rtc" open-dev  to nvram-node
+   nvram-node 0=  if
+      ." The configuration EEPROM is not working" cr
+   then
+   ['] init-config-vars catch drop
+;
+
+0 0 ide0-pa <# u#s u#>  " /" begin-package
+   fload ${BP}/dev/ide/bonito.fth
+   fload ${BP}/dev/ide/onelevel.fth
+end-package
+
+h# f800 constant ide-dma-bar
+
+0 0 " i1f0" " /isa" begin-package	\ Master IDE
+   create include-secondary-ide
+   fload ${BP}/dev/ide/isaintf.fth
+   fload ${BP}/dev/ide/generic.fth
+   2 to max#drives
+   fload ${BP}/dev/ide/onelevel.fth
+end-package
+
+: init-ide  ( -- )
+   ide-dma-bar h# e120 config-l!	\ Set I/O port
+   h# 8022 h# e140 config-w!		\ Enable master IDE decoding
+   h# 8022 h# e142 config-w!		\ Enable secondary IDE decoding
+   h#    5 h# e104 config-w!		\ Enable I/O and bus mastering
+;
+stand-init: Enable IDE on Algorithmics
+   init-ide
+;

Added: cpu/mips/bonito/excption.fth
===================================================================
--- cpu/mips/bonito/excption.fth	                        (rev 0)
+++ cpu/mips/bonito/excption.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,83 @@
+purpose: Exception handlers
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+headers
+hex
+
+defer exception-hook  ' noop to exception-hook
+
+: .dis1  ( addr -- )  [ also disassembler ] pc l! [ previous ] dis1  ;
+
+: .epc  ( -- )
+   epc@
+   cause@ h# 8000.0000 and  if  la1+  then
+   .dis1
+;
+
+: .badvaddr  ( -- )
+   ." Bad virtual address = " badvaddr@ u. cr reset-all
+;
+
+: (exception-handler)  ( exception# -- )
+   base @ >r  hex
+   exception-hook
+   dup (.exception)
+   .epc
+   case
+      4  of  .badvaddr  endof
+      5  of  .badvaddr  endof
+   endcase
+   r> base !
+;
+' (exception-handler) to dispatch-exceptions
+
+: ?report  ( char -- )
+   " isa-io-base d# 16 >> t0 lui" evaluate
+   " begin   t0 h# 3fd t1 lbu   t1 h# 20 t1 andi  t1 0 <> until  nop" evaluate
+   ( char )  " t1 set   t1 t0 h# 3f8 sb  " evaluate
+;
+
+label (tlb-handler)
+   carret ?report linefeed ?report
+   ascii T ?report ascii L ?report ascii B ?report bl ?report
+   ascii R ?report ascii e ?report ascii f ?report ascii i ?report
+   ascii l ?report ascii l ?report bl ?report
+   ascii E ?report ascii x ?report ascii c ?report ascii e ?report
+   ascii p ?report ascii t ?report ascii i ?report ascii o ?report
+   ascii n ?report
+   carret ?report linefeed ?report
+   begin again
+   nop
+end-code
+' (tlb-handler) to tlb-handler
+
+label (xtlb-handler)
+   carret ?report linefeed ?report
+   ascii X ?report ascii T ?report ascii L ?report ascii B ?report bl ?report
+   ascii R ?report ascii e ?report ascii f ?report ascii i ?report
+   ascii l ?report ascii l ?report bl ?report
+   ascii E ?report ascii x ?report ascii c ?report ascii e ?report
+   ascii p ?report ascii t ?report ascii i ?report ascii o ?report
+   ascii n ?report
+   carret ?report linefeed ?report
+   begin again
+   nop
+end-code
+' (xtlb-handler) to xtlb-handler
+
+label (cache-handler)
+   carret ?report linefeed ?report
+   ascii C ?report ascii a ?report ascii c ?report ascii h ?report
+   ascii e ?report bl ?report
+   ascii E ?report ascii r ?report ascii r ?report ascii o ?report
+   ascii r ?report bl ?report
+   ascii E ?report ascii x ?report ascii c ?report ascii e ?report
+   ascii p ?report ascii t ?report ascii i ?report ascii o ?report
+   ascii n ?report
+   carret ?report linefeed ?report
+   begin again
+   nop
+end-code
+' (cache-handler) to cache-handler
+
+headers

Added: cpu/mips/bonito/flash.fth
===================================================================
--- cpu/mips/bonito/flash.fth	                        (rev 0)
+++ cpu/mips/bonito/flash.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,23 @@
+purpose: Setup for Flash ROM access
+copyright: Copyright 1995-2001 Firmworks.  All Rights Reserved.
+
+h# 10.0000 to /flash
+
+0 value flashbase
+
+headerless
+: (fctl!)   ( n a -- )  flashbase +  rb!  ;  ' (fctl!)  to fctl!
+: (fdata!)  ( n a -- )  flashbase +  rb!  ;  ' (fdata!) to fdata!
+: (fc@)     ( a -- n )  flashbase +  rb@  ;  ' (fc@)    to fc@
+
+headers
+: open-flash  ( -- )
+   flashbase 0=  if
+      rom-pa /flash  root-map-in  to flashbase
+   then
+;
+: close-flash  ( -- )
+   flashbase /flash  root-map-out  0 to flashbase
+;
+' open-flash to enable-flash-writes
+

Added: cpu/mips/bonito/forthmon.bth
===================================================================
--- cpu/mips/bonito/forthmon.bth	                        (rev 0)
+++ cpu/mips/bonito/forthmon.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,99 @@
+purpose: Load file for ForthMon for MIPS
+copyright: Copyright 2000-2001 FirmWorks  All Rights Reserved
+
+dictionary: ${BP}/cpu/mips/build/basefw.dic
+command: &mipsfth &dictionary &this
+build-now
+
+\ ' $report-name is include-hook
+true to stand-init-debug?
+
+true ' fcode-debug? set-config-int-default
+" com1" ' output-device set-config-string-default
+" com1" ' input-device set-config-string-default
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/bonito/physaddr.fth
+fload ${BP}/cpu/mips/bonito/virtaddr.fth
+
+: rl@  l@  ;   : rl!  l!  ;
+: rw@  w@  ;   : rw!  w!  ;
+: rb@  c@  ;   : rb!  c!  ;
+
+fload ${BP}/cpu/mips/bonito/isaio.fth	\ ISA I/O space access
+fload ${BP}/dev/diag16550.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"
+
+h# 1000 to pagesize
+d# 12   to pageshift
+
+fload ${BP}/cpu/mips/cache.fth		\ Cache synchronization/flushing
+fload ${BP}/cpu/mips/rootnode.fth	\ Root node mapping
+dev /
+   " Algorithmics,P-6032" model
+   " Algorithmics" encode-string  " architecture" property
+\   d# 33,333,333 " clock-frequency" integer-property
+device-end
+
+: (cpu-arch  ( -- adr len )
+   " architecture" ['] root-node  get-package-property  drop
+   get-encoded-string
+;
+' (cpu-arch to cpu-arch
+
+h#   1.0000 constant initial-heap-size
+fload ${BP}/cpu/mips/boot.fth		\ Low-level startup code
+
+\ 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
+fload ${BP}/ofw/core/allocmor.fth 	\ S Allow alloc-mem to use more memory
+
+: (initial-heap)  ( -- adr len )  sp0 @ ps-size -  limit  tuck -  ;
+['] (initial-heap) to initial-heap
+
+\ fload ${BP}/forth/lib/dumballo.fth	\ Rudimentary memory allocator
+
+variable bank-mask
+" Set bank-mask" ?reminder
+1 bank-mask !
+fload ${BP}/cpu/mips/probemem.fth  \ Memory probing
+stand-init: Probing memory
+   " probe" memory-node @ $call-method
+;
+
+\ File system
+
+: call32 ;  defer .subname
+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
+' 2drop is elf-map-in
+
+\ Device Tree
+
+: stand-init-io  ( -- )
+[ifdef] stand-init-io
+   stand-init-io
+[then]
+\   install-dumb-alloc
+   install-uart-io
+;
+
+: startup  ( -- )
+   hex
+   warning on
+   only forth also definitions
+;
+
+install-rom-cold
+
+.( --- Saving forthmon.dic ---)  " forthmon.dic" $save-forth  cr

Added: cpu/mips/bonito/fw.bth
===================================================================
--- cpu/mips/bonito/fw.bth	                        (rev 0)
+++ cpu/mips/bonito/fw.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,210 @@
+purpose: Load file for Bonito 
+copyright: Copyright 2000-2001 FirmWorks  All Rights Reserved
+
+dictionary: ${BP}/fm/cwrapper/mips/build/basefw.dic
+command: &mipsfth &dictionary &this
+build-now
+
+create rom-based?
+\ create ram-image
+
+\ ' $report-name is include-hook
+true to stand-init-debug?
+
+false ' auto-boot? set-config-int-default
+true ' fcode-debug? set-config-int-default
+true ' local-mac-address? set-config-int-default
+" com1" ' output-device set-config-string-default
+" com1" ' input-device set-config-string-default
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/bonito/physaddr.fth
+fload ${BP}/cpu/mips/bonito/virtaddr.fth
+
+: rl@  l@  ;   : rl!  l!  ;
+: rw@  w@  ;   : rw!  w!  ;
+: rb@  c@  ;   : rb!  c!  ;
+
+fload ${BP}/cpu/mips/bonito/isaio.fth	\ ISA I/O space access
+fload ${BP}/dev/diag16550.fth		\ Diagnostic driver for serial port
+h# 3f8 is uart-base
+fload ${BP}/os/stand/sysuart.fth	\ Plug UART routines into key and emit
+\ ' ukey is diag-key			\ Feed UART input to "dl"
+
+h# 1000 to pagesize
+d# 12   to pageshift
+
+fload ${BP}/cpu/mips/cache.fth		\ Cache synchronization/flushing
+fload ${BP}/cpu/mips/bonito/bonito.fth	\ IOBC synchronization/flushing
+fload ${BP}/cpu/mips/bonito/rootnode.fth	\ Root node mapping
+dev /
+   " Algorithmics,P-6032" model
+   " Algorithmics" encode-string  " architecture" property
+\   d# 33,333,333 " clock-frequency" integer-property
+device-end
+
+: (cpu-arch  ( -- adr len )
+   " architecture" ['] root-node  get-package-property  drop
+   get-encoded-string
+;
+' (cpu-arch to cpu-arch
+
+h#   1.0000 constant initial-heap-size
+fload ${BP}/cpu/mips/boot.fth		\ Low-level startup code
+
+[ifdef] notyet
+0 config-int next-xid
+stand-init: Next xid
+   next-xid h# 10.0000 + dup to next-xid to rpc-xid
+;
+[then]
+
+\ 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 	\ S Allow alloc-mem to use more memory
+
+: (initial-heap)  ( -- adr len )  sp0 @ ps-size -  limit  tuck -  ;
+['] (initial-heap) to initial-heap
+
+\ fload ${BP}/fm/lib/dumballo.fth		\ Rudimentary memory allocator
+
+variable bank-mask
+" Set bank-mask" ?reminder
+1 bank-mask !
+fload ${BP}/cpu/mips/probemem.fth  \ Memory probing
+stand-init: Probing memory
+   " probe" memory-node @ $call-method
+;
+
+\ Load file format handlers
+
+: call32 ;  defer .subname
+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
+' 2drop is elf-map-in
+
+\ File system
+fload ${BP}/cpu/mips/zipcrc.fth		\ Assembly portion of CRC calculation
+fload ${BP}/forth/lib/crc32.fth		\ High-level portion of CRC calculation
+
+fload ${BP}/pkg/fatfs/fdisk2.fth	\ Partition map administration
+
+[ifdef] resident-packages
+support-package: fat-file-system
+   fload ${BP}/ofw/fs/fatfs/loadpkg.fth	\ FAT file system reader
+end-support-package
+
+support-package: iso9660-file-system
+   fload ${BP}/ofw/fs/cdfs/loadpkg.fth	\ ISO 9660 CD-ROM file system reader
+end-support-package
+
+support-package: disk-label
+   fload ${BP}/ofw/disklabel/loadpkg.fth \ Disk label package
+end-support-package
+
+[ifdef]  use-ufs
+support-package: ufs-file-system
+   fload ${BP}/ofw/fs/ufs/ufs.fth	\ Unix file system
+end-support-package
+[then]
+
+support-package: ext2-file-system
+   fload ${BP}/ofw/fs/ext2fs/ext2fs.fth	\ Linux file system
+end-support-package
+
+support-package: dropin-file-system
+   fload ${BP}/ofw/fs/dropinfs.fth	\ Dropin file system
+end-support-package
+
+support-package: nfs
+   fload ${BP}/ofw/fs/nfs/loadpkg.fth
+end-support-package
+[then]
+
+\ Device Tree
+fload ${BP}/cpu/mips/bonito/devices.fth
+fload ${BP}/cpu/mips/bonito/devalias.fth
+
+: stand-init-io  ( -- )
+[ifdef] stand-init-io
+   stand-init-io
+[then]
+\   install-dumb-alloc
+   install-uart-io
+;
+
+fload ${BP}/cpu/mips/bonito/excption.fth
+fload ${BP}/cpu/mips/bonito/intr.fth
+
+: probe-all  ( -- )
+   " probe-" do-drop-in
+   probe-pci
+   " probe+" do-drop-in
+;
+
+: startup  ( -- )
+   hex
+   warning on
+   only forth also definitions
+   kseg0 to vector-base
+   " probe-all"       ?type  probe-all
+   " install-alarm"   ?type  install-alarm
+   " install-console" ?type  install-console
+;
+
+: hello  " net:192.168.1.9,|tftpboot|hello,192.168.1.22" boot-load  ;
+: (linux)  " net:192.168.1.9,|tftpboot|vmlinux,192.168.1.22" boot-load  ;
+: linux  (linux) go  ;
+
+: bye  ( -- )
+   h# 23.0000 intpol l!
+   bongencfg l@ 4 or bongencfg l! bongencfg l@ drop
+   begin  again
+;
+' bye to reset-all
+
+defer linux-argc
+: ((linux-argc)  ( adr len -- argc )
+   0 >r  begin
+      bl left-parse-string nip 0<>  while
+      r> 1+ >r
+   repeat  2drop
+   r>
+;
+: (linux-argc)  ( adr len -- argc )  2drop 2  ;
+' (linux-argc) to linux-argc
+
+defer linux-argv
+: (linux-argv)  ( adr len -- 'argv )
+   3 /n * over + dup alloc-mem dup >r
+   swap erase
+   r@ 3 na+ r@ na1+ !
+   tuck $cstr swap 1+ r@ 3 na+ swap cmove
+   r>
+;
+' (linux-argv) to linux-argv
+
+: linux-setup  ( -- )
+   disable-interrupts
+   kseg0 0 sync-cache
+   boot-file linux-argc to $a0
+   boot-file linux-argv to $a1
+   0 to $a2
+;
+' linux-setup to go-hook
+
+install-rom-cold
+
+.( --- Saving fw.img ...)  "" fw.img save-forth cr

Added: cpu/mips/bonito/initbon.fth
===================================================================
--- cpu/mips/bonito/initbon.fth	                        (rev 0)
+++ cpu/mips/bonito/initbon.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,64 @@
+purpose: Initialize Bonito for startup
+copyright: Copyright 2001Firmworks  All Rights Reserved
+
+transient
+: bonito!  ( data bonito-adr -- )
+   " t0 set" evaluate
+   " t1 set" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: bonito-clrbits  ( bits bonito-adr -- )
+   " t0 set" evaluate
+   " t0 0 t2 lw" evaluate
+   invert " t1 set" evaluate
+   " t1 t2 t1 and" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: bonito-setbits  ( bits bonito-adr -- )
+   " t0 set" evaluate
+   " t0 0 t2 lw" evaluate
+   " t1 set" evaluate
+   " t1 t2 t1 or" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: delay-ms  ( ms -- )
+   d# 100.0000 * d# 830 + d# 1660 / " t0 set" evaluate
+   " begin  t0 0 = until  t0 -1 t0 addi" evaluate
+;
+resident
+
+label init-bonito  ( -- )   \ Destroys: t0, t1 and t2
+   \ Bonito configuration registers
+\   h# 4020 bonponcfg bonito-clrbits  \ little endian, enable cfg
+   h# 4000 bonponcfg bonito-clrbits  \ little endian
+   h# 4040 bongencfg bonito-clrbits  \ byte swap
+   h# 0410 bonponcfg bonito-setbits  \ ROMCS0, arbiter
+
+   \ Bonito PCI configuration registers
+   h# 0600.0000 bonito-cfg-pa h# 08 + bonito!  \ class
+   h# f900.0000 bonito-cfg-pa h# 04 + bonito!  \ clear status
+   h# 0000.0000 bonito-cfg-pa h# 0c + bonito!  \ latency timer
+   h# 0000.0000 bonito-cfg-pa h# 10 + bonito!  \ pcibase0
+   h# 0000.0000 bonito-cfg-pa h# 14 + bonito!  \ pcibase1
+   h# 0000.0000 bonito-cfg-pa h# 18 + bonito!  \ pcibase2
+   h# 0000.0000 bonito-cfg-pa h# 30 + bonito!  \ pciexprbase
+   h# 0000.0000 bonito-cfg-pa h# 3c + bonito!  \ pciint
+   h# 0000.0047 bonito-cfg-pa h# 04 + bonito-setbits  \ enable mem and I/O
+
+   \ Bonito configuration registers
+   h# 9302 bongencfg bonito-setbits  \ I/O buffer
+   h# 0001 bongencfg bonito-clrbits  \ disable debug
+
+   \ Reset PCI bus
+   h# 0000.0020 gpiodata bonito!  \ pio_pcireset
+   h# ffff.ffcf gpioie   bonito!  \ pio_ie
+   1 delay-ms
+   h# 0000.0020 gpiodata bonito-clrbits
+   d# 50 delay-ms
+
+   \ Other Bonito registers
+   h# 16e0 iodevcfg bonito-setbits  \ cs
+
+   ra jr  nop
+end-code
+

Added: cpu/mips/bonito/initcom1.fth
===================================================================
--- cpu/mips/bonito/initcom1.fth	                        (rev 0)
+++ cpu/mips/bonito/initcom1.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,23 @@
+purpose: Initialize COM1 for startup messages
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+transient
+: isa-c!  ( data isa-adr -- )  \ t0: isa-io-base
+   swap " t1 set" evaluate
+   " t1 t0 rot sb" evaluate
+;
+resident
+
+\ Initialize the 8250 (or compatible) COM1 serial port.
+label init-com1  ( -- )  \ Destroys t0 and t1
+   isa-io-base d# 16 >> t0 lui
+
+  \ SIOA
+   h#  3 h# 3fc isa-c!       \ RTS and DTR on
+   h# 80 h# 3fb isa-c!       \ Enable divisor latch
+   h#  c h# 3f8 isa-c!       \ Baud rate divisor low - 9600 baud
+   h#  0 h# 3f9 isa-c!       \ Baud rate divisor high - 9600 baud
+   h#  3 h# 3fb isa-c!       \ 8 bits, no parity
+
+   ra jr  nop
+end-code

Added: cpu/mips/bonito/initsb.fth
===================================================================
--- cpu/mips/bonito/initsb.fth	                        (rev 0)
+++ cpu/mips/bonito/initsb.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,59 @@
+purpose: Initialize SouthBridge for startup messages
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+h# 1000 constant sb-pci-addr
+transient
+: config-map  ( reg -- )
+   pcimap_cfg " t0 set" evaluate
+   sb-pci-addr " t1 set" evaluate
+   " t1 t0 0 sw" evaluate
+   ( reg )   pci-cfg-pa + " t0 set" evaluate
+;
+: config-l!  ( value reg -- )
+   config-map
+   ( value ) " t1 set" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: config-w!  ( value reg -- )
+   config-map
+   ( value ) " t1 set" evaluate
+   " t1 t0 0 sh" evaluate
+;
+: config-b!  ( value reg -- )
+   config-map
+   ( value ) " t1 set" evaluate
+   " t1 t0 0 sb" evaluate
+;
+: pc@  ( reg -- )	\ t0: isa-io-base
+   ( reg ) " t0 swap t1 lbu" evaluate
+;
+: pc!  ( data reg -- )	\ t0: isa-io-base
+   swap " t1 set" evaluate
+   ( reg ) " t1 t0 rot sb" evaluate
+;
+resident
+
+label init-southbridge  ( -- )   \ Destroys: t0 and t1
+   h# fbfe.c001 h# 0b0 config-l!	\ Set ISA mode
+   h# 0000.0000 h# 04e config-w!	\ Disable RTC & KBD chip selects
+   h# 0000.000d h# 082 config-b!	\ Enable PCI 2.1 timing support
+   h# 0000.00fe h# 069 config-b!	\ Set top of memory to 16MB
+   h# 0000.0000 h# 0cb config-b!	\ Disable internal RTC
+
+   smbus-base 1 + h# 390 config-l!	\ Set SMB base address
+   h# 0000.0001 h# 3d2 config-b!	\ Enable host controller
+   h# 0000.0001 h# 304 config-b!	\ Enable I/O
+
+   isa-io-base d# 16 >> t0 lui
+
+[ifdef] notyet
+   \ Program ISA refresh counter
+   h# 43 pc@		\ Don't know why pmon code read this write-only reg
+   h# 74 h# 43 pc!	\ Counter 1, r/w 0-7, 8-15, mode 1, binary
+   h# d6 h# 41 pc!	\ Refresh timer
+   h# 00 h# 41 pc!
+[then]
+
+   ra jr  nop
+end-code
+

Added: cpu/mips/bonito/initsio.fth
===================================================================
--- cpu/mips/bonito/initsio.fth	                        (rev 0)
+++ cpu/mips/bonito/initsio.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,23 @@
+purpose: Initialize SuperI/O for startup messages
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+transient
+: sio-c!  ( data reg -- )  \ t0: isa-io-base
+   ( reg ) " t1 set" evaluate
+   " t1 t0 h# 15c sb" evaluate
+   ( data ) " t1 set" evaluate
+   " t1 t0 h# 15d sb" evaluate
+;
+resident
+
+label init-sio  ( -- )   \ Destroys: t0 and t1
+   isa-io-base d# 16 >> t0 lui
+
+   h# 06 h# 07 sio-c!	\ Select com1
+   h# 03 h# 60 sio-c!	\ At port 3f8
+   h# f8 h# 61 sio-c!
+   h# 01 h# 30 sio-c!	\ Turn it on
+
+   ra jr  nop
+end-code
+

Added: cpu/mips/bonito/intr.fth
===================================================================
--- cpu/mips/bonito/intr.fth	                        (rev 0)
+++ cpu/mips/bonito/intr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,19 @@
+purpose: Interrupt handlers
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+headers
+hex
+
+: .intr-sw  ( intr# -- )  ." Software Interrupt " u. cr  ;
+: (intr-sw0)  ( -- )  0 .intr-sw  ;  ' (intr-sw0) to intr-sw0
+: (intr-sw1)  ( -- )  1 .intr-sw  ;  ' (intr-sw1) to intr-sw1
+
+: .intr-hw  ( intr# -- )  ." Hardware Interrupt " u. cr  ;
+' dispatch-interrupt to intr-hw0
+' dispatch-interrupt to intr-hw1
+: (intr-hw2)  ( -- )  2 .intr-hw  ;  ' (intr-hw2) to intr-hw2
+: (intr-hw3)  ( -- )  3 .intr-hw  ;  ' (intr-hw3) to intr-hw3
+: (intr-hw4)  ( -- )  4 .intr-hw  ;  ' (intr-hw4) to intr-hw4
+
+headers
+

Added: cpu/mips/bonito/isaio.fth
===================================================================
--- cpu/mips/bonito/isaio.fth	                        (rev 0)
+++ cpu/mips/bonito/isaio.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,12 @@
+purpose: Access to ISA IO space
+copyright: Copyright 2000 Firmworks  All Rights Reserved
+
+headers
+isa-io-base 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!  ;

Added: cpu/mips/bonito/mappci.fth
===================================================================
--- cpu/mips/bonito/mappci.fth	                        (rev 0)
+++ cpu/mips/bonito/mappci.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,34 @@
+purpose: PCI physical address mapping to root node
+copyright: Copyright 1994-2001 FirmWorks  All Rights Reserved
+
+hex
+
+headerless
+
+\ map-pci-phys creates a virtual mapping for the PCI physical address range
+\ "paddr io? size", returning its virtual address "vaddr".  It does so by
+\ first translating the PCI physical base address "paddr io?" to the
+\ corresponding physical address in the parent node's address space (which
+\ is often the primary system bus address space, but in this case is the
+\ VL bus address space), and then calling the parent's "map-in" method.
+\ "io?" is false for PCI memory space, true for PCI I/O space.
+
+: map-pci-phys  ( paddr io? phys.hi size -- vaddr )
+   -rot 2drop  " map-in" $call-parent
+;
+
+\ >pci-devaddr translates the DMA address "parent-devaddr", which is in the
+\ parent node's physical address space, to the corresponding DMA address
+\ "pci-devaddr" in the PCI physical address space (in PCI memory space; DMA
+\ to PCI I/O space is not possible).
+
+: >pci-devaddr  ( parent-devaddr -- pci-devaddr )  h# 0  +  ;
+
+\ pci-devaddr> translates the DMA address "pci-devaddr", which is in the
+\ PCI physical address space (in PCI memory space; DMA to PCI I/O space is
+\ not possible), to the corresponding DMA address "parent-devaddr" in the
+\ parent node's physical address space.
+
+: pci-devaddr>  ( pci-devaddr -- parent-devaddr )  h# 0  -  ;
+headers
+

Added: cpu/mips/bonito/nvram.fth
===================================================================
--- cpu/mips/bonito/nvram.fth	                        (rev 0)
+++ cpu/mips/bonito/nvram.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,51 @@
+purpose: Driver for upper RAM portion of the PC97307
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+d# 128 value /nvram
+
+0 instance value nvram-ptr
+
+: nvram-bank-setup  ( -- saved-a )
+   a rtc@
+   dup h# 8f and h# 30 or a rtc!
+;
+: nvram-bank-restore  ( saved-a -- )  a rtc!  ;
+: upper@  ( offset -- n )  50 rtc!  53 rtc@  ;
+: upper!  ( n offset -- )  50 rtc!  53 rtc!  ;
+
+: nvram@  ( offset -- n )  nvram-bank-setup >r upper@ r> nvram-bank-restore  ;
+: nvram!  ( n offset -- )  nvram-bank-setup >r upper! r> nvram-bank-restore  ;
+' 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  ;
+

Added: cpu/mips/bonito/pcicfg.fth
===================================================================
--- cpu/mips/bonito/pcicfg.fth	                        (rev 0)
+++ cpu/mips/bonito/pcicfg.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,32 @@
+purpose: Configuration space access using "configuration mechanism 1"
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+\ Ostensibly this applies to the PCI bus and thus should be in the PCI node.
+\ However, many of the host bridge registers are accessed via this mechanism,
+\ so it is convenient to make the configuration access words globally-visible.
+\ This mechanism works for several different PCI host bridges.
+
+headerless
+
+defer config-map
+: config-map-bonito  ( config-adr -- port )
+   h# 00ff.ffff and dup >r  h# 1.0000 <  if
+      \ Type 0 cycle
+      1 r@ h# f800 and d# 11 >> <<	( idsel )
+      r> h# 7ff and or			( type0 )
+      lwsplit				( lo hi )
+   else
+      \ Type 1 cycle
+      r> lwsplit h# 1.0000 or		( lo hi )
+   then
+   pcimap_cfg !  pci-cfg-pa +
+;
+' config-map-bonito to config-map
+
+: config-l@  ( config-addr -- l )  config-map rl@  ;
+: config-l!  ( l config-addr -- )  config-map rl!  ;
+: config-w@  ( config-addr -- w )  config-map rw@  ;
+: config-w!  ( w config-addr -- )  config-map rw!  ;
+: config-b@  ( config-addr -- c )  config-map rb@  ;
+: config-b!  ( c config-addr -- )  config-map rb!  ;
+

Added: cpu/mips/bonito/pcinode.fth
===================================================================
--- cpu/mips/bonito/pcinode.fth	                        (rev 0)
+++ cpu/mips/bonito/pcinode.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,79 @@
+purpose: System-specific portions of PCI bus package
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+: init  ( -- )  ;
+
+d# 33,333,333 " clock-frequency"  integer-property
+
+\ Establish limits for address space allocation
+
+h# 1000.0000 to first-mem	\ 1000.0000 - 1bff.ffff
+h# 1c00.0000 to mem-space-top	\ Top of area available for PCI memory
+
+h# 0000.1000 to first-io        \ Avoid on-board ISA I/O devices
+h# 0000.f000 to io-space-top    \ And SouthBridge's SMBUS base address
+
+\ The phys.hi component of the PCI addresses below indicate the
+\ address space type (I/O = 0100.0000, Mem = 0200.0000, etc.)
+
+\ -----------PCI Address---  --Sys Addr--  ------size-----
+\  phys.hi     .mid    .low     phys.hi    .hi         .lo
+
+0 0 encode-bytes
+   0000.0000 +i 0+i     0+i  bfe8.0000 +i  0+i    8.0000 +i \ PCI Cfg
+   0100.0000 +i 0+i     0+i  bfd0.0000 +i  0+i 0010.0000 +i \ ISA I/O
+   0200.0000 +i 0+i     0+i  9000.0000 +i  0+i 0c00.0000 +i \ PCI Mem
+" ranges" property
+
+\ These package methods use the global versions of the configuration
+\ access words.
+
+: config-l@  ( config-addr -- l )  config-l@  ;
+: config-l!  ( l config-addr -- )  config-l!  ;
+: config-w@  ( config-addr -- w )  config-w@  ;
+: config-w!  ( w config-addr -- )  config-w!  ;
+: config-b@  ( config-addr -- c )  config-b@  ;
+: config-b!  ( c config-addr -- )  config-b!  ;
+
+fload ${BP}/dev/pci/intmap.fth		\ Generic interrupt mapping code
+
+\ This table describes the wiring of PCI interrupt pins at the PCI slots
+\ to ISA IRQs.
+
+create slot-map
+\  Dev#  Pin A  Pin B  Pin C  Pin D
+  18 c,   0 c,   1 c,   2 c,   3 c,	\ PCI slot 2 (P9)
+  19 c,   1 c,   2 c,   3 c,   0 c,	\ PCI slot 3 (P10)
+  1a c,   2 c,   3 c,   0 c,   1 c,	\ PCI slot 4 (P11)
+  1b c,   2 c,  ff c,  ff c,  ff c,	\ Ethernet
+  1c c,   0 c,   1 c,   2 c,   3 c,	\ South Bridge
+  1d c,   3 c,   0 c,   1 c,   2 c,	\ PCI slot 1 (P8)
+  ff c,					\ End of list
+
+h# f800 encode-int			\ Mask of implemented slots
+" PCI1" encode-string encode+
+" PCI2" encode-string encode+
+" PCI3" encode-string encode+
+" PCI4" encode-string encode+
+" slot-names" property
+
+also forth definitions
+" 1b,1d,18,19,1a"  dup config-string pci-probe-list
+previous definitions
+
+warning @ warning off
+\ 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.
+: map-out  ( vaddr size -- )
+   over io-base u>=  if  2drop exit  then  ( vaddr size )
+   map-out                                 ( )
+;   
+warning !
+
+: bonito-function-present?  ( phys.hi.func -- flag )
+   bonito-cfg-pa 6 + dup w@ over w!	\ Clear errors
+   swap " config-l@" $call-self drop
+   w@ h# 2000 and 0=			\ Return true if not Master-Abort
+;
+' bonito-function-present? to function-present?
+

Added: cpu/mips/bonito/physaddr.fth
===================================================================
--- cpu/mips/bonito/physaddr.fth	                        (rev 0)
+++ cpu/mips/bonito/physaddr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,78 @@
+purpose: Physical addresses for the Bonito
+copyright: Copyright 2000 FirmWorks  All Rights Reserved
+
+headerless
+
+h# 0000.0000 constant ram-pa
+h# 1000.0000 constant pci-lo0-pa
+h# 1400.0000 constant pci-lo1-pa
+h# 1800.0000 constant pci-lo2-pa
+h# 1c00.0000 constant rom-pa1
+h# 1f80.0000 constant rom-pa0
+h# 1fc0.0000 constant rom-pa
+h# 1fd0.0000 constant pci-io-pa
+h# 1fe0.0000 kseg1 + constant bonito-cfg-pa
+h# 1fe0.0100 kseg1 + constant bonito-reg-pa
+h# 1fe8.0000 kseg1 + constant pci-cfg-pa
+h# 1ff0.0000 constant io0-pa
+h# 1ff4.0000 constant io1-pa
+h# 1ff8.0000 constant io2-pa
+h# 1ffc.0000 constant io3-pa
+
+pci-io-pa kseg1 + constant isa-io-base
+
+h# 0200.0000 constant /ram-bank
+
+h# 400 constant /resetjmp
+[ifdef] ram-image
+h# 20.0000 constant rom-base
+h# 10.0000 constant /rom
+rom-base kseg0 + constant rom-pa
+[else]
+0 constant rom-base
+h# 8.0000 constant /rom
+rom-pa   kseg1 + constant rom-pa
+[then]
+rom-pa /resetjmp + constant dropin-base
+
+h# f000 constant smbus-base		\ offset into isa-io-base
+
+io2-pa kseg1 + constant ide0-pa
+io3-pa kseg1 + constant ide1-pa
+
+\ Bonito registers
+h# 00 bonito-reg-pa + constant bonponcfg
+h# 04 bonito-reg-pa + constant bongencfg
+h# 08 bonito-reg-pa + constant iodevcfg
+h# 0c bonito-reg-pa + constant sdcfg
+h# 10 bonito-reg-pa + constant pcimap
+h# 14 bonito-reg-pa + constant pcimembasecfg
+h# 18 bonito-reg-pa + constant pcimap_cfg
+h# 1c bonito-reg-pa + constant gpiodata
+h# 20 bonito-reg-pa + constant gpioie
+h# 24 bonito-reg-pa + constant intedge
+h# 28 bonito-reg-pa + constant intsteer
+h# 2c bonito-reg-pa + constant intpol
+h# 30 bonito-reg-pa + constant intenset
+h# 34 bonito-reg-pa + constant intenclr
+h# 38 bonito-reg-pa + constant inten
+h# 3c bonito-reg-pa + constant intisr
+h# 40 bonito-reg-pa + constant pcimail0
+h# 44 bonito-reg-pa + constant pcimail1
+h# 48 bonito-reg-pa + constant pcimail2
+h# 4c bonito-reg-pa + constant pcimail3
+h# 50 bonito-reg-pa + constant pcicachectrl
+h# 54 bonito-reg-pa + constant pcicachetag
+h# 58 bonito-reg-pa + constant pcibadaddr
+h# 5c bonito-reg-pa + constant pcimstat
+h# 100 bonito-reg-pa + constant ldmactrl
+h# 100 bonito-reg-pa + constant ldmastat
+h# 104 bonito-reg-pa + constant ldmaaddr
+h# 108 bonito-reg-pa + constant ldmago
+h# 200 bonito-reg-pa + constant copctrl
+h# 200 bonito-reg-pa + constant copstat
+h# 204 bonito-reg-pa + constant coppaddr
+h# 208 bonito-reg-pa + constant copdaddr
+h# 20c bonito-reg-pa + constant copgo
+
+headers

Added: cpu/mips/bonito/report.fth
===================================================================
--- cpu/mips/bonito/report.fth	                        (rev 0)
+++ cpu/mips/bonito/report.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,30 @@
+also forth definitions
+[ifdef] debug-reset
+: ?report  ( char -- )
+   " isa-io-base d# 16 >> t0 lui" evaluate
+   " begin   t0 h# 3fd t1 lbu   t1 h# 20 t1 andi  t1 0 <> until  nop" evaluate
+   ( char )  " t1 set   t1 t0 h# 3f8 sb  " evaluate
+;
+[else]
+: ?report  ( char -- )  drop  ;
+[then]
+
+: putbyte ( $a0 -- )
+   " $a0 h# f $a0 andi  $a0 h# 30 $a0 addi" evaluate
+   " begin   t0 h# 3fd t1 lbu   t1 h# 20 t1 andi  t1 0 <> until  nop" evaluate
+   " $a0 t0 h# 3f8 sb  " evaluate
+   " begin   t0 h# 3fd t1 lbu   t1 h# 20 t1 andi  t1 0 <> until  nop" evaluate
+;
+: dot ( a0 -- )
+   " isa-io-base t0 set  $a0 t2 move" evaluate
+   " t2 d# 28 $a0 srl  putbyte" evaluate
+   " t2 d# 24 $a0 srl  putbyte" evaluate
+   " t2 d# 20 $a0 srl  putbyte" evaluate
+   " t2 d# 16 $a0 srl  putbyte" evaluate
+   " t2 d# 12 $a0 srl  putbyte" evaluate
+   " t2 d#  8 $a0 srl  putbyte" evaluate
+   " t2 d#  4 $a0 srl  putbyte" evaluate
+   " t2 0     $a0 srl  putbyte" evaluate
+;
+previous definitions
+

Added: cpu/mips/bonito/reset.bth
===================================================================
--- cpu/mips/bonito/reset.bth	                        (rev 0)
+++ cpu/mips/bonito/reset.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,448 @@
+purpose: Low-level startup code for MIPS
+copyright: Copyright 1998-2001 Firmworks  All Rights Reserved
+
+command: &native &this
+build-now
+
+create debug-reset \ Comment out in order to single step under PMON
+\ create ram-image   \ Comment out to build rom image
+
+\needs start-assembling  fload ${BP}/cpu/mips/asmtools.fth
+\needs write-dropin      fload ${BP}/forth/lib/mkdropin.fth
+
+hex
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/bonito/physaddr.fth
+fload ${BP}/cpu/mips/bonito/report.fth
+
+h# 10.0000 constant /fw-memory
+
+[ifdef] ram-image
+rom-base kseg0 + constant bootrom-pa
+[else]
+rom-pa  constant bootrom-pa
+[then]
+
+also forth definitions
+: c$,  ( adr len -- )
+   1+  here swap note-string dup allot move 4 (align)
+;
+previous definitions
+
+also mips-assembler definitions
+: $find-dropin,  ( adr len -- )
+[ifdef] notdef
+   tuck 2>r			( len )
+   here +  9 +				   \ 9 = null(1) + call+delay slot(8)
+   4 round-up			   	   \ pad string end adr to next instr-+
+   ( adr-of-find-di )  asm( $0 bgezal )asm \ jump to find-dropin call below   |
+   asm( ra  $a0   move )asm		   \ set string arg for find-dropin   |
+   2r> c$,                                 \ place string	              |
+   " find-dropin   bal"  evaluate	   \ and call find routine       <----+
+   asm( nop )asm
+[else]
+   " find-dropin bal nop" evaluate	\ call find routine
+   c$,					\ place string after delay slot
+[then]
+;
+previous definitions
+
+h# 800e.0000 constant stack-offset
+h# 800f.0000 constant workspace-offset
+h# 8010.0000 constant inflate-offset
+
+start-assembling
+
+/resetjmp h# 20 + to asm-origin	\ Skip resetjmp wad and dropin header
+
+label my-entry
+\ **** This is the primary entry point; it will contain a branch instruction
+\ that skips a few subroutines and lands at the startup sequence.  That
+\ branch instruction is patched in below.  The entry point for this module
+\ is in turn reached from a branch instruction at the beginning of the ROM,
+\ which is created by the file arch/dna/resetvec.bth
+   0 ,				\ To be patched later
+   nop
+end-code
+
+\ This subroutine is used by the startup code.
+\ It compares two null-terminated strings, returning zero if they match.
+\ Destroys: r2, r3
+label strcmp  ( $a0: str1 $a1: str2 -- v0: 0 if match, nonzero if mismatch )
+   $a0  t0  move
+   begin
+      t0 0  $a2  lbu
+      $a1 0  $a3  lbu
+      $a2 $a3 <> if
+      t0 1  t0  addiu    \ (delay)
+         ra         jr
+         $a3 $a2  v0  sub  \ (delay)
+      then
+   $a2 0 = until
+      $a1 1  $a1  addiu    \ (delay)
+
+   ra      jr
+   0  v0   set             \ (delay)
+end-code
+
+\ This subroutine is used by the startup code.
+\ It searches the ROM for a dropin module whose name field matches the
+\ null-terminated string that is at the return address.
+\ Destroys: $a0-$a3, t4-t7
+label find-dropin  ( -- v0: adr | 0 )
+   ra               $a0    move	\ address of string
+   begin
+      ra 0   $a1  lbu		\ Get string byte
+   $a1 0 =  until		\ Look for null terminator
+      ra 1   ra  addiu		\ (delay) Advance to next character
+
+   \ ra now points to the byte after the null character
+   ra 3      ra  addiu		\ Round up to longword boundard
+   3 invert  $at set
+   ra $at    t7  and		\ and round
+
+\   h# 4f424d44      t4    set	\ "OBMD"
+   h# 444d424f      t4    set	\ "OBMD" little-endian
+   bootrom-pa /resetjmp + t5    set	\ ROM base + (resetjmp wad)
+   begin
+      t5 0          t6    lw
+   t4 t6 =  while nop
+
+      strcmp              bal   \ $a1 = test$, $a0 = sought$
+      t5 h# 10       $a1  addiu	\ (delay)point to dropin name in header
+      v0 0 =  if  nop
+         t7               jr	\ return
+         t5          v0   move	\ (delay) return value is adr of "OBMD"
+      then
+
+      t5 4           t3   addiu	\ offset to size of dropin
+      t3 1           t0   lwr	\ get size of dropin (big-endian)
+      t3 3           t0   lwr	\ get least significant half word
+      h# ffff        t1   set
+      t0      t1     t6   and
+     
+      t3 2           t0   lwl	\ get most significant half word
+      t3 0           t0   lwl
+      h# ffff.0000   t1   set
+      t0      t1     t0   and
+      t0      t6     t6   or
+
+      t6 h# 23	     t6   addiu	\ add size + header(20) + roundup(3) to
+      t5 t6          t5   addu	\ locate next dropin
+      3 invert       $at  set
+   repeat
+      t5 $at         t5   and	\ (delay) round up
+
+      0              v0   set	\ return value is 0 (failure)
+      t7                  jr	\ No more dropins; return
+      nop
+end-code
+
+\ This subroutine is used by the startup code.
+\ It copies n (a2) bytes of memory from src (a1) to dst (a0)
+\ Destroys: a0-a3
+label memcpy  ( a0: dst a1: src a2: n -- )
+   $a0 $a2  $a2  addu		\ Ending address
+
+   $a0 $a2  <> if  nop
+      begin
+         $a1 0  $a3    lbu
+         $a1 1  $a1    addiu
+         $a3    $a0 0  sb
+      $a0 $a2  = until
+         $a0 1  $a0    addiu   \ (delay)
+   then
+
+   ra   jr  nop
+end-code
+here memcpy -  constant /memcpy
+
+\ Flush the VR4300 Data cache for the first time
+label init-cache  ( -- )  \ Destroys: $a0, $a1
+
+   \ Temporarily disable parity and CE
+   d# 12 v0 mfc0
+
+   h# 2.0000 invert t0 set
+   t0 v0 t0 and
+   h# 1.0000 t1 set
+   t0 t1 t0 or
+   d# 12 t0 mtc0
+
+   \ Disable secondary cache
+   d# 16 t0 mfc0
+   h# 103f invert t1 set
+   t0 t1 t0 and
+   d# 16 t0 mtc0
+   t0 h# 33 t0 ori		\ CONFIG, k0=write back
+   d# 16 t0 mtc0
+   nop nop nop nop
+
+   \ load valid virtual addresses into the cache tags
+   d# 28            $0   mtc0	\ Set CP0 TAGLO register
+   d# 29            $0   mtc0	\ Set CP0 TAGHI register
+
+   h# 8000.0000     $a0  set
+   d# 1024 d# 32 *  $a1  set
+   $a0 $a1          $a1  addu	\ Add cache size to give end address
+
+   \ Init Icache
+   begin
+      $a0 0  h# 8  cache	\ Index store tag primary icache
+      nop
+      $a0 0  h# 14 cache	\ Fill Icache
+      nop
+      $a0 0  h# 8  cache	\ Index store tag primary icache
+      nop
+   $a1 $a0 =  until
+      $a0 d# 32  $a0 addiu	\ Icache line size
+
+   \ Init Dcache
+   h# 8000.0000     $a0  set
+   d# 1024 d# 32 *  $a1  set
+   $a0 $a1          $a1  addu	\ Add cache size to give end address
+   begin
+      $a0 0  h# 9  cache	\ Index store tag primary dcache
+   $a1 $a0 =  until
+      $a0 d# 32  $a0 addiu	\ Dcache line size
+
+   h# 8000.0000     $a0  set
+   d# 1024 d# 32 *  $a1  set
+   $a0 $a1          $a1  addu	\ Add cache size to give end address
+   begin
+      $0 $a0 0 sw		\ Zero cache
+   $a1 $a0 =  until
+      $a0 d# 32  $a0 addiu	\ Dcache line size
+
+   h# 8000.0000     $a0  set
+   d# 1024 d# 32 *  $a1  set
+   $a0 $a1          $a1  addu	\ Add cache size to give end address
+   begin
+      $a0 0  h# 9  cache	\ Index store tag primary dcache
+   $a1 $a0 =  until
+      $a0 d# 32  $a0 addiu	\ Dcache line size
+
+   \ Restore status register
+   d# 12 v0 mtc0
+
+   ra jr  nop
+end-code
+
+\ Write-back and invalidate the VR4300 data cache.
+label flush-dcache  ( -- )   \ Destroys: $a0, $a1
+   h# 8000.0000     $a1  set
+   d# 1024 d# 32 *  $a0  set
+   $a1   $a0        $a0 addu	\ Add cache size to give end address
+
+   begin
+\      d# 28     $0  mtc0	\ Set CP0 TAGLO register
+      nop
+      $a1 0   h# 1  cache	\ op 0/1(1): index wb&invalidate primary dcache
+      nop
+   $a0  $a1  = until
+      $a1 d# 32  $a1  addiu	\ Dcache line size
+
+   ra jr  nop
+end-code
+
+\ Invalidate the VR4300 instruction cache.
+label invalidate-icache  ( -- )   \ Destroys: $a0, $a1
+   h# 8000.0000     $a1  set
+   d# 1024 d# 32 *  $a0  set
+   $a1  $a0         $a0  addu	\ Add cache size to give end address
+
+   begin
+\      d# 28          $0   mtc0	\ Set CP0 TAGLO register
+      nop
+      $a1 0  h# 0  cache	\ op 0/0(0): index invalidate primary icache
+      nop
+   $a0  $a1 =  until
+      $a1 d# 32  $a1  addiu	\ Dcache line size
+
+   ra jr  nop
+end-code
+
+label sync-cache  ( -- )   \ Destroys: $a0, $a1, $a3
+   ra $a3 move
+
+   flush-dcache      bal  nop
+   invalidate-icache bal  nop
+
+   $a3 jr  nop
+end-code
+
+[ifndef] ram-image
+fload ${BP}/cpu/mips/bonito/initbon.fth
+fload ${BP}/cpu/mips/bonito/initsb.fth
+fload ${BP}/cpu/mips/bonito/initsio.fth
+fload ${BP}/cpu/mips/bonito/initcom1.fth
+[then]
+
+\ This is the main entry point for this dropin module
+label start
+
+[ifndef] ram-image
+   \ Jump up to KSEG1
+   start asm-base - asm-origin +  bootrom-pa +  h# 10 +   k0  la
+   k0   jr  nop
+
+   \ Initialize CP0 registers
+   d# 12         v1  mfc0
+   h# 2041.0000  v0  li		\ SR_BEV, disable parity
+   v0 v1         v0  or
+   d# 12         v0  mtc0	\ Set CP0 status register
+   d# 13         $0  mtc0	\ Set CP0 cause register
+   d# 18         $0  mtc0	\ Set CP0 WATCHLO register
+   d# 19         $0  mtc0	\ Set CP0 WATCHHI register
+
+   \ Initialize hardware
+   init-bonito      bal  nop
+   init-southbridge bal  nop
+   init-sio         bal  nop
+   init-com1        bal  nop
+[then]
+
+carret  ?report
+linefeed ?report
+
+ascii A ?report
+	" start" $find-dropin,   \ Assemble call to find-dropin w/literal arg
+        v0 0 =  if
+           nop
+ascii Y ?report
+           begin again nop
+        then
+
+        v0 h# 20 v0 addi
+        v0       ra jalr
+        nop
+
+        v0 s2 move			\ Save RAM top
+        /fw-memory h# 20 +   s0  set	\ Compute firmware RAM base address
+        v0 s0 s0  sub
+
+        init-cache bal  nop nop nop nop
+
+ascii B ?report
+	" firmware" $find-dropin,   \ Assemble call to find-dropin w/literal arg
+
+        v0 0 =  if
+           nop
+ascii Z ?report
+           begin again nop
+        then
+
+ascii C ?report
+
+        v0            s1      move      \ Save address of firmware dropin
+        v0 h# c       t0      lw        \ see if compressed
+        t0 0 <> if
+           nop
+           \ The firmware dropin is compressed, so we load the inflater into RAM
+           \ and use it to inflate the firmware into RAM
+
+           " inflate" $find-dropin,
+
+ascii i ?report
+
+           v0  4          t3   addiu    \ offset to length of inflater
+           t3 1           t0   lwr	\ get size of dropin (big-endian)
+           t3 3           t0   lwr	\ get least significant half word
+           h# ffff        t1   set
+           t0      t1     $a2  and
+     
+           t3 2           t0   lwl	\ get most significant half word
+           t3 0           t0   lwl
+           h# ffff.0000   t1   set
+           t0      t1     t0   and
+           t0      $a2    $a2  or
+
+           v0 h# 20       $a1  addi     \ src: Base addr of inflater code in ROM
+           inflate-offset $a0  set      \ dst: Base address of inflater
+           memcpy         bal		\ Copy the inflater
+           nop
+
+           sync-cache     bal
+	   nop
+
+ascii n ?report
+
+           stack-offset   sp     set    \ stack for inflater
+           s0             $a1    move   \ Firmware RAM address
+           workspace-offset  $a2 set    \ Scratch RAM for inflater
+           inflate-offset t9     set    \ RAM address of inflater
+           s1 h# 20       $a0    addi   \ Adr of comp'd bits of firmware dropin
+           t9             ra     jalr   \ inflate the firmware
+           nop
+
+ascii f ?report begin again
+
+        else
+           nop
+
+ascii c ?report
+           \ The firmware dropin isn't compressed, so we just copy it to RAM
+ascii o ?report
+
+           s1  4          t3   addiu    \ offset to length of firmware
+           t3 1           t0   lwr	\ get size of dropin (big-endian)
+           t3 3           t0   lwr	\ get least significant half word
+           h# ffff        t1   set
+           t0      t1     $a2  and
+     
+           t3 2           t0   lwl	\ get most significant half word
+           t3 0           t0   lwl
+           h# ffff.0000   t1   set
+           t0      t1     t0   and
+           t0      $a2    $a2  or
+
+           s1 h# 20       $a1  addi     \ src: Skip dropin header
+           s0             $a0  move     \ dst: Firmware RAM address
+
+           memcpy         bal		\ Copy the firmware
+           nop
+
+ascii p ?report
+ascii y ?report
+
+        then
+
+        sync-cache bal  nop
+
+        \ Jump to Forth (prom-cold-code)
+        s0  h# 20  s0   addiu
+        s0  $a0         move            \ fw-RAM-base
+        s2  $a1         move            \ fw-RAM-size
+        s0  0      t0   lw		\ Read offset of prom-cold-code
+        s0  t0     s0   addu
+
+        d# 12      t0   mfc0		\ Status
+        t0  4      t0   andi		\ ERL=1 if reset exception
+        t0 0 =  if
+           nop
+           s0  jr
+           nop
+        else
+           nop
+           d# 30 s0  mtc0  nop nop nop nop nop
+           d# 14 s0  mtc0  nop nop nop nop nop
+           eret
+           nop
+        then
+
+        \ Not reached, in theory
+        begin again
+        nop
+
+end-code
+
+also mips-assembler
+start  my-entry  put-branch
+previous
+
+end-assembling
+
+writing reset.di
+asm-base  here over -  0  " reset" write-dropin
+ofd @ fclose

Added: cpu/mips/bonito/resetjmp.bth
===================================================================
--- cpu/mips/bonito/resetjmp.bth	                        (rev 0)
+++ cpu/mips/bonito/resetjmp.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,92 @@
+purpose: Reset vector handler
+copyright: Copyright 2000-2001 Firmworks  All Rights Reserved
+
+command: &native &this
+build-now
+
+\needs start-assembling  fload ${BP}/cpu/mips/asmtools.fth
+
+\ The size of this module affects the constant /resetjmp in
+\ physaddr.fth.
+
+create debug-reset
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/bonito/physaddr.fth
+fload ${BP}/cpu/mips/bonito/report.fth
+
+start-assembling
+
+hex
+
+label resetvec
+   \ **** This is the initial entry point (reset vector) for the ROM.
+   \ It just branches past the following copyright string and past the
+   \ dropin module header for the "resetvec" dropin module, landing at
+   \ the entry point for that module.  The "resetvec" dropin module
+   \ must appear in the ROM image right after the image that this file
+   \ creates.
+   here /resetjmp + h# 20 + $0 $0 beq
+   nop
+
+end-code
+	
+   \ This copyright string will appear in the ROM right after the branch
+   \ instruction.
+   " Copyright 2001 FirmWorks  All Rights Reserved" c$,
+
+   \ Locations 56-5b are reserved for a MAC address, for systems
+   \ that wish to store the MAC address in the boot ROM instead of
+   \ in a UID EEPROM.
+   h# 56 pad-to
+   h# ff c,  h# ff c,  h# ff c,  h# ff c,  h# ff c,  h# ff c,
+
+   \ We reserve ROM locations 5c-5f for the PROMICE AI port and place
+   \ a distinct signature there.  If the AI port is present and enabled
+   \ at those locations, it will overlay the ROM contents, thus allowing
+   \ the software to determine whether or not the AI port is present.
+
+   \ The signature should be tested at offset 5c+3 (5f), which is the
+   \ AI port status register.  The value d4 is present at both 5c+0
+   \ and 5c+3, in case we ever have to handle big-endian systems that
+   \ byte-swap the ROM in some modes.
+
+   h# 5c pad-to		\ Pad to the location reserved for the AI port
+   h# d4 c,  h# 5a c,  h# 5b c,  h# d4 c,  \ Signature distinct from AI port
+
+   h# 200 pad-to
+label tlbrefill
+   ascii T ?report ascii L ?report ascii B ?report
+   begin again
+   nop
+end-code
+
+   h# 280 pad-to
+label xtlbrefill
+   ascii X ?report ascii T ?report ascii L ?report ascii B ?report
+   begin again
+   nop
+end-code
+
+   h# 300 pad-to
+label cacheerr
+   ascii C ?report ascii E ?report ascii r ?report ascii r ?report
+   begin again
+   nop
+end-code
+
+   h# 380 pad-to
+label generalexc
+   ascii G ?report ascii e ?report ascii n ?report
+   begin again
+   nop
+end-code
+
+   /resetjmp pad-to
+   \ This module must have a fixed size of /resetjmp
+
+end-assembling
+
+writing resetjmp.img
+asm-base  here over -  ofd @ fputs
+ofd @ fclose

Added: cpu/mips/bonito/rom.bth
===================================================================
--- cpu/mips/bonito/rom.bth	                        (rev 0)
+++ cpu/mips/bonito/rom.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,31 @@
+purpose: Top-level build script for Bonito ROM
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+command: &native &this
+in: resetjmp.img
+in: reset.di
+in: start.di
+in: fw.img
+in: ${BP}/dev/dec21140/build/comet.fc
+in: ${BP}/dev/dec21140/build/netgear.fc
+in: ${BP}/dev/kendin/build/ks8723.fc
+in: ${BP}/dev/usb/ohci/build/ohci.fc
+build-now
+
+\needs $add-dropin  fload ${BP}/tools/mkdropin.fth
+
+\ Always re-create the builton.fth file when we make a new rom.img
+fload ${BP}/arch/mips/builton.bth
+
+writing rom.img
+   " resetjmp.img"   $add-file	\ Branch past initial dropin module header
+   " reset.di"       $add-file
+   " start.di"       $add-file
+   " fw.img"                     " firmware"  $add-deflated-dropin
+   " ${BP}/cpu/mips/inflate.img" " inflate"   $add-dropin
+   " builton.fth"                " probe-"    $add-dropin
+   " ${BP}/dev/dec21140/build/comet.fc"     " pci1317,985"   $add-deflated-dropin
+   " ${BP}/dev/dec21140/build/netgear.fc"   " pci11ad,2"     $add-deflated-dropin
+   " ${BP}/dev/kendin/build/ks8723.fc"      " pci1186,1002"  $add-deflated-dropin
+   " ${BP}/dev/usb/ohci/build/ohci.fc"      " pci1045,c861"  $add-deflated-dropin
+ofd @ fclose

Added: cpu/mips/bonito/rootnode.fth
===================================================================
--- cpu/mips/bonito/rootnode.fth	                        (rev 0)
+++ cpu/mips/bonito/rootnode.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,128 @@
+purpose: Methods for the root node using Bonito Kseg address translation
+copyright: Copyright 1998-2001 Firmworks  All Rights Reserved
+
+: root-map-in  ( phys len -- virt )
+   " /" " map-in" execute-device-method drop
+;
+: root-map-out  ( virt len -- )
+   " /" " map-out" execute-device-method drop
+;
+
+dev /
+extend-package
+
+1 encode-int  " #address-cells"  property
+
+0 0 encode-bytes
+   \  Base address                     size
+   h# 8000.0000 encode-int encode+  h# 0200.0000 encode-int encode+
+" dma-ranges" property
+
+hex
+headers
+
+\ Static methods
+: decode-unit  ( adr len -- phys )  push-hex  $number  if  0  then  pop-base  ;
+: encode-unit  ( phys -- adr len )  push-hex  (u.)  pop-base  ;
+
+\ Not-necessarily-static methods
+: open  ( -- true )  true  ;
+: close  ( -- )  ;
+
+: map-in   ( phys size -- virt )
+   drop  dup 1000.0000 u<  if
+      bfd0.0000  or
+   else
+      dup 8000.0000 u< if  h# b000.0000 or  then
+   then
+; 
+: map-out  ( virtual size -- )  2drop  ;
+
+headerless
+list: dmalist
+listnode
+   /n field >dma-ua		\ address obtained from alloc-mem, unaligned
+   /n field >dma-aa		\ address passed on to caller, cache-line aligned
+   /n field >dma-len		\ original length used to alloc-mem
+nodetype: dmanode
+
+0 dmalist !
+0 dmanode !
+0 value dma-aa
+
+: dma-aa=?  ( node -- aa=? )
+   >dma-aa @ dma-aa =
+;
+: find-dmanode?  ( -- prev-node this-node | 0 )
+   dmalist ['] dma-aa=?  find-node
+;
+: alloc-dmanode  ( -- node )
+   dmanode allocate-node dup dmalist last-node insert-after
+;
+: free-dmanode  ( prev -- )
+   delete-after dmanode free-node
+;
+
+headers
+
+\ DMA memory is accessed via kseg1 on a cache line boundary in integral # of cache lines
+: dma-alloc  ( size -- virt )
+   /cache-line + /cache-line round-up dup ( size' size' )
+   alloc-mem 2dup swap flush-d$-range 	( size ua )
+   dup /cache-line round-up kseg1 or	( size ua aa )
+   dup >r				( size ua aa ) ( R: aa )
+   alloc-dmanode			( size ua aa node ) ( R: aa )
+   tuck >dma-aa !			( size ua node ) ( R: aa )
+   tuck >dma-ua !			( size node ) ( R: aa )
+   >dma-len !				( )  ( R: aa )
+   r>
+;
+: dma-free  ( virt size -- )
+   over to dma-aa find-dmanode? ?dup  if
+      dup >dma-ua @ swap >dma-len @ free-mem
+      free-dmanode  2drop
+   else
+      free-mem
+   then
+;
+: dma-map-in  ( virt size cacheable -- devaddr )
+   drop 2dup pcicache-wbinv
+   drop h# 1fff.ffff and
+;
+: dma-map-out  ( virt devaddr size -- )  pcicache-wbinv drop  ;
+: dma-sync  ( virt devaddr size -- )  pcicache-wbinv drop  ;
+: dma-push  ( virt devaddr size -- )  pcicache-inv drop  ;
+: dma-pull  ( virt devaddr size -- )  pcicache-wbinv drop  ;
+
+finish-device
+
+device-end
+
+headerless
+\ Call this after the system-mac-address is determined, which is typically
+\ done near the end of the probing process.
+: set-system-id  ( -- )
+   system-mac-address  dup  if        ( adr 6 )
+      " /" find-device                ( adr 6 )
+
+      \ Convert the six bytes of the MAC address into a string of the
+      \ form 0NNNNNNNNNN, where N is an uppercase hex digit.
+      push-hex                        ( adr 6 )
+
+      <#  bounds  swap 1-  ?do        ( )
+         i c@  u# u#  drop            ( )
+      -1 +loop                        ( )
+      0 u# u#>                        ( adr len )
+
+      2dup upper                      ( adr len )  \ Force upper case
+
+      pop-base                        ( adr len )
+
+      encode-string  " system-id"  property   ( )
+
+      device-end
+   else
+      2drop
+   then
+;
+headers

Added: cpu/mips/bonito/start.bth
===================================================================
--- cpu/mips/bonito/start.bth	                        (rev 0)
+++ cpu/mips/bonito/start.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,219 @@
+purpose: Low-level startup code for Bonito 
+copyright: Copyright 2001 Firmworks.  All Rights Reserved.
+
+command: &native &this
+build-now
+
+\needs start-assembling  fload ${BP}/cpu/mips/asmtools.fth
+\needs write-dropin      fload ${BP}/forth/lib/mkdropin.fth
+
+create debug-reset
+\ create hard-code-memory
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/bonito/physaddr.fth
+fload ${BP}/cpu/mips/bonito/report.fth
+
+start-assembling
+
+label my-entry
+   0 ,                          \ To be patched later
+   nop
+end-code
+
+label i2creset  ( -- )
+   ra jr  nop
+end-code
+
+label i2cread  ( a0: DIMM# a1: reg# -- v0: value )  \ Destroy t0-t3
+   smbus-base isa-io-base + t0 set
+
+   $a0 1     t1 sll
+   t1  h# a1 t1 ori		\ DIMM base address and read bit
+   t1  t0    4  sb
+   $a1 t0    3  sb		\ Command
+
+   h# 48     t1 set		\ SMB_START SMB_BDRW
+   t1  t0    2  sb
+
+   d# 10000  t3 set
+   begin
+      t0 0     t1 lbu		\ Status
+      t1 h# 1e t2 andi		\ failed, bus_err, dev_err, interrupt, ok
+      t3 -1    t3 addi
+      t2 0 <>  if
+         nop  0 t3 set
+      then      
+   t3 0 = until
+      nop
+
+   t1 t0 0 sb			\ Clear pending errors/interrupts
+   t1 h# 1c t2 andi
+   -1 v0  set
+   t2 0 =  if
+      nop
+      t0 5 v0 lbu
+   then
+
+   ra jr  nop
+end-code
+
+transient
+: nodimm  ( -- )
+   " nop" evaluate
+   " 0 v0 set" evaluate
+   " h# 40 v1 set" evaluate	\ BONITO_SDCFG_AABSENT
+   " $a0 0 <>  if  nop  v1 8 v1 sll  then  s6 jr  nop" evaluate
+;
+resident
+
+label size-dimm  ( a0: DIMM# -- v0: size v1: shape )
+   ra s6 move
+
+   0 t8 set
+   0 t9 set
+
+   2 $a1 set
+   i2cread  bal  nop	\ DIMM type
+   4 t0 set
+   v0 t0 <>  if  nodimm  then
+
+   d# 31 $a1 set
+   i2cread  bal  nop    \ size per side
+   v0 0 =  if  nodimm  then
+   v0 d# 22 t8 sll	\ multiply by 4 MB
+
+   3 $a1 set
+   i2cread  bal  nop	\ # of rows
+   v0 d# -11 v0 addi
+   v0 -4     t0 addi
+   t0 0>  if  nodimm then
+   v0 03     v0 andi	\ arowbits
+   t9 v0     t9 or
+
+   4 $a1 set
+   i2cread  bal  nop	\ # of columns
+   v0 -8     v0 addi
+   v0 -4     t0 addi
+   t0 0>  if  nodimm  then
+   v0 02     v0 sll
+   v0 h# 0c  v0 andi	\ acolbits
+   t9 v0     t9 or
+
+   d# 17 $a1 set
+   i2cread  bal  nop	\ blocks/DRAM
+   4 t0 set
+   v0 t0 =  if
+      nop
+      t9 h# 10 t9 ori	\ abankbit
+   else
+      nop
+      2 t0 set
+      v0 t0 <>  if  nodimm  then
+   then
+
+   5 $a1 set
+   i2cread  bal  nop	\ number of sides
+   2 t0 set
+   v0 t0 =  if
+      nop
+      t9 h# 20 t9 ori	\ asides
+      t8 1     t8 sll	\ memory size * 2
+   else
+      nop
+      1 t0 set
+      v0 t0 <>  if  nodimm  then
+   then
+
+   6 $a1 set
+   i2cread  bal  nop	\ width
+   v0 d# -72 t0 addi
+   t0 0>  if  nodimm  then
+   v0 d# -36 t0 addi
+   t0 0>  if
+      nop
+      t9 h# 80 t9 ori	\ awidth64
+   then
+
+   $a0 0 <>  if  nop  t9 8 t9 sll  then
+   t8 v0 move
+   t9 v1 move
+
+   s6 jr  nop
+end-code
+
+label start-memory  ( -- v0: RAM size )
+   ra s7 move
+
+   i2creset  bal  nop
+
+[ifndef] hard-code-memory
+   \ DIMM 0
+   0 $a0 set
+   size-dimm  bal  nop
+   v0 s0 move
+   v1 s1 move
+
+   \ DIMM 2
+   1 $a0 set
+   size-dimm  bal  nop
+   s0 v0 s0 add			\ s0 = size
+   s1 v1 s1 or			\ s1 = shape
+[else]
+   h# 200.0000 s0 set
+   h# 4091 s1 set
+[then]
+
+   \ Set various bonito registers
+   bonito-reg-pa  t3  set
+   s1  t3  h# 0c  sw		\ sdcfg
+
+   s0 0 =  if
+      nop
+      h# 20.0000 s0  set	\ Always assume at least 4MB
+   then
+
+   0 t1 set			\ accumulate pcimembasecfg settings
+
+   \ Set bar0 mask and translation to point to SDRAM
+   $0 s0     t0 subu
+   t0 d# 23  t0 srl
+   t0 h# 1f  t0 andi
+   t1 t0     t1 or
+   t1 h# 400 t1 ori		\ cached
+
+   \ Set bar1 to minimum size to conserve PCI space
+   -1 t0 set 
+   t0 d# 11   t0 srl
+   h# 1.f000  t2 set
+   t0 t2      t0 and
+   t1 t0      t1 or
+   h# 40.0000 t2 set
+   t1 t2      t1 or
+
+   t1 t3   h# 14 sw		\ pcimembasecfg
+
+   \ Enable configuration cycles now
+   t3  h# 00    t0 lw
+   h# 20 invert t1 set
+   t0  t1       t0 and
+   t0  t3    h# 00 sw
+
+   \ Return to reset dropin
+   kseg0   t0  set
+   s0  t0  v0  add
+
+   s7  jr
+   nop
+
+end-code
+
+also mips-assembler
+start-memory  my-entry  put-branch
+previous
+
+end-assembling
+
+writing start.di
+asm-base  here over -  0  " start" write-dropin
+ofd @ fclose

Added: cpu/mips/bonito/virtaddr.fth
===================================================================
--- cpu/mips/bonito/virtaddr.fth	                        (rev 0)
+++ cpu/mips/bonito/virtaddr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,20 @@
+purpose: Virtual addresses for Bonito
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+headerless
+
+[ifdef] ram-image
+rom-base kseg0 +   value fw-virt-base		\ 1 meg of mapping space
+[else]
+0 value fw-virt-base     \ Setup later after we know the memory size
+[then]
+h# 10.0000 value fw-virt-size
+
+headers
+
+[ifdef] ram-image
+fw-virt-base fw-virt-size + ' load-base set-config-int-default
+[else]
+kseg0 h# 20.0000 + ' load-base set-config-int-default
+[then]
+0 value load-limit	\ Top address of area at load-base (set later)

Added: cpu/mips/boot.fth
===================================================================
--- cpu/mips/boot.fth	                        (rev 0)
+++ cpu/mips/boot.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,183 @@
+\ See license at end of file
+purpose: Low-level startup code for MIPS
+
+\ boot.fth -- Version for running Forth on Q-system
+
+headers
+
+\ Boot code (cold start).  The cold start code is executed
+\ when Forth is initially started.  Its job is to initialize the Forth
+\ virtual machine registers.
+
+\ 	r: cause of entry (could = xir-magic)
+\	%i6: base of physical memory (is it phys or virt?)
+\	%i7: size of physical memory 
+
+\ MAJC entry assumption: code has been placed where loader wanted it;
+\ Loader passes in physical address of base of ram to use as RAM in r8,
+\  top of RAM in r9
+
+headerless
+defer rom-init-io
+headers	\ Debugging is difficult if rom-init-environment is headerless
+defer rom-init-environment
+headerless
+defer rom-cold-hook
+
+: rom-cold  (s -- )
+   hex
+   rom-init-io				  \ Memory allocator and character I/O
+   do-init				  \ Kernel
+
+   stand-init-debug?  case
+      -1 of
+         cr ." Type 'i' to interrupt stand-init sequence" cr 
+         d# 500 ms
+         key?  if  key drop  ." Interacting" cr  interact  then
+      endof
+      1  of
+        ." Interacting" cr  interact
+      endof
+   endcase
+
+   ['] rom-init-environment guarded	  \ Environmental dependencies
+   ['] rom-cold-hook        guarded	  \ Open Firmware final startup
+
+   title
+   quit
+;
+
+: abs-jal  ( adr -- )
+   2 >> h# 3ff.ffff land  h# 0c00.0000 or  ,
+;
+
+label rom-cold-code  ( a0: fw-RAM-base a1: fw-RAM-size -- )
+
+   \ Find the base address
+[ifndef] rom-based?
+   h# 81f0.0000 $a0 set		\ Load address
+   h# 8200.0000 $a1 set		\ FW RAMtop
+[then]
+   here 8 + bal
+
+   here origin - 4 + base  set	\ base = relative address of this instruction
+   ra       base base  subu	\ Base address of Forth kernel
+
+   \ Copy the initial contents of the user area to their final positions
+
+   \ Get the address of the initial contents of the user area
+   base h# -20   t4   addi	\ Address of dictionary file header
+   ( base )  t4  d# 1  4* t1   lw	\ Size of initial dictionary
+   base t1       t1   addu	\ Address of user area image
+
+   user-size     t0   set
+   $a1  t0       up   subu	\ RAM address of user area
+   ( base )  t4  d# 2 4*  t2   lw	\ Size of user area image
+
+   'body main-task t3 set	\ Allow the exception handler to find the
+   base t3       t3   addu	\ user area by storing the address of the
+   up   t3            put	\ main user area in the "constant" main-task
+
+   \ Copy the initial User Area image to the RAM copy
+   begin
+      t2  -4  t2  addi
+      t1  t2  t3  addu
+      t3  t3      get
+      up  t2  t5  addu
+      t3  t5      put
+   t2 0 =  until
+   nop
+
+   t4 0  t4  lb		\ Get first byte of header
+   h# 10 $at li		\ Most significant byte of "branch" instruction
+   t4 $at <>  if
+   $0   t4  move		\ Delay - set flag to 0 (big-endian)
+      $0 -1  t4  addiu		\ Set flag to -1 (little-endian)
+   then
+   t4  'user in-little-endian?  sw
+
+   \ The User Area is now initialized
+   $a1 'user memtop   sw	\ Set memtop
+   up  'user up0      sw   	\ Set the up0 user variable
+   up  rp             move	\ Set return stack pointer
+   rp  'user rp0      sw	\ Set the rp0 user variable
+   rp  rs-size negate sp  addi	\ Set data stack pointer
+   sp  'user sp0      sw	\ Set the sp0 user variable
+   sp  ps-size negate t3  addi	\ Compute limit
+   sp  /n             sp  addi	\ Account for the top of stack register
+
+   t3 initial-heap-size negate t3  addi	\ Less heap
+   t3  'user limit    sw	\ Set the limit user variable
+
+[ifdef] global-dictionary
+   'body dp       t5  set
+   base t5        t5  addu
+   t1             t5  put	\ Set dp
+[else]
+   t1  'user dp       sw	\ Set the dp user variable
+[then]
+
+   \ Clear return stack area
+   rp  rs-size negate  rp  addi
+   rs-size             t0  set
+   t1  t1              t1  xor
+   begin
+     t0  -4  t0  addi
+     t1  rp      put
+   t0 0 =  until
+   nop
+   rp  rs-size  rp  addi
+
+   \ Enter Forth
+   np@ origin-  np  set
+   np  base     np  addu
+
+   'body rom-cold ip  set
+   ip  base       ip  addu
+c;
+
+[ifndef] rom-based?
+: put-jump  ( target-adr branch-adr -- )
+   tuck ( 4 - ) - rom-base +  h# 20 +  2/ 2/ h# 03ff.ffff and 
+   h# 0800.0000 or
+   swap !
+;
+[then]
+
+: install-rom-cold  ( -- )
+   " stand-init-io"  $find-name is rom-init-io
+   " stand-init"     $find-name is rom-init-environment
+   " startup"        $find-name is rom-cold-hook
+
+[ifdef] rom-based?
+   rom-cold-code origin- origin !
+[else]
+   rom-cold-code origin put-jump
+[then]
+;
+
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/broadcom/avx/68kio.fth
===================================================================
--- cpu/mips/broadcom/avx/68kio.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/68kio.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,12 @@
+purpose: Access to 68K IO space
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+headers
+68k-io-base 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!  ;

Added: cpu/mips/broadcom/avx/bcuart.fth
===================================================================
--- cpu/mips/broadcom/avx/bcuart.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/bcuart.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,21 @@
+purpose: Diagnostic (before console installation) access to serial port
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+headerless
+
+: uart@  ( reg# -- byte )  uart-base +  c@  ;	\ Read from a UART register
+: uart!  ( byte reg# -- )  uart-base +  c!  ;	\ Write to a UART register
+
+: baud  ( baud-rate -- )  drop  ;
+
+: inituarts  ( -- )
+;
+
+: ukey?    ( -- flag )  3 uart@  4 and  0<>  ;  \ Test for rcv character
+: uemit?   ( -- flag )  5 uart@  1 and  0<>  ;  \ Test for xmit ready
+: ubreak?  ( -- flag )  false  ;
+: clear-break   ( -- )  ;
+
+: ukey   ( -- char )  begin  ukey?   until  2 uart@  ;  \ Receive a character
+: uemit  ( char -- )  begin  uemit?  until  4 uart!  ;  \ Transmit a character
+headers

Added: cpu/mips/broadcom/avx/boot.fth
===================================================================
--- cpu/mips/broadcom/avx/boot.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/boot.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,198 @@
+purpose: Low-level startup code for MIPS
+copyright: Copyright 2000-2001, FirmWorks.  All Rights Reserved.
+
+\ boot.fth -- Version for running Forth on Q-system
+
+headers
+
+\ Boot code (cold start).  The cold start code is executed
+\ when Forth is initially started.  Its job is to initialize the Forth
+\ virtual machine registers.
+
+\ 	r: cause of entry (could = xir-magic)
+\	%i6: base of physical memory (is it phys or virt?)
+\	%i7: size of physical memory 
+
+\ MAJC entry assumption: code has been placed where loader wanted it;
+\ Loader passes in physical address of base of ram to use as RAM in r8,
+\  top of RAM in r9
+
+create debug-reset
+fload ${BP}/arch/mips/broadcom/avx/report.fth
+
+headerless
+defer rom-init-io
+headers	\ Debugging is difficult if rom-init-environment is headerless
+defer rom-init-environment
+headerless
+defer rom-cold-hook
+
+: rom-cold  (s -- )
+begin uart-base h# 3fd + c@ h# 20 and until
+ascii r uart-base h# 3f8 + c!
+   hex
+   rom-init-io				  \ Memory allocator and character I/O
+begin uart-base h# 3fd + c@ h# 20 and until
+ascii o uart-base h# 3f8 + c!
+   do-init				  \ Kernel
+begin uart-base h# 3fd + c@ h# 20 and until
+ascii m uart-base h# 3f8 + c!
+[ifdef] notyet
+   stand-init-debug?  if
+      cr ." Type 'i' to interrupt stand-init sequence" cr 
+      d# 200 ms
+      key?  if  key drop  ." Interacting" cr  interact  then
+   then
+[then]
+begin uart-base h# 3fd + c@ h# 20 and until
+ascii c uart-base h# 3f8 + c!
+." hello" cr
+   ['] rom-init-environment guarded	  \ Environmental dependencies
+begin uart-base h# 3fd + c@ h# 20 and until
+ascii d uart-base h# 3f8 + c!
+   ['] rom-cold-hook        guarded	  \ Open Firmware final startup
+
+   title
+   quit
+;
+
+: abs-jal  ( adr -- )
+   2 >> h# 3ff.ffff land  h# 0c00.0000 or  ,
+;
+
+label rom-cold-code  ( a0: fw-RAM-base a1: fw-RAM-size -- )
+
+[ifdef] debug-reset
+carret ?report
+linefeed ?report
+
+$a0 s7 move
+dot
+$a1 $a0 move dot
+s7 $a0 move
+
+ascii C ?report
+[then]
+
+   \ Find the base address
+[ifdef] rom-based?
+   here 8 + bal
+[else]
+   h# 81f0.0000 $a0 set
+   h# 8200.0000 $a1 set
+
+   here origin - 8 + rom-base + abs-jal	\ ra = Absolute address of next instruction
+[then]
+   here origin - 4 + base  set	\ base = relative address of this instruction
+   ra       base base  subu	\ Base address of Forth kernel
+
+   \ Copy the initial contents of the user area to their final positions
+
+ascii O ?report
+   \ Get the address of the initial contents of the user area
+   base h# -20   t4   addi
+   ( base )  t4  d# 1  4* t1   lw	\ Size of initial dictionary
+   base t1       t1   addu	\ Address of user area image
+
+   user-size     t0   set
+   $a1  t0       up   subu	\ RAM address of user area
+   ( base )  t4  d# 2 4*  t2   lw	\ Size of user area image
+
+   'body main-task t3 set	\ Allow the exception handler to find the
+   base t3       t3   addu	\ user area by storing the address of the
+   up   t3            put	\ main user area in the "constant" main-task
+
+   \ Copy the initial User Area image to the RAM copy
+   begin
+      t2  -4  t2  addi
+      t1  t2  t3  addu
+      t3  t3      get
+      up  t2  t4  addu
+      t3  t4      put
+   t2 0 =  until
+   nop
+
+ascii L ?report
+[ifdef] debug-reset
+up 0 $a0 lw dot
+up 4 $a0 lw dot
+[then]
+
+   \ The User Area is now initialized
+   $a1 'user memtop   sw	\ Set memtop
+   up  'user up0      sw   	\ Set the up0 user variable
+   up  rp             move	\ Set return stack pointer
+   rp  'user rp0      sw	\ Set the rp0 user variable
+   rp  rs-size negate sp  addi	\ Set data stack pointer
+   sp  'user sp0      sw	\ Set the sp0 user variable
+   sp  ps-size negate t3  addi	\ Compute limit
+   sp  /n             sp  addi	\ Account for the top of stack register
+
+   t3 initial-heap-size negate t3  addi	\ Less heap
+   t3  'user limit    sw	\ Set the limit user variable
+   t1  'user dp       sw	\ Set the dp user variable
+
+   \ Clear return stack area
+   rp  rs-size negate  rp  addi
+   rs-size             t0  set
+   t1  t1              t1  xor
+   begin
+     t0  -4  t0  addi
+     t1  rp      put
+   t0 0 =  until
+   nop
+   rp  rs-size  rp  addi
+
+ascii D ?report
+   \ Enter Forth
+   np@ origin-  np  set
+   np  base     np  addu
+
+   'body rom-cold ip  set
+   ip  base       ip  addu
+
+[ifdef] debug-reset
+carret ?report
+linefeed ?report
+np $a0 move dot
+base $a0 move dot
+up $a0 move dot
+tos $a0 move dot
+ip $a0 move dot
+rp $a0 move dot
+sp $a0 move dot
+carret ?report
+linefeed ?report
+np 0 $a0 lw dot
+np 4 $a0 lw dot
+np 8 $a0 lw dot
+np h# c $a0 lw dot
+np h# 10 $a0 lw dot
+np h# 14 $a0 lw dot
+carret ?report
+linefeed ?report
+ip 0 $a0 lw dot
+[then]
+
+c;
+
+: put-jump  ( target-adr branch-adr -- )
+   tuck ( 4 - ) - rom-base + ( h# 20 + )  2/ 2/ h# 03ff.ffff and 
+   h# 0800.0000 +
+   swap !
+;
+
+: install-rom-cold  ( -- )
+   " stand-init-io"  $find-name is rom-init-io
+   " stand-init"     $find-name is rom-init-environment
+   " startup"        $find-name is rom-cold-hook
+
+[ifdef] rom-based?
+   rom-cold-code origin- origin !
+[else]
+   rom-cold-code origin put-jump
+[then]
+;
+
+headers
+

Added: cpu/mips/broadcom/avx/broadcom.fth
===================================================================
--- cpu/mips/broadcom/avx/broadcom.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/broadcom.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,12 @@
+purpose: Access to Broadcom spaces
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+hex
+headers
+
+: bcl@  ( idx -- val )  bc-reg-base + l@  ;
+: bcl!  ( val idx -- )  bc-reg-base + l!  ;
+
+: bc-cfg@  ( idx -- value )  pci-reg-base + l@  ;
+: bc-cfg!  ( value idx -- )  pci-reg-base + l!  ;
+

Added: cpu/mips/broadcom/avx/devalias.fth
===================================================================
--- cpu/mips/broadcom/avx/devalias.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/devalias.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,4 @@
+devalias com1 /serial at bc002000
+devalias com2 /serial at bc002800
+devalias net /ethernet
+

Added: cpu/mips/broadcom/avx/devices.fth
===================================================================
--- cpu/mips/broadcom/avx/devices.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/devices.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,53 @@
+purpose: Load device drivers for AVX settop box
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+hex
+
+create use-flash-nvram
+
+fload ${BP}/cpu/mips/broadcom/avx/pcicfg.fth
+
+0 0  " "  " /"  begin-package
+   fload ${BP}/cpu/mips/broadcom/avx/mappci.fth		\ Map PCI to root
+   fload ${BP}/dev/pcibus.fth				\ Generic PCI bus package
+   fload ${BP}/cpu/mips/broadcom/avx/pcinode.fth	\ System-specific words for PCI
+end-package
+stand-init: PCI host bridge
+   " /pci" " init" execute-device-method drop
+;
+
+fload ${BP}/dev/pciprobe.fth			\ Generic PCI probing
+
+fload ${BP}/dev/isa/irq.fth
+
+0 0  uart-pa kseg1 + <# u#s u#> " /" begin-package
+   4 encode-int " interrupts" property
+   fload ${BP}/dev/16550pkg/ns16550p.fth
+   d# 14318000 encode-int " clock-frequency" property
+   fload ${BP}/dev/16550pkg/isa-int.fth
+end-package
+: com1  ( -- adr len )  " com1"  ;  ' com1 to fallback-device
+: use-com1  ( -- )
+   " com1" " input-device" $setenv
+   " com1" " output-device" $setenv
+;
+
+0 0  uart2-base <# u#s u#> " /" begin-package
+   4 encode-int " interrupts" property
+   fload ${BP}/dev/16550pkg/ns16550p.fth
+   d# 14318000 encode-int " clock-frequency" property
+   fload ${BP}/dev/16550pkg/isa-int.fth
+end-package
+: com2  ( -- adr len )  " com2"  ;
+
+support-package: 16550
+fload ${BP}/dev/16550pkg/16550.fth  \ Serial port support package
+end-support-package
+
+fload ${BP}/dev/flashpkg.fth
+fload ${BP}/dev/am29lv008b.fth			\ Low-level FLASH programming driver
+fload ${BP}/cpu/mips/broadcom/loadvpd.fth	\ VPD manager
+fload ${BP}/cpu/mips/broadcom/avx/flash.fth	\ Platform-specific FLASH interface
+
+: ll  ( idx -- )  dup f and 0=  if  cr u. ."   "  else  drop  then  ;
+: dump-pci  ( cfg-adr len -- )  bounds do i ll i config-l@ 8 u.r space 4  +loop  ;

Added: cpu/mips/broadcom/avx/excption.fth
===================================================================
--- cpu/mips/broadcom/avx/excption.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/excption.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,83 @@
+purpose: Exception handlers
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+headers
+hex
+
+defer exception-hook  ' noop to exception-hook
+
+: .dis1  ( addr -- )  [ also disassembler ] pc l! [ previous ] dis1  ;
+
+: .epc  ( -- )
+   epc@
+   cause@ h# 8000.0000 and  if  la1+  then
+   .dis1
+;
+
+: .badvaddr  ( -- )
+   ." Bad virtual address = " badvaddr@ u. cr reset-all
+;
+
+: (exception-handler)  ( exception# -- )
+   base @ >r  hex
+   exception-hook
+   dup (.exception)
+   .epc
+   case
+      4  of  .badvaddr  endof
+      5  of  .badvaddr  endof
+   endcase
+   r> base !
+;
+' (exception-handler) to dispatch-exceptions
+
+: ?report  ( char -- )
+   " uart-base d# 16 >> t0 lui" evaluate
+   " begin   t0 h# 3fd t1 lbu   t1 h# 20 t1 andi  t1 0 <> until  nop" evaluate
+   ( char )  " t1 set   t1 t0 h# 3f8 sb  " evaluate
+;
+
+label (tlb-handler)
+   carret ?report linefeed ?report
+   ascii T ?report ascii L ?report ascii B ?report bl ?report
+   ascii R ?report ascii e ?report ascii f ?report ascii i ?report
+   ascii l ?report ascii l ?report bl ?report
+   ascii E ?report ascii x ?report ascii c ?report ascii e ?report
+   ascii p ?report ascii t ?report ascii i ?report ascii o ?report
+   ascii n ?report
+   carret ?report linefeed ?report
+   begin again
+   nop
+end-code
+' (tlb-handler) to tlb-handler
+
+label (xtlb-handler)
+   carret ?report linefeed ?report
+   ascii X ?report ascii T ?report ascii L ?report ascii B ?report bl ?report
+   ascii R ?report ascii e ?report ascii f ?report ascii i ?report
+   ascii l ?report ascii l ?report bl ?report
+   ascii E ?report ascii x ?report ascii c ?report ascii e ?report
+   ascii p ?report ascii t ?report ascii i ?report ascii o ?report
+   ascii n ?report
+   carret ?report linefeed ?report
+   begin again
+   nop
+end-code
+' (xtlb-handler) to xtlb-handler
+
+label (cache-handler)
+   carret ?report linefeed ?report
+   ascii C ?report ascii a ?report ascii c ?report ascii h ?report
+   ascii e ?report bl ?report
+   ascii E ?report ascii r ?report ascii r ?report ascii o ?report
+   ascii r ?report bl ?report
+   ascii E ?report ascii x ?report ascii c ?report ascii e ?report
+   ascii p ?report ascii t ?report ascii i ?report ascii o ?report
+   ascii n ?report
+   carret ?report linefeed ?report
+   begin again
+   nop
+end-code
+' (cache-handler) to cache-handler
+
+headers

Added: cpu/mips/broadcom/avx/flash.fth
===================================================================
--- cpu/mips/broadcom/avx/flash.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/flash.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,277 @@
+purpose: Setup for Flash ROM access
+copyright: Copyright 1995-2001 Firmworks.  All Rights Reserved.
+
+h# 10.0000 to /flash
+
+\  Flash usage:
+\    bfc0.0000-bfc5.ffff	backup ofw	(hardware protected)
+\    bfc7.0000-bfc7.ffff	fixed VPD	(hardware protected)
+\    bfc8.0000-bfcd.ffff	new ofw
+\    bfcf.0000-bfcf.ffff	variable VPD
+\    bfce.0000-bfce.ffff	temp nvram	(hardware protected eventually)
+
+h# 0.0000 constant ofw-b-offset
+h# 8.0000 constant ofw-offset
+h# 7.0000 constant vpd-f-offset
+h# f.0000 constant vpd-v-offset
+
+/rom constant /ofw
+[ifdef] use-flash-nvram
+h# 1.0000 constant /nvram
+h# e.0000 constant nvram-offset 
+/nvram to config-size
+[then]
+h# 1.0000 constant /vpd
+/vpd to vpd-size
+
+0 value flashbase
+0 value fixed-vpd-node
+0 value var-vpd-node
+
+headerless
+: (fctl!)   ( n a -- )  flashbase +  rb!  ;  ' (fctl!)  to fctl!
+: (fdata!)  ( n a -- )  flashbase +  rb!  ;  ' (fdata!) to fdata!
+: (fc@)     ( a -- n )  flashbase +  rb@  ;  ' (fc@)    to fc@
+
+headers
+: open-flash  ( -- )
+   rom-pa /flash  root-map-in  to flashbase
+;
+: close-flash  ( -- )
+   flashbase /flash  root-map-out  0 to flashbase
+;
+' open-flash to enable-flash-writes
+
+\ flash update words
+0 value flash-offset
+0 value /max-image
+: ?partial-programmable  ( len -- len )
+   dup /max-image >  if
+      collect(
+      ." Image is too big." cr
+      )collect alert
+      abort
+   then
+   flash-offset over ['] ?partial-protected  catch  throw
+;
+: partial-erase-flash  ( len -- len )  flash-offset over partial-erase  ;
+: partial-program-flash  ( adr len -- )  flash-offset swap write-bytes  ;
+: partial-verify-flash  ( adr offset len -- )  nip flash-offset swap verify-bytes  ;
+
+' ?partial-programmable to ?programmable
+' partial-erase-flash to erase-flash
+' partial-program-flash to program-flash
+' partial-verify-flash to verify-flash
+
+\ OFW update words
+: use-ofw  ( -- ) 		\ Update primary OFW
+   ofw-offset to flash-offset
+   /ofw to /max-image
+;
+
+: use-backup-ofw  ( -- )	\ Update backup OFW, R/O on AVX product
+   ofw-b-offset to flash-offset
+   /ofw to /max-image
+;
+
+\ VPD update words
+: use-var-vpd  ( -- )		\ Update variable VPD
+   vpd-v-offset to flash-offset
+   /vpd to /max-image
+;
+
+: use-fixed-vpd  ( -- )		\ Update fixed VPD, R/O on AVX product
+   vpd-f-offset to flash-offset
+   /vpd to /max-image
+;
+
+[ifdef] use-flash-nvram
+: use-nvram  ( -- )		\ Update backup flash-based nvram
+   nvram-offset to flash-offset
+   /nvram to /max-image
+;
+[then]
+
+0 0 rom-pa <# u#s u#>  " /" begin-package
+   " flash" device-name
+   /flash value /device
+   my-address my-space /device reg
+   1 " #address-cells" integer-property
+
+   : decode-unit  ( adr len -- phys )  push-hex  $number  if  0  then  pop-base  ;
+   : encode-unit  ( phys -- adr len )  push-hex  (u.)  pop-base  ;
+
+   : map-in  ( offset size -- virt )
+      >r >r  my-address my-space r> + r> " map-in" $call-parent
+   ;
+   : map-out  ( virt size -- )  " map-out" $call-parent  ;
+   : open  ( -- flag )  true  ;
+   : close  ( -- )  ;
+
+new-device
+   0 0 vpd-f-offset <# u#s u#>  set-args
+   " vpd-fixed" device-name
+   my-address my-space /vpd reg
+   /vpd value /device
+   fload ${BP}/cpu/mips/broadcom/avx/vpdflash.fth
+
+   : write  ( adr len -- )
+      use-fixed-vpd clip-size (flash)
+   ;
+finish-device
+
+new-device
+   0 0 vpd-v-offset <# u#s u#>  set-args
+   " vpd-var" device-name
+   my-address my-space /vpd reg
+   /vpd value /device
+   fload ${BP}/cpu/mips/broadcom/avx/vpdflash.fth
+
+   : write  ( adr len -- )
+      use-var-vpd clip-size (flash)
+   ;
+finish-device
+
+[ifdef] use-flash-nvram
+new-device
+   0 0 nvram-offset <# u#s u#>  set-args
+   " flash-nvram" device-name
+   /nvram value /device
+   my-address my-space /nvram reg
+   fload ${BP}/cpu/mips/broadcom/avx/vpdflash.fth
+
+   0 value nvram-buf
+   : write  ( adr len -- len )
+       use-nvram
+       clip-size		( len' adr len' )
+       seek-ptr >r		( len adr len )  ( R: offset )
+       /device alloc-mem >r	( len adr len )  ( R: offset buf )
+       0 0 seek drop		( len adr len )  ( R: offset buf )
+       r@ /device read drop	( len adr len )  ( R: offset buf )
+       r@ -rot r> r> + swap move ( len buf )
+       dup /device (flash)	( len buf )
+       /device free-mem		( len )
+   ;
+finish-device
+[then]
+
+new-device
+   0 0 ofw-b-offset <# u#s u#>  set-args
+   " ofw" device-name
+   /rom value /device
+   my-address my-space /device reg
+   1 " #address-cells" integer-property
+
+   : decode-unit  ( adr len -- phys )  push-hex  $number  if  0  then  pop-base  ;
+   : encode-unit  ( phys -- adr len )  push-hex  (u.)  pop-base  ;
+
+   : map-in  ( offset size -- virt )
+      >r >r  my-address my-space r> + r> " map-in" $call-parent
+   ;
+   : map-out  ( virt size -- )  " map-out" $call-parent  ;
+   : open  ( -- flag )  true  ;
+   : close  ( -- )  ;
+
+   new-device
+      0 0 /resetjmp <# u#s u#>  set-args
+      " dropins" device-name
+      /rom /resetjmp - value /device
+      my-address my-space /device reg
+      fload ${BP}/dev/flashpkg.fth
+   finish-device
+
+finish-device
+
+new-device
+   0 0 ofw-offset <# u#s u#>  set-args
+   " ofw" device-name
+   /rom value /device
+   my-address my-space /device reg
+   1 " #address-cells" integer-property
+
+   : decode-unit  ( adr len -- phys )  push-hex  $number  if  0  then  pop-base  ;
+   : encode-unit  ( phys -- adr len )  push-hex  (u.)  pop-base  ;
+
+   : map-in  ( offset size -- virt )
+      >r >r  my-address my-space r> + r> " map-in" $call-parent
+   ;
+   : map-out  ( virt size -- )  " map-out" $call-parent  ;
+   : open  ( -- flag )  true  ;
+   : close  ( -- )  ;
+
+   new-device
+      0 0 /resetjmp  <# u#s u#>  set-args
+      " dropins" device-name
+      /rom /resetjmp - value /device
+      my-address my-space /device reg
+      fload ${BP}/dev/flashpkg.fth
+   finish-device
+
+finish-device
+
+end-package
+
+0 value ofw-b-node	' ofw-b-node     " ofw-backup" chosen-value
+0 value ofw-a-node	' ofw-a-node     " ofw-active" chosen-value
+0 value fixed-vpd-node  ' fixed-vpd-node " vpd-fixed"  chosen-value
+0 value var-vpd-node    ' var-vpd-node   " vpd-var"    chosen-value
+
+stand-init: rom chosen
+   ofw-b-offset <# u#s " /ofw@" hold$ u#> open-dev to ofw-b-node
+   push-hex
+   " rom"  myrombase rom-pa - <# " /dropins" hold$ u#s " /ofw@" hold$ u#>  $devalias
+   pop-base
+   myrombase rom-pa =  if
+      ofw-b-node
+   else
+      ofw-offset <# u#s " /ofw@" hold$ u#> open-dev
+   then
+   to ofw-a-node
+;
+
+[ifdef] use-flash-nvram
+stand-init: NVRAM
+   flash-type 1 = swap h# 37 = and  if
+      ." NVRAM in flash" cr
+      " /flash-nvram" open-dev to nvram-node
+      nvram-node 0=  if
+         ." The flash-based NVRAM is not working." cr
+      then
+      ['] init-config-vars catch drop
+   else
+      0 to config-size
+      ." No NVRAM" cr
+   then
+;
+[then]
+
+stand-init: VPDs
+   flash-type 1 = swap h# 37 = and  if
+      ." VPDs in flash" cr
+      " /vpd-var" open-dev dup to var-vpd-node to vpd-node
+      vpd-node 0=  if
+         ." The variable VPD is not working." cr
+      then
+      ['] init-vpd-buffer catch drop
+      " /vpd-fixed" open-dev dup to fixed-vpd-node to vpd-node
+      vpd-node 0=  if
+         ." The fixed VPD is not working." cr
+      then
+      ['] init-vpd-buffer catch drop
+   else
+      0 to vpd-size
+      ." No VPDs" cr
+   then
+;
+
+\ Words to toggle the view between the two VPDs.
+: select-fixed-vpd  ( -- )
+   fixed-vpd-node to vpd-node
+   init-vpd-buffer
+;
+
+: select-var-vpd  ( -- )
+   var-vpd-node to vpd-node
+   init-vpd-buffer
+;
+

Added: cpu/mips/broadcom/avx/fw.bth
===================================================================
--- cpu/mips/broadcom/avx/fw.bth	                        (rev 0)
+++ cpu/mips/broadcom/avx/fw.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,278 @@
+purpose: Load file for AVX settop box
+copyright: Copyright 2000-2001 FirmWorks  All Rights Reserved
+
+dictionary: ${BP}/cpu/mips/build/basefw.dic
+command: &mipsfth &dictionary &this
+build-now
+
+create rom-based?
+\ create ram-image
+
+\ ' $report-name is include-hook
+true to stand-init-debug?
+
+" dhcp" ' ip-address   set-config-string-default
+false ' auto-boot? set-config-int-default
+true ' fcode-debug? set-config-int-default
+" com1" ' output-device set-config-string-default
+" com1" ' input-device set-config-string-default
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/broadcom/avx/physaddr.fth
+fload ${BP}/cpu/mips/broadcom/avx/virtaddr.fth
+
+h#   1.0000 constant initial-heap-size
+0 value myrombase
+fload ${BP}/cpu/mips/boot.fth		\ Low-level startup code
+\ fload ${BP}/cpu/mips/broadcom/avx/boot.fth	\ Testing only
+
+: rl@  l@  ;   : rl!  l!  ;
+: rw@  w@  ;   : rw!  w!  ;
+: rb@  c@  ;   : rb!  c!  ;
+
+fload ${BP}/cpu/mips/broadcom/avx/68kio.fth	\ 68K I/O space access
+fload ${BP}/cpu/mips/broadcom/avx/broadcom.fth	\ Broadcom space access
+
+[ifdef] for-bcm93730
+fload ${BP}/cpu/mips/broadcom/avx/bcuart.fth	\ BCM97370 uart
+[else]
+fload ${BP}/arch/prep/diaguart.fth	\ Diagnostic driver for serial port
+d# 14318000 to uart-clock-frequency
+h# 2000 is uart-base
+[then]
+
+fload ${BP}/os/stand/sysuart.fth	\ Plug UART routines into key and emit
+\ ' ukey is diag-key			\ Feed UART input to "dl"
+
+h# 1000 to pagesize
+d# 12   to pageshift
+
+defer pcicache-inv      ' 2drop to pcicache-inv
+defer pcicache-wbinv	' 2drop to pcicache-wbinv
+
+fload ${BP}/cpu/mips/cache.fth		\ Cache synchronization/flushing
+fload ${BP}/cpu/mips/broadcom/avx/rootnode.fth	\ Root node mapping
+dev /
+   " AVX" model
+   " AVX" encode-string  " architecture" property
+   d# 27,000,000 " clock-frequency" integer-property
+device-end
+d# 81,000,000 to cpu-clock-speed	\ CPU clock in Hz
+
+: (cpu-arch  ( -- adr len )
+   " architecture" ['] root-node  get-package-property  drop
+   get-encoded-string
+;
+' (cpu-arch to cpu-arch
+
+[ifdef] notyet
+0 config-int next-xid
+stand-init: Next xid
+   next-xid h# 10.0000 + dup to next-xid to rpc-xid
+;
+[then]
+
+\ 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 	\ S Allow alloc-mem to use more memory
+
+: (initial-heap)  ( -- adr len )  sp0 @ ps-size -  limit  tuck -  ;
+['] (initial-heap) to initial-heap
+
+\ fload ${BP}/fm/lib/dumballo.fth		\ Rudimentary memory allocator
+
+variable bank-mask
+1 bank-mask !
+fload ${BP}/cpu/mips/probemem.fth  \ Memory probing
+stand-init: Probing memory
+   " probe" memory-node @ $call-method
+;
+
+\ Load file format handlers
+
+: call32 ;  defer .subname
+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
+' 2drop is elf-map-in
+
+\ File system
+fload ${BP}/cpu/mips/zipcrc.fth		\ Assembly portion of CRC calculation
+fload ${BP}/forth/lib/crc32.fth		\ High-level portion of CRC calculation
+
+fload ${BP}/ofw/fs/fatfs/fdisk2.fth	\ Partition map administration
+
+[ifdef] resident-packages
+support-package: fat-file-system
+   fload ${BP}/ofw/fs/fatfs/loadpkg.fth	\ FAT file system reader
+end-support-package
+
+support-package: iso9660-file-system
+   fload ${BP}/ofw/fs/cdfs/loadpkg.fth	\ ISO 9660 CD-ROM file system reader
+end-support-package
+
+support-package: disk-label
+   fload ${BP}/ofw/disklabl/loadpkg.fth	\ Disk label package
+end-support-package
+
+[ifdef]  use-ufs
+support-package: ufs-file-system
+   fload ${BP}/ofw/fs/ufs/ufs.fth		\ Unix file system
+end-support-package
+[then]
+
+support-package: ext2-file-system
+   fload ${BP}/ofw/fs/ext2fs/ext2fs.fth	\ Linux file system
+end-support-package
+
+support-package: dropin-file-system
+   fload ${BP}/ofw/fs/dropinfs.fth		\ Dropin file system
+end-support-package
+
+support-package: nfs
+   fload ${BP}/ofw/fs/nfs/loadpkg.fth
+end-support-package
+[then]
+
+\ Device Tree
+fload ${BP}/cpu/mips/broadcom/avx/devices.fth
+fload ${BP}/cpu/mips/broadcom/avx/devalias.fth
+
+: stand-init-io  ( -- )
+[ifdef] stand-init-io
+   stand-init-io
+[then]
+\   install-dumb-alloc
+   install-uart-io
+;
+
+fload ${BP}/cpu/mips/broadcom/avx/excption.fth
+fload ${BP}/cpu/mips/broadcom/avx/intr.fth
+
+[ifdef] notyet
+warning @  warning off 
+: init
+\ initial-heap add-memory
+   init
+
+   standalone?  if
+      stand-init-debug?  if
+         cr ." Type 'i' to interrupt stand-init sequence" cr 
+         d# 500 ms
+         key?  if  
+            key drop  ." Interacting" cr
+            hex interact
+         then
+      then
+   then
+;
+warning !
+[then]
+
+fload ${BP}/cpu/mips/broadcom/avx/vpd.fth
+
+: (.firmware)  ( -- )
+   ." Open Firmware  "  .built  cr
+   ." Copyright 2001 FirmWorks  All Rights Reserved" cr
+;
+' (.firmware) to .firmware
+
+headerless
+6 buffer: 'system-mac-address
+headers
+: get-mac-address  ( -- )
+   (get-vpd-mac#) 0=  if
+      6 0  do  'system-mac-address i + c!  loop
+   else
+      rom-pa h# 56 + 'system-mac-address 6 move
+      'system-mac-address @ h# ffff.ffff =  if
+         'system-mac-address 0 over c!  1+ 6 over c!  1+ 7f over c!
+         1+ 0 over c! 1+ 0 over c! 1+ 0 swap c!
+      then
+   then
+;
+headerless
+: (system-mac-address)  ( -- addr len )  'system-mac-address 6  ;
+' (system-mac-address) is system-mac-address
+headers
+
+: .mac-address  ( -- )
+   mac-address 0  do
+      dup i + c@ (.2) type 
+      i 5 <>  if  ascii : emit  then
+   loop  drop
+;
+
+: probe-all  ( -- )
+   " probe-" do-drop-in
+   probe-pci
+   get-mac-address
+   set-system-id
+   " probe+" do-drop-in
+;
+
+: copy-reboot-info  ( -- )  ;
+defer user-interface  ' quit to user-interface
+
+kseg0 to vector-base
+fload ${BP}/ofw/core/startup.fth
+: avx-banner-basics
+   cr
+   ?spaces " AVX Media Center" type cr
+   ?spaces cpu-model type ." , " (.vpd-serial$) ." , "
+   .mac-address ." , " .memory cr ?spaces
+   .firmware
+;
+' avx-banner-basics to banner-basics
+
+: bye  ( -- )
+   h# 10 bcl@  h# ffff.fffb and  h# 10 bcl!
+   4 h# 10 bcl!				\ cold reset
+   begin again
+;
+' bye to reset-all
+
+defer linux-argc
+: ((linux-argc)  ( adr len -- argc )
+   0 >r  begin
+      bl left-parse-string nip 0<>  while
+      r> 1+ >r
+   repeat  2drop
+   r>
+;
+: (linux-argc)  ( adr len -- argc )  2drop 2  ;
+' (linux-argc) to linux-argc
+
+defer linux-argv
+: (linux-argv)  ( adr len -- 'argv )
+   3 /n * over + dup alloc-mem dup >r
+   swap erase
+   r@ 3 na+ r@ na1+ !
+   tuck $cstr swap 1+ r@ 3 na+ swap cmove
+   r>
+;
+' (linux-argv) to linux-argv
+
+: linux-setup  ( -- )
+   disable-interrupts
+   kseg0 0 sync-cache
+   boot-file linux-argc to $a0
+   boot-file linux-argv to $a1
+   0 to $a2
+;
+' linux-setup to go-hook
+
+install-rom-cold
+
+.( --- Saving fw.img ...)  "" fw.img save-forth cr

Added: cpu/mips/broadcom/avx/initbc.fth
===================================================================
--- cpu/mips/broadcom/avx/initbc.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/initbc.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,139 @@
+purpose: Initialize Broadcom BCM7030RKPB1 for startup
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+transient
+: bcl!  ( data idx -- )
+   bc-reg-base + " t0 set" evaluate
+   " t1 set" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: bc-cfg!  ( data idx -- )
+   pci-reg-base + " t0 set" evaluate
+   " t1 set" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: pci-cfg!  ( data adr -- )
+   pci-cf8 " t0 set" evaluate
+   ( adr ) h# 8000.0000 or " t1 set  t1 t0 0 sw" evaluate
+   pci-cfc " t0 set" evaluate
+   ( data ) " t1 set  t1 t0 0 sw" evaluate
+;
+: pci-cfg@  ( adr -- t1: data )
+   pci-cf8 " t0 set" evaluate
+   ( adr ) h# 8000.0000 or " t1 set  t1 t0 0 sw" evaluate
+   pci-cfc " t0 set" evaluate
+   " t0 0 t1 lw" evaluate
+;
+: delay-ms  ( ms -- )
+   d# 100.0000 * d# 830 + d# 1660 / " t0 set" evaluate
+   " begin  t0 0 = until  t0 -1 t0 addi" evaluate
+;
+
+resident
+
+label init-broadcom  ( -- )   \ Destroys: t0 and t1
+   pci-reg-base t0 set		\ Enable Broadcom PCI memory and I/O
+   t0 0 t1 lw
+   t0 4 t1 lw
+   t1 7 t1 ori
+   t1 t0 4 sw
+
+[ifdef] for-bcm93730
+   h# f800.e000 h# 200 bcl!	\ ROM address range
+   h# c000.8000 h# 204 bcl!	\ Flash address range
+   h# 0400.0000 h# 208 bcl!	\ HPNA address range
+   h# 0800.0400 h# 20c bcl!	\ VOIP address range
+   h# 0c00.0800 h# 210 bcl!	\ 1394 address range
+   h# 1000.0c00 h# 214 bcl!	\ POD address range
+   h# 1560.1163 h# 230 bcl!	\ 68K bus I/O termination
+
+   \ Setup Broadcom PCI host bridge
+   pci-reg-base t0 set		\ Enable Broadcom PCI memory and I/O
+   t0 0 t1 lw
+   t0 4 t1 lw
+   t1 7 t1 ori
+   t1 t0 4 sw
+   h# 1400.0000 h# 58 bc-cfg!	\ Setup PCI MEM window BARs. Use only win 0 now.
+   h# 1400.0000 h# 5c bc-cfg!
+   h# 1400.0000 h# 60 bc-cfg!
+   h# 1400.0000 h# 64 bc-cfg!
+   h# 1300.0000 h# 68 bc-cfg!	\ Setup PCI IO window BAR. Use only win 0 now.
+   h# 0000.0000 h# 10 bc-cfg!	\ Setup PCI SDRAM win 0.
+   h# 0000.0006 h# 50 bc-cfg!	\ Setup SDRAM win0 size to 64MB
+   h# 0000.0000 h# 74 bc-cfg!	\ Setup SDRAM endianness
+   h# bfa0.0000 t0 set
+   $0 t0 0 sb
+
+   \ Setup BCM93730 PCI devices
+   0 pci-cfg@
+   h# 1501.0000 h# 10 pci-cfg!	\ BCM4413
+   h# 0000.0006 h# 04 pci-cfg!
+
+   h# 1501.1000 h# 110 pci-cfg!	\ BCM4423 CODEC
+   h# 0000.0006 h# 104 pci-cfg!
+
+   h# 1501.2000 h# 210 pci-cfg!	\ BCM4413 ENET
+   h# 0000.0006 h# 204 pci-cfg!
+
+   h# 1500.0000 h# 810 pci-cfg!	\ BCM3250
+   h# 1400.0000 h# 814 pci-cfg!
+   h# 0000.0002 h# 804 pci-cfg!
+
+   \ Setup BCM3250
+   h# b500.0000 t0 set
+   h# f8 t1 set   t1 t0 h# c6 sb
+   h# 05 t1 set   t1 t0 h# ce sb
+   t0 h# 43 t1 lbu  t1 h# 1f t1 ori  t1 t0 h# 43 sb
+   t0 h# f7 t1 lbu  t1 h# 9f t1 ori  t1 t0 h# f7 sb
+   $0 t0 h# 50 sh
+
+   h# 27 t1 set   t1 t0 h# 791 sb	\ LED
+   h# 10 t1 set   t1 t0 h# 790 sb
+   h# 01 t1 set   t1 t0 h# 797 sb
+   h# 04 t1 set   t1 t0 h# 796 sb
+   h# 20 t1 set   t1 t0 h# 799 sb
+   h# b0 t1 set   t1 t0 h# 794 sb	\ 3730
+   h# f8 t1 set   t1 t0 h# 795 sb
+   h# b0 t1 set   t1 t0 h# 79a sb
+   h# c0 t1 set   t1 t0 h# 79b sb
+   $0 t0 h# 798 sb
+   $0 t0 h# 79e sb
+
+   h# 17 t1 set   t1 t0 h# 7b0 sb	\ UART
+   h# 00 t1 set   t1 t0 h# 7b7 sb
+   h# af t1 set   t1 t0 h# 7b6 sb
+   h# 17 t1 set   t1 t0 h# 7c0 sb	\ UART
+   h# 00 t1 set   t1 t0 h# 7c7 sb
+   h# af t1 set   t1 t0 h# 7c6 sb
+
+   1 delay-ms
+   d# 12 t0 mfc0 nop nop
+   h# 3400.0000 t1 set
+   t0 t1 t0 or
+   d# 12 t0 mtc0
+   1 delay-ms
+   h# bfa0.0000 t0 set
+   1 t1 set   t1 t0 0 sb
+   1 delay-ms
+   h# bfa0.0000 t0 set
+   2 t1 set   t1 t0 0 sb
+   1 delay-ms
+   h# bfa0.0000 t0 set
+   4 t1 set   t1 t0 0 sb
+   1 delay-ms
+
+   h# b500.0000 t0 set
+   h# 89 t1 set   t1 t0 h# 794 sb	\ HELP
+   h# 86 t1 set   t1 t0 h# 795 sb
+   h# c7 t1 set   t1 t0 h# 79a sb
+   h# 8c t1 set   t1 t0 h# 79b sb
+[else]
+   h# f800.e000 h# 200 bcl!	\ ROM address range
+   h# 0007.0004 h# 204 bcl!	\ ATMEL uP address range
+   h# 000b.0008 h# 208 bcl!	\ COM ports address range
+   h# 000c.000c h# 20c bcl!	\ LED address range
+   h# 2aa3.3333 h# 230 bcl!	\ 68K bus I/O termination
+[then]
+   ra jr  nop
+end-code
+

Added: cpu/mips/broadcom/avx/initcom1.fth
===================================================================
--- cpu/mips/broadcom/avx/initcom1.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/initcom1.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,24 @@
+purpose: Initialize COM1 for startup messages
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+transient
+: isa-c!  ( data isa-adr -- )  \ t0: uart-base
+   swap " t1 set" evaluate
+   " t1 t0 rot sb" evaluate
+;
+resident
+
+\ Initialize the 16552 COM1 serial port with 14.318MHz clock
+label init-com1  ( -- )  \ Destroys t0 and t1
+
+[ifndef] for-bcm93730
+   uart-base t0 set
+   h#  3 h# 3fc isa-c!       \ RTS and DTR on
+   h# 80 h# 3fb isa-c!       \ Enable divisor latch
+   h# 5d h# 3f8 isa-c!       \ Baud rate divisor low - 9600 baud
+   h#  0 h# 3f9 isa-c!       \ Baud rate divisor high - 9600 baud
+   h#  3 h# 3fb isa-c!       \ 8 bits, no parity
+[then]
+
+   ra jr  nop
+end-code

Added: cpu/mips/broadcom/avx/intr.fth
===================================================================
--- cpu/mips/broadcom/avx/intr.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/intr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,19 @@
+purpose: Interrupt handlers
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+headers
+hex
+
+: .intr-sw  ( intr# -- )  ." Software Interrupt " u. cr  ;
+: (intr-sw0)  ( -- )  0 .intr-sw  ;  ' (intr-sw0) to intr-sw0
+: (intr-sw1)  ( -- )  1 .intr-sw  ;  ' (intr-sw1) to intr-sw1
+
+: .intr-hw  ( intr# -- )  ." Hardware Interrupt " u. cr  ;
+' dispatch-interrupt to intr-hw0
+' dispatch-interrupt to intr-hw1
+: (intr-hw2)  ( -- )  2 .intr-hw  ;  ' (intr-hw2) to intr-hw2
+: (intr-hw3)  ( -- )  3 .intr-hw  ;  ' (intr-hw3) to intr-hw3
+: (intr-hw4)  ( -- )  4 .intr-hw  ;  ' (intr-hw4) to intr-hw4
+
+headers
+

Added: cpu/mips/broadcom/avx/mappci.fth
===================================================================
--- cpu/mips/broadcom/avx/mappci.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/mappci.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,34 @@
+purpose: PCI physical address mapping to root node
+copyright: Copyright 1994-2001 FirmWorks  All Rights Reserved
+
+hex
+
+headerless
+
+\ map-pci-phys creates a virtual mapping for the PCI physical address range
+\ "paddr io? size", returning its virtual address "vaddr".  It does so by
+\ first translating the PCI physical base address "paddr io?" to the
+\ corresponding physical address in the parent node's address space (which
+\ is often the primary system bus address space, but in this case is the
+\ VL bus address space), and then calling the parent's "map-in" method.
+\ "io?" is false for PCI memory space, true for PCI I/O space.
+
+: map-pci-phys  ( paddr io? phys.hi size -- vaddr )
+   -rot 2drop  " map-in" $call-parent
+;
+
+\ >pci-devaddr translates the DMA address "parent-devaddr", which is in the
+\ parent node's physical address space, to the corresponding DMA address
+\ "pci-devaddr" in the PCI physical address space (in PCI memory space; DMA
+\ to PCI I/O space is not possible).
+
+: >pci-devaddr  ( parent-devaddr -- pci-devaddr )  h# 0  +  ;
+
+\ pci-devaddr> translates the DMA address "pci-devaddr", which is in the
+\ PCI physical address space (in PCI memory space; DMA to PCI I/O space is
+\ not possible), to the corresponding DMA address "parent-devaddr" in the
+\ parent node's physical address space.
+
+: pci-devaddr>  ( pci-devaddr -- parent-devaddr )  h# 0  -  ;
+headers
+

Added: cpu/mips/broadcom/avx/ofwfind.fth
===================================================================
--- cpu/mips/broadcom/avx/ofwfind.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/ofwfind.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,87 @@
+purpose: Start redundant OFW code
+copyright: Copyright 2001 Firmworks.  All Rights Reserved.
+
+transient
+: delay-ms  ( ms -- )
+   d# 100.0000 * d# 830 + d# 1660 / " t0 set" evaluate
+   " begin  t0 0 = until  t0 -1 t0 addi" evaluate
+;
+resident
+
+label compute-chksum  ( v0: ofw base -- v1: chksum )
+   /rom t3 set
+   0 v1 set
+
+   begin
+      t3 -1 t3 addi
+      v0 t3 t2 add
+      t2 0  t0 lbu
+      t0 v1 v1 add
+   t3 0 =  until
+   nop
+
+   ra jr  nop
+end-code
+
+label new-ofw-ok?  ( v0: current ofw base -- v0: 0 | new ofw base )
+   ra t7 move			\ Save return address
+
+carret ?report
+linefeed ?report
+ascii c ?report
+ascii h ?report
+ascii k ?report
+ascii s ?report
+ascii u ?report
+ascii m ?report
+ascii . ascii . ascii . ?report ?report ?report
+
+   h# 8.0000 t0 set
+   v0 t0 v0 or			\ new ofw base
+
+   compute-chksum  bal nop
+   v1 h# ff v1 andi
+   h# a5 t0 set
+   v1 t0 <>  if  nop  
+      0 v0 set
+   then
+
+   t7 jr  nop
+end-code
+
+\ If currently running from backup OFW and new OFW is found sanguine,
+\ ?jump-to-new-ofw will not return to the caller.  Instead, control
+\ will be transferred to the new OFW reset entry point.  Otherwise,
+\ ?jump-to-new-ofw will return to the caller to continue OFW startup.
+
+\ Preserve ra in case we return to the caller.
+
+label ?jump-to-new-ofw  ( -- )
+   ra t8 move			\ Save return address
+
+   here 4 + bal  nop
+   ra t1 move			\ Address of instruction
+
+   h# 8.0000 t0 set
+   t1 t0 t1 and
+
+   t1 0 =  if  nop		\ Running from backup OFW now
+      h# fff0.0000 t0 set
+      ra t0 v0 and		\ Current ofw base
+      new-ofw-ok?  bal nop	\ Check if new ofw is ok
+      v0 0 =  if  nop		\ No good new ofw found, use backup
+         ascii O ?report
+         ascii L ?report
+         ascii D ?report
+      else nop
+         ascii N ?report
+         ascii E ?report
+         ascii W ?report
+         d# 10 delay-ms
+         v0 jr nop		\ Jump to new ofw
+      then
+   then
+
+   t8 jr  nop			\ Return to caller
+end-code
+

Added: cpu/mips/broadcom/avx/pcicfg.fth
===================================================================
--- cpu/mips/broadcom/avx/pcicfg.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/pcicfg.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,22 @@
+purpose: Configuration space access using "configuration mechanism 1"
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+\ Ostensibly this applies to the PCI bus and thus should be in the PCI node.
+\ However, many of the host bridge registers are accessed via this mechanism,
+\ so it is convenient to make the configuration access words globally-visible.
+\ This mechanism works for several different PCI host bridges.
+
+headerless
+
+: config-map  ( config-adr -- port )
+   dup h# ffff.fffc and h# 8000.0000 or pci-cf8 rl!
+   3 and pci-cfc +
+;
+
+: config-l@  ( config-addr -- l )  config-map rl@  ;
+: config-l!  ( l config-addr -- )  config-map rl!  ;
+: config-w@  ( config-addr -- w )  config-map rw@  ;
+: config-w!  ( w config-addr -- )  config-map rw!  ;
+: config-b@  ( config-addr -- c )  config-map rb@  ;
+: config-b!  ( c config-addr -- )  config-map rb!  ;
+

Added: cpu/mips/broadcom/avx/pcinode.fth
===================================================================
--- cpu/mips/broadcom/avx/pcinode.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/pcinode.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,60 @@
+purpose: System-specific portions of PCI bus package
+copyright: Copyright 2001 Firmworks  All Rights Reserved
+
+: init  ( -- )  ;
+
+d# 33,333,333 " clock-frequency"  integer-property
+
+\ Establish limits for address space allocation
+
+pci-mem-pa to first-mem		\ 1400.0000-17ff.ffff
+first-mem h# 400.0000 + to mem-space-top
+
+pci-io-pa to first-io		\ 1300.0000-131f.ffff
+first-io h# 20.0000 + to io-space-top
+
+\ The phys.hi component of the PCI addresses below indicate the
+\ address space type (I/O = 0100.0000, Mem = 0200.0000, etc.)
+
+\ -----------PCI Address---  --Sys Addr--  ------size-----
+\  phys.hi     .mid    .low     phys.hi    .hi         .lo
+
+0 0 encode-bytes
+   0100.0000 +i 0+i     0+i  pci-io-base  +i  0+i 0020.0000 +i \ PCI I/O
+   0200.0000 +i 0+i     0+i  pci-mem-base +i  0+i 0400.0000 +i \ PCI Mem
+" ranges" property
+
+\ These package methods use the global versions of the configuration
+\ access words.
+
+: config-l@  ( config-addr -- l )  config-l@  ;
+: config-l!  ( l config-addr -- )  config-l!  ;
+: config-w@  ( config-addr -- w )  config-w@  ;
+: config-w!  ( w config-addr -- )  config-w!  ;
+: config-b@  ( config-addr -- c )  config-b@  ;
+: config-b!  ( c config-addr -- )  config-b!  ;
+
+fload ${BP}/dev/pci/intmap.fth		\ Generic interrupt mapping code
+
+\ This table describes the wiring of PCI interrupt pins at the PCI slots
+\ to ISA IRQs.
+
+create slot-map
+\  Dev#  Pin A  Pin B  Pin C  Pin D
+   e c,   2 c,  ff c,  ff c,  ff c,     \ Ethernet
+   f c,   1 c,  ff c,  ff c,  ff c,	\ Card bus
+  ff c,					\ End of list
+
+also forth definitions
+" e,f"  dup config-string pci-probe-list
+previous definitions
+
+warning @ warning off
+\ 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.
+: map-out  ( vaddr size -- )
+   over io-base u>=  if  2drop exit  then  ( vaddr size )
+   map-out                                 ( )
+;   
+warning !
+

Added: cpu/mips/broadcom/avx/physaddr.fth
===================================================================
--- cpu/mips/broadcom/avx/physaddr.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/physaddr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,46 @@
+purpose: Physical addresses for AVX
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+headerless
+
+\ create for-bcm93730			\ Comment this out for AVX board
+
+h# 0000.0000 constant ram-pa		\ 0000.0000-03ff.ffff
+h# 1000.0000 constant bc-reg-pa		\ 1000.0000-1000.4fff
+
+h# 1300.0000 constant pci-io-pa		\ 1300.0000-131f.ffff
+h# 13c0.0000 constant bc-pci-reg-pa	\ 13c0.0000-13c0.00ff
+h# 13e0.0cf8 constant bc-pci-cf8
+h# 13e0.0cfc constant bc-pci-cfc
+h# 1400.0000 constant pci-mem-pa	\ 1400.0000-17ff.ffff
+h# 1c00.0000 constant 68k-io-pa		\ 1c00.0000-1fff.ffff
+h# 1c00.1000 constant atmel-pa		\ 1c00.1000-1c00.13ff
+[ifdef] for-bcm93730
+h# 1500.07b0 constant uart-pa		\ COM1 on BCM93730
+[else]
+h# 1c00.2000 constant uart-pa		\ COM1
+[then]
+h# 1c00.2800 constant uart2-pa		\ COM2
+h# 1c00.3000 constant led-pa
+h# 1fc0.0000 constant rom-pa
+
+68k-io-pa     kseg1 + constant 68k-io-base
+pci-io-pa     kseg1 + constant pci-io-base
+pci-mem-pa    kseg1 + constant pci-mem-base
+uart-pa       kseg1 + constant uart-base
+uart2-pa      kseg1 + constant uart2-base
+bc-pci-reg-pa kseg1 + constant pci-reg-base
+bc-reg-pa     kseg1 + constant bc-reg-base
+bc-pci-cf8    kseg1 + constant pci-cf8
+bc-pci-cfc    kseg1 + constant pci-cfc
+
+h# 0400.0000 constant /ram-bank
+
+h# 400 constant /resetjmp
+
+0 constant rom-base
+h# 6.0000 constant /rom
+rom-pa   kseg1 + constant rom-pa
+rom-pa /resetjmp + constant dropin-base
+
+headers

Added: cpu/mips/broadcom/avx/report.fth
===================================================================
--- cpu/mips/broadcom/avx/report.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/report.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,41 @@
+also forth definitions
+[ifdef] debug-reset
+[ifdef] for-bcm93730
+: ?report  ( char -- )
+   " uart-base d# 16 >> t0 lui" evaluate
+   " begin  t0 h# 7b5 t1 lbu  t1 1 t1 andi  t1 0 <>  until  nop" evaluate
+   ( char )  " t1 set  t1 t0 h# 7b4 sb" evaluate
+;
+[else]
+: ?report  ( char -- )
+   " uart-base d# 16 >> t0 lui" evaluate
+   " begin   t0 h# 23fd t1 lbu   t1 h# 20 t1 andi  t1 0 <> until  nop" evaluate
+   ( char )  " t1 set   t1 t0 h# 23f8 sb  " evaluate
+;
+[then]
+[else]
+: ?report  ( char -- )  drop  ;
+[then]
+
+: putbyte ( $a0 -- )
+\   " $a0 h# f $a0 andi  $a0 h# 30 $a0 addi" evaluate
+   " $a0 h# f $a0 andi  $a0 d# -10 t1 addi" evaluate
+   " t1 0< if  nop $a0 h# 30 $a0 addi  else  nop $a0 h# 57 $a0 addi  then" evaluate
+   " begin   t0 h# 3fd t1 lbu   t1 h# 20 t1 andi  t1 0 <> until  nop" evaluate
+   " $a0 t0 h# 3f8 sb  " evaluate
+   " begin   t0 h# 3fd t1 lbu   t1 h# 20 t1 andi  t1 0 <> until  nop" evaluate
+;
+: dot ( a0 -- )
+   " uart-base t0 set  $a0 t2 move" evaluate
+   " t2 d# 28 $a0 srl  putbyte" evaluate
+   " t2 d# 24 $a0 srl  putbyte" evaluate
+   " t2 d# 20 $a0 srl  putbyte" evaluate
+   " t2 d# 16 $a0 srl  putbyte" evaluate
+   " t2 d# 12 $a0 srl  putbyte" evaluate
+   " t2 d#  8 $a0 srl  putbyte" evaluate
+   " t2 d#  4 $a0 srl  putbyte" evaluate
+   " t2 0     $a0 srl  putbyte" evaluate
+   bl ?report
+;
+previous definitions
+

Added: cpu/mips/broadcom/avx/reset.bth
===================================================================
--- cpu/mips/broadcom/avx/reset.bth	                        (rev 0)
+++ cpu/mips/broadcom/avx/reset.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,625 @@
+purpose: Low-level startup code for Intreon AVX
+copyright: Copyright 1998-2001 Firmworks  All Rights Reserved
+
+command: &native &this
+build-now
+
+create debug-reset \ Comment out in order to single step under PMON
+\ create debug-memory
+\ create debug-memory-test
+
+\needs start-assembling  fload ${BP}/cpu/mips/asmtools.fth
+\needs write-dropin      fload ${BP}/forth/lib/mkdropin.fth
+
+hex
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/broadcom/avx/physaddr.fth
+fload ${BP}/cpu/mips/broadcom/avx/report.fth
+
+create broadcom
+h# 10.0000 constant /fw-memory
+
+rom-pa constant bootrom-pa
+
+also forth definitions
+: c$,  ( adr len -- )
+   1+  here swap note-string dup allot move 4 (align)
+;
+previous definitions
+
+also mips-assembler definitions
+: $find-dropin,  ( adr len -- )
+[ifdef] notdef
+   tuck 2>r			( len )
+   here +  9 +				   \ 9 = null(1) + call+delay slot(8)
+   4 round-up			   	   \ pad string end adr to next instr-+
+   ( adr-of-find-di )  asm( $0 bgezal )asm \ jump to find-dropin call below   |
+   asm( ra  $a0   move )asm		   \ set string arg for find-dropin   |
+   2r> c$,                                 \ place string	              |
+   " find-dropin   bal"  evaluate	   \ and call find routine       <----+
+   asm( nop )asm
+[else]
+   " find-dropin bal nop" evaluate	\ call find routine
+   c$,					\ place string after delay slot
+[then]
+;
+previous definitions
+
+h# 800e.0000 constant stack-offset
+h# 800f.0000 constant workspace-offset
+h# 8010.0000 constant inflate-offset
+
+start-assembling
+
+/resetjmp h# 20 + to asm-origin	\ Skip resetjmp wad and dropin header
+
+label my-entry
+\ **** This is the primary entry point; it will contain a branch instruction
+\ that skips a few subroutines and lands at the startup sequence.  That
+\ branch instruction is patched in below.  The entry point for this module
+\ is in turn reached from a branch instruction at the beginning of the ROM,
+\ which is created by the file arch/dna/resetvec.bth
+   0 ,				\ To be patched later
+   nop
+end-code
+
+[ifdef] for-bcm93730
+transient
+create n2c h# c0 c, h# f9 c, h# a4 c, h# b0 c, h# 99 c, h# 92 c, h# 82 c, h# f8 c,
+           h# 80 c, h# 90 c, h# 88 c, h# 83 c, h# c6 c, h# a1 c, h# 86 c, h# 8e c,
+: nibble2char  ( t1: nibble -- t1: led-char )
+   " t1 h# f t1 andi" evaluate
+   " t1 0 =  if  nop  h# c0 t1 set  nop  then" evaluate
+   " 1 t0 set  t0 t1 =  if  nop  h# f9 t1 set  nop  then" evaluate
+   " 2 t0 set  t0 t1 =  if  nop  h# a4 t1 set  nop  then" evaluate
+   " 3 t0 set  t0 t1 =  if  nop  h# b0 t1 set  nop  then" evaluate
+   " 4 t0 set  t0 t1 =  if  nop  h# 99 t1 set  nop  then" evaluate
+   " 5 t0 set  t0 t1 =  if  nop  h# 92 t1 set  nop  then" evaluate
+   " 6 t0 set  t0 t1 =  if  nop  h# 82 t1 set  nop  then" evaluate
+   " 7 t0 set  t0 t1 =  if  nop  h# f8 t1 set  nop  then" evaluate
+   " 8 t0 set  t0 t1 =  if  nop  h# 80 t1 set  nop  then" evaluate
+   " 9 t0 set  t0 t1 =  if  nop  h# 90 t1 set  nop  then" evaluate
+   " d# 10 t0 set  t0 t1 =  if  nop  h# 88 t1 set  nop  then" evaluate
+   " d# 11 t0 set  t0 t1 =  if  nop  h# 83 t1 set  nop  then" evaluate
+   " d# 12 t0 set  t0 t1 =  if  nop  h# c6 t1 set  nop  then" evaluate
+   " d# 13 t0 set  t0 t1 =  if  nop  h# a1 t1 set  nop  then" evaluate
+   " d# 14 t0 set  t0 t1 =  if  nop  h# 86 t1 set  nop  then" evaluate
+   " d# 15 t0 set  t0 t1 =  if  nop  h# 8e t1 set  nop  then" evaluate
+;
+: led0!  ( t1: 16-bit -- )
+   " t1 d# 12 t1 srl" evaluate
+   nibble2char
+   " h# b500.0000 t0 set" evaluate
+   " t1 t0 h# 794 sb" evaluate
+;
+: led1!  ( t1: 16-bit -- )
+   " t1 8 t1 srl" evaluate
+   nibble2char
+   " h# b500.0000 t0 set" evaluate
+   " t1 t0 h# 795 sb" evaluate
+;
+: led2!  ( t1: 16-bit -- )
+   " t1 4 t1 srl" evaluate
+   nibble2char
+   " h# b500.0000 t0 set" evaluate
+   " t1 t0 h# 79a sb" evaluate
+;
+: led3!  ( t1: 16-bit -- )
+   nibble2char
+   " h# b500.0000 t0 set" evaluate
+   " t1 t0 h# 79b sb" evaluate
+;
+resident
+[then]
+
+\ This subroutine is used by the startup code.
+\ It compares two null-terminated strings, returning zero if they match.
+\ Destroys: r2, r3
+label strcmp  ( $a0: str1 $a1: str2 -- v0: 0 if match, nonzero if mismatch )
+   $a0  t0  move
+   begin
+      t0 0  $a2  lbu
+      $a1 0  $a3  lbu
+      $a2 $a3 <> if
+      t0 1  t0  addiu    \ (delay)
+         ra         jr
+         $a3 $a2  v0  sub  \ (delay)
+      then
+   $a2 0 = until
+      $a1 1  $a1  addiu    \ (delay)
+
+   ra      jr
+   0  v0   set             \ (delay)
+end-code
+
+\ This subroutine is used by the startup code.
+\ It searches the ROM for a dropin module whose name field matches the
+\ null-terminated string that is at the return address.
+\ Destroys: $a0-$a3, t4-t7
+label find-dropin  ( s3: rom-pa -- v0: adr | 0 )
+   ra               $a0    move	\ address of string
+   begin
+      ra 0   $a1  lbu		\ Get string byte
+   $a1 0 =  until		\ Look for null terminator
+      ra 1   ra  addiu		\ (delay) Advance to next character
+
+   \ ra now points to the byte after the null character
+   ra 3      ra  addiu		\ Round up to longword boundard
+   3 invert  $at set
+   ra $at    t7  and		\ and round
+
+\   h# 4f424d44      t4    set	\ "OBMD"
+   h# 444d424f      t4    set	\ "OBMD" little-endian
+\   bootrom-pa /resetjmp + t5    set	\ ROM base + (resetjmp wad)
+   /resetjmp t5 set
+   t5   s3   t5 add		\ active ROM base + (resetjmp wad)
+   begin
+      t5 0          t6    lw
+   t4 t6 =  while nop
+
+      strcmp              bal   \ $a1 = test$, $a0 = sought$
+      t5 h# 10       $a1  addiu	\ (delay)point to dropin name in header
+      v0 0 =  if  nop
+         t7               jr	\ return
+         t5          v0   move	\ (delay) return value is adr of "OBMD"
+      then
+
+      t5 4           t3   addiu	\ offset to size of dropin
+
+[ifdef] broadcom
+      t3 0 t1 lbu
+      t1 d# 24 t6 sll
+      t3 1 t1 lbu
+      t1 d# 16 t1 sll  t6 t1 t6 or
+      t3 2 t1 lbu
+      t1 d# 8 t1 sll   t6 t1 t6 or
+      t3 3 t1 lbu
+      t6 t1 t6 or
+[else]
+      t3 1           t0   lwr	\ get size of dropin (big-endian)
+      t3 3           t0   lwr	\ get least significant half word
+      h# ffff        t1   set
+      t0      t1     t6   and
+
+      t3 2           t0   lwl	\ get most significant half word
+      t3 0           t0   lwl
+      h# ffff.0000   t1   set
+      t0      t1     t0   and
+      t0      t6     t6   or
+[then]
+
+      t6 h# 23	     t6   addiu	\ add size + header(20) + roundup(3) to
+      t5 t6          t5   addu	\ locate next dropin
+      3 invert       $at  set
+   repeat
+      t5 $at         t5   and	\ (delay) round up
+
+      0              v0   set	\ return value is 0 (failure)
+      t7                  jr	\ No more dropins; return
+      nop
+end-code
+
+\ This subroutine is used by the startup code.
+\ It copies n (a2) bytes of memory from src (a1) to dst (a0)
+\ Destroys: a0-a3
+label memcpy  ( a0: dst a1: src a2: n -- )
+   $a0 $a2  $a2  addu		\ Ending address
+
+   $a0 $a2  <> if  nop
+      begin
+         $a1 0  $a3    lbu
+         $a1 1  $a1    addiu
+         $a3    $a0 0  sb
+      $a0 $a2  = until
+         $a0 1  $a0    addiu   \ (delay)
+   then
+
+   ra   jr  nop
+end-code
+here memcpy -  constant /memcpy
+
+\ Flush the VR4300 Data cache for the first time
+label init-cache  ( -- )  \ Destroys: $a0, $a1
+
+   \ Temporarily disable parity and CE
+   d# 12 v0 mfc0
+
+   h# 2.0000 invert t0 set
+   t0 v0 t0 and
+   h# 1.0000 t1 set
+   t0 t1 t0 or
+   d# 12 t0 mtc0
+
+ascii c ?report
+
+   \ Disable secondary cache
+   d# 16 t0 mfc0
+   h# 1007 invert t1 set
+   t0 t1 t0 and
+   d# 16 t0 mtc0
+\   t0 3 t0 ori			\ CONFIG, k0=write back
+\   t0 2 t0 ori			\ CONFIG, k0=uncached
+   t0 1 t0 ori			\ CONFIG, k0=write thru, write allocate
+   d# 16 t0 mtc0
+   nop nop nop nop
+
+ascii a ?report
+
+   \ load valid virtual addresses into the cache tags
+   d# 28            $0   mtc0	\ Set CP0 TAGLO register
+   d# 29            $0   mtc0	\ Set CP0 TAGHI register
+
+   h# 8000.0000     $a0  set
+   d# 1024 d# 32 *  $a1  set
+   $a0 $a1          $a1  addu	\ Add cache size to give end address
+
+ascii c ?report
+
+  \ Init Icache
+   begin
+      $a0 0  h# 8  cache	\ Index store tag primary icache
+      nop
+      $a0 0  h# 14 cache	\ Fill Icache
+      nop
+      $a0 0  h# 8  cache	\ Index store tag primary icache
+      nop
+   $a1 $a0 =  until
+      $a0 d# 32  $a0 addiu	\ Icache line size
+
+ascii h ?report
+
+   \ Init Dcache
+   h# 8000.0000     $a0  set
+   d# 1024 d# 32 *  $a1  set
+   $a0 $a1          $a1  addu	\ Add cache size to give end address
+   begin
+      $a0 0  h# 9  cache	\ Index store tag primary dcache
+   $a1 $a0 =  until
+      $a0 d# 32  $a0 addiu	\ Dcache line size
+
+   h# 8000.0000     $a0  set
+   d# 1024 d# 32 *  $a1  set
+   $a0 $a1          $a1  addu	\ Add cache size to give end address
+   begin
+      $0 $a0 0 sw		\ Zero cache
+   $a1 $a0 =  until
+      $a0 d# 32  $a0 addiu	\ Dcache line size
+
+   h# 8000.0000     $a0  set
+   d# 1024 d# 32 *  $a1  set
+   $a0 $a1          $a1  addu	\ Add cache size to give end address
+   begin
+      $a0 0  h# 9  cache	\ Index store tag primary dcache
+   $a1 $a0 =  until
+      $a0 d# 32  $a0 addiu	\ Dcache line size
+
+ascii e ?report
+
+   \ Restore status register
+   d# 12 v0 mtc0
+
+   ra jr  nop
+end-code
+
+\ Write-back and invalidate the VR4300 data cache.
+label flush-dcache  ( -- )   \ Destroys: $a0, $a1
+   h# 8000.0000     $a1  set
+   d# 1024 d# 32 *  $a0  set
+   $a1   $a0        $a0 addu	\ Add cache size to give end address
+
+   begin
+\      d# 28     $0  mtc0	\ Set CP0 TAGLO register
+      nop
+      $a1 0   h# 1  cache	\ op 0/1(1): index wb&invalidate primary dcache
+      nop
+   $a0  $a1  = until
+      $a1 d# 32  $a1  addiu	\ Dcache line size
+
+   ra jr  nop
+end-code
+
+\ Invalidate the VR4300 instruction cache.
+label invalidate-icache  ( -- )   \ Destroys: $a0, $a1
+   h# 8000.0000     $a1  set
+   d# 1024 d# 32 *  $a0  set
+   $a1  $a0         $a0  addu	\ Add cache size to give end address
+
+   begin
+\      d# 28          $0   mtc0	\ Set CP0 TAGLO register
+      nop
+      $a1 0  h# 0  cache	\ op 0/0(0): index invalidate primary icache
+      nop
+   $a0  $a1 =  until
+      $a1 d# 32  $a1  addiu	\ Dcache line size
+
+   ra jr  nop
+end-code
+
+label sync-cache  ( -- )   \ Destroys: $a0, $a1, $a3
+   ra $a3 move
+
+   flush-dcache      bal  nop
+   invalidate-icache bal  nop
+
+   $a3 jr  nop
+end-code
+
+fload ${BP}/cpu/mips/broadcom/avx/initbc.fth
+fload ${BP}/cpu/mips/broadcom/avx/initcom1.fth
+fload ${BP}/cpu/mips/broadcom/avx/ofwfind.fth
+
+\ This is the main entry point for this dropin module
+label start
+
+   \ Jump up to KSEG1
+\   start asm-base - asm-origin +  bootrom-pa +  h# 10 +  k0   la
+\   k0   jr  nop
+
+   \ Initialize CP0 registers
+[ifdef] for-bcm93730
+   h# 0040.0000  v0  li
+   d# 12         v0  mtc0	\ Status
+   d# 13         $0  mtc0	\ Set CP0 cause register
+   d# 18         $0  mtc0	\ Set CP0 WATCHLO register
+   d# 19         $0  mtc0	\ Set CP0 WATCHHI register
+   d# 16         t1  mfc0
+   h# 00f6.66f0  t0  set
+   t1 t0         t1  and
+   t1 3          t1  ori
+   d# 16         t1  mtc0	\ Config
+[else]
+   d# 12         v1  mfc0
+   h# 3441.0000  v0  li		\ SR_BEV, disable parity
+   v0 v1         v0  or
+   d# 12         v0  mtc0	\ Set CP0 status register
+   d# 13         $0  mtc0	\ Set CP0 cause register
+   d# 18         $0  mtc0	\ Set CP0 WATCHLO register
+   d# 19         $0  mtc0	\ Set CP0 WATCHHI register
+[then]
+
+   \ Initialize hardware
+   init-broadcom    bal  nop
+   init-com1        bal  nop
+
+   \ If currently running from backup OFW and new OFW is found sanguine,
+   \ ?jump-to-new-ofw will not return here.  Otherwise, control will
+   \ come back here for further OFW startup.
+
+   ?jump-to-new-ofw bal  nop
+
+   here 4 + bal
+   h# fff8.0000 t0 set
+   ra t0 s3 and			\ Active ROM base
+
+[ifdef] testled
+h# cdef t1 set led0!
+h# cdef t1 set led1!
+h# cdef t1 set led2!
+h# cdef t1 set led3!
+begin again
+[then]
+
+carret  ?report
+linefeed ?report
+
+ascii A ?report
+	" start" $find-dropin,   \ Assemble call to find-dropin w/literal arg
+        v0 0 =  if
+           nop
+ascii n ?report
+ascii o ?report
+bl ?report
+ascii s ?report
+ascii t ?report
+ascii a ?report
+ascii r ?report
+ascii t ?report
+           begin again nop
+        then
+
+        v0 h# 20 v0 addi
+        v0       ra jalr
+        nop
+
+        v0 s2 move			\ Save RAM top
+        /fw-memory h# 20 +   s0  set	\ Compute firmware RAM base address
+        v0 s0 s0  sub
+
+ascii B ?report
+        init-cache bal  nop nop nop nop
+
+ascii C ?report
+[ifdef] debug-memory-test
+        " test" $find-dropin,
+[else]
+	" firmware" $find-dropin,   \ Assemble call to find-dropin w/literal arg
+[then]
+
+        v0 0 =  if
+           nop
+ascii n ?report
+ascii o ?report
+bl ?report
+ascii o ?report
+ascii f ?report
+ascii w ?report
+           begin again nop
+        then
+
+ascii D ?report
+
+        v0            s1      move      \ Save address of firmware dropin
+        v0 h# c       t0      lw        \ see if compressed
+        t0 0 <> if
+           nop
+           \ The firmware dropin is compressed, so we load the inflater into RAM
+           \ and use it to inflate the firmware into RAM
+
+           " inflate" $find-dropin,
+
+ascii i ?report
+
+           v0  4          t3   addiu    \ offset to length of inflater
+
+[ifdef] broadcom
+      t3 0 t1 lbu
+      t1 d# 24 $a2 sll
+      t3 1 t1 lbu
+      t1 d# 16 t1 sll  $a2 t1 $a2 or
+      t3 2 t1 lbu
+      t1 d# 8 t1 sll   $a2 t1 $a2 or
+      t3 3 t1 lbu
+      $a2 t1 $a2 or
+[else]
+           t3 1           t0   lwr	\ get size of dropin (big-endian)
+           t3 3           t0   lwr	\ get least significant half word
+           h# ffff        t1   set
+           t0      t1     $a2  and
+     
+           t3 2           t0   lwl	\ get most significant half word
+           t3 0           t0   lwl
+           h# ffff.0000   t1   set
+           t0      t1     t0   and
+           t0      $a2    $a2  or
+[then]
+
+           v0 h# 20       $a1  addi     \ src: Base addr of inflater code in ROM
+           inflate-offset $a0  set      \ dst: Base address of inflater
+           memcpy         bal		\ Copy the inflater
+           nop
+
+ascii n ?report
+
+           sync-cache     bal
+	   nop
+
+ascii f ?report
+
+           stack-offset   sp     set    \ stack for inflater
+           s0             $a1    move   \ Firmware RAM address
+           workspace-offset  $a2 set    \ Scratch RAM for inflater
+           inflate-offset t9     set    \ RAM address of inflater
+           s1 h# 20       $a0    addi   \ Adr of comp'd bits of firmware dropin
+           t9             ra     jalr   \ inflate the firmware
+           nop
+
+ascii l ?report
+
+        else
+           nop
+
+ascii c ?report
+           \ The firmware dropin isn't compressed, so we just copy it to RAM
+ascii o ?report
+
+           s1  4          t3   addiu    \ offset to length of firmware
+
+[ifdef] broadcom
+      t3 0 t1 lbu
+      t1 d# 24 $a2 sll
+      t3 1 t1 lbu
+      t1 d# 16 t1 sll  $a2 t1 $a2 or
+      t3 2 t1 lbu
+      t1 d# 8 t1 sll   $a2 t1 $a2 or
+      t3 3 t1 lbu
+      $a2 t1 $a2 or
+[else]
+           t3 1           t0   lwr	\ get size of dropin (big-endian)
+           t3 3           t0   lwr	\ get least significant half word
+           h# ffff        t1   set
+           t0      t1     $a2  and
+     
+           t3 2           t0   lwl	\ get most significant half word
+           t3 0           t0   lwl
+           h# ffff.0000   t1   set
+           t0      t1     t0   and
+           t0      $a2    $a2  or
+[then]
+
+           s1 h# 20       $a1  addi     \ src: Skip dropin header
+           s0             $a0  move     \ dst: Firmware RAM address
+           memcpy         bal		\ Copy the firmware
+           nop
+
+ascii p ?report
+ascii y ?report
+
+        then
+
+        sync-cache bal  nop
+
+ascii E ?report
+
+        \ Jump to Forth (prom-cold-code)
+        s0  h# 20  s0   addiu
+        s0  $a0         move            \ fw-RAM-base
+
+[ifdef] debug-memory
+carret  ?report
+linefeed ?report
+$a0 s7 move
+dot
+s7 $a0 move
+[then]
+
+        s2  $a1         move            \ fw-RAM-size
+
+[ifdef] debug-memory
+$a0 s7 move
+$a1 $a0 move  dot
+s0 0 $a0 lw  dot
+s0 4 $a0 lw  dot
+s0 8 $a0 lw  dot
+s0 h# c $a0 lw  dot
+s0 h# 10 $a0 lw  dot
+s0 h# 14 $a0 lw  dot
+s0 h# 18 $a0 lw  dot
+s0 h# 1c $a0 lw  dot
+s7 $a0 move
+[then]
+
+[ifndef] debug-memory-test
+        s0  0      t0   lw		\ Read offset of prom-cold-code
+        s0  t0     s0   addu
+[then]
+
+[ifdef] debug-memory
+$a0 s7 move
+s0 $a0 move  dot
+s7 $a0 move
+[then]
+
+        here 4 + bal
+        h# fff8.0000 t0 set
+        ra t0 $a2 and			\ Active ROM base
+
+        d# 12      t0   mfc0		\ Status
+        t0  4      t0   andi		\ ERL=1 if reset exception
+        t0 0 =  if
+           nop
+           s0  jr
+           nop
+        else
+           nop
+           d# 30 s0  mtc0  nop nop nop nop nop
+           d# 14 s0  mtc0  nop nop nop nop nop
+           eret
+           nop
+        then
+
+        \ Not reached, in theory
+        begin again
+        nop
+
+end-code
+
+also mips-assembler
+start  my-entry  put-branch
+previous
+
+end-assembling
+
+writing reset.di
+asm-base  here over -  0  " reset" write-dropin
+ofd @ fclose

Added: cpu/mips/broadcom/avx/resetjmp.bth
===================================================================
--- cpu/mips/broadcom/avx/resetjmp.bth	                        (rev 0)
+++ cpu/mips/broadcom/avx/resetjmp.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,92 @@
+purpose: Reset vector handler
+copyright: Copyright 2000-2001 Firmworks  All Rights Reserved
+
+command: &native &this
+build-now
+
+\needs start-assembling  fload ${BP}/cpu/mips/asmtools.fth
+
+\ The size of this module affects the constant /resetjmp in
+\ physaddr.fth.
+
+create debug-reset
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/broadcom/avx/physaddr.fth
+fload ${BP}/cpu/mips/broadcom/avx/report.fth
+
+start-assembling
+
+hex
+
+label resetvec
+   \ **** This is the initial entry point (reset vector) for the ROM.
+   \ It just branches past the following copyright string and past the
+   \ dropin module header for the "resetvec" dropin module, landing at
+   \ the entry point for that module.  The "resetvec" dropin module
+   \ must appear in the ROM image right after the image that this file
+   \ creates.
+   here /resetjmp + h# 20 + $0 $0 beq
+   nop
+
+end-code
+	
+   \ This copyright string will appear in the ROM right after the branch
+   \ instruction.
+   " Copyright 2001 FirmWorks  All Rights Reserved" c$,
+
+   \ Locations 56-5b are reserved for a MAC address, for systems
+   \ that wish to store the MAC address in the boot ROM instead of
+   \ in a UID EEPROM.
+   h# 56 pad-to
+   h# ff c,  h# ff c,  h# ff c,  h# ff c,  h# ff c,  h# ff c,
+
+   \ We reserve ROM locations 5c-5f for the PROMICE AI port and place
+   \ a distinct signature there.  If the AI port is present and enabled
+   \ at those locations, it will overlay the ROM contents, thus allowing
+   \ the software to determine whether or not the AI port is present.
+
+   \ The signature should be tested at offset 5c+3 (5f), which is the
+   \ AI port status register.  The value d4 is present at both 5c+0
+   \ and 5c+3, in case we ever have to handle big-endian systems that
+   \ byte-swap the ROM in some modes.
+
+   h# 5c pad-to		\ Pad to the location reserved for the AI port
+   h# d4 c,  h# 5a c,  h# 5b c,  h# d4 c,  \ Signature distinct from AI port
+
+   h# 200 pad-to
+label tlbrefill
+   ascii T ?report ascii L ?report ascii B ?report
+   begin again
+   nop
+end-code
+
+   h# 280 pad-to
+label xtlbrefill
+   ascii X ?report ascii T ?report ascii L ?report ascii B ?report
+   begin again
+   nop
+end-code
+
+   h# 300 pad-to
+label cacheerr
+   ascii C ?report ascii E ?report ascii r ?report ascii r ?report
+   begin again
+   nop
+end-code
+
+   h# 380 pad-to
+label generalexc
+   ascii G ?report ascii e ?report ascii n ?report
+   begin again
+   nop
+end-code
+
+   /resetjmp pad-to
+   \ This module must have a fixed size of /resetjmp
+
+end-assembling
+
+writing resetjmp.img
+asm-base  here over -  ofd @ fputs
+ofd @ fclose

Added: cpu/mips/broadcom/avx/rom.bth
===================================================================
--- cpu/mips/broadcom/avx/rom.bth	                        (rev 0)
+++ cpu/mips/broadcom/avx/rom.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,23 @@
+purpose: Top-level build script for Intreon AVX ROM
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+command: &native &this
+in: romraw.img
+build-now
+
+\needs $add-dropin  fload ${BP}/tools/mkdropin.fth
+
+\ Always re-create the builton.fth file when we make a new rom.img
+fload ${BP}/arch/mips/builton.bth
+
+: compute-chksum  ( adr len -- chksum )
+   bounds 0 -rot  ?do  i c@ +  loop
+;
+
+writing rom.img
+   " romraw.img" $read-file		( adr len )
+   2dup  compute-chksum -rot		( chksum adr len )
+   2dup  ofd @ fputs  free-mem		( chksum )
+   h# ff and h# a5 swap - ofd @ fputc
+ofd @ fclose
+

Added: cpu/mips/broadcom/avx/romraw.bth
===================================================================
--- cpu/mips/broadcom/avx/romraw.bth	                        (rev 0)
+++ cpu/mips/broadcom/avx/romraw.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,37 @@
+purpose: Top-level build script for Intreon AVX ROM
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+command: &native &this
+in: resetjmp.img
+in: reset.di
+in: start.di
+in: test.di
+in: fw.img
+in: ${BP}/dev/kendin/build/ks8723.fc
+build-now
+
+\needs $add-dropin  fload ${BP}/tools/mkdropin.fth
+
+\ Always re-create the builton.fth file when we make a new rom.img
+fload ${BP}/arch/mips/builton.bth
+
+h# 6.0000 constant rom-size
+: pad-file  ( location -- )
+   ofd @ fsize 
+   2dup u< abort" The ROM image is too large"
+   2dup - ." Unused memory = " .d cr
+   ?do  h# ff ofd @ fputc  loop
+;
+
+writing romraw.img
+   " resetjmp.img"   $add-file	\ Branch past initial dropin module header
+   " reset.di"       $add-file
+   " start.di"       $add-file
+   " test.di"        $add-file
+   " fw.img"                     " firmware"  $add-deflated-dropin
+\   " fw.img"                     " firmware"  $add-dropin
+   " ${BP}/cpu/mips/inflate.img" " inflate"   $add-dropin
+   " builton.fth"                " probe-"    $add-dropin
+   " ${BP}/dev/kendin/build/ks8723.fc"      " pci13f0,201"  $add-deflated-dropin
+   rom-size 1- pad-file		\ reserve one byte as chksum byte
+ofd @ fclose

Added: cpu/mips/broadcom/avx/rootnode.fth
===================================================================
--- cpu/mips/broadcom/avx/rootnode.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/rootnode.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,128 @@
+purpose: Methods for the root node using Broadcom Kseg address translation
+copyright: Copyright 1998-2001 Firmworks  All Rights Reserved
+
+: root-map-in  ( phys len -- virt )
+   " /" " map-in" execute-device-method drop
+;
+: root-map-out  ( virt len -- )
+   " /" " map-out" execute-device-method drop
+;
+
+dev /
+extend-package
+
+1 encode-int  " #address-cells"  property
+
+0 0 encode-bytes
+   \  Base address                     size
+   h# 8000.0000 encode-int encode+  /ram-bank encode-int encode+
+" dma-ranges" property
+
+hex
+headers
+
+\ Static methods
+: decode-unit  ( adr len -- phys )  push-hex  $number  if  0  then  pop-base  ;
+: encode-unit  ( phys -- adr len )  push-hex  (u.)  pop-base  ;
+
+\ Not-necessarily-static methods
+: open  ( -- true )  true  ;
+: close  ( -- )  ;
+
+: map-in   ( phys size -- virt )
+   drop  dup 1400.0000 u<  if
+      pci-io-base  or
+   else
+      dup 8000.0000 u< if  pci-mem-base or  then
+   then
+; 
+: map-out  ( virtual size -- )  2drop  ;
+
+headerless
+list: dmalist
+listnode
+   /n field >dma-ua		\ address obtained from alloc-mem, unaligned
+   /n field >dma-aa		\ address passed on to caller, cache-line aligned
+   /n field >dma-len		\ original length used to alloc-mem
+nodetype: dmanode
+
+0 dmalist !
+0 dmanode !
+0 value dma-aa
+
+: dma-aa=?  ( node -- aa=? )
+   >dma-aa @ dma-aa =
+;
+: find-dmanode?  ( -- prev-node this-node | 0 )
+   dmalist ['] dma-aa=?  find-node
+;
+: alloc-dmanode  ( -- node )
+   dmanode allocate-node dup dmalist last-node insert-after
+;
+: free-dmanode  ( prev -- )
+   delete-after dmanode free-node
+;
+
+headers
+
+\ DMA memory is accessed via kseg1 on a cache line boundary in integral # of cache lines
+: dma-alloc  ( size -- virt )
+   /cache-line + /cache-line round-up dup ( size' size' )
+   alloc-mem 2dup swap flush-d$-range 	( size ua )
+   dup /cache-line round-up kseg1 or	( size ua aa )
+   dup >r				( size ua aa ) ( R: aa )
+   alloc-dmanode			( size ua aa node ) ( R: aa )
+   tuck >dma-aa !			( size ua node ) ( R: aa )
+   tuck >dma-ua !			( size node ) ( R: aa )
+   >dma-len !				( )  ( R: aa )
+   r>
+;
+: dma-free  ( virt size -- )
+   over to dma-aa find-dmanode? ?dup  if
+      dup >dma-ua @ swap >dma-len @ free-mem
+      free-dmanode  2drop
+   else
+      free-mem
+   then
+;
+: dma-map-in  ( virt size cacheable -- devaddr )
+   drop 2dup pcicache-wbinv
+   drop h# 1fff.ffff and
+;
+: dma-map-out  ( virt devaddr size -- )  pcicache-wbinv drop  ;
+: dma-sync  ( virt devaddr size -- )  pcicache-wbinv drop  ;
+: dma-push  ( virt devaddr size -- )  pcicache-inv drop  ;
+: dma-pull  ( virt devaddr size -- )  pcicache-wbinv drop  ;
+
+finish-device
+
+device-end
+
+headerless
+\ Call this after the system-mac-address is determined, which is typically
+\ done near the end of the probing process.
+: set-system-id  ( -- )
+   system-mac-address  dup  if        ( adr 6 )
+      " /" find-device                ( adr 6 )
+
+      \ Convert the six bytes of the MAC address into a string of the
+      \ form 0NNNNNNNNNN, where N is an uppercase hex digit.
+      push-hex                        ( adr 6 )
+
+      <#  bounds  swap 1-  ?do        ( )
+         i c@  u# u#  drop            ( )
+      -1 +loop                        ( )
+      0 u# u#>                        ( adr len )
+
+      2dup upper                      ( adr len )  \ Force upper case
+
+      pop-base                        ( adr len )
+
+      encode-string  " system-id"  property   ( )
+
+      device-end
+   else
+      2drop
+   then
+;
+headers

Added: cpu/mips/broadcom/avx/start.bth
===================================================================
--- cpu/mips/broadcom/avx/start.bth	                        (rev 0)
+++ cpu/mips/broadcom/avx/start.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,199 @@
+purpose: Low-level startup code for Broadcom BCM7030RKPB1 memory controller
+copyright: Copyright 2001 Firmworks.  All Rights Reserved.
+
+command: &native &this
+build-now
+
+\needs start-assembling  fload ${BP}/cpu/mips/asmtools.fth
+\needs write-dropin      fload ${BP}/forth/lib/mkdropin.fth
+
+create debug-reset
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/broadcom/avx/physaddr.fth
+fload ${BP}/cpu/mips/broadcom/avx/report.fth
+
+: bc-cfg!  ( data idx -- )
+   pci-reg-base + " t0 set" evaluate
+   " t1 set" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: bcl!  ( data idx -- )
+   bc-reg-base + " t0 set" evaluate
+   " t1 set" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: bcl-and!  ( bits idx -- )
+   bc-reg-base + " t0 set" evaluate
+   " t0 0 t2 lw" evaluate
+   " t1 set" evaluate
+   " t1 t2 t1 and" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: bcl-or!  ( bits idx -- )
+   bc-reg-base + " t0 set" evaluate
+   " t0 0 t2 lw" evaluate
+   " t1 set" evaluate
+   " t1 t2 t1 or" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: bcl-t1!  ( t1: val idx -- )
+   bc-reg-base + " t0 set" evaluate
+   " t1 t0 0 sw" evaluate
+;
+: client!  ( val client -- )
+   h# 2014 bcl!			\ RB_TMC_CLIENT_INDEX_REG
+   h# 2018 bcl!			\ RB_TMC_INDX_DATA_WR_REG
+;
+: tvrcp!  ( val idx -- )
+   h# 20e0 bcl!			\ RB_TVRCP_INDEX_ADDRS_REG
+   h# 20e4 bcl!			\ RB_TVRCP_INDEX_DATA_REG
+   1 h# 20e8 bcl!		\ RB_TVRCP_INDEX_CNTL_REG, command write
+;
+
+: delay-ms  ( ms -- )
+   d# 100.0000 * d# 830 + d# 1660 / " t0 set" evaluate
+   " begin  t0 0 = until  t0 -1 t0 addi" evaluate
+;
+
+start-assembling
+
+label my-entry
+   0 ,                          \ To be patched later
+   nop
+end-code
+
+label start-memory  ( -- v0: RAM size )
+   ra s7 move
+
+ascii s ?report
+   h# 0000.0000 h# 2254 bcl!	\ RB_TS1_X_TX_MAX_REG, primary display feeder tile hori size reg
+   h# 0000.0000 h#   a0 bcl!	\ Clear DISP_CTRL, display control reg
+   h# 0000.0000 h#   5c bcl!	\ Clear CAP_CTRL, capture control reg
+   h# fff7.ffff h#    4 bcl-and! \ PM_CTRL, enable SDRAM clock 0, undocumented bit
+   h# 0000.0000 h#    0 bcl!	\ MEM_BASE, SDRAM base at 0
+   h# 0000.0040 h#    8 bcl!	\ MEM_CTRL, set SDRAM memory size to 64MB
+   h# 0000.0000 h#    c bcl!	\ GP_CTRL, GPIO reg
+   h# 0000.0001 h#   20 bcl-or!	\ CPU_CTRL, allow chip to ack illegal read/write
+
+ascii d ?report
+   h# 0000.efff h# 20ac bcl!	\ RB_TVRCP_SOFT_RESET_APPLY_REG1
+   h# 0000.efff h# 20b0 bcl!	\ RB_TVRCP_SOFT_RESET_WITHDRAW_REG1
+   h# 0000.001f h# 20b4 bcl!	\ RB_TVRCP_SOFT_RESET_APPLY_REG2
+   h# 0000.1000 h# 20ac bcl!	\ RB_TVRCP_SOFT_RESET_APPLY_REG1
+[ifdef] for-bcm93730
+   h# 0000.8030 h# 2004 bcl!	\ RB_TMC_MODE_CONTROL_REG, tRAS, CAS latency, burst len
+[else]
+   h# 0000.8020 h# 2004 bcl!	\ RB_TMC_MODE_CONTROL_REG, tRAS, CAS latency, burst len
+[then]
+   h# 0000.00bc h# 2024 bcl!	\ RB_TMC_DELAY_REG, memory controller timer 2 reg
+   h# 0000.1402 h# 2000 bcl!	\ RB_TMC_CNTRL_CONFIG_REG, 4x2Mx16
+   h# 0000.0000 h# 2038 bcl!	\ RB_TMC_MSA_MODE_REG
+   h# 0000.1000 h# 20b0 bcl!	\ RB_TVRCP_SOFT_RESET_WITHDRAW_REG1
+
+ascii r ?report
+   h# f020 h# 00 client!	\ CPU read, wraparound-cache-reads
+   h# f021 h# 01 client!	\ CPU write, linear writes
+   h# 08a5 h# 02 client!	\ Video win display #1, linear reads
+   h# 08a2 h# 03 client!	\ Graphics display, linear reads
+   h# fff8 h# 04 client!	\ Pirhanan 3D, linear read/writes
+   h# fff5 h# 05 client!	\ Mem-to-mem DMA, linear read/writes
+   h# fff6 h# 06 client!	\ PCI, linear read/writes
+   h# fff7 h# 07 client!	\ Local 68k bus I/O, linear read/writes
+   h# 003e h# 08 client!	\ Reserved
+   h# 003c h# 09 client!	\ DMA command, linear read/writes
+   h# 003d h# 0a client!	\ Paxel, linear read/writes
+   h# 000e h# 0b client!	\ VBI write, linear writes
+   h# 000f h# 0c client!	\ VBI read #1, linear read
+   h# 0010 h# 0d client!	\ VBI read #2, linear read
+   h# 000b h# 0e client!	\ Video win capture #1, linear writes
+   h# 0006 h# 0f client!	\ Video win display #2, linear read
+   h# 001f h# 10 client!	\ Video win capture #2, reserved
+   h# 0013 h# 11 client!	\ PCM audio, linear read
+   h# 000a h# 12 client!	\ Data transport, linear read/writes
+   h# 0011 h# 13 client!	\ Audio read #1, linear read
+   h# 0012 h# 14 client!	\ Audio read #2, linear read
+   h# 0008 h# 15 client!	\ Audio write #1, linear writes
+   h# 0009 h# 16 client!	\ Audio write #2, linear writes
+   h# 08a3 h# 17 client!	\ Video scan feeder #1, video image raster reads
+   h# 08a4 h# 18 client!	\ Video scan feeder #2, video image raster reads
+   h# 0019 h# 19 client!	\ Row engine #1, video image MB accesses
+   h# 001a h# 1a client!	\ Row engine #2, video image MB accesses
+   h# 000c h# 1b client!	\ T-proc compr write, linear writes
+   h# 0014 h# 1c client!	\ T-proc DMA, linear read/writes
+   h# 000d h# 1d client!	\ V-proc DMA, linear read/writes
+   h# 001b h# 1e client!	\ DMA soft access, linear/MPEG read-writes
+   h# 0007 h# 1f client!	\ DRAM refresh
+
+ascii a ?report
+   h# 0000.0011 h# 0600 bcl-or!	\ CPU_RAH_CTRL, enable read-ahead cache
+   h# 608 bcl-t1!		\ CPU_RAH_INV_ALL
+
+   h# 0300 h# 0044 tvrcp!	\ Init PCR clock to 27Mhz
+   h# 7fff h# 0042 tvrcp!
+   h# 3000 h# 0043 tvrcp!
+   h# 0800 h# 008c tvrcp!	\ Expand the VBV buffer
+   h# 0000 h# 008d tvrcp!
+
+   \ Setup Broadcom PCI host bridge
+   h# 1400.0000 h# 58 bc-cfg!	\ Setup PCI MEM window BARs. Use only win 0 now.
+   h# 1400.0000 h# 5c bc-cfg!
+   h# 1400.0000 h# 60 bc-cfg!
+   h# 1400.0000 h# 64 bc-cfg!
+   h# 1300.0000 h# 68 bc-cfg!	\ Setup PCI IO window BAR. Use only win 0 now.
+   h# 0000.0000 h# 10 bc-cfg!	\ Setup PCI SDRAM win 0.
+   h# 0000.0006 h# 50 bc-cfg!	\ Setup SDRAM win0 size to 64MB
+   h# 0000.0000 h# 74 bc-cfg!	\ Setup SDRAM endianness
+
+ascii m ?report
+
+   \ Rudimentary memory test
+   h# 5555.aaaa t1 set
+   h# a000.0000 t0 set
+   t1 t0 0 sw
+
+   h# a000.0000 t0 set
+   h# 10.0000 t3 set
+   /ram-bank kseg1 + h# 10.0000 -  t2 set
+   h# 3333.cccc t1 set
+
+   begin
+      t0 t3 t0 add
+      t1 t0 0  sw
+   t0 t2 =  until  nop
+
+   h# a000.0000 t0 set
+   h# 5555.aaaa t2 set
+   t0 0 t1 lw
+
+   t1 t2 =  if
+   nop
+ascii G ?report
+ascii o ?report
+ascii o ?report
+ascii d ?report
+   else
+   nop
+ascii B ?report
+ascii a ?report
+ascii d ?report
+begin again  nop
+   then
+
+   \ Return to reset dropin
+   /ram-bank kseg0 + v0  set
+
+   s7  jr
+   nop
+
+end-code
+
+also mips-assembler
+start-memory  my-entry  put-branch
+previous
+
+end-assembling
+
+writing start.di
+asm-base  here over -  0  " start" write-dropin
+ofd @ fclose

Added: cpu/mips/broadcom/avx/test.bth
===================================================================
--- cpu/mips/broadcom/avx/test.bth	                        (rev 0)
+++ cpu/mips/broadcom/avx/test.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,34 @@
+purpose: A test program to run in memory
+copyright: Copyright 2001 Firmworks.  All Rights Reserved.
+
+command: &native &this
+build-now
+
+\needs start-assembling  fload ${BP}/cpu/mips/asmtools.fth
+\needs write-dropin      fload ${BP}/tools/mkdropin.fth
+
+create debug-reset
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/broadcom/avx/physaddr.fth
+fload ${BP}/cpu/mips/broadcom/avx/report.fth
+
+start-assembling
+
+label my-entry
+h# 20 pad-to
+carret ?report
+linefeed ?report
+ascii H ?report
+ascii e ?report
+ascii l ?report
+ascii l ?report
+ascii o ?report
+begin again nop
+end-code
+
+end-assembling
+
+writing test.di
+asm-base  here over -  0  " test" write-dropin
+ofd @ fclose

Added: cpu/mips/broadcom/avx/virtaddr.fth
===================================================================
--- cpu/mips/broadcom/avx/virtaddr.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/virtaddr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,12 @@
+purpose: Virtual addresses for AVX
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+headerless
+
+0 value fw-virt-base     \ Setup later after we know the memory size
+h# 10.0000 value fw-virt-size
+
+headers
+
+kseg0 h# 20.0000 + ' load-base set-config-int-default
+0 value load-limit	\ Top address of area at load-base (set later)

Added: cpu/mips/broadcom/avx/vpd.fth
===================================================================
--- cpu/mips/broadcom/avx/vpd.fth	                        (rev 0)
+++ cpu/mips/broadcom/avx/vpd.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,44 @@
+purpose: Specific name=value VPD variable manager
+copyright: Copyright 2001 FirmWorks  All Rights Reserved
+
+hex
+
+\ Serial number words
+: (get-vpd-serial$)  ( -- $ )
+   " serial-num" $getvpd  if
+      " serial-num not found"
+   then
+;
+: get-vpd-serial$  ( -- $ )  select-fixed-vpd (get-vpd-serial$)  ;
+: (.vpd-serial$)  ( -- )  (get-vpd-serial$) type  ;
+: .vpd-serial$  ( -- )  select-fixed-vpd (.vpd-serial$)  ;
+
+\ Ethernet mac address words
+0 value mac-cnt
+: (get-vpd-mac$)  ( -- true | mac$ false )  " eth-mac-addr" $getvpd  ;
+: get-vpd-mac$  ( -- true | mac$ false )  select-fixed-vpd (get-vpd-mac$)  ;
+: (get-vpd-mac#)  ( -- true | m6 m5 m4 m3 m2 m1 false )
+   (get-vpd-mac$) ?dup  if  exit  then
+   0 to mac-cnt
+   ( mac$ )  6 0  do
+      ascii : left-parse-string
+      $number  ?leave
+      dup d# 255 >  if  drop leave  then
+      -rot
+      mac-cnt 1+ to mac-cnt
+   loop
+   ( rem-mac$ )  nip
+   mac-cnt 6 <> or  if
+      mac-cnt 0  ?do  drop  loop  true
+   else
+      swap 2swap swap 2>r 2swap swap 2r> 2swap false
+   then
+;
+: get-vpd-mac#  ( -- true | m6 m5 m4 m3 m2 m1 false )
+   select-fixed-vpd (get-vpd-mac#)
+;
+: (.vpd-mac)  ( -- )
+   (get-vpd-mac$)  if  " eth-mac-addr not found"  then
+   type
+;
+: .vpd-mac  ( -- )  select-fixed-vpd (.vpd-mac)  ;

Added: cpu/mips/build/build
===================================================================
--- cpu/mips/build/build	                        (rev 0)
+++ cpu/mips/build/build	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,2 @@
+#!/bin/sh
+qemu-mipsel ../Linux/build $@


Property changes on: cpu/mips/build/build
___________________________________________________________________
Added: svn:executable
   + *

Added: cpu/mips/builder.bth
===================================================================
--- cpu/mips/builder.bth	                        (rev 0)
+++ cpu/mips/builder.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,35 @@
+purpose: Builder load file for MIPS
+\ See license at end of file
+
+dictionary: ${BP}/cpu/mips/build/tools.dic
+command: &mipsfth &dictionary &this
+build-now
+
+fload ${BP}/ofw/tokenizer/tokenize.fth	\ Tokenizer
+fload ${BP}/forth/lib/builder.fth	\ Builder
+
+.( --- Saving builder.dic --- )  " builder.dic" $save-forth cr
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/builton.bth
===================================================================
--- cpu/mips/builton.bth	                        (rev 0)
+++ cpu/mips/builton.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,69 @@
+purpose: Create "builton.fth" file containing the current date
+\ See license at end of file
+
+command: &native &this
+build-now
+
+\needs today         fload ${BP}/forth/lib/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$
+
+" d# " put$
+base @ decimal
+now (.) put$  <# u# u# u#> put$  <# u# u# u#>  put$
+base !
+"  constant built-time-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
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cache.fth
===================================================================
--- cpu/mips/cache.fth	                        (rev 0)
+++ cpu/mips/cache.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,133 @@
+purpose: Cache operations for MIPS
+\ See license at end of file
+
+h#     8000 constant /dcache
+h#     8000 constant /icache
+
+d# 32 constant /cache-line
+: cache-bounds  ( adr len -- end start )
+   bounds  swap /cache-line round-up  swap /cache-line round-down
+;
+
+\ TLB cache operations
+\ XXX secondary cache operations depends on processor
+code invalidate-i$-entry  ( adr -- )
+   tos 0  h# 12  cache	\ Invalidate secondary I$
+   tos 0  h# 10  cache	\ Invalidate primary I$
+   sp tos pop
+c;
+code write-d$-entry  ( adr -- )
+   tos 0  h# 19  cache     \ WriteBack primary D$
+   tos 0  h# 1b  cache     \ WriteBack secondary D$
+   sp tos pop
+c;
+code flush-d$-entry  ( adr -- )
+   tos 0  h# 15  cache     \ WriteBack&Invalidate primary D$
+   tos 0  h# 17  cache     \ WriteBack&Invalidate secondary D$
+   sp tos pop
+c;
+
+\ KSEG0 cache operations
+code invalidate-i$-index  ( -- )
+   kseg0   t0    set
+   /icache t1    set
+   t0      t1 t1 addu
+
+   begin
+      t0 0  0  cache	   \ Index Invalidate primary I$
+      nop
+      t0 /cache-line t0 addiu
+   t0 t1 =  until
+      nop
+c;
+code flush-d$-index  ( -- )
+   kseg0   t0    set
+   /dcache t1    set
+   t0      t1 t1 addu
+
+   begin
+      t0 0  1  cache	   \ Index WriteBack&Invalidate primary D$
+      nop
+      t0 /cache-line t0 addiu
+   t0 t1 =  until
+      nop
+c;
+
+
+
+: flush-d$-range  ( adr len -- )
+   over h# f000.0000 and dup
+   kseg1 =  if  3drop exit  then
+   kseg0 =  if
+      2drop  flush-d$-index
+   else
+      cache-bounds  ?do  i flush-d$-entry  /cache-line +loop
+   then
+;
+
+: stand-sync-cache  ( adr len -- )
+   over h# f000.0000 and dup
+   kseg1 =  if  3drop exit  then
+   kseg0 =  if
+      2drop  flush-d$-index  invalidate-i$-index
+   else
+      cache-bounds  ?do
+          i write-d$-entry
+          i invalidate-i$-entry
+      /cache-line +loop
+   then
+;
+: stand-init-io  ( -- )
+   stand-init-io
+   ['] stand-sync-cache to sync-cache
+;
+
+code get-dtag ( index -- )
+   tos 0 5 cache
+   sp tos pop
+c;
+code get-itag ( index -- )
+   tos 0 4 cache
+   sp tos pop
+c;
+
+: (.tag)  ( -- )
+   taglo@  h# c0 and if  taglo@ h# ffff.ff00 and 4 << u.  then
+;
+defer .tag  ' (.tag) to .tag
+: .dtags  ( -- )
+   kseg0 /dcache bounds do
+     i get-dtag .tag
+   /cache-line +loop
+;
+: .itags  ( -- )
+   kseg0 /icache bounds do
+     i get-itag .tag
+   /cache-line +loop
+;
+
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/call.fth
===================================================================
--- cpu/mips/call.fth	                        (rev 0)
+++ cpu/mips/call.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,55 @@
+purpose: C subroutine call interface for MIPS
+\ See license at end of file
+
+code sp-call  ( [ arg5 .. arg0 ] adr sp -- [ arg5 .. arg0 ] result )
+
+   sp   t0   pop		\ Get the subroutine address
+
+   sp   'user saved-sp  sw	\ Save for callbacks
+   rp   'user saved-rp  sw	\ Save for callbacks
+
+   tos  h# -10 /n*  t1   addiu	\ Point to the new stack, leaving some extra
+				\ room since the compiler preamble stores
+				\ things above the stack pointer
+
+   \ Pass up to 6 arguments (first 0-3 in registers, 4 and 5 on the stack)
+   sp 0 /n*   $a0  lw
+   sp 1 /n*   $a1  lw
+   sp 2 /n*   $a2  lw
+   sp 3 /n*   $a3  lw
+   sp 4 /n*   t2  lw    t2  t1 0 /n*  sw
+   sp 5 /n*   t2  lw    t2  t1 1 /n*  sw
+
+   t1  sp  move			\ Switch to the new stack
+
+   t0 ra jalr  nop		\ Call the subroutine
+
+   'user saved-rp  rp  lw	\ Restore the return stack pointer
+   'user saved-sp  sp  lw	\ Restore the stack pointer
+   v0   tos   move		\ Return subroutine result
+c;
+: call  ( [ arg5 .. arg0 ] adr -- [ arg5 .. arg0 ] result )  sp@ sp-call  ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/catchexc.fth
===================================================================
--- cpu/mips/catchexc.fth	                        (rev 0)
+++ cpu/mips/catchexc.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,338 @@
+purpose: Exception handling for MIPS
+\ See license at end of file
+
+defer enterforth-hook ' noop is enterforth-hook
+
+only forth also hidden also  forth definitions
+headerless
+
+: enterforth  ( -- )
+   state-valid on
+   my-self to %saved-my-self
+   enterforth-hook
+   handle-breakpoint
+;
+
+: (breakpoint-trap?)  exception# 3 =  ;
+' (breakpoint-trap?) to breakpoint-trap?
+
+: .go-message  ( -- )
+   \ Restarting is only possible if the state that was first saved
+   \ is from a restartable exception.
+   state-valid @  -1 =  already-go? and  if
+      restartable? on
+      ." Type  'go' to resume" cr
+   then
+;
+
+: .entry  ( -- )
+   [ also hidden ]
+   talign		\ ... in case dp is misaligned
+
+   aborted? @  if
+      aborted? off  hex cr  ." Keyboard interrupt" cr  .go-message   exit
+   then
+   [ previous ]
+;
+' .entry is .exception
+
+\ create debug-break
+[ifdef] debug-break
+: ?report  ( char -- )
+   " h# bfd0.0000 v0 set" evaluate
+   " begin   v0 h# 3fd v1 lbu   v1 h# 20 v1 andi  v1 0 <> until  nop" evaluate
+   ( char )  " v1 set   v1 v0 h# 3f8 sb  " evaluate
+   " begin   v0 h# 3fd v1 lbu   v1 h# 20 v1 andi  v1 0 <> until  nop" evaluate
+;
+
+: putbyte ( $a0 -- )
+   " $a0 h# f $a0 andi  $a0 h# 30 $a0 addi" evaluate
+   " begin   v0 h# 3fd v1 lbu   v1 h# 20 v1 andi  v1 0 <> until  nop" evaluate
+   " $a0 v0 h# 3f8 sb  " evaluate
+   " begin   v0 h# 3fd v1 lbu   v1 h# 20 v1 andi  v1 0 <> until  nop" evaluate
+;
+: dot ( a0 -- )
+   " h# bfd0.0000 v0 set  $a0 t2 move" evaluate
+   " t2 d# 28 $a0 srl  putbyte" evaluate
+   " t2 d# 24 $a0 srl  putbyte" evaluate
+   " t2 d# 20 $a0 srl  putbyte" evaluate
+   " t2 d# 16 $a0 srl  putbyte" evaluate
+   " t2 d# 12 $a0 srl  putbyte" evaluate
+   " t2 d#  8 $a0 srl  putbyte" evaluate
+   " t2 d#  4 $a0 srl  putbyte" evaluate
+   " t2 0     $a0 srl  putbyte" evaluate
+;
+[else]
+: ?report  ( char -- )  drop  ;
+[then]
+
+0 value (restart-loc
+code (restart  ( -- )
+
+   \ Restore the Forth stacks.
+   \ Establish the Data and Return stacks
+   'user rp0  rp  lw
+   'user sp0  sp  lw
+   \ Account for the presence of the top of stack register
+   sp /n   sp   addiu
+
+   \ Restore the Forth Data and Return stacks from the save area.
+
+   \ Data Stack
+   'user sp0    t3  lw
+   'user pssave t0  lw		\ Address of data stack save area
+   ps-size      t1  set		\ Size of data stack area
+   t0 t1        t1  add		\ End address of data stack save area
+   begin
+      t1 -4  t1  addiu		\ Advance save area pointer
+      t1     t2  get            \ Read word from save area
+      t3 -4  t3  addiu		\ Advance stack pointer
+   t1 t0 = until
+      t2     t3  put		\ Write word to stack
+
+   \ Return Stack
+   'user rp0    t3  lw
+   'user rssave t0  lw		\ Address of return stack save area
+   rs-size      t1  set		\ Size of return stack area
+   t0 t1        t1  add		\ End address of stack save area
+   begin
+      t1 -4  t1  addiu		\ Advance save area pointer
+      t1     t2  get            \ Read word from save area
+      t3 -4  t3  addiu		\ Advance stack pointer
+   t1 t0 = until
+      t2     t3  put		\ Write word to stack
+
+   \ Have to turn off interrupts temporarily until we are done with
+   \ using k0 and k1 because interrupt handling needs them too.
+
+   d# 12 t0 mfc0
+   h# ffff.fffe t1 set
+   t1 t0 t1 and
+   d# 12 t1 mtc0
+   nop nop nop nop
+
+   \ Now it's safe to use k0 and k1
+
+   \ Restore registers
+   here origin- to (restart-loc
+   1.0001  k1  set	\ Will be address of cpu-state (force 2 instructions)
+
+   $0  k1 addr %state-valid cpu-state -  sd	\ Unlock cpu-state
+
+   k1 addr $lo   cpu-state - t0  ld    t0 mtlo
+   k1 addr $hi   cpu-state - t0  ld    t0 mthi
+
+   d# 12 t0 mfc0	\ Get status register
+   t0 d# 28  t0  srl	\ Shift coprocessor status bits down
+   t0 h# 02  t0  andi	\ Mask bit 1 (coprocessor 1 - Floating point)
+   t0 $0 <>  if		\ Skip if coprocessor disabled
+      nop
+      k1 addr $fcsr cpu-state - t0  ld    d# 31 t0 ctc1
+   then
+
+   d# 26 0  do
+      k1  i 3 + /x* ( offset ) $0 i + ( reg# )   ld
+   loop
+   d# 4 0  do
+      k1  i 3 + d# 28 + /x* ( offset ) $0 i d# 28 + + ( reg# )   ld
+   loop
+
+   k1  addr $sr cpu-state -  k0  ld   
+   k1  addr $pc cpu-state -  k1  ld
+
+[ifdef] debug-break
+bl ?report
+k1 $a0 move dot
+bl ?report
+[then]
+
+   k1  jr
+   d# 12 k0 mtc0		\ Restore Status Register
+   nop
+
+end-code
+' (restart is restart
+' (restart is restart-step
+
+headerless
+0 value save-state-loc
+headers
+
+label reenter  ( base -- )
+ascii ~ ?report
+
+   'body main-task  up  li	\ User pointer address
+   base  up   up        addu
+   up    0    up        lw
+
+   \ Establish the Data and Return stacks
+   \ Copy the entire Forth Data and Return stacks areas to a save area.
+   \ Data Stack
+   'user sp0    sp  lw
+   sp           t3  move
+   'user pssave t0  lw		\ Address of data stack save area
+   ps-size      t1  set		\ Size of data stack area
+   t0 t1        t1  add		\ End address of data stack save area
+   begin
+      t3 -4  t3  addiu		\ Advance data stack pointer
+      t1 -4  t1  addiu		\ Advance save area pointer
+      t3     t2  get		\ Read word from stack
+   t1 t0 = until
+      t2     t1  put		\ Write word to save area
+
+   \ Account for the presence of the top of stack register
+   sp /n   sp   addiu
+   
+   \ Return Stack
+   'user rp0    rp  lw
+   
+   rp           t3  move
+   'user rssave t0  lw		\ Address of return stack save area
+   rs-size      t1  set		\ Size of return stack area
+   t0 t1        t1  add		\ End address of data stack save area
+   begin
+      t3 -4  t3  addiu		\ Advance data stack pointer
+      t1 -4  t1  addiu		\ Advance save area pointer
+      t3     t2  get		\ Read word from stack
+   t1 t0 = until
+      t2     t1  put		\ Write word to save area
+
+ascii ! ?report
+
+   \ Reenter forth
+   np@ origin-  np  set
+   np  base     np  addu
+
+[ifdef] debug-break
+carret ?report
+linefeed ?report
+sp $a0 move dot bl ?report
+rp $a0 move dot bl ?report
+up $a0 move dot bl ?report
+base $a0 move dot bl ?report
+np $a0 move dot bl ?report
+[then]
+
+   'body enterforth ip  set
+   ip base ip           addu
+
+[ifdef] debug-break
+ip $a0 move dot
+[then]
+c;  
+
+\ exception# = -1 if entered from interrupt-return
+\               3 if breakpoint exception
+label save-state  ( k0: exception# -- )
+   here origin- to save-state-loc
+   1.0001  k1  set	\ Will be address of cpu-state (force 2 instructions)
+   k0  k1  addr exception# cpu-state -  sd	\ Save exception#
+
+   k1  addr %state-valid cpu-state -    k0   ld
+   k0 0 =  if	\ Save only if we don't already have valid state
+      nop
+
+      \ Save general registers
+      d# 32 0  do
+         $0 i + ( reg# )  k1  i 3 + /x* ( offset )  sd
+      loop
+
+ascii X ?report
+
+      d# 12 k0 mfc0	\ Get status register
+      k0 d# 28  k0  srl	\ Shift coprocessor status bits down
+      k0 h# 02  k0  andi	\ Mask bit 1 (coprocessor 1 - Floating point)
+      k0 $0 <>  if		\ Skip if coprocessor disabled
+         nop
+      \ Save floating point registers
+         d# 32 0  do
+            i ( freg# )  k0  mfc1
+            k0  k1 i d# 36 + /x* ( offset )  sd
+         loop
+
+         d# 31 t0 cfc1  nop  t0  k1  addr $fcsr  cpu-state -  sd
+      then
+
+      \ Save special registers
+      t0  mflo       nop  t0  k1  addr $lo    cpu-state -  sd
+      t0  mfhi       nop  t0  k1  addr $hi    cpu-state -  sd
+
+      \ Save CP0 registers
+      d# 13  t0  mfc0    t0  k1  addr $cause      cpu-state -  sd
+      d#  8  t0  mfc0    t0  k1  addr $badvaddr   cpu-state -  sd
+      d# 26  t0  mfc0    t0  k1  addr $badpaddr   cpu-state -  sd
+      d# 14  t0  mfc0    t0  k1  addr $pc         cpu-state -  sd
+
+      \ Clear the EXL bit in the status register because we're going
+      \ back to exception level 0.
+      d# 12  t0  mfc0    $0 2 t1 addiu  $0 t1 t1 nor  t0 t1 t0 and
+                         t0  k1  addr $sr         cpu-state -  sd
+   then
+
+ascii Y ?report
+
+   \ Find the base address
+   here 8 +               bal   \ ra = Absolute address of next instruction
+   here origin - 4 + base set   \ base = relative address of this instruction
+   ra       base     base subu  \ Base address of Forth kernel
+
+[ifdef] debug-break
+bl ?report
+base $a0 move dot
+bl ?report
+[then]
+
+   'body reenter  t0  set
+   t0  base  t0  addu
+   d# 14     t0  mtc0		\ Set EPC
+   nop nop nop nop		\ Delay before eret
+
+[ifdef] debug-break
+t0 $a0 move  dot
+bl ?report
+d# 14 $a0 mfc0  dot
+[then]
+
+   eret
+   nop
+
+end-code
+
+hidden also
+stand-init: Fixup save-state;  Allocate save stacks
+   uasave drop
+   ps-size alloc-mem to pssave
+   rs-size alloc-mem to rssave
+   cpu-state  save-state-loc origin+  fix-set32
+   cpu-state  (restart-loc   origin+  fix-set32
+
+   restartable? off
+;
+only forth also definitions
+
+
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/ccalls.fth
===================================================================
--- cpu/mips/ccalls.fth	                        (rev 0)
+++ cpu/mips/ccalls.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,198 @@
+purpose: C subroutine and Unix system call interfaces for MIPS
+\ See license at end of file
+
+\ Defining words to construct Forth interfaces to C subroutines
+\ and Unix system calls.  This is strongly implementation dependent, and will
+\ require EXTENSIVE modifications for other Forth systems, other CPU's,
+\ and other operating systems.
+\
+\ Defines:
+\
+\ syscall:    ( syscall# -- )        ( Input Stream: name arg-spec )
+\ subroutine: ( adr -- )             ( Input Stream: name arg-spec )
+\
+\ This version is for MIPS Unix systems where ints, longs, and addresses
+\ are all the same size.  Under this assumption, the only thing we have to
+\ do to the stack arguments is to convert Forth strings to C strings.
+
+decimal
+only forth assembler also forth also hidden also definitions
+
+variable #args  variable #results  variable arg#
+
+: system-call ( syscall# -- )
+   asm(
+      ( call# )  v0 li                            
+      syscall
+      $a3 $0 <>  if
+         $0   up  ['] errno >user#  sw   \ Delay slot
+         v0   up  ['] errno >user#  sw
+         -1   v0  li
+      then
+   )asm
+;
+: subroutine-call   ( subroutine-adr -- )
+   asm( jal  nop )asm
+;
+: wrapper-call  ( call# -- )
+   asm(
+      'user syscall-vec  t0  lw		\ Get address of system call table
+      bubble
+      ( call# ) t0 swap  t0  lw		\ Address of routine
+      bubble
+      t0 ra jalr   nop
+   )asm
+;
+
+: sys:  \ name ( call# -- )
+   code
+;
+: $a#  ( -- reg )  arg# @ asm( $a0 )asm  + ;
+: ?dec  ( -- )
+   arg# @ 4 =  if  asm(  sp adec  )asm  then
+;
+: arg  ( -- )
+   arg# @  if
+      ?dec
+      \ If the argument number is 4 or greater, we leave it on the stack
+      arg# @  4 <  if
+         asm(  sp  arg# @ 1- /l*   $a#  lw  )asm
+      then
+   else
+      asm(  tos  $a0  move  )asm
+   then
+   1 arg# +!
+;
+: str  ( -- )
+   arg# @  if
+      ?dec
+      arg# @  4 <  if
+         asm(
+            sp   arg# @ 1- /l*   $a#  lw
+            bubble
+            $a#  1               $a#  addiu
+         )asm
+      else
+         asm(
+            sp   arg# @ 1- /l*   $at  lw
+            bubble
+            $at  1               $at  addiu
+            $at  sp    arg# @ 1- /l*  sw
+         )asm
+      then
+   else
+      asm(  tos  1  $a0  addiu  )asm
+   then
+   1 arg# +!
+;   
+: res  ( -- )  1 #results +!  ;
+: }  ( -- )
+   #results @  if
+      #args @ 0=  if
+         asm(
+         tos  sp  push
+         )asm
+      then
+
+      #args @ 3 >  if
+         asm(
+         sp  #args @    /l*  sp   addiu
+         )asm
+      else  #args @ 1 >  if
+         asm(
+         sp  #args @ 1- /l*  sp   addiu
+         )asm
+      then  then
+
+      asm(  v0 tos  move   )asm
+   else   \ No results
+      #args @ 3 >  if
+         asm(
+         sp  #args @    /l*  tos  lw
+         sp  #args @ 1+ /l*  sp   addiu
+         )asm
+      else  #args @  if
+         asm(
+         sp  #args @ 1- /l*  tos  lw
+         sp  #args @    /l*  sp   addiu
+         )asm
+      then  then
+   then
+;
+: scan-args ( -- )
+   #args off
+   0   ( marker )
+   begin
+      bl word  1+ c@
+      case
+      ascii l of  ['] arg    true  endof 
+      ascii i of  ['] arg    true  endof 
+      ascii a of  ['] arg    true  endof
+      ascii s of  ['] str    true  endof 
+      ascii - of             false endof
+      ascii } of  ." Where's the -- ?" abort endof
+      ( default ) ." Bad type specifier: " dup emit abort
+    endcase
+  while
+    1 #args +!
+  repeat
+  arg# off
+  begin  ?dup  while  execute  repeat
+;
+: do-call  ( ??? 'call-assembler -- ) \ ??? is args specific to the call type
+   execute
+;
+: scan-results ( -- )
+   #results off
+   begin
+      bl word  1+ c@
+      case
+      ascii l of                  true  endof 
+      ascii i of                  true  endof 
+      ascii a of                  true  endof 
+      ascii s of  ." Can't return strings yet" abort   true  endof 
+      ascii } of                  false endof
+      ( default ) ." Bad type specifier: " dup emit
+      endcase
+   while
+      1 #results +!
+   repeat
+   }
+;
+only forth hidden  also forth assembler  also forth  definitions
+: {  \ args -- results }  ( -- )
+   scan-args  do-call  scan-results    next
+;
+: syscall:  \ name  ( syscall# -- syscall# 'system-call )
+   ['] system-call
+   code   current @ context !    \ don't want to be in assembler voc
+;
+: subroutine:  \ name  ( adr -- adr 'subroutine-call )
+   ['] subroutine-call code   current @ context !
+;
+
+only forth also definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/centry.fth
===================================================================
--- cpu/mips/centry.fth	                        (rev 0)
+++ cpu/mips/centry.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,123 @@
+purpose: Client interface handler code
+\ See license at end of file
+
+d# 12 /n* buffer: cif-reg-save
+
+\ Patch the following constants as needed in architecture-dependent code
+ 0 constant sr-or-mask   \ For turning on  Status Register bits
+-1 constant sr-and-mask  \ For turning off Status Register bits
+
+headerless
+code cif-return
+   tos   v0   move		\ Return value
+   'user cif-reg-save  $at  lw  \ Address of register save area in $at
+   $at 0 /n*  s0  lw
+   $at 1 /n*  s1  lw
+   $at 2 /n*  s2  lw
+   $at 3 /n*  s3  lw
+   $at 4 /n*  s4  lw
+   $at 5 /n*  s5  lw
+   $at 6 /n*  s6  lw
+   $at 7 /n*  s7  lw
+   $at 8 /n*  s8  lw
+   $at 9 /n*  ra  lw
+   $at d# 11 /n*  t0  lw   d# 12 t0 mtc0  \ Status register
+
+   ra $0 jalr
+   $at d# 10 /n*  sp  lw
+end-code
+
+: cif-exec  ( args ... -- )
+   sr@  sr-and-mask and  sr-or-mask or  sr!
+   do-cif
+   cif-return
+;
+
+headers
+: cif-caller  ( -- adr )  cif-reg-save  9 na+  @  ;
+
+headerless
+label cif-handler
+   \ Registers:
+   \ a0			argument array pointer
+   \ s0-s8,sp,ra	must be preserved
+   \ k0,k1		Don't touch
+   \ others		scratch
+
+
+   ra                $a3   move	\ Save ra
+   here 8 +                bal  \ ra = Absolute address of next instruction
+   here origin - 4 + $a2   set  \ a2 = relative address of this instruction
+   ra   $a2          $a2   subu \ a2 = address of Forth kernel
+   $a3  ra  move                \ Restore ra
+
+
+   'body main-task    	    $a1  li	\ a1: main-task-pfa (relative)
+   $a1 $a2                  $a1  addu	\ a1: main-task-pfa (absolute)
+   
+   $a1 0                    $a1  lw	\ a1: user area
+   $a1 'user# cif-reg-save  $at  lw	\ at: register save area address
+   s0  $at 0 /n*  sw			\ Save registers
+   s1  $at 1 /n*  sw
+   s2  $at 2 /n*  sw
+   s3  $at 3 /n*  sw
+   s4  $at 4 /n*  sw
+   s5  $at 5 /n*  sw
+   s6  $at 6 /n*  sw
+   s7  $at 7 /n*  sw
+   s8  $at 8 /n*  sw
+   ra  $at 9 /n*  sw
+   sp  $at d# 10 /n*  sw
+   d# 12 t0 mfc0  t0 $at d# 11 /n*  sw  \ Status register
+
+   $a2     base move
+   $a1     up   move			\ Set user pointer
+   $a0     tos  move			\ Set top of stack register to arg
+   
+   'user rp0  rp  lw			\ Set return stack pointer
+   'user sp0  sp  lw			\ Set data stack pointer
+   \ Don't adjust the stack pointer to account for the top of stack register,
+   \ because the stack (actually the TOS register) contains one entry, the
+   \ cif-struct pointer.
+
+   np@ origin-     np  set		\ Set the NEXT pointer
+   np  base        np  addu
+
+   'body cif-exec  ip  li		\ Set interpreter pointer
+   ip base         ip  addu		\ Relocate it to an absolute address
+c;
+
+0 value callback-stack
+
+headers
+: callback-call  ( args vector -- )  callback-stack sp-call 2drop  ;
+
+\ Force allocation of buffer
+stand-init: CIF buffers
+   cif-reg-save drop
+   h# 1000 dup alloc-mem + to callback-stack
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/devalias.fth
===================================================================
--- cpu/mips/cobalt/devalias.fth	                        (rev 0)
+++ cpu/mips/cobalt/devalias.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,9 @@
+devalias com1 /serial:115200
+
+devalias net /ethernet
+
+devalias rom /dropins
+
+devalias scsi  /scsi
+devalias disk  /ide at 0/disk at 0
+

Added: cpu/mips/cobalt/devices.fth
===================================================================
--- cpu/mips/cobalt/devices.fth	                        (rev 0)
+++ cpu/mips/cobalt/devices.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,88 @@
+purpose: Load file for I/O devices
+\ See license at end of file
+
+fload ${BP}/dev/flashpkg.fth
+
+0 0  " 1c80.03f8"  " /"  begin-package	\ UART 0
+  alias enable-interrupt drop
+  alias disable-interrupt drop
+  alias interrupt-handler@ 0
+  alias interrupt-handler! drop
+  fload ${BP}/dev/ns16550a.fth
+  d# 18432000 to clock-frequency  \ 10 times the normal PC clock frequency!
+  d# 115200 to default-baudrate
+end-package
+
+
+0 0  " "  " /"  begin-package	\ Access to FLASH
+  " dropins" device-name
+
+  create eprom-va  " dropins.img" $file,
+  here eprom-va - constant /device
+  /device constant /device-phys
+
+  " rom" encode-string
+  " compatible" property
+
+  fload ${BP}/cpu/mips/cobalt/flashpkg.fth
+end-package
+
+\ The first sector in the ROM is a FLASH burner program
+\ Define these words outside of the PCI bus node for convenience in debugging
+h# b400.0000 constant io-base
+: pl!  ( l offset -- )  io-base + rl!  ;
+fload ${BP}/dev/pci/configm1.fth
+
+0 0  " "  " /"  begin-package
+   \ Redefine these words inside the PCI bus node so they can be accessed
+   \ as device methods
+   alias config-l@ config-l@  alias config-l! config-l!
+   alias config-w@ config-w@  alias config-w! config-w!
+   alias config-b@ config-b@  alias config-b! config-b!
+
+   fload ${BP}/cpu/mips/cobalt/mappci.fth	\ Map PCI to root
+   fload ${BP}/dev/pcibus.fth		\ Generic PCI bus package
+
+   fload ${BP}/cpu/mips/cobalt/pciinit.fth
+
+end-package
+stand-init: PCI host bridge
+   " /pci" " init" execute-device-method drop
+;
+
+fload ${BP}/dev/pciprobe.fth		\ PCI probing
+fload ${BP}/dev/scsi/probscsi.fth	\ SCSI probing
+
+0 0  " "  " /"  begin-package
+   " clock" device-name
+   : open true ;
+   : close ;
+   : get-time  ( -- s m h d m y )  0 0  d# 12  d# 27 d# 11  d# 2001  ;
+end-package
+stand-init: Clock node
+   " /clock" open-dev clock-node !
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/diaguart.fth
===================================================================
--- cpu/mips/cobalt/diaguart.fth	                        (rev 0)
+++ cpu/mips/cobalt/diaguart.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,57 @@
+purpose: Driver for the 16550-style UART on the Cobalt Raq2
+\ See license at end of file
+
+hex
+
+h# 1c8003f8 kseg1 + constant uart
+
+: uart!  ( val reg# -- )  uart +  rb!  ;
+: uart@  ( reg# -- val )  uart +  rb@  ;
+
+: line-stat@  ( -- n )  5 uart@  ;
+
+\ Test for rcv character.
+: ukey?    ( -- flag )  line-stat@  1 and  0<>  ;
+: uemit?   ( -- flag )  line-stat@  h# 20 and  0<>  ;  \ Test for xmit ready
+
+: ukey   ( -- char )  begin  ukey?   until  0 uart@  ;  \ Receive a character
+: uemit  ( char -- )  begin  uemit?  until  0 uart!  ;  \ Transmit a character
+
+: ubreak?  ( -- false )  ;
+: clear-break   ( -- )  ;	       \ Clear break indication
+
+: inituarts  ( -- )
+[ifdef] notdef
+   3 3 uart!  		\ 8 bits, no parity
+   7 2 uart!		\ Clear and enable FIFOs
+\  d#  9600 baud
+\  d# 19200 baud
+\  d# 38400 baud
+   d# 115200 baud
+[then]
+;
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/dropins.bth
===================================================================
--- cpu/mips/cobalt/dropins.bth	                        (rev 0)
+++ cpu/mips/cobalt/dropins.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,45 @@
+purpose: Top-level build script for ROM
+\ See license at end of file
+
+command: &native &this
+in: inflate.img
+in: ${BP}/dev/ide/build/piolhier.fc
+in: ${BP}/dev/dec21140/build/dec21143.fc
+build-now
+
+\needs $add-dropin  fload ${BP}/tools/mkdropin.fth
+
+\ Always re-create the builton.fth file when we make a new rom.img
+fload ${BP}/cpu/mips/builton.bth
+
+writing dropins.img
+   " builton.fth"    " probe-"    $add-dropin
+   " inflate.img"    " inflate"   $add-dropin
+   " ${BP}/dev/dec21140/build/dec21143.fc" " pci1011,19" $add-dropin
+   " ${BP}/dev/ide/build/piolhier.fc" " class01018a" $add-dropin
+   " ${BP}/ofw/inet/telnetd.fth"   " telnetd"   $add-dropin
+ofd @ fclose
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/fixexc.fth
===================================================================
--- cpu/mips/cobalt/fixexc.fth	                        (rev 0)
+++ cpu/mips/cobalt/fixexc.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,98 @@
+purpose: Personalize the exception handler for this environment
+\ See license at end of file
+
+stand-init:
+   kseg0 to vector-base
+;
+
+\ Disable exponential backoff for DHCP.  We are running on point-to-point
+\ links, so there is no need to avoid flooding the net.
+dev /obp-tftp
+decimal patch 1000 8000 init-backoff hex  \ Initially 1 second instead of 8
+decimal patch 1 5000 ?try-broadcast hex   \ Waiting stops REL "Hello" packets
+-1 to tftp-retries			  \ Close enough to forever
+patch noop 2* next-backoff                \ Don't double the interval
+dend
+
+0 value trapped?
+
+\ Set aborted? so save-state will be called, instead of re-executing the
+\ instruction.  Set trapped? so "Keyboard interrupt" won't be displayed.
+: (.exception1)  ( exc-code -- )
+   (.exception) 1 aborted? !  true to trapped?
+;
+
+\ Suppress the display of "Keyboard interrupt" if trapped? is set
+: .entry1  ( -- )  trapped?  if  false to trapped?  else  .entry  then  ;
+
+: bpon  bpon state-valid off  ;
+
+: (init-dispatcher)  ( -- )
+   ['] getmsecs is get-msecs
+   sr@  h# 200.00000  or  sr!  \ Enable CP1
+;
+' (init-dispatcher) to init-dispatcher
+\ base @
+\ decimal patch cpu-clock-frequency 33333333 calibrate-ticker
+\ base !
+
+' (.exception1) to dispatch-exceptions
+' .entry1 to .exception
+' ge-preamble to tlb-handler
+' ge-preamble to xtlb-handler
+' ge-preamble to cache-handler
+
+defer user-interface ' quit to user-interface
+also client-services definitions
+: exit  ( -- )
+   \ Reinstate our exception handlers
+   h# 2000.8080 sr!  \ CP1 on, enable tick interrupt, enable XKseg
+   disable-interrupts
+   catch-exceptions
+   ms/tick set-tick-limit
+
+   [ also hidden ] breakpoints-installed off  [ previous ]
+   [ifdef] vector  vector off  [then]
+
+   " restore"  stdout @  ['] $call-method  catch  if  3drop  then
+   " restore"  stdin  @  ['] $call-method  catch  if  3drop  then
+   enable-interrupts
+
+   user-interface
+;
+: enter  ( -- )
+   sr@ >r  disable-interrupts
+   ." Type 'resume' to return to the operating system." cr
+   interact
+   r> sr!
+;
+previous definitions
+
+: (lock[)  ( -- r: inten )  r> sr@ >r >r  disable-interrupts  ;
+: (]unlock)  ( r: inten -- )  r> r> sr! >r  ;
+' (lock[) to lock[
+' (]unlock) to ]unlock
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/flashpkg.fth
===================================================================
--- cpu/mips/cobalt/flashpkg.fth	                        (rev 0)
+++ cpu/mips/cobalt/flashpkg.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,152 @@
+purpose: Package for FLASH ROM device
+\ See license at end of file
+
+headerless
+0 instance value base-adr
+0 instance value image-size
+0 value device-base
+0 value open-count
+false value written?
+0 instance value seek-ptr
+
+: clip-size  ( adr len -- len' adr len' )
+   seek-ptr +   image-size min  seek-ptr -     ( adr len' )
+   tuck
+;
+: update-ptr  ( len' -- len' )  dup seek-ptr +  to seek-ptr  ;
+: 'base-adr  ( -- adr )
+   seek-ptr
+[ifdef] select-flash
+   /device-phys /mod select-flash
+[then]
+   base-adr +
+;
+
+headers
+external
+: seek  ( d.offset -- status )
+   0<>  over image-size u>  or  if  drop true  exit  then \ Seek offset too big
+   to seek-ptr
+   false
+;
+
+: open  ( -- flag )
+   \ This lets us open the node during compilation
+   standalone?  0=  if  true exit  then
+   open-count  dup 1+  to open-count   0=  if       ( )
+[ifdef] eprom-va
+      eprom-va
+[else]
+      my-address my-space /device-phys  " map-in" $call-parent
+[then]
+      to device-base
+   then                                             ( )
+   0 to seek-ptr                                    ( )
+   my-args  dup  if                                 ( adr len )
+      2dup  " \"  $=  0=  if                        ( adr len )
+         over c@  [char] \  =  if  1 /string  then  ( adr' len' )
+         find-drop-in  dup  if                      ( di-adr di-len true )
+            -rot  to image-size  to base-adr        ( true )
+         then                                       ( flag )
+         exit                                       ( flag )
+      then                                          ( adr len )
+   then                                             ( adr len )
+   2drop                                            ( )
+   /device to image-size                            ( )
+   device-base to base-adr                          ( )
+   true                                             ( true )
+;
+: close  ( -- )
+   \ This lets us open the node during compilation
+   standalone?  0=  if  exit  then
+
+   base-adr device-base <>  if  base-adr image-size release-dropin  then
+   open-count dup 1- 0 max to open-count  ( old-count )
+[ifdef] eprom-va
+   drop
+[else]
+   1 =  if  device-base /device-phys " map-out" $call-parent  then
+[then]
+;
+: size  ( -- d.size )
+   base-adr device-base <>  if  image-size  else  /device  then  0
+;
+: read  ( adr len -- actual )
+   clip-size tuck			( len' len' adr len' )
+   begin
+      /device-phys seek-ptr /device-phys mod - min	( len' len' adr len'' )
+      2dup 'base-adr -rot move		( len' len' adr len'' )
+      update-ptr			( len' len' adr len'' )
+      rot over - -rot + over		( len' len'-len'' adr+len'' len'-len'' )
+   ?dup 0=  until			( len' len'-len'' adr+len'' len'-len'' )
+   2drop
+;
+: load  ( adr -- len )
+   0 0 seek drop     ( adr )
+   image-size  read  ( len )
+;
+: next-file-info  ( id -- false | id' s m h d m y len attributes name$ true )
+   ?dup 0=  if  open-drop-in  then      ( id )
+   another-dropin?  if                  ( id )
+      " built-time-int" $find  if       ( id s m h xt )
+         execute                        ( id s m h packed-date )
+         d# 100 /mod  d# 100 /mod       ( id s m h d m y )
+      else                              ( id s m h adr len )
+         2drop  0 0 0                   ( id s m h d m y )
+      then                              ( id s m h d m y )
+      " built-date-int" $find  if       ( id s m h xt )
+         execute                        ( id s m h packed-date )
+         d# 100 /mod  d# 100 /mod       ( id s m h d m y )
+      else                              ( id s m h adr len )
+         2drop  0 0 0                   ( id s m h d m y )
+      then                              ( id s m h d m y )
+      di-expansion be-l@                ( id s m h d m y size )
+      ?dup 0=  if  di-size be-l@  then  ( id s m h d m y size )
+      o# 100444                         ( id s m h d m y size attributes )
+      di-name$				( id s m h d m y size attr name$ )
+      true                              ( id s m h d m y size attr name$ true )
+   else                                 ( )
+      close-drop-in  false              ( false )
+   then
+;
+
+: free-bytes  ( -- d.#bytes )
+   open-drop-in  0                    ( high-water )
+   0  begin  another-dropin?  while   ( high-water id )
+      nip  di-size be-l@ 4 round-up   ( id size )
+      over +  swap                    ( high-water' id )
+   repeat                             ( high-water )
+   size  rot 0  d-                    ( d.#bytes )
+;
+
+\ These allow us to sub-address the FLASH device to access the PROMICE AI port
+1 " #address-cells" integer-property
+
+: decode-unit  ( adr len -- phys )  push-hex  $number  if  0  then  pop-base  ;
+: encode-unit  ( phys -- adr len )  push-hex  (u.)  pop-base  ;
+: map-in   ( offset size -- virt )  drop  device-base +  ;
+: map-out  ( virt size -- virt )  2drop  ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/fw.bth
===================================================================
--- cpu/mips/cobalt/fw.bth	                        (rev 0)
+++ cpu/mips/cobalt/fw.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,253 @@
+purpose: Load file for Open Firware on Cobalt Raq2
+\ See license at end of file
+
+dictionary: ${BP}/cpu/mips/build/basefw.dic
+in: dropins.img
+command: &mipsfth &dictionary &this
+build-now
+
+\ create rom-based?
+h# 81f0.0000 constant rom-base
+create ram-image
+
+\ ' $report-name is include-hook
+\ true to stand-init-debug?
+false to stand-init-debug?
+
+true ' auto-boot? set-config-int-default
+true ' fcode-debug? set-config-int-default
+true ' local-mac-address? set-config-int-default
+
+" com1" ' output-device set-config-string-default
+" com1" ' input-device set-config-string-default
+" dhcp" ' ip-address  set-config-string-default
+" net" ' boot-device set-config-string-default
+
+fload ${BP}/cpu/mips/ksegaddr.fth
+fload ${BP}/cpu/mips/physaddr.fth
+fload ${BP}/cpu/mips/virtaddr.fth
+
+: cpu-clock-frequency  ( -- hz )  d# 200,000,000  ;
+fload ${BP}/cpu/mips/cobalt/regacc.fth
+
+0 value last-count
+0 value ticker
+: hw-get-ms  ( -- n )
+   count@  d# 400,000 u/mod  nip   ( msecs )
+   dup  last-count  <>  if         ( msecs )
+      to last-count
+      ticker 1+ to ticker
+   else
+      drop
+   then
+   ticker
+;
+' hw-get-ms is get-msecs
+
+fload ${BP}/cpu/mips/cobalt/diaguart.fth \ Diagnostic driver for serial port
+fload ${BP}/forth/lib/sysuart.fth	\ Plug UART routines into key and emit
+\ ' ukey is diag-key			\ Feed UART input to "dl"
+
+h# 1000 to pagesize
+d# 12   to pageshift
+
+fload ${BP}/cpu/mips/cache.fth		\ Cache synchronization/flushing
+
+[ifdef] 2-cell-rootnode
+: pcicache-wbinv  ( devadr len -- )  3drop  ;
+: pcicache-inv  ( devadr len -- )  3drop  ;
+[else]
+: pcicache-wbinv  ( devadr len -- )  2drop  ;
+: pcicache-inv  ( devadr len -- )  2drop  ;
+[then]
+
+fload ${BP}/cpu/mips/rootnode.fth	\ Root node mapping
+
+dev /
+extend-package
+   " /tftpboot/Cobalt-MIPS" encode-string  " architecture" property
+   " Cobalt,Raq2" encode-string  " model" property
+\   d# 33,333,333 " clock-frequency" integer-property
+finish-device
+device-end
+
+: (cpu-arch  ( -- adr len )
+   " architecture" ['] root-node  get-package-property  drop
+   get-encoded-string
+;
+' (cpu-arch to cpu-arch
+
+h#   1.0000 constant initial-heap-size
+fload ${BP}/cpu/mips/boot.fth		\ Low-level startup code
+
+\ 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 	\ S Allow alloc-mem to use more memory
+
+: (initial-heap)  ( -- adr len )  sp0 @ ps-size -  limit  tuck -  ;
+\ : (initial-heap)  ( -- adr len )
+\   h# 80000000 h# 20000
+\ \  sp0 @ ps-size - initial-heap-size -   initial-heap-size
+\ ;
+['] (initial-heap) to initial-heap
+
+\ fload ${BP}/forth/lib/dumballo.fth		\ Rudimentary memory allocator
+
+h# 1000.0000 constant /segment
+
+alias memsize-loc kseg0
+fload ${BP}/cpu/mips/cobalt/probemem.fth  \ Memory probing
+stand-init: Probing memory
+   " probe" memory-node @ $call-method
+;
+
+\ File system
+[ifdef] resident-packages
+support-package: disk-label
+   fload ${BP}/ofw/disklabl/loadpkg.fth	\ Disk label package
+end-support-package
+
+support-package: ext2-file-system
+   fload ${BP}/ofw/fs/ext2fs/ext2fs.fth	\ Linux file system
+end-support-package
+
+support-package: dropin-file-system
+   fload ${BP}/ofw/fs/dropinfs.fth		\ Dropin file system
+end-support-package
+
+support-package: nfs
+   fload ${BP}/ofw/fs/nfs/loadpkg.fth
+end-support-package
+[then]
+fload ${BP}/ofw/fs/fatfs/fdisk2.fth	\ Partition map administration
+
+\ Load file format handlers
+
+: call32 ;  defer .subname
+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
+' 2drop is elf-map-in
+true  ' client-symbols? set-config-int-default
+
+\ Device Tree
+fload ${BP}/cpu/mips/cobalt/devices.fth
+fload ${BP}/cpu/mips/cobalt/devalias.fth
+
+\ Turn on RTS and DTR for the benefit of systems that are configured
+\ for hardware handshaking
+dev com1
+: ron  inituart rts-dtr-on  ;
+patch ron inituart open
+dend
+
+
+: stand-init-io  ( -- )
+[ifdef] stand-init-io
+   stand-init-io
+[then]
+\   install-dumb-alloc
+   inituarts
+   install-uart-io
+   calibrate-ticker
+\   ." Open Firmware starting..." cr cr
+
+   ['] reset-all to bye
+;
+
+: com1  ( -- adr len )  " com1"  ;
+' com1 to fallback-device
+
+: probe-all  ( -- )
+   " probe-" do-drop-in
+[ifdef] probe-pci
+   probe-pci
+[then]
+   " probe+" do-drop-in
+;
+
+\ Perform a full system reset
+: (reset-all)  ( -- )   h# f  h# bc00.0000 rb!  ;
+' (reset-all) to reset-all
+
+fload ${BP}/cpu/mips/argv.fth
+fload ${BP}/cpu/mips/cobalt/fixexc.fth
+
+: copy-reboot-info ;
+\ fload ${BP}/cpu/mips/bcm12500/reboot.fth
+
+fload ${BP}/ofw/core/startup.fth
+: .fw  ." Open Firmware by FirmWorks " .built cr  ;
+' .fw to .firmware
+
+fload ${BP}/ofw/core/countdwn.fth	\ Auto-boot countdown
+patch 1 6 get-countdown
+
+: linux-setup  ( -- )
+   $sr 1 invert and  to $sr	\ Disable interrupts
+   kseg0 0 sync-cache
+   boot-file boot-device argv,argc  to $a0  to $a1
+   null$  " FIRMWARE=OpenFirmware" argv,argc  drop to $a2
+   memory-size 1meg * to $a0
+;
+
+: init-program  ( -- )
+   \ Turn off interrupts because some of the Linux kernel ELF files
+   \ overwrite the trap vectors.
+   init-program disable-interrupts  linux-setup
+
+   \ Kludge alert!  Linux expects the PCI Base Address Registers for the
+   \ Ethernet and IDE to be assigned the way the Cobalt firmware does it,
+   \ even though that is inconsistent between the two.  So we slam them
+   \ to the expected values before jumping to Linux.
+   h#  280.0045 h# 3804 config-l!   \ Ethernet command register
+   h#     .4000 h# 380c config-l!   \ Ethernet something
+   h# 1010.0000 h# 3810 config-l!   \ Ethernet I/O space BAR
+   h# 1200.0000 h# 3814 config-l!   \ Ethernet Memory space BAR
+   h# 2814.0104 h# 383c config-l!   \ Ethernet someting
+   h# cc00 h# 4920 config-l!        \ bmIDE BAR
+;
+
+\ Don't override user-supplied file names
+dev /obp-tftp  ' dhcp-modify-file to modify-boot-file  dend
+
+patch true diagnostic-mode? diag-type
+patch true diagnostic-mode? diag-cr
+
+install-rom-cold
+.( --- Saving fw.dic ...)  " fw.dic" $save-forth cr
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/mappci.fth
===================================================================
--- cpu/mips/cobalt/mappci.fth	                        (rev 0)
+++ cpu/mips/cobalt/mappci.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,63 @@
+purpose: PCI physical address mapping to root node for BCM1250
+\ See license at end of file
+
+headerless
+
+\ map-pci-phys creates a virtual mapping for the PCI physical address range
+\ "paddr io? size", returning its virtual address "vaddr".  It does so by
+\ first translating the PCI physical base address "paddr io?" to the
+\ corresponding physical address in the parent node's address space (which
+\ in this case is the primary system bus address space), and then calling
+\ the parent's "map-in" method.
+
+\ PCI I/O space is mapped to 1000.0000..1200.0000 in the CPU's physical
+\ address space
+\ PCI memory space is mapped 1-1 within the range 1800.0000 - 1c00.0000
+: map-pci-phys  ( paddr io? phys.hi size -- vaddr )
+   \ In the next line, we can't use "+" instead of "or" because
+   \ the Cobalt firmware is inconsistent about the way it stores
+   \ assigned I/O space addresses in PCI base address registers.
+   \ Sometimes it leaves off the upper 0x1000.0000 bit, and sometimes
+   \ it doesn't.
+   nip swap  if   swap h# 1000.0000 or  swap  then  ( paddr' size )
+   " map-in" $call-parent                           ( mem-vaddr )
+;      
+
+\ >pci-devaddr translates the DMA address "parent-devaddr", which is in the
+\ parent node's physical address space, to the corresponding DMA address
+\ "pci-devaddr" in the PCI physical address space (in PCI memory space; DMA
+\ to PCI I/O space is not possible).
+
+: >pci-devaddr  ( parent-devaddr -- pci-devaddr )  h# 0  +  ;
+
+\ pci-devaddr> translates the DMA address "pci-devaddr", which is in the
+\ PCI physical address space (in PCI memory space; DMA to PCI I/O space is
+\ not possible), to the corresponding DMA address "parent-devaddr" in the
+\ parent node's physical address space.
+
+: pci-devaddr>  ( pci-devaddr -- parent-devaddr )  h# 0  -  ;
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/pciinit.fth
===================================================================
--- cpu/mips/cobalt/pciinit.fth	                        (rev 0)
+++ cpu/mips/cobalt/pciinit.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,69 @@
+purpose: PCI Bus bridge hardware initialization
+\ See license at end of file
+
+also forth definitions
+
+\ This prevents crashes resulting from an attempt to access the
+\ (nonexistent) expansion ROM using ordinary memory access operators.
+\ That doesn't work because we don't properly map PCI devices into
+\ virtual address space.  Omitting the find-fcode? function doesn't
+\ hurt us because we have no plugin slots so there's no chance of
+\ probing anything with an expansion ROM.
+patch false find-fcode? populate-device-node
+
+previous definitions
+
+\ Configure the PCI bridge
+: init  ( -- )
+;
+
+: pci-probe-list  ( -- adr len )  " 7,9"  ;
+
+\ AgileTV boards have no plug-in PCI slots
+h# 0000 encode-int  " slave-only" property
+h# 0000 encode-int			\ Mask of implemented add-in slots
+" slot-names" property
+
+\ XXX this needs work...
+
+\ 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 )
+   2drop 0 true
+;
+
+\ h# 1200.0000 to first-mem	\ This is where Linux starts putting stuff
+\ h# 2000.0000 to mem-space-top
+
+h# 1200.0000 to first-mem
+h# 1400.0000 to mem-space-top
+
+h# 1010.0000 to first-io
+h# 200.0000 to io-space-top
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/probemem.fth
===================================================================
--- cpu/mips/cobalt/probemem.fth	                        (rev 0)
+++ cpu/mips/cobalt/probemem.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,86 @@
+purpose: Memory probing
+\ See license at end of file
+
+\ The memory regions are 0xxx.xxxx, 8xxx.xxxx, 9xxx.xxxx, and cxxx.xxxx
+: (memory?)  ( adr -- flag )  d# 28 rshift  0=  ;
+' (memory?) to memory?
+
+" /memory" find-device
+
+headerless
+
+h# 0400.0000 constant /ram-bank  \ 64 MB banks
+
+h# ffff.ffff value low
+h#         0 value high
+
+: log&release  ( adr len -- )
+
+   \ Don't erase the firmware!  Reduce the length to avoid it.
+   2dup  over +                              ( adr len adr adr+len )
+   origin h# 20 - kseg0 -  umin  over -      ( adr len adr len' )
+
+   \ Don't zero the memory
+   2drop
+
+   over    low  umin to low             ( adr len )
+   2dup +  high umax to high            ( adr len )
+   release
+;
+
+: >bank-base  ( index -- bank-pa )  d# 26 lshift  ;
+: scan-banks  ( total-size -- )
+   d# 4 0  do                           ( size )
+      dup  if                           ( size )
+         i >bank-base                   ( size bank-adr )
+         over /ram-bank min             ( size bank-adr this-size )
+         tuck log&release               ( size this-size )
+         -                              ( size' )
+      then                              ( size' )
+   loop                                 ( size' )
+   drop
+;
+headers
+: claim  ( [ phys ] size align -- kseg0-adr )  claim kseg0 +  ;
+: release  ( kseg0-adr size -- )
+   over kseg0 u>=  if  swap kseg0 - swap  then   release
+;
+
+: probe  ( -- )
+   h# 1000.0000
+   ( memsize-loc @ )  scan-banks
+
+   0 0 encode-bytes                                   ( adr 0 )
+   physavail  ['] make-phys-memlist  find-node        ( adr len  prev 0 )
+   2drop  " reg" property
+
+   \ Claim the megabyte used for the trap vectors, Forth, and the section table
+   0                  /resetjmp       0 claim  drop
+   high h# 10.0000 -  h# 10.0000      0 claim  drop
+;
+
+device-end
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/reboot.fth
===================================================================
--- cpu/mips/cobalt/reboot.fth	                        (rev 0)
+++ cpu/mips/cobalt/reboot.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,53 @@
+purpose: Save reboot info using /reboot-info device
+\ See license at end of file
+
+0 value reboot$
+d# 256 value /reboot$
+
+: copy-reboot-info  ( -- )
+   " /reboot-info" open-dev ?dup 0=  if  exit  then  >r
+   /reboot$ alloc-mem  to reboot$            ( )
+
+   reboot$ 1+  /reboot$ 1- " read" r@ $call-method  ( actual )
+   dup  0>=  dup to reboot?   if                    ( actual )
+      reboot$ c!                                    ( )
+   else                                             ( -1 )
+      drop  reboot$ /reboot$ free-mem               ( )
+   then
+   r> close-dev
+;
+
+: (get-reboot-info)  ( -- bootcmd$ line# column# )  reboot$ count  0 0  ;
+' (get-reboot-info) to get-reboot-info
+
+: (save-reboot-info)  ( bootcmd$ line# column# -- )
+   2drop
+   " /reboot-info" open-dev ?dup 0=  if  2drop exit  then  >r  ( cmd$ r: ih )
+   " write" r@ $call-method drop                               ( r: ih )
+   r> close-dev
+;
+' (save-reboot-info)  to save-reboot-info
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/regacc.fth
===================================================================
--- cpu/mips/cobalt/regacc.fth	                        (rev 0)
+++ cpu/mips/cobalt/regacc.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,33 @@
+purpose: Register access words for Cobalt
+\ See license at end of file
+
+: kseg1?  ( adr -- adr flag )  dup h# f000.0000 and  h# b000.0000  =  ;
+
+\ ' x@ is rx@   ' x! is rx!
+' l@ is rl@   ' l! is rl!
+' w@ is rw@   ' w! is rw!
+' c@ is rb@   ' c! is rb!
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cobalt/reports.fth
===================================================================
--- cpu/mips/cobalt/reports.fth	                        (rev 0)
+++ cpu/mips/cobalt/reports.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,76 @@
+purpose: Diagnostic display code for early startup
+\ See license at end of file
+
+\ For any Galileo-based MIPS system, e.g. Cobalt Raq2
+h# bc80.0000 constant ns16550-base
+
+label do-report  ( t7: char -- )
+   ns16550-base t6 li
+   begin  t6 h# 3fd  $at lbu  $at h# 20 $at andi  $at 0 <> until nop
+   t7 t6 h# 3f8 sb
+   begin  t6 h# 3fd  $at lbu  $at h# 20 $at andi  $at 0 <> until nop
+
+   ra jr  nop
+end-code
+
+\ Kills t6-t7
+: report  ( char -- )  " do-report bal  $0 swap  t7 addiu" evaluate  ;
+
+label do-nibble  ( t7: digit -- )
+   t7 d# 28 t7 sll     t7 d# 28 t7 srl   \ Discard high bits
+   t7 h# a negate  $at  addiu
+   $at 0>=  if  nop
+      $at ascii A  t7  addiu
+   else nop
+      t7 ascii 0  t7  addiu
+   then
+
+   ns16550-base t6 li
+   begin  t6 h# 3fd  $at lbu  $at h# 20 $at andi  $at 0 <> until nop
+   t7 t6 h# 3f8 sb
+   begin  t6 h# 3fd  $at lbu  $at h# 20 $at andi  $at 0 <> until nop
+
+   ra jr  nop
+end-code
+
+label do-dot  ( t8: val -- )
+   ra t9 move
+   do-nibble bal  t8 d# 28  t7 srl 
+   do-nibble bal  t8 d# 24  t7 srl 
+   do-nibble bal  t8 d# 20  t7 srl 
+   do-nibble bal  t8 d# 16  t7 srl 
+   do-nibble bal  t8 d# 12  t7 srl 
+   do-nibble bal  t8 d#  8  t7 srl 
+   do-nibble bal  t8 d#  4  t7 srl 
+   do-nibble bal  t8        t7 move
+
+   bl report
+   t9 jr nop
+end-code
+
+\ Kills t6-t9
+: dot  ( reg -- )  " do-dot bal  t8 move" evaluate  ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/code.fth
===================================================================
--- cpu/mips/code.fth	                        (rev 0)
+++ cpu/mips/code.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,103 @@
+purpose: Assembler macros specific to the virtual machine implementation
+\ See license at end of file
+
+: assembler  ( -- )  mips-assembler  ;
+
+: asm(  also assembler  ; immediate
+: )asm  previous  ; immediate
+
+only forth also assembler also definitions
+
+\ Forth Virtual Machine registers
+
+: np s1 ;  : base s2 ;  : up s3 ;  : tos s4 ;  : ip s5 ;  : rp s6 ;  : sp $sp ;
+
+: w t0 ;
+
+\ Macros:
+
+\ Put a bubble in the pipeline.  Used between a load instruction and an
+\ immediately-following instruction that uses the load destination register.
+: bubble  ( -- )  nop  ;
+
+: get   ( ptr dst -- )  0      swap  lw   ;
+: put   ( src ptr -- )  0            sw   ;
+: move  ( src dst -- )  0      swap  addu  ;
+: ainc  ( ptr -- )      dup 4  swap  addiu  ;
+: adec  ( ptr -- )      dup -4 swap  addiu  ;
+: push  ( src ptr -- )  dup          adec  put  ;
+: pop   ( ptr dst -- )  over   -rot  get   ainc  ;
+
+: cmp   ( src dst -- )  $at     subu  ;
+: cmpi  ( src imm -- )  negate  $at  addiu  ;
+
+: apf   ( ptr dst -- )  w 4  ;
+
+\ The next few words are already in the forth vocabulary;
+\ we want them in the assembler vocabulary too
+alias next  next
+' previous is do-exitcode
+headers
+alias c;  c;
+
+: 'user#  \ name  ( -- user# )
+    '      ( acf-of-user-variable )
+    >body  ( apf-of-user-variable )
+    @      ( user# )
+;
+: 'user  \ name  ( -- user-addressing-mode )
+   up  'user#
+;
+: 'body  \ name  ( -- variable-apf-offset )
+   '  ( acf-of-user-variable )  >body  origin -
+;
+: 'acf  \ name  ( -- variable-acf-offset )
+   '  ( acf-of-user-variable )  origin -
+;
+: end-code ( -- )
+   [ forth ]
+   previous
+\   flush-cache		\ Make new code available for instruction fetches
+   sp@ csp @ <>  if  last a@ .id ." : stack depth changed" cr  then
+   current token@ context token!   \ go back to old context
+;
+
+also forth definitions
+headerless
+: entercode  ( -- )
+   also assembler
+   [ also assembler ]  here delay-barrier !  [ previous ]
+;
+' entercode is do-entercode
+
+headers
+\ "code" is defined in the kernel
+
+: label  \ name  ( -- )
+   create  !csp  entercode
+;
+only forth also definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cpubpsup.fth
===================================================================
--- cpu/mips/cpubpsup.fth	                        (rev 0)
+++ cpu/mips/cpubpsup.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,106 @@
+purpose: Machine-dependent definitions for breakpoints
+\ See license at end of file
+
+h# 0000000d   constant breakpoint-opcode
+defer breakpoint-trap?
+' true is breakpoint-trap?
+
+: op@  ( adr -- op )  l@  ;
+: op!  ( op adr -- )  instruction!  ;
+: bp-address-valid?  ( adr -- flag )  3 and  0=  ;
+: at-breakpoint?  ( adr -- flag )  op@  breakpoint-opcode =  ;
+: put-breakpoint  ( adr -- )  breakpoint-opcode swap op!  ;
+
+: j?   ( adr -- adr flag )  h# 0800.0000 h# fc00.0000 imatch?  ;
+: jr?  ( adr -- adr flag )  h# 0000.0008 h# fc00.003f imatch?  ;
+: branch?  ( adr -- flag )
+   h# 1000.0000  h# b000.0000  imatch?  >r  \ beq(l),bne(l),blez(l),bgtz(l)
+   h# 0400.0000  h# fc1c.0000  imatch?      \ bltz,bgez,bltzl,bgezl
+   r>  or
+;
+
+: delayed?  ( adr -- flag )
+   j? swap  jr? swap  jal? swap  jalr? swap  bal? swap  branch? swap
+   drop  or or or or or
+;
+: .instruction  ( -- )
+   $pc 
+   [ also disassembler ] pc ! dis1 [ previous ]
+   $pc delayed?  if
+      $pc la1+ [ also disassembler ] pc ! dis1 [ previous ]
+   then
+;
+
+\ Find the places to set the next breakpoint for single stepping.
+\ Usually the right place is at nPC .  However, for annulled branch
+\ instructions, we have to cope with the possibility that the delay
+\ instruction, which is where nPC points, won't be executed.  Annulled
+\ unconditional branches never execute the delay instruction, so we have
+\ to put the breakpoint at the branch target.  Annulled conditional
+\ branches will either execute the delay instruction or the one right
+\ after it.
+
+: >after-delay  ( adr -- adr' )  2 la+  ;
+variable step?
+: next-instruction  ( stepping? -- next-adr branch-target|0 )
+   step? !
+   $pc
+   j?    if  >j-target   0 exit  then
+   jr?   if  >jr-target  0 exit  then
+   jal?  if  step? @  if  >j-target   else  >after-delay  then  0  exit  then
+   jalr? if  step? @  if  >jr-target  else  >after-delay  then  0  exit  then
+   bal?  if
+      step? @  if  dup >after-delay swap >br-target  else  >after-delay 0  then
+      exit
+   then
+   branch?  if  dup >after-delay  swap >br-target  exit  then
+   la1+  0
+;
+: bumppc  ( -- )  $pc la1+ to $pc   ;
+alias rpc $pc
+
+code goto  ( adr -- )
+   tos       t0   move
+   sp        tos  get
+   t0             jr
+   sp /n     sp   addiu
+end-code
+
+: return-adr  ( -- adr )  $ra  ;
+: leaf-return-adr  ( -- adr )  $ra  ;
+: backward-branch?  ( adr -- flag )  \ True if adr points to a backward branch
+   dup branch?                               ( adr branch? )
+   swap l@ h# 0000.8000 and  0<>             ( branch? backward? )
+   and
+;
+: loop-exit-adr  ( -- adr )
+   \ Start at PC-4 in case we're sitting on a delay instruction at the loop end
+   $pc 4 -  begin  dup backward-branch? 0=  while  4 +  repeat  8 +
+;
+
+headers
+: set-pc  ( adr -- )  to $pc  ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/cpustate.fth
===================================================================
--- cpu/mips/cpustate.fth	                        (rev 0)
+++ cpu/mips/cpustate.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,53 @@
+purpose: Buffers for saving program state
+\ See license at end of file
+
+headers
+\ Data structures defining the CPU state saved by a breakpoint trap.
+\ This must be loaded before either catchexc.fth or register.fth,
+\ and is the complete interface between those 2 modules.
+
+headerless
+\ A place to save the CPU registers when we take a trap
+0 value /save-area
+0 value cpu-state
+
+: clear-save-area  ( -- )  cpu-state /save-area erase  ;
+
+h# 40 constant ua-size
+
+0 value pssave		\ A place to save the Forth data stack
+0 value rssave		\ A place to save the Forth return stack
+ua-size  buffer: uasave	\ A place to save part of the Forth user area
+			\ we really want to save saved-rp and saved-sp
+
+headers
+defer .exception	\ Display the exception type
+defer handle-breakpoint	\ What to do after saving the state
+
+: init  ( -- )
+   init   /save-area alloc-mem to cpu-state  clear-save-area
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/ctrace.fth
===================================================================
--- cpu/mips/ctrace.fth	                        (rev 0)
+++ cpu/mips/ctrace.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,128 @@
+purpose: After a crash, displays a backtrace of C stack frames.
+\ See license at end of file
+
+\ This is difficult to do in the MIPS C environment, because the
+\ return address is sometimes in a register and sometimes on the stack.
+
+only forth also hidden also forth definitions
+needs (rstrace rstrace.fth
+needs >saved savedstk.fth
+only forth also hidden also forth definitions
+
+: imatch?  ( adr match mask -- adr flag )  2 pick l@ and =  ;
+: jal?   ( adr -- adr flag )  h# 0c00.0000 h# fc00.0000 imatch?  ;
+: jalr?  ( adr -- adr flag )  h# 0000.0009 h# fc00.003f imatch?  ;
+: bal?   ( adr -- adr flag )  h# 4010.0000 h# fc1c.0000 imatch?  ;
+
+: >jr-target  ( adr -- target-adr )
+   \ Get the value of the register in the rs field
+   l@  d# 21 >>  h# 1f and  2 << >state @
+;
+: >j-target  ( adr -- target )
+   dup l@  h# 03ff.ffff and  2 <<  swap h# f000.0000 and  or
+;
+: >br-target  ( br-adr -- target )
+   dup  l@  d# 16 <<  d# 14 >>a  +  la1+
+;
+: 9u.r  ( u -- )  push-hex 9 u.r pop-base  ;
+
+\ True if adr points to an "addiu sp,sp,-N" instruction
+: stack-push?  ( adr -- flag )  l@ h# ffff8000 and  h# 27bd8000 =  ;
+
+\ Adjust the stack pointer if necessary
+: adjust-sp  ( sp pc -- sp' )
+   dup stack-push?  if                     ( sp pc )
+      l@ h# ffff and w->n  -               ( sp' )
+   else                                    ( sp pc )
+      drop                                 ( sp )
+   then                                    ( sp' )
+;
+
+\ Given the address from which a function was called, display the
+\ name or address of the function and adjust the stack pointer
+\ to the value that it had upon entry to that function.
+: .function  ( call-adr -- start-adr )
+   jal?   if  >j-target   dup showaddr  exit  then
+   jalr?  if  >jr-target  dup showaddr  exit  then  \ leaf context only...
+   bal?   if  >br-target  dup showaddr  exit  then
+   drop  ."    ??????"  0
+;
+: .args  ( -- )  \ Show C function arguments
+   ."  ( "  $a0 .x   $a1 .x   $a2 .x   $a3 .x  ." ... )"
+;
+
+: .called  ( call-adr -- )  ."  called from "  showaddr  cr  ;
+
+: .leaf-call  ( ra -- start-adr )  dup .function  .args  swap .called  ;
+
+: save-ra?  ( adr -- flag )  l@ h# ffff0000 and  h# afbf0000 =  ;
+
+h# 8000.0000 value mem-base  \ Change this to debug userland code
+
+: reasonable-adr?  ( n -- flag )
+   dup 3 and  if  drop false exit  then
+   mem-base  dup h# 1000.0000 +  within
+;
+
+: up1  ( sp ra -- sp' ra' )
+   \ Upon entry, ra is the return address - i.e. an address inside a
+   \ function.  We determine the start of that function and display
+   \ its address, then find the new return address and adjust the stack
+   \ pointer.  It would be nice to display the arguments too, but that's
+   \ not so easy.
+
+   \ The current version of GCC starts non-leaf functions with
+   \ "addiu sp,sp,-N", so look backward for such an instruction.
+   begin
+      /l -
+      dup reasonable-adr? 0=  if  drop 0 exit  then
+      dup stack-push?
+   until                                     ( sp start-adr )
+
+   dup showaddr  ."  "                       ( sp start-adr )
+
+   \ Find the instruction that saves the return address on the stack
+   dup  /l -
+   begin  la1+  dup save-ra?  until          ( sp start-adr save-ra-adr )
+
+   \ Find the saved return address
+   l@ h# ffff and w->n                       ( sp start-adr stack-offset )
+   2 pick + >saved l@                        ( sp start-adr ra )
+
+   >r adjust-sp  r>                          ( sp ra )
+   dup 8 - .called
+;
+
+: ctrace  ( -- )   \ C stack backtrace
+   ." Most-recently-called function: " cr
+   $ra  8 -  .leaf-call      ( sp start-adr )
+
+   $sp swap adjust-sp        ( sp' )
+
+   $ra  begin  dup reasonable-adr?  while  up1  repeat   ( sp' ra' )
+   2drop
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/debugm.fth
===================================================================
--- cpu/mips/debugm.fth	                        (rev 0)
+++ cpu/mips/debugm.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,156 @@
+purpose: CPU-dependent definitions for the source-level debugger
+\ See license at end of file
+
+create no-secondary-cache
+
+true value debug-sync-cache?
+
+: at  ( row column -- )  2drop  ;
+: kill-line  ( -- )  ;
+
+hex
+
+: low-dictionary-adr  ( -- adr )  origin  init-user-area +  ;
+
+nuser debug-next  \ Pointer to "next"
+vocabulary bug   bug also definitions
+nuser 'debug   \ code field for high level trace
+nuser <ip      \ lower limit of ip
+nuser ip>      \ upper limit of ip
+nuser cnt      \ how many times thru debug next
+
+\ Since we use a shared "next" routine, slow-next and fast-next are no-op's
+alias slow-next 2drop  ( high low -- )
+alias fast-next 2drop  ( high low -- )
+
+[ifndef] np@
+code np@  ( -- adr )  tos sp push   np tos move   c;
+[then]
+
+: copy-next  ( -- )
+   \ Copy the normal next routine
+   here  8 /n*  dup  allot   ( adr size )
+   np@ -rot cmove
+;
+
+: sync-cache,  ( -- )
+   asm(
+\     np 0  5 cache     np 4  5 cache
+   " 'user debug-sync-cache?" eval  $at  lw
+   $at $0 <>  if
+      nop
+      np 0  h# 19  cache     np 4  h# 19 cache	\ WriteBack primary D$
+[ifndef] no-secondary-cache
+      np 0  h# 1b  cache     np 4  h# 1b cache	\ WriteBack secondary D$
+      np 0  h# 12  cache     np 4  h# 12 cache	\ Invalidate secondary I$
+[then]
+      np 0  h# 10  cache     np 4  h# 10 cache	\ Invalidate primary I$
+   then
+\    3 $a2 li    h# 40 $a1 li   np  $a0 move   d# 1150 v0 li  syscall
+   )asm
+;
+
+label normal-next
+   copy-next
+end-code
+
+label debnext
+   'user <ip  t0  lw
+   bubble
+   ip t0  t1  subu
+   t1 0>= if  nop
+      'user ip>  t0  lw
+      bubble
+      ip t0   t1  subu
+      t1 0<= if  nop
+         'user cnt   t0  lw
+	 2           t1  li
+         t0 1        t0  addiu
+	 t0   'user cnt  sw
+	 t0  t1  = if  nop
+            $0               'user cnt  sw
+
+            h# 8ea80000           t0    li      \ "ip 0  t0  lw"
+            t0                    np 0  sw
+            h# 01124021           t0    li      \ "w base  w  addu"
+            t0                    np 4  sw
+\ This is for the old version where the "bubble" macro assembles a nop
+\            $0                    np 4  sw	\ nop
+
+            sync-cache,
+
+            \ Machine code for   'debug token@ execute
+            'user 'debug   w   lw
+	    bubble
+            w  base        w   addu
+            w 0            t1  lw
+            bubble
+            t1 base        t1  addu
+	    t1                 jr
+            nop
+         then
+      then
+   then
+   copy-next   
+end-code
+
+\ Fix the next routine to use the debug version
+code pnext   (s -- )
+   debnext origin -  t0   li            \ Relative address of debnext
+   t0  base          t0   addu          \ Absolute address of debnext
+
+   
+   t0  4             t0   sll           \ Erase top 4 bits
+   t0  6             t0   srl           \ Erase bottom 2 bits
+   h# 0800.0000      t1   li            \ "j" instruction template
+   t1 t0             t0   addu          \ "j debnext"
+   t0              np 0   sw            \ Write to first location in "next"
+   $0              np 4   sw            \ "nop"
+
+   sync-cache,
+c;
+
+\ Turn off debugging
+code unbug   (s -- )
+   h# 8ea80000           t0    li       \ "ip 0  t0  lw"
+   t0                    np 0  sw
+   h# 01124021           t0    li       \ "w base  w  addu"
+   t0                    np 4  sw
+\ This is for the old version where the "bubble" macro assembles a nop
+\   $0                    np 4  sw	\ "nop"
+
+   sync-cache,
+c;
+
+forth definitions
+
+\ Cannot execute cache instructions under development evironment.
+[ifdef] debug-on-cobalt
+unbug
+[else]
+normal-next debug-next !
+[then]
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/decompm.fth
===================================================================
--- cpu/mips/decompm.fth	                        (rev 0)
+++ cpu/mips/decompm.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,54 @@
+purpose: Machine/implementation-dependent definitions for the decompiler
+\ See license at end of file
+
+decimal
+headerless
+
+only forth also hidden also  definitions
+: dictionary-base  ( -- adr )  origin  ;
+
+: ram/rom-in-dictionary?  ( adr -- flag )
+   dup  #talign 1-  and  0=  if
+      dup  lo-segment-base lo-segment-limit  within
+      swap hi-segment-base hi-segment-limit  within  or
+   else
+      drop false
+   then
+;
+
+' ram/rom-in-dictionary? is in-dictionary?
+
+\ True if adr is a reasonable value for the interpreter pointer
+: reasonable-ip?  ( adr -- flag )
+   dup  in-dictionary?  if  ( ip )
+      #talign 1- and 0=  \ must be token-aligned
+   else
+      drop false
+   then
+;
+only forth also definitions
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/disassem.fth
===================================================================
--- cpu/mips/disassem.fth	                        (rev 0)
+++ cpu/mips/disassem.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,473 @@
+purpose: MIPS disassembler
+\ See license at end of file
+
+vocabulary disassembler
+also disassembler also definitions
+
+headerless
+
+string-array real-regs
+," $0"   ," $1"   ," v0"   ," v1"
+," a0"   ," a1"   ," a2"   ," a3"
+," t0"   ," t1"   ," t2"   ," t3"
+," t4"   ," t5"   ," t6"   ," t7"
+," s0"   ," s1"   ," s2"   ," s3" 
+," s4"   ," s5"   ," s6"   ," s7" 
+," t8"   ," t9"   ," k0"   ," k1"
+," gp"   ," sp"   ," s8"   ," ra"
+end-string-array
+
+defer regs  ' real-regs is regs
+
+string-array normalops
+\ o# 0X
+," "      ," "		\ special and regimm
+," j"     ," jal"	\ target
+," beq"   ," bne"	\ rs,rt,offset
+," blez"  ," bgtz"	\ rs,offset
+
+\ o# 1X
+," addi"  ," addiu"   ," slti"    ," sltiu"	\ rt,rs,immed
+," andi"  ," ori"     ," xori"    ," lui"	\ rt,rs,immed
+
+\ o# 2X
+," "  ," "  ," "  ," "  \ cop0, cop1, cop2, cop1x
+," "  ," "  ," "  ," "  \ beql, bnel, blezl, bgtzl (obsolescent)
+
+\ o# 3X
+," daddi"   ," daddiu"  \ rt,rs,immed
+," ldl"     ," ldr"     \ rt,offset(base)
+," "        ," jalx"   ," "  ," "    \ special2, jalx, mdmx, reserved
+
+\ o# 4X
+," lb"    ," lh"      ," lwl"     ," lw"	\ rt,offset(base)
+," lbu"   ," lhu"     ," lwr"     ," lwu"	\ rt,offset(base)
+
+\ o# 5X
+," sb"    ," sh"      ," swl"     ," sw"	\ rt,offset(base)
+," sdl"   ," sdr"     ," swr"			\ rt,offset(base)
+," cache"					\ code,offset(base)
+
+\ o# 6X
+," ll"    ," lwc1"    ," lwc2"    ," pref"	\ rt,offset(base)
+," lld"   ," ldc1"    ," ldc2"    ," ld"	\ rt,offset(base)
+
+\ o# 7X
+," sc"    ," swc1"    ," swc2"    ," "		\ rt,offset(base)
+," scd"   ," sdc1"    ," sdc2"    ," sd"	\ rt,offset(base)
+end-string-array
+
+string-array  specialops
+\ o# 0X
+," sll"     ," "        ," srl"    ," sra"	\ rd,rt,sa (hole is movci)
+," sllv"    ," "        ," srlv"   ," srav"	\ rd,rt,rs
+\ o# 1X
+," jr"						\ rs
+," jalr"					\ rd,rs
+," movz"    ," movn"
+," syscall" ," break"   ," "       ," sync"	\ -
+\ o# 2X
+," mfhi"    					\ rd
+," mthi"    					\ rs
+," mflo"   					\ rd
+," mtlo"					\ rs
+," dsllv"   ," "        ," dsrlv"  ," dsrav"	\ rd,rt,rs
+\ o# 3X
+," mult"    ," multu"   ," div"    ," divu"	\ rs,rt
+," dmult"   ," dmultu"  ," ddiv"   ," ddivu"	\ rs,rt
+\ o# 4X
+," add"     ," addu"    ," sub"    ," subu"	\ rd,rs,rt
+," and"     ," or"      ," xor"    ," nor"	\ rd,rs,rt
+\ o# 5X
+," "        ," "        ," slt"    ," sltu"	\ rd,rs,rt
+," dadd"    ," daddu"   ," dsub"   ," dsubu"	\ rd,rs,rt
+\ o# 6X
+," tge"     ," tgeu"    ," tlt"    ," tltu"	\ rs,rt
+," teq"     ," "        ," tne"    ," "		\ rs,rt
+\ o# 7X
+," dsll"    ," "        ," dsrl"   ," dsra"	\ rd,rt,sa
+," dsll32"  ," "        ," dsrl32" ," dsra32"	\ rd,rt,sa
+end-string-array
+
+string-array regimmops
+\ o# 0X
+," bltz"    ," bgez"	," bltzl" ," bgezl"	\ rs,offset
+," "        ," "        ," "      ," "
+\ o# 1X
+," tgei"    ," tgeiu"	," tlti"  ," tltiu"	\ rs,immed
+," teqi"    ," "	," tnei"  ," "		\ rs,immed
+\ o# 2X
+," bltzal"  ," bgezal"	," bltzall" ," bgezall"	\ rs,offset
+," "        ," "        ," "      ," "
+\ o# 3X
+," "        ," "        ," "      ," "
+," "        ," "        ," "      ," "
+end-string-array
+
+decimal
+\ Generates a mask with #bits set in the low part.  4 >mask  yields  0000000f
+lvariable instruction
+variable end-found
+lvariable pc
+lvariable display-offset  0 display-offset l!
+lvariable branch-target		\ Help for tracing/single-stepping
+
+' ul.  is showaddr
+
+: +offset  ( adr -- adr' )  display-offset l@  -  ;
+: >mask  ( #bits -- mask )  -1  32  rot  -  >> ;
+: bits  ( right-bit #bits -- field )
+   instruction l@ rot >>   ( #bits shifted-instruction )
+   swap >mask  land        ( field )
+;
+: bit?  ( bit# -- f )  instruction l@ 1 rot lshift land  ;
+
+\ Display formatting
+variable start-column
+: op-col  ( -- )  start-column @  d# 8 +  to-column  ;
+
+: .,  ( -- )  ." ,"  ;
+: 5bits  ( pos -- bits )  5 bits  ;
+: rd  ( -- n )  11 5bits  ;
+: rt  ( -- n )  16 5bits  ;
+: rs  ( -- n )  21 5bits  ;
+: sa  ( -- n )   6 5bits  ;
+: .freg  ( n -- )  dup  d# 16 <  if  ." FGR"  else  ." FPR"  then  .d  ;
+: .dreg  ( n -- )  ." DR" .d  ;
+: .reg  ( n -- )    regs ".  ;
+: .rd  ( -- )   rd .reg   ;
+: .rs  ( -- )   rs .reg   ;
+: .rt  ( -- )   rt .reg   ;
+: 2u.d  ( n -- )    base @ >r decimal  0 <# # # #> type  r> base !  ;
+: 8u.h  ( n -- )  base @ >r hex  0 <# # # # # # # # # #> type  r> base !  ;
+: 0s.h  ( n -- )  base @ >r hex  (.) type  r> base !  ;
+: .sa   ( n -- )  sa 2u.d  ;
+: simmed  ( -- n )  0 16 bits  16 << 16 >>a  ;
+: 0immed  ( -- u )  0 16 bits  16 << 16 >>   ;
+: .target  ( -- )
+   pc @  h# f000.0000  and   0 26 bits  2 <<  or  8u.h
+;
+: opcode  ( -- n )  26 6 bits  ;
+: funct  ( -- n )  0 6 bits  ;
+: .broffset  ( -- )  pc l@ 4 +  simmed 2 <<  +  8u.h  ;
+: .rs,rt,offset  ( -- )  .rs ., .rt ., .broffset  ;
+: .rs,offset  ( -- )  .rs ., .broffset  ;
+: .rt,offset(base)  ( -- )  .rt ., simmed 0s.h ." (" .rs ." )"  ;
+: .rd,rt,sa  ( -- )  .rd ., .rt ., .sa  ;
+: .rd,rt,rs  ( -- )  .rd ., .rt ., .rs  ;
+: .rs,rt     ( -- )  .rs ., .rt ;
+: .rd,rs     ( -- )  .rd ., .rs ;
+: .rd,rs,rt  ( -- )  .rd ., .rs ., .rt  ;
+: .rs,immed  ( -- )  .rs ., simmed 0s.h  ;
+: .rt,rs,immed  ( n -- )  .rt ., .rs ., 0s.h  ;
+: .unimp  ( -- )  ." UNIMP"  op-col  ;
+
+string-array cachesps
+," I" ," D" ," SI" ," SD"
+end-string-array
+string-array cacheops
+," IndexInvalidate" ," IndexWriteBackInvalidate" ," IndexInvalidate" ," IndexWriteBackkInvalidate"
+," IndexLoadTag"    ," IndexLoadTag"             ," IndexLoadTag"    ," IndexLoadTag"
+," IndexStoreTag"   ," IndexStoreTag"            ," IndexStoreTag"   ," IndexStoreTag"
+," "                ," CreateDirtyExclusive"     ," "                ," CreateDirtyExclusive"
+," HitInvalidate"   ," HitInvalidate"            ," HitInvalidate"   ," HitInvalidate"
+," Fill"            ," HitWriteBackInvalidate"   ," "                ," HitWriteBackInvalidate"
+," HitWriteBack"    ," HitWriteBack"             ," "                ," HitWriteBack"
+," "                ," "                         ," HitSetVirtual"   ," HitSetVirtual"
+end-string-array
+
+: .cache  ( -- )
+   rt cacheops ".
+   ." (" 16 2 bits cachesps ". ." )"
+   ., simmed 0s.h ." (" .rs ." )"
+;
+
+: .op	( pstr -- )
+   dup c@ 0=  if  drop  .unimp  else  ".  op-col  then
+;
+: above  ( selector limit -- selector testval )  over tuck  >  if  1-  then  ;
+: .regimm  ( -- )
+   rt   dup regimmops  .op   ( opbits )
+   o# 10  o# 20 within  if  .rs,immed  else  .rs,offset  then
+;
+: .iw  instruction l@ 8u.h  ;
+: bits23..21  ( -- n )  d# 21 3 bits  ;
+
+string-array bcops
+," f"  ," t"  ," fl"  ," tl"
+end-string-array
+
+: .bad  ( -- )  .unimp .iw  ;
+: .fop  ( pstr -- )
+   ".  rs  case
+      o# 20 of  ." .s"  endof
+      o# 21 of  ." .d"  endof
+      o# 24 of  ." .w"  endof
+      ( default )  ." .?"
+   endcase
+   op-col
+;
+: .f1r  ( -- )  sa .freg .,  rd .freg  ;
+: .f2r  ( -- )  .f1r ., rt .freg  ;
+: bits2..0  ( -- n )  0 3 bits  ;
+string-array cvtops
+   ," cvt.s"  ," cvt.d"  ," "  ," "  ," cvt.w"   ," cvt.l"  ," cvt.ps"  ," "
+end-string-array
+
+: bits2..0  ( -- n )  0 3 bits  ;
+
+string-array fcalcops
+   ," add" ," sub" ," mul" ," div" ," sqrt" ," abs" ," mov" ," neg"
+
+end-string-array
+
+string-array fc1ops
+   ," round" ," trunc" ," ceil" ," floor"
+end-string-array
+
+string-array fcmpops
+   ," c.f"    ," c.un"   ," c.eq"   ," c.ueq"
+   ," c.olt"  ," c.ult"  ," c.ole"  ," c.ule"
+   ," c.sf"   ," c.ngle" ," c.seq"  ," c.ngl"
+   ," c.lt"   ," c.nge"  ," c.le"   ," c.ngt"
+end-string-array
+
+: .fcmp  ( -- )
+   0 4 bits fcmpops  .fop  rd .freg  .,  rt .freg
+;
+
+[ifdef] notyet
+string-array f2ops
+   ," "  ," {movcf}"  ," movz"   ," movn"  ," "  ," recip"  ," rsqrt"  ," "
+end-string-array
+string-array f3ops
+   ," recip2"  ," recip1"  ," rsqrt1"   ," rsqrt2"
+end-string-array
+[then]
+
+: .fcalc  ( -- )
+   3 3 bits case
+   0 of  bits2..0 dup  fcalcops .fop  4 <  if  .f2r  else  .f1r  then  endof
+   1 of  bits2..0 4 - dup 0<  if drop .bad  else  fc1ops .fop .f1r  then  endof
+[ifdef] notyet
+   2 of  bits2..0 f2ops  .fop ( .f1r ??)  endof
+   3 of  bits2..0 4 - dup 0<  if drop .bad  else  f3ops .fop ( .f1r ??) then  endof
+[then]
+   4 of  bits2..0 cvtops .fop .f1r  endof
+   6 of .fcmp  endof
+   7 of .fcmp  endof
+   ( default )  .bad
+   endcase
+;
+
+string-array cp0ops
+   ," "     
+   ," tlbr"  
+   ," tlbwi" 
+   ," " ," " ," "
+   ," tlbwr"
+   ," "
+   ," tlbp"
+   ," "     ," "  ," "  ," "  ," "  ," "  ," "  \ holes
+   ," "     ," "  ," "  ," "  ," "  ," "  ," "  ," "  \ holes
+   ," eret" ," "  ," "  ," "  ," "  ," "  ," "  ," deret"
+   ," wait"
+end-string-array
+
+: .cp0  ( -- )
+   pc l@ l@  h# 3f and  h# 18 =  end-found !
+   0 6 bits  cp0ops .op
+;
+
+string-array mfcops	\ rt(16), fs(11=rd)
+," mfc" ," dmfc"   ," cfc"    ," "  ," mtc" ," dmtc" ," ctc" ," "
+," bc"  ," bcany2" ," bcany4" ," "  ," "    ," "     ," "    ," "
+," s"   ," d"      ," "       ," "  ," w"   ," l"    ," ps"  ," "
+end-string-array
+
+: .(cop)  ( pstr -- )
+   dup c@ 0=  if  drop  ." UNIMP"  else  ". d# 26 2 bits ascii 0 + emit  then
+;
+
+: .copx  ( -- )
+   d# 24 2 bits  case
+      0  of  ." Coprocessor instruction "  .iw
+      1  of  bits23..21  if
+                .bad
+             else
+                rt 4 >  if  .bad  else  rs mfcops .(cop) rt bcops .op  .broffset  then
+             then
+             endof
+      ( default )  .bad
+   endcase
+;
+
+: .cop0  ( -- )
+   d# 24 2 bits  case
+      0 of  rs mfcops .(cop) op-col  .rt ., rd 2u.d  endof
+      1 of  bits23..21  if
+               .bad
+            else
+               rt 4 >  if  .bad  else  rs mfcops .(cop) rt bcops .op  .broffset  then
+            then
+            endof
+      2 of  .cp0  endof
+      3 of  .bad  endof
+   endcase
+;
+
+: .cop1  ( -- )
+   d# 24 2 bits  case
+      0 of  rs mfcops .(cop) op-col  .rt ., rd .freg  endof
+      1 of  bits23..21  if
+               .bad
+            else
+               rt 4 >  if  .bad  else  rs mfcops .(cop) rt bcops .op  .broffset  then
+            then
+            endof
+      2 of  .fcalc  endof
+      ( default )  .bad
+   endcase
+;
+
+: .special  ( -- )
+   \ Stop when we see  jr
+   pc l@ l@   h# fc00.003f and  h# 0000.0008 =  end-found !
+
+   0 6 bits  dup specialops  .op   ( opbits )
+   case
+      o# 70 above of  .rd,rt,sa   endof
+      o# 60 above of  .rs,rt      endof
+      o# 40 above of  .rd,rs,rt   endof
+      o# 30 above of  .rs,rt      endof
+      o# 24 above of  .rd,rt,rs   endof
+      o# 23       of  .rs         endof
+      o# 22       of  .rd         endof
+      o# 21       of  .rs         endof
+      o# 20       of  .rd         endof
+      o# 14 above of              endof		\ no operands
+      o# 11 above of  .rd,rs      endof
+      o# 10 above of  .rs         endof
+      o# 04 above of  .rd,rt,rs   endof
+      ( default )     .rd,rt,sa
+   endcase
+;
+
+\ XXX implement me
+: .mdmx  ( -- )  ." MDMX ..." cr  ;
+
+: .special2  ( -- )
+   \ Stop when we see  jr
+   pc l@ l@   h# 0000.003f and  h# 0000.003e =  end-found !
+
+   0 6 bits  case
+[ifdef] notyet
+      o# 00 of  ." madd"  endof
+      o# 01 of  ." maddu" endof
+      o# 02 of  ." mul"   endof
+      o# 04 of  ." msub"  endof
+      o# 05 of  ." msubu" endof
+      o# 40 of  ." clz"   endof
+      o# 41 of  ." clo"   endof
+      o# 44 of  ." dclz"  endof
+      o# 45 of  ." dclo"  endof
+[then]
+      o# 75 of  rs case
+                   0  of  ." mfdr" .rt ., rd .dreg  endof
+                   4  of  ." mtdr" .rt ., rd .dreg  endof
+                   ( default )  .rd,rt,rs
+                endcase
+      o# 76 of  ." dret"    endof
+      o# 77 of  ." dbreak"  endof
+      ( default )  .rd,rt,sa
+   endcase
+;
+
+: .normal  ( -- )
+   \ Stop when we see  j
+   pc l@ l@   h# fc00.0000 and  h# 0800.0000 =  end-found !
+   26 6 bits  dup normalops  .op   ( opbits )
+   case
+      o# 60 above of  .rt,offset(base)     endof
+      o# 57       of  .cache               endof
+      o# 32 above of  .rt,offset(base)     endof
+      o# 30 above of  simmed .rt,rs,immed  endof
+      o# 26 above of  .rs,offset           endof
+      o# 24 above of  .rs,rt,offset        endof
+      o# 17 above of  .rt ., 0immed 16 << 8u.h   endof
+      o# 14 above of  0immed .rt,rs,immed  endof
+      o# 10 above of  simmed .rt,rs,immed  endof
+      o# 06 above of  .rs,offset           endof
+      o# 04 above of  .rs,rt,offset        endof
+      ( default )     .target
+   endcase
+;
+
+: disasm  ( 32b -- )
+   instruction l!
+   26 6 bits  case
+          0  of  .special  endof
+          1  of  .regimm   endof
+      o# 20  of  .cop0     endof
+      o# 21  of  .cop1     endof
+      o# 22  of  .copx     endof
+      o# 23  of  .copx     endof
+      o# 34  of  .special2 endof
+      o# 36  of  .mdmx     endof
+      ( default )  .normal
+   endcase
+   cr
+;
+
+forth definitions
+headers \ ****************
+alias disasm disasm
+\ : .5bits  ( n -- n' )
+\    octal
+\    ascii . hold over h# 1f and 0 # # 2drop drop 5 >> 0
+\ ;
+\ : .xop  ( -- )
+\    pc l@ l@  0 <# # # # # .5bits .5bits ascii . hold # # #> type  hex
+\ ;
+: .xop ;
+: dis1  ( -- )
+   ??cr
+   pc l@ +offset  showaddr  2 spaces  .xop
+   4 spaces  #out @  start-column !
+   pc l@ l@ disasm
+   /l pc +!
+;
+: +dis  ( -- )
+   base @ >r  hex
+   end-found off
+   begin   dis1  end-found @  exit? or  until
+   dis1       \ Disassemble the delay instruction too
+   r> base !
+;
+: dis  ( adr -- )   pc l!   +dis  ;
+alias (dis dis
+previous previous definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/field.fth
===================================================================
--- cpu/mips/field.fth	                        (rev 0)
+++ cpu/mips/field.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,45 @@
+purpose: Optimized struct and field for MIPS
+\ See license at end of file
+
+\ to the base address of the structure
+
+: struct  ( -- 0 )  0  ;
+
+: field  \ name  ( offset size -- offset+size )
+   create over , +
+
+   \ The high level equivalent of what the following machine code is:
+   \    does> @ + ;
+   \ We write it in code because the metacompiler facilities for
+   \ resolving DOES> clauses are clumsy
+
+   ;code  ( struct-adr -- field-adr )
+      sp          t0   pop    \ Get the struct address
+      tos 0       tos  lw     \ Get the structure member offset
+      bubble
+      tos t0      tos  addu   \ Return the structure member address
+c;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/filecode.fth
===================================================================
--- cpu/mips/filecode.fth	                        (rev 0)
+++ cpu/mips/filecode.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,153 @@
+purpose: Code words to support the file system interface
+\ See license at end of file
+
+code ln+   (s n1 n2 -- n3 )   sp  t0  pop   tos t0  tos  addu   c;
+
+\ &ptr is the address of a pointer.  fetch the pointed-to
+\ character and post-increment the pointer
+ 
+code @c at ++ ( &ptr -- char )
+   tos   t0   get     \ Fetch the pointer
+   tos   t1   move    \ Copy of the address
+   t0 0  tos  lbu     \ Get the byte
+   t0 1  t0   addiu   \ Increment the pointer   
+   t0    t1   put     \ Replace the pointer
+c;
+ 
+\ &ptr is the address of a pointer.  store the character into
+\ the pointed-to location and post-increment the pointer
+
+code @c!++ ( char &ptr -- )
+   tos    t0     get     \ Fetch the pointer
+   sp     t1     pop     \ char in t1 
+   t1     t0  0  sb      \ Put the byte
+   t0  1  t0     addiu   \ Increment the pointer   
+   t0     tos    put     \ Replace the pointer
+   sp     tos    pop     \ Fixup top of stack
+c;
+
+\ "adr1 len2" is the longest initial substring of the string "adr1 len1"
+\ that does not contain the character "char".  "adr2 len1-len2" is the
+\ trailing substring of "adr1 len1" that is not included in "adr1 len2".
+\ Accordingly, if there are no occurrences of that character in "adr1 len1",
+\ "len2" equals "len1", so the return values are "adr1 len1  adr1+len1 0"
+
+code split-string  ( adr1 len1 char -- adr1 len2  adr1+len2 len1-len2 )
+			\ char in tos
+   sp 0      t1   lw	\ len1
+   sp 4      t0   lw	\ adr1
+   sp -4     sp   addiu	\ Make room for extra return value
+
+   t1 $0 <>  if			\ If string not empty
+   t0 t1     t3   addu		\ Delay: Loop limit
+      begin			   \ t0 points to next character
+         t0 0   t2   lbu	   \ Get the next character
+         bubble
+         tos t2 = if 	           \ Exit if delimiter found
+            t0 1       t0   addiu  \ Delay: Increment address
+
+            t0 -1      t0   addiu  \ Cancel last increment
+
+            t3 t1      t1   subu   \ Reconstruct adr1
+            t0 t1      t1   subu   \ Compute len2
+            t1       sp 4   sw	   \ .. and store on stack
+
+            t0       sp 0   sw	   \ store adr1+len2 on stack
+
+            t3 t0     tos   sub	   \ Return len1-len2
+            next
+         then
+      t0 t3 = until
+      nop
+   then
+   \ The test character is not present in the input string
+
+   t3      sp 0   sw	\ Store adr1+len2 on stack
+   $0       tos   move	\ Return rem-len=0
+c;
+
+\ Splits a buffer into two parts around the first line delimiter
+\ sequence.  A line delimiter sequence is either CR, LF, CR followed by LF,
+\ or LF followed by CR.
+\ adr1 len2 is the initial substring before, but not including,
+\ the first line delimiter sequence.
+\ adr2 len3 is the trailing substring after, but not including,
+\ the first line delimiter sequence.
+
+code parse-line  ( adr1 len1 -- adr1 len2  adr1+len2 len1-len2 )
+   tos       t1   move	\ len1
+   sp 0      t0   lw	\ adr1
+   sp -8     sp   addiu	\ Make room for extra return values
+
+   $0 h# 0a  tos  addiu	\ Delimiter 1
+   $0 h# 0d  t4   addiu	\ Delimiter 2
+
+   t1 $0 <>  if		\ If string not empty
+   t0 t1     t3   addu	\ Delay: Loop limit
+      begin			\ t0 points to next character
+         t0 0   t2   lbu	\ Get the next character
+         bubble
+
+         tos t2  <> if		\ Compare to linefeed
+         t0 1   t0   addiu	\ Delay: Increment address
+         t4  t2  = if		\ Compare to return
+         nop			\ Delay
+         but then	   	\ target of linefeed comparison branch
+            \ One of the delimiters matches
+
+            t3 t1  t1  subu	\ Reconstruct adr1
+            t0 t1  t1  subu	\ Compute len2
+            t1 -1  t1  addiu	\ Account for incremented pointer
+            t1   sp 4  sw	\ .. and store on stack
+
+            \ Check next character too, unless we're at the
+            \ end of the buffer
+            t0 t3 <>  if  nop
+            t0 1  t5   lbu	\ Get the next character
+               bubble
+               \ Compare next character to other delimiter
+               tos t2 =  if  nop  t4 tos move  then  \ Other delim in tos
+               tos t5 <>  if  nop	\ If nextchar equals other delim...
+                  t0 1   t0  addiu	\ ... consume it
+               then
+            then
+            t0    sp 0  sw	\ store adr1+len2 on stack
+            t3 t0  tos  subu	\ Return len1-len2
+            next
+         then
+      t0 t3 = until
+      nop
+   then
+   \ There is no line delimiter in the input string
+
+   t0    sp 0   sw		\ Store adr1+len2 on stack
+   $0    tos    move		\ Return rem-len=0
+c;
+
+headers
+
+nuser delimiter
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/finish.fth
===================================================================
--- cpu/mips/finish.fth	                        (rev 0)
+++ cpu/mips/finish.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,53 @@
+purpose: Final steps of kernel metacompilation for MIPS
+\ See license at end of file
+
+\ ' sys-init-io is init-io
+
+\ hex
+\ " root" $sfind drop resolution@ >user-t link-t@
+\ begin dup u. dup origin-t <> while /link-t - link at -t repeat drop cr
+\ cr
+\ " forth" $sfind drop resolution@ >user-t link-t@
+\ begin dup u. dup origin-t <> while /link-t - link at -t repeat drop cr
+\ cr
+
+
+also assembler
+\ cld 8 +         cld      branch!
+\ 'body cold-code cld 8 +  branch!
+previous
+variable dodoesaddr
+
+' init  is do-init
+
+assembler dodoes meta   is dodoesaddr
+forth-h
+metaoff
+only forth also meta also definitions
+fix-vocabularies
+only forth also definitions
+' symbols fixall
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/fixvoc.fth
===================================================================
--- cpu/mips/fixvoc.fth	                        (rev 0)
+++ cpu/mips/fixvoc.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,51 @@
+purpose: Post-fixup of metacompiled vocabularies for MIPS
+\ See license at end of file
+
+\ Nasty kludge to resolve the to pointer to the does> clause of vocabulary
+\ within "forth".  The problem is that the code field of "forth" contains
+\ a call instruction to the does> clause of vocabulary.  This call is a 
+\ forward reference which cannot be resolved in the same way as compiled
+\ addresses.
+
+: used-t  ( definer-acf child-acf -- )
+   [ also meta ] token!-t [ previous ]
+;
+
+: fix-vocabularies  ( -- )
+   [""] <vocabulary>  also symbols  find   previous  ( acf true | str false )
+   0= abort" Can't find <vocabulary> in symbols"
+   dup resolution@ >r               ( acf )  ( Return stack: <vocabulary>-adr )
+   dup first-occurrence@                     ( acf occurrence )
+   \ Don't let fixall muck with this entry later
+   0 rot >first-occurrence !		     ( occurrence )
+   begin  another-occurrence?  while         ( occurrence )
+      dup [ meta ] token at -t [ forth ] swap   ( next-occurrence occurrence )
+      \ Calculate the longword offset to the vocabulary does> clause
+      r@ swap used-t
+   repeat
+   r> drop
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/float.fth
===================================================================
--- cpu/mips/float.fth	                        (rev 0)
+++ cpu/mips/float.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,353 @@
+purpose: Forth Floating point package for MIPS
+\ See license at end of file
+
+\ Has a separate floating point stack.
+\ All floating point numbers are IEEE double-precision format.
+
+\ Additional floating point words, including input and output conversion,
+\ are in unix/sparc/floatext.fth
+
+hex
+only forth definitions vocabulary floating
+only forth also hidden also floating also definitions
+
+create float.fth
+
+16 constant f#places
+8 constant /f
+/f constant f#bytes
+
+: align8  ( adr -- adr' )  7 +  -8 and  ;
+h# 20 /f * constant /fstack
+
+/fstack /f +  buffer: fstack		\ Including slack for alignment
+
+/l ualloc user fp0
+
+: fp  ( -- n )  [ assembler ]  s7  ;
+
+code fp!  ( adr -- )  tos fp move  sp tos pop  c;
+code fp@  ( adr adr )  tos sp push  fp tos move  c;
+
+: fclear  ( -- )  fp0 l@ fp!  ;
+: finit  ( -- )  fstack align8  /fstack + /f -   fp0 l!  fclear  ;
+
+finit
+: fdepth  ( -- n )  fp0 l@  fp@  -  /f /  ;
+
+code f+  ( f1 f2 -- f3 )
+   fp 0     $f3  lwc1
+   fp 4     $f2  lwc1
+   fp /f    fp   addiu
+   $f0 $f2  $f0  addf .d
+c;
+code f-  ( f1 f2 -- f3 )
+   fp 0     $f3  lwc1
+   fp 4     $f2  lwc1
+   fp /f    fp   addiu
+   $f2 $f0  $f0  subf .d
+c;
+code f*  ( f1 f2 -- f3 )
+   fp 0     $f3  lwc1
+   fp 4     $f2  lwc1
+   fp /f    fp   addiu
+   $f0 $f2  $f0  mulf .d
+c;
+code f/  ( f1 f2 -- f3 )
+   fp 0     $f3  lwc1
+   fp 4     $f2  lwc1
+   fp /f    fp   addiu
+   $f2 $f0  $f0  divf .d
+c;
+
+code fsqrt    ( f1 -- f2 )  $f0 $f0 sqrt .d  c;
+code fnegate  ( f1 -- f2 )  $f0 $f0 negf .d  c;
+code fabs     ( f1 -- f2 )  $f0 $f0 abs  .d  c;
+
+variable cond
+: leaveflag  ( -- )
+   asm(
+      \    CMP.cond.D  $f2,$f0
+      cop1 .d   $f2 rd  $f0 rt  h# 30 addbits  cond @ h# f land  addbits
+
+      tos     sp    push
+      here h# 0c +  cond @  h# 10 land  [ also forth ]  if  [ previous ]
+         bc1f
+      [ also forth ]  else  [ previous ]
+         bc1t
+      [ also forth ]  then  [ previous ]
+         $0  -1  tos   addiu	  \ Delay slot, always executed
+         $0      tos   move	  \ Executed only if condition is false
+      ( then )
+      fp /f      $f1   lwc1
+      fp /f 4 +  $f0   lwc1
+      fp /f      fp    addiu
+      c;
+   )asm
+;
+: binaryfcmp: ( extension-field -- )  ( Later:  f1 f2 -- flag )
+   cond !
+   code
+
+   asm(
+      fp 0    $f3   lwc1
+      fp 4    $f2   lwc1
+      fp /f   fp    addiu
+   )asm
+
+   leaveflag
+;
+: unaryfcmp: ( extension-field -- )  ( Later:  f1 -- flag )
+   cond !
+   code
+   asm(
+      $f2  $0    mtc1      bubble
+      $f2  $f2   cvt.d .w
+   )asm
+   leaveflag
+;
+
+\ The inverse sense of extension-code for the binary comparisons is
+\ because the operands come off the stack in the reverse order
+
+assembler also
+
+ 2 binaryfcmp: f=
+12 binaryfcmp: f<>
+ 4 binaryfcmp: f<
+1f binaryfcmp: f>
+ e binaryfcmp: f<=
+1d binaryfcmp: f>=
+
+ 2 unaryfcmp: f0=
+12 unaryfcmp: f0<>
+1e unaryfcmp: f0<
+ d unaryfcmp: f0>
+1c unaryfcmp: f0<=
+ f unaryfcmp: f0>=
+
+previous floating
+
+/f negate constant -/f
+code fint  ( f -- l )
+   $f0    $f0   cvt.w .d
+   tos    sp    push
+   $f0    tos   mfc1
+   fp 0   $f1   lwc1
+   fp 4   $f0   lwc1
+   fp /f  fp    addiu
+c;
+
+code float  ( l -- f )
+   fp -/f  fp    addiu
+   $f1     fp 0  swc1
+   $f0     fp 4  swc1
+   $f0     tos   mtc1
+   sp      tos   pop
+   $f0     $f0   cvt.d .w
+c;
+code f!  ( f adr -- )
+   $f1    tos 0  swc1	\ Don't require doubleword alignment
+   $f0    tos 4  swc1
+   sp     tos    pop
+   fp 0   $f1    lwc1
+   fp 4   $f0    lwc1
+   fp /f  fp     addiu
+c;
+code f@  ( adr -- f )
+   fp -/f fp     addiu
+   $f1    fp 0   swc1
+   $f0    fp 4   swc1
+   tos 0  $f1    lwc1	\ Don't require doubleword alignment
+   tos 4  $f0    lwc1
+   sp     tos    pop
+c;
+code fdrop  ( f -- )
+   fp 0   $f1  lwc1
+   fp 4   $f0  lwc1
+   fp /f  fp   addiu
+c;
+code fswap  ( f1 f2 -- f2 f1 )
+   fp 0   $f3    lwc1
+   fp 4   $f2    lwc1
+   bubble
+   $f1    fp 0   swc1
+   $f0    fp 4   swc1
+   $f2    $f0    movf .d
+c;
+code fover  ( f1 f2 -- f1 f2 f1 )
+   fp -/f fp    addiu
+   $f1    fp 0  swc1
+   $f0    fp 4  swc1
+   fp /f      $f1   lwc1
+   fp /f 4 +  $f0   lwc1
+c;
+code fdup  ( f -- f f )
+   fp -/f fp    addiu
+   $f1    fp 0  swc1
+   $f0    fp 4  swc1
+c;
+code frot  ( f1 f2 f3 -- f2 f3 f1 )
+   fp 0   $f3    lwc1
+   fp 4   $f2    lwc1
+   $f1    fp 0   swc1
+   $f0    fp 4   swc1
+   fp /f      $f1    lwc1
+   fp /f 4 +  $f0    lwc1
+   $f3    fp /f      swc1
+   $f2    fp /f 4 +  swc1
+c;
+code fpick  ( n -- ; F: fn ... f0 -- fn ... f0 fn )
+   fp -/f fp  addiu		\ Make space on stack
+   $f1   fp 0 swc1
+   tos $0 <>  if
+   $f0   fp 4  swc1		\ Delay slot; push top of stack to memory
+      tos 3   tos  sll		\ Index into floating point stack
+      fp tos  tos  addu
+      tos 0   $f1  lwc1		\ Get n'th item from floating point stack
+      tos 4   $f0  lwc1
+   then
+   sp tos pop
+c;
+
+code fpop  ( f -- l l )
+   tos    sp     push
+   sp -4  sp     addiu
+   $f0    sp 0   swc1
+   $f1    tos    mfc1
+   fp 0   $f1    lwc1
+   fp 4   $f0    lwc1
+   fp /f  fp     addiu
+c;
+code fpush  ( l l -- f )
+   fp -/f fp     addiu
+   $f1    fp 0   swc1
+   $f0    fp 4   swc1
+   $f1    tos    mtc1
+   sp 0   $f0    lwc1
+   sp 4   tos    lw
+   sp 8   sp     addiu
+c;
+
+: fvariable  ( -- )  create /f allot  ;
+: fconstant  ( fp -- )
+   create  here  /f allot  f!
+   does> f@
+;
+: ifconstant  ( fp-on-p-stack -- )
+   create  here  /f allot  dup >r l!  r> /l + l!
+   does> f@
+;
+00000000 3ff00000  ifconstant  1E0
+00000000 3fe00000  ifconstant  .5E0
+
+\ XXX We really should round to nearest or even.
+: fix  ( -- )  .5E0 f+ fint  ;
+
+code (flit) ( -- fp )
+   fp -/f fp    addiu
+   $f1    fp 0  swc1
+   $f0    fp 4  swc1
+   ip 0   $f1   lwc1
+   ip 4   $f0   lwc1
+   ip /f  ip    addiu
+c;
+
+
+: fliteral  ( fp -- )  compile (flit)  here /f allot  f!  ; immediate
+
+code 10**i  ( i -- fp )  \ Raise 10 to the i'th power
+
+   \ if i < 0, we compute 10**|i|, then take the reciprocal
+
+   fp -/f fp     addiu	\ Prepare to push the floating number
+   $f1    fp 0   swc1
+   $f0    fp 4   swc1
+
+   1      t0     li
+   $f0    t0     mtc1
+   d# 10  t0     li	   \ (Load delay)
+   $f0    $f0    cvt.d .w  \ 1E0 in $f0
+
+   $f2    t0     mtc1
+   bubble
+   $f2    $f2    cvt.d .w  \ 10E0 in $f2
+
+   \ Set scr to the absolute value of i
+
+   tos 0<  if
+      tos      t0   move	\ t0  = i
+      $0  tos  t0   subu	\ t0  = -i
+   then
+
+   tos $0 <> if	\ Leave answer at 1 if i=0
+      nop
+      begin
+         $f0 $f2  $f0  mulf .d	\ Multiply current result by 10
+	 t0 -1    t0   addiu
+      t0 $0 = until
+         nop
+   then
+
+   \ If the exponent is negative, compute the reciprocal
+   tos 0<  if			\ Save i for its sign
+      1         t0   li
+      $f2       t0   mtc1
+      $f2       $f2  cvt.d .w	\ 1E0 in $f2
+      $f2 $f0   $f0  divf .d	\ Take the reciprocal
+   then
+
+   sp  tos  pop		\ Fix data stack
+c;
+
+: >f  ( l -- fscaled )
+   float  dpl @ 0>  if  dpl @  10**i  f/  then
+;
+
+\ Kludge, kludge
+\ Example: 1.3 E 4  puts the floating point number 13000 on the float stack
+\ Works inside of colon definitions too.
+: E  \ exponent  ( l -- fscaled )
+   state @
+   if   \ If we're compiling, we have to grab the number from the code stream
+      here /l - /token - token@
+      ['] (llit) =
+      if    here /l - l@   /l /token + negate allot
+      else ." E must be preceded by a number containing a decimal point"
+           cr abort
+      then
+   then
+   >f bl word number  10**i  f*
+   state @  if  [compile] fliteral  then
+; immediate
+
+forth definitions
+: (cold-hook  ( -- )  (cold-hook  finit  ;
+' (cold-hook is cold-hook
+only forth floating also forth also definitions
+
+decimal
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/forthint.fth
===================================================================
--- cpu/mips/forthint.fth	                        (rev 0)
+++ cpu/mips/forthint.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,338 @@
+purpose: Low-level handler for alarm interrupt 
+\ See license at end of file
+
+headerless
+
+\ Interfaces to system-dependent routines
+defer set-tick-limit  ( #msecs -- )	    \ Setup tick interrupt source
+defer init-dispatcher ( -- )
+defer dispatch-interrupt  ' noop to dispatch-interrupt
+defer dispatch-exceptions  ( exception# -- )  ' drop to dispatch-exceptions
+
+0 value intsave
+h# 1300 d# 34 /x* +  constant /intstack
+
+\ The interrupt save/stack area is laid out as follows:
+\ 0000   - register save area  (size d# 34 /x*)
+\ 0110   - data stack area     (size h#1100)
+\ 1210   - return stack area   (size h#200)
+\ 1410   - <end>
+\
+\ The register save area, which is exported to the client program via the
+\ "tick" callback, contains the following registers, all from the interrupted
+\ context:
+\ 00  - $1
+\ ...
+\ 60  - $25
+\ 64  - $28
+\ ...
+\ 70  - $at
+\
+\ When the interrupt handler returns, the complete context is restored from
+\ the save area.  The client program can cause a context switch by modifying
+\ these saved valued.
+
+hex
+
+: ?call-os  ( -- )  intsave " tick"  ($callback1)  ;
+
+0 value ge-return-loc
+code ge-return  ( -- )
+
+   \ At the first indication of a keyboard abort, we branch to the
+   \ Forth entry trap handler.  We do the actual branch after we have
+   \ restored all the state, so it appears as if Forth were entered
+   \ directly from the program that was running, rather than through
+   \ the exception handler.
+
+   0              k0  set		\ Clear derived abort flag
+   'user aborted? s0  lw		\ Get abort flag
+   1              s1  set
+   s0  s1  =  if
+      nop				\ delay slot
+      \ Don't abort in the middle of the terminal emulator, because
+      \ it's not reentrant.
+      'user terminal-locked?  s1  lw
+      s1 0 =  if
+         nop				\ delay slot
+         s0 1 s0  addi
+         s0 'user aborted? sw
+         1    k0  set			\ Set derived abort flag
+      then
+   then
+
+   \ Restore registers
+   'user intsave k1  lw			\ Address of interrupt save area
+   k1 d# 32 /x* t0 ld
+   k1 d# 33 /x* t1 ld
+   t0 mtlo   t1 mthi
+
+   d# 12 t2 mfc0	\ Get status register
+   t2 d# 28  t2  srl	\ Shift coprocessor status bits down
+   t2 h# 02  t2  andi	\ Mask bit 1 (coprocessor 1 - Floating point)
+   t2 $0 <>  if		\ Skip if coprocessor disabled
+      nop		\ Delay
+      k1 d# 34 /x* t2 ld
+      d# 31 t2 ctc1
+   then
+
+   d# 25 0  do
+      k1  i /x* ( offset )  $0 1+ i + ( reg# )  ld
+   loop
+   4  0  do
+      k1  i d# 25 + /x* ( offset )  $0 d# 28 + i + ( reg# )  ld
+   loop
+
+   \ Now the registers are back to the state that existed upon entry to
+   \ the exception handler.  We can use only k0 and k1 in the following code.
+
+   k0  0 =  if
+      nop				\ delay slot
+      eret				\ Return to interrupted code
+      nop
+   then
+
+   here origin- to ge-return-loc
+   1.0001  k1  set	\ will be save-state address (force 2 instructions)
+   -1      k0  set
+   k1          jr			\ Jump to save-state
+   nop
+
+end-code
+
+\ We implement this in the following way, instead of just having
+\ a value named getmsecs, so that other tasks can use get-msecs
+\ This way is faster too, since the "+!" in the interrupt handler
+\ routine is faster than "to".
+variable msec-counter
+[ifdef] local
+: getmsecs  ( -- n )  main-task msec-counter local @  ;
+[else]
+: getmsecs  ( -- n )  msec-counter @  ;
+[then]
+
+0 value tick-increment
+
+: intr-timer  ( -- )
+   ms/tick msec-counter +!
+   check-alarm
+   count@ tick-increment + compare!
+;
+
+string-array exception-code
+," Interrupt"
+," TLB modified exception"
+," TLB exception (load or instruction fetch)"
+," TLB exception (store)"
+," Address error exception (load or instruction fetch)"
+," Address error exception (store)"
+," Bus error exception (instuction fetch)"
+," Bus error exception (data reference: load or store)"
+," system call exception"
+," Breakpoint exception"
+," Reserved instruction exception"
+," Coprocessor unusable exception"
+," Arithmetic overflow exception"
+," Trap exception"
+," Undefined exception"
+," Floating point exception"
+," " ," " ," " ," " ," " ," " ," "
+," Reference to WatchHi/WatchLo address"
+," " ," " ," " ," " ," " ," " ," " ," "
+end-string-array
+
+: (.exception)  ( exception-code -- )
+    dup exception-code
+    dup c@  if  nip ".  else  drop ." Unknown exception " .x   then
+    cr
+;
+' (.exception) to dispatch-exceptions
+
+defer intr-sw0  ' noop to intr-sw0
+defer intr-sw1  ' noop to intr-sw1
+defer intr-hw0  ' noop to intr-hw0
+defer intr-hw1  ' noop to intr-hw1
+defer intr-hw2  ' noop to intr-hw2
+defer intr-hw3  ' noop to intr-hw3
+defer intr-hw4  ' noop to intr-hw4
+
+: dispatch-interrupts  ( -- )
+   cause@  8 >> h# ff and
+   dup h#  1 and  if  intr-sw0 cause@ h# ffff.feff and cause!  then
+   dup h#  2 and  if  intr-sw1 cause@ h# ffff.fdff and cause!  then
+   dup h#  4 and  if  intr-hw0  then
+   dup h#  8 and  if  intr-hw1  then
+   dup h# 10 and  if  intr-hw2  then
+   dup h# 20 and  if  intr-hw3  then
+   dup h# 40 and  if  intr-hw4  then
+   h# 80 and  if  intr-timer  then
+;
+
+defer ge-handler-hook  ' noop to ge-handler-hook
+: ge-handler  ( -- )
+   ge-handler-hook
+   cause@  2 >> h# 1f and ?dup  if
+      dispatch-exceptions
+   else
+      dispatch-interrupts
+   then
+   ge-return  
+;
+
+0 value ge-preamble-loc
+label ge-preamble  ( -- )
+
+   \ If breakpoint exception, transfer control to save-state immediately.
+   d# 13 k1     mfc0		\ Get CAUSE
+   k1 h# 7c k1  andi		\ Get exception code
+   9 2 <<   k0  set		\ Breakpoint exception
+   k0 k1 =  if
+      nop
+      here origin- to ge-preamble-loc
+      1.0001  k1  set	\ will be save-state address (force 2 instructions)
+      3       k0  set
+      k1      jr		\ Jump to save-state
+      nop
+   then
+
+   \ Find address of interrupt save area
+   ra   k0  move		\ Save ra
+   here 8 +                bal  \ ra = Absolute address of next instruction
+   here origin - 4 + k1    set  \ k1 = relative address of this instruction
+   ra   k1           k1    subu \ k1 address of Forth kernel
+   k0   ra  move                \ Restore ra
+
+   'body main-task   k0  set    \ User pointer address: main-task
+   k1  k0            k0  addu
+   k0  0             k0  lw
+   k0 'user# intsave k0  addiu	\ User pointer
+   k0  0   k0            lw	\ Address of interrupt save area
+
+   \ Save registers
+   d# 25 0  do
+      $0 1+ i + ( reg# )  k0  i /x* ( offset )  sd
+   loop
+   4  0  do
+      $0 d# 28 + i + ( reg#)  k0  i d# 25 + /x* ( offset )  sd
+   loop
+   t0 mflo  t1 mfhi
+
+   d# 12 t2 mfc0	\ Get status register
+   t2 d# 28  t2  srl	\ Shift coprocessor status bits down
+   t2 h# 02  t2  andi	\ Mask bit 1 (coprocessor 1 - Floating point)
+   t2 $0 <>  if		\ Skip if coprocessor disabled
+      nop		\ Delay
+      d# 31 t2 cfc1
+   then
+
+   t0 k0 d# 32 /x* sd
+   t1 k0 d# 33 /x* sd
+   t2 k0 d# 34 /x* sd
+
+   \ Set up Forth stacks
+   k0 /intstack rp  addiu	\ Return stack pointer
+   rp h# -204   sp  addi	\ Data stack pointer
+
+   k1   base  move
+   'body main-task  up  set
+   base  up   up        addu
+   up    0    up        lw
+
+   np@ origin-  np  set
+   np  base     np  addu
+
+   'body ge-handler ip set
+   ip base ip addu
+c;
+
+: set-tick-limit  ( #msecs -- )
+   dup to ms/tick
+   ms-factor * dup to tick-increment 
+   count@ + compare!
+   sr@ h# 8000 or sr!
+;
+
+: (Disable-interrupts)  ( -- )  sr@ h# ffff.fffe and sr!  ;
+' (disable-interrupts) to disable-interrupts
+: (enable-interrupts)  ( -- )  sr@ 1 or sr!  ;
+' (enable-interrupts) to enable-interrupts
+
+label default-handler
+   begin  again  nop
+end-code
+
+code clear-floating-point  ( -- )
+   d# 12 t0 mfc0	\ Get status register
+   t0 d# 28  t0  srl	\ Shift coprocessor status bits down
+   t0 h# 02  t0  andi	\ Mask bit 1 (coprocessor 1 - Floating point)
+   t0 $0 <>  if		\ Skip if coprocessor disabled
+      nop		\ Delay
+      d# 31 $0 ctc1	\ Clear floating point if it's enabled
+   then
+c;
+
+defer tlb-handler   ' default-handler to tlb-handler
+defer xtlb-handler  ' default-handler to xtlb-handler
+defer cache-handler ' default-handler to cache-handler
+" Implement TLB and cache error handlers" ?reminder
+: catch-exceptions  ( -- )
+   [ also hidden ]
+   tlb-handler   0  install-handler
+   xtlb-handler  1  install-handler
+   cache-handler 2  install-handler
+   ge-preamble   3  install-handler	\ General exception
+
+   \ Interrupts can come in on either vector 3 (offset h#180) or vector 4
+   \ (offset h#200), depending on the setting of the IV bit (bit 23) in the
+   \ CP0 Cause register.  If that bit is clear, interrupts share vector 3
+   \ with exceptions.  If that bit is set, exceptions use vector 3 and
+   \ interrupts use vector 4.  We wish to operate correctly with either
+   \ setting, so we install the same handler at both locations.
+   ge-preamble   4  install-handler	\ Interrupt
+
+   sr@ h# 40.0000 invert and sr!	\ BEV = normal
+   [ previous ]
+;
+: install-alarm  ( -- )
+   ['] getmsecs to get-msecs
+   /intstack alloc-mem to intsave
+   intsave /intstack erase	\ Paranoia
+   disable-interrupts
+      init-dispatcher
+      clear-floating-point
+      catch-exceptions
+      d# 1 set-tick-limit
+   enable-interrupts        \ Turn interrupts on
+;
+
+stand-init:  Fixup ge-preamble and ge-return
+   \ Fix up save-state in interrupt-return
+   save-state  ge-return-loc    origin+  fix-set32
+   save-state  ge-preamble-loc  origin+  fix-set32
+;
+
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/ftrace.fth
===================================================================
--- cpu/mips/ftrace.fth	                        (rev 0)
+++ cpu/mips/ftrace.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,41 @@
+purpose: Display a Forth stack backtrace for MIPS
+\ See license at end of file
+
+: .stack  ( -- )   \ Forth data stack
+   ." Data stack: "
+   $sp  sp0 @  dup ps-size -  swap /n -  within  if
+      $sp  sp0 @ /n -  do   i >saved @ .x  /n negate +loop
+   then
+   cr
+;
+only forth also hidden also  forth definitions
+: ftrace  ( -- )   \ Forth return stack
+   $ip >saved .traceline
+   $rp >saved  rssave-end swap  (rstrace   
+   cr .stack
+;
+only forth also definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/getms.fth
===================================================================
--- cpu/mips/getms.fth	                        (rev 0)
+++ cpu/mips/getms.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,104 @@
+purpose: Interval timing functions
+\ See license at end of file
+
+headerless
+
+: ticks-enabled?  ( -- flag )  sr@ h# 8001 tuck and  =  ;
+
+0 value tick-msecs
+: (get-msecs)  ( -- n )  tick-msecs  ;
+' (get-msecs) to get-msecs
+
+d# 10 value ms/tick
+d# 50,000 constant ms-factor
+d# 50 value us-factor
+
+: ticks  ( #ticks -- )
+   count@ +    ( target )
+
+   \ We use "- 0<" instead of "<" so that the right thing will happen
+   \ when the tick count wraps around.
+   \ We use "0<" instead of "0<=" so that we are sure to wait at least
+   \ the requested time; otherwise we might not wait long enough if the
+   \ first call to get-msecs were to occur just before the timer ticked.
+   begin   dup count@ -  0<=  until   \ Loop until target time reached
+   drop                  ( )
+;
+: us  ( #microseconds -- )  us-factor *  ticks ;
+
+: (ms)  ( #ms -- )
+   dup  ms/tick 3 * u>  ticks-enabled?  and  if  ( #ms )
+      \ For relatively long durations, we use the ticker because it is
+      \ presumed to be reasonably accurate over the long run.  However,
+      \ if interrupts are not enabled, we can't use the ticker because
+      \ it won't be ticking.
+
+      get-msecs +           ( target )
+
+      \ We use "- 0<" instead of "<" so that the right thing will happen
+      \ when the tick count wraps around.
+      \ We use "0<" instead of "0<=" so that we are sure to wait at least
+      \ the requested time; otherwise we might not wait long enough if the
+      \ first call to get-msecs were to occur just before the timer ticked.
+      begin   dup get-msecs -  0<=  until   \ Loop until target time reached
+
+      drop                  ( )
+   else                     ( #ms )
+      \ For relatively short durations, we use a timing loop because
+      \ the ticker probably has rather coarse granularity.
+
+      ms-factor *  ticks
+   then
+;
+' (ms) to ms
+
+" calibrate ticker in cpu/mips/getms.fth" ?reminder
+
+d# 33,333,333 constant cpu-clock-speed
+
+\ The way to do this is to determine the internal clock frequency
+\ by multiplying 33.3 MHz by the multiplier value derived from the
+\ CP0 config register, then dividing by two to get the number of ticks
+\ per second, from which us-factor and ms-factor can be derived.
+: calibrate-ticker  ( -- )
+   cpu-clock-speed			( bus-clock-Hz )
+   config@ d# 28 rshift 7 and  case
+      0 of  2 *  endof		\ 2:1
+      1 of  3 *  endof		\ 3:1
+      2 of  4 *  endof		\ 4:1
+      6 of       endof		\ 1:1
+      7 of  3 *  2 /  endof		\ 3:2
+   endcase                         	( processor-clock-Hz )
+   1+ 2/				( count-Hz )
+   d# 1000 /  dup to ms-factor          ( ms-counts )
+   d# 1000 /      to us-factor
+;
+
+headers
+stand-init: Calibrate
+   calibrate-ticker
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/initpgm.fth
===================================================================
--- cpu/mips/initpgm.fth	                        (rev 0)
+++ cpu/mips/initpgm.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,43 @@
+purpose: Generic tools for load image handlers
+\ See license at end of file
+
+: (init-program)  ( pc sp -- )
+   clear-save-area  state-valid on
+   sr@ to $sr
+
+   \ PowerPC calling conventions store the link register at SP+8,
+   \ so we start with r1 a little below the top of the allocated region
+   to $sp  to $pc
+   cif-handler to $a3
+
+   restartable? on
+   true to already-go?
+;
+
+: +base  ( n -- adr )  load-base +  ;
+
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/installation.html
===================================================================
--- cpu/mips/installation.html	                        (rev 0)
+++ cpu/mips/installation.html	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title>MIPS Getting Started</title>
+  <meta http-equiv="content-type"
+ content="text/html; charset=ISO-8859-1">
+  <meta name="author" content="Mitch Bradley">
+</head>
+<body>
+<h2 align="center">MIPS Open Firmware</h2>
+<h2 align="center">Getting Started</h2>
+<h3>Unpacking the Files</h3>
+<ul>
+  <li>Login to the Linux MIPS machine that you will use for your Open Firmware
+compilations.<br>
+  </li>
+  <li>Create a directory on that machine for the Open Firmware build tree.
+&nbsp;It can be on either a local disk or a mounted network filesystem. A
+mounted filesystem may be better in the long run if you expect to use the
+same tree for other processor architectures later. Example: &nbsp;<b>mkdir
+/home/wmb/ofw</b></li>
+  <li>Set the BP environment variable to that directory. Example: <b>export
+BP=/home/wmb/ofw</b></li>
+  <li>Enter that directory:<b> cd $BP</b></li>
+  <li>Extract the files: <b>tar xf mips-ofw.tar.gz</b></li>
+  <li>If you use &nbsp;CVS or a similar version control system, checkin the
+tree.</li>
+</ul>
+<h3>Creating platform directories</h3>
+Builds are done in a directory named $BP/cpu/mips/<i><b>chipset/platform</b></i>/build/
+.<br>
+<br>
+<i><b>chipset </b></i>is a name that identifies the core logic chipset for
+your system. &nbsp;Source files in that directory contain code that is common
+to all systems built with that chipset. In some cases, the source distribution
+will already include a suitable <i>chipset </i>directory for your chipset,
+e.g. $BP/cpu/mips/emma2/.<br>
+<ul>
+  <li>If a suitable chipset directory does not exist, create one. Example:
+    <b>mkdir $BP/arch/mips/mychip</b></li>
+</ul>
+<i><b>platform</b></i> is a name that you choose to identify your system.
+You need a separate <i>platform</i> directory for each distinct Open Firmware
+binary image. Typically you would have a different platform directory for
+each of your different boards. Source files in that directory contain code
+that is board-specific. For example, different boards often have different
+external I/O devices, so the builder script files in the various <i>platform</i>
+directories would load different I/O drivers. &nbsp;It is possible to support
+several boards from a single Open Firmware binary image if the board differences
+can be detected at run time. There is a tradeoff between the difficulty of
+maintaining several different images versus the trouble of testing new combined
+images on all platforms.
+<ul>
+  <li>Create one or more platform directories. &nbsp;Example: <b>mkdir $BP/cpu/mips/mychip/myboard</b>
+  </li>
+</ul>
+The builder puts object files in a "build" subdirectory beneath the <i>platform</i>
+directory. &nbsp;Typically the build directory contains no source files.<br>
+<ul>
+  <li>Create a build directory below each platform directory. Example: <b>mkdir
+$BP/cpu/mips/mychip/myboard/build</b></li>
+</ul>
+<h3>Compilation tools</h3>
+The Open Firmware compilation process uses the following tools:
+<dl>
+  <dd><b>build</b> is the main command for Open Firmware compilation. It
+is a simple shell script that you install &nbsp;(per the above) in a directory
+on your search path. The script's purpose is to set some environment variable
+and then to locate and execute the appropriate executable files for the particular
+host system.</dd>
+  <dd><b>forth</b> is the executable program that <b>build </b>invokes. It
+resides in $BP/bin/<i>cpu</i>/<i>os</i>/forth, where <i>cpu </i>and <i>os</i>
+are the host instruction set (e.g. mips) and operating system (e.g. linux)
+on which it executes.</dd>
+  <dd><b>native.dic</b> is the Open Firmware compiler. It resides in $BP/bin/<i>cpu</i>/native.dic
+. native.dic is a Forth dictionary file that includes all the tools necessary
+for the compilation process, including a Forth metacompiler, a Forth incremental
+compiler, an assembler, an FCode tokenizer, an FCode detokenizer, a dependency
+manager (the "builder"), and a dropin manager (tools for creating sequences
+of &nbsp;dropin modules to form a ROM image file). &nbsp;It can also be extended
+with tools to create specific download file formats.</dd>
+</dl>
+<h3>Compiling "forth" the first time</h3>
+The <b>forth </b>executable is actually just a collection of I/O interface 
+procedures that provide the "glue" to let native.dic work on a particular 
+operating system. The forth executable is the only part of the system that 
+must be compiled with external tools. It is written in C, and may be compiled 
+by various C compilers; typically gcc on a Unix system (but it doesn't use 
+any GCC-specific extensions). After it has been compiled once, it does not 
+need to be compiled again unless you change the host operating system in a
+way that breaks older binaries or shared libraries.<br>
+<br>
+To find out if you need to recompile the "forth" executable for your system,
+do this (on the MIPS Linux development system):<br>
+<blockquote>
+  <pre>cd $BP/bin/mips/linux<br>./forth ../native.dic</pre>
+</blockquote>
+You should see a banner like this:<br>
+<blockquote>
+  <pre>Forthmacs version 4.0<br>Copyright (c) 1994 FirmWorks&nbsp; All Rights Reserved<br>ok <br></pre>
+</blockquote>
+To exit, type <b>bye</b> .<br>
+<br>
+If the above doesn't work, type:<br>
+<blockquote>
+  <pre>make forth</pre>
+</blockquote>
+and try again.
+<h3>Porting to your platform</h3>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+</body>
+</html>

Added: cpu/mips/intctl.fth
===================================================================
--- cpu/mips/intctl.fth	                        (rev 0)
+++ cpu/mips/intctl.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,56 @@
+purpose: Device node for MIPS R4000 internal interrupt controller
+\ See license at end of file
+
+" interrupt-controller" device-name
+my-address my-space  h# 20  reg
+
+0 value pic-base
+
+: >mask  ( bit# -- mask )  1 swap lshift  ;
+: this-interrupt  ( -- irq# )
+   cause@  8 rshift h# ff and     ( mask )
+   8 0  do  dup i >mask and  if  drop i true unloop exit  then  loop   ( mask )
+   drop false
+;
+: interrupt-mask@  ( -- mask )  sr@ 8 rshift h# ff and  ;
+: interrupt-mask!  ( mask -- )  8 lshift  sr@  h# ff00 invert and  or  sr!  ;
+: enable-irq  ( irq# -- )
+   >mask  interrupt-mask@  or  interrupt-mask!
+;
+: disable-irq  ( irq# -- )
+   >mask  interrupt-mask@  swap invert and  interrupt-mask!
+;
+: clear-interrupt  ( irq# -- )  1 swap lshift  1 pic-base >offset rb!  ;
+: open  ( -- flag )
+   pic-base 0=  if
+      my-address my-space  h# 38  " map-in" $call-parent  to pic-base
+      \ 0 interrupt-mask!
+   then
+   pic-base 0<>
+;
+: slot-vector@  ( slot# -- vector )  pic-base >offset rb@  ;
+: close  ( -- )  ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/irq.fth
===================================================================
--- cpu/mips/irq.fth	                        (rev 0)
+++ cpu/mips/irq.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,56 @@
+purpose: Interrupt dispatcher using MIPS R4000 internal interrupt controller
+\ See license at end of file
+
+8 constant #irqs
+
+0 value pic-node
+: enable-interrupt   ( level -- )  " enable-irq"  pic-node $call-method  ;
+: disable-interrupt  ( level -- )  " disable-irq" pic-node $call-method  ;
+
+: stray-interrupt  ( level -- )
+   ." Unexpected interrupt on IRQ" dup .d cr
+   disable-interrupt				\ To prevent recurrence
+;
+
+#irqs /n* buffer: interrupt-handlers
+: interrupt-handler!  ( xt int-level -- )  interrupt-handlers swap na+ !  ;
+: interrupt-handler@  ( int-level -- xt )  interrupt-handlers swap na+ @  ;
+
+: (dispatch-interrupt)  ( -- )
+   " this-interrupt" pic-node $call-method  if    ( level )
+      dup interrupt-handlers over na+ @ execute   ( level )
+      " clear-interrupt" pic-node $call-method    ( )
+   then                                           ( )
+;
+: (init-dispatcher)  ( -- )
+   pic-node  0=  if
+      " /interrupt-controller" open-dev to pic-node
+      #irqs  0  do  ['] stray-interrupt  i interrupt-handler!  loop
+      ['] (dispatch-interrupt) to dispatch-interrupt
+   then
+;
+' (init-dispatcher) to init-dispatcher
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/kernboot.fth
===================================================================
--- cpu/mips/kernboot.fth	                        (rev 0)
+++ cpu/mips/kernboot.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,203 @@
+purpose: Startup code for running under the C wrapper
+\ See license at end of file
+
+\ Version for running Forth as a Unix user process
+
+\ Boot code (cold start).  The cold start code is executed
+\ when Forth is initially started.  Its job is to initialize the Forth
+\ virtual machine registers.
+
+hex
+
+only forth also labels also meta also definitions
+
+0 constant main-task
+: init-user  (s -- )  ;
+
+headerless
+
+\ Stuff initialized at cold start time
+
+nuser memtop		\ The top of the memory used by Forth
+0 value #args		\ The process's argument count
+0 value args		\ The process's argument list
+
+: process-command-line  ( -- )  ;
+
+\ This code gets control shortly after Forth is first called from the
+\ C wrapper program (the executable file "forth").  At the beginning
+\ of the Forth dictionary, there is a branch instruction that branches
+\ to the following code. 
+
+label cold-code  ( -- )
+here-t  cld 8 + branch!
+\ called with   forth_startup(header-adr, functions, mem_end, &gargc, &gargv)
+\ 				 a0	    a1	      a2	a3	a4
+
+   sp 10   t8  lw	\ &gargv
+
+\ Get a fresh set of local registers.
+   sp 8 /n* negate  sp  addiu   \ Make room on stack
+   s0   sp  0  sw	\ Save registers
+   s1   sp  4  sw
+   s2   sp  8  sw
+   s3   sp  c  sw
+   s4   sp 10  sw
+   s5   sp 14  sw
+   s6   sp 18  sw
+   s7   sp 1c  sw
+
+\ Allocate high memory for the stacks and stuff, starting at memtop and
+\ allocating downwards.  a2 contains the "mem_end" argument passed in
+\ from C; we use it as an the allocation pointer.
+
+   $a2              t6  move	\ We'll need this value later for memtop
+
+\ Find the user area size from the header. a0 contains the "header-adr"
+\ argument passed in from C.
+
+   $a0 8            t4  lw	\ Data size = user area size in t4
+   bubble
+
+\ Allocate the RAM copy of the User Area
+
+   $a2  t4         $a2  subu	\ Allocate the bytes
+   $a2             up   move	\ Set user pointer
+
+   $a0 20         base  addiu	\ Base address of image
+
+   'body main-task  t5  li	\ Allow the exception handler to find the
+   t5 base          t5  addu	\ user area by storing the address of the
+   up             t5 0  sw	\ main user area in the "constant" main-task
+
+\ Copy the initial User Area image to the RAM copy
+   $a0 4            t3  lw	\ Text size = offset to start of data
+   up               t7  move	\ Destination pointer (load delay)
+   t3 base          t3  addu	\ Relocate Init-up pointer in t3
+   t3  t4           t4  addu	\ t4 = source limit
+
+   begin
+      t3 0   t5  lw		\ Read a longword
+      t3 4   t3  addiu		\ (load delay) Increment src
+      t5   t7 0  sw		\ Write a longword
+   t3 t4  = until		\ Loop until limit is reached
+      t7 4   t7  addiu		\ Increment destination (delay slot)
+
+\ Now the user area has been copied to the proper place, so we can set
+\ some important user variables whose inital values are determined at
+\ run time.
+
+\ Little-endian flag
+   $a0 0  t0  lb		\ Get first byte of header
+   h# 10  t1  li		\ Most significant byte of "branch" instruction
+   t0 t1  <>  if
+   $0   t0  move		\ Delay - set flag to 0 (big-endian)
+      $0 -1  t0  addiu		\ Set flag to -1 (little-endian)
+   then
+   t0  'user in-little-endian?  sw
+
+\ Top of memory and dictionary limit
+   t6    'user memtop  sw	\ t6 contains the mem_end value saved above
+
+\ Set the up0 user variable
+   up        'user up0  sw
+
+\ Establish the return stack and set the rp0 user variable
+   $a2       rp          move	\ Set rp register
+   rp        'user rp0   sw	\ Save in rp0 user variable
+   $a2 rs-size-t negate  $a2    addiu   \ allocate space for the return stack
+
+\ Establish the Parameter Stack
+   $a2 20 negate   $a2   addiu	\ Guard band between Parameter Stack and TIB
+   $a2      'user sp0   sw	\ Store initial stack pointer in sp0 user var.
+   $a2 /n   sp          addi	\ /n accounts for the top of stack register
+
+   $a2 ps-size-t negate  $a2   addiu	\ Allocate space for the stack
+
+   t6 $a2    $at  sltu
+   $at $0  <> if  nop
+      t6  $a2  move
+   then
+   $a2    'user limit   sw	\ Set the dictionary limit value
+
+
+\ Save the address of the system call table in the user variable syscall-vec
+\ $a1 constains the value of the "functions" argument passed in from C.
+   $a1  up syscall-user#  sw
+
+\ Set the dictionary pointer; $a0 is the header address
+   $a0 4     t0         lw	\ Text size field from header
+   bubble
+   t0 base   t0         add	\ Base + text_size = text_end_adr
+
+\ $a0 8     t1         lw		\ Data size field from header
+\ t0 t1     t0         add	\ preserve ua init area so restart is faster
+
+   t0        'user dp   sw	\ Set dp
+
+   $a3    'user #args   sw	\ Set argc and argv
+   t8     'user args    sw
+
+   (next)    np         li
+   np base   np         addu	\ Set NEXT pointer
+
+\ Enter Forth
+   'body cold      ip   li	\ Relative address of "cold" Forth word
+   ip base         ip   addu	\ Relocate it to an absolute address
+
+c;				\ c; automatically assembles "next"
+				\ so this enters Forth executing "cold"
+
+0 [if]
+: warm  ( -- )  ." Warm start"  cr  quit  ;
+
+label warm-code  ( -- )
+
+   here-t 8 +   $0   bgezal
+   nop
+   here-t       base li		\ Offset to here
+   ra  base     base subu	\ base: Absolute address of origin
+
+   'body main-task  up  li	\ Find the user area
+   up base          up  add
+   up 0             up  lw
+
+   'user rp0        rp  lw	\ Set the return stack pointer
+   'user sp0        sp  lw	\ Set the data stack pointer
+   sp /n            sp  addi	\ /n accounts for the top of stack register
+
+   (next)    np         li
+   np base   np         addu	\ Set NEXT pointer
+
+\ Enter Forth
+   'body warm       ip  li	\ Relative address of "cold" Forth word
+   ip base          ip  addu	\ Relocate it to an absolute address
+
+c;				\ c; automatically assembles "next"
+				\ so this enters Forth executing "warm"
+[then]
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/kerncode.fth
===================================================================
--- cpu/mips/kerncode.fth	                        (rev 0)
+++ cpu/mips/kerncode.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,1539 @@
+purpose: MIPS kernel code words
+\ See license at end of file
+
+\ TODO - put I in a register
+
+meta
+hex
+
+\ Allocate and clear the initial user area image
+\ mlabel init-user-area
+
+setup-user-area
+
+only forth also labels also meta assembler also definitions
+
+\ Forth Virtual Machine registers
+
+\ Global Registers
+
+\ Note that the Forth Stack Pointer (r1) is NOT the same register that
+\ C uses for the stack pointer (r14).  The hardware does all sorts of
+\ funny things with the C stack pointer when you do save and restore
+\ instructions, and when the register windows overflow.
+
+: np s1 ;  : base s2 ;  : up s3 ;  : tos s4 ;  : ip s5 ;  : rp s6 ;  : sp $sp ;
+
+: w t0 ;
+
+\ Macros:
+
+\ Parameter Field Address
+: apf  ( -- )  w 4  ;
+
+: bubble  ( -- )  nop  ;
+: bubble ;
+
+: get   ( ptr dst -- )  0      swap  lw   ;
+: put   ( src ptr -- )  0            sw   ;
+: move  ( src dst -- )  0      swap  addu  ;
+: ainc  ( ptr -- )      dup 4  swap  addiu  ;
+: adec  ( ptr -- )      dup -4 swap  addiu  ;
+: push  ( src ptr -- )  dup          adec  put  ;
+: pop   ( ptr dst -- )  over   -rot  get   ainc  ;
+
+: cmp   ( src dst -- )  $at     subu  ;
+: cmpi  ( src imm -- )  negate  $at  addiu  ;
+\ NOTE  brif  ( target-adr condition -- )  $at make-branch  ;
+
+\ Take a high-level branch
+: take-branch  (s -- )
+   ip 0   t0  lw
+   bubble
+   ip t0  ip  addu
+;
+: skip-branch  ( -- )
+   ip /branch  ip    addiu
+;
+
+only forth also labels also meta also assembler definitions
+
+:-h /n*  /n *   ;-h
+
+\ We create the shared code for the "next" routine so that:
+\ a) It will be in RAM for speed (ROM is often slow)
+\ b) We can use the user pointer as its base address, for quick jumping
+
+[ifdef] put-next-in-user-area
+also forth
+compilation-base  here-t			\ Save meta dictionary pointer
+0 dp-t !  userarea-t is compilation-base	\ Point it to user area
+previous
+[then]
+
+mlabel (next)   \ Shared code for next; will be copied into user area
+   ip 0         w   lw		\ Read the token at the ip location
+   bubble
+   w  base      w   addu	\ Relocate
+   w 0          t1  lw		\ Read the contents of the code field 
+   bubble
+   t1 base      t1  addu	\ Relocate
+   t1               jr		\ Jump to the code
+   ip /token-t  ip addiu	\ Advance ip to point to the next token
+end-code
+
+[ifdef] put-next-in-user-area
+also forth
+dp-t !  is compilation-base  previous		\ Restore meta dict. pointer
+
+d# 32 equ #user-init	\ Leaves space for the shared "next"
+[else]
+0 equ #user-init
+[then]
+
+
+hex meta assembler definitions
+\ assembler macro to assemble next
+:-h next
+   [ assembler ]-h
+   \ If it is inappropriate to move the last instruction into the
+   \ delay slot of next's "jr" instruction, insert a  nop  to be
+   \ moved instead.
+
+   here delay-barrier @  [ meta ]-h =  if  [ assembler ]-h
+      nop
+   [ meta ]-h  then  [ assembler ]-h
+
+   \ Move the last instruction into the delay slot of the "jr  up"
+   here -1 la+ asm@          ( last-instruction )  \ Save instruction
+   /l negate asm-allot       ( last-instruction )  \ Erase it
+[ifdef] put-next-in-user-area
+   up  jr                    ( last-instruction )  \ Replace with "jr"
+[else]
+   np  jr
+\   (next) h# 20 +  j
+[then]
+   here  /l asm-allot  asm!  ( )                   \ Put instruction after jr
+;-h
+
+:-h c;    next end-code ;-h
+
+code-field: docolon  assembler
+   ip   rp   push	\ Push the ip register on the return stack
+   apf  ip   addiu	\ Set ip to apf of the colon definition
+c;
+
+code-field: dovariable
+   tos	sp   push	\ Save the top-of-stack register on memory stack
+   apf  tos  addiu	\ Put pfa in top-of-stack register
+c;
+
+code-field: dolabel
+   tos	sp   push	\ Save the top-of-stack register on memory stack
+   apf  tos  addiu	\ Put pfa in top-of-stack register
+c;
+
+code-field: douser
+   tos    sp   push	\ Save the top-of-stack register on memory stack
+   apf    t0   lw	\ Get the user number
+   bubble
+   t0 up  tos  addu	\ Add the base address of the user area into tos
+c;
+
+code-field: dovalue
+   tos	  sp   push	\ Save the top-of-stack register on memory stack
+   apf    t0   lw	\ Get the user area offset from the parameter field
+   bubble
+   up t0  t0   addu
+   t0 0   tos  lw	\ Get the contents of the user area location into tos
+c;
+
+code-field: dodefer
+   apf      t1  lw	\ Get the user area offset from the parameter field
+   bubble
+   up t1    t1  addu
+   t1 0     w   lw	\ Get the acf stored in that user location
+   bubble
+   w base   w   addu	\ Relocate
+   w 0      t1  lw      \ Get the contents of the code field
+   bubble
+   t1 base  t1  addu	\ Relocate
+   t1           jr	\ Execute that word
+   nop
+end-code
+
+code-field: doconstant
+   tos	sp   push	\ Save the top-of-stack register on memory stack
+   apf  tos  lw		\ Get the constant's value into tos register
+c;
+
+code-field: do2constant
+   sp -8    sp    addiu		\ Make room on the stack
+   tos      sp 4  sw		\ Save the old tos on the memory stack
+   apf      t1    lw		\ Get the bottom constant's value
+   apf 4 +  tos   lw		\ Get the top constant's value
+   t1       sp    put		\ Put bottom constant on the memory stack
+c;
+
+code-field: dodoes
+   \ The child word's code field contains a pointer to the doesclause
+   \ The doesclause's code field contains       dodoes jal   sp adec
+
+   tos          sp  push	\ Prepare to push the pfa
+   apf 4 +      tos addiu	\ push the pfa (delay slot)
+   
+   apf          w   lw		\ Set w to acf of the definition
+
+   w  base      w   addu	\ Relocate
+   w  0         t1  lw		\ Read the code field contents
+   bubble
+   t1 base      t1  addu	\ Relocate
+   t1               jr		\ Jump to that location
+   nop
+end-code
+
+:-h code-cf       ( -- )  here /token + aligned  token,-t  align-t  ;-h
+:-h label-cf      ( -- )  dolabel    token,-t  align-t  ;-h
+:-h colon-cf      ( -- )  docolon    token,-t  ;-h
+:-h constant-cf   ( -- )  doconstant token,-t  ;-h
+:-h variable-cf   ( -- )  dovariable token,-t  ;-h
+:-h user-cf       ( -- )  douser     token,-t  ;-h
+:-h value-cf      ( -- )  dovalue    token,-t  ;-h
+:-h defer-cf      ( -- )  dodefer    token,-t  ;-h
+:-h startdoes     ( -- )  colon-cf             ;-h
+:-h start;code    ( -- )  code-cf              ;-h
+:-h create-cf     ( -- )  dodoes   token,-t  compile-t noop  ;-h
+:-h vocabulary-cf ( -- )  dodoes   token,-t  compile-t <vocabulary>  ;-h
+
+meta definitions
+
+\ dovariable constant dovariable
+\ dodoes     constant dodoes
+
+code (lit)  (s -- n )
+   tos  sp   push
+   ip   tos  get
+   ip        ainc
+c;
+
+\ Execute a Forth word given a code field address
+code execute   (s acf -- )
+   tos      w    move	\ Pop stack into t1
+   sp       tos  get	\ "
+   w  0     t1   lw	\ Read the contents of the code field
+   bubble
+   t1 base  t1   addu	\ Relocate
+   t1            jr	\ Jump to the code
+   sp            ainc	\ Finish popping stack in delay slot
+end-code
+
+\ High level branch. The branch offset is compiled in-line.
+code branch (s -- )
+mlabel bran1
+   take-branch
+c;
+
+\ High level conditional branch.
+code ?branch (s f -- )  \ Takes the branch if the flag is false
+   tos        t0   move
+   sp         tos  get
+   bran1  t0  $0   beq
+   sp              ainc	\ Delay slot
+   skip-branch
+c;
+
+\ Run time word for loop
+code (loop)  (s -- )
+   rp     t0  get
+   bubble
+   t0 1   t1  addiu	\ Increment index
+   bran1  t1  bgez	\ Result still positive; continue looping
+   t1     rp  put	\ Write back the loop index in the delay slot
+
+   bran1  t0  bltz	\ Result negative, so check operand
+   nop			\ If operand is negative too, continue looping
+
+   \ The internal "i" value went from positive to negative, so the loop ends
+   rp 3 /n*  rp  addiu  \ remove loop params from stack
+   skip-branch
+c;
+
+\ Run time word for +loop
+code (+loop) (s increment -- )
+   rp      t0   get
+   bubble
+   t0 tos  t1   addu	\ increment loop index
+   t1      rp   put	\ Write back the loop index
+   t0 tos  t3   xor	\ Compare operand signs
+   sp      tos  get	\ Pop stack
+   bran1   t3   bltz	\ Operand signs different
+   sp           ainc	\ Delay slot
+
+   t1 t0   t2   xor	\ Compare result with an operand
+   bran1   t2   bgez	\ Result has same sign as operand; continue looping
+   nop
+
+   \ The result sign differs from the operand signs; so the loop ends
+   rp 3 /n*  rp  addiu	\ remove loop params from stack
+   skip-branch
+c;
+
+\ Run time word for do
+code (do)  (s l i -- )
+   tos  t1       move   \ i in t1 
+   sp   t0       get    \ l in t0
+   sp /n    tos  lw
+   sp 2 /n*  sp  addiu
+mlabel pd0 ( -- r: loop-end-offset l+0x8000 i-l-0x8000 )
+   ip      rp  push     \ remember the do offset address
+   skip-branch		\ Skip the do offset
+   h# 8000.0000 t2  sethi
+   t0 t2   t0  addu
+   t0      rp  push
+   t1 t0   t1  subu
+   t1      rp  push
+c;
+meta
+
+\ Run time word for ?do
+code (?do)  (s l i -- )
+   sp        t0   get    \ l in t0
+   tos       t1   move   \ i in t1
+   sp /n     tos  lw
+   pd0   t1  t0   bne
+   sp 2 /n*  sp   addiu	 \ Delay slot
+   take-branch
+c;
+
+\ Loop index for current do loop
+code i  (s -- n )
+   tos     sp   push
+   rp      tos  get
+   rp /n   t0   lw
+   bubble
+   tos t0  tos  addu
+c;
+
+\ Limit value for the enclosing do loop
+code ilimit  ( -- n )
+   tos     sp   push
+   rp /n   tos  lw
+   bubble
+   h# 8000.0000 t0  sethi
+   tos t0  tos  subu
+c;
+
+\ Loop index for next enclosing do loop
+code j   (s -- n )
+   tos       sp   push
+   rp 3 /n*  tos  lw
+   rp 4 /n*  t0   lw
+   bubble
+   tos t0    tos  addu
+c;
+\ Limit value for the next enclosing do loop
+code jlimit  ( -- n )
+   tos       sp   push
+   rp 4 /n*  tos  lw
+   bubble
+   h# 8000.0000 t0  sethi
+   tos t0    tos  subu
+c;
+
+code (leave)  (s -- )
+mlabel pleave
+   rp 2 /n*   ip  lw	    \ Get the address of the ending offset
+   rp 3 /n*   rp  addiu	    \ get rid of the loop indices
+   take-branch
+c;
+
+code (?leave)  (s f -- )
+   tos         t0    move
+   sp          tos  get
+   pleave  t0  $0   bne
+   sp               ainc	\ Delay slot
+c;
+
+code unloop  ( -- )  rp 3 /n*   rp  addiu  c;  \ Discard the loop indices
+
+code (of)  ( selector test -- [ selector ] )
+   sp  t0   pop		\ Test in tos, Selector in t0
+   t0  tos  =  if
+   t0  tos  move	\ Delay slot - Copy selector to tos
+      sp  tos  pop	\ Overwrite tos if selector matches
+      skip-branch
+      next
+   then
+   take-branch
+c;
+
+\ (endof) is the same as branch, and (endcase) is the same as drop,
+\ but redefining them this way makes the decompiler much easier.
+code (endof)    (s -- )   take-branch   c;
+code (endcase)  (s n -- )   sp  tos  pop   c;
+
+meta-base
+assembler
+mlabel dofalse
+   $0  tos  move
+   next
+meta
+
+hex
+\ Convert a character to a digit according to the current base
+code digit  (s char base -- digit true | char false )
+   tos     t0   move		\ base in t0
+   sp      tos  get		\ char in tos
+   bubble
+   tos -30 tos  addiu		\ convert to number \  30 is ascii 0
+   dofalse tos  bltz		\ Anything less than ascii 0 isn't a digit
+   tos     a    cmpi		\ Delay slot - test for >= 10
+   $at 0>=  if			\ Try for a letter representing a digit
+      tos      ascii A ascii 0 -  cmpi
+      dofalse  $at  0< brif	        \ bad if > '9' and < 'A'
+      tos      ascii a ascii 0 -  cmpi  \ >= 'a' (delay slot)
+      $at 0>=  if
+         tos  ascii A ascii 0 -  d# 10 -  negate  tos  addiu  \ (delay slot)
+         tos  ascii a ascii A -           negate  tos  addiu
+      then
+   then
+   tos      t0   cmp		\ Compare digit to base
+   dofalse  $at  0>= brif	\ Error if digit is bigger than base
+   nop
+   tos  sp  put			\ Replace the char on the stack with the digit
+   $0 -1 tos addiu		\ True to indicate success
+c;
+
+\ Copy cnt characters starting at from-addr to to-addr.  Copying is done
+\ strictly from low to high addresses, so be careful of overlap between the
+\ two buffers.
+
+code cmove  ( src dst cnt -- )  \ Copy from bottom to top
+   sp 4    t0   lw	\ Src into t0
+   sp 0    t1   lw	\ Dst into t1
+
+   t0 tos  t2   addu	\ t2 = src limit
+
+   t0 t2  <> if
+   nop
+      
+      begin
+         t0 0  t3     lbu	\ Load byte
+         t0 1  t0     addiu	\ (load delay) Increment src
+         t3    t1 0   sb	\ Store byte
+      t0 t2  = until
+         t1 1  t1     addiu	\ (delay) Increment dst
+
+   then   
+
+   sp 8      tos  lw		\ Delay slot - Reload tos
+   sp 3 /n*  sp   addiu		\   "
+c;
+
+code cmove>  ( src dst cnt -- )  \ Copy from top to bottom
+   sp 4     t0  lw	\ Src into t0
+   sp 0     t1  lw	\ Dst into t1
+
+   t0  tos  t2  addu	\ Top of src area
+   t1  tos  t1  addu	\ Top of dst area
+
+   t0 t2  <> if		\ Don't do anything if the count is 0.
+   nop
+
+      begin
+         t2 -1  t3     lbu	\ Load byte
+         t2 -1  t2     addiu	\ (load delay) Decrement src
+         t3     t1 -1  sb	\ Store byte
+      t0 t2  = until
+	 t1 -1  t1     addiu	\ (delay) Decrement dst
+
+   then
+
+   sp 8      tos  lw	\ Delete 3 stack items
+   sp 3 /n*  sp   addiu	\   "
+c;
+
+code and  (s n1 n2 -- n3 )  sp  t0  pop   tos t0  tos  and   c;
+code or   (s n1 n2 -- n3 )  sp  t0  pop   tos t0  tos  or    c;
+code xor  (s n1 n2 -- n3 )  sp  t0  pop   tos t0  tos  xor   c;
+code invert  (s n1 -- n2 )     $0 tos  tos  subu   tos -1  tos  addiu  c;
+
+code lshift  (s n1 cnt -- n2 )  sp  t0  pop   t0 tos  tos  sllv  c;
+code rshift  (s n1 cnt -- n2 )  sp  t0  pop   t0 tos  tos  srlv  c;
+code <<      (s n1 cnt -- n2 )  sp  t0  pop   t0 tos  tos  sllv  c;
+code >>      (s n1 cnt -- n2 )  sp  t0  pop   t0 tos  tos  srlv  c;
+code >>a     (s n1 cnt -- n2 )  sp  t0  pop   t0 tos  tos  srav  c;
+
+code +    (s n1 n2 -- n3 )   sp  t0  pop   tos t0  tos  addu   c;
+code -    (s n1 n2 -- n3 )   sp  t0  pop   t0 tos  tos  subu   c;
+code negate  (s n1 -- n2 )  $0 tos  tos  subu   c;
+
+: abs   (s n1 -- n2 )  dup 0<  if  negate  then   ;
+
+: min   (s n1 n2 -- n3 )  2dup  >  if  swap  then  drop  ;
+: max   (s n1 n2 -- n3 )  2dup  <  if  swap  then  drop  ;
+: umin  (s u1 u2 -- u3 )  2dup u>  if  swap  then  drop  ;
+: umax  (s u1 u2 -- u3 )  2dup u<  if  swap  then  drop  ;
+
+code up@  (s -- addr )  tos sp push   up tos move   c;
+code sp@  (s -- addr )  tos sp push   sp tos move   c;
+code rp@  (s -- addr )  tos sp push   rp tos move   c;
+code up!  (s addr -- )  tos up move   sp tos pop    c;
+code sp!  (s addr -- )  tos sp move   sp tos pop    c;
+code rp!  (s addr -- )  tos rp move   sp tos pop    c;
+code >r   (s n -- )     tos rp push   sp tos pop    c;
+code r>   (s -- n )     tos sp push   rp tos pop    c;
+code r@   (s -- n )     tos sp push   rp tos get    c;
+code 2>r  (s n1 n2 -- )
+   rp -8      rp     addiu
+   sp  0      t0     lw
+   bubble
+   t0         rp 4   sw
+   tos        rp 0   sw
+   sp  4      tos    lw
+   sp  8      sp     addiu
+c;
+code 2r>  (s -- n1 n2 )
+   sp -8      sp     addiu
+   tos        sp 4   sw
+   rp  4      tos    lw
+   bubble
+   tos        sp 0   sw
+   rp  0      tos    lw
+   rp  8      rp     addiu
+c;
+code 2r@  (s -- n1 n2 )
+   sp -8      sp     addiu
+   tos        sp 4   sw
+   rp  4      tos    lw
+   bubble
+   tos        sp 0   sw
+   rp  0      tos    lw
+c;
+
+code >ip  (s n -- )     tos rp push   sp tos pop    c;
+code ip>  (s -- n )     tos sp push   rp tos pop    c;
+code ip@  (s -- n )     tos sp push   rp tos get    c;
+: ip>token  ( ip -- token-adr )  /token -  ;
+
+code exit   (s -- )     rp ip pop  c;
+code unnest (s -- )     rp ip pop  c;
+
+code tuck  (s n1 n2 -- n2 n1 n2 )
+   sp   t0    get
+   bubble
+   t0   sp    push
+   tos  sp 4  sw
+c;
+code nip   (s n1 n2 -- n2 )
+   sp  ainc
+c;
+code flip  (s w1 -- w2 )  \ byte swap
+   tos 18  t0   sll
+   t0  10  t0   srl
+   tos  8  tos  srl
+   tos t0  tos  or
+c;
+
+assembler definitions
+:-h leaveflag  (s condition -- )
+\ macro to assemble code to leave a flag on the stack
+   if
+   $0  tos  move   \ Delay slot
+      $0 -1 tos addiu
+   then
+;-h
+
+meta definitions
+code 0<   (s n -- f )  tos $0 tos slt  $0 tos tos subu   c;
+code 0>   (s n -- f )  $0 tos tos slt  $0 tos tos subu   c;
+code 0<=  (s n -- f )  $0 tos tos slt  tos -1 tos addiu  c;
+code 0>=  (s n -- f )  tos $0 tos slt  tos -1 tos addiu  c;
+
+code 0=   (s n -- f )  tos $0  =   leaveflag  c;
+code 0<>  (s n -- f )  tos $0  <>  leaveflag  c;
+
+assembler definitions
+:-h compare
+   sp  t0  pop
+   t0 tos  cmp
+;-h
+meta definitions
+
+code =    (s n1 n2 -- f )  sp t0 pop  tos t0  = leaveflag  c;
+code <>   (s n1 n2 -- f )  sp t0 pop  tos t0 <> leaveflag  c;
+
+code <    (s n1 n2 -- f )  sp t0 pop  t0 tos tos slt    $0 tos tos subu   c;
+code >=   (s n1 n2 -- f )  sp t0 pop  t0 tos tos slt    tos -1 tos addiu  c;
+code >    (s n1 n2 -- f )  sp t0 pop  tos t0 tos slt    $0 tos tos subu   c;
+code <=   (s n1 n2 -- f )  sp t0 pop  tos t0 tos slt    tos -1 tos addiu  c;
+code u<   (s n1 n2 -- f )  sp t0 pop  t0 tos tos sltu   $0 tos tos subu   c;
+code u>=  (s n1 n2 -- f )  sp t0 pop  t0 tos tos sltu   tos -1 tos addiu  c;
+code u>   (s n1 n2 -- f )  sp t0 pop  tos t0 tos sltu   $0 tos tos subu   c;
+code u<=  (s n1 n2 -- f )  sp t0 pop  tos t0 tos sltu   tos -1 tos addiu  c;
+
+code drop  (s n -- )      sp   tos  pop    c;
+code dup   (s n -- n n )  tos  sp   push   c;
+code over  (s n1 n2 -- n1 n2 n1 )  tos sp push    sp 4  tos  lw  c;
+code swap  (s n1 n2 -- n2 n1 )
+   sp   t0   get
+   tos  sp   put
+   t0   tos  move
+c;
+code rot  (s n1 n2 n3 -- n2 n3 n1 )
+   sp    t0    get
+   sp 4  t1    lw
+   t0    sp 4  sw
+   tos   sp    put
+   t1    tos   move
+c;
+code -rot  (s n1 n2 n3 -- n3 n1 n2 )
+   sp    t0    get
+   sp 4  t1    lw
+   tos   sp 4  sw
+   t1    sp    put
+   t0    tos   move
+c;
+code 2drop  (s d -- )      sp ainc   sp tos pop  c;
+code 2dup   (s d -- d d )
+   sp     t0    get
+   sp -8  sp    addiu
+   tos    sp 4  sw
+   t0     sp 0  sw
+c;
+code 2over  (s d1 d2 -- d1 d2 d1 )
+   sp -8  sp    addiu
+   tos    sp 4  sw
+   sp 10  tos   lw
+   bubble
+   tos    sp 0  sw
+   sp 0c  tos   lw
+c;
+code 2swap  (s d1 d2 -- d2 d1 )
+   sp 8  t2    lw
+   sp 4  t1    lw
+   sp 0  t0    lw
+   bubble
+   t0    sp 8  sw
+   tos   sp 4  sw
+   t2    sp 0  sw
+   t1    tos   move
+c;
+code 3drop  (s n1 n2 n3 -- )
+   sp 8  tos   lw
+   sp c  sp    addiu
+c;
+code 3dup   (s n1 n2 n3 -- n1 n2 n3 n1 n2 n3 )
+   sp 4   t1    lw
+   sp 0   t0    lw
+   sp -c  sp    addiu
+   tos    sp 8  sw
+   t1     sp 4  sw
+   t0     sp 0  sw
+c;
+code 4drop  (s n1 n2 n3 n4 -- )
+   sp 0c  tos   lw
+   sp 10  sp    addiu
+c;
+code 5drop  (s n1 n2 n3 n4 n5 -- )
+   sp 10  tos   lw
+   sp 14  sp    addiu
+c;
+
+code pick   (s nm ... n1 n0 k -- nm ... n2 n0 nk )
+   tos 2   tos  sll   \ Multiply by /n
+   sp tos  tos  addu
+   tos 0   tos  lw    \ Index into stack
+c;  
+ 
+code 1+  (s n1 -- n2 )  tos 1  tos  addiu   c;
+code 2+  (s n1 -- n2 )  tos 2  tos  addiu   c;
+code 1-  (s n1 -- n2 )  tos -1 tos  addiu   c;
+code 2-  (s n1 -- n2 )  tos -2 tos  addiu   c;
+
+code 2/  (s n1 -- n2 )  tos 1  tos  sra   c;
+code u2/ (s n1 -- n2 )  tos 1  tos  srl   c;
+code 2*  (s n1 -- n2 )  tos 1  tos  sll   c;
+code 4*  (s n1 -- n2 )  tos 2  tos  sll   c;
+code 8*  (s n1 -- n2 )  tos 3  tos  sll   c;
+
+code on  (s addr -- )
+   $0 -1  t0  addiu
+   t0  tos  put
+   sp  tos  pop
+c;
+code off  (s addr -- )
+   $0  tos  put
+   sp  tos  pop
+c;
+
+code +!  (s n addr -- )
+   sp       t0   get
+   tos      t1   get
+   bubble
+   t1 t0    t1   addu
+   t1       tos  put
+   sp  4    tos  lw
+   sp  8    sp   addiu
+c;
+
+code @    (s adr -- n )  tos 0  tos  lw   c;   \ longword aligned
+code l@   (s adr -- l )  tos 0  tos  lw   c;   \ longword aligned
+code w@   (s adr -- w )  tos 0  tos  lhu  c; \ 16-bit word aligned
+code <w@  (s adr -- w )  tos 0  tos  lh   c; \ with sign extension
+code c@   (s adr -- c )  tos 0  tos  lbu  c;
+
+code !  (s n adr -- )
+   sp 0  t0     lw
+   bubble
+   t0    tos 0  sw
+   sp 4  tos    lw
+   sp 8  sp     addiu
+c;
+code l!   (s n adr -- )
+   sp 0  t0     lw
+   bubble
+   t0    tos 0  sw
+   sp 4  tos    lw
+   sp 8  sp     addiu
+c;
+code w!  (s w adr -- )
+   sp 0  t0     lw
+   bubble
+   t0    tos 0  sh
+   sp 4  tos    lw
+   sp 8  sp     addiu
+c;
+code c!  (s c adr -- )
+   sp 0  t0     lw
+   bubble
+   t0    tos 0  sb
+   sp 4  tos    lw
+   sp 8  sp     addiu
+c;
+
+code x@   (s adr -- x )   \ doubleword aligned
+   tos 0  t0    ld
+   sp -4  sp    addiu
+   t0     sp 0  sw
+   t0 0   tos   dsra32
+c;
+code x!   (s x adr -- )
+   sp 0   t0    lw
+   bubble
+   t0 0   t0    dsll32
+   sp 4   t1    lw
+   t1 0   t1    dsll32
+   t1 0   t1    dsrl32
+   t0 t1  t0    or
+   
+   t0    tos 0  sd
+   sp 8  tos    lw
+   sp c  sp     addiu
+c;
+
+: instruction!  (s n adr -- )  tuck !  /l sync-cache  ;
+
+: instruction,  (s opcode -- )  here /l allot instruction!  ;
+
+code 2@  (s adr -- d )
+   tos      $at move
+   $at 4    t0  lw
+   t0       sp  push
+   $at 0    tos lw
+c;
+code 2!  (s d adr -- )
+   sp  0   t0     lw
+   bubble
+   t0      tos 0  sw
+   sp  4   t0     lw
+   bubble
+   t0      tos 4  sw
+   sp  8   tos    lw
+   sp  0c  sp     addiu
+c;
+
+code fill (s start-adr count char -- )
+			\ char in tos
+   sp 0  t0  lw		\ count in t0
+   sp 4  t1  lw		\ dst in t1
+   bubble
+    
+   t0 t1  t0  addu	\ limit in t0
+   t0 t1  <>  if
+   t1 1   t1  addiu	\ (delay) increment dst
+
+      begin
+         tos   t1 -1  sb
+      t0 t1 = until
+         t1 1  t1     addiu	\ (delay) increment dst
+   then
+
+   sp 8   tos  lw
+   sp 0c  sp   addiu
+c;
+
+code lfill (s start-adr count long -- )
+			\ long in tos
+   sp 0  t0  lw		\ count in t0
+   sp 4  t1  lw		\ dst in t1
+   bubble
+    
+   t0 3   t0  addi	\ round up
+   t0 2   t0  srl
+   t0 2   t0  sll	\ Clear low bits
+
+   t0 t1  t0  addu	\ limit in t0
+   t0 t1  <>  if
+   t1 4   t1  addiu	\ (delay) increment dst
+
+      begin
+         tos   t1 -4  sw
+      t0 t1 = until
+         t1 4  t1     addiu	\ (delay) increment dst
+   then
+
+   sp 8   tos  lw
+   sp 0c  sp   addiu
+c;
+
+code noop (s -- )  c;
+
+code n->l (s n.unsigned -- l )  c;
+
+code lwsplit (s l -- w.low w.high )  \ split a long into two words
+   tos     t0   move
+   t0 10   t0   sll
+   t0 10   t0   srl
+   t0      sp   push
+   tos 10  tos  srl
+c;
+code wljoin (s w.low w.high -- l )
+   sp       t0   pop
+   t0  10   t0   sll   \ Throw away any high order bits in w.low
+   t0  10   t0   srl
+   tos 10   tos  sll
+   tos t0   tos  or
+c;
+
+1 constant /c
+2 constant /w
+4 constant /l
+/l constant /n
+
+code ca+  (s addr index -- addr+index*/c )
+   sp       t0   pop
+   tos t0   tos  addu
+c;
+code wa+  (s addr index -- addr+index*/w )
+   sp       t0   pop
+   tos 1    tos  sll
+   tos t0   tos  addu
+c;
+code la+  (s addr index -- addr+index*/l )
+   sp       t0   pop
+   tos 2    tos  sll
+   tos t0   tos  addu
+c;
+code na+  (s addr index -- addr+index*/n )
+   sp       t0   pop
+   tos 2    tos  sll
+   tos t0   tos  addu
+c;
+code ta+  (s addr index -- addr+index*/t )
+   sp       t0   pop
+   tos 2    tos  sll
+   tos t0   tos  addu
+c;
+
+code ca1+  (s addr -- addr+/w )      tos 1  tos  addiu   c;
+code char+ (s addr -- addr+/w )      tos 1  tos  addiu   c;
+code wa1+  (s addr -- addr+/w )      tos 2  tos  addiu   c;
+code la1+  (s addr -- addr+/l )      tos 4  tos  addiu   c;
+code na1+  (s addr -- addr+/n )      tos 4  tos  addiu   c;
+code cell+ (s addr -- addr+/n )      tos 4  tos  addiu   c;
+code ta1+  (s addr -- addr+/token )  tos /token  tos  addiu   c;
+
+code /c*   (s n -- n*/c ) c;
+code chars (s n -- n*/c ) c;
+code /w*   (s n -- n*/w )  tos 1  tos  sll  c;
+code /l*   (s n -- n*/l )  tos 2  tos  sll  c;
+code /n*   (s n -- n*/n )  tos 2  tos  sll  c;
+code cells (s n -- n*/n )  tos 2  tos  sll  c;
+
+: upc  (s char -- upper-case-char )
+   dup  ascii a  ascii z  between  if  ( hex ) 20 -  then
+;
+: lcc  (s char -- upper-case-char )
+   dup  ascii A  ascii Z  between  if  ( hex ) 20 +  then
+;
+
+code c at +  (s adr -- adr' char )
+   tos 1   t0   addiu
+   t0      sp   push
+   tos 0   tos  lbu
+c;
+
+: comp  (s addr1 addr2 len -- -1 | 0 | 1 )
+   rot 0 swap  2swap    ( 0 addr1 addr2 len )
+   bounds  ?do                                            ( 0 addr1' )
+      c at +  i c@  <>  if                                   ( 0 addr1' )
+         nip  dup 1- c@  i c@  <  if  -1  else  1  then   ( addr1' flag )
+	 swap leave                                       ( flag addr1' )
+      then                                                ( 0 addr1' )
+   loop
+   drop
+;
+
+: caps-comp  (s addr1 addr2 len -- -1 | 0 | 1 )
+   rot 0 swap  2swap    ( 0 addr1 addr2 len )
+   bounds  ?do                                            ( 0 addr1' )
+      c at + lcc  i c@ lcc  <>  if                           ( 0 addr1' )
+         nip  dup 1- c@ lcc  i c@ lcc  <
+         if  -1  else  1  then                            ( addr1' flag )
+	 swap leave                                       ( flag addr1' )
+      then                                                ( 0 addr1' )
+   loop
+   drop
+;
+
+: pack  (s str-adr len to -- to )
+   dup >r
+   2dup c!                 ( str-adr len to )
+   1+ 2dup + 0 swap c!     ( str-adr len to+1 )
+   swap cmove
+   r>
+;
+
+\ code pack  (s str-adr len to -- to )
+\    sp  t0  pop		\ t0 is len
+\    sp  t1  pop		\ t1 is "from"; tos is "to"
+\ 
+\    t0 ff   t0  andi	\ Never store more than 257 bytes
+\ 
+\    t0  tos 0    stb	\ Place length byte
+\ 
+\    tos 1   tos  addiu	\ Offset "to" by 1 to skip past the length byte
+\ 
+\    tos t0  $at  addu
+\    $0      $at  stb	\ Put a null byte at the end
+\ 
+\    0 F:  bra  		\ jump to the until  branch
+\    t0 1    t0    subcc	\ Delay slot
+\ 
+\    begin
+\       t2   tos t0   stb
+\       t0 1     t0   subcc
+\    0 L:
+\    0< until annul
+\       t1 t0   t2   ldub	\ Delay slot
+\ 
+\    tos -1   tos  addiu		\ Fix "to" to point to the length byte
+\ c;   
+
+code (')  (s -- acf )
+   tos       sp   push
+   ip 0      tos  lw
+   ip /token ip   addiu
+   tos base  tos  addu
+c;
+
+\ Modifies caller's ip to skip over an in-line string
+code skipstr (s -- adr len)
+   sp -8  sp    addiu
+   tos    sp 4  sw
+   rp  0  t0    lw	\ Get string address in t0
+   bubble
+   t0  0  tos   lbu	\ Get length byte in tos
+   t0  1  t0    addiu	\ Address of data bytes
+   t0     sp 0  sw	\ Put adr on stack
+
+   \ Now we have to skip the string
+   t0 tos         t0   addu	\ Scr now points past the last data byte
+   t0 #talign     t0   addiu	\ Round up to token boundary + null byte
+   $0 #talign negate    $at  addiu
+   t0 $at         t0   and
+   t0             rp 0 sw	\ Put the modified ip back
+c;
+
+code (")  (s -- adr len)
+   sp -8  sp    addiu
+   tos    sp 4  sw
+   ip  0  tos   lbu	\ Get length byte in tos
+   ip  1  ip    addiu	\ Address of data bytes
+   ip     sp 0  sw	\ Put adr on stack
+
+   \ Now we have to skip the string
+   ip  tos          ip  addu	\ ip now points past the last data byte
+   ip  #talign      ip  addiu	\ Round up to a token boundary, plus null byte
+   $0  #talign negate   $at addiu
+   ip  $at          ip  and
+c;
+
+code count  (s adr -- adr+1 len )
+   tos 1   tos	addiu
+   tos -1  t0	lbu
+   tos     sp	push
+   t0      tos	move
+c;
+
+\ 0 constant origin
+\ here-t 4 -  set-relocation-bit-t  drop
+code origin  (s -- addr )
+   tos  sp   push
+   base tos  move
+c;
+
+: origin+  (s n -- adr )  origin +  ;
+: origin-  (s n -- adr )  origin -  ;
+
+headers
+
+\ Put a branch instruction to target-adr at where
+: put-branch  ( target-adr where -- )
+   tuck	4 -  -			( where byte-offset )
+   2/ 2/      ffff   and	( where longword-offset )
+   1000.0000         or		( where "$0 $0 beq" )
+   swap !
+;
+: acf-align  (s -- )
+   begin  here #acf-align 1- and  while  0 c,  repeat
+   here 'lastacf token!
+;
+
+headerless
+
+\ Place the "standard" code field
+
+: set-cf  (s action-adr -- )
+   acf-align  origin+  token,
+;
+
+headers
+: place-cf  (s action-adr -- )
+   acf-align  token,
+;
+: code-cf  (s -- )  acf-align  here ta1+  aligned token,  align  ;
+
+: >code  ( acf-of-code-word -- address-of-start-of-machine-code )  token@  ;
+: code?  ( acf -- f )  \ True if the acf is for a code word
+   dup token@  swap >body =
+;
+
+\ Assemble "next" routine at the end of a code definition.
+\ This is not needed for the kernel to run; it is used later
+\ after the resident assembler has been loaded
+
+: next  (s  --- )
+   \ (next) j                                        nop
+\   0800.0000  [ (next) ] literal h# 20 + 2 >> or ,   0000.0000 ,
+   \ np jr              nop
+    h# 0220.0008 instruction,      0000.0000 instruction,
+;
+
+: create-cf    (s -- )  [ dodoes ]     literal set-cf  ['] noop token,  ;
+: variable-cf  (s -- )  [ dovariable ] literal set-cf  ;
+
+: place-;code  (s -- )  code-cf  ;
+: place-does   (s -- )  [ docolon ]    literal set-cf  ;
+
+\ Ip is assumed to point to (;code .  flag is true if
+\ the code at ip is a does> clause as opposed to a ;code clause.
+: does-ip?  ( ip -- ip' flag )
+   dup token@  ['] (does>) =  ( ip flag )  swap ta1+ ta1+  swap
+;
+
+: put-cf  (s action-clause-adr where -- )  token!  ;   
+
+\ uses  sets the code field of the indicated word so that
+\ it will execute the code at action-clause-adr
+: uses  (s action-clause-adr xt -- )
+   tuck /token + put-cf
+   [ dodoes ] literal  origin+  swap put-cf
+;
+
+\ used  sets the code field of the most-recently-defined word so that
+\ it executes the word at action-clause-adr
+: used  (s action-clause-adr -- )  lastacf uses  ;
+
+: colon-cf?  ( possible-acf -- flag )
+   dup  token@  [ docolon ] literal origin+ =  if
+      /token - token@
+      dup  ['] branch   <>
+      over ['] ?branch  <> and
+      over ['] (of)     <> and
+      over ['] (leave)  <> and
+      over ['] (?leave) <> and
+      over ['] (do)     <> and
+      over ['] (?do)    <> and
+      swap ['] (lit)    <> and
+   else
+      drop false
+   then
+;
+: colon-cf      (s -- )  [ docolon ]     literal set-cf  ;
+: user-cf       (s -- )  [ douser ]      literal set-cf  ;
+: value-cf      (s -- )  [ dovalue ]     literal set-cf  ;
+: constant-cf   (s -- )  [ doconstant ]  literal set-cf  ;
+: defer-cf      (s -- )  [ dodefer ]     literal set-cf  ;
+: 2constant-cf  (s -- )  [ do2constant ] literal set-cf  ;
+
+4 constant /branch
+: branch,  ( offset -- )  ,  ;
+: branch!  ( offset where -- )  !  ;
+
+headerless
+: branch@  ( where -- offset )  @  ;
+\ >target depends on the way that branches are compiled
+: >target  ( ip-of-branch-instruction -- target )  ta1+ dup branch@ +  ;
+headerless
+
+/a constant /a
+
+headers
+
+code a@  ( adr -- adr' )
+   tos tos get
+   bubble
+   tos base  tos addu
+c;
+
+\ R : a!  ( adr1 adr2 -- )  set-relocation-bit  l!  ;
+code a!  ( adr1 adr2 -- )
+   sp         t0   pop
+   t0 base    t0   subu
+   t0         tos  put
+   sp         tos  pop
+c;
+: a,  ( adr -- )  here  /a allot  a!  ;
+
+/token constant /token
+code token@ (s adr -- cfa )
+   tos 0     tos  lw
+   bubble
+   tos base  tos  addu
+c;
+\ R : token! (s cfa adr -- )  set-relocation-bit l!  ;
+code token! (s cfa addr -- )
+  sp       t0   get
+  bubble
+  t0 base  t0   subu
+  t0       tos  put
+  sp  4    tos  lw
+  sp  8    sp   addiu
+c;
+
+
+: token, (s cfa -- )  here  /token allot  token!  ;
+
+: null  ( -- token )  origin  ;
+: !null-link   ( adr -- )  null swap link!  ;
+: !null-token  ( adr -- )  null swap token!  ;
+: non-null?  ( link -- false | link true )
+   dup origin =  if  drop false  else  true  then
+;
+\ code non-null?  ( link -- false | link true )
+\    tos  base    cmp
+\    <>  if
+\    false t0  move       \ Delay slot
+\ 
+\       tos  sp  push
+\       true t0 move
+\    then
+\    t0  tos  move
+\ c;
+: get-token?     ( adr -- false | acf  true )  token@ non-null?  ;
+: another-link?  ( adr -- false | link true )  link@  non-null?  ;
+
+\ The "word type" is a number which distinguishes one type of word
+\ from another.  This is highly implementation-dependent.
+
+\ For the MIPS implementation, the magic number returned by word-type
+\ is the absolute address of the action code.
+
+: long-cf?  (s acf -- flag )  token@ origin-  [ dodoes ] literal  =  ;
+
+: word-type  (s acf -- word-type )  dup long-cf?  if  ta1+  then  token@  ;
+
+: body>  (s apfa -- acf )
+   /token -   dup /token -  long-cf?  if  /token -  then
+;
+: >body  (s acf -- apf )  dup long-cf?  if  ta1+  then   ta1+  ;
+
+4 constant /user#
+
+\ Move to a machine alignment boundary.
+
+: aligned  (s adr -- adr' )  /n round-up  ;
+
+code acf-aligned  (s adr -- adr' )
+   tos  3   tos  addiu
+   $0 -4    $at  addiu
+   tos $at  tos  and
+c;
+
+\ Floored division is prescribed by the Forth 83 standard.
+\ The quotient is rounded toward negative infinity, and the
+\ remainder has the same sign as the divisor.
+
+: /mod  (s dividend divisor -- remainder quotient )
+  \ Check if either factor is negative
+    2dup               ( n1 n2 n1 n2)
+    or 0< if           ( n1 n2)
+    
+        \ Both factors not non-negative; do division by:
+        \ Take absolute value and do unsigned division
+        \ Convert to truncated signed divide by:
+        \  if dividend is negative then negate the remainder
+        \  if dividend and divisor have opposite signs then negate the quotient
+        \ Then convert to floored signed divide by:
+        \  if quotient is negative and remainder is non-zero
+        \    add divisor to remainder and decrement quotient
+
+        2dup swap abs swap abs  ( n1 n2 u1 u2)     \ Absolute values
+
+        u/mod              ( n1 n2 urem uqout)     \ Unsigned divide
+        >r >r              ( n1 n2) ( uquot urem)
+
+        over 0< if         ( n1 n2) ( uquot urem)  
+            r> negate >r                 \ Negative dividend; negate remainder
+        then               ( n1 n2) ( uquot trem)
+   
+        swap over          ( n2 n1 n2) ( uquot trem)
+        xor 0< if          ( n2) ( uquot trem)
+            r> r>
+            negate         ( n2 trem tquot)  \ Opposite signs; negate quotient
+           -rot            ( tquot n2 trem)
+            dup 0<> if 
+                +          ( tquot rem) \ Negative quotient & non-zero remainder
+                swap 1-    ( rem quot)  \ add divisor to rem. & decrement  quot.
+            else
+                nip swap   ( rem quot)
+            then
+        else
+            drop r> r>     ( rem quot)
+        then
+
+    else   \ Both factors non-negative
+
+        u/mod          ( rem quot)
+    then
+;
+
+code u/mod  (s u.dividend u.divisor -- u.remainder u.quotient )
+   sp    t0   get	\ dividend
+   bubble
+   t0    tos  divu	\ Calculate result
+   t0         mfhi      \ Get remainder
+   t0    sp   put
+   tos        mflo	\ Get quotient
+c;
+
+: /     (s n1 n2 -- quot )   /mod  nip ;
+
+: mod   (s n1 n2 -- rem )    /mod  drop  ;
+
+: um/mod (s ul.dividend un.divisor -- un.remainder un.quotient )  u/mod  ;
+
+: m/mod  (s l.dividend n.divisor -- n.remainder n.quotient )  /mod  ;
+
+\ 32*32->64 bit unsigned multiply
+\            y  rs2     y  rd
+
+code um*   ( u1 u2 -- ud[lo hi] )
+   sp     t0   get
+   bubble
+   t0     tos  multu
+   t0          mflo
+   t0     sp   put
+   tos         mfhi
+c;
+
+code m*  ( n1 n2 -- low high )
+   sp     t0   get
+   bubble
+   t0     tos  mult
+   t0          mflo
+   t0     sp   put
+   tos         mfhi
+c;
+
+code *  ( n1 n2 -- n3 )
+   sp     t0   pop
+   t0     tos  mult
+   tos         mflo
+c;
+
+: ul*  (s un1 un2 -- lproduct )  *  ;
+: u*   (s un1 un2 -- uproduct )  *  ;
+
+: d+  ( d.a d.b -- d.c )
+   >r rot tuck +     ( a.hi a.lo c.lo  r: b.hi )
+   tuck u> negate    ( a.hi c.lo carry  r: b.hi )
+   rot + r> +        ( d.c )
+;
+: d-  ( d.a d.b -- d.c )
+   >r swap >r     ( a.lo b.lo  r: b.hi a.hi )
+   2dup u< >r     ( a.lo b.lo  r: b.hi a.hi borrow )
+   -              ( c.lo  r: b.hi a.hi borrow )
+   r> r> + r> -   ( d.c )
+;
+: d@  ( adr -- low high )  dup 4 + @  swap @  ;
+
+\ MIPS version is dynamically relocated, so we don't need a bitmap
+: clear-relocation-bits  ( adr len -- )  2drop  ;
+
+only forth also labels also meta also assembler definitions
+
+:-h 'user#  \ name  ( -- user# )
+    [ meta ]-h  '  ( acf-of-user-variable )  >body-t
+    @-t
+;-h
+:-h 'user  \ name  ( -- user-addressing-mode )
+    [ assembler ]-h   up 'user#
+;-h
+:-h 'body  \ name  ( -- variable-apf )
+    [ meta ]-h  '  ( acf-of-user-variable )  >body-t
+;-h
+:-h 'acf  \ name  ( -- variable-apf )
+    [ meta ]-h  '  ( acf-of-user-variable )  >body-t
+;-h
+ 
+only forth also labels also meta also definitions
+
+: move  ( src dst cnt -- )
+   >r 2dup u<  if  r> cmove>  else  r> cmove  then
+;
+
+init-user-area constant init-user-area
+
+code (llit)  (s -- l )
+   tos sp push   ip tos get   ip ainc
+c;
+
+code (dlit)  (s -- d )
+   sp -8   sp    addiu
+   tos     sp 4  sw
+   ip 4    t0    lw
+   ip      tos   get
+   t0      sp 0  sw
+   ip 8    ip    addiu
+c;
+
+\ Select a vocabulary thread by hashing the lookup name.
+\ Hashing function:  Use the lower bits of the first character in the
+\ name to select one of #threads threads in the array pointed-to by
+\ the user number in the parameter field of voc-acf.
+code hash  (s str-addr voc-acf -- thread )
+   \ The next 2 lines are equivalent to ">threads", which in this
+   \ implementation happens to be the same as ">body >user"
+   tos 8   tos   lw	\ Get the user number
+   bubble
+   up tos  tos   addu	\ Find the address of the threads
+
+   sp      t0   pop
+   t0 1    t0   lbu
+   bubble
+   t0 #threads-t 1-   t0   andi
+   t0 2    t0   sll	\ Convert index to longword offset
+   tos t0  tos  addu
+c;
+
+\ Search a vocabulary thread (link) for a name matching string.
+\ If found, return its code field address and -1 if immediate, 1 if not
+\ immediate.  If not found, return the string and 0.
+
+\ Name field:
+\     name: forth-style packed string, no tag bits
+\     flag: 40 bit is immediate bit
+\ Padding is optionally inserted between the name and the flags
+\ so that the byte after the flag byte is on an even boundary.
+
+[ifdef] notdef
+code (find)  (s string link origin -- acf -1  |  acf 1  |  string 0 )
+   tos t5   move	\ Origin in t5
+   sp  tos  pop		\ link in tos
+\ Registers:
+\ tos    alf of word being tested
+\ t0    string
+\ t1    name being tested
+\ t2    # of characters left to test
+\ string is kept on the top of the external stack
+
+   begin  tos t5  <> while	\ Test for end of list
+      tos /token  t1  addiu	\ Get name address of word to test
+      sp          t0  get    	\ Get string address
+      bubble
+      t0 0    t2  lbu	\ get the name field length
+      begin
+         t0 0  t3  lbu	\ Compare 2 characters
+         t1 0  t4  lbu
+         bubble
+      t3 t4  = while		\ Keep looking as long as characters match
+         t0 1  t0  addiu	\ Increment byte pointers
+         t2 -1 t2  addiu	\ Decrement byte counter
+         t2 0< if		\ If we've tested all chars, the names match.
+         t1 1  t1  addiu	\ Delay slot
+            t1 0   tos  lbu	\ Get flags byte into tos register
+
+            t1 4   t1  addiu	\ Now find the code field by
+            $0 -4  $at addiu
+            t1 $at t1  and	\ aligning to the next 4 byte boundary
+
+	    tos 20  $at andi	\ Test the alias flag
+	    $at $0  <> if
+               nop
+	       t1 0     t1 lw	\ Get acf
+	       bubble
+               t1 base  t1 addu \ Relocate
+            then
+
+	    t1     sp   put	\ Replace string on stack with acf
+	    tos 40  $at andi  	\ Test the immediate flag
+	    $at $0  <> if
+	       $0 -1   tos  addiu	\ Not immediate  \ Delay slot
+	    ( else )
+	       $0  1   tos  addiu	\ Immediate
+	    then
+	    next
+         then
+      repeat
+         nop
+
+      \ The names did not match, so check the next name in the list
+      tos 0     tos  lw		\ Fetch next link
+      bubble
+      tos base  tos  addu	\ Relocate
+   repeat
+      nop			\ Delay slot
+
+   \ If we get here, we've checked all the names with no luck
+   $0  tos  move
+c;
+[then]
+
+code ($find-next)  (s adr len link -- adr len alf true  |  adr len false )
+\ Registers:
+\ tos    alf of word being tested
+\ t0     string
+\ t1     anf of word being tested
+\ t2     saves ctr register value
+\ t3    character from string
+\ t4    character from name
+\ t5    string length
+\ string is kept on the top of the external stack
+
+   sp 4    t0    lw 		\ Get string address
+   sp 0    t5    lw		\ get the name field length
+				\ link in tos
+
+   ahead nop			\ Branch to end of loop the first time
+\ tos 0     tos  lw		\ Fetch next link  ( next acf )
+\ bubble
+
+\ tos $0 <> if		\ Until end of linked list
+\ tos base  tos  addu		\ Relocate (delay slot)
+
+   begin
+      tos -4   tos  addiu	\ >link
+      tos -1   t1   addiu	\ t1 points before count byte at string *end*
+      t1  t5   t1   subu	\ t1 points to beginning of string
+      t0       t6   move
+      
+      t5       $at  move	\ Set starting loop index
+      begin
+         t1 0  t4   lbu		\ Get character from name field
+         t1 1  t1   addiu
+         t6 0  t3   lbu		\ Get character from search string
+         t6 1  t6   addiu
+      t3 t4 =  while		\ Compare 2 characters
+      $at -1 $at addiu		\ Decrement character count (delay slot)
+         $at $0 =  if
+         nop			\ If we've tested all name chars, we
+            t1 0      t4  lbu	\ may have a match; check the count byte
+            bubble
+            t4 h# 1f  t4  andi  \ Remove tag bits
+            t4 t5 = if		\ Compare count bytes
+            nop
+               tos    sp  push	\ Push alf above pstr
+               $0 -1  tos addiu	\ True on top of stack means "found"
+               next
+            then
+         then
+      repeat
+      nop
+
+   but then			\ Target of "ahead" branch
+
+      \ The names did not match, so check the next name in the list
+      tos 0     tos  lw		\ Fetch next link  ( next acf )
+      bubble
+
+   tos $0 = until		\ Until end of linked list
+   tos base  tos  addu		\ Relocate (delay slot)
+\ then
+
+   \ If we get here, we've checked all the names with no luck
+   $0     tos  move		\ Return false
+c;
+
+: ?negate  (s n1 n2 -- n3 )  if  negate  then  ;
+
+code wflip (s l1 -- l2 )  \ word swap
+   tos      t0  move
+   tos 10   tos  srl
+   t0 10   t0  sll
+   tos t0  tos  or
+c;
+
+: cset     (s byte-mask adr -- )  tuck c@ or swap c!  ;
+: creset   (s byte-mask adr -- )  swap invert over c@ and swap c!  ;
+: ctoggle  (s byte-mask adr -- )  tuck c@ xor swap c!  ;
+: toggle   (s adr byte-mask -- )  swap ctoggle  ;
+
+code s->l  (s n.signed -- l )   c;
+code l->n  (s l -- n )  c;
+code n->a  (s n -- a )  c;
+code l->w  (s l -- w )  tos 10  tos  sll   tos 10  tos  srl  c;
+code n->w  (s n -- w )  tos 10  tos  sll   tos 10  tos  srl  c;
+code w->n  (s w -- n )  tos 10  tos  sll   tos 10  tos  sra  c;
+
+code l>r   (s l -- )     tos rp push   sp tos pop    c;
+code lr>   (s -- l )     tos sp push   rp tos pop    c;
+code lr@   (s -- l )     tos sp push   rp tos get    c;
+
+code /t* (s n -- n*/t )  tos 2  tos  sll  c;
+
+#align-t     constant #align
+#acf-align-t constant #acf-align
+#talign-t    constant #talign
+
+: align  (s -- )  #align (align)  ;
+: taligned  (s adr -- adr' )  #talign round-up  ;
+: talign  (s -- )  #talign (align)  ;
+
+code np@  ( -- adr )  tos sp push   np tos move   c;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/kernel.bth
===================================================================
--- cpu/mips/kernel.bth	                        (rev 0)
+++ cpu/mips/kernel.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,127 @@
+purpose: Load file for MIPS Forth kernel
+\ See license at end of file
+
+command: &builder &this
+build-now
+
+create little-endian-t
+
+ ' $report-name is include-hook
+\  ' noop is include-hook
+\ ' noop is include-exit-hook
+
+\ Don't accept ',' as numeric punctuation because doing so makes
+\ the forward referencing mechanism think that "c," is a number!
+ascii . ascii , npatch numdelim?
+
+warning off	\ Turn OFF the warning messages
+
+[ifdef] maketags
+fload ${BP}/forth/lib/tags.fth
+' ("header) is "header
+defer "header-t-hook ' (tags-header) is "header-t-hook
+"" loadkern.fth last-filename "copy
+[then]
+
+alias constant-h constant
+
+fload ${BP}/forth/kernel/conft32.fth
+fload ${BP}/forth/kernel/meta1.fth
+
+only forth also meta also definitions
+\needs mips-assembler fload ${BP}/cpu/mips/assem.fth
+
+only forth also meta definitions
+: assembler  ( -- )  mips-assembler  ;
+
+only forth also meta also assembler definitions
+\needs L: fload ${BP}/forth/lib/loclabel.fth
+init-labels
+
+only forth also definitions
+\needs bitset  fload ${BP}/forth/lib/bitops.fth
+
+fload ${BP}/forth/kernel/swapmap.fth
+\ : : : lastacf .name cr ;
+fload ${BP}/cpu/mips/target.fth
+fload ${BP}/forth/kernel/forward.fth
+fload ${BP}/cpu/mips/fixvoc.fth
+fload ${BP}/forth/kernel/metacompile.fth
+
+warning on
+fload ${BP}/cpu/mips/metainit.fth
+
+\ fload ${BP}/cpu/mips/metarel.fth
+
+" kernel.tag" r/w create-file drop  meta-tag-file !
+
+always-headers
+
+\ Comment out the following line(s) when debugging
+-1  threshold  !	\ Turn OFF ALL debugging messages
+warning-t  off  	\ Turn OFF target warning messages
+
+\ Uncomment the following line(s) for more debug output
+\ show? on  1 granularity !  1 threshold !
+\ warning-t on
+
+fload ${BP}/cpu/mips/kerncode.fth
+
+fload ${BP}/forth/kernel/uservars.fth
+fload ${BP}/forth/kernel/double.fth
+fload ${BP}/forth/kernel/scan.fth
+
+fload ${BP}/forth/lib/bitops.fth
+fload ${BP}/cpu/ppc/kernrel.fth
+\ fload ${BP}/forth/kernel/swapmap.fth
+
+fload ${BP}/forth/lib/struct.fth
+
+fload ${BP}/cpu/mips/unalign.fth
+
+fload ${BP}/forth/kernel/kernel.fth
+
+fload ${BP}/forth/kernel/sysio.fth
+fload ${BP}/forth/lib/dumballo.fth
+
+fload ${BP}/cpu/mips/filecode.fth
+
+fload ${BP}/cpu/mips/sys.fth
+
+fload ${BP}/cpu/mips/kernboot.fth
+
+\ fload ${BP}/cpu/mips/boot.fth
+fload ${BP}/forth/kernel/init.fth
+fload ${BP}/cpu/mips/finish.fth
+
+meta-tag-file @ fclose  meta-tag-file off
+
+fload ${BP}/cpu/mips/savemeta.fth
+
+.( Saving as kernel.dic ...)  " kernel.dic" $save-meta
+cr
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/ksegaddr.fth
===================================================================
--- cpu/mips/ksegaddr.fth	                        (rev 0)
+++ cpu/mips/ksegaddr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,35 @@
+purpose: KSEG addresses for MIPS
+\ See license at end of file
+
+headerless
+
+h# 0000.0000 constant kuseg  \ 2GB user space
+h# 8000.0000 constant kseg0  \ "unmapped" cached
+h# a000.0000 constant kseg1  \ "unmapped" uncached
+h# c000.0000 constant kseg2  \ mapped space
+
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/lmove.fth
===================================================================
--- cpu/mips/lmove.fth	                        (rev 0)
+++ cpu/mips/lmove.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,69 @@
+purpose: Longword memory copy
+\ See license at end of file
+
+code lmove  ( from-addr to-addr cnt -- )
+   sp 4    t0   lw	\ Src into t0
+   sp 0    t1   lw	\ Dst into t1
+
+   t0 tos  t2   addu	\ t2 = src limit
+
+   t0 t2  <> if
+   nop
+      
+      begin
+         t0 0  t3     lw	\ Load word
+         t0 4  t0     addiu	\ (load delay) Increment src
+         t3    t1 0   sw	\ Store word
+      t0 t2  = until
+         t1 4  t1     addiu	\ (delay) Increment dst
+
+   then   
+
+   sp 8      tos  lw		\ Delay slot - Reload tos
+   sp 3 /n*  sp   addiu		\   "
+c;
+code wmove  ( from-adr to-adr #bytes -- )
+   sp 4    t0   lw	\ Src into t0
+   sp 0    t1   lw	\ Dst into t1
+
+   t0 tos  t2   addu	\ t2 = src limit
+
+   t0 t2  <> if
+   nop
+      
+      begin
+         t0 0  t3     lhu	\ Load halfword
+         t0 2  t0     addiu	\ (load delay) Increment src
+         t3    t1 0   sh	\ Store halfword
+      t0 t2  = until
+         t1 2  t1     addiu	\ (delay) Increment dst
+
+   then   
+
+   sp 8      tos  lw		\ Delay slot - Reload tos
+   sp 3 /n*  sp   addiu		\   "
+c;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/loadmach.fth
===================================================================
--- cpu/mips/loadmach.fth	                        (rev 0)
+++ cpu/mips/loadmach.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,93 @@
+purpose: Load file for MIPS machine-specific words
+\ See license at end of file
+
+start-module
+assembler? [if]
+fload ${BP}/cpu/mips/assem.fth
+fload ${BP}/cpu/mips/code.fth
+fload ${BP}/forth/lib/loclabel.fth
+[else]
+transient  fload ${BP}/cpu/mips/assem.fth  resident
+fload ${BP}/cpu/mips/code.fth
+transient  fload ${BP}/forth/lib/loclabel.fth     resident
+[then]
+
+fload ${BP}/cpu/mips/disassem.fth	\ Exports (dis , pc , dis1 , +dis
+
+fload ${BP}/forth/lib/instdis.fth
+
+fload ${BP}/cpu/mips/decompm.fth
+
+: be-l!  ( l adr -- )  >r lbsplit r@ c! r@ 1+ c!  r@ 2+ c! r> 3 + c!  ;
+: be-l,  ( l -- )  here set-swap-bit  here  4 allot  be-l!  ;
+: be-l@  ( adr -- n )  >r r@ 3 + c@ r@ 2+ c@ r@ 1+ c@ r> c@ bljoin  ;
+: be-w@  ( adr -- w )  dup 1+ c@  swap c@  bwjoin  ;
+
+fload ${BP}/cpu/mips/objsup.fth
+fload ${BP}/forth/lib/objects.fth
+also hidden
+alias reasonable-ip? reasonable-ip?
+previous
+end-module
+
+fload ${BP}/cpu/mips/cpustate.fth
+fload ${BP}/cpu/mips/register.fth
+
+fload ${BP}/forth/lib/savedstk.fth
+fload ${BP}/forth/lib/rstrace.fth
+fload ${BP}/cpu/mips/ftrace.fth
+fload ${BP}/cpu/mips/ctrace.fth
+
+fload ${BP}/cpu/mips/debugm.fth	\ Forth debugger support
+fload ${BP}/forth/lib/debug.fth		\ Forth debugger
+
+[ifdef] notyet
+also bug
+alias   set-package    set-package
+alias unset-package  unset-package
+previous
+[then]
+
+fload ${BP}/cpu/mips/cpubpsup.fth	\ Breakpoint support
+fload ${BP}/forth/lib/breakpt.fth
+
+[ifdef] notyet
+fload ${BP}/cpu/mips/dfill.fth	\ Memory fill words
+fload ${BP}/cpu/mips/memtest.fth
+[then]
+
+\ fload ${BP}/cpu/mips/fentry.fth	\ I don't think we need this...
+fload ${BP}/cpu/mips/call.fth
+
+transient fload ${BP}/forth/lib/binhdr.fth	resident
+transient fload ${BP}/cpu/mips/savefort.fth	resident
+
+alias $save-forth $save-forth
+
+fload ${BP}/cpu/mips/lmove.fth
+
+fload ${BP}/cpu/mips/r4000cp0.fth
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/machdep.fth
===================================================================
--- cpu/mips/machdep.fth	                        (rev 0)
+++ cpu/mips/machdep.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,102 @@
+purpose: Breakpoint support words for MIPS
+\ See license at end of file
+
+: op@  ( adr -- op )  >vmem l@  ;
+: op!  ( op adr -- )  >vmem instruction!  ;
+: at-breakpoint?  ( adr -- flag )  op@  breakpoint-opcode =  ;
+: put-breakpoint  ( adr -- )  breakpoint-opcode swap op!  ;
+
+: j?   ( adr -- adr flag )  h# 0800.0000 h# fc00.0000 imatch?  ;
+: jr?  ( adr -- adr flag )  h# 0000.0008 h# fc00.003f imatch?  ;
+: branch?  ( adr -- flag )
+   h# 1000.0000  h# b000.0000  imatch?  >r  \ beq(l),bne(l),blez(l),bgtz(l)
+   h# 0400.0000  h# fc1c.0000  imatch?      \ bltz,bgez,bltzl,bgezl
+   r>  or
+;
+
+: delayed?  ( adr -- flag )
+   j? swap  jr? swap  jal? swap  jalr? swap  bal? swap  branch? swap
+   drop  or or or or or
+;
+: .instruction  ( -- )
+   $pc 
+   [ also disassembler ] pc ! dis1 [ previous ]
+   $pc delayed?  if
+      $pc la1+ [ also disassembler ] pc ! dis1 [ previous ]
+   then
+;
+
+\ Find the places to set the next breakpoint for single stepping.
+\ Usually the right place is at nPC .  However, for annulled branch
+\ instructions, we have to cope with the possibility that the delay
+\ instruction, which is where nPC points, won't be executed.  Annulled
+\ unconditional branches never execute the delay instruction, so we have
+\ to put the breakpoint at the branch target.  Annulled conditional
+\ branches will either execute the delay instruction or the one right
+\ after it.
+
+: >after-delay  ( adr -- adr' )  2 la+  ;
+variable step?
+: next-instruction  ( stepping? -- next-adr branch-target|0 )
+   step? !
+   $pc
+   j?    if  >j-target   0 exit  then
+   jr?   if  >jr-target  0 exit  then
+   jal?  if  step? @  if  >j-target   else  >after-delay  then  0  exit  then
+   jalr? if  step? @  if  >jr-target  else  >after-delay  then  0  exit  then
+   bal?  if
+      step? @  if  dup >after-delay swap >br-target  else  >after-delay 0  then
+      exit
+   then
+   branch?  if  dup >after-delay  swap >br-target  exit  then
+   la1+  0
+;
+: bumppc  ( -- )  $pc la1+ to $pc   ;
+alias rpc $pc
+
+code goto  ( adr -- )
+   tos       t0   move
+   sp        tos  get
+   t0             jr
+   sp /n     sp   add
+end-code
+
+: return-adr  ( -- adr )  $ra  ;
+: leaf-return-adr  ( -- adr )  $ra  ;
+: backward-branch?  ( adr -- flag )  \ True if adr points to a backward branch
+   l@                                        ( instruction )
+   dup branch?                               ( instruction branch? )
+   swap  h# 0000.8000 and  0<>               ( branch? backward? )
+   and
+;
+: loop-exit-adr  ( -- adr )
+   \ Start at PC-4 in case we're sitting on a delay instruction at the loop end
+   $pc 4 -  begin  dup backward-branch? 0=  while  4 +  repeat  8 +
+;
+
+headers
+: set-pc  ( adr -- )  to $pc  ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/makeinflater.notes
===================================================================
--- cpu/mips/makeinflater.notes	                        (rev 0)
+++ cpu/mips/makeinflater.notes	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,14 @@
+The inflater is made with a GCC cross compiler.
+
+To build inflate.img, the following worked at one point (the GCC options might have changed since then):
+
+cd ${BP}/cpu/mips/Linux
+mipsel-gcc -ffreestanding -nostdlib -mips=rm52xx -mips1 -mno-abicalls -membedded-data -g0 -EL -mno-long-calls -c ${BP}/tools/inflate.c
+mipsel-ld -oformat elf32-littlemips -EL -G0 -N -Ttext=80100000 inflate.o -o inflate.elf
+mipsel-objcopy -O binary inflate.elf inflate.img
+
+The above lines make an image which should be loaded at absolute address 8010.0000.
+Should that be different, the change would have to be reflected in:
+
+   ${BP}/cpu/mips/basefw.bth
+   ${BP}/cpu/mips/bonito/reset.bth (and any other reset.bth that loads the inflater)

Added: cpu/mips/metainit.fth
===================================================================
--- cpu/mips/metainit.fth	                        (rev 0)
+++ cpu/mips/metainit.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,78 @@
+purpose: Initialize the metacompiler for MIPS
+\ See license at end of file
+
+\ Metacompiler initialization
+
+\ Debugging aids
+
+0 #words ! d# 1000 threshold ! 10 granularity !
+
+warning off
+forth definitions
+: unixname bl word
+  drop
+\ ". cr
+;
+
+metaon
+meta definitions
+\ show? on
+
+\ We want the kernel to be romable, so we put variables in the user area
+:-h variable  ( -- )  nuser  ;-h
+alias \m  \
+
+initmeta
+
+th 11000 alloc-mem  target-image  \ Allocate space for the target image
+
+\ org sets the lowest address that is used by Forth kernel.
+hex
+
+0.0000 org  0.0000
+   voc-link-t token-t!
+
+200 equ ps-size
+
+assembler
+
+\ This is at the first location in the Forth image.
+
+\ init-forth is the initialization entry point.  It should be called
+\ exactly once, with arguments (dictionary_start, dictionary_size).
+\ init-forth sets up some global variables which allow Forth to locate
+\ its RAM areas, including the data stack, return stack, user area,
+\ cpu-state save area, and dictionary.
+
+hex
+mlabel cld
+   9000 bra	\ The address will be fixed later.
+   nop		\ Delay slot
+   nop
+   nop
+
+meta
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/metarel.fth
===================================================================
--- cpu/mips/metarel.fth	                        (rev 0)
+++ cpu/mips/metarel.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,51 @@
+purpose: Maintain a byte swap table for metacompiling for MIPS
+\ See license at end of file
+
+
+only forth also meta also definitions
+
+hex debug $really-header-t
+h# 10000 constant max-kernel-t
+
+\ The swap map has one bit for every 32-bit word, since we assume
+\ that relocated longwords must start on a 32-bit boundary
+d# 32 constant bits/swapbit-t
+
+\ Number of bytes in bitmap
+: >swap-map-size-t  ( end-adr -- )
+   origin-t -  bits/swapbit-t /mod  swap  if  1+  then
+;
+
+max-kernel-t >swap-map-size-t constant /swap-map-t  \ Number of bytes in bitmap
+/swap-map-t buffer: swap-map-t
+
+: set-swap-bit-t  ( addr -- )  origin-t -  2 >>  swap-map-t bitset  ;
+: note-string-t  ( adr len -- adr len )
+   2dup bounds  ?do  i set-swap-bit-t  /n +loop
+;
+
+: init-swap-t  ( -- )  swap-map-t /swap-map-t erase  ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/objsup.fth
===================================================================
--- cpu/mips/objsup.fth	                        (rev 0)
+++ cpu/mips/objsup.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,147 @@
+purpose: MIPS support routines for the objects package.
+\ See license at end of file
+
+\ implementation.
+
+\ Assembles the common code executed by actions.  That code
+\ extracts the next token (which is the acf of the object) from the
+\ code stream, and leaves the corresponding apf in scr
+
+headerless
+
+: start-code ( -- )  code-cf !csp  ;
+
+\ Assembles the code which begins a ;code clause
+\ For MIPS, the acf of the child word is left in w
+: start-;code  ( -- )  start-code  ;
+
+\ Code for executing an object action.  Extracts the next token
+\ (which is the apf of the object) from the code stream and pushes
+\ it on the stack.  Then performs the action of "docolon".
+
+\ The Forth token stream contains a pointer to the code:
+\ doaction call    sp adec
+: doaction  ( -- )  acf-align colon-cf  ;
+
+\ Returns the address of the code executed by the word whose code field
+\ address is acf
+: >code-adr  ( acf -- code-adr )  token@  ;
+
+code >action-adr  ( object-acf action# -- )
+  ( ... -- object-acf action# #actions true | object-apf action-adr false )
+                          \ action# in tos
+      sp       t0   get   \ object-acf in scr
+      bubble
+      \ Make sure it's a does> word
+      t0 0     t1   lw    \ code-field token
+      t1  ' forth @ cmpi
+      $at $0 <>  if  nop
+         sp -4    sp    addiu \ Make room on stack
+         sp -4    sp    addiu \ The error case needs more room on the stack
+         tos      sp 4  sw    \ Place action# on stack
+         $0       sp 0  sw    \ Place #actions on stack
+         next
+      then
+
+      t0 4     t1   lw    \ code offset in t1
+      bubble
+      t1 base  t1   addu  \ code address in t1 
+      t1 -4    t2   lw	  \ #actions in t2 
+      bubble
+      t2       tos  cmp   \ Test action 
+      $at 0<= if		      \ "true" branch is error
+         sp -4    sp    addiu \ Make room on stack (delay slot)
+         sp -4    sp    addiu \ The error case needs more room on the stack
+         tos      sp 4  sw    \ Place action# on stack
+         t2       sp 0  sw    \ Place #actions on stack
+      else
+         true     tos   move  \ Return true for error  (delay)
+
+         t0 /token 2*  t0  addiu \ Compute action-apf from action-acf
+         t0       sp 4  sw    \ Put action-apf on stack
+
+         tos 2    tos   sll   \ Convert #actions to token offset
+         t1 tos   t1    subu  \ Skip back several tokens
+         t1 -4    t1    lw    \ Get action-adr token, -4 skips action# field
+         t1 base  t1    addu  \ Relocate
+         t1       sp 0  sw    \ Put action-adr on stack
+         false    tos   move  \ Return false for no error
+      then
+c;
+
+headers
+: action-name  \ name  ( action# -- )
+   create  		\ Store action number in data field
+      l,
+   ;code               ( -- object-pfa )
+      tos 0       t0   lw	\ Action# in t0 
+
+
+      ip  0       t1   lw   	\ Object acf in t1 
+      ip  /token  ip   addiu	\ Advance to next token
+      t1  base    t1   addu	\ Relocate object acf
+
+      t1  /token 2*  tos  addiu	\ Compute and push object-apf
+
+      t1  /token  t1   lw   	\ relative version of ..
+      t1  base    t1   addu	\ default action code address
+
+      t0  2       t0   sll      \ Convert action# to token offset
+      t1  t0      t1   subu     \ Skip back action# tokens
+      t1  -1 /n*  w    lw       \ Get action-adr token
+
+      w   base    w    addu     \ Tail of "next"
+      w   0       t1   lw
+      bubble
+      t1  base    t1   addu
+      t1               jr
+      nop
+end-code
+
+: >action#  ( apf -- action# )  l@  ;
+
+\ Some examples of object actions defined in code.
+\ 3 actions
+\ action-code
+\    apf w lw   bubble  w  base w  addu
+\    w 0 t1 lw  bubble  t1 base t1 addu
+\    t1 jr      nop
+\ end-code
+\ action:  token!  ;  \ is
+\ action:          ;  \ addr
+\ : defer  \ name  ( -- )
+\    create ['] crash token,
+\    use-actions
+\ ;
+\ 3 actions
+\ action-code  tos sp push  apf tos lw     c;     \ Default; fetch
+\ action-code  tos apf sw   sp tos pop     c;     \ to
+\ action-code  tos sp push  apf tos addiu  c;     \ addr
+\ : value  \ name  ( initial-value -- )
+\    create ,
+\    use-actions
+\ ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/pause.fth
===================================================================
--- cpu/mips/pause.fth	                        (rev 0)
+++ cpu/mips/pause.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,58 @@
+purpose: MIPS code words for multitasking
+\ See license at end of file
+
+   tos  sp  push
+   ip   'user saved-ip  sw
+   rp   'user saved-rp  sw
+   sp   'user saved-sp  sw
+
+   'user link    up   lw	\ get up for new task
+   bubble
+   'user entry   t0   lw	\ get pc for new task
+   bubble
+   t0                 jr
+   nop
+end-code
+
+label to-next-task  (s -- address-of-"next-task"-code )
+   'user link    up   lw	\ get up for new task
+   bubble
+   'user entry   t0   lw	\ get pc for new task
+   bubble
+   t0                 jr
+   nop
+end-code
+
+\ Called with up set to the user area address of the task to run
+label task-resume (s -- )	\ start a task
+   tos  sp  push
+   'user saved-ip  ip  lw
+   'user saved-rp  rp  lw
+   'user saved-sp  sp  lw
+   bubble
+   sp  tos  pop
+c;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/physaddr.fth
===================================================================
--- cpu/mips/physaddr.fth	                        (rev 0)
+++ cpu/mips/physaddr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,34 @@
+purpose: Physical addresses for generic MIPS system
+\ See license at end of file
+
+headerless
+
+h# 0000.0000 constant ram-pa
+h# 1fc0.0000 constant rom-pa
+
+h# 400 constant /resetjmp
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/probemem.fth
===================================================================
--- cpu/mips/probemem.fth	                        (rev 0)
+++ cpu/mips/probemem.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,73 @@
+purpose: Memory probing
+\ See license at end of file
+
+: (memory?)  ( adr -- flag )  /ram-bank u<  ;
+' (memory?) to memory?
+
+" /memory" find-device
+
+headerless
+
+h# ffff.ffff value low
+h#         0 value high
+
+: log&release  ( adr len -- )
+   over    low  umin to low   ( adr len )
+   2dup +  high umax to high  ( adr len )
+   release
+;
+
+: scan-banks  ( base mask -- )
+   d# 32 0  do                          ( base mask )
+      dup 1 and  if                     ( base mask )
+         over /ram-bank  log&release    ( base mask )
+      then                              ( base mask )
+      swap /ram-bank +  swap 1 rshift   ( base' mask' )
+   loop                                 ( base mask )
+   2drop
+;
+0 value membanks
+headers
+: claim  ( [ phys ] size align -- kseg0-adr )  claim kseg0 +  ;
+
+: probe  ( -- )
+   ram-pa      bank-mask @  scan-banks
+
+   0 0 encode-bytes                                   ( adr 0 )
+   physavail  ['] make-phys-memlist  find-node        ( adr len  prev 0 )
+   2drop  " reg" property
+
+   \ Claim the megabyte used for the trap vectors, Forth, and the section table
+[ifdef] ram-image
+   0                  rom-base /rom + 0 claim  drop
+[else]
+   0                  /resetjmp       0 claim  drop
+[then]
+   high h# 10.0000 -  h# 10.0000      0 claim  drop
+;
+
+device-end
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/r4000cp0.fth
===================================================================
--- cpu/mips/r4000cp0.fth	                        (rev 0)
+++ cpu/mips/r4000cp0.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,73 @@
+purpose: Coprocessor 0 registers for MIPS R4000 series
+\ See license at end of file
+
+code index!  ( #ticks -- )  0 tos mtc0  sp tos pop  c;
+code index@  ( -- #ticks )  tos sp push  0 tos mfc0  c;
+code random@  ( -- #ticks )  tos sp push  1 tos mfc0  c;
+code entrylo0!  ( #ticks -- )  2 tos mtc0  sp tos pop  c;
+code entrylo0@  ( -- #ticks )  tos sp push  2 tos mfc0  c;
+code entrylo1!  ( #ticks -- )  3 tos mtc0  sp tos pop  c;
+code entrylo1@  ( -- #ticks )  tos sp push  3 tos mfc0  c;
+code context!  ( #ticks -- )  4 tos mtc0  sp tos pop  c;
+code context@  ( -- #ticks )  tos sp push  4 tos mfc0  c;
+code pagemask!  ( #ticks -- )  5 tos mtc0  sp tos pop  c;
+code pagemask@  ( -- #ticks )  tos sp push  5 tos mfc0  c;
+code wired!  ( #ticks -- )  6 tos mtc0  sp tos pop  c;
+code wired@  ( -- #ticks )  tos sp push  6 tos mfc0  c;
+code badvaddr@  ( -- #ticks )  tos sp push  8 tos mfc0  c;
+code count!  ( #ticks -- )  9 tos mtc0  sp tos pop  c;
+code count@  ( -- #ticks )  tos sp push  9 tos mfc0  c;
+code entryhi!  ( n -- )  d# 10 tos mtc0  sp tos pop  c;
+code entryhi@  ( -- n )  tos sp push  d# 10 tos mfc0  c;
+code compare!  ( n -- )  d# 11 tos mtc0  sp tos pop  c;
+code compare@  ( -- n )  tos sp push  d# 11 tos mfc0  c;
+code sr!  ( n -- )  d# 12 tos mtc0  sp tos pop  c;
+code sr@  ( -- n )  tos sp push  d# 12 tos mfc0  c;
+code cause!  ( n -- )  d# 13 tos mtc0  sp tos pop  c;
+code cause@  ( -- n )  tos sp push  d# 13 tos mfc0  c;
+code epc!  ( n -- )  d# 14 tos mtc0  sp tos pop  c;
+code epc@  ( -- n )  tos sp push  d# 14 tos mfc0  c;
+code prid@  ( -- n )  tos sp push  d# 15 tos mfc0  c;
+code config!  ( n -- )  d# 16 tos mtc0  sp tos pop  c;
+code config@  ( -- n )  tos sp push  d# 16 tos mfc0  c;
+code lladdr!  ( n -- )  d# 17 tos mtc0  sp tos pop  c;
+code lladdr@  ( -- n )  tos sp push  d# 17 tos mfc0  c;
+code watchlo!  ( n -- )  d# 18 tos mtc0  sp tos pop  c;
+code watchlo@  ( -- n )  tos sp push  d# 18 tos mfc0  c;
+code watchhi!  ( n -- )  d# 19 tos mtc0  sp tos pop  c;
+code watchhi@  ( -- n )  tos sp push  d# 19 tos mfc0  c;
+code xcontext!  ( n -- )  d# 20 tos mtc0  sp tos pop  c;
+code xcontext@  ( -- n )  tos sp push  d# 20 tos mfc0  c;
+code perr!  ( n -- )  d# 26 tos mtc0  sp tos pop  c;
+code perr@  ( -- n )  tos sp push  d# 26 tos mfc0  c;
+code cacherr@  ( -- n )  tos sp push  d# 27 tos mfc0  c;
+code taglo!  ( n -- )  d# 28 tos mtc0  sp tos pop  c;
+code taglo@  ( -- n )  tos sp push  d# 28 tos mfc0  c;
+code taghi!  ( n -- )  d# 29 tos mtc0  sp tos pop  c;
+code taghi@  ( -- n )  tos sp push  d# 29 tos mfc0  c;
+code errorepc!  ( n -- )  d# 30 tos mtc0  sp tos pop  c;
+code errorepc@  ( -- n )  tos sp push  d# 30 tos mfc0  c;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/regacc.fth
===================================================================
--- cpu/mips/regacc.fth	                        (rev 0)
+++ cpu/mips/regacc.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,37 @@
+purpose: Register access words
+\ See license at end of file
+
+\ We assume that all devices of interest are mapped suitably for I/O
+
+defer rx@  ' x@  is rx@  ( addr -- d )
+defer rx!  ' x!  is rx!  ( d addr -- )
+defer rl@  ' l@  is rl@  ( addr -- l )
+defer rl!  ' l!  is rl!  ( l addr -- )
+defer rw@  ' w@  is rw@  ( addr -- w )
+defer rw!  ' w!  is rw!  ( w addr -- )
+defer rb@  ' c@  is rb@  ( addr -- b )
+defer rb!  ' c!  is rb!  ( b addr -- )
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/register.fth
===================================================================
--- cpu/mips/register.fth	                        (rev 0)
+++ cpu/mips/register.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,167 @@
+purpose: Buffers for saving program state
+\ See license at end of file
+
+\ Display and modify the saved state of the CPU.
+\
+\ This code is highly machine-dependent.
+\
+\ Requires:
+\
+\ >state  ( offset -- addr )
+\	Returns an address within the processor state array given the
+\	offset into that array
+\
+\ Defines:
+\
+\ %g0 .. %g7  %o0 .. %o7  %l0 .. %l7  %i0 .. %i7
+\ %pc %hi %lo
+\ .registers .locals
+
+needs action: objects.fth
+
+also hidden
+alias reasonable-ip? reasonable-ip?
+previous
+
+decimal
+
+only forth hidden also forth also definitions
+
+: /x*  ( n1 -- n2 )  3 lshift  ;
+
+: >state  ( offset -- adr )  /x*  cpu-state  +  ;
+
+false value x-registers?
+
+3 actions
+action:  @ >state x@  x-registers? 0=  if  drop  then  ;
+action:  @ >state x-registers?  0=  if  swap s>d rot  then  x!  ; ( is )
+action:  @ >state    ; ( addr )
+: reg  \ name  ( offset -- )
+   create ,
+   use-actions
+;
+: regs  \ name name ...  ( high low -- )
+   bounds  ?do  i reg  loop
+;
+
+\ This mimics the layout of the sigcontext structure
+
+ 0  3 regs  $regmask  $sigmask  $pc
+
+\ 3 16 regs  $0  $1  $2  $3  $4  $5  $6  $7  $8  $9  $10 $11 $12 $13 $14 $15
+ 3 16 regs  $0  $at $v0 $v1 $a0 $a1 $a2 $a3 $t0 $t1 $t2 $t3 $t4 $t5 $t6 $t7 
+
+\ 19 16 regs  $16 $17 $18 $19 $20 $21 $22 $23 $24 $25 $26 $27 $28 $29 $30 $31
+19 16 regs  $s0 $s1 $s2 $s3 $s4 $s5 $s6 $s7 $t8 $t9 $k0 $k1 $gp $sp $s8 $ra
+22  4 regs              $up $tos $ip $rp
+
+35 reg $fpowned
+36  8 regs  $f0  $f1  $f2  $f3  $f4  $f5  $f6  $f7
+44  8 regs  $f8  $f9  $f10 $f11 $f12 $f13 $f14 $f15
+52  8 regs  $f16 $f17 $f18 $f19 $f20 $f21 $f22 $f23
+60  8 regs  $f24 $f25 $f26 $f27 $f28 $f29 $f30 $f31
+
+68  2 regs  $fcsr  $feir
+70  2 regs  $hi    $lo
+
+72  6 regs  $cause  $badvaddr  $badpaddr  $sigset  $triggersave  $ssflags
+
+78  2 regs  exception#  $sigcode
+80  3 regs  %saved-my-self  %state-valid  %restartable?
+83  1 regs  $sr
+
+d# 84 /x* to /save-area
+
+\ These could be defined as e.g. "addr %restartable?", but that
+\ causes problems when compiling with SPIM, which can't execute
+\ code words that were recently incrementally compiled.
+: saved-my-self  ( -- addr )  d# 80 >state  ;
+: state-valid    ( -- addr )  d# 81 >state  ;
+: restartable?   ( -- addr )  d# 82 >state  ;
+: ?saved-state  ( -- )
+   state-valid @  0=  abort" No program state has been saved in this session."
+;
+
+: .lx  ( l -- )  push-hex  9 u.r  pop-base  ;
+: .xx  ( d -- )  push-hex  d# 17 ud.r pop-base  ;
+
+: .registers ( -- )
+   ?saved-state
+   ??cr
+."       $pc      $hi      $lo      $sr" cr
+         $pc .lx  $hi .lx  $lo .lx  $sr .lx
+cr cr
+."        $0      $at      $v0      $v1      $a0      $a1      $a2      $a3" cr
+          $0 .lx  $at .lx  $v0 .lx  $v1 .lx  $a0 .lx  $a1 .lx  $a2 .lx  $a3 .lx
+cr cr
+."       $t0      $t1      $t2      $t3      $t4      $t5      $t6      $t7" cr
+         $t0 .lx  $t1 .lx  $t2 .lx  $t3 .lx  $t4 .lx  $t5 .lx  $t6 .lx  $t7 .lx
+cr cr
+."       $s0      $s1      $s2      $s3      $s4      $s5      $s6      $s7" cr
+         $s0 .lx  $s1 .lx  $s2 .lx  $s3 .lx  $s4 .lx  $s5 .lx  $s6 .lx  $s7 .lx
+cr cr
+."       $t8      $t9      $k0      $k1      $gp      $sp      $s8      $ra" cr
+         $t8 .lx  $t9 .lx  $k0 .lx  $k1 .lx  $gp .lx  $sp .lx  $s8 .lx  $ra .lx
+cr cr
+;
+
+: .xregisters ( -- )
+   ?saved-state
+   x-registers?  >r  true to x-registers?
+   ??cr
+."               $pc              $hi              $lo              $sr"     cr
+                 $pc .xx          $hi .xx          $lo .xx          $sr .xx
+cr cr
+."                $0              $at              $v0              $v1" cr
+                  $0 .xx          $at .xx          $v0 .xx          $v1 .xx
+cr cr
+."               $a0              $a1              $a2              $a3" cr
+                 $a0 .xx          $a1 .xx          $a2 .xx          $a3 .xx
+cr cr
+."               $t0              $t1              $t2              $t3" cr
+                 $t0 .xx          $t1 .xx          $t2 .xx          $t3 .xx
+cr cr
+."               $t4              $t5              $t6              $t7" cr
+                 $t4 .xx          $t5 .xx          $t6 .xx          $t7 .xx
+cr cr
+."               $s0              $s1              $s2              $s3" cr
+                 $s0 .xx          $s1 .xx          $s2 .xx          $s3 .xx
+cr cr
+."               $s4              $s5              $s6              $s7" cr
+                 $s4 .xx          $s5 .xx          $s6 .xx          $s7 .xx
+cr cr
+."               $t8              $t9              $k0              $k1" cr
+                 $t8 .xx          $t9 .xx          $k0 .xx          $k1 .xx
+cr cr
+."               $gp              $sp              $s8              $ra" cr
+                 $gp .xx          $sp .xx          $s8 .xx          $ra .xx
+cr cr
+   r> to x-registers?
+;
+
+only forth also definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/resetjmp.bth
===================================================================
--- cpu/mips/resetjmp.bth	                        (rev 0)
+++ cpu/mips/resetjmp.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,106 @@
+purpose: Reset vector handler
+\ See license at end of file
+
+command: &native &this
+build-now
+
+\needs start-assembling  fload ${BP}/cpu/mips/asmtools.fth
+
+\ The size of this module affects the constant /resetjmp in
+\ physaddr.fth.
+
+start-assembling
+
+hex
+
+label resetvec
+   \ **** This is the initial entry point (reset vector) for the ROM.
+   \ It just branches past the following copyright string and past the
+   \ dropin module header for the "resetvec" dropin module, landing at
+   \ the entry point for that module.  The "resetvec" dropin module
+   \ must appear in the ROM image right after the image that this file
+   \ creates.
+   here h# 420 + $0 $0 beq
+   nop
+
+end-code
+	
+   \ This copyright string will appear in the ROM right after the branch
+   \ instruction.
+   " Copyright 2001 FirmWorks  All Rights Reserved" c$,
+
+   \ Locations 56-5b are reserved for a MAC address, for systems
+   \ that wish to store the MAC address in the boot ROM instead of
+   \ in a UID EEPROM.
+   h# 56 pad-to
+   h# ff c,  h# ff c,  h# ff c,  h# ff c,  h# ff c,  h# ff c,
+
+   \ We reserve ROM locations 5c-5f for the PROMICE AI port and place
+   \ a distinct signature there.  If the AI port is present and enabled
+   \ at those locations, it will overlay the ROM contents, thus allowing
+   \ the software to determine whether or not the AI port is present.
+
+   \ The signature should be tested at offset 5c+3 (5f), which is the
+   \ AI port status register.  The value d4 is present at both 5c+0
+   \ and 5c+3, in case we ever have to handle big-endian systems that
+   \ byte-swap the ROM in some modes.
+
+   h# 5c pad-to		\ Pad to the location reserved for the AI port
+   h# d4 c,  h# 5a c,  h# 5b c,  h# d4 c,  \ Signature distinct from AI port
+
+   h# 200 pad-to
+label tlbrefill
+   here h# 220 + $0 $0 beq
+   nop
+end-code
+
+   h# 280 pad-to
+label xtlbrefill
+   here h# 1a0 + $0 $0 beq
+   nop
+end-code
+
+   h# 300 pad-to
+label cacheerr
+   here h# 120 + $0 $0 beq
+   nop
+end-code
+
+   h# 380 pad-to
+label generalexc
+   here h# a0 + $0 $0 beq
+   nop
+end-code
+
+   h# 400 pad-to
+   \ This module must have a fixed size of /resetjmp
+
+end-assembling
+
+writing resetjmp.img
+asm-base  here over -  ofd @ fputs
+ofd @ fclose
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/rootnode.fth
===================================================================
--- cpu/mips/rootnode.fth	                        (rev 0)
+++ cpu/mips/rootnode.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,191 @@
+purpose: Methods for the root node using MIPS Kseg address translation
+\ See license at end of file
+
+: root-map-in  ( phys len -- virt )
+   " /" " map-in" execute-device-method drop
+;
+: root-map-out  ( virt len -- )
+   " /" " map-out" execute-device-method drop
+;
+
+dev /
+extend-package
+
+[ifdef] 2-cell-rootnode  2  [else]  1  [then]
+encode-int  " #address-cells"  property
+
+0 0 encode-bytes
+   h# 8000.0000 encode-int encode+	\ Base address
+[ifdef] 2-cell-rootnode
+   0 encode-int encode+
+[then]
+   h# 0200.0000 encode-int encode+	\ Size
+" dma-ranges" property
+
+hex
+headers
+
+\ Static methods
+: decode-unit  ( adr len -- phys )
+   push-hex
+[ifdef] 2-cell-rootnode
+   $dnumber?  case
+      0  of  0.  endof
+      1  of  0   endof
+      2  of      endof
+   endcase
+[else]
+   $number  if  0  then
+[then]
+   pop-base
+;
+: encode-unit  ( phys -- adr len )
+   push-hex
+[ifdef] 2-cell-rootnode
+   <# #s #>
+[else]
+   (u.)
+[then]
+   pop-base
+;
+
+\ Not-necessarily-static methods
+: open  ( -- true )  true  ;
+: close  ( -- )  ;
+
+: map-in   ( phys size -- virt )
+   drop                                 ( phys.low phys.high )
+[ifdef] 2-cell-rootnode
+   0= over h# 2000.0000 u>=  or
+[else]
+   dup h# 2000.0000 u>=
+[then]
+   abort" Can't map addresses > (hex) 2000.0000"
+   kseg1 or
+; 
+: map-out  ( virtual size -- )  2drop  ;
+
+headerless
+list: dmalist
+listnode
+   /n field >dma-ua		\ address obtained from alloc-mem, unaligned
+   /n field >dma-aa		\ address passed on to caller, cache-line aligned
+   /n field >dma-len		\ original length used to alloc-mem
+nodetype: dmanode
+
+0 dmalist !
+0 dmanode !
+0 value dma-aa
+
+: dma-aa=?  ( node -- aa=? )
+   >dma-aa @ dma-aa =
+;
+: find-dmanode?  ( -- prev-node this-node|0 )
+   dmalist ['] dma-aa=?  find-node
+;
+: alloc-dmanode  ( -- node )
+   dmanode allocate-node dup dmalist last-node insert-after
+;
+: free-dmanode  ( prev -- )
+   delete-after dmanode free-node
+;
+
+headers
+
+[ifndef] prepare-dma-range
+\ This is the default version, appropriate for systems without hardware
+\ cache coherency between the CPU and DMA
+: prepare-dma-range  ( size ua aa -- size ua dma-aa )
+   over  3 pick  flush-d$-range     ( size ua aa )  \ Remove from cache
+   kseg1 or
+;
+[then]
+
+\ Many MIPS systems require, or at least prefer, that DMA memory is
+\ aligned on cache line boundaries.
+: dma-alloc  ( size -- virt )
+   /cache-line + /cache-line round-up dup ( size' size' )
+   alloc-mem                              ( size ua )
+   dup /cache-line round-up               ( size ua aa )
+   prepare-dma-range                      ( size ua dma-aa )
+   dup >r				  ( size ua aa ) ( R: aa )
+   alloc-dmanode			  ( size ua aa node ) ( R: aa )
+   tuck >dma-aa !			  ( size ua node ) ( R: aa )
+   tuck >dma-ua !			  ( size node ) ( R: aa )
+   >dma-len !				  ( )  ( R: aa )
+   r>
+;
+: dma-free  ( virt size -- )
+   over to dma-aa find-dmanode? dup  if
+      dup >dma-ua @ swap >dma-len @ free-mem
+      free-dmanode  2drop
+   else
+      2drop free-mem
+   then
+;
+: dma-map-in  ( virt size cacheable -- devaddr )
+   drop  2dup pcicache-wbinv
+   drop h# 1fff.ffff and
+   [ifdef] 2-cell-rootnode  0  [then]
+;
+: dma-map-out  ( virt devaddr size -- )  pcicache-wbinv drop  ;
+: dma-sync  ( virt devaddr size -- )  pcicache-wbinv drop  ;
+: dma-push  ( virt devaddr size -- )  pcicache-inv drop  ;
+: dma-pull  ( virt devaddr size -- )  pcicache-wbinv drop  ;
+
+finish-device
+
+device-end
+
+headerless
+\ Call this after the system-mac-address is determined, which is typically
+\ done near the end of the probing process.
+: set-system-id  ( -- )
+   system-mac-address  dup  if        ( adr 6 )
+      " /" find-device                ( adr 6 )
+
+      \ Convert the six bytes of the MAC address into a string of the
+      \ form 0NNNNNNNNNN, where N is an uppercase hex digit.
+      push-hex                        ( adr 6 )
+
+      <#  bounds  swap 1-  ?do        ( )
+         i c@  u# u#  drop            ( )
+      -1 +loop                        ( )
+      0 u# u#>                        ( adr len )
+
+      2dup upper                      ( adr len )  \ Force upper case
+
+      pop-base                        ( adr len )
+
+      encode-string  " system-id"  property   ( )
+
+      device-end
+   else
+      2drop
+   then
+;
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/savefort.fth
===================================================================
--- cpu/mips/savefort.fth	                        (rev 0)
+++ cpu/mips/savefort.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,112 @@
+purpose: Save dictionary to a file for MIPS
+\ See license at end of file
+
+\ save-forth  ( filename -- )
+\	Saves the Forth dictionary to a file so it may be later used under Unix
+\
+\ save-image  ( header-adr header-len init-routine-name filename -- )
+\	Primitive save routine.  Saves the dictionary image to a file.
+\	The header is placed at the start of the file.  The latest definition
+\	whose name is the same as the "init-routine-name" argument is
+\	installed as the init-io routine.
+
+only forth also hidden also  forth definitions
+
+headerless
+: swap-size  ( -- n )  here  >swap-map-size  ;
+
+\needs lbflip   : lbflip  ( l1 -- l2 )  lbsplit swap 2swap swap bljoin  ;
+variable swap-temp
+: swap-lput  ( adr -- )
+   l@ lbflip swap-temp l!
+   swap-temp  4 ofd @ fputs
+;
+: swap-fputs  ( adr len -- )  bounds  ?do  i swap-lput  4 +loop  ;
+: ?swap-fputs  ( adr len -- )
+   3 + 2 >>  0  ?do              ( adr )
+      dup i la+                  ( adr adr' )
+      i swap-map bittest  if     ( adr adr' )
+         4 ofd @ fputs           ( adr )
+      else                       ( adr adr' )
+         swap-lput               ( adr )
+      then                       ( adr )
+   loop                          ( adr )
+   drop
+;
+
+false value swapped-save?
+: save-image  ( header header-len init-routine-name filename -- )
+   $new-file
+
+   ( header header-len init-routine-name )
+
+   init-save
+
+   swapped-save?  if
+      ( header header-len )  swap-fputs		\ Write header
+      origin   text-size     ?swap-fputs	\ Write dictionary
+      up@      user-size     swap-fputs		\ Write user area
+   else
+      ( header header-len )  ofd @  fputs	\ Write header
+      origin   text-size     ofd @  fputs	\ Write dictionary
+      up@      user-size     ofd @  fputs	\ Write user area
+   then
+   swap-map swap-size     ofd @  fputs		\ Write swap map
+   ofd @ fclose
+;
+headers
+
+0 value growth-size
+
+: make-bin-header  ( -- )
+   10000007    h_magic l!	\ This is a   ba,a .+0x20   instruction
+   text-size   h_tlen  l!       \ Set the text size in program header
+   user-size   h_dlen  l!       \ Set the data size in program header
+   growth-size h_blen  l!       \ Set the bss size in program header
+   0           h_slen  l!       \ Set the symbol size in program header
+   origin      h_entry l!       \ Set the current starting address
+   swap-size   h_trlen l!       \ Set the relocation size
+;
+
+\ Save an image of the target system in a file.
+: $save-forth  ( str -- )
+   8 (align)			\ Make sure image is 8 byte aligned
+
+   2>r
+
+   make-bin-header
+
+   bin-header  /bin-header  " sys-init" 2r>  save-image
+;
+: $save-forth-swapped  ( str -- )
+   true to swapped-save?
+   $save-forth
+   false to swapped-save?
+;
+: save-forth  ( str -- )  count $save-forth  ;
+
+only forth also definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/savemeta.fth
===================================================================
--- cpu/mips/savemeta.fth	                        (rev 0)
+++ cpu/mips/savemeta.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,115 @@
+purpose: Save metacompiled MIPS kernel to a file
+\ See license at end of file
+
+hex
+only forth labels also forth also definitions
+
+\ Program header
+create header   forth
+th 10000007 l,  \ Magic number (bra .+32)
+      0 l,    \ Text size, actual value will be set later
+      0 l,    \ Data size, actual value will be set later
+      0 l,    \ Bss  size
+      0 l,    \ Symbol Table size
+      0 l,    \ Entry
+      0 l,    \ Text Relocation Size
+      0 l,    \ Data Relocation Size
+\ End of header.
+here header -  constant /header
+
+only forth also meta also forth-h also definitions
+
+\ Save an image of the target system in the file whose name
+\ is the argument on the stack.
+
+: doubleword-align  ( n -- n' )  7 + 7 invert and  ;
+: text-base  ( -- adr )  origin-t >hostaddr  ;
+: text-size  ( -- n )  here-t origin-t -  doubleword-align  ;
+: swap-size  ( -- n )  here-t >swap-map-size-t  ;
+: user-base  ( -- adr )  userarea-t  ;
+: user-size  ( -- n )  user-size-t  doubleword-align  ;
+
+\needs lbflip   : lbflip  ( l1 -- l2 )  lbsplit swap 2swap swap bljoin  ;
+variable swap-temp
+: swap-lput  ( adr -- )
+   l@ lbflip swap-temp l!
+   swap-temp  4 ofd @ fputs
+;
+: swap-fputs  ( adr len -- )  bounds  ?do  i swap-lput  4 +loop  ;
+: ?swap-fputs  ( adr len -- )
+   3 + 2 >>  0  ?do              ( adr )
+      dup i la+                  ( adr adr' )
+      i swap-map-t bittest  if   ( adr adr' )
+         4 ofd @ fputs           ( adr )
+      else                       ( adr adr' )
+         swap-lput               ( adr )
+      then                       ( adr )
+   loop                          ( adr )
+   drop
+;
+
+: $start-save  ( filename$ -- )
+   \ Doubleword alignment is not absolutely required, but may turn out to
+   \ be useful if we ever do a 64-bit implementation.
+   begin  here-t  7 and  while  0 c,-t  repeat
+
+   $new-file
+
+   \ Set the text and data sizes in the program header
+   h# 1000.0007          header h#  0 + l-t!  \ Magic number
+   text-size             header h#  4 + l-t!  \ Text size
+   user-size             header h#  8 + l-t!  \ Data size
+   0                     header h# 10 + l-t!  \ Symbol table size
+
+   0                     header h# 14 + l-t!  \ Entry point
+   swap-size             header h# 18 + l-t!  \ Swap map size
+
+;
+: $save-meta ( filename$ -- )
+   $start-save 
+
+   header               /header       ofd @  fputs
+   text-base            text-size     ofd @  fputs
+   user-base            user-size     ofd @  fputs
+
+   swap-map-t           swap-size     ofd @  fputs  \ Swap map
+
+   ofd @ fclose
+;
+: $save-meta-swapped  ( filename$ -- )
+   $start-save 
+
+   header               /header       swap-fputs
+   text-base            text-size     ?swap-fputs
+   user-base            user-size     swap-fputs
+
+   swap-map-t           swap-size     ofd @  fputs  \ Swap map
+
+   ofd @ fclose
+;
+
+only forth also meta also definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/startup.html
===================================================================
--- cpu/mips/startup.html	                        (rev 0)
+++ cpu/mips/startup.html	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,490 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title>Open Firmware Startup on MIPS Processors</title>
+</head>
+ <body>
+ 
+<h1>Open Firmware Startup on MIPS Processors</h1>
+ This document describes the startup process for Open Firmware on MIPS processors.
+ It summarizes the requirements for MIPS startup and tells how Open Firmware
+code modules can be structured to accomplish the system initialization necessary
+for running the main Open Firmware Forth code. 
+<h2>Overview of Open Firmware Structure</h2>
+ The sizes listed below are for the code when it is resident in RAM. When
+in ROM, the code is typically compressed (as with gzip) to about one half
+its uncompressed size. 
+<p> The Open Firmware ROM image consists of a sequence of modules in "dropin
+format".  Each "dropin module" consists of a 32-byte header and some code
+or data of varying length.  The details of dropin module format are described
+in a later section.  The various dropin modules are concatenated to form
+the overall ROM image. </p>
+<p> The critical dropin modules are: </p>
+<ul>
+ <li>resetjmp - about 1K </li>
+  <li>reset - about 3K </li>
+  <li>start - variable; perhaps 3K to 25K </li>
+  <li>firmware - about 400K </li>
+</ul>
+ 
+<h3>The "resetjmp" code</h3>
+ On MIPS processors, the first instruction that is executed after the CPU
+comes out of reset is at the beginning of the ROM, so the first thing in
+the ROM cannot be a dropin module with a proper dropin header.  The first
+true dropin module (with a header) is after the code that occupies the exception
+vectors defined by the MIPS hardware specification. The code at the reset
+vector jumps directly to the beginning of first true dropin module, named
+"reset".<br>
+<br>
+The source file that defines this code is "arch/mips/<i>platform</i>/resetjmp.bth".
+&nbsp;It may also contain entry code for the other ROM exception vectors.
+  
+<h3>The "reset" module</h3>
+ The "reset" module is a relatively small (typically about 3K) amount of
+machine code that sequences the execution of other dropin modules to accomplish
+the early startup process.  In principle, the "reset" module ought to be
+generic so that the same code could run on any MIPS system, but in practice 
+it is somewhat platform specific for two reasons: 
+<ol>
+ <li>The reset code must flush the cache, and cache-flushing code varies
+somewhat across different MIPS processors </li>
+  <li>It's useful to include in the reset code some rudimentary debug facilities
+like LED blinking or serial line output; such code is inherently platform-specific. 
+  </li>
+</ol>
+Possibly after initializing a diagnostic output device, the reset module
+locates the start module (by searching through the ROM to find a dropin module
+with the named "start" in its header) and calls it (at its beginning address)
+as a subroutine.<br>
+<br>
+The source file that defines this module is "arch/mips/<i>platform</i>/reset.bth".<br>
+ 
+<h3>The "start" module</h3>
+ The purpose of the start module is to initialize the core logic, memory
+system, and just enough of the I/O system to get a diagnostic serial port
+working.  The start module is entirely dependent on the design of the core
+logic hardware, so it must be rewritten for each chip family. Writing and
+debugging the start module is the crucial step in bringing up Open Firmware
+on a new MIPS chipset. A later section of of this document tells how to create
+a start module for a new chipset.  In preparation for initializing the memory
+and a serial port, the start module often has to initialize other parts of 
+the core logic such as caches, first-level host bridges, etc.  In general,
+however, the "start" module initializes just enough to get a memory and serial
+port working.  Initialization of secondary devices like interrupt and DMA
+controllers, timers, and most I/O devices is usually left to later code in
+the "firmware" module.<br>
+<br>
+The source file that defines this module is "arch/mips/<i>platform</i>/start.bth".
+If the process of initializing the memory system is relatively simple, the
+entire "start" code might be in that one file. Otherwise, "start.bth" might
+sequence the compilation process of several other files that together implement
+the core logic and memory system startup sequence.<br>
+ 
+<h3>Loading the "firmware" module</h3>
+ The start modules returns (as from a normal subroutine) to the reset module
+that called it.  Subsequent code can then use the RAM memory that the start
+module initialized.  The reset module's final task is to locate the "firmware"
+module (by searching ROM for a dropin module named "firmware"), move it into
+RAM, and jump to it.  However, there are some complications: 
+<ul>
+ <li>The "firmware" module is usually stored in ROM in compressed (gzip) form.
+ If that is the case, the "reset" module must unzip the "firmware" module
+into RAM instead of simply copying it.  To do so, the "reset" module locates
+the "inflate" module, copies it into RAM (for faster execution), and calls
+it with the ROM address of the compressed "firmware" module and the RAM address
+where the uncompressed version should be placed. </li>
+  <li>After the "firmware" module has been copied or uncompressed into RAM,
+it is usually necessary to flush the data cache and invalidate the instruction
+cache so the CPU can execute the firmware code. </li>
+</ul>
+ Even if the system has enough ROM to store the "firmware" module in ROM
+uncompressed, there is an advantage to compressing it. The compressed image
+contains a CRC and a redundant length; taken together they constitute a quick
+and effective test of the integrity of ROM and RAM.  ROM problems corrupt
+the compressed code stream, which makes the inflater get "out of sync" and
+misread the final length field.  RAM problems show up as a CRC mismatch when
+the inflater computes the CRC of the RAM image after uncompressing it. 
+<p> It's possible to do more extensive memory tests at this point, but it's
+better to defer them until later, when the full Open Firmware I/O system
+can be used to report the results. </p>
+<h3>The "firmware" module</h3>
+ The firmware module contains the vast majority of the functionality of Open
+Firmware.  It is mostly written in Forth, on top of a relatively small assembly
+language kernel that implements the Forth virtual machine. Its basic internal
+structure is that of a Forth "dictionary", which is a set of linked lists.
+ Each such list is called a "vocabulary".  The list elements are called "words".
+Each word has a name, an associated action, and optionally some data.  A
+particular word's action can be implemented by either a sequence of machine
+code or a sequence of other words.  Typically, only the most basic primitive
+operations (add, subtract, branch, copy, etc.) are implemented as machine
+code words. 
+<p> The Forth dictionary is incrementally compiled in a layered fashion. Each
+layer is internally complete and self-consistent as far as it goes. </p>
+<h4>The C Wrapper</h4>
+ The same Forth dictionary image can run either as a standalone program on 
+the target machine (when it is fulfilling the functions of Open Firmware) 
+or as a user program under Linux or another operating system.  In this latter
+mode, it requires help from an external program that is called the "C wrapper".
+ The "C wrapper" is an executable program that is compiled from C source
+code.  Its job is to provide basic system services like I/O and memory allocation,
+isolating the system-independent Forth dictionary from operating-system-specific
+details such as the system's executable file format. 
+<p> The compilation process for the Forth dictionary depends on this technique 
+of running Forth as a user process.  A basic Forth system runs under Linux 
+with the help of the C wrapper program, extends itself by compiling source
+code from files, and saves the extended Forth dictionary into another file.
+ The process can be repeated as necessary, until the resulting file contains
+all the features that are needed for the Open Firmware system that is to
+run on the target system.  It can then be embedded within the "firmware"
+dropin module. </p>
+<h4>The Forth Kernel - kernel.dic</h4>
+ The innermost layer is the Forth language kernel.  It is a fully-functional 
+implementation of the core ANS Forth language.  It contains an interactive 
+interpreter and an incremental compiler, so it is capable of extending itself
+by compiling new words into its dictionary. 
+<p> The Forth kernel implementation contains MIPS machine code sequences,
+so its binary image is specific to the MIPS-32 instruction set architecture. 
+The kernel does not contain any code that is specific to particular MIPS processor
+variants or to particular system architectures.  It uses only user-level
+MIPs instructions. </p>
+<p> The Forth kernel source code is very stable and almost never needs to
+be changed in order to port Open Firmware to a new platform.  The only time 
+the kernel source needs to change is to port Open Firmware to a new instruction
+set architecture, and even then most of the kernel files remain unchanged. 
+</p>
+<p> The compilation directory for the Forth kernel is fm/cwrapper/mips/build. 
+The command for compiling it is </p>
+<pre>    build kernel<br></pre>
+ In most cases, you won't need to execute this command explicitly, because 
+higher-level builder scripts will do it automatically if necessary.  The name
+of the kernel image file is "kernel.dic".  The builder script for compiling
+it is "fm/cwrapper/mips/kernel.bth" . 
+<h4>(The Metacompiler)</h4>
+ The kernel is compiled from source code that is written in a combination 
+of high-level Forth and assembly language.  The assembly language code uses
+a simplified postfix syntax that is very easy to parse, so the assembler
+is very simple and small.  The program that compiles the Forth kernel is
+called a "metacompiler".  It processes source code that is very similar to
+the source code accepted by an ordinary Forth incremental compiler, but the
+metacompiler can do some extra things: 
+<ul>
+ <li>It can create a new self-contained Forth system that is separate from
+itself, rather than just being able to add on to an existing Forth dictionary. 
+  </li>
+  <li>It can cross-compile a Forth kernel for an instruction set other than
+the instruction set on which the metacompiler is running. </li>
+  <li>It can handle forward references transparently. </li>
+</ul>
+ However, the metacompiler does have one important limitation - it cannot
+handle arbitrary data constructs defined by means of CREATE and DOES&gt;
+(these are advanced Forth features).  This limitation makes it difficult
+to metacompile the entire Open Firmware system as one monolithic unit. 
+<p> The metacompiler and the simple assembler are both included in the "builder"
+program that is described later. </p>
+<h4>Extended Forth - tools.dic</h4>
+ The layer above the kernel is called "tools.dic", named for the file that
+contains it.  Tools.dic is an extended Forth programming environment that
+contains a number of useful tools such as an incremental assembler, a source-level
+debugger, a callfinder, a wordfinder, a line editor with history and command
+completion, and numerous other extensions that go beyond the basic words
+defined by ANS Forth. 
+<p> Tools.dic does not include any Open Firmware abstractions such as device
+tree, packages, or FCode.  Those are in the next layer up. Tools.dic serves
+as a common Forth language base for both the remainder of the Open Firmware
+build process and also the builder program. </p>
+<p> The compilation directory for tools.dic is fm/cwrapper/mips/build. The
+command for compiling it is </p>
+<pre>    build tools<br></pre>
+ In most cases, you won't need to execute this command explicitly, because 
+higher-level builder scripts will do it automatically if necessary.  The name
+of the image file is "tools.dic".  The builder script for compiling it is
+"fm/cwrapper/mips/tools.bth" . 
+<h4>Base Firmware - basefw.dic</h4>
+ The layer above tools.dic in the path to Open Firmware is "basefw.dic". Base
+firmware contains the platform-independent parts of the features defined
+by the Open Firmware standard, including the device tree, client interface,
+FCode evaluator, and support packages.  It also includes numerous FirmWorks
+extensions such as TCP and filesystem support. 
+<p> basefw.dic does not contain any code that is specific to the board-level 
+architecture or the devices that may be present on a particular platform. 
+Thus the same basefw.dic binary image file can often be used unchanged as 
+the basis for building platform-specific Open Firmware implementations for
+multiple platforms that use the same CPU instruction set architecture (i.e.
+MIPS in this case).  Porting to a new MIPS platform usually does not require
+modifications to basefw.dic </p>
+<p> Some code modules that are not platform-specific, and thus could be included 
+in basefw.dic, are not included because the features that they implement are
+optional.  The code itself is platform-independent, but the choice of whether
+or not to include it is platform-specific. </p>
+<p> The compilation directory for basefw.dic is fm/cwrapper/mips/build. The
+command for compiling it is </p>
+<pre>    build basefw<br></pre>
+ In most cases, you won't need to execute this command explicitly, because 
+higher-level builder scripts will do it automatically if necessary.  The name
+of the image file is "basefw.dic".  The builder script for compiling it is
+"fm/cwrapper/mips/basefw.bth" . 
+<h4>The complete Open Firmware dictionary - fw.dic</h4>
+ The final layer is "fw.dic".  It extends basefw.dic to include support for
+a specific target hardware platform.  It includes device drivers for core 
+devices like timers, interrupt controllers, bus bridges, diagnostic UARTs, 
+FLASH chips, and NVRAM devices.  It also includes information describing the
+physical address map and other system characteristics.  It may include diagnostics
+for manufacturing, field service, and initial system checkout. Optional features
+like support for specific program image formats (e.g. ELF) and file system
+layouts (e.g. Linux ext2) are added at this level. Customer-specific code,
+such as new user interface commands for special system maintenance requirements,
+can be added as well. 
+<p> "fw.dic", usually in compressed form, is the body of the "firmware" dropin 
+module. </p>
+<p> Drivers for PCI bus devices like mass-storage or network interfaces can
+either be "hard-compiled" into fw.dic or attached externally as separate
+dropin modules in FCode format.  The latter is often more convenient for
+devices that are not needed during the early phases of platform initialization. 
+</p>
+<p> Most of the porting work for a new platform, apart from the very low
+level code in the "start" module as described above, is done at the fw.dic
+level. </p>
+<p> Even though it contains a great deal of code that is specific to the
+target hardware, it is still possible to run "fw.dic" under the compilation 
+operating system via the C wrapper.  "fw.dic" contains separate entry points
+and initialization sequences for the two environments (standalone execution
+on the target system and OS-hosted execution on the compilation system).
+The code that accesses target-specific devices is executed only if "fw.dic"
+is entered via its standalone entry point. </p>
+<p> This ability to run "fw.dic" in the OS environment can be quite convenient 
+for debugging purposes, because you can use the built-in debugging facilities
+to inspect the code that has actually been compiled.  It eliminates the need
+for listings of the compiled code or "dump" files. </p>
+<p> The compilation directory for basefw.dic is arch/mips/<i>platform</i>/build, 
+where <i>platform</i> is the name of a directory for a specific target hardware
+platform.  The command for compiling it is </p>
+<pre>    build fw<br></pre>
+ In most cases, you won't need to execute this command explicitly, because 
+the top-level builder script will do it automatically if necessary.  The name
+of the image file is "fw.dic".  The builder script for compiling it is "arch/mips/<i>platform</i>/fw.bth"
+. 
+<h4>The top-level builder script - rom.bth</h4>
+ The file that contains the overall image of the entire contents of ROM (i.e.
+FLASH) is "rom.img".  "rom.img" contains a sequence of dropin modules, including
+"resetjmp", "reset", "start", "inflate", "firmware", and usually several
+other modules containing things like FCode drivers for PCI devices. 
+<p> The compilation directory for rom.img is arch/mips/<i>platform</i>/build, 
+where <i>platform</i> is the name of a directory for a specific target hardware
+platform.  The command for compiling it is </p>
+<pre>    build rom<br></pre>
+ <b><i>This is the top-level command that you use to recompile Open Firmware.</i></b> 
+The name of the image file is "rom.img".  The builder script for compiling
+it is "arch/mips/<i>platform</i>/rom.bth" . 
+<h3>How MIPS Processors Come Out of Reset</h3>
+ After reset, MIPS processors begin execution at the beginning of ROM at
+virtual address 0xbfc00000. That virtual address corresponds to the physical
+address 0x1fc00000.  The virtual-to-physical translation results from the
+"kseg1" translation region, which maps virtual addresses 0xa0000000-0xbfffffff
+to physical addresses 0x0000000-0x1fffffff in uncached mode.  Within that
+physical address range, the first half (0x00000000-0x0fffffff) is usually
+for RAM while the second half (0x10000000-0x1fffffff) is for I/O devices. 
+<p> Early startup code typically runs from this uncached virtual address range
+until the caches and the memory have been initialized. Thereafter, for faster
+execution, code can be copied into memory where it can execute from the cached
+"kseg0" translation region, which maps the same physical address range to
+the virtual address range from 0x80000000-0x9fffffff.  When running from
+kseg0, I/O accesses are still done through the kseg1 addresses, as it is
+rarely correct to cache I/O registers.  (In some systems, the hardware permits
+the execution of ROM code in cached mode; on those systems, you can run from
+the kseg0 region before initializing memory.) </p>
+<p> The code at the reset vector must jump to some other location within a
+few instructions, because the other exception vectors are located at nearby
+addresses.  The details vary somewhat across different MIPS processors, but
+as a general rule the first 32 instruction locations are always available
+for the reset code.  The top end of the ROM exception vector area is typically
+at offset 0x3ff from the beginning of ROM, so the code in the first 32 instructions
+typically jumps to other code at offset 0x400 or above. </p>
+<h3>The Builder</h3>
+ The FirmWorks "builder" program is an integrated tool for managing the Open
+Firmware compilation process.  It has these features: 
+<ul>
+ <li>Dependency manager (similar in spirit to Unix "make") that 
+    <ul>
+ <li>Recompiles only those layers whose source has changed </li>
+      <li>Automatically generates dependency lists during compilation </li>
+      <li>Tracks the files used to help with release engineering tasks </li>
+    </ul>
+ </li>
+  <li>Native and/or cross assemblers </li>
+  <li>Metacompiler for cross-compiling Forth kernels </li>
+  <li>Dropin module creation and inspection tools </li>
+  <li>FCode tokenizer </li>
+  <li>FCode detokenizer </li>
+  <li>General-purpose Forth interpreter/compiler/environment </li>
+</ul>
+ 
+<h4>Builder scripts - .bth files</h4>
+ Builder scripts look very similar to Forth source code, because the builder
+is just a Forth compiler with the extensions listed above. It is possible
+to convert an ordinary Forth source file into a builder script simply by
+adding two lines near the beginning of the file. 
+<p> Builder scripts have the filename extension ".bth", which makes it possible
+for the builder to locate them automatically.  Ordinary Forth source code
+files have the extension ".fth".  The wildcard pattern "*th" matches both
+Forth source files and builder scripts, which is often convenient when using
+"grep" to search for a particular string. </p>
+<p> Each ".bth" file pertains to a single object file (in contrast to a Makefile,
+which can list numerous "targets" in a single file). There can be (and usually
+are) several ".bth" files in one directory, each pertaining to one target
+object.  The base name of the ".bth" file is the same as the base name of
+the target object; for example, if the target image filename is "rom.img",
+the builder script filename is "rom.bth". </p>
+<p> The ".bth" file need not be in the directory where the target will be
+built; when the builder needs to recompile a target object, it will search
+upward from the build directory until it finds an appropriately-named ".bth"
+file.  The main purpose of this is to segregate source files and object files
+in different directories. The "keep searching upwards" rule can be used to
+good effect by having a generic ".bth" file in a higher level directory (e.g.
+at the "/mips" level, but specific platforms that need something other than 
+the default can override it by making their own version at a lower directory
+level.</p>
+<h4>Builder dependency lines</h4>
+<h4> </h4>
+<p> The only structural difference between a builder script and an ordinary 
+Forth source code file is the addition of a few dependency lines near the
+beginning of the file.  Those dependency lines give the builder information
+like: </p>
+<ul>
+ <li>Which Forth dictionary file serves as the base for the next phase of
+compilation. </li>
+  <li>Which instruction set architecture is required for compilation </li>
+  <li>Which input files, other than Forth source code files, the script depends
+on. (The builder can automatically determine dependencies on Forth source
+code files.) </li>
+</ul>
+ For example, here are the dependency lines at the beginning of fw.bth. 
+<pre>dictionary: ${BP}/cpu/mips/build/basefw.dic<br>command: &amp;mipsfth &amp;dictionary &amp;this<br>build-now<br></pre>
+ The "dictionary:" line says an up-to-date version of the  dictionary file
+"${BP}/fm/cwrapper/mips/build/basefw.dic" is needed in order to perform the
+compilation that is defined by the rest of this builder script.  If that
+dictionary file is missing or out-of-date with respect to a files it depends
+on, the builder will automatically build it first.  "${BP}" is a C wrapper
+macro that expands to the base directory of the firmware source tree.  The
+C wrapper automatically locates that base directory by searching up the tree 
+from the current build directory. 
+<p> The "command:" line tells which operating system command to use to recompile
+the object that this builder script pertains to.  In general, it can be any
+shell command, but it is often of the form shown. "&amp;mipsfth" is a builder
+macro that expands to the name of the C wrapper program that is appropriate
+for compiling MIPS code.  "&amp;dictionary" expands to the file named on
+the preceding "dictionary:" line, and "&amp;this" expands to the name fo
+the current builder script file.  If the object to be compiled is out of
+date with respect to a dependency, that command line (after macro expansion)
+is executed.  In this case, the MIPS C wrapper executable program would be
+run, passing to it as command line arguments the name of the base dictionary
+file and the name of the builder script file. </p>
+<p> "build-now" tells the builder that there are no more dependency lines; 
+it causes the builder to proceed to check the dependencies and to perform
+any necessary recompillatin. </p>
+<p> The normal Forth compiler treats builder dependency lines as comments. 
+The rest of a builder script after the builder lines file contains the Forth
+source code to be compiled.  Often that source code consists primarily of
+"fload <i>filename</i>" commands, so the script mostly sequences the compilation
+of other (ordinary) Forth srouce code files. However, that is just a weak
+convention; builder scripts can and do contain arbitrary Forth code after
+the builder command lines. </p>
+<p> The only other type of dependency line that is typically used is "in:
+<i>filename</i>".  That line, of which there can be many instances, tells
+the builder that the object to be compiled has a dependency on the indicated
+file.  "in:" lines are only necessary for files that are not Forth source
+files.  Typically they are used for binary images like pretokenized FCode
+binary files, prebuilt dropin modules, or object files compiled by other
+language processors. </p>
+<h4>Builder .log files</h4>
+ When the Forth compiler writes out a file (typically a ".dic" dictionary
+file), it also writes out a ".log" file with the same base name.  That ".log"
+file lists the names and timestamps of all the files that were opened during
+the compilation. (This logging functionality is actually implemented by the
+C wrapper program.)  The builder uses the .log files to check dependencies. 
+This is how the dependencies are maintained automatically. 
+<p> The log files can be deleted at any time without losing any critical
+information.  If a log file is missing, the builder won't try to avoid an
+unnecessary recompilation by checking direct dependencies; it will just recompile
+the target anyway.  It will, however, first recursively check dependencies
+listed on "dictionary:" and "in:" lines, recompiling them first if necessary. 
+</p>
+<h4>The "build" command</h4>
+ The "build" command invokes the builder.  "build" itself is a shell script
+whose main function is to locate the correct C wrapper file and builder dictionary
+("native.dic") for the OS and instruction set of the compilation host machine.
+ The builder dictionary files are located in "bin/<i>CPU</i>/native.dic",
+where <i>CPU</i> is the name of the instruction set that the builder dictionary 
+runs on.  The C wrapper executable files are in "bin/<i>CPU</i>/<i>os</i>/forth",
+where <i>os</i> is an operating system name like "linux".  The "build" shell
+script works out the correct values for <i>CPU</i> and <i>os</i> and sets
+the HOSTDIR environment variable to <i>path</i>/bin/<i>CPU</i>/<i>os</i>,
+where <i>path</i> is the path to the root of the Open Firmware source tree.
+ Then it runs the appropriate C wrapper ("forth") with the appropriate build
+dictionary file ("native.dic"), like this: 
+<pre>   ${HOSTDIR}/forth ${HOSTDIR}/../native.dic <i>arg</i>
+</pre>
+ <i>arg</i> is the argument that was on the "build" command line. It is the
+name of the top-level target object that is to be compiled. The extension
+can be present or absent; "build rom" and "build rom.img" are equivalent. 
+<p> If <i>arg</i> is omitted, the builder will run in interactive mode, giving
+you an "ok" prompt from which you can issue Forth commands to invoke any
+of the other builder features.  Or you can just use it as a Forth interpreter. 
+</p>
+<h3>Language Alternatives for the Start Module</h3>
+  Since its job is to configure and initialize the memory controller, the
+"start" module can be written in any language that can generate code that
+doesn't need RAM memory.  The pros and cons of several language choices are
+given below. 
+<h4>Forth</h4>
+ Forth code requires a stack to operate, so it's not a viable candidate for
+coding the "start" module. 
+<h4>C</h4>
+ With a lot of care, it's possible to write C code that doesn't need memory.
+ You have to use exactly the right compiler flags, limit the number of variables
+and the nesting depth of subroutine calls, and make sure the variables are
+allocated to registers. Even then you often have to edit the assembly language
+output to remove the stack preamble code at the top level. If you switch
+to a new version of the compiler toolchain, you often have to go back and
+change something to keep a memory dependency from creeping in.&nbsp; 
+<p> Another technique is to use the cache, without memory backing, as variable
+storage and stack for the C code.  That, too, requires some trickery, mastery
+of the compiler switches, and usually some in-line assembly code.  But it
+can be worthwhile if the memory controller is so complicated that programming
+it in assembly language is just too difficult. </p>
+<h4>Forth Assembler</h4>
+ The FirmWorks builder program includes a
+<a href=assembler.html>MIPS assembler</a>.
+The syntax is unconventional
+(it is postfix, so the operands are mentioned before the operands),
+but the assembler is small and predictable. You can easily make macros
+so you don't have to write out canned sequences explicitly every time.
+The assembler also has built-in structured conditional macros that mimic
+Forth control flow constructs ( e.g. ... IF ... ELSE ... THEN), so you
+don't have explictly write branch instructions and keep track of labels.
+<p> The Forth assembler is missing some of the more esoteric new MIPS
+instructions, but it's relatively easy to extend it, or you can just insert
+the opcode in the code as a hex number.
+The assembler won't reorder code, so you have to be careful
+with MIPS delayed branches. </p>
+<p> The assembler is well integrated with the builder facilities for
+creating dropin modules, so it's easy to package the resulting binary code
+in the dropin module format. </p>
+<h4>GNU Assembler</h4>
+ The GNU assembler can generate arbitrary machine code sequences as needed.
+ You can assemble the code into an ELF file, extract just the code into an
+raw image file, then use the builder to encapsulate that raw image into a
+dropin module.  The disadvantage of this approach is the need to maintain
+an installation of the GNU toolchain in conjunction with the Open Firmware
+build environment (many organizations will be using the GNU toolchain anyway,
+so this may not be a severe disadvantage). One advantage is that many people
+are already familiar with the GNU assembler. 
+<h3>Examples</h3>
+ 
+<h3>Sample fw.bth</h3>
+ 
+<h3>Dropin Module Format</h3>
+ 
+<h3>Nanoforth</h3>
+ 
+</body>
+</html>

Added: cpu/mips/sys.fth
===================================================================
--- cpu/mips/sys.fth	                        (rev 0)
+++ cpu/mips/sys.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,99 @@
+purpose: C wrapper low-level I/O interface
+\ See license at end of file
+
+\ Low-level I/O interface for use with a C "wrapper" program.
+\ The C program provides the Forth kernel with an array of entry-points
+\ into C subroutines for performing the actual system calls.
+\ This scheme should be reasonably compatible with nearly any Unix
+\ implementation.  The only difference would be in the implementation of
+\ "syscall", which has to look up the address of the actual system call
+\ C routine in the system call table provided to it by the C program loader.
+\ It then has to convert the stack arguments into the same form as is
+\ expected by the C system call routines.  This obviously depends on the
+\ details of the C calling sequence, but should not be too hard because
+\ C compilers usually pass arguments on the stack.
+\    Syscall is defined in the kernel, because it is needed for basics like
+\ key and emit.
+
+decimal
+
+/l ualloc-t  dup equ syscall-user#
+user syscall-vec   \ long address of system call vector
+nuser sysretval
+
+\ I/O for running under an OS with a C program providing actual I/O routines
+
+meta
+code syscall ( <args> call# -- <args> )
+					\ Get address of system call table
+   'user syscall-vec   t9   lw
+   bubble
+   t9  tos             tos  addu
+   tos 0               t9   lw		\ Address of routine
+
+   sp  0               $a0  lw  	\ Get some arguments
+   sp  4               $a1  lw
+   sp  8               $a2  lw
+
+   t9  ra  jalr
+   sp  12              $a3  lw		\ Delay slot
+
+   v0   'user sysretval     sw		\ Save the result
+
+   sp  tos   pop                \ Fix stack
+c;
+: retval   ( -- return_value )     sysretval  @  ;
+: lretval  ( -- l.return_value )   sysretval l@  ;
+
+nuser errno	\ The last system error code
+: error?  ( return-value -- return-value error? )
+   dup 0< dup  if  60 syscall retval errno !  then   ( return-value flag )
+;
+
+\ Rounds down to a block boundary.  This causes all file accesses to the
+\ underlying operating system to occur on disk block boundaries.  Some
+\ systems (e.g. CP/M) require this; others which don't require it
+\ usually run faster with alignment than without.
+
+\ Aligns to a 512-byte boundary
+hex
+: _falign  ( l.byte# fd -- l.aligned )  drop  1ff invert and  ;
+: _dfalign  ( d.byte# fd -- d.aligned )  drop  swap 1ff invert and swap  ;
+
+th 1b4 is file-protection  \ rw-rw-r--  Unix file protection code
+
+: sys-init-io  ( -- )
+   install-wrapper-io
+   install-disk-io
+   \ Don't poll the keyboard under Unix; block waiting for a key
+   ['] (key              ['] key            (is
+;
+' sys-init-io is init-io
+
+: sys-init ;  \ Environment initialization chain
+' sys-init is init-environment
+decimal
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/target.fth
===================================================================
--- cpu/mips/target.fth	                        (rev 0)
+++ cpu/mips/target.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,296 @@
+purpose: Metacompiler target configuration for MIPS
+\ See license at end of file
+
+only forth also meta definitions
+defer init-relocation-t
+defer set-relocation-bit-t
+
+decimal
+
+h# c000 constant max-kernel                 \ Maximum size of the kernel
+
+only forth also meta assembler definitions
+: normal ( -- )   \ Perform target-dependent assembler initialization
+;
+
+only forth also meta definitions
+
+: lobyte h# 0ff and ;
+: hibyte 8 >> lobyte ;
+
+2 constant /w-t
+4 constant /l-t
+/l-t constant /n-t
+/l-t constant /a-t
+/a-t constant /thread-t
+/l-t constant /token-t
+/l-t constant /link-t
+/token-t constant /defer-t
+/n-t h# 800 * constant user-size-t
+/n-t h# 100 * constant ps-size-t
+/n-t h# 100 * constant rs-size-t
+/l-t constant /user#-t
+
+\ 32 bit host Forth compiling 32-bit target Forth
+: l->n-t ; immediate
+: n->l-t ; immediate
+: n->n-t ; immediate
+: s->l-t ; immediate
+
+: c!-t  ( n adr -- )  >hostaddr c! ;
+: c at -t  ( adr -- n )  >hostaddr c@ ;
+
+[ifdef] little-endian-t
+\ little-endian versions
+: w!-t ( n add -- )  over lobyte over c!-t  ca1+ swap hibyte swap c!-t  ;
+: l!-t ( l add -- )  >r lwsplit swap r@ w!-t r> /w-t + w!-t  ;
+: w at -t ( target-address -- n )  dup c at -t swap 1+ c at -t 8 << or  ;
+: l at -t ( target-address -- n )  dup >r /w-t + w at -t  r> w at -t  swap wljoin  ;
+[else]
+\ big-endian versions
+: w!-t ( n add -- )  over hibyte over c!-t  ca1+ swap lobyte swap c!-t  ;
+: l!-t ( l add -- )  >r lwsplit r@ w!-t r> /w-t + w!-t  ;
+: w at -t ( target-address -- n )  dup c at -t 8 << swap 1+ c at -t or  ;
+: l at -t ( target-address -- n )  dup >r /w-t + w at -t  r> w at -t  wljoin  ;
+[then]
+
+: !-t  ( n add -- ) l!-t ;
+: @-t  ( target-address -- n ) l at -t ;
+
+\ Store target data types into the host address space.
+: c-t!  ( c host-address -- )  c!  ;
+[ifdef] little-endian-t
+: w-t!  ( w host-address -- )
+   over hibyte  over ca1+ c-t!  swap lobyte swap c-t!
+;
+: l-t!  ( l host-address -- )  >r  lwsplit  r@ /w-t + w-t!  r> w-t!  ;
+[else]
+: w-t!  ( w host-address -- )
+   over hibyte  over c-t!  ca1+  swap lobyte swap c-t!
+;
+: l-t!  ( l host-address -- )  >r  lwsplit  r@ w-t!  r> /w-t + w-t!  ;
+[then]
+: n-t!  ( n host-address -- )  l-t!  ;
+
+: c-t@  ( host-address -- c )  c@  ;
+[ifdef] little-endian-t
+: w-t@  ( host-address -- w )  >r  r@ c-t@  r> 1+     c-t@  bwjoin  ;
+: l-t@  ( host-address -- l )  >r  r@ w-t@  r> /w-t + w-t@  wljoin  ;
+[else]
+: w-t@  ( host-address -- w )  >r  r@ 1+     c-t@  r> c-t@  bwjoin  ;
+: l-t@  ( host-address -- l )  >r  r@ /w-t + w-t@  r> w-t@  wljoin  ;
+[then]
+
+\ Next 3 are machine-independent
+: c,-t ( byte -- )  here-t dup set-swap-bit-t   1 allot-t c!-t ;
+: w,-t ( word -- )  here-t /w-t allot-t w!-t ;
+: l,-t ( long -- )  here-t /l-t allot-t l!-t ;
+
+: ,-t ( n -- )  l,-t ;  \ for 32 bit stacks
+: ,user#-t ( user# -- )  l,-t  ;
+
+: a at -t ( target-address -- target-address )  l at -t  ;
+: a!-t ( token target-address -- )  ( set-relocation-bit-t )  l!-t  ;
+: token at -t ( target-address -- target-acf )  a at -t  ;
+: token!-t ( acf target-address -- )  a!-t  ;
+
+: rlink at -t  ( occurrence -- next-occurrence )  a at -t  ;
+: rlink!-t  ( next-occurrence occurrence -- )  token!-t  ;
+
+
+\ Machine independent
+: a,-t  ( adr -- )  here-t /a-t allot-t  a!-t  ;
+: token,-t ( token -- )  here-t /token-t allot-t  token!-t  ;
+
+\ These versions of linkx-t are for absolute links
+: link at -t ( target-address -- target-address' )  a at -t  ;
+: link!-t ( target-address target-address -- )  a!-t  ;
+: link,-t ( target-address -- )  a,-t  ;
+
+: a-t@ ( host-address -- target-address )
+[ also forth ]
+   dup  origin here within  over up@  dup user-size +  within  or  if
+[ previous ]
+      l@
+   else
+      hostaddr> a at -t
+   then
+;
+: a-t! ( target-address host-address -- )
+[ also forth ]
+   dup  origin here within  over up@  dup user-size +  within  or  if
+[ previous ]
+      l!
+   else   
+      hostaddr> a!-t
+   then
+;
+: rlink-t@  ( host-adr -- target-adr )  a-t@  ;
+: rlink-t!  ( target-adr host-adr -- )  a-t!  ;
+
+: token-t@ ( host-address -- target-acf )  a-t@  ;
+: token-t! ( target-acf host-address -- )  a-t!  ;
+: link-t@  ( host-address -- target-address )  a-t@  ;
+: link-t!  ( target-address host-address -- )  a-t!  ;
+
+\ Machine independent
+: a-t, ( target-address -- )  here  /a-t allot  a-t!  ;
+: token-t, ( target-address -- )  here  /token-t allot  token-t!  ;
+: >body-t  ( cfa-t -- pfa-t )
+   \ The code fields of DOES> and ;CODE words contain an extra token
+   " dodoes" ['] labels $vfind  if
+      execute
+      over token at -t  =  if  /token-t +  then
+   else
+      drop
+   then
+   /token-t +
+;
+
+1 constant #threads-t
+create threads-t   #threads-t 1+ /link-t * allot
+
+: $hash-t  ( adr len voc-ptr -- thread )
+   -rot nip #threads-t 1- and  /thread-t * +
+;
+
+\ Should allocate these dynamically.
+\ The dictionary space should be dynamically allocated too.
+
+\ The user area image lives in the host address space.
+\ We wish to store into the user area with -t commands so as not
+\ to need separate words to store target items into host addresses.
+\ That is why user+ returns a target address.
+
+\ Machine Independent
+
+0 constant userarea-t
+: setup-user-area ( -- )
+   user-size-t alloc-mem is userarea-t
+   userarea-t user-size-t  erase
+;
+
+: >user-t ( cfa-t -- user-adr-t )
+   >body-t
+   @-t
+   userarea-t  +
+;
+
+: n>link-t ( anf-t -- alf-t )  /link-t - ;
+: l>name-t ( alf-t -- anf-t )  /link-t + ;
+
+decimal
+/l constant #align-t
+/l constant #talign-t
+/l constant #linkalign-t
+/l constant #acf-align-t
+: aligned-t  ( n1 -- n2 )  #align-t 1- +  #align-t negate and  ;
+: acf-aligned-t  ( n1 -- n2 )  #acf-align-t 1- +  #acf-align-t negate and  ;
+
+\ NullFix bl -> 0
+: align-t ( -- )
+   begin   here-t #align-t  1- and   while   0 c,-t   repeat
+;
+: talign-t ( -- )
+   begin   here-t #talign-t 1- and   while   0 c,-t   repeat
+;
+: linkalign-t  ( -- )
+   begin   here-t #linkalign-t 1- and   while   0 c,-t   repeat
+;
+: acf-align-t  ( -- )  talign-t  ;
+
+: entercode ( -- )
+   only forth also labels also meta also mips-assembler
+\   assembler
+   [ also mips-assembler ]  here delay-barrier !  [ previous ]
+;
+
+\ Next 5 are Machine Independent
+: cmove-t ( from to-t n -- )
+  0 do over c@  over c!-t  1+ swap 1+ swap loop  2drop
+;
+: place-cstr-t  ( adr len cstr-adr-t -- cstr-adr-t )
+   >r  tuck r@ swap cmove-t  ( len ) r@ +  0 swap c!-t  r>
+;
+: "copy-t ( from to-t -- )
+  over c@ 2+  cmove-t
+;
+: toggle-t ( addr-t n -- ) swap >r r@ c at -t xor r> c!-t ;
+
+: clear-threads-t  ( hostaddr -- )
+   #threads-t /link-t * bounds  do
+      origin-t i link-t!
+   /link +loop
+;
+: initmeta  ( -- )
+\  init-relocation-t
+  threads-t   #threads-t /link-t * bounds  do
+     origin-t i link-t!
+  /link +loop
+  threads-t current-t !
+;
+
+\ For compiling branch offsets used by control constructs.
+\ These compile relative branches.
+
+/l-t constant /branch
+: branch! ( offset addr-t -- )
+   over - ( from offset ) swap
+   l!-t
+;
+: branch, ( offset -- )
+   here-t -
+   l,-t
+;
+
+\ Store actions for some data structures.  This has to be in this
+\ file because it depends on the location of the user area (in some
+\ versions, the user area has to be in the dictionary for
+\ relocation to work right, but in other versions, the user area
+\ is elsewhere.  Ultimately, separate relocation for the user area is
+\ needed.
+
+: isuser   ( n acf -- )     >user-t n-t!  ;
+: istuser  ( acf1 acf -- )  >user-t token-t!  ;
+: isvalue  ( n acf -- )     >user-t n-t!  ;
+: isdefer  ( acf acf -- )   >user-t token-t!  ;
+
+: thread-t!  ( thread adr -- )  link-t!  ;
+
+only forth also meta also definitions
+: install-target-assembler  ( -- )
+   [ assembler ]
+\   ['] dp-t   is asmdp
+   ['] here-t  is here
+   ['] allot-t is asm-allot
+   ['] l at -t    is asm@
+   ['] l!-t    is asm!
+   [ meta ]
+;
+: install-host-assembler  ( -- )
+   [ assembler ] resident [ meta ]
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/testasm.fth
===================================================================
--- cpu/mips/testasm.fth	                        (rev 0)
+++ cpu/mips/testasm.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,94 @@
+purpose: Load file for running the MIPS assembler under C Forth 83
+\ See license at end of file
+
+: l>d  0 ;
+
+alias ul. u.
+alias headerless noop
+alias headerless0 noop
+alias headers noop
+
+\ cd /home/forthware/wmb/fm/extend/mips
+
+fload assem.fth
+fload disassem.fth
+
+: label create mips-assembler  ;
+: code
+   create
+   d# 306 here body> !   \ 305 is the primitive number for deferred words
+   also mips-assembler
+;
+: next  [ also mips-assembler ] $31 jr  nop  [ previous ]  ;
+: end-code  previous  ;
+: c;  next end-code  ;
+
+also mips-assembler definitions
+alias s0 $16
+alias s1 $17
+alias s2 $18
+alias s3 $19
+alias s4 $20
+alias s5 $21
+alias s6 $22
+alias s7 $23
+alias t0 $8
+alias t1 $9
+alias t2 $10
+alias t3 $11
+alias t4 $12
+alias t5 $13
+alias t6 $14
+alias t7 $15
+
+.( XXX I don't know which register the compiler will use for the Forth) cr
+.( stack pointer) cr
+
+: base s2 ;  : up s3 ;  : tos s4 ;  : ip s5 ;  : rp s6 ;  : sp  ???  ;
+previous definitions
+hex
+
+\ Example - this is almost 
+code xcmove  ( src dst cnt -- )
+   sp 0    tos  lw	\ cnt into tos
+   sp 8    t0   lw	\ Src into t0
+   sp 4    t1   lw	\ Dst into t1
+   sp 3 /n*  sp   addiu		\ Pop stack
+
+   t0 tos  t2   addu	\ t2 = src limit
+
+   t0 t2  <> if
+   nop
+      
+      begin
+         t0 0  t3     lbu	\ Load byte
+         t0 1  t0     addiu	\ (load delay) Increment src
+         t3    t1 0   sb	\ Store byte
+      t0 t2  = until
+         t1 1  t1     addiu	\ (delay) Increment dst
+   then   
+c;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/tickint.fth
===================================================================
--- cpu/mips/tickint.fth	                        (rev 0)
+++ cpu/mips/tickint.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,49 @@
+purpose: Use the MIPS R4000 count/compare registers for the tick interrupt
+\ See license at end of file
+
+: tick-interrupt  ( level -- )
+   drop
+   tick-counts compare@ +  dup compare!	  ( next-count )  \ Setup next tick
+
+   \ If the count is already ahead of the comparator, the ticker has slipped
+   \ badly, so we advance the tick in order to avoid a really long interval.
+   count@ - 0<  if  tick-counts count@ +  compare!  then
+
+   tick-msecs ms/tick +  to tick-msecs
+   ?call-os
+   check-alarm
+;
+
+0 value tick-counts
+: (set-tick-limit)  ( #msecs -- )
+   to ms/tick
+   ms/tick ms-factor *  to tick-counts
+   tick-counts count@ + compare!
+   ['] tick-interrupt 7 interrupt-handler!
+   7 enable-interrupt
+;
+' (set-tick-limit) to set-tick-limit
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/tools.bth
===================================================================
--- cpu/mips/tools.bth	                        (rev 0)
+++ cpu/mips/tools.bth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,57 @@
+purpose: Load file for Forth toolkit, without firmware
+\ See license at end of file
+
+dictionary: ${BP}/cpu/mips/build/kernel.dic
+command: &mipsfth &dictionary &this
+build-now
+
+' $report-name is include-hook
+\ ' noop is include-hook
+\ : rn  (cr 2dup type 15 spaces  ;  ' rn is include-hook
+
+fload ${BP}/forth/lib/fwsetup.fth
+
+\ Variables controlling inclusion of optional packages.
+
+transient
+
+\ false value keep-headers?       \ ~ 30K bytes
+true value keep-headers?       \ ~ 30K bytes
+true  value word-finders?	\ ~ .5K bytes
+true  value command-completion?	\ ~  1K bytes
+true  value assembler?		\ ~  5K bytes
+true  value symdebug?		\ ~  1K bytes
+false value help?		\ ~  5K bytes
+true  value forth-debug?	\ ~  1K bytes
+true  value elf32-support?	\ ~  1K bytes
+
+resident
+
+fload ${BP}/forth/lib/loadcomm.fth	\ CPU-independent Forth tools
+fload ${BP}/cpu/mips/loadmach.fth	\ CPU and OS-specific extensions
+
+cr .( --- Saving tools.dic --- )  " tools.dic" $save-forth cr
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/traps.fth
===================================================================
--- cpu/mips/traps.fth	                        (rev 0)
+++ cpu/mips/traps.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,131 @@
+purpose: RAM base exception handlers
+\ See license at end of file
+
+only forth also hidden also  forth definitions
+
+headerless
+
+\ Exception:	Vector offset
+\ TLB refill	0x000
+\ 64TLB refill	0x080
+\ Cache error	0x100
+\ Others	0x180
+
+: 'vector  ( exception# -- addr )  h# 80 *  ;
+
+\ XXX Need work
+label vec0-generic
+   
+   8   k0         mfc0		\ get BADVADDR
+\	_GET_CURRENT(k1)	\ get current task ptr
+   k0  d# 22  k0  srl		\ get PGD only bits
+\   k1  THREAD_PGDIR  k1  lw	\ get task PG_DIR
+   k0  2      k0  sll
+   k1  k0     k1  addu		\ add PGD offset
+   4   k0         mfc0		\ get CONTEXT
+   k0  0      k0  lw
+   k0  1      k0  srl		\ get PTE offset
+   k0  h# ff8 k0  and
+   k1  k0     k1  addu		\ add PTE offset
+   k1  0      k0  lw		\ get PTE
+   k1  4      k1  lw
+   k0  6      k0  srl		\ convert to EntryLo format
+   k1  6      k1  srl
+   2   k0         mtc0		\ set EntryLo
+   3   k1         mtc0
+   nop
+   tlbwr			\ write random tlb entry
+   nop nop nop
+   eret				\ return from trap
+   nop
+
+end-code
+
+label vec1-generic
+   4   k1      mfc0		\ get CP0_CONTEXT
+   k1  1   k1  dsra
+   k1  0   k0  lwu
+   k1  4   k1  lwu
+   k0  6   k0  dsrl		\ Convert to EntryLo format
+   k1  6   k1  dsrl
+   2   k0      dmtc0		\ set EntryLo0
+   3   k1      dmtc0		\ set EntryLo1
+   nop
+   tlbwr
+   nop nop nop
+   eret
+   nop
+end-code
+
+: .cacherr  ( CacheErr -- )
+   dup h# 8000.0000 and  if  ." data;"  else  ." instruction;"  then
+   dup h# 2000.0000 and  if  ."  data field error;"  then
+   dup h# 1000.0000 and  if  ."  tag field error;"  then
+   dup h# 0800.0000 and  if  ."  error on first doubleword;"  then
+   dup h# 0400.0000 and  if  ."  error on SysAD bus;"  then
+       h# 0200.0000 and  if  ."  error on one cache"  else  ." error on both caches"  then
+;
+
+: cache-error-handler  ( -- )
+   ." Cache error at address: " errorepc@ .x
+   ." (" cacherr@ .cacherr  ." )" cr
+   begin  again
+;
+
+label vec2-generic
+   here 8 +               bal   \ ra = Absolute address of next instruction
+   here origin - 4 + k1   set   \ k1 = relative address of this instruction
+   ra       k1       base subu  \ k1 address of Forth kernel
+
+   'body main-task   up   li	\ User pointer address
+
+   \ Set up Forth stacks
+   'user sp0   sp   lw
+   'user rp0   rp   lw
+
+   \ Account for the presence of the top of stack register
+   sp /n   sp   addiu
+
+   np@ origin-  np  set
+   np  base     np  addu
+
+   'body cache-error-handler ip set
+   ip base ip addu
+c;
+
+0 value vector-base
+: install-handler  ( handler exception# -- )
+   ( exception# ) 'vector vector-base + >r
+   ( handler )    lwsplit
+   h# 3c1b.0000 or r@     0 + instruction!   \ lui     k1,handler.hi
+   h# 377b.0000 or r@     4 + instruction!   \ ori     k1,k1,handler.lo
+   h# 0360.0008    r@     8 + instruction!   \ jr      k1
+   0               r> h#  c + instruction!   \ nop
+;
+
+headers
+only forth also definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/unalign.fth
===================================================================
--- cpu/mips/unalign.fth	                        (rev 0)
+++ cpu/mips/unalign.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,95 @@
+purpose: Unaligned memory access operations for bi-endian MIPS
+\ See license at end of file
+
+0 value in-little-endian?
+
+code unaligned-l@   (s adr -- l )
+   'user in-little-endian?  $at  lw
+   tos    t0  move	\ bubble
+   $at 0 <>  if		\ Little endian
+   nop			\ delay
+      t0 3  tos  lwl
+   else			\ Big endian
+   t0 0  tos  lwr	\ delay
+
+      t0 0  tos  lwl
+      t0 3  tos  lwr
+   then
+c;
+: unaligned-@  (s adr -- l )  unaligned-l@  ;
+code unaligned-w@  (s adr -- w )
+   'user in-little-endian?  $at  lw
+   tos     t0  move	\ Bubble
+   $at 0 <>  if		\ Little endian
+   t0 1   t2  lb	\ Delay
+      t0 0    t1   lb
+      t2 8    tos  sll
+   else			\ Big endian
+   tos t1  tos  or	\ Delay
+
+      t0 0    tos  lb
+      bubble
+      tos 8   tos  sll
+      tos t2  tos  or
+   then
+c;
+code unaligned-l!   (s n adr -- )
+   'user in-little-endian?  $at  lw
+   sp 0   t0   lw	\ Bubble
+   $at 0 <>  if		\ Little endian
+   nop			\ Delay
+      t0    tos 3  swl
+   else			\ Big endian
+   t0    tos 0  swr	\ Delay
+
+      t0    tos 0  swl
+      t0    tos 3  swr
+   then
+   sp 4  tos    lw
+   sp 8  sp     addiu
+c;
+: unaligned-d!  ( d adr -- )
+   >r  in-little-endian?  if  swap  then
+   r@ unaligned-! r> na1+ unaligned-!
+;
+
+: unaligned-!   (s n adr -- )  unaligned-l!  ;
+code unaligned-w!   (s w adr -- )
+   'user in-little-endian?  $at  lw
+   sp 0   t0   lw	\ Bubble
+   $at 0 <>  if		\ Little endian
+   t0 8  t1    srl	\ Delay
+      t0    tos 0  sb
+   else			\ Big endian
+   t1    tos 1  sb	\ Delay
+
+      t0    tos 1  sb
+      t1    tos 0  sb
+   then
+   sp 4  tos    lw
+   sp 8  sp     addiu
+c;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/virtaddr.fth
===================================================================
--- cpu/mips/virtaddr.fth	                        (rev 0)
+++ cpu/mips/virtaddr.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,37 @@
+purpose: Virtual addresses for generic MIPS system
+\ See license at end of file
+
+headerless
+
+0 value fw-virt-base     \ Setup later after we know the memory size
+h# 10.0000 value fw-virt-size
+
+headers
+
+kseg0 h# 20.0000 + ' load-base set-config-int-default
+
+0 value load-limit	\ Top address of area at load-base (set later)
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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/mips/zipcrc.fth
===================================================================
--- cpu/mips/zipcrc.fth	                        (rev 0)
+++ cpu/mips/zipcrc.fth	2009-05-25 20:35:46 UTC (rev 1201)
@@ -0,0 +1,66 @@
+purpose: ZIP CRC calculation
+\ See license at end of file
+
+\ Load this before pkg/zipcrc.ftg
+
+headers
+
+transient
+only forth also assembler also definitions
+alias blen  t0
+alias badr  t1
+alias table t2
+alias crc   tos
+alias eadr  t3
+alias i     t4
+alias crc'  t5
+only forth also definitions
+resident
+
+code ($crc)  ( crc table-adr adr len -- crc' )
+   tos  blen  move
+   sp   badr  pop
+   sp   table pop
+   sp   crc   pop
+
+   blen 0 =  if  nop next  then	\ Exit if len=0
+
+   badr blen eadr addu		\ Compute end loop condition
+   begin
+      badr 0      i     lbu	\ Get next byte
+      crc  i      i     xor	\ crc ^ byte
+      i    h# ff  i     andi	\ index
+      i    2      i     sll	\ index * 4
+      i    table  i     add
+      i    0      crc'  lw	\ Lookup in table
+      crc  8      crc   srl	\ Shift old crc
+      badr 1      badr  addiu	\ Increment address
+   badr eadr =  until
+      crc' crc    crc   xor	\ Merge new bits
+
+c;
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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