Hello pesco,
My profuse apologies for the delay in replying. I've been swamped with non-PiDP-8 stuff through most of December. Let me clarify, and see if we can move this conversation forward.
First let me see if I can give you a more complete understanding of the testing I did, what I had hoped for as the outcome, what my actual results were, and why I think that it's a problem.
I would very much like to incorporate either your patch, or one with equivalent functionality into the PiDP-8 release. I agree with your initial principle that it would be ideal if a simple software change would enable builders of the PiDP-8 to just "solder the deposit switch in upside-down, and set the configuration option to use it.
The only platform I have available for testing is my own PiDP-8, where I cut a trace, put in a bodge-wire, and soldered in the deposit switch upside down with the regular software.
In your reply you say:
So one wouldn't enable this by default. It's for tinkerers who don't mind compiling their own software but would rather not cut a trace on the board.
What would you think of a new default? Change the instructions to tell people to solder in the switch upside-down and use the "invert-deposit" version of the software?
I'd hoped to offer that as a more mainstream option. But when I tried the invert-deposit option on my test host, it initially seemed benign. I.E. if someone with a regular build ran that option nothing bad would happen. Unfortunately, on one of my test runs, the whole system hung, and I had to power cycle to get my system back. I believe that, when one un-gracefully power-cycles a Pi, it's a roll of the dice as to whether the system image gets corrupted. I got my system back but have been afraid to do more testing ever since.
I don't like the option of, "If you want to tinker, and solder in the deposit switch upside, down and compile with this option enabled it will work, but if you run this option on a stock system it will hang requiring a power cycle, which may corrupt your system image requiring a start agin from scratch."
This is why I called for additional collaboration.
As you said in your reply:
I.e. the switch looks permanently engaged, unless you press it which momentarily disengages it.
Apparently that state of "permanently engaged" can result in the whole Raspbery Pi OS being out in lala land, unable to be interrupted or shut down cleanly.
I'd like to understand how that happens, and add code to prevent such a hangup. Then if someone tries out the option, the risk of catastrophe is eliminated.
@Oscar, @Steve Tokey, or anybody who understands the gpio code better than I, what made the system hangup, and can it be prevented?
-Bill
--
You received this message because you are subscribed to the Google Groups "PiDP-8" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pidp-8+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/pidp-8/3c6eeee1-ea2b-4366-8661-e2ef3dd38563%40gmail.com.
--
You received this message because you are subscribed to the Google Groups "PiDP-8" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pidp-8+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/pidp-8/CAHF_aixCicV7ya_eH0t%3DQj5i1Mx-qjihBshnxH_1Nov4Gf56yQ%40mail.gmail.com.
On Feb 27, 2026, at 10:27 PM, William Cattey <bill....@gmail.com> wrote:
--
You received this message because you are subscribed to the Google Groups "PiDP-8" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pidp-8+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/pidp-8/787e967f-e0fa-4399-b826-401b133601f3n%40googlegroups.com.
If you can filter out the over-confident sounding stuff, does the final testing and conclusions make sense?
I'm prepared to hear that they still don't. Again, however, I did try out the new version and didn't get the system hangup.
Detai: (too much of it, I'm afraid.)
Let me examine how the GPIO thread and SIMH interact, particularly around interrupts and shutdown:
Now I need to understand what gpio_core() does and how it checks the terminate flag. This is the actual loop that the GPIO thread runs. Let me search for information about this:
So gpio_core() is implemented elsewhere (probably in gpio.c or gpio-nls.c). The key insight is that the GPIO thread passes &terminate_gpio_thread to gpio_core(), and gpio_core() is supposed to check this flag and exit when it's set to 1.
Now let's think about the hang problem:
Key Observations About the HangLooking at the code:
Here's my hypothesis about what might be happening:
The Problem with State InconsistencyWhen gss[].stable_state and switchstatus[] disagree:
Now consider what happens when you actually press the DEP switch:
The switch state keeps oscillating between what gss[] thinks it should be and what the GPIO actually reads.
Why This Causes a Complete HangIf gpio_core() is stuck in this infinite debounce loop for the DEP switch:
Can you add debug logging to see if debounce_switch() is being called repeatedly for the DEP switch? Something like:
If you see this counter incrementing rapidly, that confirms the infinite debounce loop theory.
Does this match what you're seeing? The hang might not be the SIMH thread at all - it's the GPIO thread stuck in an infinite loop!
Excellent! This is very revealing. The debug output shows:
Wait - both values are the same! ss=1, stable=1
This means debounce_switch() is being called thousands of times even though the switch state hasn't changed. That's NOT supposed to happen based on the code logic.
Let me re-examine the debounce_switch() function:
Ah! Now I see it. The function debounce_switch() is called for EVERY switch on EVERY scan, regardless of whether the state has changed. Look at line 424 - it's called inside the nested loop that reads all switches.
When ss == stable_state (line 372), it just resets the timer and returns. This is normal operation. The debug counter incrementing just shows that the GPIO scanning loop is running normally.
So this is NOT an infinite loop problem!
Re-thinking the HangThe GPIO thread is working fine - it's scanning switches normally. The problem must be elsewhere.
Let me reconsider: You said both terminal windows became unresponsive. Let's think about what could cause that:
New Theory: The Inversion During Normal OperationLet's trace what happens when you do "Load Address 7600 / Start" with the DEP switch in its resting (open) position:
With original patch (inversion in report_ss()):
This is the bug! After initialization, switchstatus shows DEP closed even though it's physically open, and it never gets corrected because the debouncing logic thinks everything is fine.
Why This Causes the HangWhen SIMH sees DEP as constantly closed:
Can you add more debug output to see what switchstatus[2] actually contains?
I predict you'll see switchstatus=0 (closed) even though gpio_ss=1 and gss_stable=1 (both saying it's open).
Perfect! There's the smoking gun!
The DEP switch is:
And this state never corrects itself because the debouncing logic sees gpio_ss == gss_stable and thinks everything is fine (line 372-377), so it never calls report_ss() again to update switchstatus[].
The Complete Bug ExplanationDuring initialization:
After initialization: 5. Every scan sees GPIO=1, stable=1 (they match) 6. Line 372 condition is true, just resets timer 7. report_ss() is never called again 8. switchstatus stays frozen at 0 forever
Why This Causes the HangSIMH sees the DEP switch as permanently pressed. Depending on what OS/8 is doing during the boot sequence, this could:
The "hang" isn't really a hang in the traditional sense - it's SIMH responding to what it thinks is a held-down DEP switch.
Why Moving the Inversion Fixes ItWith the inversion in debounce_switch() (before any state management):
This is consistent and correct for an inverted switch.
0200 is just a generic place where people tend to put their programs.
--
You received this message because you are subscribed to the Google Groups "PiDP-8" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pidp-8+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/pidp-8/a332c3c6-fd13-4f17-a79f-6165e989dd28n%40googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/pidp-8/0bc633b7-0ff3-4ed3-aeae-e9e54a0d7952n%40googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/pidp-8/8489568b-6557-420f-b812-1489a0288316n%40googlegroups.com.
Running script file: ./scripts/misc/focal69-tu56.os8
PAL8 Error:
FOCAL.BN<DTA0:FOCAL.ZM,DTA0:FLOAT.ZM
RD C100 +0001
Non-fatal error encountered in ./scripts/misc/focal69-tu56.os8 at line 20:
pal8 FOCAL.BN<DTA0:FOCAL.ZM,DTA0:FLOAT.ZM
Running script file: ./scripts/misc/focal69-tu56.os8
PAL8 Error:
FOCAL.BN<DTA0:FOCAL.ZM,DTA0:FLOAT.ZM
RD C100 +0001
Non-fatal error encountered in ./scripts/misc/focal69-tu56.os8 at line 20:
pal8 FOCAL.BN<DTA0:FOCAL.ZM,DTA0:FLOAT.ZM
Running script file: ./scripts/misc/advent-tu56.os8
pexpect timeout
match before: {}
os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE".
pexpect timeout
match before: {}
os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE".
Running script file: ./scripts/misc/kermit-12-rk05.os8
pexpect timeout
match before: {}
os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE".
pexpect timeout
match before: {}
os8_pip_to 3: failure.
PAL8 Error:
RKA1:K12MIT.BN<RKA1:PARAM.PA,RKA1:K12MIT.PA (EFMW)
K12MIT.PA NOT FOUND
Non-fatal error encountered in ./scripts/misc/kermit-12-rk05.os8 at line 24:
pal8 RKA1:K12MIT.BN<RKA1:PARAM.PA,RKA1:K12MIT.PA (EFMW)
os8_command Error:
LOAD RKA1:K12CLR.BN,RKA1:K12MIT.BN
K12MIT.BN NOT FOUND
Sending ^C to return to monitor.
Non-fatal error encountered in ./scripts/misc/kermit-12-rk05.os8 at line 27:
os8 LOAD RKA1:K12CLR.BN,RKA1:K12MIT.BN
bin/os8-run ./scripts/os8/all-tu56.os8 --enable td12k Attaching rk0 to /home/mkatz/src/pidp8i/trunk/bin/v3d-patched-temp-mcdc7_4h.rk05 Will create a new image file named: obj/ock-bf2-src.rk05 Attaching rk1 to obj/ock-bf2-src.rk05 Booting rk0... Initializing directory of RKA1: in obj/ock-bf2-src.rk05 Initializing directory of RKB1: in obj/ock-bf2-src.rk05 Format converting ./src/os8/ock/LANGUAGE/BASIC/BASIC.PA Format converting ./src/os8/ock/LANGUAGE/BASIC/BCOMP.PA Format converting ./src/os8/ock/LANGUAGE/BASIC/BLOAD.PA Format converting ./src/os8/ock/LANGUAGE/BASIC/BRTS.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting ./src/os8/ock/LANGUAGE/BASIC/EAEDEF.PA Format converting ./src/os8/ock/LANGUAGE/BASIC/UF.PA Format converting ./src/os8/ock/LANGUAGE/BASIC/RESEQ.BA Format converting ./src/os8/ock/LANGUAGE/BASIC/LCBAS.BI Format converting ./src/os8/ock/LANGUAGE/BASIC/UCBAS.BI Format converting ./src/os8/ock/LANGUAGE/FORTRAN2/FORT.PA Format converting ./src/os8/ock/LANGUAGE/FORTRAN2/FPATCH.PA Format converting ./src/os8/ock/LANGUAGE/FORTRAN2/LIBSET.PA Format converting ./src/os8/ock/LANGUAGE/FORTRAN2/LOADER.PA Format converting ./src/os8/ock/LANGUAGE/FORTRAN2/SABR.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE".
Will create a new image file named: obj/ock-cusps-src.rk05 Attaching rk1 to obj/ock-cusps-src.rk05 Booting rk0... Initializing directory of RKA1: in obj/ock-cusps-src.rk05 Initializing directory of RKB1: in obj/ock-cusps-src.rk05 Format converting ./src/os8/ock/CUSPS/BITMAP.PA Format converting ./src/os8/ock/CUSPS/BOOT.PA Format converting ./src/os8/ock/CUSPS/CAMP.PA Format converting ./src/os8/ock/CUSPS/CREF.PA Format converting ./src/os8/ock/CUSPS/DIRECT.PA Format converting ./src/os8/ock/CUSPS/DTCOPY.PA Format converting ./src/os8/ock/CUSPS/DTFRMT.PA Format converting ./src/os8/ock/CUSPS/EDIT.PA Format converting ./src/os8/ock/CUSPS/EPIC.PA Format converting ./src/os8/ock/CUSPS/FOTP.PA Format converting ./src/os8/ock/CUSPS/FUTIL.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting ./src/os8/ock/CUSPS/HELP.PA Format converting ./src/os8/ock/CUSPS/MCPIP.PA Format converting ./src/os8/ock/CUSPS/MSBAT.PA Format converting ./src/os8/ock/CUSPS/PAL8.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting ./src/os8/ock/CUSPS/PIP.PA Format converting ./src/os8/ock/CUSPS/PIP10.PA Format converting ./src/os8/ock/CUSPS/RKLFMT.PA Format converting ./src/os8/ock/CUSPS/RLFRMT.PA Format converting ./src/os8/ock/CUSPS/RXCOPY.PA Format converting ./src/os8/ock/CUSPS/SET.PA Format converting ./src/os8/ock/CUSPS/SRCCOM.PA Format converting ./src/os8/ock/CUSPS/TDCOPY.PA Format converting ./src/os8/ock/CUSPS/TDFRMT.PA Format converting ./src/os8/ock/CUSPS/TDINIT.PA Format converting ./src/os8/ock/CUSPS/TECO.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE".
Will create a new image file named: obj/ock-fiv-src.rk05 Attaching rk1 to obj/ock-fiv-src.rk05 Booting rk0... Initializing directory of RKA1: in obj/ock-fiv-src.rk05 Initializing directory of RKB1: in obj/ock-fiv-src.rk05 Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/F4.PA Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/LIBRA.PA Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/LOAD.PA Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/PASS2.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/PASS2O.PA Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/PASS3.PA Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/RALF.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/RTL.PA Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/RTS.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/FORGEN.BI Format converting ./src/os8/ock/LANGUAGE/FORTRAN4/FORLIB.BI
Will create a new image file named: /home/mkatz/src/pidp8i/trunk/obj/v3f-build.rk05 Attaching rk1 to /home/mkatz/src/pidp8i/trunk/obj/v3f-build.rk05 Booting rk0... Initializing directory of RKA1: in /home/mkatz/src/pidp8i/trunk/obj/v3f-build.rk05 Initializing directory of RKB1: in /home/mkatz/src/pidp8i/trunk/obj/v3f-build.rk05 Format converting BLOAD.PA Format converting BOOT.PA Format converting BPAT.PA Format converting BUILD.PA Format converting CCL.BI Format converting CCL.MA Format converting CCLAT.MA Format converting CCLCD.MA Format converting CCLCDX.MA Format converting CCLCOR.MA Format converting CCLDAT.MA Format converting CCLDRV.MA Format converting CCLMSG.MA Format converting CCLPS.MA Format converting CCLREM.MA Format converting CCLRUN.MA Format converting CCLSB2.MA Format converting CCLSEM.MA Format converting CCLSIZ.MA Format converting CCLSUB.MA Format converting CCLTAB.MA Format converting CCLTBL.MA Format converting CD.PA Format converting FPAT.PA Format converting FUTIL.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting KL8E.PA Format converting OS78.BI Format converting OS8.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting PAL8.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting PIP.PA
Will create a new image file named: /home/mkatz/src/pidp8i/trunk/obj/v3f-build.rk05 Attaching rk1 to /home/mkatz/src/pidp8i/trunk/obj/v3f-build.rk05 Booting rk0... Initializing directory of RKA1: in /home/mkatz/src/pidp8i/trunk/obj/v3f-build.rk05 Initializing directory of RKB1: in /home/mkatz/src/pidp8i/trunk/obj/v3f-build.rk05 Format converting BLOAD.PA Format converting BOOT.PA Format converting BPAT.PA Format converting BUILD.PA Format converting CCL.BI Format converting CCL.MA Format converting CCLAT.MA Format converting CCLCD.MA Format converting CCLCDX.MA Format converting CCLCOR.MA Format converting CCLDAT.MA Format converting CCLDRV.MA Format converting CCLMSG.MA Format converting CCLPS.MA Format converting CCLREM.MA Format converting CCLRUN.MA Format converting CCLSB2.MA Format converting CCLSEM.MA Format converting CCLSIZ.MA Format converting CCLSUB.MA Format converting CCLTAB.MA Format converting CCLTBL.MA Format converting CD.PA Format converting FPAT.PA Format converting FUTIL.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting KL8E.PA Format converting OS78.BI Format converting OS8.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting PAL8.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting PIP.PA
Format converting README.V3F Format converting RESORC.BI Format converting RESORC.MA Format converting RESOV0.MA Format converting RESOV1.MA Format converting RESOV2.MA Format converting RESOVD.MA Format converting RL0.PA Format converting RL1.PA Format converting RL2.PA Format converting RL3.PA Format converting RLC.PA Format converting RLFRMT.PA Format converting RLSY.PA Format converting RTL.PA Format converting RTS.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting RX78C.PA Format converting RXCOPY.PA Format converting RXNS.PA Format converting RXSY1.PA Format converting RXSY2.PA Format converting SAVECB.PA Format converting TECO.PA pexpect timeout match before: {} os8_pip_to 2: Expected: "Command Decoder Prompt". Instead got: "USE PIP FOR NON-FILE STRUCTURED DEVICE". Format converting VXNS.PA Format converting VXSY.PA
I hope this helps.
To use this script:
#!/bin/bash # # Update the apt database # echo -e "\r\nUpdating apt database\r\n" sudo apt update # # Update the operating system # echo -e "\r\nUpdating the operating system\r\n" sudo apt upgrade -y sudo apt full-upgrade -y # # Install fossil if necessary # echo -e "\r\nVerifying fossil installation\r\n" if ! dpkg-query -W fossil &>/dev/null ; then echo -e "\r\nInstalling fossil\r\n" sudo apt install fossil -y fi # # Install build-essential if necessary # echo -e "\r\nVerifying build-essential installation\r\n" if ! dpkg-query -W build-essential &>/dev/null ; then echo -e "\r\nInstalling build-essential\r\n" sudo apt install build-essential -y fi # # Install libraspberrypi-dev if necessary # echo -e "\r\nVerifying libraspberrypi-dev installation\r\n" if ! dpkg-query -W libraspberrypi-dev &>/dev/null ; then echo -e "\r\nInstalling libraspberrypi-dev\r\n" sudo apt install libraspberrypi-dev -y fi # # Install libncurses-dev if necessary # echo -e "\r\nVerifying libncurses-dev installation\r\n" if ! dpkg-query -W libncurses-dev &>/dev/null ; then echo -e "\r\nInstalling libncurses-dev\r\n" sudo apt install libncurses-dev -y fi # # Install perl if necessary # echo -e "\r\nVerifying perl installation\r\n" if ! dpkg-query -W perl &>/dev/null ; then echo -e "\r\nInstalling perl\r\n" sudo apt install perl -y fi # # Install python3-pexpect if necessary # echo -e "\r\nVerifying python3-pexpect installation\r\n" if ! dpkg-query -W python3-pexpect &>/dev/null ; then echo -e "\r\nInstalling python3-pexpect\r\n" sudo apt install python3-pexpect -y fi # # Install python3-yaml if necessary # echo -e "\r\nVerifying python3-yaml installation\r\n" if ! dpkg-query -W python3-yaml &>/dev/null ; then echo -e "\r\nInstalling python3-yaml\r\n" sudo apt install python3-yaml -y fi # # Install time if necessary # echo -e "\r\nVerifying time installation\r\n" if ! dpkg-query -W time &>/dev/null ; then echo -e "\r\nInstalling time\r\n" sudo apt install time -y fi # # Install expect if necessary # echo -e "\r\nVerifying expect installation\r\n" if ! dpkg-query -W expect &>/dev/null ; then echo -e "\r\nInstalling expect\r\n" sudo apt install expect -y fi # # Make sure that the date and time are correct. Change the timezone for your local timezone # sudo timedatectl set-timezone America/Central sudo timedatectl set-ntp on # # Setup the log file # now=`date +"%Y%m%d%H%M"` Logfile=$PWD'/PIDP8I_SetupLog_'${now} echo -e "\r\nLogfile: "$Logfile"\r\n" cat /sys/firmware/devicetree/base/model | tee ${Logfile} cat /proc/cpuinfo | tee -a ${Logfile} # # Check out trunk and the cycle-realistic branch # echo -e "\r\nMaking Directories\r\n" | tee -a ${Logfile} mkdir -p ~/museum ~/src/pidp8i/trunk ~/src/pidp8i/pi5 ~/src/pidp8i/pi5-ils2 ~/src/pidp8i/pi5-ils2-cyclerealistic # # Cloning fossil repository # echo -e "\r\nCloning repository\r\n" | tee -a ${Logfile} (/usr/bin/time fossil clone https://tangentsoft.com/pidp8i ~/museum/pidp8i.fossil) 2>&1 | tee -a ${Logfile} # # Get trunk # cd ~/src/pidp8i/trunk echo -e "\r\nGetting trunk\r\n" | tee -a ${Logfile} (/usr/bin/time fossil open ~/museum/pidp8i.fossil) 2>&1 | tee -a ${Logfile} echo -e "\r\nConfiguring trunk for build\r\n" | tee -a ${Logfile} (/usr/bin/time ./configure --prefix=$PWD/pidp8i) 2>&1 | tee -a ${Logfile} echo -e "\r\nMaking tools\r\n" | tee -a ${Logfile} (/usr/bin/time tools/mmake) 2>&1 | tee -a ${Logfile} echo -e "\r\nMaking install\r\n" | tee -a ${Logfile} (/usr/bin/time sudo make install) 2>&1 | tee -a ${Logfile}
