
;****************************************************************************
; 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

