💾 Archived View for gmi.noulin.net › MANDEL.ASM.gmi captured on 2024-02-05 at 10:55:46. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-09-28)
-=-=-=-=-=-=-
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