; ; ++[X3ni0n]++ ; xenion@libero.it ~ http://www.tba.tsx.org ; 1/12/2000 ; ; -------------------------------------------------------------------- ; ; mse 2.0 -( procedure per utilizzo mouse e grafica in assembly x86)- ; ; sx : visualizza rettangolino ; dx : cambia colore ; ; -------------------------------------------------------------------- P8086 ; tipo processore .MODEL tiny ; file .COM .CODE ; inizio codice ORG 0100H ; indirizzo inizio prog. inizio: jmp begin ; ; ********** Area procedure del programma ********** ; ************************************************** ; Funzione svolta : setta modalita' grafica ; Dati in ingresso : AL=modovideo ; Registri modificati : 0 ; ************************************************** modx proc near push ax push si push di mov ah, 0 int 10h pop di pop si pop ax ret modx endp ; ************************************************** ; Funzione svolta : visualizza 1 pixel ; Dati in ingresso : AL=colore CX=x DX=y ; Registri modificati : 0 ; ************************************************** wpix proc near push ax push si push di mov ah, 0ch int 10h pop di pop si pop ax ret wpix endp ; ************************************************** ; Funzione svolta : visualizza 1 linea orrizzontale ; Dati in ingresso : AL=colore CX=x1 DX=y1 DI=x_finale ; Registri modificati : 0 ; ************************************************** wline_o proc near push ax push bx push cx push si rip_o: call wpix inc cx cmp cx, di jna rip_o ; se cx<>di vai a rip_o pop si pop cx pop bx pop ax ret wline_o endp ; ************************************************** ; Funzione svolta : visualizza 1 linea verticale ; Dati in ingresso : AL=colore CX=x1 DX=y1 DI=y_finale ; Registri modificati : 0 ; ************************************************** wline_v proc near push ax push bx push dx push si rip_v: call wpix inc dx cmp dx, di jna rip_v ; se dex<>di vai a rip_v pop si pop dx pop bx pop ax ret wline_v endp ; ************************************************** ; Funzione svolta : visualizza 1 frame ; Dati in ingresso : AL=colore CX=x1 DX=y1 DI=lx2 SI=ly2 ; Registri modificati : 0 ; ************************************************** ; __B___ ; A| |C ; |______| ; D frame proc near push di push si add di, cx add si, dx call wline_o ;B push di ;A mov di, si call wline_v pop di push cx ;C push di mov cx, di mov di, si call wline_v pop di pop cx push dx ;D mov dx, si call wline_o pop dx pop si pop di ret frame endp ; ************************************************** ; Funzione svolta : visualizza 1 rettangolo ; Dati in ingresso : AL=colore CX=x1 DX=y1 DI=x2 SI=y2 ; Registri modificati : 0 ; ************************************************** rettangolo proc near push si push di push dx add di, cx add si, dx dec dx rip_r: inc dx call wline_o cmp dx, si jne rip_r pop dx pop di pop si ret rettangolo endp ; ************************************************** ; Funzione svolta : visualizza cursore ; Dati in ingresso : 0 ; Registri modificati : 0 ; ************************************************** vc proc near push ax mov ax, 1 int 33h pop ax ret vc endp ; ************************************************** ; Funzione svolta : nasconde cursore ; Dati in ingresso : 0 ; Registri modificati : 0 ; ************************************************** nc proc near push ax mov ax, 2 int 33h pop ax ret nc endp ; ************************************************** ; Funzione svolta : setta limiti orrizzontali per il mouse ; Dati in ingresso : cx=Xmin. dx=Xmax ; Registri modificati : 0 ; ************************************************** limiti_o proc near push ax mov ax, 7 int 33h pop ax ret limiti_o endp ; ************************************************** ; Funzione svolta : setta limiti verticali per il mouse ; Dati in ingresso : cx=Ymin. dx=Ymax ; Registri modificati : 0 ; ************************************************** limiti_v proc near push ax mov ax, 8 int 33h pop ax ret limiti_v endp ; ************************************************** ; Funzione svolta : leggi stato mouse ; Dati in ingresso : 0 ; Registri modificati : R.flag : CF=1 > sx premuto ; cx X ; dx Y ; ************************************************** readm proc near push ax mov ax,3 mov bx, 0 int 33h pop ax ret readm endp ; ************************************************** ; Funzione svolta : ritorna ZF=0 se e' stato premuto ; un tasto e ZF=1 se non'e' stato premuto ; Dati in ingresso : 0 ; Registri modificati : R.flag ; ************************************************** keyp proc near push ax mov ah, 1 int 16h pop ax ret keyp endp ; ************************************************** ; Funzione svolta : visualizza rettangolino ; Dati in ingresso : 0 ; Registri modificati : 0 ; ************************************************** rett proc near call nc ; durante la call rett. e' necc. nasc. il mouse sub cx, 15 ; * Xcur sub dx, 10 ; * Ycur mov di, 15 ; X (setta dimensioni rettangolino) mov si, 10 ; Y call rettangolo call vc ret rett endp ; ********** Programma Principale ****************** begin: mov al, 12h ; setta modalita' grafica (640*480) call modx ; attiva modalita' grafica mov cx, 10 mov dx, 10 mov di, 620 mov si, 460 mov al, 7 call rettangolo mov al, 14 call frame push cx push dx ; setta cx ----> dx (asseX) mov dx, di ; limite per il mouse add dx, cx add cx, 16 ; * Xcur + 1 sub dx, 1 ; sempre 1 call limiti_o pop dx pop cx push cx ; setta cx ------> dx (asseY) push dx ; limite per il mouse mov cx, dx mov dx, si add dx, cx add cx, 11 ; * Ycur + 1 sub dx, 1 call limiti_v pop dx pop cx call vc mov al, 0 ripp: call keyp ; vedi se e' stato premuto tasto keyboard jne fine call readm ; leggi stato tasti mouse ; ritorna : ; BL = 00000000 no tasto premuto ; BL = 00000001 SX premuto ; BL = 00000010 DX premuto ; BL = 00000100 middleX premuto cmp bx, 0 je ripp cmp bx, 01b jne if_2 call rett jmp ripp if_2: cmp al, 15 jne if_3 mov al, 0 if_3: inc al jmp ripp fine: mov al, 03h ; ripristina modalita' TEXT call modx int 20h END inizio