home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
M.u.C.S. Disc 2000
/
MUCS2000.iso
/
anwend
/
arthur
/
arthrdem
/
module
/
develop.txt
Wrap
Text File
|
1998-06-09
|
12KB
|
336 lines
Suchmodule für Arthur ab Version 1.8
Suchmodul-Formatbeschreibung
+---------------------------------------+----------------------------------------+
Ab Arthur 1.8 ist es ja nun möglich auch eigene Suchmodule einzubinden.
Um dem geneigten Programmierer das Format der Module näher zu bringen,
soll dieser Text dienen.
Möglich wäre dann beispielsweise auch eine Nummernbibliothek mit dem zugehörigen
Suchmodul. Das Bibliotheksformat bietet hierfür die Möglichkeit an, ein bestimmtes
namentliches Suchmodul vorzugsweise zu verwenden.
Übrigens:
Wer ein Modul schreibt, da₧ mit intelligenter und lokaler Suche um
einiges schneller ist als die in Arthur eingebauten und es dem Arthur-Paket
zur Verfügung stellt, bekommt Arthur für die Versandkosten =:)
+---------------------------------------+----------------------------------------+
Der Text ist in folgende Kapitel gegliedert:
1.0 · Richtlinien/Hinweise zum Modul
2.0 · Der Modul-Header
3.0 · Aufbau der Modul-Infostruktur
4.0 · Fehlercodes
5.0 · Übergabeparameter über den Stack
6.0 · Übergabe im Assembler-"Header"
7.0 · Vorhandene, anspringbare Routinen von Arthur
8.0 · Arthur-Bibliotheks-Format V1.8
+---------------------------------------+----------------------------------------+
1.0: Modulhinweise:
+---------------------------------------+----------------------------------------+
~ Parameter werden nach Wunsch von Arthur über den Stack
oder über einen ASM-Header übergeben.
~ Die Register werden von Arthur komplett gerettet.
~ modale Dialogboxen, Zeichenfunktionen erlaubt (über-
gebenes VDI-Handle verwenden)
~ Speicheranforderungen erlaubt, müssen aber vor Ende
freigegeben werden.
~ Rücksprung nur mit rts.
(Das Modul wird als ein Unterprogramm von Arthur betrachtet.)
~ die geladene Bibliothek ist auf Kompatibilität geprüft.
~ die Buchstaben eines übergebenen Suchstrings sind bei
Option "Gro₧/Klein egal" schon alle Gro₧.
~ maximal 256 Ergebnisse
~ Hinweise zu den Rückgabeparametern (in D0):
· Anzahl Ergebnisse, wenn Suche erfolgreich.
· Bei einem Fehler sollte das Modul in D0 einen Zeiger auf
einen nullterminierten Alertstring oder einen Fehlercode kleiner 0
(siehe Fehlercodes) zurückliefern.
· Der Rückgabewert Null besagt, da₧ das Gesuchte nicht gefunden wurde.
· Anzahl durchsuchter Bibliothekseinträge als Long ab Buffer schreiben.
~ Die Bibliotheksdaten dürfen natürlich nicht verändert werden.
+---------------------------------------+----------------------------------------+
2.0: Der Modul-Header
+---------------------------------------+----------------------------------------+
Der Modul-Header, der vor das Assemblierte Modul
gelinkt werden muss (64 Byte Länge):
================================================
Offset Format Wert Beschreibung
------------------------------------------------------------
00 Long 'AMOD' Identifikation
04 Long $0 reserviert
08 Long $0 reserviert
12 Long $FF2253 fest
16 Long ? Branch auf eine Struktur zur
Modulinformation (Autor, Version..)
oder Null.
20 Long ? Branch auf Suchroutine
oder Null (dann nimmt Arthur die Adresse
des geladenen Moduls + Header als
Unterprogrammadresse an).
24 Long 'V1.0' Modulversion
28 Word ? Bitvektor:
Bit Beschreibung
--------------------
0 gesetzt = Modul Speicherresistent
1 gesetzt = Werte über ASM-Header
(siehe ASM-Header)
2 gesetzt = wind_update() setzen
3 gesetzt = beg_update() setzen
4 gesetzt = Maus auf "Busy" setzen.
(kann aber auch das Modul machen).
5-15 reserviert
30-45 Byte ? gewünschter Popuptext (Nullterminiert)
46-63 Byte ? freier Text (Nullterminiert)
Ggf. ist Nichtverwendetes mit Wert Null zu füllen.
+---------------------------------------+----------------------------------------+
3.0: Modul-Infostruktur:
+---------------------------------------+----------------------------------------+
Die Modul-Infostruktur dient zur Ausgabe einer Info über das Modul (Autor,
Modulversion etc.).
Die Modul-Info wird aufgerufen, wenn ein Anwender im Popup-Menü einen
Eintrag mit Shift anwählt.
Die Info kann sein:
· Ein nullterminierter Alertstring, der dann von Arthur als Alert im Fenster
dargestellt wird,
· oder etwas Eigenes (modal).
Der Strukturaufbau als Alert:
-----------------------------
infostrukt: dc.l -1 ; Alertstring
dc.b '[1][Beispielinfo eines|Arthur-Suchmoduls][ OK ],0
Der Strukturaufbau bei Eigener Infodarstellung:
-----------------------------------------------
infostrukt: dc.l infofunc ; Branch auf Info-Routine (rts verwenden!)
(Die Register werden von Arthur gerettet)
+---------------------------------------+----------------------------------------+
4.0: Fehlercodes:
+---------------------------------------+----------------------------------------+
-39 nicht genügend Speicher
-107 fehlerhafte Bibliotheksdaten
-109 fehlerhafte Parameter
-110 fehlerhafte Bibliotheksadresse
-111 fehlerhafte Suchstringadresse
-112 fehlerhafte Bibliothek
-113 falsches Bibliotheksformat
-114 keine Grafikausgaben möglich
-115 unbekannter Fehler
-116 Suche nicht möglich
+---------------------------------------+----------------------------------------+
5.0: Übergabeparameter:
+---------------------------------------+----------------------------------------+
Stackpos Format Beschreibung
------------------------------------------------------------
00 Long Rücksprungadresse
04 Word ap_id von Arthur
06 Word Arthur-VDI-Handle
08 Word Bitvektor der Arthur-Suchoptionen:
Bit Bedeutung
-----------------
0 Gross/Klein egal
1 intelligente Suche
2 Suchbeschränkung aktiv
(im High-Byte steht dann die max. Ergebnisanzahl)
10 Long Adresse Arthur-Basepage
14 Long Adresse Bibliothek
18 Long Adresse eines 512 Bytes gro₧en, frei nutzbaren Buffers ab
dessen Anfang der Suchstring steht.
22 Word Länge des Suchstrings
24 Long Adresse Ergebnispointerspeicher (256 * 4 Longs)
28 Long Adresse der Decodier-Routine (siehe decode-Aufruf)
32 Long Adresse der String-Exist-Routine (siehe string_exist-Aufruf)
36 Long Adresse der Upper-Routine (siehe upper-Aufruf)
+---------------------------------------+----------------------------------------+
6.0: Übergabe über einen Assembler-"Header":
+---------------------------------------+----------------------------------------+
Wie übergabeparameter, nur ID 'ASMP' ersetzt die Rücksprungadresse.
Auf dem Stack steht dann nur die Rücksprungadresse.
Sinn dieser Möglichkeit ist die Übergabe der Parameter in schon
festgelegte Variablen, die am Anfang des Programmes deklariert sind
(z.Bsp. mit EQU). Die Parameter werden dann nicht über den Stack
übergeben, sondern einfach in das Modul geschrieben (sofern im Header
das Bit zum einschalten dieser Funktion gesetzt ist).
Zum Beispiel:
id: dc.l 'ASMP'
arthur_ap_id: dc.w 0
vdi_handle: dc.w 0
bitvec: dc.w 0
arthur_basepage: dc.l 0
library: dc.l 0
buffer: dc.l 0
search_strlen: dc.w 0
erg_pointermem: dc.l 0
decode_adr: dc.l 0
string_exist_adr: dc.l 0
upper_adr: dc.l 0
Werte mit Null belegen, Arthur schreibt dann, wie schon erwähnt, dort
die Parameter hinein.
+---------------------------------------+----------------------------------------+
7.0: Vorhandene, anspringbare Routinen von Arthur:
+---------------------------------------+----------------------------------------+
Die nun folgenden Routinen sind Arthur-Routinen, die vom Modul angesprungen werden
können bzw. müssen (bei decode notwendig).
decode: Routine zum decodieren eines Eintragstextes.
-------
Aufruf:
move.l stradr,-(sp) ; Stringadresse auf den Stack
move.w strlen,-(sp) ; Stringlänge auf den Stack
jsr decode ; anspringen
lea 6(sp),sp ; Stack restaurieren
Rückgabewert: keiner
Das Unterprogramm verändert die Register D0, D1 und A1 und beendet
sich mittels rts. Die Routine prüft auf Stringlänge Null.
upper: Wandeln eines Strings von Klein nach Gro₧
------
Aufruf:
move.l stradr,-(sp) ; Stringadr. auf den Stack
move.w strlen,-(sp) ; Stringlänge auf den Stack
jsr upper ; anspringen
lea 6(sp),sp ; Stack restaurieren
Rückgabewert: keiner
Das Unterprogramm verändert die Register D0, D1 und A1 und beendet
sich mittels rts. Die Routine prüft auf Stringlänge Null.
string_exist: prüfen auf Vorhandensein eines Strings in einem anderen
-------------
Aufruf:
move.l stradr1,-(sp) ; Stringadr. auf den Stack
move.l stradr2,-(sp) ; Stringadr. auf den Stack (gesuchter String)
move.w strlen1,-(sp) ; Stringlänge auf den Stack
move.w strlen2,-(sp) ; Stringlänge auf den Stack (gesuchter String)
jsr string_exist ; anspringen
lea 12(sp),sp ; Stack restaurieren
Rückgabewert: 0 = nicht gefunden, -1 = gefunden
Das Unterprogramm verändert die Register D0-D3, A0 und A1 und beendet
sich mittels rts. Die Routine prüft auf Stringlänge Null. Beide
Strings können unterschiedlich gro₧ und der Suchstring kann auch grö₧er
als der Quellstring sein.
+---------------------------------------+----------------------------------------+
8.0: Arthur-Bibliotheksformat V1.8:
+---------------------------------------+----------------------------------------+
Offset Länge(in Byte) Beschreibung
--------------------------------------------------------------------------------
0 14 Identifikation 'ArthurLIB V1.8'
14-24 max. 10 (Optional)Popup-Name des vorzugsweise zu
verwendenden Suchmoduls. Rest ist mit Nullbytes zu
füllen.
25-31 6 Reserviert, mit Nullbytes zu füllen
dann die Bibliotheks-Gesamteinträge:
------------------------------------
Format Beschreibung
-------------------------------------------------------------------------------
Byte Länge des gesamten Eintrages (dieses Längenbyte ausgenommen)
Byte Länge des Eintrages
... der codierte Eintrag
Byte Länge der Übersetzung des Bibliotheks-Eintrages
... die codierte Übersetzung
Byte Nullbyte
...und so weiter, bis die Länge des Gesamteintrages Null ist:
Long Bibliotheksende (Null)
+---------------------------------------+----------------------------------------+
Das wars, viel Erfolg!
Vorschläge zur Modulschnittstelle nehme ich gerne entgegen.
09.06.1998
Arthur-Modulschnittstelle V1.0
Richard Gordon Faika