LM - 2006-02-06
One of my programming tools - tested under windows XP
male - 2006-02-06: sorry to ask for, but ... what is a s-record file format?
LM - The Motorola S-Record is used to upload code in ASCII format into devices, e.g. PROM programmers (burners), that use a simple ASCII terminal as input device.
# bin2srec.tcl # convert a file into s-record format # (with a bare bone GUI) # # Lino Monaco - Jan 2006 # _________________________________________ package require Tk # Some parameters with fixed values set recordlen 0x15 set startaddr 0x2000000 proc checksum {record} { # # Calculate the record checksum #______________________________ set chksum [expr [join [regsub -all {[0-9a-fA-f]{2}} $record "0x& "] +]] set chksum [expr {~($chksum) & 0x000000FF}] return [format "%02X" $chksum] } proc createS0 {record} { # # Format the S0 record type # S0<len><0000><data><checksum> #________________________________ set rec 0000 binary scan $record H* record append rec $record set len [format "%02X" [expr {[string length $rec] / 2 + 1}]] append srec $len $rec append srec [checksum $srec] return "S0[string toupper $srec]" } proc createS3 {addr record} { # # Format the S3 record type # S3<len><addr><data><checksum> #________________________________ set rec [format "%08X" $addr] binary scan $record H* record append rec $record set len [format "%02X" [expr {[string length $rec] / 2 + 1}]] append srec $len $rec append srec [checksum $srec] return "S3[string toupper $srec]" } proc createS7 {addr} { # # Format the S7 record type # S7<len><addr><checksum> #__________________________ set rec [format "%08X" $addr] set len [format "%02X" [expr {[string length $rec] / 2 + 1}]] append srec $len $rec append srec [checksum $srec] return "S7[string toupper $srec]" } proc bin2srec {} { # # Open input and output files and # executes the conversion #________________________________ # Open the input file in binary mode set binfname [tk_getOpenFile] if {$binfname == ""} { return } if {[catch {open $binfname r} binfd]} { tk_messageBox -message "I cannot open $binfname" return } fconfigure $binfd -translation binary # Create the output file adding extension .srec set srecfname $binfname.srec if {[catch {open $srecfname w} hexfd]} { tk_messageBox -message "I cannot open $srecfname" close $binfd return } # Create a srec file with the following parameters: # initial address = 0 # s-rec title = <binfname> # record len = <recordlen> # loading address = <startaddr> # puts $hexfd [createS0 [file tail $binfname]] set count 0 while {! [eof $binfd]} { set record [read $binfd $::recordlen] puts $hexfd [createS3 $count $record] incr count $::recordlen } puts $hexfd [createS7 $::startaddr] # Close files close $binfd close $hexfd } proc mainGUI {} { # # Bare-bone GUI # todo: srec parameters configuration # # windows title ________________________________________________________ wm title . "Bin to Srec" # main frame construction frame .bframe label .bframe.lbl -text "Convert a file in srec format" -width 30 button .bframe.btn -text "Convert" -width 10 -pady 5 -command {bin2srec} eval pack [winfo children .bframe] -side top pack .bframe # Menu configuration____________________________________________________ menu .menubar -type menubar .menubar add cascade -label File -menu .menubar.file #file menu menu .menubar.file -tearoff 0 .menubar.file add command -label Open -underline 1 -command {bin2srec} .menubar.file add separator .menubar.file add command -label Exit -underline 1 -command {exit} #end file menu . configure -menu .menubar # Various_______________________________________________________________ focus .bframe # Bind console ____________ # for windows only bind . <F1> {console show} } mainGUI