Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .387
- assume cs:cseg, ds:dseg
- shtint TYPEDEF byte
- uint TYPEDEF word
- integer TYPEDEF word
- float TYPEDEF real4
- double TYPEDEF real8
- largh = 320 ;larghezza dello schermo
- alt = 200 ;altezza dello schermo
- dseg SEGMENT para public 'data'
- x0 double 0.0 ;coordinata x del pixel riscalata a (-2.1 - 1.1)
- y0 double 0.0 ;coordinata y del pixel riscalata a (-2.1 - 1.1)
- scaleX double 3.2
- scaleY double 2.0 ;scala in X ed in Y delle coordinate
- offsetX double 2.1
- offsetY double 1.0
- moduloq double 4.0 ;modulo al quadrato
- x double 0.0
- y double 0.0 ;valori della serie in un determinato punto (xo, yo)
- xtemp double 0.0
- two double 2.0
- log256 double 0.125 ;logaritmo in base 2 di 256
- maxX integer 0
- maxY integer 0
- xCoord integer 0
- yCoord integer 0
- FPUstatus integer 0
- iteration integer 0
- maxIteration integer 0
- scaleLog integer 255 ;riscalamento del logaritmo
- color shtint 0
- dseg ENDS
- sseg SEGMENT stack 'stack'
- dw 2048 dup (?)
- sseg ends
- cseg SEGMENT
- START:
- mov ax, 13
- int 10h ;modalità video
- mov ax, dseg
- mov ds, ax
- mov es, ax
- mov maxX, largh
- mov maxY, alt
- mov xCoord, 0
- forX: cmp xCoord, largh
- jae finish
- ;mov dl,69
- ;mov ah,2
- ;int 21h ;test loop forX
- ForXbody: mov yCoord, 0
- cmp yCoord, alt
- jae nextX
- forY: cmp yCoord, alt
- jnb nextX
- ;forY code here
- forYbody: finit
- fld scaleX ;carico scaleX in ST(0)
- fimul xCoord ;scaleX * xCoord, risultato in ST(0)
- fidiv maxX ;ST(0) / maxX => ST(0)
- fsub offsetX ;calcolo scala * coordinata / coordinataMax - offset => ST(0)
- fstp x0 ;pop di ST(0)
- fld scaleY ;carico scaleY in ST(0)
- fimul yCoord ;scaleY * yCoord, risultato in ST(0)
- fidiv maxY ;ST(0) / maxY => ST(0)
- fsub offsetY ;calcolo scala * coordinata / coordinataMax - offset => ST(0)
- fstp y0 ;pop di ST(0)
- fldz
- fst x
- fstp y ;carico 0 in x ed y
- mov iteration, 0
- mov maxIteration, 256
- while2: finit
- fld x ;carico x in ST(0)
- fmul x ;x^2 => ST(0)
- fld y ;carico y in ST(0). ST(1) ora contiene x^2
- fmul y ;y^2 => ST(0)
- fadd ST(0), ST(1) ;x^2 + y^2 => ST(0)
- fcom moduloq ;compara x^2 + y^2 con 4
- fstsw FPUstatus ;copio lo stato della FPU in ax
- fwait
- mov ax, FPUstatus
- sahf ;copio le flag della FPU nelle flag della CPU
- jae while2Break ;se x^2 + y^2 >= 4, esco dal ciclo
- mov ax, iteration
- cmp ax, maxIteration
- jae while2Break ;se ho raggiunto il numero massimo di iterazioni esco dal ciclo
- while2Body: finit
- finit
- fld y ;carico y in ST(0)
- fmul y ;y^2 => ST(0)
- fld x ;carico x in ST(0). ST(1) ora contiene y^2
- fmul x ;x^2 => ST(0)
- fsub ST(0), ST(1) ;x^2 - y^2 => ST(0)
- fadd x0 ;x^2 - y^2 + x0 => ST(0)
- fstp xtemp
- fld two
- fmul x
- fmul y
- fadd y0
- fstp y ;calcola y = 2 * x * y + y0
- fld xtemp
- fstp x
- inc iteration
- jmp while2
- while2Break:
- ;Disegno del pixel su schermo
- ;dec iteration ;iteration vale tra 1 a 256, la porto nell'intervallo 0-255
- fld log256
- fild iteration
- fyl2x
- fimul scaleLog
- fistp iteration
- push es ;salvo ES
- mov ax, 0A000h
- mov es, ax ;offset alla memoria video
- mov ax, yCoord ;carico la coordinata y in ax
- mov bx, 320
- mul bx ;moltiplico la coordinata y per 320
- add ax, xCoord ;aggiungo la coordinata x
- mov di, ax ;in DI metto la coordinata del punto
- mov ax, iteration
- mov dl, al ;carico il valore del pixel in dl
- mov es:[di], dl ;setto il pixel
- pop es ;ripristino ES
- ;mov dl, 72
- ;mov ah, 2
- ;int 21h
- inc yCoord ;parte finale del forY
- jmp forY
- ;mov dl, 71
- ;mov ah, 2
- ;int 21h
- nextX: inc xCoord ;parte finale del forX
- jmp forX
- finish: mov ax, 03h
- int 10h ;modalità testo
- mov dl, 70
- mov ah, 2
- int 21h
- mov ah, 4Ch ;DOS terminate opcode
- xor al, al
- int 21h ;DOS call
- cseg ENDS
- END START
Advertisement
Add Comment
Please, Sign In to add comment