dump

Das Wort dump listet Werte aus dem RAM auf.

Beginnend bei der Startadresse holt es aufsteigend Byte für Byte aus dem Speicher und zeigt diese zeilenweise an. Anschließend werden die ASCII-Werte der selben Bytefolge angezeigt. Es wird immer mindestens eine ganze Zeile angezeigt. Die Darstellung der Werte erfolgt passend zur verwendeten Zahlenbasis wie sie in der Uservariablen base abgelegt ist. Die Länge der Zeile ist modulo base, was die Orientierung erleichtert. Das Lineal über der Liste zeigt die Position in der Zeile an.

Für spezielle Microprocessor Systeme macht man sich am besten selbst die passenden Helfer. Als Beispiel sei idump edump dump für das amforth (AVR atmega) wieder gegeben.

\ Berechnet vorzeichenlose Werte. 
\ (Bei Systemen in denen Forth auf hohen Adressen liegt liefert ein einfaches MOD falsche Ergebnisse.) 
: umod ( u1 u2 -- umod )  0 swap um/mod drop ; 

: .ruler ( addr -- )
  base @ 0  do  i over + base @ umod cell .r  loop   2 spaces 
  base @ 0  do  i over + base @ umod    1 .r  loop   drop     ;

\ Druckbare Zeichen ausgeben, sonst nur einen Punkt ausgeben.
\ Ein gesetztes Bit8 soll dabei ignoriert werden. 
: .ascii ( c -- ) $7F and dup $20 < if  drop $2E then emit ;

: dump ( addr n -- )  
  cr 3 cells 1+ spaces
  over .ruler
  0 ?do  cr dup  3 cells u.r space
         base @ 0 do  i over + c@ cell .r loop 
         space 
         base @ 0 do  i over + c@ .ascii loop 
         key?  if leave then 
         base @ +  
  base  @ +loop 
  cr drop ; 

Anmerkung

Das Wort dump wird gewöhnlich in der Entwicklungsphase von Programmen eingesetzt, um code zu debuggen und zu verifizieren. Besonders wenn Maschinencode auf Mikroprozessoren eingebunden werden soll, ist es hilfreich.

Je nach verwendetem Mikroprozessor Typ ist es erfolderlich, dump anzupassen. So soll beispielsweise ein flash oder eeprom Bereich gedumpt werden. Dann muss c@ ersetzt werden durch die passende Operation für den Speichertyp. Auch kann es sein das Speicherbereiche nicht in Bytes sondern in Zellen (cell) organisiert sind.

Gewöhnlich werden solche tools wie dump nicht in der Applikation belassen, werden aber immer wieder benötigt bei den verschiedenen Entwicklungen. Darum hat es sich eingebürgert, solch ein tool am Stück zu codieren, um nicht Gefahr zu laufen die preprozessierten Teile zu verlieren, oder inkompatible Teile zu laden. Drum hier der Code nochmal als Modul.

: dump ( addr n -- )  
  over
  \ print a ruler
  cr 3 cells 1+ spaces
  base @ 0  do  i over + base @ 0 swap um/mod drop cell .r  loop   space
  base @ 0  do  i over + base @ 0 swap um/mod drop    1 .r  loop   drop  
  \ dump bytes
  0 ?do  cr dup  3 cells u.r space
         \ print line of bytes
         base @ 0 do  i over + c@ cell .r loop 
         space 
         \ print same bytes in ascii again
         base @ 0 do  i over + c@ 
           $7F and dup $20 < if  drop $2E then emit 
         loop 
         key?  if leave then 
         base @ +  
  base  @ +loop 
  cr drop ;