Skip to content

Commit 055ea8f

Browse files
committed
Enable flexible program count configuration in GUI.tcl
1 parent 42ccc4c commit 055ea8f

File tree

1 file changed

+74
-73
lines changed

1 file changed

+74
-73
lines changed

GUI.tcl

Lines changed: 74 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ exec wish $0 ${1+"$@"}
2121
# $Id: GUI.tcl 222 2006-02-20 17:35:42Z hoenicke $
2222

2323
set firmware ""
24+
set progcount 8
2425
set brickaddr 0
2526
set brickosname bibo
26-
set brickosprogslots 7
27+
2728
set brickbothome "/usr/local"
2829
if { [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-"
3839
if { [llength [array get env CROSSTOOLPREFIX]] != 0 } {
3940
set CROSSTOOLPREFIX $env(CROSSTOOLPREFIX)
4041
}
@@ -473,53 +474,54 @@ proc load_program { nr } {
473474
474475
proc 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
555557
proc 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
584587
proc 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
588591
proc 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-
732729
proc 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

Comments
 (0)