Janus

intel-hex.ft.md


Intel HEX format output

get-current
wordlist >order definitions

#32 constant /line
create #line /line 2* $12 + allot
variable >line
variable sum
variable addr
variable fd

: >digit    dup 9 > 7 and + #48 + ;
: 0line     0 >line ! ;
: >>line    >line +! ;
: ^line     >line @ #line + ;
: $-to-line ( addr n -- ) tuck ^line swap cmove >>line ;
: c-to-line ( c -- ) ^line c! 1 >>line ;
: .line     #line >line @ fd @ write-file throw ;

: 0sum      0 sum ! ;
: +2h       dup sum +!
            dup $0F and >digit swap 4 rshift $0F and >digit c-to-line c-to-line ;
: +4h       dup 8 rshift +2h +2h ;
: +sum      sum @ negate +2h ;

: addr!     ( a1 a2 u -- a2 u ) addr ! ;
: +addr     addr @ +4h  /line addr +! ;

: +:        s" :" $-to-line ;
: +eol      $0A c-to-line ;
: +len      /line +2h ;
: +type     0 +2h ;
: +start    +: +len +addr +type ;
: +data     /line bounds do i c@ +2h loop ;
: mkend     0line s" :00000001FF" $-to-line +eol ;
: mkline    0line 0sum +start +data +sum +eol ;
: .lines    ( a u -- ) bounds do i mkline .line /line +loop ;

set-current

Save an Intel HEX file with target address at a1, and data in a2 u in file f

: type-hex ( a1 a2 u f -- )
            fd !
            rot dup $0000FFFF and addr!
            base @ >r hex
            0line 0sum +: 2 +2h 0 +4h 4 +2h #16 rshift +4h +sum +eol .line
            .lines
            mkend .line
            r> base ! ;

End the hex output.

: hex-end  ( start-addr f -- )
            fd !
            base @ >r hex
            0line 0sum +: 4 +2h 0 +4h 5 +2h dup #16 rshift +4h +4h +sum +eol .line
            mkend .line
            r> base ! ;

previous