schifazl

Mandelbrot video cacca

Jan 20th, 2013
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .387
  2. assume cs:cseg, ds:dseg
  3.  
  4. shtint  TYPEDEF byte
  5. uint    TYPEDEF word
  6. integer TYPEDEF word
  7. float   TYPEDEF real4
  8. double  TYPEDEF real8
  9.  
  10. largh   =   320 ;larghezza dello schermo
  11. alt =   200 ;altezza dello schermo
  12.  
  13. dseg    SEGMENT para public 'data'
  14.    
  15. x0  double  0.0 ;coordinata x del pixel riscalata a (-2.1 - 1.1)
  16. y0  double  0.0 ;coordinata y del pixel riscalata a (-2.1 - 1.1)
  17. scaleX  double  3.2
  18. scaleY  double  2.0 ;scala in X ed in Y delle coordinate
  19. offsetX double  2.1
  20. offsetY double  1.0
  21. moduloq double  4.0 ;modulo al quadrato
  22. x   double  0.0
  23. y   double  0.0 ;valori della serie in un determinato punto (xo, yo)
  24. xtemp   double  0.0
  25. two double  2.0
  26. log256  double  0.125   ;logaritmo in base 2 di 256
  27. maxX    integer 0
  28. maxY    integer 0
  29. xCoord  integer 0
  30. yCoord  integer 0
  31. FPUstatus   integer 0
  32. iteration   integer 0
  33. maxIteration    integer 0
  34. scaleLog    integer 255 ;riscalamento del logaritmo
  35. color   shtint  0
  36.  
  37.  
  38. dseg    ENDS
  39.  
  40.  
  41. sseg    SEGMENT     stack 'stack'
  42. dw  2048    dup (?)
  43. sseg ends
  44.  
  45.  
  46. cseg    SEGMENT
  47. START:
  48.    
  49.    
  50.     mov ax, 13
  51.     int 10h ;modalità video
  52.    
  53.     mov ax, dseg
  54.     mov ds, ax
  55.     mov es, ax
  56.     mov maxX, largh
  57.     mov maxY, alt
  58.    
  59.     mov xCoord, 0
  60. forX:   cmp xCoord, largh
  61.     jae finish
  62.    
  63.     ;mov    dl,69
  64.     ;mov    ah,2
  65.     ;int    21h ;test loop forX
  66.    
  67. ForXbody:   mov yCoord, 0
  68.     cmp yCoord, alt
  69.     jae nextX
  70. forY:   cmp yCoord, alt
  71.     jnb nextX
  72.    
  73.     ;forY code here
  74. forYbody:   finit
  75.     fld scaleX  ;carico scaleX in ST(0)
  76.     fimul   xCoord  ;scaleX * xCoord, risultato in ST(0)
  77.     fidiv   maxX    ;ST(0) / maxX => ST(0)
  78.     fsub    offsetX ;calcolo scala * coordinata / coordinataMax - offset => ST(0)
  79.     fstp    x0  ;pop di ST(0)
  80.  
  81.     fld scaleY  ;carico scaleY in ST(0)
  82.     fimul   yCoord  ;scaleY * yCoord, risultato in ST(0)
  83.     fidiv   maxY    ;ST(0) / maxY => ST(0)
  84.     fsub    offsetY ;calcolo scala * coordinata / coordinataMax - offset => ST(0)
  85.     fstp    y0  ;pop di ST(0)
  86.    
  87.     fldz
  88.     fst x
  89.     fstp    y   ;carico 0 in x ed y
  90.     mov iteration, 0
  91.     mov maxIteration, 256
  92.    
  93. while2: finit
  94.     fld x   ;carico x in ST(0)
  95.     fmul    x   ;x^2 => ST(0)
  96.     fld y   ;carico y in ST(0). ST(1) ora contiene x^2
  97.     fmul    y   ;y^2 => ST(0)
  98.     fadd    ST(0), ST(1)    ;x^2 + y^2 => ST(0)
  99.     fcom    moduloq ;compara x^2 + y^2 con 4
  100.     fstsw   FPUstatus   ;copio lo stato della FPU in ax
  101.     fwait
  102.     mov ax, FPUstatus
  103.     sahf        ;copio le flag della FPU nelle flag della CPU
  104.     jae while2Break ;se x^2 + y^2 >= 4, esco dal ciclo
  105.     mov ax, iteration
  106.     cmp ax, maxIteration
  107.     jae while2Break ;se ho raggiunto il numero massimo di iterazioni esco dal ciclo
  108.  
  109. while2Body: finit
  110.     finit
  111.     fld y   ;carico y in ST(0)
  112.     fmul    y   ;y^2 => ST(0)
  113.     fld x   ;carico x in ST(0). ST(1) ora contiene y^2
  114.     fmul    x   ;x^2 => ST(0)
  115.     fsub    ST(0), ST(1)    ;x^2 - y^2 => ST(0)
  116.     fadd    x0  ;x^2 - y^2 + x0 => ST(0)
  117.     fstp    xtemp
  118.     fld two
  119.     fmul    x
  120.     fmul    y
  121.     fadd    y0
  122.     fstp    y   ;calcola y = 2 * x * y + y0
  123.     fld xtemp
  124.     fstp    x
  125.  
  126.     inc iteration
  127.     jmp while2 
  128. while2Break:   
  129.     ;Disegno del pixel su schermo
  130.     ;dec    iteration   ;iteration vale tra 1 a 256, la porto nell'intervallo 0-255
  131.     fld log256
  132.     fild    iteration
  133.     fyl2x  
  134.     fimul   scaleLog
  135.     fistp   iteration
  136.    
  137.     push    es  ;salvo ES
  138.     mov ax, 0A000h 
  139.     mov es, ax  ;offset alla memoria video
  140.     mov ax, yCoord  ;carico la coordinata y in ax
  141.     mov bx, 320
  142.     mul bx  ;moltiplico la coordinata y per 320
  143.     add ax, xCoord  ;aggiungo la coordinata x
  144.     mov di, ax  ;in DI metto la coordinata del punto
  145.     mov ax, iteration
  146.     mov     dl, al  ;carico il valore del pixel in dl
  147.     mov es:[di], dl ;setto il pixel
  148.     pop es  ;ripristino ES
  149.    
  150.     ;mov    dl, 72
  151.     ;mov    ah, 2
  152.     ;int    21h
  153.    
  154.     inc yCoord  ;parte finale del forY
  155.     jmp forY
  156.  
  157.     ;mov    dl, 71
  158.     ;mov    ah, 2
  159.     ;int    21h
  160.    
  161. nextX:  inc xCoord  ;parte finale del forX
  162.     jmp forX
  163.  
  164. finish: mov ax, 03h
  165.     int 10h ;modalità testo
  166.  
  167.     mov dl, 70
  168.     mov ah, 2
  169.     int 21h
  170.    
  171.     mov ah, 4Ch ;DOS terminate opcode
  172.     xor al, al
  173.     int 21h ;DOS call
  174.  
  175.    
  176.    
  177. cseg    ENDS
  178. END START
Advertisement
Add Comment
Please, Sign In to add comment