( requires core, parse, cmp )

: _
    999 SWAP        ( stop indicator )
    DUP 0 = IF '0' EXIT THEN    ( 0 is a special case )
    BEGIN
    DUP 0 = IF DROP EXIT THEN
    10 /MOD         ( r q )
    SWAP '0' + SWAP ( d q )
    AGAIN
;

: .               ( n -- )
    ( handle negative )
    ( that "0 1 -" thing is because we don't parse negative
      number correctly yet. )
    DUP 0 < IF '-' EMIT 0 1 - * THEN
    _
    BEGIN
    DUP '9' > IF DROP EXIT THEN ( stop indicator, we're done )
    EMIT
    AGAIN
;

: ? @ . ;

: _
    DUP 9 > IF 10 - 'a' +
    ELSE '0' + THEN
;

( For hex display, there are no negatives )

: .x
    256 MOD     ( ensure < 0x100 )
    16 /MOD     ( l h )
    _ EMIT ( l )
    _ EMIT
;

: .X
    256 /MOD    ( l h )
    .x .x
;

( a -- a+8 )
: _
    DUP         ( save for 2nd loop )
    ':' EMIT DUP .x SPC
    4 0 DO
        DUP @
        256 /MOD SWAP
        .x .x
        SPC
        2 +
    LOOP
    DROP
    8 0 DO
        DUP C@
        DUP <>{ 0x20 &< 0x7e |> <>}
        IF DROP '.' THEN
        EMIT
        1 +
    LOOP
    LF
;

( n a -- )
: DUMP
    LF
    BEGIN
        OVER 1 < IF 2DROP EXIT THEN
        _
        SWAP 8 - SWAP
    AGAIN
;
