[openfirmware] [commit] r2345 - forth/lib
repository service
svn at openfirmware.info
Tue Jul 12 11:15:12 CEST 2011
Author: wmb
Date: Tue Jul 12 11:15:11 2011
New Revision: 2345
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2345
Log:
Added a couple of tools to forth/lib for handling WinCE binaries. Not used by any standard builds.
Added:
forth/lib/dumpcebin.fth
forth/lib/makecebin.fth
Added: forth/lib/dumpcebin.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ forth/lib/dumpcebin.fth Tue Jul 12 11:15:11 2011 (r2345)
@@ -0,0 +1,41 @@
+purpose: Show the sections of a WinCE .bin file
+
+h# 60 constant /buf
+/buf buffer: secbuf
+: +buf ( offset -- adr ) secbuf + ;
+: sec@ ( offset -- l ) +buf l@ ;
+
+0 value section-len
+: .section ( offset -- offset' )
+ ." File offset: " dup 8 u.r
+ dup ifd @ fseek ( offset )
+ secbuf d# 12 ifd @ fgets d# 12 <> abort" read failure"
+ 0 sec@ 0= if
+ ." Final record: " 4 sec@ 8 u.r ." " 8 sec@ 8 u.r cr
+ exit
+ then
+
+ ." Start " 0 sec@ 8 u.r ." Length " 4 sec@ 8 u.r ." Sum " 8 sec@ 8 u.r cr
+ 4 sec@ to section-len
+ secbuf h# 60 section-len min ifd @ fgets drop
+ secbuf h# 60 section-len min ldump cr ( offset )
+ d# 12 + section-len +
+;
+
+: (dump-bin) ( filename$ -- )
+ hex
+ $read-open
+ secbuf h# f ifd @ fgets h# f <> abort" Signature read failure"
+ secbuf " B000FF"n" comp abort" Bad signature"
+
+ ." Load start " 7 sec@ 8 u.r ." Total length " h# b sec@ 8 u.r cr cr
+
+ h# f begin ifd @ ftell ifd @ fsize < while ( offset )
+ .section ( offset' )
+ repeat ( offset )
+ drop ( )
+ ifd @ fclose
+;
+: dump-bin ( "filename" -- )
+ safe-parse-word (dump-bin)
+;
Added: forth/lib/makecebin.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ forth/lib/makecebin.fth Tue Jul 12 11:15:11 2011 (r2345)
@@ -0,0 +1,39 @@
+purpose: Wrap an OFW image in a WinCE ".bin" file format
+
+h# 100000 constant ofw-load-address
+h# 100000 constant ofw-entry-address
+
+: put-long ( l -- )
+ lbsplit swap 2swap swap ( hi hmid lmid lo )
+ 4 0 do ofd @ fputc loop
+;
+
+: make-bin-file ( "in-filename" "out-filename" -- )
+ reading writing
+
+ " B000FF"n" ofd @ fputs \ Signature
+ ofw-load-address put-long \ Lowest load address
+ ifd @ fsize put-long \ Total size
+
+ ofw-load-address put-long \ Section load address - offset h# 0f
+ ifd @ fsize put-long \ Total size offset h# 13
+ 0 put-long \ Checksum, will be patched later - offset h# 17
+
+ 0 ( sum )
+ begin ( sum )
+ ifd @ fgetc ( sum char )
+ dup -1 <> ( sum char more? )
+ while ( sum char )
+ dup ofd @ fputc ( sum char )
+ + ( sum' )
+ repeat ( sum )
+
+ \ Final record with entry address
+ 0 put-long ( )
+ ofw-entry-address put-long ( )
+ 0 put-long ( )
+
+ h# 17 ofd @ fseek ( sum )
+ put-long ( )
+ ofd @ fclose ( )
+;
More information about the openfirmware
mailing list