   ;************************************************************************
   ; Routine zur Ausgabe von pi                                            *
   ; Teil des Programms E.asm aus AMIGA-MAGAZIN 9/92 (mit Anpassungen)     *
   ;                                                                       *
   ;                                                                       *
   ; Parameter:  in:  (a5) +8,12,16                                        *
   ;                  (a5)+8 enthaelt pi als Dualbruch der Laenge (a5)+12  *
   ;                  (a5)+16 enthaelt die Ausgabelaenge!                  *
   ;            out:  Ausgabe von pi als Dezimalbruch und #Nachkommastellen*
   ;************************************************************************

ExecBase:        equ  4
RawDoFmt:        equ -522
OldOpenLib:      equ -408
CloseLib:        equ -414
Open:            equ -30
Close:           equ -36
Write:           equ -48
Output:          equ -60

   public   _displ
_displ:     
   movem.l  d0-a6,-(a7)
   lea      pi(pc),a0
   move.l   8(a5),(a0)     A(pi)
   move.l   12(a5),4(a0)   llen
   move.l   12(a5),d0
   moveq    #2,d1
   mulu     d1,d0
   move.l   d0,8(a0)       wlen
   mulu     d1,d0
   move.l   d0,12(a0)      flen
   move.l   16(a5),16(a0)  alen
 

   move.l   ExecBase,a6
   lea      dosname(pc),a1
   jsr      OldOpenLib(a6)
   move.l   d0,dosbase
   move.l   d0,a6
   jsr      Output(a6)
   move.l   d0,handle


ausgabe:
   move.l   pi(pc),a3
   move.l   (a3),d2
   lea      formatstr0(pc),a0
   bsr      print
   clr.l    (a3)
   move.l   alen(pc),d5
   clr.l    d6			;Zaehler init
   move.l   flen(pc),a5
   moveq    #0,d2
   move.l   wlen(pc),d7
   subq.l   #1,d7
drucken:
   move.l   pi(pc),a3
   adda.l   a5,a3
   move.l   d7,d3		;Schleifenlaenge
   moveq    #0,d1
   moveq    #0,d0
druckloop:
   move.w   -(a3),d0
   mulu     #10000,d0
   add.l    d1,d0
   move.w   d0,(a3)
   tst.w    d2
   bne      ueberlauf
   tst.w    d0			;Nullen 
   bne      dremember		;von rechts
   lea      -2(a5),a5		;merken
   subq.l   #1,d7		;neue Schleifenlaenge 
   blt      ddone		;fertig, wenn negativ
   bra      ueberlauf
dremember:
   moveq    #1,d2
ueberlauf: 
   clr.w    d0
   swap     d0
   move.w   d0,d1
   dbra     d3,druckloop

   move.l   pi(pc),a3
   move.l   (a3),d2
   lea      formatstr1(pc),a0
   bsr      print
   clr.l    (a3)
   addq.l   #4,d6
   dbra     d5,drucken

ddone:
   move.l   d6,d2
   lea      formatstr3(pc),a0
   bsr      print

ende:
   move.l  ExecBase,a6
   move.l  dosbase(pc),a1
   jsr     CloseLib(a6)
   moveq   #0,d0
   movem.l (a7)+,d0-a6  
   rts

print:
   movem.l d0-a6,-(a7)
   move.l  #-1,length
   lea     datas(pc),a1
   move.l  d2,(a1)
   lea     routine(pc),a2
   lea     buffer,a3
   move.l  ExecBase,a6
   jsr     RawDoFmt(a6)
   move.l  handle(pc),d1
   move.l  #buffer,d2
   move.l  length,d3
   move.l  dosbase(pc),a6
   jsr     Write(a6)
   movem.l (a7)+,d0-a6
   rts

routine:
   move.b  d0,(a3)+
   clr.b   (a3)
   addq.l  #1,length
   rts


length:      dc.l  0
dosbase:     dc.l  0
handle:      dc.l  0
datas:       dc.l  0
dosname:     dc.b  "dos.library",0
formatstr0:  dc.b  "pi = %ld.",0
formatstr1:  dc.b  "%04ld",0
formatstr2:  dc.b  "Umläufe : %-ld",10,0
formatstr3:  dc.b  10,"Anzahl der Nachkommastellen: %-ld",10,0
   even
buffer:      ds.b  250
pi:          dc.l  0
llen:        dc.l  0
wlen         dc.l  0
flen         dc.l  0
alen         dc.l  0
   END
