-
Federico M..
User deleted
Posto qui un mio listato scritto in assembly. Esso permette di visualizzare uno sprite come cursore, nella modalità grafica 13h (320x200@256colori) Mancano ancora dei particolari, uno su tutti l'impostazione dei limiti entro i quali far muovere il mouse. Se muovete il cursore verso l'estremità inferiore dello schermo infatti il programma si bloccherà in quanto viene modificata un'area di memoria esterna a quella video.
Questo è semplice e piuttosto inutile, ma potrebbe servire a qualcuno, con i dovuti adattamenti. Più avanti proverò a postare qualcosa di più interessante e ovviamente più complesso, oltre a una versione migliore di questo programmino.
E' compatibile con Turbo Assembler, compilatelo ricordandovi di aggiungere il prarametro /t al momento del linkaggio (è un file .com).CODICE;*************************************************
; mouse.asm - Visualizza uno sprite come cursore
; AUTORE: Federico M.
; Luglio 2007
;*************************************************
MAIN SEGMENT
ASSUME CS:MAIN,DS:MAIN,ES:MAIN,SS:MAIN
ORG 100h
.386 ;abilita l'utilizzo dei
INIT: JMP START ;registri di 32bit
;--------------------------
;Dati
;--------------------------
mouse_x DW 160
mouse_y DW 100
cursor DB 0,9,9,9,0
DB 9,9,9,9,9
DB 9,9,9,9,9
DB 9,9,9,9,9
DB 0,9,9,9,0
sfondo DD 00000000h
;VideoBuffer in coda per risparmiare spazio
;--------------------------
START: XOR AX,AX ;cerca driver mouse
INT 33h
CMP AX,0
JE exit ;se non c'è esci
MOV AX,13h ;entra modalità video
INT 10h
MOV AX,0Ch ;installa handler
MOV CX,11b ;maschera per movimento e tasto sx
MOV DX,offset mouse_handler
INT 33h
check:
IN AL,60h ;leggi un tasto
CMP AL,01h ;se è ESC esci
JE exit
CALL draw_mouse ;stampa cursore
JMP check
exit:
MOV AX,03h ;modalità testo
INT 10h
INT 20h ;esci
mouse_handler PROC FAR
ASSUME CS:MAIN,DS:NOTHING
SHR CX,1 ;ottieni coordinate
MOV mouse_x,CX
MOV mouse_y,DX
RET
mouse_handler ENDP
draw_mouse PROC NEAR
ASSUME CS:MAIN,DS:MAIN
MOV AX,CS ;pulisci schermo virtuale
MOV ES,AX
MOV CX,16000
LEA DI,VideoBuffer
MOV EAX,sfondo
REP STOSD
MOV AX,CS ;disegna sprite
MOV ES,AX ;nello schermo virtuale
MOV AX,mouse_x ;ascissa
MOV BX,mouse_y ;ordinata
MOV DI,AX
MOV DX,BX
SHL BX,8
SHL DX,6
ADD BX,DX
ADD DI,BX
LEA BX,VideoBuffer
ADD DI,BX
XOR SI,SI
MOV AH,5 ;numero di linee
draw_cursor:
MOV CX,5 ;numero di colonne
draw_line:
MOV AL,cursor[SI]
CMP AL,00 ;se il byte dello sprite
JNE not_void ;non è zero,mettere colore
INC DI
JMP void
not_void: STOSB
void: INC SI
LOOP draw_line
ADD DI,315
DEC AH
CMP AH,00
JNE draw_cursor
MOV DX,03DAh ;attendi il retrace
RetraceEnd: IN AL,DX
TEST AL,8
JZ RetraceEnd
LEA SI,VideoBuffer ;stampa schermo
MOV EDI,0
MOV AX,0A000h
MOV ES,AX
MOV CX,16000
REP MOVSD
RET
draw_mouse ENDP
VideoBuffer DB 0 ;messo qui per risparmiare spazio
MAIN ENDS
END INIT.