[archimedes] Re: [6] Wir basteln uns ein !Boot

  • From: Markus Huber <info@xxxxxxxxxxxxxx>
  • To: archimedes@xxxxxxxxxxxxx
  • Date: Mon, 18 Apr 2016 23:24:54 +0200 (BST)

Es folgte nun die Abkehr von <Wimp$State>. Diese Systemvariable
hat Eigenschaften die sie für den Zweck in !Boot unbrauchbar machen.
Denn obwohl längst im Desktop, macht <Wimp$State> einen Unterschied in
der Aussage "desktop" wenn es per Doppelklick gestartet wurde,
aber die selbe Obey Datei liefert "commands" wenn die App "vom Filer"
automatisch gebootet wird.

Auch der Unterschied von !BOOT und !Boot machte mir zu schaffen.
<Obey$Dir> liefert im Boot-Prozess $.!BOOT. obwohl der Verzeichnissname
!Boot ist.

Und dann kam ich auf die Idee, einen Teil der Pseudo-Apps in !Boot.Boot
gezielt in festgelegter Reihenfolge zu starten und alle übrigen per
*Repeat nachzuholen. In diese Idee hatte ich in den vergangenen Tagen
zusätzlich viele Stunden investiert und letztlich wegen totaler
Ausuferung die Vollbremsung gemacht.

Nun aber habe ich nach unzähligen Stunden nicht nur den Durchbruch
bezüglich der Alternative zu <Wimp$State>, sondern zusätzlich viele
Flexibilisierungen und Verbesserungen erarbeitet. Voila:

<Root$Dir> und <Root$Path> sind aus der !Boot.!Run rausgeflogen.

Es gibt nun drei Alias$ um die !Pseudo-Apps zu initialisieren bzw. zu
starten. Da ich mir mit den "einfachen" Alias$*Namen* selbst einen
Fallstrick baute (identischer Name in anderem Obey), habe ich hier ein
paar Buchstaben zugelegt und die Herkunft eindeutig gemacht: den
Dateinamen "PreDesk" vorangestellt.

Der erste der drei ist nur eine Zusammenführung für die beiden anderen
auf einen Ort. Also eine Art syntactic Sugar.
Der zweite Alias$ besagt, daß ohne diese !Pseudo-App nicht weiter
gebootet wird. Die !Pseudo-App ist zwingend.
Der dritte Alias$ ist bis auf die zwingende Eigenschaft, identisch mit
der zweiten aber.

Die Pfadangaben habe ich reingeholt / ausgeschrieben, damit so im
identischen Ablauf "externe" (nicht im !Boot oder sogar nicht auf dieser
Festplatte) !Pseudeo-Apps eingebunden werden können. Klar geht das
erst wenn die entsprechenden Laufwerke (z.B. der NAS) auch angesprochen
werden können z.B. der Internet Stack dann LanMan98 vorhanden ist. Wie
gesagt der Internet-Sache widme ich mich noch.

So sieht derr Hauptblock aus !Boot.!Run nun insgesamt aus:

Set Alias$PreDeskDoObey Do Obey <Boot$Verbose> %%0.!Run PreDesk
Set Alias$PreDeskRunForce   IfThere %%0.!Run Then PreDeskDoObey %%0 Else Error 
Can't boot %%0.!Run not found!
Set Alias$PreDeskRunIfThere IfThere %%0.!Run Then PreDeskDoObey %%0
PreDeskRunForce <Boot$Dir>.!Init
PreDeskRunForce <Boot$Dir>.!Run
PreDeskRunForce <Boot$Dir>.!Unicode
PreDeskRunForce <Boot$Dir>.!Scrap
PreDeskRunForce <Boot$Dir>.!Fonts
PreDeskRunForce <Boot$Dir>.!Waste
PreDeskRunForce <Boot$Dir>.!Work
PreDeskRunForce <Boot$Dir>.!System
PreDeskRunForce <Boot$Dir>.!Sources

PreDeskRunIfThere <Boot$Dir>.!Sounds
PreDeskRunIfThere <Boot$Dir>.!Transfer
PreDeskRunIfThere <Boot$Dir>.!Trace
PreDeskRunIfThere <Boot$Dir>.!SysLog
PreDeskRunIfThere <Boot$Dir>.!Sprites

PreDeskRunForce <Boot$Dir>.!Choices

Unset Alias$PreDeskRunIfThere
Unset Alias$PreDeskRunForce
Unset Alias$PreDeskDoObey
|------------------------
Desktop -file <Boot$Dir>.^.Desk

Ich habe mich nicht weiter drum gekümmert, aber mit
Desktop -file <Obey$Dir>.Desk funktionierts nicht.

Und obwohl es nur wenige Zeilen sind die wieder mal übrig bleiben. Der
Aufwand dahinter ist kaum zu erahnen. Hier die Obey-Datei
!Boot.Boot.!Init.!Run

| The following *IfThere check is not as good as the *IfSame check
| e.g. used in !Run.!Run. Because it's possible that two !<apps>
| with the same name exists in different locations. But the *IfSame
| check isn't available at this point.
|
| Do not delete the pipe leading the system variable. Because
| then *IfThere makes an error if the system variable is unset
IfThere |<Init$Dir> Then Set Flag -1 Else Set Flag 0
If "%0" <> "PreDesk" AND Flag Then Filer_OpenDir |<Init$Dir>.Public
If "%0" <> "PreDesk" AND Flag Then Obey
|--------------------------------------
If "<Boot$OSVersion>" = "" Then Error Missing |<Boot$OSVersion> in !Init
|-----------------------------------------------------------------------
Set Init$Dir <Obey$Dir>
|----------------------
If "%0" <> "PreDesk" AND Flag=0 Then Error !Init is moved but never installed 
twice
|----------------------------------------------------------------------------------
Set Alias$InitRunIfThere IfThere %%0.!Run Then Obey <Boot$Verbose> %%0.!Run
InitRunIfThere <Init$Dir>.Public.ROMPatch
InitRunIfThere <Init$Dir>.Public.RMASizer
InitRunIfThere <Init$Dir>.Public.FilerPatch
InitRunIfThere <Init$Dir>.Public.CMOSPatch
InitRunIfThere <Init$Dir>.Public.BigRAMDisc
InitRunIfThere <Init$Dir>.Public.ADFSSpeed
InitRunIfThere <Init$Dir>.Public.KillApps
InitRunIfThere <Init$Dir>.Public.IfSame
Unset Alias$InitRunIfThere

Interessant, ist mir noch nie aufgefallen, zumindest in meiner Version
bringt *IfThere einen Fehler, wenn es mit einer ungesetzten
Systemvariable aufgerufen wird. Mit dem | läßt sich das vermeiden. Bei
uneingeschränkter Funktion.

*IfSame ist ein kleines Programm welches zwei Zeichenketten miteinander
vergleicht - entscheidend: case insensitive! und eine Systemvariable
je nach Ergebnis auf TRUE=1 bzw. FALSE=0 setzt.

Hier die endlich wieder kleine !Boot.Boot.!Run.!Run Obey-Datei. Sieht
einfach aus, ist sie auch, aber es ist oft so, daß man die Mühe die
das Einfache erforderte nicht erkennen kann.

IfSame Flag <Obey$Dir> <Run$Dir>
If "%0" <> "PreDesk" AND Flag AND "<Run$Dir>" > "" Then Filer_OpenDirs 
|<Run$Dir>
If "%0" <> "PreDesk" AND Flag Then Obey
|--------------------------------------
Set Run$Dir <Obey$Dir>
Set Run$Path ,%.,<Run$Dir>.Commands.
Repeat <Run$Dir>.Alias.Repeat <Run$Dir>.Alias -directories
Repeat RMLoad <Run$Dir>.Modules

Ich werde die obige Funktionsweise auf die anderen !Pseudo-Apps
übertragen und dann kann es mit Nummer [7] endlich weiter gehen.



--
Markus

.


Other related posts:

  • » [archimedes] Re: [6] Wir basteln uns ein !Boot - Markus Huber