Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa Próxima revisiónAmbos lados, revisión siguiente | ||
cursos:ensamblador:teclado [19-01-2024 08:06] – [Ejemplo práctico: leyendo el teclado] sromero | cursos:ensamblador:teclado [22-01-2024 07:58] – [Redefinicion de teclas] sromero | ||
---|---|---|---|
Línea 168: | Línea 168: | ||
<code z80> | <code z80> | ||
; Forma 1 | ; Forma 1 | ||
- | | + | ld bc, $fffe |
in a, (c) ; A = Lectura de puerto $fffe | in a, (c) ; A = Lectura de puerto $fffe | ||
Línea 239: | Línea 239: | ||
; | ; | ||
Wait_For_Keys_Pressed: | Wait_For_Keys_Pressed: | ||
- | xor a ; A = 0 | + | xor a |
- | in a, ($fe) | + | in a, ($fe) ; Leer del puerto del teclado |
- | or 224 | + | or %11100000 |
- | 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 224 | + | or %11100000 |
- | 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 |
- | in a, ($fe) | + | in a, ($fe) ; Leer del puerto del teclado |
- | or 224 | + | or %11100000 |
- | 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 224 | + | or %11100000 |
- | 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 | ||
ret | ret | ||
- | |||
</ | </ | ||
Línea 414: | Línea 421: | ||
in a, (c) | in a, (c) | ||
cpl | cpl | ||
- | and $1f | + | and %00011111 |
jr z, NPRESS | jr z, NPRESS | ||
Línea 526: | 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 541: | 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//: | ||
+ | |||
+ | \\ | ||
+ | {{ : | ||
+ | \\ | ||
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 850: | Línea 865: | ||
\\ | \\ | ||
+ | |||
+ | \\ | ||
+ | ==== UDGs para las teclas especiales ==== | ||
+ | |||
+ | Si en lugar de imprimir las cadenas " | ||
+ | |||
+ | Nuestro compañero //Juan Antonio Rubio// nos proporciona los siguientes UDGs que podemos " | ||
+ | |||
+ | <code z80> | ||
+ | DB $10, | ||
+ | DB $60, | ||
+ | DB $05, | ||
+ | DB $00, | ||
+ | </ | ||
+ | |||
+ | Los cuales tienen el siguiente aspecto: | ||
+ | |||
+ | \\ | ||
+ | {{ : | ||
+ | \\ | ||
\\ | \\ | ||
Línea 886: | 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 |
inc a | inc a | ||
ld b, a ; B = 16 - (num. linea direccion) | ld b, a ; B = 16 - (num. linea direccion) | ||
Línea 1319: | 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 | + | and %00000111 |
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 1331: | 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 | + | and %00111000 |
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 1361: | 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 | + | and %00011111 |
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 | jr z, tecl_sssttt_nopulsada |