@@ -21,9 +21,10 @@ exec wish $0 ${1+"$@"}
2121# $Id: GUI.tcl 222 2006-02-20 17:35:42Z hoenicke $
2222
2323set firmware " "
24+ set progcount 8
2425set brickaddr 0
2526set brickosname bibo
26- set brickosprogslots 7
27+
2728set brickbothome " /usr/local"
2829if { [llength [array get env BRICKOS_DIR]] != 0 } {
2930 set brickbothome $env (BRICKOS_DIR)
@@ -34,7 +35,7 @@ if { [llength [array get env BRICKOS_LIBDIR]] != 0 } {
3435 set BRICKOS_LIBDIR $env (BRICKOS_LIBDIR)
3536}
3637
37- set CROSSTOOLPREFIX " $brickbothome /bin/ h8300-hitachi-coff-"
38+ set CROSSTOOLPREFIX " h8300-hitachi-coff-"
3839if { [llength [array get env CROSSTOOLPREFIX]] != 0 } {
3940 set CROSSTOOLPREFIX $env (CROSSTOOLPREFIX)
4041}
@@ -473,53 +474,54 @@ proc load_program { nr } {
473474
474475proc beam_program { nr filename } {
475476 if {[string match "*.rcoff" $filename ]} {
476- global firmware brickaddr CROSSTOOLPREFIX
477- global progs
478- set coffname [string map {.rcoff .coff} $filename ]
479- set firmlds [string map {.coff .lds} $firmware ]
480- set sizefd [open "|${CROSSTOOLPREFIX} size $filename " "r" ]
481- gets $sizefd line
482- gets $sizefd line
483- scan $line " %d %d %d" text data bss
484- set size [expr $text + $data + $bss + $data ]
485- send_cmd [format "OA%1d%d" [expr $nr - 1] $size ]
486- vwait brickaddr
487- regexp {[^/]*$} $filename basename
488- puts "$basename loaded to $brickaddr "
489- if { $brickaddr } {
490- exec ${CROSSTOOLPREFIX} ld -T $firmlds $filename -o $coffname --oformat coff-h8300 -Ttext $brickaddr
491- set filename $coffname
492- lset progs $nr $coffname
493- } else {
494- set filename ""
495- }
477+ global firmware brickaddr CROSSTOOLPREFIX
478+ global progs
479+ set coffname [string map {.rcoff .coff} $filename ]
480+ set firmlds [string map {.coff .lds} $firmware ]
481+ set sizefd [open "|${CROSSTOOLPREFIX} size $filename " "r" ]
482+ gets $sizefd line
483+ gets $sizefd line
484+ scan $line " %d %d %d" text data bss
485+ set size [expr $text + $data + $bss + $data ]
486+ send_cmd [format "OA%1d%d" [expr $nr - 1] $size ]
487+ vwait brickaddr
488+ regexp {[^/]*$} $filename basename
489+ puts "$basename loaded to $brickaddr "
490+ if { $brickaddr } {
491+ exec ${CROSSTOOLPREFIX} ld -T $firmlds $filename -o $coffname --oformat coff-h8300 -Ttext $brickaddr
492+ set filename $coffname
493+ lset progs $nr $coffname
494+ } else {
495+ set filename ""
496+ }
496497 } elseif {[string match "*.a" $filename ]} {
497- global firmware brickaddr CROSSTOOLPREFIX
498- global progs
499- global BRICKOS_LIBDIR LIBS
500- set coffname [string map {.a .coff} $filename ]
501- set objname [string map {.a .o} $filename ]
502- set firmlds [string map {.coff .lds} $firmware ]
503- exec ${CROSSTOOLPREFIX} ld -T $firmlds -L$BRICKOS_LIBDIR $objname $filename -lc -lmint -lfloat -lc++ -o $coffname --oformat coff-h8300 -Ttext 0xb000
504- set sizefd [open "|${CROSSTOOLPREFIX} size $coffname " "r" ]
505- gets $sizefd line
506- gets $sizefd line
507- scan $line " %d %d %d" text data bss
508- set size [expr $text + $data + $bss + $data ]
509- send_cmd [format "OA%1d%d" [expr $nr - 1] $size ]
510- vwait brickaddr
511- regexp {[^/]*$} $filename basename
512- puts "$basename loaded to $brickaddr "
513- if { $brickaddr } {
514- exec ${CROSSTOOLPREFIX} ld -T $firmlds -L$BRICKOS_LIBDIR $objname $filename -lc -lmint -lfloat -lc++ -o $coffname --oformat coff-h8300 -Ttext $brickaddr
515- set filename $coffname
516- lset progs $nr $coffname
517- } else {
518- set filename ""
519- }
498+ global firmware brickaddr CROSSTOOLPREFIX
499+ global progs
500+ global BRICKOS_LIBDIR LIBS
501+ set coffname [string map {.a .coff} $filename ]
502+ set objname [string map {.a .o} $filename ]
503+ set firmlds [string map {.coff .lds} $firmware ]
504+ exec ${CROSSTOOLPREFIX} ld -T $firmlds -L$BRICKOS_LIBDIR $objname $filename -lc -lmint -lfloat -lc++ -o $coffname --oformat coff-h8300 -Ttext 0xb000
505+ set sizefd [open "|${CROSSTOOLPREFIX} size $coffname " "r" ]
506+ gets $sizefd line
507+ gets $sizefd line
508+ scan $line " %d %d %d" text data bss
509+ set size [expr $text + $data + $bss + $data ]
510+ send_cmd [format "OA%1d%d" [expr $nr - 1] $size ]
511+ vwait brickaddr
512+ regexp {[^/]*$} $filename basename
513+ puts "$basename loaded to $brickaddr "
514+ if { $brickaddr } {
515+ exec ${CROSSTOOLPREFIX} ld -T $firmlds -L$BRICKOS_LIBDIR $objname $filename -lc -lmint -lfloat -lc++ -o $coffname --oformat coff-h8300 -Ttext $brickaddr
516+ set filename $coffname
517+ lset progs $nr $coffname
518+ } else {
519+ set filename ""
520+ }
520521 }
522+
521523 if {$filename != ""} {
522- send_cmd [format "OL%1d%s" [expr $nr - 1] $filename ]
524+ send_cmd [format "OL%1d%s" [expr $nr - 1] $filename ]
523525 }
524526}
525527
@@ -553,7 +555,6 @@ proc bos_setaddr { } {
553555}
554556
555557proc create_bosmenus { } {
556- global bosaddr brickosprogslots
557558 menu .bosaddrmenu -postcommand {send_cmd "ON?"}
558559 .bosaddrmenu add radiobutton -label "0" -variable bosaddr -command { bos_setaddr }
559560 .bosaddrmenu add radiobutton -label "1" -variable bosaddr -command { send_cmd "ON1" }
@@ -573,16 +574,18 @@ proc create_bosmenus { } {
573574 .bosaddrmenu add radiobutton -label "15" -variable bosaddr -command { send_cmd "ONf" }
574575
575576 menu .bosprogmenu
576- .bosprogmenu add command -label "1..." -command {load_program 1}
577- .bosprogmenu add command -label "2..." -command {load_program 2}
578- .bosprogmenu add command -label "3..." -command {load_program 3}
579- .bosprogmenu add command -label "4..." -command {load_program 4}
580- .bosprogmenu add command -label "5..." -command {load_program 5}
581- .bosprogmenu add command -label "6..." -command {load_program 6}
582- .bosprogmenu add command -label "7..." -command {load_program 7}}
577+ global progcount
578+ # To avoid having to list each command explicitly, like the following:
579+ # .bosprogmenu add command -label "1..." -command {load_program 1}
580+ # …see the following link:
581+ # https://stackoverflow.com/a/70429493
582+ for {set proglist 1} { $proglist <= $progcount } {incr proglist 1} {
583+ .bosprogmenu add command -label "$proglist ..." -command "load_program $proglist "
584+ }
585+ }
583586
584587proc show_about_box { } {
585- tk_messageBox -icon info -title "About BrickEMU" -message "BrickEmu (C) 2003-2004 Jochen Hoenicke\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GPL.\n\nYou can find the latest version at:\nhttp ://hoenicke.ath.cx /rcx/"
588+ tk_messageBox -icon info -title "About BrickEMU" -message "BrickEmu (C) 2003-2004 Jochen Hoenicke\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GPL.\n\nYou can find the latest version at:\nhttps ://jochen- hoenicke.de /rcx/"
586589}
587590
588591proc create_menu { } {
@@ -695,13 +698,15 @@ for { set i 0 } { $i < $argc } {incr i 1} {
695698 set firmware [lindex $argv $i ]
696699 puts "Requested Firmware: $firmware "
697700 }
698- "-prog1" -
699- "-prog2" -
700- "-prog3" -
701- "-prog4" -
702- "-prog5" -
701+ "-prog9" -
702+ "-prog8" -
703+ "-prog7" -
703704 "-prog6" -
704- "-prog7" {
705+ "-prog5" -
706+ "-prog4" -
707+ "-prog3" -
708+ "-prog2" -
709+ "-prog1" {
705710 set prognum [string index [lindex $argv $i ] end]
706711 incr i 1
707712 set initialprogs($prognum ) [lindex $argv $i ]
@@ -721,18 +726,10 @@ for { set i 0 } { $i < $argc } {incr i 1} {
721726 }
722727}
723728
724- proc load_initial_firmware_and_programs { } {
725- if {$firmware != ""} { beam_firmware $firmware }
726-
727- foreach {slotnr program} [array get initialprogs] {
728- beam_program $slotnr $program
729- }
730- }
731-
732729proc start_gui { } {
733730 # TCL currently does not support passing arrays, so we read the global.
734731 # - https://wiki.tcl-lang.org/page/How+to+pass+arrays
735- global firmware initialprogs;
732+ global firmware initialprogs progcount ;
736733
737734 puts "Starting GUI..."
738735 create_gui
@@ -744,9 +741,13 @@ proc start_gui { } {
744741 set delay [ expr { $delay + 400 } ]
745742 }
746743
747- foreach {slotnr program} [array get initialprogs] {
748- set delay [ expr { $delay + 100 } ]
749- after $delay "beam_program $slotnr $program "
744+ foreach { prognum } [lsort [array names initialprogs] ] {
745+ if {$prognum <= $progcount } {
746+ set delay [ expr { $delay + 100 } ]
747+ after $delay "beam_program $prognum $initialprogs ($prognum )"
748+ } else {
749+ puts "BrickEmu: Invalid Argument: Max program count is $progcount but program $prognum requested for $initialprogs ($prognum )"
750+ }
750751 }
751752}
752753
0 commit comments