====== 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 [[hier]] 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 ;