Author: wmb Date: 2008-12-20 08:55:35 +0100 (Sat, 20 Dec 2008) New Revision: 1039
Added: cpu/arm/ cpu/arm/Linux/ cpu/arm/Linux/Makefile cpu/arm/asmtools.fth cpu/arm/assem.fth cpu/arm/basefw.bth cpu/arm/bitops.fth cpu/arm/boot.fth cpu/arm/build/ cpu/arm/build/Makefile cpu/arm/builder.bth cpu/arm/call.fth cpu/arm/centry.fth cpu/arm/code.fth cpu/arm/cpubpsup.fth cpu/arm/cpustate.fth cpu/arm/ctrace.fth cpu/arm/debugm.fth cpu/arm/decompm.fth cpu/arm/disassem.fth cpu/arm/dodoesad.fth cpu/arm/extra.fth cpu/arm/fb8-ops.fth cpu/arm/field.fth cpu/arm/filecode.fth cpu/arm/finish.fth cpu/arm/float.fth cpu/arm/forthint.fth cpu/arm/ftrace.fth cpu/arm/getms.fth cpu/arm/inflate cpu/arm/inflater.fth cpu/arm/initpgm.fth cpu/arm/kerncode.fth cpu/arm/kernel.bth cpu/arm/kernfloat.fth cpu/arm/kernrel.fth cpu/arm/loadmach.fth cpu/arm/loadvmem.fth cpu/arm/memtest.fth cpu/arm/metainit.fth cpu/arm/metarel.fth cpu/arm/minifth.fth cpu/arm/mmu.fth cpu/arm/muldiv.fth cpu/arm/native.bth cpu/arm/objcode.fth cpu/arm/objsup.fth cpu/arm/psr.fth cpu/arm/regacc.fth cpu/arm/register.fth cpu/arm/savefort.fth cpu/arm/savemeta.fth cpu/arm/scc.fth cpu/arm/sqroot.fth cpu/arm/sync.fth cpu/arm/sys.fth cpu/arm/target.fth cpu/arm/testasm.txt cpu/arm/testmmu.fth cpu/arm/tools.bth cpu/arm/traps.fth cpu/arm/version.fth Log: ARM - initial checking of core OFW code for ARM
Added: cpu/arm/Linux/Makefile =================================================================== --- cpu/arm/Linux/Makefile (rev 0) +++ cpu/arm/Linux/Makefile 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,36 @@ +# Wrapper makefile for ARM Linux +# Copyright 2008 FirmWorks. All rights reserved. +# +BP=../../.. + +CFLAGS = -DARM -mlittle-endian + +WRTAIL = forth/wrapper +WRDIR = ${BP}/${WRTAIL} +ZIPTAIL = ${WRTAIL}/zip +ZIPDIR = ${BP}/${ZIPTAIL} + +ZIPOBJS = zipmem.o deflate.o trees.o bits.o util.o inflate.o + +OBJS = wrapper.o logger.o ${ZIPOBJS} + +all: forth + +# Use forth when you just need to run Forth but don't care what +# native instruction set it is on. +# Use x86forth when you need to compile new dictionaries that will +# run on x86 systems. +forth: armforth + @ln -sf armforth forth + +armforth: ${OBJS} + ${CC} ${CFLAGS} ${LFLAGS} -o $@ ${OBJS} + +%.o: ${WRDIR}/%.c + ${CC} -c ${CFLAGS} $< -o $@ + +%.o: ${ZIPDIR}/%.c + ${CC} -c ${CFLAGS} -I${ZIPDIR} $< -o $@ + +clean: + @rm -f ${OBJS} forth armforth
Property changes on: cpu/arm/Linux/Makefile ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/asmtools.fth =================================================================== --- cpu/arm/asmtools.fth (rev 0) +++ cpu/arm/asmtools.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,114 @@ +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}/forth/lib/headless.fth + +[ifndef] arm-assembler +fload ${BP}/cpu/arm/assem.fth +fload ${BP}/cpu/arm/code.fth +fload ${BP}/forth/lib/loclabel.fth +[then] + +also forth definitions +: c$, ( adr len -- ) + 1+ here swap note-string dup allot move 4 (align) +; +previous definitions + +[ifdef] notyet +also arm-assembler definitions +\needs $-to-r3 fload ${BP}/cpu/powerpc/asmmacro.fth + +: $find-dropin, ( adr len -- ) + $-to-r3 \ Assemble string and skip it + " find-dropin bl *" evaluate \ and call find routine +; +previous definitions +[then] + +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 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 ( -- ) + \ Use "is" instead of "to" in the next line because "to" is a PowerPC + \ assembly mnemonic (trap on overflow). + [ also assembler also helpers ] + ['] asm@ behavior ['] asm! behavior to old-asms + ['] le-l@ is asm@ ['] le-l! is asm! + [ previous previous ] + set-asm-origin + true to transient-labels? +; +: end-assembling ( -- ) + [ also assembler also helpers ] + old-asms is asm! is asm@ + [ previous previous ] + false to transient-labels? +; + +\ LICENSE_BEGIN +\ Copyright (c) 1995 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
Property changes on: cpu/arm/asmtools.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/assem.fth =================================================================== --- cpu/arm/assem.fth (rev 0) +++ cpu/arm/assem.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,1085 @@ +purpose: Prefix assembler for ARM Instruction Set +\ See license at end of file + +\ create testing + +[ifndef] skipwhite +: skipwhite ( adr1 len1 -- adr2 len2 ) + begin dup 0> while ( adr len ) + over c@ bl > if exit then + 1 /string + repeat ( adr' 0 ) +; +[then] +\needs land : land and ; + +\needs cindex fload ${BP}/forth/lib/parses1.fth +\needs lex fload ${BP}/forth/lib/lex.fth +\needs 2nip : 2nip ( n1 n2 n3 n4 -- n3 n4 ) 2swap 2drop ; +vocabulary arm-assembler also arm-assembler definitions + +\ Define symbolic names for constants in this vocabulary +\ vocabulary register-names +\ vocabulary constant-names +vocabulary helpers + +also helpers definitions + +headerless +hex + +[ifdef] testing +0 value aoffset +[then] + +0 value newword + +defer here \ ( -- adr ) actual dictionary pointer, metacomp. calculates host/target adresses +defer asm-allot \ ( n -- ) allocate memory in the code address space + +\ defer byte! \ ( c adr -- ) write char to adr, metacompiler changes this +defer asm! \ ( n adr -- ) write n to adr " +defer asm@ \ ( adr -- n ) read n at adr " + +defer asm-set-relocation-bit + +also arm-assembler definitions +: asm, ( n -- ) here /l asm-allot asm! ; +previous definitions + +: !op ( -- ) newword asm, ; + +0 value op-end + +0 value last-len + +0 value rem-adr +0 value rem-len +: set-rem$ ( adr len -- ) is rem-len is rem-adr ; +: rem$ ( -- adr len ) rem-adr rem-len ; + +d# 128 buffer: cbuf +0 value clen + +: field-bounds ( -- end start ) + op-end dup rem-len - swap last-len - +; + +0 value adr-delim + +: xop ( change-bits -- ) newword xor is newword ; +: iop ( on-bits -- ) newword or is newword ; + +: ad-error ( msg$ -- ) + \ Types the message passed in, the contents of cbuf and the stack. + type cr + where #out @ >r + source type cr + field-bounds dup r> + spaces ( end start ) ?do ." ^" loop cr + abort +; + +\ : $asm-find ( word$ -- word$ false | xt true ) ['] register-names $vfind ; +: $asm-find ( word$ -- word$ false | xt true ) ['] arm-assembler $vfind ; + +: $asm-execute ( name$ -- ?? ) + $asm-find 0= if " Unknown symbol" ad-error then execute +; + +: set-parse ( adr len -- ) + cbuf over set-rem$ cbuf swap move rem-len is clen + cbuf clen lower +; + +: mark-position ( -- ) + >in @ source drop >in @ + 1- c@ bl <= if 1- then is op-end +; +: save-parse ( -- ) + \ Save the current >in pointer, parse the next word and copy it + \ into cbuf for processing, then erase the rest of cbuf. + parse-word set-parse + mark-position +; + +: /rem ( n -- ) rem$ rot /string set-rem$ ; + +: init-operands ( -- ) +\ We can't do this because rem$ isn't set if we have an exact match +\ rem-len abort" Invalid opcode" + 0 0 set-rem$ +; + +\ Backup one character if the last get-field found a non-zero delimiter. +: backover-delim ( -- ) adr-delim 0<> /rem ; + +: set-field ( n bit# -- ) lshift iop ; +: rotr ( x cnt -- x' ) + \ Rotate x right cnt bits within a 32 bit "register." + d# 32 mod 2dup rshift -rot d# 32 swap - lshift or +; + +: rotl ( x cnt -- x' ) + \ Rotate x ldef cnt bits within a 32 bit "register." + d# 32 mod 2dup lshift -rot d# 32 swap - rshift or +; + +: 2chars ( -- n ) + \ This packs the first two characters of the string onto TOS. + rem-adr dup 1+ c@ swap c@ bwjoin +; + +: parse-1 ( ch -- flag ) + rem-len 1 >= if + rem-adr c@ = if 1 /rem true exit then + else + drop + then + false +; + +\ ---------------- +\ : lex ( text$ delim$ -- rem$ head$ delim true | text$ false ) + +: next-cons dup 1+ swap ; +78f1e000 +next-cons constant adt-empty \ End of line. +next-cons constant adt-delimiter \ Delimiter is 1st character. +next-cons constant adt-1st \ First of the address word types. +next-cons constant adt-psrfld \ _c, _f, etc. +next-cons constant adt-reg \ r0, r1, ..., pc. +next-cons constant adt-coreg \ c0, c1, ... +next-cons constant adt-coproc \ p0, p1, ... +next-cons constant adt-xpsr \ cpsr, spsr. +next-cons constant adt-shift \ Shift op in Shifter Operands. +next-cons constant adt-rrx +next-cons constant adt-immed \ #immediate_value. + constant adt-last \ Last +1 of the address word types. + +: adt? ( n -- adt? ) adt-1st adt-last within ; + +\ ----------------------------- +( Here's some code from the PowerPC assembler that will handle + * + | <based-number> +where <based-number> is + <decimal-digits> + | d#<decimal-digits> + | h#<hex-digits> + | 0x<hex-digits> + | o#<octal-digits> + | b#<binary-digits> + | <any-word-in-the-'constant-names'-vocabulary> + ) + +\ If adr2,len2 is an initial substring of adr1,len1, return the remainder +\ of the adr1,len1 string following that initial substring. +\ Otherwise, return adr1,len1 +: ?remove ( adr1 len1 adr2 len2 -- adr1 len1 false | adr1+len2 len1-len2 true ) + 2 pick over u< if 2drop false exit then \ len2 too long? + 3 pick rot 2 pick ( adr len1 len2 adr1 adr2 len2 ) + caps-comp 0= if /string true else drop false then +; +: set-base ( adr len -- adr' len' ) + " h#" ?remove if hex exit then + " 0x" ?remove if hex exit then + " d#" ?remove if decimal exit then + " o#" ?remove if octal exit then + " 0o" ?remove if octal exit then + " b#" ?remove if binary exit then + " 0b" ?remove if binary exit then +; + +headers + +headerless +: get-based-number ( adr len -- true | n false ) + \ The following case statement handles preceding signs because + \ the <mumble> who laid out the assembler addressing put the sign + \ after the # sign on ldr and str instructions. + over c@ case + ascii - of true >r 1 /string endof + ascii + of false >r 1 /string endof + ( default ) false >r + endcase + +\ ['] register-names $vfind if execute r> if negate then false exit then + ['] arm-assembler $vfind if execute r> if negate then false exit then + base @ >r decimal + set-base + $number + r> base ! + r> over 0= land if swap negate swap then +; +: number ( [ n1 ] adr len -- n2 ) + 2dup " *" $= if 2drop then + get-based-number abort" Bad number" +; + +headers hex +\ ----------------------------- + +: ?next-word ( -- empty? ) + \ If the current string is empty, parse another word. + rem-len 0= if ( ) + parse-word set-parse mark-position ( ) + then ( ) + false ( false ) +; + +: start-field ( -- ) + rem$ skipwhite set-rem$ + rem-len is last-len +; + +\ False means that there was nothing at all; no delimiter, and no field +: get-field ( -- false | fld$ true ) + ?next-word if false exit then + rem-len is last-len + + \ Get a field out of the string. + rem$ " !#*+,-[]^_{}`" lex 0= if ( field$ ) + 0 0 2swap 0 ( rem$ field$ delim ) + then ( rem$ field$ delim ) + is adr-delim 2swap set-rem$ ( field$ ) + dup 0<> adr-delim or if ( field$ ) + true ( field$ true ) + else ( null$ ) + 2drop false ( false ) + then ( false | field$ true ) +; + +: ?missing-operand ( empty? -- ) 0= if " Missing operand" ad-error then ; +: require-field ( -- field$ ) get-field ?missing-operand ; + +: cond: ( n1 "name" -- ) d# 28 lshift constant ; + +: psr: ( n1 "name" -- ) create 10 lshift , does> @ adt-psrfld ; +: psrs: ( 10x"name" -- ) 10 1 do i psr: loop ; + +\ define the registers +: reg: ( n "name" -- ) create , does> @ adt-reg ; +: regs: ( 10x"name" -- ) 10 0 do i reg: loop ; + +\ Define the co-processors. +: coproc: ( n "name" -- ) create , does> @ adt-coproc ; +: coprocs: ( 10x"name" -- ) 10 0 do i coproc: loop ; + +\ Define the co-processor registers. +: coreg: ( n "name" -- ) create , does> @ adt-coreg ; +: coregs: ( 10x"name" -- ) 10 0 do i coreg: loop ; + +: range-error ( n msg$ -- ) type .d cr abort ; + +: expecting ( $ -- ) ." Expecting " ad-error ; +: ?expecting ( flag msg$ -- ) rot if expecting else 2drop then ; +: ?#bits ( n #bits -- n ) + 2dup 1 swap lshift 1- invert and if ( n #bits ) + ." Value won't fit in " .d " bits" ad-error + then ( n #bits ) + drop +; + +: fits? ( n -- okay? ) + 10 0 do + dup ffffff00 land 0= if + \ This rotation fits, package it. + i 8 set-field iop true unloop exit + else + 2 rotl + then + loop + drop false +; +: do-#32 ( x -- ) + fits? 0= if " Immediate value won't fit in 8 bits" ad-error then +; + +: get-number ( -- n ) + ?next-word 0= ?missing-operand + + \ Get a field out of the string. + rem$ " !*,[]^_{}" lex 0= if ( field$ ) + 0 0 2swap 0 ( rem$ field$ delim ) + then ( rem$ field$ delim ) + is adr-delim 2swap set-rem$ ( field$ ) + + get-based-number " number" ?expecting ( n ) +; + +: parse-error ( -- ) " Unrecognized address field" ad-error ; +: fix-parse-buffer ( -- ) + \ Now we have to fix up the parse buffer + source >in @ > if ( adr ) + \ The input buffer is not empty + >in @ + c@ case ( char ) + [char] ] of [char] ] is adr-delim 1 >in +! endof + [char] , of [char] , is adr-delim 1 >in +! endof + endcase ( ) + else ( adr ) + drop + then + " " set-parse mark-position +; +: execute-inline ( -- ?? ) + rem-len if ( ) + rem$ " `" lex if ( rem$ field$ delim ) + \ Delimiter was found; handle field and exit + drop 2swap set-rem$ ( field$ ) + evaluate + [char] ] parse-1 if [char] ] is adr-delim else + [char] , parse-1 if [char] , is adr-delim then then + exit ( ?? ) + then ( field$ ) + 0 0 set-rem$ ( field$ ) + cbuf place ( ) + " " cbuf $cat ( ) + else ( ) + 0 cbuf c! ( ) + then ( ) + [char] ` parse cbuf $cat ( ) + cbuf count evaluate ( ??' ) + + fix-parse-buffer +; +: get-whatever ( -- [ value ] adt-code ) + get-field 0= if adt-empty exit then ( field$ ) + dup if ( field$ ) + 2dup $asm-find if ( field$ xt ) + execute 2nip ( n adt-code) + dup adt? 0= if parse-error then + else ( field$ field$ ) + get-based-number if parse-error then ( field$ n ) + adt-immed 2nip ( n adt-code ) + then ( n adt-code ) + else ( null$ ) + \ Empty string, is this delimiter only? + 2drop adr-delim case ( delim ) + ascii # of ( ) + \ Immediate value. + \ Now we have a slight problem with the current get-field; the + \ delimiter # is acceptable within the number string, e.g., + \ h#0ff0, and other delimiters are allowed after the number, + \ e.g., #h#0ff0]! is legitimate in load and store instructions. + \ Until I figure a nicer hack for get-field, we'll handle the + \ problem by hand here, using get-number above. + get-number adt-immed ( value adt-code ) + endof ( value adt-code ) + ascii * of ( value adt-code ) + \ Value from Stack + dup adt? 0= if adt-immed then + endof ( value adt-code ) + ascii ` of + \ In-line Forth commands, terminated by another ` + execute-inline ( ?? ) + dup adt? 0= if adt-immed then + endof + ( delim ) + \ A no action (here, at least) delimiter, pass it back. + adt-delimiter over + endcase ( value adt-code ) + then ( value adt-code ) +; + +: get-this ( adt-x msk pos -- ) + >r >r >r get-whatever ( value adt-code R: pos msk adt-x ) + dup r> <> swap adt-immed <> and " immediate" ?expecting + ( val R: pos msk ) + r> invert over land if " Value exceeds field size" ad-error then + r> set-field +; + +: ?register ( adt -- ) adt-reg <> " register" ?expecting ; + +: get-immediate ( -- n ) + get-whatever adt-immed <> " immediate" ?expecting +; + +: get-register ( -- reg ) + require-field + dup if ( field$ ) + $asm-execute ?register ( reg ) + else ( null$ ) + 2drop ( ) + adr-delim ascii * <> " register" ?expecting ( reg [ adt-reg ] ) + ascii , parse-1 drop ( reg [ adt-reg ] ) + dup adt-reg = if drop then ( reg ) + dup fffffff0 land if " Invalid register number: " range-error then + then ( reg ) +; + +: get-rn ( bit# -- ) get-register swap set-field ; +: get-r00 ( -- ) 0 get-rn ; +: get-r08 ( -- ) 8 get-rn ; +: get-r12 ( -- ) d# 12 get-rn ; +: get-r16 ( -- ) d# 16 get-rn ; + +: expecting-reg/immed ( -- ) " register or immediate" expecting ; +: get-shiftr# ( -- ) + \ Back over a real delimiter, then get the next thing. + backover-delim get-whatever case + adt-reg of 8 set-field 0000.0010 iop endof + adt-immed of 6 ?#bits 7 set-field endof + expecting-reg/immed + endcase +; + +: get-shift# ( -- ) + backover-delim get-immediate 6 ?#bits 7 set-field +; + +: expecting-shift ( -- ) " shift specifier" expecting ; +: get-shiftop ( -- ) + require-field ( field$ ) + \ We have something, check it out. + $asm-execute case + adt-shift of iop get-shiftr# endof + adt-rrx of iop endof + expecting-shift + endcase +; + +: get-shiftop2 ( -- ) + get-whatever case + adt-empty of endof + adt-shift of iop get-shiftr# endof + adt-rrx of iop endof + expecting-shift + endcase +; + +: get-shiftls ( -- ) + get-whatever case + adt-shift of iop get-shift# endof + adt-rrx of iop endof + expecting-shift + endcase +; + +: set-i ( -- ) 0200.0000 iop ; +: p? ( -- flag ) newword 0100.000 land 0<> ; +: flip-u ( -- ) 0080.0000 xop ; +: flip-b ( -- ) 0040.0000 xop ; +: flip-w ( -- ) 0020.0000 xop ; + +: get-opr2 ( -- ? ) + adr-delim ascii , = if 0 is adr-delim then + backover-delim get-whatever case + adt-reg of iop adr-delim ascii , = if get-shiftop2 then endof + adt-immed of set-i do-#32 endof + expecting-reg/immed + endcase +; + + +: >offset ( to from -- offset ) 8 + - ; + +: >br-offset ( to from -- masked-offset ) + >offset 2 >>a + dup -0080.0000 007f.ffff between + 0= abort" Branch displacement out of 24-bit range" + 00ffffff land +; +: amode-bbl ( b-adr -- ) + init-operands +[ifdef] testing + get-whatever drop aoffset +[else] + get-immediate here +[then] + >br-offset iop + !op +; + +: amode-bx ( -- ) init-operands get-r00 !op ; + +: ?psr ( adt -- ) adt-xpsr <> " [cs]psr" ?expecting ; + +: amode-mrs ( -- ) init-operands get-r12 get-whatever ?psr iop !op ; + +: amode-msr ( -- ) + init-operands + + \ get xpsr and fields + require-field $asm-execute ?psr iop ( ) + + \ Get any _X PSR subfields + begin adr-delim ascii _ = while + \ Get the field following the _ and back over the _. + require-field -1 /rem ( field$ ) + $asm-execute adt-psrfld <> " PSR-field" ?expecting ( psr-field ) + iop ( ) + repeat ( ) + + \ get r-or-imed, if imed, field = 8 or error. + \ Get the next field which we expect to be rx, or #num. + require-field adr-delim case ( field$ delim ) + ascii * of \ Take the address from the stack ( n adt-code field$ ) + 2drop do-#32 newword fff0ffff land 02080000 or is newword + endof + + ascii # of ( field$ ) + \ Immediate address, the field should be empty and the real + \ field is the next one. + \ get an immediate field, the default is _f = 8, + newword fff0ffff land 02080000 or is newword + endof + + 0 of \ This should be a register. ( field$ ) + $asm-execute ?register xop ( ) + + \ If no field bits are set, use the default _cf + 000f0000 newword and 0= if 0009.0000 xop then + + \ There should be nothing left on the parse string. + rem-len if " Extra characters" ad-error then + endof + + expecting-reg/immed + endcase + !op +; + +: (amode-mul) ( -- ) init-operands get-r16 get-r00 get-r08 ; +: amode-mul ( -- ) (amode-mul) !op ; +: amode-mla ( -- ) (amode-mul) get-r12 !op ; +: amode-lmul ( -- ) init-operands get-r12 get-r16 get-r00 get-r08 !op ; +: amode-rrop2 ( -- ) init-operands get-r12 get-r16 get-opr2 !op ; +: amode-rnop2 ( -- ) init-operands get-r16 get-opr2 !op ; +: amode-rdop2 ( -- ) init-operands get-r12 get-opr2 !op ; + +: amode-lsm ( -- ) + init-operands + get-r16 ( ) + adr-delim ascii ! = if ( ) + flip-w ( ) + require-field " ," ?expecting drop ( ) + then ( ) + + \ There should be a comma on the end of the register. + adr-delim ascii , <> " ," ?expecting + + \ The next thing up should be an open brace for the register list. + get-whatever adt-delimiter <> " {" ?expecting + ascii { <> " {" ?expecting + + begin adr-delim ascii } <> while + get-whatever case ( value adt ) + + adt-reg of ( reg ) + \ Check the delimiter for - meaning a range. + adr-delim ascii - = if ( reg1 ) + get-whatever ?register ( reg1 reg2 ) + 1+ swap ?do 1 i set-field loop ( ) + else ( reg ) + \ Simple register, set its bit. + 1 swap set-field + then + endof + + " register or }" expecting + endcase + repeat + + \ We've finished the register list, is there a ^ hanging on the end? + ascii ^ parse-1 if flip-b then + + !op +; + +\ rd, [rn, <immed12>] {!} +\ rd, [rn, +-rm] {!} +\ rd, [rn, +-rm, <shift>] {!} +\ rd, [rn], <immed12> +\ rd, [rn], +-rm +\ rd, [rn], +-rm, <shift> +\ The first 3 can be followed by "!" unless the opcode has a "t" at the end +\ The {!} is handled by amode-lsr + +: get-off12 ( -- ) + get-whatever case + adt-delimiter of + case + ascii + of endof \ Redundant but there. + ascii - of flip-u endof \ Clear the add bit, I[23]=0. + ascii ] of endof \ Can this happen? + " Unexpected delimiter in address" ad-error + endcase + \ Process the rest of the address, which should be a register plus?. + set-i get-r00 adr-delim ascii ] <> if get-shiftls then + endof + + adt-immed of + \ If the value is negative, switch things around. + dup 0< if negate flip-u then + d# 12 ?#bits iop + \ Check for terminating ] as needed ( if I[24]=1 ). + newword 0100.0000 land if + adr-delim ascii ] <> " ] " ?expecting + then + endof + + adt-reg of + iop set-i adr-delim ascii , = if get-shiftls then + endof + + expecting-reg/immed + endcase +; + +defer do-offset +: get-ea ( do-offset-xt -- ) + is do-offset + +\ adr-delim ascii [ = if exit then + + 0100.0000 iop \ Assume pre-indexing + + require-field dup if ( adr len ) + ['] arm-assembler $vfind if execute exit then ( adr len ) + " address specifier" expecting + then ( adr 0 ) + 2drop ( ) + + adr-delim ascii [ <> " [" ?expecting + 0 is adr-delim + + get-r16 + adr-delim ascii ] = if \ [rn] + \ Look for a comma after the close bracket. + ascii , parse-1 if \ [rn], <immed> + 0100.0000 xop do-offset + then + else \ [rn, ... + do-offset + then +; + +: (amode-ls) ( -- ) + \ The default case is to add to the base register, which is I[23]=1. + \ If we have a negative offset we clear the appropriate bits later. + 0080.0000 iop + + get-r12 ['] get-off12 get-ea +; +: amode-lst ( -- ) init-operands (amode-ls) !op ; + +: {!} ( -- ) ascii ! parse-1 if flip-w then ; + +: amode-lsr ( -- ) init-operands (amode-ls) {!} !op ; + +: get-off8 ( -- ) + \ Get the offset for [ldr|str][h\sh\sb] instructions. + get-whatever case + adt-delimiter of + case + ascii + of flip-b get-r00 endof + ascii - of flip-u flip-b get-r00 endof + " +, -, or number" expecting + endcase + endof + + adt-immed of + \ If the value is negative, switch things around. + dup 0< if negate flip-u then + 8 ?#bits dup f0 land 4 set-field 0f land iop + endof + + adt-reg of xop flip-b endof + + expecting-reg/immed + endcase + p? if {!} then +; + +\ rd, [rn, <immed8>] {!} +\ rd, [rn, +-rm] {!} +\ rd, [rn], <immed8> +\ rd, [rn], +-rm + +: amode-lssh ( -- ) + init-operands + \ Set the add offset and immediate value as defaults. + 00c0.0000 iop + get-r12 ['] get-off8 get-ea + !op +; + +: amode-imed24 ( -- ) + init-operands get-immediate d# 24 ?#bits iop !op +; + +: get-off0 ( -- ) " Offset not allowed" ad-error ; +: amode-swp ( -- ) + init-operands get-r12 get-r00 ['] get-off0 get-ea !op +; + +: amode-copr ( -- ) \ Co-processors: mcr, mrc + \ p, #, r, c, c, # + init-operands + adt-coproc 0f 08 get-this + adt-immed 07 15 get-this + adt-reg 0f 0c get-this + adt-coreg 0f 10 get-this + adt-coreg 0f 00 get-this + adt-immed 07 05 get-this + !op +; + +: amode-cdp ( -- ) \ Co-processors: cdp + \ p, #, c, c, c, # + init-operands + adt-coproc 0f 08 get-this + adt-immed 0f 14 get-this + adt-coreg 0f 0c get-this + adt-coreg 0f 10 get-this + adt-coreg 0f 00 get-this + adt-immed 07 05 get-this + !op +; + +\ Get the offset for ldc, stc instructions. +: get-off-c ( -- ) + get-immediate + \ If the value is negative, negate value, otherwise set add. + dup 0< if negate else flip-u then + dup 3 and if " Unaligned offset" ad-error then + 2 rshift 8 ?#bits iop + p? if {!} else flip-w then +; + +: amode-lsc ( -- ) \ Co-processors: ldc, stc + init-operands + adt-coproc 0f 08 get-this + adt-coreg 0f 0c get-this + ['] get-off-c get-ea + !op +; + +\ ---------------- + +: next-2? ( -- $ true | false ) + rem-len 2 < if + false ( false ) + else ( ) + rem-adr 2 true 2 /rem 0 is adr-delim + then +; + +\ This word looks for [|b] on swp commands. +: {b} ( -- ) ascii b parse-1 if flip-b then ; + +\ If the s flag is found, set bit 20 for alu commmands. +: {s} ( -- ) ascii s parse-1 if 0010.0000 iop then ; + +: {hbt} ( -- ) + ascii h parse-1 if 0400.00b0 xop amode-lssh exit then + ascii b parse-1 if flip-b then + ascii t parse-1 if flip-w amode-lst exit then + amode-lsr +; +: {shbt} ( -- ) + ascii s parse-1 if + ascii b parse-1 if 0400.00d0 xop else + ascii h parse-1 if 0400.00f0 xop else " b or h" expecting then then + amode-lssh + else + {hbt} + then +; + +: parse-condition? ( -- cond true | false ) + \ The next two characters of the input string will be checked for a + \ valid condition code. If found, the appropriate code will be + \ left on the stack between the updated string pair and true (TOS). + \ If not, The original string pair and false will be left on the stack. + next-2? if + \ Correct conditions get an even result from sindex. + " eqnecsccmiplvsvchilsgeltgtleal00eqnehslo" sindex dup 1 and if + drop -2 /rem false + else ( index ) + 2/ h# f land true + then + else + false + then +; + +: {cond} ( opcode -- ) + is newword + \ The next two characters of the input string will be checked for a + \ valid condition code. If found, the appropriate code will be + \ inserted in newword and the string pointer / length will be + \ updated. If not, the code for always will be inserted in newword + \ and the string pair will be unchanged. + parse-condition? 0= if h# e then + d# 28 set-field \ put the condition code in. +; +: {cond/s} ( opcode -- ) {cond} {s} ; + +: parse-inc ( l-flag -- ) + \ Parse the increment tag for ldm and stm. There MUST be a two letter + \ code to specify the increment option so we bail if we don't get one + \ of the eight possible codes. l-flag true specifies ldm, vice stm. + 0= >r next-2? 0= " increment specifier" ?expecting + + \ Correct tags have an even index from sindex. + " daiadbibfafdeaed" sindex dup 1 land " increment specifier" ?expecting + + \ If we have an alternative code and stm, invert the bits. + dup 8 land r> land if 6 xor then + + 6 land d# 22 lshift xop +; + +: ?match ( #chars -- false | xt true ) + rem-len over < if drop false exit then ( #chars ) + rem-adr over ['] arm-assembler search-wordlist if ( #chars xt ) + swap /rem true ( xt true ) + else ( #chars ) + drop false ( false ) + then +; +: $arm-assem-do-undefined ( adr len -- ) + \ Get the next string on the input stream, copy it and make it lower case. + set-parse rem$ lower ( ) + + 5 ?match if execute exit then + 3 ?match if execute exit then + + \ Don't try a 2-character match if the string length is 3, because, + \ for example, "blt" (i.e. b{lt}) would then match "bl" instead of "b". + rem-len 3 <> if 2 ?match if execute then then + + 1 ?match if execute exit then + + rem$ $interpret-do-undefined +; +: $assemble ( adr len -- ) + dup 0= if 2drop exit then + +\ ['] directives $vfind if execute exit then ( adr len ) + + $arm-assem-do-undefined +; + +: resident ( -- ) +\ little-endian +\ aligning? on + [ also forth ] ['] here [ previous ] is here + [ also forth ] ['] allot [ previous ] is asm-allot + [ also forth ] ['] le-l@ [ previous ] is asm@ + [ also forth ] ['] instruction! [ previous ] is asm! +[ifdef] set-relocation-bit + ['] set-relocation-bit is asm-set-relocation-bit +[else] + ['] noop is asm-set-relocation-bit +[then] +; +resident + +headers +also arm-assembler definitions +\ also register-names definitions +: lsl ( -- n1 n2 ) 00000000 adt-shift ; +: lsr ( -- n1 n2 ) 00000020 adt-shift ; +: asr ( -- n1 n2 ) 00000040 adt-shift ; +: ror ( -- n1 n2 ) 00000060 adt-shift ; +: rrx ( -- n1 n2 ) 00000060 adt-rrx ; + +: spsr ( -- n1 n2 ) 00400000 adt-xpsr ; +: cpsr ( -- n1 n2 ) 00000000 adt-xpsr ; + +psrs: _c _x _cx _s _cs _xs _cxs _f _cf _xf _cxf _sf _csf _xsf _cxsf +1 psr: _ctl +8 psr: _flg +9 psr: _all + +coprocs: p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 +coregs: cr0 cr1 cr2 cr3 cr4 cr5 cr6 cr7 cr8 cr9 cr10 cr11 cr12 cr13 cr14 cr15 +regs: r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 + +previous definitions + +also arm-assembler definitions +: and 0000.0000 {cond/s} amode-rrop2 ; +: eor 0020.0000 {cond/s} amode-rrop2 ; +: sub 0040.0000 {cond/s} amode-rrop2 ; +: rsb 0060.0000 {cond/s} amode-rrop2 ; +: add 0080.0000 {cond/s} amode-rrop2 ; +: adc 00a0.0000 {cond/s} amode-rrop2 ; +: sbc 00c0.0000 {cond/s} amode-rrop2 ; +: rsc 00e0.0000 {cond/s} amode-rrop2 ; +: orr 0180.0000 {cond/s} amode-rrop2 ; +: bic 01c0.0000 {cond/s} amode-rrop2 ; + +: mov 01a0.0000 {cond/s} amode-rdop2 ; +: mvn 01e0.0000 {cond/s} amode-rdop2 ; + +: mul 0000.0090 {cond/s} amode-mul ; +: mla 0020.0090 {cond/s} amode-mla ; +: umull 0080.0090 {cond/s} amode-lmul ; +: umlal 00a0.0090 {cond/s} amode-lmul ; +: smull 00c0.0090 {cond/s} amode-lmul ; +: smlal 00e0.0090 {cond/s} amode-lmul ; + +: tst 0110.0000 {cond} amode-rnop2 ; +: teq 0130.0000 {cond} amode-rnop2 ; +: cmp 0150.0000 {cond} amode-rnop2 ; +: cmn 0170.0000 {cond} amode-rnop2 ; + +: mrs 010f.0000 {cond} amode-mrs ; +: msr 0120.f000 {cond} amode-msr ; + +: ldc 0c10.0000 {cond} amode-lsc ; +: stc 0c00.0000 {cond} amode-lsc ; +: cdp 0e00.0000 {cond} amode-cdp ; +: mcr 0e00.0010 {cond} amode-copr ; +: mrc 0e10.0010 {cond} amode-copr ; + +: swi 0f00.0000 {cond} amode-imed24 ; + +: b 0a00.0000 {cond} amode-bbl ; +: bl 0b00.0000 {cond} amode-bbl ; + +: bx 012f.ff10 {cond} amode-bx ; + +: swp 0100.0090 {cond} {b} amode-swp ; + +: ldm 0810.0000 {cond} 1 parse-inc amode-lsm ; +: stm 0800.0000 {cond} 0 parse-inc amode-lsm ; + +: ldr ( -- ) 0410.0000 {cond} {shbt} ; +: str ( -- ) 0400.0000 {cond} {hbt} ; + +: rd-field ( reg# -- ) d# 12 set-field ; +: rb-field ( reg# -- ) d# 16 set-field ; + +\ XXX need ADR, SET +\ adr{cond} rN,<address> +: (set) ( address? -- ) + >r + 0000.0000 {cond} init-operands + \ Put the register number on the return stack so it won't interfere + \ with the stack items used by any "*" operands there may be. + get-register >r ( r: adr? reg# ) + get-immediate ( address r: adr? reg# ) + dup here >offset ( address offset r: adr? reg# ) + dup fits? if ( address offset r: adr? reg# ) + nip nip 028f.0000 ( op r: adr? reg# ) \ add rN,pc,#<offset> + else ( address offset r: adr? reg# ) + negate fits? if ( address r: adr? reg# ) + drop 024f.0000 ( op r: adr? reg# ) \ sub rN,pc,#<offset> + else ( address r: adr? reg# ) + ea00.0000 asm, ( address r: adr? reg# ) \ b here+8 + r> r@ swap >r if ( address r: adr? reg# ) + here asm-set-relocation-bit drop + then + asm, ( r: adr? reg# ) \ adr + 051f.000c ( op r: adr? reg# ) \ ldr rN,[pc,#-12] + then ( op r: adr? reg# ) + then ( op r: adr? reg# ) + iop r> rd-field ( ) + r> drop + !op +; +: adr ( -- ) true (set) ; +: set ( -- ) false (set) ; + +: nop ( -- ) h# e1a00000 asm, ; \ mov r0,r0 + +: # ( -- adt-immed ) adt-immed ; +: reg ( -- adt-reg ) adt-reg ; + +headerless +00 cond: = 00 cond: 0= +01 cond: <> 01 cond: 0<> +02 cond: u>= +03 cond: u< +04 cond: 0< +05 cond: 0>= +06 cond: vs +07 cond: vc +08 cond: u> +09 cond: u<= +0a cond: >= +0b cond: < +0c cond: > 0c cond: 0> +0d cond: <= 0d cond: 0<= +0e cond: always + +: -cond ( cond -- !cond ) 1000.0000 xor ; + +: put-branch ( target where -- ) tuck >br-offset ea00.0000 or swap asm! ; +: put-call ( target where -- ) tuck >br-offset eb00.0000 or swap asm! ; + +: brif ( target cond -- ) swap here >br-offset or 0a00.0000 or asm, ; + +\ These implementation factors are used by the local labels package +: <mark ( -- <mark ) here ; +: >mark ( -- >mark ) here ; +: >resolve ( >mark -- ) here over >br-offset over asm@ + swap asm! ; +: <resolve ( <mark -- <mark ) ; + +headers +: but ( mark1 mark2 -- mark2 mark1 ) swap ; +: yet ( mark -- mark mark ) dup ; + +: ahead ( -- >mark ) >mark here 8 + always brif ; +: if ( cond -- >mark ) >mark here 8 + rot -cond brif ; +: then ( >mark -- ) >resolve ; +: else ( >mark -- >mark1 ) ahead but then ; +: begin ( -- <mark ) <mark ; +: until ( <mark cond -- ) -cond brif ; +: again ( <mark -- ) always brif ; +: repeat ( >mark <mark -- ) again then ; +: while ( <mark cond -- >mark <mark ) if but ; + +\ previous definitions + +previous definitions + +[ifdef] testing +0 value expected + +order +also forth definitions +: test ( "address" "expected" "assembly-code" -- ) + parse-word $number abort" bad address" is aoffset + parse-word $number abort" bad code" is expected + parse-word $assemble newword expected <> if + ." oops!! expected " expected .x ." got " newword .x cr + else + ." ." + then +; + +: testloop clear begin refill while test +depth abort" Stack trash" +repeat ; +previous definitions +[then] +previous previous definitions + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/assem.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/basefw.bth =================================================================== --- cpu/arm/basefw.bth (rev 0) +++ cpu/arm/basefw.bth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,107 @@ +purpose: Load file for base firmware - no platform specifics +\ See license at end of file + +dictionary: ${BP}/cpu/arm/build/tools.dic +command: &armforth &dictionary &this +build-now + +\ ' $report-name is include-hook + +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 +\ : cfill fill ; + +fload ${BP}/cpu/arm/scc.fth \ System Control Coprocessor registers +fload ${BP}/cpu/arm/traps.fth \ Exception handlers +fload ${BP}/cpu/arm/psr.fth \ Special registers +fload ${BP}/cpu/arm/getms.fth \ Timer access + +fload ${BP}/cpu/arm/centry.fth \ Low-level client entry and exit +fload ${BP}/cpu/arm/fb8-ops.fth \ 8-bit frame buffer primitives + +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/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}/cpu/arm/forthint.fth \ Alarm handler + +fload ${BP}/cpu/arm/regacc.fth \ Register access words + +fload ${BP}/cpu/arm/memtest.fth \ Memory test primitives + +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 + +fload ${BP}/cpu/arm/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] + +[ifndef] no-heads +.( --- Saving basefw.dic --- ) cr " basefw.dic" $save-forth +[then] + +\ LICENSE_BEGIN +\ Copyright (c) 1994 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
Property changes on: cpu/arm/basefw.bth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/bitops.fth =================================================================== --- cpu/arm/bitops.fth (rev 0) +++ cpu/arm/bitops.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,57 @@ +purpose: Bit operations +\ See license at end of file + +hex +code bitset ( bit# array -- ) + mov r0,tos \ r0 array + ldmia sp!,{r1,tos} \ r1 bit# + and r2,r1,#7 + mov r3,#0x80 + ldrb r4,[r0,r1,asr #3] + orr r4,r4,r3,ror r2 + strb r4,[r0,r1,asr #3] +c; + +code bitclear ( bit# array -- ) + mov r0,tos \ r0 array + ldmia sp!,{r1,tos} \ r1 bit# + and r2,r1,#7 + mvn r3,#0x80 + ldrb r4,[r0,r1,asr #3] + and r4,r4,r3,ror r2 + strb r4,[r0,r1,asr #3] +c; + +code bittest ( bit# array -- flag ) + pop r1,sp \ r1 bit# + and r2,r1,#7 + mov r3,#0x80 + ldrb r4,[tos,r1,asr #3] + ands r4,r4,r3,ror r2 + mvnne tos,#0 + moveq tos,#0 +c; + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/bitops.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/boot.fth =================================================================== --- cpu/arm/boot.fth (rev 0) +++ cpu/arm/boot.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,124 @@ +\ Contents: Boot-code for ARM Risc_OS Code +\ See license at end of file + +hex +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 + +0 constant main-task \ This pointer will be changed at boot + +code start-forth ( r6: header r7: syscall-vec r8: memtop ) + ( r10: argc r11: argv r12: initial-heap-size ) + \ Binary relocation. This code reads the relocation bitmap and + \ relocates each longword marked by a 1 bit in the bitmap. Each + \ bit in the bitmap represents an aligned address in the program + \ image, thus there is one relocation bit for each 32-bit word in + \ the program image. The bits in relocation bitmap are numbered + \ in big-endian order. + \ The 0x80 bit corresponds to a lower address than then 0x40 bit, etc. + add r0,r6,#0x80 \ forth-image + ldr r1,[r0,#0x10] \ /dictionary + ldr r3,[r0,#0x14] \ old origin + mov r2,r1,asr #2 \ words to relocate + add r1,r0,r1 \ dictionary size plus forth-image + cmp r3,r0 + <> if + dec r2,#1 + \ variables: + \ r0: The startof the program image + \ r1: The ending address of the program image, + \ equal to the starting address of the relocation bitmap + \ r2: bit-to-relocate + \ r3: origin at saving time + + begin + and r4,r2,#7 + mov r5,#0x80 + mov r4,r5,lsr r4 + ldrb r5,[r1,r2,asr #3] + ands r4,r4,r5 + 0<> if + ldr r4,[r0,r2,lsl #2] + sub r4,r4,r3 + add r4,r4,r0 + str r4,[r0,r2,lsl #2] + then + subs r2,r2,#1 + <= until + then + + \ set user-pointer up + + add up,r0,`init-user-area #` \ set user-pointer + str r1,'user dp \ set here + + str r8,'user memtop + sub sp,r8,#0x40 + \ Now the stacks are just below the end of our memory + + ps-size-t rs-size-t + # + sub r8,r8,* + sub r8,r8,r12 + str r8,'user limit + + str r7,'user syscall-vec + str r10,'user #args + str r11,'user args + + \ At this point, the stack pointer is at the top of the unused + \ memory and the user pointer has been set to the bottom of the + \ initial user area image. + str up,'user up0 + str up,[pc,`'body main-task swap here 8 + - swap`] + mov rp,sp \ set return-stack pointer + str rp,'user rp0 + rs-size-t 100 + # + dec sp,* + dec sp,#0x20 + str sp,'user sp0 + inc sp,1cell \ account for the top of stack register + adr ip,'body cold +c; + +code cold-code ( r0: loadaddr r1: functions r2: memtop ... ) + ( r3: argc sp[0]: argv ) + here-t 8 put-call + + \ Put the arguments in safe registers + mov r6,r0 \ r6 points to header + mov r7,r1 \ r7: functions + mov r8,r2 \ r8: memtop + \ r9 is up + mov r10,r3 \ r10: argc + ldr r11,[sp] \ r11: argv + mov r12,#0 \ r11: initial-heap-size + + b 'code start-forth +end-code + +: init-user ; + +\ LICENSE_BEGIN +\ Copyright (c) 2006 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/boot.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/build/Makefile =================================================================== --- cpu/arm/build/Makefile (rev 0) +++ cpu/arm/build/Makefile 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,27 @@ +OS := $(shell uname) + +all: basefw.dic + +.PHONY: FORCE all clean + +.PRECIOUS: builder.dic + +../${OS}/forth: + @make -C ../${OS} forth + +build: ../${OS}/forth + @ln -sf ../${OS}/forth $@ + +%.dic: FORCE build + ./build $@ + +builder.dic: FORCE build + -[ ! -f builder.sav ] && cp builder.dic builder.sav + ./build builder.dic + +inflate.bin: + make -C ../${OS} ../build/inflate.bin + +# Don't use *.dic so as not to remove builder.dic +clean: + rm -f tools.dic kernel.dic basefw.dic *.log headers *~ inflate.bin build
Property changes on: cpu/arm/build/Makefile ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/builder.bth =================================================================== --- cpu/arm/builder.bth (rev 0) +++ cpu/arm/builder.bth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,10 @@ +purpose: Load file for i386 builder + +dictionary: ${BP}/cpu/arm/build/tools.dic +command: &armforth &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
Property changes on: cpu/arm/builder.bth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/call.fth =================================================================== --- cpu/arm/call.fth (rev 0) +++ cpu/arm/call.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,50 @@ +purpose: From Forth, call the C subroutine whose address is on the stack +\ See license at end of file + +code sp-call ( [ arg5 .. arg0 ] adr sp -- [ arg5 .. arg0 ] result ) + pop r6,sp \ Get the subroutine address + + str sp,'user saved-sp \ Save for callbacks + psh ip,rp \ ARM Procedure Call Standard can clobber IP + str rp,'user saved-rp \ Save for callbacks + + mov rp,#0 \ Set the frame pointer to null + + \ Pass up to 6 arguments + ldmia sp,{r0,r1,r2,r3,r4,r5} + + mov sp,tos \ Switch to the new stack + + mov lk,pc \ Set link register to return address + mov pc,r6 \ Call the subroutine + + ldr rp,'user saved-rp \ Restore the return stack pointer + pop ip,rp \ Restore IP + ldr sp,'user saved-sp \ Restore the stack pointer + mov tos,r0 \ Return subroutine result +c; +: call ( [ arg5 .. arg0 ] adr -- [ arg5 .. arg0 ] result ) sp@ sp-call ; + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/call.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/centry.fth =================================================================== --- cpu/arm/centry.fth (rev 0) +++ cpu/arm/centry.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,75 @@ +purpose: Client interface handler code +\ See license at end of file + +d# 11 /n* buffer: cif-reg-save + +headerless +code cif-return + mov r0,tos + ldr r1,'user cif-reg-save \ Address of register save area in r1 + ldmia r1,{r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,pc} \ Restore registers +end-code + +: cif-exec ( args ... -- ) do-cif cif-return ; + +headers +: cif-caller ( -- adr ) cif-reg-save d# 84 + @ ; + +headerless +label cif-handler + \ Registers: + \ r0 argument array pointer + \ r4-r14 must be preserved + \ r1-r3 scratch + + + adr r2,'body main-task + ldr r2,[r2] \ Get user pointer + ldr r1,[r2,`'user# cif-reg-save`] \ Address of register save area in r1 + stmia r1,{r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14} \ Save registers + + mov up,r2 \ Set user pointer + + mov tos,r0 \ Set top of stack register to arg + + ldr rp,'user rp0 \ Set return stack pointer + ldr sp,'user sp0 \ Set data stack pointer + inc sp,1cell \ Account for the top of stack register + + adr ip,'body cif-exec \ Set interpreter pointer +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) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/centry.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/code.fth =================================================================== --- cpu/arm/code.fth (rev 0) +++ cpu/arm/code.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,160 @@ +purpose: Defining words for code definitions +\ See license at end of file + +\ These words are specific to the virtual machine implementation +: assembler ( -- ) arm-assembler ; + +only forth also arm-assembler also helpers also arm-assembler also definitions + +\ Forth Virtual Machine registers + +\ also register-names definitions +\ Convenient register names for portable programming +: base r7 ; +: up r9 ; +: tos r10 ; +: rp r11 ; +: ip r12 ; +: sp r13 ; +: lk r14 ; +: lr r14 ; +: pc r15 ; +\ previous definitions + +\ also constant-names definitions +\ also register-names definitions + +: asm-con: ( n "name" -- ) create , does> @ adt-immed ; +/n asm-con: 1cell \ Offsets into the stack +1cell drop -1 * asm-con: -1cell +1cell drop -1 * asm-con: ~1cell +1cell drop 2 * asm-con: 2cells +1cell drop 3 * asm-con: 3cells +1cell drop 4 * asm-con: 4cells + +1cell drop asm-con: /cf \ Size of a code field (except for "create") +/cf drop -1 * asm-con: -/cf +/cf drop -1 * asm-con: ~/cf + +1cell drop asm-con: /token \ Size of a compiled word reference +/token drop -1 * asm-con: -/token +/token drop -1 * asm-con: ~/token + +1cell drop asm-con: /branch \ Size of a branch offset + +/token drop 2 * asm-con: /ccf \ Size of a "create" code field + +/cf drop 1cell drop + asm-con: /cf+1cell \ Location of second half of +previous definitions + +\ The next few words are already in the forth vocabulary; +\ we want them in the assembler vocabulary too +alias next next +headerless +: exitcode ( -- ) + ['] $interpret-do-undefined is $do-undefined + previous +; +' exitcode is do-exitcode +headers +alias c; c; + +: set-offset ( offset -- ) d# 12 ?#bits iop ; +: 'body ( "name" -- variable-apf adt-immed ) ' >body adt-immed ; +: 'code ( "name" -- code-word-acf adt-immed ) ' adt-immed ; +: 'user# ( "name" -- user# adt-immed ) ' >body @ adt-immed ; +: 'user ( "name" -- ) +\ [ also register-names ] up [ previous ] drop ( reg# ) + up drop rb-field + 'user# ( value adt-immed ) + drop set-offset +; +\ lnk{cond}{s} rN +\ is equivalent to +\ mov{cond} rN,lk +: lnk ( -- ) +\ [ also register-names ] lk [ previous ] drop ( reg# ) + lk drop ( reg# ) + 01a0.0000 or {cond/s} init-operands get-r12 !op +; + +: (incdec) ( op-template -- ) + {cond/s} + init-operands + get-register dup rd-field rb-field + get-opr2 + !op +; + +\ inc{cond}{s} rN,<immed> +\ is equivalent to +\ add{cond}{s} rN,rN,<immed> +: inc ( -- ) 0080.0000 (incdec) ; + +\ dec{cond}{s} rN,<immed> +\ is equivalent to +\ sub{cond}{s} rN,rN,<immed> +: dec ( -- ) 0040.0000 (incdec) ; + +: (pshpop) ( op-template -- ) {cond} init-operands get-r12 get-r16 !op ; +\ psh{cond} rN,rM +\ is equivalent to +\ str{cond} rN,[rM,-1cell]! +: psh ( -- ) 0520.0004 (pshpop) ; + +\ pop{cond} rN,rM +\ is equivalent to +\ ldr{cond} rN,[rM],1cell +: pop ( -- ) 0490.0004 (pshpop) ; + +\ nxt{cond} +\ is equivalent to +\ mov{cond} pc,up +: nxt ( -- ) +\ [ also register-names ] up [ previous ] drop ( reg# ) + up drop + 01a0.f000 or {cond/s} init-operands !op +; + +also forth definitions +headerless +: entercode ( -- ) + also assembler +\ false is disassembling? + [ also helpers ] + ['] $arm-assem-do-undefined is $do-undefined + [ 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) 2006 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/code.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/cpubpsup.fth =================================================================== --- cpu/arm/cpubpsup.fth (rev 0) +++ cpu/arm/cpubpsup.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,87 @@ +purpose: Processor-dependent definitions for breakpoints on ARM +\ See license at end of file + +\ Machine-dependent definitions for breakpoints + +headerless +defer breakpoint-trap? + +\ True if the exception was an undefined instruction +: (breakpoint-trap? ( -- flag ) exception-psr h# 1f and h# 1b = ; +' (breakpoint-trap? 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! ; + +headers +: .instruction ( -- ) + pc [ also disassembler ] dis-pc! dis1 [ previous ] +; + +headerless +\ Find the places to set the next breakpoint for single stepping. + +\ Flag is true if the branch should be followed - we don't follow branches +\ if stepping? is false and the instruction is a "bl" +: >b-target ( pc -- adr ) dup l@ 8 << 6 >>a + 8 + ; +: bl? ( pc -- flag ) l@ h# 0f00.0000 and h# 0b00.0000 = ; +: b? ( pc -- flag ) l@ h# 0e00.0000 and h# 0a00.0000 = ; + +: next-instruction ( stepping? -- next-adr branch-target|0 ) + pc la1+ swap ( next-adr stepping? ) + + \ If we are hopping (not stepping), then we don't follow + \ branch-and-link instructions. + 0= pc bl? and if 0 exit then ( next-adr ) + + pc ( next-adr pc ) + dup b? if >b-target exit then ( next-adr pc ) + dup bl? if >b-target exit then ( next-adr pc ) +\ XXX need to handle all sorts of instructions with PC as the destination + drop 0 +; + +: bumppc ( -- ) pc la1+ to pc ; + +alias rpc pc + +: return-adr ( -- adr ) r11 l@ ; +: leaf-return-adr ( -- adr ) lr ; + +: backward-branch? ( adr -- flag ) \ True if adr points to a backward branch + dup b? if dup >b-target u> exit then ( adr ) + drop false +; +: loop-exit-adr ( -- adr ) + pc begin dup backward-branch? 0= while la1+ repeat la1+ +; + +headers +: set-pc ( adr -- ) to pc ; + +\ LICENSE_BEGIN +\ Copyright (c) 1994 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
Property changes on: cpu/arm/cpubpsup.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/cpustate.fth =================================================================== --- cpu/arm/cpustate.fth (rev 0) +++ cpu/arm/cpustate.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,42 @@ +purpose: Buffers for saving program state +\ See license at end of file + +headers +\ A place to save the CPU registers when we take a trap +0 value cpu-state \ Pointer to CPU state save area + +headerless +: >state ( offset -- adr ) cpu-state + ; + +\ Don't use buffer: for these because we may need to instantiate them +\ before the buffer: mechanism has been initialized. +0 value pssave \ Forth data stack save area +0 value rssave \ Forth return stack save area + +headers +defer .exception \ Display the exception type +defer handle-breakpoint \ What to do after saving the state + +\ LICENSE_BEGIN +\ Copyright (c) 1985-1994 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
Property changes on: cpu/arm/cpustate.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/ctrace.fth =================================================================== --- cpu/arm/ctrace.fth (rev 0) +++ cpu/arm/ctrace.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,102 @@ +purpose: Displays a backtrace of saved C stack frames. +\ See license at end of file + +only forth also hidden also forth definitions +: 9.r ( adr -- ) push-hex 9 u.r pop-base ; +defer .subname ' 9.r is .subname + +: .subroutine ( lr -- ) \ Show soubroutine address + 4 - dup l@ h# 0f00.0000 and h# 0b00.0000 = if \ BAL instruction? + dup l@ 8 << 6 >>a + .subname exit + then + drop ." ??????" \ perhaps an indirect call +; +: .args ( -- ) \ Show C subroutine arguments + ." (" r0 9.r r1 9.r r2 9.r r3 9.r ." ... )" +; +: .c-call ( lr -- ) + ." Subroutine " dup l@ .subroutine ." called from " 4 - .subname cr +; +: ctrace ( -- ) \ C stack backtrace +\ XXX we should look at the first instruction in the subroutine +\ to determine whether it is using the FP or non-FP protocol. +\ Without an FP it will be rather tricky to find the saved PCs, but +\ at least we might be able to avoid going off into the ozone. + push-hex + ." PC at " pc .subname cr + ." Last leaf: " lr .subroutine .args cr + ." Call-chain:" cr + r11 begin ( frame-pointer ) + dup 0<> over in-return-stack? 0= and + while + >saved dup -1 l+ l@ .c-call + -3 la+ l@ ( next-fp ) + repeat + pop-base +; +\ compiler options: /swst or /noswst +\ Non-leaf: +\ Preamble +\ +0000 0x000080cc: 0xe1a0c00d .... : * mov r12,r13 +\ +0004 0x000080d0: 0xe92dd800 ..-. : stmdb r13!,{r11,r12,r14,pc} +\ +0008 0x000080d4: 0xe24cb004 ..L. : sub r11,r12,#4 +\ SW stack checking goes here if enabled +\ ... +\ +000c 0x000080d8: 0xeb000001 .... : bl foo +\ +0010 0x000080dc: 0xe3a00000 .... : mov r0,#0 +\ ... +\ Postamble +\ +0014 0x000080e0: 0xe91ba800 .... : ldmdb r11,{r11,r13,pc} + +\ The stack frame then looks like: +\ +\ (previous SP) ---> +\ &code after preamble (i.e. entry-adr + 0xc) +\ (new FP (r11))---> +\ return address +\ previous SP +\ previous FP +\ saved Rm +\ ... +\ saved Rn +\ (new SP (r13))---> + +\ Leaf: +\ foo +\ +0000 0x000080e4: 0xe1a0f00e .... : mov pc,r14 + + +\ compiler options: /nofp +\ main +\ +0000 0x000080cc: 0xe92d4000 .@-. : stmdb r13!,{r14} +\ +\ +0004 0x000080d0: 0xeb000001 .... : bl foo +\ +0008 0x000080d4: 0xe3a00000 .... : mov r0,#0 +\ +\ +000c 0x000080d8: 0xe8bd8000 .... : ldmia r13!,{pc} +\ foo +\ +0000 0x000080dc: 0xe1a0f00e .... : mov pc,r14 + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/ctrace.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/debugm.fth =================================================================== --- cpu/arm/debugm.fth (rev 0) +++ cpu/arm/debugm.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,86 @@ +purpose: Machine-dependent support routines for Forth debugger. +\ See license at end of file + +hex + +headerless +\ It doesn't matter what address this returns because it is only used +\ as an argument to slow-next and fast-next, which do nothing. +: 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 -- ) + +label normal-next + ldr pc,[ip],1cell +end-code + +label debnext + ldr r0,'user <ip + cmp ip,r0 + u>= if + ldr r0,'user ip> + cmp ip,r0 + u< if + ldr r0,'user cnt + inc r0,#1 + str r0,'user cnt + cmp r0,#2 + = if + mov r0,#0 + str r0,'user cnt + adr r0,'body normal-next + str r0,'user debug-next + ldr pc,'user 'debug + then + then + then + ldr pc,[ip],1cell +end-code + +\ Fix the next routine to use the debug version +: pnext ( -- ) + [ also arm-assembler ] + debnext up@ put-branch + [ previous ] +; + +\ Turn off debugging +: unbug ( -- ) normal-next @ up@ instruction! ; + +headers + +forth definitions +unbug + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/debugm.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/decompm.fth =================================================================== --- cpu/arm/decompm.fth (rev 0) +++ cpu/arm/decompm.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,48 @@ +purpose: Machine/implementation-dependent decompiler support +\ See license at end of file + +headerless + +only forth also hidden also definitions +: dictionary-base ( -- adr ) up@ user-size + ; + +\ 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 +; + +\ Decompiler extension for 32-bit literals +: .llit ( ip -- ip' ) ta1+ dup l@ n. la1+ ; +: skip-llit ( ip -- ip' ) ta1+ la1+ ; +' (llit) ' .llit ' skip-llit install-decomp + +only forth also definitions +headers + +\ LICENSE_BEGIN +\ Copyright (c) 1994 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
Property changes on: cpu/arm/decompm.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/disassem.fth =================================================================== --- cpu/arm/disassem.fth (rev 0) +++ cpu/arm/disassem.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,430 @@ +purpose: ARM disassembler - prefix syntax +\ See license at end of file + +vocabulary disassembler +also disassembler also definitions + +headerless + +variable instruction +variable end-found +variable display-offset 0 display-offset ! +headers +variable dis-pc +: (pc@ ( -- adr ) dis-pc @ ; +defer dis-pc@ ' (pc@ is dis-pc@ +: (pc! ( adr -- ) dis-pc ! ; +defer dis-pc! ' (pc! is dis-pc! +: pc@l@ ( -- opcode ) dis-pc @ l@ ; +headerless + +defer regs + +string-array (real-regs +," r0" ," r1" ," r2" ," r3" +," r4" ," r5" ," r6" ," r7" +," r8" ," r9" ," r10" ," r11" +," r12" ," r13" ," link" ," pc" +end-string-array +: real-regs ['] (real-regs is regs ; + +string-array (forth-regs +," r0" ," r1" ," r2" ," r3" +," r4" ," r5" ," r6" ," r7" +," r8" ," up" ," tos" ," rp" +," ip" ," sp" ," lr" ," pc" +end-string-array +: forth-regs ['] (forth-regs is regs ; +forth-regs + +: udis. ( n -- ) + push-hex + <# + u# u# u# u# u# u# u# u# + u#> type pop-base +; +' udis. is showaddr + +: +offset ( adr -- adr' ) display-offset @ - ; +: >mask ( #bits -- mask ) 1 swap << 1- ; +: bits ( right-bit #bits -- field ) + instruction @ rot >> ( #bits shifted-instruction ) + swap >mask and ( field ) +; +: 4bits ( right-bit -- field ) 4 bits ; +: bit? ( bit# -- f ) instruction @ 1 rot lshift and 0<> ; +\ Extracts an index from the field "bit# #bits", indexes into the string +\ "adr len", which is assumed to contain substrings of length /entry, +\ and types the indexed substring. +: .fld ( bit# #bits adr len /entry -- ) + >r drop >r ( bit# #bits r: /entry adr ) + bits ( index r: /entry adr ) + r> swap r@ * + r> ( adr' /entry ) + type +; + +\ Display formatting +variable start-column +: op-col ( -- ) start-column @ d# 8 + to-column ; + +: .reg ( bit# -- ) 4bits regs ". ; +: {<cond>} ( -- ) + d# 28 4bits d# 14 = if exit then + d# 28 4 " eqnecsccmiplvsvchilsgeltgtle nv" 2 .fld +; + +: ., ( -- ) ." , " ; +: .[ ( -- ) ." [" ; +: .] ( -- ) ." ]" ; + +: .rm ( -- ) 0 .reg ; +: .rs ( -- ) 8 .reg ; +: .rd, ( -- ) d# 12 .reg ., ; +: op.rd, ( -- ) op-col .rd, ; +: .rb ( -- ) d# 16 .reg ; +alias .rn .rb + +: .rm,shift ( -- ) + .rm + d# 4 8 bits if \ LSL #0 is no-shift; this isn't it + ., + 4 8 bits 6 = if ." rrx" exit then + 5 2 " lsllsrasrror" 3 .fld ." " + 4 bit? if .rs else ." #" 7 5 bits .d then + then +; + +: u.h ( n -- ) dup d# 9 u> if ." 0x" then (u.) type ; +: ror ( n cnt -- ) 2dup d# 32 swap - lshift -rot rshift or ; +: .imm ( -- ) 0 8 bits 8 4bits 2* ror u.h ; + +: ?.bit ( adr len bit# -- ) bit? if type else 2drop then ; + +d# 20 constant d#20 +d# 21 constant d#21 +d# 22 constant d#22 +d# 23 constant d#23 +d# 24 constant d#24 +d# 25 constant d#25 + +: {s} ( -- ) " s" d#20 ?.bit ; +: {!} ( -- ) " !" d#21 ?.bit ; +: {^} ( -- ) " ^" d#22 ?.bit ; +: {b} ( -- ) " b" d#22 ?.bit ; +: +/- ( -- ) d#23 bit? 0= if ." -" then ; + +: .r/imm ( -- ) + d#25 bit? if ." #" .imm else .rm,shift then +; +\ Indicates the form of the instruction that affects both PC and CPSR/SPSR +: {p} ( -- ) + d#23 2 bits 3 = if \ MOV class + d# 12 4bits h# f = if ." p" then \ Rd is PC + then +; +: .alu ( -- ) + d#21 4 " andeorsubrsbaddadcsbcrsctstteqcmpcmnorrmovbicmvn" 3 .fld + {<cond>} +; +: alu# ( -- n ) d#21 4bits ; +\ control instruction extension space +\ exceptions are encoded as tests with no setting of the condition codes +\ OOIo oooS Rn/b Rd Rs shft Rm +\ 00I1 0oo0 +\ BX{<cond>} Rm cond 0001 0010 SBO SBO SBO 0001 Rm +\ MSR{<cond>} xPSR, y cond 00x1 0R10 fsxc SBO yyyy yyyy yyyy +\ MRS{<cond>} Rd, xPSR cond 0001 0R00 SBO Rd SBZ + +: .psr ( -- ) d#22 bit? if ." s" else ." c" then ." psr" ; +: .fields ( -- ) + ." _" " cxsf" drop d# 16 4bits ( adr mask ) + 4 0 do dup 1 and if over i + c@ emit then 2/ loop + 2drop +; +: .mrs/sr ( -- ) + d#21 bit? if \ MSR + ." msr" {<cond>} + op-col .psr .fields ., .r/imm + else \ MRS + ." mrs" {<cond>} op.rd, .psr + then +; +: .special ( -- ) + instruction @ h# 026f.fff0 and h# 002f.ff10 = if + ." bx" {<cond>} op-col .rm + exit + then + .mrs/sr +; + +\ Arithmetic instruction extension space +: .alu-ext ( -- ) + d#23 bit? if \ 64-bit multiply + d#21 2 " umullumlalsmullsmlal" 5 .fld {<cond>} {s} + op-col .rn ., .rd, .rs ., .rm + else \ 32-bit multiply + d#21 2 " mulmla??????" 3 .fld {<cond>} {s} + op-col .rb ., .rm ., .rs + instruction @ h# 00200000 and if ., d# 12 .reg then + then +; +: w-bit ( -- flag ) d#21 bit? ; +: p-bit ( -- flag ) d#24 bit? ; + +\ LD/ST extension space +\ SWP{<cond>} Rd, Rm, [Rn] cond 0001 00ZZ Rn Rd SBZ 1001 Rm +\ LDR{<cond>}{H|SH|SB} Rd, Rm, [Rn] cond 000P UBW1 Rn Rd addr 1SH1 addr +\ STR{<cond>}{H|SH|SB} Rd, Rm, [Rn] cond 000P UBW0 Rn Rd addr 1SH1 addr +: imm8 ( -- n ) 8 4bits 4 lshift 0 4bits or ; +: ,.r/imm8 ( -- ) + d#22 bit? if + imm8 if ., ." #" +/- imm8 u.h then + else + ., +/- .rm + then +; +: .ld/st ( -- ) d#20 bit? if ." ld" else ." st" then ; +: .ldx ( -- ) + .ld/st ." r" {<cond>} " s" 6 ?.bit " h" 5 ?.bit + op.rd, + .[ .rn p-bit if ,.r/imm8 .] {!} else .] ,.r/imm8 then +; +: .swp ( -- ) ." swp" {<cond>} " b" d#22 ?.bit op.rd, .rm ., .[ .rn .] ; + +: .ld/st-ext ( -- ) 5 2 bits if .ldx else .swp then ; + +: .ext ( -- ) \ Extension space + d#24 bit? 0= 5 2 bits 0= and if .alu-ext else .ld/st-ext then +; + +\ Stop after changing PC +: ?pc-change ( -- ) d# 12 4bits d# 15 = end-found ! ; + +: .alu-op ( -- ) \ d# 25 3 bits 0|1 = + d#25 bit? 0= d# 4 bit? and d# 7 bit? and if .ext exit then + alu# h# d and h# d = if \ Moves + .alu {s} op.rd, .r/imm + ?pc-change + exit + then + d#23 2 bits 2 = if \ Compares + d#20 bit? 0= if .special exit then + .alu op-col .rn ., .r/imm + exit + then + .alu {s} op.rd, .rn ., .r/imm +; +: .swi ( -- ) ." swi" op-col 0 d#24 bits u.h ; + +\ XXX handle muls they have 9 in the 4 4bits field, swp is one of them +\ : ^ ( -- ) 00400000 op-or ; \ ldm stm PSR or force user-mode registers +\ : # ( -- ) 02000000 op-or ; \ last operand is immediate +\ : s ( -- ) 00100000 op-or ; \ flags are set according to result +\ : t ( -- ) 00200000 op-or ; \ ldr str force -T pin +\ : byte ( -- ) 00400000 op-or ; \ ldr str operate bytewide + +: .mregs ( -- ) + ." {" ( ) + 0 d# 16 bits false ( n need,? ) + d# 16 0 do ( n need,? ) + over 1 and if ( n need,? ) + if ." , " then true ( n need,?' ) + i regs ". ( n need,? ) + then ( n need,? ) + swap 2/ swap ( n need,?' ) + loop ( n need,?' ) + 2drop ( ) + ." }" ( ) +; +: .inc ( -- ) d#23 2 " daiadbib" 2 .fld ; +: .ldm/stm ( -- ) \ d# 25 3 bits 4 = + .ld/st ." m" {<cond>} .inc + op-col .rb {!} ., .mregs {^} + d# 15 bit? d# 20 bit? and end-found ! \ Stop after PC change +; +: {t} ( -- ) p-bit 0= w-bit and if ." t" then ; +: imm12 ( -- n ) 0 d# 12 bits ; +: ,.addr-mode ( -- ) + d#25 bit? if + ., +/- .rm,shift + else + imm12 if ., ." #" +/- imm12 u.h then + then +; +: .ldr/str ( -- ) \ d# 25 3 bits 2|3 = + 0 d# 28 bits h# 0e00.0010 and h# 0600.0010 = if + ." undefined" {<cond>} + exit + then + .ld/st ." r" {<cond>} {b} {t} + op.rd, .[ .rb + p-bit if ,.addr-mode .] {!} else .] ,.addr-mode then + ?pc-change +; +: .branch ( -- ) \ d# 25 3 bits 5 = + ." b" " l" d#24 ?.bit {<cond>} + d#24 bit? end-found ! + + op-col dis-pc@ 8 + 0 d#24 bits 8 << 6 >>a + +offset showaddr +; + +: n.d ( n -- ) push-decimal <# u#s u#> type pop-base ; +: .creg ( bit# -- ) 4bits ." cr" n.d ; +[ifdef] dis-fp +: .ldf/stf ( -- ) \ d# 25 3 bits 6 = + .ld/st ." f" ??? +; +: .flt ( -- ) \ d# 25 3 bits 7 = + d#20 2 " fltfixwfsrfs" 3 .fld op-col .precision +; +XXX decode floating opcodes: + 0 8 fops adf mvf muf mnf suf abs rsf rnd + 8 8 fops dvf sqt rdf log pow lgn rpw exp +10 8 fops rmf sin fml cos fdv tan frd asn +18 4 fops pol acs ??? atn +[then] +: p# ( -- n ) 8 4bits ; +: .p#, ( n -- ) ." p" p# n.d ., ; +: .offset8 ( -- ) ." #" +/- 0 8 bits 4 * u.h ; +: .ldc/stc ( -- ) + .ld/st ." c" {<cond>} " l" d#22 ?.bit + op-col .p#, d# 12 .creg ., .[ .rn + p-bit if ., .offset8 .] {!} else .] ., .offset8 then +; +: .cptail ( -- ) d# 16 .creg ., 0 .creg ., 5 3 bits n.d ; + +\ Decode I/D Branch-Target/Write-Buffer Flush/Clean /Entry bits +\ for ARM4 Cache and TLB control registers +: .flushes ( -- ) + 7 bit? if + 6 bit? if + ." Flush Branch Target" + else + 0 bit? if ." Flush Prefetch" else ." Drain Write" then + ." Buffer" + then + else + " Clean " 3 ?.bit " Flush " 2 ?.bit " I" 0 ?.bit " D" 1 ?.bit + then + " entry" 5 ?.bit +; +: .clocks ( -- ) \ For SA-110 + 5 bit? if + 0 4bits case + 1 of ." Enable odd word loading of Icache LFSR" cr endof + 2 of ." Enable even word loading of Icache LFSR" cr endof + 4 of ." Clear Icache LFSR" endof + 8 of ." Move LFSR to R14.Abort" endof + endcase + else + 0 4bits case + 1 of ." Enable clock switching" endof + 2 of ." Disable clock switching" endof + 4 of ." Disable nMCLK output" endof + 8 of ." Wait for interrupt" endof + endcase + then +; +string-array scc-regs + ," ID" + ," Control" + ," TTBase" + ," Domain" + ," ?" + ," FaultStatus" + ," FaultAddress" + ," Cache" + ," TLB" + ," ?" + ," ?" + ," ?" + ," ?" + ," ?" + ," ?" + ," Test/Clock/Idle" \ SA-110 +end-string-array +: .scc ( -- ) \ Decode ARM4 system control coprocessor register ops + \ Opcode1 should be 0 + ." p15(SCC), 0, " .rd, + d# 16 .creg ." (" d# 16 4 bits dup scc-regs ". ." )" ( cr# ) + dup 7 8 between if drop ., .flushes exit then + d# 15 = if .clocks then \ SA-110 +; +: .coproc ( -- ) + p-bit if .swi exit then + d# 4 bit? if \ MRC and MCR + d# 20 1 " mcrmrc" 3 .fld {<cond>} + op-col + p# d# 15 = if \ System Control Coprocessor + .scc + else + .p#, d# 21 3 bits n.d ., .rd, .cptail + then + else \ CDP + ." cdp" {<cond>} + op-col .p#, d# 20 4bits n.d ., d# 12 .creg ., .cptail + then +; + +create classes + ['] .alu-op compile, \ 0 + ['] .alu-op compile, \ 1 (immediate) + ['] .ldr/str compile, \ 2 + ['] .ldr/str compile, \ 3 (immediate) + ['] .ldm/stm compile, \ 4 + ['] .branch compile, \ 5 + ['] .ldc/stc compile, \ 6 + ['] .coproc compile, \ 7 + +: disasm ( x -- ) + push-hex + instruction ! + classes d#25 3 bits ta+ token@ execute + pop-base +; + +headers +forth definitions +alias disasm disasm +: dis1 ( -- ) + ??cr + dis-pc@ +offset showaddr ." : " pc@l@ udis. ." " + #out @ start-column ! + pc@l@ disasm cr + /l dis-pc@ + dis-pc! +; +: +dis ( -- ) + end-found off + begin dis1 end-found @ exit? or until +; +: dis ( adr -- ) dis-pc! +dis ; + +headerless +alias (dis dis +headers + +previous previous definitions + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/disassem.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/dodoesad.fth =================================================================== --- cpu/arm/dodoesad.fth (rev 0) +++ cpu/arm/dodoesad.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,32 @@ +purpose: Defined dodoesaddr at the appropropriate place +\ See license at end of file + +\ dodoesaddr cannot be defined in KERNCODE because the user area is +\ initialized after KERNCODE. +\ This file should be loaded after uservars.fth + +tuser dodoesaddr + +\ LICENSE_BEGIN +\ Copyright (c) 2006 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/dodoesad.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/extra.fth =================================================================== --- cpu/arm/extra.fth (rev 0) +++ cpu/arm/extra.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,130 @@ +purpose: Additional kernel code words +\ See license at end of file + +hex + +code (llit) ( -- lit ) psh tos,sp ldmia ip!,{tos,pc} c; + +code perform ( adr -- ) ldr r0,[tos] pop tos,sp mov pc,r0 end-code + +code hash ( str-adr voc-ptr -- thread ) + pop r0,sp \ string + ldrb r0,[r0,#1] + #threads-t 1- # + and r0,r0,* + ldr tos,[tos,1cell] \ get user# + add tos,tos,up \ Get thread base address + add tos,tos,r0,lsl #2 +c; + +\ Starting at "link", which is the address of a memory location +\ containing a link to the acf of a word in the dictionary, find the +\ word whose name matches the string "adr len", returning the link +\ field address of that word if found. + +\ Assumes the following header structure - [N] is size in bytes: +\ pad[0-3] name-characters[n] name-len&flags[1] link[4] code-field[4] +\ ^ ^ ^ +\ anf alf acf +\ The link field points to the *code field* of the next word in the list. +\ Padding is added, if necessary, before the name characters so that +\ acf is aligned on a 4-byte boundary. + +code ($find-next) ( adr len link -- adr len alf true | adr len false ) + \ !!!! the next line should ONLY be included for RiscOS Forthmacs testing +\ adr base,'body origin + ldr base,[pc,`'body origin swap here 8 + - swap`] + ldr r5,[tos] \ link is kept in r5 + mov tos,#0 \ false is the default return value + +\ cmp r5,#0 \ ?exit if link=BASE + cmp r5,base \ ?exit if link=BASE + nxteq + begin +\ add r5,r5,base \ r5 absolute adr + dec r5,1cell \ r5 at linkfield + sub r2,r5,#1 \ r2 set to len/flag-adr + ldrb r0,[r2] + ands r0,r0,#0x1f \ r0: mask len of $find-next + 0<> if + ldmia sp,{r3,r4} \ r3 len; r4 adr + + cmp r3,r0 \ both strings have same len? + 0= if + sub r2,r2,r3 \ r2: adr of potential $find-next + begin + decs r3,#1 + >= while + ldrb r0,[r4],#1 + ldrb r1,[r2],#1 \ compare one char each + cmp r0,r1 \ comm: CAPS not tested ? + 0<> until then + cmn r3,#1 \ all characters tested? + 0= if + psh r5,sp \ push link-adr ... + mvn tos,#0 \ ... and true + next + then + then + then + ldr r5,[r5] + cmp r5,BASE \ link = BASE ? + 0= until +c; + +[ifdef] notdef +code l+ ( l1 l2 -- l3 ) pop r0,sp add tos,tos,r0 c; +code l- ( l1 l2 -- l3 ) pop r0,sp rsb tos,tos,r0 c; + +code lnegate ( l -- -l ) rsb tos,tos,#0 c; + +code labs ( l -- [l] ) cmp tos,#0 rsbmi tos,tos,#0 c; + +code l2/ ( l -- l/2 ) mov tos,tos,asr #1 c; + +code lmin ( l1 l2 -- l1|l2 ) pop r0,sp cmp tos,r0 movgt tos,r0 c; +code lmax ( l1 l2 -- l1|l2 ) pop r0,sp cmp r0,tos movgt tos,r0 c; +[then] + +code s->l ( n -- l ) c; +code l->n ( l -- n ) c; +code n->a ( n -- a ) c; +code l->w ( l -- w ) mov tos,tos,lsl #16 mov tos,tos,lsr #16 c; +code n->w ( n -- w ) mov tos,tos,lsl #16 mov tos,tos,lsr #16 c; + +code l>r ( l -- ) psh tos,rp pop tos,sp c; +code lr> ( -- l ) psh tos,sp pop tos,rp c; + +#align-t constant #align +#acf-align-t constant #acf-align +#talign-t constant #talign + +: align ( -- ) #align (align) ; +: taligned ( adr -- adr' ) #talign round-up ; +: talign ( -- ) #talign (align) ; + +: wconstant ( "name" w -- ) header constant-cf , ; + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/extra.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/fb8-ops.fth =================================================================== --- cpu/arm/fb8-ops.fth (rev 0) +++ cpu/arm/fb8-ops.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,249 @@ +purpose: fb8 package support routines +\ See license at end of file + +\ Rectangular regions are defined by "adr width height bytes/line". +\ "adr" is the address of the upper left-hand corner of the region. +\ "width" is the width of the region in pixels (= bytes, since +\ this is the 8-bit-per-pixel package). "height" is the height of the +\ region in scan lines. "bytes/line" is the distance in bytes from +\ the beginning of one scan line to the beginning of the next one. + +\ Within the rectangular region, replace bytes whose current value is +\ the same as fg-color with bg-color, and vice versa, leaving bytes that +\ match neither value unchanged. +code fb8-invert ( adr width height bytes/line fg-color bg-color -- ) + mov r0,tos + ldmia sp!,{r1,r2,r3,r4,r5,tos} + \ r0:bg-colour r1:fg-colour r2:bytes/line r3:height r4:width r5:adr + + begin + cmp r3,#0 + > while + mov r6,#0 + begin + cmp r4,r6 \ more pixels/line? + > while + ldrb r7,[r5,r6] \ get pixel colour at adr+offset + cmp r7,r0 + streqb r1,[r5,r6] + cmp r7,r1 + streqb r0,[r5,r6] + inc r6,#1 + repeat + add r5,r5,r2 + dec r3,#1 + repeat +c; + +\ Within the rectangular region, replace halfwords whose current value is +\ the same as fg-color with bg-color, and vice versa, leaving bytes that +\ match neither value unchanged. +code fb16-invert ( adr width height bytes/line fg-color bg-color -- ) + mov r0,tos + ldmia sp!,{r1,r2,r3,r4,r5,tos} + \ r0:bg-colour r1:fg-colour r2:bytes/line r3:height r4:width r5:adr + + begin + cmp r3,#0 + > while + mov r6,#0 + begin + cmp r4,r6 \ more pixels/line? + > while + ldrh r7,[r5,r6] \ get pixel colour at adr+offset + cmp r7,r0 + streqh r1,[r5,r6] + cmp r7,r1 + streqh r0,[r5,r6] + inc r6,#2 + repeat + add r5,r5,r2 + dec r3,#1 + repeat +c; + +\ Within the rectangular region, replace halfwords whose current value is +\ the same as fg-color with bg-color, and vice versa, leaving bytes that +\ match neither value unchanged. +code fb32-invert ( adr width height bytes/line fg-color bg-color -- ) + mov r0,tos + ldmia sp!,{r1,r2,r3,r4,r5,tos} + \ r0:bg-colour r1:fg-colour r2:bytes/line r3:height r4:width r5:adr + + begin + cmp r3,#0 + > while + mov r6,#0 + begin + cmp r4,r6 \ more pixels/line? + > while + ldr r7,[r5,r6] \ get pixel colour at adr+offset + cmp r7,r0 + streq r1,[r5,r6] + cmp r7,r1 + streq r0,[r5,r6] + inc r6,#4 + repeat + add r5,r5,r2 + dec r3,#1 + repeat +c; + + +\ Draws a character from a 1-bit-deep font into an 8-bit-deep frame buffer +\ Font bits are stored 1-bit-per-pixel, with the most-significant-bit of +\ the font byte corresponding to the leftmost pixel in the group for that +\ byte. "font-width" is the distance in bytes from the first font byte for +\ a scan line of the character to the first font byte for its next scan line. +code fb8-paint + ( fontadr fontbytes width height screenadr bytes/line fg-color bg-color -- ) + ldmia sp!,{r1,r2,r3,r4,r5,r6,r7} + psh r9,sp +\ tos:bg-col r1:fg-col r2:bytes/line r3: screeadr r4:height r5:width +\ r6:font-width r7:fontadr +\ free: r8 r9 r0 + begin + cmp r4,#0 + > while + mov r8,#0 \ r8: pixel-offset + begin + cmp r5,r8 \ one more pixel? + > while + ldrb r9,[r7,r8,lsr #3] \ r9 fontdatabyte + and r0,r8,#7 + rsb r0,r0,#8 + movs r0,r9,asr r0 + strcsb r1,[r3,r8] + strccb tos,[r3,r8] + inc r8,#1 + repeat + add r7,r7,r6 \ new font-line + add r3,r3,r2 \ new screen-line + dec r4,#1 + repeat + ldmia sp!,{r9,tos} +c; + +\ Draws a character from a 1-bit-deep font into a 16bpp frame buffer +\ Font bits are stored 1-bit-per-pixel, with the most-significant-bit of +\ the font byte corresponding to the leftmost pixel in the group for that +\ byte. "font-width" is the distance in bytes from the first font byte for +\ a scan line of the character to the first font byte for its next scan line. +code fb16-paint + ( fontadr fontbytes width height screenadr bytes/line fg-color bg-color -- ) + ldmia sp!,{r1,r2,r3,r4,r5,r6,r7} + psh r9,sp +\ tos:bg-col r1:fg-col r2:bytes/line r3: screeadr r4:height r5:width +\ r6:font-width r7:fontadr +\ free: r8 r9 r0 + begin + cmp r4,#0 + > while + mov r8,#0 \ r8: pixel-offset + begin + cmp r5,r8 \ one more pixel? + > while + ldrb r9,[r7,r8,lsr #3] \ r9 fontdatabyte + and r0,r8,#7 + rsb r0,r0,#8 + movs r0,r9,asr r0 + strcsh r1,[r3,r8] + strcch tos,[r3,r8] + inc r8,#2 + repeat + add r7,r7,r6 \ new font-line + add r3,r3,r2 \ new screen-line + dec r4,#1 + repeat + ldmia sp!,{r9,tos} +c; + +\ Draws a character from a 1-bit-deep font into an 8-bit-deep frame buffer +\ Font bits are stored 1-bit-per-pixel, with the most-significant-bit of +\ the font byte corresponding to the leftmost pixel in the group for that +\ byte. "font-width" is the distance in bytes from the first font byte for +\ a scan line of the character to the first font byte for its next scan line. +code fb32-paint + ( fontadr fontbytes width height screenadr bytes/line fg-color bg-color -- ) + ldmia sp!,{r1,r2,r3,r4,r5,r6,r7} + psh r9,sp +\ tos:bg-col r1:fg-col r2:bytes/line r3: screeadr r4:height r5:width +\ r6:font-width r7:fontadr +\ free: r8 r9 r0 + begin + cmp r4,#0 + > while + mov r8,#0 \ r8: pixel-offset + begin + cmp r5,r8 \ one more pixel? + > while + ldrb r9,[r7,r8,lsr #3] \ r9 fontdatabyte + and r0,r8,#7 + rsb r0,r0,#8 + movs r0,r9,asr r0 + strcs r1,[r3,r8] + strcc tos,[r3,r8] + inc r8,#4 + repeat + add r7,r7,r6 \ new font-line + add r3,r3,r2 \ new screen-line + dec r4,#1 + repeat + ldmia sp!,{r9,tos} +c; + +\ Similar to 'move', but only moves width out of every 'bytes/line' bytes +\ "size" is "height" times "bytes/line", i.e. the total length of the +\ region to move. + +\ bytes/line is a multiple of 8, src-start and dst-start are separated by +\ a multiple of bytes/line (i.e. src and dst are simililarly-aligned), and +\ src > dst (so move from the start towards the end). This makes it +\ possible to optimize an assembly language version to use longword or +\ doubleword operations. + +\ this assumes width to be also a multiple of 8 +code fb-window-move ( src-start dst-start size bytes/line width -- ) + mov r0,tos + ldmia sp!,{r1,r2,r3,r4,tos} + \ r0:width r1: bytes/line r2:size r3:dst-start r4:src-start + sub r1,r1,r0 \ r1:bytes/line - width + add r2,r2,r4 \ r2:end-of-src-copy-region + begin + cmp r4,r2 + < while + mov r7,r0 \ r7:loop-width + begin + decs r7,#8 + ldmgeia r4!,{r5,r6} + stmgeia r3!,{r5,r6} + < until + + add r4,r4,r1 + add r3,r3,r1 + repeat +c; + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/fb8-ops.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/field.fth =================================================================== --- cpu/arm/field.fth (rev 0) +++ cpu/arm/field.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,39 @@ +purpose: Defining words for structures and fields +\ See license at end of file + +\ field creates words which add their offset within the structure +\ to the base address of the structure + +: struct ( -- 0 ) 0 ; + +: field ( "name" offset size -- offset+size ) + create over , + + ;code ( struct-adr -- field-adr ) + lnk r0 + ldr r0,[r0] + add tos,tos,r0 +c; + +\ LICENSE_BEGIN +\ Copyright (c) 2006 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/field.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/filecode.fth =================================================================== --- cpu/arm/filecode.fth (rev 0) +++ cpu/arm/filecode.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,205 @@ +purpose: Code words to support the file system interface +\ See license at end of file + +decimal + +\ signed mixed mode addition +code ln+ ( l n -- l ) \ same as l+ or = + pop r0,sp + add tos,tos,r0 +c; + +\ &ptr is the address of a pointer. fetch the pointed-to character and +\ post-increment the pointer. +code @c@++ ( &ptr -- char ) + mov r0,tos + ldr r1,[r0] + ldrb tos,[r1],#1 + str r1,[r0] +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 -- ) + ldmia sp!,{r0,r2} + ldr r1,[tos] + strb r0,[r1],#1 + str r1,[tos] + mov tos,r2 +c; + +: cindex ( adr len char -- [ adr' true ] | false ) + false swap 2swap bounds ?do ( false char ) + dup i c@ = if nip i true rot leave then + loop ( false char | adr' true char ) + drop +; + +[ifdef] notdef +\ "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" + +: split-string ( adr1 len1 char -- adr1 len2 adr1+len2 len1-len2 ) + >r 2dup r> cindex if ( adr1 len1 adr1+len2 ) + dup 3 pick - ( adr1 len1 adr1+len2 len2 ) + rot over - ( adr1 adr1+len2 len2 len1-len2 ) + >r swap r> + else ( adr1 len1 ) + 2dup + 0 + then +; + +\ : xxsplit-string ( adr1 len1 char -- adr1 len2 adr1+len2 len1-len2 ) +\ over 0= if \ degenerate +\ drop 2dup exit +\ then +\ >r 2dup over + swap ( adr1 len1 adr1+len1 adr1 ) +\ begin +\ 2dup u> while ( adr1 len1 adr1+len1 adr ) +\ count r@ = if \ found it! ( adr1 len1 adr1+len1 adr' ) +\ 1- nip 2 pick - ( adr1 len1 len2 ) +\ tuck - >r 2dup + r> ( adr1 len2 adr1+len2 len1-len2 ) +\ r> drop exit +\ then ( adr1 len1 adr1+len1 adr ) +\ repeat ( adr1 len1 adr1+len1 adr ) +\ 2drop 2dup + 0 +\ ; + + +\ 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. +decimal +: parse-line ( adr1 len1 -- adr1 len2 adr2 len3 ) + 2dup d# 10 cindex if \ has lf ( adr1 len1 adr-lf ) + >r 2dup d# 13 cindex if \ has cr ( adr1 len1 adr-cr ) + r> umin ( adr1 len1 adr-delim ) + else \ lf only + r> ( adr1 len1 adr-delim ) + then ( adr1 len1 adr-delim ) + else \ no lf ( adr1 len1 ) + 2dup d# 13 cindex if \ has cr ( adr1 len1 adr-cr ) + else \ neither + 2dup + 0 exit + then + then ( adr1 len1 adr-delim ) + dup 3 pick - -rot 1+ swap ( adr1 len2 adr2 len1 ) + 2 pick - 1- +; +[else] +\ "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 ) + ldmia sp!,{r3,r4} \ r3: len1 r4: adr1 + mov r1,r4 \ r1: adr1 + add r2,r3,r4 \ r2: lastchar of string + mvn r0,#0 + begin + cmp r1,r2 + < while + ldrb r0,[r1],#1 \ getchar - postincr + cmp r0,tos + 0= until then + cmp r0,tos \ delimiter was found + deceq r1,#1 \ last non-delimiter character adr + \ r1: adr1 r2: *lastchar+1 + sub r2,r1,r4 \ r2: len2 + sub tos,r3,r2 + add r1,r4,r2 \ r1: adr1+len2 + stmdb sp!,{r4,r2,r1} +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 adr2 len3 ) + ldr r4,[sp],1cell \ r4 adr + mov r1,r4 \ r1 abs adr1 + add r2,r1,tos \ r2 abs lastchar + mvn r0,#0 + + begin + cmp r1,r2 + < while + ldrb r0,[r1],#1 + cmp r0,#10 + cmpne r0,#13 + 0= until then + sub r3,r1,r4 \ r3 len2 + cmp r0,#10 + cmpne r0,#13 + deceq r3,1 \ correct r3 + cmp r1,r2 \ more chars in line? + < if + ldrb tos,[r1] + cmp tos,#10 + cmpne tos,#13 + = if + cmpeq tos,r0 \ not the same delimiter + incne r1,#1 + then + then + sub tos,r2,r1 + stmdb sp!,{r4,r3,r1} +c; +[then] + +nuser delimiter + +nuser file + +:-h struct ( -- 0 ) 00 ;-h + +\ header-t (file-field) +code-field: dofield ( -- fd+offset ) + psh tos,sp + lnk r0 + ldr r0,[r0] + ldr tos,'user file + add tos,tos,r0 +c; + +:-h file-field-cf ( -- ) dofield place-cf-t ;-h + +\ Assembles the code field when metacompiling a field +:-h file-field ( "name" offset size -- offset ) + " file-field-cf" header-t over ,-t + ?debug +;-h + +\ LICENSE_BEGIN +\ Copyright (c) 2006 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/filecode.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/finish.fth =================================================================== --- cpu/arm/finish.fth (rev 0) +++ cpu/arm/finish.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,39 @@ +purpose: Final steps of the kernel metacompilation process +\ See license at end of file + +hex +' init is do-init +\ ' warm-hook ' 'lastacf >user-t token!-t + +assembler dodoes meta is dodoesaddr +forth-h + +metaoff + +only forth also definitions + +' symbols fixall + +\ LICENSE_BEGIN +\ Copyright (c) 2006 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/finish.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/float.fth =================================================================== --- cpu/arm/float.fth (rev 0) +++ cpu/arm/float.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,409 @@ +purpose: Forth floating point package for ARM FPU/FPE +\ See license at end of file + +\ Contributed by Hanno Schwalm +\ Implements ths ANS Forth floating and floating extended package. +\ needs Fothmacs V. 3.1/2.12 or higher +\ All floating point numbers are IEEE double-precision format +\ using a seperate floating stack assigned by a user variable fp. + +only forth also arm-assembler also definitions + +: popf0 s" r7 'user fp ldr f0 r7 popf r7 'user fp str" evaluate ; +: popf1 s" r7 'user fp ldr f1 r7 popf r7 'user fp str" evaluate ; +: popf2 s" r7 'user fp ldr f2 r7 popf r7 'user fp str" evaluate ; +: pushf0 s" r7 'user fp ldr f0 r7 pushf r7 'user fp str" evaluate ; +: pushf1 s" r7 'user fp ldr f1 r7 pushf r7 'user fp str" evaluate ; +: pushf2 s" r7 'user fp ldr f2 r7 pushf r7 'user fp str" evaluate ; + +only forth also system also definitions hex + +code @fs ( -- n ) \ get the floating status + top sp push + top rfs + top top 0f # and c; +code !fs ( n -- ) \ set the floating status + r1 top 0f # and + top sp pop + r0 rfs + r0 r0 ff00 # and + r0 r0 r1 orr + r0 wfs c; + +nuser fbuff /float 2* ualloc drop +: @sign ( -- f) fbuff @ 80000000 and 0<> ; +: @esign ( -- f) fbuff @ 40000000 and 0<> ; +: !sign ( f ) 0<> 80000000 and fbuff @ 4fffffff and or fbuff ! ; +: !esign ( f ) 0<> 40000000 and fbuff @ 8fffffff and or fbuff ! ; +: @nibble ( #nibb -- n2 ) + 8 /mod swap >r cells fbuff + @ 7 r> - 4* rshift 0f and ; +: !nibble ( #nibb n ) + swap 8 /mod swap >r cells fbuff + ( n addr r: n-th ) + f0000000 r@ 4* rshift -1 xor ( n addr mask r: n-th ) + over @ and ( n addr ncont R: n-th ) + rot 7 r> - 4* lshift or swap ! ; + +decimal + +: @exp 0 5 1 do 10 * i @nibble + loop @esign ?negate 1+ ; +: @dig 5 + @nibble [char] 0 + ; + +code !flpd \ ( addr -- ) + popf0 + packed f0 top 3 cells ia stf double + top sp pop c; +\ a packed decimal is read at addr and written to the floating stack +code @flpd ( addr -- ) + packed f0 top 3 cells ia ldf double + pushf0 + top sp pop c; + +: fp-error + @fs 0 !fs + dup 2 and if -42 throw then + dup 13 and if -43 throw then + 16 and if -41 throw then abort ; + +arm-assembler definitions +: c;fl \ ends a floating point code definitions with checking for errors + r0 rfs r0 r0 h# 0f # s and eq next ip ['] fp-error >body adr c; ; + +forth definitions +: (cold-hook 0 !fs (cold-hook ; ' (cold-hook is cold-hook + +\ often used floating high precision constants +code -.5E0 f0 #0.5 mnf pushf0 c; +code -1E0 f0 #1.0 mnf pushf0 c; +code -2E0 f0 #2.0 mnf pushf0 c; +code -3E0 f0 #3.0 mnf pushf0 c; +code -4E0 f0 #4.0 mnf pushf0 c; +code -5E0 f0 #5.0 mnf pushf0 c; +code -1E1 f0 #10.0 mnf pushf0 c; +code 0E0 f0 #0.0 mvf pushf0 c; +code .5E0 f0 #0.5 mvf pushf0 c; +code 1E0 f0 #1.0 mvf pushf0 c; +code 2E0 f0 #2.0 mvf pushf0 c; +code 3E0 f0 #3.0 mvf pushf0 c; +code 4E0 f0 #4.0 mvf pushf0 c; +code 5E0 f0 #5.0 mvf pushf0 c; +code 1E1 f0 #10.0 mvf pushf0 c; + +code f+ ( f1 f2 -- f3 ) popf0 popf1 f0 f1 f0 adf pushf0 c;fl +code f- ( f1 f2 -- f3 ) popf0 popf1 f0 f1 f0 suf pushf0 c;fl +code f* ( f1 f2 -- f3 ) popf0 popf1 f0 f1 f0 muf pushf0 c;fl +code f/ ( f1 f2 -- f3 ) popf0 popf1 f0 f1 f0 dvf pushf0 c;fl +code f** ( f1 f2 -- f3 ) popf0 popf1 f0 f1 f0 pow pushf0 c;fl +code fmod ( f1 f2 -- f3 ) popf0 popf1 f0 f1 f0 rmf pushf0 c;fl +code fsin ( f1 -- f2 ) popf0 f0 f0 sin pushf0 c;fl +code fasin ( f1 -- f2 ) popf0 f0 f0 asn pushf0 c;fl +code fcos ( f1 -- f2 ) popf0 f0 f0 cos pushf0 c;fl +code fsincos ( f1 -- f2 f3 ) popf0 f1 f0 sin f2 f0 cos pushf0 pushf1 c;fl +code facos ( f1 -- f2 ) popf0 f0 f0 acs pushf0 c;fl +code ftan ( f1 -- f2 ) popf0 f0 f0 tan pushf0 c;fl +code fatan ( f1 -- f2 ) popf0 f0 f0 atn pushf0 c;fl +code fln ( f1 -- f2 ) popf0 f0 f0 lgn pushf0 c;fl +code flnp1 ( f1 -- f2 ) popf0 f0 f0 #1.0 adf f0 f0 lgn pushf0 c;fl +code flog ( f1 -- f2 ) popf0 f0 f0 log pushf0 c;fl +code falog ( f1 -- f2 ) popf0 f0 #10.0 f0 pow pushf0 c;fl +code fsqrt ( f1 -- f2 ) popf0 f0 f0 sqt pushf0 c;fl +code fexp ( f1 -- f2 ) popf0 f0 f0 exp pushf0 c;fl +code fexpm1 ( f1 -- f2 ) popf0 f0 f0 exp f0 f0 #1.0 suf pushf0 c;fl +code fabs ( f1 -- absf1 ) popf0 f0 f0 abs pushf0 c;fl +code fnegate ( f1 -- -f1 ) popf0 f0 f0 mnf pushf0 c;fl +code floor ( f1 -- f2 ) popf0 -infinity f0 f0 rnd nearest pushf0 c;fl +code fround ( f1 -- f2 ) popf0 f0 f0 rnd pushf0 c;fl +code fhyp ( f1 -- 1/f1) popf0 f0 f0 #1.0 rdf pushf0 c;fl +code sf@ ( sf-addr ) ( f: --sf ) + single f0 top popf + double pushf0 + top sp pop c;fl +code sf! + double popf0 + single f0 top pushf + double top sp pop c;fl + +: facosh ( f1 -- f2 ) fhyp facos ; +: fasinh ( f1 -- f2 ) fhyp fasin ; +: fatan2 ( f1 f2 -- f3 ) f/ fatan ; +: fatanh ( f1 -- f2 ) fhyp fatan ; +: fsinh ( f1 -- f2 ) fsin fhyp ; +: ftanh ( f1 -- f2 ) ftan fhyp ; + + +code f< ( f1 f2 -- | f ) + top sp push popf1 popf0 + f0 f1 cmfe + top -1 # lt mov top 0 # ge mov c;fl +code f> ( f1 f2 -- | f ) + top sp push popf1 popf0 + f0 f1 cmfe + top -1 # gt mov top 0 # le mov c;fl +code f= ( f1 f2 -- | f) + top sp push popf1 popf0 + f0 f1 cmf + top -1 # eq mov top 0 # ne mov c;fl +code f<> ( f1 f2 -- | f) + top sp push popf1 popf0 + f0 f1 cmf + top -1 # ne mov top 0 # eq mov c;fl +code f0= top sp push popf0 + f0 #0.0 cmfe + top -1 # eq mov top 0 # ne mov c;fl +code f0< top sp push popf0 + f0 #0.0 cmfe + top -1 # lt mov top 0 # ge mov c;fl +code f0> top sp push popf0 + f0 #0.0 cmfe + top -1 # gt mov top 0 # le mov c;fl + +code fdup ( f1 -- f1 f1 ) + r2 'user fp ldr + r0 r1 2 r2 ia ldm + r0 r1 2 r2 db! stm + r2 'user fp str c; +code fdrop ( f1 -- ) + r0 'user fp ldr + r0 2 cells incr + r0 'user fp str c; +code fswap ( f1 f2 -- f2 f1 ) + r4 'user fp ldr + r0 r1 r2 r3 4 r4 ia! ldm + r0 r1 2 r4 db! stm + r2 r3 2 r4 db! stm c; +code frot ( f1 f2 f3 -- f2 f3 f1 ) + r6 'user fp ldr + r0 r1 r2 r3 r4 r5 6 r6 ia! ldm + r2 r3 2 r6 db! stm + r4 r5 2 r6 db! stm + r0 r1 2 r6 db! stm c; +code f-rot ( f1 f2 f3 -- f3 f1 f2 ) + r6 'user fp ldr + r0 r1 r2 r3 r4 r5 6 r6 ia! ldm + r4 r5 2 r6 db! stm + r0 r1 r2 r3 4 r6 db! stm c; +code f2dup ( f1 f2 -- f1 f2 f1 f2 ) + r6 'user fp ldr + r0 r1 r2 r3 4 r6 ia ldm + r0 r1 r2 r3 4 r6 db! stm + r6 'user fp str c; +code fover ( f1 f2 -- f1 f2 f1 ) + r6 'user fp ldr + r2 r6 /float # add + r0 r1 2 r2 ia ldm + r0 r1 2 r6 db! stm + r6 'user fp str c; +code n>f ( n -- ) \ n is converted to a float + f0 top flt + pushf0 + top sp pop c; +code f>n ( -- n ) \ takes a float and converts it to n + popf0 + top sp push + top f0 fix c; +code fmin popf0 popf1 + f0 f1 cmfe + 0< if pushf0 else pushf1 then c;fl +code fmax popf0 popf1 + f0 f1 cmfe + 0> if pushf0 else pushf1 then c;fl + +code f~ ( f: f1 f2 f3 -- ) ( -- flag ) + popf2 popf1 popf0 + top sp push + top 0 # mov + f2 #0.0 cmfe +gt if f3 f0 f1 suf + f3 f3 abs + f3 f2 cmfe + top -1 # lt mov + else f2 #0.0 cmf + eq if f0 f2 cmf + top -1 # eq mov + else f3 f0 abs + f4 f1 abs + f3 f3 f4 adf + f3 f3 f2 muf + f0 f0 f1 suf + f0 f0 abs + f0 f3 cmfe + top -1 # lt mov + then + then c;fl + +: d>f ( d -- ) ( f: -- f-d ) + dup 0< >r dabs ?dup + if n>f [ 2E0 32 n>f f** ] fliteral f* else 0E0 then + dup h# 7fffffff and n>f f+ + h# 80000000 and if [ 2E0 31 n>f f** ] fliteral f+ then + r> if fnegate then ; +: f>d 0 !fs fdup f>n @fs + if drop 0 !fs + fdup f0< >r fabs fdup [ 2E0 32 n>f f** fdup ] + fliteral fmod f>n fliteral f/ f>n r> ?dnegate + else fdrop s>d + then ; +: fdepth fp0 @ fp@ - 3 rshift ; + +: represent \ ( c-addr cnt -- exponent sign ok? ) + 2dup [char] 0 fill + 19 min fbuff !flpd + @fs b# 1101 and if drop 0 false exit then + dup 19 < over 19 min @dig [char] 4 > and + ( c-addr cnt round ) + -rot 1- 0 swap + do over i @dig swap + if 1+ dup [char] 9 > + if drop [char] 0 else rot drop 0 -rot then + then + over i + c! + -1 +loop + @exp swap + rot if [char] 1 swap c! 1+ else drop then + @sign true ; +: >float \ ( addr u -- flag ) + 0 !fs fbuff 3 cells erase + over c@ [char] - = dup !sign if next-char then + over c@ [char] + = if next-char then + begin over c@ [char] 0 = while next-char repeat + over 0 2swap 2dup bounds + ( c-addr c-len e-addr e-len to-char from-char ) + ?do next-char i c@ [char] E <> if 2swap char+ 2swap else leave then + loop ( f-addr f-len e-addr e-len ) + \ now the floating-number string has been split into the digits + \ and the exponent part + \ first the exponent is calculated + over c@ [char] - = dup >r if next-char then + over c@ [char] + = if next-char then + 0. 2swap >number + if r> 3drop 3drop false exit else 2drop r> ?negate then >r + \ exponent is left on the return-stack + \ skip leading nulls + begin over c@ [char] 0 = while next-char repeat + \ look for exponent correction + 2dup -1 -rot bounds ?do i c@ [char] . = ?leave 1+ loop r> + >r + over c@ [char] . = \ skip leading dots or nulls + if next-char begin over c@ [char] 0 = while r> 1- >r next-char repeat + then + r@ 0< !esign r> abs 1 4 do 10 /mod i rot !nibble -1 +loop drop + ( f-addr f-len ) + 5 -rot bounds ( nibble to from ) + ?do i c@ [char] 0 [char] 9 between if dup i c@ [char] 0 - !nibble 1+ then + loop drop + fbuff @flpd @fs 0= 0 !fs ; + +: fdigit? ( char -- flag ) + dup [char] 0 [char] 9 between ( char flag ) + over [char] E = or over [char] . = or + over [char] + = or swap [char] - = or ; +: fnumber? ( string -- string false | f true ) + true over count bounds ( string true to from ) + ?do i c@ fdigit? 0= if drop false leave then loop + if dup count >float if drop true else false then + else false + then ; +: float, ( f -- ) here /float allot f! ; + + +: fvariable create /float allot ; +: fconstant create float, + ;code + r7 get-link + r0 r1 2 r7 ia ldm + r2 'user fp ldr + r0 r1 2 r2 db! stm + r2 'user fp str c; + +3 actions" obj. floatval" + action: f@ ; + action: f! ; + action: ; +: floatval \ ( F: f1 -- ) + create here /float allot f! + use-actions ; + +alias falign align +alias faligned aligned +alias df! f! +alias df@ f@ +alias dfalign align +alias dfaligned aligned +alias sfalign align +alias sfaligned aligned +alias dfloat+ float+ +alias dfloats floats +alias sfloat+ cell+ +alias sfloats cells + +5 constant precision +: set-precision ( n -- ) + 1 max 250 min is precision ; +: fs. ( f: r -- ) + astring dup precision represent ( buffer exponent sign ok? ) + 0= if fp-error then + if ." -" then >r dup c@ emit ." ." char+ precision 1- type + ." E" r> 1- .d ; +: fe. ( f: r -- ) + astring dup precision represent ( buffer exponent sign ok? ) + 0= if fp-error then + if ." -" then 1+ >r + dup r@ 1+ 3 mod 1+ dup >r type ." ." r@ + precision r> - type + ." E" r> 1+ 3 / 1- 3 * .d ; +: f. ( f: r -- ) + astring dup precision represent ( buffer exponent sign ok? ) + 0= if fp-error then + if ." -" then dup 0<= + if ." 0." abs 0 ?do ." 0" loop precision type + else 2dup type ." ." tuck + swap precision - dup 0< ( addr cnt f ) + if abs type else 2drop ." 0" then + then ; +: .fs ( -- ) \ displays floating stack + fp0 @ + begin /float - dup fp@ >= + while dup f@ fs. + repeat drop ; + +: floats-on ['] fnumber? is fliteral? ; +: floats-off ['] false is fliteral? ; + +floats-on +environment: floating true ; +environment: floating-ext true ; +environment: floating-stack [ fs-size /float / ] literal ; +environment: max-float 1.79769313486231571E+308 ; +3.1415926535897932384E0 fconstant PI +floats-off + + +\ floating point decompiler support +[ifdef] see + only forth also hidden also definitions + : .finline (s ip -- ip' ) cell+ dup f@ fs. cell+ cell+ ; + : skip-finline (s ip -- ip' ) cell+ float+ ; + ' (flit) ' .finline ' skip-finline install-decomp +[then] + +only forth also definitions + +\ LICENSE_BEGIN +\ Copyright (c) 2008 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
Property changes on: cpu/arm/float.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/forthint.fth =================================================================== --- cpu/arm/forthint.fth (rev 0) +++ cpu/arm/forthint.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,176 @@ +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 + +0 value intsave +h# 1300 constant /intstack + +\ The interrupt save/stack area is laid out as follows: +\ 0000 - register save area (size h#44) +\ 0044 - data stack area (size h#1100-h#44) +\ 1100 - return stack area (size h#200) +\ 1300 - <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 - psr +\ 04 - r0 +\ 08 - r1 +\ ... +\ 38 - r13 (sp) +\ 3c - r14 (lr) +\ 40 - r15 (pc) +\ +\ 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) ; + +code interrupt-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 interrupt handler. + + mov r3,#0 \ Clear derived abort flag + ldr r5,'user aborted? \ Abort flag + + cmp r5,#1 + = if + \ Don't abort in the middle of the terminal emulator, because + \ it's not reentrant. + + ldr r4,'user terminal-locked? + cmp r4,#0 + + \ Increment the abort flag past 1 so that we won't see it again + \ until the interpreter has seen and cleared it. + inceq r5,#1 + streq r5,'user aborted? + mvneq r3,#0 \ Set derived abort flag + then + + mov r13,r3 \ Put derived flag in a safe place + + ldr r0,'user intsave \ Address of interrupt save area + + ldr r1,[r0] \ Saved SPSR from offset 0 + msr spsr,r1 \ Restore it + + mrs r2,cpsr \ Remember the current mode + tst r1,#0xf \ Check for user mode + orreq r1,r1,#0xf \ Set system mode if mode was user + orr r1,r1,#0x80 \ Disable interrupts + msr cpsr,r1 \ Sneak into the other mode + + ldr r13,[r0,#56] \ Restore old SP + ldr r14,[r0,#60] \ Restore old LR + msr cpsr,r2 \ Return to the interrupt mode + + ldr r14,[r0,#64] \ Restore PC to LR + + ldmib r0,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12} + + \ Now the registers are back to the state that existed upon entry to + \ the interrupt handler. We can use only r13 in the following code. + + cmp r13,#0 \ Test abort flag + moveqs pc,r14 \ Return from interrupt + + adr r13,'body main-task \ Get user pointer address + ldr r13,[r13] \ Get user pointer + ldr r13,[r13,`'user# cpu-state`] \ State save address + + stmia r13,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12} + + mov r0,r13 \ Move cpu-state pointer into r0 + mvn r4,#0 \ Set r4 to -1 to indicate a user abort + b 'body save-common +end-code + +: interrupt-handler dispatch-interrupt interrupt-return ; + +label interrupt-preamble +\ here also hidden hwbp previous + adr r13,'body main-task \ Get user pointer address + ldr r13,[r13] \ Get user pointer + ldr r13,[r13,`'user# intsave`] \ Address of interrupt save area + + stmib r13,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12} + mov r0,r13 \ Switch to r0 for the save pointer + + mrs r1,spsr + str r1,[r0] \ Save SPSR at offset 0 + dec r14,#4 \ Account for pipeline + str r14,[r0,#64] \ Save PC at offset 64 + + \ Sneak into the old mode to pick up its r13 and r14 + mrs r2,cpsr \ Remember the current mode + tst r1,#0xf \ Check for user mode + orreq r1,r1,#0xf \ Set system mode if mode was user + orr r1,r1,#0x80 \ Disable interrupts + msr cpsr,r1 \ Get into the old mode + + str r13,[r0,#56] \ Save old SP + str r14,[r0,#60] \ Save old LR + msr cpsr,r2 \ Return to the interrupt mode + + \ Set up Forth stacks + add rp,r0,`/intstack #` \ Return stack pointer + sub sp,rp,#0x204 \ Data stack pointer (w/top of stack) + + adr up,'body main-task \ Get user pointer address + ldr up,[up] \ Get user pointer + + adr ip,'body interrupt-handler +c; + +: install-alarm ( -- ) + /intstack alloc-mem to intsave + intsave /intstack erase \ Paranoia + disable-interrupts + [ also hidden ] + interrupt-preamble 6 install-handler + init-dispatcher + [ previous ] + d# 10 set-tick-limit + enable-interrupts \ Turn interrupts on +; + +headers + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/forthint.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/ftrace.fth =================================================================== --- cpu/arm/ftrace.fth (rev 0) +++ cpu/arm/ftrace.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,33 @@ +purpose: Display a Forth stack backtrace +\ See license at end of file + +only forth also hidden also forth definitions +: ftrace ( -- ) \ Forth stack + ip >saved .traceline + rp >saved rssave-end swap (rstrace +; +only forth also definitions + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/ftrace.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/getms.fth =================================================================== --- cpu/arm/getms.fth (rev 0) +++ cpu/arm/getms.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,77 @@ +purpose: Interval timing functions +\ See license at end of file + +headerless + +0 value tick-msecs +: (get-msecs) ( -- n ) tick-msecs ; +' (get-msecs) to get-msecs + +d# 10 value ms/tick +d# 78,764 constant ms-factor +0 value us-factor + +code spins ( count -- ) + cmp tos,#0 + <> if + begin + subs tos,tos,#1 + 0= until + then + pop tos,sp +c; +: 1ms ( -- ) ms-factor spins ; + +: us ( #microseconds -- ) us-factor * spins ; + +: (ms) ( #ms -- ) + dup ms/tick 3 * u> interrupts-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. + + 0 ?do ms-factor spins loop + then +; +' (ms) to ms + +headers + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/getms.fth ___________________________________________________________________ Added: svn:executable + *
Property changes on: cpu/arm/inflate ___________________________________________________________________ Added: svn:executable + * Added: svn:mime-type + application/octet-stream
Added: cpu/arm/inflater.fth =================================================================== --- cpu/arm/inflater.fth (rev 0) +++ cpu/arm/inflater.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,35 @@ +purpose: Inflater in the dictionary +\ See license at end of file + +headerless +create (inflater) " ${BP}/cpu/arm/inflate" $file, + +: (got-inflater) (inflater) 0 to inflater ; +' (got-inflater) to get-inflater + +' noop to release-inflater +headers + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/inflater.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/initpgm.fth =================================================================== --- cpu/arm/initpgm.fth (rev 0) +++ cpu/arm/initpgm.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -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 + \ 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 r0 + + h# 53 to psr \ IRQ enabled, FIQ disabled, SVC_32 mode + + restartable? on + true to already-go? +; + +: +base ( n -- adr ) load-base + ; + +headers + +\ LICENSE_BEGIN +\ Copyright (c) 1995 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
Property changes on: cpu/arm/initpgm.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/kerncode.fth =================================================================== --- cpu/arm/kerncode.fth (rev 0) +++ cpu/arm/kerncode.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,1224 @@ +purpose: Kernel Primitives for ARM-Risc Processors ARM2 ARM250 ARM3 ARM4 +\ See license at end of file + +\ Allocate and clear the initial user area image +mlabel init-user-area setup-user-area + +\ 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 + +also forth +compilation-base here-t \ Save meta dictionary pointer +\ Use the first version if the user area is separate from the dictionary +\ 0 dp-t ! userarea-t is compilation-base \ Point it to user area +userarea-t dp-t ! \ Point it to user area +previous + +code-field: (next) \ Shared code for next; will be copied into user area +\ also meta assembler + ldr pc,[ip],/token +end-code +\ previous + +also forth +dp-t ! is compilation-base previous \ Restore meta dict. pointer + +d# 32 equ #user-init \ Leaves space for the shared "next" + +hex meta assembler definitions +\ New: the following 3 definitions aren't in this file + +\ The first version is for in-line NEXT +\ :-h next ldr pc,[ip],/token ;-h +:-h next " mov pc,up" evaluate ;-h +:-h c; next end-code ;-h +caps on +\ also register-names definitions +\ :-h base r7 ;-h +\ previous + +\ Run-time actions for defining words: +\ In the Acorn-ARM2/250/3 implementation all words but code definitions are +\ called by a branch+link instruction. It branches to a relative-inline- +\ address and leaves the old pc/pcr in the link register r14. +\ The pfa of the word is just after the branch+link instruction. +\ bic r0,link,#0xfc000003 or using the lnk macro +\ lnk r0 +\ Both instructions read the pfa to r0 + +meta definitions +code-field: douser + psh tos,sp + lnk r0 + ldr r0,[r0] + add tos,r0,up +c; +code-field: dodoes + psh ip,rp + lnk ip +c; +code-field: dovalue + psh tos,sp + lnk r0 + ldr r0,[r0] + ldr tos,[up,r0] +c; +code-field: docolon + psh ip,rp + lnk ip +c; +code-field: doconstant + psh tos,sp + lnk r0 + ldr tos,[r0] +c; +code-field: dodefer + lnk r0 + ldr r0,[r0] + ldr pc,[r0,up] +end-code +code-field: do2constant + lnk r0 + + ldmia r0,{r1,r2} + stmdb sp!,{r1,tos} + mov tos,r2 +c; +code-field: docreate + psh tos,sp + lnk tos +c; + +code-field: dovariable + psh tos,sp + lnk tos +c; + +\ New: dopointer (identical to doconstant) +\ New: dobuffer (identical to doconstant) + +:-h compvoc compile-t <vocabulary> ;-h +code-field: dovocabulary + ldr pc,[pc,#-4] +end-code +compvoc \ cfa of vocabulary is compiled here + +\ New: :-h syscall: + +\ Meta compiler words to compile code fields for child words +:-h place-cf-t \ ( adr -- ) compile a branch+link to adr + here-t - 2/ 2/ 2- 00ffffff and eb000000 or l,-t +;-h + +\ psh tos,sp bic tos,lk,#0xfc00.0003 +\ :-h push-pfa ( -- ) e52da004 , e3cea3ff , ;-h +\ psh tos,sp mov tos,lk +:-h push-pfa ( -- ) e52da004 , e1a0a00e , ;-h +:-h code-cf ( -- ) ;-h +:-h startdoes ( -- ) push-pfa + dodoes place-cf-t ;-h +:-h start;code ( -- ) ;-h \ ??? +:-h colon-cf ( -- ) docolon place-cf-t ;-h +:-h constant-cf ( -- ) doconstant place-cf-t ;-h +\ New: :-h buffer-cf ( -- ) dobuffer place-cf-t ;-h +\ New: :-h pointer-cf ( -- ) dopointer place-cf-t ;-h +:-h create-cf ( -- ) docreate place-cf-t ;-h +:-h variable-cf ( -- ) dovariable place-cf-t ;-h +:-h user-cf ( -- ) douser place-cf-t ;-h +:-h value-cf ( -- ) dovalue place-cf-t ;-h +:-h defer-cf ( -- ) dodefer place-cf-t ;-h +:-h 2constant-cf ( -- ) do2constant place-cf-t ;-h +:-h vocabulary-cf ( -- ) dovocabulary place-cf-t ;-h + +meta definitions + +code (lit) ( -- lit ) + psh tos,sp + ldr tos,[ip],1cell +c; +code (dlit) ( -- d ) + ldmia ip!,{r0,r1} + stmdb sp!,{r1,tos} + mov tos,r0 +c; +code execute ( cfa -- ) + mov r0,tos + pop tos,sp + mov pc,r0 +end-code +code ?execute ( cfa|0 -- ) + movs r0,tos + pop tos,sp + movne pc,r0 +c; +code @execute ( adr -- ) + ldr r0,[tos] + pop tos,sp + mov pc,r0 +end-code + +\ Run-time actions for compiling words + +code branch ( -- ) +\rel ldr r0,[ip] +\rel add ip,ip,r0 +\abs ldr ip,[ip] +c; + +code ?branch ( flag -- ) + cmp tos,#0 + pop tos,sp + addne ip,ip,1cell +\rel ldreq r0,[ip] +\rel addeq ip,ip,r0 +\abs ldreq ip,[ip] +c; + +code ?0=branch ( flag -- ) + cmp tos,#0 + pop tos,sp + inceq ip,1cell +\rel ldrne r0,[ip] +\rel addne ip,ip,r0 +\abs ldrne ip,[ip] +c; + + +code (loop) ( -- ) + ldr r0,[rp] + incs r0,1 + strvc r0,[rp] +\rel ldrvc r0,[ip] +\rel addvc ip,ip,r0 +\abs ldrvc ip,[ip] + ldrvc pc,[ip],1cell + inc rp,3cells + inc ip,1cell +c; + +code (+loop) ( n -- ) + ldr r0,[rp] + adds r0,r0,tos + strvc r0,[rp] + pop tos,sp +\rel ldrvc r0,[ip] +\rel addvc ip,ip,r0 +\abs ldrvc ip,[ip] + ldrvc pc,[ip],1cell + inc rp,3cells + inc ip,1cell +c; + +code (do) ( l i -- ) + mov r0,tos + ldmia sp!,{r1,tos} ( r: loop-end-offset l+0x8000 i-l-0x8000 ) + psh ip,rp \ save the do offset address + inc ip,1cell + inc r1,#0x80000000 + sub r0,r0,r1 + stmdb rp!,{r0,r1} +c; + +code (?do) ( l i -- ) + mov r0,tos + ldmia sp!,{r1,tos} + cmp r1,r0 +\rel ldreq r0,[ip] +\rel addeq ip,ip,r0 +\abs ldreq ip,[ip] + ldreq pc,[ip],1cell + ( r: loop-end-offset l+0x8000 i-l-0x8000 ) + psh ip,rp \ save the do offset address + inc ip,1cell + inc r1,#0x80000000 + sub r0,r0,r1 + stmdb rp!,{r0,r1} +c; + +code i ( -- n ) + psh tos,sp + ldmia rp,{r0,r1} + add tos,r1,r0 +c; +code ilimit ( -- n ) + psh tos,sp + ldr tos,[rp],1cell + inc tos,#0x80000000 +c; +code j ( -- n ) + psh tos,sp + add r2,rp,3cells + ldmia r2,{r0,r1} + add tos,r1,r0 +c; +code jlimit ( -- n ) + psh tos,sp + ldr tos,[rp],4cells + inc tos,#0x80000000 +c; + +code (leave) ( -- ) + inc rp,2cells \ get rid of the loop indices + ldr ip,[rp],1cell +\rel ldr r0,[ip] \ branch +\rel add ip,ip,r0 +\abs ldr ip,[ip] +c; + +code (?leave) ( f -- ) + cmp tos,#0 + pop tos,sp + ldreq pc,[ip],1cell + inc rp,2cells \ get rid of the loop indices + ldr ip,[rp],1cell +\rel ldr r0,[ip] \ branch +\rel add ip,ip,r0 +\abs ldr ip,[ip] +c; + +code unloop ( -- ) inc rp,3cells c; \ Discard the loop indices + +\ Run time code for the case statement +code (of) ( selector test -- [ selector ] ) + mov r0,tos + pop tos,sp + cmp tos,r0 +\rel ldrne r0,[ip] +\rel addne ip,ip,r0 +\abs ldrne ip,[ip] + nxtne + pop tos,sp + inc ip,1cell +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) ( -- ) +\rel ldr r0,[ip] +\rel add ip,ip,r0 +\abs ldr ip,[ip] +c; + +code (endcase) ( n -- ) pop tos,sp c; + +code digit ( char base -- digit true�| char false ) + mov r0,tos \ r0 base + ldr r1,[sp] \ r1 char + and r1,r1,#0xff + cmp r1,#0x41 \ ascii A + >= if + cmp r1,#0x5b \ ascii [ + inclt r1,#0x20 + then + mov tos,#0 \ tos false + decs r1,#0x30 + nxtlt + cmp r1,#10 + >= if + cmp r1,#0x31 + nxtlt + dec r1,#0x27 + then + cmp r1,r0 + nxtge + str r1,[sp] + mvn tos,#0 \ tos true +c; + +code cmove ( from to cnt -- ) + movs r0,tos \ r0 cnt + ldmia sp!,{r1,r2,tos} + nxteq +[ifndef] fixme + cmp r1,r2 + nxteq +[then] + begin + ldrb r3,[r2],#1 + strb r3,[r1],#1 + decs r0,1 + 0= until +c; +code cmove> ( from to cnt -- ) + movs r0,tos \ r0 cnt + ldmia sp!,{r1,r2,tos} + nxteq +[ifndef] fixme + cmp r1,r2 + nxteq +[then] + begin + decs r0,1 + ldrb r3,[r2,r0] + strb r3,[r1,r0] + 0= until +c; +[ifdef] use-slow-move +: move ( src dst len -- ) + >r 2dup u> if r> cmove else r> cmove> then +; +[else] +code move ( src dst cnt -- ) + movs r0,tos + ldmia sp!,{r1,r2,tos} + nxteq + cmp r1,r2 + nxteq + \ r0:cnt r1:dst r2:src + < if \ copy bytes until: src is aligned or cnt=0 + cmp r0,#4 + >= if + begin + ands r3,r2,#3 + ldrneb r3,[r2],#1 + strneb r3,[r1],#1 + decne r0,1 + 0= until \ copy until source is word-aligned + ands r3,r1,#3 + 0= if \ longword optimizing is possible now + + begin + decs r0,4cells + ldmgeia r2!,{r3,r4,r5,r6} + stmgeia r1!,{r3,r4,r5,r6} + < until + inc r0,4cells + + begin + decs r0,1cell + ldrge r3,[r2],1cell + strge r3,[r1],1cell + < until + inc r0,1cell + then + then + begin + decs r0,1 + ldrgeb r3,[r2],#1 + strgeb r3,[r1],#1 + 0<= until + else + add r1,r1,r0 + add r2,r2,r0 + cmp r0,#4 + >= if + begin + ands r3,r2,#3 + ldrneb r3,[r2,#-1]! + strneb r3,[r1,#-1]! + decne r0,1 + 0= until \ copy until source is word-aligned + ands r3,r1,#3 + 0= if \ longword optimizing is possible now + + begin + decs r0,4cells + ldmgedb r2!,{r3,r4,r5,r6} + stmgedb r1!,{r3,r4,r5,r6} + < until + inc r0,4cells + + begin + decs r0,1cell + ldrge r3,[r2,~1cell]! + strge r3,[r1,~1cell]! + < until + inc r0,1cell + + then + then + begin + decs r0,1 + ldrgeb r3,[r2,#-1]! + strgeb r3,[r1,#-1]! + <= until + then +c; +[then] + +code noop ( -- ) c; + +code and ( n1 n2 -- n3 ) pop r0,sp and tos,tos,r0 c; +code or ( n1 n2 -- n3 ) pop r0,sp orr tos,tos,r0 c; +code xor ( n1 n2 -- n3 ) pop r0,sp eor tos,tos,r0 c; +[ifdef] fixme +code not ( n1 -- n2 ) mvn tos,tos c; +code invert ( n1 -- n2 ) mvn tos,tos c; + +code lshift ( n1 cnt -- n2 ) pop r0,sp mov tos,r0,lsl tos c; +code rshift ( n1 cnt -- n2 ) pop r0,sp mov tos,r0,lsr tos c; +code << ( n1 cnt -- n2 ) pop r0,sp mov tos,r0,lsl tos c; +code >> ( n1 cnt -- n2 ) pop r0,sp mov tos,r0,lsr tos c; +code >>a ( n1 cnt -- n2 ) pop r0,sp mov tos,r0,asr tos c; +code + ( n1 n2 -- n3 ) pop r0,sp add tos,tos,r0 c; +code - ( n1 n2 -- n3 ) pop r0,sp rsb tos,tos,r0 c; +[else] +code + ( n1 n2 -- n3 ) pop r0,sp add tos,tos,r0 c; +code - ( n1 n2 -- n3 ) pop r0,sp rsb tos,tos,r0 c; +code not ( n1 -- n2 ) mvn tos,tos c; +code invert ( n1 -- n2 ) mvn tos,tos c; + +code lshift ( n1 cnt -- n2 ) pop r0,sp mov tos,r0,lsl tos c; +code rshift ( n1 cnt -- n2 ) pop r0,sp mov tos,r0,lsr tos c; +code << ( n1 cnt -- n2 ) pop r0,sp mov tos,r0,lsl tos c; +code >> ( n1 cnt -- n2 ) pop r0,sp mov tos,r0,lsr tos c; +code >>a ( n1 cnt -- n2 ) pop r0,sp mov tos,r0,asr tos c; +[then] + +code negate ( n -- -n ) rsb tos,tos,#0 c; + +code ?negate ( n f -- n | -n ) cmp tos,#0 pop tos,sp rsblt tos,tos,#0 c; + +code abs ( n -- [n] ) cmp tos,#0 rsbmi tos,tos,#0 c; + +code min ( n1 n2 -- n1|n2 ) pop r0,sp cmp tos,r0 movgt tos,r0 c; +code umin ( u1 u2 -- u1|u2 ) pop r0,sp cmp tos,r0 movcs tos,r0 c; +code max ( n1 n2 -- n1|n2 ) pop r0,sp cmp r0,tos movgt tos,r0 c; +code umax ( u1 u2 -- u1|u2 ) pop r0,sp cmp r0,tos movcs tos,r0 c; + +code up@ ( -- adr ) psh tos,sp mov tos,up c; +code sp@ ( -- adr ) psh tos,sp mov tos,sp c; +code rp@ ( -- adr ) psh tos,sp mov tos,rp c; +code up! ( adr -- ) mov up,tos pop tos,sp c; +code sp! ( adr -- ) mov sp,tos pop tos,sp c; +code rp! ( adr -- ) mov rp,tos pop tos,sp c; + +code >r ( n -- ) psh tos,rp pop tos,sp c; +code r> ( -- n ) psh tos,sp pop tos,rp c; +code r@ ( -- n ) psh tos,sp ldr tos,[rp] c; + +code 2>r ( n1 n2 -- ) mov r0,tos ldmia sp!,{r1,tos} stmdb rp!,{r0,r1} c; +code 2r> ( -- n1 n2 ) ldmia rp!,{r0,r1} stmdb sp!,{r1,tos} mov tos,r0 c; +code 2r@ ( -- n1 n2 ) ldmia rp,{r0,r1} stmdb sp!,{r1,tos} mov tos,r0 c; + +code >ip ( n -- ) psh tos,rp pop tos,sp c; +code ip> ( -- n ) psh tos,sp pop tos,rp c; +code ip@ ( -- n ) psh tos,sp ldr tos,[rp] c; + +: ip>token ( ip -- token-adr ) /token - ; + +code exit ( -- ) ldr ip,[rp],1cell c; +code unnest ( -- ) ldr ip,[rp],1cell c; + +code ?exit ( flag -- ) cmp tos,#0 pop tos,sp ldrne ip,[rp],1cell c; + +code tuck ( n1 n2 -- n2 n1 n2 ) pop r0,sp stmdb sp!,{r0,tos} c; + +code nip ( n1 n2 -- n2 ) inc sp,1cell c; + +[ifdef] notdef +code lwsplit ( n -- wlow whigh ) +\ mov r0,#0xffff + mov r0,#0xff + orr r0,r0,#0xff00 + and r1,tos,r0 + psh r1,sp + mov tos,tos,lsr #0x10 +c; +code wljoin ( w.low w.high -- n ) + pop r0,sp + orr tos,r0,tos,lsl #0x10 +c; +[then] +code wflip ( n1 -- n2 ) mov tos,tos,ror #0x10 c; +code flip ( w1 -- w2 ) + mov r0,tos,lsr #8 + and r1,tos,#0xff + orr tos,r0,r1,lsl #8 +c; + +code 0= ( n -- f ) subs tos,tos,#1 sbc tos,tos,tos c; +code 0<> ( n -- f ) cmp tos,#0 mvnne tos,#0 c; +code 0< ( n -- f ) mov tos,tos,asr #0 c; +code 0>= ( n -- f ) mvn tos,tos,asr #0 c; +code 0> ( n -- f ) bics tos,tos,tos,asr #0 mvnne tos,#0 c; +code 0<= ( n -- f ) cmp tos,#0 mvnle tos,#0 movgt tos,#0 c; + +code > ( n1 n2 -- f ) pop r0,sp cmp r0,tos mvngt tos,#0 movle tos,#0 c; +code < ( n1 n2 -- f ) pop r0,sp cmp r0,tos mvnlt tos,#0 movge tos,#0 c; +code = ( n1 n2 -- f ) pop r0,sp cmp r0,tos mvneq tos,#0 movne tos,#0 c; +[ifdef] fixme +code <> ( n1 n2 -- f ) pop r0,sp subs tos,r0,tos mvnne tos,#0 c; +code u> ( u1 u2 -- f ) pop r0,sp subs tos,tos,r0 sbc tos,tos,tos c; +code u<= ( u1 u2 -- f ) pop r0,sp cmp r0,tos mvnls tos,#0 movhi tos,#0 c; +code u< ( u1 u2 -- f ) pop r0,sp subs tos,r0,tos sbc tos,tos,tos c; +code u>= ( u1 u2 -- f ) pop r0,sp cmp r0,tos mvncs tos,#0 movcc tos,#0 c; +code >= ( n1 n2 -- f ) pop r0,sp cmp r0,tos mvnge tos,#0 movlt tos,#0 c; +code <= ( n1 n2 -- f ) pop r0,sp cmp r0,tos mvnle tos,#0 movgt tos,#0 c; +[else] +code u<= ( u1 u2 -- f ) pop r0,sp cmp r0,tos mvnls tos,#0 movhi tos,#0 c; +code u>= ( u1 u2 -- f ) pop r0,sp cmp r0,tos mvncs tos,#0 movcc tos,#0 c; +code >= ( n1 n2 -- f ) pop r0,sp cmp r0,tos mvnge tos,#0 movlt tos,#0 c; +code <= ( n1 n2 -- f ) pop r0,sp cmp r0,tos mvnle tos,#0 movgt tos,#0 c; +code <> ( n1 n2 -- f ) pop r0,sp subs tos,r0,tos mvnne tos,#0 c; +code u> ( u1 u2 -- f ) pop r0,sp subs tos,tos,r0 sbc tos,tos,tos c; +code u< ( u1 u2 -- f ) pop r0,sp subs tos,r0,tos sbc tos,tos,tos c; +[then] + +code drop ( n1 n2 -- n1 ) pop tos,sp c; +code dup ( n1 -- n1 n1 ) psh tos,sp c; +\ code ?dup ( n1 -- 0 | n1 n1 ) cmp tos,#0 pshne tos,sp c; +code over ( n1 n2 -- n1 n2 n1 ) psh tos,sp ldr tos,[sp,1cell] c; +code swap ( n1 n2 -- n2 n1 ) ldr r0,[sp] str tos,[sp] mov tos,r0 c; +code rot ( n1 n2 n3 -- n2 n3 n1 ) + mov r0,tos + ldmia sp!,{r1,tos} + stmdb sp!,{r0,r1} +c; +code -rot ( n1 n2 n3 -- n3 n1 n2 ) + ldmia sp!,{r1,r2} + stmdb sp!,{r2,tos} + mov tos,r1 +c; +code 2drop ( n1 n2 -- ) inc sp,1cell pop tos,sp c; +code 3drop ( n1 n2 n3 -- ) inc sp,2cells pop tos,sp c; +code 4drop ( n1 n2 n3 n4 -- ) inc sp,3cells pop tos,sp c; +code 5drop ( n1 n2 n3 n4 n5 -- ) inc sp,4cells pop tos,sp c; +code 2dup ( n1 n2 -- n1 n2 n1 n2 ) ldr r0,[sp] stmdb sp!,{r0,tos} c; +code 2over ( n1 n2 n3 n4 -- n1 n2 n3 n4 n1 n2 ) + ldr r0,[sp,2cells] + stmdb sp!,{r0,tos} + ldr tos,[sp,3cells] +c; +code 2swap ( n1 n2 n3 n4 -- n3 n4 n1 n2 ) + mov r0,tos + ldmia sp!,{r1,r2,r3} + stmdb sp!,{r0,r1} + psh r3,sp + mov tos,r2 +c; +code 3dup ( n1 n2 n3 -- n1 n2 n3 n1 n2 n3 ) + ldmia sp,{r0,r1} + stmdb sp!,{r0,r1,tos} +c; +code pick ( nm ... n1 n0 k -- nm ... n1 n0 nk ) ldr tos,[sp,tos,lsl #2] c; + +\ code roll ( n -- ) +\ add r1,sp,tos,lsl #2 +\ ldr tos,r1,1cell da +\ begin +\ ldria r0,r1,1cell +\ str r0,[r1],-2cells +\ cmp r1,sp +\ < until +\ inc sp,1cell +\ c; + +\ code between ( n min max -- flag ) +\ mov r1,tos +\ ldmia sp!,{r0,r2} +\ mov tos,#0 +\ cmp r2,r0 +\ ldrlt pc,[ip],1cell +\ cmp r2,r1 +\ mvnle tos,#0 +\ c; + +code 1+ ( n -- n+1 ) inc tos,1 c; +code 2+ ( n -- n+2 ) inc tos,2 c; +code 1- ( n -- n-1 ) dec tos,1 c; +code 2- ( n -- n-2 ) dec tos,2 c; +code 2/ ( n -- n/2 ) mov tos,tos,asr #1 c; +code u2/ ( u -- u/2 ) mov tos,tos,lsr #1 c; +code 2* ( n -- 2n ) mov tos,tos,lsl #1 c; +code 4* ( n -- 4n ) mov tos,tos,lsl #2 c; +code 8* ( n -- 8n ) mov tos,tos,lsl #3 c; + +code on ( adr -- ) mvn r0,#0 str r0,[tos] pop tos,sp c; +code off ( adr -- ) mov r0,#0 str r0,[tos] pop tos,sp c; +code +! ( n adr -- ) + mov r0,tos + ldmia sp!,{r1,tos} + ldr r2,[r0] + add r2,r2,r1 + str r2,[r0] +c; + +code l@ ( adr -- n ) ldr tos,[tos] c; +[ifdef] arm4 +\ Halfword access +code w! ( w adr -- ) + pop r0,sp + h# e1ca00b0 asm, \ strh r0,tos + pop tos,sp +c; +code w@ ( adr -- w ) + h# e1daa0b0 asm, \ ldrh tos,tos +c; +code <w@ ( adr -- w ) + h# e1daa0f0 asm, \ ldrsh tos,tos +c; + +\ code w@ ( adr -- n ) ldrh tos,[tos] c; +\ code <w@ ( adr -- n ) ldrsh tos,[tos] c; +\ code w! ( n adr -- ) +\ pop r0,sp +\ strh r0,[tos] +\ pop tos,sp +\ c; +[else] +code w@ ( adr -- n ) ldr tos,[tos] c; +code <w@ ( adr -- n ) ldr tos,[tos] c; +code w! ( n adr -- ) pop r0,sp str r0,[tos] pop tos,sp c; +[then] +code l! ( n adr -- ) pop r0,sp str r0,[tos] pop tos,sp c; +code @ ( adr -- n ) ldr tos,[tos] c; + +code unaligned-@ ( adr -- n ) + bic r1,tos,#3 + ldmia r1,{r2,r3} + and r1,tos,#3 + movs r1,r1,lsl #3 + movne r2,r2,lsr r1 + rsbne r1,r1,#0x20 + orrne r2,r2,r3,lsl r1 + mov tos,r2 +c; +code c@ ( adr -- char ) ldrb tos,[tos] c; +code ! ( n adr -- ) pop r0,sp str r0,[tos] pop tos,sp c; +code unaligned-! ( n adr -- ) + mov r5,tos \ r5: adr + ldmia sp!,{r4,tos} + strb r4,[r5],#1 + mov r4,r4,ror #8 + strb r4,[r5],#1 + mov r4,r4,ror #8 + strb r4,[r5],#1 + mov r4,r4,ror #8 + strb r4,[r5],#1 +c; + +code unaligned-w@ ( adr -- w ) + ldrb r0,[tos] + ldrb tos,[tos,#1] + + orr tos,r0,tos,lsl #8 +c; +code unaligned-w! ( w adr -- ) + pop r0,sp + strb r0,[tos] + mov r0,r0,ror #8 + strb r0,[tos,#1] + + pop tos,sp +c; +: unaligned-l@ ( adr -- l ) unaligned-@ ; +: unaligned-l! ( l adr -- ) unaligned-! ; +: unaligned-d! ( d adr -- ) tuck na1+ unaligned-! unaligned-! ; +: d@ ( adr -- d ) dup @ swap na1+ @ ; + +code c! ( char adr -- ) pop r0,sp strb r0,[tos] pop tos,sp c; +code 2@ ( adr -- n-high n-low ) + ldr r0,[tos,1cell] + psh r0,sp + ldr tos,[tos] +c; +code 2! ( n-high n-low adr -- ) + ldmia sp!,{r0,r1} + stmia tos,{r0,r1} + pop tos,sp +c; + +code d+ ( d1 d2 -- d1+d2 ) + ldmia sp!,{r0,r1,r2} \ tos r0 r1 r2 + adds r0,r0,r2 + adc tos,tos,r1 + psh r0,sp +c; + +code d- ( d1 d2 -- d1-d2 ) + ldmia sp!,{r0,r1,r2} \ tos r0 r1 r2 + subs r2,r2,r0 + sbc r1,r1,tos + psh r2,sp + mov tos,r1 +c; +code d< ( d1 d2 -- f ) + ldmia sp!,{r0,r1,r2} \ tos r0 r1 r2 + subs r2,r2,r0 + sbcs tos,r1,tos + mov tos,tos,asr #0 +c; +code d> ( d1 d2 -- f ) + ldmia sp!,{r0,r1,r2} \ tos r0 r1 r2 + subs r0,r0,r2 + sbcs tos,tos,r1 + mov tos,tos,asr #0 +c; +code du< ( d1 d2 -- f ) + ldmia sp!,{r0,r1,r2} \ tos r0 r1 r2 + subs r2,r2,r0 + sbcs r1,r1,tos + sbc tos,tos,tos +c; + +code s>d ( n -- d ) + psh tos,sp + mov tos,tos,asr #0 +c; +code dnegate ( d -- -d ) + pop r0,sp + rsbs r0,r0,#0 + rsc tos,tos,#0 + psh r0,sp +c; +code ?dnegate ( d flag -- d ) + cmp tos,#0 + pop tos,sp + < if + pop r0,sp + rsbs r0,r0,#0 + rsc tos,tos,#0 + psh r0,sp + then +c; + +code dabs ( d -- d ) + cmp tos,#0 + < if + pop r0,sp + rsbs r0,r0,#0 + rsc tos,tos,#0 + psh r0,sp + then +c; +code d0= ( d -- f ) + pop r0,sp + orrs r0,r0,tos + mvneq tos,#0 + movne tos,#0 +c; +code d0< ( d -- f ) + inc sp,1cell + mov tos,tos,asr #0 +c; +code d2* ( d1 -- d2 ) + pop r0,sp + mov tos,tos,lsl #1 + orr tos,tos,r0,lsr #31 + mov r0,r0,lsl #1 + psh r0,sp +c; +code d2/ ( s1 -- d2 ) + pop r0,sp + movs tos,tos,lsr #1 + mov r0,r0,ror #0 + psh r0,sp +c; +: d= ( d1 d2 -- flag ) d- d0= ; +: d<> ( d1 d2 -- flag ) d= 0= ; + +: (d.) ( d -- adr len ) tuck dabs <# #s rot sign #> ; +: (ud.) ( ud -- adr len ) <# #s rot #> ; + +: d. ( d -- ) (d.) type space ; +: ud. ( ud -- ) (ud.) type space ; +: ud.r ( ud n -- ) >r (ud.) r> over - spaces type ; + +: dmax ( xd1 xd2 -- ) 2over 2over d< if 2swap then 2drop ; +: dmin ( xd1 xd2 -- ) 2over 2over d< 0= if 2swap then 2drop ; + +code fill ( adr cnt char -- ) + orr r2,tos,tos,lsl #8 + ldmia sp!,{r0,r1,tos} \ r0-cnt r1-adr r2-data + cmp r0,#4 + > if + orr r2,r2,r2,lsl #0x10 \ Propagate character into high halfword + begin \ Fill initial unaligned part + ands r3,r1,#3 + decne r0,1 + strneb r2,[r1],#1 + 0= until + decs r0,4 + begin + strge r2,[r1],#4 + decges r0,4 + < until + inc r0,4 + then + begin + decs r0,1 + strgeb r2,[r1],#1 + < until +c; + +code wfill ( adr cnt w -- ) + mov r2,tos + ldmia sp!,{r0,r1,tos} \ r0-cnt r1-adr r2-data + begin + decs r0,2 + strgeh r2,[r1],#2 + < until +c; + +code lfill ( adr cnt l -- ) + mov r2,tos + ldmia sp!,{r0,r1,tos} \ r0-cnt r1-adr r2-data + begin + decs r0,4 + strge r2,[r1],#4 + < until +c; + +\ code /link ( -- /link ) psh tos,sp mov tos,/link c; + +code /char ( -- 1 ) psh tos,sp mov tos,#1 c; +code /cell ( -- 4 ) psh tos,sp mov tos,1cell c; + +code chars ( n1 -- n1 ) c; +code cells ( n -- 4n ) mov tos,tos,lsl #2 c; +code char+ ( adr -- adr1 ) inc tos,#1 c; +code cell+ ( adr -- adr1 ) inc tos,1cell c; +code chars+ ( adr index -- adr1 ) pop r0,sp add tos,r0,tos c; +code cells+ ( adr index -- adr1 ) pop r0,sp add tos,r0,tos,lsl #2 c; + +code next-char ( addr u -- addr-char u+char ) + dec tos,1 + pop r0,sp + inc r0,1 + psh r0,sp +c; + +code n->l ( n.unsigned -- l ) c; +code ca+ ( adr index -- adr1 ) pop r0,sp add tos,r0,tos c; +code wa+ ( adr index -- adr1 ) pop r0,sp add tos,r0,tos,lsl #1 c; +code la+ ( adr index -- adr1 ) pop r0,sp add tos,r0,tos,lsl #2 c; +code na+ ( adr index -- adr1 ) pop r0,sp add tos,r0,tos,lsl #2 c; +code ta+ ( adr index -- adr1 ) pop r0,sp add tos,r0,tos,lsl #2 c; + +code ca1+ ( adr -- adr1 ) inc tos,1 c; +code wa1+ ( adr -- adr1 ) inc tos,2 c; +code la1+ ( adr -- adr1 ) inc tos,1cell c; +code na1+ ( adr -- adr1 ) inc tos,1cell c; +code ta1+ ( adr -- adr1 ) inc tos,1cell c; + +code /c ( -- 1 ) psh tos,sp mov tos,#1 c; +code /w ( -- 4 ) psh tos,sp mov tos,#2 c; +code /l ( -- 4 ) psh tos,sp mov tos,#4 c; +code /n ( -- 4 ) psh tos,sp mov tos,1cell c; + +code /c* ( n1 -- n1 ) c; +code /w* ( n1 -- n2 ) mov tos,tos,lsl #1 c; +code /l* ( n1 -- n2 ) mov tos,tos,lsl #2 c; +code /n* ( n1 -- n2 ) mov tos,tos,lsl #2 c; + +8 equ nvocs \ Number of slots in the search order + +code upc ( char -- upper-case-char ) + and tos,tos,#0xff + cmp tos,#0x61 \ ascii a + nxtlt + cmp tos,#0x7b \ ascii { + declt tos,#0x20 +c; +code lcc ( char -- lower-case-char ) + and tos,tos,#0xff + cmp tos,#0x41 \ ascii A + nxtlt + cmp tos,#0x5b \ ascii [ + inclt tos,#0x20 +c; +code comp ( adr1 adr2 len -- -1 | 0 | 1 ) + inc tos,1 \ tos length + ldmia sp!,{r0,r1} + begin + decs tos,#1 + 0<> while + ldrb r2,[r0],#1 + ldrb r3,[r1],#1 + cmp r2,r3 +[ifdef] fixme +0<> if + movgt tos,#1 + mvnlt tos,#0 + nxtne +then +[else] + movgt tos,#1 + mvnlt tos,#0 + nxtne +[then] + repeat + mov tos,#0 +c; +code caps-comp ( adr1 adr2 len -- -1 | 0 | 1 ) + add tos,tos,#1 \ tos length + ldmia sp!,{r0,r1} + begin + decs tos,1 + 0<> while + mov r2,#0 + ldrb r2,[r0],#1 + cmp r2,#0x41 \ ascii A + > if + cmp r2,#0x5b \ ascii [ + inclt r2,#0x20 + then + mov r3,#0 + ldrb r3,[r1],#1 + cmp r3,#0x41 \ ascii A + > if + cmp r3,#0x5b \ ascii [ + inclt r3,#0x20 + then + cmp r2,r3 +[ifdef] fixme +0<> if + movgt tos,#1 + mvnlt tos,#0 + nxtne +then +[else] + movgt tos,#1 + mvnlt tos,#0 + nxtne +[then] + repeat + mov tos,#0 +c; +code pack ( str-adr len to -- to ) + mov r0,tos \ to + ldmia sp!,{r1,r2} + ands r1,r1,#0xff \ set length flag + strb r1,[r0],#1 + 0<> if + begin + ldrb r3,[r2],#1 + strb r3,[r0],#1 + decs r1,#1 + 0= until + then + mov r1,#0 + strb r1,[r0],#1 +c; + +code (') ( -- n ) psh tos,sp ldr tos,[ip],1cell c; + +\ Modifies caller's ip to skip over an in-line string +code skipstr ( -- adr len) + psh tos,sp + ldr r0,[rp] + ldrb tos,[r0],#1 + psh r0,sp + add r0,r0,tos + inc r0,1cell + bic r0,r0,#3 + str r0,[rp] +c; +code (") ( -- adr len) + psh tos,sp + ldrb tos,[ip],#1 + psh ip,sp + add ip,ip,tos + inc ip,#4 + bic ip,ip,#3 +c; +code traverse ( adr direction -- adr' ) + mov r0,tos \ direction r0 + pop tos,sp \ adr -> tos + add tos,tos,r0 + begin + ldrb r1,[tos] + and r1,r1,#0x80 + 0= while + add tos,tos,r0 + repeat +c; +code count ( adr -- adr1 cnt ) + mov r0,tos + ldrb tos,[r0],#1 + psh r0,sp +c; + +: instruction! ( n adr -- ) tuck l! /cell sync-cache ; + +\ a colon-magic doesn't exist in this ARM version +: place-cf ( adr -- ) + acf-align + here - 2/ 2/ 2- 00ffffff and eb000000 or + here /cell allot instruction! +; +\ place a branch+link to target at adr +: put-cf ( target adr -- ) + dup >r - 2/ 2/ 2- 00ffffff and eb000000 or + r> instruction! +; + +: instruction, ( n -- ) here /cell allot instruction! ; +: push-pfa ( -- adr ) + e52da004 instruction, \ psh tos,sp +\ e3cea3ff instruction, \ bic tos,lk,#0xfc00.0003 + e1a0a00e instruction, \ mov tos,lk +; + +: origin- ( adr -- offset ) origin - ; +: origin+ ( offset -- adr ) origin + ; + +: code-cf ( -- ) acf-align ; +: code? ( acf -- f ) \ True if the acf is for a code word + @ h# ff000000 and h# eb000000 <> +; +: >code ( acf-of-code-word -- address-of-start-of-machine-code ) ; + +\ 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. + +: colon-cf ( -- ) docolon origin+ place-cf ; +: colon-cf? ( adr -- flag ) word-type docolon origin + = ; +: docolon ( -- adr ) docolon origin+ ; +: create-cf ( -- ) docreate origin+ place-cf ; +: variable-cf ( -- ) dovariable origin+ place-cf ; +: user-cf ( -- ) douser origin+ place-cf ; +: value-cf ( -- ) dovalue origin+ place-cf ; +: constant-cf ( -- ) doconstant origin+ place-cf ; +: defer-cf ( -- ) dodefer origin+ place-cf ; +: 2constant-cf ( -- ) do2constant origin+ place-cf ; +: place-does ( -- ) push-pfa dodoesaddr token@ place-cf ; + +: does-ip? ( ip -- ip' flag ) + dup token@ ['] (does>) = if 4 na+ true else na1+ false then +; + +: place-;code ( -- ) ; + +\ next is redefined in cpu/arm/code.fth so that it can be conditional +\ Version for next in user area +: next ( -- ) h# e1a0f009 instruction, ; +\ Version for in-line next +\ : next ( -- ) h# e498f004 instruction, ; + +\ New: : pointer-cf ( -- ) dopointer literal origin+ place-cf ; +\ New: : buffer-cf ( -- ) dobuffer literal origin+ place-cf ; + +\ uses sets the code field of the indicated word so that +\ it will execute the code at action-clause-adr +: uses ( action-clause-adr xt -- ) put-cf ; + +\ used sets the code field of the most-recently-defined word so that +\ it executes the code at action-clause-adr +: used ( action-clause-adr -- ) lastacf uses ; + +\ operators using addresses, links and tokens +/a-t constant /a +: a@ ( adr -- adr ) l@ ; +: a! ( adr adr -- ) set-relocation-bit l! ; +: a, ( adr -- ) here /a allot a! ; +\ : link@ ( adr -- adr ) @ ; +\ : link! ( adr adr -- ) a! ; +\ : link, ( adr -- ) a, ; +\ : link-here ( adr -- ) align here over @ link, swap ! ; + +/n-t constant /branch + +\rel : branch, ( offset -- ) , ; +\rel : branch! ( offset where -- ) ! ; +\rel : branch@ ( where -- offset ) @ ; +\rel : >target ( ip -- target ) ta1+ dup branch@ + ( h# ffffc and ) ; +\abs : branch, ( offset -- ) here + a, ; +\abs : branch! ( offset where -- ) swap over + swap a! ; +\abs : branch@ ( where -- offset ) @ ; +\abs : >target ( ip -- target ) ta1+ branch@ ; + +/token constant /token +: token@ ( adr -- cfa ) l@ ; +: token! ( cfa adr -- ) set-relocation-bit l! ; +: token, ( cfa -- ) here /token allot token! ; + +\ XXX this is a kludgy way to make a relocated constant +origin-t constant origin /n negate allot-t origin-t token,-t + +: 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 +; +: 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 ARM Implementation, this always returns the adress of the +\ code sequence for that word. + +code >body ( cfa -- pfa ) + ldr r0,[tos] + and r0,r0,#0xff000000 + cmp r0,#0xeb000000 + inceq tos,1cell +c; +code body> ( pfa -- cfa ) + ldr r0,[tos,~/token] + and r0,r0,#0xff000000 + cmp r0,#0xeb000000 + deceq tos,1cell +c; +code word-type ( cfa -- word-type ) + ldr r0,[tos] + and r1,r0,#0xff000000 + cmp r1,#0xeb000000 + moveq r0,r0,lsl #8 + moveq r0,r0,asr #6 + inceq r0,8 + addeq tos,tos,r0 +\ bic tos,tos,#0xfc000003 +c; + +4 constant /user# + +\ Move to a machine alignment boundary. All ARM-Processors need +\ 32-bit alignment +: aligned ( adr -- adr' ) /n round-up ; +: acf-aligned ( adr -- adr' ) aligned ; +: acf-align ( adr -- adr' ) + begin here #acf-align 1- and while 0 c, repeat + here 'lastacf token! +; + +only forth also labels also meta +also arm-assembler helpers also arm-assembler definitions +:-h 'body ( "name" -- variable-apf adt-immed ) + [ also meta ]-h ' ( acf-of-user-variable ) >body-t + [ previous ]-h adt-immed +;-h +:-h 'code ( "name" -- code-word-acf adt-immed ) + [ also meta ]-h ' ( acf-of-user-variable ) + [ previous ]-h adt-immed +;-h +:-h 'user# ( "name" -- user# adt-immed ) + [ also meta ]-h ' ( acf-of-user-variable ) >body-t @-t + [ previous ]-h adt-immed +;-h +:-h 'user ( "name" -- ) +\ [ also register-names ] up [ previous ] drop ( reg# ) + up drop ( reg# ) + d# 16 lshift iop + 'user# ( value adt-immed ) + drop d# 12 ?#bits iop +; +only forth also labels also meta also definitions + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/kerncode.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/kernel.bth =================================================================== --- cpu/arm/kernel.bth (rev 0) +++ cpu/arm/kernel.bth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,151 @@ +purpose: Load file for ARM Forth kernel +\ See license at end of file + +command: &builder &this +build-now + +\ z only forth also definitions decimal +\ z warning on + +\ ' $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 + +\ Configure for relative branch targets. Absolute branch targets +\ do not work correctly with FCode because of the way that FCode +\ backward branch resolution works. +: \rel ( -- ) ; immediate +: \abs ( -- ) [compile] \ ; immediate +create arm4 + +alias constant-h constant + +fload ${BP}/forth/kernel/conft32.fth +fload ${BP}/forth/kernel/meta1.fth + + +[ifndef] arm-assembler \ Make sure we have the ARM assembler +order cr +only forth also definitions + +fload ${BP}/forth/lib/bitops.fth +\needs set-relocation-bit defer set-relocation-bit \ keep init-assem happy + +\ only forth also meta also definitions + +fload ${BP}/cpu/arm/assem.fth +fload ${BP}/cpu/arm/code.fth + +[then] +only forth also meta also definitions +: sx .s cr ; + +only forth also meta definitions +: assembler ( -- ) arm-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/nswapmap.fth \ Null swap map +\ : : : lastacf .name cr ; +fload ${BP}/cpu/arm/target.fth +fload ${BP}/forth/kernel/forward.fth +fload ${BP}/cpu/ppc/fixvoc.fth +fload ${BP}/forth/kernel/metacompile.fth + +fload ${BP}/cpu/arm/metarel.fth + +only forth meta also forth also definitions + +' meta-set-relocation-bit is set-relocation-bit-t +' meta-init-relocation is init-relocation-t +\ protocol? on + +only forth also definitions decimal + +warning on +fload ${BP}/cpu/arm/metainit.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/arm/kerncode.fth +fload ${BP}/cpu/arm/extra.fth + +fload ${BP}/forth/kernel/uservars.fth +fload ${BP}/cpu/arm/muldiv.fth \ Uses "defer"; must be after uservars +fload ${BP}/cpu/arm/dodoesad.fth +fload ${BP}/cpu/arm/version.fth + +fload ${BP}/forth/kernel/double.fth \ ??? +fload ${BP}/forth/kernel/scan.fth + +fload ${BP}/cpu/arm/bitops.fth +fload ${BP}/cpu/arm/kernrel.fth + +fload ${BP}/forth/lib/struct.fth + +fload ${BP}/forth/kernel/kernel.fth + +fload ${BP}/forth/kernel/sysio.fth +fload ${BP}/forth/lib/dumballo.fth +fload ${BP}/cpu/arm/sys.fth + +\ fload ${BP}/forth/kernel/nswapmap.fth \ Null swap map + +\ fload ${BP}/cpu/arm/field.fth +fload ${BP}/cpu/arm/filecode.fth + +fload ${BP}/cpu/arm/boot.fth +fload ${BP}/forth/kernel/init.fth +fload ${BP}/cpu/arm/finish.fth + +fload ${BP}/cpu/arm/savemeta.fth + +\Tags close-tag-file +\NotTags .( --- Saving ) " kernel.dic" type .( ---) +" kernel.dic" $save-meta cr +cr + +\ LICENSE_BEGIN +\ Copyright (c) 2008 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
Property changes on: cpu/arm/kernel.bth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/kernfloat.fth =================================================================== --- cpu/arm/kernfloat.fth (rev 0) +++ cpu/arm/kernfloat.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,63 @@ +purpose: Kernel-level floating point words +\ See license at end of file + +\ Contributed by Hanno Schwalm + +code fp@ ( -- adr ) + top sp push + top 'user fp ldr c; + +code fp! ( a_adr -- ) + top 'user fp str + top sp pop c; +code (flit) ( -- ) + r0 r1 2 ip ia! ldm + r2 'user fp ldr + r0 r1 2 r2 db! stm + r2 'user fp str c; +code f@ ( adr -- ) ( -- f1 ) + r0 r1 2 top ia ldm + r2 'user fp ldr + r0 r1 2 r2 db! stm + r2 'user fp str + top sp pop c; +code f! ( adr -- ) ( f1 -- ) + r2 'user fp ldr + r0 r1 2 r2 ia! ldm + r2 'user fp str + r0 r1 2 top ia stm + top sp pop c; + +code /float ( -- 8) + top sp push top 8 # mov c; +code floats ( n -- 8n ) + top top 3 #asl mov c; +code float+ ( adr -- adr1 ) + top 8 incr c; +code floats+ ( a_adr index -- a_adr1 ) + r0 sp pop + top r0 top 3 #asl add c; + +\ LICENSE_BEGIN +\ Copyright (c) 2008 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
Property changes on: cpu/arm/kernfloat.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/kernrel.fth =================================================================== --- cpu/arm/kernrel.fth (rev 0) +++ cpu/arm/kernrel.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,81 @@ +purpose: Maintains a bitmap identifying longwords that need to be relocated +\ See license at end of file + +\ h# 8.0000 equ max-image +h# 8.0000 constant max-image + +0 value relocation-map + +\ The relocation map has one bit for every 32-bit word, since we assume +\ that relocated longwords must start on a 32-bit boundary + +\ If the address is within the new part of the dictionary (between +\ relocation-base and relocation-base + max-image), set the corresponding +\ bit in relocation-map. If the address is within the user area, +\ (between up@ and up@ + #user), set the corresponding bit in +\ user-relocation-map + +: >relbit ( adr -- bit# array ) origin - /l / relocation-map ; + +\ This has to be deferred so it can be turned off until the relocation +\ table has been initialized. + +defer set-relocation-bit ' noop is set-relocation-bit +defer clear-relocation-bits ' 2drop is clear-relocation-bits +: (set-relocation-bit ( adr -- adr ) + dup origin dup max-image + within if ( adr ) + dup >relbit bitset + then +; +: (clear-relocation-bits ( adr len -- ) + bounds ?do i >relbit bitclear /n +loop +; + +: relocation-on ( -- ) + ['] (set-relocation-bit ['] set-relocation-bit (is + ['] (clear-relocation-bits ['] clear-relocation-bits (is +; +: relocation-off ( -- ) + ['] noop ['] set-relocation-bit (is + ['] 2drop ['] clear-relocation-bits (is +; + +: init-relocation ( -- ) \ Allocate relocation map + max-image d# 32 / ( #map-bytes ) + dup alloc-mem ( #map-bytes adr ) + is relocation-map ( #map-bytes ) + relocation-map swap erase + here relocation-map + origin h# 10 + l@ h# 1f + 5 rshift move + + \ Now that the table is set up, set-relocation-bit may be turned on + relocation-on +; + +: set-swap-bit ( addr -- ) drop ; +: note-string ( adr len -- adr len ) ; +decimal + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/kernrel.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/loadmach.fth =================================================================== --- cpu/arm/loadmach.fth (rev 0) +++ cpu/arm/loadmach.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,68 @@ +purpose: Load file for machine-dependent Forth tools +\ See license at end of file + +assembler? [if] +fload ${BP}/cpu/arm/assem.fth +fload ${BP}/cpu/arm/code.fth +fload ${BP}/forth/lib/loclabel.fth +[else] +transient fload ${BP}/cpu/arm/assem.fth resident +fload ${BP}/cpu/arm/code.fth +transient fload ${BP}/forth/lib/loclabel.fth resident +[then] + +fload ${BP}/cpu/arm/decompm.fth + +: be-l, ( l -- ) here 4 note-string allot be-l! ; + +\needs $save-forth transient fload ${BP}/cpu/arm/savefort.fth resident +\ alias $save-forth $save-forth + +fload ${BP}/cpu/arm/disassem.fth \ Exports (dis , pc , dis1 , +dis +fload ${BP}/forth/lib/instdis.fth + +fload ${BP}/cpu/arm/objsup.fth +fload ${BP}/forth/lib/objects.fth + +fload ${BP}/cpu/arm/call.fth \ C subroutine calls + +fload ${BP}/forth/lib/rstrace.fth +fload ${BP}/cpu/arm/debugm.fth \ Forth debugger support +fload ${BP}/forth/lib/debug.fth \ Forth debugger + +fload ${BP}/cpu/arm/cpustate.fth +fload ${BP}/cpu/arm/register.fth + +fload ${BP}/forth/lib/savedstk.fth +fload ${BP}/cpu/arm/ftrace.fth +fload ${BP}/cpu/arm/ctrace.fth + +start-module \ Breakpointing +fload ${BP}/cpu/arm/cpubpsup.fth \ Breakpoint support +fload ${BP}/forth/lib/breakpt.fth +\ fload ${BP}/cpu/arm/catchexc.fth +end-module + +\ LICENSE_BEGIN +\ Copyright (c) 1994 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
Property changes on: cpu/arm/loadmach.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/loadvmem.fth =================================================================== --- cpu/arm/loadvmem.fth (rev 0) +++ cpu/arm/loadvmem.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,47 @@ +purpose: Load file for virtual memory node +\ See license at end of file + +headers +fload ${BP}/ofw/core/allocmor.fth \ S Allow alloc-mem to use more memory + +dev / +new-device +" mmu" device-name +fload ${BP}/ofw/core/virtlist.fth \ Virtual memory allocator +fload ${BP}/ofw/core/maplist.fth \ Manage translation list + +fload ${BP}/cpu/arm/mmu.fth + +: .t translations translation-node .list ; + +' 2drop is ?splice + +finish-device +device-end + +: map? ( virtual -- ) " map?" mmu-node @ $call-method ; +: .t ( -- ) " .t" mmu-node @ $call-method ; + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/loadvmem.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/memtest.fth =================================================================== --- cpu/arm/memtest.fth (rev 0) +++ cpu/arm/memtest.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,112 @@ +purpose: Memory test primitives in assembly language +\ See license at end of file + +headers +\needs mask nuser mask mask on +headerless + +\ Report the progress through low-level tests +0 0 2value test-name +: show-status ( adr len -- ) to test-name ; + +code lfill ( adr len l -- ) + \ tos: pattern + ldmia sp!,{r0,r1} \ r0: len, r1: adr + + ahead begin \ Fill + str tos,[r0,r1] + but then + decs r0,1cell + 0< until + + pop tos,sp +c; + +code masked-ltest ( adr len l mask -- error? ) + mov r4,tos \ r4: mask + ldmia sp!,{r0,r1,r2} \ r0: l, r1: len, r2: adr + and r0,r0,r4 \ Mask l + mvn tos,#0 \ tos: failure code (in case of mismatch) + + ahead begin \ Test + ldr r3,[r2,r1] \ Get data from memory + and r3,r3,r4 \ mask memory data + cmp r3,r0 \ Test under mask + nxtne \ Exit if mismatch + but then + decs r1,1cell + 0< until + + mov tos,#0 +c; + +: mem-bits-test ( membase memsize -- fail-status ) + " Data bits test" show-status + 2dup h# 5a5a5a5a lfill + 2dup h# 5a5a5a5a mask @ masked-ltest if 2drop true exit then + + 2dup h# a5a5a5a5 lfill + h# a5a5a5a5 mask @ masked-ltest +; + +code afill ( adr len -- ) + pop r0,sp \ tos: len, r0: adr + + ahead begin \ Fill + add r1,r0,tos \ Compute address + str r1,[r0,tos] \ Store it at the location + but then + decs tos,1cell \ Decrement index + 0< until + + pop tos,sp +c; + +code masked-atest ( adr len mask -- mismatch? ) + mov r4,tos \ r4: mask + ldmia sp!,{r0,r1} \ r0: len, r1: adr + mvn tos,#0 \ tos: failure code (in case of mismatch) + + ahead begin \ Check + add r2,r0,r1 \ Compute pattern + and r2,r2,r4 \ under mask + ldr r3,[r0,r1] \ Get data from memory + and r3,r3,r4 \ under mask + cmp r3,r2 \ Compare + nxtne \ Exit if mismatch + but then + decs r0,1cell + 0< until + + mov tos,#0 +c; + +: address=data-test ( membase memsize -- status ) + " Address=data test" show-status + + 2dup afill mask @ masked-atest +; + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/memtest.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/metainit.fth =================================================================== --- cpu/arm/metainit.fth (rev 0) +++ cpu/arm/metainit.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,68 @@ +purpose: Metacompiler initialization for kernel compilation +\ See license at end of file + +\ Handle command line +\ Make interpreter re-entrant - multiple tibs? (pokearound) +\ Handle end-of-file on input stream +\ Fix "" to be state smart +\ Meta compiler source for the Forth 83 kernel. +\ Debugging aids + +hex + 0 #words ! + 800 threshold ! + 800 granularity ! +warning off + +forth definitions +: ` [compile] "" pad "copy pad ; + +variable >cld >cld off \ helps forward referencing cold + +metaon meta definitions +max-kernel 40 + alloc-mem target-image \ Allocate space for the target image + +\ org sets the lowest address that is used by Forth kernel. +\ This is sort of a funny number, being a target token rather +\ than a real absolute address. +0.0000 org 0.0000 voc-link-t token-t! + +initmeta +ps-size-t equ ps-size +rs-size-t equ rs-size + +assembler +\ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +\ !!!!!!!!!!!!!!! the processor starts right here !!!!!!!!!! +\ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +mlabel cld + lnk r6 + dec r6,#0x10 \ header address in r6 + 0 asm, \ space for a branch and link, to be patched in later +meta +0 a,-t +h# 10 allot-t \ register saving area, reserved for internals + +\ LICENSE_BEGIN +\ Copyright (c) 1986 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
Property changes on: cpu/arm/metainit.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/metarel.fth =================================================================== --- cpu/arm/metarel.fth (rev 0) +++ cpu/arm/metarel.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,40 @@ +purpose: Maintain a relocation table +\ See license at end of file + +\needs lbsplit fload ${BP}/fm/lib/split.fth + +max-kernel d# 32 / constant /relocation-map \ Number of bytes in bitmap +create relocation-map /relocation-map allot + +\ The relocation map has one bit for every 32-bit word, since we assume +\ that relocated longwords must start on a 32-bit boundary + +: >offset ( adr -- offset ) /l / ; +: meta-set-relocation-bit ( adr -- adr ) + dup >offset relocation-map bitset +; +: meta-init-relocation ( -- ) relocation-map /relocation-map 0 fill ; + +\ LICENSE_BEGIN +\ Copyright (c) 2008 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
Property changes on: cpu/arm/metarel.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/minifth.fth =================================================================== --- cpu/arm/minifth.fth (rev 0) +++ cpu/arm/minifth.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,1127 @@ +purpose: Forth-like peek/poke/memory-test monitor using only registers +\ See license at end of file + +\ Requires the following external definitions: +\ isa-io-pa ( -- n ) \ Returns the base address of IO space +\ init-serial ( -- ) \ May destroy r0-r3 +\ getchar ( -- r0: char ) \ May destroy r0-r3 +\ putchar ( r0: char -- ) \ May destroy r0-r3 + +\ The following code must run entirely from registers. The following +\ register allocation conventions are used: +\ r0-r3 Argument passing and return, scratch registers for subroutines +\ r4 Return address for level 1 routines, scratch use for level 2+ +\ r5 Return address for level 2 routines, scratch use for level 3+ +\ r6-r7 Used as needed within higher-level subroutines +\ r8 Global state flags - bitmasks are: +\ 1 - spin mode +\ 2 - quiet mode +\ 4 - script mode +\ 8 - no-echo mode +\ r9 script pointer +\ r10-r13 4-element stack +\ r14 Link register for subroutine calls +\ r15 Program counter + +\ Send a space character to the output device. +label putspace ( -- ) \ Level 0, destroys: r0-r3 (because it calls putchar) + mov r0,#0x20 + b `putchar` +end-code + +\ Send a newline sequence (CR-LF) to the output device. +label putcr ( -- ) \ Level 1, destroys: r0-r4 (because it calls putchar) + mov r4,lr + mov r0,#0x0d + bl `putchar` + mov r0,#0x0a + bl `putchar` + mov pc,r4 +end-code + +\ Send ": " to the output device. +label putcolon ( -- ) \ Level 1, destroys: r0-r4 + mov r4,lr + mov r0,`char : #` + bl `putchar` + bl `putspace` + mov pc,r4 +end-code + +\ Accept input characters, packing up to 8 of them into the register pair +\ r0,r1. The first character is placed in the least-significant byte of +\ r1, and for each subsequent character, the contents of r0,r1 are shifted +\ left by 8 bits to make room for the new character (shifting the most- +\ significant byte of r1 into the least-significant byte of r0). +\ A backspace character causes r0,r1 to be shifted right, discarding the +\ previous character. +\ The process terminates when a space or carriage return is seen. The +\ terminating character is not stored in r0,r1. Any unused character +\ positions in r0,r1 contain binary 0 bytes. +label getword ( -- r0,r1 ) \ Level 4, destroys r0-r7 + mov r5,lr + mov r6,#0 \ Clear high temporary holding register + mov r7,#0 \ Clear low temporary holding register + + begin + tst r8,#4 0<> if + ldrb r0,[r9],#1 + \ Translate linefeed to carriage return in script mode + cmp r0,#0x0a = if mov r0,#0x0d then + else + bl `getchar` ( char in r0 ) + then + + cmp r0,#0x0d = if \ carriage return + tst r8,#8 0= if \ Check no-echo flag + bl `putcr` \ Echo CR-LF + then + mov r0,r6 mov r1,r7 \ Return packed word in r0,r1 + mov pc,r5 \ Return + then + + cmp r0,`control h` <> if + cmp r0,#0x20 <= if \ white space + tst r8,#8 0= if \ Check no-echo flag + \ In quiet mode, echo the input character; otherwise echo CR-LF + tst r8,#2 0<> if bl `putchar` else bl `putcr` then + then + mov r0,r6 mov r1,r7 \ Return packed word in r0,r1 + mov pc,r5 \ Return + then + then + + mov r4,r0 \ Save character + tst r8,#8 0= if \ Check no-echo flag + bl `putchar` \ Echo the character + then + + cmp r4,`control h` = if + \ Double-shift right one byte + mov r7,r7,lsr #8 + orr r7,r7,r6,lsl #24 + mov r6,r6,lsr #8 + else + \ Double-shift left one byte and merge in the new character + mov r6,r6,lsl #8 + orr r6,r6,r7,lsr #24 + orr r7,r4,r7,lsl #8 + then + again +end-code + +\ Convert the ASCII hexadecimal characters packed into r0,r1 into a +\ 32-bit binary number, returning the result in r0 and non-zero in r1 +\ if the operation succeeded. +\ If the operation failed (because of the presence of non-hex characters), +\ return 0 in r1, and an undefined value in r0. + +\ Level 1, destroys: r0-r4 +label convert-number ( r0,r1: ascii -- r0: binary r1: okay? ) + mov r4,r0 \ Move high 4 ASCII characters away from r0 + mov r0,#0 \ Accumulator for output + + mov r3,#8 \ Loop counter - convert 8 nibbles + begin + \ Shift r4,r1 left one byte, putting result in r2 + mov r2,r4,lsr #24 \ High byte in r2 + mov r4,r4,lsl #8 \ Shift high word + orr r4,r4,r1,lsr #24 \ Merge from low word to high word + mov r1,r1,lsl #8 \ Shift low word + + cmp r2,#0 <> if + + cmp r2,`char 0 #` + movlt r1,#0 + movlt pc,lr \ Exit if < '0' + + cmp r2,`char 9 #` <= if \ Good digit from 0-9 + sub r2,r2,`char 0 #` + else + cmp r2,`char A #` + movlt r1,#0 + movlt pc,lr \ Exit if < 'A' + + cmp r2,`char F #` <= if + sub r2,r2,`char A d# 10 - #` + else + cmp r2,`char a #` \ possibly lower case hex digit + movlt r1,#0 + movlt pc,lr \ Exit if < 'a' + + cmp r2,`char f #` + movgt r1,#0 + movgt pc,lr \ Exit if > 'f' + + sub r2,r2,`char a d# 10 - #` + then + then + add r0,r2,r0,lsl #4 + then + decs r3,1 + = until + + mvn r1,#0 + + mov pc,lr +end-code + +\ Display the number in r0 as an 8-digit unsigned hexadecimal number +label dot ( r0 -- ) \ Level 3, destroys: r0-r6 + mov r4,lr + mov r5,r0 + mov r6,#8 + begin + mov r5,r5,ror #28 + and r0,r5,#0xf + cmp r0,#10 + addge r0,r0,`char a d# 10 - #` + addlt r0,r0,`char 0 #` + bl `putchar` + decs r6,1 + 0= until + + mov r0,#0x20 + bl `putchar` + + mov pc,r4 +end-code + +transient +\ Macros for managing the mini-stack +: pop1 ( -- ) + " mov r10,r11 mov r11,r12 mov r12,r13" evaluate +; +: pop2 ( -- ) + " mov r10,r12 mov r11,r13 mov r12,r13" evaluate +; +: pop3 ( -- ) + " mov r10,r13 mov r11,r13 mov r12,r13" evaluate +; +: push1 ( -- ) + " mov r13,r12 mov r12,r11 mov r11,r10" evaluate +; + +\ Macros to assemble code to begin and end command definitions +8 buffer: name-buf + +\ Start a command definition +\ false value trace? +: t: ( "name" -- cond ) + \ Get a name from the input stream at compile time and pack it + \ into a buffer in the same form it will appear in the register + \ pair when the mini-interpreter is executed at run-time + name-buf 8 erase ( ) + parse-word ( adr len ) +\ no-page 2dup type space + dup 8 - 0 max /string ( adr' len' ) \ Keep last 8 + 8 min 8 over - name-buf + swap move ( ) + +\ ['] $do-undefined behavior .name cr + \ Assemble code to compare the register-pair contents against the name. + name-buf be-l@ " set r2,* cmp r0,r2" evaluate + name-buf 4 + be-l@ " set r2,* cmpeq r1,r2 = if" evaluate +; + + +\ End a command definition by: +\ a) Assembling code to jump back to the beginning of the loop after the +\ current definition has executed ("over again") +\ b) Resolve the "if" (conditional branch) that skips the current definition +\ if the name the user has entered does not match this definition. + +: t; ( loop-begin-adr if-adr --- loop-begin-adr ) + " over again then" evaluate +; +resident + +label put-string ( -- ) + mov r4,lr + begin + ldrb r0,[r4],#1 + cmp r0,#0 + <> while + bl `putchar` + repeat + + add r4,r4,#3 \ Align to word boundary + bic r4,r4,#3 + + mov pc,r4 +end-code + +\ Some system architectures place the boot ROM at a non-zero physical +\ address, in which case there must be a special "boot mode" that forces +\ zero-based addresses to hit the ROM until some action is taken to turn +\ off that mode. jump-to-rom adds the "real" physical address of the +\ ROM to the return address so that it returns to the real physical address, +\ after which it will be safe to turn off boot mode. +label jump-to-rom + bic lr,lr,#0xff000000 \ In case we jump to the start address + set r0,`rom-pa #` + add pc,lr,r0 +end-code + +label minifth ( -- <does not return> ) \ Level 5 + bl `jump-to-rom` \ Returns at the "real" ROM address + + bl `init-serial` + + bl `put-string` + banner$ c$, 4 (align) + + mov r10,#0 mov r11,#0 mov r12,#0 mov r13,#0 \ Init stack + mov r8,#0 \ Init loop flag + + begin ( loop-begin-adr ) + tst r8,#6 0= if \ Display stack if neither silent nor scripting + \ mov r0,r13 bl `dot` + mov r0,r12 bl `dot` + mov r0,r11 bl `dot` + mov r0,r10 bl `dot` + mov r0,`char o #` bl `putchar` + mov r0,`char k #` bl `putchar` + bl `putspace` + then + + bl `getword` \ Result in r0 and r1 + + \ If the word is null (i.e. a bare space or return), do nothing + cmp r0,#0 cmpeq r1,#0 + yet <> until \ Branch back to the "begin" if r0,r1 = 0 + + t: showstack ( -- ) + bic r8,r8,#2 + t; + + t: quiet ( -- ) + orr r8,r8,#2 + t; + + t: clear ( ?? -- ) + mov r10,#0 mov r11,#0 mov r12,#0 mov r13,#0 \ Init stack + t; + + t: @ ( adr -- n ) + tst r8,#1 <> if + begin ldr r0,[r10] again + then + ldr r10,[r10] + t; + + t: ! ( n adr -- ) + tst r8,#1 <> if + begin str r11,[r10] again + then + str r11,[r10] + pop2 + t; + + t: !@ ( n adr -- n' ) + tst r8,#1 <> if + begin str r11,[r10] ldr r0,[r10] again + then + str r11,[r10] + ldr r10,[r10] + mov r11,r12 mov r12,r13 + t; + + t: @@ ( adr2 adr1 -- n2 n1 ) + tst r8,#1 <> if + begin ldr r0,[r10] ldr r1,[r11] again + then + ldr r10,[r10] + ldr r11,[r11] + t; + + t: !! ( n2 adr2 n1 adr1 -- ) + tst r8,#1 <> if + begin str r11,[r10] str r13,[r12] again + then + str r11,[r10] str r13,[r12] + \ There's no reason to fix the stack because the arguments + \ filled it up. + t; + + t: !!@ ( n1 adr1 n2 adr2 -- n3 ) + tst r8,#1 <> if + begin str r11,[r10] str r13,[r12] ldr r0,[r10] again + then + str r11,[r10] str r13,[r12] ldr r10,[r10] + \ There's no reason to fix the stack because the arguments + \ filled it up. + t; + + t: l@ ( adr -- l ) + tst r8,#1 <> if + begin ldr r0,[r10] again + then + ldr r10,[r10] + t; + + t: l! ( l adr -- ) + tst r8,#1 <> if + begin str r11,[r10] again + then + str r11,[r10] + pop2 + t; + + t: l!@ ( n adr -- n' ) + tst r8,#1 <> if + begin str r11,[r10] ldr r0,[r10] again + then + str r11,[r10] + ldr r10,[r10] + mov r11,r12 mov r12,r13 + t; + + t: c@ ( adr -- b ) + tst r8,#1 <> if + begin ldrb r0,[r10] again + then + ldrb r10,[r10] + t; + + t: c! ( b adr -- ) + tst r8,#1 <> if + begin strb r11,[r10] again + then + strb r11,[r10] + pop2 + t; + + t: c!@ ( b adr -- b' ) + tst r8,#1 <> if + begin strb r11,[r10] ldrb r0,[r10] again + then + strb r11,[r10] + ldrb r10,[r10] + mov r11,r12 mov r12,r13 + t; + + t: w@ ( adr -- w ) + tst r8,#1 <> if + begin ldrh r0,[r10] again + then + ldrh r10,[r10] + t; + + t: w! ( w adr -- ) + tst r8,#1 <> if + begin strh r11,[r10] again + then + strh r11,[r10] + pop2 + t; + + t: w!@ ( n adr -- n' ) + tst r8,#1 <> if + begin strh r11,[r10] ldrh r0,[r10] again + then + strh r11,[r10] + ldrh r10,[r10] + mov r11,r12 mov r12,r13 + t; + +[ifdef] isa-io-pa + t: pc@ ( port# -- b ) + set r0,`isa-io-pa #` + tst r8,#1 <> if + begin ldrb r1,[r10,r0] again + then + + ldrb r10,[r10,r0] + t; + + t: pc! ( b port# -- ) + set r0,`isa-io-pa #` + tst r8,#1 <> if + begin strb r11,[r10,r0] again + then + strb r11,[r10,r0] + pop2 + t; + + t: pw@ ( port# -- w ) + set r0,`isa-io-pa #` + tst r8,#1 <> if + begin ldrh r1,[r10,r0] again + then + ldrh r10,[r10,r0] + t; + + t: pw! ( w port# -- ) + set r0,`isa-io-pa #` + tst r8,#1 <> if + begin strh r11,[r10,r0] again + then + strh r11,[r10,r0] + pop2 + t; + + t: pl@ ( port# -- l ) + set r0,`isa-io-pa #` + tst r8,#1 <> if + begin ldr r1,[r10,r0] again + then + ldr r10,[r10,r0] + t; + + t: pl! ( l port# -- ) + set r0,`isa-io-pa #` + tst r8,#1 <> if + begin str r11,[r10,r0] again + then + str r11,[r10,r0] + pop2 + t; +[then] + + t: + ( n1 n2 -- n1+n2 ) + add r10,r11,r10 mov r11,r12 mov r12,r13 + t; + + t: - ( n1 n2 -- n1-n2 ) + sub r10,r11,r10 mov r11,r12 mov r12,r13 + t; + + t: and ( n1 n2 -- n1&n2 ) + and r10,r11,r10 mov r11,r12 mov r12,r13 + t; + + t: or ( n1 n2 -- n1|n2 ) + orr r10,r11,r10 mov r11,r12 mov r12,r13 + t; + + t: xor ( n1 n2 -- n1^n2 ) + eor r10,r11,r10 mov r11,r12 mov r12,r13 + t; + + t: lshift ( n1 n2 -- n1<<n2 ) + mov r10,r11,lsl r10 mov r11,r12 mov r12,r13 + t; + + t: rshift ( n1 n2 -- n1>>n2 ) + mov r10,r11,lsr r10 mov r11,r12 mov r12,r13 + t; + + t: invert ( n -- ~n ) + mvn r10,r10 + t; + + t: negate ( n -- -n ) + rsb r10,r10,#0 + t; + + t: spin ( -- ) \ Modifies next @/!-class command to loop forever + mov r8,#1 + t; + + t: * ( n1 n2 -- n1*n2 ) + mul r10,r11,r10 mov r11,r12 mov r12,r13 + t; + + t: . ( n -- ) + mov r0,r10 + bl `dot` + bl `putcr` + pop1 + t; + + t: move ( src dst len -- ) + cmp r10,#0 + <> if + cmp r11,r12 + u< if + begin + ldrb r0,[r12],#1 + strb r0,[r11],#1 + decs r10,1 + 0= until + else + begin + decs r10,1 + ldrb r0,[r12,r10] + strb r0,[r11,r10] + 0= until + then + then + pop3 + t; + + t: compare ( adr1 adr2 len -- -1 | offset ) + mov r1,r10 \ Save len for later + mvn r0,#0 \ -1 - provisional return value + inc r10,1 + begin + decs r10,1 + 0> while + ldrb r2,[r11],#1 + ldrb r3,[r12],#1 + cmp r2,r3 + subne r0,r1,r10 + <> until + then + pop3 + push1 + mov r10,r0 + t; + + t: fill ( adr len b -- ) + begin + decs r11,1 + strgeb r10,[r12],#1 + < until + pop3 + t; + + t: check ( adr len b -- ) + begin + decs r11,1 + >= while + ldrb r7,[r12],#1 + cmp r7,r10 + <> if + sub r0,r12,#1 bl `dot` + bl `putcolon` + mov r0,r7 bl `dot` + bl `putcr` + then + repeat + pop3 + t; + + t: test ( adr len b -- ) + mov r0,r10 + mov r1,r11 + mov r2,r12 + begin + decs r11,1 + strgeb r10,[r12],#1 + < until + mov r10,r0 + mov r11,r1 + mov r12,r2 + begin + decs r11,1 + >= while + ldrb r7,[r12],#1 + cmp r7,r10 + <> if + sub r0,r12,#1 bl `dot` + bl `putcolon` + mov r0,r7 bl `dot` + bl `putcr` + then + repeat + pop3 + t; + + t: lfill ( adr len l -- ) + begin + decs r11,4 + strge r10,[r12],#4 + < until + pop3 + t; + + t: lcheck ( adr len l -- ) + begin + decs r11,4 + >= while + ldr r7,[r12],#4 + cmp r7,r10 + <> if + sub r0,r12,#4 bl `dot` + bl `putcolon` + mov r0,r7 bl `dot` + bl `putcr` + then + repeat + pop3 + t; + + t: ltest ( adr len l -- ) + mov r0,r10 + mov r1,r11 + mov r2,r12 + begin + decs r11,4 + strge r10,[r12],#4 + < until + mov r10,r0 + mov r11,r1 + mov r12,r2 + begin + decs r11,4 + >= while + ldr r7,[r12],#4 + cmp r7,r10 + <> if + sub r0,r12,#4 bl `dot` + bl `putcolon` + mov r0,r7 bl `dot` + bl `putcr` + then + repeat + pop3 + + t; + + t: afill ( adr len -- ) + begin + decs r10,4 + strge r11,[r11],#4 + < until + pop2 + t; + + t: acheck ( adr len -- ) + begin + decs r10,4 + >= while + ldr r7,[r11] + cmp r7,r11 + <> if + mov r0,r11 bl `dot` + bl `putcolon` + mov r0,r7 bl `dot` + bl `putcr` + then + add r11,r11,#4 + repeat + pop2 + t; + + t: atest + mov r0,r10 + mov r1,r11 + begin + decs r10,4 + strge r11,[r11],#4 + < until + mov r10,r0 + mov r11,r1 + begin + decs r10,4 + >= while + ldr r7,[r11] + cmp r7,r11 + <> if + mov r0,r11 bl `dot` + bl `putcolon` + mov r0,r7 bl `dot` + bl `putcr` + then + add r11,r11,#4 + repeat + pop2 + t; + + t: sum ( adr len -- checksum ) + set r0,0 + begin + decs r10,1 + ldrgeb r1,[r11],#1 + addge r0,r0,r1 + < until + pop2 + push1 + mov r10,r0 + t; + + t: erase ( adr len -- ) + set r0,0 + begin + decs r10,1 + strgeb r0,[r11],#1 + < until + pop2 + t; + + t: dump ( adr len -- ) + begin + decs r10,1 + >= while + mov r0,r11 bl `dot` + bl `putcolon` + ldrb r0,[r11],#1 bl `dot` + bl `putcr` + repeat + pop2 + t; + + t: ldump ( adr len -- ) + begin + decs r10,4 + >= while + mov r0,r11 + bl `dot` + bl `putcolon` + ldr r0,[r11],#4 + bl `dot` + bl `putcr` + repeat + pop2 + t; + + t: dup ( n -- n n ) + mov r13,r12 mov r12,r11 mov r11,r10 + t; + + t: drop ( n -- ) + mov r10,r11 mov r11,r12 mov r12,r13 + t; + + t: swap ( n1 n2 -- n2 n1 ) + mov r0,r11 mov r11,r10 mov r10,r0 + t; + + t: over ( n1 n2 -- n1 n2 n1 ) + mov r13,r12 mov r12,r11 mov r11,r10 mov r10,r12 + t; + + t: rot ( n1 n2 n3 -- n2 n3 n1 ) + mov r0,r12 mov r12,r11 mov r11,r10 mov r10,r0 + t; + + t: -rot ( n1 n2 n3 -- n3 n1 n2 ) + mov r0,r12 mov r12,r10 mov r10,r11 mov r11,r0 + t; + + t: icache-on ( -- ) + mrc p15, 0, r0, cr1, cr0, 0 \ write the control register + orr r0, r0, #0x1000 \ Turn on the icache + mcr p15, 0, r0, cr1, cr0, 0 \ write the control register + t; + + t: icache-off ( -- ) + mrc p15, 0, r0, cr1, cr0, 0 \ write the control register + bic r0, r0, #0x1000 \ Turn off the icache + mcr p15, 0, r0, cr1, cr0, 0 \ write the control register + t; + + \ Turning on the dcache and write buffer are not so simple, because + \ the MMU must be on first. + + t: control@ ( -- n ) + push1 + mrc p15, 0, r10, cr1, cr0, 0 \ read the control register + t; + + t: control! ( n -- ) + mcr p15, 0, r10, cr1, cr0, 0 \ write the control register + pop1 + t; + + t: script ( address -- ) + mov r9,r10 + orr r8,r8,#0xc \ Set script and no-echo flags + pop1 + t; + + t: rom-script ( offset -- ) + add r9,r10,`rom-pa #` + orr r8,r8,#0xc \ Set script and no-echo flags + pop1 + t; + + t: fexit ( -- ) + bic r8,r8,#0xc \ Clear script and no-echo flags + t; + + t: scripts ( -- ) + mov r6,#0 + set r7,`rom-pa h# 10000 + #` + begin + ldrb r0,[r7] + cmp r0,`ascii \ #` \ If the script aread begings + = if \ with a comment character + \ display "s#: " + mov r0,`ascii s #` bl `putchar` + add r0,r6,`ascii 0 #` bl `putchar` + mov r0,`ascii : #` bl `putchar` + bl `putspace` + begin \ display the first comment line + ldrb r0,[r7],1 \ Get comment byte + cmp r0,#0x0d \ Carriage return? + cmpne r0,#0x0a \ Line feed? + <> while + bl `putchar` + repeat + bl `putcr` + then + mov r7,r7,lsr #12 \ Clear low bits + mov r7,r7,lsl #12 + add r7,r7,#0x1000 \ Advance to next script + add r6,r6,#1 + cmp r6,#10 + = until + t; + + t: s0 ( -- ) + set r9,`rom-pa h# 10000 + #` + orr r8,r8,#0xc \ Set script and no-echo flags + t; + + t: s1 ( -- ) + set r9,`rom-pa h# 11000 + #` + orr r8,r8,#0xc \ Set script and no-echo flags + t; + + t: s2 ( -- ) + set r9,`rom-pa h# 12000 + #` + orr r8,r8,#0xc \ Set script and no-echo flags + t; + + t: s3 ( -- ) + set r9,`rom-pa h# 13000 + #` + orr r8,r8,#0xc \ Set script and no-echo flags + t; + + t: s4 ( -- ) + set r9,`rom-pa h# 14000 + #` + orr r8,r8,#0xc \ Set script and no-echo flags + t; + + t: s5 ( -- ) + set r9,`rom-pa h# 15000 + #` + orr r8,r8,#0xc \ Set script and no-echo flags + t; + + t: s6 ( -- ) + set r9,`rom-pa h# 16000 + #` + orr r8,r8,#0xc \ Set script and no-echo flags + t; + + t: s7 ( -- ) + set r9,`rom-pa h# 17000 + #` + orr r8,r8,#0xc \ Set script and no-echo flags + t; + + t: s8 ( -- ) + set r9,`rom-pa h# 18000 + #` + orr r8,r8,#0xc \ Set script and no-echo flags + t; + + t: s9 ( -- ) + set r9,`rom-pa h# 19000 + #` + orr r8,r8,#0xc \ Set script and no-echo flags + t; + + \ The original intention of "no-echo" and its inverse "echo" was + \ to create a capability like "dl" whereby one could download a + \ script over the serial line, but without requiring the use of + \ memory. However, this has the serious problem that there is + \ no flow control, so commands that can take a long time (like + \ memory tests) potentially cause input overrun. Consequently, + \ it's better to use quiet mode. However, quiet mode has its own + \ problem: few if any terminal programs support its character-echo + \ flow control technique. Character-echo flow control is not + \ particularly great anyway - it can be fooled by generated output + \ that happens to contain the next input character. + t: no-echo ( -- ) + orr r8,r8,#0x8 \ Set no-echo flag + t; + + t: echo ( -- ) + bic r8,r8,#0x8 \ Clear no-echo flag + t; + + t: cr ( -- ) + bl `putcr` + t; + + t: key ( -- char ) + bl `getchar` + push1 mov r10,r0 + t; + + t: emit ( char -- ) + mov r0,r10 + bl `putchar` + pop1 + t; + + \ This is useful for diagnostics in script mode, but essentially + \ useless otherwise. + t: .( ( "string" -- ) + begin + tst r8,#4 0<> if \ Script mode + ldrb r0,[r9],#1 + else \ Normal mode + bl `getchar` ( char in r0 ) + then + cmp r0,`char ) #` + <> while + bl `putchar` + repeat + t; + + \ This is useful for commentary in script mode, but essentially + \ useless otherwise. + t: \ ( "rest-of-line" -- ) + begin + tst r8,#4 0<> if \ Script mode + ldrb r0,[r9],#1 + else \ Normal mode + bl `getchar` ( char in r0 ) + then + cmp r0,#0x0a + cmpne r0,#0x0d + = until + t; + + t: goto ( address -- ) + mov pc,r10 + t; + + t: gettext ( address -- length ) + mov r4,r10 + begin + bl `getchar` + cmp r0,#4 \ Control-D (ASCII EOT) + <> while + strb r0,[r4],#1 + repeat + + sub r10,r4,r10 + t; + + t: getbytes ( address length -- ) + begin + decs r10,1 + 0>= while + bl `getchar` + strb r0,[r11],#1 + repeat + pop2 + t; + +[ifdef] init-sequoia + t: seq@ ( reg# -- w ) + set r0, `isa-io-pa #` + tst r8,#1 <> if + begin strh r10,[r0, #0x24] ldrh r10,[r0,#0x26] again + then + strh r10, [r0, #0x24] \ Point to the register + ldrh r10, [r0, #0x26] \ Get the data + t; + + t: seq! ( w reg# -- ) + set r0, `isa-io-pa #` + tst r8,#1 <> if + begin strh r10,[r0, #0x24] strh r11,[r0,#0x26] again + then + strh r10, [r0, #0x24] \ Point to the register + strh r11, [r0, #0x26] \ Get the data + pop2 + t; +[then] + +[ifdef] rom-pa + t: rom ( -- adr ) + push1 set r10,`rom-pa #` + t; +[then] + +[ifdef] isa-io-pa + t: io ( -- adr ) + push1 set r10,`isa-io-pa #` + t; +[then] + +[ifdef] mem0-pa + t: mem0 ( -- adr ) + push1 set r10,`mem0-pa #` + t; +[then] + +[ifdef] mem1-pa + t: mem1 ( -- adr ) + push1 set r10,`mem1-pa #` + t; +[then] + +[ifdef] mem2-pa + t: mem2 ( -- adr ) + push1 set r10,`mem2-pa #` + t; +[then] + +[ifdef] mem3-pa + t: mem3 ( -- adr ) + push1 set r10,`mem3-pa #` + t; +[then] + + t: 1m ( -- n ) + push1 mov r10,#0x100000 + t; + + t: 1m ( -- n ) + push1 mov r10,#0x100000 + t; + + t: 1m ( -- n ) + push1 mov r10,#0x100000 + t; + + t: 2m ( -- n ) + push1 mov r10,#0x200000 + t; + + t: 4m ( -- n ) + push1 mov r10,#0x400000 + t; + + t: 8m ( -- n ) + push1 mov r10,#0x800000 + t; + + t: 16m ( -- n ) + push1 mov r10,#0x1000000 + t; + + t: 32m ( -- n ) + push1 mov r10,#0x2000000 + t; + + + \ The word was not recognized; parse it as a number or complain + bl `convert-number` cmp r1,#0 <> if \ Number in r0 + \ Push the number + push1 mov r10,r0 ( -- n ) + else + \ The word was neither recognized nor numeric; complain + mov r0,`char ? #` bl `putchar` bl `putcr` + then + + again + +end-code + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/minifth.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/mmu.fth =================================================================== --- cpu/arm/mmu.fth (rev 0) +++ cpu/arm/mmu.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,317 @@ +purpose: ARM MMU driver +\ See license at end of file + +\ Definition: +\ PTE: Page Table Entry - a page descriptor - a 32 number that goes in +\ a level-2 page table. +\ PMEG: Page Map Entry Group - a level-2 page table - a group of 256 +\ page table entries. + +0 value st-va +h# 400 constant /pmeg +h# 10.0000 constant /section + +\ Read and write section-table entries. +: >section ( va -- smadr ) d# 20 rshift st-va swap la+ ; +: section@ ( va -- ste ) >section l@ ; +: section! ( ste va -- ) >section l! ; + +0 constant st-imp \ 0 or h# 10 - "imp" bit setting +0 5 lshift constant fw-domain +h# c02 fw-domain or constant ste-lowbits \ AP=11, C=0, B=0, + +0 value pmeg-pa \ Physical address page selector bits for current PMEG +0 value 'pt-ent \ Location of the pte that is used for mapping ptes + +0 value pmeg-section-va \ Virtual address of section used for PMEG access + +\ Returns the virtual address where the selected PMEG can be accessed +: pmeg-va ( -- adr ) pmeg-pa pmeg-section-va or ; + +\ Select the PMEG at pmeg-pa by setting the section entry for +\ pmeg-section-va to refer to it. +: map-pmeg ( ste|pmeg-pa -- ) + h# 3ff invert and dup h# 000f.f000 and to pmeg-pa + pmeg-section-va flush-d-tlb-entry \ Blast the old entry + h# f.f000 invert and ste-lowbits or pmeg-section-va section! +; + +\ Convert a level-1 (section) map entry to a level-2 (page) map entry +\ with the same permissions and beginning page number. This is used +\ when converting a section-level mapping to page-level mappings. +: ste>pte ( ste -- pte ) + dup h# fff0.000f and swap ( base/cb l1-pte ) + h# c00 and dup 2 rshift or ( base/cb ap3/2 ) + dup 4 rshift or or ( base/ap3/2/1/0/cb ) +; + +\ Allocate memory for a new page map entry group, install it in the +\ section table at the appropriate location for va, and create a +\ temporary virtual mapping for it so we can access it, returning its +\ temporary virtual address. +: get-pmeg ( va -- ) + /pmeg /pmeg mem-claim ( va pte-pa ) + tuck fw-domain or st-imp or 1 or ( pte-pa va ste ) + swap section! ( pte-pa ) + map-pmeg ( ) +; + +\ Create a new page map entry group for the section contaning va, +\ initializing it to consecutive physical pages using base-pte as +\ a template. To create initially-invalid entries, use 0 for base-pte. +: new-pmeg ( va base-pte -- ) + swap get-pmeg ( base-pte adr ) + pmeg-va /pmeg bounds do dup i l! pagesize + /l +loop ( pte ) + drop ( ) +; + +0 value remapping? \ True if a newly-allocated PMEG will loaded with + \ new entries. +: set-pmeg ( va -- ) + dup section@ dup 3 and case ( va ste type ) + 1 of ( va ste ) + nip map-pmeg ( ) + endof ( ) + 2 of ( va ste ) + ste>pte new-pmeg ( ) + endof ( ) + ( default ) ( va ste type ) + remapping? if ( va ste type ) + \ We are going to create mappings in the range, + \ so create a new PMEG and prime it with invalid PTEs. + nip swap 0 new-pmeg ( type ) + else ( va ste type ) + \ If we are going to unmap the range + \ and it's already unmapped, leave it so. + nip nip ( type ) + then ( type ) + ( end default ) ( type ) + endcase ( ) +; + +: (pte-setup) ( va -- adr ) d# 10 rshift h# 3fc and pmeg-va + ; +: (pte!) ( pte va -- ) (pte-setup) l! ; +: (pte@) ( va -- pte ) (pte-setup) l@ ; + +: >pt ( va -- true | offset pte-page-pa false ) + dup section@ dup 3 and 1 = if ( va ste ) + h# 3ff invert and ( va pte-page-pa ) + swap d# 10 rshift h# 3fc and swap ( offset pte-page-pa ) + false + else + 2drop true + then +; + +: .cb ( s/pment -- ) + dup 8 and if ." Cacheable" then + 4 and if ." Buffered" then +; +: .domain ( ste -- ) ." Domain: " d# 5 rshift h# f and . ; +: .ap ( n bit# -- n ) over swap rshift 3 and (.) type ; +: .l1-mapping ( va ste -- ) + push-hex + ." Section-mapped - Physical: " ( va ste ) + swap h# fffff and over h# fffff invert and or 8 u.r ( ste ) + ." AP: " d# 10 .ap space ( ste ) + dup .domain ( ste ) + dup h# 10 and if ." IMP" then ( ste ) + .cb ( ) + cr + pop-base +; +: .l2-mapping ( va ste -- ) + push-hex + ." PMEG at: " dup h# ffff.fc00 and 8 u.r ( va ste ) + dup .domain ( va ste ) + map-pmeg dup (pte@) cr ( va pte ) + dup 3 and 1 2 between if ( va pte ) + dup 3 and 1 = if ( va pte ) + ." 64K" h# ffff ( va pte mask ) + else ( va pte ) + ." 4K" h# 0fff ( va pte mask ) + then ( va pte mask ) + ." Physical: " rot over and ( pte mask val ) + -rot invert over and rot or 8 u.r ( pte ) + ." AP: " ( pte ) + d# 10 .ap ." ," 8 .ap ." ," 6 .ap ." ," 4 .ap space ( pte ) + .cb ( ) + else ( va pte ) + 2drop ." Not Mapped" ( ) + then ( ) + cr + pop-base +; + +: map? ( va -- ) + dup section@ dup 3 and case ( va ste type ) + 1 of .l2-mapping endof + 2 of .l1-mapping endof + ( default: va ste type ) + ." Not mapped at section level" 3drop exit + endcase +; + +\ "Circular arithmetic" max and min. In circular arithmetic, 0 is greater +\ than ff00.0000. The use of these operators instead of umax and umin +\ correctly handles the case where an address range ends at 2^^32, which +\ looks like 0 in 32-bit twos-complement arithmetic. +: cmax ( adr1 adr2 -- max ) 2dup - 0> if drop else nip then ; +: cmin ( adr1 adr2 -- min ) 2dup - 0< if drop else nip then ; + +\ Break the range into three ranges - +\ The range on top of the stack goes from adr up to the first section boundary +\ The middle range goes from the first to the last section boundary +\ The last range goes from the last section boundary to adr+len +\ Some ranges may be zero-length +: split-range ( adr len -- end end-sec end-sec start-sec start-sec start ) + bounds ( end start ) + over /section round-down over cmax tuck swap ( end end-sec end-sec start ) + 2dup /section round-up cmin tuck swap + ( end end-sec end-sec start-sec start-sec start ) +; + +: ?set-pmeg ( end start -- end start ) 2dup <> if dup set-pmeg then ; + +: ?release-pmeg ( va -- va ) + dup section@ 3 and 1 = if \ Reclaim old PMEG ( va ) + dup section@ h# ffff.fc00 and /pmeg mem-release ( va ) + then ( va ) +; +: invalidate-page ( va -- ) 0 swap (pte!) ; +: invalidate-section ( va -- ) ?release-pmeg 0 swap section! ; + +: remap-pages ( mode pa va-end va-start -- mode pa' ) + ?do ( mode pa ) + over ste>pte over or i (pte!) ( mode pa ) + pagesize + ( mode pa' ) + pagesize +loop ( mode pa' ) +; + +: remap-sections ( pa mode va-end va-start mode -- pa' mode ) + ?do ( mode pa ) + dup h# f.f000 and if ( mode pa ) + \ Physical not aligned; use page-level mappings + i section@ 3 and 1 = if \ Reuse old PMEG ( mode pa ) + i section@ map-pmeg ( mode pa ) + else \ Allocate a new PMEG ( mode pa ) + i get-pmeg ( mode pa ) + then ( mode pa ) + i /section bounds remap-pages ( mode pa' ) + else ( mode pa ) + \ Physical is aligned; use section-level mappings + i ?release-pmeg drop ( mode pa ) + 2dup or i section! ( mode pa ) + /section + ( mode pa' ) + then ( mode pa' ) + /section +loop ( mode pa ) +; + +: remap-range ( phys mode adr len -- ) + true to remapping? + 2swap 2 or swap h# fff invert and ( adr len mode pa ) + 2>r split-range 2r> ( d.r2 d.r1 d.r0 mode pa ) + + 2swap ?set-pmeg remap-pages ( d.r2 d.r1 mode pa' ) + 2swap ?set-pmeg remap-sections ( d.r2 mode pa' ) + 2swap ?set-pmeg remap-pages ( mode pa' ) + + 2drop ( ) +; + +\ XXX Perhaps we should invalidate the cache within this range. +: unmap-range ( adr len -- ) + 2dup invalidate-cache-range + false to remapping? + split-range ( d.range2 d.range1 d.range0 ) + ?set-pmeg ?do i invalidate-page pagesize +loop ( d.range2 d.range1 ) + ?do i invalidate-section /section +loop ( d.range2 ) + ?set-pmeg ?do i invalidate-page pagesize +loop ( ) +; + +: (shootdown-range) ( adr len -- ) + over swap 2>r ( adr r: adr len ) + translate ( false | phys mode true r: adr len ) + if 2r> remap-range else 2r> unmap-range then + flush-i&d-tlb +; +' (shootdown-range) to shootdown-range + +: (map-mode) ( phys.. mode -- mode' ) + >r memory? r> ( memory? mode ) + dup -2 -1 between if ( memory? -1 ) + drop if ( ) + h# c0c \ Memory: AC=3, C=1, B=1 + else ( ) + h# c00 \ I/O: AC=3, C=0, B=0 + then ( mode' ) + else ( memory? mode ) + nip ( mode ) + then ( mode' ) +; +' (map-mode) to map-mode + +headerless +list: translations-list + +\ After initial-mmu-setup exits, the mmu must be on and st-va must +\ be set to the virtual address of the section table. +defer initial-mmu-setup ( -- ) ' noop to initial-mmu-setup +defer initial-claim ( -- ) ' noop to initial-claim +defer initial-map ( -- ) ' noop to initial-map + +: init-virtual-list ( -- ) + 0 memrange ! \ Clear free list + + \ Create the available memory list from which the firmware is allowed + \ to dynamically allocate virtual memory. + + fw-virt-base fw-virt-size set-node fwvirt insert-after + + \ Setup the virtual list from which the firmware isn't permitted to allocate + 0 fw-virt-base add-os-piece + fw-virt-base fw-virt-size + 0 add-os-piece +; + +headers +warning off +: open ( -- ) + initial-mmu-setup \ Do platform-specific stuff as necessary + + init-virtual-list + + initial-claim \ Claim any pre-committed platform-specific addresses + + \ Grab a Meg of virtual address space to use for temporary PMEG access + /section /section claim to pmeg-section-va + + translations-list to translations + + initial-map \ Set up platform-specific hardcoded translations + true +; +warning on + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/mmu.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/muldiv.fth =================================================================== --- cpu/arm/muldiv.fth (rev 0) +++ cpu/arm/muldiv.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,366 @@ +purpose: Multiply and divide +\ See license at end of file + +[ifdef] fixme +0 value StrongARM? +[else] +0 value arm4? +[then] + +hex +code * ( n1 n2 -- n3 ) pop r0,sp mul tos,r0,tos c; +code u* ( u1 u2 -- u3 ) pop r0,sp mul tos,r0,tos c; + +code um* ( u1 u2 -- ud ) +[ifdef] fixme + ldr r0,'user StrongARM? +[else] + ldr r0,'user arm4? +[then] + cmp r0,#0 + <> if + pop r4,sp + umull r1,r0,tos,r4 + psh r1,sp + mov tos,r0 + next + then + mov r6,#0xff + orr r6,r6,#0xff00 + and r0,r6,tos \ r0: lu2 + and r1,r6,tos,lsr #0x10 \ r1: tu2 + ldr tos,[sp] + and r2,r6,tos \ r2: lu1 + and r3,r6,tos,lsr #0x10 \ r3: tu1 + + mul r4,r0,r2 \ low + mul r6,r0,r3 \ interm + mul tos,r1,r3 \ upper + mul r0,r1,r2 \ interm + + adds r0,r0,r6 + inccs tos#0x10000 + adds r4,r4,r0,lsl #0x10 + adc tos,tos,r0,lsr #0x10 \ adding CARRY + str r4,[sp] +c; + +code m* ( n1 n2 -- d ) +[ifdef] fixme + ldr r0,'user StrongARM? +[else] + ldr r0,'user arm4? +[then] + cmp r0,#0 + <> if + pop r4,sp + smull r1,r0,tos,r4 + psh r1,sp + mov tos,r0 + next + then + mov r5,#0 \ clear change-sign flag + mov r6,#0xff + orr r6,r6,#0xff00 + cmps tos,#0 + rsblt tos,tos,#0 + mvnlt r5,r5 \ setting flag + and r0,r6,tos \ r0: lu2 + and r1,r6,tos,lsr #0x10 \ r1: tu2 + pop tos,sp + cmps tos,#0 + rsblt tos,tos,#0 + mvnlt r5,r5 + and r2,r6,tos \ r2: lu1 + and r3,r6,tos,lsr #0x10 \ r3: tu1 + + mul r4,r0,r2 \ low + mul r6,r0,r3 \ interm + mul tos,r1,r3 \ upper + mul r0,r1,r2 \ interm + + adds r0,r0,r6 + inccs tos,#0x10000 + adds r4,r4,r0,lsl #0x10 + adc tos,tos,r0,lsr #0x10 \ adding CARRY + cmps r5,#0 + <> if + decs r4,#1 + sbc tos,tos,#0 + mvn r4,r4 + mvn tos,tos + then + psh r4,sp +c; + +\ (32/32division) does a 32/32bit unsigned division +\ r0 / tos = r0.rem tos.quot +code (32/32division) + mov r3,#1 +\ cmp tos,#0 +\ ' divide-error dolink eq branch + begin + cmp tos,#0x80000000 + cmpcc tos,r0 + movcc tos,tos,lsl #1 + movcc r3,r3,lsl #1 + u>= until + mov r2,#0 + begin + cmp r0,tos + subcs r0,r0,tos + addcs r2,r2,r3 + movs r3,r3,lsr #1 + movne tos,tos,lsr #1 + 0= until + mov tos,r2 + mov pc,lk +end-code + +code (u64division) + stmdb sp!,{r7,r8,r9} + mov r6,#0 + mov r7,#1 + mov r4,#0 + mov r5,#0 + orrs r8,r2,r3 +\ ' divide-error bleq * + begin + cmp r2,#0x80000000 + u< if + cmp r2,r0 + cmpeq r3,r1 + u< if + mov r2,r2,lsl #1 + orr r2,r2,r3,lsr #0x1f + mov r3,r3,lsl #1 + mov r6,r6,lsl #1 + orr r6,r6,r7,lsr #0x1f + mov r7,r7,lsl #1 + then + then + u>= until + begin + cmp r0,r2 + cmpeq r1,r3 + u>= if + subs r1,r1,r3 + sbc r0,r0,r2 + adds r5,r5,r7 + adc r4,r4,r6 + then + movs r6,r6,lsr #1 + mov r7,r7,ror #0 + orrs r8,r6,r7 + 0<> if + movs r2,r2,lsr #1 + mov r3,r3,ror #0 + then + orrs r8,r6,r7 + 0= until + ldmia sp!,{r7,r8,r9} + mov pc,lk +end-code + +\ unsigned 64/64bit division (u64division) +\ r0 -> r0.h-r1.l r1 -> r2.h-r3.l +\ r2 -> r4.h-r5.l r3 -> r6.h-r7.l +\ r01 / r23 = r01.rem r45.quot +code du/mod ( ud1 ud2 -- du.rem du.quot ) + mov r2,tos + pop r3,sp + pop r0,sp + pop r1,sp + bl 'code (u64division) + psh r1,sp + psh r0,sp + psh r5,sp + mov tos,r4 +c; + +code um/mod ( ud u1 -- u.rem u.quot ) + mov r2,#0 + mov r3,tos + + pop r0,sp + pop r1,sp + bl 'code (u64division) + psh r1,sp + mov tos,r5 +c; +code mu/mod ( ud u1 -- u.rem ud.quot ) + mov r2,#0 + mov r3,tos + pop r0,sp + pop r1,sp + bl 'code (u64division) + psh r1,sp + psh r5,sp + mov tos,r4 +c; + +code fm/mod ( d.dividend s.divisor -- s.rem s.quot ) + mov r3,tos + mov r2,tos,asr #0 \ sign extend divisor + pop r0,sp + pop r1,sp + stmdb sp!,{r8,r9} + cmp r0,#0 + < if + rsbs r1,r1,#0 + rsc r0,r0,#0 + cmp r2,#0 + < if + rsbs r3,r3,#0 + rsc r2,r2,#0 + bl 'code (u64division) + rsbs r1,r1,#0 + rsc r0,r0,#0 + else + mov r8,r2 + mov r9,r3 + bl 'code (u64division) + rsbs r5,r5,#0 + rsc r4,r4,#0 + orrs tos,r0,r1 + 0<> if + subs r5,r5,#1 + sbc r4,r4,#0 + subs r1,r9,r1 + sbc r0,r8,r0 + then + then + else + cmp r2,#0 + < if + mov r8,r2 + mov r9,r3 + rsbs r3,r3,#0 + rsc r2,r2,#0 + bl 'code (u64division) + rsbs r5,r5,#0 + rsc r4,r4,#0 + orrs tos,r0,r1 + 0<> if + subs r5,r5,#1 + sbc r4,r4,#0 + adds r1,r1,r9 + adc r0,r0,r8 + then + else + bl 'code (u64division) + then + then + ldmia sp!,{r8,r9} + psh r1,sp + mov tos,r5 +c; + +code u/mod ( u.dividend u.divisor -- u.rem u.quot ) + ldr r0,[sp] + ' (32/32division) bl * \ r0 / tos = r0.rem tos.quot + str r0,[sp] +c; + +code /mod ( n.dividend s.divisor -- s.rem s.quot ) + ldr r0,[sp] + cmp r0,#0 + < if + rsb r0,r0,#0 + cmp tos,#0 + < if + rsb tos,tos,#0 + bl 'code (32/32division) \ r0 / tos = r0.rem tos.quot + rsb r0,r0,#0 + else + mov r4,tos + bl 'code (32/32division) \ r0 / tos = r0.rem tos.quot + rsb tos,tos,#0 + cmp r0,#0 + decne tos,#1 + subne r0,r4,r0 + then + else + cmp tos,#0 + < if + mov r4,tos + rsb tos,tos,#0 + bl 'code (32/32division) \ r0 / tos = r0.rem tos.quot + rsb tos,tos,#0 + cmp r0,#0 + decne tos,#1 + addne r0,r0,r4 + else + bl 'code (32/32division) \ r0 / tos = r0.rem tos.quot + then + then + str r0,[sp] +c; + +code sm/rem ( d.dividend s.divisor -- s.rem s.quot ) + mov r3,tos + mov r2,tos,asr #0 + pop r0,sp + pop r1,sp + cmp r0,#0 \ dividend <0 + < if + rsbs r1,r1,#0 + rsc r0,r0,#0 + cmp r2,#0 \ divisor <0 + < if + rsbs r3,r3,#0 + rsc r2,r2,#0 + bl 'code (u64division) + rsbs r1,r1,#0 + rsc r0,r0,#0 + else + bl 'code (u64division) + rsbs r1,r1,#0 + rsc r0,r0,#0 + rsbs r5,r5,#0 + rsc r4,r4,#0 + then + else + cmp r2,#0 \ divisor <0 + < if + rsbs r3,r3,#0 + rsc r2,r2,#0 + bl 'code (u64division) + rsbs r5,r5,#0 + rsc r4,r4,#0 + else + bl 'code (u64division) + then + then + psh r1,sp + mov tos,r5 +c; + +: / ( dividend divisor -- quotient ) /mod nip ; +: mod ( dividend divisor -- modulus ) /mod drop ; +: */mod ( n1 n2 n3 -- n.mod n.quot ) >r m* r> fm/mod ; +: */ ( n1 n2 n3 -- n4 ) */mod nip ; + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/muldiv.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/native.bth =================================================================== --- cpu/arm/native.bth (rev 0) +++ cpu/arm/native.bth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,10 @@ +purpose: Build file for native.dic + +dictionary: ${BP}/cpu/arm/build/tools.dic +command: &armforth &dictionary &this +build-now + +fload ${BP}/ofw/tokenizer/tokenize.fth +fload ${BP}/forth/lib/builder.fth + +.( --- Saving native.dic --- ) cr "" native.dic save-forth
Property changes on: cpu/arm/native.bth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/objcode.fth =================================================================== --- cpu/arm/objcode.fth (rev 0) +++ cpu/arm/objcode.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,101 @@ +purpose: Code words for support of multiple-code-field objects +\ See license at end of file + +code >code-adr ( acf -- code-adr ) + r0 top ) ldr + r0 r0 8 #lsl mov + top top r0 6 #asr add + top 2 cells incr c; + +\ As i understand your high-level definition of >action-adr +\ it assumes action to be: 0 < action# <= #actions, is this ok? +\ Testing for action#=0 not necessary? + +code >action-adr ( object-acf action# -- ... ) +( ... -- object-acf action# #actions true | object-apf action-adr false ) +\ !!!! the next line should ONLY be included for RiscOS Forthmacs testing +\ BASE 'body origin pcr ldr + r1 sp ) ldr \ r1: object-acf top: action# + + r0 r1 ) ldr \ r0: object-code-field + r0 r0 8 #asl mov \ remove opcode bits + r0 r1 r0 6 #asr add \ r0: adr of object ;code clause - 8 + + \ adding /cell is the same as adding + \ 8 then subtracting 4 + r0 /cell incr \ r0: object-#actions-adr r1: obj-acf + + r2 r0 ) ldr \ r2: #actions + top r2 cmp \ action# greater #actions +gt if top r2 2 sp db! stm \ push action# and #actions + top -1 # mov \ return true + next +then \ r0: object-#actions-adr r1: object-acf r2: #actions top: action# + + r0 r0 top 2 #asl sub \ r0: adr of action cell + r0 r0 ) ldr \ r0: action-adr +\ r0 r0 BASE add + \ r0: object-action-adr r1: object-acf top: action# + r1 /cell incr \ r1: object-apf + r1 sp ) str \ put object-apf on stack + r0 sp push \ push action-adr + top 0 # mov c; \ return false + +\ Object data structure: +\ +\ Created by object defining words (actions, action:, etc): +\ +\ tokenN-1 tokenN-1 ... token1 #actions (does-clause) ... +\ |________|________|________|________|________|________ + +: action-name \ name ( action# -- ) + create , + ;code +\ !!!! the next line should ONLY be included for RiscOS Forthmacs testing + \ BASE 'body origin pcr ldr \ Test +\ r0 top ) ldr \ r0: action# + + r0 get-link + r0 r0 ) ldr \ r0: action# + + r2 ip )+ ldr +\ r2 r2 BASE add \ r2: object-acf + top sp push \ make room on stack + top r2 /cell # add \ top: object-apf + + r3 r2 ) ldr \ r3: object-code-field + r3 r3 8 #lsl mov \ remove opcode bits + r3 r2 r3 6 #asr add \ r3: adr of object ;code clause - 8 + r3 2 cells incr \ r3:object-code-adr + + r0 1 incr \ r0: index to action-cell + r3 r3 r0 2 #asl sub \ r3: adr of action cell +\ I am not sure about implementing execute, here the pc is just +\ set to token@ + pc r3 ) ldr \ execute action +\ pc r3 BASE add +c; + +\ LICENSE_BEGIN +\ Copyright (c) 2006 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/objcode.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/objsup.fth =================================================================== --- cpu/arm/objsup.fth (rev 0) +++ cpu/arm/objsup.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,109 @@ +purpose: Machine dependent support routines used for the objects package. +\ See license at end of file + +\ These words know intimate details about the Forth virtual machine +\ 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 on the stack. + +headerless + +: start-code ( -- ) code-cf !csp ; + +\ Assembles code to begin a ;code clause +: start-;code ( -- ) start-code ; + +\ Code field for an object action. +: doaction ( -- ) acf-align colon-cf ; + +code >action-adr ( object-acf action# -- ... ) +( ... -- object-acf action# #actions true | object-apf action-adr false ) +\ !!!! the next line should ONLY be included for RiscOS Forthmacs testing +\ ldr base,[pc,`'body origin swap here 8 + - swap'] + ldr r1,[sp] \ r1: object-acf top: action# + + ldr r0,[r1] \ r0: object-code-field + mov r0,r0,lsl #8 \ remove opcode bits + add r0,r1,r0,asr #6 \ r0: adr of object ;code clause - 8 + + \ adding /cell is the same as adding + \ 8 then subtracting 4 + inc r0,1cell \ r0: object-#actions-adr r1: obj-acf + + ldr r2,[r0] \ r2: #actions + cmp tos,r2 \ action# greater #actions + > if + stmdb sp!,{tos,r2} \ push action# and #actions + mvn tos,#0 \ return true + next + then + + \ r0: object-#actions-adr r1: object-acf r2: #actions tos: action# + sub r0,r0,tos,lsl #2 \ r0: adr of action cell + ldr r0,[r0] \ r0: action-adr +\ add r0,r0,base + + \ r0: object-action-adr r1: object-acf tos: action# + inc r1,1cell \ r1: object-apf + str r1,[sp] \ put object-apf on stack + psh r0,sp \ push action-adr + mov tos,#0 \ return false +c; + +headers +: action-name \ name ( action# -- ) + create , + ;code +\ !!!! the next line should ONLY be included for RiscOS Forthmacs testing +\ ldr base,[pc,`'body origin swap here 8 + - swap`] \ Test +\ ldr r0,[tos] \ r0: action# + + lnk r0 + ldr r0,[r0] \ r0: action# + + ldr r2,[ip],1cell +\ add r2,r2,base \ r2: object-acf + psh tos,sp \ make room on stack + add tos,r2,1cell \ tos: object-apf + + ldr r3,[r2] \ r3: object-code-field + mov r3,r3,lsl #8 \ remove opcode bits + add r3,r2,r3,asr #6 \ r3: adr of object ;code clause - 8 + inc r3,2cells \ r3:object-code-adr + + inc r0,#1 \ r0: index to action-cell + sub r3,r3,r0,lsl #2 \ r3: adr of action cell +\ I am not sure about implementing execute, here the pc is just +\ set to token@ + ldr pc,[r3] \ execute action +\ add pc,r3,base +c; + +: >action# ( apf -- action# ) @ ; +headers + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/objsup.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/psr.fth =================================================================== --- cpu/arm/psr.fth (rev 0) +++ cpu/arm/psr.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,54 @@ +purpose: Access functions for processor status register +\ See license at end of file + +code psr@ ( -- n ) psh tos,sp mrs tos,cpsr c; +code psr! ( n -- ) msr cpsr,tos pop tos,sp c; + +h# 80 constant interrupt-enable-bit +: interrupt-enable@ ( -- n ) psr@ interrupt-enable-bit and ; +: interrupt-enable! ( n -- ) psr@ interrupt-enable-bit invert and or psr! ; + +headerless +: (disable-interrupts) ( -- ) psr@ interrupt-enable-bit or psr! ; +: (enable-interrupts) ( -- ) psr@ interrupt-enable-bit invert and psr! ; +: interrupts-enabled? ( -- yes? ) interrupt-enable@ 0= ; + +code (lock) ( -- ) ( R: -- oldMSR ) + mrs r0,cpsr + psh r0,rp + orr r0,r0,#0x80 + msr cpsr,r0 +c; +code (unlock) ( -- ) ( R: oldMSR -- ) + pop r0,rp + msr cpsr,r0 +c; + +' (enable-interrupts) to enable-interrupts +' (disable-interrupts) to disable-interrupts +' (lock) to lock[ +' (unlock) to ]unlock + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/psr.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/regacc.fth =================================================================== --- cpu/arm/regacc.fth (rev 0) +++ cpu/arm/regacc.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,36 @@ +purpose: Register access words for ARM +\ See license at end of file + +\ We assume that all devices of interest are mapped with write-buffering +\ disabled. + +alias rl@ l@ ( addr -- l ) +alias rl! l! ( l addr -- ) +alias rw@ w@ ( addr -- w ) +alias rw! w! ( w addr -- ) +alias rb@ c@ ( addr -- b ) +alias rb! c! ( b addr -- ) + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/regacc.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/register.fth =================================================================== --- cpu/arm/register.fth (rev 0) +++ cpu/arm/register.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,420 @@ +purpose: Common code to managed saved program state +\ See license at end of file + +\ Requires: +\ +\ >state ( offset -- addr ) +\ Returns an address within the processor state array given the +\ offset into that array +\ +\ Defines: +\ +\ register names +\ .registers + +needs action: objects.fth + +decimal +headerless + +only forth hidden also forth also definitions + +\ GP regs PSR state-stuff +d# 16 1+ 4 + + +[ifdef] save-fp-regs +8 3 * + +[then] + +/l* constant /save-area + +: state-valid ( -- addr ) d# 40 /l* >state ; +: ?saved-state ( -- ) + state-valid @ 0= abort" No program state has been saved in this session." +; + +: clear-save-area ( -- ) 0 >state /save-area erase ; + +: >vmem ; + +3 actions +action: @ ?saved-state >state @ ; +action: @ >state ! ; ( is ) +action: @ >state ; ( addr ) +: reg \ name ( offset -- ) + create /l* , + use-actions +; +: regs \ name name ... ( start #regs -- ) + bounds ?do i reg loop +; + +[ifdef] save-fp-regs +: l@+ ( adr -- l adr' ) dup l@ swap la1+ ; +: l!- ( l adr -- adr' ) tuck l! -1 la+ ; +3 actions +action: @ ?saved-state >state l@+ l@+ l@+ ; +action: @ >state 2 la+ l!- l!- l!- ; ( is ) +action: @ >state ; ( addr ) +: freg \ name ( offset -- ) + create /l* , + use-actions +; +: fregs \ name name ... ( start #regs -- ) + 3 * bounds ?do i freg 3 +loop +; +[then] + +headers +[ifdef] new-frame + 0 1 regs psr + + 1 8 regs r0 r1 r2 r3 r4 r5 r6 r7 + 9 8 regs r8 r9 r10 r11 r12 r13 r14 r15 + +10 4 regs up tos rp ip +14 3 regs sp lr pc +16 1 regs rpc +[else] + 0 8 regs r0 r1 r2 r3 r4 r5 r6 r7 + 8 8 regs r8 r9 r10 r11 r12 r13 r14 r15 + + 9 4 regs up tos rp ip +13 3 regs sp lr pc +15 1 regs rpc + +16 1 regs psr +[then] + +17 1 regs exception-psr +18 3 regs %saved-my-self %state-valid %restartable? + +[ifdef] save-fp-regs +21 8 fregs f0 f1 f2 f3 f4 f5 f6 f7 +[then] + +\ Following words defined here to satisfy the +\ references to these "variables" anywhere else +: saved-my-self ( -- addr ) addr %saved-my-self ; +: restartable? ( -- addr ) addr %restartable? ; + +headerless +: .lx ( l -- ) base @ >r hex 9 u.r r> base ! ; + +: .mode ( n -- ) + case + h# 10 of ." User32" endof + h# 11 of ." FIQ32" endof + h# 12 of ." IRQ32" endof + h# 13 of ." SVC32" endof + h# 17 of ." Abort32" endof + h# 1b of ." Undef32" endof + h# 1f of ." System32" endof + endcase +; +headers +: .psr ( -- ) + psr " nzcv~~~~~~~~~~~~~~~~~~~~ift~~~~~" show-bits + ." _" psr h# 1f and .mode +; +: .registers ( -- ) + ?saved-state + ??cr +." r0 r1 r2 r3 r4 r5 r6 r7" cr + r0 .lx r1 .lx r2 .lx r3 .lx r4 .lx r5 .lx r6 .lx r7 .lx +cr cr +." r8 r9/up r10/tos r11/rp/fp r12/ip r13/sp r14/lr pc" cr + r8 .lx r9 .lx r10 .lx r11 .lx r12 .lx r13 .lx r14 .lx r15 .lx +cr cr +." PSR = " .psr +cr +; + +headerless +only forth also hidden also forth definitions + +: enterforth ( -- ) + state-valid on + my-self to %saved-my-self + handle-breakpoint +; + +also arm-assembler definitions +: 'state ( "name" -- ) + r0 drop rb-field + [ also forth ] + safe-parse-word ['] forth $vfind 0= abort" Bad saved register name" + >body @ + [ previous ] + set-offset +; +previous definitions + +h# e600.0010 value breakpoint-opcode + +\ The is the first half of the state restoration procedure. It executes +\ in normal state (e.g user state when running under an OS) +code (restart ( -- ) + \ Restore the Forth stacks. + + \ Establish the Data and Return stacks + ldr rp,'user rp0 + ldr sp,'user sp0 + + \ Restore the Forth Data and Return stacks from the save area. + + \ Data Stack + ldr r3,'user sp0 + dec r3,`ps-size #` \ Address of data stack area + ldr r0,'user pssave \ Address of data stack save area + mov r1,`ps-size /l / #` \ Size of data stack area in longwords + + begin + ldr r2,[r0],1cell + str r2,[r3],1cell + subs r1,r1,#1 + 0= until + + \ Return Stack + ldr r3,'user rp0 + dec r3,`rs-size #` \ Address of return stack area + ldr r0,'user rssave \ Address of return stack save area + mov r1,`rs-size /l / #` \ Size of return stack area in longwords + + begin + ldr r2,[r0],1cell + str r2,[r3],1cell + subs r1,r1,#1 + 0= until + + \ The following code communicates with the first part of "save-state". + \ See the description there. + + + \ Remember offset + here 'code (restart drop - >r + + \ Take another trap, so we can fix up the PC's in the signal handler + breakpoint-opcode asm, \ Undefined instruction + +end-code + +r> constant restart-offset + +\ This is the second half of the state saving procedure. It executes +\ in normal state (not exception state). + +label finish-save + + \ Find the user area + adr up,'body main-task \ Get user pointer address + ldr up,[up] \ Get user pointer + + \ Establish the Data and Return stacks + + \ Copy the entire Forth Data and Return stacks areas to a save area. + + \ Data Stack + ldr r3,'user sp0 + dec r3,`ps-size #` \ Address of data stack area + ldr r0,'user pssave \ Address of data stack save area + mov r1,`ps-size /l / #` \ Size of data stack area in longwords + + begin + ldr r2,[r3],1cell + str r2,[r0],1cell + subs r1,r1,#1 + 0= until + + ldr sp,'user sp0 + + \ Return Stack + ldr r3,'user rp0 + dec r3,`rs-size #` \ Address of return stack area + ldr r0,'user rssave \ Address of return stack save area + mov r1,`rs-size /l / #` \ Size of return stack area in longwords + + begin + ldr r2,[r3],1cell + str r2,[r0],1cell + subs r1,r1,#1 + 0= until + + ldr rp,'user rp0 + + \ Adjust the stack pointer to account for the top of stack register + inc sp,1cell + + \ Restart the Forth interpreter. + + \ Execute enterforth + adr ip,'body enterforth +c; + +label restart-common + \ Entry: r13: cpu-state others: scratch + + \ In the early part of this code, we don't have to be too careful + \ about register usage, because we will eventually restore all the + \ registers to saved values. + + mov r0,r13 \ Get cpu-state address into r0 + + ldr r3,'state r13 \ Get r13 for return mode + ldr r4,'state r14 \ Get r14 for return mode + + mrs r2,cpsr \ Get PSR for this mode + ldr r1,'state psr \ Get PSR for return mode + msr spsr,r1 \ Put it in place + + tst r1,#0xf \ Check for user mode + orreq r1,r1,#0xf \ Set system mode if previous mode was user + orr r1,r1,#0x80 \ Disable interrupts + msr cpsr,r1 \ Get into the return mode + + mov r13,r3 \ Set r13 in return mode + mov r14,r4 \ Set r14 in return mode + + msr cpsr,r2 \ Get back into undef mode + + ldr r14,'state pc \ Get PC for return mode + + ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12} \ Restore + + \ Set the saved PC to point to the rest of the state save + \ routine, then return from interrupt. + + movs pc,r14 \ Return from exception +end-code + +label save-common + str r14,'state pc \ Save PC from previous context + + mrs r2,cpsr \ Get PSR from this context + str r2,'state exception-psr \ Save exception PSR + + mrs r1,spsr \ Get PSR from previous context + str r1,'state psr \ Save it + + orr r3,r1,#0x80 \ Disable interrupts + tst r3,#0xf \ Check for user mode + orreq r3,r3,#0xf \ Set system mode if previous mode was user + msr cpsr,r3 \ Get into the old mode + + str r13,'state r13 \ Save r13 from the old mode + str r14,'state r14 \ Save r14 from the old mode + + msr cpsr,r2 \ Get back into undef mode + + \ When we enter Forth, we want interrupts to be enabled if they were + \ enabled before the exception occurred, unless the exception was caused + \ by an unexpected interrupt. + and r1,r1,#0x80 \ Get interrupt disable bit from previous mode + bic r2,r2,#0x80 \ Clear interrupt disable bit + and r3,r2,#0xf \ Get mode type bits + cmp r3,#2 \ Interrupt? (unexpected or user-abort) + cmpeq r4,#0 \ User-abort? (r4 != 0 if user abort) + orreq r2,r2,#0x80 \ Set interrupt disable bit if unexp. int. + orrne r2,r2,r1 \ Merge old int. dis. bit into new mode + + bic r2,r2,#0x1f \ Clear mode bits + orr r2,r2,#0x13 \ Set SVC32 mode + msr spsr,r2 \ Put it in SPSR so the return below puts + \ us back into the right mode for Forth + + \ Set the saved PC to point to the rest of the state save + \ routine, then return from interrupt. + + adr r14,'body finish-save + + movs pc,r14 \ Return from exception +end-code + +string-array exception-name +( 00 ) ," Reset" +( 01 ) ," Undefined Instruction" +( 02 ) ," Software Interrupt" +( 03 ) ," Prefetch Abort" +( 04 ) ," Data Abort" +( 05 ) ," Address Exception" +( 06 ) ," Interrupt" +( 07 ) ," Fast Interrupt" +end-string-array + +hex +create mode>exception +\ 0 1 2 3 4 5 6 7 + ff c, 7 c, 6 c, 2 c, ff c, ff c, ff c, 4 c, + +\ 8 9 a b c d e f + ff c, ff c, ff c, 1 c, ff c, ff c, ff c, ff c, + +: exception# ( -- ) + exception-psr h# f and mode>exception + c@ +; + +: (.exception) ( -- ) + exception# dup 7 < if + exception-name count type + else + ." Bogus exception # " .h + then + cr +; +' (.exception) is .exception + +[ifdef] notdef +\ Very simple handler, useful before the full breakpoint mechanism is installed +: print-breakpoint + .exception \ norm + interactive? 0= if bye then \ Restart only if a human is at the controls + ??cr quit +; +' print-breakpoint is handle-breakpoint +[then] + +defer install-handler ( handler exception# -- ) +defer catch-exception ( exception# -- ) + +headers +: catch-exceptions ( -- ) + /save-area alloc-mem is cpu-state + ps-size alloc-mem is pssave + rs-size alloc-mem is rssave + + 1 catch-exception \ Undefined instruction +\ 2 catch-exception \ Software interrupt + 3 catch-exception \ Prefetch abort + 4 catch-exception \ Data abort + 5 catch-exception \ 26-bit address exceptions + 6 catch-exception \ Interrupt + 7 catch-exception \ Fast Interrupt +; + +headers + +only forth also definitions + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/register.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/savefort.fth =================================================================== --- cpu/arm/savefort.fth (rev 0) +++ cpu/arm/savefort.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,128 @@ +purpose: Save the Forth dictionary image in a file in ARM image format +\ 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. + +hex + +variable dictionary-size + +only forth also hidden also +hidden definitions + +headerless + +: dict-size ( -- size-of-dictionary ) here origin - aligned ; +: rel-size ( -- reloc-size ) dict-size d# 31 + d# 32 / ; + +headers + +only forth also hidden also +forth definitions + +h# 80 buffer: aif-header + \ 00 NOP (BL decompress code) + \ 04 NOP (BL self reloc code) + \ 08 NOP (BL ZeroInit code) + \ 0c BL entry (or offset to entry point for non-executable AIF header) + \ 10 NOP (program exit instruction) + \ 14 0 (Read-only section size) + \ 18 Dictionary size, actual value will be set later + \ 1c Reloc Size (ARM Debug size) + \ 20 0 (ARM zero-init size) + \ 24 0 (image debug type) + \ 28 Reloc save base (image base) + \ 2c Dictionary growth size (min workspace size) + \ 30 d#32 (address mode) + \ 34 0 (data base address) + \ 38 reserved + \ 3c reserved + \ 40 NOP (debug init instruction) + \ 44-7c unused (zero-init code) + +decimal + +: aif! ( n offset -- ) aif-header + ! ; +: nop! ( offset -- ) h# e1a00000 swap aif! ; + +headerless +: $save-image ( header header-len filename$ -- ) + $new-file ( header header-len ) + + relocation-off + \ There is no need to copy the user area to the initial user area + \ image because the user area is currently accessed in-place. + + ( header header-len ) ofd @ fputs \ Write header + origin dict-size ofd @ fputs \ Write dictionary + relocation-map rel-size ofd @ fputs \ Write the relocation table + ofd @ fclose + relocation-on +; +: make-arm-header ( -- ) + \ Build the header + aif-header h# 80 erase + h# 00 nop! + h# 04 nop! + h# 08 nop! + h# eb00001b h# 0c aif! \ branch to just after the header + h# ef000011 h# 10 aif! \ SWI_Exit + h# 80 h# 14 aif! \ Read-only image size = header size + dict-size rel-size + h# 18 aif! \ Read-write size + 0 h# 1c aif! + 0 h# 20 aif! + 0 h# 24 aif! + h# 8000 h# 28 aif! \ Load base + dictionary-size @ h# 8.0000 max h# 2c aif! \ Dictionary growth size + h# 20 h# 30 aif! \ 32-bit address mode + 0 h# 34 aif! +\ dict-size h# 38 aif! \ Dictionary size (Using a reserved field!) +\ origin h# 3c aif! \ Save base (Using a reserved field!) + h# 40 nop! + dict-size h# 10 origin+ ! \ Dictionary size + origin h# 14 origin+ ! \ Save base +; +headers + +\ Save an image of the target system in a file. +: $save-forth ( str -- ) + 2>r + make-arm-header + " sys-init-io" $find-name is init-io + " sys-init" init-save + + aif-header h# 80 2r> $save-image +; + +only forth also definitions + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/savefort.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/savemeta.fth =================================================================== --- cpu/arm/savemeta.fth (rev 0) +++ cpu/arm/savemeta.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,97 @@ +purpose: Save the metacompiled kernel into a relocatable binary +\ See license at end of file + +\ Binary relocation table stuff +\ The relocation information in a binary file appears after the data segment. +\ The relocation table is a bit map with one bit for every 32-bit word +\ in the binary image. A one bit means that the longword is to be relocated. + +\ Binary file header + +only forth labels also forth also definitions + +hex +create aif-header forth + 80 allot aif-header 80 erase + \ 00 NOP (BL decompress code) + \ 04 NOP (BL self reloc code) + \ 08 NOP (BL ZeroInit code) + \ 0c BL entry + \ 10 NOP (program exit instruction) + \ 14 0 (Read-only section size) + \ 18 Dictionary size, actual value will be set later + \ 1c Reloc Size (ARM Debug size) + \ 20 0 (ARM zero-init size) + \ 24 0 (image debug type) + \ 28 Reloc save base (image base) + \ 2c Dictionary growth size (min workspace size) + \ 30 d#32 (address mode) + \ 34 0 (data base address) + \ 38 reserved + \ 3c reserved + \ 40 NOP (debug init instruction) + \ 44-7c unused (zero-init code) + +only forth also meta also forth-h also definitions + +: text-base ( -- adr-t ) origin-t ; +: text-size ( -- n ) here-t text-base - ; +: reloc-size ( -- n ) text-size 1f + 5 >> ; + +: aif! ( n offset -- ) aif-header + l-t! ; +: nop! ( offset -- ) th e1a00000 swap aif! ; + +\ Save an image of the target system in a file. +: $save-meta ( name$ -- ) + $new-file + \ Build and output the header + 00 nop! + 04 nop! + 08 nop! + eb00001b 0c aif! \ branch to just after the header + ef000011 10 aif! \ SWI_Exit + 80 14 aif! \ Read-only image size = header size + text-size reloc-size + 18 aif! \ Read-write size + 0 1c aif! + 0 20 aif! + 0 24 aif! + 8000 28 aif! \ Relocation save base + 8.0000 2c aif! \ Dictionary growth size + 20 30 aif! \ 32-bit address mode + 0 34 aif! +\ text-size 38 aif! \ Dictionary size (Using a reserved field!) +\ 0 3c aif! \ Save base (Using a reserved field!) + 40 nop! + text-size origin-t h# 10 + l!-t \ Dictionary size + 0 origin-t h# 14 + l!-t \ Save base + + aif-header 80 ofd @ fputs + text-base >hostaddr text-size ofd @ fputs \ Text image + relocation-map reloc-size ofd @ fputs \ Relocation map + + ofd @ fclose +; + +\ LICENSE_BEGIN +\ Copyright (c) 2008 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
Property changes on: cpu/arm/savemeta.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/scc.fth =================================================================== --- cpu/arm/scc.fth (rev 0) +++ cpu/arm/scc.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,114 @@ +purpose: System Control Coprocessor access words +\ See license at end of file + +hex +code scc-id@ ( -- n ) psh tos,sp mrc p15,0,tos,cr0,cr0,0 c; +code control@ ( -- n ) psh tos,sp mrc p15,0,tos,cr1,cr0,0 c; +code ttbase@ ( -- n ) psh tos,sp mrc p15,0,tos,cr2,cr0,0 c; +code domain-access@ ( -- n ) psh tos,sp mrc p15,0,tos,cr3,cr0,0 c; +code fault-status@ ( -- n ) psh tos,sp mrc p15,0,tos,cr5,cr0,0 c; +code fault-address@ ( -- n ) psh tos,sp mrc p15,0,tos,cr6,cr0,0 c; + +code control! ( n -- ) mcr p15,0,tos,cr1,cr0,0 pop tos,sp c; +code ttbase! ( n -- ) mcr p15,0,tos,cr2,cr0,0 pop tos,sp c; +code domain-access! ( n -- ) mcr p15,0,tos,cr3,cr0,0 pop tos,sp c; +code fault-status! ( n -- ) mcr p15,0,tos,cr5,cr0,0 pop tos,sp c; +code fault-address! ( n -- ) mcr p15,0,tos,cr6,cr0,0 pop tos,sp c; +code flush-i&d$ ( -- ) mcr p15,0,r0,cr7,cr7,0 c; +code flush-i$ ( -- ) mcr p15,0,r0,cr7,cr5,0 c; +code flush-d$ ( -- ) mcr p15,0,r0,cr7,cr6,0 c; +code flush-d$-entry ( va -- ) mcr p15,0,tos,cr7,cr6,1 pop tos,sp c; +code clean-d$-entry ( va -- ) mcr p15,0,tos,cr7,cr10,1 pop tos,sp c; +code drain-write-buffer ( -- ) mcr p15,0,r0,cr7,cr10,4 c; +code flush-i&d-tlb ( -- ) mcr p15,0,r0,cr8,cr7,0 c; +code flush-i-tlb ( -- ) mcr p15,0,r0,cr8,cr5,0 c; +code flush-d-tlb ( -- ) mcr p15,0,r0,cr8,cr6,0 c; +code flush-d-tlb-entry ( va -- ) mcr p15,0,tos,cr8,cr6,1 pop tos,sp c; + +code enable-odd-lfsr ( -- ) mcr p15,0,r0,cr15,cr1,1 c; +code enable-even-lfsr ( -- ) mcr p15,0,r0,cr15,cr2,1 c; +code clear-lfsr ( -- ) mcr p15,0,r0,cr15,cr4,1 c; +code lfsr-to-r14 ( -- ) mcr p15,0,r0,cr15,cr8,1 c; +code fast-clock ( -- ) mcr p15,0,r0,cr15,cr1,2 c; +code slow-clock ( -- ) mcr p15,0,r0,cr15,cr2,2 c; +code disable-mclk ( -- ) mcr p15,0,r0,cr15,cr4,2 c; +code wait-for-interrupt ( -- ) mcr p15,0,r0,cr15,cr8,2 c; + +: ttbase ( -- n ) ttbase@ h# 3ff invert and ; + +: .control ( -- ) control@ " i..rsb...wcam" show-bits ; + +d# 32 constant /cache-line +: cache-bounds ( adr len -- end start ) + bounds swap /cache-line round-up swap /cache-line round-down +; +: invalidate-cache-range ( adr len -- ) + dup if flush-i$ then + cache-bounds ?do i flush-d$-entry /cache-line +loop +; +d# 32 constant /cache-line +: flush-d$-range ( adr len -- ) + bounds swap /cache-line round-up swap /cache-line round-down ?do + i clean-d$-entry i flush-d$-entry + /cache-line +loop +; + +\ System-dependent function to flush the entire cache +\ (In normal ARM nomenclature, as used by most of the words in this file, +\ "flush" means "invalidate without ensuring that cached data has been +\ written to memory", while "clean" means "ensure that cached data has been +\ written to memory". In normal Open Firmware parlance, "invalidate" means +\ the former and "flush" the latter. "flush-cache" is a generic Open Firmware +\ operation, so it uses the Open Firmware nomenclature. +defer flush-cache ' noop to flush-cache + +: icache-on ( -- ) flush-i$ control@ h# 1000 or control! ; +: icache-off ( -- ) control@ h# 1000 invert and control! ; +: dcache-on ( -- ) flush-d$ control@ 4 or control! ; +: dcache-off ( -- ) + control@ dup 4 and if + flush-cache + 4 invert and control! + else + drop + then +; + +: write-buffer-on ( -- ) control@ 8 or control! ; +: write-buffer-off ( -- ) + drain-write-buffer control@ 8 invert and control! +; + +: stand-sync-cache ( adr len -- ) + cache-bounds ?do i clean-d$-entry /cache-line +loop + drain-write-buffer + flush-i$ +; +: stand-init-io ( -- ) + stand-init-io + ['] stand-sync-cache to sync-cache +; + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/scc.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/sqroot.fth =================================================================== --- cpu/arm/sqroot.fth (rev 0) +++ cpu/arm/sqroot.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,52 @@ +purpose: Integer square-root for ARM processors +\ See license at end of file + +\ u1 -- 32-bit unsigned +\ n -- significant digits +\ 16 -> sqrt-integer +\ 32 -> fractional integer 16/16bits + +code (sqrt \ ( u1 n -- u2 ) + r0 sp pop + r1 0 # mov + r2 0 # mov + begin r3 r1 mov + r0 r0 1 #lsl s mov + r2 r2 r2 adc + r0 r0 1 #lsl s mov + r2 r2 r2 adc + r1 r1 2 #lsl mov + r1 1 incr + r2 r2 r1 s sub \ get C-flag + r2 r2 r1 lt add + r1 r3 1 #lsl mov + r1 r1 1 # ge orr \ bit0 = not-C + top 1 s decr + eq until + top r1 mov c; + +: sqrt ( u1 -- u2 ) td 16 (sqrt ; + +\ LICENSE_BEGIN +\ Copyright (c) 2008 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
Property changes on: cpu/arm/sqroot.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/sync.fth =================================================================== --- cpu/arm/sync.fth (rev 0) +++ cpu/arm/sync.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,45 @@ +purpose: Synchronize the caches the hard way (not used if sys-sync-cache works) +\ See license at end of file + +code blow-icache + h# 1000 0 do h# ea000006 asm, loop \ b .+32 +c; +code touch-lines ( adr len -- ) + pop r0,sp + ahead begin + ldr r1,[r0] + add r0,r0,#32 + but then + subs tos,tos,#32 + 0<= until + pop tos,sp +c; +: slow-sync-cache ( adr len -- ) + 2drop + origin h# 8000 touch-lines \ Touch 2x /cache to displace the data cache + blow-icache +; + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/sync.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/sys.fth =================================================================== --- cpu/arm/sys.fth (rev 0) +++ cpu/arm/sys.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,102 @@ +purpose: Low-level I/O interface for use with a C "wrapper" program. +\ See license at end of file + +\ 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 ( call# -- ) + ldmia sp,{r0,r1,r2,r3,r4,r5} \ Get some arguments + + psh ip,rp \ This register may be clobbered + ldr r6,'user syscall-vec \ Get address of system call table + add r6,r6,tos \ Call through vector + ldr r6,[r6] + + mov lk,pc \ Return address + mov pc,r6 +\ ldr pc,[r6,tos] \ Call through vector + + str r0,'user sysretval \ Save the result + + pop ip,rp \ Restore IP + pop tos,sp \ Fix stack +c; +: retval ( -- return_value ) sysretval l@ ; +: 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 ; + +: sys-init-io ( -- ) + install-wrapper-alloc + init-relocation + install-wrapper-key + + install-disk-io + \ Don't poll the keyboard under Unix; block waiting for a key + ['] (key ['] key (is +\ sp@ hex . cr +\ rp@ hex . cr +\ origin hex . cr +\ here hex . cr +; +' sys-init-io is init-io + +: sys-init ; \ Environment initialization chain +' sys-init is init-environment +decimal + +\ LICENSE_BEGIN +\ Copyright (c) 1994 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
Property changes on: cpu/arm/sys.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/target.fth =================================================================== --- cpu/arm/target.fth (rev 0) +++ cpu/arm/target.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,286 @@ +purpose: Target-dependent definitions for metacompiling the kernel for ARM +\ See license at end of file + +hex +defer init-relocation-t +defer set-relocation-bit-t + +18000 constant max-kernel \ Maximum size of the kernel + +only forth also meta also definitions + + +variable protocol? protocol? off \ true -> information about compiled code +variable last-protocol + +: .data ( n adr -- ) + push-hex + last-protocol @ 0ffffff0 and over 0ffffff0 and <> + over d# 12 and 3 * d# 15 + dup >r #out @ < or + if cr 0ffffff0 and dup last-protocol ! 9 u.r + else drop + then + r> to-column 8 u.r + pop-base +; +: .protocol ( c t-adr -- ) protocol? @ if 2dup .data then ; + +: lobyte 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 800 * constant user-size-t +/n-t 100 * constant ps-size-t +/n-t 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@-t ( adr -- n ) >hostaddr c@ ; +\ : w!-t ( n adr -- ) .protocol >hostaddr le-w! ; +\ : w@-t ( t-adr -- n ) >hostaddr le-w@ ; + +: l!-t ( l adr -- ) .protocol >hostaddr le-l! ; +: l@-t ( t-adr -- l ) >hostaddr le-l@ ; + +: !-t ( n adr -- ) l!-t ; +: @-t ( t-adr -- n ) l@-t ; + +\ Store target data types into the host address space. +: c-t! ( c h-adr -- ) c! ; +\ : w-t! ( w h-adr -- ) le-w! ; +: l-t! ( l h-adr -- ) le-l! ; +: n-t! ( n h-adr -- ) l-t! ; + +: c-t@ ( host-address -- c ) c@ ; +: l-t@ ( host-address -- l ) le-l@ ; + +\ Next 3 are machine-independent +\ Next 3 are machine-independent +: c,-t ( byte -- ) here-t 1 allot-t c!-t ; +: w,-t true abort" Called w,-t" ; +\ : w,-t ( word -- ) here-t /w-t allot-t w!-t ; +: l,-t ( long -- ) here-t /l-t allot-t l!-t ; + +: ,-t ( adr -- ) l,-t ; +: ,user#-t ( user# -- ) l,-t ; + +: a@-t ( t-adr -- t-adr ) l@-t ; +: a!-t ( token t-adr -- ) set-relocation-bit-t l!-t ; +: token@-t ( t-adr -- t-adr ) a@-t ; +: token!-t ( token t-adr -- ) a!-t ; + +: rlink@-t ( occurrence -- next-occurrence ) a@-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@-t ( t-adr -- t-adr' ) a@-t ; +: link!-t ( t-adr t-adr -- ) a!-t ; +: link,-t ( t-adr -- ) 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@-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-adr -- t-adr ) a-t@ ; +: token-t! ( t-adr host-adr -- ) a-t! ; +: link-t@ ( host-adr -- t-adr ) a-t@ ; +: link-t! ( t-adr host-adr -- ) a-t! ; + +\ Machine independent +: a-t, ( t-adr -- ) here /a-t allot a-t! ; +: token-t, ( t-adr -- ) here /token-t allot token-t! ; +: >body-t ( cfa-t -- pfa-t ) + dup l@-t ff000000 and eb000000 = + if /l-t + then ; + +1 constant #threads-t \ Must be a power of 2 +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 ( -- ) + here-t is userarea-t + user-size-t allot-t + userarea-t >hostaddr user-size-t erase ; + +: >user-t ( cfa-t -- user-adr-t ) >body-t @-t userarea-t + >hostaddr ; +: 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 arm-assembler + [ also arm-assembler also helpers ] + ['] $arm-assem-do-undefined is $do-undefined + [ previous previous ] + align-t +; + +\ Next 5 are Machine Independent +: cmove-t ( from to-t n -- ) + 2dup 2>r + 0 do over c@ over c!-t ca1+ swap ca1+ swap loop 2drop + 2r> protocol? @ + if base @ >r hex last-protocol off + cr ." String at" over 6 u.r space ascii " emit bounds + do i c@-t dup bl < + if drop else emit then + loop ascii " emit r> base ! + else 2drop + then ; +: 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 -- ) + protocol? @ + if cr ." Toggle at" base @ >r hex 2dup swap 6 u.r 3 u.r + last-protocol off r> base ! + then + swap >r r@ c@-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! + threads-t current-t ! + /link +loop + last-protocol on ; + +\ For compiling branch offsets/addresses used by control constructs. +/l-t constant /branch + +\rel : branch! ( from to -- ) over - swap l!-t ; +\rel : branch, ( to -- ) here-t - l,-t ; + +\abs : branch! ( from to -- ) swap a!-t ; +\abs : branch, ( to -- ) a,-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 the +\ ARMx version, the user area is in the dictionary for +\ relocation to work right, but that is not true for the SPARC +\ version. Ultimately, separate relocation for the user area is +\ needed. The relocation probably should be automatic, by looking +\ at the storage address. + +: 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 also helpers ] + ['] allot-t is asm-allot + ['] here-t is here +\ ['] c!-t is byte! + ['] l!-t is asm! + ['] l@-t is asm@ + ['] set-relocation-bit-t is asm-set-relocation-bit + [ previous previous ] +; +: install-host-assembler ( -- ) +\ XXX Just punt for now. +; + +decimal + +\ LICENSE_BEGIN +\ Copyright (c) 2008 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
Property changes on: cpu/arm/target.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/testasm.txt =================================================================== --- cpu/arm/testasm.txt (rev 0) +++ cpu/arm/testasm.txt 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,1191 @@ +purpose: Test for ARM assembler +\ See license at end of file + +arm-asm helpers +\ debug amode-lsm +testloop +000000 e1a0c00d MOV r12,r13 +000004 e92d000f STMDB r13!,{r0-r3} +000008 e92ddff0 STMDB r13!,{r4-r12,r14,pc} +00000c e24cb014 SUB r11,r12,#0x14 +000010 e1a04002 MOV r4,r2 +000014 e2821080 ADD r1,r2,#0x80 +000018 e59b6008 LDR r6,[r11,#8] +00001c e582107c STR r1,[r2,#0x7c] +000020 e1a01002 MOV r1,r2 +000028 e3a00000 MOV r0,#0 +00002c e5941008 LDR r1,[r4,#8] +000030 e2811001 ADD r1,r1,#1 +000034 e2800001 ADD r0,r0,#1 +000038 e3500003 CMP r0,#3 +00003c e5841008 STR r1,[r4,#8] +000040 bafffff9 BLT 0x2c +000044 e5940008 LDR r0,[r4,#8] +000048 e4d01001 LDRB r1,[r0],#1 +00004c e5840008 STR r0,[r4,#8] +000050 e3a00000 MOV r0,#0 +000054 e5942008 LDR r2,[r4,#8] +000058 e2822001 ADD r2,r2,#1 +00005c e2800001 ADD r0,r0,#1 +000060 e3500006 CMP r0,#6 +000064 e5842008 STR r2,[r4,#8] +000068 bafffff9 BLT 0x54 +00006c e3110008 TST r1,#8 +000070 0a000004 BEQ 0x88 +000074 e5941008 LDR r1,[r4,#8] +000078 e4d10001 LDRB r0,[r1],#1 +00007c e3300000 TEQ r0,#0 +000080 e5841008 STR r1,[r4,#8] +000084 1afffffa BNE 0x74 +000088 e5941000 LDR r1,[r4,#0] +00008c e1a02004 MOV r2,r4 +000090 e3a00001 MOV r0,#1 +000098 e2008001 AND r8,r0,#1 +00009c e1a010a0 MOV r1,r0,LSR #1 +0000a0 e5940004 LDR r0,[r4,#4] +0000a4 e2400001 SUB r0,r0,#1 +0000a8 e5840004 STR r0,[r4,#4] +0000ac e1a02004 MOV r2,r4 +0000b0 e3a00002 MOV r0,#2 +0000b8 e2101003 ANDS r1,r0,#3 +0000bc e1a02120 MOV r2,r0,LSR #2 +0000c0 e5940004 LDR r0,[r4,#4] +0000c4 e2400002 SUB r0,r0,#2 +0000c8 e5840004 STR r0,[r4,#4] +0000cc e5842000 STR r2,[r4,#0] +0000d0 1a00002a BNE 0x180 +0000d4 e1a01002 MOV r1,r2 +0000d8 e2002007 AND r2,r0,#7 +0000dc e1a01231 MOV r1,r1,LSR r2 +0000e0 e0400002 SUB r0,r0,r2 +0000e4 e5840004 STR r0,[r4,#4] +0000e8 e1a02004 MOV r2,r4 +0000ec e3a00010 MOV r0,#0x10 +0000f4 e1a05800 MOV r5,r0,LSL #16 +0000f8 e1a05825 MOV r5,r5,LSR #16 +0000fc e1a01820 MOV r1,r0,LSR #16 +000100 e5940004 LDR r0,[r4,#4] +000104 e2400010 SUB r0,r0,#0x10 +000108 e5840004 STR r0,[r4,#4] +00010c e1a02004 MOV r2,r4 +000110 e3a00010 MOV r0,#0x10 +000118 e1e01000 MVN r1,r0 +00011c e1a01801 MOV r1,r1,LSL #16 +000120 e1a01821 MOV r1,r1,LSR #16 +000124 e1310005 TEQ r1,r5 +000128 13a08001 MOVNE r8,#1 +00012c 1a0000a5 BNE 0x3c8 +000130 e1a01820 MOV r1,r0,LSR #16 +000134 e5940004 LDR r0,[r4,#4] +000138 e2400010 SUB r0,r0,#0x10 +00013c e2457001 SUB r7,r5,#1 +000140 e3350000 TEQ r5,#0 +000144 e5840004 STR r0,[r4,#4] +000148 0a00000a BEQ 0x178 +00014c e1a02004 MOV r2,r4 +000150 e3a00008 MOV r0,#8 +000158 e4c60001 STRB r0,[r6],#1 +00015c e1a01420 MOV r1,r0,LSR #8 +000160 e5940004 LDR r0,[r4,#4] +000164 e2400008 SUB r0,r0,#8 +000168 e5840004 STR r0,[r4,#4] +00016c e1b00007 MOVS r0,r7 +000170 e2477001 SUB r7,r7,#1 +000174 1afffff4 BNE 0x14c +000178 e5841000 STR r1,[r4,#0] +00017c ea000091 B 0x3c8 +000180 e24ddc05 SUB r13,r13,#0x500 +000184 e3310001 TEQ r1,#1 +000188 e1a03004 MOV r3,r4 +00018c e1a0200d MOV r2,r13 +000190 e28d1e4f ADD r1,r13,#0x4f0 +000194 e92d000e STMDB r13!,{r1-r3} +000198 e28d3c05 ADD r3,r13,#0x500 +00019c e28d2f41 ADD r2,r13,#0x104 +0001a0 e2822b01 ADD r2,r2,#0x400 +0001a4 e28d1f42 ADD r1,r13,#0x108 +0001a8 e2811b01 ADD r1,r1,#0x400 +0001ac 1a000001 BNE 0x1b8 +0001b4 ea000000 B 0x1bc +0001bc e28dd00c ADD r13,r13,#0xc +0001c0 e3300000 TEQ r0,#0 +0001c4 13a08001 MOVNE r8,#1 +0001c8 1a00007d BNE 0x3c4 +0001cc e24dd004 SUB r13,r13,#4 +0001d0 e5941000 LDR r1,[r4,#0] +0001d4 e3a09001 MOV r9,#1 +0001d8 e59d04f8 LDR r0,[r13,#0x4f8] +0001dc e1a00019 MOV r0,r9,LSL r0 +0001e0 e240a001 SUB r10,r0,#1 +0001e4 e59d04f4 LDR r0,[r13,#0x4f4] +0001e8 e1a00019 MOV r0,r9,LSL r0 +0001ec e2400001 SUB r0,r0,#1 +0001f0 e58d0000 STR r0,[r13,#0] +0001f4 e1a02004 MOV r2,r4 +0001f8 e59d04f8 LDR r0,[r13,#0x4f8] +000200 e000200a AND r2,r0,r10 +000204 e59d1500 LDR r1,[r13,#0x500] +000208 e0817182 ADD r7,r1,r2,LSL #3 +00020c e5d75000 LDRB r5,[r7,#0] +000210 e3550010 CMP r5,#0x10 +000214 9a000013 BLS 0x268 +000218 e3a09001 MOV r9,#1 +00021c e3350063 TEQ r5,#0x63 +000220 0a000066 BEQ 0x3c0 +000224 e5d72001 LDRB r2,[r7,#1] +000228 e1a01230 MOV r1,r0,LSR r2 +00022c e5940004 LDR r0,[r4,#4] +000230 e0400002 SUB r0,r0,r2 +000234 e2455010 SUB r5,r5,#0x10 +000238 e5840004 STR r0,[r4,#4] +00023c e1a02004 MOV r2,r4 +000240 e1a00005 MOV r0,r5 +000248 e1a02519 MOV r2,r9,LSL r5 +00024c e2422001 SUB r2,r2,#1 +000250 e0022000 AND r2,r2,r0 +000254 e5b71004 LDR r1,[r7,#4]! +000258 e0817182 ADD r7,r1,r2,LSL #3 +00025c e5d75000 LDRB r5,[r7,#0] +000260 e3550010 CMP r5,#0x10 +000264 8affffec BHI 0x21c +000268 e5d72001 LDRB r2,[r7,#1] +00026c e1a01230 MOV r1,r0,LSR r2 +000270 e5940004 LDR r0,[r4,#4] +000274 e0400002 SUB r0,r0,r2 +000278 e3350010 TEQ r5,#0x10 +00027c e5840004 STR r0,[r4,#4] +000280 05970004 LDREQ r0,[r7,#4] +000284 04c60001 STREQB r0,[r6],#1 +000288 0affffd9 BEQ 0x1f4 +00028c e335000f TEQ r5,#0xf +000290 0a000047 BEQ 0x3b4 +000294 e1a02004 MOV r2,r4 +000298 e1a00005 MOV r0,r5 +0002a0 e5972004 LDR r2,[r7,#4] +0002a4 e1a02802 MOV r2,r2,LSL #16 +0002a8 e3a01001 MOV r1,#1 +0002ac e1a01511 MOV r1,r1,LSL r5 +0002b0 e2411001 SUB r1,r1,#1 +0002b4 e0011000 AND r1,r1,r0 +0002b8 e0819822 ADD r9,r1,r2,LSR #16 +0002bc e1a01530 MOV r1,r0,LSR r5 +0002c0 e5940004 LDR r0,[r4,#4] +0002c4 e0400005 SUB r0,r0,r5 +0002c8 e5840004 STR r0,[r4,#4] +0002cc e1a02004 MOV r2,r4 +0002d0 e59d04f4 LDR r0,[r13,#0x4f4] +0002d8 e59d1000 LDR r1,[r13,#0] +0002dc e0001001 AND r1,r0,r1 +0002e0 e59d24fc LDR r2,[r13,#0x4fc] +0002e4 e0827181 ADD r7,r2,r1,LSL #3 +0002e8 e5d75000 LDRB r5,[r7,#0] +0002ec e3550010 CMP r5,#0x10 +0002f0 9a000013 BLS 0x344 +0002f4 e3350063 TEQ r5,#0x63 +0002f8 0a000030 BEQ 0x3c0 +0002fc e5d72001 LDRB r2,[r7,#1] +000300 e1a01230 MOV r1,r0,LSR r2 +000304 e5940004 LDR r0,[r4,#4] +000308 e0400002 SUB r0,r0,r2 +00030c e2455010 SUB r5,r5,#0x10 +000310 e5840004 STR r0,[r4,#4] +000314 e1a02004 MOV r2,r4 +000318 e1a00005 MOV r0,r5 +000320 e3a02001 MOV r2,#1 +000324 e1a02512 MOV r2,r2,LSL r5 +000328 e2422001 SUB r2,r2,#1 +00032c e0022000 AND r2,r2,r0 +000330 e5b71004 LDR r1,[r7,#4]! +000334 e0817182 ADD r7,r1,r2,LSL #3 +000338 e5d75000 LDRB r5,[r7,#0] +00033c e3550010 CMP r5,#0x10 +000340 8affffeb BHI 0x2f4 +000344 e5d72001 LDRB r2,[r7,#1] +000348 e1a01230 MOV r1,r0,LSR r2 +00034c e5940004 LDR r0,[r4,#4] +000350 e0400002 SUB r0,r0,r2 +000354 e5840004 STR r0,[r4,#4] +000358 e1a02004 MOV r2,r4 +00035c e1a00005 MOV r0,r5 +000364 e5971004 LDR r1,[r7,#4] +000368 e1a01801 MOV r1,r1,LSL #16 +00036c e3a02001 MOV r2,#1 +000370 e1a02512 MOV r2,r2,LSL r5 +000374 e2422001 SUB r2,r2,#1 +000378 e0022000 AND r2,r2,r0 +00037c e0822821 ADD r2,r2,r1,LSR #16 +000380 e1a01530 MOV r1,r0,LSR r5 +000384 e5940004 LDR r0,[r4,#4] +000388 e0400005 SUB r0,r0,r5 +00038c e5840004 STR r0,[r4,#4] +000390 e2490001 SUB r0,r9,#1 +000394 e3390000 TEQ r9,#0 +000398 0affff95 BEQ 0x1f4 +00039c e7563002 LDRB r3,[r6,-r2] +0003a0 e4c63001 STRB r3,[r6],#1 +0003a4 e1b03000 MOVS r3,r0 +0003a8 e2400001 SUB r0,r0,#1 +0003ac 1afffffa BNE 0x39c +0003b0 eaffff8f B 0x1f4 +0003b4 e5940020 LDR r0,[r4,#0x20] +0003b8 e584007c STR r0,[r4,#0x7c] +0003bc e5841000 STR r1,[r4,#0] +0003c0 e28dd004 ADD r13,r13,#4 +0003c4 e28ddc05 ADD r13,r13,#0x500 +0003c8 e3380000 TEQ r8,#0 +0003cc 0affff2d BEQ 0x88 +0003d0 e59b1008 LDR r1,[r11,#8] +0003d4 e0460001 SUB r0,r6,r1 +0003d8 e91baff0 LDMDB r11,{r4-r11,r13,pc} +0003dc e92d47f0 STMDB r13!,{r4-r10,r14} +0003e0 e3a02000 MOV r2,#0 +0003e4 e5812000 STR r2,[r1,#0] +0003e8 e5810008 STR r0,[r1,#8] +0003ec e5812004 STR r2,[r1,#4] +0003f0 e591007c LDR r0,[r1,#0x7c] +0003f4 e581000c STR r0,[r1,#0xc] +0003f8 e591007c LDR r0,[r1,#0x7c] +0003fc e280004c ADD r0,r0,#0x4c +000400 e581007c STR r0,[r1,#0x7c] +000404 e3a09010 MOV r9,#0x10 +000408 e591000c LDR r0,[r1,#0xc] +00040c e3a05011 MOV r5,#0x11 +000410 e3a03012 MOV r3,#0x12 +000414 e4809004 STR r9,[r0],#4 +000418 e4805004 STR r5,[r0],#4 +00041c e4803004 STR r3,[r0],#4 +000420 e5802000 STR r2,[r0,#0] +000424 e2806004 ADD r6,r0,#4 +000428 e3a04008 MOV r4,#8 +00042c e3a0e007 MOV r14,#7 +000430 e3a0c009 MOV r12,#9 +000434 e3a03006 MOV r3,#6 +000438 e3a0800a MOV r8,#0xa +00043c e3a00005 MOV r0,#5 +000440 e3a0700b MOV r7,#0xb +000444 e3a0a004 MOV r10,#4 +000448 e8a64010 STMIA r6!,{r4,r14} +00044c e486c004 STR r12,[r6],#4 +000450 e8a60108 STMIA r6!,{r3,r8} +000454 e8a60481 STMIA r6!,{r0,r7,r10} +000458 e3a0a00c MOV r10,#0xc +00045c e486a004 STR r10,[r6],#4 +000460 e3a0a003 MOV r10,#3 +000464 e486a004 STR r10,[r6],#4 +000468 e3a0a00d MOV r10,#0xd +00046c e486a004 STR r10,[r6],#4 +000470 e3a0a002 MOV r10,#2 +000474 e486a004 STR r10,[r6],#4 +000478 e3a0a00e MOV r10,#0xe +00047c e486a004 STR r10,[r6],#4 +000480 e3a0a001 MOV r10,#1 +000484 e486a004 STR r10,[r6],#4 +000488 e3a0a00f MOV r10,#0xf +00048c e586a000 STR r10,[r6,#0] +000490 e591607c LDR r6,[r1,#0x7c] +000494 e5816010 STR r6,[r1,#0x10] +000498 e591607c LDR r6,[r1,#0x7c] +00049c e2866040 ADD r6,r6,#0x40 +0004a0 e581607c STR r6,[r1,#0x7c] +0004a4 e3a0a003 MOV r10,#3 +0004a8 e5916010 LDR r6,[r1,#0x10] +0004ac e5c6a000 STRB r10,[r6,#0] +0004b0 e5c62001 STRB r2,[r6,#1] +0004b4 e3a0a004 MOV r10,#4 +0004b8 e5e6a002 STRB r10,[r6,#2]! +0004bc e5c62001 STRB r2,[r6,#1] +0004c0 e5e60002 STRB r0,[r6,#2]! +0004c4 e5c62001 STRB r2,[r6,#1] +0004c8 e5e63002 STRB r3,[r6,#2]! +0004cc e5c62001 STRB r2,[r6,#1] +0004d0 e5e6e002 STRB r14,[r6,#2]! +0004d4 e5c62001 STRB r2,[r6,#1] +0004d8 e5e64002 STRB r4,[r6,#2]! +0004dc e5c62001 STRB r2,[r6,#1] +0004e0 e5e6c002 STRB r12,[r6,#2]! +0004e4 e5c62001 STRB r2,[r6,#1] +0004e8 e5e68002 STRB r8,[r6,#2]! +0004ec e5c62001 STRB r2,[r6,#1] +0004f0 e5e67002 STRB r7,[r6,#2]! +0004f4 e5c62001 STRB r2,[r6,#1] +0004f8 e3a0a00d MOV r10,#0xd +0004fc e5e6a002 STRB r10,[r6,#2]! +000500 e5c62001 STRB r2,[r6,#1] +000504 e3a0a00f MOV r10,#0xf +000508 e5e6a002 STRB r10,[r6,#2]! +00050c e5c62001 STRB r2,[r6,#1] +000510 e5e65002 STRB r5,[r6,#2]! +000514 e5c62001 STRB r2,[r6,#1] +000518 e3a07013 MOV r7,#0x13 +00051c e5e67002 STRB r7,[r6,#2]! +000520 e5c62001 STRB r2,[r6,#1] +000524 e3a07017 MOV r7,#0x17 +000528 e5e67002 STRB r7,[r6,#2]! +00052c e5c62001 STRB r2,[r6,#1] +000530 e3a0701b MOV r7,#0x1b +000534 e5e67002 STRB r7,[r6,#2]! +000538 e5c62001 STRB r2,[r6,#1] +00053c e3a0701f MOV r7,#0x1f +000540 e5e67002 STRB r7,[r6,#2]! +000544 e5c62001 STRB r2,[r6,#1] +000548 e3a07023 MOV r7,#0x23 +00054c e5e67002 STRB r7,[r6,#2]! +000550 e5c62001 STRB r2,[r6,#1] +000554 e3a0702b MOV r7,#0x2b +000558 e5e67002 STRB r7,[r6,#2]! +00055c e5c62001 STRB r2,[r6,#1] +000560 e3a07033 MOV r7,#0x33 +000564 e5e67002 STRB r7,[r6,#2]! +000568 e5c62001 STRB r2,[r6,#1] +00056c e3a0703b MOV r7,#0x3b +000570 e5e67002 STRB r7,[r6,#2]! +000574 e5c62001 STRB r2,[r6,#1] +000578 e3a08043 MOV r8,#0x43 +00057c e5e68002 STRB r8,[r6,#2]! +000580 e5c62001 STRB r2,[r6,#1] +000584 e2867002 ADD r7,r6,#2 +000588 e3a06053 MOV r6,#0x53 +00058c e5c76000 STRB r6,[r7,#0] +000590 e5c72001 STRB r2,[r7,#1] +000594 e3a06063 MOV r6,#0x63 +000598 e5e76002 STRB r6,[r7,#2]! +00059c e5c72001 STRB r2,[r7,#1] +0005a0 e3a08073 MOV r8,#0x73 +0005a4 e5e78002 STRB r8,[r7,#2]! +0005a8 e5c72001 STRB r2,[r7,#1] +0005ac e3a08083 MOV r8,#0x83 +0005b0 e5e78002 STRB r8,[r7,#2]! +0005b4 e5c72001 STRB r2,[r7,#1] +0005b8 e3a080a3 MOV r8,#0xa3 +0005bc e5e78002 STRB r8,[r7,#2]! +0005c0 e5c72001 STRB r2,[r7,#1] +0005c4 e3a080c3 MOV r8,#0xc3 +0005c8 e5e78002 STRB r8,[r7,#2]! +0005cc e5c72001 STRB r2,[r7,#1] +0005d0 e3a080e3 MOV r8,#0xe3 +0005d4 e5e78002 STRB r8,[r7,#2]! +0005d8 e5c72001 STRB r2,[r7,#1] +0005dc e2877002 ADD r7,r7,#2 +0005e0 e3a08002 MOV r8,#2 +0005e4 e5c78000 STRB r8,[r7,#0] +0005e8 e3a0a001 MOV r10,#1 +0005ec e5c7a001 STRB r10,[r7,#1] +0005f0 e7e72008 STRB r2,[r7,r8]! +0005f4 e5c72001 STRB r2,[r7,#1] +0005f8 e7e72008 STRB r2,[r7,r8]! +0005fc e5c72001 STRB r2,[r7,#1] +000600 e591707c LDR r7,[r1,#0x7c] +000604 e5817014 STR r7,[r1,#0x14] +000608 e591707c LDR r7,[r1,#0x7c] +00060c e2877040 ADD r7,r7,#0x40 +000610 e581707c STR r7,[r1,#0x7c] +000614 e3a07000 MOV r7,#0 +000618 e591a014 LDR r10,[r1,#0x14] +00061c e3a02000 MOV r2,#0 +000620 e5ca2000 STRB r2,[r10,#0] +000624 e5ca2001 STRB r2,[r10,#1] +000628 e28aa002 ADD r10,r10,#2 +00062c e2877001 ADD r7,r7,#1 +000630 e3570004 CMP r7,#4 +000634 bafffff8 BLT 0x61c +000638 e357001c CMP r7,#0x1c +00063c aa000012 BGE 0x68c +000640 e2572001 SUBS r2,r7,#1 +000644 42822003 ADDMI r2,r2,#3 +000648 e1a02142 MOV r2,r2,ASR #2 +00064c e1a08802 MOV r8,r2,LSL #16 +000650 e1a08828 MOV r8,r8,LSR #16 +000654 e1a0200a MOV r2,r10 +000658 e5ca8000 STRB r8,[r10,#0] +00065c e1a0a448 MOV r10,r8,ASR #8 +000660 e5c2a001 STRB r10,[r2,#1] +000664 e5e28002 STRB r8,[r2,#2]! +000668 e5c2a001 STRB r10,[r2,#1] +00066c e5e28002 STRB r8,[r2,#2]! +000670 e5c2a001 STRB r10,[r2,#1] +000674 e5e28002 STRB r8,[r2,#2]! +000678 e5c2a001 STRB r10,[r2,#1] +00067c e282a002 ADD r10,r2,#2 +000680 e2877004 ADD r7,r7,#4 +000684 e357001c CMP r7,#0x1c +000688 baffffec BLT 0x640 +00068c e3a02000 MOV r2,#0 +000690 e5ca2000 STRB r2,[r10,#0] +000694 e5ca2001 STRB r2,[r10,#1] +000698 e5ea6002 STRB r6,[r10,#2]! +00069c e5ca2001 STRB r2,[r10,#1] +0006a0 e5ea6002 STRB r6,[r10,#2]! +0006a4 e5ca2001 STRB r2,[r10,#1] +0006a8 e591607c LDR r6,[r1,#0x7c] +0006ac e5816018 STR r6,[r1,#0x18] +0006b0 e2867040 ADD r7,r6,#0x40 +0006b4 e581707c STR r7,[r1,#0x7c] +0006b8 e3a07001 MOV r7,#1 +0006bc e5c67000 STRB r7,[r6,#0] +0006c0 e5c62001 STRB r2,[r6,#1] +0006c4 e3a0a002 MOV r10,#2 +0006c8 e5e6a002 STRB r10,[r6,#2]! +0006cc e5c62001 STRB r2,[r6,#1] +0006d0 e3a08003 MOV r8,#3 +0006d4 e7e6800a STRB r8,[r6,r10]! +0006d8 e5c62001 STRB r2,[r6,#1] +0006dc e3a08004 MOV r8,#4 +0006e0 e7e6800a STRB r8,[r6,r10]! +0006e4 e5c62001 STRB r2,[r6,#1] +0006e8 e5e60002 STRB r0,[r6,#2]! +0006ec e5c62001 STRB r2,[r6,#1] +0006f0 e5e6e002 STRB r14,[r6,#2]! +0006f4 e5c62001 STRB r2,[r6,#1] +0006f8 e5e6c002 STRB r12,[r6,#2]! +0006fc e5c62001 STRB r2,[r6,#1] +000700 e3a0000d MOV r0,#0xd +000704 e5e60002 STRB r0,[r6,#2]! +000708 e5c62001 STRB r2,[r6,#1] +00070c e5e65002 STRB r5,[r6,#2]! +000710 e5c62001 STRB r2,[r6,#1] +000714 e2860002 ADD r0,r6,#2 +000718 e3a0c019 MOV r12,#0x19 +00071c e5c0c000 STRB r12,[r0,#0] +000720 e5c02001 STRB r2,[r0,#1] +000724 e3a0c021 MOV r12,#0x21 +000728 e5e0c002 STRB r12,[r0,#2]! +00072c e5c02001 STRB r2,[r0,#1] +000730 e3a0c031 MOV r12,#0x31 +000734 e5e0c002 STRB r12,[r0,#2]! +000738 e5c02001 STRB r2,[r0,#1] +00073c e3a0c041 MOV r12,#0x41 +000740 e5e0c002 STRB r12,[r0,#2]! +000744 e5c02001 STRB r2,[r0,#1] +000748 e3a0c061 MOV r12,#0x61 +00074c e5e0c002 STRB r12,[r0,#2]! +000750 e5c02001 STRB r2,[r0,#1] +000754 e3a0c081 MOV r12,#0x81 +000758 e5e0c002 STRB r12,[r0,#2]! +00075c e5c02001 STRB r2,[r0,#1] +000760 e3a0c0c1 MOV r12,#0xc1 +000764 e5e0c002 STRB r12,[r0,#2]! +000768 e5c02001 STRB r2,[r0,#1] +00076c e2800002 ADD r0,r0,#2 +000770 e3a0c001 MOV r12,#1 +000774 e5c0c000 STRB r12,[r0,#0] +000778 e5c07001 STRB r7,[r0,#1] +00077c e2800002 ADD r0,r0,#2 +000780 e3a0c081 MOV r12,#0x81 +000784 e5c0c000 STRB r12,[r0,#0] +000788 e5c07001 STRB r7,[r0,#1] +00078c e2800002 ADD r0,r0,#2 +000790 e3a0c001 MOV r12,#1 +000794 e5c0c000 STRB r12,[r0,#0] +000798 e5c0a001 STRB r10,[r0,#1] +00079c e2800002 ADD r0,r0,#2 +0007a0 e5c0c000 STRB r12,[r0,#0] +0007a4 e3a08003 MOV r8,#3 +0007a8 e5c08001 STRB r8,[r0,#1] +0007ac e2800002 ADD r0,r0,#2 +0007b0 e5c0c000 STRB r12,[r0,#0] +0007b4 e3a08004 MOV r8,#4 +0007b8 e5c08001 STRB r8,[r0,#1] +0007bc e2800002 ADD r0,r0,#2 +0007c0 e3a0c001 MOV r12,#1 +0007c4 e5c0c000 STRB r12,[r0,#0] +0007c8 e5c03001 STRB r3,[r0,#1] +0007cc e2800002 ADD r0,r0,#2 +0007d0 e3a03001 MOV r3,#1 +0007d4 e5c03000 STRB r3,[r0,#0] +0007d8 e5c04001 STRB r4,[r0,#1] +0007dc e2800002 ADD r0,r0,#2 +0007e0 e5c03000 STRB r3,[r0,#0] +0007e4 e3a0a00c MOV r10,#0xc +0007e8 e5c0a001 STRB r10,[r0,#1] +0007ec e2800002 ADD r0,r0,#2 +0007f0 e5c03000 STRB r3,[r0,#0] +0007f4 e5c09001 STRB r9,[r0,#1] +0007f8 e2800002 ADD r0,r0,#2 +0007fc e3a03001 MOV r3,#1 +000800 e5c03000 STRB r3,[r0,#0] +000804 e3a03018 MOV r3,#0x18 +000808 e5c03001 STRB r3,[r0,#1] +00080c e2800002 ADD r0,r0,#2 +000810 e3a03001 MOV r3,#1 +000814 e5c03000 STRB r3,[r0,#0] +000818 e3a03020 MOV r3,#0x20 +00081c e5c03001 STRB r3,[r0,#1] +000820 e2800002 ADD r0,r0,#2 +000824 e3a03001 MOV r3,#1 +000828 e5c03000 STRB r3,[r0,#0] +00082c e3a03030 MOV r3,#0x30 +000830 e5c03001 STRB r3,[r0,#1] +000834 e2800002 ADD r0,r0,#2 +000838 e3a03001 MOV r3,#1 +00083c e5c03000 STRB r3,[r0,#0] +000840 e3a03040 MOV r3,#0x40 +000844 e5c03001 STRB r3,[r0,#1] +000848 e2800002 ADD r0,r0,#2 +00084c e3a03001 MOV r3,#1 +000850 e5c03000 STRB r3,[r0,#0] +000854 e3a03060 MOV r3,#0x60 +000858 e5c03001 STRB r3,[r0,#1] +00085c e591007c LDR r0,[r1,#0x7c] +000860 e581001c STR r0,[r1,#0x1c] +000864 e1a03000 MOV r3,r0 +000868 e2800040 ADD r0,r0,#0x40 +00086c e581007c STR r0,[r1,#0x7c] +000870 e5c32000 STRB r2,[r3,#0] +000874 e5c32001 STRB r2,[r3,#1] +000878 e5e32002 STRB r2,[r3,#2]! +00087c e5c32001 STRB r2,[r3,#1] +000880 e2833002 ADD r3,r3,#2 +000884 e3a00002 MOV r0,#2 +000888 e2402001 SUB r2,r0,#1 +00088c e0822fa2 ADD r2,r2,r2,LSR #31 +000890 e1a020c2 MOV r2,r2,ASR #1 +000894 e1a0c802 MOV r12,r2,LSL #16 +000898 e1a0c82c MOV r12,r12,LSR #16 +00089c e5c3c000 STRB r12,[r3,#0] +0008a0 e1a0242c MOV r2,r12,LSR #8 +0008a4 e5c32001 STRB r2,[r3,#1] +0008a8 e5e3c002 STRB r12,[r3,#2]! +0008ac e5c32001 STRB r2,[r3,#1] +0008b0 e2833002 ADD r3,r3,#2 +0008b4 e2800002 ADD r0,r0,#2 +0008b8 e350001e CMP r0,#0x1e +0008bc bafffff1 BLT 0x888 +0008c0 e591007c LDR r0,[r1,#0x7c] +0008c4 e5a10020 STR r0,[r1,#0x20]! +0008c8 e8bd87f0 LDMIA r13!,{r4-r10,pc} +0008cc e5923004 LDR r3,[r2,#4] +0008d0 e1530000 CMP r3,r0 +0008d4 2a000008 BCS 0x8fc +0008d8 e5923008 LDR r3,[r2,#8] +0008dc e4d3c001 LDRB r12,[r3],#1 +0008e0 e5823008 STR r3,[r2,#8] +0008e4 e5923004 LDR r3,[r2,#4] +0008e8 e181131c ORR r1,r1,r12,LSL r3 +0008ec e2833008 ADD r3,r3,#8 +0008f0 e5823004 STR r3,[r2,#4] +0008f4 e1530000 CMP r3,r0 +0008f8 3afffff6 BCC 0x8d8 +0008fc e1a00001 MOV r0,r1 +000900 e1a0f00e MOV pc,r14 +000904 e1a0c00d MOV r12,r13 +000908 e92d000f STMDB r13!,{r0-r3} +00090c e92ddff0 STMDB r13!,{r4-r12,r14,pc} +000910 e24cb014 SUB r11,r12,#0x14 +000914 e59b301c LDR r3,[r11,#0x1c] +000918 e24ddf5b SUB r13,r13,#0x16c +00091c e24ddb01 SUB r13,r13,#0x400 +000920 e3a02000 MOV r2,#0 +000924 e3a0c000 MOV r12,#0 +000928 e28def46 ADD r14,r13,#0x118 +00092c e28eeb01 ADD r14,r14,#0x400 +000930 e78ec102 STR r12,[r14,r2,LSL #2] +000934 e2822001 ADD r2,r2,#1 +000938 e3520011 CMP r2,#0x11 +00093c 3afffff9 BCC 0x928 +000940 e1a02000 MOV r2,r0 +000944 e1a0e001 MOV r14,r1 +000948 e28d5f46 ADD r5,r13,#0x118 +00094c e2855b01 ADD r5,r5,#0x400 +000950 e4924004 LDR r4,[r2],#4 +000954 e0854104 ADD r4,r5,r4,LSL #2 +000958 e5945000 LDR r5,[r4,#0] +00095c e2855001 ADD r5,r5,#1 +000960 e25ee001 SUBS r14,r14,#1 +000964 e5845000 STR r5,[r4,#0] +000968 1afffff6 BNE 0x948 +00096c e59d2518 LDR r2,[r13,#0x518] +000970 e1320001 TEQ r2,r1 +000974 1a000004 BNE 0x98c +000978 e1a0000c MOV r0,r12 +00097c e59bc018 LDR r12,[r11,#0x18] +000980 e58c0000 STR r0,[r12,#0] +000984 e5830000 STR r0,[r3,#0] +000988 ea000107 B 0xdac +00098c e3a04001 MOV r4,#1 +000990 e5932000 LDR r2,[r3,#0] +000994 e28def46 ADD r14,r13,#0x118 +000998 e28eeb01 ADD r14,r14,#0x400 +00099c e79ee104 LDR r14,[r14,r4,LSL #2] +0009a0 e33e0000 TEQ r14,#0 +0009a4 1a000002 BNE 0x9b4 +0009a8 e2844001 ADD r4,r4,#1 +0009ac e3540010 CMP r4,#0x10 +0009b0 9afffff7 BLS 0x994 +0009b4 e1a05004 MOV r5,r4 +0009b8 e1520004 CMP r2,r4 +0009bc 31a02004 MOVCC r2,r4 +0009c0 e3a0e010 MOV r14,#0x10 +0009c4 e28d6f46 ADD r6,r13,#0x118 +0009c8 e2866b01 ADD r6,r6,#0x400 +0009cc e796610e LDR r6,[r6,r14,LSL #2] +0009d0 e3360000 TEQ r6,#0 +0009d4 1a000001 BNE 0x9e0 +0009d8 e25ee001 SUBS r14,r14,#1 +0009dc 1afffff8 BNE 0x9c4 +0009e0 e58de510 STR r14,[r13,#0x510] +0009e4 e152000e CMP r2,r14 +0009e8 81a0200e MOVHI r2,r14 +0009ec e5832000 STR r2,[r3,#0] +0009f0 e3a03001 MOV r3,#1 +0009f4 e1a07413 MOV r7,r3,LSL r4 +0009f8 e3a06002 MOV r6,#2 +0009fc e154000e CMP r4,r14 +000a00 2a00000a BCS 0xa30 +000a04 e28d8f46 ADD r8,r13,#0x118 +000a08 e2888b01 ADD r8,r8,#0x400 +000a0c e7988104 LDR r8,[r8,r4,LSL #2] +000a10 e0577008 SUBS r7,r7,r8 +000a14 5a000001 BPL 0xa20 +000a18 e1a00006 MOV r0,r6 +000a1c ea0000e2 B 0xdac +000a20 e2844001 ADD r4,r4,#1 +000a24 e1a07087 MOV r7,r7,LSL #1 +000a28 e154000e CMP r4,r14 +000a2c 3afffff4 BCC 0xa04 +000a30 e28d4f46 ADD r4,r13,#0x118 +000a34 e2844b01 ADD r4,r4,#0x400 +000a38 e794410e LDR r4,[r4,r14,LSL #2] +000a3c e0577004 SUBS r7,r7,r4 +000a40 e58d7000 STR r7,[r13,#0] +000a44 4afffff3 BMI 0xa18 +000a48 e59d7000 LDR r7,[r13,#0] +000a4c e0846007 ADD r6,r4,r7 +000a50 e28d4f46 ADD r4,r13,#0x118 +000a54 e2844b01 ADD r4,r4,#0x400 +000a58 e784610e STR r6,[r4,r14,LSL #2] +000a5c e3a04000 MOV r4,#0 +000a60 e58d4008 STR r4,[r13,#8] +000a64 e28d6f47 ADD r6,r13,#0x11c +000a68 e2866b01 ADD r6,r6,#0x400 +000a6c e28d700c ADD r7,r13,#0xc +000a70 e25ee001 SUBS r14,r14,#1 +000a74 0a000004 BEQ 0xa8c +000a78 e4968004 LDR r8,[r6],#4 +000a7c e0884004 ADD r4,r8,r4 +000a80 e25ee001 SUBS r14,r14,#1 +000a84 e4874004 STR r4,[r7],#4 +000a88 1afffffa BNE 0xa78 +000a8c e1a04000 MOV r4,r0 +000a90 e4940004 LDR r0,[r4],#4 +000a94 e3300000 TEQ r0,#0 +000a98 0a000006 BEQ 0xab8 +000a9c e28d6004 ADD r6,r13,#4 +000aa0 e7968100 LDR r8,[r6,r0,LSL #2] +000aa4 e2887001 ADD r7,r8,#1 +000aa8 e28d6004 ADD r6,r13,#4 +000aac e7867100 STR r7,[r6,r0,LSL #2] +000ab0 e28d0048 ADD r0,r13,#0x48 +000ab4 e780e108 STR r14,[r0,r8,LSL #2] +000ab8 e28ee001 ADD r14,r14,#1 +000abc e15e0001 CMP r14,r1 +000ac0 3afffff2 BCC 0xa90 +000ac4 e3a0e000 MOV r14,#0 +000ac8 e58de004 STR r14,[r13,#4] +000acc e28d6048 ADD r6,r13,#0x48 +000ad0 e3e04000 MVN r4,#0 +000ad4 e2620000 RSB r0,r2,#0 +000ad8 e3a08000 MOV r8,#0 +000adc e3a07000 MOV r7,#0 +000ae0 e58dc4c8 STR r12,[r13,#0x4c8] +000ae4 e59d9510 LDR r9,[r13,#0x510] +000ae8 e1550009 CMP r5,r9 +000aec ca0000a8 BGT 0xd94 +000af0 e28dc048 ADD r12,r13,#0x48 +000af4 e08c1101 ADD r1,r12,r1,LSL #2 +000af8 e58d1568 STR r1,[r13,#0x568] +000afc e28d1f46 ADD r1,r13,#0x118 +000b00 e2811b01 ADD r1,r1,#0x400 +000b04 e7911105 LDR r1,[r1,r5,LSL #2] +000b08 e2413001 SUB r3,r1,#1 +000b0c e3310000 TEQ r1,#0 +000b10 e58d355c STR r3,[r13,#0x55c] +000b14 0a00009a BEQ 0xd84 +000b18 e28d3f46 ADD r3,r13,#0x118 +000b1c e2833b01 ADD r3,r3,#0x400 +000b20 e083c105 ADD r12,r3,r5,LSL #2 +000b24 e2451001 SUB r1,r5,#1 +000b28 e3a03001 MOV r3,#1 +000b2c e1a01113 MOV r1,r3,LSL r1 +000b30 e58d1560 STR r1,[r13,#0x560] +000b34 e58dc564 STR r12,[r13,#0x564] +000b38 e0801002 ADD r1,r0,r2 +000b3c e1510005 CMP r1,r5 +000b40 aa000041 BGE 0xc4c +000b44 e59d155c LDR r1,[r13,#0x55c] +000b48 e2811001 ADD r1,r1,#1 +000b4c e2844001 ADD r4,r4,#1 +000b50 e0800002 ADD r0,r0,r2 +000b54 e59d3510 LDR r3,[r13,#0x510] +000b58 e0433000 SUB r3,r3,r0 +000b5c e1530002 CMP r3,r2 +000b60 91a07003 MOVLS r7,r3 +000b64 81a07002 MOVHI r7,r2 +000b68 e0453000 SUB r3,r5,r0 +000b6c e3a0a001 MOV r10,#1 +000b70 e1a0c31a MOV r12,r10,LSL r3 +000b74 e15c0001 CMP r12,r1 +000b78 9a00000c BLS 0xbb0 +000b7c e04c8001 SUB r8,r12,r1 +000b80 e2833001 ADD r3,r3,#1 +000b84 e1530007 CMP r3,r7 +000b88 e59dc564 LDR r12,[r13,#0x564] +000b8c 2a000007 BCS 0xbb0 +000b90 e1a09088 MOV r9,r8,LSL #1 +000b94 e5bc8004 LDR r8,[r12,#4]! +000b98 e1590008 CMP r9,r8 +000b9c 9a000003 BLS 0xbb0 +000ba0 e0498008 SUB r8,r9,r8 +000ba4 e2833001 ADD r3,r3,#1 +000ba8 e1530007 CMP r3,r7 +000bac 3afffff7 BCC 0xb90 +000bb0 e1a0731a MOV r7,r10,LSL r3 +000bb4 e59b9020 LDR r9,[r11,#0x20] +000bb8 e5b9c07c LDR r12,[r9,#0x7c]! +000bbc e08c8187 ADD r8,r12,r7,LSL #3 +000bc0 e2888008 ADD r8,r8,#8 +000bc4 e59b9020 LDR r9,[r11,#0x20] +000bc8 e5a9807c STR r8,[r9,#0x7c]! +000bcc e28c8008 ADD r8,r12,#8 +000bd0 e59b9018 LDR r9,[r11,#0x18] +000bd4 e5898000 STR r8,[r9,#0] +000bd8 e3a09000 MOV r9,#0 +000bdc e28cc004 ADD r12,r12,#4 +000be0 e58bc018 STR r12,[r11,#0x18] +000be4 e58c9000 STR r9,[r12,#0] +000be8 e28dc0c8 ADD r12,r13,#0xc8 +000bec e28ccb01 ADD r12,r12,#0x400 +000bf0 e78c8104 STR r8,[r12,r4,LSL #2] +000bf4 e3340000 TEQ r4,#0 +000bf8 0a000010 BEQ 0xc40 +000bfc e28dc004 ADD r12,r13,#4 +000c00 e78ce104 STR r14,[r12,r4,LSL #2] +000c04 e5cd2509 STRB r2,[r13,#0x509] +000c08 e2833010 ADD r3,r3,#0x10 +000c0c e5cd3508 STRB r3,[r13,#0x508] +000c10 e0403002 SUB r3,r0,r2 +000c14 e1a0333e MOV r3,r14,LSR r3 +000c18 e58d850c STR r8,[r13,#0x50c] +000c1c e28dc0c8 ADD r12,r13,#0xc8 +000c20 e28ccb01 ADD r12,r12,#0x400 +000c24 e08cc104 ADD r12,r12,r4,LSL #2 +000c28 e51cc004 LDR r12,[r12,#-4] +000c2c e08c9183 ADD r9,r12,r3,LSL #3 +000c30 e28daf42 ADD r10,r13,#0x108 +000c34 e28aab01 ADD r10,r10,#0x400 +000c38 e89a1008 LDMIA r10,{r3,r12} +000c3c e8891008 STMIA r9,{r3,r12} +000c40 e0803002 ADD r3,r0,r2 +000c44 e1530005 CMP r3,r5 +000c48 baffffbf BLT 0xb4c +000c4c e0453000 SUB r3,r5,r0 +000c50 e5cd3509 STRB r3,[r13,#0x509] +000c54 e59d1568 LDR r1,[r13,#0x568] +000c58 e1510006 CMP r1,r6 +000c5c 93a01063 MOVLS r1,#0x63 +000c60 95cd1508 STRLSB r1,[r13,#0x508] +000c64 9a000019 BLS 0xcd0 +000c68 e5961000 LDR r1,[r6,#0] +000c6c e59bc00c LDR r12,[r11,#0xc] +000c70 e151000c CMP r1,r12 +000c74 2a000008 BCS 0xc9c +000c78 e3510c01 CMP r1,#0x100 +000c7c 23a0100f MOVCS r1,#0xf +000c80 33a01010 MOVCC r1,#0x10 +000c84 e5cd1508 STRB r1,[r13,#0x508] +000c88 e4961004 LDR r1,[r6],#4 +000c8c e5cd150c STRB r1,[r13,#0x50c] +000c90 e1a01441 MOV r1,r1,ASR #8 +000c94 e5cd150d STRB r1,[r13,#0x50d] +000c98 ea00000c B 0xcd0 +000c9c e59bc00c LDR r12,[r11,#0xc] +000ca0 e041100c SUB r1,r1,r12 +000ca4 e59bc014 LDR r12,[r11,#0x14] +000ca8 e79c1081 LDR r1,[r12,r1,LSL #1] +000cac e5cd1508 STRB r1,[r13,#0x508] +000cb0 e4961004 LDR r1,[r6],#4 +000cb4 e59bc00c LDR r12,[r11,#0xc] +000cb8 e041100c SUB r1,r1,r12 +000cbc e59bc010 LDR r12,[r11,#0x10] +000cc0 e79c1081 LDR r1,[r12,r1,LSL #1] +000cc4 e5cd150c STRB r1,[r13,#0x50c] +000cc8 e1a01441 MOV r1,r1,ASR #8 +000ccc e5cd150d STRB r1,[r13,#0x50d] +000cd0 e3a0c001 MOV r12,#1 +000cd4 e1a0331c MOV r3,r12,LSL r3 +000cd8 e1a0103e MOV r1,r14,LSR r0 +000cdc e1510007 CMP r1,r7 +000ce0 e58d3514 STR r3,[r13,#0x514] +000ce4 2a000008 BCS 0xd0c +000ce8 e088a181 ADD r10,r8,r1,LSL #3 +000cec e28d9f42 ADD r9,r13,#0x108 +000cf0 e2899b01 ADD r9,r9,#0x400 +000cf4 e8991008 LDMIA r9,{r3,r12} +000cf8 e88a1008 STMIA r10,{r3,r12} +000cfc e59d3514 LDR r3,[r13,#0x514] +000d00 e0811003 ADD r1,r1,r3 +000d04 e1510007 CMP r1,r7 +000d08 3afffff6 BCC 0xce8 +000d0c e3a0c001 MOV r12,#1 +000d10 e59d1560 LDR r1,[r13,#0x560] +000d14 e11e0001 TST r14,r1 +000d18 0a000003 BEQ 0xd2c +000d1c e02ee001 EOR r14,r14,r1 +000d20 e1a010a1 MOV r1,r1,LSR #1 +000d24 e11e0001 TST r14,r1 +000d28 1afffffb BNE 0xd1c +000d2c e02ee001 EOR r14,r14,r1 +000d30 e1a0101c MOV r1,r12,LSL r0 +000d34 e2411001 SUB r1,r1,#1 +000d38 e001100e AND r1,r1,r14 +000d3c e28d3004 ADD r3,r13,#4 +000d40 e7933104 LDR r3,[r3,r4,LSL #2] +000d44 e1310003 TEQ r1,r3 +000d48 0a000008 BEQ 0xd70 +000d4c e2444001 SUB r4,r4,#1 +000d50 e0400002 SUB r0,r0,r2 +000d54 e1a0101c MOV r1,r12,LSL r0 +000d58 e2411001 SUB r1,r1,#1 +000d5c e001300e AND r3,r1,r14 +000d60 e28d1004 ADD r1,r13,#4 +000d64 e7911104 LDR r1,[r1,r4,LSL #2] +000d68 e1330001 TEQ r3,r1 +000d6c 1afffff6 BNE 0xd4c +000d70 e59d155c LDR r1,[r13,#0x55c] +000d74 e2413001 SUB r3,r1,#1 +000d78 e3310000 TEQ r1,#0 +000d7c e58d355c STR r3,[r13,#0x55c] +000d80 1affff6c BNE 0xb38 +000d84 e2855001 ADD r5,r5,#1 +000d88 e59d3510 LDR r3,[r13,#0x510] +000d8c e1550003 CMP r5,r3 +000d90 daffff59 BLE 0xafc +000d94 e59d7000 LDR r7,[r13,#0] +000d98 e3370000 TEQ r7,#0 +000d9c 159d3510 LDRNE r3,[r13,#0x510] +000da0 13330001 TEQNE r3,#1 +000da4 03a00000 MOVEQ r0,#0 +000da8 13a00001 MOVNE r0,#1 +000dac e91baff0 LDMDB r11,{r4-r11,r13,pc} +000db0 e1a0c00d MOV r12,r13 +000db4 e92dd8f0 STMDB r13!,{r4-r7,r11,r12,r14,pc} +000db8 e24cb004 SUB r11,r12,#4 +000dbc e1a04002 MOV r4,r2 +000dc0 e1a02003 MOV r2,r3 +000dc4 e3a03000 MOV r3,#0 +000dc8 e3a00008 MOV r0,#8 +000dcc e28b6008 ADD r6,r11,#8 +000dd0 e8960060 LDMIA r6,{r5,r6} +000dd4 e59b7004 LDR r7,[r11,#4] +000dd8 e7850103 STR r0,[r5,r3,LSL #2] +000ddc e2833001 ADD r3,r3,#1 +000de0 e3530090 CMP r3,#0x90 +000de4 bafffffb BLT 0xdd8 +000de8 e3a0c009 MOV r12,#9 +000dec e3530c01 CMP r3,#0x100 +000df0 aa000003 BGE 0xe04 +000df4 e785c103 STR r12,[r5,r3,LSL #2] +000df8 e2833001 ADD r3,r3,#1 +000dfc e3530c01 CMP r3,#0x100 +000e00 bafffffb BLT 0xdf4 +000e04 e3a0c007 MOV r12,#7 +000e08 e3530f46 CMP r3,#0x118 +000e0c aa000003 BGE 0xe20 +000e10 e785c103 STR r12,[r5,r3,LSL #2] +000e14 e2833001 ADD r3,r3,#1 +000e18 e3530f46 CMP r3,#0x118 +000e1c bafffffb BLT 0xe10 +000e20 e3530e12 CMP r3,#0x120 +000e24 aa000003 BGE 0xe38 +000e28 e7850103 STR r0,[r5,r3,LSL #2] +000e2c e2833001 ADD r3,r3,#1 +000e30 e3530e12 CMP r3,#0x120 +000e34 bafffffb BLT 0xe28 +000e38 e1a03006 MOV r3,r6 +000e3c e582c000 STR r12,[r2,#0] +000e40 e5960014 LDR r0,[r6,#0x14] +000e44 e92d000f STMDB r13!,{r0-r3} +000e48 e1a00005 MOV r0,r5 +000e4c e3a02001 MOV r2,#1 +000e50 e2822c01 ADD r2,r2,#0x100 +000e54 e3a01e12 MOV r1,#0x120 +000e58 e5963010 LDR r3,[r6,#0x10] +000e60 e28dd010 ADD r13,r13,#0x10 +000e64 e1b03000 MOVS r3,r0 +000e68 191ba8f0 LDMNEDB r11,{r4-r7,r11,r13,pc} +000e6c e3a00005 MOV r0,#5 +000e70 e7850103 STR r0,[r5,r3,LSL #2] +000e74 e2833001 ADD r3,r3,#1 +000e78 e353001e CMP r3,#0x1e +000e7c bafffffb BLT 0xe70 +000e80 e1a03006 MOV r3,r6 +000e84 e5870000 STR r0,[r7,#0] +000e88 e1a02007 MOV r2,r7 +000e8c e1a01004 MOV r1,r4 +000e90 e596001c LDR r0,[r6,#0x1c] +000e94 e92d000f STMDB r13!,{r0-r3} +000e98 e1a00005 MOV r0,r5 +000e9c e3a02000 MOV r2,#0 +000ea0 e3a0101e MOV r1,#0x1e +000ea4 e5b63018 LDR r3,[r6,#0x18]! +000eac e28dd010 ADD r13,r13,#0x10 +000eb0 e3500001 CMP r0,#1 +000eb4 d3a00000 MOVLE r0,#0 +000eb8 e91ba8f0 LDMDB r11,{r4-r7,r11,r13,pc} +000ebc e1a0c00d MOV r12,r13 +000ec0 e92d000f STMDB r13!,{r0-r3} +000ec4 e92ddff0 STMDB r13!,{r4-r12,r14,pc} +000ec8 e24cb014 SUB r11,r12,#0x14 +000ecc e1a04003 MOV r4,r3 +000ed0 e59b501c LDR r5,[r11,#0x1c] +000ed4 e59b8018 LDR r8,[r11,#0x18] +000ed8 e24dd00c SUB r13,r13,#0xc +000edc e5951000 LDR r1,[r5,#0] +000ee0 e1a02005 MOV r2,r5 +000ee4 e3a00005 MOV r0,#5 +000eec e200101f AND r1,r0,#0x1f +000ef0 e2811001 ADD r1,r1,#1 +000ef4 e2811c01 ADD r1,r1,#0x100 +000ef8 e58d1004 STR r1,[r13,#4] +000efc e1a012a0 MOV r1,r0,LSR #5 +000f00 e5950004 LDR r0,[r5,#4] +000f04 e2400005 SUB r0,r0,#5 +000f08 e5850004 STR r0,[r5,#4] +000f0c e1a02005 MOV r2,r5 +000f10 e3a00005 MOV r0,#5 +000f18 e200101f AND r1,r0,#0x1f +000f1c e2811001 ADD r1,r1,#1 +000f20 e58d1000 STR r1,[r13,#0] +000f24 e1a012a0 MOV r1,r0,LSR #5 +000f28 e5950004 LDR r0,[r5,#4] +000f2c e2400005 SUB r0,r0,#5 +000f30 e5850004 STR r0,[r5,#4] +000f34 e1a02005 MOV r2,r5 +000f38 e3a00004 MOV r0,#4 +000f40 e200100f AND r1,r0,#0xf +000f44 e2819004 ADD r9,r1,#4 +000f48 e1a07220 MOV r7,r0,LSR #4 +000f4c e5950004 LDR r0,[r5,#4] +000f50 e2400004 SUB r0,r0,#4 +000f54 e5850004 STR r0,[r5,#4] +000f58 e3a0a001 MOV r10,#1 +000f5c e59d0004 LDR r0,[r13,#4] +000f60 e250cf47 SUBS r12,r0,#0x11c +000f64 a35c0002 CMPGE r12,#2 +000f68 959d0000 LDRLS r0,[r13,#0] +000f6c 9350001e CMPLS r0,#0x1e +000f70 81a0000a MOVHI r0,r10 +000f74 8a0000c4 BHI 0x128c +000f78 e3a06000 MOV r6,#0 +000f7c e3590000 CMP r9,#0 +000f80 8a000001 BHI 0xf8c +000f84 e3a01000 MOV r1,#0 +000f88 ea000011 B 0xfd4 +000f8c e1a02005 MOV r2,r5 +000f90 e1a01007 MOV r1,r7 +000f94 e3a00003 MOV r0,#3 +000f9c e2002007 AND r2,r0,#7 +000fa0 e595100c LDR r1,[r5,#0xc] +000fa4 e7911106 LDR r1,[r1,r6,LSL #2] +000fa8 e7882101 STR r2,[r8,r1,LSL #2] +000fac e1a071a0 MOV r7,r0,LSR #3 +000fb0 e5950004 LDR r0,[r5,#4] +000fb4 e2400003 SUB r0,r0,#3 +000fb8 e2866001 ADD r6,r6,#1 +000fbc e1560009 CMP r6,r9 +000fc0 e5850004 STR r0,[r5,#4] +000fc4 3afffff0 BCC 0xf8c +000fc8 e3560013 CMP r6,#0x13 +000fcc 3affffec BCC 0xf84 +000fd0 ea000005 B 0xfec +000fd4 e595000c LDR r0,[r5,#0xc] +000fd8 e7900106 LDR r0,[r0,r6,LSL #2] +000fdc e7881100 STR r1,[r8,r0,LSL #2] +000fe0 e2866001 ADD r6,r6,#1 +000fe4 e3560013 CMP r6,#0x13 +000fe8 3afffff9 BCC 0xfd4 +000fec e3a00007 MOV r0,#7 +000ff0 e1a03005 MOV r3,r5 +000ff4 e5840000 STR r0,[r4,#0] +000ff8 e1a02004 MOV r2,r4 +000ffc e3a00000 MOV r0,#0 +001000 e59b1008 LDR r1,[r11,#8] +001004 e92d000f STMDB r13!,{r0-r3} +001008 e1a00008 MOV r0,r8 +00100c e3a03000 MOV r3,#0 +001010 e3a02013 MOV r2,#0x13 +001014 e3a01013 MOV r1,#0x13 +00101c e28dd010 ADD r13,r13,#0x10 +001020 e1b06000 MOVS r6,r0 +001024 0a000001 BEQ 0x1030 +001028 e3360001 TEQ r6,#1 +00102c 0a000096 BEQ 0x128c +001030 e89d0003 LDMIA r13,{r0,r1} +001034 e0819000 ADD r9,r1,r0 +001038 e3a0a001 MOV r10,#1 +00103c e5940000 LDR r0,[r4,#0] +001040 e1a0001a MOV r0,r10,LSL r0 +001044 e2402001 SUB r2,r0,#1 +001048 e3a06000 MOV r6,#0 +00104c e1a0a006 MOV r10,r6 +001050 e3590000 CMP r9,#0 +001054 e58d2008 STR r2,[r13,#8] +001058 9a000068 BLS 0x1200 +00105c e1a02005 MOV r2,r5 +001060 e1a01007 MOV r1,r7 +001064 e5940000 LDR r0,[r4,#0] +00106c e1a01000 MOV r1,r0 +001070 e59d2008 LDR r2,[r13,#8] +001074 e0000002 AND r0,r0,r2 +001078 e59b2008 LDR r2,[r11,#8] +00107c e5922000 LDR r2,[r2,#0] +001080 e0820180 ADD r0,r2,r0,LSL #3 +001084 e59b200c LDR r2,[r11,#0xc] +001088 e5820000 STR r0,[r2,#0] +00108c e5d00001 LDRB r0,[r0,#1] +001090 e1a07031 MOV r7,r1,LSR r0 +001094 e5951004 LDR r1,[r5,#4] +001098 e0410000 SUB r0,r1,r0 +00109c e5850004 STR r0,[r5,#4] +0010a0 e59b200c LDR r2,[r11,#0xc] +0010a4 e5920000 LDR r0,[r2,#0] +0010a8 e5900004 LDR r0,[r0,#4] +0010ac e1a00800 MOV r0,r0,LSL #16 +0010b0 e1a00820 MOV r0,r0,LSR #16 +0010b4 e3500010 CMP r0,#0x10 +0010b8 2a000004 BCS 0x10d0 +0010bc e1a0a000 MOV r10,r0 +0010c0 e1a00006 MOV r0,r6 +0010c4 e2866001 ADD r6,r6,#1 +0010c8 e788a100 STR r10,[r8,r0,LSL #2] +0010cc ea000049 B 0x11f8 +0010d0 1a000018 BNE 0x1138 +0010d4 e1a02005 MOV r2,r5 +0010d8 e1a01007 MOV r1,r7 +0010dc e3a00002 MOV r0,#2 +0010e4 e2001003 AND r1,r0,#3 +0010e8 e2811003 ADD r1,r1,#3 +0010ec e1a07120 MOV r7,r0,LSR #2 +0010f0 e5950004 LDR r0,[r5,#4] +0010f4 e2400002 SUB r0,r0,#2 +0010f8 e5850004 STR r0,[r5,#4] +0010fc e0860001 ADD r0,r6,r1 +001100 e1500009 CMP r0,r9 +001104 9a000001 BLS 0x1110 +001108 e3a00001 MOV r0,#1 +00110c ea00005e B 0x128c +001110 e2410001 SUB r0,r1,#1 +001114 e3310000 TEQ r1,#0 +001118 0a000036 BEQ 0x11f8 +00111c e1a01006 MOV r1,r6 +001120 e2866001 ADD r6,r6,#1 +001124 e788a101 STR r10,[r8,r1,LSL #2] +001128 e1b01000 MOVS r1,r0 +00112c e2400001 SUB r0,r0,#1 +001130 1afffff9 BNE 0x111c +001134 ea00002f B 0x11f8 +001138 e3300011 TEQ r0,#0x11 +00113c e1a02005 MOV r2,r5 +001140 e1a01007 MOV r1,r7 +001144 1a000015 BNE 0x11a0 +001148 e3a00003 MOV r0,#3 +001150 e2001007 AND r1,r0,#7 +001154 e2811003 ADD r1,r1,#3 +001158 e1a071a0 MOV r7,r0,LSR #3 +00115c e5950004 LDR r0,[r5,#4] +001160 e2400003 SUB r0,r0,#3 +001164 e5850004 STR r0,[r5,#4] +001168 e0860001 ADD r0,r6,r1 +00116c e1500009 CMP r0,r9 +001170 8affffe4 BHI 0x1108 +001174 e2410001 SUB r0,r1,#1 +001178 e3310000 TEQ r1,#0 +00117c 0a00001c BEQ 0x11f4 +001180 e3a02000 MOV r2,#0 +001184 e1a01006 MOV r1,r6 +001188 e2866001 ADD r6,r6,#1 +00118c e7882101 STR r2,[r8,r1,LSL #2] +001190 e1b01000 MOVS r1,r0 +001194 e2400001 SUB r0,r0,#1 +001198 1afffff9 BNE 0x1184 +00119c ea000014 B 0x11f4 +0011a0 e3a00007 MOV r0,#7 +0011a8 e200107f AND r1,r0,#0x7f +0011ac e281100b ADD r1,r1,#0xb +0011b0 e1a073a0 MOV r7,r0,LSR #7 +0011b4 e5950004 LDR r0,[r5,#4] +0011b8 e2400007 SUB r0,r0,#7 +0011bc e5850004 STR r0,[r5,#4] +0011c0 e0860001 ADD r0,r6,r1 +0011c4 e1500009 CMP r0,r9 +0011c8 8affffce BHI 0x1108 +0011cc e2410001 SUB r0,r1,#1 +0011d0 e3310000 TEQ r1,#0 +0011d4 0a000006 BEQ 0x11f4 +0011d8 e3a02000 MOV r2,#0 +0011dc e1a01006 MOV r1,r6 +0011e0 e2866001 ADD r6,r6,#1 +0011e4 e7882101 STR r2,[r8,r1,LSL #2] +0011e8 e1b01000 MOVS r1,r0 +0011ec e2400001 SUB r0,r0,#1 +0011f0 1afffff9 BNE 0x11dc +0011f4 e3a0a000 MOV r10,#0 +0011f8 e1560009 CMP r6,r9 +0011fc 3affff96 BCC 0x105c +001200 e5950020 LDR r0,[r5,#0x20] +001204 e585007c STR r0,[r5,#0x7c] +001208 e3a00009 MOV r0,#9 +00120c e5857000 STR r7,[r5,#0] +001210 e1a03005 MOV r3,r5 +001214 e5840000 STR r0,[r4,#0] +001218 e1a02004 MOV r2,r4 +00121c e59b1008 LDR r1,[r11,#8] +001220 e5950014 LDR r0,[r5,#0x14] +001224 e92d000f STMDB r13!,{r0-r3} +001228 e5953010 LDR r3,[r5,#0x10] +00122c e1a00008 MOV r0,r8 +001230 e3a02001 MOV r2,#1 +001234 e2822c01 ADD r2,r2,#0x100 +001238 e59d1014 LDR r1,[r13,#0x14] +001240 e28dd010 ADD r13,r13,#0x10 +001244 e3300000 TEQ r0,#0 +001248 1a00000f BNE 0x128c +00124c e3a00006 MOV r0,#6 +001250 e59b2014 LDR r2,[r11,#0x14] +001254 e1a03005 MOV r3,r5 +001258 e5820000 STR r0,[r2,#0] +00125c e59b100c LDR r1,[r11,#0xc] +001260 e59b2014 LDR r2,[r11,#0x14] +001264 e595001c LDR r0,[r5,#0x1c] +001268 e92d000f STMDB r13!,{r0-r3} +00126c e5b53018 LDR r3,[r5,#0x18]! +001270 e59d0014 LDR r0,[r13,#0x14] +001274 e0880100 ADD r0,r8,r0,LSL #2 +001278 e3a02000 MOV r2,#0 +00127c e59d1010 LDR r1,[r13,#0x10] +001284 e28dd010 ADD r13,r13,#0x10 +001288 e3300000 TEQ r0,#0 +00128c e91baff0 LDMDB r11,{r4-r11,r13,pc} + +\ LICENSE_BEGIN +\ Copyright (c) 2008 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
Property changes on: cpu/arm/testasm.txt ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/testmmu.fth =================================================================== --- cpu/arm/testmmu.fth (rev 0) +++ cpu/arm/testmmu.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,3 @@ +select /mmu +1000 1000 claim constant pf +40000000 pf 1000 -2 map
Property changes on: cpu/arm/testmmu.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/tools.bth =================================================================== --- cpu/arm/tools.bth (rev 0) +++ cpu/arm/tools.bth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,47 @@ +purpose: Load file for Forth toolkit, without firmware +\ See license at end of file + +dictionary: ${BP}/cpu/arm/build/kernel.dic +command: &armforth &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 + +transient +true value assembler? \ False to discard assembler after compilation +resident + +fload ${BP}/forth/lib/loadcomm.fth \ CPU-independent Forth tools +fload ${BP}/cpu/arm/loadmach.fth \ CPU and OS-specific extensions + +[ifndef] no-heads +.( --- Saving tools.dic --- ) " tools.dic" $save-forth cr +[then] + +\ LICENSE_BEGIN +\ Copyright (c) 1994 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
Property changes on: cpu/arm/tools.bth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/traps.fth =================================================================== --- cpu/arm/traps.fth (rev 0) +++ cpu/arm/traps.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,82 @@ +purpose: Save the processor state after an exception - hardware version +\ See license at end of file + +only forth also hidden also forth definitions + +\ The common subroutines on which this depends are defined in +\ cpu/arm/register.fth + +headerless + +\ This is the first part of the exception handling sequence and the last +\ half of the exception restart sequence. It is executed in exception state. + +label hw-save-state + \ On entry: r13: scratch r14: PC from old mode + + \ Check for second half of (restart, if so restore all the registers + \ from the save area and return from the exception. + + 'code (restart drop restart-offset + ( offset ) + adr r13,* \ Address of trap in (restart + + dec r14,1cell \ Point to the trapped instruction + cmp r13,r14 + + adr r13,'body main-task \ Get user pointer address + ldr r13,[r13] \ Get user pointer + ldr r13,[r13,`'user# cpu-state`] \ State save address + + beq 'body restart-common + + stmia r13,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12} + + mov r0,r13 \ Move cpu-state pointer into r0 + mov r4,#0 \ Set r4 to 0 to indicate no user abort + b 'body save-common +end-code + +: hw-install-handler ( handler exception# -- ) + \ Put "ldr pc,[pc,40-8]" in exception vector at 0 + (exception# * 4) + h# e59ff038 over /l* instruction! ( exception# ) + + \ Put handler address in address table at 40 + (exception# * 4) + h# 40 swap la+ l! +; +: hw-catch-exception ( exception# -- ) hw-save-state swap install-handler ; + +: stand-init-io ( -- ) + stand-init-io + ['] (restart is restart + ['] hw-install-handler is install-handler + ['] hw-catch-exception is catch-exception + catch-exceptions + 2 catch-exception \ Software interrupt (we don't catch this under DEMON) +; + +headers +only forth also definitions + +\ LICENSE_BEGIN +\ Copyright (c) 1997 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Property changes on: cpu/arm/traps.fth ___________________________________________________________________ Added: svn:executable + *
Added: cpu/arm/version.fth =================================================================== --- cpu/arm/version.fth (rev 0) +++ cpu/arm/version.fth 2008-12-20 07:55:35 UTC (rev 1039) @@ -0,0 +1,5 @@ +defer title +: .copyright (s -- ) + ." Forthmacs for ARM, Copyright (c) 1988-2008 FirmWorks" cr +; +' .copyright is title
Property changes on: cpu/arm/version.fth ___________________________________________________________________ Added: svn:executable + *