home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
graph
/
voxel.asm
< prev
next >
Wrap
Assembly Source File
|
1994-10-09
|
5KB
|
131 lines
data segment
extrn vscreen:dword ;pointe sur les données du paysage
extrn x,y: word ;coordonnées du trapèze
extrn vpage:word ;page d'écran courante
data ends
code segment
assume cs:code,ds:data
;Variables avec partie décimale (8 bits inférieurs) :
offst dd 0 ;offset courant
step dd 0 ;taille du pixel
row_start dd 0 ;début de la ligne courante
row_step dd 0 ;distance jusqu'à la ligne suivante
z_count dw 0 ;compteur pour la profondeur
shrink dw 0 ;correction au bas de l'écran
Ligne dd 0 ;numéro de ligne d'écran courante
vpage_cs dw 0 ;page d'écran dans le segment de code
.386
public Draw_Voxel
Draw_Voxel proc pascal
;représente un paysage dans la page d'écran courante
;lit les données dans vscreen à partir de la position (x,y)
mov ax,vpage ;mémorise le numéro de la page d'écran
mov vpage_cs,ax
push ds
mov ax,0a000h ;charge le segment de destination
mov es,ax
mov ax,320 ;calcule l'offset dans le paysage
imul y
add ax,x
lds si,vscreen ;prend les données dans vscreen
add si,ax ;tient compte de l'offset
shl esi,8 ;conversion en virgule fixe
mov offst,esi ;valeurs initiales pour le pixel ...
mov row_start,esi ;... et la ligne
mov step,100h ;facteur d'échelle initial 1
mov ligne,100*256 ;commence en ligne d'écran 100
mov row_step,14040h ;distance interligne 320,25
mov shrink,0 ;pas de correction au début
mov z_count,160 ;nombre de lignes à traiter
next_y:
mov eax,Ligne ;lit le numéro de ligne courant (écran)
mov ebx,eax ;le sauvegarde
shr eax,8 ;le convertit en entier
add eax,50 ;50 pixels vers le bas
imul eax,80 ;convertit en offset
mov di,ax ;sauvegarde comme pointeur de destination
cmp di,199*80 ;a-t-on dépassé le bord de l'écran?
jb normal
mov di,199*80 ;oui, on se positionne en dernière ligne
mov eax,Ligne ;différence par rapport au bord inférieur de l'écran
shr eax,8
sub eax,149
mov shrink,ax ;mémorisée comme correction
normal:
add di,vpage_cs ;ajoute la page d'écran courante
imul ebx,16500 ;multiplie le numéro de ligne par 1,007
shr ebx,14 ;le tout * 16500 / 16384
mov Ligne,ebx ;on sauvegarde
mov bp,80 ;nombre de pixels par ligne
next_x:
mov esi,offst ;charge l'offset du pixel courant
shr esi,8 ;le convertit en entier
xor eax,eax
mov al,[si] ;charge un point du paysage
mov cx,ax ;le sauvegarde
cmp cx,99 ;couleur (=hauteur) < 100
ja fill_bar
mov ax,99 ;alors on fixe à 99
fill_bar:
shl ax,5 ;projection à point de fuite : hauteur * 32
xor dx,dx
push bp
mov bp,z_count ;divise par la distance
add bp,50
idiv bp
pop bp
sub ax,shrink ;effectue la correction
jbe suite ;si <= 0, ne dessine pas
push di
next_fill:
mov es:[di],cl ;enregistre la couleur
sub di,80 ;ligne suivante vers le haut
dec al ;décrémente le compteur
jne next_fill ;on continue ?
pop di
suite:
inc di ;adresse l'octet suivant à l'écran
mov esi,step ;lit le pas
add esi,offst ;l'ajoute
mov offst,esi ;et réenregistre
dec bp ;point suivant
jne next_x
mov esi,row_step ;déplace le début de la ligne
add esi,row_start
mov row_start,esi
mov offst,esi ;recharge également l'offset du pixel
dec step ;décrémente le facteur d'échelle
dec z_count ;et le compteur de ligne
jne next_y
pop ds
ret
Draw_Voxel endp
code ends
end