Advertisement
Guest User

Untitled

a guest
Jun 10th, 2019
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; Si (state=0) leer la combinación secreta y la guradaremos
  3. ; en el vector vSecret, sino estaremos leyendo una jugada y la
  4. ; guardaremos en el vector vPlay, son vectores de de DimVector(6) posiciones.
  5. ;
  6. ; · Primero indicar la posición del cursor en pantalla
  7. ;   Si (state=0) (rowScreen=3), sino (rowScreen=9+(DimVector-tries)*2)
  8. ;   (colScreen=8)
  9. ; · Inicializar con espacios el vector (vSecret) si (state=0), si no
  10. ;   inicializar con espacios el vector (vPlay).
  11. ; Mientras no se pulse ENTER(10) o ESC(27) hacer lo siguiente:
  12. ; · Posicionar el cursor en pantalla llamando a la subrutina gotoxyP1,
  13. ;   según el valor de las variables (rowScreen y colScreen).
  14. ; · Leer un carácter de teclado llamando la subrutina getchP1
  15. ;   que deja en la variable (charac) el código ASCII del carácter leído.
  16. ;    - Si se ha leído una 'j'(izquierda) o una 'k' (derecha) mover el
  17. ;      cursor por las 6 posiciones de la combinación, actualizando
  18. ;      el índice del vector (i +/-1) y la columna (colScreen +/-2).
  19. ;      (no se puede salir de la zona donde estamos escribiendo (6 posiciones))
  20. ;    - Si se ha leído un carácter válido ['0'-'9'] lo guardamos en el vector.
  21. ;        Si (state=0) lo guardaremos en el vector (vSecret) y pondremos un '*'
  22. ;        en (charac) para que no se vea la combinació secreta,
  23. ;        sino lo guardamos en el vector (vPlay).
  24. ;      Y mostramos el carácter (charac) en pantalla en la posición donde
  25. ;      está el cursor llamando a la subrutina printchP1.
  26. ; · Si se ha pulsado ESC(27) poner (state=7) para indicar que tenemos
  27. ;   que salir.
  28. ;
  29. ; Si se pulsa ENTER(10) aceptar la combinación tal y como esté.
  30. ; NOTA: Hay que tener en cuenta que si se pulsa ENTER sin haber asignado
  31. ; valores a todas las posiciones del vector, habrá posiciones que serán
  32. ; un espacio (valor utilizado para inicialitar los vectores).
  33. ;
  34. ; Variables globales utilizadas:   
  35. ; rowScreen: fila de la pantalla donde posicionamos el cursor.
  36. ; colScreen: columna de la pantalla donde posicionamos el cursor.
  37. ; charac   : carácter que leemos de teclado.
  38. ; vSecret  : vector donde guardamos la combinación secreta
  39. ; state    : estado del juego.
  40. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  41. getSecretPlayP1:
  42.    push rbp
  43.    mov rbp, rsp
  44.    
  45.    push rax
  46.    push rbx
  47.    push rcx
  48.    push rdx
  49.    push r8
  50.    
  51.    mov ecx, [state]
  52.    mov r8d, DimVector
  53.    sub r8d, 1               ;almacenamos el limite superior del vector
  54.    
  55.    ;Inicializamos el cursor en pantalla
  56.    mov DWORD [colScreen],  8
  57.  
  58.    cmp ecx, 0
  59.    je combinacionSecreta
  60.    ;state es distinto de 0, estamos con la jugada
  61.    mov eax, DimVector
  62.    sub eax, DWORD[tries]
  63.    sal eax, 1
  64.    add eax, 9
  65.    mov DWORD [rowScreen], eax
  66.  
  67.    mov edx, vPlay           ;usamos edx para trabajar con el vector
  68.    ;inicializamos el vector vPlay a ' '
  69.    jmp inicializarVector
  70.    
  71.      
  72.    combinacionSecreta:
  73.    ;state vale 0, estamos trabajando con la combinacion secreta
  74.    mov DWORD [rowScreen], 3
  75.    
  76.    ;inicializamos el vector vSecret a ' '
  77.    mov edx, vSecret         ;usamos edx para trabajar con el vector
  78.    
  79.    inicializarVector:
  80.    
  81.    mov ebx, 0 ;usamos ebx como indice del vector
  82.    bucleInicializarVector:
  83.         cmp ebx, DimVector
  84.         je endBucleInicializarVector
  85.        
  86.         mov BYTE [edx+ebx], ' '
  87.         add ebx, 1
  88.        
  89.         jmp bucleInicializarVector
  90.    
  91.    endBucleInicializarVector:
  92.  
  93.    mov ebx, 0                       ;usamos ebx como indice del vector
  94.    secretDoWhile:
  95.         call gotoxyP1               ;llamamos a la subrutina gotoxyP1
  96.         call getchP1                ;obtenemos el caracter introducido
  97.         mov al, BYTE [charac]
  98.        
  99.         cmp al, 27              ;la tecla pulsada es ESC
  100.         je salirESC
  101.        
  102.         cmp al, 10              ;la tecla pulsada es ENTER
  103.         je salirENTER
  104.        
  105.         cmp al, 'j'             ;movemos el cursor a la izquierda
  106.         je moverIzquierda
  107.        
  108.         cmp al, 'k'             ;movemos el cursor a la derecha
  109.         je moverDerecha
  110.        
  111.         cmp al, '0'
  112.         jl secretDoWhile        ;si el caracter es menor que 0, volvemos al principio del bucle
  113.        
  114.         cmp al, '9'
  115.         jg secretDoWhile        ;si el caracter es mayor que 9, volvemos al principio del bucle
  116.        
  117.         jmp introducirDigito
  118.        
  119.         moverIzquierda:
  120.             cmp ebx, 0              ;si estamos en el limite izquierdo, volvemos al principio del bucle
  121.             je secretDoWhile
  122.            
  123.             sub ebx, 1
  124.             sub DWORD [colScreen], 2
  125.             jmp secretDoWhile
  126.        
  127.         moverDerecha:
  128.             cmp ebx, r8d        ;si estamos en el limite derecho, volvemos al principio del bucle
  129.             je secretDoWhile
  130.            
  131.             add ebx, 1
  132.             add DWORD [colScreen], 2
  133.             jmp secretDoWhile
  134.  
  135.         introducirDigito:
  136.             mov BYTE [edx+ebx], al  ;almacenamos el caracter en el vector
  137.        
  138.         cmp ecx, 0
  139.         je mostrarAsterisco
  140.        
  141.         mov BYTE [charac], al
  142.         jmp mostrarPantalla
  143.        
  144.         mostrarAsterisco:
  145.             mov BYTE [charac], '*'
  146.        
  147.         mostrarPantalla:
  148.         call printchP1
  149.        
  150.         jmp secretDoWhile
  151.    endSecretDoWhile:
  152.    
  153.    salirESC:
  154.    mov DWORD[state],7               ;salimos del programa
  155.    
  156.    salirENTER:                      ;salimos de la rutina
  157.    
  158.    pop r8
  159.    pop rdx
  160.    pop rcx
  161.    pop rbx
  162.    pop rax
  163.    
  164.    mov rsp, rbp
  165.    pop rbp
  166.    ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement