;
;PI.ASM: PI Berechnung
;Autor: Philipp Gühring (p.guehring@poboxes.com)
;Lizenz: GPL (http://www.opensource.org)
;Ergebnis: Bis jetzt auf 9(4) Stellen genau!
;

.286

MYSTACK segment stack
        dw 64 dup (?)
MYSTACK ends

DATA segment
        Divisor dw 1            ;1,3,5,7,9,...
        Vorkomma equ 1
        Nachkomma equ 9
        Zw      dw (Vorkomma+Nachkomma) dup (0)
        Pi      dw (Vorkomma+Nachkomma) dup (0)
DATA ends

CODE segment
        ASSUME CS:CODE,DS:DATA
Start:
        mov ax,DATA
        mov ds,ax
Lbl_a:
        call Divit
        call Addit
        add word ptr ds:[Divisor],2
        call Divit
        call Subit
        add word ptr ds:[Divisor],2
        cmp word ptr ds:[Divisor],0FFF0h
        jb Lbl_a
        call Divit
        call Shiftit
        call Addit
        call Ausgabe
        mov ax,4C00h
        int 21h

;Jetzt kommen die Prozeduren

Divit proc near
        pusha
        mov cx,word ptr [Divisor]
        xor dx,dx
        mov ax,4
        mov bx,Offset Zw
        Lbl_b:
                div cx
                mov word ptr [bx],ax
                xor ax,ax
                add bx,2
                cmp bx,Offset Zw+(Vorkomma+Nachkomma)*2
        jb Lbl_b
        popa
        ret
Divit endp

Addit proc near
        pusha
        mov si,Offset Zw+(Vorkomma+Nachkomma)*2-2
        mov di,Offset Pi+(Vorkomma+Nachkomma)*2-2
        clc
        pushf
        Lbl_c:
                mov ax,word ptr [si]
                popf
                adc word ptr [di],ax
                pushf
                sub si,2
                sub di,2
                cmp si,Offset Zw
        jae Lbl_c
        popf
        popa
        ret
Addit endp

Subit proc near
        pusha
        mov si,Offset Zw+(Vorkomma+Nachkomma)*2-2
        mov di,Offset Pi+(Vorkomma+Nachkomma)*2-2
        clc
        pushf
        Lbl_d:
                mov ax,[si]
                popf
                sbb [di],ax
                pushf
                sub si,2
                sub di,2
                cmp si,Offset Zw
        jae Lbl_d
        popf
        popa
        ret
Subit endp

Shiftit proc near
        pusha
        mov bx,Offset Zw
        xor di,di
        clc
        pushf
        Lbl_e:
                popf
                rcr word ptr [bx+di],1
                pushf
                add di,2
                cmp di,2*(Vorkomma+Nachkomma)
        jb Lbl_e
        popf
        popa
        ret
Shiftit endp

Ausgabe proc near
        pusha
                                ;Vorkomma
        mov bx,0
        mov dx,0
        mov ax,[Pi]
        mov cx,10d
Lbl_f:
        div cx
        push dx
        xor dx,dx
        inc bx
        cmp ax,0
        ja Lbl_f
        mov cx,bx
Lbl_g:  pop ax
        mov ah,0eh
        add al,"0"
        int 10h
        loop Lbl_g
                                ;Komma
        mov al,","
        int 10h
                                ;Nachkommateil
        mov cx,10d
        mov di,20
Lbl_h:
        mov si,Offset Pi+(Vorkomma+Nachkomma)*2-2
        mov bx,0
Lbl_i:
        mov ax,[si]
        mul cx
        add ax,bx
        mov [si],ax
        mov bx,dx
        sub si,2
        cmp si,Offset Pi+Vorkomma*2
        jae Lbl_i

        mov ah,0eh
        mov al,dl
        add al,"0"
        int 10h
        dec di
        cmp di,0
        ja Lbl_h

        popa
        ret
Ausgabe endp

CODE ends

end Start
