#!/usr/bin/tclsh8.4
-set port [lindex $argv 0]
-set map [lindex $argv 1]
-set slave [lindex $argv 2]
-
-set m [open $map]
-set block preable
-set headings unknown
-set inblk 3
-
proc debug {s} { puts "$s" }
proc manyset {list args} {
default { error "unknown $thing lockind $lockind in $l" }
}
-while {[gets $m l] >= 0} {
- if {![regexp {\S} $l]} {
- set inblk 0
- set section unknown
- set headings n/a
- } elseif {$inblk==0 && [regexp {^\s+(\S.*\S)\s*$} $l dummy block]} {
- incr inblk
- } elseif {$inblk==1} {
- set headings [string trim $l]
- incr inblk
- } elseif {$inblk==2 && [regexp {^[- \t]+$} $l]} {
- incr inblk
- } elseif {[inblk {^Section Info$} \
- {^Section\s+Type\s+Address\s+Location\s+Size\(Bytes\)$}]} {
- manyset $l sec type addr lockind size
- switch -exact $type code { continue } udata { } \
- default { error "unknown section type $type in $l" }
- if {[wantlockind $lockind section $l]<=0} continue
- set addr [format 0x%08x $addr]
- lappend sections [list $addr $sec [format 0x%08x $size]]
- } elseif {[inblk {^Symbols$} \
- {^Name\s+Address\s+Location\s+Storage\s+File$}]} {
- manyset $l sym addr lockind storage file
- if {![wantlockind $lockind symbol $l]} continue
- switch -exact $storage {
- extern { set sym [list {} $sym] }
- static {
- regexp {^(.*)\.asm$} $file dummy file
- set sym [list $file: $sym]
- }
- default { error "unknown storage $storage in $l" }
- }
- set addr [format 0x%08x $addr]
- if {[string compare $lockind data]} {
- set sv symbolsbylockind($lockind)
- } else {
- set sv symbols
- }
- lappend $sv [list $addr $sym]
- } elseif {$inblk==3} {
- } else {
- error "unknown $inblk <$block> <$headings> $l"
- }
-}
-
-set ok {
- INTCON* FSR2*
- OSCCON LVDCON WDTCON RCON
- T1CON T2CON
- SSPADD SSPSTAT SSPCON1 SSPCON2
- ADRESH ADRESL ADCON*
- CCPR1* CCP1CON
- ECCPR1* ECCP1DEL ECCPAS
- CMCON CVRCON T3CON
- SPBRG TXSTA RXSTA
- EEADR EEDATA
- IPR* PIR* PIE*
- TRIS* LAT*
-}
-
-set h [open /usr/share/gputils/header/p18f458.inc]
-set section unknown
-set lastaddr -1
-while {[gets $h l]>=0} {
- if {[regexp {^\;\-\-+\s+(\S.*\S)\s+\-\-+$} $l dummy section]} {
- continue
- } elseif {![regexp {^Register Files$} $section]} {
- continue
- } elseif {[regexp -nocase \
- {^([a-z][a-z0-9]*)\s+equ\s+h\'0(f[0-9a-f]{2})\'\s*$} \
- $l dummy sym loc]} {
- set addr [format 0x%08x 0x$loc]
- foreach pat $ok {
- if {[string match $pat $sym]} {
- if {$addr != $lastaddr} {
- lappend sections [list $addr =SFRs= 0x1]
- set lastaddr $addr
- }
- lappend symbols [list $addr [list SFR $sym]]
- }
- }
- } elseif {[regexp -nocase {^\;\s*reserved} $l]} {
- } elseif {![regexp {\S} $l]} {
- } else {
- error "unknown <$section> $l"
- }
-}
-
-lappend symbols {0x00000060 {=udata,!acs=}}
-#lappend symbols {0x00000f00 {=SFRs,!acs=}}
-lappend symbols {0x00000f60 {=SFRs,acs= {}}}
-lappend sections {0x00000f00 {=SFRs=} 0}
-#lappend sections {0x00000060 {==========UDATA,!ACS===========} 0}
-#lappend sections {0x00000f60 {==========SFRs,ACS===========} 0}
-
-lappend sections [list 0x1000 =END= 0]
-foreach tosort {sections symbols symbolsbylockind(program)} {
- set $tosort [lsort [set $tosort]]
-}
-
proc addendlast {v ev evn} {
upvar #0 $v syms
lappend syms [list [lindex [lindex $syms end] 0] [list {} (lastsymbol)]]
lappend syms [list [format 0x%08lx $ev] [list {} $evn]]
}
-addendlast symbolsbylockind(program) 0x8000 (end)
-
-set p [open $port {RDWR NONBLOCK} 0]
-exec stty -F $port min 1 time 0 -istrip -ocrnl -onlcr -onocr -opost \
- -ctlecho -echo -echoe -echok -echonl -iexten -isig \
- -icanon -icrnl \
- 9600 clocal cread -crtscts -hup -parenb cs8 -cstopb \
- -ixoff bs0 cr0 ff0 nl0 -ofill -olcuc
-
-fconfigure $p -blocking yes -buffering none \
- -translation binary -encoding binary
-
-fconfigure stdout -buffering none
-
proc xmit {b} {
global p
#debug >xmit|$b<
xmit 0x09
}
-switch -exact [llength $argv].[lindex $argv 0] {
- 1.--reset { ms_reset 0 }
- 2.--reset { ms_reset [lindex $argv 1] }
- 3. { }
- default { error "need args: serial port, map file, picno" }
+proc badusage {m} {
+ set m "bad usage: $m"
+ append m {
+usage: .../crashread <port> <map-file> <picno>
+ pass `-1' for <picno> for test (data memory map) mode only
+ pass `reset' for <map-file> to reset pics (then
+ <picno> should be <lastpicno+1> or <firstslave>-<lastpicno+1>)
+}
+ error $m
+}
+
+if {[llength $argv] != 3} { badusage "wrong # args" }
+
+set port [lindex $argv 0]
+set map [lindex $argv 1]
+set slave [lindex $argv 2]
+
+set p [open $port {RDWR NONBLOCK} 0]
+exec stty -F $port min 1 time 0 -istrip -ocrnl -onlcr -onocr -opost \
+ -ctlecho -echo -echoe -echok -echonl -iexten -isig \
+ -icanon -icrnl \
+ 9600 clocal cread -crtscts -hup -parenb cs8 -cstopb \
+ -ixoff bs0 cr0 ff0 nl0 -ofill -olcuc
+
+fconfigure $p -blocking yes -buffering none \
+ -translation binary -encoding binary
+
+fconfigure stdout -buffering none
+
+if {![string compare reset $map]} {
+ ms_reset $picno
}
+set m [open $map]
+set block preable
+set headings unknown
+set inblk 3
+
+while {[gets $m l] >= 0} {
+ if {![regexp {\S} $l]} {
+ set inblk 0
+ set section unknown
+ set headings n/a
+ } elseif {$inblk==0 && [regexp {^\s+(\S.*\S)\s*$} $l dummy block]} {
+ incr inblk
+ } elseif {$inblk==1} {
+ set headings [string trim $l]
+ incr inblk
+ } elseif {$inblk==2 && [regexp {^[- \t]+$} $l]} {
+ incr inblk
+ } elseif {[inblk {^Section Info$} \
+ {^Section\s+Type\s+Address\s+Location\s+Size\(Bytes\)$}]} {
+ manyset $l sec type addr lockind size
+ switch -exact $type code { continue } udata { } \
+ default { error "unknown section type $type in $l" }
+ if {[wantlockind $lockind section $l]<=0} continue
+ set addr [format 0x%08x $addr]
+ lappend sections [list $addr $sec [format 0x%08x $size]]
+ } elseif {[inblk {^Symbols$} \
+ {^Name\s+Address\s+Location\s+Storage\s+File$}]} {
+ manyset $l sym addr lockind storage file
+ if {![wantlockind $lockind symbol $l]} continue
+ switch -exact $storage {
+ extern { set sym [list {} $sym] }
+ static {
+ regexp {^(.*)\.asm$} $file dummy file
+ set sym [list $file: $sym]
+ }
+ default { error "unknown storage $storage in $l" }
+ }
+ set addr [format 0x%08x $addr]
+ if {[string compare $lockind data]} {
+ set sv symbolsbylockind($lockind)
+ } else {
+ set sv symbols
+ }
+ lappend $sv [list $addr $sym]
+ } elseif {$inblk==3} {
+ } else {
+ error "unknown $inblk <$block> <$headings> $l"
+ }
+}
+
+set ok {
+ INTCON* FSR2*
+ OSCCON LVDCON WDTCON RCON
+ T1CON T2CON
+ SSPADD SSPSTAT SSPCON1 SSPCON2
+ ADRESH ADRESL ADCON*
+ CCPR1* CCP1CON
+ ECCPR1* ECCP1DEL ECCPAS
+ CMCON CVRCON T3CON
+ SPBRG TXSTA RXSTA
+ EEADR EEDATA
+ IPR* PIR* PIE*
+ TRIS* LAT*
+}
+
+set h [open /usr/share/gputils/header/p18f458.inc]
+set section unknown
+set lastaddr -1
+while {[gets $h l]>=0} {
+ if {[regexp {^\;\-\-+\s+(\S.*\S)\s+\-\-+$} $l dummy section]} {
+ continue
+ } elseif {![regexp {^Register Files$} $section]} {
+ continue
+ } elseif {[regexp -nocase \
+ {^([a-z][a-z0-9]*)\s+equ\s+h\'0(f[0-9a-f]{2})\'\s*$} \
+ $l dummy sym loc]} {
+ set addr [format 0x%08x 0x$loc]
+ foreach pat $ok {
+ if {[string match $pat $sym]} {
+ if {$addr != $lastaddr} {
+ lappend sections [list $addr =SFRs= 0x1]
+ set lastaddr $addr
+ }
+ lappend symbols [list $addr [list SFR $sym]]
+ }
+ }
+ } elseif {[regexp -nocase {^\;\s*reserved} $l]} {
+ } elseif {![regexp {\S} $l]} {
+ } else {
+ error "unknown <$section> $l"
+ }
+}
+
+lappend symbols {0x00000060 {=udata,!acs=}}
+#lappend symbols {0x00000f00 {=SFRs,!acs=}}
+lappend symbols {0x00000f60 {=SFRs,acs= {}}}
+lappend sections {0x00000f00 {=SFRs=} 0}
+#lappend sections {0x00000060 {==========UDATA,!ACS===========} 0}
+#lappend sections {0x00000f60 {==========SFRs,ACS===========} 0}
+
+lappend sections [list 0x1000 =END= 0]
+foreach tosort {sections symbols symbolsbylockind(program)} {
+ set $tosort [lsort [set $tosort]]
+}
+
+addendlast symbolsbylockind(program) 0x8000 (end)
+
set readcursor -1
set ms [expr {