cursos:ensamblador:teclado

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
cursos:ensamblador:teclado [19-01-2024 12:00] – [Redefinicion de teclas] sromerocursos:ensamblador:teclado [22-01-2024 08:01] (actual) – [Redefinicion de teclas] sromero
Línea 239: Línea 239:
 ;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
 Wait_For_Keys_Pressed: Wait_For_Keys_Pressed:
-    xor a                        ; A = 0 +    xor a                     ; A = 0 => leer todas las semifilas 
-    in a, ($fe) +    in a, ($fe)               ; Leer del puerto del teclado 
-    or %11100000 +    or %11100000              ; Poner a 1 los 3 bits más altos 
-    inc a+    inc a                     ; Comprobamos el estado del teclado con: A=A+1.  
 +                              ; Si A=0 => ZF = 1 => no hay tecla pulsada 
 +                              ; Si A!=0 => ZF = 0 => hay alguna tecla pulsada
     jr z, Wait_For_Keys_Pressed     jr z, Wait_For_Keys_Pressed
     ret     ret
Línea 251: Línea 253:
 ;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
 Wait_For_Keys_Released: Wait_For_Keys_Released:
-    xor a +    xor a                     ; A = 0 => leer todas las semifilas 
-    in a, ($fe) +    in a, ($fe)               ; Leer del puerto del teclado 
-    or %11100000 +    or %11100000              ; Poner a 1 los 3 bits más altos 
-    inc a+    inc a                     ; Comprobamos el estado del teclado con: A=A+1.  
 +                              ; Si A=0 => ZF = 1 => no hay tecla pulsada 
 +                              ; Si A!=0 => ZF = 0 => hay alguna tecla pulsada
     jr nz, Wait_For_Keys_Released     jr nz, Wait_For_Keys_Released
     ret     ret
Línea 266: Línea 270:
     push af     push af
 wait_for_keypressed_loop: wait_for_keypressed_loop:
-    xor a                        ; A = 0 +    xor a                     ; A = 0 => leer todas las semifilas 
-    in a, ($fe) +    in a, ($fe)               ; Leer del puerto del teclado 
-    or %11100000 +    or %11100000              ; Poner a 1 los 3 bits más altos 
-    inc a+    inc a                     ; Comprobamos el estado del teclado con: A=A+1.  
 +                              ; Si A=0 => ZF = 1 => no hay tecla pulsada 
 +                              ; Si A!=0 => ZF = 0 => hay alguna tecla pulsada
     jr z, wait_for_keypressed_loop     jr z, wait_for_keypressed_loop
     pop af     pop af
Línea 278: Línea 284:
     push af     push af
 wait_for_no_pressedkey_loop: wait_for_no_pressedkey_loop:
-    xor a +    xor a                     ; A = 0 => leer todas las semifilas 
-    in a, ($fe) +    in a, ($fe)               ; Leer del puerto del teclado 
-    or %11100000 +    or %11100000              ; Poner a 1 los 3 bits más altos 
-    inc a+    inc a                     ; Comprobamos el estado del teclado con: A=A+1.  
 +                              ; Si A=0 => ZF = 1 => no hay tecla pulsada 
 +                              ; Si A!=0 => ZF = 0 => hay alguna tecla pulsada
     jr nz, wait_for_no_pressedkey_loop     jr nz, wait_for_no_pressedkey_loop
     pop af     pop af
Línea 385: Línea 393:
 \\  \\ 
  
- //David Webb// nos ofrece el siguiente conjunto de rutinas para este propósito. Existen bastantes posibilidades de realizar esta tarea (tablas con las semifilas y bits y sus correspondientes en ASCII, modificación en tiempo real de los opcodes que hacen los testeos, elegir entre un conjunto de combinaciones de teclas predeterminadas, etc), pero la que nos muestra David Webb es elegante y sencilla de utilizar.+ //David Webb//, en su libro //Lenguaje máquina avanzado para el ZX Spectrum//, nos ofrece el siguiente conjunto de rutinas para este propósito. Existen bastantes posibilidades de realizar esta tarea (tablas con las semifilas y bits y sus correspondientes en ASCII, modificación en tiempo real de los opcodes que hacen los testeos, elegir entre un conjunto de combinaciones de teclas predeterminadas, etc), pero la que nos muestra David Webb es elegante y sencilla de utilizar.
  
  Consiste en escanear el teclado completo y, al detectar la pulsación de una tecla, codificar la semifila y el bit donde se han detectado en un mismo byte, utilizando los 3 bits más bajos para "el bit de la tecla pulsada" y los 3 siguientes para "la semifila (puerto)" en que se ha detectado la pulsación.  Consiste en escanear el teclado completo y, al detectar la pulsación de una tecla, codificar la semifila y el bit donde se han detectado en un mismo byte, utilizando los 3 bits más bajos para "el bit de la tecla pulsada" y los 3 siguientes para "la semifila (puerto)" en que se ha detectado la pulsación.
Línea 525: Línea 533:
  Los scancodes asociados a las diferentes teclas son:  Los scancodes asociados a las diferentes teclas son:
  
 +\\ 
 |< 80% >| |< 80% >|
 ^ Teclas: ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ 8 ^ 9 ^ 0 ^ ^ Teclas: ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ 8 ^ 9 ^ 0 ^
Línea 540: Línea 549:
 ^ Teclas: ^ CAPS ^ Z ^ X ^ C ^ V ^ B ^ N ^ M ^ SYMB ^ SPACE ^ ^ Teclas: ^ CAPS ^ Z ^ X ^ C ^ V ^ B ^ N ^ M ^ SYMB ^ SPACE ^
 ^ Scancodes: | $27 | $1f | $17 | $0f | $07 | $00 | $08 | $10 | $18 | $20 | ^ Scancodes: | $27 | $1f | $17 | $0f | $07 | $00 | $08 | $10 | $18 | $20 |
 +\\ 
 +
 + O, en forma visual sobre un teclado de 48K, extraído del libro //Mastering Machine Code on your ZX Spectrum// (los valores numéricos están en formato hexadecimal pese a no llevar prefijo ni sufijo):
 +
 +\\ 
 +{{ :cursos:ensamblador:scancodes_gomas.jpg }}
 +\\ 
  
  Estos valores nos serán necesarios si queremos establecer unos scancodes por defecto para las teclas del programa, de forma que si el usuario no las redefine, tengan unos valores de comprobación determinados para la rutina de chequeo que veremos a continuación.  Estos valores nos serán necesarios si queremos establecer unos scancodes por defecto para las teclas del programa, de forma que si el usuario no las redefine, tengan unos valores de comprobación determinados para la rutina de chequeo que veremos a continuación.
Línea 905: Línea 921:
                         ; y la tecla de A (00SSSTTT), para leer                         ; y la tecla de A (00SSSTTT), para leer
                         ; el puerto y chequear el bit adecuados                         ; el puerto y chequear el bit adecuados
-    and 7+    and %00000111       ; Nos quedamos con la tecla (bit)
     inc a     inc a
     ld b, a             ; B = 16 - (num. linea direccion)     ld b, a             ; B = 16 - (num. linea direccion)
Línea 1338: Línea 1354:
 Scancode_To_Port_Key: Scancode_To_Port_Key:
     ld d, a                  ; Hacer copia de scancode en D     ld d, a                  ; Hacer copia de scancode en D
-    and $07                  ; Eliminar todos los bits menos 00000SSS+    and %00000111            ; Eliminar todos los bits menos 00000SSS
     cpl                      ; Invertir valores (1/0)     cpl                      ; Invertir valores (1/0)
     ld e, a                  ; E = contador para bucle     ld e, a                  ; E = contador para bucle
Línea 1350: Línea 1366:
     ld e, a                  ; Salvaguardamos semifila (puerto a leer) en E     ld e, a                  ; Salvaguardamos semifila (puerto a leer) en E
     ld a, d                  ; Recuperamos A = 00TTTSSS de nuevo     ld a, d                  ; Recuperamos A = 00TTTSSS de nuevo
-    and $38                  ; Eliminamos todos los valores menos 00TTT000+    and %00111000            ; Eliminamos todos los valores menos 00TTT000
     ld d, $10                ; Inicializamos a la tecla mas interna     ld d, $10                ; Inicializamos a la tecla mas interna
     ret z                    ; Si Z==1 => es la tecla interna     ret z                    ; Si Z==1 => es la tecla interna
Línea 1380: Línea 1396:
     in a, (c)                    ; leer del puerto de esta tecla     in a, (c)                    ; leer del puerto de esta tecla
     cpl                          ; Ahora: 1 teclas pulsadas, 0 no pulsadas     cpl                          ; Ahora: 1 teclas pulsadas, 0 no pulsadas
-    and $1f                      ; aislamos las teclas+    and %00011111                ; aislamos las teclas
     and (hl)                     ; comparo con la tecla en memoria (carry OFF)     and (hl)                     ; comparo con la tecla en memoria (carry OFF)
     jr z, tecl_sssttt_nopulsada  ; Si Z == 1 => tecla no pulsada     jr z, tecl_sssttt_nopulsada  ; Si Z == 1 => tecla no pulsada
  • cursos/ensamblador/teclado.1705665607.txt.gz
  • Última modificación: 19-01-2024 12:00
  • por sromero