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