Liebe Leute,
möchte mir bitte jemand erläutern, wie es sich vorzustellen ist mit so
einem Warmstart.
Wie soll der Code dafür siehe Listing 1, eigentlich erreicht werden?
Ich kenne den x86-Prozessor (welcher war das 1984?) nicht so gut, aber
das sieht nach einer Vektortabelle aus, wie sie auch der AVR hat,
beginnend mit Adresse 0100H
"MAY 1979"
Aus welcher Mottenkiste hast Du das ausgegraben?
Kaltstart wird durch Power-On oder den Resettaster ausgelöst, Warmstart
durch einen Aufruf. Ob Du diese Unterscheidung behandeln willst, bleibt
Dir überlassen.
https://www.pcjs.org/documents/manuals/ibm/
ab PDF-Seite 468 des PCDOS2.0 Manuals ist EXE2BIN beschrieben, dort gibt
es "ORG0100H"
Anscheinend soll der Assembler ein ".COM"-Programm erzeugen, das waren
Programme, die im Gegensatz zu EXE maximal 64k groß sein durften.
.COM-Programme (DOS) haben eine feste Einsprungadresse von CS:0100h. DOS
macht rein gar nichts für das Programm, da wird nicht mal der
Stackpointer gesetzt. Die Datei wird einfach komplett in freies RAM
geladen und an CS:0100h angesprungen, mehr nicht. Heißt, ein PUSH AX am
Anfang eines COM-Programms zerschießt das Programm bereits. In CS:0000h
bis CS:00FFh finden sich bei DOS Umgebungsvariablen, z.B. die
Kommandozeile.
Bei .EXE-Dateien kann eine Einsprungadresse definiert werden, die Datei
kann eine Checksumme beinhalten (wobei die oft nicht ausgewertet wird),
der Stack wird von DOS passend gesetzt. Die Umgebungsvariablen sind
dadurch zugänglich, daß DS/ES 10h niedriger gesetzt werden als CS, da
findet man durch die Speichersegmentierung des x86 diese 100h Bytes wie
bei der .COM-Datei. Dazu kann man an eine .EXE noch irgendwelchen
Overhead/Daten anhängen, der von DOS nicht mit in den Speicher geladen
wird. Bestes Beispiel für sowas waren selbstextrahierende Archive.
Aber die Interrupttabelle hat damit nicht viel zu tun, die ist
Prozessor- bzw. Plattform-spezifisch. Unter DOS z.B. hat das
Überschreiben des ersten kB des Hauptspeichers einen sofortigen Absturz
zur Folge, weil der x86 nicht ohne Interrupttabelle leben kann.
Die Idee mit den Interruptvektoren hatte ich auch wieder verworfen.
Der ominöse SCREEN Nr. 79 des oben verlinkten Forth-Handbuchs (S.52 von
56) enthält tatsächlich die Worte Monitor und cold start.
Bei den beiden Einsprungpunkten für Cold und Warm handelt es sich um
Einsprungpunkte in den Forth-Interpreter. Es geht hier idR. nicht um
irgendeinen Reset/Reboot der Hardware.
Ja, die Sprünge ganz am Anfang werden auf unterschiedliche Stellen in
COLD (SCR # 55/S. 44) umgebogen.
o Klar ist, dass der cold Vektor beim Starten ausgeführt wird, da er
zuvorderst steht.
o Nicht klar ist mir jedoch, wie Vektor warm jemals ausgeführt werden
soll.
In FIG-Forth selbst habe ich keinen Verweis auf das vierte Byte bzw.
104h entdeckt.
Einzig die Sache mit dem Monitor sehe ich als potenzielle Möglichkeit,
verstehe sie allerdings noch nicht.
Der Warmstart wird von extern angesprungen, um Forth neu zu starten,
ohne das Dictionary zu löschen. Beispielsweise, um ein gerade laufendes
Programm zu beenden - beim C64 wurde das per NMI (Restore-Taste)
ausgelöst. Btw, der Basic-Interpreter hatte auch so einen
Warmstart-Einsprung.
Liese sich etwas Vergleichbares auch auf einem PC machen? Etwa mit dem
ganz alten Cassette Basic und Forth auf Kassette. Oder wenn man von
Forth aus COMMAND.COM ausführte und dann EXIT eingibt. Wo landet man
dann?
Anbei, der mehr oder weniger selbe Assembler aus dem Installation Manual
findet sich vom selben Autor in [1, p. 143ff/S. 11ff].
[1] Fourth Dimensions, Volume 3 Issue 5
(http://forth.org/fd/FD-V03N5.pdf)
Die Sprungadressen stehen ja ab 0100H, 0FD8 und 0FC3. Dort geht es
weiter. Anscheinend wird das Forth-spezifische hier einfach als Define
Word und Define Byte abgelegt. Dazwischen mal ein Stück Assemblercode.
Sehr unübersichtlich.
Günther A. D. Hauptmann schrieb:> Liese sich etwas Vergleichbares auch auf einem PC machen? Etwa mit dem> ganz alten Cassette Basic und Forth auf Kassette. Oder wenn man von> Forth aus COMMAND.COM ausführte und dann EXIT eingibt. Wo landet man> dann?
Was willst du erreichen? Hast du eine nackte Hardware mit deinem
eingenen Code oder reden wir hier von einem normalen Legacy BIOS/UEFI PC
mit Windows/Linux, es geht vieles nicht mehr auf neuerer
Hardware/Betriebssystemen
Soweit ich das jetzt deuten kann, heißt Int 27h [1] in BYE [2, p.
1-93/S. 94],
dass es irgendwie möglich ist, nach dem verlassen von Forth einen
Warmstart desselben zu machen. Mangels Erfahrung mit TSR Programmen
verstehe ich in CLD [2, p. 1-62/S. 64] leider nur den Kommentar, dass es
wohl mit Ctrl-Break geht. Leider habe ich es weder in der DOSBox noch
auf einem BIOS PC mit dieser FORTH.EXE (Quelltext in FORTH) [3]
geschafft. Was muss ich dazu für Tasten drücken, oder wie geht das?
[1] https://www.ctyme.com/intr/int-27.htm
[2] http://www.forth.org/fig-forth/fig-forth_IBMPC.pdf
[3]
http://www.forth.org/library/eforth_SOC/eforth_SOC_source/figforth/FIGFORTH.ZIP
Hättest Du möglicherweise die Güte, einmal mitzuteilen, was Du mit einem
Forth von 1979 beabsichtigst? Soll das auf einem aktuellen PC laufen?
Möglicherweise kann man Dir dann besser helfen.
Was Deine Frage angeht: Entweder wird der Warmstart direkt über jmp
angesprungen (wahrscheinlich) oder der erste jmp wird im RAM
überschrieben (hier unwahrscheinlich). Die NOPs dienen wahrscheinlich
zum Aligment auf durch 4 teilbare Adressen.