ERKLÄRUNGEN Zu SYSEXT und WATCH SYSEXT: Vom Assembler generierten Code an hohe MARK-addr. anhängen. (Bei mir 1MB RAM ab $FC374). Verlängert den Systemcode um 86 Bytes. Der Nucleus dürfte in jedem Fall die Scheibenköpfe noch fangen (im Fall DURASC natürlich der Lader/Linker). (vgl. Handbuch unter DUMP F-I-16) Selbstverständlich kann man auch nur eine der bei- den Scheiben implementieren. 15er Scheibe: Die 'Korrektur' der Tastaturcodes durch eine 15er Scheibe wurde gewählt, weil bei dirkektem Eingriff in den Systemcode das Sicherungssystem greift. Die Arbeitstabelle wird bei jedem Systemstart (ob kalt oder warm) neu aus der Muttertabelle geholt. (Bei mir von $E8A5A bis $E8CD9 bei V2.1 mini und 1 MB Speichergröße.) Nun wären einfach die Werte da umzuschreiben. Hat man das mit dem MONI getan, ist noch alles ok., doch schon bei Verwendung des MONITORs zeigt sich bei dessen Abschied, daß man im Gefängnis des Sicherungssystems sitzt. Gitter- stäbe (senkrechte Linien) und nichts geht mehr. Auch eine so ge"DUMP"te Bootdiskette bringt den- selben Käfig auf den Bildschirm. So aber setzt die 15er Scheibe den neuen Code in die Arbeitstabelle ein. Jeder Systemstart patcht die gerade (alten) hingeschriebenen Codes wieder um. Es sind dann die Control-Codes wie im Programm PT (PD nr.2 'P'erssons'T'exter) in der Abfrageschleife beschrieben belegt: von vorher $1B = 27 = Esc zu $80, d.h. ohne Wirkung von vorher $1A = 26 zu $1B = 27 = Esc von vorher $1D = 29 zu $1C = 28 von vorher $80 = ohne Wirkung zu $1D = 29 Nachzuweisen mit dem MONI, der mit Cont.Dump eine gute Möglichkeit bietet (wenn auch nur bytweise) Speicherstellen in Veränderungen zu betrachten. Also: Im MONI die Speicherzelle $83E aufsuchen. Dort steht eine Adresse als Basis für Buffer. Addiere zu dieser Adresse $11 = 17 und nimm sie mit CD unter die Lupe. Dieses Byte weist den sedezimalen Code der Tastaturbetätigung auf. ($41 für 'A' usw.) Prüft man den frisch gepatchten Code für , stellt man fest, daß der MONI ja mit Esc =$1B auf neue Befehlseingabe schaltet. Also muß ja der Code $1B = 27 gewesen sein, auch wenn er vielleicht nicht stehengeblieben ist. Sollte dagegen $1A erscheinen, ist der Patch ins Wasser gefallen. Dann müßte wohl noch das liefern. Ob es sich um einen Code handelt, der mit erzielt wurde, zeigt ein Cont.Dump des Bytes $10($83E) (also Adresse, die im Langwort ab $83E steht, mit 16 beaufschlagt (bei mir $D5D10)). Dort ist alles ruhig auf 00 bis ein gültiger Control-Code gedrückt wird. Dann erscheint eine '01'. So lese man das Wort und weiß: IF WORT LT 256 THEN kein Control-Code; ELSE aha!;FIN; vorläufig END. Denkste! Es könnte sich auch um einen der wenigen Alternate-Codes handeln. Dann steht da nämlich eine '02'! Also jetzt weiß mans genau: IF WORT GT 255 THEN nix normal IF WORT LT 512 THEN Control;ELSE Alternate;FIN;FIN; .... MODEND. Wer nun dachte bringt ne '03', der hat wohl die Logik auf seiner Seite aber nicht das System. Mehr als die fünf Codetabellen unterstützt es nicht. Und da ist kein drin. Wer kennt noch mehr so schöne Dinge? z.B. Was rast denn da in $F($83E)? 17er Scheibe implementieren: Die Operation sicherheitshalber mit einer entbehr- lichen Boot-Disk mit DUMP sichern. Kontrolle über einen Hardware-Reset bringt es an den Tag, ob die Diskette ordnungsgemäß bootet. Mit MONITOR prüfen, ob der angefügte Code im Systembereich vorhanden, und evtl. mit dem Beispielprogramm "WATCH" prüfen, ob die Einbaufunktion DURASC richtig arbeitet. Zur Sicherung mindestens eine weitere Boot-Disket- te (muß TOS-mäßig formatiert sein) "DUMPen". Es steht für PEARL-Programme jetzt die Einbaufunk- tion DURASC zur Verfügung. Sie ist im Problemteil mit SPC DURASC ENTRY(CHAR(8),DUR) GLOBAL; zu spe- zifizieren. Mit der Funktion wird der Wert DUR nicht verändert und ein CHAR(8)String Clockformat 'zurückgegeben', der für Ausgabezwecke verwendet werden kann. Damit lassen sich DURATION-Werte im CLOCK-Format ausgeben. Eine Anwendung könnte eine Messung sein, die (nur sekundengenau) die Differenz zweier CLOCK Werte ausgibt. (CLOCK minus CLOCK = DURATION) Also z.B.: im PROBLEM-Teil: "SPC DURASC ENTRY(CHAR(8),DUR) GLOBAL;" im PROBLEM-Teil, falls Modulglobal, oder in der TASK oder PROCEDUR, falls begrenzt: "DCL DURATEMP DUR; DCL (CLKTEMP0,CLKTEMP1) CLOCK; DCL CH8 CHAR(8);" ... zu Beginn der Operation: "CLKTEMP0 = NOW;" operation ... "CLKTEMP1 = NOW; DURATEMP = CLKTEMP1-CLKTEMP0; CALL DURASC(CH8,DURATEMP); PUT CH8 TO TY BY SKIP,A,SKIP;" Auf dem Bildschirm müßte die verstrichene Zeit in HRS:MIN:SEC zu sehen sein. ZU WATCH: Ein Beispiel für die zusätzliche Einbaufunktion DURASC. Die Speicherzellen $88A und $88E habe ich durch Studium der Betriebssystemroutinen gefunden. Alle "Zeitnehmer" bedienen sich daraus. So scheint eine gewisse Gewähr auf Dauer zu be- stehen. Es ist nach meiner Erfahrung nicht möglich, mit dieser Einbau- funktion über 23:59:59 hinauszukommen. Auch bei permanent in- krementierten DURATION-Werten schaltet die Geisterstunde auf 00:00:00. Daher die Einschränkung nicht nur in bezug auf die lediglich sekundengenaue Angabe, sondern auch auf höchstens 24 Stunden. (Wie es sich für 'CLK'SC (CLOCK->ASCII) gehört.) Der Anschluß dürfte recht schnell sein. Für Hinweise auf Bugs und Anregungen dankbar, aber auch immer scharf auf Systemadressen: Martin Damm, Johann-Sebastian-Bach-Straße 7 3060 Stadthagen