[ASM] Visualizzare uno sprite come cursore

« Older   Newer »
 
  Share  
.
  1. 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
     
    .
0 replies since 6/7/2007, 01:33   384 views
  Share  
.