       ; Apfelmännchen

ExecBase = 4
OldOpenLibrary = -408
OpenScreen = -198
ShowTitle = -282
SetRGB4 = -288
CloseScreen = -66
CloseLibrary = -414

xmin   = -700
xmax   = 2100
ymin   = -1000
ymax   = 1000
tiefe  = 32
faktor = 1024
xsize  = 352
ysize  = 282
BPlanes = 5
Hires  = -32764

start:
       move.l ExecBase.s,a6

       lea Graphics(pc),a1 ;Graphics.Library öffnen
       jsr OldOpenLibrary(a6)
       move.l d0,GFXbase
       beq Ende

       lea Intuition(pc),a1 ;Intuition.Library öffnen
       jsr OldOpenLibrary(a6)
       move.l d0,IntuitionBase
       beq Ende
       move.l d0,a6

       lea Screendef(pc),a0 ;Screen öffnen
       jsr OpenScreen(a6)
       move.l d0,Screen
       beq Ende
       add.l #44,d0 ;ViewPort ermitteln
       move.l d0,ViewPort
       add.l #40,d0 ;RastPort ermitteln
       move.l d0,RastPort
       move.l Screen(pc),a0
       moveq #0,d0 ;kein Titel
       jsr ShowTitle(a6)

       move.l GFXbase(pc),a6
       moveq #15,d5 ;Schleife 16 mal durchlaufen
farben:
       move.l ViewPort(pc),a0
       moveq #0,d2
       moveq #0,d3
       move.l d5,d1
       move.l d5,d0
       jsr SetRGB4(a6) ;Farben 0-15 mit r=d5, g=0, b=0
       move.l ViewPort(pc),a0
       moveq #15,d1
       move.l d5,d2
       move.l d5,d0
       add.l #15,d0
       jsr SetRGB4(a6) ;Farben 15-30 mit r=15, g=d5, b=0
       dbf d5,farben
       move.l ViewPort(pc),a0
       moveq #31,d0
       moveq #15,d1
       move.l d1,d2
       moveq #1,d3
       jsr SetRGB4(a6) ;Farbe 31 mit r=15, g=15, b=1

       move.l Screen(pc),a0
       add.l #$C0,a0 ;Hier steht Zeiger auf Bitplane 0
       lea Plane0(pc),a1 ;Anfang Zwischenspeicher für Bitplanes
       moveq #BPlanes-1,d0
planes:
       move.l (a0)+,(a1)+ ;Zeiger auf Planes speichern
       dbf d0,planes

       ; Hier beginnt Algorithmus zur Berechnung der Apfelmännchen

       move.l #xmax-xmin,d0
       move.l #xsize,d1
       divs d1,d0
       move.w d0,a2
       move.l #ymax-ymin,d0
       move.l #ysize,d1
       divs d1,d0
       move.w d0,a3
       move.l #xmin,d6
       move.l #ymax,d7
       lea 0.s,a4
forz:
       lea 0.s,a1
       btst #6,$BFE001 ;Linke Maustaste gedrückt ?
       beq End ;wenn ja, Sprung nach End
forss:
       lea 0.s,a5
fors:
       moveq #0,d0
       moveq #0,d1
       moveq #0,d2
       moveq #0,d3
       moveq #0,d4
while:
       move.l #faktor,d5
       muls d0,d1
       add.l d1,d1
       asr.l #5,d1
       asr.l #5,d1
       sub.l d7,d1
       move.l d2,d0
       sub.l d3,d0
       sub.l d6,d0
       move.l d0,d2
       muls d2,d2
       asr.l #5,d2
       asr.l #5,d2
       move.l d1,d3
       muls d3,d3
       asr.l #5,d3
       asr.l #5,d3
       addq.l #1,d4 ;LrPunktfarbe (=Tiefe des Punktes) erhöhen
       cmp.b #tiefe,d4 ;mit maximaler Tiefe vergleichen
       bge.s weiter1
       asl.l #3,d5
       sub.l d3,d5
       sub.l d2,d5
       bge.s while
       bra.s weiter2
weiter1:
       clr.w d4 ;Farbe auf 0 setzen, da tiefe > maxtiefe
weiter2:
       lea Plane0(pc),a0 ;Zeiger auf Bitplane 0 in a0
       moveq #BPlanes-1,d0
next:
       move.l (a0)+,a6 ;Position der Bitplane in a6
       asr.w #1,d4 ;Farbwert 1 Bit rechts rausschieben
       roxl (a6) ;und direkt in Bitplane schieben
       dbf d0,next ;nächste Plane
       add.l a2,d6
       addq.l #1,a5
       cmp.l #15,a5
       ble.s fors
       lea Plane0(pc),a0
       moveq #BPlanes-1,d0
next1:
       addq.l #2,(a0)+ ;Alle Zeiger auf Planes um 2 (1 word) erhöhen
       dbf d0,next1
       addq.l #1,a1
       cmp.l #xsize/16-1,a1
       ble forss
       move.l #xmin,d6
       sub.l a3,d7
       addq.l #1,a4
       cmp.l #ysize-1,a4
       ble forz

maus:
       btst #6,$BFE001 ;Linke Maustaste gedrückt
       bne.s maus ; nein, dann Sprung

End:
       move.l IntuitionBase(pc),a6
       move.l Screen(pc),a0
       jsr CloseScreen(a6)
       move.l ExecBase.s,a6
       move.l IntuitionBase(pc),a1
       jsr CloseLibrary(a6)
       move.l GFXbase(pc),a1
       jsr CloseLibrary(a6)

Ende:
       rts

       even
Intuition: dc.b 'intuition.library',0
       even
Graphics: dc.b 'graphics.library',0

       even
Screendef:
       dc.w 0,0,xsize,ysize,BPlanes
       dc.b 0,1
       dc.w 0,15
       dc.l 0,0,0,0

Screen: dc.l 0,0
       dc.w 0,0,0,0,15
IntuitionBase: dc.l 0
GFXbase: dc.l 0
RastPort: dc.l 0
ViewPort: dc.l 0
Plane0: dc.l 0
       dc.l 0
       dc.l 0
       dc.l 0
       dc.l 0

       dc.l 0


