💾 Archived View for gmi.noulin.net › MANDEL.ASM.gmi captured on 2023-09-28 at 18:11:47. Gemini links have been rewritten to link to archived content

View Raw

More Information

-=-=-=-=-=-=-

MANDEL.ASM

DOSSEG
.386
.387

Data     segment para 'DATA' USE16

Palette         DB 'PALETTE.PCX',0
Animat          DB 'MANDEL.ANM',0

; Animation
SegANI          DW 0                   ; Segment ANI Palettes Tab Ofs.
SAF             Db 'ANIMATION FILE',0,0,01 ; Version 0.01
PAL             EQU 0                  ; Ofs Pal dans SegANI
NbImages        DD 150
TailleAnimation DD 0
TypeANI         DB 00000100b           ; Images Compressées
TabImg          EQU 768                ; Ofs. Tab Adresse Img dans SegANI

X1Dep           DQ  -2E0
X2Dep           DQ   2E0
Y1Dep           DQ  -2E0
Y2Dep           DQ   2E0

X1Fin           DQ  -0.74591E0
X2Fin           DQ  -0.74448E0
Y1Fin           DQ   0.11196E0
Y2Fin           DQ   0.11339E0

IncX1           DQ  0
IncX2           DQ  0
IncY1           DQ  0
IncY2           DQ  0

NumImg          DW  0

; Animation

; MandelBrot
Image    EQU    DWORD PTR [Bp+4]       ; Push Seg puis Ofs

BaseEcran       DW  320
HautEcran       DW  200
Limite          EQU 30

X1              DQ  -2E0
X2              DQ   2E0
Y1              DQ  -2E0
Y2              DQ   2E0

IncX            DQ  0
IncY            DQ  0
Q0              DQ  0
P0              DQ  0
X               DQ  0
Y               DQ  0
Aux             DQ  0

Ligne           DW  0
Colone          DW  0
Deux            DW  2
Quatre          DW  4
Coul            DW  0
NbCoul          DW  256

; MandelBrot

ProcMv          DB 'Mauvais Processeur. 386 Minimun.'
Copro387        Dw  0
MemF            DB 'Mémoire Insuffisante.'
VideoMv         DB 'Mauvais système vidéo.'
MauvaisDos      DB 'Version MS-DOS Incorrecte.'
UMB             DB  0

PasXMS          DB 'Pas de Gestionaire  XMS Détecté.'
MauvXMS         DB 'Mauvais Gestionaire XMS.'
PasAssXMS       DB 'Mémoire XMS insuffisante.'
ProbXMS         DB 'Problème de Gestionaire XMS.'
XMSMinMem       EQU 768                ; 768 Ko de Mémoire XMS Minimum
XMSAd           EQU This DWord
XMSOfs          DW  0
XMSSeg          DW  0
XmsHandle       Dw  0

XmsBloc         DD  0                  ; Taille du Bloc en octets
                DW  0                  ; Handle Du Bloc Source
                DD  0                  ; OffSet du Bloc Source
                DW  0                  ; Handle Du Bloc Cible
                DD  0                  ; OffSet Cible

XmsVirtualEcr   EQU 0
AddCtr          Equ  063h

; Gestion Mémoire

XmsTaille       Dw 0
XmsMemUtil      DD 464660
XmsMemRest      DD 0

SegMem3D        Dw 0

; Gestion Mémoire

PrefixSeg       DW  0

DepSeg          DW  0
DecV            DW  0
DecA            Dw  0
Ecran           Dw  0

SDEC            DW  0
ODEC            DW  0

TAILLE          Dw  0

; VAR    Depact et DepactB
ARGTvar       EQU   word ptr [bp+12]
ARGOfsC       EQU   word ptr [bp+ 8]
ARGSegC       EQU   word ptr [bp+10]
ARGOfsV       EQU   word ptr [bp+ 4]
ARGSegV       EQU   word ptr [bp+ 6]

ARGVision     EQU   byte ptr [bp- 2]   ; Oct recherché
; End VAR Depact et DepactB

; VAR MovA
; Pareil que Depact
; End Var MovA

; VAR    CopyWin
ArgXw0   equ     word ptr[bp+18]
ArgYw0   equ     word ptr[bp+16]
ArgXw1   equ     word ptr[bp+14]
ArgYw1   equ     word ptr[bp+12]
ArgtXw   equ     word ptr[bp+10]
ArgtYw   equ     word ptr[bp+ 8]
ArgVarW0 equ     word ptr[bp+ 6]
ArgVarW1 equ     word ptr[bp+ 4]
; VAR    CopyWin

Data ENDS

Code     Segment para 'CODE' USE16
         Assume cs:code, ds:data, ss:PILE

Mova     PROC   near   ;(Taille,SDec,ODec,SEcr,OEcr:Word)

         push   bp
         mov    bp,sp
         push   si
         push   di
         push   ds

         mov    cx,ARGTvar

         mov    SI,ARGSegC
         mov    ds,si
         mov    SI,ARGOfsC
         mov    DI,ARGSegV
         mov    es,di
         mov    DI,ARGOfsV
         Test   CX,1
         Je     WordCop
         Shr    Cx,1
         rep    movsW
         movsb
         Jmp    Cnt
WordCop: Shr    Cx,1
         Rep    MovSW
Cnt:     pop    ds
         pop    di
         pop    si
         mov    sp,bp
         pop    bp
         Ret    0Ah

Mova     ENDP

Move     PROC   near   ;(Taille,SDec,ODec,SEcr,OEcr:Word)

         push   bp
         mov    bp,sp
         push   ds

         mov    cx,ARGTvar

         mov    SI,ARGSegC
         mov    ds,si
         mov    SI,ARGOfsC
         mov    DI,ARGSegV
         mov    es,di
         mov    DI,ARGOfsV
         Test   CX,1
         Je     WordCope
         Shr    Cx,1
         rep    movsW
         movsb
         Jmp    Cnte
WordCope:Shr    Cx,1
         Rep    MovSW
Cnte:    pop    ds
         mov    sp,bp
         pop    bp
         Ret    0Ah

Move     ENDP

MandelBrot PROC NEAR
         Push   Bp
         Mov    Bp,Sp

         LES    DI,Image

         Call   Lib387

         FLD    X2
         FLD    X1
         FSUB
         FIDIV  BaseEcran
         FSTP   IncX

         Mov    Ligne,0

         FLD    Y2
         FLD    Y1
         FSUB
         FIDIV  HautEcran
         FSTP   IncY

CalculeLignes:
         FLD    Y1
         FLD    IncY
         FIMul  Ligne
         FADD

         Mov    Colone,0

CalculeColones:
         FLD    X1
         FLD    IncX
         FIMul  Colone
         FADD

         FLDZ
         FLD    St(0)

         Mov    Cx,Limite
CalculeModule:
         FLD    St(1)
         FMul   St,St
         FLD    St(1)
         FMul   St,St
         FSUB
         FADD   St,St(3)
         FXCH   St(2)

         FIMul  Deux
         FMul
         FADD   St,St(3)

         FLD    St(1)
         FMul   St,St
         FLD    St(1)
         FMul   St,St
         FADD

         FICOM  Quatre
         FSTSW  AX
         SAHF
         Jae    FinModule
         FStp   St(0)
         Loop   CalculeModule

         Xor    Al,Al
         StosB
         Jmp    SuiteCalc

FinModule:
         FSTP   St(0)
         Mov    Ax,Limite
         Sub    Ax,Cx
;         Mov    Coul,Ax
;         FILd   NbCoul
;         FILD   Coul
;         FPRem
;         FISTP  Coul
;         Mov    Ax,Coul
;         FSTP   St(0)
         StosB

SuiteCalc:

         In     AL,60h
         FSTP   St(0)
         Test   Al,80h
         Jz     FinMandel

         FSTP   St(0)
         Inc    Colone
         Mov    Ax,Colone
         FSTP   St(0)
         Cmp    Ax,BaseEcran
         Jb     CalculeColones

         Inc    Ligne
         FSTP   St(0)
         Mov    Ax,Ligne
         Cmp    Ax,HautEcran
         Jb     CalculeLignes
         JMP    FinFinMandel

FinMandel:
         Mov    NbImages,0
FinFinMandel:
         Pop    Bp
         RET    4
MandelBrot ENDP

INCLUDE MANDELI.ASM

FInitialiseSys:
         Mov    AX,1017h               ; Sauvegarde de la Pallette
         Xor    BX,BX
         Mov    CX,100h
         Mov    ES,SegANI
         Mov    DX,PAL
         Int    10h

         FLD    X1Fin
         FLD    X1Dep
         FST    X1
         FSUB
         FIDiv  NbImages
         FSTP   IncX1

         FLD    X2Fin
         FLD    X2Dep
         FST    X2
         FSUB
         FIDiv  NbImages
         FSTP   IncX2

         FLD    Y1Fin
         FLD    Y1Dep
         FST    Y1
         FSUB
         FIDiv  NbImages
         FSTP   IncY1

         FLD    Y2Fin
         FLD    Y2Dep
         FST    Y2
         FSUB
         FIDiv  NbImages
         FSTP   IncY2

RelachementDeTouche:
         In     Al,60h
         Test   AL,80h
         Jz     RelachementDeTouche

         Mov    ECx,NbImages
CalculeAnimationMandel:
         Push   CX

         Push   0A000h
         Push   0
         Call   MandelBrot
         Cmp    NbImages,0             ; Si On appuit sur une Touche
         Jne    ContinueLAnimation
         Pop    CX
         Jmp    ANIFINI
ContinueLAnimation:

         Mov    Bx,NumImg
         Shl    Bx,2
         Mov    EAx,TailleAnimation
         Mov    ES,SegANI
         Mov    ES:[Bx+TabImg],EAX     ; Offset des Images

         Push   0A000h
         Push   0
         Push   Ecran
         Push   2
         Push   64000
         Call   CompressW              ; => Ax = Taille Compressé
         Test   Ax,1
         Jz     TailleImgPaire
         Inc    Ax
TailleImgPaire:

         Mov    ES,Ecran
         Mov    ES:[0],Ax

         Xor    EBx,EBx
         Inc    Ax
         Inc    Ax

         Mov    Bx,Ax
         MOV    EDX,TAILLEANIMATION
         Add    TailleAnimation,EBX    ; + Taille Img

         Mov    Si,OffSet XMSBloc      ; Transf. Son Comp.
         Mov    Dword Ptr [SI],EBx
         Mov     Word Ptr [SI+04h],0   ; XmsHandle = 0 Pour Mem < 1Mo
         Mov     Word Ptr [SI+06h],0
         Mov    Ax,Ecran
         Mov    [SI+08h],Ax

         Mov    Ax,XMSHandle
         Mov    [SI+0Ah],Ax
         Mov    DWord Ptr [SI+0Ch],EDX
         Mov    Ah,0Bh
         Call   CS:XMSAd

         Inc    NumImg

         FLD    X1
         FADD   IncX1
         FSTP   X1
         FLD    X2
         FADD   IncX2
         FSTP   X2
         FLD    Y1
         FADD   IncY1
         FSTP   Y1
         FLD    Y2
         FADD   IncY2
         FSTP   Y2

         Pop    CX
         Dec    CX
         Jz     ANIFINI
         JMP    CalculeAnimationMandel
ANIFINI:
         Call   EnrAni

         Mov    Ah,0
         Int    16h

FinPrgMandel:
         Mov    ax,3
         Int    10h
         Jmp    PrgF

PROG     ENDP

CODE     ENDS

PILE     Segment Para Stack USE16

         Dw 200h Dup (?)
PILE     Ends

	 End prog