PREFIX :Object: Jedes Objekt isa IS 0 hat einen {\tt isa}-Zeiger size IS isa+8 PREFIX :Class: Jede Klasse base IS :Object:size ist ein Objekt, super IS base+0 hat einen Zeiger zur Oberklasse new IS super+8 und hat eine {\tt new}-Methode size IS new+8 PREFIX Class: size IS :Class:size Die Klasse der Klassen ist Klasse PREFIX :Object:Class size IS :Class:size Die Klasse der Objekte ist Klasse%Ende Teil 1 PREFIX :Graphic: size IS :Object:size PREFIX Class: base IS :Class:Class:size {\tt Graphic} ist eine Klasse move IS base+0 und hat {\tt move}-Methode. size IS move+8 PREFIX :Point: {\tt Point}-Objekte base IS :Graphic:size sind {\tt Graphic}-Objekte, x IS base+0 haben einen $x$-Wert y IS x+8 und einen $y$-Wert. size IS y+8 PREFIX Class size IS :Graphic:Class:size PREFIX : $*$ Die Klassen selbst LOC Data_Segment GREG @ Object OCTA Class {\tt isa} OCTA Object {\tt super} OCTA 0 {\tt new} Class OCTA Class {\tt isa} OCTA Object {\tt super} OCTA 0 {\tt new} Graphic OCTA Class {\tt isa} OCTA Object {\tt super} OCTA 0 {\tt new} OCTA 0 {\tt move} Point OCTA Class {\tt isa} OCTA Graphic {\tt super} OCTA Point:Method:new zus"atzlich {\tt new} OCTA Point:Method:move und {\tt move}. %Ende Teil2 LOC #100 Main PUSHJ $0,Point:Method:new ein neuer Punkt in \$0 SET $2,$0 Parameter: SET $3,10 Punkt, $x$, $y$ SET $4,20 "ubergeben PUSHJ $1,Point:Method:move SET $2,$0 Parameter: SET $3,20 {\tt Graphic}-Objekt, $x$, $y$ SET $4,30 "ubergeben LDO $5,$0,Object:isa Klasse laden LDO $5,$5,Graphic:Class:move PUSHGO $1,$5,0 dynamischer Aufruf error TRAP 0,Halt,0 %Ende Teil3 PREFIX :Point:Method: new GET $0,:rJ R"ucksprungadresse sichern SET $2,:Point:size PUSHJ $1,:malloc Speicherplatz anfordern BZ $1,:error LDA $2,:Point initialisieren STO $2,$1,:Object:isa SET $2,0 STO $2,$1,:Point:x STO $2,$1,:Point:y PUT :rJ,$0 SET $0,$1 R"uckgabe: Zeiger auf neues Objekt POP 1,0 move LDO $3,$0,:Point:x ADD $3,$3,$1 $x$-Richtung STO $3,$0,:Point:x LDO $3,$0,:Point:y ADD $3,$3,$2 $y$-Richtung STO $3,$0,:Point:y POP 0,0 %Ende Teil 4 PREFIX Heap: free GREG #3000000000000000 size IS $0 result IS $0 newfree IS $1 tmp IS $2 :malloc ADDU size,size,7 ANDN size,size,7 ADDU newfree,free,size neuer Wert von free SR tmp,newfree,62 obersten zwei bit von free BNZ tmp,fail STO size,free,0 Gr"o"se speichern. ADDU result,free,8 freier Speicher SET free,newfree POP 1,0 fail SET result,0 POP 1,0