calc segment
.486
Assume cs:calc,ds:calc,es:calc
org 100h
deb:
call load_bmp
mov ax,0
int 33h
cmp ax,0
je quitter
mov ax,1
int 33h
initialisation:
mov coordx,50
call affiche_blanc
mov negatif,0
mov overflow,0
mov compteur,0
mov di,offset resultat
call initialize
mov di,offset nombre_1
call initialize
mov di,offset nombre_2
call initialize
mov si,offset nombre_1
call affi_nb
saisie1:
mov si,offset nombre_1
call affi_nb
call saisie
cmp caract,27
je quitter
cmp caract,8
je backsaisie1
cmp caract,13
je saisie1
cmp caract,42
je operateur
cmp caract,43
je operateur
cmp caract,45
je operateur
cmp caract,47
je operateur
cmp caract,'c'
je initialisation
cmp caract,'C'
je initialisation
cmp compteur,16
je saisie1
inc compteur
mov dl,caract
sub dl,48
mov di,offset nombre_1-1
mov si,offset nombre_1
mov cx,16
decal_nb1:
inc si
inc di
mov al,[si]
mov [di],al
loopnz decal_nb1
mov [di],dl
jmp saisie1
backsaisie1:
cmp compteur,0
je saisie1
dec compteur
mov di,offset nombre_1+16
mov si,offset nombre_1+15
mov cx,15
bcl_back1:
dec di
dec si
mov al,[si]
mov [di],al
loopnz bcl_back1
mov nombre_1[0],0
jmp saisie1
operateur:
mov al,caract
mov operator,al
mov compteur,0
saisie2:
mov si,offset nombre_2
call affi_nb
call saisie
cmp caract,27
je quitter
cmp caract,8
je backsaisie2
cmp caract,13
je validation
cmp caract,42
je saisie2
cmp caract,43
je saisie2
cmp caract,45
je saisie2
cmp caract,47
je saisie2
cmp caract,'c'
je initialisation
cmp caract,'C'
je initialisation
cmp compteur,16
je saisie2
inc compteur
mov dl,caract
sub dl,48
mov di,offset nombre_2-1
mov si,offset nombre_2
mov cx,16
decal_nb2:
inc si
inc di
mov al,[si]
mov [di],al
loopnz decal_nb2
mov [di],dl
jmp saisie2
backsaisie2:
cmp compteur,0
je saisie2
dec compteur
mov dl,8
mov ah,2
int 21h
mov dl,32
int 21h
mov dl,8
int 21h
mov di,offset nombre_2+16
mov si,offset nombre_2+15
mov cx,15
bcl_back2:
dec di
dec si
mov al,[si]
mov [di],al
loopnz bcl_back2
mov nombre_2[0],0
jmp saisie2
validation:
cmp operator,'+'
je addit
cmp operator,'-'
je soust
cmp operator,'*'
je mult
call division
jmp result
mult:
call multiplication
jmp result
addit:
call addition
jmp result
soust:
call soustraction
mov si,offset resultat
call comparaison
cmp val_zero,0
jne result
mov si,offset nombre_2
call comparaison
cmp val_zero,0
je result
mov coordx,50
call affiche_moins
mov si,offset nombre_2
mov ax,16
call affi_nb
mov negatif,1
jmp resultf2
result:
cmp overflow,0
je resultf
mov cx,16
mov al,11
mov di,offset resultat
over_bcl:
mov [di],al
inc di
loopnz over_bcl
resultf:
mov ax,16
mov si,offset resultat
call affi_nb
resultf2:
call saisie
mov coordx,50
call affiche_blanc
cmp caract,27
je quitter
cmp overflow,1
je initialisation
cmp caract,8
je initialisation
cmp caract,13
je resultf
cmp caract,42
je operateur2
cmp caract,43
je operateur2
cmp caract,45
je operateur2
cmp caract,47
je operateur2
cmp caract,'c'
je initialisation
cmp caract,'C'
je initialisation
mov di,offset nombre_1
call initialize
mov di,offset nombre_2
call initialize
mov di,offset resultat
call initialize
mov di,offset nombre_1+15
mov compteur,1
mov dl,caract
sub dl,48
mov [di],dl
jmp saisie1
operateur2:
cmp negatif,1
je operateur2m
mov si,offset resultat
mov di,offset nombre_1
call copy_nb
mov di,offset nombre_2
call initialize
mov di,offset resultat
call initialize
mov overflow,0
mov negatif,0
jmp operateur
operateur2m:
mov si,offset nombre_2
mov di,offset nombre_1
call copy_nb
mov di,offset nombre_2
call initialize
mov di,offset resultat
call initialize
mov overflow,0
mov negatif,0
jmp operateur
quitter:
mov ah,0
mov al,2
int 10h
mov ah,4Ch
int 21h
;**************
;INITIALISATION
;**************
initialize proc near
mov cx,16
init_bcl:
mov al,0
mov [di],al
inc di
loopnz init_bcl
ret
initialize endp
;******
;SAISIE
;******
saisie proc near
vide_buffer:
mov ah,0Ch
mov al,0
int 21h
test_saisie:
mov ax,5
int 33h
cmp bx,01h
je clique_souris
mov ah,1
int 16h
jz test_saisie
cmp al,13 ;Carriage return
je fin_saisie
cmp al,'c'
je fin_saisie
cmp al,'C'
je fin_saisie
cmp al,27 ;Escape
je fin_saisie
cmp al,8 ;Backspace
je fin_saisie
cmp al,42
je fin_saisie
cmp al,43
je fin_saisie
cmp al,45
je fin_saisie
cmp al,47
je fin_saisie
cmp al,48
jb vide_buffer
cmp al,57
ja vide_buffer
fin_saisie:
mov caract,al
ret
clique_souris:
cmp dx,55
jb test_saisie
cmp dx,68
ja cliquepasoff
cmp cx,484
jb test_saisie
cmp cx,514
ja test_saisie
mov al,27
jmp fin_saisie
cliquepasoff:
cmp dx,92
jb test_saisie
cmp dx,105
ja cliquebouton7410852963
cmp cx,120
jb test_saisie
cmp cx,270
ja retourarriere
mov al,'c'
jmp fin_saisie
retourarriere:
cmp cx,360
jb test_saisie
cmp cx,510
ja test_saisie
mov al,8
jmp fin_saisie
cliquebouton7410852963:
cmp cx,120d
jb test_saisie
cmp cx,190d
ja cliquebouton852
cmp dx,109d
jb test_saisie
cmp dx,122d
ja cliquebouton410
mov al,55
jmp fin_saisie
cliquebouton410:
cmp dx,126d
jb test_saisie
cmp dx,139d
ja cliquebouton10
mov al,52
jmp fin_saisie
cliquebouton10:
cmp dx,143d
jb test_saisie
cmp dx,156d
ja cliquebouton0
mov al,49
jmp fin_saisie
cliquebouton0:
cmp dx,160d
jb test_saisie
cmp dx,173d
ja test_saisie
mov al,48
jmp fin_saisie
cliquebouton852:
cmp cx,200
jb test_saisie
cmp cx,270
ja cliquebouton963
cmp dx,109
jb test_saisie
cmp dx,122
ja cliquebouton52
mov al,56
jmp fin_saisie
cliquebouton52:
cmp dx,126
jb test_saisie
cmp dx,139
ja cliquebouton2
mov al,53
jmp fin_saisie
cliquebouton2:
cmp dx,143
jb test_saisie
cmp dx,156
ja test_saisie
mov al,50
jmp fin_saisie
cliquebouton963:
cmp cx,280
jb test_saisie
cmp cx,350
ja cliquedmsa
cmp dx,109
jb test_saisie
cmp dx,122
ja cliquebouton63
mov al,57
jmp fin_saisie
cliquebouton63:
cmp dx,126
jb test_saisie
cmp dx,139
ja cliquebouton3
mov al,54
jmp fin_saisie
cliquebouton3:
cmp dx,143
jb test_saisie
cmp dx,156
ja test_saisie
mov al,51
jmp fin_saisie
cliquedmsa:
cmp cx,360
jb test_saisie
cmp cx,430
ja cliquevalidation
cmp dx,109
jb test_saisie
cmp dx,122
ja cliquemsa
mov al,'/'
jmp fin_saisie
cliquemsa:
cmp dx,126
jb test_saisie
cmp dx,139
ja cliquesa
mov al,'*'
jmp fin_saisie
cliquesa:
cmp dx,143
jb test_saisie
cmp dx,156
ja cliquea
mov al,'-'
jmp fin_saisie
cliquea:
cmp dx,160
jb test_saisie
cmp dx,173
ja test_saisie
mov al,'+'
jmp fin_saisie
cliquevalidation:
cmp cx,440
jb test_saisie
cmp cx,510
ja test_saisie
cmp dx,109
jb test_saisie
cmp dx,220
ja test_saisie
mov al,13
jmp fin_saisie
saisie endp
;****************************************
; ADDITION
;****************************************
addition proc near
mov si,offset nombre_1
mov di,offset resultat
call copy_nb
mov di,offset resultat+16
mov si,offset nombre_2+16
mov ah,0
mov cx,16
bcl_add:
dec di
dec si
mov al,[si]
add al,ah
add al,[di]
mov ah,0
aaa
mov [di],al
loopnz bcl_add
cmp ah,0
je fin_add
mov overflow,1
fin_add:
ret
addition endp
;**************
;MULTIPLICATION
;**************
multiplication proc near
bcl_mult:
mov si,offset nombre_2
call comparaison
cmp val_zero,0
je fin_mult
mov di,offset nombre_2+16
call moins_un
mov di,offset resultat+16
mov si,offset nombre_1+16
mov ah,0
mov cx,16
bcl_mult_add:
dec di
dec si
mov al,[si]
add al,ah
add al,[di]
mov ah,0
aaa
mov [di],al
loopnz bcl_mult_add
jmp bcl_mult
fin_mult:
cmp ah,0
jne over_mult
ret
over_mult:
mov overflow,1
ret
multiplication endp
;***************
;SOUSTRACTION
;***************
soustraction proc near
mov si,offset nombre_1
mov di,offset resultat
call copy_nb
bcl_soust:
mov si, offset resultat
call comparaison
cmp val_zero,0
je fin_soust
mov si, offset nombre_2
call comparaison
cmp val_zero,0
je fin_soust
mov di,offset nombre_2+16
call moins_un
mov di,offset resultat+16
call moins_un
jmp bcl_soust
fin_soust:
ret
soustraction endp
;********
;DIVISION
;********
division proc near
mov si,offset nombre_2
call comparaison
cmp val_zero,0
je division_par_zero
bcl_div:
mov si,offset nombre_2
mov di,offset nombre_t
call copy_nb
bcl_div_soust:
mov si, offset nombre_t
call comparaison
cmp val_zero,0
je plus_un
mov si, offset nombre_1
call comparaison
cmp val_zero,0
je fin_soust
mov di,offset nombre_1+16
call moins_un
mov di,offset nombre_t+16
call moins_un
jmp bcl_div_soust
plus_un:
mov ah,0
mov al,1
mov di,offset resultat+16
mov cx,16
bcl_plus_un:
dec di
add al,[di]
aaa
mov [di],al
mov al,ah
mov ah,0
loopnz bcl_plus_un
jmp bcl_div
division_par_zero:
mov overflow,1
fin_soust:
ret
division endp
;************
;COMPARAISON
;************
comparaison proc near
mov al,0
mov cx,16
bcl_comp:
add al,[si]
inc si
loopnz bcl_comp
mov val_zero,al
ret
comparaison endp
;********
;MOINS UN
;********
moins_un proc near
mov cx,16
bcl_moins_un:
dec di
mov al,[di]
cmp al,0
jne pas_de_prob
mov al,9
mov [di],al
dec cx
cmp cx,0
jne bcl_moins_un
pas_de_prob:
sub al,1
mov [di],al
ret
moins_un endp
;*********************************************************
;COPIE de nombre : si contient l'adresse de la source
; di contient l'adresse de la destination
;*********************************************************
copy_nb proc near
mov cx,16
bcl_copy:
mov al,[si]
mov [di],al
inc si
inc di
loopnz bcl_copy
ret
copy_nb endp
;**************************************
;TOUT CE QUI CONCERNE LE MODE GRAPHIQUE
;**************************************
;**********************************************
;Affichage d'un nombre : si contient la source
;**********************************************
affi_nb proc near
mov ax,2
int 33h
mov cx,16
mov coordx,62
bcl_zero:
mov dl,[si]
cmp dl,0
jne bcl_affi
inc si
push cx
push si
call affiche_blanc
pop si
pop cx
dec cx
cmp cx,1
ja bcl_zero
bcl_affi:
mov al,[si]
cmp al,0
push cx
push si
jne affi1
call affiche_zero
jmp bcl_affi_fin
affi1:
cmp al,1
jne affi2
call affiche_un
jmp bcl_affi_fin
affi2:
cmp al,2
jne affi3
call affiche_deux
jmp bcl_affi_fin
affi3:
cmp al,3
jne affi4
call affiche_trois
jmp bcl_affi_fin
affi4:
cmp al,4
jne affi5
call affiche_quatre
jmp bcl_affi_fin
affi5:
cmp al,5
jne affi6
call affiche_cinq
jmp bcl_affi_fin
affi6:
cmp al,6
jne affi7
call affiche_six
jmp bcl_affi_fin
affi7:
cmp al,7
jne affi8
call affiche_sept
jmp bcl_affi_fin
affi8:
cmp al,8
jne affi9
call affiche_huit
jmp bcl_affi_fin
affi9:
cmp al,9
jne affidiaise
call affiche_neuf
jmp bcl_affi_fin
affidiaise:
cmp al,11
jne bcl_affi_fin
call affiche_diaise
bcl_affi_fin:
pop si
pop cx
inc si
loopnz bcl_affi
fin_affi:
mov ax,1
int 33h
ret
affi_nb endp
affiche_moins proc near
mov si, offset opm
call imprime_chiffre
ret
affiche_moins endp
affiche_blanc proc near
mov si, offset efface
call imprime_chiffre
ret
affiche_blanc endp
affiche_zero proc near
mov si, offset ch0
call imprime_chiffre
ret
affiche_zero endp
affiche_un proc near
mov si, offset ch1
call imprime_chiffre
ret
affiche_un endp
affiche_deux proc near
mov si, offset ch2
call imprime_chiffre
ret
affiche_deux endp
affiche_trois proc near
mov si, offset ch3
call imprime_chiffre
ret
affiche_trois endp
affiche_quatre proc near
mov si, offset ch4
call imprime_chiffre
ret
affiche_quatre endp
affiche_cinq proc near
mov si, offset ch5
call imprime_chiffre
ret
affiche_cinq endp
affiche_six proc near
mov si, offset ch6
call imprime_chiffre
ret
affiche_six endp
affiche_sept proc near
mov si, offset ch7
call imprime_chiffre
ret
affiche_sept endp
affiche_huit proc near
mov si, offset ch8
call imprime_chiffre
ret
affiche_huit endp
affiche_neuf proc near
mov si, offset ch9
call imprime_chiffre
ret
affiche_neuf endp
affiche_diaise proc near
mov si,offset diaise
call imprime_chiffre
ret
affiche_diaise endp
imprime_chiffre proc near
mov ax,coordx
add ax,11
mov coordx,ax
mov x,0
mov y,0
impbcl:
mov ah,0ch
lodsb
mov cx,coordx
add cx,x
mov dx,coordy
add dx,y
int 10h
add x,1
mov bx,long
cmp x,bx
jne impbcl
mov x,0
add y,1
mov bx,height
cmp y,bx
jne impbcl
ret
imprime_chiffre endp
Load_BMP proc near
mov al,13h
mov ah,00h
int 10h
mov ah,3dh
mov al,00h
lea dx,nom_fich
int 21h
mov num,ax
mov cx,0
mov dx,10
call deplacer_pointeur
mov ah,3fh
mov bx,num
mov cx,4
lea dx,deb_fich
int 21h
mov cx,0
mov dx,54
call deplacer_pointeur
mov cpt,0
pal:
mov ah,3fh
mov bx,num
mov cx,4
lea dx,palette
int 21h
mov ah,10h
mov al,10h
mov bx,cpt
mov cl,byte ptr palette
shr cl,2
mov ch,byte ptr palette+1
shr ch,2
mov dh,byte ptr palette+2
shr dh,2
int 10h
inc cpt
cmp cpt,255
jne pal
mov cx,word ptr deb_fich+2
mov dx,word ptr deb_fich
call deplacer_pointeur
haut:
mov x,0
larg:
mov ah,3fh
mov bx,num
mov cx,1
lea dx,coul
int 21h
call aff_point
inc x
cmp x,320
jne larg
dec y
jnz haut
mov ah,3eh
mov bx,num
int 21h
load_BMP endp
deplacer_pointeur proc near
mov ah,42h
mov al,0
mov bx,num
int 21h
ret
deplacer_pointeur endp
aff_point proc near
mov ax,0a000h
mov es,ax
mov ax,320
mul y
add ax,x
mov di,ax
mov al,coul
stosb
ret
aff_point endp
nom_fich db "calc.bmp",00h
num dw ?
deb_fich dd ?
palette dq ?
coul db ?
x dw 0
y dw 199
cpt dw ?
long dw 10
height dw 10
coordx dw 62
coordy dw 77
opm db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,00,00,00,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75,0dh
ch0 db 75,75,75,00,00,00,75,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75,0dh
ch1 db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,75,75,75,75,0dh
ch2 db 75,75,75,00,00,00,75,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75
db 75,75,00,75,75,75,75,75,75,75
db 75,75,00,75,75,75,75,75,75,75
db 75,75,00,75,75,75,75,75,75,75
db 75,75,00,75,75,75,75,75,75,75
db 75,75,75,00,00,00,75,75,75,75,0dh
ch3 db 75,75,75,00,00,00,75,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75,0dh
ch4 db 75,75,75,75,75,75,75,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,75,75,75,75,0dh
ch5 db 75,75,75,00,00,00,75,75,75,75
db 75,75,00,75,75,75,75,75,75,75
db 75,75,00,75,75,75,75,75,75,75
db 75,75,00,75,75,75,75,75,75,75
db 75,75,75,00,00,00,75,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75,0dh
ch6 db 75,75,75,00,00,00,75,75,75,75
db 75,75,00,75,75,75,75,75,75,75
db 75,75,00,75,75,75,75,75,75,75
db 75,75,00,75,75,75,75,75,75,75
db 75,75,75,00,00,00,75,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75,0dh
ch7 db 75,75,75,00,00,00,75,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,75,75,75,75,0dh
ch8 db 75,75,75,00,00,00,75,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75,0dh
ch9 db 75,75,75,00,00,00,75,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,00,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,75,75,75,00,75,75,75
db 75,75,75,00,00,00,75,75,75,75,0dh
efface db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,75,75,75,75,75,75,75,0dh
diaise db 75,75,75,75,75,75,75,75,75,75
db 75,75,75,00,75,75,00,75,75,75
db 75,75,75,00,75,75,00,75,75,75
db 75,00,00,75,00,00,75,00,00,75
db 75,75,75,00,75,75,00,75,75,75
db 75,75,75,00,75,75,00,75,75,75
db 75,00,00,75,00,00,75,00,00,75
db 75,75,75,00,75,75,00,75,75,75
db 75,75,75,00,75,75,00,75,75,75
db 75,75,75,75,75,75,75,75,75,75,0dh
negatif db 0
overflow db 0
compteur db 0
val_zero db 0
operator db ?
caract db ?
nombre_1 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
nombre_2 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
nombre_t db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
resultat db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
calc ends
end deb |