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