home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Assembler / DVD!OMA1.DMS / in.adf / Include / ooma.i < prev   
Encoding:
Text File  |  1994-10-13  |  5.8 KB  |  224 lines

  1.  
  2. ;****************************************************************************
  3. ; OOMA.i                                        Definitionen für Objektklasse
  4. ;
  5. ; Copyright by Dietmar Heidrich, Blenderstraße 60, 28279 Bremen, Germany
  6. ;
  7. ; Diese Datei darf nur in Benutzung mit dem Optimierenden Makro-Assembler
  8. ; verwendet werden.
  9. ;****************************************************************************
  10.  
  11.     IFND    OOMA_I
  12. OOMA_I    EQU    1
  13.  
  14.     IFND    EXEC_TYPES_I
  15.     INCLUDE    "exec/types.i"
  16.     ENDC
  17.  
  18. ;****************************************************************************
  19. ; Klassen- und Objekt-Grundstrukturen. Klassen werden dynamisch über die
  20. ; Prozedur "RegisterClass" angemeldet und nach Anmeldung aller Klassen mit
  21. ; der Prozedur "InitializeClasses" initialisiert. Erst danach dürfen Objekte
  22. ; erzeugt werden.
  23. ; Die Objektklasse "ClassObject" ist die Grundklasse aller anderen Klassen.
  24.  
  25.  STRUCTURE Class,0
  26.  APTR    class_pSuper        ; Zeiger auf Superklasse
  27.  ULONG    class_lObjectSize    ; Größe eines Objektes
  28.  APTR    class_pUserData        ; Möglichkeit, Klassendaten zu erweitern
  29.  APTR    class_pSucc        ; PRIVAT
  30.  APTR    class_pArray        ; PRIVAT
  31.  UWORD    class_wFlags        ; PRIVAT
  32.  UWORD    class_wClassSize    ; Größe dieser Struktur
  33.  LABEL    class_fMethods        ; Beginn der Methodentabelle
  34.  LABEL    class_SIZEOF
  35.  
  36.  STRUCTURE Object,0
  37.  APTR    object_pClass        ; Zeiger auf Klasse
  38.  LABEL    object_SIZEOF
  39.  
  40.  
  41.  
  42. ; Makro zum Deklarieren einer Klasse. Klassencontainer sollten im BSS-Hunk
  43. ; unterkommen. Die Klasse MUß im Quelltext vor den Methoden deklariert
  44. ; werden, da eine Information zum Superklassenaufruf verzeichnet wird.
  45. ; Der Klassencontainer wird hier automatisch exportiert.
  46.  
  47. DEFINECLASS    MACRO    Name,ClassSize
  48.     EXPORT    \1
  49.     CNOP    0,2
  50. \1    ds.b    \2
  51. This_Class    set    \1
  52.     ENDM
  53.  
  54.  
  55.  
  56. ; Makro zum Deklarieren einer Methode. Methodenlabel unterscheiden sich von
  57. ; MethodenIDs durch das Präfix "m_".
  58.  
  59. METHODBODY    MACRO    MethodID
  60. m_\1    CNOP    0,2
  61.     ENDM
  62.  
  63.  
  64.  
  65. ; Zum Initialisieren des Klassencontainers muß angegeben werden, welche
  66. ; Methoden in dieser Klasse vorhanden sind. Das geschieht durch ein Feld, das
  67. ; mit Hilfe des OVERWRITE-Makros definiert wird. Das Feld muß durch ein
  68. ; Nullwort abgeschlossen werden, was ENDOVERWRITE übernimmt.
  69.  
  70. OVERWRITE    MACRO    MethodID
  71.     dc    \1
  72.     dc.l    m_\1
  73.     ENDM
  74.  
  75. ENDOVERWRITE    MACRO
  76.     dc    0
  77.     ENDM
  78.  
  79.  
  80.  
  81. ; Makros zum Deklarieren von MethodenIDs. Von jeder Klasse muß die Größe des
  82. ; Klassencontainers bekannt sein, daher sollte sie über den Makro ENDMETHOD
  83. ; definiert werden. An der Stelle können Unterklassen dann die Methoden-
  84. ; tabelle korrekt fortsetzen.
  85.  
  86. BEGINMETHOD    MACRO    SuperClassSize
  87. Method_count    set    \1
  88.     ENDM
  89.  
  90. DEFINEMETHOD    MACRO    MethodID
  91. \1    equ    Method_count
  92. Method_count    set    Method_count+4
  93.     ENDM
  94.  
  95. ENDMETHOD    MACRO    ClassSize
  96. \1    equ    Method_count
  97.     ENDM
  98.  
  99. SAMEMETHOD    MACRO    NewMethod,OldMethod
  100. \1    equ    \2
  101.     ENDM
  102.  
  103.  
  104.  
  105. ; Als Konstruktur steht die Prozedur "CreateObject" zur Verfügung.
  106.  
  107. ; Für Fälle, in denen ein Objekt z.B. auf dem Stack liegt, kann der folgende
  108. ; Makro verwendet werden, damit der Klassenzeiger des Objekts stimmt. Dann
  109. ; ist allerdings das Objekt noch nicht auf Null initialisiert.
  110.  
  111. INITOBJECT    MACRO    ObjectPointer,ClassPointer
  112.     move.l    #\2,object_pClass(\1)
  113.     ENDM
  114.  
  115.  
  116.  
  117. ; Die folgenden Methoden gehören zur Objektklasse:
  118.  
  119.     BEGINMETHOD    class_SIZEOF
  120.     DEFINEMETHOD    Object_Initialize
  121.     DEFINEMETHOD    Object_Cleanup
  122.     DEFINEMETHOD    Object_Delete
  123.     ENDMETHOD    Object_ClassSize
  124.  
  125.  
  126.  
  127. ;****************************************************************************
  128. ; Makros zum Aufrufen einer Methode. Der Objektzeiger muß eine gültige
  129. ; Adressierungsart und die Methode definiert sein. A6 wird als Freiregister
  130. ; angesehen und muß u.U. nach einem Methodenaufruf neu geladen werden.
  131. ; Jede Methode wird mit dem Self-Zeiger (d.h. dem Zeiger auf das Objekt
  132. ; selber) in A5 aufgerufen. Sofern A5 bereits der Objektzeiger ist, wird A5
  133. ; nicht auf den Stack gerettet.
  134. ;
  135. ; METHOD ist als Direktive im Assembler vorhanden (siehe Handbuch).
  136. ;
  137. ; SMETHOD ist der Aufruf der Methode einer Oberklasse. Dieser Aufruf
  138. ; kann mit Hilfe der folgenden Makros vereinfacht werden:
  139.  
  140. SUPER    MACRO    ObjectPointer,MethodID
  141.     IFND    This_Class
  142.     FAIL    SUPER without Class Descriptor
  143.     ENDC
  144.     SMETHOD    \1,This_Class+class_pSuper,\2
  145.     ENDM
  146.  
  147.  
  148.  
  149. ;****************************************************************************
  150. ; Das Objektmodul stellt die folgenden Routinen zur Verfügung:
  151. ;
  152. ;
  153. ;
  154. ; InitObjectModule
  155. ;    Initialisierung des Objektmoduls.
  156. ;    Eingabe:  Keine.
  157. ;    Ausgabe:  Keine.
  158. ;
  159. ;
  160. ;
  161. ; RegisterClass
  162. ;    Melde eine Klasse an.
  163. ;    Eingabe:  A0: Klassenzeiger.
  164. ;          A1: Superklasse.
  165. ;          A2: Zeiger auf Initialisierungsarray (darf NIL sein).
  166. ;          D0: Objektgröße.
  167. ;          D1.w: Klassengröße
  168. ;    Ausgabe:  Keine.
  169. ;
  170. ;
  171. ;
  172. ; InitializeClasses
  173. ;    Initialisiere alle angemeldeten Klassen.
  174. ;    Eingabe:  Keine.
  175. ;    Ausgabe:  D0: NIL, wenn alles gut ging. Sonst Zeiger auf Klasse, die
  176. ;          nicht angemeldet worden war (Vererbungsbaum unvollständig).
  177. ;
  178. ;
  179. ;
  180. ; CreateObject
  181. ;    Erzeuge ein Objekt der in der Klasse verzeichneten Größe. Das Objekt
  182. ;    ist automatisch auf Null initialisiert.
  183. ;    Eingabe:  A0: Klassenzeiger.
  184. ;    Ausgabe:  D0: Objektzeiger oder NIL.
  185. ;          A0: Klassenzeiger.
  186. ;
  187. ;
  188. ;
  189. ; CreateObjectNoClear
  190. ;    Erzeuge ein Objekt der in der Klasse verzeichneten Größe. Das Objekt
  191. ;    ist NICHT auf Null initialisiert !
  192. ;    Eingabe:  A0: Klassenzeiger.
  193. ;    Ausgabe:  D0: Objektzeiger oder NIL.
  194. ;          A0: Klassenzeiger.
  195. ;
  196. ;
  197. ;
  198. ; Darüberhinaus kann aus dem Objektmodul die Klasse "ClassObject" importiert
  199. ; werden, um von ihr zu erben. Sie besitzt die folgenden Methoden:
  200. ;
  201. ; METHODBODY    Object_Initialize
  202. ;    Die Methode zum Initialisieren eines Objektes.
  203. ;    Eingabe:  A5: Self.
  204. ;    Ausgabe:  Keine.
  205. ;
  206. ; METHODBODY    Object_Cleanup
  207. ;    Die Methode zum Aufräumen eines Objektes vor dem Löschen.
  208. ;    Eingabe:  A5: Self.
  209. ;    Ausgabe:  Keine.
  210. ;
  211. ; METHODBODY    Object_Delete
  212. ;    Die Methode zum Löschen eines Objektes.
  213. ;    Eingabe:  A5: Self.
  214. ;    Ausgabe:  D0: NIL.
  215. ;          A5: NIL.
  216.  
  217.  
  218.  
  219. ;****************************************************************************
  220. ; Ende des Includefiles.
  221.  
  222.     ENDC
  223.  
  224.