home *** CD-ROM | disk | FTP | other *** search
-
- ;****************************************************************************
- ; OOMA.i Definitionen für Objektklasse
- ;
- ; Copyright by Dietmar Heidrich, Blenderstraße 60, 28279 Bremen, Germany
- ;
- ; Diese Datei darf nur in Benutzung mit dem Optimierenden Makro-Assembler
- ; verwendet werden.
- ;****************************************************************************
-
- IFND OOMA_I
- OOMA_I EQU 1
-
- IFND EXEC_TYPES_I
- INCLUDE "exec/types.i"
- ENDC
-
- ;****************************************************************************
- ; Klassen- und Objekt-Grundstrukturen. Klassen werden dynamisch über die
- ; Prozedur "RegisterClass" angemeldet und nach Anmeldung aller Klassen mit
- ; der Prozedur "InitializeClasses" initialisiert. Erst danach dürfen Objekte
- ; erzeugt werden.
- ; Die Objektklasse "ClassObject" ist die Grundklasse aller anderen Klassen.
-
- STRUCTURE Class,0
- APTR class_pSuper ; Zeiger auf Superklasse
- ULONG class_lObjectSize ; Größe eines Objektes
- APTR class_pUserData ; Möglichkeit, Klassendaten zu erweitern
- APTR class_pSucc ; PRIVAT
- APTR class_pArray ; PRIVAT
- UWORD class_wFlags ; PRIVAT
- UWORD class_wClassSize ; Größe dieser Struktur
- LABEL class_fMethods ; Beginn der Methodentabelle
- LABEL class_SIZEOF
-
- STRUCTURE Object,0
- APTR object_pClass ; Zeiger auf Klasse
- LABEL object_SIZEOF
-
-
-
- ; Makro zum Deklarieren einer Klasse. Klassencontainer sollten im BSS-Hunk
- ; unterkommen. Die Klasse MUß im Quelltext vor den Methoden deklariert
- ; werden, da eine Information zum Superklassenaufruf verzeichnet wird.
- ; Der Klassencontainer wird hier automatisch exportiert.
-
- DEFINECLASS MACRO Name,ClassSize
- EXPORT \1
- CNOP 0,2
- \1 ds.b \2
- This_Class set \1
- ENDM
-
-
-
- ; Makro zum Deklarieren einer Methode. Methodenlabel unterscheiden sich von
- ; MethodenIDs durch das Präfix "m_".
-
- METHODBODY MACRO MethodID
- m_\1 CNOP 0,2
- ENDM
-
-
-
- ; Zum Initialisieren des Klassencontainers muß angegeben werden, welche
- ; Methoden in dieser Klasse vorhanden sind. Das geschieht durch ein Feld, das
- ; mit Hilfe des OVERWRITE-Makros definiert wird. Das Feld muß durch ein
- ; Nullwort abgeschlossen werden, was ENDOVERWRITE übernimmt.
-
- OVERWRITE MACRO MethodID
- dc \1
- dc.l m_\1
- ENDM
-
- ENDOVERWRITE MACRO
- dc 0
- ENDM
-
-
-
- ; Makros zum Deklarieren von MethodenIDs. Von jeder Klasse muß die Größe des
- ; Klassencontainers bekannt sein, daher sollte sie über den Makro ENDMETHOD
- ; definiert werden. An der Stelle können Unterklassen dann die Methoden-
- ; tabelle korrekt fortsetzen.
-
- BEGINMETHOD MACRO SuperClassSize
- Method_count set \1
- ENDM
-
- DEFINEMETHOD MACRO MethodID
- \1 equ Method_count
- Method_count set Method_count+4
- ENDM
-
- ENDMETHOD MACRO ClassSize
- \1 equ Method_count
- ENDM
-
- SAMEMETHOD MACRO NewMethod,OldMethod
- \1 equ \2
- ENDM
-
-
-
- ; Als Konstruktur steht die Prozedur "CreateObject" zur Verfügung.
-
- ; Für Fälle, in denen ein Objekt z.B. auf dem Stack liegt, kann der folgende
- ; Makro verwendet werden, damit der Klassenzeiger des Objekts stimmt. Dann
- ; ist allerdings das Objekt noch nicht auf Null initialisiert.
-
- INITOBJECT MACRO ObjectPointer,ClassPointer
- move.l #\2,object_pClass(\1)
- ENDM
-
-
-
- ; Die folgenden Methoden gehören zur Objektklasse:
-
- BEGINMETHOD class_SIZEOF
- DEFINEMETHOD Object_Initialize
- DEFINEMETHOD Object_Cleanup
- DEFINEMETHOD Object_Delete
- ENDMETHOD Object_ClassSize
-
-
-
- ;****************************************************************************
- ; Makros zum Aufrufen einer Methode. Der Objektzeiger muß eine gültige
- ; Adressierungsart und die Methode definiert sein. A6 wird als Freiregister
- ; angesehen und muß u.U. nach einem Methodenaufruf neu geladen werden.
- ; Jede Methode wird mit dem Self-Zeiger (d.h. dem Zeiger auf das Objekt
- ; selber) in A5 aufgerufen. Sofern A5 bereits der Objektzeiger ist, wird A5
- ; nicht auf den Stack gerettet.
- ;
- ; METHOD ist als Direktive im Assembler vorhanden (siehe Handbuch).
- ;
- ; SMETHOD ist der Aufruf der Methode einer Oberklasse. Dieser Aufruf
- ; kann mit Hilfe der folgenden Makros vereinfacht werden:
-
- SUPER MACRO ObjectPointer,MethodID
- IFND This_Class
- FAIL SUPER without Class Descriptor
- ENDC
- SMETHOD \1,This_Class+class_pSuper,\2
- ENDM
-
-
-
- ;****************************************************************************
- ; Das Objektmodul stellt die folgenden Routinen zur Verfügung:
- ;
- ;
- ;
- ; InitObjectModule
- ; Initialisierung des Objektmoduls.
- ; Eingabe: Keine.
- ; Ausgabe: Keine.
- ;
- ;
- ;
- ; RegisterClass
- ; Melde eine Klasse an.
- ; Eingabe: A0: Klassenzeiger.
- ; A1: Superklasse.
- ; A2: Zeiger auf Initialisierungsarray (darf NIL sein).
- ; D0: Objektgröße.
- ; D1.w: Klassengröße
- ; Ausgabe: Keine.
- ;
- ;
- ;
- ; InitializeClasses
- ; Initialisiere alle angemeldeten Klassen.
- ; Eingabe: Keine.
- ; Ausgabe: D0: NIL, wenn alles gut ging. Sonst Zeiger auf Klasse, die
- ; nicht angemeldet worden war (Vererbungsbaum unvollständig).
- ;
- ;
- ;
- ; CreateObject
- ; Erzeuge ein Objekt der in der Klasse verzeichneten Größe. Das Objekt
- ; ist automatisch auf Null initialisiert.
- ; Eingabe: A0: Klassenzeiger.
- ; Ausgabe: D0: Objektzeiger oder NIL.
- ; A0: Klassenzeiger.
- ;
- ;
- ;
- ; CreateObjectNoClear
- ; Erzeuge ein Objekt der in der Klasse verzeichneten Größe. Das Objekt
- ; ist NICHT auf Null initialisiert !
- ; Eingabe: A0: Klassenzeiger.
- ; Ausgabe: D0: Objektzeiger oder NIL.
- ; A0: Klassenzeiger.
- ;
- ;
- ;
- ; Darüberhinaus kann aus dem Objektmodul die Klasse "ClassObject" importiert
- ; werden, um von ihr zu erben. Sie besitzt die folgenden Methoden:
- ;
- ; METHODBODY Object_Initialize
- ; Die Methode zum Initialisieren eines Objektes.
- ; Eingabe: A5: Self.
- ; Ausgabe: Keine.
- ;
- ; METHODBODY Object_Cleanup
- ; Die Methode zum Aufräumen eines Objektes vor dem Löschen.
- ; Eingabe: A5: Self.
- ; Ausgabe: Keine.
- ;
- ; METHODBODY Object_Delete
- ; Die Methode zum Löschen eines Objektes.
- ; Eingabe: A5: Self.
- ; Ausgabe: D0: NIL.
- ; A5: NIL.
-
-
-
- ;****************************************************************************
- ; Ende des Includefiles.
-
- ENDC
-
-