1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
| ;****************************************************************************
; Programme de trace de courbes en assembleur 80x86 et 80x87 *
; par JBE *
; Version MASM 6.1 *
;****************************************************************************
.MODEL tiny
.386
.387
;****************************************************************************
; D A T A *
;****************************************************************************
.DATA
mem32 REAL4 0.0 ; registre 32 bits
mem REAL4 0.0 ; idem
zoom REAL4 900.0 ; facteur d'chelle sur l'axe Y
largeur REAL4 10.0 ; facteur d'chelle sur l'axe X
decal REAL4 320.0 ; pour centrer la courbe en X
milieu REAL4 200.0 ; et en Y
originex dw 320 ; coordonnes du centre de l'cran
originey dw 240 ; " " " " " "
rayon REAL4 100.0 ; rayon du cercle
radian REAL4 57.32484076 ; 1 rad en degrs
x32 REAL4 0.0 ; abscisse des points du cercle
y32 REAL4 0.0 ; ordonne des points du cercle
x0 dw 0 ; abscisse d'un point
y0 dw 0 ; ordonne d'un point
couleur db ? ; couleur d'un point
cpt dw 361 ; compteur pour le cercle
largeurl dw 0 ; largeur de ligne en mode
; graphique 12h
;****************************************************************************
; C O D E *
;****************************************************************************
.CODE
courbes proc far
.STARTUP ;debut
call init640480 ; initialise le mode graphique
; 640 * 480 en 16 couleurs
mov cx,639 ; initialise le compteur
ici:
;************ Dessine la courbe de SIN(x)/x *********************************
finit ; initialisation du coprocesseur
xor bx,bx ; met bx
zro
mov word ptr mem32[0],cx ; met cx dans les 16 premiers bits
mov word ptr mem32[2],bx ; et bx dans les 16 derniers bits
; de mem32
fild mem32 ; charge mem32 dans st
fsub decal ; Dcale l'axe de symtrie de
; la courbe
fld st ; on met st dans st(1)
; on a mem32-decal dans st et st(1)
fdiv largeur ; tire la courbe sur l'axe des X
fsin ; calcule le sinus de la valeur
; de st et le stocke dans st
fdiv st,st(1) ; divise sin(mem32-decal)
; par mem 32-decal
fmul zoom ; tire la courbe sur l'axe des Y
fadd milieu ; recale au milieu de l'cran
fist mem32 ; met la valeur de st dans mem32
;***************** trac de (SIN(x)/x))ý ************************************
fld st ; met la valeur prcdente dans st
fmul ; multiplie st par lui-mme
fdiv zoom ; rtrcit la courbe sur l'axe des Y
fadd milieu ; recale au milieu de l'cran
fist mem ; met la valeur calcule dans mem
fwait ; attend avant de rendre la main
;************ Dessine la courbe SIN(x)/x ************************************
mov x0,cx ; met le compteur dans x0
mov ax,word ptr mem32[0] ; met mem32[0] dans ax et
mov y0,ax ; charge l'ordonne dans y0
mov couleur,12 ; slectionne la couleur rouge
push cx ; sauve l'tat du compteur
call setpix ; dessine un pixel
pop cx ; restitue l'tat du compteur
;************ Dessine la courbe (SIN(x)/x)ý *********************************
mov couleur,9 ; slectionne la couleur bleue
mov ax,word ptr mem[0] ; met mem[0] dans ax et
mov y0,ax ; charge l'ordonne dans y0
push cx ; sauve l'tat du compteur
call setpix ; dessine un pixel
pop cx ; restitue l'tat du compteur
;****************************************************************************
loop ici ; retourne
'ici' tant que cx<>0
;******** On va maintenant tracer un cercle *********************************
mov rayon,100 ; rayon du cercle
ici2: dec cpt ; dcrmente le compteur
finit ; RAZ des registres du coprocesseur
xor bx,bx ; met bx
zro
mov ax,cpt ; met le compteur dans ax
mov word ptr mem32[0],ax ; met cx dans les 16 premiers bits
mov word ptr mem32[2],bx ; et bx dans les 16 derniers bits
; de mem32
fild mem32 ; charge mem32 dans st
fdiv radian
fsincos ; calcule le sinus et le cosinus
; met sin dans st et cos dans st(1)
fild rayon ; charge le rayon en st
fmul st(1),st ; multiplie le sinus par le rayon
fmul st(2),st ; et le cosinus aussi
fincstp ; fait tourner la pile en remontant
; la valeur de st(1) en st
fist x32 ; met st dans x32
fincstp ; incrmente la pile
fist y32 ; met st dans y32
fwait ; attend et rend la main
; -------------------------------------------------------
mov ax,word ptr x32[0] ; charge l'abscisse
add ax,originex
mov x0,ax
mov ax,word ptr y32[0] ; charge l'ordonne
add ax,originey
mov y0,ax
mov couleur,14 ; slectionne la couleur jaune
call setpix ; dessine un pixel
cmp cpt,0 ; cpt = 0 ?
jne ici2 ; non, on va en 'ici2'
; oui, on a fini
xor ah,ah ; c'est la fin du programme
int 16h ; attend une frappe de touche
call mode_texte ; revient en mode texte
.EXIT ; Quitte
courbes endp
; Routines appeles depuis le programme principal
;****************************************************************************
; INIT640480: Initialise le mode graphique VGA 640*480 en 16 couleurs *
;****************************************************************************
init640480 proc near
mov al,12h ; Installe le mode 12h
mov bx,80 ; Largeur de la ligne
init: mov largeurl,bx ; Mmorise la largeur
xor ah,ah ; Appelle la fonction 00h pour fixer
int 10h ; le mode
ret ; Rend la main
init640480 endp ; Fin de la procdure
;****************************************************************************
; MODE TEXTE : retourne au mode texte *
;****************************************************************************
mode_texte proc near
mov al,3
xor ah,ah ; Appelle la fonction 00h pour fixer
int 10h ; le mode
ret ; Rend la main
mode_texte endp ; Fin de la procdure
;****************************************************************************
; SETPIX: Dessine un pixel dans une couleur donne --------------- *
;****************************************************************************
setpix proc near
mov ax,y0 ; Charge l'ordonne Y
mov dx,largeurl ; Multiplie par la largeur de ligne
mul dx
mov bx,x0 ; Charge l'abscisse X
mov cl,bl ; Octet faible pour le dcalage
shr bx,1 ; Divise l'abscisse X par 8
shr bx,1
shr bx,1
add bx,ax ; + offset de la multiplication.
and cl,7 ; Calcule masque binaire
partir de X
xor cl,7
mov ah,1
shl ah,cl
mov dx,3ceh ; Accde au contrleur graphique
mov al,8 ; Charge masque bin dans reg de masque
out dx,ax
mov ax,(02h shl 8)+5
; Dclenche le mode Write 2 & le mode
out dx,ax ; Read 0
mov ax,0a000h ; ES=segment de la mmoire d'cran
mov es,ax ; avec la page
mov al,es:[bx] ; Charge le registre latch
mov al,couleur
; Fixe la couleur du point
mov es:[bx],al ; Rcrit dans le registre latch
mov ax,(0FFh shl 8 ) + 8 ; Rtablit les valeurs
out dx,ax ; par dfaut dans les registres du
mov ax,(00h shl 8) + 5 ; contrleur graphique qui
out dx,ax ; ont t modifies
ret
setpix endp ; Fin de la procdure
;****************************************************************************
; S T A C K *
;****************************************************************************
.STACK
END ; c'est tout ! |
Partager