home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / graph / voxel.asm < prev    next >
Assembly Source File  |  1994-10-09  |  5KB  |  131 lines

  1.  data segment
  2.   extrn vscreen:dword           ;pointe sur les données du paysage
  3.   extrn x,y: word               ;coordonnées du trapèze
  4.   extrn vpage:word              ;page d'écran courante
  5. data ends
  6.  
  7. code segment
  8. assume cs:code,ds:data
  9.  
  10. ;Variables avec partie décimale (8 bits inférieurs) :
  11.  
  12. offst dd 0                      ;offset courant
  13. step dd 0                       ;taille du pixel
  14. row_start dd 0                  ;début de la ligne courante
  15. row_step dd 0                   ;distance jusqu'à la ligne suivante
  16.  
  17.  
  18. z_count dw 0                    ;compteur pour la profondeur
  19. shrink dw 0                     ;correction au bas de l'écran
  20.  
  21. Ligne dd 0                      ;numéro de ligne d'écran courante
  22. vpage_cs dw 0                   ;page d'écran dans le segment de code
  23.  
  24. .386
  25. public Draw_Voxel
  26. Draw_Voxel proc pascal
  27. ;représente un paysage dans la page d'écran courante
  28. ;lit les données dans vscreen à partir de la position (x,y)
  29.   mov ax,vpage                  ;mémorise le numéro de la page d'écran
  30.   mov vpage_cs,ax
  31.  
  32.   push ds
  33.   mov ax,0a000h                 ;charge le segment de destination
  34.   mov es,ax
  35.  
  36.   mov ax,320                    ;calcule l'offset dans le paysage
  37.   imul y
  38.   add ax,x
  39.  
  40.   lds si,vscreen                ;prend les données dans vscreen 
  41.   add si,ax                     ;tient compte de l'offset
  42.   shl esi,8                     ;conversion en virgule fixe
  43.  
  44.   mov offst,esi                 ;valeurs initiales pour le pixel ...
  45.   mov row_start,esi             ;... et la ligne
  46.  
  47.   mov step,100h                 ;facteur d'échelle initial 1
  48.   mov ligne,100*256             ;commence en ligne d'écran 100 
  49.   mov row_step,14040h           ;distance interligne 320,25
  50.   mov shrink,0                  ;pas de correction au début
  51.   mov z_count,160               ;nombre de lignes à traiter
  52.  
  53.  next_y:
  54.   mov eax,Ligne                 ;lit le numéro de ligne courant (écran)
  55.   mov ebx,eax                   ;le sauvegarde
  56.   shr eax,8                     ;le convertit en entier
  57.   add eax,50                    ;50 pixels vers le bas
  58.   imul eax,80                   ;convertit en offset
  59.   mov di,ax                     ;sauvegarde comme pointeur de destination 
  60.   cmp di,199*80                 ;a-t-on dépassé le bord de l'écran?
  61.   jb normal
  62.   mov di,199*80                 ;oui, on se positionne en dernière ligne
  63.  
  64.   mov eax,Ligne          ;différence par rapport au bord inférieur de l'écran
  65.   shr eax,8
  66.   sub eax,149
  67.   mov shrink,ax                 ;mémorisée comme correction
  68.  
  69. normal:
  70.   add di,vpage_cs               ;ajoute la page d'écran courante
  71.  
  72.   imul ebx,16500                ;multiplie le numéro de ligne par 1,007 
  73.   shr ebx,14                    ;le tout * 16500 / 16384 
  74.   mov Ligne,ebx                 ;on sauvegarde 
  75.  
  76. mov bp,80                       ;nombre de pixels par ligne
  77. next_x:
  78.   mov esi,offst                 ;charge l'offset du pixel courant
  79.   shr esi,8                     ;le convertit en entier
  80.   xor eax,eax
  81.   mov al,[si]                   ;charge un point du paysage
  82.   mov cx,ax                     ;le sauvegarde
  83.  
  84.   cmp cx,99                     ;couleur (=hauteur) < 100
  85.   ja fill_bar
  86.   mov ax,99                     ;alors on fixe à 99
  87.  
  88. fill_bar:
  89.   shl ax,5                      ;projection à point de fuite : hauteur * 32
  90.   xor dx,dx
  91.   push bp
  92.   mov bp,z_count                ;divise par la distance
  93.   add bp,50
  94.   idiv bp
  95.   pop bp
  96.  
  97.   sub ax,shrink                 ;effectue la correction
  98.   jbe suite                     ;si <= 0, ne dessine pas
  99.  
  100. push di
  101. next_fill:
  102.   mov es:[di],cl                ;enregistre la couleur
  103.   sub di,80                     ;ligne suivante vers le haut
  104.   dec al                        ;décrémente le compteur
  105.   jne next_fill                 ;on continue ?
  106.   pop di
  107.  
  108. suite:
  109.   inc di                        ;adresse l'octet suivant à l'écran
  110.   mov esi,step                  ;lit le pas
  111.   add esi,offst                 ;l'ajoute
  112.   mov offst,esi                 ;et réenregistre
  113.  
  114.   dec bp                        ;point suivant
  115.   jne next_x
  116.  
  117.   mov esi,row_step              ;déplace le début de la ligne
  118.   add esi,row_start
  119.   mov row_start,esi
  120.   mov offst,esi                 ;recharge également l'offset du pixel
  121.  
  122.   dec step                      ;décrémente le facteur d'échelle
  123.   dec z_count                   ;et le compteur de ligne 
  124.   jne next_y
  125.   pop ds
  126.   ret
  127. Draw_Voxel endp
  128.  
  129. code ends
  130. end
  131.