Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
JSLib 64 - jslib.asm

jslib.asm

Caricato da: ZioCrocifisso
Scarica il programma completo

  1. global js_open
  2. global js_update
  3. global js_onpress
  4. global js_onrelease
  5. global js_onmove
  6. global js_close
  7.  
  8. section .data
  9.         joyactive dq 0                          ;Joystick in uso
  10.  
  11. section .bss
  12.         joysticks resb 512                      ;Alloca per 16 joystick
  13.  
  14. section .text
  15.         js_open:
  16.                 ;Trova un joystick non usato
  17.                 mov rbx, 0
  18.                 mov ax, word [joyactive]
  19.                 not ax
  20.                 bsf bx, ax
  21.                 jz .error
  22.  
  23.                 ;Apre il device
  24.                 mov rax, 2                      ;Syscall open()
  25.                 ;mov rdi, rdi                   ;Device da aprire
  26.                 mov rsi, 2                      ;Flags (O_RDONLY)
  27.                 mov rdx, 0                      ;Mode (non serve)
  28.                 syscall
  29.                 cmp rax, -1
  30.                 jle .error
  31.                 mov r15, rax
  32.  
  33.                 ;Indica che il joystick è in uso
  34.                 bts [joyactive], bx
  35.  
  36.                 ;Imposta il file descriptor
  37.                 mov rdi, rbx
  38.                 call rdioffset
  39.                 mov qword [joysticks + rdi], r15
  40.  
  41.                 ;Azzera i puntatori delle funzioni
  42.                 mov qword [joysticks + rdi + 8], 0
  43.                 mov qword [joysticks + rdi + 16], 0
  44.                 mov qword [joysticks + rdi + 24], 0
  45.  
  46.                 ;Restituisce l'id del joystick
  47.                 mov rax, rbx
  48.                 ret
  49.  
  50.                 ;Restituisce un errore
  51.                 .error:
  52.                 mov rax, -1
  53.                 ret
  54.  
  55.         js_update:
  56.                 push rbp
  57.                 mov rbp, rsp
  58.                 sub rsp, 8
  59.                 push rdi
  60.  
  61.                 ;Legge un evento
  62.                 mov rax, 0                      ;Syscall read()
  63.                 call rdioffset
  64.                 cmp rdi, -1
  65.                 je .end
  66.                 mov rbx, rdi
  67.                 mov rdi, [joysticks + rbx]      ;Carica il file descriptor del device
  68.                 lea rsi, [rbp - 8]              ;Buffer
  69.                 mov rdx, 8                      ;Dimensione del buffer
  70.                 syscall
  71.                 cmp rax, -1
  72.                 je .end
  73.                 pop rdi
  74.  
  75.                 ;Imposta i parametri fissi per ogni funzione
  76.                 ;mov rdi, rdi                   ;Imposta come primo parametro l'id del joystick
  77.                 mov rsi, [rbp - 1]              ;Come secondo parametro il tasto/asse dell'evento
  78.                 and rsi, 0xFF
  79.  
  80.                 ;Controlla il tipo di evento
  81.                 mov rax, 0
  82.                 mov al, byte [rbp - 2]
  83.                 cmp rax, 2
  84.                 je .axis
  85.                 jg .end                         ;Evento init, che non è rilevante
  86.  
  87.                 ;Chiama la procedura da chiamare quando viene premuto un bottone
  88.                 cmp word [rbp - 4], 0           ;Controlla se è stato rilasciato
  89.                 je .released
  90.  
  91.                 ;Tasto premuto
  92.                 mov r10, [joysticks + rbx + 8]  ;Carica il puntatore a onpress
  93.                 jmp .call
  94.  
  95.                 ;Tasto rilasciato
  96.                 .released:
  97.                 mov r10, [joysticks + rbx + 16] ;Carica il puntatore a onrelease
  98.                 jmp .call
  99.  
  100.                 ;Asse mosso
  101.                 .axis:
  102.                 mov dx, word [rbp - 4]          ;Imposta come terzo parametro lo spostamento
  103.                 mov r10, [joysticks + rbx + 24] ;Carica il puntatore a onmove
  104.                 jmp .call
  105.  
  106.                 ;Controlla se può, e chiama
  107.                 .call:
  108.                 cmp r10, 0
  109.                 je .end
  110.                 call r10
  111.                 jmp .end
  112.  
  113.                 .end:
  114.                 add rsp, 8
  115.                 pop rbp
  116.                 ret
  117.  
  118.         js_onpress:
  119.                 call rdioffset
  120.                 cmp rdi, -1
  121.                 je .end
  122.                 mov [joysticks + rdi + 8], rsi
  123.                 .end:
  124.                 ret
  125.  
  126.         js_onrelease:
  127.                 call rdioffset
  128.                 cmp rdi, -1
  129.                 je .end
  130.                 mov [joysticks + rdi + 16], rsi          
  131.                 .end:
  132.                 ret
  133.  
  134.         js_onmove:
  135.                 call rdioffset
  136.                 cmp rdi, -1
  137.                 je .end
  138.                 mov [joysticks + rdi + 24], rsi
  139.                 .end:
  140.                 ret
  141.  
  142.         js_close:
  143.                 btc word [joyactive], di
  144.                 call rdioffset
  145.                 cmp rdi, -1
  146.                 je .end
  147.                 mov rdi, [joysticks + rdi]      ;Carica il file descriptor del device
  148.                 mov rax, 3                      ;Syscall close()
  149.                 syscall
  150.                 .end:
  151.                 ret
  152.  
  153.         rdioffset:
  154.                 shl rdi, 5
  155.                 ret