Wo die MINERVA-Variante M89 nicht eingesetzt werden soll, hilft ändern
des .W-Wertes im ROM-Code an Adresse $04E6 von $D640 in $D680, was eine
fehlerhafte .W-Addition durch ihr .L-Aequivalent ersetzt. Damit werden 16MB RAM
verfügbar.
Ein anderer Fehler mag noch das LSL.W an der Stelle $0548 sein,
das mit dem Wert $E588 zum LSL.L geändert werden kann - zumindest gab es
dadurch keine neuen Fehler, ob nun mehr als 16MB möglich sind, wurde (noch)
nicht geprüft.
Weitere Maßnahmen sind nicht erforderlich.
Für übergroße Bildschirmmaße wurde in M89 auch die Bedarfsermittlung für den FILL-Puffer modifiziert; einfacher Patch ist hier nicht möglich. Fehler treten jedoch nur sehr selten auf, und nur, wenn FILL benutzt wird und über relativ große Distanzen geht, sodaß die vom Standard-QL bekannten Programme daran kaum scheitern dürften. - Ein Beispiel mit (bisher) nur harmlosen Folgen läßt sich anhand des S.Basic-Programms "arct_dmo" zur IO2-Sammlung beobachten.
Ein noch nicht bearbeiteter Fehler besteht in der Behandlung des SHIFT/LOCK Vectors, dessen Korrektur (aufgrund Platzmangels mir derzeit noch) zu kompliziert ist.
Der Vector "bp_fname" ist ebenfalls nicht ganz in Ordnung, Hinweise dazu weiter unten.
sp -> zähler.w kanäle.l zähler.w parm-$ neu -> len.w = 64 als kontrollzahl auf geradzahliger adresse 64 bytes jobfile-header, darin auf posn 60 der devicename wiederholung der .w-kontrollzahl 64.
.. programm .. move.w (sp),d4 kanäle lsl.w #2,d4 lea 2(sp,d4.w),a4 überspringen moveq #1,d4 add.w (a4)+,d4 parm-$ and.b #-2,d4> add.w d4,a4 überspringen moveq #64,d4 cmp.w d4,(a4) bne.s nohead ? 1. kontrollzahl fehlt add.w (a4)+,a4 cmp.w d4,(a4)+ bne.s nohead ? 2. kontrollzahl fehlt pea -1(a5,a6.l) letzte adresse im job cmp.l (sp)+,a4 bcc.s nohead ? daten nicht im eigenen speicher .. zusatzdaten verarbeiten .. nohead .. programm ..
$68 qsys+ ( basis der qdos-jobtabelle ) 4th-id drop 4* m+ ( index aus eigener qdos-jobnummer addiert ) 2@l ( j.d.t.aus der qdos-tabelle ) 2dup 2@l ( gesamter job-eigener speicherblock ) d+ ( pointer auf dessen ende ) -68 m+ ( anfang des erweiterungsblocks ) 68 ldump ( z.b. seinen inhalt anzeigen )
[zurück]
Die "special jobs" des TK2 sind im Grunde ihres Daseins absolut
nutzlos, rsp. unnötig:
Sie werden als S.Basic-Procedur des aufrufenden Jobs ausgeführt.
Unabhängig davon, ob mit EX, EW oder ET aufgerufen, starten sie sofort
und halten das zugrundeliegende S.Basic an. Diese "Jobs" stellen
zu nur dem Zeitpunkt ihrer Verwendung vorhandene quasi-residente Proceduren
dar. - Wo vielleicht auch der einzige Sinn dieser Jobvariante zu finden sein
könnte, aus einer Zeit resultierend, da Speicher noch byteweise gekauft
wurde...
Vom erhofften "multi threding" oder gar "multi tasking" kann keine Rede
sein. Vom Ansatz her - mit einigem Aufwand - zwar durchaus möglich, auch
Versuche mit den IO2-Aufrufen belegen dies, wird dergleichen aber allein
schon durch die im TK2 kultivierte Freigabe reservierter S.Basic-Datenbereiche
vor(!) Verwendung der dort liegenden Daten unmöglich gemacht.
So ist, wie vermutet, der Nutzen in der Tat höchst zweifelhaft, und
sowie es erneut zu der geringsten Speicherknappheit kommen sollte,
wird diese Variante wieder entfernt werden.
Die Beschreibung im Original ist unvollständig rsp. irreführend oder mißverständlich; für die Verhältnisse innerhalb solcher - nicht wirklichen - Jobs soll folgendes gelten:
Beim Einsprung in den Code:
D4 1, wenn es eine Eingabe-PIPE gibt, sonst 0 D5 1, wenn es eine Ausgabe-PIPE gibt, Kanal-ID im Stack D6 eigene Job-ID D7 Gesamtzahl aller PIESs und Filenamen des Job-Aufrufs A0 Einsprungadresse zur Ermittlung von Filenamen A1 Pointer auf den Parameterstring A3(a6) Anfang der name-table der Parameterübergabe A4 eigener Stackpointer A5(a6) Ende der name-table
Auch zu Parametern, die womöglich übergeben werden können, ist nur diffuses Zeug zu finden. Der Code selbst gibt aufgrund seiner extremen Verworrenheit Informationen nur schwer preis, und Versuche ergaben, daß Parameter, wenn überhaupt, kaum in brauchbarer Form in den Aufrufen ankommen; auch der Stackinhalt ist unsicher.
Für die z.B mit { JSR (A0) } erreichbare Routine gilt:
IN: (A3,A6) erster Parameter in standardgemäßer S.Basic-Konvention OUT: D0 & SR Fehlercode, oder 0 und A1 gilt, oder > 0 und A0 gilt D1-D3 Inhalt zerstört A0 Kanal-ID wenn der Parameter mit führendem "#" übergeben wurde (A1,A6) Pointer auf den als Parameter übergebenen Namen; A1:=0 bei D0>0 - alle anderen Register bleiben unverändert -
In jedem Falle, also auch bei Rückgabe eines String VOR dessen Entnahme, ist der Übergabebereich mit Pointer BV_RIP bereits um die Größe des Datenposten "bereinigt"!
Die etwas seltsame Parameter-Bewertung läuft darauf hinaus:
Eine zweite Hilfsroutine ist über z.B. { JSR 2(A0) } zu erreichen. Mit ihrer Hilfe kann der Kanal zu einem mitgegebenen File- rsp. Device-Namen geöffnet werden:
IN: D3 OPEN-Modus D6 eigene Job-ID (A1,A6) Pointer auf den Namen (darf nicht im S.Basic-Puffer stehen) OUT: D0 & SR Fehlercode D1, D2 Inhalt zerstört A0 Kanal-ID (bei erfolgreichem Aufruf) (A1,A6) Ptr auf den Namen - alle anderen register bleiben unverändert -
Bei Aufgabe rsp. Beendigung des "Jobs" genügt der
gewöhnliche Aufruf der QDOS-Trap MT.FRJOB nicht: Der
Trap ist die wirkliche Job-ID mitzugeben, keinesfalls D1:=-1, da dann auch
der zugrundeliegende S.Basic-Job entfernt würde, und es muß ein
RTS folgen, wobei, wenn das aufrufende Programm nicht mit Fehler (z.B.
err.nc, -1) abgebrochen werden soll, zuvor noch D0:=0 zu setzen ist.
[zurück]
"XTcc"-Felder sind im
QDOS nicht bekannt. Sie entstanden aus der C68-Praxis, um
den Transport über fremde Filesysteme zu erleichtern - wo sie sich
bewährt haben, und weshalb sie hier berücksichtigt werden.
Solch ein Feld besteht aus der an das File-Ende angefügten Textmarke
"XTcc" mit folgendem .L-Wert für den Datenbereich, entsprechend dem
Posten an Position 6 im QDOS-Fileheader.
Aufbau:
..programm.. dc.l 'XTcc',dataspace end der block muß am file- rsp code-ende stehen
[zurück]
Uneinheitliche Fehlerbehandlung im Original (1.89 und 1.97 untersucht) führt zu abweichender Registerbesetzung, falls keine Parameter übergeben wurden, und dann sehr leicht auch zu Irrläufern durch Stackfehler. In M89 wurde beides korrigiert. M97 läßt sich durch Überschreiben des Wertes $6CEC an Adresse $2330 mit $64EE entsprechend ändern.
Da nicht erkennbar ist, ob dies womöglich gar aus irgendeinem (rätselhaften) Grunde bewußt vorgesehen wurde, hier ein Beispiel zur konfliktfrei einheitlichen Fehlerbehandlung:
Nach Prüfung auf Vorhandensein von Parametern ist der Vectoraufruf risikolos:
fname moveq #-15,d0 err.bp vorbereiten pea 8(a3) einheitlich cmp.l a5,a3 bcc.s noname ? keine parameter move.w 328,a1 vector bp_fname jsr $4000(a1) > noname move.l (sp)+,a3 move.l $58(a6),a1 string oder nur sicherer wert tst.l d0 flags für ggf. err.bp ..programm..
Alternative mit besonderer Fehlerbehandlung:
fname pea 8(a3) pea drop_error(pc) move.l $58(a6),a1 move.w 328,a2 vector bp_fname jsr $4000(a2) > addq.l #4,a7 besonderen fehlerausgang wegnehmen move.l (sp)+,a3 bne.s error_exit ? ..programm.. error_exit ..fehlerbehandlung.. drop_error move.l (sp)+,a3 ..sonderfall.. keine parameter vorhanden
[zurück]
Die Folge
e$ = FILL$(100) DIM a$(100) : a$=e$ DIM b$(9,9,100) : b$(3,3)=e$ DIM c$(1,200) : c$(0)=e$ k$ = a$&e$ BGET #chan,e$,a$,k$(81 TO 180),b$(3,3,1 TO),c$(0,100 TO)holt in jeden der angegebenen Strings 100 bytes aus dem Eingabestrom von #kanal.
[zurück]
Nach einer den MINERVA-ROMs beiliegenden Vorlage
MB [parameter$]
Ohne Parameter Start mit kleinem Fenster für Kanal #0, der zugleich
auch als #1 fungiert.
Bis zu 6 solcher Fenster werden im Bild ohne Überschneidung automatisch
angeordnet.
Der Job erhält den Namen 'SB.{nn}' mit {nn} als dessen QDOS-Jobnummer,
wie sie z.B. für die QLIB-Erweiterungen gilt. Besitzer ist jeweils der
aufrufende Job.
Optional ein Parameterstring mit:
[zurück]
Einrichtung zur Programmverfolgung im S.Basic. Der Code entspricht bis auf wenige Details (z.B. Fehlerbehandlung "bp_fname") der dem MINERVA-ROM mitgegebenen Vorlage von J.Oakley.
Am Anfang steht die betr. Zeilennummer.
Es folgen durch Semicola getrennt die einzelnen Befehle mit
ihrer Positionsnummer in der Zeile.
Ein "." Punkt steht für die Ausführung eines
S.Basic-Token.
Locale oder Parameter eines Aufrufs werden durch je eine
"~" Tilde markiert.
Ein "=" Gleichheitszeichen deutet Zuweisungen an Variable
an.
Bei Zuweisungen aus Funktionen wird der Buchstabe "f"
vorangestellt.
[zurück]
Die "HISTORY" von Mr.T? (SMSQ/E) ist ein einfacher String-Stack, Kanal-bezogen oder in global zugänglicher Form. Sie wurde NICHT nach T6 übertragen, könnte aber bei überwältigend deutlich geäußertem Bedarf möglicherweise gleichartig nachgesetzt werden...
[zurück]
Die vollständige Beschreibung der nach T6 unverändert übernommenen Command Line History von Boris Jakubith befindet sich als QUILL-Dokument im T6-Archiv. Hier als Kurzreferenz:
Der ursprüngliche Name wurde, um Konflikte mit dem im SMSQ/E später "aufgetauchten" Device gleichen Namens zu vermeiden, geändert:
Als <kanal> gelten S.Basic-Kanäle mit führendem "#"-Zeichen oder QDOS-Kanalnummern.
Zusätzlich in T6:
Ablage automatisch mit <ENTER>, identische
Eingabezeilen werden nicht erneut aufgenommen.
Auswahl und "Blättern" in den vorherigen Zeilen durch
Cursor hoch/runter,
Übernahme in die Eingabe durch <ENTER>, ggf. nach
vorherigem Editieren der betr. Zeile.
History mit max. 100 Zeilen z.B. für den S.Basic-Kanal #0:
HIS_DEF#0,100
Mit der Command Line History wird ein Stapel eingerichtet, in dem alle Eingabezeilen eines CON-Fensters, dem eine solche History zugeilt wurde, der Reihe nach abgelegt und in der umgekehrten Reihenfolge ("LIFO"-Speicher, jüngster Posten zuerst) bei Bedarf entnommen werden. Die Erweiterung hat sich in ausnahmslos allen QDOS-artigen Systemen bewährt.
Das HIS-Device tritt zu Anwendungen hin nicht in Erscheinung; es besteht überlagernd und parallel zur CON-Definition, bei deren Kanälen es ggf. nach den Traps io.edlin und io.fline aktiv wird. Der Name wird nur für den direkten Zugriff z.B. aus Assemblerprogrammen benötigt.
[zurück]
Mit dieser Funktion können die S.Basic-Variablen aus in Strings zusammengesetzten Namen gelesen werden - vergleichbar mit der aus dem "ARCHIVE"-Interpreter bekannten Weise.
Wenn etwa die Namen "CMD1", "CMD2", "CMD3" existieren, so holt folgende Programmsequenz deren Werte in ein Array:
DIM V$(3,300) FOR r = 1 TO 3 : v$(f) = PARVAL('CMD'&f)
Eine zweite Variante erlaubt den mit der Positionsnummer indizierten Zugriff auf die Variablen aus der Parameterliste von Proceduren und Funktionen im S.Basic:
DEFine PROCedure TEST ( x,y,z ) LOCal a,b,c,l,r l = 0 FOR r = 1 TO PARM%(x,y,z) e$ = PARVAL(#r) a = LEN(e$) : IF a > l : l=a END FOR r p = f-1 DIM p$(p,l+1) FOR r = 0 TO p: p$(r-1) = PARVAL(#r-1)
p hat dann die Anzahl übergebener Variabler, deren Werte stehen in
p$.
Die Funktion PARM%( parameterliste ) aus IO2 kann benutzt werden, um die
Position des letzten besetzten Parameters zu ermitteln. Ohne IO2 kann der
Fall e$="-7" als Signal zum Verlassen der FOR-Schleife dienen; dies ist der
von PARVAL zurückgegebene Fehlercode bei Indices außerhalb des
gültigen Bereichs.
Nebenbei:
Eine erweiterte und vielseitigere Form ist mit Namen "VGET" im Teil "sv0"
der IO2-Sammlung enthalten. Damit
lassen sich z.B. auch ausführbare Namen von residenten
Proceduren und Funktionen samt zu übergebenden Parametern Job-bezogen (so
z.B. auch, wenn sie nur in anderen Jobs bekannt sind) aus zusammengesetzten
Strings aufrufen.
[zurück]
Bei zusätzlicher Angabe für den Typencode werden nur die entsprechenden Namen angezeigt:
Der Code für Directory-Files ist im wirklichen QL stets 255, sonst aber nicht unbedingt in allen QDOS-artigen Systemen derselbe (THOR!). Er kann z.B. mit Hilfe von HGET ermittelt werden:
HGET\"win2_",typ,typ,typ (die ersten beiden posten interessieren hier nicht)Damit systemunabhängige (aber langsamere) Anzeige nur von Directories:
d$="win2_":HGET\d$,t,t,t:DIR d$&"a_",toder auch - etwas einfacher - mit FTYP:
d$="win2_":DIR d$&'a_',FTYP(\d$)
[zurück]
Hiermit ist ein wenig salopp und ungenau die unbestimmte Ergänzung
fehlender Textteile in (File-)Namen bei einigen Kommandos des TK2 angedeutet.
Gelegentlich finden sich kritische Anmerkungen dazu und zu der "Tatsache",
daß sie fehlerhaft oder nicht sonderlich brauchbar seien - was m.E.
bei aller sonstigen Kritik am TK2 kaum zutrifft.
Zur Klärung darum kurz die Beschreibung aus dem TK2-Handbuch:
"'wild card'-Namen sind eine besondere Art Filenamen, von denen ein Teil als 'wild card' gilt [wie aufschlußreich!] und durch eine beliebige Zeichenfolge ersetzt werden kann. Da der Handlichkeit halber solche Namen normale S.Basic-Namen sein sollen, können sie keine Sonder-, Satz- oder Rechenzeichen enthalten; so würde bei einem Namen myfiles_*_asm etwa der Interpreter die Multiplikation von myfiles_ mit _asm versuchen, nicht aber einen Namen erkennen. Darum gilt hier vereinfachend, daß jeder fehlende Teil eines Filenamen als 'wild card' behandelt wird.
Z.B. findet
WDIR win2_a_tk_t6m97_asm
auch alle Varianten der Art
win2_a_tk_t6m97-nummer_asm
Nötigenfalls wird der wc-Name durch Voranstellen der Datenverzeichenis-Vorgabe ergänzt.
Womit die knappe Beschreibung endet.
So kann z.B. Einsatz der Devicevorgabe auch merkwürdige Namen erzeugen, wie etwa "win2_x_mdv2_x_filename", wenn das in einem voll spezifizierten Filenamen angegebene Device nicht vorhanden ist. Hiergegen gibt es kein verallgemeinerbares Mittel, da nie bekannt ist, welche Devices in einem System zu einen gegebenen Zeitpunkt vorhanden sein werden.
Weiter ist der Zeichenvergleich von der
Schreibweise unabhängig
beabsichtigt und nicht etwa Fehlfunktion, zu welcher Annahme die Tatsache
verleiten mag, daß er im Original keineswegs immer richtig
durchgeführt wird. Dabei ist dieser Fehler aber nicht im QDOS und dem
gerne als Ursache angesehenen QDOS-Vector zu suchen, sondern allein
im TK2 selbst.
Dies wurde mit T6 korrigiert.
Vergleich in Abhängigkeit auch von der Schreibweise der Filenamen ist im S.Basic nicht vorgesehen und wird auch mit T6 nicht durchgeführt. Die daraus mit z.B. dem UQLX erwachsenden Schwierigkeiten müssen dort beseitigt werden. Entsprechende Änderungen im S.Basic rsp. T6 wären nicht QDOS- rsp S.Basic-konform und sind nicht beabsichtigt.
[zurück]