5.2.4 ** Traps des Pointer-I.F
Trap #3 Op-Codes sind bis zur Obergrenze der möglichen Angaben definiert.
Lücken bei $75 und $79.Beschreibung aktualisiert anhand der PIF-Version 1.71.
IOP.FLIM IOP.FLIM 3 / 108 $6C Ermitteln der äußeren Grenzwerte eines Fensters - outline IN: OUT: D2 0 A1 Adr des Datenblocks A1 Adr des Datenblocks ERR.BP -15, auch wenn D2 =/= 0Im Datenblock als Bildschirmkoordinaten:0(A1) Breite
2(A1) Höhe
4(A1) X-Ursprung
6(A1) Y dto.
IOP.SVPW IOP.SVPW 3 / 109 Teilfenster sichern. "save part of window" IN: OUT: D1 rel Ursprung D1 Adr der Ablage des zu sichernden Bereichs D2 Null oder Breite | Höhe für die Ablage A1 Adr des Datenblocks mit den Bildschirmmaßen des Ausschnitts A2 Adr des Ablagebereiches ERR.OR -4 Teilfenster überragt OL/AblagebereichBei D2 =/= 0 wird ein entsprechender Speicherbereich neu zugewiesen und dessen Größe in D2 zurückgegeben.
ERR.OM -3
Bei D2 = 0 wird der mit A2 bezeichnete Speicherbereich benutzt.
An verschiedenen PIF-Versionen beobachtet:
- Besitzerjob des mit D1 bezeichneten Speicherblocks ist ungewiss.
- Bei Fehlschlag der Speicherzuteilung bleibt der im PIF zugewiesene Speicherbereich u.U. bestehen, ohne daß D1 seine Adresse zurückgibt. Er kann darum auf ordentlichen Wegen nicht mehr freigegeben werden. Weil er zudem eher zufällig einem Job als Besitzer zugeteilt wird, kann er auch nicht durch Aufgabe des Jobs freigemacht werden, aus dem der fehlerhafte IOP.WSAV-Aufruf kam.
Dieser Fehler tritt in den jüngeren Versionen nicht mehr auf (z.B. 1.71).
IOP.RSPW IOP.RSPW 3 / 110 Teilfenster aus dem Speicher holen IN: OUT: D1 rel Ursprung D2 =/= 0 erhält Ablage, sonst Auflösung des Speicherbereiches A1 adr, Datenblock mit den Bildschirmmaßen des Teilfensters ERR.OR -4 Teilfenster überragt OL/Ablagebereich
IOP.SLNK IOP.SLNK 3 / 111 Daten im Linkblock setzen IN: OUT: D1.W Position im Linkblock D2.W Anzahl Bytes A1 Pointer zu den Daten A1 Adr. des Linkblocks
Nur mit größter Sorgfalt zu verwenden, da (zweckbedingt) völlig ungeschützt.
Zu große oder falsche Werte in D1/D2 können das gesamte System beschädigen.
IOP.PINF IOP.PINF 3 / 112 Pointer-Information IN: OUT: D1 PTR-Version ASCII codiert A1 Window Manager Vektor ERR.NC -1 bei unzugänglichem Kanal(!)
ERR.BP -15 Pointer Interface nicht installiert
IOP.RPTR IOP.RPTR 3 / 113 Pointer lesen IN: OUT: D1 X | Y Bildkoordinaten D1 X | Y Pointer-Koordinaten D2.B Abbruchtabelle D3 -1 A1 Ptr zum Pointer-Record
Mit D1 wird überprüft, ob sich der Pointer bewegt hat.
Die Koordinaten sind auf das Gesamtbild (nicht Fenster) zu beziehen.Die Bits der Abbruchtabelle bestimmen, welche Ereignisse zum vollständigen Abschluss der Operation führen:
0 Taste oder Mausknopf im Fenster betätigt oder Fenster-Änderung;
Sprite der Bewegung zeichnen.1 Taste oder Mausknopf dauernd gedrückt;
Sprite der Formatänderung zeichnen2 Taste oder Mausknopf wird losgelassen 3 Pointer entfernt sich von den angegebenen Koordinaten 4 Pointer außerhalb des Fensters 5 dto., innerhalb 6 -/- 7 Abfrage des Trefferbereiches (hit area)
Bit 7 gilt nur mit Bits 0 und 1, alle anderen dürfen nicht gesetzt sein.
Sind Bit 4 und Bit 5 gesetzt, erfolgt Rückkehr sofort auch bei geschlossenem Fenster.
Während der Abfrage sind alle anderen Fenster geschlossen und nur im oberen Fenster des Pile gilt die Eingabe.24 Bytes Pointer-Record:
Das PIF ermittelt im Pile der Primärfenster das erste, in dessen Trefferbereich sich der Pointer befindet. Liegt diese Stelle bei einem Fenster ohne Definitionsliste außerhalb des durch SD.WDEF gesetzten aktuellen Bereiches, gilt das als Bereichsüberschreitung.
00 ID des Primärfensters oder -1 bei Bereichsüberschreitung 04 .w Teilfenster oder -1 bei Hauptfenster 06 .w X-Position des Pointers im (Teil-)Fenster 08 .w Y dto. 10 .b 0 kein Tastendruck, =/=0 Tasten- oder Maus-Code 11 .b 0 keine Taste unten, =/= 0 Taste/Mausknopf gedrückt 12 Ereignis-Vektor, nur niederwertiges Byte bestimmt (s.u.) 16 .w *4 Größe und Ursprung des (Teil-)Fensters 24 Referenzadresse des Fensters Die hier gültigen Bits im "event"-Vector: 0 Taste kurz betätigt ("click") 1 Taste festgehalten 2 Taste ist freigegeben 3 Ptr wurde bewegt 4 Ptr außerhalb des Fensters 5 Ptr im Fenster 6 Ptr hat Bildschirmgrenze erreicht 7 8 ... 23 Window-Manager "event"-Bits (hier nicht besetzt(?) 24 ... 31 Job-"event"-Bits, soweit diese Auslöser der Rückkehr sind
Dann beziehen sich die Koordinaten für den Pointer auf den Ursprung der Bildschirmkoordinaten.
Befindet sich der Pointer nicht in einem Teilfenster, wird -1 als dessen Nummer angegeben und die Koordinaten beziehen sich auf das Hauptfenster.
Gibt es keine Definitionsliste, beziehen sich die Koordinaten auf den Ursprung der aktuellen Fensterdefinition.
IOP.RPXL IOP.RPXL 3 / 114 Pixel-Farbe lesen IN: OUT: D1 X | Y Koordinaten D1 ermittelte Position | Farbe D2 Suchschlüssel und -farbe
Suchschlüssel in den Bits von D2IOP..GCL 16 mit angegebener FarbeBei erfolgloser Abtastung kommt im höherwertigen Wort D1 = -1 zurück.
IOP..SDR 17 nach unten rechts
IOP..SLR 18 von links nach rechts
IOP..SSC 19 dieselbe Farbe suchen
IOP..SCN 31 Abtastung angefordertERR.OR -4 X,Y nicht im Fenster
IOP.WBLB IOP.WBLB 3 / 115 Blob zeichnen IN: OUT: D1 X | Y Koordinaten A1 Ptr zur BLOB-Definition A2 Ptr zur PATTERN-Definition ERR.OR -4 X,Y nicht im Fenster
IOP.LBLB IOP.LBLB 3 / 116 Linie aus Blobs zeichnen IN: OUT: D1 X | Y Startpunkt D1 Endpunkt D2 Endpunkt (ausschließlich) A1 Ptr auf Blobdefinition A2 Ptr auf Musterdefinition A2 aktualisiert ERR.BP -15 Definition wurde nicht gefundenFehler beim "clipping": Wenn die Koordinaten in Richtung oben links überlaufen, kann es durch Rechenfehler, bei denen der Aufruf in einer endlosen Schleife hängenbleibt, zum Überschreiben der Systemvariablen kommen.
IOP.WSPT IOP.WSPT 3 / 117 Sprite zeichnen IN: OUT: D1 X | Y Koordinaten A1 Ptr auf Sprite-Definition oder Nummer eines vordefinierten Sprite ERR.OR -4 X,Y nicht im FensterStandard-Sprites:
ERR.BP -15 Fehler in der Datenstruktur, Definition nicht gefunden
0 SP.ARROW Pfeil 1 SP.LOCK Vorhängeschloss 2 SP.NULL Leeres Fenster 3 SP.MODE MODE falsch (4 oder 8) 4 SP.KEY Tastatur-Eingabe 5 SP.BUSY Sperrzeichen 6 SP.WMOVE Fenster-Bewegung 7 SP.WSIZE Fenster-Änderung
IOP.SPRY IOP.SPRY 3 / 118 Blob durch Maske hindurch pixelweise zeichnen IN: OUT: D1 X | Y Koordinaten D1 X | Y Koordinaten D2.W Anzahl der Füllpixel A1 Ptr zum Blob A2 Ptr zur Maske (pattern) ERR.OR -4 X,Y nicht im Fenster
IOP.FILM IOP.FILM 3 / 121 Bildschirmmaße festlegen IN: OUT: D1 D1 (?) D2 (?) Keine (annehmbare) Dokumentation hierzu verfügbar.Mit Aufruf dieser Trap wird der Inhalt von D1/D2 an der Stelle $E0/$E4 ab Handler-Basis (intern A3) eingetragen. An diesen ebensowenig dokumentierten Adressen liegen in den untersuchten (re-assemblierten) PIF-Versionen die hardware-bezogenen Bildschirmmaße für den Pointer (als Bild, nicht Adresse) des PIF.
IOP.OUTL IOP.OUTL 3 / 122 Fensterbereiche definieren IN: OUT: D1 X | Y Schattenbreite D1 verdorben D2 (s. unten) A1 Ptr auf Fenstermaße ERR.OR -4 Fenster außerhalb des BildschirmsBits von D2:IOP..SET 0 gerade erledigtA1 weist auf einen Datenblock mit Wort-Werten für Breite, Höhe, Ursprung.
IOP..MOV 1 Inhalt mitnehmen und Maße einrichten
Die OL entsteht durch Hinzufügen der Schatten-Breite. Zugleich wird (nicht ganz fehlerfrei) bei Sekundärfenstern der darunterliegende Bereich im Speicher gesichert.
Das PIF erkennt ein so definiertes Fenster als "verwaltet" (managed).
Danach folgende SD.WDEF-Aufrufe berühren den Trefferbereich.
IOP.SPTR IOP.SPTR 3 / 123 Pointer positionieren IN: OUT: D1 Punkt Pointerkoordinaten D1 Punkt in Bildkoordinaten D2.B Ursprungsrelation ERR.OR -4 X,Y außerhalb des FenstersD2 mit der Relation für den UrsprungIOP..REW -1 Pointer relativ zum Fenster
IOP..ABS 0 mit absoluter Position I
OP..REH 1 relativ zum Trefferbereich
IOP.PICKK IOP.PICK 3 / 124 Fenster auswählen IN: OUT: D1 Job-ID D1 verdorben D2 0 ERR.NJ -2A0 muß mit irgendeiner gültigen Fenster-ID besetzt sein.
Für D1 gilt:
D1=Job-ID holt das Primärfenster an die Spitze des Pile.
-1 befördert stattdessen das untere Fenster dorthin.
-2 markiert Fenster der Kanal-ID als nicht verriegelbar.
-3 Bild und Ptr einfrieren
IOP.SWDF IOP.SWDF 3 / 125 Liste von Teilfenstern einrichten IN: OUT: A1 Ptr zur Teilfenster-Liste oder Null
Die Liste endet mit Null (ungerade Adresse), sie besteht aus einer Anzahl Ptr (.L) auf die Records von Teilfenstern:sw_xsize $00 .w (Teil-)Fenster-X-Größe (Breite) in Pixeln
sw_ysize $02 .w (Teil-)Fenster-Y-Größe (Höhe) in Pixeln
sw_xorg $04 .w X-Ursprung des (Teil-)Fensters
sw_yorg $06 .w Y-Ursprung des (Teil-)Fensters
sw_wattr $08 4.w Attribute: Freiraum, Rand, Randfarbe, Papierfarbe
sw_psprt $10 .l Ptr auf Pointer-Sprite für das Teilfenster
IOP.WSAV IOP.WSAV 3 / 126 Fenster-Bereich sichern IOP.WRST IOP.WRST 3 / 127 Fenster-Bereich aus dem Speicher restaurieren IN: OUT: D1 WSAV : Null oder Bereichslänge D2.B WRST : =/= 0 Erhalt des Speicherbereichs A1 Null oder Adresse des Speicherbereichs ERR.OM -3 SpeicherüberlaufDie Daten auf einem mit A1 gesondert zugewiesenen Speicherbereich sind gegen Überschreiben durch das PIF geschützt. Bei Null in A1 oder D1 gelten die Daten der Fensterdefinition.