[OpenBIOS] r401 - ofw/fs/jffs2

svn at openbios.org svn at openbios.org
Sat May 19 02:46:30 CEST 2007


Author: wmb
Date: 2007-05-19 02:46:30 +0200 (Sat, 19 May 2007)
New Revision: 401

Modified:
   ofw/fs/jffs2/jffs2.fth
Log:
JFFS2 - Got another 2x on well-behaved images with an intermediate encoding.






Modified: ofw/fs/jffs2/jffs2.fth
===================================================================
--- ofw/fs/jffs2/jffs2.fth	2007-05-18 23:49:47 UTC (rev 400)
+++ ofw/fs/jffs2/jffs2.fth	2007-05-19 00:46:30 UTC (rev 401)
@@ -271,8 +271,23 @@
       then
    then
 
-   di bx  mov      \ Save DI in bx; we are through with the delta value
-   0 [dx] di mov   \ Get pointer in di
+   2 # bx shr                     \ Throw away unused 0 bits in delta
+   h# 10000 # ax mov
+   ax bx cmp  <  if               \ delta fits in 16 bits?
+      0 [sp]  ax  cmp  >  if      \ inum fits in 16 bits?
+         4 [sp]  ax  cmp  >  if   \ version fits in 16 bits?
+            0 [dx] di xchg        \ Get pointer in di
+            al inc         al stosb                \ encode a 1 byte to indicate the long form
+            ax pop     op: ax stos  ax 0 [cx] mov  \ Encode the inum    as 16 bits
+            ax pop     op: ax stos  ax 4 [cx] mov  \ Encode the version as 16 bits
+            bx ax mov  op: ax stos                 \ Encode the version as 16 bits               
+            0 [dx] di xchg        \ Update next-inode pointer in di
+            next
+         then
+      then
+   then
+
+   0 [dx] di xchg  \ Get pointer in di
    ax ax xor
    al stosb        \ encode a 0 byte to indicate the long form
    
@@ -287,8 +302,7 @@
    8 [cx] ax mov   \ offset (from already-updated curoffs)
    ax stos         \ encode it
 
-   di 0 [dx] mov   \ Update next-inode
-   bx di mov       \ Restore DI
+   0 [dx] di xchg  \ Update next-inode
 c;
 
 code amatch-inode  ( inum adr endadr 'curinum -- inum false | inum adr' offset version true )
@@ -300,9 +314,17 @@
       ax ax xor
       al lodsb   \ ax: byte
       h# 20 #  al  cmp  u<  if
-         ax lods  ax 0 [dx]  mov
-         ax lods  ax 4 [dx]  mov
-         ax lods  ax 8 [dx]  mov
+         al al or  0=  if
+            \ Long form: 0, inum.32, version.32, offset.32
+            ax lods  ax 0 [dx]  mov
+            ax lods  ax 4 [dx]  mov
+            ax lods  ax 8 [dx]  mov
+         else
+            \ Short form: 0, inum.16, version.16, delta_offset.16
+            op: ax lods  ax 0 [dx]  mov
+            op: ax lods  ax 4 [dx]  mov
+            op: ax lods  2 # ax shl  ax 8 [dx]  add
+         then
       else
          1 #  al  test  0<>  if
             0 [dx]  inc
@@ -358,8 +380,10 @@
 
    curinum !   curvers !                   ( )
 
+   \ XXX implement short form: 1.byte, inum.16, version.16, delta.16
+
    \ If we can't use a short form, use the long form:
-   \ 0.byte, inum.long, version.long, offset.long
+   \ 0.byte, inum.32, version.32, offset.32
 
    \ At some point we might want to have another form with .short fields
 




More information about the OpenBIOS mailing list