[OpenBIOS] [RFC v2] Pretty-print reg property

Andreas Färber andreas.faerber at web.de
Fri Nov 5 00:01:59 CET 2010


Am 04.11.2010 um 23:16 schrieb Segher Boessenkool:

>>> Maybe something like this:
>>>
>>> : .p-reg ( prop len -- )
>>>> r >r my-#scells my-#acells dup r> r> bounds ?DO
>>> 2dup = IF cr THEN          \ start of line
>>> dup 0= IF 2 spaces THEN    \ start of "size" part
>>> dup 3 and 0= IF space THEN \ make numbers more readable
>>> i c@ 2 0.r                 \ print byte
>>> 1- 3dup nip + 0= IF drop dup THEN  \ update counter
>>> LOOP ;
>>>
>>> (untested, mind the bogons).
>>
>> Leads to:
>>
>> 0 > dev /memory  ok
>> 0 > .properties
>> name                      "memory"
>> device_type               "memory"
>> reg
>> 00   00
>> 00   00
>> 40   00
>> 00   00
>> N?!H                     -- 5 : 4e 80 04 21 48
>> available
>> 00   00
>> 40   00
>> 3f   bd
>> 40   00
>>                           <empty>
>>  ok
>>
>> My patch did:
>>
>> 0 > dev /memory  ok
>> 0 > .properties
>> name                      "memory"
>> device_type               "memory"
>> reg                       00000000 40000000
>> available                 00004000 3fbd4000
>>  ok
>>
>> Any hint? My code may have been inefficient but better unstandable  
>> for
>> a Forth newbie...
>
> I found it quite the opposite -- I'm not a newbie but I found it very
> hard to read.  Maybe needs a bit more factoring?
>
> I forgot to multiply acells and scells by 4; also, no indent, and I
> put the newlines at the start of the line, not the end (this is normal
> in Forth, and has some advantages).  This needs changing here of  
> course.

Figured that out myself in the meantime, also the 3drop after some  
trial and error:

: .p-reg ( data len -- )
   >r >r my-#scells 4 * my-#acells 4 * dup r> r> ( #sbytes #abytes  
#abytes data len )
   bounds ( #sbytes #abytes #abytes data+len data ) ?do
\    2dup = if cr then			\ start of line
     dup 0= if 2 spaces then		\ start of "size" part
     2dup <> if
       dup 3 and 0= if space then	\ make numbers more readable
     then
     i c@ 2 0.r					\ print byte
     1- 3dup nip + 0= if
       cr 0 begin ."  " 1+ dup d# 26 >= until drop
       drop dup					\ update counter
     then
   loop 3drop
;

This also fixes a leading space.

Thanks a lot for your review and suggestions, I'll put together a  
patch series tomorrow.

Andreas



More information about the OpenBIOS mailing list